# OpenProse - Confirmed Syntax
# Python-like indentation, keyword-driven, minimal punctuation

# ============================================
# IMPORTS (quoted skill names)
# ============================================

import "web-search" from "github:example/web-search"
import "summarizer" from "./skills/summarizer"

# ============================================
# AGENT DEFINITIONS (quoted skills array)
# ============================================

agent researcher:
  model: sonnet
  skills: ["web-search", "summarizer"]
  permissions:
    bash: deny

agent writer:
  model: opus
  skills: ["summarizer"]

# ============================================
# SIMPLE FLOW
# ============================================

# Simplest program: single session
session "Explain quantum computing"

# Sequential (indentation = sequence)
do:
  session: researcher
    prompt: "Research quantum computing"
  session: writer
    prompt: "Write a blog post"

# Inline sequence with arrow
session "A" -> session "B" -> session "C"

# ============================================
# PARALLEL EXECUTION (quoted modifiers)
# ============================================

# Default: wait for all, fail-fast
parallel:
  session "Security review"
  session "Performance review"
  session "Style review"

# Race: first to complete wins
parallel ("first"):
  session "Try approach A"
  session "Try approach B"

# Continue on failure
parallel (on-fail: "continue"):
  session "Risky operation 1"
  session "Risky operation 2"

# Named results for downstream use
parallel:
  security = session "Security review"
  perf = session "Performance review"

session "Synthesize":
  context: { security, perf }

# ============================================
# COMPOSITION: NAMED BLOCKS WITH PARAMETERS
# ============================================

# Define a reusable block
block review-pipeline:
  parallel:
    session "Security review"
    session "Performance review"
  session "Synthesize reviews"

# Block with parameters
block research(topic):
  session "Research {topic}"
  session "Summarize findings about {topic}"

# Invoke with `do`
do:
  session "Write code"
  do review-pipeline
  session "Final edits"

do research("quantum computing")

# ============================================
# LOOPS (with ** orchestrator discretion)
# ============================================

# Loop until condition (orchestrator evaluates **)
loop until **approved**:
  session "Write draft"
  session "Get feedback"

# Multi-word condition
loop until **user is satisfied with the result**:
  session "Propose solution"
  session "Get feedback"

# Repeat N times
repeat 3:
  session "Attempt solution"

# Infinite loop (with runtime safeguards)
loop:
  session "Monitor for events"
  session "Handle event"

# For-each
for item in items:
  session "Process {item}"

# ============================================
# CHOICE (orchestrator discretion)
# ============================================

choice **based on urgency**:
  session "Quick fix"
  session "Thorough solution"

# ============================================
# PIPELINE OPERATIONS
# ============================================

# Map: transform each item
items | map: session "Process {item}"

# Filter: select items
items | filter: session "Is {item} relevant?"

# Reduce: accumulate results
items | reduce(summary, item):
  session "Add {item} to {summary}"

# Chaining
files
  | filter: session "Is {item} relevant?"
  | map: session "Extract info from {item}"
  | reduce(report, info):
      session "Add {info} to {report}"

# Parallel map
items | pmap: session "Process {item}"

# ============================================
# ERROR HANDLING
# ============================================

# Try/catch/finally
try:
  session "Risky operation"
catch:
  session "Handle failure"
finally:
  session "Cleanup"

# Retry with backoff
session "Flaky API call" (retry: 3)

# ============================================
# CONTEXT PASSING
# ============================================

# Variable binding (mutable)
let research = session: researcher
  prompt: "Research topic"

# Variable binding (immutable)
const config = session "Get configuration"

# Explicit context
session: writer
  prompt: "Write about the research"
  context: research

# Multiple contexts
session "Final synthesis":
  context: [research, analysis, feedback]

# No context (start fresh)
session "Independent task":
  context: []

# ============================================
# COMPLETE EXAMPLE
# ============================================

import "code-review" from "github:example/code-review"

agent code-reviewer:
  model: sonnet
  skills: ["code-review"]

agent synthesizer:
  model: opus

# Parallel review with named results
parallel:
  sec = session: code-reviewer
    prompt: "Review for security issues"
  perf = session: code-reviewer
    prompt: "Review for performance issues"
  style = session: code-reviewer
    prompt: "Review for style issues"

# Synthesize all results
session: synthesizer
  prompt: "Create unified review report"
  context: { sec, perf, style }

# Iterative refinement with ** condition
loop until **approved**:
  let draft = session "Improve based on feedback"
  let feedback = session "Get stakeholder review"
    context: draft
