@earendil-works/pi-coding-agent 0.84.4 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -5
- package/README.md +3 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +10 -7
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/runtime-setup.d.ts +2 -0
- package/dist/bun/runtime-setup.d.ts.map +1 -0
- package/dist/bun/runtime-setup.js +9 -0
- package/dist/bun/runtime-setup.js.map +1 -0
- package/dist/bundle/chunks/anthropic-messages-QAQLEQIY.js +6 -0
- package/dist/bundle/chunks/{azure-openai-responses-5ENVCQ7U.js → azure-openai-responses-Q7MJBRE6.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
- package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
- package/dist/bundle/chunks/chunk-EQ6DR6XK.js +5 -0
- package/dist/bundle/chunks/{chunk-MNAIPA3J.js → chunk-IDDQWTHI.js} +1 -1
- package/dist/bundle/chunks/chunk-LZKJTKCT.js +2 -0
- package/dist/bundle/chunks/{chunk-NBBFIJUL.js → chunk-OUXLLA64.js} +2 -2
- package/dist/bundle/chunks/chunk-R7UUJ4C2.js +42 -0
- package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
- package/dist/bundle/chunks/chunk-WBE4J4AU.js +9 -0
- package/dist/bundle/chunks/chunk-WZB2R5YO.js +1558 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-YMUPJBKR.js → google-generative-ai-BSMTYDAM.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-MPWMV4OF.js → google-vertex-5C3HASOJ.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-Q3AWZJAZ.js → mistral-conversations-4M6BZBX6.js} +1 -1
- package/dist/bundle/chunks/node-EM5FIVUN.js +16 -0
- package/dist/bundle/chunks/node-TWVVAGPO.js +2 -0
- package/dist/bundle/chunks/openai-codex-responses-YJOO52RW.js +10 -0
- package/dist/bundle/chunks/{openai-completions-ERMU2SS7.js → openai-completions-QOT3QX7D.js} +3 -3
- package/dist/bundle/chunks/openai-responses-U7LNPQN4.js +2 -0
- package/dist/bundle/chunks/{pi-messages-TPFH44NP.js → pi-messages-EGZIFQGG.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/coordinator.js +3 -0
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/experimental/cli.d.ts +7 -3
- package/dist/cli/experimental/cli.d.ts.map +1 -1
- package/dist/cli/experimental/cli.js +6 -2
- package/dist/cli/experimental/cli.js.map +1 -1
- package/dist/cli/experimental/command-options.d.ts +23 -12
- package/dist/cli/experimental/command-options.d.ts.map +1 -1
- package/dist/cli/experimental/command-options.js +69 -20
- package/dist/cli/experimental/command-options.js.map +1 -1
- package/dist/cli/experimental/command.d.ts +10 -3
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/experimental/command.js +28 -14
- package/dist/cli/experimental/command.js.map +1 -1
- package/dist/cli/experimental/commands/client.d.ts +8 -2
- package/dist/cli/experimental/commands/client.d.ts.map +1 -1
- package/dist/cli/experimental/commands/client.js +43 -5
- package/dist/cli/experimental/commands/client.js.map +1 -1
- package/dist/cli/experimental/commands/server.d.ts +7 -3
- package/dist/cli/experimental/commands/server.d.ts.map +1 -1
- package/dist/cli/experimental/commands/server.js +27 -8
- package/dist/cli/experimental/commands/server.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -14
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +1 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -2
- package/dist/client/index.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +14 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +1 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +40 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +8 -9
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +3 -117
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -120
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts +12 -0
- package/dist/core/tools/renderers/bash.d.ts.map +1 -0
- package/dist/core/tools/renderers/bash.js +130 -0
- package/dist/core/tools/renderers/bash.js.map +1 -0
- package/dist/core/tools/renderers/edit.d.ts +23 -0
- package/dist/core/tools/renderers/edit.d.ts.map +1 -0
- package/dist/core/tools/renderers/edit.js +167 -0
- package/dist/core/tools/renderers/edit.js.map +1 -0
- package/dist/core/tools/renderers/find.d.ts +10 -0
- package/dist/core/tools/renderers/find.d.ts.map +1 -0
- package/dist/core/tools/renderers/find.js +64 -0
- package/dist/core/tools/renderers/find.js.map +1 -0
- package/dist/core/tools/renderers/grep.d.ts +10 -0
- package/dist/core/tools/renderers/grep.d.ts.map +1 -0
- package/dist/core/tools/renderers/grep.js +69 -0
- package/dist/core/tools/renderers/grep.js.map +1 -0
- package/dist/core/tools/renderers/index.d.ts +28 -0
- package/dist/core/tools/renderers/index.d.ts.map +1 -0
- package/dist/core/tools/renderers/index.js +47 -0
- package/dist/core/tools/renderers/index.js.map +1 -0
- package/dist/core/tools/renderers/ls.d.ts +10 -0
- package/dist/core/tools/renderers/ls.d.ts.map +1 -0
- package/dist/core/tools/renderers/ls.js +58 -0
- package/dist/core/tools/renderers/ls.js.map +1 -0
- package/dist/core/tools/renderers/read.d.ts +11 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -0
- package/dist/core/tools/renderers/read.js +129 -0
- package/dist/core/tools/renderers/read.js.map +1 -0
- package/dist/core/tools/renderers/write.d.ts +10 -0
- package/dist/core/tools/renderers/write.d.ts.map +1 -0
- package/dist/core/tools/renderers/write.js +153 -0
- package/dist/core/tools/renderers/write.js.map +1 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +5 -146
- package/dist/core/tools/write.js.map +1 -1
- package/dist/experimental/client-runtime.d.ts +43 -0
- package/dist/experimental/client-runtime.d.ts.map +1 -0
- package/dist/experimental/client-runtime.js +183 -0
- package/dist/experimental/client-runtime.js.map +1 -0
- package/dist/experimental/client-tui-chat.d.ts +14 -0
- package/dist/experimental/client-tui-chat.d.ts.map +1 -0
- package/dist/experimental/client-tui-chat.js +171 -0
- package/dist/experimental/client-tui-chat.js.map +1 -0
- package/dist/experimental/client-tui.d.ts +37 -0
- package/dist/experimental/client-tui.d.ts.map +1 -0
- package/dist/experimental/client-tui.js +702 -0
- package/dist/experimental/client-tui.js.map +1 -0
- package/dist/experimental/client.d.ts +25 -0
- package/dist/experimental/client.d.ts.map +1 -0
- package/dist/experimental/client.js +99 -0
- package/dist/experimental/client.js.map +1 -0
- package/dist/experimental/coordinator-entry.d.ts +3 -0
- package/dist/experimental/coordinator-entry.d.ts.map +1 -0
- package/dist/experimental/coordinator-entry.js +11 -0
- package/dist/experimental/coordinator-entry.js.map +1 -0
- package/dist/experimental/coordinator.d.ts +38 -0
- package/dist/experimental/coordinator.d.ts.map +1 -0
- package/dist/experimental/coordinator.js +570 -0
- package/dist/experimental/coordinator.js.map +1 -0
- package/dist/experimental/mini/main.d.ts +7 -0
- package/dist/experimental/mini/main.d.ts.map +1 -0
- package/dist/experimental/mini/main.js +21 -0
- package/dist/experimental/mini/main.js.map +1 -0
- package/dist/experimental/mini/server/entry.d.ts +3 -0
- package/dist/experimental/mini/server/entry.d.ts.map +1 -0
- package/dist/experimental/mini/server/entry.js +11 -0
- package/dist/experimental/mini/server/entry.js.map +1 -0
- package/dist/experimental/mini/server/run.d.ts +13 -0
- package/dist/experimental/mini/server/run.d.ts.map +1 -0
- package/dist/experimental/mini/server/run.js +150 -0
- package/dist/experimental/mini/server/run.js.map +1 -0
- package/dist/experimental/mini/shared/protocol.d.ts +127 -0
- package/dist/experimental/mini/shared/protocol.d.ts.map +1 -0
- package/dist/experimental/mini/shared/protocol.js +13 -0
- package/dist/experimental/mini/shared/protocol.js.map +1 -0
- package/dist/experimental/mini/shared/rpc.d.ts +49 -0
- package/dist/experimental/mini/shared/rpc.d.ts.map +1 -0
- package/dist/experimental/mini/shared/rpc.js +171 -0
- package/dist/experimental/mini/shared/rpc.js.map +1 -0
- package/dist/experimental/mini/shared/transport.d.ts +35 -0
- package/dist/experimental/mini/shared/transport.d.ts.map +1 -0
- package/dist/experimental/mini/shared/transport.js +94 -0
- package/dist/experimental/mini/shared/transport.js.map +1 -0
- package/dist/experimental/mini/tui/run.d.ts +9 -0
- package/dist/experimental/mini/tui/run.d.ts.map +1 -0
- package/dist/experimental/mini/tui/run.js +62 -0
- package/dist/experimental/mini/tui/run.js.map +1 -0
- package/dist/experimental/mini/tui/session.d.ts +26 -0
- package/dist/experimental/mini/tui/session.d.ts.map +1 -0
- package/dist/experimental/mini/tui/session.js +94 -0
- package/dist/experimental/mini/tui/session.js.map +1 -0
- package/dist/experimental/mini/tui/view.d.ts +10 -0
- package/dist/experimental/mini/tui/view.d.ts.map +1 -0
- package/dist/experimental/mini/tui/view.js +459 -0
- package/dist/experimental/mini/tui/view.js.map +1 -0
- package/dist/experimental/mini/worker/entry.d.ts +3 -0
- package/dist/experimental/mini/worker/entry.d.ts.map +1 -0
- package/dist/experimental/mini/worker/entry.js +10 -0
- package/dist/experimental/mini/worker/entry.js.map +1 -0
- package/dist/experimental/mini/worker/lane-service.d.ts +44 -0
- package/dist/experimental/mini/worker/lane-service.d.ts.map +1 -0
- package/dist/experimental/mini/worker/lane-service.js +97 -0
- package/dist/experimental/mini/worker/lane-service.js.map +1 -0
- package/dist/experimental/mini/worker/models-service.d.ts +19 -0
- package/dist/experimental/mini/worker/models-service.d.ts.map +1 -0
- package/dist/experimental/mini/worker/models-service.js +136 -0
- package/dist/experimental/mini/worker/models-service.js.map +1 -0
- package/dist/experimental/mini/worker/run.d.ts +14 -0
- package/dist/experimental/mini/worker/run.d.ts.map +1 -0
- package/dist/experimental/mini/worker/run.js +88 -0
- package/dist/experimental/mini/worker/run.js.map +1 -0
- package/dist/experimental/plugin.d.ts +4 -0
- package/dist/experimental/plugin.d.ts.map +1 -0
- package/dist/experimental/plugin.js +4 -0
- package/dist/experimental/plugin.js.map +1 -0
- package/dist/experimental/plugins/bundled.d.ts +7 -0
- package/dist/experimental/plugins/bundled.d.ts.map +1 -0
- package/dist/experimental/plugins/bundled.js +48 -0
- package/dist/experimental/plugins/bundled.js.map +1 -0
- package/dist/experimental/plugins/package.d.ts +18 -0
- package/dist/experimental/plugins/package.d.ts.map +1 -0
- package/dist/experimental/plugins/package.js +113 -0
- package/dist/experimental/plugins/package.js.map +1 -0
- package/dist/experimental/process.d.ts +20 -0
- package/dist/experimental/process.d.ts.map +1 -0
- package/dist/experimental/process.js +85 -0
- package/dist/experimental/process.js.map +1 -0
- package/dist/experimental/radius-auth.d.ts +17 -0
- package/dist/experimental/radius-auth.d.ts.map +1 -0
- package/dist/experimental/radius-auth.js +52 -0
- package/dist/experimental/radius-auth.js.map +1 -0
- package/dist/experimental/radius-relay.d.ts +90 -0
- package/dist/experimental/radius-relay.d.ts.map +1 -0
- package/dist/experimental/radius-relay.js +582 -0
- package/dist/experimental/radius-relay.js.map +1 -0
- package/dist/experimental/server.d.ts +75 -0
- package/dist/experimental/server.d.ts.map +1 -0
- package/dist/experimental/server.js +682 -0
- package/dist/experimental/server.js.map +1 -0
- package/dist/experimental/services/agent-controller-provider.d.ts +4 -0
- package/dist/experimental/services/agent-controller-provider.d.ts.map +1 -0
- package/dist/experimental/services/agent-controller-provider.js +84 -0
- package/dist/experimental/services/agent-controller-provider.js.map +1 -0
- package/dist/experimental/services/agent-controller.d.ts +57 -0
- package/dist/experimental/services/agent-controller.d.ts.map +1 -0
- package/dist/experimental/services/agent-controller.js +3 -0
- package/dist/experimental/services/agent-controller.js.map +1 -0
- package/dist/experimental/services/connection.d.ts +40 -0
- package/dist/experimental/services/connection.d.ts.map +1 -0
- package/dist/experimental/services/connection.js +300 -0
- package/dist/experimental/services/connection.js.map +1 -0
- package/dist/experimental/services/models-provider.d.ts +16 -0
- package/dist/experimental/services/models-provider.d.ts.map +1 -0
- package/dist/experimental/services/models-provider.js +116 -0
- package/dist/experimental/services/models-provider.js.map +1 -0
- package/dist/experimental/services/models.d.ts +36 -0
- package/dist/experimental/services/models.d.ts.map +1 -0
- package/dist/experimental/services/models.js +3 -0
- package/dist/experimental/services/models.js.map +1 -0
- package/dist/experimental/services/plugins.d.ts +16 -0
- package/dist/experimental/services/plugins.d.ts.map +1 -0
- package/dist/experimental/services/plugins.js +4 -0
- package/dist/experimental/services/plugins.js.map +1 -0
- package/dist/experimental/services/presentation-ui.d.ts +13 -0
- package/dist/experimental/services/presentation-ui.d.ts.map +1 -0
- package/dist/experimental/services/presentation-ui.js +3 -0
- package/dist/experimental/services/presentation-ui.js.map +1 -0
- package/dist/experimental/services/server.d.ts +19 -0
- package/dist/experimental/services/server.d.ts.map +1 -0
- package/dist/experimental/services/server.js +104 -0
- package/dist/experimental/services/server.js.map +1 -0
- package/dist/experimental/services/sessions.d.ts +28 -0
- package/dist/experimental/services/sessions.d.ts.map +1 -0
- package/dist/experimental/services/sessions.js +4 -0
- package/dist/experimental/services/sessions.js.map +1 -0
- package/dist/experimental/services/slash-commands-provider.d.ts +14 -0
- package/dist/experimental/services/slash-commands-provider.d.ts.map +1 -0
- package/dist/experimental/services/slash-commands-provider.js +200 -0
- package/dist/experimental/services/slash-commands-provider.js.map +1 -0
- package/dist/experimental/services/slash-commands.d.ts +24 -0
- package/dist/experimental/services/slash-commands.d.ts.map +1 -0
- package/dist/experimental/services/slash-commands.js +3 -0
- package/dist/experimental/services/slash-commands.js.map +1 -0
- package/dist/experimental/services/transcript-provider.d.ts +12 -0
- package/dist/experimental/services/transcript-provider.d.ts.map +1 -0
- package/dist/experimental/services/transcript-provider.js +109 -0
- package/dist/experimental/services/transcript-provider.js.map +1 -0
- package/dist/experimental/services/transcript.d.ts +13 -0
- package/dist/experimental/services/transcript.d.ts.map +1 -0
- package/dist/experimental/services/transcript.js +3 -0
- package/dist/experimental/services/transcript.js.map +1 -0
- package/dist/experimental/services/worker.d.ts +28 -0
- package/dist/experimental/services/worker.d.ts.map +1 -0
- package/dist/experimental/services/worker.js +107 -0
- package/dist/experimental/services/worker.js.map +1 -0
- package/dist/experimental/session-worker-manager.d.ts +24 -0
- package/dist/experimental/session-worker-manager.d.ts.map +1 -0
- package/dist/experimental/session-worker-manager.js +691 -0
- package/dist/experimental/session-worker-manager.js.map +1 -0
- package/dist/experimental/session-worker.d.ts +188 -0
- package/dist/experimental/session-worker.d.ts.map +1 -0
- package/dist/experimental/session-worker.js +785 -0
- package/dist/experimental/session-worker.js.map +1 -0
- package/dist/experimental/source-resolver.d.ts +2 -0
- package/dist/experimental/source-resolver.d.ts.map +1 -0
- package/dist/experimental/source-resolver.js +71 -0
- package/dist/experimental/source-resolver.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +126 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/chat-viewport.d.ts +20 -0
- package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/chat-viewport.js +28 -0
- package/dist/modes/interactive/chat-viewport.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +18 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +39 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +5 -14
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +14 -10
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -2
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +35 -33
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -15
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +95 -80
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts.map +1 -1
- package/dist/modes/interactive/session-share.js +8 -12
- package/dist/modes/interactive/session-share.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
- package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-json.js +130 -0
- package/dist/modes/interactive/theme/theme-json.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts +21 -0
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/tui-renderer.js +66 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +41 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +5 -2
- package/docs/keybindings.md +3 -1
- package/docs/models.md +3 -0
- package/docs/rpc.md +1 -1
- package/docs/sdk.md +5 -0
- package/docs/settings.md +5 -5
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +15 -0
- package/docs/themes.md +8 -6
- package/docs/tui.md +20 -1
- package/examples/README.md +3 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/dynamic-resources/dynamic.json +2 -0
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/plugins/pi-example-plugin/README.md +38 -0
- package/examples/plugins/pi-example-plugin/package.json +10 -0
- package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
- package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
- package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
- package/npm-shrinkwrap.json +523 -28
- package/package.json +12 -6
- package/dist/bun/register-bedrock.d.ts +0 -2
- package/dist/bun/register-bedrock.d.ts.map +0 -1
- package/dist/bun/register-bedrock.js +0 -4
- package/dist/bun/register-bedrock.js.map +0 -1
- package/dist/bundle/chunks/anthropic-messages-JWX2WP65.js +0 -45
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
- package/dist/bundle/chunks/chunk-OMWWHBTG.js +0 -1548
- package/dist/bundle/chunks/openai-codex-responses-GJVBJXLB.js +0 -8
- package/dist/bundle/chunks/openai-responses-BSOJMSEV.js +0 -2
- package/dist/cli/experimental/auth.d.ts +0 -16
- package/dist/cli/experimental/auth.d.ts.map +0 -1
- package/dist/cli/experimental/auth.js +0 -13
- package/dist/cli/experimental/auth.js.map +0 -1
- package/dist/cli/experimental/commands/pi.d.ts +0 -15
- package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
- package/dist/cli/experimental/commands/pi.js +0 -28
- package/dist/cli/experimental/commands/pi.js.map +0 -1
- package/dist/cli/experimental/transport-address.d.ts +0 -10
- package/dist/cli/experimental/transport-address.d.ts.map +0 -1
- package/dist/cli/experimental/transport-address.js +0 -38
- package/dist/cli/experimental/transport-address.js.map +0 -1
- package/dist/client/remote-session.d.ts +0 -53
- package/dist/client/remote-session.d.ts.map +0 -1
- package/dist/client/remote-session.js +0 -340
- package/dist/client/remote-session.js.map +0 -1
- package/dist/client/transcript.d.ts +0 -12
- package/dist/client/transcript.d.ts.map +0 -1
- package/dist/client/transcript.js +0 -98
- package/dist/client/transcript.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-worker-manager.js","sourceRoot":"","sources":["../../src/experimental/session-worker-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { isAbsolute } from \"node:path\";\nimport {\n\tcreateServiceUnsubscribeCall,\n\tdecodeServiceControlCall,\n\ttype JsonValue,\n\tparseServiceProviderUpdate,\n\ttype ServiceCall,\n\ttype ServiceProviderUpdate,\n} from \"@earendil-works/chord\";\nimport {\n\tBACKGROUND_CONTEXT,\n\ttype Context,\n\ttype JsonlSessionMetadata,\n\tTODO_CONTEXT,\n} from \"@earendil-works/pi-agent-core\";\nimport { type RoutedSessionAttachment, type RoutedSessionHandle, ServerError } from \"@earendil-works/pi-server\";\nimport { Check } from \"typebox/value\";\nimport type { CoordinatorConnection, CoordinatorConnectionEvent } from \"./coordinator.ts\";\nimport { spawnInternalProcess } from \"./process.ts\";\nimport {\n\tSESSION_WORKER_CONTROL_ADDRESS_ENV,\n\tSESSION_WORKER_CONTROL_TOKEN_ENV,\n\tSESSION_WORKER_PEER_ID_ENV,\n\tSESSION_WORKER_SESSION_KEY_ENV,\n\ttype SessionWorkerEvent,\n\tSessionWorkerEventSchema,\n\ttype SessionWorkerOptions,\n\ttype WorkerOperationResponse,\n\ttype WorkerOperationScope,\n} from \"./session-worker.ts\";\n\nconst WORKER_STARTUP_TIMEOUT_MS = 15_000;\nconst WORKER_SHUTDOWN_TIMEOUT_MS = 10_000;\nconst WORKER_DISCOVERY_TIMEOUT_MS = 5_000;\nconst WORKER_DEMAND_TIMEOUT_MS = 5_000;\n\nexport class SessionPluginSelectionConflictError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SessionPluginSelectionConflictError\";\n\t}\n}\n\ninterface WorkerRecord {\n\treadonly peerId: string;\n\treadonly metadata: JsonlSessionMetadata;\n\treadonly pid: number;\n\treadonly token: string;\n\treadonly pluginManifestPaths: readonly string[];\n\treadonly terminated: Promise<Error | undefined>;\n\tresolveTerminated(error: Error | undefined): void;\n\treadonly attachmentIds: Set<string>;\n\texpectedStop: boolean;\n\tstopPromise?: Promise<void>;\n\tstopping: boolean;\n}\n\ninterface PendingDemand {\n\treadonly attachmentId: string;\n\treadonly attached: boolean;\n\treadonly requestId: string;\n\treadonly timer: NodeJS.Timeout;\n\treadonly worker: WorkerRecord;\n\tresolve(): void;\n\treject(error: Error): void;\n}\n\ninterface PendingWorkerOperation {\n\treadonly worker: WorkerRecord;\n\treadonly scope: WorkerOperationScope;\n\tcleanup(): void;\n\tresolve(result: JsonValue | undefined): void;\n\treject(error: Error): void;\n}\n\ninterface WorkerServiceSubscription {\n\treadonly worker: WorkerRecord;\n\treadonly scope: WorkerOperationScope;\n\treadonly listener: (update: ServiceProviderUpdate, context: Context) => void | Promise<void>;\n\tdeliveryTail: Promise<void>;\n}\n\ninterface PendingLaunch {\n\treadonly sessionKey: string;\n\treadonly peerId: string;\n\treadonly token: string;\n\treadonly pluginManifestPaths: readonly string[];\n\treadonly child: ChildProcess;\n\treadonly timer: NodeJS.Timeout;\n\treadonly promise: Promise<WorkerRecord>;\n\tresolve(worker: WorkerRecord): void;\n\treject(error: Error): void;\n}\n\n/** Session and process bookkeeping owned by one replaceable server process. */\nexport class SessionWorkerManager {\n\treadonly workerPids = new Map<string, number>();\n\treadonly #coordinator: Pick<\n\t\tCoordinatorConnection,\n\t\t\"controlPath\" | \"serverConnectionId\" | \"wasReplaced\" | \"onEvent\" | \"send\" | \"broadcast\"\n\t>;\n\treadonly #sessionDir: string;\n\treadonly #model: { readonly provider?: string; readonly model: string } | undefined;\n\treadonly #workersBySession = new Map<string, WorkerRecord>();\n\treadonly #workersByPeer = new Map<string, WorkerRecord>();\n\treadonly #pending = new Map<string, PendingLaunch>();\n\treadonly #pendingDemand = new Map<string, PendingDemand>();\n\treadonly #pendingOperations = new Map<string, PendingWorkerOperation>();\n\treadonly #serviceSubscriptions = new Map<string, WorkerServiceSubscription>();\n\treadonly #removeListener: () => void;\n\treadonly #onWorkerCountChanged: ((count: number) => void) | undefined;\n\t#discoveryPeers?: Set<string>;\n\t#resolveDiscovery?: () => void;\n\t#detached = false;\n\t#shuttingDown = false;\n\n\tconstructor(\n\t\tcoordinator: Pick<\n\t\t\tCoordinatorConnection,\n\t\t\t\"controlPath\" | \"serverConnectionId\" | \"wasReplaced\" | \"onEvent\" | \"send\" | \"broadcast\"\n\t\t>,\n\t\tsessionDir: string,\n\t\tmodel?: { readonly provider?: string; readonly model: string },\n\t\tonWorkerCountChanged?: (count: number) => void,\n\t) {\n\t\tthis.#coordinator = coordinator;\n\t\tthis.#sessionDir = sessionDir;\n\t\tthis.#model = model;\n\t\tthis.#onWorkerCountChanged = onWorkerCountChanged;\n\t\tthis.#removeListener = coordinator.onEvent((event) => this.#handleCoordinatorEvent(event));\n\t}\n\n\tget trackedSessions(): readonly JsonlSessionMetadata[] {\n\t\treturn [...this.#workersBySession.values()].map((worker) => worker.metadata);\n\t}\n\n\tassertSessionPluginManifestPaths(metadata: JsonlSessionMetadata, manifestPaths: readonly string[]): void {\n\t\tconst existing = this.#workersBySession.get(metadata.path);\n\t\tif (existing !== undefined && !sameStrings(existing.pluginManifestPaths, manifestPaths)) {\n\t\t\tthrow new SessionPluginSelectionConflictError(\n\t\t\t\t`Session ${metadata.id} is active with a different plugin selection`,\n\t\t\t);\n\t\t}\n\t\tconst pending = this.#pending.get(metadata.path);\n\t\tif (pending !== undefined && !sameStrings(pending.pluginManifestPaths, manifestPaths)) {\n\t\t\tthrow new SessionPluginSelectionConflictError(\n\t\t\t\t`Session ${metadata.id} is starting with a different plugin selection`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync discover(peerIds: ReadonlySet<string>): Promise<void> {\n\t\tif (this.#detached) return;\n\t\tconst undiscovered = new Set(\n\t\t\t[...peerIds].filter((peerId) => !this.#workersByPeer.has(peerId) && !this.#pendingPeer(peerId)),\n\t\t);\n\t\tif (undiscovered.size === 0) return;\n\t\tthis.#discoveryPeers = undiscovered;\n\t\tconst discovered = new Promise<void>((resolve) => {\n\t\t\tthis.#resolveDiscovery = resolve;\n\t\t});\n\t\tawait this.#coordinator.broadcast({ type: \"discover_workers\" });\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tawait Promise.race([\n\t\t\tdiscovered,\n\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\ttimer = setTimeout(resolve, WORKER_DISCOVERY_TIMEOUT_MS);\n\t\t\t\ttimer.unref();\n\t\t\t}),\n\t\t]);\n\t\tif (timer) clearTimeout(timer);\n\t\tthis.#discoveryPeers = undefined;\n\t\tthis.#resolveDiscovery = undefined;\n\t}\n\n\tasync openSession(\n\t\tmetadata: JsonlSessionMetadata,\n\t\tcontext: Context,\n\t\tpluginManifestPaths: readonly string[],\n\t): Promise<RoutedSessionHandle> {\n\t\tif (this.#detached || this.#shuttingDown) throw new Error(\"Experimental server is shutting down\");\n\t\tthis.assertSessionPluginManifestPaths(metadata, pluginManifestPaths);\n\t\tconst existing = this.#workersBySession.get(metadata.path);\n\t\tif (existing) return this.#routedHandle(existing);\n\t\tconst pending = this.#pending.get(metadata.path);\n\t\tif (pending) return this.#routedHandle(await pending.promise);\n\t\treturn this.#routedHandle(await this.#launch(metadata, context, pluginManifestPaths));\n\t}\n\n\tasync closeSession(metadata: JsonlSessionMetadata, context: Context): Promise<void> {\n\t\tconst worker = this.#workersBySession.get(metadata.path) ?? (await this.#pending.get(metadata.path)?.promise);\n\t\tif (worker !== undefined) await this.#stopWorker(worker, context);\n\t}\n\n\t#routedHandle(worker: WorkerRecord): RoutedSessionHandle {\n\t\treturn {\n\t\t\tterminated: worker.terminated,\n\t\t\tattachClient: (context) => this.#attachClient(worker, context),\n\t\t\tclose: (context) => this.#stopWorker(worker, context),\n\t\t};\n\t}\n\n\tasync #attachClient(worker: WorkerRecord, context: Context): Promise<RoutedSessionAttachment> {\n\t\tif (this.#detached || this.#shuttingDown || worker.stopping) {\n\t\t\tthrow new Error(\"Experimental Session worker is stopping\");\n\t\t}\n\t\tif (this.#workersByPeer.get(worker.peerId) !== worker) {\n\t\t\tthrow new Error(\"Experimental Session worker is no longer available\");\n\t\t}\n\t\tconst attachmentId = randomUUID();\n\t\tworker.attachmentIds.add(attachmentId);\n\t\ttry {\n\t\t\tawait this.#applyDemand(worker, attachmentId, true, true, context);\n\t\t} catch (error) {\n\t\t\tworker.attachmentIds.delete(attachmentId);\n\t\t\tthrow error;\n\t\t}\n\t\tconst scope = this.#operationScope(worker, attachmentId);\n\t\tlet released = false;\n\t\treturn {\n\t\t\tinvokeService: (call, publish, serviceContext) =>\n\t\t\t\tthis.#invokeService(worker, scope, call, publish, serviceContext),\n\t\t\trelease: async (releaseContext) => {\n\t\t\t\tif (released) return;\n\t\t\t\treleased = true;\n\t\t\t\tif (this.#detached || !worker.attachmentIds.has(attachmentId)) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#applyDemand(worker, attachmentId, false, true, releaseContext);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!this.#detached && !this.#coordinator.wasReplaced) throw error;\n\t\t\t\t} finally {\n\t\t\t\t\tworker.attachmentIds.delete(attachmentId);\n\t\t\t\t\tthis.#removeServiceSubscriptions((entry) => entry.worker === worker && sameScope(entry.scope, scope));\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tasync #invokeService(\n\t\tworker: WorkerRecord,\n\t\tscope: WorkerOperationScope,\n\t\tcall: ServiceCall,\n\t\tpublish: (subscriptionId: string, update: ServiceProviderUpdate, context: Context) => void | Promise<void>,\n\t\tcontext: Context,\n\t): Promise<JsonValue | undefined> {\n\t\tconst control = decodeServiceControlCall(call);\n\t\tlet addedSubscriptionKey: string | undefined;\n\t\tif (control?.type === \"subscribe\") {\n\t\t\tconst key = scopedServiceSubscriptionKey(scope, control.subscriptionId);\n\t\t\tif (this.#serviceSubscriptions.has(key)) throw new Error(\"Service subscription ID is already active\");\n\t\t\tthis.#serviceSubscriptions.set(key, {\n\t\t\t\tworker,\n\t\t\t\tscope,\n\t\t\t\tlistener: (update, updateContext) => publish(control.subscriptionId, update, updateContext),\n\t\t\t\tdeliveryTail: Promise.resolve(),\n\t\t\t});\n\t\t\taddedSubscriptionKey = key;\n\t\t}\n\t\tlet response: JsonValue | undefined;\n\t\ttry {\n\t\t\tresponse = await this.#invoke(worker, scope, call, context);\n\t\t} catch (error) {\n\t\t\tif (addedSubscriptionKey !== undefined && control?.type === \"subscribe\") {\n\t\t\t\tthis.#serviceSubscriptions.delete(addedSubscriptionKey);\n\t\t\t\tvoid this.#invoke(\n\t\t\t\t\tworker,\n\t\t\t\t\tscope,\n\t\t\t\t\tcreateServiceUnsubscribeCall(control.subscriptionId),\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t).catch(() => {});\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (control?.type === \"unsubscribe\") {\n\t\t\tthis.#serviceSubscriptions.delete(scopedServiceSubscriptionKey(scope, control.subscriptionId));\n\t\t}\n\t\treturn response;\n\t}\n\n\tasync #applyDemand(\n\t\tworker: WorkerRecord,\n\t\tattachmentId: string,\n\t\tattached: boolean,\n\t\tcompensateOnTimeout: boolean,\n\t\t_context: Context,\n\t): Promise<void> {\n\t\tif (worker.stopping || this.#workersByPeer.get(worker.peerId) !== worker) {\n\t\t\tthrow new Error(\"Experimental Session worker is stopping\");\n\t\t}\n\t\tconst requestId = randomUUID();\n\t\tlet resolve!: () => void;\n\t\tlet reject!: (error: Error) => void;\n\t\tconst applied = new Promise<void>((resolvePromise, rejectPromise) => {\n\t\t\tresolve = resolvePromise;\n\t\t\treject = rejectPromise;\n\t\t});\n\t\tconst timer = setTimeout(() => {\n\t\t\tif (compensateOnTimeout) void this.#reconcileDemandTimeout(requestId);\n\t\t\telse this.#rejectDemand(requestId, new Error(\"Session worker demand update timed out\"));\n\t\t}, WORKER_DEMAND_TIMEOUT_MS);\n\t\ttimer.unref();\n\t\tconst pending = { attachmentId, attached, requestId, timer, worker, resolve, reject };\n\t\tthis.#pendingDemand.set(requestId, pending);\n\t\ttry {\n\t\t\tawait this.#coordinator.send(worker.peerId, {\n\t\t\t\ttype: \"session_demand\",\n\t\t\t\tserverConnectionId: this.#coordinator.serverConnectionId,\n\t\t\t\trequestId,\n\t\t\t\tattachmentId,\n\t\t\t\tattached,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.#rejectDemand(requestId, error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t\treturn applied;\n\t}\n\n\t/** Worker operations have no wall-clock timeout: completion, disconnect, replacement, or shutdown settles them. */\n\t#invoke(\n\t\tworker: WorkerRecord,\n\t\tscope: WorkerOperationScope,\n\t\tcall: ServiceCall,\n\t\tcontext: Context,\n\t): Promise<JsonValue | undefined> {\n\t\ttry {\n\t\t\tthis.#operationScope(worker, scope.attachmentId);\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tif (context.abortSignal?.aborted) return Promise.reject(abortError(context.abortSignal));\n\t\tconst requestId = randomUUID();\n\t\tlet resolve!: (result: JsonValue | undefined) => void;\n\t\tlet reject!: (error: Error) => void;\n\t\tconst result = new Promise<JsonValue | undefined>((resolvePromise, rejectPromise) => {\n\t\t\tresolve = resolvePromise;\n\t\t\treject = rejectPromise;\n\t\t});\n\t\tconst signal = context.abortSignal;\n\t\tconst onAbort = (): void => {\n\t\t\tif (signal === undefined || !this.#pendingOperations.has(requestId)) return;\n\t\t\tvoid this.#coordinator.send(worker.peerId, { type: \"operation_cancel\", requestId, scope }).catch(() => {});\n\t\t\tthis.#rejectOperation(requestId, abortError(signal));\n\t\t};\n\t\tif (signal !== undefined) signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tthis.#pendingOperations.set(requestId, {\n\t\t\tworker,\n\t\t\tscope,\n\t\t\tcleanup: () => signal?.removeEventListener(\"abort\", onAbort),\n\t\t\tresolve,\n\t\t\treject,\n\t\t});\n\t\tvoid this.#coordinator\n\t\t\t.send(worker.peerId, { type: \"operation\", requestId, scope, call })\n\t\t\t.catch((error: unknown) =>\n\t\t\t\tthis.#rejectOperation(requestId, error instanceof Error ? error : new Error(String(error))),\n\t\t\t);\n\t\treturn result;\n\t}\n\n\t#operationScope(worker: WorkerRecord, attachmentId: string): WorkerOperationScope {\n\t\tif (this.#detached || this.#shuttingDown || worker.stopping) {\n\t\t\tthrow new Error(\"Experimental Session worker is stopping\");\n\t\t}\n\t\tif (this.#workersByPeer.get(worker.peerId) !== worker || !worker.attachmentIds.has(attachmentId)) {\n\t\t\tthrow new Error(\"Experimental Session worker has no active attachment\");\n\t\t}\n\t\treturn {\n\t\t\tserverConnectionId: this.#coordinator.serverConnectionId,\n\t\t\tattachmentId,\n\t\t};\n\t}\n\n\t#stopWorker(worker: WorkerRecord, _context: Context): Promise<void> {\n\t\tif (this.#detached || this.#workersByPeer.get(worker.peerId) !== worker) return Promise.resolve();\n\t\tworker.stopPromise ??= this.#stopWorkerInternal(worker);\n\t\treturn worker.stopPromise;\n\t}\n\n\tasync #stopWorkerInternal(worker: WorkerRecord): Promise<void> {\n\t\tthis.#rejectWorkerOperations(worker, new Error(\"Session worker is stopping\"));\n\t\tworker.stopping = true;\n\t\tworker.expectedStop = true;\n\t\tvoid this.#coordinator.send(worker.peerId, { type: \"shutdown\" }).catch(() => {});\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tconst timedOut = new Promise<boolean>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(true), WORKER_SHUTDOWN_TIMEOUT_MS);\n\t\t\ttimer.unref();\n\t\t});\n\t\ttry {\n\t\t\tif ((await Promise.race([worker.terminated.then(() => false), timedOut])) === true) {\n\t\t\t\ttry {\n\t\t\t\t\tprocess.kill(worker.pid, \"SIGKILL\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ESRCH\")) throw error;\n\t\t\t\t}\n\t\t\t\tthis.#removeWorker(worker, undefined);\n\t\t\t\tawait worker.terminated;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t}\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (this.#detached || this.#shuttingDown) return;\n\t\tthis.#shuttingDown = true;\n\t\tconst pendingWorkers = [...this.#pending.values()];\n\t\tfor (const pending of pendingWorkers) {\n\t\t\tvoid this.#coordinator.send(pending.peerId, { type: \"shutdown\" }).catch(() => {});\n\t\t}\n\t\tconst pendingFinished = Promise.all(\n\t\t\tpendingWorkers.map((pending) => {\n\t\t\t\tif (pending.child.exitCode !== null || pending.child.signalCode !== null) return Promise.resolve();\n\t\t\t\treturn new Promise<void>((resolve) => pending.child.once(\"exit\", () => resolve()));\n\t\t\t}),\n\t\t).then(() => undefined);\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\tconst pendingTimedOut = new Promise<boolean>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(true), WORKER_SHUTDOWN_TIMEOUT_MS);\n\t\t\ttimer.unref();\n\t\t});\n\t\tconst stopPending = (async () => {\n\t\t\tif ((await Promise.race([pendingFinished.then(() => false), pendingTimedOut])) === true) {\n\t\t\t\tfor (const pending of pendingWorkers) pending.child.kill(\"SIGKILL\");\n\t\t\t\tawait pendingFinished;\n\t\t\t}\n\t\t\tif (timer) clearTimeout(timer);\n\t\t})();\n\t\tawait Promise.all([\n\t\t\tstopPending,\n\t\t\t...[...this.#workersBySession.values()].map((worker) => this.#stopWorker(worker, BACKGROUND_CONTEXT)),\n\t\t]);\n\t\tthis.#detachState();\n\t}\n\n\t/** Forget workers without stopping them when this server is replaced. */\n\tdetach(): void {\n\t\tif (this.#detached) return;\n\t\tthis.#detached = true;\n\t\tfor (const pending of this.#pending.values()) {\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.reject(new Error(\"Experimental server was replaced\"));\n\t\t}\n\t\tfor (const requestId of [...this.#pendingOperations.keys()]) {\n\t\t\tthis.#rejectOperation(requestId, new Error(\"Experimental server was replaced during a worker operation\"));\n\t\t}\n\t\tthis.#detachState();\n\t}\n\n\t#launch(\n\t\tmetadata: JsonlSessionMetadata,\n\t\t_context: Context,\n\t\tpluginManifestPaths: readonly string[],\n\t): Promise<WorkerRecord> {\n\t\tconst sessionKey = metadata.path;\n\t\tconst peerId = `worker-${randomUUID()}`;\n\t\tconst token = randomUUID();\n\t\tlet child: ChildProcess;\n\t\ttry {\n\t\t\tconst options: SessionWorkerOptions = {\n\t\t\t\tsessionDir: this.#sessionDir,\n\t\t\t\tmetadata: {\n\t\t\t\t\tid: metadata.id,\n\t\t\t\t\tcreatedAt: metadata.createdAt,\n\t\t\t\t\tstorageVersion: metadata.storageVersion,\n\t\t\t\t\tcwd: metadata.cwd,\n\t\t\t\t\tpath: metadata.path,\n\t\t\t\t\tmodifiedAt: metadata.modifiedAt,\n\t\t\t\t\t...(metadata.parentSessionId === undefined ? {} : { parentSessionId: metadata.parentSessionId }),\n\t\t\t\t},\n\t\t\t\tpluginManifestPaths: [...pluginManifestPaths],\n\t\t\t\t...(this.#model ?? {}),\n\t\t\t};\n\t\t\tchild = spawnInternalProcess(\"session-worker\", [JSON.stringify(options)], {\n\t\t\t\tenv: {\n\t\t\t\t\t[SESSION_WORKER_CONTROL_ADDRESS_ENV]: this.#coordinator.controlPath,\n\t\t\t\t\t[SESSION_WORKER_CONTROL_TOKEN_ENV]: token,\n\t\t\t\t\t[SESSION_WORKER_SESSION_KEY_ENV]: Buffer.from(sessionKey).toString(\"base64url\"),\n\t\t\t\t\t[SESSION_WORKER_PEER_ID_ENV]: peerId,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tlet resolve!: (worker: WorkerRecord) => void;\n\t\tlet reject!: (error: Error) => void;\n\t\tconst promise = new Promise<WorkerRecord>((resolvePromise, rejectPromise) => {\n\t\t\tresolve = resolvePromise;\n\t\t\treject = rejectPromise;\n\t\t});\n\t\tconst timer = setTimeout(\n\t\t\t() => this.#failPending(sessionKey, new Error(\"Session worker startup timed out\")),\n\t\t\tWORKER_STARTUP_TIMEOUT_MS,\n\t\t);\n\t\ttimer.unref();\n\t\tconst pending = {\n\t\t\tsessionKey,\n\t\t\tpeerId,\n\t\t\ttoken,\n\t\t\tpluginManifestPaths: Object.freeze([...pluginManifestPaths]),\n\t\t\tchild,\n\t\t\ttimer,\n\t\t\tpromise,\n\t\t\tresolve,\n\t\t\treject,\n\t\t};\n\t\tthis.#pending.set(sessionKey, pending);\n\t\tthis.#notifyWorkerCountChanged();\n\t\tchild.once(\"error\", (error) => this.#failPending(sessionKey, error));\n\t\tchild.once(\"exit\", (code, signal) => this.#childExited(pending, code, signal));\n\t\treturn promise;\n\t}\n\n\t#handleCoordinatorEvent(event: CoordinatorConnectionEvent): void {\n\t\tif (this.#detached) return;\n\t\tif (event.type === \"peer_disconnected\") {\n\t\t\tthis.#markDiscovered(event.peerId);\n\t\t\tconst worker = this.#workersByPeer.get(event.peerId);\n\t\t\tif (worker) {\n\t\t\t\tthis.#removeWorker(\n\t\t\t\t\tworker,\n\t\t\t\t\tworker.expectedStop\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: new Error(`Session worker ${worker.metadata.id} disconnected unexpectedly`),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst pending = this.#pendingPeer(event.peerId);\n\t\t\tif (pending) this.#failPending(pending.sessionKey, new Error(\"Session worker disconnected during startup\"));\n\t\t\treturn;\n\t\t}\n\t\tif (event.type !== \"message\") return;\n\t\tif (!Check(SessionWorkerEventSchema, event.payload)) {\n\t\t\tif (\n\t\t\t\ttypeof event.payload === \"object\" &&\n\t\t\t\tevent.payload !== null &&\n\t\t\t\t\"type\" in event.payload &&\n\t\t\t\tevent.payload.type === \"operation_response\"\n\t\t\t) {\n\t\t\t\tconst worker = this.#workersByPeer.get(event.from);\n\t\t\t\tif (worker)\n\t\t\t\t\tthis.#rejectWorkerOperations(worker, new Error(\"Session worker returned an invalid operation response\"));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst message: SessionWorkerEvent = event.payload;\n\t\tif (message.type === \"worker_failed\") {\n\t\t\tconst pending = this.#pending.get(message.sessionKey);\n\t\t\tif (pending?.peerId === event.from && pending.token === message.token) {\n\t\t\t\tthis.#failPending(message.sessionKey, new Error(`Session worker failed: ${message.message}`));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (message.type === \"demand_applied\" || message.type === \"demand_rejected\") {\n\t\t\tconst pending = this.#pendingDemand.get(message.requestId);\n\t\t\tif (\n\t\t\t\t!pending ||\n\t\t\t\tpending.worker.peerId !== event.from ||\n\t\t\t\tpending.worker.token !== message.token ||\n\t\t\t\tpending.worker.metadata.path !== message.sessionKey ||\n\t\t\t\t(message.type === \"demand_applied\" &&\n\t\t\t\t\t(pending.attachmentId !== message.attachmentId || pending.attached !== message.attached))\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#pendingDemand.delete(message.requestId);\n\t\t\tclearTimeout(pending.timer);\n\t\t\tif (message.type === \"demand_applied\") pending.resolve();\n\t\t\telse pending.reject(new Error(`Session worker rejected demand: ${message.message}`));\n\t\t\treturn;\n\t\t}\n\t\tif (message.type === \"operation_response\") {\n\t\t\tthis.#handleOperationResponse(event.from, message.token, message.sessionKey, message.response);\n\t\t\treturn;\n\t\t}\n\t\tif (message.type === \"service_update\") {\n\t\t\tthis.#handleServiceEvent(\n\t\t\t\tevent.from,\n\t\t\t\tmessage.token,\n\t\t\t\tmessage.sessionKey,\n\t\t\t\tmessage.scope,\n\t\t\t\tmessage.subscriptionId,\n\t\t\t\tmessage.update,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tthis.#recordReadyWorker(event.from, message);\n\t}\n\n\t#handleOperationResponse(\n\t\tpeerId: string,\n\t\ttoken: string,\n\t\tsessionKey: string,\n\t\tresponse: WorkerOperationResponse,\n\t): void {\n\t\tconst pending = this.#pendingOperations.get(response.requestId);\n\t\tif (!pending) return;\n\t\tif (\n\t\t\tpending.worker.peerId !== peerId ||\n\t\t\tpending.worker.token !== token ||\n\t\t\tpending.worker.metadata.path !== sessionKey ||\n\t\t\tresponse.scope.serverConnectionId !== pending.scope.serverConnectionId ||\n\t\t\tresponse.scope.attachmentId !== pending.scope.attachmentId\n\t\t) {\n\t\t\tthis.#rejectOperation(\n\t\t\t\tresponse.requestId,\n\t\t\t\tnew Error(\"Session worker returned a mismatched operation response\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tthis.#pendingOperations.delete(response.requestId);\n\t\tpending.cleanup();\n\t\tif (response.type === \"operation_error\") {\n\t\t\tpending.reject(\n\t\t\t\tresponse.code === undefined\n\t\t\t\t\t? new Error(`Session worker operation failed: ${response.message}`)\n\t\t\t\t\t: new ServerError(response.code, response.message),\n\t\t\t);\n\t\t} else {\n\t\t\tpending.resolve(response.result);\n\t\t}\n\t}\n\n\t#handleServiceEvent(\n\t\tpeerId: string,\n\t\ttoken: string,\n\t\tsessionKey: string,\n\t\tscope: WorkerOperationScope,\n\t\tsubscriptionId: string,\n\t\tupdate: unknown,\n\t): void {\n\t\tconst entry = this.#serviceSubscriptions.get(scopedServiceSubscriptionKey(scope, subscriptionId));\n\t\tif (\n\t\t\tentry === undefined ||\n\t\t\tentry.worker.peerId !== peerId ||\n\t\t\tentry.worker.token !== token ||\n\t\t\tentry.worker.metadata.path !== sessionKey ||\n\t\t\t!sameScope(entry.scope, scope)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tlet parsed: ServiceProviderUpdate;\n\t\ttry {\n\t\t\tparsed = parseServiceProviderUpdate(update);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tentry.deliveryTail = entry.deliveryTail.then(() => entry.listener(parsed, TODO_CONTEXT)).catch(() => {});\n\t}\n\n\t#recordReadyWorker(peerId: string, message: Extract<SessionWorkerEvent, { type: \"worker_ready\" }>): void {\n\t\tif (\n\t\t\tmessage.sessionKey !== message.metadata.path ||\n\t\t\tmessage.sessionId !== message.metadata.id ||\n\t\t\t!isAbsolute(message.metadata.cwd) ||\n\t\t\t!isAbsolute(message.metadata.path)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#markDiscovered(peerId);\n\t\tconst pending = this.#pending.get(message.sessionKey);\n\t\tif (pending?.peerId === peerId && !sameStrings(message.pluginManifestPaths, pending.pluginManifestPaths)) {\n\t\t\tthis.#failPending(message.sessionKey, new Error(\"Session worker started with stale plugin packages\"));\n\t\t\treturn;\n\t\t}\n\t\tconst existing = this.#workersBySession.get(message.sessionKey);\n\t\tif (existing && existing.peerId !== peerId) {\n\t\t\tvoid this.#coordinator.send(peerId, { type: \"shutdown\" }).catch(() => {});\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tpending &&\n\t\t\t(pending.peerId !== peerId || pending.token !== message.token || pending.child.pid !== message.pid)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (existing) return;\n\t\tlet resolveTerminated!: (error: Error | undefined) => void;\n\t\tconst terminated = new Promise<Error | undefined>((resolve) => {\n\t\t\tresolveTerminated = resolve;\n\t\t});\n\t\tconst worker: WorkerRecord = {\n\t\t\tpeerId,\n\t\t\tmetadata: message.metadata,\n\t\t\tpid: message.pid,\n\t\t\ttoken: message.token,\n\t\t\tpluginManifestPaths: Object.freeze([...message.pluginManifestPaths]),\n\t\t\tterminated,\n\t\t\tresolveTerminated,\n\t\t\tattachmentIds: new Set(),\n\t\t\texpectedStop: false,\n\t\t\tstopping: false,\n\t\t};\n\t\tthis.#workersBySession.set(message.sessionKey, worker);\n\t\tthis.#workersByPeer.set(peerId, worker);\n\t\tthis.workerPids.set(message.sessionId, message.pid);\n\t\tif (pending) {\n\t\t\tthis.#pending.delete(message.sessionKey);\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.resolve(worker);\n\t\t}\n\t\tthis.#notifyWorkerCountChanged();\n\t}\n\n\t#childExited(pending: PendingLaunch, code: number | null, signal: NodeJS.Signals | null): void {\n\t\tif (this.#pending.get(pending.sessionKey) === pending) {\n\t\t\tthis.#failPending(\n\t\t\t\tpending.sessionKey,\n\t\t\t\tnew Error(`Session worker exited before readiness (${signal ?? code ?? \"unknown\"})`),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst worker = this.#workersByPeer.get(pending.peerId);\n\t\tif (worker) {\n\t\t\tthis.#removeWorker(\n\t\t\t\tworker,\n\t\t\t\tworker.expectedStop\n\t\t\t\t\t? undefined\n\t\t\t\t\t: new Error(`Session worker ${worker.metadata.id} exited unexpectedly (${signal ?? code ?? \"unknown\"})`),\n\t\t\t);\n\t\t}\n\t}\n\n\t#failPending(sessionKey: string, error: Error): void {\n\t\tconst pending = this.#pending.get(sessionKey);\n\t\tif (!pending) return;\n\t\tthis.#pending.delete(sessionKey);\n\t\tclearTimeout(pending.timer);\n\t\tthis.#notifyWorkerCountChanged();\n\t\tif (pending.child.exitCode === null && pending.child.signalCode === null) pending.child.kill(\"SIGKILL\");\n\t\tpending.reject(error);\n\t}\n\n\t#rejectDemand(requestId: string, error: Error): void {\n\t\tconst pending = this.#pendingDemand.get(requestId);\n\t\tif (!pending) return;\n\t\tthis.#pendingDemand.delete(requestId);\n\t\tclearTimeout(pending.timer);\n\t\tpending.reject(error);\n\t}\n\n\t#rejectOperation(requestId: string, error: Error): void {\n\t\tconst pending = this.#pendingOperations.get(requestId);\n\t\tif (!pending) return;\n\t\tthis.#pendingOperations.delete(requestId);\n\t\tpending.cleanup();\n\t\tpending.reject(error);\n\t}\n\n\t#rejectWorkerOperations(worker: WorkerRecord, error: Error): void {\n\t\tfor (const [requestId, pending] of this.#pendingOperations) {\n\t\t\tif (pending.worker === worker) this.#rejectOperation(requestId, error);\n\t\t}\n\t}\n\n\tasync #reconcileDemandTimeout(requestId: string): Promise<void> {\n\t\tconst pending = this.#pendingDemand.get(requestId);\n\t\tif (!pending) return;\n\t\tthis.#pendingDemand.delete(requestId);\n\t\tclearTimeout(pending.timer);\n\t\tconst timeoutError = new Error(\"Session worker demand update timed out\");\n\t\ttry {\n\t\t\tawait this.#applyDemand(pending.worker, pending.attachmentId, false, false, BACKGROUND_CONTEXT);\n\t\t\tif (pending.attached) pending.reject(timeoutError);\n\t\t\telse pending.resolve();\n\t\t} catch (cleanupError) {\n\t\t\ttry {\n\t\t\t\tawait this.#stopWorker(pending.worker, BACKGROUND_CONTEXT);\n\t\t\t} catch (stopError) {\n\t\t\t\tpending.reject(\n\t\t\t\t\tnew AggregateError(\n\t\t\t\t\t\t[timeoutError, cleanupError, stopError],\n\t\t\t\t\t\t\"Session worker demand reconciliation and termination failed\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpending.reject(\n\t\t\t\tnew AggregateError(\n\t\t\t\t\t[timeoutError, cleanupError],\n\t\t\t\t\t\"Session worker demand reconciliation failed; worker was terminated\",\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t#removeWorker(worker: WorkerRecord, error: Error | undefined): void {\n\t\tif (this.#workersByPeer.get(worker.peerId) !== worker) return;\n\t\tthis.#rejectWorkerOperations(worker, new Error(\"Session worker disconnected during an operation\"));\n\t\tthis.#removeServiceSubscriptions((entry) => entry.worker === worker);\n\t\tfor (const pending of [...this.#pendingDemand.values()]) {\n\t\t\tif (pending.worker === worker) {\n\t\t\t\tthis.#rejectDemand(pending.requestId, new Error(\"Session worker disconnected during demand update\"));\n\t\t\t}\n\t\t}\n\t\tthis.#workersByPeer.delete(worker.peerId);\n\t\tthis.#workersBySession.delete(worker.metadata.path);\n\t\tif (this.workerPids.get(worker.metadata.id) === worker.pid) this.workerPids.delete(worker.metadata.id);\n\t\tworker.resolveTerminated(error);\n\t\tthis.#notifyWorkerCountChanged();\n\t}\n\n\t#removeServiceSubscriptions(matches: (entry: WorkerServiceSubscription) => boolean): void {\n\t\tfor (const [key, entry] of this.#serviceSubscriptions) {\n\t\t\tif (matches(entry)) this.#serviceSubscriptions.delete(key);\n\t\t}\n\t}\n\n\t#notifyWorkerCountChanged(): void {\n\t\tthis.#onWorkerCountChanged?.(this.#workersBySession.size + this.#pending.size);\n\t}\n\n\t#pendingPeer(peerId: string): PendingLaunch | undefined {\n\t\treturn [...this.#pending.values()].find((pending) => pending.peerId === peerId);\n\t}\n\n\t#markDiscovered(peerId: string): void {\n\t\tif (!this.#discoveryPeers?.delete(peerId) || this.#discoveryPeers.size !== 0) return;\n\t\tthis.#resolveDiscovery?.();\n\t}\n\n\t#detachState(): void {\n\t\tthis.#removeListener();\n\t\tfor (const requestId of [...this.#pendingOperations.keys()]) {\n\t\t\tthis.#rejectOperation(requestId, new Error(\"Experimental server detached during a worker operation\"));\n\t\t}\n\t\tfor (const pending of [...this.#pendingDemand.values()]) {\n\t\t\tthis.#pendingDemand.delete(pending.requestId);\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.resolve();\n\t\t}\n\t\tthis.#pending.clear();\n\t\tthis.#serviceSubscriptions.clear();\n\t\tthis.#workersByPeer.clear();\n\t\tthis.#workersBySession.clear();\n\t\tthis.workerPids.clear();\n\t\tthis.#discoveryPeers = undefined;\n\t\tthis.#resolveDiscovery?.();\n\t\tthis.#resolveDiscovery = undefined;\n\t}\n}\n\nfunction sameStrings(left: readonly string[], right: readonly string[]): boolean {\n\treturn left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction sameScope(left: WorkerOperationScope, right: WorkerOperationScope): boolean {\n\treturn left.serverConnectionId === right.serverConnectionId && left.attachmentId === right.attachmentId;\n}\n\nfunction scopedServiceSubscriptionKey(scope: WorkerOperationScope, subscriptionId: string): string {\n\treturn `${scope.serverConnectionId}\\0${scope.attachmentId}\\0${subscriptionId}`;\n}\n\nfunction abortError(signal: AbortSignal): Error {\n\tconst reason: unknown = signal.reason;\n\treturn reason instanceof Error ? reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n"]}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { type JsonValue, type ServiceCall } from "@earendil-works/chord";
|
|
2
|
+
import { type JsonlSessionMetadata, type Session } from "@earendil-works/pi-agent-core";
|
|
3
|
+
import { NodeExecutionEnv } from "@earendil-works/pi-agent-core/node";
|
|
4
|
+
import Type, { type Static } from "typebox";
|
|
5
|
+
import { type SessionWorkerRuntime, type WorkerServiceScope } from "./services/worker.ts";
|
|
6
|
+
export type { SessionWorkerRuntime } from "./services/worker.ts";
|
|
7
|
+
export declare const SESSION_WORKER_CONTROL_ADDRESS_ENV = "PI_SESSION_WORKER_CONTROL_ADDRESS";
|
|
8
|
+
export declare const SESSION_WORKER_CONTROL_TOKEN_ENV = "PI_SESSION_WORKER_CONTROL_TOKEN";
|
|
9
|
+
export declare const SESSION_WORKER_SESSION_KEY_ENV = "PI_SESSION_WORKER_SESSION_KEY_BASE64";
|
|
10
|
+
export declare const SESSION_WORKER_PEER_ID_ENV = "PI_SESSION_WORKER_PEER_ID";
|
|
11
|
+
export declare const SessionWorkerMetadataSchema: Type.TObject<{
|
|
12
|
+
readonly id: Type.TString;
|
|
13
|
+
readonly createdAt: Type.TInteger;
|
|
14
|
+
readonly storageVersion: Type.TInteger;
|
|
15
|
+
readonly cwd: Type.TString;
|
|
16
|
+
readonly path: Type.TString;
|
|
17
|
+
readonly modifiedAt: Type.TNumber;
|
|
18
|
+
readonly parentSessionId: Type.TOptional<Type.TString>;
|
|
19
|
+
}>;
|
|
20
|
+
export declare const SessionWorkerOptionsSchema: Type.TObject<{
|
|
21
|
+
readonly sessionDir: Type.TString;
|
|
22
|
+
readonly metadata: Type.TObject<{
|
|
23
|
+
readonly id: Type.TString;
|
|
24
|
+
readonly createdAt: Type.TInteger;
|
|
25
|
+
readonly storageVersion: Type.TInteger;
|
|
26
|
+
readonly cwd: Type.TString;
|
|
27
|
+
readonly path: Type.TString;
|
|
28
|
+
readonly modifiedAt: Type.TNumber;
|
|
29
|
+
readonly parentSessionId: Type.TOptional<Type.TString>;
|
|
30
|
+
}>;
|
|
31
|
+
readonly provider: Type.TOptional<Type.TString>;
|
|
32
|
+
readonly model: Type.TOptional<Type.TString>;
|
|
33
|
+
readonly pluginManifestPaths: Type.TArray<Type.TString>;
|
|
34
|
+
}>;
|
|
35
|
+
export type SessionWorkerOptions = Static<typeof SessionWorkerOptionsSchema>;
|
|
36
|
+
export declare const WorkerOperationScopeSchema: Type.TObject<{
|
|
37
|
+
readonly serverConnectionId: Type.TString;
|
|
38
|
+
readonly attachmentId: Type.TString;
|
|
39
|
+
}>;
|
|
40
|
+
export type WorkerOperationScope = WorkerServiceScope;
|
|
41
|
+
export declare const WorkerOperationRequestSchema: Type.TObject<{
|
|
42
|
+
readonly type: Type.TLiteral<"operation">;
|
|
43
|
+
readonly requestId: Type.TString;
|
|
44
|
+
readonly scope: Type.TObject<{
|
|
45
|
+
readonly serverConnectionId: Type.TString;
|
|
46
|
+
readonly attachmentId: Type.TString;
|
|
47
|
+
}>;
|
|
48
|
+
readonly call: Type.TUnsafe<ServiceCall>;
|
|
49
|
+
}>;
|
|
50
|
+
export type WorkerOperationRequest = Static<typeof WorkerOperationRequestSchema>;
|
|
51
|
+
export declare const WorkerOperationResponseSchema: Type.TUnion<[Type.TObject<{
|
|
52
|
+
readonly type: Type.TLiteral<"operation_result">;
|
|
53
|
+
readonly requestId: Type.TString;
|
|
54
|
+
readonly scope: Type.TObject<{
|
|
55
|
+
readonly serverConnectionId: Type.TString;
|
|
56
|
+
readonly attachmentId: Type.TString;
|
|
57
|
+
}>;
|
|
58
|
+
readonly result: Type.TOptional<Type.TUnsafe<JsonValue>>;
|
|
59
|
+
}>, Type.TObject<{
|
|
60
|
+
readonly type: Type.TLiteral<"operation_error">;
|
|
61
|
+
readonly requestId: Type.TString;
|
|
62
|
+
readonly scope: Type.TObject<{
|
|
63
|
+
readonly serverConnectionId: Type.TString;
|
|
64
|
+
readonly attachmentId: Type.TString;
|
|
65
|
+
}>;
|
|
66
|
+
readonly code: Type.TOptional<Type.TUnsafe<"service_instance_not_found" | "service_invalid_value" | "service_member_mismatch" | "service_member_not_found" | "service_mode_mismatch" | "service_not_allowed" | "service_not_found" | "service_stale_instance">>;
|
|
67
|
+
readonly message: Type.TString;
|
|
68
|
+
}>]>;
|
|
69
|
+
export type WorkerOperationResponse = Static<typeof WorkerOperationResponseSchema>;
|
|
70
|
+
export declare const SessionWorkerCommandSchema: Type.TUnion<[Type.TObject<{
|
|
71
|
+
type: Type.TLiteral<"shutdown">;
|
|
72
|
+
}>, Type.TObject<{
|
|
73
|
+
type: Type.TLiteral<"discover_workers">;
|
|
74
|
+
}>, Type.TObject<{
|
|
75
|
+
type: Type.TLiteral<"session_demand">;
|
|
76
|
+
serverConnectionId: Type.TString;
|
|
77
|
+
requestId: Type.TString;
|
|
78
|
+
attachmentId: Type.TString;
|
|
79
|
+
attached: Type.TBoolean;
|
|
80
|
+
}>, Type.TObject<{
|
|
81
|
+
readonly type: Type.TLiteral<"operation">;
|
|
82
|
+
readonly requestId: Type.TString;
|
|
83
|
+
readonly scope: Type.TObject<{
|
|
84
|
+
readonly serverConnectionId: Type.TString;
|
|
85
|
+
readonly attachmentId: Type.TString;
|
|
86
|
+
}>;
|
|
87
|
+
readonly call: Type.TUnsafe<ServiceCall>;
|
|
88
|
+
}>, Type.TObject<{
|
|
89
|
+
readonly type: Type.TLiteral<"operation_cancel">;
|
|
90
|
+
readonly requestId: Type.TString;
|
|
91
|
+
readonly scope: Type.TObject<{
|
|
92
|
+
readonly serverConnectionId: Type.TString;
|
|
93
|
+
readonly attachmentId: Type.TString;
|
|
94
|
+
}>;
|
|
95
|
+
}>]>;
|
|
96
|
+
export type SessionWorkerCommand = Static<typeof SessionWorkerCommandSchema>;
|
|
97
|
+
export declare const SessionWorkerEventSchema: Type.TUnion<[Type.TObject<{
|
|
98
|
+
type: Type.TLiteral<"worker_ready">;
|
|
99
|
+
token: Type.TString;
|
|
100
|
+
sessionKey: Type.TString;
|
|
101
|
+
sessionId: Type.TString;
|
|
102
|
+
pid: Type.TInteger;
|
|
103
|
+
metadata: Type.TObject<{
|
|
104
|
+
readonly id: Type.TString;
|
|
105
|
+
readonly createdAt: Type.TInteger;
|
|
106
|
+
readonly storageVersion: Type.TInteger;
|
|
107
|
+
readonly cwd: Type.TString;
|
|
108
|
+
readonly path: Type.TString;
|
|
109
|
+
readonly modifiedAt: Type.TNumber;
|
|
110
|
+
readonly parentSessionId: Type.TOptional<Type.TString>;
|
|
111
|
+
}>;
|
|
112
|
+
pluginManifestPaths: Type.TArray<Type.TString>;
|
|
113
|
+
}>, Type.TObject<{
|
|
114
|
+
type: Type.TLiteral<"worker_failed">;
|
|
115
|
+
token: Type.TString;
|
|
116
|
+
sessionKey: Type.TString;
|
|
117
|
+
message: Type.TString;
|
|
118
|
+
}>, Type.TObject<{
|
|
119
|
+
type: Type.TLiteral<"demand_applied">;
|
|
120
|
+
token: Type.TString;
|
|
121
|
+
sessionKey: Type.TString;
|
|
122
|
+
requestId: Type.TString;
|
|
123
|
+
attachmentId: Type.TString;
|
|
124
|
+
attached: Type.TBoolean;
|
|
125
|
+
}>, Type.TObject<{
|
|
126
|
+
type: Type.TLiteral<"demand_rejected">;
|
|
127
|
+
token: Type.TString;
|
|
128
|
+
sessionKey: Type.TString;
|
|
129
|
+
requestId: Type.TString;
|
|
130
|
+
message: Type.TString;
|
|
131
|
+
}>, Type.TObject<{
|
|
132
|
+
type: Type.TLiteral<"operation_response">;
|
|
133
|
+
token: Type.TString;
|
|
134
|
+
sessionKey: Type.TString;
|
|
135
|
+
response: Type.TUnion<[Type.TObject<{
|
|
136
|
+
readonly type: Type.TLiteral<"operation_result">;
|
|
137
|
+
readonly requestId: Type.TString;
|
|
138
|
+
readonly scope: Type.TObject<{
|
|
139
|
+
readonly serverConnectionId: Type.TString;
|
|
140
|
+
readonly attachmentId: Type.TString;
|
|
141
|
+
}>;
|
|
142
|
+
readonly result: Type.TOptional<Type.TUnsafe<JsonValue>>;
|
|
143
|
+
}>, Type.TObject<{
|
|
144
|
+
readonly type: Type.TLiteral<"operation_error">;
|
|
145
|
+
readonly requestId: Type.TString;
|
|
146
|
+
readonly scope: Type.TObject<{
|
|
147
|
+
readonly serverConnectionId: Type.TString;
|
|
148
|
+
readonly attachmentId: Type.TString;
|
|
149
|
+
}>;
|
|
150
|
+
readonly code: Type.TOptional<Type.TUnsafe<"service_instance_not_found" | "service_invalid_value" | "service_member_mismatch" | "service_member_not_found" | "service_mode_mismatch" | "service_not_allowed" | "service_not_found" | "service_stale_instance">>;
|
|
151
|
+
readonly message: Type.TString;
|
|
152
|
+
}>]>;
|
|
153
|
+
}>, Type.TObject<{
|
|
154
|
+
type: Type.TLiteral<"service_update">;
|
|
155
|
+
token: Type.TString;
|
|
156
|
+
sessionKey: Type.TString;
|
|
157
|
+
scope: Type.TObject<{
|
|
158
|
+
readonly serverConnectionId: Type.TString;
|
|
159
|
+
readonly attachmentId: Type.TString;
|
|
160
|
+
}>;
|
|
161
|
+
subscriptionId: Type.TString;
|
|
162
|
+
update: Type.TUnknown;
|
|
163
|
+
}>]>;
|
|
164
|
+
export type SessionWorkerEvent = Static<typeof SessionWorkerEventSchema>;
|
|
165
|
+
/** Worker-local reconciliation of server-generation demand and Harness activity. */
|
|
166
|
+
export declare class WorkerLifecycle {
|
|
167
|
+
#private;
|
|
168
|
+
constructor(options: {
|
|
169
|
+
initialServerConnectionId?: string;
|
|
170
|
+
initialDemandGraceMs: number;
|
|
171
|
+
orphanDemandGraceMs: number;
|
|
172
|
+
onRetire(): void;
|
|
173
|
+
});
|
|
174
|
+
serverConnected(serverConnectionId: string): void;
|
|
175
|
+
serverDisconnected(serverConnectionId: string): void;
|
|
176
|
+
beginRequest(serverConnectionId: string, attachmentId: string): () => void;
|
|
177
|
+
holdRetirement(): () => void;
|
|
178
|
+
setDemand(serverConnectionId: string, attachmentId: string, attached: boolean): void;
|
|
179
|
+
operationStarted(kind: "run" | "compaction" | "navigation", lane: string, operationId: string): void;
|
|
180
|
+
operationStopped(kind: "run" | "compaction" | "navigation", lane: string, operationId: string): void;
|
|
181
|
+
close(): void;
|
|
182
|
+
}
|
|
183
|
+
export declare const SESSION_WORKER_INITIAL_DEMAND_GRACE_ENV = "__PI_SESSION_WORKER_INITIAL_DEMAND_GRACE_MS";
|
|
184
|
+
export declare const SESSION_WORKER_ORPHAN_DEMAND_GRACE_ENV = "__PI_SESSION_WORKER_ORPHAN_DEMAND_GRACE_MS";
|
|
185
|
+
export type CreateSessionWorkerHarness = (session: Session<JsonlSessionMetadata>, options: SessionWorkerOptions, executionEnv: NodeExecutionEnv) => Promise<SessionWorkerRuntime>;
|
|
186
|
+
export declare function runSessionWorkerWithHarness(args: readonly string[], createHarness: CreateSessionWorkerHarness): Promise<void>;
|
|
187
|
+
export declare function runSessionWorkerProcess(args: readonly string[]): Promise<void>;
|
|
188
|
+
//# sourceMappingURL=session-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-worker.d.ts","sourceRoot":"","sources":["../../src/experimental/session-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConnection, type Socket } from \"node:net\";\nimport { isAbsolute } from \"node:path\";\nimport {\n\tisJsonValue,\n\ttype JsonValue,\n\tparseServiceProviderUpdate,\n\tREMOTE_SERVICE_ERROR_CODES,\n\tRemoteServiceError,\n\ttype RemoteServiceErrorCode,\n\ttype ServiceCall,\n\ttype ServiceProviderUpdate,\n} from \"@earendil-works/chord\";\nimport {\n\tAgentHarness,\n\ttype AgentHarness as AgentHarnessInstance,\n\ttype AgentLane,\n\tBACKGROUND_CONTEXT,\n\tcreateBashTool,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype JsonlSessionMetadata,\n\tJsonlSessionRepo,\n\ttype Session,\n\tTODO_CONTEXT,\n\twithCancel,\n} from \"@earendil-works/pi-agent-core\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-agent-core/node\";\nimport lockfile from \"proper-lockfile\";\nimport Type, { type Static } from \"typebox\";\nimport { Check } from \"typebox/value\";\nimport { findInitialModel, resolveCliModel } from \"../core/model-resolver.ts\";\nimport { ModelRuntime } from \"../core/model-runtime.ts\";\nimport { SettingsManager } from \"../core/settings-manager.ts\";\nimport { COORDINATOR_PROTOCOL_VERSION } from \"./coordinator.ts\";\nimport { createSessionPluginFacetLoader } from \"./plugins/bundled.ts\";\nimport {\n\tconsumeInternalProcessRole,\n\tencodeControlLine,\n\tisDirectInternalProcessEntry,\n\tMAX_CONTROL_LINE_BYTES,\n} from \"./process.ts\";\nimport {\n\tcreateSessionWorkerServices,\n\ttype SessionWorkerRuntime,\n\ttype SessionWorkerServices,\n\ttype WorkerServiceScope,\n} from \"./services/worker.ts\";\n\nexport type { SessionWorkerRuntime } from \"./services/worker.ts\";\n\nconst StrictObject = <const T extends Parameters<typeof Type.Object>[0]>(properties: T) =>\n\tType.Object(properties, { additionalProperties: false });\nconst OpaqueJsonValueSchema = Type.Unsafe<JsonValue>(Type.Unknown());\nconst ServiceCallSchema = Type.Unsafe<ServiceCall>(\n\tStrictObject({\n\t\tserviceId: Type.String({ minLength: 1 }),\n\t\tinstance: Type.Optional(\n\t\t\tStrictObject({ key: Type.String({ minLength: 1 }), generation: Type.Integer({ minimum: 1 }) }),\n\t\t),\n\t\tmember: Type.String({ minLength: 1 }),\n\t\targs: Type.Array(Type.Unknown()),\n\t}),\n);\nconst RemoteServiceErrorCodeSchema = Type.Unsafe<RemoteServiceErrorCode>(\n\tType.String({ pattern: `^(?:${REMOTE_SERVICE_ERROR_CODES.join(\"|\")})$` }),\n);\n\nexport const SESSION_WORKER_CONTROL_ADDRESS_ENV = \"PI_SESSION_WORKER_CONTROL_ADDRESS\";\nexport const SESSION_WORKER_CONTROL_TOKEN_ENV = \"PI_SESSION_WORKER_CONTROL_TOKEN\";\nexport const SESSION_WORKER_SESSION_KEY_ENV = \"PI_SESSION_WORKER_SESSION_KEY_BASE64\";\nexport const SESSION_WORKER_PEER_ID_ENV = \"PI_SESSION_WORKER_PEER_ID\";\n\nexport const SessionWorkerMetadataSchema = StrictObject({\n\tid: Type.String({ minLength: 1 }),\n\tcreatedAt: Type.Integer(),\n\tstorageVersion: Type.Integer(),\n\tcwd: Type.String(),\n\tpath: Type.String(),\n\tmodifiedAt: Type.Number(),\n\tparentSessionId: Type.Optional(Type.String()),\n});\n\nexport const SessionWorkerOptionsSchema = StrictObject({\n\tsessionDir: Type.String({ minLength: 1 }),\n\tmetadata: SessionWorkerMetadataSchema,\n\tprovider: Type.Optional(Type.String({ minLength: 1 })),\n\tmodel: Type.Optional(Type.String({ minLength: 1 })),\n\tpluginManifestPaths: Type.Array(Type.String({ minLength: 1 })),\n});\nexport type SessionWorkerOptions = Static<typeof SessionWorkerOptionsSchema>;\n\nexport const WorkerOperationScopeSchema = StrictObject({\n\tserverConnectionId: Type.String(),\n\tattachmentId: Type.String(),\n});\nexport type WorkerOperationScope = WorkerServiceScope;\n\nexport const WorkerOperationRequestSchema = StrictObject({\n\ttype: Type.Literal(\"operation\"),\n\trequestId: Type.String({ minLength: 1 }),\n\tscope: WorkerOperationScopeSchema,\n\tcall: ServiceCallSchema,\n});\nexport type WorkerOperationRequest = Static<typeof WorkerOperationRequestSchema>;\n\nexport const WorkerOperationResponseSchema = Type.Union([\n\tStrictObject({\n\t\ttype: Type.Literal(\"operation_result\"),\n\t\trequestId: Type.String({ minLength: 1 }),\n\t\tscope: WorkerOperationScopeSchema,\n\t\tresult: Type.Optional(OpaqueJsonValueSchema),\n\t}),\n\tStrictObject({\n\t\ttype: Type.Literal(\"operation_error\"),\n\t\trequestId: Type.String({ minLength: 1 }),\n\t\tscope: WorkerOperationScopeSchema,\n\t\tcode: Type.Optional(RemoteServiceErrorCodeSchema),\n\t\tmessage: Type.String(),\n\t}),\n]);\nexport type WorkerOperationResponse = Static<typeof WorkerOperationResponseSchema>;\n\nexport const SessionWorkerCommandSchema = Type.Union([\n\tType.Object({ type: Type.Literal(\"shutdown\") }),\n\tType.Object({ type: Type.Literal(\"discover_workers\") }),\n\tType.Object({\n\t\ttype: Type.Literal(\"session_demand\"),\n\t\tserverConnectionId: Type.String(),\n\t\trequestId: Type.String(),\n\t\tattachmentId: Type.String(),\n\t\tattached: Type.Boolean(),\n\t}),\n\tWorkerOperationRequestSchema,\n\tStrictObject({\n\t\ttype: Type.Literal(\"operation_cancel\"),\n\t\trequestId: Type.String({ minLength: 1 }),\n\t\tscope: WorkerOperationScopeSchema,\n\t}),\n]);\nexport type SessionWorkerCommand = Static<typeof SessionWorkerCommandSchema>;\n\nexport const SessionWorkerEventSchema = Type.Union([\n\tType.Object({\n\t\ttype: Type.Literal(\"worker_ready\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\tsessionId: Type.String(),\n\t\tpid: Type.Integer({ minimum: 1 }),\n\t\tmetadata: SessionWorkerMetadataSchema,\n\t\tpluginManifestPaths: Type.Array(Type.String({ minLength: 1 })),\n\t}),\n\tType.Object({\n\t\ttype: Type.Literal(\"worker_failed\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\tmessage: Type.String(),\n\t}),\n\tType.Object({\n\t\ttype: Type.Literal(\"demand_applied\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\trequestId: Type.String(),\n\t\tattachmentId: Type.String(),\n\t\tattached: Type.Boolean(),\n\t}),\n\tType.Object({\n\t\ttype: Type.Literal(\"demand_rejected\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\trequestId: Type.String(),\n\t\tmessage: Type.String(),\n\t}),\n\tType.Object({\n\t\ttype: Type.Literal(\"operation_response\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\tresponse: WorkerOperationResponseSchema,\n\t}),\n\tType.Object({\n\t\ttype: Type.Literal(\"service_update\"),\n\t\ttoken: Type.String(),\n\t\tsessionKey: Type.String(),\n\t\tscope: WorkerOperationScopeSchema,\n\t\tsubscriptionId: Type.String({ minLength: 1 }),\n\t\tupdate: Type.Unknown(),\n\t}),\n]);\nexport type SessionWorkerEvent = Static<typeof SessionWorkerEventSchema>;\n\n/** Worker-local reconciliation of server-generation demand and Harness activity. */\nexport class WorkerLifecycle {\n\treadonly #initialDemandGraceMs: number;\n\treadonly #orphanDemandGraceMs: number;\n\treadonly #onRetire: () => void;\n\treadonly #demands = new Map<string, { serverConnectionId: string; attachmentId: string; timer?: NodeJS.Timeout }>();\n\treadonly #activeOperations = new Set<string>();\n\t#currentServerConnectionId: string | undefined;\n\t#initialTimer: NodeJS.Timeout | undefined;\n\t#demandInitialized: boolean;\n\t#retirementHolds = 0;\n\t#retiring = false;\n\n\tconstructor(options: {\n\t\tinitialServerConnectionId?: string;\n\t\tinitialDemandGraceMs: number;\n\t\torphanDemandGraceMs: number;\n\t\tonRetire(): void;\n\t}) {\n\t\tthis.#currentServerConnectionId = options.initialServerConnectionId;\n\t\tthis.#initialDemandGraceMs = options.initialDemandGraceMs;\n\t\tthis.#orphanDemandGraceMs = options.orphanDemandGraceMs;\n\t\tthis.#onRetire = options.onRetire;\n\t\tthis.#demandInitialized = false;\n\t\tthis.#initialTimer = setTimeout(() => {\n\t\t\tthis.#initialTimer = undefined;\n\t\t\tthis.#demandInitialized = true;\n\t\t\tthis.#reconcile();\n\t\t}, this.#initialDemandGraceMs);\n\t\tthis.#initialTimer.unref();\n\t}\n\n\tserverConnected(serverConnectionId: string): void {\n\t\tthis.#currentServerConnectionId = serverConnectionId;\n\t\tfor (const demand of this.#demands.values()) {\n\t\t\tif (demand.serverConnectionId !== serverConnectionId || !demand.timer) continue;\n\t\t\tclearTimeout(demand.timer);\n\t\t\tdelete demand.timer;\n\t\t}\n\t}\n\n\tserverDisconnected(serverConnectionId: string): void {\n\t\tif (this.#currentServerConnectionId === serverConnectionId) this.#currentServerConnectionId = undefined;\n\t\tfor (const [key, demand] of this.#demands) {\n\t\t\tif (demand.serverConnectionId !== serverConnectionId || demand.timer) continue;\n\t\t\tdemand.timer = setTimeout(() => {\n\t\t\t\tif (this.#demands.get(key) !== demand) return;\n\t\t\t\tthis.#demands.delete(key);\n\t\t\t\tthis.#reconcile();\n\t\t\t}, this.#orphanDemandGraceMs);\n\t\t\tdemand.timer.unref();\n\t\t}\n\t}\n\n\tbeginRequest(serverConnectionId: string, attachmentId: string): () => void {\n\t\tif (this.#retiring) throw new Error(\"Session worker is retiring\");\n\t\tif (serverConnectionId !== this.#currentServerConnectionId) {\n\t\t\tthrow new Error(\"Session worker received a request from a stale server generation\");\n\t\t}\n\t\tconst demand = this.#demands.get(demandKey(serverConnectionId, attachmentId));\n\t\tif (!demand || demand.timer) {\n\t\t\tthrow new Error(\"Session worker request does not match the active attachment\");\n\t\t}\n\t\treturn this.holdRetirement();\n\t}\n\n\tholdRetirement(): () => void {\n\t\tthis.#retirementHolds += 1;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tthis.#retirementHolds -= 1;\n\t\t\tthis.#reconcile();\n\t\t};\n\t}\n\n\tsetDemand(serverConnectionId: string, attachmentId: string, attached: boolean): void {\n\t\tif (this.#retiring) throw new Error(\"Session worker is retiring\");\n\t\tif (serverConnectionId !== this.#currentServerConnectionId) {\n\t\t\tthrow new Error(\"Session worker received demand from a stale server generation\");\n\t\t}\n\t\tthis.#demandInitialized = true;\n\t\tif (this.#initialTimer) {\n\t\t\tclearTimeout(this.#initialTimer);\n\t\t\tthis.#initialTimer = undefined;\n\t\t}\n\t\tconst key = demandKey(serverConnectionId, attachmentId);\n\t\tconst previous = this.#demands.get(key);\n\t\tif (previous?.timer) clearTimeout(previous.timer);\n\t\tif (attached) this.#demands.set(key, { serverConnectionId, attachmentId });\n\t\telse this.#demands.delete(key);\n\t\tthis.#reconcile();\n\t}\n\n\toperationStarted(kind: \"run\" | \"compaction\" | \"navigation\", lane: string, operationId: string): void {\n\t\tthis.#activeOperations.add(`${kind}\\0${lane}\\0${operationId}`);\n\t}\n\n\toperationStopped(kind: \"run\" | \"compaction\" | \"navigation\", lane: string, operationId: string): void {\n\t\tthis.#activeOperations.delete(`${kind}\\0${lane}\\0${operationId}`);\n\t\tthis.#reconcile();\n\t}\n\n\tclose(): void {\n\t\tif (this.#initialTimer) clearTimeout(this.#initialTimer);\n\t\tfor (const demand of this.#demands.values()) {\n\t\t\tif (demand.timer) clearTimeout(demand.timer);\n\t\t}\n\t\tthis.#demands.clear();\n\t}\n\n\t#reconcile(): void {\n\t\tif (\n\t\t\tthis.#retiring ||\n\t\t\t!this.#demandInitialized ||\n\t\t\tthis.#retirementHolds !== 0 ||\n\t\t\tthis.#activeOperations.size !== 0 ||\n\t\t\tthis.#demands.size !== 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#retiring = true;\n\t\tthis.#onRetire();\n\t}\n}\n\nconst DEFAULT_INITIAL_DEMAND_GRACE_MS = 10_000;\nconst DEFAULT_ORPHAN_DEMAND_GRACE_MS = 30_000;\nexport const SESSION_WORKER_INITIAL_DEMAND_GRACE_ENV = \"__PI_SESSION_WORKER_INITIAL_DEMAND_GRACE_MS\";\nexport const SESSION_WORKER_ORPHAN_DEMAND_GRACE_ENV = \"__PI_SESSION_WORKER_ORPHAN_DEMAND_GRACE_MS\";\n\nconst CoordinatorInputSchema = Type.Union([\n\tType.Object({\n\t\ttype: Type.Literal(\"peer_registered\"),\n\t\tpeerId: Type.String(),\n\t\tserverConnectionId: Type.Optional(Type.String()),\n\t}),\n\tType.Object({ type: Type.Literal(\"server_connected\"), serverConnectionId: Type.String() }),\n\tType.Object({ type: Type.Literal(\"server_disconnected\"), serverConnectionId: Type.String() }),\n\tType.Object({ type: Type.Literal(\"message\"), from: Type.Literal(\"server\"), payload: Type.Unknown() }),\n]);\ntype CoordinatorInput = Static<typeof CoordinatorInputSchema>;\n\ninterface WorkerControl {\n\treadonly initialServerConnectionId?: string;\n\treadonly messages: AsyncIterable<unknown>;\n\treadonly socket: Socket;\n\tsend(event: SessionWorkerEvent): Promise<void>;\n}\n\nlet failureControl: WorkerControl | undefined;\n\nasync function connectControl(): Promise<WorkerControl> {\n\tconst address = process.env[SESSION_WORKER_CONTROL_ADDRESS_ENV];\n\tconst token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV];\n\tconst encodedSessionKey = process.env[SESSION_WORKER_SESSION_KEY_ENV];\n\tif (!address || !token || !encodedSessionKey) throw new Error(\"Session worker requires a control address\");\n\tconst peerId = process.env[SESSION_WORKER_PEER_ID_ENV];\n\tif (!peerId) throw new Error(\"Session worker requires a peer ID\");\n\tconst socket = createConnection(address);\n\tawait new Promise<void>((resolve, reject) => {\n\t\tsocket.once(\"connect\", resolve);\n\t\tsocket.once(\"error\", reject);\n\t});\n\tconst messages = createJsonLineMessages(socket);\n\tawait writeJsonLine(socket, { type: \"register_peer\", protocol: COORDINATOR_PROTOCOL_VERSION, peerId });\n\tconst registered = await messages[Symbol.asyncIterator]().next();\n\tif (\n\t\tregistered.done ||\n\t\t!Check(CoordinatorInputSchema, registered.value) ||\n\t\tregistered.value.type !== \"peer_registered\"\n\t) {\n\t\tthrow new Error(\"Coordinator rejected the session worker registration\");\n\t}\n\treturn {\n\t\t...(registered.value.serverConnectionId === undefined\n\t\t\t? {}\n\t\t\t: { initialServerConnectionId: registered.value.serverConnectionId }),\n\t\tmessages,\n\t\tsocket,\n\t\tsend: (event) => writeJsonLine(socket, { type: \"send\", to: \"server\", payload: event }),\n\t};\n}\n\nasync function readCommands(\n\tcontrol: WorkerControl,\n\thandlers: {\n\t\tonShutdown(): void;\n\t\tonDiscovery(): void;\n\t\tonDemand(command: Extract<SessionWorkerCommand, { type: \"session_demand\" }>): Promise<void>;\n\t\tonOperation(command: WorkerOperationRequest): void;\n\t\tonOperationCancel(command: Extract<SessionWorkerCommand, { type: \"operation_cancel\" }>): void;\n\t\tonServerConnected(serverConnectionId: string): void;\n\t\tonServerDisconnected(serverConnectionId: string): void;\n\t},\n): Promise<void> {\n\tfor await (const value of control.messages) {\n\t\tif (!Check(CoordinatorInputSchema, value)) {\n\t\t\tcontrol.socket.destroy(new Error(\"Coordinator sent an invalid worker message\"));\n\t\t\treturn;\n\t\t}\n\t\tconst message: CoordinatorInput = value;\n\t\tif (message.type === \"server_connected\") {\n\t\t\thandlers.onServerConnected(message.serverConnectionId);\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.type === \"server_disconnected\") {\n\t\t\thandlers.onServerDisconnected(message.serverConnectionId);\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.type !== \"message\" || !Check(SessionWorkerCommandSchema, message.payload)) continue;\n\t\tconst command: SessionWorkerCommand = message.payload;\n\t\tif (command.type === \"shutdown\") handlers.onShutdown();\n\t\telse if (command.type === \"discover_workers\") handlers.onDiscovery();\n\t\telse if (command.type === \"session_demand\") await handlers.onDemand(command);\n\t\telse if (command.type === \"operation_cancel\") handlers.onOperationCancel(command);\n\t\telse handlers.onOperation(command);\n\t}\n}\n\nfunction createJsonLineMessages(socket: Socket): AsyncIterable<unknown> {\n\tconst queued: unknown[] = [];\n\tconst waiters: ((value: unknown) => void)[] = [];\n\tlet buffered = \"\";\n\tsocket.setEncoding(\"utf8\");\n\tsocket.on(\"data\", (chunk: string) => {\n\t\tbuffered += chunk;\n\t\tif (Buffer.byteLength(buffered) > MAX_CONTROL_LINE_BYTES) {\n\t\t\tsocket.destroy(new Error(\"Session worker control message is too large\"));\n\t\t\treturn;\n\t\t}\n\t\twhile (true) {\n\t\t\tconst newline = buffered.indexOf(\"\\n\");\n\t\t\tif (newline === -1) return;\n\t\t\tconst line = buffered.slice(0, newline);\n\t\t\tbuffered = buffered.slice(newline + 1);\n\t\t\ttry {\n\t\t\t\tconst value: unknown = JSON.parse(line);\n\t\t\t\tconst waiter = waiters.shift();\n\t\t\t\tif (waiter) waiter(value);\n\t\t\t\telse queued.push(value);\n\t\t\t} catch {\n\t\t\t\tsocket.destroy(new Error(\"Session worker received invalid control JSON\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn {\n\t\t\t\tnext: async () => {\n\t\t\t\t\tconst value = queued.shift() ?? (await new Promise<unknown>((resolve) => waiters.push(resolve)));\n\t\t\t\t\treturn { done: false as const, value };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction writeJsonLine(socket: Socket, message: unknown): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tsocket.write(encodeControlLine(message), (error) => {\n\t\t\tif (error) reject(error);\n\t\t\telse resolve();\n\t\t});\n\t});\n}\n\nfunction toWorkerServiceUpdate(update: ServiceProviderUpdate): ServiceProviderUpdate {\n\tif (!isJsonValue(update)) throw new Error(\"Service produced a non-JSON update\");\n\treturn parseServiceProviderUpdate(update);\n}\n\nfunction demandKey(serverConnectionId: string, attachmentId: string): string {\n\treturn `${serverConnectionId}\\0${attachmentId}`;\n}\n\nfunction sameScope(left: WorkerOperationScope, right: WorkerOperationScope): boolean {\n\treturn left.serverConnectionId === right.serverConnectionId && left.attachmentId === right.attachmentId;\n}\n\nfunction lifecycleDelay(name: string, fallback: number): number {\n\tconst value = process.env[name];\n\tif (value === undefined) return fallback;\n\tconst parsed = Number(value);\n\tif (!Number.isSafeInteger(parsed) || parsed < 0) throw new Error(`${name} must be a non-negative safe integer`);\n\treturn parsed;\n}\n\nasync function closeResources(resources: {\n\tharness?: AgentHarnessInstance;\n\tservices?: SessionWorkerServices;\n\tsession?: Session<JsonlSessionMetadata>;\n\trepo: JsonlSessionRepo;\n\texecutionEnv: NodeExecutionEnv;\n\treleaseOwnership: () => Promise<void>;\n}): Promise<void> {\n\tconst errors: unknown[] = [];\n\ttry {\n\t\tawait resources.services?.dispose();\n\t} catch (error) {\n\t\terrors.push(error);\n\t}\n\ttry {\n\t\tif (resources.harness) await resources.harness.close(TODO_CONTEXT);\n\t\telse await resources.session?.close(TODO_CONTEXT);\n\t} catch (error) {\n\t\terrors.push(error);\n\t}\n\ttry {\n\t\tawait resources.repo.close(TODO_CONTEXT);\n\t} catch (error) {\n\t\terrors.push(error);\n\t}\n\ttry {\n\t\tawait resources.executionEnv.cleanup(TODO_CONTEXT);\n\t} catch (error) {\n\t\terrors.push(error);\n\t}\n\ttry {\n\t\tawait resources.releaseOwnership();\n\t} catch (error) {\n\t\terrors.push(error);\n\t}\n\tif (errors.length === 1) throw errors[0];\n\tif (errors.length > 1) throw new AggregateError(errors, \"Session worker cleanup failed\");\n}\n\nexport type CreateSessionWorkerHarness = (\n\tsession: Session<JsonlSessionMetadata>,\n\toptions: SessionWorkerOptions,\n\texecutionEnv: NodeExecutionEnv,\n) => Promise<SessionWorkerRuntime>;\n\nasync function run(options: SessionWorkerOptions, createHarness: CreateSessionWorkerHarness): Promise<void> {\n\tconst { sessionDir, metadata } = options;\n\tconst sessionId = metadata.id;\n\tconst control = await connectControl();\n\tconst token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV]!;\n\tconst sessionKey = Buffer.from(process.env[SESSION_WORKER_SESSION_KEY_ENV]!, \"base64url\").toString();\n\tfailureControl = control;\n\tconst pluginManifestPaths = options.pluginManifestPaths;\n\tconst releaseOwnership = await lockfile.lock(metadata.path, {\n\t\trealpath: true,\n\t\tstale: 2_000,\n\t\tupdate: 1_000,\n\t\tretries: { retries: 320, factor: 1, minTimeout: 25, maxTimeout: 25, maxRetryTime: 8_000 },\n\t});\n\tconst executionEnv = new NodeExecutionEnv({ cwd: metadata.cwd });\n\tconst repo = new JsonlSessionRepo({ fileSystem: executionEnv, sessionsRoot: sessionDir });\n\tlet session: Session<JsonlSessionMetadata> | undefined;\n\tlet harness: AgentHarnessInstance | undefined;\n\tlet lane: AgentLane | undefined;\n\tlet services: SessionWorkerServices | undefined;\n\ttry {\n\t\tsession = await repo.open(metadata, TODO_CONTEXT);\n\t\tconst runtime = await createHarness(session, options, executionEnv);\n\t\tharness = runtime.harness;\n\t\tlane = runtime.lane ?? (await harness.lane(\"main\", TODO_CONTEXT));\n\t\tservices = await createSessionWorkerServices({\n\t\t\tlane,\n\t\t\tmodelRuntime: runtime.modelRuntime,\n\t\t\tsettingsManager: runtime.settingsManager,\n\t\t\tfacetLoader: runtime.facetLoader,\n\t\t\tpublish: (scope, subscriptionId, update) =>\n\t\t\t\tcontrol.send({\n\t\t\t\t\ttype: \"service_update\",\n\t\t\t\t\ttoken,\n\t\t\t\t\tsessionKey,\n\t\t\t\t\tscope,\n\t\t\t\t\tsubscriptionId,\n\t\t\t\t\tupdate: toWorkerServiceUpdate(update),\n\t\t\t\t}),\n\t\t});\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait closeResources({ harness, services, session, repo, executionEnv, releaseOwnership });\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session worker startup and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst activeRequests = new Map<\n\t\tstring,\n\t\t{ readonly scope: WorkerOperationScope; readonly cancel: (reason?: unknown) => void }\n\t>();\n\tlet lifecycle: WorkerLifecycle | undefined;\n\tlet removeLifecycleListeners: (() => void)[] = [];\n\tlet closing: Promise<void> | undefined;\n\tconst close = (): Promise<void> => {\n\t\tif (closing) return closing;\n\t\tlifecycle?.close();\n\t\tservices.removeSubscriptions(() => true);\n\t\tfor (const request of activeRequests.values()) request.cancel(new Error(\"Session worker is closing\"));\n\t\tactiveRequests.clear();\n\t\tfor (const remove of removeLifecycleListeners) remove();\n\t\tremoveLifecycleListeners = [];\n\t\tclosing = closeResources({ harness, services, repo, executionEnv, releaseOwnership });\n\t\treturn closing;\n\t};\n\tconst closeAndExit = (): void => {\n\t\tvoid close().then(\n\t\t\t() => process.exit(0),\n\t\t\t(error: unknown) => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tprocess.exit(1);\n\t\t\t},\n\t\t);\n\t};\n\n\tlifecycle = new WorkerLifecycle({\n\t\tinitialServerConnectionId: control.initialServerConnectionId,\n\t\tinitialDemandGraceMs: lifecycleDelay(SESSION_WORKER_INITIAL_DEMAND_GRACE_ENV, DEFAULT_INITIAL_DEMAND_GRACE_MS),\n\t\torphanDemandGraceMs: lifecycleDelay(SESSION_WORKER_ORPHAN_DEMAND_GRACE_ENV, DEFAULT_ORPHAN_DEMAND_GRACE_MS),\n\t\tonRetire: closeAndExit,\n\t});\n\tremoveLifecycleListeners = [\n\t\tharness.events.on(\"run_start\", (event) => lifecycle?.operationStarted(\"run\", event.lane, event.runId)),\n\t\tharness.events.on(\"run_resume\", (event) => lifecycle?.operationStarted(\"run\", event.lane, event.runId)),\n\t\tharness.events.on(\"run_suspend\", (event) => lifecycle?.operationStopped(\"run\", event.lane, event.runId)),\n\t\tharness.events.on(\"run_end\", (event) => lifecycle?.operationStopped(\"run\", event.lane, event.runId)),\n\t\tharness.events.on(\"compaction_start\", (event) =>\n\t\t\tlifecycle?.operationStarted(\"compaction\", event.lane, event.runId),\n\t\t),\n\t\tharness.events.on(\"compaction_end\", (event) =>\n\t\t\tlifecycle?.operationStopped(\"compaction\", event.lane, event.runId),\n\t\t),\n\t\tharness.events.on(\"navigation_start\", (event) =>\n\t\t\tlifecycle?.operationStarted(\"navigation\", event.lane, event.runId),\n\t\t),\n\t\tharness.events.on(\"navigation_end\", (event) =>\n\t\t\tlifecycle?.operationStopped(\"navigation\", event.lane, event.runId),\n\t\t),\n\t\tharness.events.on(\"fault\", closeAndExit),\n\t];\n\n\tconst handleOperation = async (request: WorkerOperationRequest): Promise<void> => {\n\t\tlet releaseRequest = (): void => {};\n\t\tconst cancellable = withCancel(BACKGROUND_CONTEXT);\n\t\ttry {\n\t\t\treleaseRequest = lifecycle!.beginRequest(request.scope.serverConnectionId, request.scope.attachmentId);\n\t\t\tactiveRequests.set(request.requestId, { scope: request.scope, cancel: cancellable.cancel });\n\t\t\tconst result = await services.invoke(request.call, request.scope, cancellable.context);\n\t\t\tif (result !== undefined && !isJsonValue(result)) throw new Error(\"Service produced a non-JSON result\");\n\t\t\tawait control.send({\n\t\t\t\ttype: \"operation_response\",\n\t\t\t\ttoken,\n\t\t\t\tsessionKey,\n\t\t\t\tresponse: {\n\t\t\t\t\ttype: \"operation_result\",\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\t...(result === undefined ? {} : { result }),\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlet code: RemoteServiceErrorCode | undefined;\n\t\t\tif (error instanceof RemoteServiceError) {\n\t\t\t\tcode = error.code;\n\t\t\t} else if (error instanceof Error && \"code\" in error) {\n\t\t\t\tconst candidate = error.code;\n\t\t\t\tif (Check(RemoteServiceErrorCodeSchema, candidate)) code = candidate;\n\t\t\t}\n\t\t\tawait control.send({\n\t\t\t\ttype: \"operation_response\",\n\t\t\t\ttoken,\n\t\t\t\tsessionKey,\n\t\t\t\tresponse: {\n\t\t\t\t\ttype: \"operation_error\",\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\t...(code === undefined ? {} : { code }),\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t},\n\t\t\t});\n\t\t} finally {\n\t\t\tif (activeRequests.get(request.requestId)?.cancel === cancellable.cancel) {\n\t\t\t\tactiveRequests.delete(request.requestId);\n\t\t\t}\n\t\t\treleaseRequest();\n\t\t}\n\t};\n\n\tlet ready = false;\n\tconst announce = (): void => {\n\t\tif (!ready) return;\n\t\tvoid control\n\t\t\t.send({\n\t\t\t\ttype: \"worker_ready\",\n\t\t\t\ttoken,\n\t\t\t\tsessionKey,\n\t\t\t\tsessionId,\n\t\t\t\tpid: process.pid,\n\t\t\t\tmetadata,\n\t\t\t\tpluginManifestPaths: [...pluginManifestPaths],\n\t\t\t})\n\t\t\t.catch(() => closeAndExit());\n\t};\n\tvoid readCommands(control, {\n\t\tonShutdown: closeAndExit,\n\t\tonDiscovery: announce,\n\t\tonDemand: async (command) => {\n\t\t\tconst releaseRetirement = lifecycle?.holdRetirement() ?? (() => {});\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tif (!command.attached) {\n\t\t\t\t\t\tconst matches = (scope: WorkerOperationScope): boolean =>\n\t\t\t\t\t\t\tscope.serverConnectionId === command.serverConnectionId &&\n\t\t\t\t\t\t\tscope.attachmentId === command.attachmentId;\n\t\t\t\t\t\tservices.removeSubscriptions(matches);\n\t\t\t\t\t}\n\t\t\t\t\tlifecycle?.setDemand(command.serverConnectionId, command.attachmentId, command.attached);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait control.send({\n\t\t\t\t\t\ttype: \"demand_rejected\",\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tsessionKey,\n\t\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait control.send({\n\t\t\t\t\ttype: \"demand_applied\",\n\t\t\t\t\ttoken,\n\t\t\t\t\tsessionKey,\n\t\t\t\t\trequestId: command.requestId,\n\t\t\t\t\tattachmentId: command.attachmentId,\n\t\t\t\t\tattached: command.attached,\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\treleaseRetirement();\n\t\t\t}\n\t\t},\n\t\tonOperation: (request) => {\n\t\t\tvoid handleOperation(request).catch(() => closeAndExit());\n\t\t},\n\t\tonOperationCancel: (command) => {\n\t\t\tconst active = activeRequests.get(command.requestId);\n\t\t\tif (active !== undefined && sameScope(active.scope, command.scope)) {\n\t\t\t\tactive.cancel(new DOMException(\"Service operation cancelled\", \"AbortError\"));\n\t\t\t}\n\t\t},\n\t\tonServerConnected: (serverConnectionId) => lifecycle?.serverConnected(serverConnectionId),\n\t\tonServerDisconnected: (serverConnectionId) => {\n\t\t\tconst matches = (scope: WorkerOperationScope): boolean => scope.serverConnectionId === serverConnectionId;\n\t\t\tservices.removeSubscriptions(matches);\n\t\t\tfor (const request of activeRequests.values()) {\n\t\t\t\tif (matches(request.scope)) request.cancel(new Error(\"Server disconnected\"));\n\t\t\t}\n\t\t\tlifecycle?.serverDisconnected(serverConnectionId);\n\t\t},\n\t}).catch(() => closeAndExit());\n\tcontrol.socket.once(\"close\", closeAndExit);\n\tcontrol.socket.once(\"error\", () => closeAndExit());\n\tprocess.once(\"SIGTERM\", closeAndExit);\n\tprocess.once(\"SIGINT\", closeAndExit);\n\n\ttry {\n\t\tready = true;\n\t\tawait control.send({\n\t\t\ttype: \"worker_ready\",\n\t\t\ttoken,\n\t\t\tsessionKey,\n\t\t\tsessionId,\n\t\t\tpid: process.pid,\n\t\t\tmetadata,\n\t\t\tpluginManifestPaths: [...pluginManifestPaths],\n\t\t});\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait close();\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session worker readiness and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function runSessionWorkerWithHarness(\n\targs: readonly string[],\n\tcreateHarness: CreateSessionWorkerHarness,\n): Promise<void> {\n\ttry {\n\t\tif (args.length !== 1) throw new Error(\"Session worker requires one options argument\");\n\t\tlet options: unknown;\n\t\ttry {\n\t\t\toptions = JSON.parse(args[0]!);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\"Session worker received invalid options\", { cause: error });\n\t\t}\n\t\tif (\n\t\t\t!Check(SessionWorkerOptionsSchema, options) ||\n\t\t\t!isAbsolute(options.sessionDir) ||\n\t\t\t!isAbsolute(options.metadata.cwd) ||\n\t\t\t!isAbsolute(options.metadata.path) ||\n\t\t\t(options.provider !== undefined && options.model === undefined)\n\t\t) {\n\t\t\tthrow new Error(\"Session worker received invalid options\");\n\t\t}\n\t\tawait run(options, createHarness);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV];\n\t\tconst encodedSessionKey = process.env[SESSION_WORKER_SESSION_KEY_ENV];\n\t\tif (token && encodedSessionKey) {\n\t\t\tconst sessionKey = Buffer.from(encodedSessionKey, \"base64url\").toString();\n\t\t\tawait failureControl?.send({ type: \"worker_failed\", token, sessionKey, message }).catch(() => {});\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function createCodingAgentHarness(\n\tsession: Session<JsonlSessionMetadata>,\n\toptions: SessionWorkerOptions,\n\texecutionEnv: NodeExecutionEnv,\n): Promise<SessionWorkerRuntime> {\n\tconst modelRuntime = await ModelRuntime.create();\n\tconst settingsManager = SettingsManager.create(session.metadata.cwd);\n\tlet resolved: Awaited<ReturnType<typeof findInitialModel>> | ReturnType<typeof resolveCliModel>;\n\tif (options.model === undefined) {\n\t\tresolved = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: true,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRuntime,\n\t\t});\n\t} else {\n\t\tresolved = resolveCliModel({\n\t\t\tcliProvider: options.provider,\n\t\t\tcliModel: options.model,\n\t\t\tmodelRuntime,\n\t\t});\n\t\tif (resolved.error) throw new Error(`Session worker could not resolve model: ${resolved.error}`);\n\t}\n\tif (!resolved.model) throw new Error(\"Session worker could not resolve a model\");\n\tconst tools = [createReadTool(), createWriteTool(), createBashTool()];\n\tconst activeToolNames = tools.map((tool) => tool.name);\n\tconst harness = (\n\t\tawait AgentHarness.create(\n\t\t\t{\n\t\t\t\tsession,\n\t\t\t\tmodels: modelRuntime,\n\t\t\t\tmodel: resolved.model,\n\t\t\t\tthinkingLevel: resolved.thinkingLevel,\n\t\t\t\ttools,\n\t\t\t\tactiveToolNames,\n\t\t\t\ttoolContext: { env: executionEnv },\n\t\t\t\tresources: {},\n\t\t\t},\n\t\t\tTODO_CONTEXT,\n\t\t)\n\t).harness;\n\ttry {\n\t\tconst lane = await harness.lane(\"main\", TODO_CONTEXT);\n\t\tconst currentActiveToolNames = await lane.getActiveTools(TODO_CONTEXT);\n\t\tif (\n\t\t\tcurrentActiveToolNames.length !== activeToolNames.length ||\n\t\t\tcurrentActiveToolNames.some((name, index) => name !== activeToolNames[index])\n\t\t) {\n\t\t\tawait lane.setActiveTools(activeToolNames, TODO_CONTEXT);\n\t\t}\n\t\treturn {\n\t\t\tharness,\n\t\t\tlane,\n\t\t\tmodelRuntime,\n\t\t\tsettingsManager,\n\t\t\tfacetLoader: createSessionPluginFacetLoader(options.pluginManifestPaths),\n\t\t};\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait harness.close(TODO_CONTEXT);\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session worker model selection and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport function runSessionWorkerProcess(args: readonly string[]): Promise<void> {\n\treturn runSessionWorkerWithHarness(args, createCodingAgentHarness);\n}\n\nif (isDirectInternalProcessEntry(import.meta.url)) {\n\tconst role = consumeInternalProcessRole();\n\tif (role !== \"session-worker\") {\n\t\tthrow new Error(\"Session worker entrypoint requires an internal session-worker invocation\");\n\t}\n\tvoid runSessionWorkerProcess(process.argv.slice(2)).catch(() => process.exit(1));\n}\n"]}
|