@earendil-works/pi-coding-agent 0.84.3 → 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 +98 -2
- package/README.md +8 -5
- 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-GPPBJGBU.js → chunk-2KVJKXS2.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-XDKMGBCJ.js → google-generative-ai-BSMTYDAM.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-D5FGEO3Y.js → google-vertex-5C3HASOJ.js} +1 -1
- package/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +13 -0
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-YK73UAOZ.js → mistral-conversations-4M6BZBX6.js} +2 -2
- 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-QOT3QX7D.js +7 -0
- 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/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -1
- package/dist/cli/startup-ui.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 +14 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +91 -15
- 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 +6 -4
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +19 -5
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.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/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +45 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +26 -3
- 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 +44 -15
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +8 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +17 -0
- 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/extensions/llama/client.d.ts +6 -0
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js +7 -0
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +3 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +27 -6
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +128 -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 +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +24 -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 +11 -14
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +140 -101
- 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/modes/rpc/rpc-client.d.ts +7 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +12 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- 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/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +6 -4
- package/dist/utils/shell.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/compaction.md +2 -0
- package/docs/custom-provider.md +7 -7
- package/docs/environment-variables.md +5 -0
- package/docs/extensions.md +23 -2
- package/docs/keybindings.md +4 -2
- package/docs/models.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +24 -1
- package/docs/sdk.md +5 -0
- package/docs/settings.md +17 -9
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +27 -0
- package/docs/themes.md +8 -6
- package/docs/tui.md +20 -1
- package/docs/usage.md +4 -3
- 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-E5KXRMZK.js +0 -1547
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
- package/dist/bundle/chunks/dist-RDWOYWHR.js +0 -13
- package/dist/bundle/chunks/openai-codex-responses-GJVBJXLB.js +0 -8
- package/dist/bundle/chunks/openai-completions-JD4WAC3R.js +0 -7
- 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,682 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { isAbsolute, join } from "node:path";
|
|
5
|
+
import { BACKGROUND_CONTEXT, JsonlSessionRepo, TODO_CONTEXT, } from "@earendil-works/pi-agent-core";
|
|
6
|
+
import { NodeExecutionEnv } from "@earendil-works/pi-agent-core/node";
|
|
7
|
+
import { Client, ServerError as ClientServerError, DisconnectedError } from "@earendil-works/pi-client";
|
|
8
|
+
import { createUnixTransportFactory } from "@earendil-works/pi-client/unix";
|
|
9
|
+
import { isServerId } from "@earendil-works/pi-protocol";
|
|
10
|
+
import { ServerError as RoutedServerError, SessionAmbiguousError, SessionNotFoundError, } from "@earendil-works/pi-server";
|
|
11
|
+
import { createUnixServer, getUnixSocketPath } from "@earendil-works/pi-server/unix";
|
|
12
|
+
import lockfile from "proper-lockfile";
|
|
13
|
+
import { getAgentDir } from "../config.js";
|
|
14
|
+
import { resolvePath } from "../utils/paths.js";
|
|
15
|
+
import { CoordinatorConnection, ensureCoordinator } from "./coordinator.js";
|
|
16
|
+
import { createPresentationFacetData } from "./plugins/bundled.js";
|
|
17
|
+
import { createServerPluginPackage, normalizePluginPackagePaths, readSessionPluginPackageProfile, removeSessionPluginPackageProfile, restoreServerPluginPackageProfile, writeSessionPluginPackageProfile, } from "./plugins/package.js";
|
|
18
|
+
import { consumeInternalProcessRole, isDirectInternalProcessEntry, spawnInternalProcess, terminateInternalProcess, } from "./process.js";
|
|
19
|
+
import { RadiusRelayAuthResolver } from "./radius-auth.js";
|
|
20
|
+
import { RadiusRelayHost } from "./radius-relay.js";
|
|
21
|
+
import { createExperimentalServerServices } from "./services/server.js";
|
|
22
|
+
import { SessionPluginSelectionConflictError, SessionWorkerManager } from "./session-worker-manager.js";
|
|
23
|
+
export const ENV_SERVER_DIR = "PI_SERVER_DIR";
|
|
24
|
+
export const ENV_SERVER_ID = "PI_SERVER_ID";
|
|
25
|
+
export function resolveServerDirectory(directory) {
|
|
26
|
+
return resolvePath(directory ?? process.env[ENV_SERVER_DIR] ?? join(homedir(), ".pi", "server"));
|
|
27
|
+
}
|
|
28
|
+
export async function ensurePrivateServerDirectory(directory) {
|
|
29
|
+
if (typeof process.getuid !== "function")
|
|
30
|
+
throw new Error("Unix socket directory requires a POSIX user ID");
|
|
31
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
32
|
+
const stats = await lstat(directory);
|
|
33
|
+
if (!stats.isDirectory())
|
|
34
|
+
throw new Error(`Unix socket directory is not a directory: ${directory}`);
|
|
35
|
+
if (stats.uid !== process.getuid()) {
|
|
36
|
+
throw new Error(`Unix socket directory is not owned by the current user: ${directory}`);
|
|
37
|
+
}
|
|
38
|
+
await chmod(directory, 0o700);
|
|
39
|
+
}
|
|
40
|
+
export function resolveSessionDirectory(sessionDir) {
|
|
41
|
+
return resolvePath(sessionDir ?? join(getAgentDir(), "experimental", "sessions"));
|
|
42
|
+
}
|
|
43
|
+
const LOCK_STALE_MS = 30_000;
|
|
44
|
+
const LOCK_RETRY_MS = 25;
|
|
45
|
+
const LOCK_WAIT_MS = 30_000;
|
|
46
|
+
const DEFAULT_SERVER_ID_FILE = "default-server-id";
|
|
47
|
+
/** Lock one logical server ID in a shared experimental server directory. */
|
|
48
|
+
export async function acquireServerProfile(directory, requestedServerId) {
|
|
49
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
50
|
+
let serverId;
|
|
51
|
+
if (requestedServerId !== undefined) {
|
|
52
|
+
if (!isServerId(requestedServerId))
|
|
53
|
+
throw new Error(`Invalid experimental server ID: ${requestedServerId}`);
|
|
54
|
+
serverId = requestedServerId;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const path = join(directory, DEFAULT_SERVER_ID_FILE);
|
|
58
|
+
try {
|
|
59
|
+
const value = (await readFile(path, "utf8")).trim();
|
|
60
|
+
if (!isServerId(value))
|
|
61
|
+
throw new Error(`Invalid default experimental server identity in ${path}`);
|
|
62
|
+
serverId = value;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const code = error instanceof Error && "code" in error ? error.code : undefined;
|
|
66
|
+
if (code !== "ENOENT")
|
|
67
|
+
throw error;
|
|
68
|
+
const candidate = randomUUID();
|
|
69
|
+
try {
|
|
70
|
+
await writeFile(path, candidate, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
71
|
+
serverId = candidate;
|
|
72
|
+
}
|
|
73
|
+
catch (writeError) {
|
|
74
|
+
const writeCode = writeError instanceof Error && "code" in writeError ? writeError.code : undefined;
|
|
75
|
+
if (writeCode !== "EEXIST")
|
|
76
|
+
throw writeError;
|
|
77
|
+
const value = (await readFile(path, "utf8")).trim();
|
|
78
|
+
if (!isServerId(value))
|
|
79
|
+
throw new Error(`Invalid default experimental server identity in ${path}`);
|
|
80
|
+
serverId = value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const release = await lockfile.lock(join(directory, `launcher-${serverId}`), {
|
|
85
|
+
realpath: false,
|
|
86
|
+
stale: LOCK_STALE_MS,
|
|
87
|
+
update: LOCK_STALE_MS / 3,
|
|
88
|
+
retries: {
|
|
89
|
+
retries: Math.ceil(LOCK_WAIT_MS / LOCK_RETRY_MS),
|
|
90
|
+
factor: 1,
|
|
91
|
+
minTimeout: LOCK_RETRY_MS,
|
|
92
|
+
maxTimeout: LOCK_RETRY_MS,
|
|
93
|
+
maxRetryTime: LOCK_WAIT_MS,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
return { serverId, release };
|
|
97
|
+
}
|
|
98
|
+
const ACTIVATION_TIMEOUT_MS = 10_000;
|
|
99
|
+
const ACTIVATION_RETRY_MS = 10;
|
|
100
|
+
/** Ensure the selected logical server is reachable, launching the current Pi installation if needed. */
|
|
101
|
+
export async function activateServer(options) {
|
|
102
|
+
if (options.provider !== undefined && options.model === undefined) {
|
|
103
|
+
throw new Error("Server model provider requires a model");
|
|
104
|
+
}
|
|
105
|
+
await ensurePrivateServerDirectory(options.directory);
|
|
106
|
+
const profile = await acquireServerProfile(options.directory, options.requestedServerId);
|
|
107
|
+
const serverId = profile.serverId;
|
|
108
|
+
await profile.release();
|
|
109
|
+
const route = { serverId, path: getUnixSocketPath(serverId, options.directory) };
|
|
110
|
+
const release = await acquireServerActivation(options.directory, serverId);
|
|
111
|
+
try {
|
|
112
|
+
const existing = await connect(route);
|
|
113
|
+
if (existing) {
|
|
114
|
+
// Another activator won the race, so startup-only selections can no longer be applied.
|
|
115
|
+
if (options.model !== undefined) {
|
|
116
|
+
await existing.dispose();
|
|
117
|
+
throw new Error("Model selection is only valid when automatically activating a new server");
|
|
118
|
+
}
|
|
119
|
+
return { client: existing, route };
|
|
120
|
+
}
|
|
121
|
+
const modelArgs = options.model === undefined
|
|
122
|
+
? []
|
|
123
|
+
: [
|
|
124
|
+
JSON.stringify({
|
|
125
|
+
...(options.provider === undefined ? {} : { provider: options.provider }),
|
|
126
|
+
model: options.model,
|
|
127
|
+
}),
|
|
128
|
+
];
|
|
129
|
+
const child = spawnInternalProcess("server", [options.directory, serverId, options.sessionDir, ...modelArgs]);
|
|
130
|
+
let spawnError;
|
|
131
|
+
child.once("error", (error) => {
|
|
132
|
+
spawnError = error;
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
const deadline = Date.now() + ACTIVATION_TIMEOUT_MS;
|
|
136
|
+
while (true) {
|
|
137
|
+
const client = await connect(route);
|
|
138
|
+
if (client)
|
|
139
|
+
return { client, route };
|
|
140
|
+
if (spawnError)
|
|
141
|
+
throw new Error("Failed to automatically activate server", { cause: spawnError });
|
|
142
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
143
|
+
throw new Error("Automatically activated server exited during startup");
|
|
144
|
+
}
|
|
145
|
+
if (Date.now() >= deadline)
|
|
146
|
+
throw new Error("Timed out waiting for automatically activated server");
|
|
147
|
+
await new Promise((resolve) => setTimeout(resolve, ACTIVATION_RETRY_MS));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
await terminateInternalProcess(child);
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
await release();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function acquireServerActivation(directory, serverId) {
|
|
160
|
+
return lockfile.lock(join(directory, `activation-${serverId}`), {
|
|
161
|
+
realpath: false,
|
|
162
|
+
stale: ACTIVATION_TIMEOUT_MS * 2,
|
|
163
|
+
update: ACTIVATION_TIMEOUT_MS,
|
|
164
|
+
retries: {
|
|
165
|
+
retries: Math.ceil(ACTIVATION_TIMEOUT_MS / 25),
|
|
166
|
+
factor: 1,
|
|
167
|
+
minTimeout: 25,
|
|
168
|
+
maxTimeout: 25,
|
|
169
|
+
maxRetryTime: ACTIVATION_TIMEOUT_MS,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async function connect(route) {
|
|
174
|
+
const client = new Client({
|
|
175
|
+
serverId: route.serverId,
|
|
176
|
+
transportFactory: createUnixTransportFactory({ path: route.path }),
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
await client.connect();
|
|
180
|
+
return client;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
await client.dispose();
|
|
184
|
+
if (error instanceof DisconnectedError || (error instanceof ClientServerError && error.code === "version")) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
let current = error;
|
|
188
|
+
const seen = new Set();
|
|
189
|
+
while (current instanceof Error && !seen.has(current)) {
|
|
190
|
+
seen.add(current);
|
|
191
|
+
if ("code" in current &&
|
|
192
|
+
["ENOENT", "ECONNREFUSED", "ECONNRESET", "EPIPE", "ETIMEDOUT"].includes(String(current.code))) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
current = current.cause;
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const AUTO_SERVER_STARTUP_GRACE_MS = 10_000;
|
|
201
|
+
const AUTO_SERVER_IDLE_GRACE_MS = 1_000;
|
|
202
|
+
/** Reconcile operator, startup, client, and worker holds for one server generation. */
|
|
203
|
+
export class ServerLifetime {
|
|
204
|
+
#keepAlive;
|
|
205
|
+
#connectionCount = 0;
|
|
206
|
+
#workerCount = 0;
|
|
207
|
+
#startupHeld;
|
|
208
|
+
#startupTimer;
|
|
209
|
+
#retirementTimer;
|
|
210
|
+
#retire;
|
|
211
|
+
#stopped = false;
|
|
212
|
+
constructor(keepAlive) {
|
|
213
|
+
this.#keepAlive = keepAlive;
|
|
214
|
+
this.#startupHeld = !keepAlive;
|
|
215
|
+
}
|
|
216
|
+
start(retire) {
|
|
217
|
+
this.#retire = retire;
|
|
218
|
+
if (this.#startupHeld) {
|
|
219
|
+
this.#startupTimer = setTimeout(() => {
|
|
220
|
+
this.#startupTimer = undefined;
|
|
221
|
+
this.#startupHeld = false;
|
|
222
|
+
this.#reconcile();
|
|
223
|
+
}, AUTO_SERVER_STARTUP_GRACE_MS);
|
|
224
|
+
this.#startupTimer.unref();
|
|
225
|
+
}
|
|
226
|
+
this.#reconcile();
|
|
227
|
+
}
|
|
228
|
+
setConnectionCount(count) {
|
|
229
|
+
this.#connectionCount = count;
|
|
230
|
+
if (count > 0 && this.#startupHeld) {
|
|
231
|
+
this.#startupHeld = false;
|
|
232
|
+
if (this.#startupTimer)
|
|
233
|
+
clearTimeout(this.#startupTimer);
|
|
234
|
+
this.#startupTimer = undefined;
|
|
235
|
+
}
|
|
236
|
+
this.#reconcile();
|
|
237
|
+
}
|
|
238
|
+
setWorkerCount(count) {
|
|
239
|
+
this.#workerCount = count;
|
|
240
|
+
this.#reconcile();
|
|
241
|
+
}
|
|
242
|
+
stop() {
|
|
243
|
+
this.#stopped = true;
|
|
244
|
+
if (this.#startupTimer)
|
|
245
|
+
clearTimeout(this.#startupTimer);
|
|
246
|
+
if (this.#retirementTimer)
|
|
247
|
+
clearTimeout(this.#retirementTimer);
|
|
248
|
+
this.#startupTimer = undefined;
|
|
249
|
+
this.#retirementTimer = undefined;
|
|
250
|
+
}
|
|
251
|
+
#reconcile() {
|
|
252
|
+
if (this.#stopped ||
|
|
253
|
+
this.#keepAlive ||
|
|
254
|
+
this.#startupHeld ||
|
|
255
|
+
this.#connectionCount !== 0 ||
|
|
256
|
+
this.#workerCount !== 0) {
|
|
257
|
+
if (this.#retirementTimer)
|
|
258
|
+
clearTimeout(this.#retirementTimer);
|
|
259
|
+
this.#retirementTimer = undefined;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const retire = this.#retire;
|
|
263
|
+
if (this.#retirementTimer || !retire)
|
|
264
|
+
return;
|
|
265
|
+
this.#retirementTimer = setTimeout(() => {
|
|
266
|
+
this.#retirementTimer = undefined;
|
|
267
|
+
if (!this.#stopped && !this.#startupHeld && this.#connectionCount === 0 && this.#workerCount === 0) {
|
|
268
|
+
retire();
|
|
269
|
+
}
|
|
270
|
+
}, AUTO_SERVER_IDLE_GRACE_MS);
|
|
271
|
+
this.#retirementTimer.unref();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function startServerBackend(options, workers, onConnectionCountChanged) {
|
|
275
|
+
const serverId = options.serverId;
|
|
276
|
+
const sessionDir = resolveSessionDirectory(options.sessionDir);
|
|
277
|
+
const executionEnv = new NodeExecutionEnv({ cwd: process.cwd() });
|
|
278
|
+
const repo = new JsonlSessionRepo({ fileSystem: executionEnv, sessionsRoot: sessionDir });
|
|
279
|
+
const listSessions = async (context) => {
|
|
280
|
+
const sessions = new Map((await repo.list(undefined, context)).map((metadata) => [metadata.path, metadata]));
|
|
281
|
+
for (const metadata of workers.trackedSessions)
|
|
282
|
+
sessions.set(metadata.path, metadata);
|
|
283
|
+
return [...sessions.values()];
|
|
284
|
+
};
|
|
285
|
+
const resolveSession = async (sessionId, context) => {
|
|
286
|
+
const matches = (await listSessions(context)).filter((metadata) => metadata.id === sessionId);
|
|
287
|
+
if (matches.length === 0)
|
|
288
|
+
throw new SessionNotFoundError(`Unknown session: ${sessionId}`);
|
|
289
|
+
if (matches.length > 1)
|
|
290
|
+
throw new SessionAmbiguousError();
|
|
291
|
+
return matches[0];
|
|
292
|
+
};
|
|
293
|
+
const createSession = async (createOptions, context) => {
|
|
294
|
+
const session = await repo.create({ ...createOptions, cwd: process.cwd() }, context);
|
|
295
|
+
try {
|
|
296
|
+
return session.metadata;
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
await session.close(context);
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const summarize = (metadata) => ({
|
|
303
|
+
serverId,
|
|
304
|
+
sessionId: metadata.id,
|
|
305
|
+
createdAt: metadata.createdAt,
|
|
306
|
+
});
|
|
307
|
+
const closeStorage = async () => {
|
|
308
|
+
const cleanup = await Promise.allSettled([repo.close(TODO_CONTEXT), executionEnv.cleanup(TODO_CONTEXT)]);
|
|
309
|
+
const errors = cleanup.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
|
|
310
|
+
if (errors.length === 1)
|
|
311
|
+
throw errors[0];
|
|
312
|
+
if (errors.length > 1)
|
|
313
|
+
throw new AggregateError(errors, "Experimental session storage cleanup failed");
|
|
314
|
+
};
|
|
315
|
+
const serverServices = await createExperimentalServerServices({
|
|
316
|
+
list: async (context) => (await listSessions(context))
|
|
317
|
+
.map(summarize)
|
|
318
|
+
.sort((left, right) => left.sessionId.localeCompare(right.sessionId) || left.createdAt - right.createdAt),
|
|
319
|
+
create: async (createOptions, context) => summarize(await createSession(createOptions, context)),
|
|
320
|
+
remove: async (sessionId, context) => {
|
|
321
|
+
const metadata = await resolveSession(sessionId, context);
|
|
322
|
+
await workers.closeSession(metadata, context);
|
|
323
|
+
await repo.delete(metadata, context);
|
|
324
|
+
await options.removeSessionPlugins(metadata);
|
|
325
|
+
},
|
|
326
|
+
async prepareSessionPlugins(sessionId, packagePaths, context) {
|
|
327
|
+
const metadata = await resolveSession(sessionId, context);
|
|
328
|
+
let selected;
|
|
329
|
+
try {
|
|
330
|
+
selected = await options.resolveSessionPlugins(metadata, packagePaths, context);
|
|
331
|
+
workers.assertSessionPluginManifestPaths(metadata, selected.manifestPaths);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
if (error instanceof SessionPluginSelectionConflictError) {
|
|
335
|
+
throw new RoutedServerError("service_invalid_value", error.message);
|
|
336
|
+
}
|
|
337
|
+
throw error;
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
packagePaths: selected.packagePaths,
|
|
341
|
+
presentationPlugins: createPresentationFacetData(selected.presentationArtifacts),
|
|
342
|
+
};
|
|
343
|
+
},
|
|
344
|
+
async reloadPresentationPlugins(packagePaths) {
|
|
345
|
+
return createPresentationFacetData(await options.reloadPresentationFacetBundles(packagePaths));
|
|
346
|
+
},
|
|
347
|
+
}).catch(async (error) => {
|
|
348
|
+
try {
|
|
349
|
+
await closeStorage();
|
|
350
|
+
}
|
|
351
|
+
catch (cleanupError) {
|
|
352
|
+
throw new AggregateError([error, cleanupError], "Server service startup and cleanup failed");
|
|
353
|
+
}
|
|
354
|
+
throw error;
|
|
355
|
+
});
|
|
356
|
+
const host = {
|
|
357
|
+
serverServices: serverServices.host,
|
|
358
|
+
resolveSession,
|
|
359
|
+
openSession: async (metadata, context) => {
|
|
360
|
+
const selected = await options.resolveSessionPlugins(metadata, undefined, context);
|
|
361
|
+
return workers.openSession(metadata, context, selected.manifestPaths);
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
const socketPath = options.path;
|
|
365
|
+
const closeCatalog = async () => {
|
|
366
|
+
const cleanup = await Promise.allSettled([serverServices.dispose(), closeStorage()]);
|
|
367
|
+
const errors = cleanup.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
|
|
368
|
+
if (errors.length === 1)
|
|
369
|
+
throw errors[0];
|
|
370
|
+
if (errors.length > 1)
|
|
371
|
+
throw new AggregateError(errors, "Experimental session catalog cleanup failed");
|
|
372
|
+
};
|
|
373
|
+
const server = createUnixServer(host, {
|
|
374
|
+
serverId,
|
|
375
|
+
path: socketPath,
|
|
376
|
+
mode: 0o600,
|
|
377
|
+
onConnectionCountChanged,
|
|
378
|
+
});
|
|
379
|
+
try {
|
|
380
|
+
await server.start();
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
const cleanup = await Promise.allSettled([server.close(), closeCatalog()]);
|
|
384
|
+
const cleanupErrors = cleanup.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
|
|
385
|
+
if (cleanupErrors.length > 0) {
|
|
386
|
+
throw new AggregateError([error, ...cleanupErrors], "Experimental server startup and cleanup failed");
|
|
387
|
+
}
|
|
388
|
+
throw error;
|
|
389
|
+
}
|
|
390
|
+
let closePromise;
|
|
391
|
+
const closed = server.closed.then(() => closeCatalog(), async (serverError) => {
|
|
392
|
+
try {
|
|
393
|
+
await closeCatalog();
|
|
394
|
+
}
|
|
395
|
+
catch (repoError) {
|
|
396
|
+
throw new AggregateError([serverError, repoError], "Server and repository shutdown failed");
|
|
397
|
+
}
|
|
398
|
+
throw serverError;
|
|
399
|
+
});
|
|
400
|
+
return {
|
|
401
|
+
serverId,
|
|
402
|
+
sessionDir,
|
|
403
|
+
socketPath,
|
|
404
|
+
server,
|
|
405
|
+
workerPids: workers.workerPids,
|
|
406
|
+
closed,
|
|
407
|
+
refreshSessions: () => serverServices.refresh(BACKGROUND_CONTEXT),
|
|
408
|
+
close() {
|
|
409
|
+
closePromise ??= server.close().then(() => closed, () => closed);
|
|
410
|
+
return closePromise;
|
|
411
|
+
},
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/** Start a replaceable experimental server behind the stable coordinator endpoint. */
|
|
415
|
+
export async function startServer(options = {}) {
|
|
416
|
+
if (options.provider !== undefined && options.model === undefined) {
|
|
417
|
+
throw new Error("Server model provider requires a model");
|
|
418
|
+
}
|
|
419
|
+
const workerModel = options.model === undefined
|
|
420
|
+
? undefined
|
|
421
|
+
: { ...(options.provider === undefined ? {} : { provider: options.provider }), model: options.model };
|
|
422
|
+
const directory = resolveServerDirectory(options.directory);
|
|
423
|
+
const { serverId, release } = await acquireServerProfile(directory, options.serverId ?? process.env[ENV_SERVER_ID]);
|
|
424
|
+
const lifetime = new ServerLifetime(options.keepAlive ?? true);
|
|
425
|
+
let backend;
|
|
426
|
+
let coordinator;
|
|
427
|
+
let startupLease;
|
|
428
|
+
let workers;
|
|
429
|
+
let relay;
|
|
430
|
+
let released = false;
|
|
431
|
+
try {
|
|
432
|
+
await ensurePrivateServerDirectory(directory);
|
|
433
|
+
const pluginPackagePaths = await restoreServerPluginPackageProfile(directory, serverId, options.pluginPackages);
|
|
434
|
+
const pluginPackages = new Map();
|
|
435
|
+
const getPluginPackage = (packagePath) => {
|
|
436
|
+
let plugin = pluginPackages.get(packagePath);
|
|
437
|
+
if (plugin === undefined) {
|
|
438
|
+
plugin = createServerPluginPackage(directory, serverId, packagePath);
|
|
439
|
+
pluginPackages.set(packagePath, plugin);
|
|
440
|
+
}
|
|
441
|
+
return plugin;
|
|
442
|
+
};
|
|
443
|
+
const buildPluginSelection = async (packagePaths) => {
|
|
444
|
+
const normalizedPackagePaths = normalizePluginPackagePaths(packagePaths);
|
|
445
|
+
const plugins = normalizedPackagePaths.map(getPluginPackage);
|
|
446
|
+
const built = (await Promise.all(plugins.map((plugin) => plugin.build()))).flat();
|
|
447
|
+
return {
|
|
448
|
+
packagePaths: normalizedPackagePaths,
|
|
449
|
+
manifestPaths: plugins.map((plugin) => plugin.manifestPath),
|
|
450
|
+
presentationArtifacts: built,
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
let defaultPluginSelection = await buildPluginSelection(pluginPackagePaths);
|
|
454
|
+
const sessionPluginSelections = new Map();
|
|
455
|
+
const resolveSessionPlugins = async (metadata, requestedPackagePaths, _context) => {
|
|
456
|
+
if (requestedPackagePaths !== undefined) {
|
|
457
|
+
const normalizedPackagePaths = normalizePluginPackagePaths(requestedPackagePaths);
|
|
458
|
+
const current = sessionPluginSelections.get(metadata.path);
|
|
459
|
+
if (current !== undefined && sameStrings(current.packagePaths, normalizedPackagePaths))
|
|
460
|
+
return current;
|
|
461
|
+
const requestedManifestPaths = normalizedPackagePaths.map((packagePath) => getPluginPackage(packagePath).manifestPath);
|
|
462
|
+
workers?.assertSessionPluginManifestPaths(metadata, requestedManifestPaths);
|
|
463
|
+
const candidate = await buildPluginSelection(normalizedPackagePaths);
|
|
464
|
+
workers?.assertSessionPluginManifestPaths(metadata, candidate.manifestPaths);
|
|
465
|
+
await writeSessionPluginPackageProfile(directory, serverId, metadata.path, candidate.packagePaths);
|
|
466
|
+
sessionPluginSelections.set(metadata.path, candidate);
|
|
467
|
+
return candidate;
|
|
468
|
+
}
|
|
469
|
+
const cached = sessionPluginSelections.get(metadata.path);
|
|
470
|
+
if (cached !== undefined)
|
|
471
|
+
return cached;
|
|
472
|
+
const storedPackagePaths = await readSessionPluginPackageProfile(directory, serverId, metadata.path);
|
|
473
|
+
const selected = storedPackagePaths === undefined ? defaultPluginSelection : await buildPluginSelection(storedPackagePaths);
|
|
474
|
+
if (storedPackagePaths === undefined) {
|
|
475
|
+
await writeSessionPluginPackageProfile(directory, serverId, metadata.path, selected.packagePaths);
|
|
476
|
+
}
|
|
477
|
+
sessionPluginSelections.set(metadata.path, selected);
|
|
478
|
+
return selected;
|
|
479
|
+
};
|
|
480
|
+
const removeSessionPlugins = async (metadata) => {
|
|
481
|
+
sessionPluginSelections.delete(metadata.path);
|
|
482
|
+
await removeSessionPluginPackageProfile(directory, serverId, metadata.path);
|
|
483
|
+
};
|
|
484
|
+
const reloadPresentationFacetBundles = async (packagePaths) => {
|
|
485
|
+
const reloaded = await buildPluginSelection(packagePaths);
|
|
486
|
+
if (sameStrings(defaultPluginSelection.packagePaths, reloaded.packagePaths)) {
|
|
487
|
+
defaultPluginSelection = reloaded;
|
|
488
|
+
}
|
|
489
|
+
for (const [sessionPath, selected] of sessionPluginSelections) {
|
|
490
|
+
if (sameStrings(selected.packagePaths, reloaded.packagePaths)) {
|
|
491
|
+
sessionPluginSelections.set(sessionPath, reloaded);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return reloaded.presentationArtifacts;
|
|
495
|
+
};
|
|
496
|
+
const socketPath = getUnixSocketPath(serverId, directory);
|
|
497
|
+
const controlPath = join(directory, `control-${serverId}.sock`);
|
|
498
|
+
const serverNonce = randomUUID().replaceAll("-", "").slice(0, 12);
|
|
499
|
+
const serverPath = join(directory, `server-${serverId}-${serverNonce}.sock`);
|
|
500
|
+
startupLease = await ensureCoordinator(socketPath, controlPath);
|
|
501
|
+
coordinator = new CoordinatorConnection({ controlPath, endpoint: serverPath });
|
|
502
|
+
const sessionDir = resolveSessionDirectory(options.sessionDir);
|
|
503
|
+
workers = new SessionWorkerManager(coordinator, sessionDir, workerModel, (count) => lifetime.setWorkerCount(count));
|
|
504
|
+
backend = await startServerBackend({
|
|
505
|
+
path: serverPath,
|
|
506
|
+
serverId,
|
|
507
|
+
sessionDir: options.sessionDir,
|
|
508
|
+
resolveSessionPlugins,
|
|
509
|
+
removeSessionPlugins,
|
|
510
|
+
reloadPresentationFacetBundles,
|
|
511
|
+
}, workers, (count) => lifetime.setConnectionCount(count));
|
|
512
|
+
await coordinator.connect();
|
|
513
|
+
startupLease.close();
|
|
514
|
+
startupLease = undefined;
|
|
515
|
+
await workers.discover(coordinator.peerIds);
|
|
516
|
+
await backend.refreshSessions();
|
|
517
|
+
relay = new RadiusRelayHost({
|
|
518
|
+
serverId,
|
|
519
|
+
server: backend.server,
|
|
520
|
+
auth: new RadiusRelayAuthResolver(options.relayAuth),
|
|
521
|
+
onStatus: options.onRelayStatus,
|
|
522
|
+
});
|
|
523
|
+
relay.start();
|
|
524
|
+
const activeBackend = backend;
|
|
525
|
+
const activeCoordinator = coordinator;
|
|
526
|
+
const activeWorkers = workers;
|
|
527
|
+
const activeRelay = relay;
|
|
528
|
+
void activeCoordinator.replaced
|
|
529
|
+
.then(async () => {
|
|
530
|
+
lifetime.stop();
|
|
531
|
+
activeWorkers.detach();
|
|
532
|
+
await activeRelay.close();
|
|
533
|
+
await activeBackend.close();
|
|
534
|
+
})
|
|
535
|
+
.finally(() => activeCoordinator.close())
|
|
536
|
+
.catch(() => { });
|
|
537
|
+
let closePromise;
|
|
538
|
+
const runtime = {
|
|
539
|
+
serverId,
|
|
540
|
+
sessionDir: activeBackend.sessionDir,
|
|
541
|
+
socketPath,
|
|
542
|
+
server: activeBackend.server,
|
|
543
|
+
workerPids: activeWorkers.workerPids,
|
|
544
|
+
closed: activeBackend.closed.finally(() => activeRelay.close()),
|
|
545
|
+
close() {
|
|
546
|
+
lifetime.stop();
|
|
547
|
+
closePromise ??= (async () => {
|
|
548
|
+
try {
|
|
549
|
+
await activeRelay.close();
|
|
550
|
+
await activeBackend.close();
|
|
551
|
+
}
|
|
552
|
+
finally {
|
|
553
|
+
try {
|
|
554
|
+
if (activeCoordinator.wasReplaced)
|
|
555
|
+
activeWorkers.detach();
|
|
556
|
+
else
|
|
557
|
+
await activeWorkers.shutdown();
|
|
558
|
+
}
|
|
559
|
+
finally {
|
|
560
|
+
activeCoordinator.close();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
})();
|
|
564
|
+
return closePromise;
|
|
565
|
+
},
|
|
566
|
+
};
|
|
567
|
+
lifetime.start(() => {
|
|
568
|
+
void runtime.close().catch(() => { });
|
|
569
|
+
});
|
|
570
|
+
released = true;
|
|
571
|
+
await release();
|
|
572
|
+
return runtime;
|
|
573
|
+
}
|
|
574
|
+
catch (error) {
|
|
575
|
+
lifetime.stop();
|
|
576
|
+
startupLease?.close();
|
|
577
|
+
if (coordinator?.wasReplaced)
|
|
578
|
+
workers?.detach();
|
|
579
|
+
const cleanup = await Promise.allSettled([
|
|
580
|
+
relay?.close(),
|
|
581
|
+
backend?.close(),
|
|
582
|
+
coordinator?.wasReplaced ? undefined : workers?.shutdown(),
|
|
583
|
+
Promise.resolve(coordinator?.close()),
|
|
584
|
+
released ? undefined : release(),
|
|
585
|
+
]);
|
|
586
|
+
const cleanupErrors = cleanup.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
|
|
587
|
+
if (cleanupErrors.length > 0) {
|
|
588
|
+
throw new AggregateError([error, ...cleanupErrors], "Server runtime startup and cleanup failed");
|
|
589
|
+
}
|
|
590
|
+
throw error;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
/** Start an operator-held server while serializing against automatic cold activation. */
|
|
594
|
+
export async function startForegroundServer(options = {}) {
|
|
595
|
+
const directory = resolveServerDirectory(options.directory);
|
|
596
|
+
await ensurePrivateServerDirectory(directory);
|
|
597
|
+
const profile = await acquireServerProfile(directory, options.serverId ?? process.env[ENV_SERVER_ID]);
|
|
598
|
+
const serverId = profile.serverId;
|
|
599
|
+
await profile.release();
|
|
600
|
+
const release = await acquireServerActivation(directory, serverId);
|
|
601
|
+
try {
|
|
602
|
+
return await startServer({
|
|
603
|
+
...options,
|
|
604
|
+
directory,
|
|
605
|
+
serverId,
|
|
606
|
+
keepAlive: true,
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
finally {
|
|
610
|
+
await release();
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
function parseServerModelOptions(value) {
|
|
614
|
+
if (value === undefined)
|
|
615
|
+
return undefined;
|
|
616
|
+
let parsed;
|
|
617
|
+
try {
|
|
618
|
+
parsed = JSON.parse(value);
|
|
619
|
+
}
|
|
620
|
+
catch (error) {
|
|
621
|
+
throw new Error("Internal server received invalid model options", { cause: error });
|
|
622
|
+
}
|
|
623
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
624
|
+
throw new Error("Internal server received invalid model options");
|
|
625
|
+
}
|
|
626
|
+
const keys = Object.keys(parsed);
|
|
627
|
+
const model = "model" in parsed ? parsed.model : undefined;
|
|
628
|
+
const provider = "provider" in parsed ? parsed.provider : undefined;
|
|
629
|
+
if (keys.some((key) => key !== "provider" && key !== "model") ||
|
|
630
|
+
typeof model !== "string" ||
|
|
631
|
+
model.length === 0 ||
|
|
632
|
+
(provider !== undefined && (typeof provider !== "string" || provider.length === 0))) {
|
|
633
|
+
throw new Error("Internal server received invalid model options");
|
|
634
|
+
}
|
|
635
|
+
return provider === undefined ? { model } : { provider, model };
|
|
636
|
+
}
|
|
637
|
+
/** Run an automatically activated server until its client and Session demand disappears. */
|
|
638
|
+
export async function runServerProcess(args) {
|
|
639
|
+
const [directory, serverId, sessionDir, serializedModel] = args;
|
|
640
|
+
if (args.length > 4)
|
|
641
|
+
throw new Error("Internal server received unexpected arguments");
|
|
642
|
+
if (!directory || !isAbsolute(directory))
|
|
643
|
+
throw new Error("Internal server requires an absolute server directory");
|
|
644
|
+
if (!isServerId(serverId))
|
|
645
|
+
throw new Error("Internal server requires a canonical server ID");
|
|
646
|
+
if (!sessionDir || !isAbsolute(sessionDir))
|
|
647
|
+
throw new Error("Internal server requires an absolute Session directory");
|
|
648
|
+
const workerModel = parseServerModelOptions(serializedModel);
|
|
649
|
+
const runtime = await startServer({
|
|
650
|
+
directory,
|
|
651
|
+
serverId,
|
|
652
|
+
sessionDir,
|
|
653
|
+
keepAlive: false,
|
|
654
|
+
...workerModel,
|
|
655
|
+
});
|
|
656
|
+
const close = () => {
|
|
657
|
+
void runtime.close().catch(() => { });
|
|
658
|
+
};
|
|
659
|
+
process.once("SIGINT", close);
|
|
660
|
+
process.once("SIGTERM", close);
|
|
661
|
+
try {
|
|
662
|
+
await runtime.closed;
|
|
663
|
+
}
|
|
664
|
+
finally {
|
|
665
|
+
process.off("SIGINT", close);
|
|
666
|
+
process.off("SIGTERM", close);
|
|
667
|
+
await runtime.close();
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
function sameStrings(left, right) {
|
|
671
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
672
|
+
}
|
|
673
|
+
if (isDirectInternalProcessEntry(import.meta.url)) {
|
|
674
|
+
const role = consumeInternalProcessRole();
|
|
675
|
+
if (role !== "server")
|
|
676
|
+
throw new Error("Server entrypoint requires an internal server invocation");
|
|
677
|
+
void runServerProcess(process.argv.slice(2)).catch((error) => {
|
|
678
|
+
console.error(error);
|
|
679
|
+
process.exit(1);
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
//# sourceMappingURL=server.js.map
|