@fitchmultz/pi-subagents 0.44.7 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +258 -7
- package/LICENSE +1 -0
- package/README.md +58 -1483
- package/agents/context-builder.md +19 -1
- package/agents/debugger.md +10 -3
- package/agents/delegate.md +1 -0
- package/agents/fixer.md +4 -1
- package/agents/oracle.md +13 -2
- package/agents/planner.md +14 -3
- package/agents/researcher.md +11 -2
- package/agents/reviewer-claude.md +11 -2
- package/agents/reviewer-gpt.md +12 -2
- package/agents/reviewer-ponytail.md +11 -1
- package/agents/reviewer-security.md +13 -2
- package/agents/reviewer.md +12 -3
- package/agents/scout.md +12 -1
- package/agents/ui-designer.md +10 -3
- package/agents/watcher.md +1 -0
- package/agents/worker.md +8 -2
- package/agents/writer.md +6 -3
- package/dist/agents/agent-defaults.js +9 -0
- package/dist/agents/agent-definition.js +196 -0
- package/dist/agents/agent-management.js +64 -905
- package/dist/agents/agent-scope.js +4 -2
- package/dist/agents/agent-selection.js +10 -5
- package/dist/agents/agent-serializer.js +55 -67
- package/dist/agents/agents.js +75 -716
- package/dist/agents/builtin-overrides.js +218 -0
- package/dist/agents/chain-serializer.js +3 -367
- package/dist/agents/config-values.js +52 -0
- package/dist/agents/discovery-paths.js +91 -0
- package/dist/agents/frontmatter.js +15 -5
- package/dist/agents/identity.js +25 -8
- package/dist/agents/json-chain.js +254 -0
- package/dist/agents/management-config.js +332 -0
- package/dist/agents/management-format.js +231 -0
- package/dist/agents/management-persistence.js +287 -0
- package/dist/agents/management-targets.js +136 -0
- package/dist/agents/management-warnings.js +81 -0
- package/dist/agents/markdown-chain.js +210 -0
- package/dist/agents/package-agents.js +154 -0
- package/dist/agents/skill-files.js +157 -0
- package/dist/agents/skill-search-paths.js +246 -0
- package/dist/agents/skill-types.js +1 -0
- package/dist/agents/skills.js +54 -499
- package/dist/extension/acceptance-schema.js +55 -0
- package/dist/extension/build-info.js +1 -1
- package/dist/extension/chain-schema.js +196 -0
- package/dist/extension/child-runtime.js +237 -0
- package/dist/extension/compact-tools.js +122 -51
- package/dist/extension/config-schema.js +29 -0
- package/dist/extension/config.js +27 -11
- package/dist/extension/control-notice-schema.js +37 -0
- package/dist/extension/control-notices.js +13 -6
- package/dist/extension/delegation-bridges.js +43 -0
- package/dist/extension/doctor.js +48 -25
- package/dist/extension/everyday-schemas.js +207 -0
- package/dist/extension/fanout-child.js +18 -319
- package/dist/extension/index.js +8 -563
- package/dist/extension/message-renderers.js +225 -0
- package/dist/extension/nested-control-inbox.js +154 -0
- package/dist/extension/parent-runtime.js +339 -0
- package/dist/extension/primary-tool.js +69 -0
- package/dist/extension/result-snapshot.js +22 -0
- package/dist/extension/runtime-reload.js +62 -0
- package/dist/extension/runtime-storage.js +43 -0
- package/dist/extension/schema-overrides.js +75 -0
- package/dist/extension/schemas.js +265 -336
- package/dist/extension/tool-input.js +27 -12
- package/dist/extension/tool-result.js +19 -4
- package/dist/history/answer-texts.js +57 -0
- package/dist/history/canonical-result.js +76 -43
- package/dist/history/canonical-selection.js +40 -0
- package/dist/history/database-generation.js +82 -0
- package/dist/history/database.js +57 -33
- package/dist/history/entry-ingestion.js +61 -0
- package/dist/history/index.js +242 -97
- package/dist/history/ingest.js +168 -331
- package/dist/history/output-digests.js +40 -0
- package/dist/history/preview.js +210 -0
- package/dist/history/prune.js +33 -0
- package/dist/history/queries.js +60 -349
- package/dist/history/query-scope.js +190 -0
- package/dist/history/rows.js +77 -0
- package/dist/history/run-projection.js +137 -0
- package/dist/history/run-queries.js +153 -0
- package/dist/history/schema.js +31 -0
- package/dist/history/search-queries.js +163 -0
- package/dist/history/selected-record.js +108 -0
- package/dist/history/source-file.js +45 -0
- package/dist/history/source-watches.js +141 -0
- package/dist/history/store.js +164 -153
- package/dist/history/text-chunks.js +169 -0
- package/dist/history/text.js +35 -0
- package/dist/history/transcript-queries.js +177 -0
- package/dist/history/types.js +5 -1
- package/dist/history/values.js +36 -0
- package/dist/history/wire-inputs.js +122 -0
- package/dist/history/wire-models.js +38 -0
- package/dist/history/worker-runtime.js +441 -0
- package/dist/history/worker.js +66 -462
- package/dist/intercom/intercom-bridge.js +48 -20
- package/dist/intercom/live-intercom.js +80 -23
- package/dist/intercom/nested-result-tree.js +163 -0
- package/dist/intercom/result-delivery.js +40 -0
- package/dist/intercom/result-intercom.js +178 -261
- package/dist/pi-intercom/agent-dir.js +7 -3
- package/dist/pi-intercom/async.js +27 -0
- package/dist/pi-intercom/bridge-ask.js +57 -0
- package/dist/pi-intercom/bridge-config.js +79 -0
- package/dist/pi-intercom/bridge-http.js +86 -0
- package/dist/pi-intercom/bridge-protocol.js +106 -0
- package/dist/pi-intercom/bridge-routes.js +64 -0
- package/dist/pi-intercom/bridge-session.js +416 -0
- package/dist/pi-intercom/bridge.js +182 -603
- package/dist/pi-intercom/broker/broker.js +236 -244
- package/dist/pi-intercom/broker/client.js +189 -304
- package/dist/pi-intercom/broker/connection.js +165 -0
- package/dist/pi-intercom/broker/framing.js +5 -3
- package/dist/pi-intercom/broker/paths.js +4 -1
- package/dist/pi-intercom/broker/pid.js +53 -25
- package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
- package/dist/pi-intercom/broker/snapshots.js +188 -0
- package/dist/pi-intercom/broker/spawn.js +36 -25
- package/dist/pi-intercom/config.js +85 -71
- package/dist/pi-intercom/connection.js +297 -0
- package/dist/pi-intercom/identity.js +58 -0
- package/dist/pi-intercom/inbound-delivery.js +356 -0
- package/dist/pi-intercom/inbound-journal.js +303 -0
- package/dist/pi-intercom/inbound-record.js +113 -0
- package/dist/pi-intercom/inbound.js +179 -0
- package/dist/pi-intercom/index.js +79 -2933
- package/dist/pi-intercom/inspection.js +62 -0
- package/dist/pi-intercom/interview.js +236 -0
- package/dist/pi-intercom/lifecycle.js +168 -0
- package/dist/pi-intercom/message-format.js +69 -0
- package/dist/pi-intercom/outbound.js +304 -0
- package/dist/pi-intercom/peer-awareness.js +66 -0
- package/dist/pi-intercom/reply-tracker.js +62 -43
- package/dist/pi-intercom/reply-wait.js +201 -0
- package/dist/pi-intercom/runtime-types.js +3 -0
- package/dist/pi-intercom/session-events.js +180 -0
- package/dist/pi-intercom/session-targets.js +42 -34
- package/dist/pi-intercom/subagent-events.js +238 -0
- package/dist/pi-intercom/subagent-live-events.js +129 -86
- package/dist/pi-intercom/supervisor.js +282 -0
- package/dist/pi-intercom/tool-arguments.js +74 -0
- package/dist/pi-intercom/tool-registration.js +95 -0
- package/dist/pi-intercom/tool-results.js +38 -0
- package/dist/pi-intercom/tool-schemas.js +82 -0
- package/dist/pi-intercom/tools.js +51 -0
- package/dist/pi-intercom/topic-actions.js +177 -0
- package/dist/pi-intercom/topics.js +177 -92
- package/dist/pi-intercom/transport.js +1 -0
- package/dist/pi-intercom/types.js +151 -114
- package/dist/pi-intercom/ui/compose-paste.js +93 -0
- package/dist/pi-intercom/ui/compose.js +121 -143
- package/dist/pi-intercom/ui/inline-message.js +59 -59
- package/dist/pi-intercom/ui/message-renderers.js +147 -0
- package/dist/pi-intercom/ui/overlay.js +181 -0
- package/dist/pi-intercom/ui/session-format.js +124 -0
- package/dist/pi-intercom/ui/session-list.js +76 -43
- package/dist/pi-intercom/ui/tool-renderers.js +110 -0
- package/dist/pi-intercom/ui/topic-view.js +88 -0
- package/dist/pi-intercom/validation.js +59 -0
- package/dist/runs/background/async-chain-plan.js +265 -0
- package/dist/runs/background/async-control.js +134 -58
- package/dist/runs/background/async-execution.js +136 -633
- package/dist/runs/background/async-job-admission.js +40 -0
- package/dist/runs/background/async-job-projection.js +169 -0
- package/dist/runs/background/async-job-tracker.js +297 -327
- package/dist/runs/background/async-launch.js +216 -0
- package/dist/runs/background/async-plan.js +116 -0
- package/dist/runs/background/async-result-file.js +47 -23
- package/dist/runs/background/async-resume.js +195 -253
- package/dist/runs/background/async-run-discovery.js +213 -0
- package/dist/runs/background/async-run-location.js +135 -0
- package/dist/runs/background/async-run-record.js +1 -0
- package/dist/runs/background/async-run-repair.js +223 -0
- package/dist/runs/background/async-run-summary.js +1 -0
- package/dist/runs/background/async-single-plan.js +105 -0
- package/dist/runs/background/async-status-projection.js +155 -0
- package/dist/runs/background/async-status-render.js +117 -0
- package/dist/runs/background/async-status-validation.js +181 -0
- package/dist/runs/background/async-status.js +3 -442
- package/dist/runs/background/async-value.js +21 -0
- package/dist/runs/background/completion-dedupe.js +36 -12
- package/dist/runs/background/completion-delivery.js +211 -205
- package/dist/runs/background/completion-receipts.js +237 -0
- package/dist/runs/background/legacy-status-acceptance.js +34 -0
- package/dist/runs/background/notify.js +96 -48
- package/dist/runs/background/parallel-groups.js +36 -19
- package/dist/runs/background/result-payload.js +178 -0
- package/dist/runs/background/result-watcher.js +348 -339
- package/dist/runs/background/run-id-resolver.js +53 -33
- package/dist/runs/background/run-schemas.js +189 -0
- package/dist/runs/background/run-status-contracts.js +14 -0
- package/dist/runs/background/run-status-render.js +270 -0
- package/dist/runs/background/run-status.js +231 -339
- package/dist/runs/background/runner-attempt-output.js +155 -0
- package/dist/runs/background/runner-attempt.js +263 -0
- package/dist/runs/background/runner-child-executor.js +166 -0
- package/dist/runs/background/runner-child-observer.js +192 -0
- package/dist/runs/background/runner-completion-summary.js +71 -0
- package/dist/runs/background/runner-completion.js +211 -0
- package/dist/runs/background/runner-config.js +1 -0
- package/dist/runs/background/runner-contract.js +1 -0
- package/dist/runs/background/runner-dynamic.js +121 -0
- package/dist/runs/background/runner-finalization.js +149 -0
- package/dist/runs/background/runner-graph.js +68 -0
- package/dist/runs/background/runner-initial-status.js +60 -0
- package/dist/runs/background/runner-lifecycle.js +142 -0
- package/dist/runs/background/runner-monitor.js +309 -0
- package/dist/runs/background/runner-parallel.js +204 -0
- package/dist/runs/background/runner-prepare-step.js +86 -0
- package/dist/runs/background/runner-reporting.js +153 -0
- package/dist/runs/background/runner-status.js +148 -0
- package/dist/runs/background/runner-step-output.js +92 -0
- package/dist/runs/background/runner-step-record.js +45 -0
- package/dist/runs/background/runner-step.js +112 -0
- package/dist/runs/background/runner-streaming.js +173 -0
- package/dist/runs/background/runner-workflow.js +213 -0
- package/dist/runs/background/stale-run-reconciler.js +155 -292
- package/dist/runs/background/subagent-runner-launcher.js +33 -13
- package/dist/runs/background/subagent-runner.js +51 -1842
- package/dist/runs/background/top-level-async.js +2 -1
- package/dist/runs/foreground/chain-clarify.js +293 -1017
- package/dist/runs/foreground/clarification-draft.js +87 -0
- package/dist/runs/foreground/clarify-contracts.js +1 -0
- package/dist/runs/foreground/clarify-invocation.js +129 -38
- package/dist/runs/foreground/clarify-text-editor.js +210 -0
- package/dist/runs/foreground/clarify-view.js +167 -0
- package/dist/runs/foreground/execution-input.js +226 -353
- package/dist/runs/foreground/execution-routing.js +33 -0
- package/dist/runs/foreground/execution-timeout.js +81 -0
- package/dist/runs/foreground/foreground-control.js +222 -763
- package/dist/runs/foreground/foreground-memory.js +99 -0
- package/dist/runs/foreground/invocation-context.js +55 -0
- package/dist/runs/foreground/invocation-execution.js +331 -0
- package/dist/runs/foreground/invocation-expansion.js +48 -0
- package/dist/runs/foreground/management-actions.js +295 -0
- package/dist/runs/foreground/nested-control.js +179 -0
- package/dist/runs/foreground/question-continuation.js +78 -0
- package/dist/runs/foreground/question-control.js +155 -50
- package/dist/runs/foreground/resume-target.js +221 -0
- package/dist/runs/foreground/revival-launch-policy.js +58 -0
- package/dist/runs/foreground/run-async-path.js +190 -178
- package/dist/runs/foreground/run-interrupt.js +164 -0
- package/dist/runs/foreground/run-nudge.js +278 -0
- package/dist/runs/foreground/saved-revival.js +251 -0
- package/dist/runs/foreground/subagent-executor.js +135 -424
- package/dist/runs/foreground/subagent-params.js +67 -30
- package/dist/runs/foreground/wait-observation.js +104 -0
- package/dist/runs/foreground/wait-registration.js +17 -0
- package/dist/runs/foreground/wait-run.js +283 -123
- package/dist/runs/shared/acceptance-contract.js +193 -99
- package/dist/runs/shared/acceptance-defaults.js +1 -0
- package/dist/runs/shared/acceptance-evaluation.js +201 -181
- package/dist/runs/shared/acceptance-finalization.js +256 -180
- package/dist/runs/shared/acceptance-outcome.js +53 -0
- package/dist/runs/shared/acceptance-reports.js +137 -72
- package/dist/runs/shared/acceptance-submission.js +167 -0
- package/dist/runs/shared/acceptance-verification.js +100 -0
- package/dist/runs/shared/chain-outputs.js +80 -52
- package/dist/runs/shared/child-attempt-types.js +1 -0
- package/dist/runs/shared/child-attempt.js +314 -667
- package/dist/runs/shared/child-boundaries.js +173 -0
- package/dist/runs/shared/child-context-filter.js +44 -0
- package/dist/runs/shared/child-event-observer.js +390 -0
- package/dist/runs/shared/child-execution-cwd.js +73 -43
- package/dist/runs/shared/child-execution-outcome.js +72 -0
- package/dist/runs/shared/child-invocation.js +54 -0
- package/dist/runs/shared/child-message-validation.js +215 -0
- package/dist/runs/shared/child-native-accounting.js +106 -0
- package/dist/runs/shared/child-native-observation.js +69 -0
- package/dist/runs/shared/child-observation-spool.js +164 -0
- package/dist/runs/shared/child-observations.js +157 -76
- package/dist/runs/shared/child-presence.js +3 -0
- package/dist/runs/shared/child-route-env.js +119 -0
- package/dist/runs/shared/child-stream-observer.js +221 -0
- package/dist/runs/shared/child-stream-projection.js +137 -0
- package/dist/runs/shared/child-structured-tool.js +27 -0
- package/dist/runs/shared/claude-code.js +121 -158
- package/dist/runs/shared/claude-model.js +42 -0
- package/dist/runs/shared/claude-session.js +83 -0
- package/dist/runs/shared/claude-types.js +1 -0
- package/dist/runs/shared/completion-guard.js +18 -18
- package/dist/runs/shared/control-event-policy.js +8 -0
- package/dist/runs/shared/control-notification-owner.js +13 -0
- package/dist/runs/shared/dynamic-fanout.js +188 -173
- package/dist/runs/shared/dynamic-item.js +102 -0
- package/dist/runs/shared/history-index.js +62 -36
- package/dist/runs/shared/legacy-async-recovery.js +114 -0
- package/dist/runs/shared/legacy-output-recovery.js +148 -0
- package/dist/runs/shared/mcp-config-schema.js +36 -0
- package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
- package/dist/runs/shared/model-fallback.js +97 -38
- package/dist/runs/shared/mutating-tool-guard.js +128 -88
- package/dist/runs/shared/native-finalization-types.js +1 -0
- package/dist/runs/shared/native-finalization.js +155 -76
- package/dist/runs/shared/native-usage.js +238 -98
- package/dist/runs/shared/nested-control-records.js +128 -0
- package/dist/runs/shared/nested-events.js +8 -700
- package/dist/runs/shared/nested-path.js +32 -28
- package/dist/runs/shared/nested-projection.js +155 -0
- package/dist/runs/shared/nested-protocol.js +18 -0
- package/dist/runs/shared/nested-registry.js +191 -0
- package/dist/runs/shared/nested-render.js +106 -58
- package/dist/runs/shared/nested-route.js +220 -0
- package/dist/runs/shared/nested-validation.js +216 -0
- package/dist/runs/shared/owned-child-evidence.js +125 -0
- package/dist/runs/shared/owned-run-list.js +146 -0
- package/dist/runs/shared/owned-run-observation.js +267 -0
- package/dist/runs/shared/owned-run-progress.js +109 -0
- package/dist/runs/shared/owned-run-read-state.js +1 -0
- package/dist/runs/shared/owned-run-results.js +202 -0
- package/dist/runs/shared/owned-run-status.js +180 -0
- package/dist/runs/shared/owned-run-view.js +51 -0
- package/dist/runs/shared/owned-workflow-details.js +17 -0
- package/dist/runs/shared/owner-output.js +43 -0
- package/dist/runs/shared/parallel-utils.js +36 -28
- package/dist/runs/shared/parent-receipts.js +90 -32
- package/dist/runs/shared/parent-usage.js +169 -57
- package/dist/runs/shared/pi-args.js +108 -201
- package/dist/runs/shared/pi-launch-input.js +1 -0
- package/dist/runs/shared/pi-session-launch.js +86 -0
- package/dist/runs/shared/pi-spawn.js +35 -21
- package/dist/runs/shared/run-history-queries.js +126 -35
- package/dist/runs/shared/run-history.js +101 -35
- package/dist/runs/shared/run-metadata-paths.js +14 -0
- package/dist/runs/shared/run-metadata.js +158 -0
- package/dist/runs/shared/run-persistence.js +131 -0
- package/dist/runs/shared/run-records.js +9 -679
- package/dist/runs/shared/run-restoration.js +338 -0
- package/dist/runs/shared/run-state-owner.js +26 -0
- package/dist/runs/shared/session-cwd-preload.js +27 -18
- package/dist/runs/shared/single-output.js +148 -70
- package/dist/runs/shared/stable-value.js +15 -0
- package/dist/runs/shared/streaming-text.js +23 -12
- package/dist/runs/shared/structured-output.js +25 -13
- package/dist/runs/shared/subagent-control.js +167 -100
- package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
- package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
- package/dist/runs/shared/supervisor-question-state.js +145 -0
- package/dist/runs/shared/supervisor-questions.js +185 -254
- package/dist/runs/shared/workflow-graph.js +259 -167
- package/dist/runs/shared/workflow-policy.js +120 -48
- package/dist/runs/shared/worktree-contract.js +1 -0
- package/dist/runs/shared/worktree-hook.js +138 -0
- package/dist/runs/shared/worktree-location.js +47 -0
- package/dist/runs/shared/worktree-preservation.js +8 -0
- package/dist/runs/shared/worktree-process.js +107 -0
- package/dist/runs/shared/worktree.js +183 -322
- package/dist/shared/agent-context-policy.js +34 -44
- package/dist/shared/agent-dir.js +14 -0
- package/dist/shared/artifacts.js +30 -12
- package/dist/shared/atomic-json.js +4 -1
- package/dist/shared/chain-files.js +72 -0
- package/dist/shared/concurrency.js +18 -0
- package/dist/shared/content-preview.js +115 -0
- package/dist/shared/cooperative.js +5 -2
- package/dist/shared/execution-cwd.js +13 -5
- package/dist/shared/file-coalescer.js +2 -1
- package/dist/shared/fork-context.js +10 -12
- package/dist/shared/formatters.js +45 -19
- package/dist/shared/journal-frames.js +164 -0
- package/dist/shared/journal-projections.js +121 -0
- package/dist/shared/journal-reader.js +6 -407
- package/dist/shared/json-projection.js +191 -0
- package/dist/shared/lazy-tools.js +19 -8
- package/dist/shared/message-output.js +116 -0
- package/dist/shared/model-info.js +31 -14
- package/dist/shared/native-import.js +20 -0
- package/dist/shared/native-journal.js +140 -0
- package/dist/shared/native-session.js +5 -2
- package/dist/shared/native-tui.js +7 -2
- package/dist/shared/native-typebox.js +15 -3
- package/dist/shared/output-page.js +63 -0
- package/dist/shared/post-exit-stdio-guard.js +128 -88
- package/dist/shared/prompt-sections.js +2 -0
- package/dist/shared/session-entries.js +70 -35
- package/dist/shared/session-identity.js +5 -3
- package/dist/shared/settings.js +62 -192
- package/dist/shared/status-format.js +97 -37
- package/dist/shared/task-file-policy.js +24 -0
- package/dist/shared/temp-root.js +44 -15
- package/dist/shared/types/acceptance.js +1 -0
- package/dist/shared/types/async.js +1 -0
- package/dist/shared/types/config.js +1 -0
- package/dist/shared/types/details.js +1 -0
- package/dist/shared/types/history.js +1 -0
- package/dist/shared/types/inputs.js +1 -0
- package/dist/shared/types/intercom.js +1 -0
- package/dist/shared/types/launch.js +1 -0
- package/dist/shared/types/messages.js +1 -0
- package/dist/shared/types/nested.js +1 -0
- package/dist/shared/types/owned-runs.js +1 -0
- package/dist/shared/types/progress.js +1 -0
- package/dist/shared/types/questions.js +1 -0
- package/dist/shared/types/results.js +1 -0
- package/dist/shared/types/state.js +1 -0
- package/dist/shared/types/usage.js +1 -0
- package/dist/shared/types/workflow.js +1 -0
- package/dist/shared/types.js +75 -30
- package/dist/shared/unknown.js +52 -0
- package/dist/shared/utils.js +54 -260
- package/dist/slash/command-discovery.js +82 -0
- package/dist/slash/command-input.js +190 -0
- package/dist/slash/prompt-template-bridge.js +94 -270
- package/dist/slash/prompt-template-contract.js +77 -0
- package/dist/slash/prompt-template-results.js +125 -0
- package/dist/slash/request-protocol.js +68 -0
- package/dist/slash/result-delivery.js +237 -0
- package/dist/slash/saved-chain.js +78 -0
- package/dist/slash/slash-bridge.js +123 -89
- package/dist/slash/slash-commands.js +101 -572
- package/dist/slash/slash-live-state.js +68 -47
- package/dist/tui/action-hints.js +50 -22
- package/dist/tui/activity-lines.js +32 -0
- package/dist/tui/agent-browser.js +290 -0
- package/dist/tui/agent-controls.js +289 -0
- package/dist/tui/agent-conversation.js +444 -0
- package/dist/tui/agent-dock.js +171 -0
- package/dist/tui/agent-history.js +50 -183
- package/dist/tui/agent-model.js +62 -0
- package/dist/tui/agent-picker.js +262 -0
- package/dist/tui/agent-view.js +232 -1564
- package/dist/tui/compact-results.js +193 -0
- package/dist/tui/conversation-details.js +190 -0
- package/dist/tui/conversation-frame.js +135 -0
- package/dist/tui/conversation-history.js +201 -0
- package/dist/tui/conversation-menu.js +78 -0
- package/dist/tui/conversation-notices.js +79 -0
- package/dist/tui/conversation-selection.js +58 -0
- package/dist/tui/conversation-viewport.js +129 -0
- package/dist/tui/direction-message.js +27 -0
- package/dist/tui/display.js +282 -0
- package/dist/tui/editor-viewport.js +18 -0
- package/dist/tui/expanded-content.js +87 -0
- package/dist/tui/expanded-multi.js +170 -0
- package/dist/tui/expanded-single.js +65 -0
- package/dist/tui/history-cards.js +216 -0
- package/dist/tui/history-display.js +238 -0
- package/dist/tui/history-json.js +16 -0
- package/dist/tui/history-metadata.js +152 -0
- package/dist/tui/history-record.js +251 -0
- package/dist/tui/history-text.js +34 -0
- package/dist/tui/indexed-history.js +116 -0
- package/dist/tui/nested-widget.js +120 -0
- package/dist/tui/picker-page.js +59 -0
- package/dist/tui/render.js +58 -1501
- package/dist/tui/result-facts.js +64 -0
- package/dist/tui/task-observation.js +59 -0
- package/dist/tui/task-store.js +366 -0
- package/dist/tui/text-values.js +16 -0
- package/dist/tui/view-connections.js +47 -0
- package/dist/tui/view-model.js +94 -0
- package/dist/tui/view-persistence.js +51 -0
- package/dist/tui/view-ports.js +1 -0
- package/dist/tui/view-session.js +37 -0
- package/dist/tui/widget-details.js +144 -0
- package/dist/tui/widget-status.js +245 -0
- package/dist/tui/widget.js +145 -0
- package/dist/tui/workflow-labels.js +223 -0
- package/dist/tui/workflow-outcomes.js +124 -0
- package/docs/code-quality.md +38 -0
- package/docs/development.md +99 -0
- package/docs/intercom-bridge.md +22 -17
- package/docs/intercom.md +132 -106
- package/docs/performance.md +19 -17
- package/docs/reference.md +1472 -0
- package/generated/RunValidators.d.ts +28 -0
- package/generated/RunValidators.js +2 -0
- package/package.json +27 -6
- package/prompts/parallel-cleanup.md +3 -0
- package/prompts/parallel-context-build.md +3 -0
- package/prompts/parallel-handoff-plan.md +6 -0
- package/prompts/parallel-research.md +4 -0
- package/prompts/parallel-review.md +2 -0
- package/prompts/review-loop.md +2 -0
- package/scripts/build.mjs +129 -85
- package/scripts/check-compat.mjs +48 -11
- package/scripts/compat-host.mjs +35 -7
- package/scripts/generate-run-schemas.mjs +210 -0
- package/scripts/intercom-bridge-credentials.mjs +155 -28
- package/scripts/intercom-remote.mjs +175 -50
- package/scripts/local-install-smoke.mjs +47 -37
- package/scripts/native-package-smoke.mjs +135 -25
- package/scripts/package-smoke.mjs +360 -140
- package/scripts/prepare.mjs +54 -34
- package/scripts/real-pi-processes.mjs +261 -0
- package/scripts/real-pi-smoke.mjs +432 -351
- package/scripts/run-tests.mjs +29 -15
- package/skills/pi-intercom/SKILL.md +11 -11
- package/skills/pi-intercom/references/peer-sessions.md +7 -2
- package/skills/pi-subagents/SKILL.md +1 -1
- package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
- package/src/agents/agent-defaults.ts +13 -0
- package/src/agents/agent-definition.ts +253 -0
- package/src/agents/agent-management.ts +111 -808
- package/src/agents/agent-scope.ts +7 -3
- package/src/agents/agent-selection.ts +26 -16
- package/src/agents/agent-serializer.ts +84 -93
- package/src/agents/agents.ts +199 -906
- package/src/agents/builtin-overrides.ts +297 -0
- package/src/agents/chain-serializer.ts +3 -329
- package/src/agents/config-values.ts +57 -0
- package/src/agents/discovery-paths.ts +134 -0
- package/src/agents/frontmatter.ts +35 -17
- package/src/agents/identity.ts +49 -18
- package/src/agents/json-chain.ts +305 -0
- package/src/agents/management-config.ts +342 -0
- package/src/agents/management-format.ts +243 -0
- package/src/agents/management-persistence.ts +408 -0
- package/src/agents/management-targets.ts +260 -0
- package/src/agents/management-warnings.ts +115 -0
- package/src/agents/markdown-chain.ts +237 -0
- package/src/agents/package-agents.ts +231 -0
- package/src/agents/skill-files.ts +182 -0
- package/src/agents/skill-search-paths.ts +289 -0
- package/src/agents/skill-types.ts +31 -0
- package/src/agents/skills.ts +152 -610
- package/src/extension/acceptance-schema.ts +88 -0
- package/src/extension/chain-schema.ts +276 -0
- package/src/extension/child-runtime.ts +302 -0
- package/src/extension/compact-tools.ts +259 -102
- package/src/extension/config-schema.ts +59 -0
- package/src/extension/config.ts +39 -17
- package/src/extension/control-notice-schema.ts +55 -0
- package/src/extension/control-notices.ts +57 -33
- package/src/extension/delegation-bridges.ts +59 -0
- package/src/extension/doctor.ts +171 -135
- package/src/extension/everyday-schemas.ts +252 -0
- package/src/extension/fanout-child.ts +29 -308
- package/src/extension/index.ts +17 -642
- package/src/extension/message-renderers.ts +334 -0
- package/src/extension/nested-control-inbox.ts +196 -0
- package/src/extension/parent-runtime.ts +405 -0
- package/src/extension/primary-tool.ts +130 -0
- package/src/extension/result-snapshot.ts +35 -0
- package/src/extension/runtime-reload.ts +72 -0
- package/src/extension/runtime-storage.ts +49 -0
- package/src/extension/schema-overrides.ts +114 -0
- package/src/extension/schemas.ts +451 -418
- package/src/extension/tool-input.ts +40 -13
- package/src/extension/tool-result.ts +45 -14
- package/src/history/answer-texts.ts +74 -0
- package/src/history/canonical-result.ts +127 -51
- package/src/history/canonical-selection.ts +54 -0
- package/src/history/database-generation.ts +86 -0
- package/src/history/database.ts +86 -48
- package/src/history/entry-ingestion.ts +129 -0
- package/src/history/index.ts +426 -148
- package/src/history/ingest.ts +372 -342
- package/src/history/output-digests.ts +41 -0
- package/src/history/preview.ts +235 -0
- package/src/history/prune.ts +48 -0
- package/src/history/queries.ts +122 -256
- package/src/history/query-scope.ts +278 -0
- package/src/history/rows.ts +118 -0
- package/src/history/run-projection.ts +164 -0
- package/src/history/run-queries.ts +199 -0
- package/src/history/schema.ts +34 -0
- package/src/history/search-queries.ts +216 -0
- package/src/history/selected-record.ts +140 -0
- package/src/history/source-file.ts +51 -0
- package/src/history/source-watches.ts +156 -0
- package/src/history/store.ts +310 -197
- package/src/history/text-chunks.ts +181 -0
- package/src/history/text.ts +43 -0
- package/src/history/transcript-queries.ts +251 -0
- package/src/history/types.ts +27 -164
- package/src/history/values.ts +36 -0
- package/src/history/wire-inputs.ts +141 -0
- package/src/history/wire-models.ts +51 -0
- package/src/history/worker-runtime.ts +502 -0
- package/src/history/worker.ts +94 -336
- package/src/intercom/intercom-bridge.ts +136 -69
- package/src/intercom/live-intercom.ts +197 -92
- package/src/intercom/nested-result-tree.ts +213 -0
- package/src/intercom/result-delivery.ts +56 -0
- package/src/intercom/result-intercom.ts +364 -382
- package/src/pi-intercom/agent-dir.ts +9 -3
- package/src/pi-intercom/async.ts +33 -0
- package/src/pi-intercom/bridge-ask.ts +64 -0
- package/src/pi-intercom/bridge-config.ts +101 -0
- package/src/pi-intercom/bridge-http.ts +97 -0
- package/src/pi-intercom/bridge-protocol.ts +123 -0
- package/src/pi-intercom/bridge-routes.ts +90 -0
- package/src/pi-intercom/bridge-session.ts +506 -0
- package/src/pi-intercom/bridge.ts +258 -547
- package/src/pi-intercom/broker/broker.ts +326 -263
- package/src/pi-intercom/broker/client.ts +273 -354
- package/src/pi-intercom/broker/connection.ts +192 -0
- package/src/pi-intercom/broker/framing.ts +11 -6
- package/src/pi-intercom/broker/paths.ts +28 -25
- package/src/pi-intercom/broker/pid.ts +68 -24
- package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
- package/src/pi-intercom/broker/snapshots.ts +241 -0
- package/src/pi-intercom/broker/spawn.ts +58 -34
- package/src/pi-intercom/config.ts +113 -108
- package/src/pi-intercom/connection.ts +346 -0
- package/src/pi-intercom/identity.ts +71 -0
- package/src/pi-intercom/inbound-delivery.ts +450 -0
- package/src/pi-intercom/inbound-journal.ts +350 -0
- package/src/pi-intercom/inbound-record.ts +141 -0
- package/src/pi-intercom/inbound.ts +237 -0
- package/src/pi-intercom/index.ts +86 -2923
- package/src/pi-intercom/inspection.ts +82 -0
- package/src/pi-intercom/interview.ts +295 -0
- package/src/pi-intercom/lifecycle.ts +183 -0
- package/src/pi-intercom/message-format.ts +77 -0
- package/src/pi-intercom/outbound.ts +418 -0
- package/src/pi-intercom/peer-awareness.ts +84 -0
- package/src/pi-intercom/reply-tracker.ts +121 -59
- package/src/pi-intercom/reply-wait.ts +247 -0
- package/src/pi-intercom/runtime-types.ts +97 -0
- package/src/pi-intercom/session-events.ts +247 -0
- package/src/pi-intercom/session-targets.ts +124 -72
- package/src/pi-intercom/subagent-events.ts +299 -0
- package/src/pi-intercom/subagent-live-events.ts +212 -109
- package/src/pi-intercom/supervisor.ts +362 -0
- package/src/pi-intercom/tool-arguments.ts +120 -0
- package/src/pi-intercom/tool-registration.ts +121 -0
- package/src/pi-intercom/tool-results.ts +54 -0
- package/src/pi-intercom/tool-schemas.ts +134 -0
- package/src/pi-intercom/tools.ts +80 -0
- package/src/pi-intercom/topic-actions.ts +243 -0
- package/src/pi-intercom/topics.ts +267 -121
- package/src/pi-intercom/transport.ts +14 -0
- package/src/pi-intercom/types.ts +288 -190
- package/src/pi-intercom/ui/compose-paste.ts +109 -0
- package/src/pi-intercom/ui/compose.ts +173 -157
- package/src/pi-intercom/ui/inline-message.ts +80 -62
- package/src/pi-intercom/ui/message-renderers.ts +182 -0
- package/src/pi-intercom/ui/overlay.ts +238 -0
- package/src/pi-intercom/ui/session-format.ts +146 -0
- package/src/pi-intercom/ui/session-list.ts +145 -62
- package/src/pi-intercom/ui/tool-renderers.ts +148 -0
- package/src/pi-intercom/ui/topic-view.ts +107 -0
- package/src/pi-intercom/validation.ts +69 -0
- package/src/runs/background/async-chain-plan.ts +451 -0
- package/src/runs/background/async-control.ts +201 -71
- package/src/runs/background/async-execution.ts +206 -829
- package/src/runs/background/async-job-admission.ts +54 -0
- package/src/runs/background/async-job-projection.ts +225 -0
- package/src/runs/background/async-job-tracker.ts +416 -360
- package/src/runs/background/async-launch.ts +319 -0
- package/src/runs/background/async-plan.ts +285 -0
- package/src/runs/background/async-result-file.ts +79 -37
- package/src/runs/background/async-resume.ts +338 -285
- package/src/runs/background/async-run-discovery.ts +270 -0
- package/src/runs/background/async-run-location.ts +194 -0
- package/src/runs/background/async-run-record.ts +14 -0
- package/src/runs/background/async-run-repair.ts +307 -0
- package/src/runs/background/async-run-summary.ts +71 -0
- package/src/runs/background/async-single-plan.ts +168 -0
- package/src/runs/background/async-status-projection.ts +188 -0
- package/src/runs/background/async-status-render.ts +164 -0
- package/src/runs/background/async-status-validation.ts +238 -0
- package/src/runs/background/async-status.ts +9 -481
- package/src/runs/background/async-value.ts +29 -0
- package/src/runs/background/completion-dedupe.ts +103 -54
- package/src/runs/background/completion-delivery.ts +313 -187
- package/src/runs/background/completion-receipts.ts +309 -0
- package/src/runs/background/legacy-status-acceptance.ts +38 -0
- package/src/runs/background/notify.ts +167 -106
- package/src/runs/background/parallel-groups.ts +95 -46
- package/src/runs/background/result-payload.ts +268 -0
- package/src/runs/background/result-watcher.ts +484 -387
- package/src/runs/background/run-id-resolver.ts +126 -57
- package/src/runs/background/run-schemas.ts +240 -0
- package/src/runs/background/run-status-contracts.ts +46 -0
- package/src/runs/background/run-status-render.ts +364 -0
- package/src/runs/background/run-status.ts +338 -356
- package/src/runs/background/runner-attempt-output.ts +281 -0
- package/src/runs/background/runner-attempt.ts +354 -0
- package/src/runs/background/runner-child-executor.ts +232 -0
- package/src/runs/background/runner-child-observer.ts +270 -0
- package/src/runs/background/runner-completion-summary.ts +106 -0
- package/src/runs/background/runner-completion.ts +274 -0
- package/src/runs/background/runner-config.ts +52 -0
- package/src/runs/background/runner-contract.ts +51 -0
- package/src/runs/background/runner-dynamic.ts +185 -0
- package/src/runs/background/runner-finalization.ts +203 -0
- package/src/runs/background/runner-graph.ts +91 -0
- package/src/runs/background/runner-initial-status.ts +72 -0
- package/src/runs/background/runner-lifecycle.ts +159 -0
- package/src/runs/background/runner-monitor.ts +399 -0
- package/src/runs/background/runner-parallel.ts +280 -0
- package/src/runs/background/runner-prepare-step.ts +128 -0
- package/src/runs/background/runner-reporting.ts +192 -0
- package/src/runs/background/runner-status.ts +220 -0
- package/src/runs/background/runner-step-output.ts +158 -0
- package/src/runs/background/runner-step-record.ts +76 -0
- package/src/runs/background/runner-step.ts +150 -0
- package/src/runs/background/runner-streaming.ts +220 -0
- package/src/runs/background/runner-workflow.ts +284 -0
- package/src/runs/background/stale-run-reconciler.ts +279 -336
- package/src/runs/background/subagent-runner-launcher.ts +67 -35
- package/src/runs/background/subagent-runner.ts +80 -2048
- package/src/runs/background/top-level-async.ts +9 -7
- package/src/runs/foreground/chain-clarify.ts +499 -1334
- package/src/runs/foreground/clarification-draft.ts +92 -0
- package/src/runs/foreground/clarify-contracts.ts +33 -0
- package/src/runs/foreground/clarify-invocation.ts +192 -65
- package/src/runs/foreground/clarify-text-editor.ts +229 -0
- package/src/runs/foreground/clarify-view.ts +222 -0
- package/src/runs/foreground/execution-input.ts +358 -424
- package/src/runs/foreground/execution-routing.ts +41 -0
- package/src/runs/foreground/execution-timeout.ts +92 -0
- package/src/runs/foreground/foreground-control.ts +333 -812
- package/src/runs/foreground/foreground-memory.ts +132 -0
- package/src/runs/foreground/invocation-context.ts +88 -0
- package/src/runs/foreground/invocation-execution.ts +465 -0
- package/src/runs/foreground/invocation-expansion.ts +58 -0
- package/src/runs/foreground/management-actions.ts +360 -0
- package/src/runs/foreground/nested-control.ts +248 -0
- package/src/runs/foreground/question-continuation.ts +112 -0
- package/src/runs/foreground/question-control.ts +297 -70
- package/src/runs/foreground/resume-target.ts +330 -0
- package/src/runs/foreground/revival-launch-policy.ts +112 -0
- package/src/runs/foreground/run-async-path.ts +307 -223
- package/src/runs/foreground/run-interrupt.ts +202 -0
- package/src/runs/foreground/run-nudge.ts +355 -0
- package/src/runs/foreground/saved-revival.ts +356 -0
- package/src/runs/foreground/subagent-executor.ts +195 -493
- package/src/runs/foreground/subagent-params.ts +314 -242
- package/src/runs/foreground/wait-observation.ts +160 -0
- package/src/runs/foreground/wait-registration.ts +18 -0
- package/src/runs/foreground/wait-run.ts +361 -119
- package/src/runs/shared/acceptance-contract.ts +410 -209
- package/src/runs/shared/acceptance-defaults.ts +1 -0
- package/src/runs/shared/acceptance-evaluation.ts +314 -240
- package/src/runs/shared/acceptance-finalization.ts +447 -305
- package/src/runs/shared/acceptance-outcome.ts +69 -0
- package/src/runs/shared/acceptance-reports.ts +220 -126
- package/src/runs/shared/acceptance-submission.ts +251 -0
- package/src/runs/shared/acceptance-verification.ts +118 -0
- package/src/runs/shared/acceptance.ts +25 -25
- package/src/runs/shared/chain-outputs.ts +190 -98
- package/src/runs/shared/child-attempt-types.ts +118 -0
- package/src/runs/shared/child-attempt.ts +372 -608
- package/src/runs/shared/child-boundaries.ts +217 -0
- package/src/runs/shared/child-context-filter.ts +53 -0
- package/src/runs/shared/child-event-observer.ts +496 -0
- package/src/runs/shared/child-execution-cwd.ts +139 -68
- package/src/runs/shared/child-execution-outcome.ts +103 -0
- package/src/runs/shared/child-invocation.ts +74 -0
- package/src/runs/shared/child-message-validation.ts +233 -0
- package/src/runs/shared/child-native-accounting.ts +154 -0
- package/src/runs/shared/child-native-observation.ts +79 -0
- package/src/runs/shared/child-observation-spool.ts +188 -0
- package/src/runs/shared/child-observations.ts +219 -89
- package/src/runs/shared/child-presence.ts +6 -0
- package/src/runs/shared/child-route-env.ts +142 -0
- package/src/runs/shared/child-stream-observer.ts +302 -0
- package/src/runs/shared/child-stream-projection.ts +160 -0
- package/src/runs/shared/child-structured-tool.ts +38 -0
- package/src/runs/shared/claude-code.ts +201 -228
- package/src/runs/shared/claude-model.ts +67 -0
- package/src/runs/shared/claude-session.ts +124 -0
- package/src/runs/shared/claude-types.ts +31 -0
- package/src/runs/shared/completion-guard.ts +35 -26
- package/src/runs/shared/control-event-policy.ts +15 -0
- package/src/runs/shared/control-notification-owner.ts +20 -0
- package/src/runs/shared/dynamic-fanout.ts +402 -238
- package/src/runs/shared/dynamic-item.ts +114 -0
- package/src/runs/shared/history-index.ts +112 -51
- package/src/runs/shared/legacy-async-recovery.ts +153 -0
- package/src/runs/shared/legacy-output-recovery.ts +214 -0
- package/src/runs/shared/mcp-config-schema.ts +46 -0
- package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
- package/src/runs/shared/model-fallback.ts +302 -180
- package/src/runs/shared/mutating-tool-guard.ts +259 -158
- package/src/runs/shared/native-finalization-types.ts +29 -0
- package/src/runs/shared/native-finalization.ts +233 -109
- package/src/runs/shared/native-usage.ts +379 -96
- package/src/runs/shared/nested-control-records.ts +178 -0
- package/src/runs/shared/nested-events.ts +45 -752
- package/src/runs/shared/nested-path.ts +47 -34
- package/src/runs/shared/nested-projection.ts +230 -0
- package/src/runs/shared/nested-protocol.ts +67 -0
- package/src/runs/shared/nested-registry.ts +273 -0
- package/src/runs/shared/nested-render.ts +198 -100
- package/src/runs/shared/nested-route.ts +292 -0
- package/src/runs/shared/nested-validation.ts +291 -0
- package/src/runs/shared/owned-child-evidence.ts +184 -0
- package/src/runs/shared/owned-run-list.ts +187 -0
- package/src/runs/shared/owned-run-observation.ts +368 -0
- package/src/runs/shared/owned-run-progress.ts +172 -0
- package/src/runs/shared/owned-run-read-state.ts +7 -0
- package/src/runs/shared/owned-run-results.ts +289 -0
- package/src/runs/shared/owned-run-status.ts +239 -0
- package/src/runs/shared/owned-run-view.ts +65 -0
- package/src/runs/shared/owned-workflow-details.ts +24 -0
- package/src/runs/shared/owner-output.ts +73 -0
- package/src/runs/shared/parallel-utils.ts +93 -129
- package/src/runs/shared/parent-receipts.ts +177 -50
- package/src/runs/shared/parent-usage.ts +314 -91
- package/src/runs/shared/pi-args.ts +241 -311
- package/src/runs/shared/pi-launch-input.ts +48 -0
- package/src/runs/shared/pi-session-launch.ts +94 -0
- package/src/runs/shared/pi-spawn.ts +57 -33
- package/src/runs/shared/run-history-queries.ts +189 -38
- package/src/runs/shared/run-history.ts +197 -76
- package/src/runs/shared/run-id-ambiguity.ts +7 -3
- package/src/runs/shared/run-metadata-paths.ts +17 -0
- package/src/runs/shared/run-metadata.ts +240 -0
- package/src/runs/shared/run-persistence.ts +181 -0
- package/src/runs/shared/run-records.ts +19 -607
- package/src/runs/shared/run-restoration.ts +455 -0
- package/src/runs/shared/run-state-owner.ts +31 -0
- package/src/runs/shared/session-cwd-preload.ts +39 -19
- package/src/runs/shared/single-output.ts +358 -205
- package/src/runs/shared/stable-value.ts +15 -0
- package/src/runs/shared/streaming-text.ts +39 -12
- package/src/runs/shared/structured-output.ts +76 -46
- package/src/runs/shared/subagent-control.ts +330 -197
- package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
- package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
- package/src/runs/shared/supervisor-question-state.ts +221 -0
- package/src/runs/shared/supervisor-questions.ts +396 -401
- package/src/runs/shared/workflow-graph.ts +400 -198
- package/src/runs/shared/workflow-policy.ts +245 -110
- package/src/runs/shared/worktree-contract.ts +29 -0
- package/src/runs/shared/worktree-hook.ts +181 -0
- package/src/runs/shared/worktree-location.ts +61 -0
- package/src/runs/shared/worktree-preservation.ts +10 -0
- package/src/runs/shared/worktree-process.ts +132 -0
- package/src/runs/shared/worktree.ts +459 -587
- package/src/shared/agent-context-policy.ts +176 -145
- package/src/shared/agent-dir.ts +15 -0
- package/src/shared/artifacts.ts +99 -68
- package/src/shared/atomic-json.ts +14 -11
- package/src/shared/chain-files.ts +72 -0
- package/src/shared/concurrency.ts +27 -0
- package/src/shared/content-preview.ts +117 -0
- package/src/shared/cooperative.ts +17 -13
- package/src/shared/execution-cwd.ts +34 -9
- package/src/shared/file-coalescer.ts +24 -22
- package/src/shared/fork-context.ts +52 -48
- package/src/shared/formatters.ts +88 -47
- package/src/shared/journal-frames.ts +197 -0
- package/src/shared/journal-projections.ts +133 -0
- package/src/shared/journal-reader.ts +18 -333
- package/src/shared/json-projection.ts +224 -0
- package/src/shared/lazy-tools.ts +76 -27
- package/src/shared/message-output.ts +146 -0
- package/src/shared/model-info.ts +94 -58
- package/src/shared/native-import.ts +25 -0
- package/src/shared/native-journal.ts +172 -0
- package/src/shared/native-session.ts +8 -3
- package/src/shared/native-tui.ts +13 -3
- package/src/shared/native-typebox.ts +18 -3
- package/src/shared/output-page.ts +76 -0
- package/src/shared/post-exit-stdio-guard.ts +232 -172
- package/src/shared/prompt-sections.ts +13 -7
- package/src/shared/session-entries.ts +103 -44
- package/src/shared/session-identity.ts +17 -10
- package/src/shared/settings.ts +182 -367
- package/src/shared/status-format.ts +207 -98
- package/src/shared/stream-json.d.ts +10 -0
- package/src/shared/task-file-policy.ts +35 -0
- package/src/shared/temp-root.ts +122 -71
- package/src/shared/types/acceptance.ts +149 -0
- package/src/shared/types/async.ts +247 -0
- package/src/shared/types/config.ts +139 -0
- package/src/shared/types/details.ts +104 -0
- package/src/shared/types/history.ts +217 -0
- package/src/shared/types/inputs.ts +4 -0
- package/src/shared/types/intercom.ts +57 -0
- package/src/shared/types/launch.ts +39 -0
- package/src/shared/types/messages.ts +104 -0
- package/src/shared/types/nested.ts +153 -0
- package/src/shared/types/owned-runs.ts +148 -0
- package/src/shared/types/progress.ts +106 -0
- package/src/shared/types/questions.ts +103 -0
- package/src/shared/types/results.ts +119 -0
- package/src/shared/types/state.ts +56 -0
- package/src/shared/types/usage.ts +36 -0
- package/src/shared/types/workflow.ts +187 -0
- package/src/shared/types.ts +222 -1161
- package/src/shared/ui-mode.ts +1 -1
- package/src/shared/unknown.ts +59 -0
- package/src/shared/utils.ts +111 -305
- package/src/slash/command-discovery.ts +109 -0
- package/src/slash/command-input.ts +232 -0
- package/src/slash/prompt-template-bridge.ts +153 -400
- package/src/slash/prompt-template-contract.ts +152 -0
- package/src/slash/prompt-template-results.ts +189 -0
- package/src/slash/request-protocol.ts +87 -0
- package/src/slash/result-delivery.ts +312 -0
- package/src/slash/saved-chain.ts +115 -0
- package/src/slash/slash-bridge.ts +202 -156
- package/src/slash/slash-commands.ts +176 -598
- package/src/slash/slash-live-state.ts +287 -229
- package/src/tui/action-hints.ts +147 -61
- package/src/tui/activity-lines.ts +40 -0
- package/src/tui/agent-browser.ts +354 -0
- package/src/tui/agent-controls.ts +355 -0
- package/src/tui/agent-conversation.ts +514 -0
- package/src/tui/agent-dock.ts +250 -0
- package/src/tui/agent-history.ts +78 -203
- package/src/tui/agent-model.ts +78 -0
- package/src/tui/agent-picker.ts +325 -0
- package/src/tui/agent-view.ts +391 -1333
- package/src/tui/compact-results.ts +342 -0
- package/src/tui/conversation-details.ts +206 -0
- package/src/tui/conversation-frame.ts +184 -0
- package/src/tui/conversation-history.ts +246 -0
- package/src/tui/conversation-menu.ts +119 -0
- package/src/tui/conversation-notices.ts +116 -0
- package/src/tui/conversation-selection.ts +66 -0
- package/src/tui/conversation-viewport.ts +169 -0
- package/src/tui/direction-message.ts +35 -0
- package/src/tui/display.ts +409 -0
- package/src/tui/editor-viewport.ts +19 -0
- package/src/tui/expanded-content.ts +134 -0
- package/src/tui/expanded-multi.ts +264 -0
- package/src/tui/expanded-single.ts +92 -0
- package/src/tui/history-cards.ts +316 -0
- package/src/tui/history-display.ts +334 -0
- package/src/tui/history-json.ts +17 -0
- package/src/tui/history-metadata.ts +177 -0
- package/src/tui/history-record.ts +321 -0
- package/src/tui/history-text.ts +34 -0
- package/src/tui/indexed-history.ts +149 -0
- package/src/tui/nested-widget.ts +192 -0
- package/src/tui/picker-page.ts +80 -0
- package/src/tui/render.ts +100 -1546
- package/src/tui/result-facts.ts +99 -0
- package/src/tui/task-observation.ts +96 -0
- package/src/tui/task-store.ts +432 -0
- package/src/tui/text-values.ts +20 -0
- package/src/tui/view-connections.ts +64 -0
- package/src/tui/view-model.ts +181 -0
- package/src/tui/view-persistence.ts +57 -0
- package/src/tui/view-ports.ts +55 -0
- package/src/tui/view-session.ts +42 -0
- package/src/tui/widget-details.ts +220 -0
- package/src/tui/widget-status.ts +331 -0
- package/src/tui/widget.ts +208 -0
- package/src/tui/workflow-labels.ts +340 -0
- package/src/tui/workflow-outcomes.ts +150 -0
- package/tsconfig.build.json +11 -10
- package/tsconfig.json +30 -17
|
@@ -1,353 +1,495 @@
|
|
|
1
|
-
import { isDeepStrictEqual } from "node:util";
|
|
2
|
-
import type { Message } from "@earendil-works/pi-ai";
|
|
3
|
-
import { createStructuredOutputRuntime, readStructuredOutput, validateStructuredOutputValue, type StructuredOutputRuntime } from "./structured-output.ts";
|
|
4
1
|
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
AcceptanceFinalizationTurn,
|
|
3
|
+
AcceptanceLedger,
|
|
4
|
+
AcceptanceReport,
|
|
5
|
+
JsonSchemaObject,
|
|
6
|
+
ResolvedAcceptanceConfig,
|
|
10
7
|
} from "../../shared/types.ts";
|
|
11
8
|
import { acceptanceFailureMessage, evaluateAcceptance } from "./acceptance-evaluation.ts";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
import {
|
|
10
|
+
acceptanceSelfReviewConfig,
|
|
11
|
+
formatEvidenceReportFieldMapping,
|
|
12
|
+
formatAcceptanceRequirements,
|
|
13
|
+
shouldRunAcceptanceFinalization,
|
|
14
|
+
} from "./acceptance-contract.ts";
|
|
15
|
+
import type { ExecutionOutcome } from "./acceptance-outcome.ts";
|
|
16
|
+
export { resolveExecutionOutcome } from "./acceptance-outcome.ts";
|
|
17
|
+
import {
|
|
18
|
+
formatAcceptanceReportExample,
|
|
19
|
+
parseAcceptanceReport,
|
|
20
|
+
stripAcceptanceReport,
|
|
21
|
+
} from "./acceptance-reports.ts";
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
import { reportAuditOutput, type FinalizationReportSubmission } from "./acceptance-submission.ts";
|
|
24
|
+
export {
|
|
25
|
+
createFinalizationReportRuntime,
|
|
26
|
+
readFinalizationReport,
|
|
27
|
+
type FinalizationReportSubmission,
|
|
28
|
+
} from "./acceptance-submission.ts";
|
|
18
29
|
|
|
19
|
-
export function
|
|
20
|
-
|
|
21
|
-
type: "object", properties: {
|
|
22
|
-
// A schema resource keeps root-local references (including recursive "#") scoped to the public answer.
|
|
23
|
-
answer: publicOutputSchema ? { $id: "urn:pi-subagents:public-output", ...publicOutputSchema }
|
|
24
|
-
: { type: "string", pattern: "\\S", description: "Complete standalone final answer, including every requested handoff detail." },
|
|
25
|
-
report: ACCEPTANCE_REPORT_SCHEMA,
|
|
26
|
-
}, required: ["answer", "report"], additionalProperties: false,
|
|
27
|
-
});
|
|
28
|
-
return { ...runtime, publicOutputSchema };
|
|
30
|
+
export function formatUnconfirmedFinalizationOutput(output: string): string {
|
|
31
|
+
return `UNCONFIRMED task report — retained for audit only; finalization did not deliver a current complete report.\n\n${stripAcceptanceReport(output)}`;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
export function resolveFinalizationOutput(rawOutput: string, previousOutput: string): string {
|
|
35
|
+
const prose = stripAcceptanceReport(rawOutput);
|
|
36
|
+
if (prose.trim().length > 0) {
|
|
37
|
+
return prose;
|
|
38
|
+
}
|
|
39
|
+
const report = parseAcceptanceReport(rawOutput).report;
|
|
40
|
+
const summary = report?.diffSummary?.trim() ?? "";
|
|
41
|
+
if (summary.length > 0) {
|
|
42
|
+
return summary;
|
|
43
|
+
}
|
|
44
|
+
const notes = report?.notes?.trim() ?? "";
|
|
45
|
+
return notes.length > 0 ? notes : previousOutput;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (typeof value.answer !== "string" || !value.answer.trim()) return;
|
|
53
|
-
return { output: value.answer, report: value.report as AcceptanceReport };
|
|
48
|
+
interface RunAcceptanceInput {
|
|
49
|
+
readonly acceptance: ResolvedAcceptanceConfig;
|
|
50
|
+
readonly initial: ExecutionOutcome;
|
|
51
|
+
readonly initialOutput: string;
|
|
52
|
+
readonly initialReport?: AcceptanceReport;
|
|
53
|
+
readonly initialAcceptance?: AcceptanceLedger;
|
|
54
|
+
readonly sessionFile?: string;
|
|
55
|
+
readonly cwd: string;
|
|
56
|
+
readonly signal?: AbortSignal;
|
|
57
|
+
readonly nativeReport?: boolean;
|
|
58
|
+
readonly outputSchema?: JsonSchemaObject;
|
|
59
|
+
readonly recordedTurns?: number;
|
|
60
|
+
readonly runTurn: (prompt: string, turn: number, sessionFile: string) => Promise<ReviewResult>;
|
|
54
61
|
}
|
|
62
|
+
type ReviewResult = FinalizationReportSubmission & {
|
|
63
|
+
readonly error?: string;
|
|
64
|
+
readonly acceptance?: AcceptanceLedger;
|
|
65
|
+
};
|
|
55
66
|
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
function skipSelfReview(input: RunAcceptanceInput, ledger: AcceptanceLedger): boolean {
|
|
68
|
+
return (
|
|
69
|
+
ledger.status === "blocked" ||
|
|
70
|
+
!shouldRunAcceptanceFinalization(input.acceptance) ||
|
|
71
|
+
input.initial.exitCode !== 0 ||
|
|
72
|
+
(input.initial.error ?? "").length > 0 ||
|
|
73
|
+
input.initial.interrupted === true ||
|
|
74
|
+
(input.signal?.aborted === true && (input.recordedTurns ?? 0) === 0)
|
|
75
|
+
);
|
|
59
76
|
}
|
|
60
77
|
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (message.role !== "assistant" || !Array.isArray(message.content)) continue;
|
|
71
|
-
for (const call of message.content) {
|
|
72
|
-
if (call.type !== "toolCall" || call.name !== "structured_output" || !successfulIds.has(call.id)) continue;
|
|
73
|
-
const value = call.arguments.value;
|
|
74
|
-
const previous = readReportValue(value, runtime.publicOutputSchema);
|
|
75
|
-
if (previous && validateStructuredOutputValue(runtime.schema, value).status === "valid") unconfirmedOutput = reportAuditOutput(previous);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const rejected = (reason: string): FinalizationReportSubmission => ({
|
|
79
|
-
output: "", reportSubmissionError: `No current finalization report: ${reason}`, unconfirmedOutput,
|
|
80
|
-
});
|
|
81
|
-
const index = messages.findLastIndex((message) => message.role === "assistant");
|
|
82
|
-
const last = messages[index];
|
|
83
|
-
if (last?.role !== "assistant" || last.errorMessage || !["stop", "toolUse"].includes(last.stopReason) || !Array.isArray(last.content)) {
|
|
84
|
-
return rejected("the latest assistant turn did not finish successfully.");
|
|
85
|
-
}
|
|
86
|
-
// Claude Code returns its schema-constrained payload in the terminal result event, not a Pi tool call.
|
|
87
|
-
if (options.structuredResult) {
|
|
88
|
-
if (captured.error) return rejected(captured.error);
|
|
89
|
-
return submitted ? { ...submitted, unconfirmedOutput } : rejected("the submission must contain a complete answer and a valid acceptance report.");
|
|
90
|
-
}
|
|
91
|
-
const calls = last.content.filter((part) => part.type === "toolCall");
|
|
92
|
-
if (calls.length !== 1 || calls[0]!.name !== "structured_output") return rejected("the latest assistant turn must submit structured_output as its only tool call.");
|
|
93
|
-
const call = calls[0]!;
|
|
94
|
-
const result = messages.slice(index + 1).findLast((message) => message.role === "toolResult" && message.toolCallId === call.id);
|
|
95
|
-
if (result?.role !== "toolResult" || result.toolName !== "structured_output" || result.isError !== false) return rejected("the latest structured_output call has no matching successful result.");
|
|
96
|
-
if (captured.error) return rejected(captured.error);
|
|
97
|
-
if (!isDeepStrictEqual(captured.value, call.arguments.value)) return rejected("the capture does not match the latest submission.");
|
|
98
|
-
if (!submitted) return rejected("the submission must contain a complete answer and a valid acceptance report.");
|
|
99
|
-
return { ...submitted, unconfirmedOutput };
|
|
100
|
-
}
|
|
78
|
+
/** Owns ordered continuation, cumulative audit evidence, and the authoritative current ledger. */
|
|
79
|
+
class AcceptanceReview {
|
|
80
|
+
private readonly input: RunAcceptanceInput & { readonly sessionFile: string };
|
|
81
|
+
private readonly initialLedger: AcceptanceLedger;
|
|
82
|
+
private readonly selfReview: ResolvedAcceptanceConfig;
|
|
83
|
+
private readonly turns: AcceptanceFinalizationTurn[] = [];
|
|
84
|
+
private authoritativeLedger: AcceptanceLedger;
|
|
85
|
+
private previousFailure: string | undefined;
|
|
86
|
+
private auditOutput: string;
|
|
101
87
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
88
|
+
constructor(
|
|
89
|
+
input: RunAcceptanceInput & { readonly sessionFile: string },
|
|
90
|
+
initialLedger: AcceptanceLedger,
|
|
91
|
+
selfReview: ResolvedAcceptanceConfig,
|
|
92
|
+
) {
|
|
93
|
+
this.input = input;
|
|
94
|
+
this.initialLedger = initialLedger;
|
|
95
|
+
this.selfReview = selfReview;
|
|
96
|
+
this.authoritativeLedger = initialLedger;
|
|
97
|
+
this.previousFailure = acceptanceFailureMessage(initialLedger);
|
|
98
|
+
this.auditOutput = reportAuditOutput({
|
|
99
|
+
output: input.initialOutput,
|
|
100
|
+
report: input.initialReport,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
104
|
+
private finish(status: "completed" | "blocked" | "failed"): AcceptanceLedger {
|
|
105
|
+
return attachFinalizationToLedger({
|
|
106
|
+
initialLedger: this.initialLedger,
|
|
107
|
+
authoritativeLedger: this.authoritativeLedger,
|
|
108
|
+
turns: this.turns,
|
|
109
|
+
status,
|
|
110
|
+
maxTurns: this.input.acceptance.finalization.maxTurns,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
112
113
|
|
|
113
|
-
|
|
114
|
+
private processFailure(
|
|
115
|
+
result: ReviewResult,
|
|
116
|
+
turn: number,
|
|
117
|
+
prompt: string,
|
|
118
|
+
): AcceptanceLedger | undefined {
|
|
119
|
+
if (result.error === undefined || result.error.length === 0) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
this.turns.push({
|
|
123
|
+
...createFinalizationProcessFailureTurn({
|
|
124
|
+
turn,
|
|
125
|
+
prompt,
|
|
126
|
+
rawOutput: result.output,
|
|
127
|
+
message: result.error,
|
|
128
|
+
}),
|
|
129
|
+
...(this.input.nativeReport === true ? { unconfirmedOutput: this.auditOutput } : {}),
|
|
130
|
+
});
|
|
131
|
+
const ledger = buildFinalizationProcessFailureLedger({
|
|
132
|
+
initialLedger: this.initialLedger,
|
|
133
|
+
turns: this.turns,
|
|
134
|
+
maxTurns: this.input.acceptance.finalization.maxTurns,
|
|
135
|
+
message: result.error,
|
|
136
|
+
});
|
|
137
|
+
return this.input.nativeReport === true
|
|
138
|
+
? {
|
|
139
|
+
...ledger,
|
|
140
|
+
childReport: undefined,
|
|
141
|
+
childReportParseError: result.reportSubmissionError,
|
|
142
|
+
unconfirmedOutput: this.auditOutput,
|
|
143
|
+
}
|
|
144
|
+
: ledger;
|
|
145
|
+
}
|
|
114
146
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
147
|
+
private async evaluateTurn(result: ReviewResult): Promise<AcceptanceLedger> {
|
|
148
|
+
const submissionError = result.reportSubmissionError;
|
|
149
|
+
const rejectedSubmission = submissionError !== undefined && submissionError.length > 0;
|
|
150
|
+
// Replay the native boundary's checks, not the workspace left by a later repair.
|
|
151
|
+
let ledger =
|
|
152
|
+
!rejectedSubmission && result.acceptance
|
|
153
|
+
? result.acceptance
|
|
154
|
+
: await evaluateAcceptance({
|
|
155
|
+
acceptance: this.selfReview,
|
|
156
|
+
governing: this.input.acceptance,
|
|
157
|
+
output: rejectedSubmission ? "" : result.output,
|
|
158
|
+
report: rejectedSubmission ? undefined : result.report,
|
|
159
|
+
cwd: this.input.cwd,
|
|
160
|
+
signal: this.input.signal,
|
|
161
|
+
});
|
|
162
|
+
if (rejectedSubmission) {
|
|
163
|
+
ledger = {
|
|
164
|
+
...ledger,
|
|
165
|
+
childReportParseError: submissionError,
|
|
166
|
+
runtimeChecks: [{ id: "finalization-report", status: "failed", message: submissionError }],
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (this.input.nativeReport === true && (ledger.childReportParseError ?? "").length > 0) {
|
|
170
|
+
ledger = { ...ledger, unconfirmedOutput: this.auditOutput };
|
|
171
|
+
}
|
|
172
|
+
return ledger;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private async completeReview(result: ReviewResult): Promise<AcceptanceLedger> {
|
|
176
|
+
if (result.acceptance || this.selfReview !== this.input.acceptance) {
|
|
177
|
+
this.authoritativeLedger = await evaluateAcceptance({
|
|
178
|
+
acceptance: this.input.acceptance,
|
|
179
|
+
output: result.output,
|
|
180
|
+
report: result.report,
|
|
181
|
+
cwd: this.input.cwd,
|
|
182
|
+
signal: this.input.signal,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return this.finish(this.input.signal?.aborted === true ? "failed" : "completed");
|
|
186
|
+
}
|
|
133
187
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
sessionFile?: string;
|
|
141
|
-
cwd: string;
|
|
142
|
-
signal?: AbortSignal;
|
|
143
|
-
nativeReport?: boolean;
|
|
144
|
-
outputSchema?: JsonSchemaObject;
|
|
145
|
-
recordedTurns?: number;
|
|
146
|
-
runTurn: (prompt: string, turn: number, sessionFile: string) => Promise<FinalizationReportSubmission & { error?: string; acceptance?: AcceptanceLedger }>;
|
|
147
|
-
}): Promise<AcceptanceLedger> {
|
|
148
|
-
const review = shouldRunAcceptanceFinalization(input.acceptance);
|
|
149
|
-
const selfReview = review ? acceptanceSelfReviewConfig(input.acceptance) : input.acceptance;
|
|
150
|
-
const initialLedger = input.initialAcceptance ?? await evaluateAcceptance({ acceptance: selfReview, governing: input.acceptance, output: input.initialOutput, report: input.initialReport, cwd: input.cwd, signal: input.signal });
|
|
151
|
-
if (initialLedger.status === "blocked" || !review || input.initial.exitCode !== 0 || input.initial.error || input.initial.interrupted || (input.signal?.aborted && !input.recordedTurns)) return initialLedger;
|
|
188
|
+
private runTurn(turn: number, prompt: string): Promise<ReviewResult> {
|
|
189
|
+
if (this.input.signal?.aborted === true && turn > (this.input.recordedTurns ?? 0)) {
|
|
190
|
+
return Promise.resolve({ output: "", error: "Acceptance finalization cancelled." });
|
|
191
|
+
}
|
|
192
|
+
return this.input.runTurn(prompt, turn, this.input.sessionFile);
|
|
193
|
+
}
|
|
152
194
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
private retainAudit(result: ReviewResult): void {
|
|
196
|
+
const retained = result.unconfirmedOutput ?? reportAuditOutput(result);
|
|
197
|
+
if (this.input.nativeReport === true && parseAcceptanceReport(retained).report) {
|
|
198
|
+
this.auditOutput = retained;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private async performTurn(turn: number): Promise<AcceptanceLedger | undefined> {
|
|
203
|
+
const prompt = formatAcceptanceFinalizationPrompt({
|
|
204
|
+
acceptance: this.input.acceptance,
|
|
205
|
+
initialOutput: this.input.initialOutput,
|
|
206
|
+
initialLedger: this.initialLedger,
|
|
207
|
+
turn,
|
|
208
|
+
maxTurns: this.input.acceptance.finalization.maxTurns,
|
|
209
|
+
previousFailure: this.previousFailure,
|
|
210
|
+
nativeReport: this.input.nativeReport,
|
|
211
|
+
outputSchema: this.input.outputSchema,
|
|
212
|
+
});
|
|
213
|
+
const result = await this.runTurn(turn, prompt);
|
|
214
|
+
this.retainAudit(result);
|
|
215
|
+
const processFailure = this.processFailure(result, turn, prompt);
|
|
216
|
+
if (processFailure) {
|
|
217
|
+
return processFailure;
|
|
218
|
+
}
|
|
219
|
+
this.authoritativeLedger = await this.evaluateTurn(result);
|
|
220
|
+
this.turns.push(
|
|
221
|
+
createFinalizationTurn({
|
|
222
|
+
turn,
|
|
223
|
+
prompt,
|
|
224
|
+
rawOutput: result.output,
|
|
225
|
+
ledger: this.authoritativeLedger,
|
|
226
|
+
}),
|
|
227
|
+
);
|
|
228
|
+
if (this.authoritativeLedger.status === "blocked") {
|
|
229
|
+
return this.finish("blocked");
|
|
230
|
+
}
|
|
231
|
+
const failure = acceptanceFailureMessage(this.authoritativeLedger);
|
|
232
|
+
if (failure === undefined && this.input.signal?.aborted !== true) {
|
|
233
|
+
return this.completeReview(result);
|
|
234
|
+
}
|
|
235
|
+
if (this.input.signal?.aborted === true) {
|
|
236
|
+
return this.finish("failed");
|
|
237
|
+
}
|
|
238
|
+
this.previousFailure = failure;
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async run(): Promise<AcceptanceLedger> {
|
|
243
|
+
for (let turn = 1; turn <= this.input.acceptance.finalization.maxTurns; turn++) {
|
|
244
|
+
// Each repair resumes the same session and consumes the preceding turn's authoritative outcome.
|
|
245
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
246
|
+
const finished = await this.performTurn(turn);
|
|
247
|
+
if (finished) {
|
|
248
|
+
return finished;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return this.finish("failed");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export async function evaluateRunAcceptance(input: RunAcceptanceInput): Promise<AcceptanceLedger> {
|
|
256
|
+
const review = shouldRunAcceptanceFinalization(input.acceptance);
|
|
257
|
+
const selfReview = review ? acceptanceSelfReviewConfig(input.acceptance) : input.acceptance;
|
|
258
|
+
const initialLedger =
|
|
259
|
+
input.initialAcceptance ??
|
|
260
|
+
(await evaluateAcceptance({
|
|
261
|
+
acceptance: selfReview,
|
|
262
|
+
governing: input.acceptance,
|
|
263
|
+
output: input.initialOutput,
|
|
264
|
+
report: input.initialReport,
|
|
265
|
+
cwd: input.cwd,
|
|
266
|
+
signal: input.signal,
|
|
267
|
+
}));
|
|
268
|
+
if (skipSelfReview(input, initialLedger)) {
|
|
269
|
+
return initialLedger;
|
|
270
|
+
}
|
|
271
|
+
if (input.sessionFile === undefined || input.sessionFile.length === 0) {
|
|
272
|
+
const message =
|
|
273
|
+
"Acceptance finalization requires a session file for same-session continuation.";
|
|
274
|
+
const turns = [createFinalizationProcessFailureTurn({ turn: 1, prompt: "", message })];
|
|
275
|
+
return buildFinalizationProcessFailureLedger({
|
|
276
|
+
initialLedger,
|
|
277
|
+
turns,
|
|
278
|
+
maxTurns: input.acceptance.finalization.maxTurns,
|
|
279
|
+
message,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return new AcceptanceReview(
|
|
283
|
+
{ ...input, sessionFile: input.sessionFile },
|
|
284
|
+
initialLedger,
|
|
285
|
+
selfReview,
|
|
286
|
+
).run();
|
|
196
287
|
}
|
|
197
288
|
|
|
198
289
|
const INITIAL_OUTPUT_LIMIT = 8_000;
|
|
199
290
|
|
|
200
291
|
function truncateForPrompt(value: string): string {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
292
|
+
const trimmed = stripAcceptanceReport(value).trim();
|
|
293
|
+
if (trimmed.length <= INITIAL_OUTPUT_LIMIT) {
|
|
294
|
+
return trimmed.length > 0
|
|
295
|
+
? trimmed
|
|
296
|
+
: "(initial output was empty after removing acceptance-report)";
|
|
297
|
+
}
|
|
298
|
+
return `${trimmed.slice(0, INITIAL_OUTPUT_LIMIT)}\n...[truncated]`;
|
|
204
299
|
}
|
|
205
300
|
|
|
206
301
|
function formatReportForPrompt(ledger: AcceptanceLedger): string {
|
|
207
|
-
|
|
208
|
-
|
|
302
|
+
if (ledger.childReport) {
|
|
303
|
+
return JSON.stringify(ledger.childReport, null, 2);
|
|
304
|
+
}
|
|
305
|
+
return `Missing or malformed acceptance report: ${ledger.childReportParseError ?? "no parse detail"}`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function initialReviewEvidence(
|
|
309
|
+
output: string,
|
|
310
|
+
ledger: AcceptanceLedger,
|
|
311
|
+
previousFailure: string | undefined,
|
|
312
|
+
): string[] {
|
|
313
|
+
const lines = [
|
|
314
|
+
"",
|
|
315
|
+
"Initial visible output:",
|
|
316
|
+
truncateForPrompt(output),
|
|
317
|
+
"",
|
|
318
|
+
"Initial acceptance report:",
|
|
319
|
+
formatReportForPrompt(ledger),
|
|
320
|
+
];
|
|
321
|
+
if (previousFailure !== undefined && previousFailure.length > 0) {
|
|
322
|
+
lines.push("", "Previous finalization failure to address:", previousFailure);
|
|
323
|
+
}
|
|
324
|
+
return lines;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function finalizationInstructions(nativeReport: boolean, schema?: JsonSchemaObject): string[] {
|
|
328
|
+
if (schema) {
|
|
329
|
+
const action = nativeReport
|
|
330
|
+
? "Your final action must be a sole `structured_output` tool call with {value:{answer,report}}."
|
|
331
|
+
: "Return the schema-constrained JSON object {answer,report}.";
|
|
332
|
+
return [
|
|
333
|
+
`${action} answer must be the complete current public payload matching outputSchema below, including all repairs; do not embed it in a prose string. report is the private typed acceptance object. This submission replaces the initial payload. If more activity follows submission, resubmit the complete current answer and report.\noutputSchema: ${JSON.stringify(schema)}`,
|
|
334
|
+
];
|
|
335
|
+
}
|
|
336
|
+
const action = nativeReport
|
|
337
|
+
? "Now do the self-check. Your final action must be a sole `structured_output` tool call with {value:{answer,report}}. answer must contain the complete standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence), repairs or remaining blockers. report is a typed object matching the schema, never JSON embedded in a string. This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. If additional messages prompt more activity after submission, resubmit the complete current answer and report as your final action; a prose-only reply does not finalize the task."
|
|
338
|
+
: "Now do the self-check. Return a standalone final answer with the current result and every requested handoff detail (including paths, identifiers, findings, and evidence). This answer replaces the initial answer; do not replace useful details with only a statement that you rechecked them. Include repairs or remaining blockers, then finish with exactly one fenced JSON block tagged `acceptance-report`.";
|
|
339
|
+
return [action, formatAcceptanceReportExample(nativeReport)];
|
|
209
340
|
}
|
|
210
341
|
|
|
211
342
|
export function formatAcceptanceFinalizationPrompt(input: {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
343
|
+
readonly acceptance: ResolvedAcceptanceConfig;
|
|
344
|
+
readonly initialOutput: string;
|
|
345
|
+
readonly initialLedger: AcceptanceLedger;
|
|
346
|
+
readonly turn: number;
|
|
347
|
+
readonly maxTurns: number;
|
|
348
|
+
readonly previousFailure?: string;
|
|
349
|
+
readonly nativeReport?: boolean;
|
|
350
|
+
readonly outputSchema?: JsonSchemaObject;
|
|
220
351
|
}): string {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
return lines.join("\n");
|
|
352
|
+
const evidence = [
|
|
353
|
+
...new Set([
|
|
354
|
+
...input.acceptance.evidence,
|
|
355
|
+
...input.acceptance.criteria.flatMap((criterion) => criterion.evidence),
|
|
356
|
+
]),
|
|
357
|
+
];
|
|
358
|
+
const lines = [
|
|
359
|
+
"## Acceptance Finalization",
|
|
360
|
+
"You are continuing the same subagent session. Before this run can be accepted, compare the current work to the acceptance contract and the evidence below.",
|
|
361
|
+
`This is finalization turn ${input.turn} of ${input.maxTurns}. The run will be rejected if the contract is still not satisfied after turn ${input.maxTurns}.`,
|
|
362
|
+
"",
|
|
363
|
+
"If a criterion is incomplete and fixable in this session, keep working now before returning the final report.",
|
|
364
|
+
"Only an observed human-only boundary, such as Touch ID or an unavailable MFA code, may use criterion status blocked with concrete evidence and a nonempty humanAction describing the exact action needed. Preserve completed criteria/evidence; blocked acceptance is incomplete and stops further review and verification until explicit Continue. Ordinary errors, missing evidence, or fixable work remain not-satisfied, not blocked; explain the blocker in residualRisks.",
|
|
365
|
+
"Do not claim a criterion is satisfied unless the current work has concrete evidence from files, commands, validation output, or other inspectable artifacts.",
|
|
366
|
+
"Report cumulative evidence for the whole delegated task, not just this finalization turn. Retain still-valid changed files, tests, commands, and other evidence from the initial report; correct or remove evidence only when the final state invalidates it. No new edits during review does not mean changedFiles is empty.",
|
|
367
|
+
"",
|
|
368
|
+
"## Acceptance Contract",
|
|
369
|
+
...formatAcceptanceRequirements(
|
|
370
|
+
input.acceptance.criteria,
|
|
371
|
+
evidence,
|
|
372
|
+
"- No explicit criteria were configured; satisfy the requested task and required evidence/checks.",
|
|
373
|
+
),
|
|
374
|
+
];
|
|
375
|
+
if (evidence.length > 0) {
|
|
376
|
+
lines.push(
|
|
377
|
+
"",
|
|
378
|
+
`Structured evidence must be present in the ${input.nativeReport === true || input.outputSchema ? "typed report object" : "final `acceptance-report` JSON fields"}. Markdown sections in the visible answer do not satisfy required evidence by themselves. If the previous visible output already included the evidence, copy or summarize it into the matching JSON field.`,
|
|
379
|
+
"Evidence field mapping:",
|
|
380
|
+
...formatEvidenceReportFieldMapping(evidence),
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
if (input.acceptance.verify.length > 0) {
|
|
384
|
+
lines.push(
|
|
385
|
+
"",
|
|
386
|
+
"Runtime verification commands that must pass:",
|
|
387
|
+
...input.acceptance.verify.map((command) => `- ${command.id}: ${command.command}`),
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
if (input.acceptance.stopRules.length > 0) {
|
|
391
|
+
lines.push(
|
|
392
|
+
"",
|
|
393
|
+
"Stop rules are hard constraints while deciding whether to continue, stop as blocked, or report success:",
|
|
394
|
+
...input.acceptance.stopRules.map((rule) => `- ${rule}`),
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
lines.push(
|
|
398
|
+
...initialReviewEvidence(input.initialOutput, input.initialLedger, input.previousFailure),
|
|
399
|
+
"",
|
|
400
|
+
...finalizationInstructions(input.nativeReport === true, input.outputSchema),
|
|
401
|
+
);
|
|
402
|
+
return lines.join("\n");
|
|
273
403
|
}
|
|
274
404
|
|
|
275
405
|
export function createFinalizationTurn(input: {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
406
|
+
readonly turn: number;
|
|
407
|
+
readonly prompt: string;
|
|
408
|
+
readonly rawOutput: string;
|
|
409
|
+
readonly ledger: AcceptanceLedger;
|
|
280
410
|
}): AcceptanceFinalizationTurn {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
411
|
+
const failureMessage = acceptanceFailureMessage(input.ledger);
|
|
412
|
+
return {
|
|
413
|
+
turn: input.turn,
|
|
414
|
+
prompt: input.prompt,
|
|
415
|
+
status: input.ledger.status,
|
|
416
|
+
rawOutput: input.rawOutput,
|
|
417
|
+
...(input.ledger.unconfirmedOutput !== undefined
|
|
418
|
+
? { unconfirmedOutput: input.ledger.unconfirmedOutput }
|
|
419
|
+
: {}),
|
|
420
|
+
...(input.ledger.childReport ? { report: input.ledger.childReport } : {}),
|
|
421
|
+
...(input.ledger.childReportParseError !== undefined &&
|
|
422
|
+
input.ledger.childReportParseError.length > 0
|
|
423
|
+
? { parseError: input.ledger.childReportParseError }
|
|
424
|
+
: {}),
|
|
425
|
+
runtimeChecks: input.ledger.runtimeChecks,
|
|
426
|
+
verifyRuns: input.ledger.verifyRuns,
|
|
427
|
+
...(failureMessage !== undefined && failureMessage.length > 0 ? { failureMessage } : {}),
|
|
428
|
+
};
|
|
294
429
|
}
|
|
295
430
|
|
|
296
431
|
export function createFinalizationProcessFailureTurn(input: {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
432
|
+
readonly turn: number;
|
|
433
|
+
readonly prompt: string;
|
|
434
|
+
readonly rawOutput?: string;
|
|
435
|
+
readonly message: string;
|
|
301
436
|
}): AcceptanceFinalizationTurn {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
437
|
+
return {
|
|
438
|
+
turn: input.turn,
|
|
439
|
+
prompt: input.prompt,
|
|
440
|
+
status: "rejected",
|
|
441
|
+
...(input.rawOutput !== undefined && input.rawOutput.length > 0
|
|
442
|
+
? { rawOutput: input.rawOutput }
|
|
443
|
+
: {}),
|
|
444
|
+
runtimeChecks: [{ id: "finalization-process", status: "failed", message: input.message }],
|
|
445
|
+
verifyRuns: [],
|
|
446
|
+
failureMessage: `Acceptance rejected: ${input.message}`,
|
|
447
|
+
};
|
|
311
448
|
}
|
|
312
449
|
|
|
313
450
|
export function attachFinalizationToLedger(input: {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
451
|
+
readonly initialLedger: AcceptanceLedger;
|
|
452
|
+
readonly authoritativeLedger: AcceptanceLedger;
|
|
453
|
+
readonly turns: readonly AcceptanceFinalizationTurn[];
|
|
454
|
+
readonly status: "completed" | "blocked" | "failed";
|
|
455
|
+
readonly maxTurns: number;
|
|
319
456
|
}): AcceptanceLedger {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
457
|
+
return {
|
|
458
|
+
...input.authoritativeLedger,
|
|
459
|
+
...(input.initialLedger.childReport
|
|
460
|
+
? { initialChildReport: input.initialLedger.childReport }
|
|
461
|
+
: {}),
|
|
462
|
+
...(input.initialLedger.childReportParseError !== undefined &&
|
|
463
|
+
input.initialLedger.childReportParseError.length > 0
|
|
464
|
+
? { initialChildReportParseError: input.initialLedger.childReportParseError }
|
|
465
|
+
: {}),
|
|
466
|
+
finalization: {
|
|
467
|
+
mode: "self-review-loop",
|
|
468
|
+
status: input.status,
|
|
469
|
+
maxTurns: input.maxTurns,
|
|
470
|
+
turns: input.turns,
|
|
471
|
+
},
|
|
472
|
+
};
|
|
331
473
|
}
|
|
332
474
|
|
|
333
475
|
export function buildFinalizationProcessFailureLedger(input: {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
476
|
+
readonly initialLedger: AcceptanceLedger;
|
|
477
|
+
readonly turns: readonly AcceptanceFinalizationTurn[];
|
|
478
|
+
readonly maxTurns: number;
|
|
479
|
+
readonly message: string;
|
|
338
480
|
}): AcceptanceLedger {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
481
|
+
return attachFinalizationToLedger({
|
|
482
|
+
initialLedger: input.initialLedger,
|
|
483
|
+
authoritativeLedger: {
|
|
484
|
+
...input.initialLedger,
|
|
485
|
+
status: "rejected",
|
|
486
|
+
runtimeChecks: [
|
|
487
|
+
...input.initialLedger.runtimeChecks,
|
|
488
|
+
{ id: "finalization-process", status: "failed", message: input.message },
|
|
489
|
+
],
|
|
490
|
+
},
|
|
491
|
+
turns: input.turns,
|
|
492
|
+
status: "failed",
|
|
493
|
+
maxTurns: input.maxTurns,
|
|
494
|
+
});
|
|
353
495
|
}
|