@selesai/code 0.8.2 → 0.8.4
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 +15 -0
- package/README.md +4 -2
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +18 -0
- package/dist/cli/config-selector.js +2 -2
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/core/keybindings.d.ts +44 -4
- package/dist/core/llama/provider.js +22 -7
- package/dist/core/model-resolver.js +2 -0
- package/dist/core/model-runtime.d.ts +4 -2
- package/dist/core/model-runtime.js +23 -2
- package/dist/core/remote-catalog-provider.js +72 -67
- package/dist/core/settings-manager.d.ts +8 -0
- package/dist/core/settings-manager.js +18 -0
- package/dist/extensions/handoff-new.ts +1 -1
- package/dist/extensions/inline-skills.test.ts +1 -0
- package/dist/extensions/inline-skills.ts +1 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
- package/dist/extensions/pi-intercom/README.md +34 -15
- package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
- package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
- package/dist/extensions/pi-intercom/broker/client.ts +78 -150
- package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
- package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
- package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
- package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
- package/dist/extensions/pi-intercom/config.test.ts +8 -10
- package/dist/extensions/pi-intercom/config.ts +3 -3
- package/dist/extensions/pi-intercom/index.ts +218 -147
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
- package/dist/extensions/pi-intercom/package.json +3 -2
- package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
- package/dist/extensions/pi-intercom/project-agent.ts +324 -0
- package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
- package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
- package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
- package/dist/extensions/pi-intercom/types.ts +3 -1
- package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
- package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
- package/dist/extensions/pi-powerline-footer/CHANGELOG.md +15 -1
- package/dist/extensions/pi-powerline-footer/README.md +20 -37
- package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
- package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
- package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
- package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
- package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
- package/dist/extensions/pi-powerline-footer/index.ts +394 -586
- package/dist/extensions/pi-powerline-footer/package.json +5 -6
- package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -18
- package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
- package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
- package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
- package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
- package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
- package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
- package/dist/extensions/pi-powerline-footer/tests/fixed-editor-border.test.ts +2 -2
- package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
- package/dist/extensions/pi-powerline-footer/tests/guide.test.ts +1 -1
- package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +86 -19
- package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
- package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
- package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
- package/dist/extensions/pi-powerline-footer/tsconfig.json +1 -1
- package/dist/extensions/pi-powerline-footer/types.ts +1 -2
- package/dist/extensions/pi-subagents/CHANGELOG.md +202 -14
- package/dist/extensions/pi-subagents/README.md +65 -1614
- package/dist/extensions/pi-subagents/agents/builder.md +0 -1
- package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
- package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
- package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
- package/dist/extensions/pi-subagents/agents/scout.md +50 -0
- package/dist/extensions/pi-subagents/agents/worker.md +58 -0
- package/dist/extensions/pi-subagents/docs/configuration.md +328 -0
- package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
- package/dist/extensions/pi-subagents/docs/missions.md +119 -0
- package/dist/extensions/pi-subagents/docs/models.md +192 -0
- package/dist/extensions/pi-subagents/docs/observability.md +174 -0
- package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
- package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
- package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
- package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
- package/dist/extensions/pi-subagents/package-lock.json +152 -194
- package/dist/extensions/pi-subagents/package.json +9 -10
- package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
- package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
- package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
- package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
- package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
- package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +29 -16
- package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
- package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
- package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
- package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
- package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +56 -8
- package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
- package/dist/extensions/pi-subagents/src/extension/index.ts +119 -50
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +72 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +15 -15
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
- package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
- package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
- package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
- package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
- package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -14
- package/dist/extensions/pi-subagents/src/missions/store.ts +147 -5
- package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +256 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
- package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +41 -7
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +19 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +39 -6
- package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
- package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +21 -2
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +152 -68
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +3 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +55 -26
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +798 -112
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +165 -22
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +1 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +465 -116
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +3 -3
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
- package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
- package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
- package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
- package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
- package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
- package/dist/extensions/pi-subagents/src/shared/types.ts +100 -3
- package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/utils.ts +43 -33
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
- package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
- package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +30 -16
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +151 -31
- package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
- package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
- package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +313 -25
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +411 -300
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +99 -56
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +159 -108
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -56
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +114 -45
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +57 -19
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +809 -87
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
- package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
- package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +163 -58
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +99 -99
- package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
- package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
- package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +94 -40
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
- package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
- package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +52 -52
- package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
- package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
- package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
- package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +62 -44
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +329 -37
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +5 -5
- package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +116 -0
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +55 -7
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +289 -13
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +28 -1
- package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +11 -2
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +84 -10
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +122 -8
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +24 -24
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +16 -2
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
- package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
- package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +357 -92
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +22 -6
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
- package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +40 -0
- package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +107 -27
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +56 -50
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
- package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +59 -44
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +120 -91
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -26
- package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +73 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
- package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
- package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
- package/dist/extensions/workflow/extension.ts +21 -19
- package/dist/extensions/workflow/modes.ts +65 -0
- package/dist/index.d.ts +1 -1
- package/dist/main.js +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +6 -2
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/interactive-mode.d.ts +28 -0
- package/dist/modes/interactive/interactive-mode.js +214 -28
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
- package/dist/modes/interactive/theme/theme-controller.js +10 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.js +24 -6
- package/dist/skills/pi-subagents/SKILL.md +20 -15
- package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
- package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
- package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
- package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
- package/docs/keybindings.md +35 -7
- package/docs/plans/workflow-autoloop-reference.md +192 -0
- package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
- package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
- package/docs/settings.md +16 -14
- package/docs/usage.md +5 -0
- package/package.json +5 -5
- package/dist/extensions/pi-powerline-footer/fixed-editor/cluster.ts +0 -113
- package/dist/extensions/pi-powerline-footer/fixed-editor/terminal-split.ts +0 -1080
- package/dist/extensions/pi-powerline-footer/tests/fixed-editor.test.ts +0 -1452
- package/dist/extensions/workflow/adapter.ts +0 -949
- package/dist/extensions/workflow/modes/loop.ts +0 -74
- package/dist/extensions/workflow/modes/prototype.ts +0 -170
- package/dist/extensions/workflow/modes/quicktype.ts +0 -150
- package/dist/extensions/workflow/modes/task.ts +0 -105
- package/dist/extensions/workflow/run-state.ts +0 -124
- package/dist/extensions/workflow/state-machine.ts +0 -484
- package/dist/extensions/workflow/validators.ts +0 -42
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { defineTool, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
|
|
2
2
|
import { StringEnum } from "@earendil-works/pi-ai";
|
|
3
3
|
import { randomUUID } from "crypto";
|
|
4
4
|
import { Type } from "typebox";
|
|
@@ -24,12 +24,11 @@ import { ReplyTracker } from "./reply-tracker.ts";
|
|
|
24
24
|
import { resolve as resolvePath } from "node:path";
|
|
25
25
|
import { sameCwd } from "./cwd.ts";
|
|
26
26
|
import { formatContextUsage } from "./format-context.ts";
|
|
27
|
+
import { openProjectPane, resolveTargetInCwd, waitForProjectSession, type ProjectPaneLaunch } from "./project-agent.ts";
|
|
27
28
|
|
|
28
29
|
const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
|
|
29
30
|
const SUBAGENT_RESULT_INTERCOM_EVENT = "subagent:result-intercom";
|
|
30
31
|
const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = "subagent:result-intercom-delivery";
|
|
31
|
-
const INBOUND_FLUSH_DELAY_MS = 200;
|
|
32
|
-
const INBOUND_IDLE_RETRY_MS = 500;
|
|
33
32
|
const INBOUND_MESSAGE_DEDUPE_MAX = 1000;
|
|
34
33
|
const INBOUND_MESSAGE_DEDUPE_RETENTION_MS = 60 * 60 * 1000;
|
|
35
34
|
const DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX = "subagent-chat";
|
|
@@ -60,6 +59,12 @@ interface InboundMessageEntry {
|
|
|
60
59
|
bodyText: string;
|
|
61
60
|
}
|
|
62
61
|
|
|
62
|
+
interface DeliveryTarget {
|
|
63
|
+
id: string;
|
|
64
|
+
label: string;
|
|
65
|
+
projectPane?: ProjectPaneLaunch;
|
|
66
|
+
}
|
|
67
|
+
|
|
63
68
|
type ContactSupervisorReason = "need_decision" | "progress_update" | "interview_request";
|
|
64
69
|
|
|
65
70
|
interface SupervisorInterviewQuestion extends Record<string, unknown> {
|
|
@@ -91,9 +96,9 @@ function formatAttachments(attachments: Attachment[]): string {
|
|
|
91
96
|
let text = "";
|
|
92
97
|
for (const att of attachments) {
|
|
93
98
|
if (att.language) {
|
|
94
|
-
text += `\n\n---\
|
|
99
|
+
text += `\n\n---\nAttachment: ${att.name}\n~~~${att.language}\n${att.content}\n~~~`;
|
|
95
100
|
} else {
|
|
96
|
-
text += `\n\n---\
|
|
101
|
+
text += `\n\n---\nAttachment: ${att.name}\n${att.content}`;
|
|
97
102
|
}
|
|
98
103
|
}
|
|
99
104
|
return text;
|
|
@@ -379,8 +384,26 @@ function duplicateSessionNames(sessions: SessionInfo[]): Set<string> {
|
|
|
379
384
|
.filter((name, index, names) => names.indexOf(name) !== index)
|
|
380
385
|
);
|
|
381
386
|
}
|
|
382
|
-
function
|
|
383
|
-
|
|
387
|
+
function sessionIdPrefixes(sessions: SessionInfo[]): Map<string, string> {
|
|
388
|
+
const prefixes = new Map<string, string>();
|
|
389
|
+
for (const session of sessions) {
|
|
390
|
+
let longestSharedPrefix = 0;
|
|
391
|
+
for (const other of sessions) {
|
|
392
|
+
if (other.id === session.id) {
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
let length = 0;
|
|
396
|
+
while (length < session.id.length && session.id[length] === other.id[length]) {
|
|
397
|
+
length += 1;
|
|
398
|
+
}
|
|
399
|
+
longestSharedPrefix = Math.max(longestSharedPrefix, length);
|
|
400
|
+
}
|
|
401
|
+
const minimumLength = Math.max(8, longestSharedPrefix + 1);
|
|
402
|
+
const groupBoundary = session.id.indexOf("-", minimumLength);
|
|
403
|
+
const length = groupBoundary === -1 ? minimumLength : groupBoundary;
|
|
404
|
+
prefixes.set(session.id, session.id.slice(0, length));
|
|
405
|
+
}
|
|
406
|
+
return prefixes;
|
|
384
407
|
}
|
|
385
408
|
function parseSubagentIntercomPayload(payload: unknown): { to: string; message: string; requestId?: string } | null {
|
|
386
409
|
if (typeof payload !== "object" || payload === null) {
|
|
@@ -399,11 +422,13 @@ function resolveIntercomPresenceName(sessionName: string | undefined, sessionId:
|
|
|
399
422
|
return trimmedName;
|
|
400
423
|
}
|
|
401
424
|
const normalizedSessionId = sessionId.startsWith("session-") ? sessionId.slice("session-".length) : sessionId;
|
|
402
|
-
return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId.slice(0,
|
|
425
|
+
return `${DEFAULT_UNNAMED_SESSION_ALIAS_PREFIX}-${normalizedSessionId.slice(0, 18)}`;
|
|
403
426
|
}
|
|
404
|
-
function buildPresenceIdentity(pi: ExtensionAPI, sessionId: string): { name: string } {
|
|
427
|
+
function buildPresenceIdentity(pi: ExtensionAPI, sessionId: string): { name: string; runtimeFallbackAlias: boolean } {
|
|
428
|
+
const sessionName = pi.getSessionName();
|
|
405
429
|
return {
|
|
406
|
-
name: resolveIntercomPresenceName(
|
|
430
|
+
name: resolveIntercomPresenceName(sessionName, sessionId),
|
|
431
|
+
runtimeFallbackAlias: !sessionName?.trim(),
|
|
407
432
|
};
|
|
408
433
|
}
|
|
409
434
|
function resolveConfiguredIntercomSessionId(piSessionId: string, config: IntercomConfig): string {
|
|
@@ -417,15 +442,15 @@ function formatSessionLabel(session: SessionInfo, duplicates: Set<string>): stri
|
|
|
417
442
|
return session.id;
|
|
418
443
|
}
|
|
419
444
|
return duplicates.has(session.name.toLowerCase())
|
|
420
|
-
? `${session.name} (${
|
|
445
|
+
? `${session.name} (${session.id.slice(0, 8)})`
|
|
421
446
|
: session.name;
|
|
422
447
|
}
|
|
423
|
-
function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean): string {
|
|
448
|
+
function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean, idPrefix: string): string {
|
|
424
449
|
const name = session.name || "Unnamed session";
|
|
425
450
|
const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status]
|
|
426
451
|
.filter((tag): tag is string => Boolean(tag));
|
|
427
452
|
const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
|
|
428
|
-
return `• ${name} (${
|
|
453
|
+
return `• ${name} (${idPrefix}) — ${session.cwd} (${session.model}${formatContextUsage(session)})${suffix}`;
|
|
429
454
|
}
|
|
430
455
|
function previewText(value: unknown, maxLength = 72): string | undefined {
|
|
431
456
|
if (typeof value !== "string") {
|
|
@@ -486,6 +511,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
486
511
|
let reconnectTimer: NodeJS.Timeout | null = null;
|
|
487
512
|
let namePollTimer: NodeJS.Timeout | null = null;
|
|
488
513
|
let lastPresenceName: string | null = null;
|
|
514
|
+
let lastPresenceRuntimeFallbackAlias: boolean | null = null;
|
|
489
515
|
const previousIntercomSessionId = process.env[INTERCOM_SESSION_ID_ENV];
|
|
490
516
|
let reconnectPromise: Promise<IntercomClient> | null = null;
|
|
491
517
|
let reconnectPromiseGeneration: number | null = null;
|
|
@@ -498,19 +524,10 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
498
524
|
let agentRunning = false;
|
|
499
525
|
const activeTools = new Map<string, string>();
|
|
500
526
|
const replyTracker = new ReplyTracker();
|
|
501
|
-
const pendingIdleMessages: InboundMessageEntry[] = [];
|
|
502
527
|
const seenInboundMessages = new Map<string, number>();
|
|
503
528
|
const latestOutboundReceipts = new Map<string, { status: MessageReceiptStatus; timestamp: number; detail?: string }>();
|
|
504
529
|
function dismissIncomingAsk(messageId: string): void {
|
|
505
530
|
replyTracker.dismissPendingAsk(messageId);
|
|
506
|
-
const queuedIndex = pendingIdleMessages.findIndex((entry) => entry.message.id === messageId);
|
|
507
|
-
if (queuedIndex >= 0) pendingIdleMessages.splice(queuedIndex, 1);
|
|
508
|
-
}
|
|
509
|
-
function expirePendingIdleMessages(detail: string): void {
|
|
510
|
-
for (const entry of pendingIdleMessages) {
|
|
511
|
-
emitMessageReceipt(entry.message.id, "expired", detail);
|
|
512
|
-
}
|
|
513
|
-
pendingIdleMessages.length = 0;
|
|
514
531
|
}
|
|
515
532
|
function hasSeenInboundMessage(from: SessionInfo, message: Message, now = Date.now()): boolean {
|
|
516
533
|
for (const [key, seenAt] of seenInboundMessages) {
|
|
@@ -543,22 +560,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
543
560
|
}
|
|
544
561
|
}
|
|
545
562
|
function handleMessageControl(control: MessageControl): void {
|
|
546
|
-
|
|
563
|
+
replyTracker.dismissPendingAsk(control.messageId);
|
|
547
564
|
if (control.action === "cancel") {
|
|
548
|
-
|
|
549
|
-
pendingIdleMessages.splice(queuedIndex, 1);
|
|
550
|
-
replyTracker.dismissPendingAsk(control.messageId);
|
|
551
|
-
emitMessageReceipt(control.messageId, "cancelled", "cancelled before injection");
|
|
552
|
-
} else {
|
|
553
|
-
emitMessageReceipt(control.messageId, "cancellation_requested", "message was not queued; it may already be injected or processed");
|
|
554
|
-
}
|
|
565
|
+
emitMessageReceipt(control.messageId, "cancellation_requested", "message may already be injected or processed");
|
|
555
566
|
return;
|
|
556
567
|
}
|
|
557
|
-
|
|
558
|
-
if (queuedIndex >= 0) {
|
|
559
|
-
pendingIdleMessages.splice(queuedIndex, 1);
|
|
560
|
-
}
|
|
561
|
-
replyTracker.dismissPendingAsk(control.messageId);
|
|
562
568
|
emitMessageReceipt(control.messageId, "superseded", control.supersededBy ? `superseded by ${control.supersededBy}` : undefined);
|
|
563
569
|
}
|
|
564
570
|
function latestDeliveryState(messageId: string | null, fallback: string): string {
|
|
@@ -568,7 +574,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
568
574
|
const receipt = latestOutboundReceipts.get(messageId);
|
|
569
575
|
return receipt ? receipt.status : fallback;
|
|
570
576
|
}
|
|
571
|
-
let inboundFlushTimer: NodeJS.Timeout | null = null;
|
|
572
577
|
let replyWaiter: {
|
|
573
578
|
from: string;
|
|
574
579
|
replyTo: string;
|
|
@@ -638,13 +643,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
638
643
|
clearInterval(namePollTimer);
|
|
639
644
|
namePollTimer = null;
|
|
640
645
|
}
|
|
641
|
-
function clearInboundFlushTimer(): void {
|
|
642
|
-
if (!inboundFlushTimer) {
|
|
643
|
-
return;
|
|
644
|
-
}
|
|
645
|
-
clearTimeout(inboundFlushTimer);
|
|
646
|
-
inboundFlushTimer = null;
|
|
647
|
-
}
|
|
648
646
|
function getLiveContext(ctx: ExtensionContext | null = runtimeContext, generation = runtimeGeneration): ExtensionContext | null {
|
|
649
647
|
if (disposed || shuttingDown || generation !== runtimeGeneration || !ctx) {
|
|
650
648
|
return null;
|
|
@@ -773,7 +771,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
773
771
|
|
|
774
772
|
const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
|
|
775
773
|
return {
|
|
776
|
-
|
|
774
|
+
...identity,
|
|
777
775
|
cwd: liveContext.cwd,
|
|
778
776
|
model: currentModel,
|
|
779
777
|
pid: process.pid,
|
|
@@ -813,17 +811,20 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
813
811
|
}
|
|
814
812
|
const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? sessionId);
|
|
815
813
|
lastPresenceName = identity.name;
|
|
814
|
+
lastPresenceRuntimeFallbackAlias = identity.runtimeFallbackAlias;
|
|
816
815
|
client.updatePresence({ ...identity, status: currentStatus(), ...currentContextUsage() });
|
|
817
816
|
}
|
|
818
817
|
function startNamePoll(): void {
|
|
819
818
|
clearNamePollTimer();
|
|
820
|
-
|
|
819
|
+
const initialIdentity = currentSessionId ? buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId) : null;
|
|
820
|
+
lastPresenceName = initialIdentity?.name ?? null;
|
|
821
|
+
lastPresenceRuntimeFallbackAlias = initialIdentity?.runtimeFallbackAlias ?? null;
|
|
821
822
|
namePollTimer = setInterval(() => {
|
|
822
823
|
if (!currentSessionId || !getLiveContext()) {
|
|
823
824
|
return;
|
|
824
825
|
}
|
|
825
826
|
const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
|
|
826
|
-
if (identity.name !== lastPresenceName) {
|
|
827
|
+
if (identity.name !== lastPresenceName || identity.runtimeFallbackAlias !== lastPresenceRuntimeFallbackAlias) {
|
|
827
828
|
syncPresenceIdentity(currentSessionId);
|
|
828
829
|
}
|
|
829
830
|
}, getNamePollMs());
|
|
@@ -872,73 +873,32 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
872
873
|
}
|
|
873
874
|
return false;
|
|
874
875
|
}
|
|
875
|
-
function sendIncomingMessage(entry: InboundMessageEntry, delivery: "trigger" | "
|
|
876
|
+
function sendIncomingMessage(entry: InboundMessageEntry, delivery: "trigger" | "steer", generation = runtimeGeneration, forceTrigger = false): void {
|
|
876
877
|
if (runtimeStarted && !getLiveContext(runtimeContext, generation)) {
|
|
877
878
|
return;
|
|
878
879
|
}
|
|
879
880
|
const injectedMessage = { ...entry.message, injectedAt: Date.now() };
|
|
880
881
|
emitMessageReceipt(injectedMessage.id, "injected");
|
|
881
|
-
const
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
}
|
|
882
|
+
const replyCommand = delivery === "steer" && entry.replyCommand && entry.message.expectsReply
|
|
883
|
+
? `intercom({ action: "reply", replyTo: ${JSON.stringify(entry.message.id)}, message: "..." })`
|
|
884
|
+
: entry.replyCommand;
|
|
885
|
+
const deliveredEntry = { ...entry, message: injectedMessage, replyCommand };
|
|
886
|
+
replyTracker.queueTurnContext({ from: entry.from, message: injectedMessage, receivedAt: Date.now() });
|
|
885
887
|
const senderDisplay = entry.from.name || entry.from.id.slice(0, 8);
|
|
886
|
-
const replyInstruction =
|
|
888
|
+
const replyInstruction = replyCommand ? `\n\nTo reply, use the intercom tool: ${replyCommand}` : "";
|
|
887
889
|
const deliveryMetadata = formatInboundDeliveryMetadata(injectedMessage);
|
|
888
890
|
pi.sendMessage(
|
|
889
891
|
{
|
|
890
892
|
customType: "intercom_message",
|
|
891
|
-
content:
|
|
893
|
+
content: `**From ${senderDisplay}** (${entry.from.cwd})${replyInstruction}\n\n_${deliveryMetadata}_\n\n${entry.bodyText}`,
|
|
892
894
|
display: true,
|
|
893
895
|
details: deliveredEntry,
|
|
894
896
|
},
|
|
895
897
|
delivery === "trigger" && shouldTriggerInboundMessage(entry, forceTrigger)
|
|
896
898
|
? { triggerTurn: true }
|
|
897
|
-
: { deliverAs: "
|
|
899
|
+
: { deliverAs: "steer" }
|
|
898
900
|
);
|
|
899
901
|
}
|
|
900
|
-
function scheduleInboundFlush(delayMs = INBOUND_FLUSH_DELAY_MS): void {
|
|
901
|
-
if (!getLiveContext()) {
|
|
902
|
-
return;
|
|
903
|
-
}
|
|
904
|
-
const scheduledGeneration = runtimeGeneration;
|
|
905
|
-
clearInboundFlushTimer();
|
|
906
|
-
inboundFlushTimer = setTimeout(() => {
|
|
907
|
-
inboundFlushTimer = null;
|
|
908
|
-
flushIdleMessages(scheduledGeneration);
|
|
909
|
-
}, delayMs);
|
|
910
|
-
}
|
|
911
|
-
function flushIdleMessages(generation = runtimeGeneration): void {
|
|
912
|
-
if (pendingIdleMessages.length === 0) {
|
|
913
|
-
return;
|
|
914
|
-
}
|
|
915
|
-
const ctx = getLiveContext(runtimeContext, generation);
|
|
916
|
-
if (!ctx) {
|
|
917
|
-
return;
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
let isIdle: boolean;
|
|
921
|
-
try {
|
|
922
|
-
isIdle = ctx.isIdle();
|
|
923
|
-
} catch {
|
|
924
|
-
// Stale contexts are cleaned up by shutdown/reload; do not deliver queued messages through them.
|
|
925
|
-
return;
|
|
926
|
-
}
|
|
927
|
-
if (!isIdle) {
|
|
928
|
-
scheduleInboundFlush(INBOUND_IDLE_RETRY_MS);
|
|
929
|
-
return;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
const entries = pendingIdleMessages.splice(0, pendingIdleMessages.length);
|
|
933
|
-
entries.forEach((entry, index) => {
|
|
934
|
-
sendIncomingMessage(entry, index === 0 ? "trigger" : "followUp");
|
|
935
|
-
});
|
|
936
|
-
}
|
|
937
|
-
function queueIdleMessage(entry: InboundMessageEntry): void {
|
|
938
|
-
pendingIdleMessages.push(entry);
|
|
939
|
-
emitMessageReceipt(entry.message.id, "queued");
|
|
940
|
-
scheduleInboundFlush();
|
|
941
|
-
}
|
|
942
902
|
function handleIncomingMessage(ctx: ExtensionContext, from: SessionInfo, message: Message): void {
|
|
943
903
|
const messageGeneration = runtimeGeneration;
|
|
944
904
|
const liveContext = getLiveContext(ctx, messageGeneration);
|
|
@@ -996,7 +956,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
996
956
|
}
|
|
997
957
|
return;
|
|
998
958
|
}
|
|
999
|
-
|
|
959
|
+
sendIncomingMessage(entry, "steer");
|
|
1000
960
|
return;
|
|
1001
961
|
}
|
|
1002
962
|
if (getLiveContext(liveContext, messageGeneration)) {
|
|
@@ -1186,7 +1146,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1186
1146
|
const lowerName = nameOrId.toLowerCase();
|
|
1187
1147
|
const byName = sessions.filter(s => s.name?.toLowerCase() === lowerName);
|
|
1188
1148
|
if (byName.length > 1) {
|
|
1189
|
-
const
|
|
1149
|
+
const prefixes = sessionIdPrefixes(sessions);
|
|
1150
|
+
const ids = byName.map((session) => prefixes.get(session.id)!).join(", ");
|
|
1190
1151
|
throw new Error(`Multiple sessions named "${nameOrId}" are connected. Address one by the id shown in parentheses by "list" (${ids}).`);
|
|
1191
1152
|
}
|
|
1192
1153
|
if (byName.length === 1) {
|
|
@@ -1202,14 +1163,58 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1202
1163
|
}
|
|
1203
1164
|
return null;
|
|
1204
1165
|
}
|
|
1205
|
-
async function resolveSupervisorTarget(activeClient: IntercomClient, metadata: ChildOrchestratorMetadata): Promise<string> {
|
|
1166
|
+
async function resolveSupervisorTarget(activeClient: IntercomClient, metadata: ChildOrchestratorMetadata): Promise<string | null> {
|
|
1206
1167
|
if (metadata.orchestratorSessionId) {
|
|
1207
1168
|
const bySessionId = await resolveSessionTarget(activeClient, metadata.orchestratorSessionId);
|
|
1208
1169
|
if (bySessionId) {
|
|
1209
1170
|
return bySessionId;
|
|
1210
1171
|
}
|
|
1211
1172
|
}
|
|
1212
|
-
return
|
|
1173
|
+
return resolveSessionTarget(activeClient, metadata.orchestratorTarget);
|
|
1174
|
+
}
|
|
1175
|
+
async function resolveCwdDeliveryTarget(activeClient: IntercomClient, options: {
|
|
1176
|
+
to?: string;
|
|
1177
|
+
cwd: string;
|
|
1178
|
+
openProjectPaneIfMissing?: boolean;
|
|
1179
|
+
focus?: boolean;
|
|
1180
|
+
signal?: AbortSignal;
|
|
1181
|
+
}): Promise<DeliveryTarget> {
|
|
1182
|
+
const sessions = await activeClient.listSessions();
|
|
1183
|
+
const currentSessionId = activeClient.sessionId;
|
|
1184
|
+
if (!currentSessionId) {
|
|
1185
|
+
throw new Error("Current session is not registered with intercom.");
|
|
1186
|
+
}
|
|
1187
|
+
const currentSession = sessions.find((session) => session.id === currentSessionId);
|
|
1188
|
+
if (!currentSession) {
|
|
1189
|
+
throw new Error("Current session is missing from intercom session list.");
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
const targetCwd = options.cwd && options.cwd !== "."
|
|
1193
|
+
? resolvePath(currentSession.cwd, options.cwd)
|
|
1194
|
+
: currentSession.cwd;
|
|
1195
|
+
const existing = resolveTargetInCwd({
|
|
1196
|
+
sessions,
|
|
1197
|
+
currentSessionId,
|
|
1198
|
+
targetCwd,
|
|
1199
|
+
...(options.to ? { to: options.to } : {}),
|
|
1200
|
+
});
|
|
1201
|
+
if (existing.kind === "found" && existing.session) {
|
|
1202
|
+
return { id: existing.session.id, label: options.to || existing.session.name || existing.session.id };
|
|
1203
|
+
}
|
|
1204
|
+
if (!options.openProjectPaneIfMissing) {
|
|
1205
|
+
throw new Error(`${existing.reason ?? `No intercom session is connected in ${targetCwd}.`} Pass openProjectPaneIfMissing: true to open a Herdr project pane and start Pi there.`);
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
const beforeSessionIds = new Set(sessions.map((session) => session.id));
|
|
1209
|
+
const projectPane = await openProjectPane({ cwd: targetCwd, focus: options.focus, signal: options.signal });
|
|
1210
|
+
const session = await waitForProjectSession(activeClient, {
|
|
1211
|
+
projectRoot: projectPane.projectRoot,
|
|
1212
|
+
currentSessionId,
|
|
1213
|
+
beforeSessionIds,
|
|
1214
|
+
...(options.to ? { to: options.to } : {}),
|
|
1215
|
+
signal: options.signal,
|
|
1216
|
+
});
|
|
1217
|
+
return { id: session.id, label: session.name || session.id, projectPane };
|
|
1213
1218
|
}
|
|
1214
1219
|
function deliverLocalSubagentRelayMessage(sender: "subagent-control" | "subagent-result", status: string, messageText: string): void {
|
|
1215
1220
|
const liveContext = getLiveContext();
|
|
@@ -1251,10 +1256,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1251
1256
|
clearReconnectTimer();
|
|
1252
1257
|
clearStartupConnectTimer();
|
|
1253
1258
|
clearNamePollTimer();
|
|
1254
|
-
clearInboundFlushTimer();
|
|
1255
1259
|
rejectReplyWaiter(new Error("Session replaced"));
|
|
1256
1260
|
replyTracker.reset();
|
|
1257
|
-
expirePendingIdleMessages("receiver session replaced before injection");
|
|
1258
1261
|
if (previousClient) {
|
|
1259
1262
|
client = null;
|
|
1260
1263
|
void previousClient.disconnect().catch(() => undefined);
|
|
@@ -1265,7 +1268,9 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1265
1268
|
publishIntercomSessionId(currentIntercomSessionId);
|
|
1266
1269
|
currentModel = ctx.model?.id ?? "unknown";
|
|
1267
1270
|
sessionStartedAt = Date.now();
|
|
1268
|
-
|
|
1271
|
+
const initialPresenceIdentity = buildPresenceIdentity(pi, currentIntercomSessionId);
|
|
1272
|
+
lastPresenceName = initialPresenceIdentity.name;
|
|
1273
|
+
lastPresenceRuntimeFallbackAlias = initialPresenceIdentity.runtimeFallbackAlias;
|
|
1269
1274
|
agentRunning = false;
|
|
1270
1275
|
activeTools.clear();
|
|
1271
1276
|
startNamePoll();
|
|
@@ -1400,8 +1405,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1400
1405
|
restoreIntercomSessionId();
|
|
1401
1406
|
rejectReplyWaiter(new Error("Session shutting down"));
|
|
1402
1407
|
replyTracker.reset();
|
|
1403
|
-
expirePendingIdleMessages("receiver session shut down before injection");
|
|
1404
|
-
clearInboundFlushTimer();
|
|
1405
1408
|
agentRunning = false;
|
|
1406
1409
|
activeTools.clear();
|
|
1407
1410
|
if (client) {
|
|
@@ -1418,7 +1421,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1418
1421
|
return;
|
|
1419
1422
|
}
|
|
1420
1423
|
replyTracker.endTurn();
|
|
1421
|
-
scheduleInboundFlush(0);
|
|
1422
1424
|
});
|
|
1423
1425
|
pi.on("agent_start", () => {
|
|
1424
1426
|
if (!getLiveContext()) {
|
|
@@ -1449,7 +1451,6 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1449
1451
|
agentRunning = false;
|
|
1450
1452
|
activeTools.clear();
|
|
1451
1453
|
syncPresenceStatus();
|
|
1452
|
-
scheduleInboundFlush(0);
|
|
1453
1454
|
});
|
|
1454
1455
|
pi.on("turn_start", (_event, ctx) => {
|
|
1455
1456
|
const sessionId = ctx.sessionManager.getSessionId();
|
|
@@ -1471,9 +1472,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1471
1472
|
if (!getLiveContext(ctx)) {
|
|
1472
1473
|
return;
|
|
1473
1474
|
}
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
syncPresenceIdentity(sessionId);
|
|
1475
|
+
currentSessionId = ctx.sessionManager.getSessionId();
|
|
1476
|
+
syncPresenceIdentity(ctx.sessionManager.getSessionId());
|
|
1477
1477
|
});
|
|
1478
1478
|
pi.on("model_select", (event, ctx) => {
|
|
1479
1479
|
if (!getLiveContext(ctx)) {
|
|
@@ -1512,7 +1512,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1512
1512
|
const childOrchestratorMetadata = readChildOrchestratorMetadata();
|
|
1513
1513
|
const nativeSupervisorChannelAvailable = Boolean(process.env[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV]?.trim());
|
|
1514
1514
|
if (childOrchestratorMetadata && !nativeSupervisorChannelAvailable) {
|
|
1515
|
-
pi.registerTool({
|
|
1515
|
+
pi.registerTool(defineTool({
|
|
1516
1516
|
name: "contact_supervisor",
|
|
1517
1517
|
label: "Contact Supervisor",
|
|
1518
1518
|
description: "Subagent-only tool for contacting the supervisor agent that delegated this task. Use need_decision when blocked, uncertain, needing approval, or facing a product/API/scope decision before continuing; this waits for the supervisor's reply. Use interview_request when multiple structured questions need supervisor answers; this also waits for a reply. Use progress_update only for meaningful progress or unexpected discoveries that change the plan; this does not wait for a reply. Do not use for routine completion handoffs.",
|
|
@@ -1589,15 +1589,22 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1589
1589
|
}
|
|
1590
1590
|
|
|
1591
1591
|
const metadata = childOrchestratorMetadata;
|
|
1592
|
-
let
|
|
1592
|
+
let resolvedSupervisor: string | null;
|
|
1593
1593
|
try {
|
|
1594
|
-
|
|
1594
|
+
resolvedSupervisor = await resolveSupervisorTarget(connectedClient, metadata);
|
|
1595
1595
|
} catch (error) {
|
|
1596
1596
|
return {
|
|
1597
1597
|
content: [{ type: "text", text: `Failed to resolve supervisor target: ${getErrorMessage(error)}` }],
|
|
1598
1598
|
details: { error: true },
|
|
1599
1599
|
};
|
|
1600
1600
|
}
|
|
1601
|
+
if (!resolvedSupervisor && reason !== "progress_update") {
|
|
1602
|
+
return {
|
|
1603
|
+
content: [{ type: "text", text: `Supervisor "${metadata.orchestratorTarget}" is not currently connected. Blocking requests are not queued; use a progress update or retry after the supervisor reconnects.` }],
|
|
1604
|
+
details: { error: true },
|
|
1605
|
+
};
|
|
1606
|
+
}
|
|
1607
|
+
const sendTo = resolvedSupervisor ?? metadata.orchestratorTarget;
|
|
1601
1608
|
if (signal?.aborted) {
|
|
1602
1609
|
return {
|
|
1603
1610
|
content: [{ type: "text", text: "Cancelled" }],
|
|
@@ -1773,10 +1780,10 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1773
1780
|
}
|
|
1774
1781
|
return new Text(text, 0, 0);
|
|
1775
1782
|
},
|
|
1776
|
-
}
|
|
1783
|
+
}));
|
|
1777
1784
|
}
|
|
1778
1785
|
|
|
1779
|
-
pi.registerTool({
|
|
1786
|
+
pi.registerTool(defineTool({
|
|
1780
1787
|
name: "intercom",
|
|
1781
1788
|
label: "Intercom",
|
|
1782
1789
|
description: `Send a message to another Selesai session running on this machine.
|
|
@@ -1791,6 +1798,7 @@ Usage:
|
|
|
1791
1798
|
intercom({ action: "list-cwd" }) → List sessions in the current working directory
|
|
1792
1799
|
intercom({ action: "list-cwd", cwd: "/path" }) → List sessions in a specific directory
|
|
1793
1800
|
intercom({ action: "send", to: "name-or-id", message: "..." }) → Send message
|
|
1801
|
+
intercom({ action: "send", cwd: "/path", openProjectPaneIfMissing: true, message: "..." }) → Open a visible Herdr project pane when needed, then send
|
|
1794
1802
|
intercom({ action: "ask", to: "name-or-id", message: "..." }) → Ask and wait for reply
|
|
1795
1803
|
intercom({ action: "cancel", messageId: "..." }) → Request cancellation of a sent message
|
|
1796
1804
|
intercom({ action: "reply", message: "..." }) → Reply to the active/single pending ask
|
|
@@ -1804,7 +1812,7 @@ Usage:
|
|
|
1804
1812
|
description: "Action: 'list', 'list-cwd', 'send', 'ask', 'reply', 'pending', 'status', or 'cancel'",
|
|
1805
1813
|
}),
|
|
1806
1814
|
to: Type.Optional(Type.String({
|
|
1807
|
-
description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For
|
|
1815
|
+
description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For send/ask with cwd, omit to target the sole live session in that cwd or the newly opened project-pane session. For 'reply', disambiguates the pending ask.",
|
|
1808
1816
|
})),
|
|
1809
1817
|
message: Type.Optional(Type.String({
|
|
1810
1818
|
description: "Message to send (for 'send', 'ask', or 'reply' action)",
|
|
@@ -1828,7 +1836,13 @@ Usage:
|
|
|
1828
1836
|
description: "Previous message ID this send/ask is a user-authored retry of. Retries always send a new message ID.",
|
|
1829
1837
|
})),
|
|
1830
1838
|
cwd: Type.Optional(Type.String({
|
|
1831
|
-
description: "Working directory filter for 'list-cwd'
|
|
1839
|
+
description: "Working directory filter for 'list-cwd'. For send/ask, scopes target lookup to that directory; omit 'to' to target the sole live peer there. Absolute, or relative to the current session's cwd; '.' means the current cwd.",
|
|
1840
|
+
})),
|
|
1841
|
+
openProjectPaneIfMissing: Type.Optional(Type.Boolean({
|
|
1842
|
+
description: "For send/ask with cwd, open a visible Herdr project pane and launch Pi there when no matching live session is connected.",
|
|
1843
|
+
})),
|
|
1844
|
+
focus: Type.Optional(Type.Boolean({
|
|
1845
|
+
description: "For openProjectPaneIfMissing, focus the new Herdr pane. Defaults to true.",
|
|
1832
1846
|
})),
|
|
1833
1847
|
}),
|
|
1834
1848
|
|
|
@@ -1845,7 +1859,7 @@ Usage:
|
|
|
1845
1859
|
|
|
1846
1860
|
syncPresenceIdentity(ctx.sessionManager.getSessionId());
|
|
1847
1861
|
|
|
1848
|
-
const { action, to, message, attachments, replyTo, messageId, supersedes, retryOf, cwd } = params;
|
|
1862
|
+
const { action, to, message, attachments, replyTo, messageId, supersedes, retryOf, cwd, openProjectPaneIfMissing, focus } = params;
|
|
1849
1863
|
|
|
1850
1864
|
switch (action) {
|
|
1851
1865
|
case "list": {
|
|
@@ -1862,10 +1876,11 @@ Usage:
|
|
|
1862
1876
|
};
|
|
1863
1877
|
}
|
|
1864
1878
|
|
|
1865
|
-
const
|
|
1879
|
+
const prefixes = sessionIdPrefixes(sessions);
|
|
1880
|
+
const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true, prefixes.get(currentSession.id)!)}`;
|
|
1866
1881
|
const otherSection = otherSessions.length === 0
|
|
1867
1882
|
? "**Other sessions:**\nNo other sessions connected."
|
|
1868
|
-
: `**Other sessions:**\n${otherSessions.map(
|
|
1883
|
+
: `**Other sessions:**\n${otherSessions.map((session) => formatSessionListRow(session, currentSession.cwd, false, prefixes.get(session.id)!)).join("\n")}`;
|
|
1869
1884
|
|
|
1870
1885
|
return {
|
|
1871
1886
|
content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
|
|
@@ -1915,10 +1930,11 @@ Usage:
|
|
|
1915
1930
|
}
|
|
1916
1931
|
}
|
|
1917
1932
|
|
|
1918
|
-
const
|
|
1933
|
+
const prefixes = sessionIdPrefixes(sessions);
|
|
1934
|
+
const currentSection = `**Current session:**\n${formatSessionListRow(currentSession, currentSession.cwd, true, prefixes.get(currentSession.id)!)}`;
|
|
1919
1935
|
const otherSection = otherSessions.length === 0
|
|
1920
1936
|
? `**Other sessions (cwd: ${filterCwd}):**\n${emptyNote}`
|
|
1921
|
-
: `**Other sessions (cwd: ${filterCwd}):**\n${otherSessions.map(
|
|
1937
|
+
: `**Other sessions (cwd: ${filterCwd}):**\n${otherSessions.map((session) => formatSessionListRow(session, currentSession.cwd, false, prefixes.get(session.id)!)).join("\n")}`;
|
|
1922
1938
|
|
|
1923
1939
|
return {
|
|
1924
1940
|
content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
|
|
@@ -1961,25 +1977,50 @@ Usage:
|
|
|
1961
1977
|
}
|
|
1962
1978
|
|
|
1963
1979
|
case "send": {
|
|
1964
|
-
if (!to || !message) {
|
|
1980
|
+
if ((!to && !cwd) || !message) {
|
|
1965
1981
|
return {
|
|
1966
|
-
content: [{ type: "text", text: "Missing 'to' or 'message' parameter" }],
|
|
1982
|
+
content: [{ type: "text", text: "Missing 'to' or 'cwd', or missing 'message' parameter" }],
|
|
1967
1983
|
details: { error: true },
|
|
1968
1984
|
};
|
|
1969
1985
|
}
|
|
1970
1986
|
try {
|
|
1971
|
-
|
|
1987
|
+
if (openProjectPaneIfMissing && !cwd) {
|
|
1988
|
+
return {
|
|
1989
|
+
content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
|
|
1990
|
+
details: { error: true },
|
|
1991
|
+
};
|
|
1992
|
+
}
|
|
1993
|
+
const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
|
|
1994
|
+
const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
|
|
1995
|
+
if (confirmSend && cwd && openProjectPaneIfMissing) {
|
|
1996
|
+
const confirmed = await ctx.ui.confirm(
|
|
1997
|
+
"Send message",
|
|
1998
|
+
`Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
|
|
1999
|
+
);
|
|
2000
|
+
if (!confirmed) {
|
|
2001
|
+
return {
|
|
2002
|
+
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
2003
|
+
details: {},
|
|
2004
|
+
};
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
const target: DeliveryTarget = cwd
|
|
2008
|
+
? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal })
|
|
2009
|
+
: { id: await resolveSessionTarget(connectedClient, to) ?? to, label: to };
|
|
2010
|
+
const sendTo = target.id;
|
|
2011
|
+
const targetDisplay = target.projectPane ? target.label : to ?? target.label;
|
|
1972
2012
|
if (sendTo === connectedClient.sessionId) {
|
|
1973
2013
|
return {
|
|
1974
2014
|
content: [{ type: "text", text: "Cannot message the current session" }],
|
|
1975
2015
|
details: { error: true },
|
|
1976
2016
|
};
|
|
1977
2017
|
}
|
|
1978
|
-
|
|
1979
|
-
|
|
2018
|
+
const inferredAsk = replyTo ? null : replyTracker.findUniquePendingAskFrom(sendTo);
|
|
2019
|
+
const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
|
|
2020
|
+
if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
|
|
1980
2021
|
const confirmed = await ctx.ui.confirm(
|
|
1981
|
-
"Send
|
|
1982
|
-
`Send to "${
|
|
2022
|
+
"Send message",
|
|
2023
|
+
`Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
|
|
1983
2024
|
);
|
|
1984
2025
|
if (!confirmed) {
|
|
1985
2026
|
return {
|
|
@@ -1991,29 +2032,39 @@ Usage:
|
|
|
1991
2032
|
const result = await connectedClient.send(sendTo, {
|
|
1992
2033
|
text: message,
|
|
1993
2034
|
attachments,
|
|
1994
|
-
replyTo,
|
|
2035
|
+
replyTo: effectiveReplyTo,
|
|
1995
2036
|
supersedes,
|
|
1996
2037
|
retryOf,
|
|
1997
2038
|
});
|
|
1998
2039
|
if (!result.delivered) {
|
|
1999
2040
|
const errorText = result.reason ?? "Session may not exist or has disconnected.";
|
|
2000
2041
|
return {
|
|
2001
|
-
content: [{ type: "text", text: `Message to "${
|
|
2042
|
+
content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
|
|
2002
2043
|
details: { messageId: result.id, delivered: false, reason: result.reason },
|
|
2003
2044
|
};
|
|
2004
2045
|
}
|
|
2005
2046
|
pi.appendEntry("intercom_sent", {
|
|
2006
|
-
to,
|
|
2007
|
-
message: { text: message, attachments, replyTo, supersedes, retryOf },
|
|
2047
|
+
to: targetDisplay,
|
|
2048
|
+
message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
|
|
2008
2049
|
messageId: result.id,
|
|
2009
2050
|
timestamp: Date.now(),
|
|
2010
2051
|
});
|
|
2011
|
-
if (
|
|
2012
|
-
dismissIncomingAsk(
|
|
2052
|
+
if (effectiveReplyTo) {
|
|
2053
|
+
dismissIncomingAsk(effectiveReplyTo);
|
|
2013
2054
|
}
|
|
2014
2055
|
return {
|
|
2015
|
-
content: [{
|
|
2016
|
-
|
|
2056
|
+
content: [{
|
|
2057
|
+
type: "text",
|
|
2058
|
+
text: target.projectPane
|
|
2059
|
+
? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
|
|
2060
|
+
: inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
|
|
2061
|
+
}],
|
|
2062
|
+
details: {
|
|
2063
|
+
messageId: result.id,
|
|
2064
|
+
delivered: true,
|
|
2065
|
+
...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
|
|
2066
|
+
...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
|
|
2067
|
+
},
|
|
2017
2068
|
};
|
|
2018
2069
|
} catch (error) {
|
|
2019
2070
|
return {
|
|
@@ -2024,9 +2075,9 @@ Usage:
|
|
|
2024
2075
|
}
|
|
2025
2076
|
|
|
2026
2077
|
case "ask": {
|
|
2027
|
-
if (!to || !message) {
|
|
2078
|
+
if ((!to && !cwd) || !message) {
|
|
2028
2079
|
return {
|
|
2029
|
-
content: [{ type: "text", text: "Missing 'to' or 'message' parameter" }],
|
|
2080
|
+
content: [{ type: "text", text: "Missing 'to' or 'cwd', or missing 'message' parameter" }],
|
|
2030
2081
|
details: { error: true },
|
|
2031
2082
|
};
|
|
2032
2083
|
}
|
|
@@ -2049,7 +2100,27 @@ Usage:
|
|
|
2049
2100
|
let questionId: string | null = null;
|
|
2050
2101
|
|
|
2051
2102
|
try {
|
|
2052
|
-
|
|
2103
|
+
if (openProjectPaneIfMissing && !cwd) {
|
|
2104
|
+
return {
|
|
2105
|
+
content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
|
|
2106
|
+
details: { error: true },
|
|
2107
|
+
};
|
|
2108
|
+
}
|
|
2109
|
+
let target: DeliveryTarget;
|
|
2110
|
+
if (cwd) {
|
|
2111
|
+
target = await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal });
|
|
2112
|
+
} else {
|
|
2113
|
+
const resolved = await resolveSessionTarget(connectedClient, to);
|
|
2114
|
+
if (!resolved) {
|
|
2115
|
+
return {
|
|
2116
|
+
content: [{ type: "text", text: `Session "${to}" is not currently connected. Blocking asks are not queued; use send for a non-blocking mailbox delivery or retry after the session reconnects.` }],
|
|
2117
|
+
details: { error: true },
|
|
2118
|
+
};
|
|
2119
|
+
}
|
|
2120
|
+
target = { id: resolved, label: to };
|
|
2121
|
+
}
|
|
2122
|
+
const sendTo = target.id;
|
|
2123
|
+
const targetDisplay = target.projectPane ? target.label : to ?? target.label;
|
|
2053
2124
|
if (_signal?.aborted) {
|
|
2054
2125
|
return {
|
|
2055
2126
|
content: [{ type: "text", text: "Cancelled" }],
|
|
@@ -2084,7 +2155,7 @@ Usage:
|
|
|
2084
2155
|
deliveryState = sendResult.delivered ? "socket_delivered" : "delivery_failed";
|
|
2085
2156
|
if (!sendResult.delivered) {
|
|
2086
2157
|
const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
|
|
2087
|
-
rejectReplyWaiter(new Error(`Message to "${
|
|
2158
|
+
rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
|
|
2088
2159
|
if (replyPromise) {
|
|
2089
2160
|
try {
|
|
2090
2161
|
await replyPromise;
|
|
@@ -2093,12 +2164,12 @@ Usage:
|
|
|
2093
2164
|
}
|
|
2094
2165
|
}
|
|
2095
2166
|
return {
|
|
2096
|
-
content: [{ type: "text", text: `Message to "${
|
|
2167
|
+
content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
|
|
2097
2168
|
details: { error: true },
|
|
2098
2169
|
};
|
|
2099
2170
|
}
|
|
2100
2171
|
pi.appendEntry("intercom_sent", {
|
|
2101
|
-
to,
|
|
2172
|
+
to: targetDisplay,
|
|
2102
2173
|
message: { text: message, attachments, replyTo, supersedes, retryOf },
|
|
2103
2174
|
messageId: sendResult.id,
|
|
2104
2175
|
timestamp: Date.now(),
|
|
@@ -2109,14 +2180,14 @@ Usage:
|
|
|
2109
2180
|
? formatAttachments(replyMessage.content.attachments)
|
|
2110
2181
|
: "";
|
|
2111
2182
|
pi.appendEntry("intercom_received", {
|
|
2112
|
-
from:
|
|
2183
|
+
from: targetDisplay,
|
|
2113
2184
|
message: { text: replyText, attachments: replyMessage.content.attachments },
|
|
2114
2185
|
messageId: replyMessage.id,
|
|
2115
2186
|
timestamp: replyMessage.timestamp,
|
|
2116
2187
|
});
|
|
2117
2188
|
return {
|
|
2118
|
-
content: [{ type: "text", text: `**Reply from ${
|
|
2119
|
-
details: {},
|
|
2189
|
+
content: [{ type: "text", text: `**Reply from ${targetDisplay}:**\n${replyText}${replyAttachments}` }],
|
|
2190
|
+
details: target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {},
|
|
2120
2191
|
};
|
|
2121
2192
|
} catch (error) {
|
|
2122
2193
|
rejectReplyWaiter(toError(error));
|
|
@@ -2264,7 +2335,7 @@ Usage:
|
|
|
2264
2335
|
}
|
|
2265
2336
|
return new Text(text, 0, 0);
|
|
2266
2337
|
},
|
|
2267
|
-
}
|
|
2338
|
+
}));
|
|
2268
2339
|
|
|
2269
2340
|
function insertIntoEditor(ctx: ExtensionContext, text: string): boolean {
|
|
2270
2341
|
if (!ctx.hasUI) return false;
|