@fitchmultz/pi-subagents 0.49.1 → 0.51.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 +72 -1
- package/README.md +119 -94
- package/dist/agent/contracts.js +104 -0
- package/dist/agent/cwd.js +51 -0
- package/dist/agent/host.js +69 -0
- package/dist/agent/index.js +456 -0
- package/dist/agent/journal-tail.js +142 -0
- package/dist/agent/launch.js +99 -0
- package/dist/agent/legacy.js +183 -0
- package/dist/agent/notifications.js +210 -0
- package/dist/agent/observation-state.js +246 -0
- package/dist/agent/observation-view.js +258 -0
- package/dist/agent/observation.js +346 -0
- package/dist/agent/observe-card.js +243 -0
- package/dist/agent/observe-chrome.js +85 -0
- package/dist/agent/observe-client.js +285 -0
- package/dist/agent/observe-layout.js +65 -0
- package/dist/agent/observe-reading.js +84 -0
- package/dist/agent/observe-screen.js +436 -0
- package/dist/agent/observe-transcript.js +382 -0
- package/dist/agent/observe.js +441 -0
- package/dist/agent/process.js +346 -0
- package/dist/agent/receipts.js +147 -0
- package/dist/agent/runner.js +477 -0
- package/dist/agent/saved.js +195 -0
- package/dist/agent/shell.js +44 -0
- package/dist/agent/storage.js +130 -0
- package/dist/agent/tool-schemas.js +20 -0
- package/dist/agent/typebox.js +25 -0
- package/dist/agent/usage.js +117 -0
- package/dist/agent/view.js +194 -0
- package/dist/agent/wake.js +99 -0
- package/dist/build-info.js +1 -0
- package/dist/index.js +8 -0
- package/dist/intercom-client.d.ts +26 -0
- package/dist/intercom-client.js +45 -0
- package/dist/pi-intercom/agent-dir.d.ts +1 -0
- package/dist/pi-intercom/bridge-config.js +12 -19
- package/dist/pi-intercom/bridge-http.js +1 -2
- package/dist/pi-intercom/bridge-mailbox.js +2 -7
- package/dist/pi-intercom/bridge-protocol.js +3 -10
- package/dist/pi-intercom/bridge-routes.js +15 -186
- package/dist/pi-intercom/bridge-session.js +4 -97
- package/dist/pi-intercom/bridge.js +12 -35
- package/dist/pi-intercom/broker/broker.js +57 -56
- package/dist/pi-intercom/broker/client-last.d.ts +13 -0
- package/dist/pi-intercom/broker/client-last.js +60 -0
- package/dist/pi-intercom/broker/client.d.ts +60 -0
- package/dist/pi-intercom/broker/client.js +75 -4
- package/dist/pi-intercom/broker/connection.d.ts +29 -0
- package/dist/pi-intercom/broker/connection.js +5 -18
- package/dist/pi-intercom/broker/framing.d.ts +17 -0
- package/dist/pi-intercom/broker/framing.js +10 -7
- package/dist/pi-intercom/broker/guard.js +23 -0
- package/dist/pi-intercom/broker/last.d.ts +26 -0
- package/dist/pi-intercom/broker/last.js +198 -0
- package/dist/pi-intercom/broker/paths.d.ts +13 -0
- package/dist/pi-intercom/broker/paths.js +58 -16
- package/dist/pi-intercom/broker/pid.js +5 -1
- package/dist/pi-intercom/broker/server-connection.js +37 -0
- package/dist/pi-intercom/broker/snapshot-reader.d.ts +9 -0
- package/dist/pi-intercom/broker/snapshots.d.ts +29 -0
- package/dist/pi-intercom/broker/spawn.js +32 -16
- package/dist/pi-intercom/broker/targets.d.ts +9 -0
- package/dist/pi-intercom/broker/targets.js +24 -0
- package/dist/pi-intercom/config.js +0 -23
- package/dist/pi-intercom/connection.js +40 -72
- package/dist/pi-intercom/identity.js +15 -44
- package/dist/pi-intercom/inbound-delivery.js +20 -125
- package/dist/pi-intercom/inbound-journal.js +85 -73
- package/dist/pi-intercom/inbound-record.js +20 -49
- package/dist/pi-intercom/inbound.js +17 -90
- package/dist/pi-intercom/index.js +11 -47
- package/dist/pi-intercom/last-message.js +46 -0
- package/dist/pi-intercom/lifecycle.js +96 -36
- package/dist/pi-intercom/message-format.js +1 -32
- package/dist/pi-intercom/outbound.js +14 -16
- package/dist/pi-intercom/reply-tracker.js +9 -18
- package/dist/pi-intercom/reply-wait.js +17 -108
- package/dist/pi-intercom/runtime-types.js +0 -1
- package/dist/pi-intercom/session-events.js +5 -21
- package/dist/pi-intercom/session-targets.d.ts +24 -0
- package/dist/pi-intercom/tool-arguments.js +4 -0
- package/dist/pi-intercom/tool-registration.js +8 -86
- package/dist/pi-intercom/tool-results.js +5 -7
- package/dist/pi-intercom/tool-schemas.js +13 -67
- package/dist/pi-intercom/tools.js +55 -29
- package/dist/pi-intercom/types.d.ts +212 -0
- package/dist/pi-intercom/types.js +62 -4
- package/dist/pi-intercom/ui/session-format.js +3 -3
- package/dist/pi-intercom/validation.d.ts +12 -0
- package/dist/pi-intercom/validation.js +3 -0
- package/dist/shared/bounded-json.js +151 -0
- package/dist/shared/compact-cards.js +66 -0
- package/dist/shared/journal-frames.js +3 -6
- package/dist/shared/journal-projections.js +0 -31
- package/dist/shared/json-projection.js +267 -129
- package/dist/shared/native-journal.js +123 -56
- package/dist/shared/post-exit-stdio-guard.js +120 -7
- package/dist/shared/tui-action.js +29 -0
- package/dist/shared/types.js +0 -195
- package/dist/shared/unknown.d.ts +9 -0
- package/docs/code-quality.md +6 -3
- package/docs/development.md +93 -92
- package/docs/intercom-bridge.md +211 -415
- package/docs/intercom.md +362 -593
- package/docs/performance.md +185 -192
- package/docs/reference.md +282 -1458
- package/docs/retired-history-maintenance.md +252 -0
- package/package.json +33 -27
- package/scripts/archive-retired-history.mjs +464 -0
- package/scripts/build.mjs +49 -29
- package/scripts/intercom-bridge-credentials.mjs +1 -1
- package/scripts/intercom-remote.mjs +55 -272
- package/scripts/local-install-smoke.mjs +3 -1
- package/scripts/measure-size.mjs +64 -0
- package/scripts/native-package-smoke.mjs +409 -110
- package/scripts/package-smoke.mjs +184 -358
- package/scripts/prepare.mjs +2 -2
- package/scripts/real-pi-live.mjs +377 -0
- package/scripts/real-pi-processes.mjs +12 -39
- package/scripts/real-pi-smoke.mjs +39 -306
- package/scripts/run-tests.mjs +5 -2
- package/scripts/typescript.mjs +35 -0
- package/skills/pi-intercom/SKILL.md +54 -107
- package/skills/pi-subagents/SKILL.md +76 -72
- package/src/agent/contracts.ts +118 -0
- package/src/agent/cwd.ts +69 -0
- package/src/agent/host.ts +81 -0
- package/src/agent/index.ts +520 -0
- package/src/agent/journal-tail.ts +172 -0
- package/src/agent/launch.ts +136 -0
- package/src/agent/legacy.ts +221 -0
- package/src/agent/notifications.ts +256 -0
- package/src/agent/observation-state.ts +277 -0
- package/src/agent/observation-view.ts +267 -0
- package/src/agent/observation.ts +405 -0
- package/src/agent/observe-card.ts +304 -0
- package/src/agent/observe-chrome.ts +170 -0
- package/src/agent/observe-client.ts +318 -0
- package/src/agent/observe-layout.ts +79 -0
- package/src/agent/observe-reading.ts +97 -0
- package/src/agent/observe-screen.ts +481 -0
- package/src/agent/observe-transcript.ts +434 -0
- package/src/agent/observe.ts +473 -0
- package/src/agent/process.ts +385 -0
- package/src/agent/receipts.ts +178 -0
- package/src/agent/runner.ts +515 -0
- package/src/agent/saved.ts +220 -0
- package/src/agent/shell.ts +57 -0
- package/src/agent/storage.ts +139 -0
- package/src/agent/tool-schemas.ts +33 -0
- package/src/agent/typebox.ts +22 -0
- package/src/agent/usage.ts +133 -0
- package/src/agent/view.ts +296 -0
- package/src/agent/wake.ts +107 -0
- package/src/index.ts +10 -0
- package/src/intercom-client.ts +108 -0
- package/src/pi-intercom/bridge-config.ts +13 -24
- package/src/pi-intercom/bridge-http.ts +1 -2
- package/src/pi-intercom/bridge-mailbox.ts +8 -8
- package/src/pi-intercom/bridge-protocol.ts +7 -11
- package/src/pi-intercom/bridge-routes.ts +29 -277
- package/src/pi-intercom/bridge-session.ts +5 -116
- package/src/pi-intercom/bridge.ts +12 -35
- package/src/pi-intercom/broker/broker.ts +63 -74
- package/src/pi-intercom/broker/client-last.ts +78 -0
- package/src/pi-intercom/broker/client.ts +87 -23
- package/src/pi-intercom/broker/connection.ts +5 -17
- package/src/pi-intercom/broker/framing.ts +11 -8
- package/src/pi-intercom/broker/guard.ts +33 -0
- package/src/pi-intercom/broker/last.ts +275 -0
- package/src/pi-intercom/broker/paths.ts +65 -16
- package/src/pi-intercom/broker/pid.ts +6 -1
- package/src/pi-intercom/broker/server-connection.ts +63 -0
- package/src/pi-intercom/broker/spawn.ts +44 -16
- package/src/pi-intercom/broker/targets.ts +42 -0
- package/src/pi-intercom/config.ts +0 -27
- package/src/pi-intercom/connection.ts +60 -92
- package/src/pi-intercom/identity.ts +24 -49
- package/src/pi-intercom/inbound-delivery.ts +25 -154
- package/src/pi-intercom/inbound-journal.ts +105 -86
- package/src/pi-intercom/inbound-record.ts +23 -65
- package/src/pi-intercom/inbound.ts +24 -117
- package/src/pi-intercom/index.ts +13 -49
- package/src/pi-intercom/last-message.ts +64 -0
- package/src/pi-intercom/lifecycle.ts +126 -50
- package/src/pi-intercom/message-format.ts +1 -34
- package/src/pi-intercom/outbound.ts +23 -17
- package/src/pi-intercom/reply-tracker.ts +10 -25
- package/src/pi-intercom/reply-wait.ts +23 -129
- package/src/pi-intercom/runtime-types.ts +5 -59
- package/src/pi-intercom/session-events.ts +7 -35
- package/src/pi-intercom/tool-arguments.ts +6 -0
- package/src/pi-intercom/tool-registration.ts +12 -109
- package/src/pi-intercom/tool-results.ts +10 -9
- package/src/pi-intercom/tool-schemas.ts +13 -108
- package/src/pi-intercom/tools.ts +58 -44
- package/src/pi-intercom/transport.ts +1 -0
- package/src/pi-intercom/types.ts +156 -6
- package/src/pi-intercom/ui/session-format.ts +3 -3
- package/src/pi-intercom/validation.ts +4 -0
- package/src/shared/bounded-json.ts +162 -0
- package/src/shared/compact-cards.ts +118 -0
- package/src/shared/journal-frames.ts +3 -19
- package/src/shared/journal-projections.ts +0 -35
- package/src/shared/json-projection.ts +267 -147
- package/src/shared/native-journal.ts +157 -75
- package/src/shared/post-exit-stdio-guard.ts +172 -8
- package/src/shared/tui-action.ts +39 -0
- package/src/shared/types.ts +0 -257
- package/tsconfig.client.json +8 -0
- package/tsconfig.json +1 -0
- package/agents/context-builder.md +0 -115
- package/agents/debugger.md +0 -58
- package/agents/delegate.md +0 -14
- package/agents/fixer.md +0 -40
- package/agents/oracle.md +0 -82
- package/agents/planner.md +0 -83
- package/agents/researcher.md +0 -60
- package/agents/reviewer-claude.md +0 -78
- package/agents/reviewer-gpt.md +0 -78
- package/agents/reviewer-ponytail.md +0 -92
- package/agents/reviewer-security.md +0 -92
- package/agents/reviewer.md +0 -78
- package/agents/scout.md +0 -77
- package/agents/ui-designer.md +0 -58
- package/agents/watcher.md +0 -27
- package/agents/worker.md +0 -52
- package/agents/writer.md +0 -39
- package/dist/agents/agent-defaults.js +0 -9
- package/dist/agents/agent-definition.js +0 -196
- package/dist/agents/agent-management.js +0 -88
- package/dist/agents/agent-scope.js +0 -9
- package/dist/agents/agent-selection.js +0 -13
- package/dist/agents/agent-serializer.js +0 -88
- package/dist/agents/agents.js +0 -111
- package/dist/agents/builtin-overrides.js +0 -218
- package/dist/agents/chain-serializer.js +0 -3
- package/dist/agents/config-values.js +0 -52
- package/dist/agents/discovery-paths.js +0 -91
- package/dist/agents/frontmatter.js +0 -31
- package/dist/agents/identity.js +0 -46
- package/dist/agents/json-chain.js +0 -254
- package/dist/agents/management-config.js +0 -332
- package/dist/agents/management-format.js +0 -231
- package/dist/agents/management-persistence.js +0 -287
- package/dist/agents/management-targets.js +0 -136
- package/dist/agents/management-warnings.js +0 -81
- package/dist/agents/markdown-chain.js +0 -210
- package/dist/agents/package-agents.js +0 -154
- package/dist/agents/skill-files.js +0 -157
- package/dist/agents/skill-search-paths.js +0 -246
- package/dist/agents/skill-types.js +0 -1
- package/dist/agents/skills.js +0 -125
- package/dist/extension/acceptance-schema.js +0 -55
- package/dist/extension/build-info.js +0 -1
- package/dist/extension/chain-schema.js +0 -196
- package/dist/extension/child-runtime.js +0 -237
- package/dist/extension/compact-tools.js +0 -183
- package/dist/extension/config-schema.js +0 -29
- package/dist/extension/config.js +0 -38
- package/dist/extension/control-notice-schema.js +0 -37
- package/dist/extension/control-notices.js +0 -36
- package/dist/extension/delegation-bridges.js +0 -43
- package/dist/extension/doctor.js +0 -166
- package/dist/extension/everyday-schemas.js +0 -207
- package/dist/extension/fanout-child.js +0 -25
- package/dist/extension/index.js +0 -28
- package/dist/extension/message-renderers.js +0 -225
- package/dist/extension/nested-control-inbox.js +0 -154
- package/dist/extension/parent-runtime.js +0 -339
- package/dist/extension/primary-tool.js +0 -69
- package/dist/extension/result-snapshot.js +0 -4
- package/dist/extension/runtime-reload.js +0 -62
- package/dist/extension/runtime-storage.js +0 -43
- package/dist/extension/schema-overrides.js +0 -75
- package/dist/extension/schemas.js +0 -345
- package/dist/extension/tool-input.js +0 -35
- package/dist/extension/tool-result.js +0 -29
- package/dist/history/answer-texts.js +0 -57
- package/dist/history/canonical-result.js +0 -114
- package/dist/history/canonical-selection.js +0 -40
- package/dist/history/database-generation.js +0 -82
- package/dist/history/database.js +0 -96
- package/dist/history/entry-ingestion.js +0 -61
- package/dist/history/index.js +0 -344
- package/dist/history/ingest.js +0 -314
- package/dist/history/output-digests.js +0 -40
- package/dist/history/preview.js +0 -210
- package/dist/history/prune.js +0 -33
- package/dist/history/queries.js +0 -81
- package/dist/history/query-scope.js +0 -190
- package/dist/history/rows.js +0 -77
- package/dist/history/run-projection.js +0 -136
- package/dist/history/run-queries.js +0 -153
- package/dist/history/schema.js +0 -31
- package/dist/history/search-queries.js +0 -169
- package/dist/history/selected-record.js +0 -108
- package/dist/history/source-file.js +0 -45
- package/dist/history/source-watches.js +0 -141
- package/dist/history/store.js +0 -243
- package/dist/history/text-chunks.js +0 -168
- package/dist/history/text.js +0 -35
- package/dist/history/transcript-queries.js +0 -183
- package/dist/history/types.js +0 -8
- package/dist/history/values.js +0 -36
- package/dist/history/wire-inputs.js +0 -122
- package/dist/history/wire-models.js +0 -38
- package/dist/history/worker-runtime.js +0 -441
- package/dist/history/worker.js +0 -91
- package/dist/intercom/intercom-bridge.js +0 -140
- package/dist/intercom/live-intercom.js +0 -151
- package/dist/intercom/nested-result-tree.js +0 -163
- package/dist/intercom/result-delivery.js +0 -40
- package/dist/intercom/result-intercom.js +0 -216
- package/dist/pi-intercom/bridge-ask.js +0 -57
- package/dist/pi-intercom/bridge-broadcast.js +0 -60
- package/dist/pi-intercom/bridge-catalog.js +0 -372
- package/dist/pi-intercom/bridge-control.js +0 -104
- package/dist/pi-intercom/bridge-groups.js +0 -135
- package/dist/pi-intercom/bridge-launch-journal.js +0 -84
- package/dist/pi-intercom/bridge-launch-policy.js +0 -154
- package/dist/pi-intercom/bridge-launch.js +0 -327
- package/dist/pi-intercom/bridge-operations.js +0 -127
- package/dist/pi-intercom/bridge-rpc-process.js +0 -292
- package/dist/pi-intercom/interview.js +0 -236
- package/dist/pi-intercom/native-control-auth.js +0 -80
- package/dist/pi-intercom/native-control-protocol.js +0 -111
- package/dist/pi-intercom/native-control.js +0 -130
- package/dist/pi-intercom/peer-awareness.js +0 -66
- package/dist/pi-intercom/saved-transcript.js +0 -135
- package/dist/pi-intercom/subagent-events.js +0 -238
- package/dist/pi-intercom/subagent-live-events.js +0 -175
- package/dist/pi-intercom/supervisor.js +0 -282
- package/dist/pi-intercom/topic-actions.js +0 -177
- package/dist/pi-intercom/topics.js +0 -242
- package/dist/pi-intercom/transcript.js +0 -175
- package/dist/pi-intercom/ui/compose-paste.js +0 -93
- package/dist/pi-intercom/ui/compose.js +0 -247
- package/dist/pi-intercom/ui/inline-message.js +0 -80
- package/dist/pi-intercom/ui/message-renderers.js +0 -147
- package/dist/pi-intercom/ui/overlay.js +0 -181
- package/dist/pi-intercom/ui/session-list.js +0 -157
- package/dist/pi-intercom/ui/tool-renderers.js +0 -110
- package/dist/pi-intercom/ui/topic-view.js +0 -88
- package/dist/runs/background/async-chain-plan.js +0 -265
- package/dist/runs/background/async-control.js +0 -171
- package/dist/runs/background/async-execution.js +0 -179
- package/dist/runs/background/async-job-admission.js +0 -40
- package/dist/runs/background/async-job-projection.js +0 -169
- package/dist/runs/background/async-job-tracker.js +0 -353
- package/dist/runs/background/async-launch.js +0 -216
- package/dist/runs/background/async-plan.js +0 -116
- package/dist/runs/background/async-result-file.js +0 -82
- package/dist/runs/background/async-resume.js +0 -247
- package/dist/runs/background/async-run-discovery.js +0 -211
- package/dist/runs/background/async-run-location.js +0 -135
- package/dist/runs/background/async-run-record.js +0 -1
- package/dist/runs/background/async-run-repair.js +0 -223
- package/dist/runs/background/async-run-summary.js +0 -1
- package/dist/runs/background/async-single-plan.js +0 -105
- package/dist/runs/background/async-status-projection.js +0 -155
- package/dist/runs/background/async-status-render.js +0 -117
- package/dist/runs/background/async-status-validation.js +0 -181
- package/dist/runs/background/async-status.js +0 -3
- package/dist/runs/background/async-value.js +0 -21
- package/dist/runs/background/completion-dedupe.js +0 -42
- package/dist/runs/background/completion-delivery.js +0 -251
- package/dist/runs/background/completion-receipts.js +0 -237
- package/dist/runs/background/legacy-status-acceptance.js +0 -34
- package/dist/runs/background/notify.js +0 -111
- package/dist/runs/background/parallel-groups.js +0 -72
- package/dist/runs/background/result-payload.js +0 -178
- package/dist/runs/background/result-watcher.js +0 -435
- package/dist/runs/background/run-id-resolver.js +0 -84
- package/dist/runs/background/run-schemas.js +0 -189
- package/dist/runs/background/run-status-contracts.js +0 -14
- package/dist/runs/background/run-status-render.js +0 -270
- package/dist/runs/background/run-status.js +0 -274
- package/dist/runs/background/runner-attempt-output.js +0 -155
- package/dist/runs/background/runner-attempt.js +0 -263
- package/dist/runs/background/runner-child-executor.js +0 -166
- package/dist/runs/background/runner-child-observer.js +0 -197
- package/dist/runs/background/runner-completion-summary.js +0 -71
- package/dist/runs/background/runner-completion.js +0 -211
- package/dist/runs/background/runner-config.js +0 -1
- package/dist/runs/background/runner-contract.js +0 -1
- package/dist/runs/background/runner-dynamic.js +0 -121
- package/dist/runs/background/runner-finalization.js +0 -149
- package/dist/runs/background/runner-graph.js +0 -68
- package/dist/runs/background/runner-initial-status.js +0 -60
- package/dist/runs/background/runner-lifecycle.js +0 -142
- package/dist/runs/background/runner-monitor.js +0 -311
- package/dist/runs/background/runner-parallel.js +0 -203
- package/dist/runs/background/runner-prepare-step.js +0 -86
- package/dist/runs/background/runner-reporting.js +0 -153
- package/dist/runs/background/runner-status.js +0 -148
- package/dist/runs/background/runner-step-output.js +0 -90
- package/dist/runs/background/runner-step-record.js +0 -45
- package/dist/runs/background/runner-step.js +0 -112
- package/dist/runs/background/runner-streaming.js +0 -173
- package/dist/runs/background/runner-workflow.js +0 -213
- package/dist/runs/background/stale-run-reconciler.js +0 -198
- package/dist/runs/background/subagent-runner-launcher.js +0 -75
- package/dist/runs/background/subagent-runner.js +0 -81
- package/dist/runs/background/top-level-async.js +0 -6
- package/dist/runs/foreground/chain-clarify.js +0 -428
- package/dist/runs/foreground/clarification-draft.js +0 -87
- package/dist/runs/foreground/clarify-contracts.js +0 -1
- package/dist/runs/foreground/clarify-invocation.js +0 -163
- package/dist/runs/foreground/clarify-text-editor.js +0 -210
- package/dist/runs/foreground/clarify-view.js +0 -167
- package/dist/runs/foreground/execution-input.js +0 -296
- package/dist/runs/foreground/execution-routing.js +0 -33
- package/dist/runs/foreground/execution-timeout.js +0 -81
- package/dist/runs/foreground/foreground-control.js +0 -276
- package/dist/runs/foreground/foreground-memory.js +0 -99
- package/dist/runs/foreground/invocation-context.js +0 -55
- package/dist/runs/foreground/invocation-execution.js +0 -331
- package/dist/runs/foreground/invocation-expansion.js +0 -48
- package/dist/runs/foreground/management-actions.js +0 -295
- package/dist/runs/foreground/nested-control.js +0 -179
- package/dist/runs/foreground/question-continuation.js +0 -78
- package/dist/runs/foreground/question-control.js +0 -193
- package/dist/runs/foreground/resume-target.js +0 -221
- package/dist/runs/foreground/revival-launch-policy.js +0 -58
- package/dist/runs/foreground/run-async-path.js +0 -217
- package/dist/runs/foreground/run-interrupt.js +0 -164
- package/dist/runs/foreground/run-nudge.js +0 -278
- package/dist/runs/foreground/saved-revival.js +0 -251
- package/dist/runs/foreground/subagent-executor.js +0 -153
- package/dist/runs/foreground/subagent-params.js +0 -202
- package/dist/runs/foreground/wait-observation.js +0 -104
- package/dist/runs/foreground/wait-registration.js +0 -17
- package/dist/runs/foreground/wait-run.js +0 -301
- package/dist/runs/shared/acceptance-contract.js +0 -347
- package/dist/runs/shared/acceptance-defaults.js +0 -1
- package/dist/runs/shared/acceptance-evaluation.js +0 -276
- package/dist/runs/shared/acceptance-finalization.js +0 -356
- package/dist/runs/shared/acceptance-outcome.js +0 -53
- package/dist/runs/shared/acceptance-reports.js +0 -212
- package/dist/runs/shared/acceptance-submission.js +0 -167
- package/dist/runs/shared/acceptance-verification.js +0 -100
- package/dist/runs/shared/acceptance.js +0 -4
- package/dist/runs/shared/chain-outputs.js +0 -138
- package/dist/runs/shared/child-attempt-types.js +0 -1
- package/dist/runs/shared/child-attempt.js +0 -340
- package/dist/runs/shared/child-boundaries.js +0 -173
- package/dist/runs/shared/child-context-filter.js +0 -44
- package/dist/runs/shared/child-event-observer.js +0 -390
- package/dist/runs/shared/child-execution-cwd.js +0 -126
- package/dist/runs/shared/child-execution-outcome.js +0 -72
- package/dist/runs/shared/child-invocation.js +0 -54
- package/dist/runs/shared/child-message-validation.js +0 -215
- package/dist/runs/shared/child-native-accounting.js +0 -106
- package/dist/runs/shared/child-native-observation.js +0 -69
- package/dist/runs/shared/child-observation-spool.js +0 -169
- package/dist/runs/shared/child-observations.js +0 -195
- package/dist/runs/shared/child-presence.js +0 -3
- package/dist/runs/shared/child-route-env.js +0 -119
- package/dist/runs/shared/child-stream-observer.js +0 -221
- package/dist/runs/shared/child-stream-projection.js +0 -137
- package/dist/runs/shared/child-structured-tool.js +0 -27
- package/dist/runs/shared/claude-code.js +0 -162
- package/dist/runs/shared/claude-model.js +0 -42
- package/dist/runs/shared/claude-session.js +0 -83
- package/dist/runs/shared/claude-types.js +0 -1
- package/dist/runs/shared/completion-guard.js +0 -31
- package/dist/runs/shared/control-event-policy.js +0 -8
- package/dist/runs/shared/control-notification-owner.js +0 -13
- package/dist/runs/shared/dynamic-fanout.js +0 -289
- package/dist/runs/shared/dynamic-item.js +0 -102
- package/dist/runs/shared/history-index.js +0 -98
- package/dist/runs/shared/legacy-async-recovery.js +0 -114
- package/dist/runs/shared/legacy-output-recovery.js +0 -148
- package/dist/runs/shared/mcp-config-schema.js +0 -36
- package/dist/runs/shared/mcp-direct-tool-allowlist.js +0 -365
- package/dist/runs/shared/model-fallback.js +0 -247
- package/dist/runs/shared/mutating-tool-guard.js +0 -210
- package/dist/runs/shared/native-finalization-types.js +0 -1
- package/dist/runs/shared/native-finalization.js +0 -180
- package/dist/runs/shared/native-usage.js +0 -293
- package/dist/runs/shared/nested-control-records.js +0 -128
- package/dist/runs/shared/nested-events.js +0 -8
- package/dist/runs/shared/nested-path.js +0 -52
- package/dist/runs/shared/nested-projection.js +0 -155
- package/dist/runs/shared/nested-protocol.js +0 -18
- package/dist/runs/shared/nested-registry.js +0 -191
- package/dist/runs/shared/nested-render.js +0 -156
- package/dist/runs/shared/nested-route.js +0 -220
- package/dist/runs/shared/nested-validation.js +0 -216
- package/dist/runs/shared/owned-child-evidence.js +0 -125
- package/dist/runs/shared/owned-run-list.js +0 -146
- package/dist/runs/shared/owned-run-observation.js +0 -267
- package/dist/runs/shared/owned-run-progress.js +0 -109
- package/dist/runs/shared/owned-run-read-state.js +0 -1
- package/dist/runs/shared/owned-run-results.js +0 -202
- package/dist/runs/shared/owned-run-status.js +0 -180
- package/dist/runs/shared/owned-run-view.js +0 -51
- package/dist/runs/shared/owned-workflow-details.js +0 -17
- package/dist/runs/shared/owner-output.js +0 -43
- package/dist/runs/shared/parallel-utils.js +0 -49
- package/dist/runs/shared/parent-receipts.js +0 -126
- package/dist/runs/shared/parent-usage.js +0 -233
- package/dist/runs/shared/pi-args.js +0 -217
- package/dist/runs/shared/pi-launch-input.js +0 -1
- package/dist/runs/shared/pi-session-launch.js +0 -86
- package/dist/runs/shared/pi-spawn.js +0 -66
- package/dist/runs/shared/run-history-queries.js +0 -136
- package/dist/runs/shared/run-history.js +0 -176
- package/dist/runs/shared/run-id-ambiguity.js +0 -4
- package/dist/runs/shared/run-metadata-paths.js +0 -14
- package/dist/runs/shared/run-metadata.js +0 -158
- package/dist/runs/shared/run-persistence.js +0 -131
- package/dist/runs/shared/run-records.js +0 -9
- package/dist/runs/shared/run-restoration.js +0 -337
- package/dist/runs/shared/run-state-owner.js +0 -26
- package/dist/runs/shared/session-cwd-preload.js +0 -42
- package/dist/runs/shared/single-output.js +0 -297
- package/dist/runs/shared/stable-value.js +0 -15
- package/dist/runs/shared/streaming-text.js +0 -26
- package/dist/runs/shared/structured-output.js +0 -67
- package/dist/runs/shared/subagent-control.js +0 -246
- package/dist/runs/shared/subagent-prompt-runtime.js +0 -94
- package/dist/runs/shared/subagent-tool-loop-guard.js +0 -95
- package/dist/runs/shared/supervisor-question-state.js +0 -145
- package/dist/runs/shared/supervisor-questions.js +0 -284
- package/dist/runs/shared/workflow-graph.js +0 -306
- package/dist/runs/shared/workflow-policy.js +0 -157
- package/dist/runs/shared/worktree-contract.js +0 -1
- package/dist/runs/shared/worktree-hook.js +0 -138
- package/dist/runs/shared/worktree-location.js +0 -47
- package/dist/runs/shared/worktree-preservation.js +0 -8
- package/dist/runs/shared/worktree-process.js +0 -107
- package/dist/runs/shared/worktree.js +0 -386
- package/dist/shared/agent-context-policy.js +0 -116
- package/dist/shared/agent-dir.js +0 -14
- package/dist/shared/artifacts.js +0 -114
- package/dist/shared/atomic-json.js +0 -16
- package/dist/shared/chain-files.js +0 -72
- package/dist/shared/concurrency.js +0 -18
- package/dist/shared/content-preview.js +0 -115
- package/dist/shared/execution-cwd.js +0 -22
- package/dist/shared/file-coalescer.js +0 -22
- package/dist/shared/fork-context.js +0 -47
- package/dist/shared/formatters.js +0 -111
- package/dist/shared/journal-reader.js +0 -6
- package/dist/shared/lazy-tools.js +0 -43
- package/dist/shared/message-output.js +0 -116
- package/dist/shared/model-info.js +0 -85
- package/dist/shared/native-import.js +0 -20
- package/dist/shared/native-session-loader.js +0 -17
- package/dist/shared/native-session.js +0 -4
- package/dist/shared/native-tui.js +0 -23
- package/dist/shared/native-typebox.js +0 -32
- package/dist/shared/prompt-sections.js +0 -10
- package/dist/shared/session-entries.js +0 -87
- package/dist/shared/session-identity.js +0 -16
- package/dist/shared/settings.js +0 -121
- package/dist/shared/status-format.js +0 -171
- package/dist/shared/task-file-policy.js +0 -24
- package/dist/shared/temp-root.js +0 -143
- package/dist/shared/types/acceptance.js +0 -1
- package/dist/shared/types/async.js +0 -1
- package/dist/shared/types/config.js +0 -1
- package/dist/shared/types/details.js +0 -1
- package/dist/shared/types/history.js +0 -1
- package/dist/shared/types/inputs.js +0 -1
- package/dist/shared/types/intercom.js +0 -1
- package/dist/shared/types/launch.js +0 -1
- package/dist/shared/types/messages.js +0 -1
- package/dist/shared/types/nested.js +0 -1
- package/dist/shared/types/owned-runs.js +0 -1
- package/dist/shared/types/progress.js +0 -1
- package/dist/shared/types/questions.js +0 -1
- package/dist/shared/types/results.js +0 -1
- package/dist/shared/types/state.js +0 -1
- package/dist/shared/types/usage.js +0 -1
- package/dist/shared/types/workflow.js +0 -1
- package/dist/shared/ui-mode.js +0 -3
- package/dist/shared/utils.js +0 -128
- package/dist/slash/command-discovery.js +0 -83
- package/dist/slash/command-input.js +0 -190
- package/dist/slash/prompt-template-bridge.js +0 -122
- package/dist/slash/prompt-template-contract.js +0 -77
- package/dist/slash/prompt-template-results.js +0 -125
- package/dist/slash/request-protocol.js +0 -68
- package/dist/slash/result-delivery.js +0 -237
- package/dist/slash/saved-chain.js +0 -78
- package/dist/slash/slash-bridge.js +0 -150
- package/dist/slash/slash-commands.js +0 -136
- package/dist/slash/slash-live-state.js +0 -267
- package/dist/tui/action-hints.js +0 -103
- package/dist/tui/activity-lines.js +0 -32
- package/dist/tui/agent-browser.js +0 -290
- package/dist/tui/agent-controls.js +0 -289
- package/dist/tui/agent-conversation.js +0 -444
- package/dist/tui/agent-dock.js +0 -171
- package/dist/tui/agent-history.js +0 -50
- package/dist/tui/agent-model.js +0 -62
- package/dist/tui/agent-picker.js +0 -262
- package/dist/tui/agent-view.js +0 -350
- package/dist/tui/compact-results.js +0 -193
- package/dist/tui/conversation-details.js +0 -190
- package/dist/tui/conversation-frame.js +0 -135
- package/dist/tui/conversation-history.js +0 -210
- package/dist/tui/conversation-menu.js +0 -78
- package/dist/tui/conversation-notices.js +0 -79
- package/dist/tui/conversation-selection.js +0 -58
- package/dist/tui/conversation-viewport.js +0 -129
- package/dist/tui/direction-message.js +0 -27
- package/dist/tui/display.js +0 -282
- package/dist/tui/editor-viewport.js +0 -18
- package/dist/tui/expanded-content.js +0 -87
- package/dist/tui/expanded-multi.js +0 -170
- package/dist/tui/expanded-single.js +0 -65
- package/dist/tui/history-cards.js +0 -202
- package/dist/tui/history-display.js +0 -238
- package/dist/tui/history-json.js +0 -16
- package/dist/tui/history-metadata.js +0 -152
- package/dist/tui/history-record.js +0 -251
- package/dist/tui/history-text.js +0 -34
- package/dist/tui/indexed-history.js +0 -116
- package/dist/tui/nested-widget.js +0 -120
- package/dist/tui/picker-page.js +0 -59
- package/dist/tui/render.js +0 -72
- package/dist/tui/result-facts.js +0 -64
- package/dist/tui/task-observation.js +0 -59
- package/dist/tui/task-store.js +0 -366
- package/dist/tui/text-values.js +0 -16
- package/dist/tui/view-connections.js +0 -47
- package/dist/tui/view-model.js +0 -94
- package/dist/tui/view-persistence.js +0 -51
- package/dist/tui/view-ports.js +0 -1
- package/dist/tui/view-session.js +0 -37
- package/dist/tui/widget-details.js +0 -144
- package/dist/tui/widget-status.js +0 -245
- package/dist/tui/widget.js +0 -145
- package/dist/tui/workflow-labels.js +0 -223
- package/dist/tui/workflow-outcomes.js +0 -124
- package/generated/RunValidators.d.ts +0 -28
- package/generated/RunValidators.js +0 -2
- package/prompts/gather-context-and-clarify.md +0 -14
- package/prompts/parallel-cleanup.md +0 -65
- package/prompts/parallel-context-build.md +0 -59
- package/prompts/parallel-handoff-plan.md +0 -68
- package/prompts/parallel-research.md +0 -55
- package/prompts/parallel-review.md +0 -61
- package/prompts/review-loop.md +0 -44
- package/scripts/generate-run-schemas.mjs +0 -210
- package/skills/pi-intercom/evals/evals.json +0 -29
- package/skills/pi-intercom/evals/trigger-evals.json +0 -47
- package/skills/pi-intercom/references/peer-sessions.md +0 -74
- package/skills/pi-subagents/evals/evals.json +0 -29
- package/skills/pi-subagents/evals/trigger-evals.json +0 -42
- package/skills/pi-subagents/references/full-orchestration-guide.md +0 -1005
- package/src/agents/agent-defaults.ts +0 -13
- package/src/agents/agent-definition.ts +0 -253
- package/src/agents/agent-management.ts +0 -120
- package/src/agents/agent-scope.ts +0 -11
- package/src/agents/agent-selection.ts +0 -22
- package/src/agents/agent-serializer.ts +0 -90
- package/src/agents/agents.ts +0 -214
- package/src/agents/builtin-overrides.ts +0 -297
- package/src/agents/chain-serializer.ts +0 -3
- package/src/agents/config-values.ts +0 -57
- package/src/agents/discovery-paths.ts +0 -134
- package/src/agents/frontmatter.ts +0 -39
- package/src/agents/identity.ts +0 -61
- package/src/agents/json-chain.ts +0 -305
- package/src/agents/management-config.ts +0 -342
- package/src/agents/management-format.ts +0 -243
- package/src/agents/management-persistence.ts +0 -408
- package/src/agents/management-targets.ts +0 -260
- package/src/agents/management-warnings.ts +0 -115
- package/src/agents/markdown-chain.ts +0 -237
- package/src/agents/package-agents.ts +0 -231
- package/src/agents/skill-files.ts +0 -182
- package/src/agents/skill-search-paths.ts +0 -289
- package/src/agents/skill-types.ts +0 -31
- package/src/agents/skills.ts +0 -179
- package/src/extension/acceptance-schema.ts +0 -88
- package/src/extension/build-info.ts +0 -2
- package/src/extension/chain-schema.ts +0 -276
- package/src/extension/child-runtime.ts +0 -302
- package/src/extension/compact-tools.ts +0 -271
- package/src/extension/config-schema.ts +0 -59
- package/src/extension/config.ts +0 -45
- package/src/extension/control-notice-schema.ts +0 -55
- package/src/extension/control-notices.ts +0 -71
- package/src/extension/delegation-bridges.ts +0 -59
- package/src/extension/doctor.ts +0 -207
- package/src/extension/everyday-schemas.ts +0 -252
- package/src/extension/fanout-child.ts +0 -33
- package/src/extension/index.ts +0 -31
- package/src/extension/message-renderers.ts +0 -334
- package/src/extension/nested-control-inbox.ts +0 -196
- package/src/extension/parent-runtime.ts +0 -405
- package/src/extension/primary-tool.ts +0 -130
- package/src/extension/result-snapshot.ts +0 -9
- package/src/extension/runtime-reload.ts +0 -72
- package/src/extension/runtime-storage.ts +0 -49
- package/src/extension/schema-overrides.ts +0 -114
- package/src/extension/schemas.ts +0 -477
- package/src/extension/tool-input.ts +0 -46
- package/src/extension/tool-result.ts +0 -47
- package/src/history/answer-texts.ts +0 -74
- package/src/history/canonical-result.ts +0 -138
- package/src/history/canonical-selection.ts +0 -54
- package/src/history/database-generation.ts +0 -86
- package/src/history/database.ts +0 -97
- package/src/history/entry-ingestion.ts +0 -129
- package/src/history/index.ts +0 -434
- package/src/history/ingest.ts +0 -387
- package/src/history/output-digests.ts +0 -41
- package/src/history/preview.ts +0 -235
- package/src/history/prune.ts +0 -48
- package/src/history/queries.ts +0 -125
- package/src/history/query-scope.ts +0 -278
- package/src/history/rows.ts +0 -118
- package/src/history/run-projection.ts +0 -162
- package/src/history/run-queries.ts +0 -199
- package/src/history/schema.ts +0 -34
- package/src/history/search-queries.ts +0 -223
- package/src/history/selected-record.ts +0 -140
- package/src/history/source-file.ts +0 -51
- package/src/history/source-watches.ts +0 -156
- package/src/history/store.ts +0 -332
- package/src/history/text-chunks.ts +0 -186
- package/src/history/text.ts +0 -43
- package/src/history/transcript-queries.ts +0 -257
- package/src/history/types.ts +0 -29
- package/src/history/values.ts +0 -36
- package/src/history/wire-inputs.ts +0 -141
- package/src/history/wire-models.ts +0 -51
- package/src/history/worker-runtime.ts +0 -502
- package/src/history/worker.ts +0 -99
- package/src/intercom/intercom-bridge.ts +0 -190
- package/src/intercom/live-intercom.ts +0 -209
- package/src/intercom/nested-result-tree.ts +0 -213
- package/src/intercom/result-delivery.ts +0 -56
- package/src/intercom/result-intercom.ts +0 -308
- package/src/pi-intercom/bridge-ask.ts +0 -64
- package/src/pi-intercom/bridge-broadcast.ts +0 -70
- package/src/pi-intercom/bridge-catalog.ts +0 -489
- package/src/pi-intercom/bridge-control.ts +0 -179
- package/src/pi-intercom/bridge-groups.ts +0 -169
- package/src/pi-intercom/bridge-launch-journal.ts +0 -122
- package/src/pi-intercom/bridge-launch-policy.ts +0 -190
- package/src/pi-intercom/bridge-launch.ts +0 -506
- package/src/pi-intercom/bridge-operations.ts +0 -169
- package/src/pi-intercom/bridge-rpc-process.ts +0 -330
- package/src/pi-intercom/interview.ts +0 -295
- package/src/pi-intercom/native-control-auth.ts +0 -89
- package/src/pi-intercom/native-control-protocol.ts +0 -180
- package/src/pi-intercom/native-control.ts +0 -160
- package/src/pi-intercom/peer-awareness.ts +0 -84
- package/src/pi-intercom/saved-transcript.ts +0 -175
- package/src/pi-intercom/subagent-events.ts +0 -299
- package/src/pi-intercom/subagent-live-events.ts +0 -236
- package/src/pi-intercom/supervisor.ts +0 -362
- package/src/pi-intercom/topic-actions.ts +0 -243
- package/src/pi-intercom/topics.ts +0 -271
- package/src/pi-intercom/transcript.ts +0 -226
- package/src/pi-intercom/ui/compose-paste.ts +0 -109
- package/src/pi-intercom/ui/compose.ts +0 -305
- package/src/pi-intercom/ui/inline-message.ts +0 -110
- package/src/pi-intercom/ui/message-renderers.ts +0 -182
- package/src/pi-intercom/ui/overlay.ts +0 -238
- package/src/pi-intercom/ui/session-list.ts +0 -222
- package/src/pi-intercom/ui/tool-renderers.ts +0 -148
- package/src/pi-intercom/ui/topic-view.ts +0 -107
- package/src/runs/background/async-chain-plan.ts +0 -451
- package/src/runs/background/async-control.ts +0 -219
- package/src/runs/background/async-execution.ts +0 -227
- package/src/runs/background/async-job-admission.ts +0 -54
- package/src/runs/background/async-job-projection.ts +0 -225
- package/src/runs/background/async-job-tracker.ts +0 -441
- package/src/runs/background/async-launch.ts +0 -319
- package/src/runs/background/async-plan.ts +0 -285
- package/src/runs/background/async-result-file.ts +0 -104
- package/src/runs/background/async-resume.ts +0 -386
- package/src/runs/background/async-run-discovery.ts +0 -264
- package/src/runs/background/async-run-location.ts +0 -194
- package/src/runs/background/async-run-record.ts +0 -14
- package/src/runs/background/async-run-repair.ts +0 -307
- package/src/runs/background/async-run-summary.ts +0 -71
- package/src/runs/background/async-single-plan.ts +0 -168
- package/src/runs/background/async-status-projection.ts +0 -188
- package/src/runs/background/async-status-render.ts +0 -164
- package/src/runs/background/async-status-validation.ts +0 -238
- package/src/runs/background/async-status.ts +0 -9
- package/src/runs/background/async-value.ts +0 -29
- package/src/runs/background/completion-dedupe.ts +0 -65
- package/src/runs/background/completion-delivery.ts +0 -321
- package/src/runs/background/completion-receipts.ts +0 -309
- package/src/runs/background/legacy-status-acceptance.ts +0 -38
- package/src/runs/background/notify.ts +0 -174
- package/src/runs/background/parallel-groups.ts +0 -102
- package/src/runs/background/result-payload.ts +0 -268
- package/src/runs/background/result-watcher.ts +0 -520
- package/src/runs/background/run-id-resolver.ts +0 -138
- package/src/runs/background/run-schemas.ts +0 -240
- package/src/runs/background/run-status-contracts.ts +0 -46
- package/src/runs/background/run-status-render.ts +0 -364
- package/src/runs/background/run-status.ts +0 -366
- package/src/runs/background/runner-attempt-output.ts +0 -281
- package/src/runs/background/runner-attempt.ts +0 -354
- package/src/runs/background/runner-child-executor.ts +0 -232
- package/src/runs/background/runner-child-observer.ts +0 -278
- package/src/runs/background/runner-completion-summary.ts +0 -106
- package/src/runs/background/runner-completion.ts +0 -274
- package/src/runs/background/runner-config.ts +0 -52
- package/src/runs/background/runner-contract.ts +0 -51
- package/src/runs/background/runner-dynamic.ts +0 -185
- package/src/runs/background/runner-finalization.ts +0 -203
- package/src/runs/background/runner-graph.ts +0 -91
- package/src/runs/background/runner-initial-status.ts +0 -72
- package/src/runs/background/runner-lifecycle.ts +0 -159
- package/src/runs/background/runner-monitor.ts +0 -401
- package/src/runs/background/runner-parallel.ts +0 -279
- package/src/runs/background/runner-prepare-step.ts +0 -128
- package/src/runs/background/runner-reporting.ts +0 -192
- package/src/runs/background/runner-status.ts +0 -220
- package/src/runs/background/runner-step-output.ts +0 -156
- package/src/runs/background/runner-step-record.ts +0 -76
- package/src/runs/background/runner-step.ts +0 -150
- package/src/runs/background/runner-streaming.ts +0 -220
- package/src/runs/background/runner-workflow.ts +0 -284
- package/src/runs/background/stale-run-reconciler.ts +0 -312
- package/src/runs/background/subagent-runner-launcher.ts +0 -88
- package/src/runs/background/subagent-runner.ts +0 -85
- package/src/runs/background/top-level-async.ts +0 -15
- package/src/runs/foreground/chain-clarify.ts +0 -505
- package/src/runs/foreground/clarification-draft.ts +0 -92
- package/src/runs/foreground/clarify-contracts.ts +0 -33
- package/src/runs/foreground/clarify-invocation.ts +0 -204
- package/src/runs/foreground/clarify-text-editor.ts +0 -229
- package/src/runs/foreground/clarify-view.ts +0 -222
- package/src/runs/foreground/execution-input.ts +0 -401
- package/src/runs/foreground/execution-routing.ts +0 -41
- package/src/runs/foreground/execution-timeout.ts +0 -92
- package/src/runs/foreground/foreground-control.ts +0 -342
- package/src/runs/foreground/foreground-memory.ts +0 -132
- package/src/runs/foreground/invocation-context.ts +0 -88
- package/src/runs/foreground/invocation-execution.ts +0 -465
- package/src/runs/foreground/invocation-expansion.ts +0 -58
- package/src/runs/foreground/management-actions.ts +0 -360
- package/src/runs/foreground/nested-control.ts +0 -248
- package/src/runs/foreground/question-continuation.ts +0 -112
- package/src/runs/foreground/question-control.ts +0 -309
- package/src/runs/foreground/resume-target.ts +0 -330
- package/src/runs/foreground/revival-launch-policy.ts +0 -112
- package/src/runs/foreground/run-async-path.ts +0 -327
- package/src/runs/foreground/run-interrupt.ts +0 -202
- package/src/runs/foreground/run-nudge.ts +0 -355
- package/src/runs/foreground/saved-revival.ts +0 -356
- package/src/runs/foreground/subagent-executor.ts +0 -203
- package/src/runs/foreground/subagent-params.ts +0 -392
- package/src/runs/foreground/wait-observation.ts +0 -160
- package/src/runs/foreground/wait-registration.ts +0 -18
- package/src/runs/foreground/wait-run.ts +0 -366
- package/src/runs/shared/acceptance-contract.ts +0 -458
- package/src/runs/shared/acceptance-defaults.ts +0 -1
- package/src/runs/shared/acceptance-evaluation.ts +0 -349
- package/src/runs/shared/acceptance-finalization.ts +0 -495
- package/src/runs/shared/acceptance-outcome.ts +0 -69
- package/src/runs/shared/acceptance-reports.ts +0 -246
- package/src/runs/shared/acceptance-submission.ts +0 -251
- package/src/runs/shared/acceptance-verification.ts +0 -118
- package/src/runs/shared/acceptance.ts +0 -31
- package/src/runs/shared/chain-outputs.ts +0 -206
- package/src/runs/shared/child-attempt-types.ts +0 -118
- package/src/runs/shared/child-attempt.ts +0 -387
- package/src/runs/shared/child-boundaries.ts +0 -217
- package/src/runs/shared/child-context-filter.ts +0 -53
- package/src/runs/shared/child-event-observer.ts +0 -496
- package/src/runs/shared/child-execution-cwd.ts +0 -162
- package/src/runs/shared/child-execution-outcome.ts +0 -103
- package/src/runs/shared/child-invocation.ts +0 -74
- package/src/runs/shared/child-message-validation.ts +0 -233
- package/src/runs/shared/child-native-accounting.ts +0 -154
- package/src/runs/shared/child-native-observation.ts +0 -79
- package/src/runs/shared/child-observation-spool.ts +0 -193
- package/src/runs/shared/child-observations.ts +0 -229
- package/src/runs/shared/child-presence.ts +0 -6
- package/src/runs/shared/child-route-env.ts +0 -142
- package/src/runs/shared/child-stream-observer.ts +0 -302
- package/src/runs/shared/child-stream-projection.ts +0 -160
- package/src/runs/shared/child-structured-tool.ts +0 -38
- package/src/runs/shared/claude-code.ts +0 -216
- package/src/runs/shared/claude-model.ts +0 -67
- package/src/runs/shared/claude-session.ts +0 -124
- package/src/runs/shared/claude-types.ts +0 -31
- package/src/runs/shared/completion-guard.ts +0 -44
- package/src/runs/shared/control-event-policy.ts +0 -15
- package/src/runs/shared/control-notification-owner.ts +0 -20
- package/src/runs/shared/dynamic-fanout.ts +0 -459
- package/src/runs/shared/dynamic-item.ts +0 -114
- package/src/runs/shared/history-index.ts +0 -130
- package/src/runs/shared/legacy-async-recovery.ts +0 -153
- package/src/runs/shared/legacy-output-recovery.ts +0 -214
- package/src/runs/shared/mcp-config-schema.ts +0 -46
- package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -465
- package/src/runs/shared/model-fallback.ts +0 -344
- package/src/runs/shared/mutating-tool-guard.ts +0 -295
- package/src/runs/shared/native-finalization-types.ts +0 -29
- package/src/runs/shared/native-finalization.ts +0 -252
- package/src/runs/shared/native-usage.ts +0 -396
- package/src/runs/shared/nested-control-records.ts +0 -178
- package/src/runs/shared/nested-events.ts +0 -45
- package/src/runs/shared/nested-path.ts +0 -65
- package/src/runs/shared/nested-projection.ts +0 -230
- package/src/runs/shared/nested-protocol.ts +0 -67
- package/src/runs/shared/nested-registry.ts +0 -273
- package/src/runs/shared/nested-render.ts +0 -217
- package/src/runs/shared/nested-route.ts +0 -292
- package/src/runs/shared/nested-validation.ts +0 -291
- package/src/runs/shared/owned-child-evidence.ts +0 -184
- package/src/runs/shared/owned-run-list.ts +0 -187
- package/src/runs/shared/owned-run-observation.ts +0 -368
- package/src/runs/shared/owned-run-progress.ts +0 -172
- package/src/runs/shared/owned-run-read-state.ts +0 -7
- package/src/runs/shared/owned-run-results.ts +0 -289
- package/src/runs/shared/owned-run-status.ts +0 -239
- package/src/runs/shared/owned-run-view.ts +0 -65
- package/src/runs/shared/owned-workflow-details.ts +0 -24
- package/src/runs/shared/owner-output.ts +0 -73
- package/src/runs/shared/parallel-utils.ts +0 -93
- package/src/runs/shared/parent-receipts.ts +0 -186
- package/src/runs/shared/parent-usage.ts +0 -344
- package/src/runs/shared/pi-args.ts +0 -280
- package/src/runs/shared/pi-launch-input.ts +0 -48
- package/src/runs/shared/pi-session-launch.ts +0 -94
- package/src/runs/shared/pi-spawn.ts +0 -76
- package/src/runs/shared/run-history-queries.ts +0 -195
- package/src/runs/shared/run-history.ts +0 -221
- package/src/runs/shared/run-id-ambiguity.ts +0 -8
- package/src/runs/shared/run-metadata-paths.ts +0 -17
- package/src/runs/shared/run-metadata.ts +0 -240
- package/src/runs/shared/run-persistence.ts +0 -181
- package/src/runs/shared/run-records.ts +0 -19
- package/src/runs/shared/run-restoration.ts +0 -455
- package/src/runs/shared/run-state-owner.ts +0 -31
- package/src/runs/shared/session-cwd-preload.ts +0 -47
- package/src/runs/shared/single-output.ts +0 -416
- package/src/runs/shared/stable-value.ts +0 -15
- package/src/runs/shared/streaming-text.ts +0 -45
- package/src/runs/shared/structured-output.ts +0 -98
- package/src/runs/shared/subagent-control.ts +0 -352
- package/src/runs/shared/subagent-prompt-runtime.ts +0 -119
- package/src/runs/shared/subagent-tool-loop-guard.ts +0 -139
- package/src/runs/shared/supervisor-question-state.ts +0 -221
- package/src/runs/shared/supervisor-questions.ts +0 -410
- package/src/runs/shared/workflow-graph.ts +0 -422
- package/src/runs/shared/workflow-policy.ts +0 -260
- package/src/runs/shared/worktree-contract.ts +0 -29
- package/src/runs/shared/worktree-hook.ts +0 -181
- package/src/runs/shared/worktree-location.ts +0 -61
- package/src/runs/shared/worktree-preservation.ts +0 -10
- package/src/runs/shared/worktree-process.ts +0 -132
- package/src/runs/shared/worktree.ts +0 -507
- package/src/shared/agent-context-policy.ts +0 -215
- package/src/shared/agent-dir.ts +0 -15
- package/src/shared/artifacts.ts +0 -126
- package/src/shared/atomic-json.ts +0 -19
- package/src/shared/chain-files.ts +0 -72
- package/src/shared/concurrency.ts +0 -27
- package/src/shared/content-preview.ts +0 -117
- package/src/shared/execution-cwd.ts +0 -39
- package/src/shared/file-coalescer.ts +0 -31
- package/src/shared/fork-context.ts +0 -72
- package/src/shared/formatters.ts +0 -125
- package/src/shared/journal-reader.ts +0 -18
- package/src/shared/lazy-tools.ts +0 -85
- package/src/shared/message-output.ts +0 -146
- package/src/shared/model-info.ts +0 -117
- package/src/shared/native-import.ts +0 -25
- package/src/shared/native-session-loader.ts +0 -13
- package/src/shared/native-session.ts +0 -6
- package/src/shared/native-tui.ts +0 -20
- package/src/shared/native-typebox.ts +0 -29
- package/src/shared/prompt-sections.ts +0 -16
- package/src/shared/session-entries.ts +0 -108
- package/src/shared/session-identity.ts +0 -25
- package/src/shared/settings.ts +0 -196
- package/src/shared/status-format.ts +0 -232
- package/src/shared/stream-json.d.ts +0 -10
- package/src/shared/task-file-policy.ts +0 -35
- package/src/shared/temp-root.ts +0 -158
- package/src/shared/types/acceptance.ts +0 -149
- package/src/shared/types/async.ts +0 -247
- package/src/shared/types/config.ts +0 -139
- package/src/shared/types/details.ts +0 -104
- package/src/shared/types/history.ts +0 -217
- package/src/shared/types/inputs.ts +0 -4
- package/src/shared/types/intercom.ts +0 -57
- package/src/shared/types/launch.ts +0 -39
- package/src/shared/types/messages.ts +0 -104
- package/src/shared/types/nested.ts +0 -153
- package/src/shared/types/owned-runs.ts +0 -148
- package/src/shared/types/progress.ts +0 -106
- package/src/shared/types/questions.ts +0 -103
- package/src/shared/types/results.ts +0 -119
- package/src/shared/types/state.ts +0 -56
- package/src/shared/types/usage.ts +0 -36
- package/src/shared/types/workflow.ts +0 -187
- package/src/shared/ui-mode.ts +0 -5
- package/src/shared/utils.ts +0 -148
- package/src/slash/command-discovery.ts +0 -110
- package/src/slash/command-input.ts +0 -232
- package/src/slash/prompt-template-bridge.ts +0 -161
- package/src/slash/prompt-template-contract.ts +0 -152
- package/src/slash/prompt-template-results.ts +0 -189
- package/src/slash/request-protocol.ts +0 -87
- package/src/slash/result-delivery.ts +0 -312
- package/src/slash/saved-chain.ts +0 -115
- package/src/slash/slash-bridge.ts +0 -224
- package/src/slash/slash-commands.ts +0 -195
- package/src/slash/slash-live-state.ts +0 -350
- package/src/tui/action-hints.ts +0 -155
- package/src/tui/activity-lines.ts +0 -40
- package/src/tui/agent-browser.ts +0 -354
- package/src/tui/agent-controls.ts +0 -355
- package/src/tui/agent-conversation.ts +0 -514
- package/src/tui/agent-dock.ts +0 -250
- package/src/tui/agent-history.ts +0 -68
- package/src/tui/agent-model.ts +0 -78
- package/src/tui/agent-picker.ts +0 -325
- package/src/tui/agent-view.ts +0 -403
- package/src/tui/compact-results.ts +0 -342
- package/src/tui/conversation-details.ts +0 -206
- package/src/tui/conversation-frame.ts +0 -184
- package/src/tui/conversation-history.ts +0 -260
- package/src/tui/conversation-menu.ts +0 -119
- package/src/tui/conversation-notices.ts +0 -116
- package/src/tui/conversation-selection.ts +0 -66
- package/src/tui/conversation-viewport.ts +0 -169
- package/src/tui/direction-message.ts +0 -35
- package/src/tui/display.ts +0 -409
- package/src/tui/editor-viewport.ts +0 -19
- package/src/tui/expanded-content.ts +0 -134
- package/src/tui/expanded-multi.ts +0 -264
- package/src/tui/expanded-single.ts +0 -92
- package/src/tui/history-cards.ts +0 -298
- package/src/tui/history-display.ts +0 -334
- package/src/tui/history-json.ts +0 -17
- package/src/tui/history-metadata.ts +0 -177
- package/src/tui/history-record.ts +0 -321
- package/src/tui/history-text.ts +0 -34
- package/src/tui/indexed-history.ts +0 -149
- package/src/tui/nested-widget.ts +0 -192
- package/src/tui/picker-page.ts +0 -80
- package/src/tui/render.ts +0 -104
- package/src/tui/result-facts.ts +0 -99
- package/src/tui/task-observation.ts +0 -96
- package/src/tui/task-store.ts +0 -432
- package/src/tui/text-values.ts +0 -20
- package/src/tui/view-connections.ts +0 -64
- package/src/tui/view-model.ts +0 -181
- package/src/tui/view-persistence.ts +0 -57
- package/src/tui/view-ports.ts +0 -55
- package/src/tui/view-session.ts +0 -42
- package/src/tui/widget-details.ts +0 -220
- package/src/tui/widget-status.ts +0 -331
- package/src/tui/widget.ts +0 -208
- package/src/tui/workflow-labels.ts +0 -340
- package/src/tui/workflow-outcomes.ts +0 -150
package/docs/intercom.md
CHANGED
|
@@ -1,611 +1,380 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Local agent communication
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`intercom` is always available with the package. There is no `load_intercom`,
|
|
4
|
+
child-only supervisor tool, peer overlay, topic registry, or separate extension
|
|
5
|
+
to install. Ordinary and delegated sessions use the same messaging tool.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
Your agents: Option+Shift+M (Alt+Shift+M) or /agents. Other peers: /intercom [all]. Quiet current state: /intercom topics.
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Why
|
|
10
|
-
|
|
11
|
-
Sometimes you're running multiple pi sessions — one researching, one executing, one reviewing. Pi-intercom lets you:
|
|
12
|
-
|
|
13
|
-
- **User-driven orchestration** — Send context or findings from your research session to your execution session
|
|
14
|
-
- **Agent collaboration** — An agent can reach out to another session when it needs help or wants to share results
|
|
15
|
-
- **Session awareness** — See what other pi sessions are running and their current status
|
|
16
|
-
|
|
17
|
-
Intercom sends direct messages to the session you choose.
|
|
18
|
-
|
|
19
|
-
Intercom is bundled with `pi-subagents`: delegated child agents get a child-only `contact_supervisor` tool when the subagent extension supplies bridge metadata. Use blocking `need_decision` or `interview_request` only when the ephemeral child cannot safely continue and must remain alive for the reply. Use `progress_update` only for a discovery or change the supervisor needs while working. It steers at the next tool boundary; skip starts, redundant narration, and routine completion, and retain material findings in the final result. Fresh normal sessions see `load_intercom`, a small entry that enables the full `intercom` tool without sending or checking anything.
|
|
20
|
-
|
|
21
|
-
The broker, presence, receipts and keyboard UI stay active while the model schema is hidden. Call `load_intercom({})` for explicit peer checks, messaging or topics. Actionable peer inbound and recovered reply obligations enable `intercom` before model delivery; mere presence, passive breadcrumbs, routine synthetic child notices, and human-origin messages answered in chat do not. Managed-child `contact_supervisor` remains eager. If an explicit tool policy permits only `intercom` without its loader, it stays eager; excluded tools never reactivate. Selection follows native session/branch declarations and stays stable between turns.
|
|
22
|
-
|
|
23
|
-
## In One Minute
|
|
24
|
-
|
|
25
|
-
Each Pi session with the bundled intercom extension loaded connects to a tiny local broker over a local IPC transport. The broker keeps track of connected sessions and routes direct messages to the one you target by name or session ID. The extension gives you both a tool (`intercom`) and a small peer overlay (`/intercom`); Option+Shift+M (Alt+Shift+M) toggles owned agent conversations when `pi-subagents` is loaded. Messages that do not request a reply default to steer: they wake idle recipients and reach active recipients after the current tool call. Important steers release portable subagent waits without stopping the owner or child. Background calls return immediate receipts, with completion delivered later as a separate wake-up message. Foreground waits return saved results or durable questions and release for important Intercom attention without stopping existing work. Explicit queue waits behind active work, and passive delivery is a discouraged opt-in for human-visible breadcrumbs only. Quiet topic state uses native custom entries outside model context, not passive messages.
|
|
26
|
-
|
|
27
|
-
## Install
|
|
28
|
-
|
|
29
|
-
Intercom requires Pi **1.0.0** and Node **24.21.0** or later. No Pi fork is required.
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
pi install npm:@fitchmultz/pi-subagents
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Install from Git:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
pi install git:github.com/fitchmultz/pi-subagents
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
That one package includes both extension entries and both skills. For a local checkout, follow the [runtime-only install and rebuild recipe](reference.md#installation): run `npm install --omit=dev` before registering or loading it, including after development validation. Before rebuilding or updating an in-use Pi checkout or extension, checkpoint work and fully quit every Pi session using that installation. Update from a separate terminal, then restart Pi and resume the same saved parent session to retain ownership and pending coordination. `/reload` refreshes supported settings, skills, and prompts but is not a reliable code-update boundary.
|
|
42
|
-
|
|
43
|
-
To restart the shared broker too, close every Pi session using the same agent directory and wait at least five seconds before reopening Pi.
|
|
44
|
-
|
|
45
|
-
## Development
|
|
46
|
-
|
|
47
|
-
Follow the [local validation instructions](development.md#local-validation). Keep retained/cleared custom-queue, rejected-input and pre-admission preparation regressions intact and report results for the exact selected host; earlier published Pi 0.87.1 failures are historical evidence, not current 1.0 certification.
|
|
48
|
-
|
|
49
|
-
`ci` runs typechecking, package and install smokes, and the full subagent/intercom test suite. The native intercom regression uses real SDK sessions, a controlled provider, and private runtime directories without credentials or model-service calls. To run just that regression:
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
PI_INTERCOM_TEST_SDK=/path/to/pi/packages/coding-agent node --test test/integration/pi-intercom-native-replay.test.ts
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
The real-Pi smoke installs the single checkout into an isolated temporary Pi home, verifies `pi list`, and loads both bundled extension entries. Use direct `node` with the intended CLI first on `PATH`:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
export PATH="$PWD/node_modules/.bin:$PATH"
|
|
59
|
-
node scripts/real-pi-smoke.mjs
|
|
60
|
-
PI_REAL_SMOKE_MODEL=openai/gpt-6-astra node scripts/real-pi-smoke.mjs --llm
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
The `--llm` mode copies local `auth.json` and `models.json` into the isolated Pi agent dir. Set `PI_REAL_SMOKE_AUTH_AGENT_DIR` if your auth files are not in `~/.pi/agent`.
|
|
7
|
+
## Discovery and groups
|
|
64
8
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
A session becomes intercom-connected when all of these are true:
|
|
68
|
-
|
|
69
|
-
- the bundled intercom extension is enabled through `pi config`
|
|
70
|
-
- the session has been restarted after the extension was installed or updated
|
|
71
|
-
- the local broker is running or can be auto-started
|
|
72
|
-
|
|
73
|
-
The session list only shows intercom-connected sessions, not every open Pi process on the machine. Reconnecting the same Pi session reuses a stable broker identity, so transient broker or extension restarts do not create a second logical sender.
|
|
74
|
-
|
|
75
|
-
If a session is unnamed, pi-intercom now exposes a runtime-only fallback alias like `subagent-chat-1a2b3c4d` so other sessions can still target it. That alias is not persisted as the Pi session title, so `pi --resume` can keep showing the transcript snippet instead of a generic `session-...` name.
|
|
76
|
-
|
|
77
|
-
## Quick Start
|
|
78
|
-
|
|
79
|
-
### From the Keyboard
|
|
80
|
-
|
|
81
|
-
With `pi-subagents`, **Option+Shift+M** (**Alt+Shift+M**) opens your task-labelled agent conversations first; press it again to close. The shortcut is configurable below. In native fullscreen mode, clicking the **Agents** entrance again also closes the open view. See [the agent-view controls](reference.md#try-this-first) for direct human messaging, context replies, saved drafts, unread history, pinning, selected-child stop and explicit continuation. The plain `/intercom` command remains the current-project peer list. Type `/intercom all` to include sessions in other projects:
|
|
82
|
-
|
|
83
|
-
1. **Select a session** — Use arrow keys to pick a target session
|
|
84
|
-
2. **Compose message** — Write your message in the compose overlay. Pasted multiline handoffs are preserved.
|
|
85
|
-
3. **Choose mode** — Press Tab to toggle between Send and Request Reply mode. Request Reply marks the message as needing a reply and adds the recipient reply hint; the overlay itself does not wait for or collect that reply.
|
|
86
|
-
4. **Send** — Press Enter to send, Escape to cancel
|
|
87
|
-
|
|
88
|
-
### Quiet topics and resource owners
|
|
89
|
-
|
|
90
|
-
Subscribe explicitly to an exact topic; there are no automatic subscriptions or wildcard broadcasts. Topics span connected local sessions, so use a project/resource-specific name unless cross-project coordination is intended. Publications are self-contained latest state, not deltas. Each sender has one current record per topic; older queued versions cannot replace a newer record. Same-session subscriptions, publications and received records use native session entries. Late subscribers read current published state without replaying earlier interruptions.
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
intercom({ action: "subscribe", topic: "browser/shared-profile/tab-4", awaitRelease: true });
|
|
94
|
-
intercom({
|
|
95
|
-
action: "publish",
|
|
96
|
-
topic: "browser/shared-profile/tab-4",
|
|
97
|
-
resource: "tab-4",
|
|
98
|
-
ownership: "held",
|
|
99
|
-
message: "Reviewing the sign-in flow; keep this tab open.",
|
|
100
|
-
});
|
|
101
|
-
intercom({ action: "topics", topic: "browser/shared-profile/tab-4" });
|
|
102
|
-
intercom({
|
|
103
|
-
action: "publish",
|
|
104
|
-
topic: "browser/shared-profile/tab-4",
|
|
105
|
-
event: "release",
|
|
106
|
-
resource: "tab-4",
|
|
107
|
-
ownership: "released",
|
|
108
|
-
message: "Sign-in check complete; this tab is available.",
|
|
109
|
-
});
|
|
110
|
-
intercom({ action: "unsubscribe", topic: "browser/shared-profile/tab-4" });
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Routine `event: "update"` publications replace quiet inspectable state; they do not become passive conversation messages or wake a model. Inspect current records and declared resource ownership in **`/intercom topics`** or `intercom({ action: "topics" })`; topic state does not appear in the footer. Ownership is advisory, not an exclusive lock; disconnect means **unavailable/disconnected**, never an implied release.
|
|
114
|
-
|
|
115
|
-
`event: "blocker"` and `event: "decision"` steer subscribed sessions. An explicit `event: "release"` interrupts only subscriptions with `awaitRelease: true`; other subscribers get the quiet record. Direct messages, answers and stop acknowledgements bypass topic subscriptions. Keep routine status and browser handoff prose here rather than repeatedly sending it into conversations. The native raw entries remain available as history, but old topic records are not replayed as new work.
|
|
116
|
-
|
|
117
|
-
Topics require an updated broker. If an older broker is still serving open sessions, topic actions report that they are unavailable; ordinary messaging and active work stay untouched. Let those sessions close normally. Once the old broker exits, reconnect with the updated package and retry. No broker or active session is stopped or restarted to enable topics.
|
|
118
|
-
|
|
119
|
-
### From the Agent
|
|
120
|
-
|
|
121
|
-
The agent can list sessions and send messages using the `intercom` tool. Tool calls and results render as compact transcript rows so send/ask/reply flows are easy to scan. Successful `list` results show only the session count by default in the TUI; press Ctrl+O (or the configured tool-expansion key) to show the full list. For common patterns like planner-worker delegation, the bundled `pi-intercom` skill provides copy-paste ready examples:
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
// Enable the peer tool if it is not already available
|
|
125
|
-
load_intercom({});
|
|
126
|
-
// List connected sessions in this repository and its worktrees
|
|
9
|
+
```js
|
|
127
10
|
intercom({ action: "list" });
|
|
128
|
-
|
|
129
|
-
// → • executor (20d43841) — ~/projects/api (claude-sonnet-4) [self, idle, state:idle, accepts_asks:true, pending_asks:0, last_intercom_activity:none]
|
|
130
|
-
// → ↳ self target unavailable; choose a peer from Other sessions; use pending/reply for inbound asks
|
|
131
|
-
// → **Other sessions:**
|
|
132
|
-
// → • research (6332faab) — ~/projects/api (claude-sonnet-4) [same cwd, thinking, state:busy, accepts_asks:false, pending_asks:1, last_intercom_activity:2m ago]
|
|
133
|
-
// → ↳ send defaults to steer; ask only if sender must stay alive for a required reply (default sends without waiting when peer is busy); queue only for intentional delay; passive discouraged
|
|
134
|
-
|
|
135
|
-
// Intentionally discover sessions in other projects
|
|
136
|
-
intercom({ action: "list", scope: "all" });
|
|
137
|
-
|
|
138
|
-
// Send live guidance without blocking this long-lived session; send defaults to steer
|
|
139
|
-
intercom({
|
|
140
|
-
action: "send",
|
|
141
|
-
to: "research",
|
|
142
|
-
message: "Check if UserService.validate() handles null. Send the finding back.",
|
|
143
|
-
});
|
|
144
|
-
// → Message sent to research. This session can end its turn or continue independent work.
|
|
145
|
-
|
|
146
|
-
// Check connection status and the same live recipient guidance
|
|
11
|
+
intercom({ action: "list", scope: "project" });
|
|
147
12
|
intercom({ action: "status" });
|
|
148
|
-
// → Connected: Yes, Session ID: abc123, Active sessions: 3
|
|
149
|
-
// → Current session and other-session rows follow.
|
|
150
|
-
|
|
151
|
-
// Send with attachments (code snippets, files, or context)
|
|
152
|
-
intercom({
|
|
153
|
-
action: "send",
|
|
154
|
-
to: "worker",
|
|
155
|
-
message: "Here's the fix:",
|
|
156
|
-
attachments: [
|
|
157
|
-
{
|
|
158
|
-
type: "snippet",
|
|
159
|
-
name: "auth.ts",
|
|
160
|
-
language: "typescript",
|
|
161
|
-
content: "function validate(user: User) { ... }",
|
|
162
|
-
},
|
|
163
|
-
],
|
|
164
|
-
});
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Receiving Messages
|
|
168
|
-
|
|
169
|
-
With native [compact view](reference.md#compact-view) enabled, ordinary incoming messages use one content row plus Pi's blank line. In native fullscreen mode, click a collapsed row to reveal its full message and attachments; click it again to collapse. Ctrl+O (or the configured tool-expansion key) still expands all messages. Questions, reply guidance, and needs-attention notices stay prominent. The mode defaults off and does not change delivery or model-visible content.
|
|
170
|
-
|
|
171
|
-
When a message arrives, it appears inline in your chat with the sender's info. The cwd label is the sender's **Native session cwd**, not proof of a command's physical directory. Messages sent with `ask` include a reply hint:
|
|
172
|
-
|
|
173
|
-
```
|
|
174
|
-
**From research** (Native session cwd: ~/projects/api)
|
|
175
|
-
|
|
176
|
-
To reply, use the intercom tool: intercom({ action: "reply", message: "..." })
|
|
177
|
-
|
|
178
|
-
Found the issue — UserService.validate() doesn't check for null input.
|
|
179
|
-
See auth.ts:142-156.
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
The reply hint (enabled by default) points to `intercom({ action: "reply", ... })`, so recipients do not need raw sender or `replyTo` IDs. `send` and `reply` default to steer: they wake an idle recipient or reach a busy recipient at the next tool boundary.
|
|
183
|
-
|
|
184
|
-
If Esc clears a steered or follow-up message before native handoff, it is re-delivered after the actual agent run settles. Messages already in Pi's session history are not reinserted, even after compaction or reload; messages still in Pi's native queues remain there for its next continuation or prompt. Pi 1.0's turn-boundary pending messages expose the next queued batch, not the whole custom queue; its coarse `hasPendingMessages()` reports only UI text queues. An empty boundary proves all queues cleared, while a nonempty boundary retains admitted messages until their actual history receipts arrive. Selectively removing individual custom items while other queue items remain is not observable through these public APIs: such items remain pending rather than risk a duplicate. Full queue clearing, retained-queue abort, reload and fresh-process recovery are supported. A rejected overlapping prompt does not start receiver retries while the original run is active.
|
|
185
|
-
|
|
186
|
-
Official Pi 1.1.0 runs user preparation hooks before marking a prompt busy. During that pre-admission window, an incoming custom message can legitimately start a separate model request; custom-triggered runs do not run `before_agent_start`. Both inputs and their receipts are preserved, but one combined request is not guaranteed.
|
|
187
|
-
|
|
188
|
-
Newer hosts with discriminated `before_agent_start` events also prepare custom-triggered runs, including Intercom and background-command wakeups. A user event has `messageType:"user"` and `prompt`; a custom event has `messageType:"custom"` and `message`, without `prompt`. These hosts mark preparation busy, so Intercom steers arrivals into the starting run instead of launching a separate run. Native steering determines when queued content reaches the model; both inputs and their receipts remain preserved exactly once. Child role/output and peer-awareness sections apply to custom starts without treating notification content as user commands.
|
|
189
|
-
|
|
190
|
-
Intercom follows the host's live idle state; it does not reserve rejected input or emulate a core admission hook. Reload also does not cancel active work: abort explicitly when cancellation is intended.
|
|
191
|
-
|
|
192
|
-
An omitted `ask` still honors recipient availability; use explicit steer only when the sender must remain alive for a busy recipient's reply. The recipient should incorporate relevant context and continue its active task unless the message explicitly replaces it. Use `delivery:"queue"` only when delay is intentional; `queueMode:"replace"` keeps only the latest undelivered thread update.
|
|
193
|
-
|
|
194
|
-
Old queued subagent progress is discarded from pending delivery when its exact generated thread and sender match a proven finished child. Its original checkpoint stays in saved history, but it does not trigger another turn or late notification. Actual final results remain available as completed work. The association survives reload; detached siblings, live successors, unmatched peers, questions, answers, and unrelated explicit queues are unchanged.
|
|
195
|
-
|
|
196
|
-
Pending delivery is checkpointed in the saved Pi session before native handoff. Reloading, or resuming that same saved session in a fresh process, restores undelivered messages, including lost native queues, and the latest unsuperseded milestones once; a fork or new session does not adopt them. Resuming again does not replay consumed messages, and passive-only recovery does not start a model turn. Accepted pending messages have no fixed-count backlog cap or age-based expiry. Ordinary peer asks still use the configured reply timeout. Attachment content is included in the agent-visible body and stored in Pi session history. Only passive `send` renders without waking the recipient model.
|
|
197
|
-
|
|
198
|
-
## Workflow: Planner-Worker Coordination
|
|
199
|
-
|
|
200
|
-
The most natural use of pi-intercom is splitting a task between two sessions — one holds the big picture, the other does the hands-on work. When the worker hits an ambiguity, it steers the planner without losing context or blocking its long-lived session.
|
|
201
|
-
|
|
202
|
-
### Setup
|
|
203
|
-
|
|
204
|
-
Open two terminals and start pi in each. Name them so they can find each other:
|
|
205
|
-
|
|
206
|
-
```
|
|
207
|
-
# Terminal 1 # Terminal 2
|
|
208
|
-
/name planner /name worker
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
Verify they see each other from either session:
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
intercom({ action: "list" });
|
|
215
|
-
// → • worker — ~/projects/api (claude-sonnet-4) [idle]
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### The Conversation
|
|
219
|
-
|
|
220
|
-
Long-lived Pi sessions normally coordinate without blocking each other. The sender uses `send`, which steers by default, and ends its turn or continues independent work. The recipient sees the message at its next tool boundary, incorporates relevant context, continues the active task, and sends any answer back with steer. A steer supplements the task unless it explicitly says to replace it.
|
|
221
|
-
|
|
222
|
-
**Planner delegates work:**
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
intercom({
|
|
226
|
-
action: "send",
|
|
227
|
-
to: "worker",
|
|
228
|
-
delivery: "steer",
|
|
229
|
-
message: "Task-3: Add retry logic to API client. Key files: src/api/client.ts, src/api/types.ts.",
|
|
230
|
-
});
|
|
231
13
|
```
|
|
232
14
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
15
|
+
Default discovery includes every eligible connected session under the same OS
|
|
16
|
+
user, across cwd, Git worktrees, projects, HOME settings, and Pi agent directories.
|
|
17
|
+
`scope:"project"` is an optional convenience filter, not an authority boundary.
|
|
18
|
+
The list does not enumerate all OS processes or disconnected native sessions.
|
|
19
|
+
|
|
20
|
+
A main session and its children form a collaboration group. Main↔child and
|
|
21
|
+
sibling↔sibling communication works in both directions. Across groups, only
|
|
22
|
+
main↔main communication is allowed. A child cannot discover, message, or read
|
|
23
|
+
another group's main or children—even using a known exact ID. Only mains spawn;
|
|
24
|
+
there is one child level. These are broker-enforced coordination rules, not an OS
|
|
25
|
+
security sandbox against arbitrary code running as the same user.
|
|
26
|
+
|
|
27
|
+
Registration pins `rootSessionId` and optional `parentSessionId`. Both are native
|
|
28
|
+
Pi session IDs, not cwd or display names. A main uses its own ID as root, without
|
|
29
|
+
a parent. A child uses its main's ID for both. An offline parent does not erase
|
|
30
|
+
sibling membership. Presence updates cannot change the registered group. Legacy
|
|
31
|
+
or remote peers without lineage are standalone mains.
|
|
32
|
+
|
|
33
|
+
Pi launches a child with both `PI_INTERCOM_ROOT_SESSION_ID` and
|
|
34
|
+
`PI_INTERCOM_PARENT_SESSION_ID` set to its main's exact native ID. With neither
|
|
35
|
+
set, the session is a main. Any other combination (one missing, empty, padded
|
|
36
|
+
with whitespace, or different values) stops the package from loading, so that
|
|
37
|
+
session gets neither delegation nor Intercom. Values are never trimmed into a
|
|
38
|
+
different identity.
|
|
39
|
+
|
|
40
|
+
### Identity and targeting
|
|
41
|
+
|
|
42
|
+
Use a target returned by `list`. Native peer IDs are `pi-` plus the first 32
|
|
43
|
+
hexadecimal SHA-256 characters of the native session ID. Reconnecting normally
|
|
44
|
+
reuses that identity. A simultaneous live collision gets a different ID; it never
|
|
45
|
+
merges with or evicts the first connection.
|
|
46
|
+
|
|
47
|
+
Names are mutable and nonunique. Exact IDs take precedence; otherwise names and
|
|
48
|
+
sufficiently long ID prefixes must resolve unambiguously. Displayed targets grow
|
|
49
|
+
when needed to distinguish collisions. A project-filtered peer can still be
|
|
50
|
+
addressed by its known target; a topology-forbidden peer cannot. A hidden peer
|
|
51
|
+
does not leak through duplicate-name ambiguity or disconnect notifications.
|
|
52
|
+
|
|
53
|
+
### Conditional native context targeting
|
|
54
|
+
|
|
55
|
+
Ordinary `intercom` names and asks are unchanged. Integrations can negotiate
|
|
56
|
+
guarded-delivery version 1 with the native broker client. Discovery then exposes
|
|
57
|
+
`rootSessionId`, `incarnation`, `guardedDelivery:1` and the optional opaque
|
|
58
|
+
`applicationGuard`. The lifecycle mints the incarnation on native startup, reload
|
|
59
|
+
or session replacement, not on transport reconnect. Peer IDs still belong to
|
|
60
|
+
the broker. Two current mains for one root make guarded sends ambiguous.
|
|
61
|
+
|
|
62
|
+
A guarded send requires an exact peer ID, a caller-recorded original message ID,
|
|
63
|
+
`expectsReply:false`, and
|
|
64
|
+
`guard:{rootSessionId,peerId,incarnation,applicationGuard}`. The broker checks
|
|
65
|
+
the complete binding before routing; the native recipient checks again before
|
|
66
|
+
initial admission, before its first checkpoint or immediate placement. Children
|
|
67
|
+
are not guarded command targets. Missing capability, stale context, changed
|
|
68
|
+
consent or an ambiguous root fails closed for new admission, never selecting a
|
|
69
|
+
similarly named main. A broker acceptance still does not prove
|
|
70
|
+
recipient admission. Lost responses remain uncertain; no automatic replay is added.
|
|
71
|
+
The supported non-model package client below uses these same native protocols.
|
|
72
|
+
|
|
73
|
+
Withdrawing the guard stops new admission; it does not cancel already-admitted
|
|
74
|
+
input. The original native session remains the recovery owner after a checkpoint,
|
|
75
|
+
including across reload or process recovery. A fork or new root cannot adopt its
|
|
76
|
+
pending inputs. Native queueing or placement is not proof of model consumption.
|
|
77
|
+
|
|
78
|
+
An original-main companion uses the existing process-local `pi.events` bus:
|
|
79
|
+
|
|
80
|
+
- Emit `pi-intercom:context-query` with `{version:1,respond(snapshot)}` for late
|
|
81
|
+
attachment. Unknown versions return `{error:"unsupported_version"}`.
|
|
82
|
+
- Observe `pi-intercom:context-state` for subsequent lifecycle, connection and
|
|
83
|
+
application-guard changes. Snapshots contain `version:1`, exact root, optional
|
|
84
|
+
parent, actual `peerId`, `incarnation`, `connected`, negotiated
|
|
85
|
+
`guardedDelivery:1|null`, and optional `applicationGuard`. Unavailable identities
|
|
86
|
+
are null. Query after subscribing; state events are not replayed.
|
|
87
|
+
- Emit `pi-intercom:application-guard` with
|
|
88
|
+
`{version:1,target:{rootSessionId,peerId,incarnation},revision,respond(result)}`.
|
|
89
|
+
The companion owns this opaque nonempty string revision; null withdraws it.
|
|
90
|
+
A stale target returns `{error:"context_changed"}`. It is cleared on context
|
|
91
|
+
replacement and retained on transport reconnect. This handshake is not consent
|
|
92
|
+
itself, does not persist a policy, and grants no human-origin authority.
|
|
93
|
+
|
|
94
|
+
Callbacks are process-local, synchronous observations. They are not socket frames
|
|
95
|
+
or a generic registry. Old owners have no handshake; treat them as unsupported.
|
|
96
|
+
Old brokers do not acknowledge guarded delivery, so updated clients refuse before
|
|
97
|
+
sending. Old ordinary clients and recipients continue using ordinary messages;
|
|
98
|
+
they are not advertised as conditional targets.
|
|
99
|
+
|
|
100
|
+
Guarded nonblocking messages may include
|
|
101
|
+
`replyHint:{tool,commandId,commandFingerprint?}`. Tool names are validated identifiers and command IDs
|
|
102
|
+
are immutable UUIDs supplied by the sender. An optional lowercase SHA-256
|
|
103
|
+
`commandFingerprint` is opaque to Intercom; its caller owns the fingerprint
|
|
104
|
+
contract. The native message renders a generic
|
|
105
|
+
publication hint separately from an ordinary ask. No product-specific tool is
|
|
106
|
+
hard-coded, no pending ask is created, and a hint does not prove a reply exists.
|
|
107
|
+
|
|
108
|
+
## Send, ask, and reply
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
intercom({ action: "send", to: "reviewer", message: "Check refresh-token rotation." });
|
|
112
|
+
intercom({ action: "ask", to: "reviewer", delivery: "steer", message: "Which invariant fails?" });
|
|
113
|
+
intercom({ action: "pending" });
|
|
236
114
|
intercom({
|
|
237
|
-
action: "
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
message:
|
|
241
|
-
"Blocked: should retry apply only to idempotent endpoints? Send the decision back with steer.",
|
|
242
|
-
});
|
|
243
|
-
// Worker ends its turn instead of polling or waiting.
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**Planner answers while preserving the worker's active task:**
|
|
247
|
-
|
|
248
|
-
```typescript
|
|
249
|
-
intercom({
|
|
250
|
-
action: "send",
|
|
251
|
-
to: "worker",
|
|
252
|
-
delivery: "steer",
|
|
253
|
-
message:
|
|
254
|
-
"Apply retries only to GET/PUT/DELETE. Max 3, exponential backoff from 100ms. Continue the current task.",
|
|
255
|
-
});
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Worker reports completion:**
|
|
259
|
-
|
|
260
|
-
```typescript
|
|
261
|
-
intercom({
|
|
262
|
-
action: "send",
|
|
263
|
-
to: "planner",
|
|
264
|
-
delivery: "steer",
|
|
265
|
-
message:
|
|
266
|
-
"Task-3 done. Added RetryPolicy, applied it to GET/PUT/DELETE, surfaced NetworkError, and passed 4 tests.",
|
|
267
|
-
});
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Communication Patterns
|
|
271
|
-
|
|
272
|
-
| Pattern | Action | Why |
|
|
273
|
-
| --------------------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
|
|
274
|
-
| **Task Delegation** | `send` + steer | Wakes an idle worker or reaches a busy worker at the next tool boundary without blocking the planner. |
|
|
275
|
-
| **Guidance / Answer** | `send` + steer | Makes relevant context available during active work. |
|
|
276
|
-
| **Clarification / Blocker** | `send` + steer | Long-lived peers can end their turn and wake when the answer arrives. |
|
|
277
|
-
| **Intentional Deferral** | `send` + queue | The recipient should not incorporate the note until after active work. |
|
|
278
|
-
| **Ephemeral Blocking Wait** | `ask` + steer | Keeps a short-lived process alive only when it cannot safely continue without the reply. |
|
|
279
|
-
|
|
280
|
-
### Blocking Ask Exception
|
|
281
|
-
|
|
282
|
-
Use `ask` only when the sender process must remain alive and cannot safely continue without the answer, such as an ephemeral dispatched subagent. Pass `delivery:"steer"` so the question reaches a busy recipient at its next tool boundary. The recipient answers with `intercom({ action: "reply", message: "..." })`; `pending` recovers unresolved asks when needed.
|
|
283
|
-
|
|
284
|
-
### `send` vs `ask`
|
|
285
|
-
|
|
286
|
-
`send` is the default for agent-to-agent coordination and uses steer when `delivery` is omitted. It wakes idle recipients or reaches busy recipients at the next tool boundary, then returns after broker acceptance. Use explicit queue only when delay is intentional, and passive only for human-visible breadcrumbs. If you want approval before non-reply sends, set `confirmSend: true`.
|
|
287
|
-
|
|
288
|
-
`ask` sends and waits up to `askTimeoutMs` (default 2 minutes). Reserve `ask` plus steer for a sender process that must remain alive and cannot safely continue without the answer. Long-lived peers should use `send` plus steer and end their turn instead. A default ask to a peer publishing `accepts_asks:false` returns promptly with `reason:"peer_busy"`; an explicit steer ask keeps waiting.
|
|
289
|
-
|
|
290
|
-
`reply` answers an inbound ask using its exact sender and message automatically. Otherwise, answer ordinary coordination with `send` plus steer. If multiple asks are pending, use `pending` and disambiguate with `to`.
|
|
291
|
-
|
|
292
|
-
Inbound steers are supplemental coordination inside the active task. Incorporate relevant context and continue; replace the task only when the message explicitly instructs replacement.
|
|
293
|
-
|
|
294
|
-
## Workflow: Subagent-to-Supervisor Escalation
|
|
295
|
-
|
|
296
|
-
When this package spawns a Pi-backed delegated child, it supplies bridge metadata that gives the child a subagent-only `contact_supervisor` tool in addition to the regular `intercom` tool. Normal sessions never see `contact_supervisor`; non-Pi child backends such as Claude Code do not load this tool.
|
|
297
|
-
|
|
298
|
-
### When the Tool Appears
|
|
299
|
-
|
|
300
|
-
`contact_supervisor` only registers when `pi-subagents` sets all of these environment variables:
|
|
301
|
-
|
|
302
|
-
- `PI_SUBAGENT_ORCHESTRATOR_TARGET` — the supervisor session name or ID
|
|
303
|
-
- `PI_SUBAGENT_RUN_ID` — the run identifier
|
|
304
|
-
- `PI_SUBAGENT_CHILD_AGENT` — the agent type
|
|
305
|
-
- `PI_SUBAGENT_CHILD_INDEX` — the child index within the run
|
|
306
|
-
|
|
307
|
-
If any are missing, the session falls back to the regular `intercom` tool. A subagent status line may mention an intercom target before the child is actually registered with pi-intercom; treat `intercom({ action: "list" })` as the source of truth. If the advertised target is absent from `list`, use normal subagent controls (`status`, `resume`, `nudge`, result artifacts) instead of sending to that target; the child may be Claude Code-backed or already exited and have no child-side `contact_supervisor`.
|
|
308
|
-
|
|
309
|
-
When both bundled extension entries are enabled, parent sessions can use `agent_runs({ action: "nudge", id: "<run-id>", message: "..." })` to send a non-blocking steered nudge to a live child. If the run has already finished, nudge returns its terminal outcome and evidence without restarting it. `agent_runs({ action: "list" })` includes this parent's active and completed durable runs across working directories, plus recoverable legacy foreground and background records. `agent_runs` inspection may also show the direct blocking `intercom({ action: "ask", to: "...", delivery: "steer", message: "..." })` path; use that exception only when the parent process must remain alive and cannot safely continue without the reply. `pi-intercom` remains the source of truth for connected sessions and only delivers to registered local peers.
|
|
310
|
-
|
|
311
|
-
### Three Reasons
|
|
312
|
-
|
|
313
|
-
| Reason | Behavior | Use When |
|
|
314
|
-
| ------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
315
|
-
| `need_decision` | Persists the question, steers the supervisor, and waits without the ordinary ask timeout | The ephemeral child cannot safely continue without one decision, approval, or product/API/scope clarification |
|
|
316
|
-
| `interview_request` | Persists structured questions and waits without the ordinary ask timeout | The ephemeral child cannot safely continue until it receives multiple structured answers |
|
|
317
|
-
| `progress_update` | Non-blocking steer at the next tool boundary | A discovery or change the supervisor needs while working |
|
|
318
|
-
|
|
319
|
-
Do not use `contact_supervisor` for routine completion handoffs. Return the final subagent result normally through `pi-subagents`.
|
|
320
|
-
|
|
321
|
-
Intercom provides live coordination and portable background completion notices. Every new subagent run has one detached owner, regardless of whether the parent waits or receives a background receipt. Waiting tools receive their saved result directly; the watcher suppresses an extra Intercom completion notice. See [host capabilities and result delivery](reference.md#host-capabilities-and-result-delivery).
|
|
322
|
-
|
|
323
|
-
Durable output lives in `pi-subagents` result details and artifact/output paths (`savedOutputPath`, `artifactPaths`, or explicit workspace `output` files). Completion notices include existing saved result and metadata paths, including acceptance details when configured. Use those files as the source of truth for long reports. Broker acceptance, notification delivery, parent review, and runtime acceptance are separate facts.
|
|
324
|
-
|
|
325
|
-
### Recovering a supervisor question
|
|
326
|
-
|
|
327
|
-
`need_decision` and `interview_request` save the question before notification. Supervisor or broker disconnection does not end the wait. Resume the same saved supervisor session and use:
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
agent_runs({ action: "questions" });
|
|
331
|
-
agent_runs({
|
|
332
|
-
action: "answer",
|
|
333
|
-
id: "<run-id>",
|
|
334
|
-
questionId: "<question-id>",
|
|
335
|
-
message: "Use the stable API.",
|
|
115
|
+
action: "reply",
|
|
116
|
+
replyTo: "<message-id>",
|
|
117
|
+
message: "The rotated token remains usable.",
|
|
336
118
|
});
|
|
337
|
-
agent_runs({ action: "stop", id: "<run-id>" });
|
|
338
119
|
```
|
|
339
120
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
121
|
+
- Default **steer**, for both sends and incoming asks, wakes an idle recipient or
|
|
122
|
+
reaches busy work at a tool boundary. Print-mode recipients use the same rule;
|
|
123
|
+
they do not replace an ordinary ask with a canned busy reply.
|
|
124
|
+
- Explicit **queue** defers delivery. Optional `queueMode:"replace"` with a nonempty
|
|
125
|
+
`threadId` coalesces still-staged updates for that thread; messages already handed
|
|
126
|
+
to Pi's native queue cannot be keyed-replaced.
|
|
127
|
+
- Explicit **passive** is a non-waking breadcrumb, not a request for model work.
|
|
128
|
+
|
|
129
|
+
An ordinary send is non-blocking. Its response means broker acceptance, not
|
|
130
|
+
recipient journal persistence, model consumption, reply, or task completion. A
|
|
131
|
+
lost transport response can be uncertain; do not blindly replay side effects.
|
|
132
|
+
|
|
133
|
+
`ask` waits for a correlated reply and has a bounded timeout. Prefer `send` unless
|
|
134
|
+
the sender genuinely must remain alive waiting for a decision. If an ordinary ask
|
|
135
|
+
finds a peer advertising `acceptsAsks:false`, the sender still reports `peer_busy`
|
|
136
|
+
without waiting; recipient steering does not claim that a reply has arrived.
|
|
137
|
+
Explicit steer/queue asks retain their bounded correlated wait. `reply` uses the
|
|
138
|
+
active or sole pending ask when unambiguous; otherwise specify `replyTo` and the
|
|
139
|
+
intended sender. Inspect `pending` for the exact correlation rather than guessing
|
|
140
|
+
from text.
|
|
141
|
+
|
|
142
|
+
This ordinary request/reply mechanism does not recreate the retired durable
|
|
143
|
+
supervisor approval/revival workflow. An expired wait is not an answered question
|
|
144
|
+
or a completed delegated run.
|
|
145
|
+
|
|
146
|
+
## Read the last response without waking
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
intercom({ action: "last", to: "reviewer" });
|
|
150
|
+
// Follow the returned entryId/nextOffset for large responses:
|
|
151
|
+
intercom({ action: "last", to: "<exact-peer-id>", entryId: "<entry-id>", offset: 16384 });
|
|
357
152
|
```
|
|
358
153
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
154
|
+
The native owner reads the last completed assistant response on its active
|
|
155
|
+
branch. This is original assistant text, not a run-status summary. No direct
|
|
156
|
+
message, prompt, or model turn is created. Empty history is reported explicitly.
|
|
157
|
+
|
|
158
|
+
Pages are bounded to 16,384 UTF-16 code units. Keep `entryId` for stable paging and
|
|
159
|
+
use the returned next offset; do not calculate byte offsets. A newer response
|
|
160
|
+
does not silently replace the requested entry halfway through retrieval. Missing
|
|
161
|
+
or no-longer-readable entries fail explicitly. Tool output and thought blocks are
|
|
162
|
+
not substituted for completed assistant text.
|
|
163
|
+
|
|
164
|
+
The broker assigns request tokens and verifies the answering peer and page
|
|
165
|
+
identity. Reads settle on response, disconnect, or timeout. Old peers/brokers
|
|
166
|
+
without the capability report unsupported reads instead of receiving unknown
|
|
167
|
+
message frames. Broker correlation does not grant access to another group.
|
|
168
|
+
|
|
169
|
+
## Native-owned receipts and publication provenance
|
|
170
|
+
|
|
171
|
+
Receipt reads are non-waking and distinct from `last`. The native client
|
|
172
|
+
negotiates `receiptReads:1` with the broker, which also checks the recipient's
|
|
173
|
+
capability before forwarding `{rootSessionId,messageId}`. Old brokers or owners
|
|
174
|
+
are unavailable, not a reason to send an unknown frame or parse their journals.
|
|
175
|
+
Receipt and last reads share the broker's private token, answering-peer,
|
|
176
|
+
timeout and disconnect owner. A receipt response must match the exact requested
|
|
177
|
+
native root and message ID. No model-facing receipt action is added.
|
|
178
|
+
|
|
179
|
+
A companion in the original main emits `pi-intercom:provenance-query` on
|
|
180
|
+
`pi.events` with `{version:1,rootSessionId,messageId,respond(result)}`. The loaded
|
|
181
|
+
Intercom owner reads its own readonly native SessionManager and responds
|
|
182
|
+
synchronously with `{receipt}` or `{error}`. Unknown versions, an inactive owner
|
|
183
|
+
or a different root return `publication_unavailable`. An absent checkpoint
|
|
184
|
+
returns `receipt_not_found`, which proves neither no effect nor task success.
|
|
185
|
+
Missing handlers are unsupported; there is no packaged parser fallback.
|
|
186
|
+
|
|
187
|
+
The version-1 receipt contains the exact root and message ID, original sender
|
|
188
|
+
peer/root/incarnation where recorded, requested delivery, received timestamp,
|
|
189
|
+
checkpoint entry ID, selected guard and publication-hint fields, and
|
|
190
|
+
`textSha256`. That hash is lowercase SHA-256 of the exact raw sender text encoded
|
|
191
|
+
as UTF-8, before banners, hints, or newline/Unicode normalization. It is computed
|
|
192
|
+
independently of the caller's opaque `commandFingerprint`. No input text,
|
|
193
|
+
attachments, thoughts, cwd, model settings or native journal path is returned.
|
|
194
|
+
|
|
195
|
+
Facts remain separate:
|
|
196
|
+
|
|
197
|
+
- `checkpointEntryId` observes the original owner's appended delivery record.
|
|
198
|
+
It is not a per-entry fsync or power-loss durability receipt.
|
|
199
|
+
- `queued` records an observed extension staging checkpoint.
|
|
200
|
+
- `nativeHandoff` records the native-handoff checkpoint, written before calling
|
|
201
|
+
Pi's send API. It does not prove that call succeeded or the provider accepted
|
|
202
|
+
input.
|
|
203
|
+
- `placementEntryId` identifies the actual native custom-message entry, or null
|
|
204
|
+
when no placement was observed. Placement is not semantic model consumption.
|
|
205
|
+
- `discarded` records an explicit discard checkpoint when one exists.
|
|
206
|
+
|
|
207
|
+
These are historical positive observations, not a claim that an input is still
|
|
208
|
+
queued. Provider-input admission and model consumption remain unknown. Finals,
|
|
209
|
+
settlement and ordinary replies are not fabricated command publications.
|
|
210
|
+
|
|
211
|
+
Receipt reads inspect the exact original session's journal, including its other
|
|
212
|
+
branches. They retain the immutable original sender after ordinary departure,
|
|
213
|
+
reload, compaction and cold reopen. They never depend on a live pending ask.
|
|
214
|
+
Copied history in a fork/new root cannot attest the original root's checkpoint.
|
|
215
|
+
This is separate from `last`, which remains active-branch-only and keeps pinned
|
|
216
|
+
entry paging semantics.
|
|
217
|
+
|
|
218
|
+
## Supported non-model client
|
|
219
|
+
|
|
220
|
+
Install this package as a normal Node.js dependency and import its supported
|
|
221
|
+
subpath. Pi and TypeBox peers are optional; a companion needs neither them nor
|
|
222
|
+
provider credentials. Importing this entry does not load the extension, CLI,
|
|
223
|
+
TUI, session manager, journal parser or model SDK.
|
|
224
|
+
|
|
225
|
+
```js
|
|
226
|
+
import { connectIntercom } from "@fitchmultz/pi-subagents/intercom-client";
|
|
227
|
+
|
|
228
|
+
const client = await connectIntercom({
|
|
229
|
+
spawn: false,
|
|
230
|
+
session: {
|
|
231
|
+
name: "my-companion",
|
|
232
|
+
cwd: process.cwd(),
|
|
233
|
+
model: "non-model-client", // A registration label, not a model to initialize.
|
|
234
|
+
rootSessionId: savedSenderRoot,
|
|
235
|
+
incarnation: savedSenderIncarnation,
|
|
376
236
|
},
|
|
377
237
|
});
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
Which API should I use?
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
Reply hints work the same as regular `intercom` ask/reply flows. The supervisor can reply with `intercom({ action: "reply", message: "..." })` and the subagent receives the answer as the tool result. If the parent agent is busy and later needs to recover the request, `intercom({ action: "pending" })` summarizes supervisor asks with run id, agent, child target, and question text.
|
|
408
|
-
|
|
409
|
-
For `interview_request`, the supervisor message includes the structured questions plus a fenced JSON answer example using this stable shape:
|
|
410
|
-
|
|
411
|
-
```json
|
|
412
|
-
{
|
|
413
|
-
"responses": [
|
|
414
|
-
{ "id": "api", "value": "Stable API" },
|
|
415
|
-
{ "id": "constraints", "value": "Keep the public error shape unchanged." }
|
|
416
|
-
]
|
|
417
|
-
}
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
The supervisor can reply with plain JSON or a fenced `json` block. If the reply matches the `{ "responses": [...] }` shape and references valid question ids/options, the child tool result includes it in `details.structuredReply` while still showing the raw reply text.
|
|
421
|
-
|
|
422
|
-
## Tool Reference
|
|
423
|
-
|
|
424
|
-
### load_intercom
|
|
425
|
-
|
|
426
|
-
`load_intercom({})` enables the full peer schema without sending messages or checking sessions. Then use `intercom` for all existing actions. Ordinary peer asks restored after reload retain their configured expiry. Saved replies, peer disconnects, recipient-error feedback, and durable supervisor answers retire the reply obligation without replaying consumed messages.
|
|
427
|
-
|
|
428
|
-
### intercom
|
|
429
|
-
|
|
430
|
-
| Parameter | Type | Description |
|
|
431
|
-
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
432
|
-
| `action` | string | `"list"`, `"send"`, `"ask"`, `"reply"`, `"pending"`, or `"status"` |
|
|
433
|
-
| `scope` | string | Optional for list/status: `"project"` (default) shows this Git repository and its worktrees; `"all"` includes sessions in other projects. |
|
|
434
|
-
| `to` | string | Target session name or ID (for send/ask, or to disambiguate reply) |
|
|
435
|
-
| `message` | string | Message text (for send/ask/reply) |
|
|
436
|
-
| `attachments` | array | Optional `file`, `snippet`, or `context` attachments |
|
|
437
|
-
| `replyTo` | string | Optional message ID for threading or replying to an `ask` |
|
|
438
|
-
| `delivery` | string | Optional: omitted `send` defaults to `"steer"`, which injects after the current tool call; `"queue"` intentionally waits behind active work, and `"passive"` does not wake the recipient model (`send` only). |
|
|
439
|
-
| `queueMode` | string | Optional with queued delivery: `"stack"` keeps all messages, `"replace"` keeps only the latest undelivered message for the same `threadId` after a short coalescing window. |
|
|
440
|
-
| `threadId` | string | Required for `queueMode:"replace"`; stable topic key for replacement. |
|
|
441
|
-
| `passive` | boolean | Legacy `send`-only alias for `delivery:"passive"`. Discouraged for agent-to-agent messages. |
|
|
442
|
-
|
|
443
|
-
### contact_supervisor
|
|
444
|
-
|
|
445
|
-
Only registered in sessions where `pi-subagents` supplied the required child bridge metadata. Contacts the supervisor session that delegated the current task.
|
|
446
|
-
|
|
447
|
-
| Parameter | Type | Description |
|
|
448
|
-
| ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
|
|
449
|
-
| `reason` | string | `"need_decision"` (blocking), `"interview_request"` (blocking structured questions), or `"progress_update"` (non-blocking) |
|
|
450
|
-
| `message` | string | The decision request, optional interview note, or progress update |
|
|
451
|
-
| `interview` | object | Required for `interview_request`: `{ title?, description?, questions: [...] }` |
|
|
452
|
-
|
|
453
|
-
**`need_decision`** — Use only when the ephemeral child cannot safely continue without one decision, approval, or product/API/scope clarification. It sends a formatted steered ask to the supervisor and keeps the child alive until the reply arrives, without the ordinary intercom ask timeout. The reply comes back as the tool result. Includes run metadata in the message so the supervisor knows which subagent is asking.
|
|
454
|
-
|
|
455
|
-
**`interview_request`** — Use only when the ephemeral child cannot safely continue until it receives multiple structured answers. It sends a formatted, steered agent-readable interview to the supervisor and keeps the child alive until the reply arrives. Questions use a local pi-interview-like shape: `{ id, type, question, options?, context? }` where `type` is `single`, `multi`, `text`, `image`, or `info`. `info` questions are context-only and do not need responses. The supervisor reply should be JSON with `{ "responses": [{ "id": "...", "value": ... }] }`. Parsed JSON replies are returned in `details.structuredReply`.
|
|
456
|
-
|
|
457
|
-
**`progress_update`** — Steers a material discovery at the next native tool boundary without waiting for a reply. The receipt confirms broker acceptance, not model consumption or action. Send only what the supervisor needs while working; skip starts, redundant status, and routine completion. Keep material findings in the final result.
|
|
458
|
-
|
|
459
|
-
### intercom actions
|
|
460
|
-
|
|
461
|
-
**`list`** — Returns the current session plus other intercom-connected sessions in the current Git repository and its worktrees by default. Pass `scope:"all"` to intentionally include sessions in other projects. Hidden sessions remain connected and directly targetable by an exact known target. Rows include name, safe target, working directory, model, live status, and peer health tags: `state` (`idle`, `busy`, or `unknown`), `accepts_asks`, `pending_asks`, `last_intercom_activity`, and `last_seen`. Peer rows include live delivery guidance for `ask`, `send`, `queue`, `steer`, and the discouraged passive path; the self row says self-target delivery is unavailable and points to peer targets / `pending` / `reply`. Status is derived automatically from Pi lifecycle events: `idle`, `thinking`, or `tool:<name>`. If multiple sessions have the same name, use the displayed target exactly as shown, for example `to: "ca7bfec2"`. The target may be longer than eight characters when needed to avoid collisions.
|
|
462
|
-
|
|
463
|
-
**`send`** — Sends a non-blocking, default-steered message to the specified session and returns broker acceptance, not a later response. It wakes idle recipients or reaches busy recipients at the next tool boundary. Use `delivery:"queue"` only when delay is intentional, and `delivery:"passive"`/`passive:true` only for human-visible breadcrumbs. `queueMode:"replace"` with a `threadId` replaces older undelivered intercom-staged messages for that thread after a short coalescing window; once a message is handed to Pi's native queue it cannot be keyed-replaced. Set `confirmSend: true` in config if you want a confirmation dialog for non-reply sends. Replies that include `replyTo` skip confirmation.
|
|
464
|
-
|
|
465
|
-
**`ask`** — Sends a message and waits for the recipient to reply (`askTimeoutMs`, default 2 minutes). Reserve it for a sender process that must remain alive and cannot safely continue without the answer; use `delivery:"steer"` so a busy recipient sees it at the next tool boundary. If the target publishes `accepts_asks:false`, a default blocking ask returns promptly with `reason:"peer_busy"`, while an explicit steer ask still waits. Only one pending waiting ask is allowed per session. Passive delivery is rejected.
|
|
466
|
-
|
|
467
|
-
**`reply`** — Replies to the current intercom-triggered message if there is one. Otherwise it falls back to the single unresolved inbound ask. If multiple asks are pending, pass `to` or inspect them with `pending` first. Under the hood this is still a normal `send` with the exact `replyTo` value.
|
|
468
|
-
|
|
469
|
-
**`pending`** — Lists unresolved inbound asks with sender, elapsed time, a labeled `replyTo` ID, and a copy-ready `intercom({ action: "reply", ... })` call. For `pi-subagents` supervisor asks, the preview expands the run id, agent, child intercom target, and question so the parent can reply without guessing. Useful when replying after the original triggered turn.
|
|
470
|
-
|
|
471
|
-
**`status`** — Shows connection status, session ID, and the same project-scoped recipient capability rows as `list`. Also shows inbound messages still queued for delivery or handed to Pi but not yet consumed. Pass `scope:"all"` to include other projects.
|
|
472
|
-
|
|
473
|
-
## Keyboard Shortcuts
|
|
474
|
-
|
|
475
|
-
| Key | Action |
|
|
476
|
-
| ------------------------------------------ | ---------------------------------------------------------------------------------------- |
|
|
477
|
-
| Option+Shift+M (Alt+Shift+M), configurable | Toggle owned agent conversations; open peer messaging when the agent view is unavailable |
|
|
478
|
-
| ↑/↓ | Navigate session list |
|
|
479
|
-
| Tab | Toggle Send / Request Reply mode in the compose overlay |
|
|
480
|
-
| Enter | Select session / Send or ask |
|
|
481
|
-
| Escape | Cancel / Close overlay |
|
|
482
|
-
|
|
483
|
-
## Config
|
|
484
|
-
|
|
485
|
-
Create `${PI_CODING_AGENT_DIR:-~/.pi/agent}/intercom/config.json`:
|
|
486
|
-
|
|
487
|
-
```json
|
|
488
|
-
{
|
|
489
|
-
"shortcut": "alt+shift+m",
|
|
490
|
-
"confirmSend": false,
|
|
491
|
-
"replyHint": true,
|
|
492
|
-
"askTimeoutMs": 120000,
|
|
493
|
-
"sendTimeoutMs": 8000,
|
|
494
|
-
"listTimeoutMs": 5000,
|
|
495
|
-
"status": "researching"
|
|
496
|
-
}
|
|
497
|
-
```
|
|
498
|
-
|
|
499
|
-
| Setting | Default | Description |
|
|
500
|
-
| --------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
501
|
-
| `shortcut` | `"alt+shift+m"` | Native Pi key identifier for the Agents/Intercom shortcut, for example `"ctrl+shift+k"`. The Agents entrance hint uses the same setting. |
|
|
502
|
-
| `brokerCommand` | current Node executable | Command used to start the local broker process when you override the default |
|
|
503
|
-
| `brokerArgs` | `[]` | Arguments passed to `brokerCommand` before the broker script path. The built-in default runs the bundled TypeScript broker directly with Node. |
|
|
504
|
-
| `confirmSend` | false | Show a confirmation dialog before non-reply sends from an interactive session with UI |
|
|
505
|
-
| `replyHint` | true | Include reply instructions in incoming asks |
|
|
506
|
-
| `askTimeoutMs` | `120000` | Reply wait timeout for ordinary peer `ask`; durable supervisor questions do not expire |
|
|
507
|
-
| `sendTimeoutMs` | `8000` | Broker delivery-ack timeout for sends/asks |
|
|
508
|
-
| `listTimeoutMs` | `5000` | Session-list response timeout |
|
|
509
|
-
| `status` | — | Optional custom status suffix shown after the automatic lifecycle status, for example `thinking · researching` |
|
|
510
|
-
|
|
511
|
-
The default shortcut requires a terminal that reports combined modifiers through Kitty keyboard protocol or xterm modifyOtherKeys. Pi negotiates these automatically on supported terminals. `/agents` is also available. Restart Pi after changing the shortcut.
|
|
512
|
-
|
|
513
|
-
Use `pi config` to enable or disable the bundled intercom extension. The former `config.json` `enabled` key is no longer read; in particular, an existing `"enabled": false` does not disable intercom after this migration.
|
|
514
|
-
|
|
515
|
-
For example, if you have Bun installed and want it to start the broker directly, use:
|
|
516
|
-
|
|
517
|
-
```json
|
|
518
|
-
{
|
|
519
|
-
"brokerCommand": "bun",
|
|
520
|
-
"brokerArgs": []
|
|
238
|
+
try {
|
|
239
|
+
const peers = await client.listSessions();
|
|
240
|
+
// Join selected consent to one exact advertised main; do not select by name.
|
|
241
|
+
const target = peers.find((peer) => peer.id === savedTarget.peerId);
|
|
242
|
+
if (!target) throw new Error("Original target unavailable");
|
|
243
|
+
const result = await client.send(savedTarget.peerId, {
|
|
244
|
+
messageId: savedMessageId,
|
|
245
|
+
text: savedText,
|
|
246
|
+
expectsReply: false,
|
|
247
|
+
delivery: "steer",
|
|
248
|
+
guard: savedTarget, // rootSessionId, peerId, incarnation, applicationGuard
|
|
249
|
+
replyHint: {
|
|
250
|
+
tool: "my_publication_tool",
|
|
251
|
+
commandId: savedCommandId,
|
|
252
|
+
commandFingerprint: savedCommandFingerprint,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
// result describes broker acceptance, not native or provider admission.
|
|
256
|
+
const receipt = await client.receipt(savedTarget.peerId, {
|
|
257
|
+
rootSessionId: savedTarget.rootSessionId,
|
|
258
|
+
messageId: savedMessageId,
|
|
259
|
+
});
|
|
260
|
+
const page = await client.last(savedTarget.peerId, { limit: 16384 });
|
|
261
|
+
// Keep page.entryId and page.nextOffset for subsequent pages.
|
|
262
|
+
} finally {
|
|
263
|
+
await client.disconnect();
|
|
521
264
|
}
|
|
522
265
|
```
|
|
523
266
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
267
|
+
The example's saved values belong to the caller's immutable command record, not
|
|
268
|
+
to this client. Persist that record and the actual `client.sessionId` before the
|
|
269
|
+
attempt. `requestedId` is optional and can collide; only the returned current
|
|
270
|
+
identity attests this connection. The client creates no ledger, consent, second
|
|
271
|
+
session or model loop. Registration does not grant human-origin authority.
|
|
272
|
+
|
|
273
|
+
`connectIntercom` requires literal `spawn:false` and never starts a missing or
|
|
274
|
+
old broker. It uses the normal same-user namespace or the caller's explicit
|
|
275
|
+
`PI_INTERCOM_RUNTIME_DIR`; it does not change global Pi configuration or infer a
|
|
276
|
+
fallback namespace. Connection failure rejects. `sendTimeoutMs` and
|
|
277
|
+
`listTimeoutMs` bound native requests; optional `onError(error)` observes socket
|
|
278
|
+
errors. Outstanding operations reject on loss. `isConnected()` and `sessionId`
|
|
279
|
+
report current transport state, not recipient activity or successful work.
|
|
280
|
+
`disconnect()` closes this socket and joins its cleanup; reconnect explicitly
|
|
281
|
+
with a new `connectIntercom` call. There are no reconnect or resend timers.
|
|
282
|
+
|
|
283
|
+
Public sends require an original message ID, explicit delivery, `expectsReply:false`
|
|
284
|
+
and the complete exact guard. Concurrent sends with one pending ID reject rather
|
|
285
|
+
than replacing its acknowledgement waiter. Invalid inputs, old capability
|
|
286
|
+
negotiation, stale consent/context and ambiguous roots never downgrade to an
|
|
287
|
+
ordinary send. The generic hint and opaque fingerprint are optional native
|
|
288
|
+
metadata, not an ordinary ask or a guaranteed reply.
|
|
289
|
+
|
|
290
|
+
After any unconfirmed send, keep the original ID and target. Reconcile only with
|
|
291
|
+
`receipt`; never generate another UUID, reroute or assume that missing means
|
|
292
|
+
unsent. A later explicit new operation is the caller's decision, not an automatic
|
|
293
|
+
retry. Receipt facts retain the original sender after departure. Unsupported old
|
|
294
|
+
brokers or owners fail closed; `publication_unavailable` and `receipt_not_found`
|
|
295
|
+
do not establish no effects. `last` is separately non-waking and pinned by entry
|
|
296
|
+
ID; it is not a correlated command reply. Ordinary local Intercom name resolution,
|
|
297
|
+
asks and topology are unchanged.
|
|
298
|
+
|
|
299
|
+
Only `./intercom-client` and `./package.json` are public package subpaths.
|
|
300
|
+
Private transport, broker, extension and parser paths are not supported imports.
|
|
301
|
+
The Pi resource manifest still loads its compiled extension independently.
|
|
302
|
+
|
|
303
|
+
## Persistence and lifecycle
|
|
304
|
+
|
|
305
|
+
Inbound state is checkpointed in the recipient's native session journal. Native
|
|
306
|
+
publication/consumption receipts govern replay; broker writes alone do not.
|
|
307
|
+
Queued, admitted, consumed, and replied are distinct states. Reload, compaction,
|
|
308
|
+
branch changes, shutdown, and fresh-process recovery must not fabricate receipts
|
|
309
|
+
or adopt another native session's pending messages.
|
|
310
|
+
|
|
311
|
+
An already-admitted message ID cannot publish a second copy or revive an answered
|
|
312
|
+
ask. The same applies to replies received by a blocking ask and to deliberately
|
|
313
|
+
replaced/discarded queued messages, including native journal restoration. A new ID
|
|
314
|
+
is a new input even if its text is identical. This recipient-side deduplication is
|
|
315
|
+
not an end-to-end exactly-once guarantee for arbitrary tool side effects.
|
|
316
|
+
|
|
317
|
+
Idle recovery preserves admission order within the non-passive backlog and wakes
|
|
318
|
+
once on its last item; passive breadcrumbs are appended before that waking work.
|
|
319
|
+
The first eligible ask remains the implicit reply target, independently of which
|
|
320
|
+
message triggers the turn. A busy recipient's steer is handed to Pi's native
|
|
321
|
+
queue and consumed at its next tool boundary; no extension probe asks another
|
|
322
|
+
tool to give up the turn.
|
|
323
|
+
|
|
324
|
+
Shutdown joins admitted inbound work before detaching its native owner. Stale
|
|
325
|
+
runtime generations must not checkpoint or deliver into a replacement session.
|
|
326
|
+
The native tests own these contracts; neither a timer nor a source-string test is
|
|
327
|
+
publication evidence.
|
|
328
|
+
|
|
329
|
+
## Shared broker and migration
|
|
330
|
+
|
|
331
|
+
Default files on macOS/Linux:
|
|
332
|
+
|
|
333
|
+
- `/tmp/pi-intercom-<uid>/broker.sock`
|
|
334
|
+
- `/tmp/pi-intercom-<uid>/broker.pid`
|
|
335
|
+
- `/tmp/pi-intercom-<uid>/broker.spawn.lock`
|
|
336
|
+
|
|
337
|
+
Native Android/Termux uses `$PREFIX/tmp/pi-intercom-<uid>` instead of `/tmp`.
|
|
338
|
+
This is shared across the app's sessions, not derived from a session's HOME,
|
|
339
|
+
agent directory, or TMPDIR. Android without a Termux PREFIX uses Node's native
|
|
340
|
+
temporary directory. The separate read-only child observation endpoints use
|
|
341
|
+
the same runtime-root policy.
|
|
342
|
+
|
|
343
|
+
The runtime directory is owned by the OS user, nonsymlink, and mode 0700; the
|
|
344
|
+
socket is mode 0600. The broker starts on first use and exits after five seconds
|
|
345
|
+
without connected sessions. Concurrent startup uses the shared spawn lock.
|
|
346
|
+
|
|
347
|
+
`PI_INTERCOM_RUNTIME_DIR` explicitly selects an isolated deployment. It must be
|
|
348
|
+
an absolute private directory with a socket path within 100 UTF-8 bytes. Invalid
|
|
349
|
+
configuration fails without falling back to another namespace. Set it consistently
|
|
350
|
+
for every process intended to share that isolated broker. Tests must always use
|
|
351
|
+
an owned isolated directory, never the user's ordinary shared socket.
|
|
352
|
+
|
|
353
|
+
Old releases used agent-directory-specific brokers. Updated sessions join the
|
|
354
|
+
new shared namespace; old sessions stay on their old brokers until they load the
|
|
355
|
+
updated extension. Startup warns when it detects an old broker for the current
|
|
356
|
+
agent directory. It does not kill, modify, take over, or silently route back to
|
|
357
|
+
that broker. During migration, old and new peers may therefore be invisible to
|
|
358
|
+
each other. Finish accepted work before upgrading; do not force broker shutdown
|
|
359
|
+
to make discovery appear complete. During an authorized cutover, inventory and
|
|
360
|
+
reload every participating Pi session on that Mac before resuming bridge traffic,
|
|
361
|
+
then verify the expected exact peers from both mains and the helper. The warning
|
|
362
|
+
only detects old brokers for the current agent directory; it cannot certify that
|
|
363
|
+
all old sessions elsewhere have migrated.
|
|
364
|
+
|
|
365
|
+
The predictable macOS/Linux `/tmp` namespace is independent of caller HOME/TMPDIR, which is
|
|
366
|
+
needed for same-user discovery across differently configured sessions. A foreign
|
|
367
|
+
user who pre-creates that path can deny availability, but cannot be adopted as the
|
|
368
|
+
broker owner: startup refuses foreign or symlink directories. It must not delete
|
|
369
|
+
or take over the path to recover. On shared hosts, an operator can pre-provision
|
|
370
|
+
a short private directory under an owned non-writable parent and consistently set
|
|
371
|
+
`PI_INTERCOM_RUNTIME_DIR` for every participating Pi session and helper. This is
|
|
372
|
+
an explicit deployment choice, not an automatic fallback to a split namespace.
|
|
373
|
+
|
|
374
|
+
An unresponsive or missing socket is not permission to kill a possibly live
|
|
375
|
+
owner. PID checks are conservative, including permission-denied cases. Linux
|
|
376
|
+
records include native boot/namespace/start identity to reject proven PID reuse;
|
|
377
|
+
ambiguous legacy numeric PIDs remain blocking. A process is never killed merely
|
|
378
|
+
to recover broker startup.
|
|
379
|
+
|
|
380
|
+
Remote authenticated mail is separate: see [bridge setup](intercom-bridge.md).
|