@code-yeongyu/senpi 2026.8.26 → 2026.8.28-2
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 +138 -0
- package/README.md +3 -3
- package/dist/cli/args.d.ts +5 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +18 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +5 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +11 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -0
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +67 -29
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/credential-accounts.d.ts +31 -0
- package/dist/core/credential-accounts.d.ts.map +1 -0
- package/dist/core/credential-accounts.js +135 -0
- package/dist/core/credential-accounts.js.map +1 -0
- package/dist/core/credential-pool/classify.d.ts +47 -0
- package/dist/core/credential-pool/classify.d.ts.map +1 -0
- package/dist/core/credential-pool/classify.js +92 -0
- package/dist/core/credential-pool/classify.js.map +1 -0
- package/dist/core/credential-pool/env-slots.d.ts +22 -0
- package/dist/core/credential-pool/env-slots.d.ts.map +1 -0
- package/dist/core/credential-pool/env-slots.js +37 -0
- package/dist/core/credential-pool/env-slots.js.map +1 -0
- package/dist/core/credential-pool/failover.d.ts +62 -0
- package/dist/core/credential-pool/failover.d.ts.map +1 -0
- package/dist/core/credential-pool/failover.js +124 -0
- package/dist/core/credential-pool/failover.js.map +1 -0
- package/dist/core/credential-pool/rotation-stream.d.ts +54 -0
- package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -0
- package/dist/core/credential-pool/rotation-stream.js +183 -0
- package/dist/core/credential-pool/rotation-stream.js.map +1 -0
- package/dist/core/credential-pool/state-store.d.ts +89 -0
- package/dist/core/credential-pool/state-store.d.ts.map +1 -0
- package/dist/core/credential-pool/state-store.js +166 -0
- package/dist/core/credential-pool/state-store.js.map +1 -0
- package/dist/core/extensions/builtin/account/index.d.ts +9 -0
- package/dist/core/extensions/builtin/account/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/account/index.js +69 -0
- package/dist/core/extensions/builtin/account/index.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +67 -0
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +1 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +14 -22
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation-recovery.js +2 -0
- package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +8 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +15 -0
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +2 -2
- package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts +6 -1
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/format.js +6 -0
- package/dist/core/extensions/builtin/goal/format.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +7 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +5 -2
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +31 -7
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/persistence.js +2 -0
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
- package/dist/core/extensions/builtin/goal/renderers.d.ts +14 -0
- package/dist/core/extensions/builtin/goal/renderers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/renderers.js +153 -0
- package/dist/core/extensions/builtin/goal/renderers.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +6 -2
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +8 -2
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +16 -6
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/types.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js +10 -3
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +4 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +13 -0
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +4 -2
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js +1 -1
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.js +1 -1
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.js.map +1 -1
- package/dist/core/hidden-stdout-log.d.ts +10 -0
- package/dist/core/hidden-stdout-log.d.ts.map +1 -1
- package/dist/core/hidden-stdout-log.js +36 -5
- package/dist/core/hidden-stdout-log.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +85 -12
- package/dist/core/model-config-schema.d.ts.map +1 -1
- package/dist/core/model-config-schema.js +25 -0
- package/dist/core/model-config-schema.js.map +1 -1
- package/dist/core/model-runtime.d.ts +36 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +142 -12
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/retry-fallback/chains.d.ts +23 -1
- package/dist/core/retry-fallback/chains.d.ts.map +1 -1
- package/dist/core/retry-fallback/chains.js +59 -3
- package/dist/core/retry-fallback/chains.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +9 -2
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +9 -0
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/retry-fallback/validate.js +1 -1
- package/dist/core/retry-fallback/validate.js.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +31 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +2 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +32 -7
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +48 -4
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/server/account.d.ts.map +1 -1
- package/dist/modes/app-server/server/account.js +5 -5
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +11 -3
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +31 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-fallback.js +82 -1
- package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts +4 -4
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/chrome.js.map +1 -1
- package/dist/modes/interactive/grok/footer.d.ts +3 -3
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
- package/dist/modes/interactive/grok/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +44 -0
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-host-runtime.js +529 -0
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +340 -257
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +151 -30
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts +41 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -0
- package/dist/modes/rpc/host-ensure.js +245 -0
- package/dist/modes/rpc/host-ensure.js.map +1 -0
- package/dist/modes/rpc/host-lifecycle.d.ts +57 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -0
- package/dist/modes/rpc/host-lifecycle.js +491 -0
- package/dist/modes/rpc/host-lifecycle.js.map +1 -0
- package/dist/modes/rpc/host-watchdog.d.ts +33 -0
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -0
- package/dist/modes/rpc/host-watchdog.js +142 -0
- package/dist/modes/rpc/host-watchdog.js.map +1 -0
- package/dist/modes/rpc/multi-session-host.d.ts +7 -1
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +216 -32
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +115 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +200 -32
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +4 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +4 -2
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +166 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +22 -0
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +165 -16
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +15 -2
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +69 -25
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +16 -0
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +40 -3
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/docs/providers.md +48 -0
- package/docs/rpc.md +96 -5
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +56 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +13 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +15 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +711 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +10 -10
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +9 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +6 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +20 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js +27 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +24 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +7 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.js +46 -14
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +30 -16
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.js +75 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts +45 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js +81 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts +31 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.js +65 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +37 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +32 -6
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +6 -1
- package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +75 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +75 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +5 -5
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +5 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +90 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { AgentMessage, ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
7
7
|
import type { ImageContent } from "@earendil-works/pi-ai";
|
|
8
|
-
import type { SessionStats } from "../../core/agent-session.ts";
|
|
8
|
+
import type { PromptDisposition, SessionStats } from "../../core/agent-session.ts";
|
|
9
9
|
import type { BashResult } from "../../core/bash-executor.ts";
|
|
10
10
|
import type { CompactionResult } from "../../core/compaction/index.ts";
|
|
11
11
|
import type { ServiceTier } from "../../core/extensions/builtin/service-tier.ts";
|
|
@@ -13,6 +13,8 @@ import type { SessionEntry, SessionTreeNode } from "../../core/session-manager.t
|
|
|
13
13
|
import type { JsonAgentSessionEvent } from "../json-event.ts";
|
|
14
14
|
import type { RpcAccountFailoverEvent, RpcAuthAccountsChangedEvent, RpcExtensionEvent, RpcProviderAccount, RpcSessionState, RpcSlashCommand } from "./rpc-types.ts";
|
|
15
15
|
export interface RpcClientOptions {
|
|
16
|
+
/** Connect to an existing multi-session Unix socket instead of spawning a child. */
|
|
17
|
+
socketPath?: string;
|
|
16
18
|
/** Path to the CLI entry point (default: searches for dist/cli.js) */
|
|
17
19
|
cliPath?: string;
|
|
18
20
|
/** Working directory for the agent */
|
|
@@ -33,15 +35,29 @@ export interface ModelInfo {
|
|
|
33
35
|
reasoning: boolean;
|
|
34
36
|
supportedThinkingLevels?: ThinkingLevel[];
|
|
35
37
|
}
|
|
38
|
+
type PromptOptions = {
|
|
39
|
+
images?: ImageContent[];
|
|
40
|
+
streamingBehavior?: "steer" | "followUp";
|
|
41
|
+
thinkingLevel?: ThinkingLevel;
|
|
42
|
+
promptDisposition?: (disposition: PromptDisposition) => void;
|
|
43
|
+
preflightResult?: (success: boolean) => void;
|
|
44
|
+
expandPromptTemplates?: boolean;
|
|
45
|
+
};
|
|
36
46
|
export type RpcProviderAccountEvent = RpcAuthAccountsChangedEvent | RpcAccountFailoverEvent;
|
|
37
|
-
export type RpcClientEvent = JsonAgentSessionEvent | RpcProviderAccountEvent | RpcExtensionEvent
|
|
47
|
+
export type RpcClientEvent = JsonAgentSessionEvent | RpcProviderAccountEvent | RpcExtensionEvent | {
|
|
48
|
+
type: "bash_start";
|
|
49
|
+
} | {
|
|
50
|
+
type: "bash_end";
|
|
51
|
+
};
|
|
38
52
|
export type RpcEventListener = (event: RpcClientEvent) => void;
|
|
39
53
|
export declare class RpcClient {
|
|
40
54
|
private process;
|
|
55
|
+
private socket;
|
|
41
56
|
private stopReadingStdout;
|
|
42
57
|
private eventListeners;
|
|
43
58
|
private pendingRequests;
|
|
44
59
|
private requestId;
|
|
60
|
+
private sessionId;
|
|
45
61
|
private stderr;
|
|
46
62
|
private exitError;
|
|
47
63
|
private options;
|
|
@@ -54,6 +70,7 @@ export declare class RpcClient {
|
|
|
54
70
|
* Stop the RPC agent process.
|
|
55
71
|
*/
|
|
56
72
|
stop(): Promise<void>;
|
|
73
|
+
private startSocket;
|
|
57
74
|
/**
|
|
58
75
|
* Subscribe to agent events.
|
|
59
76
|
*/
|
|
@@ -62,31 +79,95 @@ export declare class RpcClient {
|
|
|
62
79
|
* Get collected stderr output (useful for debugging).
|
|
63
80
|
*/
|
|
64
81
|
getStderr(): string;
|
|
82
|
+
openSession(options: {
|
|
83
|
+
sessionPath?: string;
|
|
84
|
+
cwd?: string;
|
|
85
|
+
provider?: string;
|
|
86
|
+
modelId?: string;
|
|
87
|
+
thinkingLevel?: ThinkingLevel;
|
|
88
|
+
permissionPreset?: string;
|
|
89
|
+
}): Promise<{
|
|
90
|
+
sessionId: string;
|
|
91
|
+
state: RpcSessionState;
|
|
92
|
+
attached?: boolean;
|
|
93
|
+
}>;
|
|
94
|
+
closeSession(sessionId?: string | undefined): Promise<void>;
|
|
95
|
+
listSessions(): Promise<Array<{
|
|
96
|
+
sessionId: string;
|
|
97
|
+
durableSessionId?: string;
|
|
98
|
+
sessionPath?: string;
|
|
99
|
+
cwd: string;
|
|
100
|
+
name?: string;
|
|
101
|
+
status: "opening" | "open" | "closing" | "closed";
|
|
102
|
+
}>>;
|
|
65
103
|
/**
|
|
66
104
|
* Send a prompt to the agent.
|
|
67
105
|
* Returns immediately after sending; use onEvent() to receive streaming events.
|
|
68
106
|
* Use waitForIdle() to wait for completion.
|
|
107
|
+
*
|
|
108
|
+
* The disposition/preflight callbacks mirror AgentSession's local prompt contract:
|
|
109
|
+
* they fire synchronously while the response frame is dispatched — before any
|
|
110
|
+
* queued message_start event — so optimistic-echo eligibility is settled in wire
|
|
111
|
+
* order. A success response without a disposition (older host) maps to "handled"
|
|
112
|
+
* so the echo degrades to canonical-only rendering instead of double-rendering.
|
|
69
113
|
*/
|
|
70
114
|
prompt(message: string, images?: ImageContent[]): Promise<void>;
|
|
115
|
+
prompt(message: string, options?: PromptOptions): Promise<void>;
|
|
116
|
+
appendUserMessage(content: unknown): Promise<void>;
|
|
117
|
+
appendSessionEntry(entry: import("../../core/session-manager.ts").SessionEntry): Promise<void>;
|
|
118
|
+
sendCustomMessage<T = unknown>(message: {
|
|
119
|
+
customType: string;
|
|
120
|
+
content: unknown;
|
|
121
|
+
display: boolean;
|
|
122
|
+
details?: T;
|
|
123
|
+
}, options?: {
|
|
124
|
+
triggerTurn?: boolean;
|
|
125
|
+
deliverAs?: "steer" | "followUp" | "nextTurn";
|
|
126
|
+
}): Promise<void>;
|
|
71
127
|
/**
|
|
72
128
|
* Queue a steering message to interrupt the agent mid-run.
|
|
73
129
|
*/
|
|
74
|
-
steer(message: string, images?: ImageContent[]
|
|
130
|
+
steer(message: string, images?: ImageContent[], recovery?: {
|
|
131
|
+
enqueueOrder?: number;
|
|
132
|
+
}): Promise<void>;
|
|
75
133
|
/**
|
|
76
134
|
* Queue a follow-up message to be processed after the agent finishes.
|
|
77
135
|
*/
|
|
78
|
-
followUp(message: string, images?: ImageContent[]
|
|
136
|
+
followUp(message: string, images?: ImageContent[], recovery?: {
|
|
137
|
+
enqueueOrder?: number;
|
|
138
|
+
}): Promise<void>;
|
|
79
139
|
/**
|
|
80
140
|
* Abort current operation.
|
|
81
141
|
*/
|
|
82
142
|
abort(): Promise<void>;
|
|
143
|
+
abortCompaction(): Promise<void>;
|
|
144
|
+
reload(): Promise<{
|
|
145
|
+
cancelled: boolean;
|
|
146
|
+
reason?: string;
|
|
147
|
+
}>;
|
|
148
|
+
checkReloadVeto(): Promise<{
|
|
149
|
+
cancelled: boolean;
|
|
150
|
+
reason?: string;
|
|
151
|
+
}>;
|
|
83
152
|
/**
|
|
84
153
|
* Clear queued steering and follow-up messages, returning their text.
|
|
85
154
|
*/
|
|
86
|
-
clearQueue(
|
|
155
|
+
clearQueue(options?: {
|
|
156
|
+
abortWillFollow?: boolean;
|
|
157
|
+
}): Promise<{
|
|
87
158
|
steering: string[];
|
|
88
159
|
followUp: string[];
|
|
160
|
+
ordered: Array<{
|
|
161
|
+
text: string;
|
|
162
|
+
mode: "steer" | "followUp";
|
|
163
|
+
enqueueOrder: number;
|
|
164
|
+
}>;
|
|
89
165
|
}>;
|
|
166
|
+
getSteeringMessages(): Promise<string[]>;
|
|
167
|
+
getFollowUpMessages(): Promise<string[]>;
|
|
168
|
+
abortBranchSummary(): Promise<void>;
|
|
169
|
+
recordBashResult(command: string, result: BashResult, excludeFromContext?: boolean): Promise<void>;
|
|
170
|
+
setLabel(entryId: string, label?: string): Promise<void>;
|
|
90
171
|
/**
|
|
91
172
|
* Start a new session, optionally with parent tracking.
|
|
92
173
|
* @param parentSession - Optional parent session path for lineage tracking
|
|
@@ -105,6 +186,7 @@ export declare class RpcClient {
|
|
|
105
186
|
setModel(provider: string, modelId: string): Promise<{
|
|
106
187
|
provider: string;
|
|
107
188
|
id: string;
|
|
189
|
+
systemPromptName?: string;
|
|
108
190
|
}>;
|
|
109
191
|
/**
|
|
110
192
|
* Cycle to next model.
|
|
@@ -186,7 +268,21 @@ export declare class RpcClient {
|
|
|
186
268
|
/**
|
|
187
269
|
* Execute a bash command.
|
|
188
270
|
*/
|
|
189
|
-
bash(command: string
|
|
271
|
+
bash(command: string, options?: {
|
|
272
|
+
excludeFromContext?: boolean;
|
|
273
|
+
operations?: Record<string, unknown>;
|
|
274
|
+
}): Promise<BashResult>;
|
|
275
|
+
navigateTree(targetId: string, options?: {
|
|
276
|
+
summarize?: boolean;
|
|
277
|
+
customInstructions?: string;
|
|
278
|
+
replaceInstructions?: boolean;
|
|
279
|
+
label?: string;
|
|
280
|
+
}): Promise<{
|
|
281
|
+
cancelled: boolean;
|
|
282
|
+
editorText?: string;
|
|
283
|
+
aborted?: boolean;
|
|
284
|
+
summaryEntry?: unknown;
|
|
285
|
+
}>;
|
|
190
286
|
/**
|
|
191
287
|
* Abort running bash command.
|
|
192
288
|
*/
|
|
@@ -201,18 +297,25 @@ export declare class RpcClient {
|
|
|
201
297
|
exportHtml(outputPath?: string): Promise<{
|
|
202
298
|
path: string;
|
|
203
299
|
}>;
|
|
300
|
+
exportJsonl(outputPath?: string): Promise<{
|
|
301
|
+
path: string;
|
|
302
|
+
}>;
|
|
204
303
|
/**
|
|
205
304
|
* Switch to a different session file.
|
|
206
305
|
* @returns Object with `cancelled: true` if an extension cancelled the switch
|
|
207
306
|
*/
|
|
208
|
-
switchSession(sessionPath: string
|
|
307
|
+
switchSession(sessionPath: string, options?: {
|
|
308
|
+
cwdOverride?: string;
|
|
309
|
+
}): Promise<{
|
|
209
310
|
cancelled: boolean;
|
|
210
311
|
}>;
|
|
211
312
|
/**
|
|
212
313
|
* Fork from a specific message.
|
|
213
314
|
* @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)
|
|
214
315
|
*/
|
|
215
|
-
fork(entryId: string
|
|
316
|
+
fork(entryId: string, options?: {
|
|
317
|
+
position?: "before" | "at";
|
|
318
|
+
}): Promise<{
|
|
216
319
|
text: string;
|
|
217
320
|
cancelled: boolean;
|
|
218
321
|
}>;
|
|
@@ -252,6 +355,9 @@ export declare class RpcClient {
|
|
|
252
355
|
* Set the session display name.
|
|
253
356
|
*/
|
|
254
357
|
setSessionName(name: string): Promise<void>;
|
|
358
|
+
importJsonl(inputPath: string, cwdOverride?: string): Promise<{
|
|
359
|
+
cancelled: boolean;
|
|
360
|
+
}>;
|
|
255
361
|
/**
|
|
256
362
|
* Get all messages in the session.
|
|
257
363
|
*/
|
|
@@ -287,4 +393,5 @@ export declare class RpcClient {
|
|
|
287
393
|
private send;
|
|
288
394
|
private getData;
|
|
289
395
|
}
|
|
396
|
+
export {};
|
|
290
397
|
//# sourceMappingURL=rpc-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Spawns the agent in RPC mode and provides a typed API for all operations.
|
|
5
5
|
*/
|
|
6
6
|
import { spawn } from "node:child_process";
|
|
7
|
+
import { createConnection } from "node:net";
|
|
8
|
+
import { MissingSessionCwdError } from "../../core/session-cwd.js";
|
|
7
9
|
import { attachJsonlLineReader, serializeJsonLine } from "./jsonl.js";
|
|
8
10
|
function isProviderAccountEvent(event) {
|
|
9
11
|
return event.type === "auth_accounts_changed" || event.type === "account_failover";
|
|
@@ -14,6 +16,7 @@ function isProviderAccountEvent(event) {
|
|
|
14
16
|
export class RpcClient {
|
|
15
17
|
constructor(options = {}) {
|
|
16
18
|
this.process = null;
|
|
19
|
+
this.socket = null;
|
|
17
20
|
this.stopReadingStdout = null;
|
|
18
21
|
this.eventListeners = [];
|
|
19
22
|
this.pendingRequests = new Map();
|
|
@@ -26,10 +29,14 @@ export class RpcClient {
|
|
|
26
29
|
* Start the RPC agent process.
|
|
27
30
|
*/
|
|
28
31
|
async start() {
|
|
29
|
-
if (this.process) {
|
|
32
|
+
if (this.process || this.socket) {
|
|
30
33
|
throw new Error("Client already started");
|
|
31
34
|
}
|
|
32
35
|
this.exitError = null;
|
|
36
|
+
if (this.options.socketPath) {
|
|
37
|
+
await this.startSocket(this.options.socketPath);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
33
40
|
const cliPath = this.options.cliPath ?? "dist/cli.js";
|
|
34
41
|
const args = ["--mode", "rpc"];
|
|
35
42
|
if (this.options.provider) {
|
|
@@ -89,6 +96,15 @@ export class RpcClient {
|
|
|
89
96
|
* Stop the RPC agent process.
|
|
90
97
|
*/
|
|
91
98
|
async stop() {
|
|
99
|
+
if (this.socket) {
|
|
100
|
+
this.stopReadingStdout?.();
|
|
101
|
+
this.stopReadingStdout = null;
|
|
102
|
+
this.socket.destroy();
|
|
103
|
+
this.socket = null;
|
|
104
|
+
this.sessionId = undefined;
|
|
105
|
+
this.rejectPendingRequests(new Error("RPC socket client stopped"));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
92
108
|
if (!this.process)
|
|
93
109
|
return;
|
|
94
110
|
this.stopReadingStdout?.();
|
|
@@ -108,6 +124,40 @@ export class RpcClient {
|
|
|
108
124
|
this.process = null;
|
|
109
125
|
this.pendingRequests.clear();
|
|
110
126
|
}
|
|
127
|
+
async startSocket(path) {
|
|
128
|
+
const socket = createConnection(path);
|
|
129
|
+
this.socket = socket;
|
|
130
|
+
await new Promise((resolve, reject) => {
|
|
131
|
+
const onConnect = () => {
|
|
132
|
+
cleanup();
|
|
133
|
+
resolve();
|
|
134
|
+
};
|
|
135
|
+
const onError = (error) => {
|
|
136
|
+
cleanup();
|
|
137
|
+
this.socket = null;
|
|
138
|
+
reject(error);
|
|
139
|
+
};
|
|
140
|
+
const cleanup = () => {
|
|
141
|
+
socket.off("connect", onConnect);
|
|
142
|
+
socket.off("error", onError);
|
|
143
|
+
};
|
|
144
|
+
socket.once("connect", onConnect);
|
|
145
|
+
socket.once("error", onError);
|
|
146
|
+
});
|
|
147
|
+
this.stopReadingStdout = attachJsonlLineReader(socket, (line) => this.handleLine(line));
|
|
148
|
+
socket.once("close", () => {
|
|
149
|
+
if (this.socket !== socket)
|
|
150
|
+
return;
|
|
151
|
+
this.socket = null;
|
|
152
|
+
this.rejectPendingRequests(new Error("RPC socket closed"));
|
|
153
|
+
});
|
|
154
|
+
socket.once("error", (error) => {
|
|
155
|
+
if (this.socket !== socket)
|
|
156
|
+
return;
|
|
157
|
+
this.exitError = error;
|
|
158
|
+
this.rejectPendingRequests(error);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
111
161
|
/**
|
|
112
162
|
* Subscribe to agent events.
|
|
113
163
|
*/
|
|
@@ -129,25 +179,74 @@ export class RpcClient {
|
|
|
129
179
|
// =========================================================================
|
|
130
180
|
// Command Methods
|
|
131
181
|
// =========================================================================
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
182
|
+
async openSession(options) {
|
|
183
|
+
const response = await this.send({ type: "open_session", ...options }, false);
|
|
184
|
+
const opened = this.getData(response);
|
|
185
|
+
this.sessionId = opened.sessionId;
|
|
186
|
+
return opened;
|
|
187
|
+
}
|
|
188
|
+
async closeSession(sessionId = this.sessionId) {
|
|
189
|
+
if (!sessionId)
|
|
190
|
+
return;
|
|
191
|
+
await this.send({ type: "close_session", sessionId }, false);
|
|
192
|
+
if (this.sessionId === sessionId)
|
|
193
|
+
this.sessionId = undefined;
|
|
194
|
+
}
|
|
195
|
+
async listSessions() {
|
|
196
|
+
const response = await this.send({ type: "list_sessions" }, false);
|
|
197
|
+
return this.getData(response).sessions;
|
|
198
|
+
}
|
|
199
|
+
async prompt(message, optionsOrImages) {
|
|
200
|
+
const options = Array.isArray(optionsOrImages)
|
|
201
|
+
? { images: optionsOrImages }
|
|
202
|
+
: (optionsOrImages ?? {});
|
|
203
|
+
const response = await this.send({
|
|
204
|
+
type: "prompt",
|
|
205
|
+
message,
|
|
206
|
+
...(options.images ? { images: options.images } : {}),
|
|
207
|
+
...(options.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),
|
|
208
|
+
...(options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),
|
|
209
|
+
...(options.expandPromptTemplates !== undefined
|
|
210
|
+
? { expandPromptTemplates: options.expandPromptTemplates }
|
|
211
|
+
: {}),
|
|
212
|
+
}, true, {
|
|
213
|
+
onResponse: (wireResponse) => {
|
|
214
|
+
if (!wireResponse.success) {
|
|
215
|
+
options?.preflightResult?.(false);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const data = wireResponse.data;
|
|
219
|
+
options?.promptDisposition?.(data?.disposition ?? "handled");
|
|
220
|
+
options?.preflightResult?.(true);
|
|
221
|
+
},
|
|
222
|
+
onReject: () => {
|
|
223
|
+
options?.preflightResult?.(false);
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
if (!response.success) {
|
|
227
|
+
throw new Error(response.error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async appendUserMessage(content) {
|
|
231
|
+
await this.send({ type: "append_user_message", content });
|
|
232
|
+
}
|
|
233
|
+
async appendSessionEntry(entry) {
|
|
234
|
+
await this.send({ type: "append_session_entry", entry });
|
|
235
|
+
}
|
|
236
|
+
async sendCustomMessage(message, options) {
|
|
237
|
+
await this.send({ type: "send_custom_message", ...message, ...options });
|
|
139
238
|
}
|
|
140
239
|
/**
|
|
141
240
|
* Queue a steering message to interrupt the agent mid-run.
|
|
142
241
|
*/
|
|
143
|
-
async steer(message, images) {
|
|
144
|
-
await this.send({ type: "steer", message, images });
|
|
242
|
+
async steer(message, images, recovery) {
|
|
243
|
+
await this.send({ type: "steer", message, images, enqueueOrder: recovery?.enqueueOrder });
|
|
145
244
|
}
|
|
146
245
|
/**
|
|
147
246
|
* Queue a follow-up message to be processed after the agent finishes.
|
|
148
247
|
*/
|
|
149
|
-
async followUp(message, images) {
|
|
150
|
-
await this.send({ type: "follow_up", message, images });
|
|
248
|
+
async followUp(message, images, recovery) {
|
|
249
|
+
await this.send({ type: "follow_up", message, images, enqueueOrder: recovery?.enqueueOrder });
|
|
151
250
|
}
|
|
152
251
|
/**
|
|
153
252
|
* Abort current operation.
|
|
@@ -155,13 +254,41 @@ export class RpcClient {
|
|
|
155
254
|
async abort() {
|
|
156
255
|
await this.send({ type: "abort" });
|
|
157
256
|
}
|
|
257
|
+
async abortCompaction() {
|
|
258
|
+
await this.send({ type: "abort_compaction" });
|
|
259
|
+
}
|
|
260
|
+
async reload() {
|
|
261
|
+
const response = await this.send({ type: "reload" });
|
|
262
|
+
return this.getData(response);
|
|
263
|
+
}
|
|
264
|
+
async checkReloadVeto() {
|
|
265
|
+
const response = await this.send({ type: "check_reload_veto" });
|
|
266
|
+
return this.getData(response);
|
|
267
|
+
}
|
|
158
268
|
/**
|
|
159
269
|
* Clear queued steering and follow-up messages, returning their text.
|
|
160
270
|
*/
|
|
161
|
-
async clearQueue() {
|
|
162
|
-
const response = await this.send({ type: "clear_queue" });
|
|
271
|
+
async clearQueue(options) {
|
|
272
|
+
const response = await this.send({ type: "clear_queue", abortWillFollow: options?.abortWillFollow });
|
|
163
273
|
return this.getData(response);
|
|
164
274
|
}
|
|
275
|
+
async getSteeringMessages() {
|
|
276
|
+
const response = await this.send({ type: "get_steering_messages" });
|
|
277
|
+
return this.getData(response).messages;
|
|
278
|
+
}
|
|
279
|
+
async getFollowUpMessages() {
|
|
280
|
+
const response = await this.send({ type: "get_follow_up_messages" });
|
|
281
|
+
return this.getData(response).messages;
|
|
282
|
+
}
|
|
283
|
+
async abortBranchSummary() {
|
|
284
|
+
await this.send({ type: "abort_branch_summary" });
|
|
285
|
+
}
|
|
286
|
+
async recordBashResult(command, result, excludeFromContext) {
|
|
287
|
+
await this.send({ type: "record_bash_result", command, result, excludeFromContext });
|
|
288
|
+
}
|
|
289
|
+
async setLabel(entryId, label) {
|
|
290
|
+
await this.send({ type: "set_label", entryId, label });
|
|
291
|
+
}
|
|
165
292
|
/**
|
|
166
293
|
* Start a new session, optionally with parent tracking.
|
|
167
294
|
* @param parentSession - Optional parent session path for lineage tracking
|
|
@@ -282,8 +409,17 @@ export class RpcClient {
|
|
|
282
409
|
/**
|
|
283
410
|
* Execute a bash command.
|
|
284
411
|
*/
|
|
285
|
-
async bash(command) {
|
|
286
|
-
const response = await this.send({
|
|
412
|
+
async bash(command, options) {
|
|
413
|
+
const response = await this.send({
|
|
414
|
+
type: "bash",
|
|
415
|
+
command,
|
|
416
|
+
excludeFromContext: options?.excludeFromContext,
|
|
417
|
+
operations: options?.operations,
|
|
418
|
+
});
|
|
419
|
+
return this.getData(response);
|
|
420
|
+
}
|
|
421
|
+
async navigateTree(targetId, options) {
|
|
422
|
+
const response = await this.send({ type: "navigate_tree", targetId, ...options });
|
|
287
423
|
return this.getData(response);
|
|
288
424
|
}
|
|
289
425
|
/**
|
|
@@ -306,20 +442,24 @@ export class RpcClient {
|
|
|
306
442
|
const response = await this.send({ type: "export_html", outputPath });
|
|
307
443
|
return this.getData(response);
|
|
308
444
|
}
|
|
445
|
+
async exportJsonl(outputPath) {
|
|
446
|
+
const response = await this.send({ type: "export_jsonl", outputPath });
|
|
447
|
+
return this.getData(response);
|
|
448
|
+
}
|
|
309
449
|
/**
|
|
310
450
|
* Switch to a different session file.
|
|
311
451
|
* @returns Object with `cancelled: true` if an extension cancelled the switch
|
|
312
452
|
*/
|
|
313
|
-
async switchSession(sessionPath) {
|
|
314
|
-
const response = await this.send({ type: "switch_session", sessionPath });
|
|
453
|
+
async switchSession(sessionPath, options) {
|
|
454
|
+
const response = await this.send({ type: "switch_session", sessionPath, cwdOverride: options?.cwdOverride });
|
|
315
455
|
return this.getData(response);
|
|
316
456
|
}
|
|
317
457
|
/**
|
|
318
458
|
* Fork from a specific message.
|
|
319
459
|
* @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)
|
|
320
460
|
*/
|
|
321
|
-
async fork(entryId) {
|
|
322
|
-
const response = await this.send({ type: "fork", entryId });
|
|
461
|
+
async fork(entryId, options) {
|
|
462
|
+
const response = await this.send({ type: "fork", entryId, position: options?.position });
|
|
323
463
|
return this.getData(response);
|
|
324
464
|
}
|
|
325
465
|
/**
|
|
@@ -364,6 +504,10 @@ export class RpcClient {
|
|
|
364
504
|
async setSessionName(name) {
|
|
365
505
|
await this.send({ type: "set_session_name", name });
|
|
366
506
|
}
|
|
507
|
+
async importJsonl(inputPath, cwdOverride) {
|
|
508
|
+
const response = await this.send({ type: "import_jsonl", inputPath, cwdOverride });
|
|
509
|
+
return this.getData(response);
|
|
510
|
+
}
|
|
367
511
|
/**
|
|
368
512
|
* Get all messages in the session.
|
|
369
513
|
*/
|
|
@@ -433,7 +577,10 @@ export class RpcClient {
|
|
|
433
577
|
reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));
|
|
434
578
|
}, timeout);
|
|
435
579
|
const unsubscribe = this.onEvent((event) => {
|
|
436
|
-
if (isProviderAccountEvent(event) ||
|
|
580
|
+
if (isProviderAccountEvent(event) ||
|
|
581
|
+
event.type === "extension_event" ||
|
|
582
|
+
event.type === "bash_start" ||
|
|
583
|
+
event.type === "bash_end")
|
|
437
584
|
return;
|
|
438
585
|
events.push(event);
|
|
439
586
|
if (event.type === "agent_settled") {
|
|
@@ -449,7 +596,7 @@ export class RpcClient {
|
|
|
449
596
|
*/
|
|
450
597
|
async promptAndWait(message, images, timeout = 60000) {
|
|
451
598
|
const eventsPromise = this.collectEvents(timeout);
|
|
452
|
-
await this.prompt(message, images);
|
|
599
|
+
await this.prompt(message, images ? { images } : undefined);
|
|
453
600
|
return eventsPromise;
|
|
454
601
|
}
|
|
455
602
|
// =========================================================================
|
|
@@ -462,10 +609,17 @@ export class RpcClient {
|
|
|
462
609
|
if (data.type === "response" && data.id && this.pendingRequests.has(data.id)) {
|
|
463
610
|
const pending = this.pendingRequests.get(data.id);
|
|
464
611
|
this.pendingRequests.delete(data.id);
|
|
612
|
+
// Response hooks run synchronously inside the frame dispatch so ordering-sensitive
|
|
613
|
+
// contracts (e.g. optimistic-echo disposition) settle before the NEXT frame —
|
|
614
|
+
// never through the microtask scheduled by resolve().
|
|
615
|
+
pending.onResponse?.(data);
|
|
465
616
|
pending.resolve(data);
|
|
466
617
|
return;
|
|
467
618
|
}
|
|
468
|
-
// Otherwise it's an event
|
|
619
|
+
// Otherwise it's an event. Multi-session hosts broadcast all session
|
|
620
|
+
// events to every connection; a routed client exposes only its lease.
|
|
621
|
+
if (data.sessionId !== undefined && this.sessionId !== undefined && data.sessionId !== this.sessionId)
|
|
622
|
+
return;
|
|
469
623
|
for (const listener of this.eventListeners) {
|
|
470
624
|
listener(data);
|
|
471
625
|
}
|
|
@@ -479,35 +633,43 @@ export class RpcClient {
|
|
|
479
633
|
}
|
|
480
634
|
rejectPendingRequests(error) {
|
|
481
635
|
for (const pending of this.pendingRequests.values()) {
|
|
636
|
+
pending.onReject?.(error);
|
|
482
637
|
pending.reject(error);
|
|
483
638
|
}
|
|
484
639
|
this.pendingRequests.clear();
|
|
485
640
|
}
|
|
486
|
-
async send(command) {
|
|
641
|
+
async send(command, route = true, hooks) {
|
|
487
642
|
const childProcess = this.process;
|
|
488
|
-
const
|
|
489
|
-
if (!
|
|
643
|
+
const stream = this.socket ?? childProcess?.stdin;
|
|
644
|
+
if (!stream) {
|
|
490
645
|
throw new Error("Client not started");
|
|
491
646
|
}
|
|
492
647
|
if (this.exitError) {
|
|
493
648
|
throw this.exitError;
|
|
494
649
|
}
|
|
495
|
-
if (childProcess
|
|
650
|
+
if (childProcess?.exitCode !== null && childProcess?.exitCode !== undefined) {
|
|
496
651
|
const error = this.createProcessExitError(childProcess.exitCode, childProcess.signalCode);
|
|
497
652
|
this.exitError = error;
|
|
498
653
|
throw error;
|
|
499
654
|
}
|
|
500
|
-
if (
|
|
501
|
-
const error = new Error(`
|
|
655
|
+
if (stream.destroyed || !stream.writable) {
|
|
656
|
+
const error = new Error(`RPC transport is not writable. Stderr: ${this.stderr}`);
|
|
502
657
|
this.exitError = error;
|
|
503
658
|
throw error;
|
|
504
659
|
}
|
|
505
660
|
const id = `req_${++this.requestId}`;
|
|
506
|
-
const fullCommand = {
|
|
661
|
+
const fullCommand = {
|
|
662
|
+
...command,
|
|
663
|
+
...(route && this.sessionId && !("sessionId" in command) ? { sessionId: this.sessionId } : {}),
|
|
664
|
+
id,
|
|
665
|
+
};
|
|
507
666
|
return new Promise((resolve, reject) => {
|
|
508
667
|
const timeout = setTimeout(() => {
|
|
668
|
+
const pending = this.pendingRequests.get(id);
|
|
509
669
|
this.pendingRequests.delete(id);
|
|
510
|
-
|
|
670
|
+
const timeoutError = new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`);
|
|
671
|
+
pending?.onReject?.(timeoutError);
|
|
672
|
+
reject(timeoutError);
|
|
511
673
|
}, 30000);
|
|
512
674
|
this.pendingRequests.set(id, {
|
|
513
675
|
resolve: (response) => {
|
|
@@ -518,14 +680,17 @@ export class RpcClient {
|
|
|
518
680
|
clearTimeout(timeout);
|
|
519
681
|
reject(error);
|
|
520
682
|
},
|
|
683
|
+
...(hooks?.onResponse ? { onResponse: hooks.onResponse } : {}),
|
|
684
|
+
...(hooks?.onReject ? { onReject: hooks.onReject } : {}),
|
|
521
685
|
});
|
|
522
686
|
try {
|
|
523
|
-
|
|
687
|
+
stream.write(serializeJsonLine(fullCommand));
|
|
524
688
|
}
|
|
525
689
|
catch (error) {
|
|
526
690
|
const writeError = error instanceof Error ? error : new Error(String(error));
|
|
527
691
|
const pending = this.pendingRequests.get(id);
|
|
528
692
|
this.pendingRequests.delete(id);
|
|
693
|
+
pending?.onReject?.(writeError);
|
|
529
694
|
pending?.reject(writeError);
|
|
530
695
|
}
|
|
531
696
|
});
|
|
@@ -533,6 +698,9 @@ export class RpcClient {
|
|
|
533
698
|
getData(response) {
|
|
534
699
|
if (!response.success) {
|
|
535
700
|
const errorResponse = response;
|
|
701
|
+
if (errorResponse.errorCode === "missing_session_cwd" && errorResponse.errorData) {
|
|
702
|
+
throw new MissingSessionCwdError(errorResponse.errorData);
|
|
703
|
+
}
|
|
536
704
|
throw new Error(errorResponse.error);
|
|
537
705
|
}
|
|
538
706
|
// Type assertion: we trust response.data matches T based on the command sent.
|