@fitchmultz/pi-subagents 0.44.7 → 0.46.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 +264 -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 +89 -0
- package/dist/pi-intercom/bridge-http.js +86 -0
- package/dist/pi-intercom/bridge-launch-policy.js +88 -0
- package/dist/pi-intercom/bridge-launch.js +217 -0
- package/dist/pi-intercom/bridge-protocol.js +106 -0
- package/dist/pi-intercom/bridge-routes.js +72 -0
- package/dist/pi-intercom/bridge-rpc-process.js +264 -0
- package/dist/pi-intercom/bridge-session.js +420 -0
- package/dist/pi-intercom/bridge.js +221 -606
- 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-loader.js +17 -0
- package/dist/shared/native-session.js +2 -13
- 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 +77 -22
- 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 +158 -29
- package/scripts/intercom-remote.mjs +213 -52
- 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 +120 -0
- package/src/pi-intercom/bridge-http.ts +97 -0
- package/src/pi-intercom/bridge-launch-policy.ts +109 -0
- package/src/pi-intercom/bridge-launch.ts +317 -0
- package/src/pi-intercom/bridge-protocol.ts +123 -0
- package/src/pi-intercom/bridge-routes.ts +105 -0
- package/src/pi-intercom/bridge-rpc-process.ts +293 -0
- package/src/pi-intercom/bridge-session.ts +510 -0
- package/src/pi-intercom/bridge.ts +305 -549
- 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-loader.ts +13 -0
- package/src/shared/native-session.ts +3 -5
- 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
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { resolveConnectedTarget } from "./connection.js";
|
|
2
|
+
import { formatChildOrchestratorMessage } from "./identity.js";
|
|
3
|
+
import { formatSupervisorInterviewRequest, parseStructuredSupervisorReply, validateSupervisorInterviewRequest, } from "./interview.js";
|
|
4
|
+
import { errorMessage } from "./validation.js";
|
|
5
|
+
import { formatAttachments } from "./message-format.js";
|
|
6
|
+
import { toolError, toolText } from "./tool-arguments.js";
|
|
7
|
+
import { createSupervisorQuestion, readQuestionState, recordQuestionDelivery, } from "../runs/shared/supervisor-questions.js";
|
|
8
|
+
import { formatRunAction } from "../shared/status-format.js";
|
|
9
|
+
function validateContact(params) {
|
|
10
|
+
const { reason, message } = params;
|
|
11
|
+
if (!["need_decision", "progress_update", "interview_request"].includes(reason)) {
|
|
12
|
+
return toolError("Invalid reason. Use 'need_decision', 'interview_request', or 'progress_update'.");
|
|
13
|
+
}
|
|
14
|
+
if ((reason === "need_decision" || reason === "progress_update") && typeof message !== "string") {
|
|
15
|
+
return toolError(`Missing 'message' parameter for reason '${reason}'.`);
|
|
16
|
+
}
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
function replyDetails(questionId, text, interview) {
|
|
20
|
+
const structured = interview ? parseStructuredSupervisorReply(text, interview) : undefined;
|
|
21
|
+
if (structured?.value) {
|
|
22
|
+
return { questionId, structuredReply: structured.value };
|
|
23
|
+
}
|
|
24
|
+
if (structured?.error !== undefined && structured.error !== "") {
|
|
25
|
+
return { questionId, structuredReplyParseError: structured.error };
|
|
26
|
+
}
|
|
27
|
+
return { questionId };
|
|
28
|
+
}
|
|
29
|
+
/** Owns durable supervisor questions and every wake-notification attempt. */
|
|
30
|
+
export class IntercomSupervisor {
|
|
31
|
+
owners;
|
|
32
|
+
metadata;
|
|
33
|
+
notifications = new Set();
|
|
34
|
+
constructor(owners, metadata) {
|
|
35
|
+
this.owners = owners;
|
|
36
|
+
this.metadata = metadata;
|
|
37
|
+
}
|
|
38
|
+
async drain() {
|
|
39
|
+
await Promise.allSettled(this.notifications);
|
|
40
|
+
}
|
|
41
|
+
createQuestion(request) {
|
|
42
|
+
const { reason, interview, ctx } = request;
|
|
43
|
+
const body = interview
|
|
44
|
+
? formatSupervisorInterviewRequest(interview, request.message)
|
|
45
|
+
: (request.message ?? "");
|
|
46
|
+
const metadata = this.metadata;
|
|
47
|
+
const question = createSupervisorQuestion({
|
|
48
|
+
runId: metadata.runId,
|
|
49
|
+
ownerTarget: metadata.orchestratorTarget,
|
|
50
|
+
agent: metadata.agent,
|
|
51
|
+
index: Number(metadata.index),
|
|
52
|
+
childSessionId: ctx.sessionManager.getSessionId(),
|
|
53
|
+
childTarget: metadata.sessionName ??
|
|
54
|
+
this.owners.lifecycle.identity(ctx.sessionManager.getSessionId()).name,
|
|
55
|
+
sessionFile: ctx.sessionManager.getSessionFile() ?? "",
|
|
56
|
+
cwd: ctx.cwd,
|
|
57
|
+
pid: process.pid,
|
|
58
|
+
reason,
|
|
59
|
+
message: body,
|
|
60
|
+
...(interview ? { interview } : {}),
|
|
61
|
+
});
|
|
62
|
+
const text = formatChildOrchestratorMessage(interview ? "interview" : "ask", metadata, [
|
|
63
|
+
`Question ID: ${question.questionId}`,
|
|
64
|
+
`Answer after reconnect/reload: ${formatRunAction("answer", question.runId, { questionId: question.questionId, message: "..." }, Number(process.env.PI_SUBAGENT_DEPTH) > 1)}`,
|
|
65
|
+
body,
|
|
66
|
+
].join("\n"));
|
|
67
|
+
return { question, text };
|
|
68
|
+
}
|
|
69
|
+
ownNotification(operation) {
|
|
70
|
+
const task = Promise.resolve().then(operation);
|
|
71
|
+
this.notifications.add(task);
|
|
72
|
+
task
|
|
73
|
+
.then(() => {
|
|
74
|
+
this.notifications.delete(task);
|
|
75
|
+
}, (error) => {
|
|
76
|
+
this.notifications.delete(task);
|
|
77
|
+
console.error("Intercom supervisor notification failed:", error);
|
|
78
|
+
})
|
|
79
|
+
.catch((error) => {
|
|
80
|
+
console.error("Intercom supervisor notification cleanup failed:", error);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
scheduleNotification(notification) {
|
|
84
|
+
let retryAfter = 0;
|
|
85
|
+
let failureLogged = false;
|
|
86
|
+
const { question, text, reason } = notification;
|
|
87
|
+
const active = () => this.owners.wait.isWaitingFor(question.questionId);
|
|
88
|
+
const logFailure = (error) => {
|
|
89
|
+
if (active() && !failureLogged) {
|
|
90
|
+
this.owners.pi.appendEntry("intercom_question_notification_error", {
|
|
91
|
+
questionId: question.questionId,
|
|
92
|
+
error: errorMessage(error),
|
|
93
|
+
});
|
|
94
|
+
failureLogged = true;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const recordNotification = (to, sent) => {
|
|
98
|
+
if (sent.accepted || !failureLogged) {
|
|
99
|
+
this.owners.pi.appendEntry("intercom_sent", {
|
|
100
|
+
to,
|
|
101
|
+
messageId: question.questionId,
|
|
102
|
+
message: { text, reason },
|
|
103
|
+
accepted: sent.accepted,
|
|
104
|
+
timestamp: Date.now(),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
failureLogged ||= !sent.accepted;
|
|
108
|
+
};
|
|
109
|
+
const notify = async () => {
|
|
110
|
+
if (!active() || Date.now() < retryAfter) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.owners.wait.clearRetry(question.questionId);
|
|
114
|
+
let retry = true;
|
|
115
|
+
try {
|
|
116
|
+
const client = await this.owners.connection.ensure("tool");
|
|
117
|
+
if (!active()) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const to = (await resolveConnectedTarget(client, this.metadata.orchestratorTarget)) ??
|
|
121
|
+
this.metadata.orchestratorTarget;
|
|
122
|
+
if (!active()) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.owners.wait.retarget(question.questionId, to);
|
|
126
|
+
// A thrown send may have lost only its acknowledgement; replay only explicit rejection.
|
|
127
|
+
retry = false;
|
|
128
|
+
const sent = await client.send(to, {
|
|
129
|
+
text,
|
|
130
|
+
messageId: question.questionId,
|
|
131
|
+
expectsReply: true,
|
|
132
|
+
delivery: "steer",
|
|
133
|
+
});
|
|
134
|
+
if (!active()) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
retry = !sent.accepted;
|
|
138
|
+
recordNotification(to, sent);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logFailure(error);
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
if (retry && active()) {
|
|
145
|
+
retryAfter = Date.now() + 1000;
|
|
146
|
+
this.owners.wait.retry(question.questionId, () => {
|
|
147
|
+
this.ownNotification(notify);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
this.ownNotification(notify);
|
|
153
|
+
}
|
|
154
|
+
async decision(request) {
|
|
155
|
+
if (this.owners.wait.waiting) {
|
|
156
|
+
throw new Error("Already waiting for a reply");
|
|
157
|
+
}
|
|
158
|
+
if (request.signal?.aborted === true) {
|
|
159
|
+
throw new Error("Cancelled");
|
|
160
|
+
}
|
|
161
|
+
const { question, text } = this.createQuestion(request);
|
|
162
|
+
const reply = this.owners.wait.wait({
|
|
163
|
+
from: this.metadata.orchestratorTarget,
|
|
164
|
+
replyTo: question.questionId,
|
|
165
|
+
signal: request.signal,
|
|
166
|
+
question,
|
|
167
|
+
});
|
|
168
|
+
this.scheduleNotification({ question, text, reason: request.reason });
|
|
169
|
+
const message = await reply;
|
|
170
|
+
return this.answer(question, message, request.interview);
|
|
171
|
+
}
|
|
172
|
+
answer(question, message, interview) {
|
|
173
|
+
this.owners.pi.appendEntry("intercom_received", {
|
|
174
|
+
from: this.metadata.orchestratorTarget,
|
|
175
|
+
questionId: question.questionId,
|
|
176
|
+
message: message.content,
|
|
177
|
+
messageId: message.id,
|
|
178
|
+
timestamp: message.timestamp,
|
|
179
|
+
});
|
|
180
|
+
recordQuestionDelivery(question, {
|
|
181
|
+
kind: "live",
|
|
182
|
+
runId: question.runId,
|
|
183
|
+
deliveredAt: Date.now(),
|
|
184
|
+
});
|
|
185
|
+
const details = replyDetails(question.questionId, message.content.text, interview);
|
|
186
|
+
const origin = readQuestionState(question).answer?.origin;
|
|
187
|
+
return toolText(`**${origin === "human" ? "Direct user answer (human origin)" : "Reply from supervisor"}:**\n${message.content.text}${formatAttachments(message.content.attachments ?? [])}`, details);
|
|
188
|
+
}
|
|
189
|
+
async progress(message, signal, ctx) {
|
|
190
|
+
let client;
|
|
191
|
+
try {
|
|
192
|
+
client = await this.owners.connection.ensure("tool");
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return toolError(`Intercom not connected: ${errorMessage(error)}`);
|
|
196
|
+
}
|
|
197
|
+
this.owners.connection.syncIdentity(ctx.sessionManager.getSessionId());
|
|
198
|
+
if (signal?.aborted === true) {
|
|
199
|
+
return toolError("Cancelled");
|
|
200
|
+
}
|
|
201
|
+
let to;
|
|
202
|
+
try {
|
|
203
|
+
to =
|
|
204
|
+
(await resolveConnectedTarget(client, this.metadata.orchestratorTarget)) ??
|
|
205
|
+
this.metadata.orchestratorTarget;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return toolError(`Failed to resolve supervisor target: ${errorMessage(error)}`);
|
|
209
|
+
}
|
|
210
|
+
if (this.cancelled(signal)) {
|
|
211
|
+
return toolError("Cancelled");
|
|
212
|
+
}
|
|
213
|
+
if (to === client.sessionId) {
|
|
214
|
+
return toolError("Cannot message the current session");
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const result = await client.send(to, {
|
|
218
|
+
text: formatChildOrchestratorMessage("update", this.metadata, message),
|
|
219
|
+
delivery: "steer",
|
|
220
|
+
});
|
|
221
|
+
return this.progressReceipt(message, result);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return toolError(`Failed to send progress update: ${errorMessage(error)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
progressReceipt(message, result) {
|
|
228
|
+
if (!result.accepted) {
|
|
229
|
+
return toolError(`Message to "${this.metadata.orchestratorTarget}" was not delivered: ${result.reason ?? "Session may not exist or has disconnected."}`, {
|
|
230
|
+
messageId: result.id,
|
|
231
|
+
accepted: result.accepted,
|
|
232
|
+
delivered: false,
|
|
233
|
+
reason: result.reason,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
this.owners.lifecycle.markActivity();
|
|
237
|
+
this.owners.connection.syncStatus();
|
|
238
|
+
this.owners.pi.appendEntry("intercom_sent", {
|
|
239
|
+
to: this.metadata.orchestratorTarget,
|
|
240
|
+
message: { text: message, reason: "progress_update" },
|
|
241
|
+
messageId: result.id,
|
|
242
|
+
timestamp: Date.now(),
|
|
243
|
+
subagent: {
|
|
244
|
+
runId: this.metadata.runId,
|
|
245
|
+
agent: this.metadata.agent,
|
|
246
|
+
index: this.metadata.index,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
return toolText(`Progress update accepted for supervisor ${this.metadata.orchestratorTarget}. Queued for the next tool boundary; broker acceptance does not confirm the supervisor has read or acted on it.`, {
|
|
250
|
+
messageId: result.id,
|
|
251
|
+
accepted: result.accepted,
|
|
252
|
+
delivered: result.delivered,
|
|
253
|
+
queued: result.queued === true,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
cancelled(signal) {
|
|
257
|
+
return signal?.aborted === true;
|
|
258
|
+
}
|
|
259
|
+
async execute(params, signal, ctx) {
|
|
260
|
+
const { reason, message } = params;
|
|
261
|
+
const invalid = validateContact(params);
|
|
262
|
+
if (invalid) {
|
|
263
|
+
return invalid;
|
|
264
|
+
}
|
|
265
|
+
if (reason === "progress_update") {
|
|
266
|
+
return await this.progress(message ?? "", signal, ctx);
|
|
267
|
+
}
|
|
268
|
+
const validation = reason === "interview_request"
|
|
269
|
+
? validateSupervisorInterviewRequest(params.interview)
|
|
270
|
+
: undefined;
|
|
271
|
+
if (validation?.ok === false) {
|
|
272
|
+
return toolError(`Invalid interview request: ${validation.error}`);
|
|
273
|
+
}
|
|
274
|
+
return await this.decision({
|
|
275
|
+
reason,
|
|
276
|
+
message,
|
|
277
|
+
interview: validation?.ok === true ? validation.interview : undefined,
|
|
278
|
+
signal,
|
|
279
|
+
ctx,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { failureDetails } from "./tool-results.js";
|
|
2
|
+
export function toolError(text, details = { error: true }) {
|
|
3
|
+
return { content: [{ type: "text", text }], isError: true, details };
|
|
4
|
+
}
|
|
5
|
+
export function toolText(text, details = {}) {
|
|
6
|
+
return { content: [{ type: "text", text }], isError: false, details };
|
|
7
|
+
}
|
|
8
|
+
function deliveryError(params) {
|
|
9
|
+
const { action, delivery, passive } = params;
|
|
10
|
+
if (passive !== undefined && action !== "send") {
|
|
11
|
+
return toolError("'passive' is only valid for action='send'");
|
|
12
|
+
}
|
|
13
|
+
if (delivery === "passive" && action !== "send") {
|
|
14
|
+
return toolError("delivery='passive' is only valid for action='send'. Passive delivery is for human-visible breadcrumbs and is discouraged for agent-to-agent coordination; normal send defaults to steer. Use ask with delivery='steer' only when the sender must stay alive and cannot safely continue without the reply.");
|
|
15
|
+
}
|
|
16
|
+
const actionError = deliveryActionError(params);
|
|
17
|
+
if (actionError) {
|
|
18
|
+
return actionError;
|
|
19
|
+
}
|
|
20
|
+
if (passive === true && delivery !== undefined && delivery !== "passive") {
|
|
21
|
+
return toolError("'passive' cannot be combined with a non-passive delivery mode");
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
function deliveryActionError(params) {
|
|
26
|
+
const { action, delivery, queueMode, threadId } = params;
|
|
27
|
+
if ((delivery !== undefined || queueMode !== undefined || threadId !== undefined) &&
|
|
28
|
+
action !== "send" &&
|
|
29
|
+
action !== "ask") {
|
|
30
|
+
const queue = queueMode !== undefined || delivery === "queue" || threadId !== undefined;
|
|
31
|
+
return toolError("'delivery', 'queueMode', and 'threadId' are only valid for action='send' or action='ask'", failureDetails(queue ? "invalid_queue_arguments" : "invalid_delivery_arguments", [{ action: "send", guidance: "Use delivery options only with send or ask." }], { error: true }));
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
function queueError(params) {
|
|
36
|
+
const { threadId, queueMode } = params;
|
|
37
|
+
if (threadId !== undefined && queueMode !== "replace") {
|
|
38
|
+
return toolError("'threadId' is only valid with queueMode='replace'", failureDetails("invalid_queue_arguments", [
|
|
39
|
+
{
|
|
40
|
+
action: "send",
|
|
41
|
+
guidance: "Use threadId only with delivery='queue' and queueMode='replace'.",
|
|
42
|
+
},
|
|
43
|
+
], { error: true }));
|
|
44
|
+
}
|
|
45
|
+
if (queueMode === "replace" && (threadId === undefined || threadId.trim() === "")) {
|
|
46
|
+
return toolError("queueMode='replace' requires a non-empty threadId", failureDetails("invalid_queue_arguments", [
|
|
47
|
+
{
|
|
48
|
+
action: "send",
|
|
49
|
+
guidance: "Provide a non-empty threadId with delivery='queue' and queueMode='replace'.",
|
|
50
|
+
},
|
|
51
|
+
], { error: true }));
|
|
52
|
+
}
|
|
53
|
+
const delivery = params.passive === true ? "passive" : params.delivery;
|
|
54
|
+
if (queueMode !== undefined && delivery !== "queue") {
|
|
55
|
+
return toolError("'queueMode' is only valid with delivery='queue'. Use queue only for intentionally deferred work; otherwise omit queueMode and use default-steered send for live agent coordination. Avoid passive for agent-to-agent coordination.", failureDetails("invalid_queue_arguments", [{ action: "send", guidance: "Set delivery='queue', or omit queueMode and threadId." }], { error: true }));
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
export function validateIntercomArguments(params) {
|
|
60
|
+
if (params.scope !== undefined && params.action !== "list" && params.action !== "status") {
|
|
61
|
+
return toolError("'scope' is only valid for action='list' or action='status'");
|
|
62
|
+
}
|
|
63
|
+
return deliveryError(params) ?? queueError(params);
|
|
64
|
+
}
|
|
65
|
+
export function sendOptions(params) {
|
|
66
|
+
return {
|
|
67
|
+
text: params.message ?? "",
|
|
68
|
+
attachments: params.attachments,
|
|
69
|
+
replyTo: params.replyTo,
|
|
70
|
+
delivery: params.passive === true ? "passive" : params.delivery,
|
|
71
|
+
queueMode: params.queueMode,
|
|
72
|
+
threadId: params.threadId?.trim(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Type } from "../shared/native-typebox.js";
|
|
2
|
+
import { activateTools } from "../shared/lazy-tools.js";
|
|
3
|
+
import { throwIfToolError } from "./tool-results.js";
|
|
4
|
+
import { intercomSchema, contactSupervisorSchema } from "./tool-schemas.js";
|
|
5
|
+
import { renderContactCall, renderContactResult, renderIntercomCall, renderIntercomResult, } from "./ui/tool-renderers.js";
|
|
6
|
+
function nativeResult(result) {
|
|
7
|
+
const success = throwIfToolError(result);
|
|
8
|
+
return { content: [...success.content], details: success.details, isError: false };
|
|
9
|
+
}
|
|
10
|
+
function registerContact(pi, supervisor) {
|
|
11
|
+
pi.registerTool({
|
|
12
|
+
name: "contact_supervisor",
|
|
13
|
+
label: "Contact Supervisor",
|
|
14
|
+
description: "Subagent-only tool for contacting the supervisor agent that delegated this task. Use need_decision only when this child cannot safely continue without a decision, approval, or product/API/scope clarification; this steers the supervisor at its next tool boundary and keeps the child alive for the reply. Use interview_request only when multiple structured answers are all required before safe progress; this also steers and waits. Use progress_update only for a discovery or change the supervisor needs while working; it steers at the next tool boundary without waiting for a reply. Skip starts, redundant status, and routine completion; retain material findings in the final result.",
|
|
15
|
+
promptSnippet: "Subagent-only: steer the supervisor for required decisions, structured interviews, or material discoveries needed during active work. Skip routine status and completion messages.",
|
|
16
|
+
promptGuidelines: [
|
|
17
|
+
"Use contact_supervisor with reason='need_decision' when a subagent cannot safely continue without a decision, approval, or product/API/scope clarification; it steers the supervisor and waits for the reply.",
|
|
18
|
+
"Use contact_supervisor with reason='interview_request' only when the child cannot safely continue until it receives multiple structured answers in one blocking steered exchange.",
|
|
19
|
+
"Use contact_supervisor with reason='progress_update' only for a discovery or change the supervisor needs while working. It steers at the next tool boundary without waiting. Skip starts, redundant narration, and routine completion; keep material findings in the final result.",
|
|
20
|
+
"Do not use contact_supervisor for routine completion handoffs; return the final subagent result normally.",
|
|
21
|
+
],
|
|
22
|
+
parameters: contactSupervisorSchema,
|
|
23
|
+
async execute(_id, params, signal, _update, ctx) {
|
|
24
|
+
return nativeResult(await supervisor.execute(params, signal, ctx));
|
|
25
|
+
},
|
|
26
|
+
renderCall: renderContactCall,
|
|
27
|
+
renderResult: renderContactResult,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function registerLoader(pi) {
|
|
31
|
+
pi.registerTool({
|
|
32
|
+
name: "load_intercom",
|
|
33
|
+
label: "Load Intercom",
|
|
34
|
+
description: "Enable local peer coordination: list/check sessions before shared-state work, send or reply to messages, and inspect/publish topics. Does not send a message or check peers itself.",
|
|
35
|
+
parameters: Type.Object({}),
|
|
36
|
+
async execute() {
|
|
37
|
+
if (!pi.getAllTools().some((tool) => tool.name === "intercom" && tool.namespace === undefined)) {
|
|
38
|
+
throw new Error("Intercom is excluded from this session.");
|
|
39
|
+
}
|
|
40
|
+
activateTools(pi, ["intercom"]);
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: "text",
|
|
45
|
+
text: "Intercom enabled. Use intercom({action:'list'}) to check peers, or status, pending, reply, send, ask and topics for coordination.",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
details: {},
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function registerMessaging(pi, tools) {
|
|
54
|
+
pi.registerTool({
|
|
55
|
+
name: "intercom",
|
|
56
|
+
defaultActive: false,
|
|
57
|
+
label: "Intercom",
|
|
58
|
+
description: `Send a message to another pi session running on this machine.
|
|
59
|
+
Use this to communicate findings, request help, or coordinate work with other sessions.
|
|
60
|
+
Non-blocking send defaults to steer for guidance, answers, corrections, or blockers that may affect active work. Use queue only when delay is intentional; use ask only when this process must remain alive waiting for the reply.
|
|
61
|
+
|
|
62
|
+
Usage:
|
|
63
|
+
intercom({ action: "list" }) → List sessions in this repository and its worktrees
|
|
64
|
+
intercom({ action: "list", scope: "all" }) → List connected sessions across every project
|
|
65
|
+
intercom({ action: "send", to: "session-name", message: "..." }) → Send live coordination (defaults to steer)
|
|
66
|
+
intercom({ action: "ask", to: "session-name", delivery: "steer", message: "..." }) → Blocking wait only when sender must stay alive
|
|
67
|
+
intercom({ action: "reply", message: "..." }) → Reply to the active/single pending ask
|
|
68
|
+
intercom({ action: "pending" }) → List unresolved inbound asks
|
|
69
|
+
intercom({ action: "status" }) → Show connection status
|
|
70
|
+
intercom({ action: "subscribe", topic: "project/work", awaitRelease: true }) → Opt into a topic
|
|
71
|
+
intercom({ action: "publish", topic: "project/work", message: "Current self-contained state" }) → Quiet latest state
|
|
72
|
+
intercom({ action: "topics" }) → Inspect topics and current resource owners`,
|
|
73
|
+
promptSnippet: "Coordinate with local Pi sessions. Non-blocking send defaults to steer for live agent guidance; queue only for intentional delay and ask only for a required blocking reply.",
|
|
74
|
+
promptGuidelines: [
|
|
75
|
+
"Intercom list/status defaults to the current Git repository and its worktrees. Use scope='all' only when intentionally discovering sessions in other projects.",
|
|
76
|
+
"Action='send' defaults to delivery='steer' for agent-to-agent guidance, answers, corrections, blockers, or other context that may affect active work.",
|
|
77
|
+
"Use delivery='queue' only when delay is intentional. For routine status, explicitly subscribe/publish topics: updates replace quiet inspectable state outside model context, not passive conversation messages. Topic blockers/decisions and awaited ownership releases interrupt; direct messages always bypass subscriptions.",
|
|
78
|
+
"Treat inbound steered messages as supplemental coordination within the active task: incorporate relevant context and continue; replace the task only when the message explicitly says so.",
|
|
79
|
+
"Use action='reply' for an active inbound ask. Otherwise respond with send plus steer; use blocking ask only when this process must stay alive and cannot safely continue without the answer.",
|
|
80
|
+
],
|
|
81
|
+
parameters: intercomSchema,
|
|
82
|
+
async execute(_id, params, signal, _update, ctx) {
|
|
83
|
+
return nativeResult(await tools.execute(params, signal, ctx));
|
|
84
|
+
},
|
|
85
|
+
renderCall: renderIntercomCall,
|
|
86
|
+
renderResult: renderIntercomResult,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export function registerIntercomTools(pi, tools, supervisor) {
|
|
90
|
+
if (supervisor) {
|
|
91
|
+
registerContact(pi, supervisor);
|
|
92
|
+
}
|
|
93
|
+
registerLoader(pi);
|
|
94
|
+
registerMessaging(pi, tools);
|
|
95
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function failureDetails(reasonCode, nextActions, details = {}) {
|
|
2
|
+
return { ...details, reasonCode, nextActions };
|
|
3
|
+
}
|
|
4
|
+
export function replyFailureReason(message) {
|
|
5
|
+
if (message.startsWith("No active intercom context") || message.startsWith("No pending ask")) {
|
|
6
|
+
return "no_pending_reply";
|
|
7
|
+
}
|
|
8
|
+
if (message.startsWith("Multiple pending asks") || message.includes("too short")) {
|
|
9
|
+
return "ambiguous_reply_target";
|
|
10
|
+
}
|
|
11
|
+
return "reply_failed";
|
|
12
|
+
}
|
|
13
|
+
export function firstTextContent(result) {
|
|
14
|
+
return (result.content
|
|
15
|
+
?.find((item) => item.type === "text" && typeof item.text === "string")
|
|
16
|
+
?.text?.replace(/\*\*/g, "") ?? "");
|
|
17
|
+
}
|
|
18
|
+
export class ToolExecutionFailure extends Error {
|
|
19
|
+
details;
|
|
20
|
+
constructor(message, details) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.details = details;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class AskDeliveryError extends Error {
|
|
26
|
+
result;
|
|
27
|
+
constructor(result) {
|
|
28
|
+
super(result.reason ?? "Session may not exist or has disconnected.");
|
|
29
|
+
this.result = result;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function throwIfToolError(result) {
|
|
33
|
+
if (result.isError !== true) {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
const text = firstTextContent(result);
|
|
37
|
+
throw new ToolExecutionFailure(text === "" ? "Tool failed" : text, result.details);
|
|
38
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { StringEnum } from "@earendil-works/pi-ai";
|
|
2
|
+
import { Type } from "../shared/native-typebox.js";
|
|
3
|
+
export const contactSupervisorSchema = Type.Object({
|
|
4
|
+
reason: StringEnum(["need_decision", "progress_update", "interview_request"], {
|
|
5
|
+
description: "Contact reason: 'need_decision' and 'interview_request' steer the supervisor and wait for a reply; 'progress_update' steers a material discovery without waiting for a reply",
|
|
6
|
+
}),
|
|
7
|
+
message: Type.Optional(Type.String({
|
|
8
|
+
description: "Decision request, optional interview note, or meaningful progress update for the supervisor",
|
|
9
|
+
})),
|
|
10
|
+
interview: Type.Optional(Type.Object({
|
|
11
|
+
title: Type.Optional(Type.String()),
|
|
12
|
+
description: Type.Optional(Type.String()),
|
|
13
|
+
questions: Type.Array(Type.Object({
|
|
14
|
+
id: Type.String(),
|
|
15
|
+
type: StringEnum(["single", "multi", "text", "image", "info"], {
|
|
16
|
+
description: "Question type: single, multi, text, image, or info",
|
|
17
|
+
}),
|
|
18
|
+
question: Type.String(),
|
|
19
|
+
options: Type.Optional(Type.Array(Type.Unknown())),
|
|
20
|
+
context: Type.Optional(Type.String()),
|
|
21
|
+
})),
|
|
22
|
+
}, { description: "Structured interview request for reason='interview_request'" })),
|
|
23
|
+
});
|
|
24
|
+
export const intercomSchema = Type.Object({
|
|
25
|
+
action: StringEnum([
|
|
26
|
+
"list",
|
|
27
|
+
"send",
|
|
28
|
+
"ask",
|
|
29
|
+
"reply",
|
|
30
|
+
"pending",
|
|
31
|
+
"status",
|
|
32
|
+
"subscribe",
|
|
33
|
+
"unsubscribe",
|
|
34
|
+
"publish",
|
|
35
|
+
"topics",
|
|
36
|
+
], {
|
|
37
|
+
description: "Direct messages: list/send/ask/reply/pending/status. Quiet state: subscribe/unsubscribe/publish/topics.",
|
|
38
|
+
}),
|
|
39
|
+
scope: Type.Optional(StringEnum(["project", "all"], {
|
|
40
|
+
description: "For list/status: 'project' (default) shows this Git repository and its worktrees; 'all' includes sessions in other projects.",
|
|
41
|
+
})),
|
|
42
|
+
to: Type.Optional(Type.String({
|
|
43
|
+
description: "Target session name or ID (for 'send', 'ask', or disambiguating 'reply')",
|
|
44
|
+
})),
|
|
45
|
+
topic: Type.Optional(Type.String({
|
|
46
|
+
description: "Exact opt-in topic for subscribe/unsubscribe/publish/topics; no automatic subscriptions.",
|
|
47
|
+
})),
|
|
48
|
+
event: Type.Optional(StringEnum(["update", "blocker", "decision", "release"], {
|
|
49
|
+
description: "Publish: update is quiet current state. Blockers/decisions interrupt subscribers; release interrupts only those awaiting release.",
|
|
50
|
+
})),
|
|
51
|
+
resource: Type.Optional(Type.String({
|
|
52
|
+
description: "Publish: resource this session is using (advisory ownership, not a lock).",
|
|
53
|
+
})),
|
|
54
|
+
ownership: Type.Optional(StringEnum(["held", "released"], {
|
|
55
|
+
description: "Publish: this session's declared resource state. Disconnect never implies released.",
|
|
56
|
+
})),
|
|
57
|
+
awaitRelease: Type.Optional(Type.Boolean({
|
|
58
|
+
description: "Subscribe: interrupt when this topic explicitly releases ownership.",
|
|
59
|
+
})),
|
|
60
|
+
message: Type.Optional(Type.String({
|
|
61
|
+
description: "Message for send/ask/reply, or self-contained latest state for publish",
|
|
62
|
+
})),
|
|
63
|
+
attachments: Type.Optional(Type.Array(Type.Object({
|
|
64
|
+
type: StringEnum(["file", "snippet", "context"]),
|
|
65
|
+
name: Type.String(),
|
|
66
|
+
content: Type.String(),
|
|
67
|
+
language: Type.Optional(Type.String()),
|
|
68
|
+
}))),
|
|
69
|
+
replyTo: Type.Optional(Type.String({
|
|
70
|
+
description: "Message ID to reply to (for threading or responding to an 'ask')",
|
|
71
|
+
})),
|
|
72
|
+
delivery: Type.Optional(StringEnum(["queue", "steer", "passive"], {
|
|
73
|
+
description: "Delivery mode. Omitted send delivery defaults to 'steer', which injects after the current tool call. Use 'queue' only to intentionally wait behind active work; 'passive' does not wake the recipient model.",
|
|
74
|
+
})),
|
|
75
|
+
queueMode: Type.Optional(StringEnum(["stack", "replace"], {
|
|
76
|
+
description: "For delivery='queue': 'stack' keeps all messages; 'replace' keeps only the latest undelivered message for the same threadId.",
|
|
77
|
+
})),
|
|
78
|
+
threadId: Type.Optional(Type.String({ description: "Stable topic key for queueMode='replace'." })),
|
|
79
|
+
passive: Type.Optional(Type.Boolean({
|
|
80
|
+
description: "For action='send' only: legacy alias for delivery='passive'. Discouraged for agent-to-agent messages.",
|
|
81
|
+
})),
|
|
82
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { validateIntercomArguments, toolError, toolText } from "./tool-arguments.js";
|
|
2
|
+
import { errorMessage } from "./validation.js";
|
|
3
|
+
export class IntercomTools {
|
|
4
|
+
owners;
|
|
5
|
+
constructor(owners) {
|
|
6
|
+
this.owners = owners;
|
|
7
|
+
}
|
|
8
|
+
async dispatch(active, params, signal, ctx) {
|
|
9
|
+
const scope = params.scope ?? "project";
|
|
10
|
+
switch (params.action) {
|
|
11
|
+
case "subscribe":
|
|
12
|
+
case "unsubscribe":
|
|
13
|
+
case "publish":
|
|
14
|
+
case "topics":
|
|
15
|
+
return await this.owners.topicActions.execute(active, params, ctx);
|
|
16
|
+
case "list":
|
|
17
|
+
return await this.owners.inspection.list(active, scope);
|
|
18
|
+
case "status":
|
|
19
|
+
return await this.owners.inspection.status(active, scope, ctx);
|
|
20
|
+
case "pending":
|
|
21
|
+
return this.owners.inspection.pending();
|
|
22
|
+
case "send":
|
|
23
|
+
return await this.owners.outbound.send(active, params, ctx);
|
|
24
|
+
case "ask":
|
|
25
|
+
return await this.owners.outbound.ask(active, params, signal);
|
|
26
|
+
case "reply":
|
|
27
|
+
return await this.owners.outbound.reply(active, params);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async execute(params, signal, ctx) {
|
|
31
|
+
let active;
|
|
32
|
+
try {
|
|
33
|
+
active = await this.owners.connection.ensure("tool");
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (params.action === "topics") {
|
|
37
|
+
this.owners.topics.disconnected();
|
|
38
|
+
return toolText(`Broker unavailable; last saved records follow.\n${this.owners.topics.inspect(params.topic)}`, { connection: "disconnected" });
|
|
39
|
+
}
|
|
40
|
+
return toolError(`Intercom not connected: ${errorMessage(error)}`);
|
|
41
|
+
}
|
|
42
|
+
this.owners.connection.syncIdentity(ctx.sessionManager.getSessionId());
|
|
43
|
+
if (!["subscribe", "unsubscribe", "publish", "topics"].includes(params.action)) {
|
|
44
|
+
const invalid = validateIntercomArguments(params);
|
|
45
|
+
if (invalid) {
|
|
46
|
+
return invalid;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return await this.dispatch(active, params, signal, ctx);
|
|
50
|
+
}
|
|
51
|
+
}
|