@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,9 +1,12 @@
|
|
|
1
1
|
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { Type } from "../shared/native-typebox.ts";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
type createSubagentExecutor,
|
|
5
|
+
normalizeSubagentParamsLike,
|
|
6
|
+
} from "../runs/foreground/subagent-executor.ts";
|
|
7
|
+
import type { SubagentExecutionResult } from "../shared/types.ts";
|
|
8
|
+
import type { ReadonlyInput } from "../shared/types/inputs.ts";
|
|
5
9
|
import { activateTools, restoreLazyTools } from "../shared/lazy-tools.ts";
|
|
6
|
-
import { runHistoryIndex } from "../runs/shared/history-index.ts";
|
|
7
10
|
import type { HistoryRunOptions } from "../history/types.ts";
|
|
8
11
|
import { listSupervisorQuestionsAsync } from "../runs/shared/supervisor-questions.ts";
|
|
9
12
|
import { renderSubagentResult } from "../tui/render.ts";
|
|
@@ -11,104 +14,258 @@ import { AgentRunsParams, DelegateParams } from "./schemas.ts";
|
|
|
11
14
|
import { normalizeEverydayParams } from "./tool-input.ts";
|
|
12
15
|
|
|
13
16
|
type Executor = ReturnType<typeof createSubagentExecutor>;
|
|
14
|
-
type AdaptResult = (
|
|
17
|
+
type AdaptResult = (
|
|
18
|
+
result: ReadonlyInput<SubagentExecutionResult>,
|
|
19
|
+
ctx: ExtensionContext,
|
|
20
|
+
) => SubagentExecutionResult;
|
|
21
|
+
type ControlsIndex = { readonly needsControls: () => Promise<boolean> };
|
|
22
|
+
interface RunControlsState {
|
|
23
|
+
readonly ownedRuns?: { readonly size: number };
|
|
24
|
+
readonly lastUiContext: ExtensionContext | null;
|
|
25
|
+
readonly currentSessionId: string | null;
|
|
26
|
+
readonly historyIndex?: unknown;
|
|
27
|
+
}
|
|
28
|
+
interface ExecutionOptions {
|
|
29
|
+
readonly executor: Readonly<Executor>;
|
|
30
|
+
readonly adapt: AdaptResult;
|
|
31
|
+
readonly listRuns?: (
|
|
32
|
+
params: ReadonlyInput<HistoryRunOptions>,
|
|
33
|
+
ctx: ExtensionContext,
|
|
34
|
+
) => Promise<SubagentExecutionResult>;
|
|
35
|
+
}
|
|
36
|
+
interface CompactOptions extends ExecutionOptions {
|
|
37
|
+
readonly state: RunControlsState;
|
|
38
|
+
readonly getHistoryIndex: () => Promise<ControlsIndex>;
|
|
39
|
+
readonly guidelines: readonly string[];
|
|
40
|
+
readonly childSafe?: boolean;
|
|
41
|
+
readonly keepAdvancedActive?: boolean;
|
|
42
|
+
readonly asyncByDefault: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function hasOwnedRunsFor(state: RunControlsState, owner: string | null): boolean {
|
|
46
|
+
return (
|
|
47
|
+
(state.lastUiContext?.sessionManager.getSessionId() ?? state.currentSessionId) === owner &&
|
|
48
|
+
(state.ownedRuns?.size ?? 0) > 0
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function activateOwnedControls(
|
|
53
|
+
pi: ExtensionAPI,
|
|
54
|
+
state: RunControlsState,
|
|
55
|
+
getHistoryIndex: () => Promise<ControlsIndex>,
|
|
56
|
+
owner: string | null,
|
|
57
|
+
): Promise<void> {
|
|
58
|
+
try {
|
|
59
|
+
const index = await getHistoryIndex();
|
|
60
|
+
const needed = await index.needsControls();
|
|
61
|
+
if (state.historyIndex === index && needed) {
|
|
62
|
+
activateTools(pi, ["agent_runs"]);
|
|
63
|
+
}
|
|
64
|
+
} catch {
|
|
65
|
+
// An unavailable browse index cannot establish that genuine owned work is inert.
|
|
66
|
+
if (hasOwnedRunsFor(state, owner)) {
|
|
67
|
+
activateTools(pi, ["agent_runs"]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function createRunControlsReconciler(
|
|
73
|
+
pi: ExtensionAPI,
|
|
74
|
+
state: RunControlsState,
|
|
75
|
+
getHistoryIndex: () => Promise<ControlsIndex>,
|
|
76
|
+
): () => Promise<void> {
|
|
77
|
+
let checking: { readonly owner: string | null; readonly promise: Promise<void> } | undefined;
|
|
78
|
+
return (): Promise<void> => {
|
|
79
|
+
if (pi.getActiveTools().includes("agent_runs") || (state.ownedRuns?.size ?? 0) === 0) {
|
|
80
|
+
return Promise.resolve();
|
|
81
|
+
}
|
|
82
|
+
const owner = state.lastUiContext?.sessionManager.getSessionId() ?? state.currentSessionId;
|
|
83
|
+
if (checking?.owner === owner) {
|
|
84
|
+
return checking.promise;
|
|
85
|
+
}
|
|
86
|
+
const promise = activateOwnedControls(pi, state, getHistoryIndex, owner);
|
|
87
|
+
checking = { owner, promise };
|
|
88
|
+
promise
|
|
89
|
+
.finally(() => {
|
|
90
|
+
if (checking?.promise === promise) {
|
|
91
|
+
checking = undefined;
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
.catch((error: unknown) => {
|
|
95
|
+
console.error("Could not reconcile owned subagent controls:", error);
|
|
96
|
+
});
|
|
97
|
+
return promise;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function registerDelegate(
|
|
102
|
+
pi: ExtensionAPI,
|
|
103
|
+
options: Pick<
|
|
104
|
+
CompactOptions,
|
|
105
|
+
"executor" | "adapt" | "guidelines" | "childSafe" | "asyncByDefault"
|
|
106
|
+
>,
|
|
107
|
+
checkRuns: () => Promise<void>,
|
|
108
|
+
): void {
|
|
109
|
+
const asyncDescription = options.asyncByDefault
|
|
110
|
+
? "Background by default; false waits for the result."
|
|
111
|
+
: "Foreground by default; true detaches work. Use false when the result must appear in your report.";
|
|
112
|
+
pi.registerTool({
|
|
113
|
+
name: "delegate",
|
|
114
|
+
label: "Delegate",
|
|
115
|
+
description: `Delegate one bounded task to a configured agent. For profiles/history, load_subagent({advanced:false}) enables agent_runs. Delegation enables run controls automatically. ${asyncDescription} Use worktree for an isolated writer, acceptance for explicit requirements, and fresh context for independent review. Fresh handoffs must include relevant exact user instructions and settled decisions or readable source references, not just summaries, alongside the bounded task. Advanced workflows remain behind load_subagent.`,
|
|
116
|
+
...(options.childSafe === true ? { promptGuidelines: [...options.guidelines] } : {}),
|
|
117
|
+
parameters: Type.Object(
|
|
118
|
+
{
|
|
119
|
+
...DelegateParams.properties,
|
|
120
|
+
async: Type.Optional(Type.Boolean({ description: asyncDescription })),
|
|
121
|
+
},
|
|
122
|
+
{ additionalProperties: false },
|
|
123
|
+
),
|
|
124
|
+
async execute(id, params, signal, onUpdate, ctx) {
|
|
125
|
+
const { worktree, context, async: background, ...task } = normalizeEverydayParams(params);
|
|
126
|
+
const request =
|
|
127
|
+
worktree === true
|
|
128
|
+
? { tasks: [task], worktree: true, context, async: background, cwd: task.cwd }
|
|
129
|
+
: { ...task, context, async: background };
|
|
130
|
+
const result = await options.executor.execute({
|
|
131
|
+
toolCallId: id,
|
|
132
|
+
params: normalizeSubagentParamsLike(request),
|
|
133
|
+
signal,
|
|
134
|
+
onUpdate,
|
|
135
|
+
ctx,
|
|
136
|
+
});
|
|
137
|
+
await checkRuns();
|
|
138
|
+
return options.adapt(result, ctx);
|
|
139
|
+
},
|
|
140
|
+
renderResult: renderSubagentResult,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function registerRuns(pi: ExtensionAPI, options: ExecutionOptions, childSafe: boolean): void {
|
|
145
|
+
pi.registerTool({
|
|
146
|
+
name: "agent_runs",
|
|
147
|
+
defaultActive: false,
|
|
148
|
+
label: "Agent Runs",
|
|
149
|
+
description: `List ${childSafe ? "only this child's directly owned" : "your delegated"} runs across working directories (questions/failures, then live work, then unreviewed results; 20 per page). Filter globally by agent/state/text, sort, and page with the returned cursor. history reads 100 bounded native-entry previews; search finds saved visible text using words or quoted phrases, not operators or prefixes. questions pages 20 compact previews (offset/limit); questionId selects one, and questionPath/answerPath retain full records. Browse freshness is not completion or delivery proof. Inspect concise results, paths and continuations; full:true includes the full task/configuration. Answer durable questions, nudge, stop, continue, or save parent-only review. Review notes are not sent to children; put actionable instructions in continue/nudge. Inspect/review/nudge never restart finished work. Continue/answer can launch a saved child; async:false waits for its actual result. Saved continuations keep settings unless agent selects a current profile; model overrides win. Live guidance never mutates model or acceptance. profiles lists roles, sources, context and model/thinking/fallback defaults. History survives reload.`,
|
|
150
|
+
parameters: AgentRunsParams,
|
|
151
|
+
async execute(id, params, signal, onUpdate, ctx) {
|
|
152
|
+
const normalized = normalizeEverydayParams(params, true);
|
|
153
|
+
if (params.action === "list" && params.id === undefined && options.listRuns) {
|
|
154
|
+
return options.adapt(await options.listRuns({ ...normalized, signal }, ctx), ctx);
|
|
155
|
+
}
|
|
156
|
+
const actions = {
|
|
157
|
+
list: "status",
|
|
158
|
+
inspect: "status",
|
|
159
|
+
history: "history",
|
|
160
|
+
search: "search",
|
|
161
|
+
nudge: "nudge",
|
|
162
|
+
stop: "interrupt",
|
|
163
|
+
continue: "resume",
|
|
164
|
+
profiles: "list",
|
|
165
|
+
questions: "questions",
|
|
166
|
+
answer: "answer",
|
|
167
|
+
review: "review",
|
|
168
|
+
};
|
|
169
|
+
return options.adapt(
|
|
170
|
+
await options.executor.execute({
|
|
171
|
+
toolCallId: id,
|
|
172
|
+
params: normalizeSubagentParamsLike({ ...normalized, action: actions[params.action] }),
|
|
173
|
+
signal,
|
|
174
|
+
onUpdate,
|
|
175
|
+
ctx,
|
|
176
|
+
}),
|
|
177
|
+
ctx,
|
|
178
|
+
);
|
|
179
|
+
},
|
|
180
|
+
renderResult: renderSubagentResult,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function requireAvailableTool(pi: ExtensionAPI, name: string, error: string): void {
|
|
185
|
+
if (
|
|
186
|
+
!pi.getAllTools().some((tool) => tool.name === name && !("namespace" in tool && tool.namespace))
|
|
187
|
+
) {
|
|
188
|
+
throw new Error(error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function registerLoader(
|
|
193
|
+
pi: ExtensionAPI,
|
|
194
|
+
options: Pick<CompactOptions, "guidelines" | "childSafe">,
|
|
195
|
+
): void {
|
|
196
|
+
pi.registerTool({
|
|
197
|
+
name: "load_subagent",
|
|
198
|
+
label: "Load Subagent",
|
|
199
|
+
description: `Enable agent_runs for profiles, history and run controls; advanced:false loads only those controls. By default also enable advanced subagent orchestration: parallel groups, chains, saved workflows, detailed overrides, get, extend and doctor.${options.childSafe === true ? " Agent-definition mutations remain blocked." : " Includes agent-definition management."} Ordinary delegation and control use delegate and agent_runs. After loading advanced workflows, call subagent with { action: "list" } before execution.`,
|
|
200
|
+
promptSnippet:
|
|
201
|
+
"Discover profiles/history with advanced:false, or load full subagent orchestration by default.",
|
|
202
|
+
parameters: Type.Object({
|
|
203
|
+
advanced: Type.Optional(
|
|
204
|
+
Type.Boolean({
|
|
205
|
+
description:
|
|
206
|
+
"Also enable advanced orchestration (default true); false loads only agent_runs for profiles, history and controls.",
|
|
207
|
+
}),
|
|
208
|
+
),
|
|
209
|
+
}),
|
|
210
|
+
async execute(_id, params) {
|
|
211
|
+
const advanced = params.advanced !== false;
|
|
212
|
+
requireAvailableTool(
|
|
213
|
+
pi,
|
|
214
|
+
advanced ? "subagent" : "agent_runs",
|
|
215
|
+
advanced
|
|
216
|
+
? "Subagent is unavailable because the full tool is excluded from this session."
|
|
217
|
+
: "Run controls are excluded from this session.",
|
|
218
|
+
);
|
|
219
|
+
const added = !pi.getActiveTools().includes(advanced ? "subagent" : "agent_runs");
|
|
220
|
+
activateTools(pi, advanced ? ["agent_runs", "subagent"] : ["agent_runs"]);
|
|
221
|
+
return {
|
|
222
|
+
content: [
|
|
223
|
+
{
|
|
224
|
+
type: "text",
|
|
225
|
+
text: advanced
|
|
226
|
+
? [
|
|
227
|
+
`Subagent ${added ? "enabled" : "already enabled"}.`,
|
|
228
|
+
...options.guidelines.map((line) => `- ${line}`),
|
|
229
|
+
].join("\n")
|
|
230
|
+
: "Run controls enabled. Use agent_runs({action:'profiles'}) to discover agents; list, history, or search browses owned saved work.",
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
details: {},
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
15
238
|
|
|
16
|
-
export function registerCompactSubagentTools(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const asyncDescription = asyncByDefault ? "Background by default; false waits for the result." : "Foreground by default; true detaches work. Use false when the result must appear in your report.";
|
|
49
|
-
pi.registerTool({
|
|
50
|
-
name: "delegate",
|
|
51
|
-
label: "Delegate",
|
|
52
|
-
description: `Delegate one bounded task to a configured agent. For profiles/history, load_subagent({advanced:false}) enables agent_runs. Delegation enables run controls automatically. ${asyncDescription} Use worktree for an isolated writer, acceptance for explicit requirements, and fresh context for independent review. Fresh handoffs must include relevant exact user instructions and settled decisions or readable source references, not just summaries, alongside the bounded task. Advanced workflows remain behind load_subagent.`,
|
|
53
|
-
...(childSafe ? { promptGuidelines: [...guidelines] } : {}),
|
|
54
|
-
parameters: Type.Object({ ...DelegateParams.properties, async: Type.Optional(Type.Boolean({ description: asyncDescription })) }, { additionalProperties: false }),
|
|
55
|
-
async execute(id, params, signal, onUpdate, ctx) {
|
|
56
|
-
const { worktree, context, async: background, ...task } = normalizeEverydayParams(params);
|
|
57
|
-
const request = worktree
|
|
58
|
-
? { tasks: [task], worktree: true, context, async: background, cwd: task.cwd }
|
|
59
|
-
: { ...task, context, async: background };
|
|
60
|
-
const result = await executor.execute(id, normalizeSubagentParamsLike(request), signal, onUpdate, ctx);
|
|
61
|
-
await checkRuns();
|
|
62
|
-
return adapt(result, ctx);
|
|
63
|
-
},
|
|
64
|
-
renderResult: renderSubagentResult,
|
|
65
|
-
});
|
|
66
|
-
pi.registerTool({
|
|
67
|
-
name: "agent_runs",
|
|
68
|
-
defaultActive: false,
|
|
69
|
-
label: "Agent Runs",
|
|
70
|
-
description: `List ${childSafe ? "only this child's directly owned" : "your delegated"} runs across working directories (questions/failures, then live work, then unreviewed results; 20 per page). Filter globally by agent/state/text, sort, and page with the returned cursor. history reads 100 bounded native-entry previews; search finds saved visible text using words or quoted phrases, not operators or prefixes. questions pages 20 compact previews (offset/limit); questionId selects one, and questionPath/answerPath retain full records. Browse freshness is not completion or delivery proof. Inspect concise results, paths and continuations; full:true includes the full task/configuration. Answer durable questions, nudge, stop, continue, or save parent-only review. Review notes are not sent to children; put actionable instructions in continue/nudge. Inspect/review/nudge never restart finished work. Continue/answer can launch a saved child; async:false waits for its actual result. Saved continuations keep settings unless agent selects a current profile; model overrides win. Live guidance never mutates model or acceptance. profiles lists roles, sources, context and model/thinking/fallback defaults. History survives reload.`,
|
|
71
|
-
parameters: AgentRunsParams,
|
|
72
|
-
async execute(id, params, signal, onUpdate, ctx) {
|
|
73
|
-
const normalized = normalizeEverydayParams(params, true);
|
|
74
|
-
if (params.action === "list" && !params.id && options.listRuns) return adapt(await options.listRuns({ ...normalized, signal }, ctx), ctx);
|
|
75
|
-
const actions = { list: "status", inspect: "status", history: "history", search: "search", nudge: "nudge", stop: "interrupt", continue: "resume", profiles: "list", questions: "questions", answer: "answer", review: "review" };
|
|
76
|
-
return adapt(await executor.execute(id, normalizeSubagentParamsLike({ ...normalized, action: actions[params.action] }), signal, onUpdate, ctx), ctx);
|
|
77
|
-
},
|
|
78
|
-
renderResult: renderSubagentResult,
|
|
79
|
-
});
|
|
80
|
-
pi.registerTool({
|
|
81
|
-
name: "load_subagent",
|
|
82
|
-
label: "Load Subagent",
|
|
83
|
-
description: `Enable agent_runs for profiles, history and run controls; advanced:false loads only those controls. By default also enable advanced subagent orchestration: parallel groups, chains, saved workflows, detailed overrides, get, extend and doctor.${childSafe ? " Agent-definition mutations remain blocked." : " Includes agent-definition management."} Ordinary delegation and control use delegate and agent_runs. After loading advanced workflows, call subagent with { action: "list" } before execution.`,
|
|
84
|
-
promptSnippet: "Discover profiles/history with advanced:false, or load full subagent orchestration by default.",
|
|
85
|
-
parameters: Type.Object({ advanced: Type.Optional(Type.Boolean({ description: "Also enable advanced orchestration (default true); false loads only agent_runs for profiles, history and controls." })) }),
|
|
86
|
-
async execute(_id, params) {
|
|
87
|
-
const advanced = params.advanced !== false;
|
|
88
|
-
if (advanced && !pi.getAllTools().some((tool) => tool.name === "subagent" && !("namespace" in tool && tool.namespace))) {
|
|
89
|
-
throw new Error("Subagent is unavailable because the full tool is excluded from this session.");
|
|
90
|
-
}
|
|
91
|
-
if (!advanced && !pi.getAllTools().some((tool) => tool.name === "agent_runs" && !("namespace" in tool && tool.namespace))) throw new Error("Run controls are excluded from this session.");
|
|
92
|
-
const added = !pi.getActiveTools().includes(advanced ? "subagent" : "agent_runs");
|
|
93
|
-
activateTools(pi, advanced ? ["agent_runs", "subagent"] : ["agent_runs"]);
|
|
94
|
-
return {
|
|
95
|
-
content: [{ type: "text" as const, text: advanced ? [`Subagent ${added ? "enabled" : "already enabled"}.`, ...guidelines.map((line) => `- ${line}`)].join("\n") : "Run controls enabled. Use agent_runs({action:'profiles'}) to discover agents; list, history, or search browses owned saved work." }],
|
|
96
|
-
details: {},
|
|
97
|
-
};
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
const reconcile = async (ctx: ExtensionContext) => {
|
|
101
|
-
if (options.keepAdvancedActive) activateTools(pi, ["subagent"]);
|
|
102
|
-
await checkRuns();
|
|
103
|
-
if (!pi.getActiveTools().includes("agent_runs") && (await listSupervisorQuestionsAsync(ctx.sessionManager.getSessionId())).some((question) => question.state === "awaiting_input" || question.state === "answer_pending")) activateTools(pi, ["agent_runs"]);
|
|
104
|
-
};
|
|
105
|
-
const restore = async (event: { reason?: string }, ctx: ExtensionContext) => {
|
|
106
|
-
if (event.reason !== "reload") restoreLazyTools(pi, ctx, "load_subagent", ["subagent", "agent_runs"]);
|
|
107
|
-
await reconcile(ctx);
|
|
108
|
-
};
|
|
109
|
-
pi.on("session_start", restore);
|
|
110
|
-
pi.on("session_tree", (_event, ctx) => reconcile(ctx));
|
|
111
|
-
pi.on("session_compact", (_event, ctx) => reconcile(ctx));
|
|
112
|
-
pi.on("before_agent_start", (_event, ctx) => reconcile(ctx));
|
|
113
|
-
return reconcileRuns;
|
|
239
|
+
export function registerCompactSubagentTools(
|
|
240
|
+
pi: ExtensionAPI,
|
|
241
|
+
options: CompactOptions,
|
|
242
|
+
): () => Promise<void> {
|
|
243
|
+
const checkRuns = createRunControlsReconciler(pi, options.state, options.getHistoryIndex);
|
|
244
|
+
registerDelegate(pi, options, checkRuns);
|
|
245
|
+
registerRuns(pi, options, options.childSafe === true);
|
|
246
|
+
registerLoader(pi, options);
|
|
247
|
+
const reconcile = async (ctx: ExtensionContext): Promise<void> => {
|
|
248
|
+
if (options.keepAdvancedActive === true) {
|
|
249
|
+
activateTools(pi, ["subagent"]);
|
|
250
|
+
}
|
|
251
|
+
await checkRuns();
|
|
252
|
+
if (
|
|
253
|
+
!pi.getActiveTools().includes("agent_runs") &&
|
|
254
|
+
(await listSupervisorQuestionsAsync(ctx.sessionManager.getSessionId())).some(
|
|
255
|
+
(question) => question.state === "awaiting_input" || question.state === "answer_pending",
|
|
256
|
+
)
|
|
257
|
+
) {
|
|
258
|
+
activateTools(pi, ["agent_runs"]);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
pi.on("session_start", async (event, ctx) => {
|
|
262
|
+
if (event.reason !== "reload") {
|
|
263
|
+
restoreLazyTools(pi, ctx, "load_subagent", ["subagent", "agent_runs"]);
|
|
264
|
+
}
|
|
265
|
+
await reconcile(ctx);
|
|
266
|
+
});
|
|
267
|
+
pi.on("session_tree", (_event, ctx) => reconcile(ctx));
|
|
268
|
+
pi.on("session_compact", (_event, ctx) => reconcile(ctx));
|
|
269
|
+
pi.on("before_agent_start", (_event, ctx) => reconcile(ctx));
|
|
270
|
+
return checkRuns;
|
|
114
271
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Compile, Type } from "../shared/native-typebox.ts";
|
|
2
|
+
|
|
3
|
+
const policy = Type.Enum(["inherit", "approve", "no-approve"] as const, { type: "string" });
|
|
4
|
+
const optionalNumber = Type.Optional(Type.Number());
|
|
5
|
+
const optionalBoolean = Type.Optional(Type.Boolean());
|
|
6
|
+
const optionalString = Type.Optional(Type.String());
|
|
7
|
+
|
|
8
|
+
export const extensionConfig = Compile(
|
|
9
|
+
Type.Object(
|
|
10
|
+
{
|
|
11
|
+
compactChildTools: optionalBoolean,
|
|
12
|
+
asyncByDefault: optionalBoolean,
|
|
13
|
+
forceTopLevelAsync: optionalBoolean,
|
|
14
|
+
defaultSessionDir: optionalString,
|
|
15
|
+
maxSubagentDepth: optionalNumber,
|
|
16
|
+
worktreeSetupHook: optionalString,
|
|
17
|
+
worktreeSetupHookTimeoutMs: optionalNumber,
|
|
18
|
+
projectTrust: Type.Optional(
|
|
19
|
+
Type.Union([
|
|
20
|
+
policy,
|
|
21
|
+
Type.Object({ childRuns: Type.Optional(policy) }, { additionalProperties: true }),
|
|
22
|
+
]),
|
|
23
|
+
),
|
|
24
|
+
parallel: Type.Optional(
|
|
25
|
+
Type.Object(
|
|
26
|
+
{ maxTasks: optionalNumber, concurrency: optionalNumber },
|
|
27
|
+
{ additionalProperties: true },
|
|
28
|
+
),
|
|
29
|
+
),
|
|
30
|
+
chain: Type.Optional(
|
|
31
|
+
Type.Object(
|
|
32
|
+
{
|
|
33
|
+
dynamicFanout: Type.Optional(
|
|
34
|
+
Type.Object({ maxItems: optionalNumber }, { additionalProperties: true }),
|
|
35
|
+
),
|
|
36
|
+
},
|
|
37
|
+
{ additionalProperties: true },
|
|
38
|
+
),
|
|
39
|
+
),
|
|
40
|
+
control: Type.Optional(
|
|
41
|
+
Type.Object(
|
|
42
|
+
{
|
|
43
|
+
enabled: optionalBoolean,
|
|
44
|
+
needsAttentionAfterMs: optionalNumber,
|
|
45
|
+
failedToolAttemptsBeforeAttention: optionalNumber,
|
|
46
|
+
notifyOn: Type.Optional(
|
|
47
|
+
Type.Array(Type.Enum(["needs_attention"] as const, { type: "string" })),
|
|
48
|
+
),
|
|
49
|
+
notifyChannels: Type.Optional(
|
|
50
|
+
Type.Array(Type.Enum(["event", "async", "intercom"] as const, { type: "string" })),
|
|
51
|
+
),
|
|
52
|
+
},
|
|
53
|
+
{ additionalProperties: true },
|
|
54
|
+
),
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
{ additionalProperties: true },
|
|
58
|
+
),
|
|
59
|
+
);
|
package/src/extension/config.ts
CHANGED
|
@@ -1,23 +1,45 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import type { ExtensionConfig } from "../shared/types.ts";
|
|
4
|
-
import { getAgentDir } from "../shared/
|
|
4
|
+
import { getAgentDir } from "../shared/agent-dir.ts";
|
|
5
|
+
import { isRecord } from "../shared/unknown.ts";
|
|
6
|
+
import { extensionConfig } from "./config-schema.ts";
|
|
7
|
+
|
|
8
|
+
function normalizedTrust(
|
|
9
|
+
config: Readonly<Record<string, unknown>>,
|
|
10
|
+
configPath: string,
|
|
11
|
+
): Readonly<Record<string, unknown>> {
|
|
12
|
+
const trust = config.projectTrust;
|
|
13
|
+
const childRuns = isRecord(trust) ? trust.childRuns : trust;
|
|
14
|
+
if (
|
|
15
|
+
childRuns !== undefined &&
|
|
16
|
+
childRuns !== "inherit" &&
|
|
17
|
+
childRuns !== "approve" &&
|
|
18
|
+
childRuns !== "no-approve"
|
|
19
|
+
) {
|
|
20
|
+
console.error(`Invalid projectTrust in '${configPath}'; child runs will use no-approve.`);
|
|
21
|
+
return { ...config, projectTrust: "no-approve" };
|
|
22
|
+
}
|
|
23
|
+
return config;
|
|
24
|
+
}
|
|
5
25
|
|
|
6
26
|
export function loadConfig(): ExtensionConfig {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
const configPath = path.join(getAgentDir(), "extensions", "subagent", "config.json");
|
|
28
|
+
try {
|
|
29
|
+
if (!fs.existsSync(configPath)) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
const parsed: unknown = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
33
|
+
if (!isRecord(parsed)) {
|
|
34
|
+
throw new Error("Subagent configuration must be an object.");
|
|
35
|
+
}
|
|
36
|
+
const config = normalizedTrust(parsed, configPath);
|
|
37
|
+
if (!extensionConfig.Check(config)) {
|
|
38
|
+
throw new Error([...extensionConfig.Errors(config)].map((error) => error.message).join("; "));
|
|
39
|
+
}
|
|
40
|
+
return config;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(`Failed to load subagent config from '${configPath}':`, error);
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
23
45
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Compile, Type } from "../shared/native-typebox.ts";
|
|
2
|
+
import type { SubagentControlMessageDetails } from "./control-notices.ts";
|
|
3
|
+
|
|
4
|
+
const optionalString = Type.Optional(Type.String());
|
|
5
|
+
const optionalNumber = Type.Optional(Type.Number());
|
|
6
|
+
const attention = Type.Enum(["needs_attention"] as const, { type: "string" });
|
|
7
|
+
const notice = Compile(
|
|
8
|
+
Type.Object(
|
|
9
|
+
{
|
|
10
|
+
event: Type.Object(
|
|
11
|
+
{
|
|
12
|
+
type: attention,
|
|
13
|
+
from: Type.Optional(attention),
|
|
14
|
+
to: attention,
|
|
15
|
+
ts: Type.Number(),
|
|
16
|
+
agent: Type.String(),
|
|
17
|
+
runId: Type.String(),
|
|
18
|
+
message: Type.String(),
|
|
19
|
+
index: optionalNumber,
|
|
20
|
+
reason: Type.Optional(
|
|
21
|
+
Type.Enum(["idle", "completion_guard", "tool_failures"] as const, { type: "string" }),
|
|
22
|
+
),
|
|
23
|
+
turns: optionalNumber,
|
|
24
|
+
tokens: optionalNumber,
|
|
25
|
+
toolCount: optionalNumber,
|
|
26
|
+
currentTool: optionalString,
|
|
27
|
+
currentToolDurationMs: optionalNumber,
|
|
28
|
+
currentPath: optionalString,
|
|
29
|
+
elapsedMs: optionalNumber,
|
|
30
|
+
recentFailureSummary: optionalString,
|
|
31
|
+
supervisorQuestion: Type.Optional(
|
|
32
|
+
Type.Object(
|
|
33
|
+
{
|
|
34
|
+
questionId: Type.String(),
|
|
35
|
+
state: Type.Enum(["awaiting_input", "answer_pending"] as const, { type: "string" }),
|
|
36
|
+
answer: optionalString,
|
|
37
|
+
},
|
|
38
|
+
{ additionalProperties: true },
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
},
|
|
42
|
+
{ additionalProperties: true },
|
|
43
|
+
),
|
|
44
|
+
source: Type.Optional(Type.Enum(["foreground", "async"] as const, { type: "string" })),
|
|
45
|
+
asyncDir: optionalString,
|
|
46
|
+
childIntercomTarget: optionalString,
|
|
47
|
+
noticeText: optionalString,
|
|
48
|
+
},
|
|
49
|
+
{ additionalProperties: true },
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
export function parseControlNotice(value: unknown): SubagentControlMessageDetails | undefined {
|
|
54
|
+
return notice.Check(value) ? value : undefined;
|
|
55
|
+
}
|
|
@@ -1,47 +1,71 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
controlNotificationKey,
|
|
4
|
+
formatControlNoticeMessage,
|
|
5
|
+
isObsoleteIdleNotice,
|
|
6
|
+
} from "../runs/shared/subagent-control.ts";
|
|
3
7
|
import type { ControlEvent } from "../shared/types.ts";
|
|
4
8
|
|
|
5
9
|
export const SUBAGENT_CONTROL_MESSAGE_TYPE = "subagent_control_notice";
|
|
6
10
|
|
|
7
11
|
export interface SubagentControlMessageDetails {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
readonly event: ControlEvent;
|
|
13
|
+
readonly source?: "foreground" | "async";
|
|
14
|
+
readonly asyncDir?: string;
|
|
15
|
+
readonly childIntercomTarget?: string;
|
|
16
|
+
readonly noticeText?: string;
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
export function controlNoticeTarget(details: SubagentControlMessageDetails): string | undefined {
|
|
16
|
-
|
|
20
|
+
return details.childIntercomTarget;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
|
-
export function formatSubagentControlNotice(
|
|
20
|
-
|
|
23
|
+
export function formatSubagentControlNotice(
|
|
24
|
+
details: SubagentControlMessageDetails,
|
|
25
|
+
content?: string,
|
|
26
|
+
): string {
|
|
27
|
+
return (
|
|
28
|
+
details.noticeText ??
|
|
29
|
+
content ??
|
|
30
|
+
formatControlNoticeMessage(details.event, controlNoticeTarget(details))
|
|
31
|
+
);
|
|
21
32
|
}
|
|
22
33
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
/** The runtime supplies its mutable dedup owner; delivery adds exactly one visible-notice key. */
|
|
35
|
+
interface ControlNoticeDeliveryInput {
|
|
36
|
+
readonly pi: Pick<ExtensionAPI, "sendMessage">;
|
|
37
|
+
readonly visibleControlNotices: Set<string>;
|
|
38
|
+
readonly details: SubagentControlMessageDetails;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function handleSubagentControlNotice(input: ControlNoticeDeliveryInput): void {
|
|
42
|
+
if (isObsoleteIdleNotice(input.details)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const childIntercomTarget = controlNoticeTarget(input.details);
|
|
46
|
+
const key = controlNotificationKey(input.details.event, childIntercomTarget);
|
|
47
|
+
if (input.visibleControlNotices.has(key)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
input.visibleControlNotices.add(key);
|
|
51
|
+
const noticeText =
|
|
52
|
+
input.details.noticeText ??
|
|
53
|
+
formatControlNoticeMessage(input.details.event, childIntercomTarget);
|
|
54
|
+
input.pi.sendMessage(
|
|
55
|
+
{
|
|
56
|
+
customType: SUBAGENT_CONTROL_MESSAGE_TYPE,
|
|
57
|
+
content: noticeText,
|
|
58
|
+
display: true,
|
|
59
|
+
details: { ...input.details, childIntercomTarget, noticeText },
|
|
60
|
+
},
|
|
61
|
+
// Async completion-guard notices stay visible but let the matching completion
|
|
62
|
+
// result deliver the single automatic wakeup. In a parallel group that result
|
|
63
|
+
// arrives only after all siblings finish, so reaction to a mid-group guard
|
|
64
|
+
// notice is bounded by the longest-running sibling.
|
|
65
|
+
{
|
|
66
|
+
triggerTurn: !(
|
|
67
|
+
input.details.source === "async" && input.details.event.reason === "completion_guard"
|
|
68
|
+
),
|
|
69
|
+
},
|
|
70
|
+
);
|
|
47
71
|
}
|