@astralyn/pi 0.84.15 → 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 +14 -0
- 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/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.js +2541 -18
- 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.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 -161
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -11
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -173
- 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 -54
- 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 -68
- 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 -48
- 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 +5 -121
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts +13 -0
- package/dist/core/tools/renderers/bash.d.ts.map +1 -0
- package/dist/core/tools/renderers/bash.js +174 -0
- package/dist/core/tools/renderers/bash.js.map +1 -0
- package/dist/core/tools/renderers/edit.d.ts +22 -0
- package/dist/core/tools/renderers/edit.d.ts.map +1 -0
- package/dist/core/tools/renderers/edit.js +177 -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 +63 -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 +77 -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 +57 -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 +131 -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 +151 -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 -144
- 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 +176 -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 +572 -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 +461 -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 +51 -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 +301 -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 +699 -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/background/index.d.ts +5 -4
- package/dist/extensions/background/index.d.ts.map +1 -1
- package/dist/extensions/background/index.js +9 -5
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +9 -2
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/image-resize-worker.js +2 -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 +37 -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.js +2 -2
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +22 -4
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +31 -30
- package/dist/modes/interactive/components/tool-execution.js.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/rpc-entry.js +2541 -10
- 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/bundled/extensions/background.md +2 -2
- package/docs/bundled/extensions/subagent.md +1 -1
- package/docs/development.md +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 +724 -212
- package/package.json +15 -7
- 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/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,113 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { bundleFacetPackage } from "@earendil-works/chord/bundler";
|
|
5
|
+
import { FACET_BUNDLE_MANIFEST_FILE, readFacetBundleArtifact, } from "@earendil-works/chord/node";
|
|
6
|
+
const PLUGIN_PACKAGE_PROFILE_VERSION = 1;
|
|
7
|
+
const DEFAULT_PLUGIN_FACETS = Object.freeze({ session: "src/session.ts", tui: "src/tui.ts" });
|
|
8
|
+
/** Persist an explicit plugin package selection or restore it for a later server generation. */
|
|
9
|
+
export async function restoreServerPluginPackageProfile(directory, serverId, configuredPackagePaths) {
|
|
10
|
+
const path = join(directory, `plugin-packages-${serverId}.json`);
|
|
11
|
+
if (configuredPackagePaths === undefined) {
|
|
12
|
+
return (await readPluginPackageProfile(path, false)) ?? [];
|
|
13
|
+
}
|
|
14
|
+
const packagePaths = normalizePluginPackagePaths(configuredPackagePaths);
|
|
15
|
+
if (packagePaths.length === 0)
|
|
16
|
+
await rm(path, { force: true });
|
|
17
|
+
else
|
|
18
|
+
await writePluginPackageProfile(path, packagePaths);
|
|
19
|
+
return packagePaths;
|
|
20
|
+
}
|
|
21
|
+
/** Read the explicit plugin selection stored for one durable Session. */
|
|
22
|
+
export function readSessionPluginPackageProfile(directory, serverId, sessionPath) {
|
|
23
|
+
return readPluginPackageProfile(sessionPluginProfilePath(directory, serverId, sessionPath), true, sessionPath);
|
|
24
|
+
}
|
|
25
|
+
/** Remove the plugin selection stored for one deleted Session. */
|
|
26
|
+
export async function removeSessionPluginPackageProfile(directory, serverId, sessionPath) {
|
|
27
|
+
await rm(sessionPluginProfilePath(directory, serverId, sessionPath), { force: true });
|
|
28
|
+
}
|
|
29
|
+
/** Persist the plugin selection for one durable Session. */
|
|
30
|
+
export function writeSessionPluginPackageProfile(directory, serverId, sessionPath, packagePaths) {
|
|
31
|
+
return writePluginPackageProfile(sessionPluginProfilePath(directory, serverId, sessionPath), normalizePluginPackagePaths(packagePaths), sessionPath);
|
|
32
|
+
}
|
|
33
|
+
/** Create a serialized server-owned builder for one configured plugin package. */
|
|
34
|
+
export function createServerPluginPackage(directory, serverId, packagePath) {
|
|
35
|
+
const normalizedPackagePath = resolve(packagePath);
|
|
36
|
+
const outdir = join(directory, "plugin-builds", serverId, pluginBuildDirectoryName(normalizedPackagePath));
|
|
37
|
+
const manifestPath = join(outdir, FACET_BUNDLE_MANIFEST_FILE);
|
|
38
|
+
let buildTail = Promise.resolve();
|
|
39
|
+
return {
|
|
40
|
+
manifestPath,
|
|
41
|
+
build() {
|
|
42
|
+
const operation = buildTail.then(async () => {
|
|
43
|
+
const result = await bundleFacetPackage({
|
|
44
|
+
packagePath: normalizedPackagePath,
|
|
45
|
+
outdir,
|
|
46
|
+
defaultFacets: DEFAULT_PLUGIN_FACETS,
|
|
47
|
+
});
|
|
48
|
+
if (result.manifest.entries.tui === undefined)
|
|
49
|
+
return [];
|
|
50
|
+
return [await readFacetBundleArtifact({ manifestPath: result.manifestPath, entry: "tui" })];
|
|
51
|
+
});
|
|
52
|
+
buildTail = operation.then(() => undefined, () => undefined);
|
|
53
|
+
return operation;
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async function readPluginPackageProfile(path, allowEmpty, sessionPath) {
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = JSON.parse(await readFile(path, "utf8"));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
64
|
+
return undefined;
|
|
65
|
+
throw new Error(`Could not read experimental plugin package profile ${path}`, { cause: error });
|
|
66
|
+
}
|
|
67
|
+
if (typeof parsed !== "object" ||
|
|
68
|
+
parsed === null ||
|
|
69
|
+
Array.isArray(parsed) ||
|
|
70
|
+
Object.keys(parsed).some((key) => key !== "version" && key !== "packagePaths" && !(key === "sessionPath" && sessionPath !== undefined)) ||
|
|
71
|
+
!("version" in parsed) ||
|
|
72
|
+
parsed.version !== PLUGIN_PACKAGE_PROFILE_VERSION ||
|
|
73
|
+
(sessionPath === undefined
|
|
74
|
+
? "sessionPath" in parsed
|
|
75
|
+
: !("sessionPath" in parsed) || parsed.sessionPath !== sessionPath) ||
|
|
76
|
+
!("packagePaths" in parsed) ||
|
|
77
|
+
!Array.isArray(parsed.packagePaths) ||
|
|
78
|
+
(!allowEmpty && parsed.packagePaths.length === 0) ||
|
|
79
|
+
parsed.packagePaths.some((packagePath) => typeof packagePath !== "string" || packagePath.length === 0)) {
|
|
80
|
+
throw new Error(`Invalid experimental plugin package profile ${path}`);
|
|
81
|
+
}
|
|
82
|
+
return normalizePluginPackagePaths(parsed.packagePaths);
|
|
83
|
+
}
|
|
84
|
+
function writePluginPackageProfile(path, packagePaths, sessionPath) {
|
|
85
|
+
return writeFile(path, `${JSON.stringify({
|
|
86
|
+
version: PLUGIN_PACKAGE_PROFILE_VERSION,
|
|
87
|
+
...(sessionPath === undefined ? {} : { sessionPath }),
|
|
88
|
+
packagePaths,
|
|
89
|
+
}, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
90
|
+
}
|
|
91
|
+
export function normalizePluginPackagePaths(packagePaths) {
|
|
92
|
+
const normalized = packagePaths.map((packagePath) => {
|
|
93
|
+
if (packagePath.length === 0)
|
|
94
|
+
throw new Error("Plugin package path must not be empty");
|
|
95
|
+
return resolve(packagePath);
|
|
96
|
+
});
|
|
97
|
+
if (new Set(normalized).size !== normalized.length) {
|
|
98
|
+
throw new Error("Plugin package paths must be unique");
|
|
99
|
+
}
|
|
100
|
+
return Object.freeze(normalized);
|
|
101
|
+
}
|
|
102
|
+
function sessionPluginProfilePath(directory, serverId, sessionPath) {
|
|
103
|
+
const hash = createHash("sha256").update(sessionPath).digest("hex").slice(0, 24);
|
|
104
|
+
return join(directory, `session-plugin-packages-${serverId}-${hash}.json`);
|
|
105
|
+
}
|
|
106
|
+
function pluginBuildDirectoryName(packagePath) {
|
|
107
|
+
const packageDirectory = basename(packagePath) === "package.json" ? dirname(packagePath) : packagePath;
|
|
108
|
+
const base = basename(packageDirectory).replaceAll(/[^a-zA-Z0-9._-]/gu, "-") || "plugin";
|
|
109
|
+
const label = base.endsWith("-plugin") ? base : `${base}-plugin`;
|
|
110
|
+
const hash = createHash("sha256").update(packagePath).digest("hex").slice(0, 12);
|
|
111
|
+
return `${label}-${hash}`;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/experimental/plugins/package.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { bundleFacetPackage } from \"@earendil-works/chord/bundler\";\nimport {\n\tFACET_BUNDLE_MANIFEST_FILE,\n\ttype FacetBundleArtifact,\n\treadFacetBundleArtifact,\n} from \"@earendil-works/chord/node\";\nimport type { ServerId } from \"@earendil-works/pi-protocol\";\n\nconst PLUGIN_PACKAGE_PROFILE_VERSION = 1;\nconst DEFAULT_PLUGIN_FACETS = Object.freeze({ session: \"src/session.ts\", tui: \"src/tui.ts\" });\n\nexport interface ConfiguredServerPluginPackage {\n\treadonly manifestPath: string;\n\tbuild(): Promise<readonly FacetBundleArtifact[]>;\n}\n\n/** Persist an explicit plugin package selection or restore it for a later server generation. */\nexport async function restoreServerPluginPackageProfile(\n\tdirectory: string,\n\tserverId: ServerId,\n\tconfiguredPackagePaths?: readonly string[],\n): Promise<readonly string[]> {\n\tconst path = join(directory, `plugin-packages-${serverId}.json`);\n\tif (configuredPackagePaths === undefined) {\n\t\treturn (await readPluginPackageProfile(path, false)) ?? [];\n\t}\n\tconst packagePaths = normalizePluginPackagePaths(configuredPackagePaths);\n\tif (packagePaths.length === 0) await rm(path, { force: true });\n\telse await writePluginPackageProfile(path, packagePaths);\n\treturn packagePaths;\n}\n\n/** Read the explicit plugin selection stored for one durable Session. */\nexport function readSessionPluginPackageProfile(\n\tdirectory: string,\n\tserverId: ServerId,\n\tsessionPath: string,\n): Promise<readonly string[] | undefined> {\n\treturn readPluginPackageProfile(sessionPluginProfilePath(directory, serverId, sessionPath), true, sessionPath);\n}\n\n/** Remove the plugin selection stored for one deleted Session. */\nexport async function removeSessionPluginPackageProfile(\n\tdirectory: string,\n\tserverId: ServerId,\n\tsessionPath: string,\n): Promise<void> {\n\tawait rm(sessionPluginProfilePath(directory, serverId, sessionPath), { force: true });\n}\n\n/** Persist the plugin selection for one durable Session. */\nexport function writeSessionPluginPackageProfile(\n\tdirectory: string,\n\tserverId: ServerId,\n\tsessionPath: string,\n\tpackagePaths: readonly string[],\n): Promise<void> {\n\treturn writePluginPackageProfile(\n\t\tsessionPluginProfilePath(directory, serverId, sessionPath),\n\t\tnormalizePluginPackagePaths(packagePaths),\n\t\tsessionPath,\n\t);\n}\n\n/** Create a serialized server-owned builder for one configured plugin package. */\nexport function createServerPluginPackage(\n\tdirectory: string,\n\tserverId: ServerId,\n\tpackagePath: string,\n): ConfiguredServerPluginPackage {\n\tconst normalizedPackagePath = resolve(packagePath);\n\tconst outdir = join(directory, \"plugin-builds\", serverId, pluginBuildDirectoryName(normalizedPackagePath));\n\tconst manifestPath = join(outdir, FACET_BUNDLE_MANIFEST_FILE);\n\tlet buildTail = Promise.resolve();\n\treturn {\n\t\tmanifestPath,\n\t\tbuild() {\n\t\t\tconst operation = buildTail.then(async () => {\n\t\t\t\tconst result = await bundleFacetPackage({\n\t\t\t\t\tpackagePath: normalizedPackagePath,\n\t\t\t\t\toutdir,\n\t\t\t\t\tdefaultFacets: DEFAULT_PLUGIN_FACETS,\n\t\t\t\t});\n\t\t\t\tif (result.manifest.entries.tui === undefined) return [];\n\t\t\t\treturn [await readFacetBundleArtifact({ manifestPath: result.manifestPath, entry: \"tui\" })];\n\t\t\t});\n\t\t\tbuildTail = operation.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn operation;\n\t\t},\n\t};\n}\n\nasync function readPluginPackageProfile(\n\tpath: string,\n\tallowEmpty: boolean,\n\tsessionPath?: string,\n): Promise<readonly string[] | undefined> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(await readFile(path, \"utf8\"));\n\t} catch (error) {\n\t\tif (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n\t\tthrow new Error(`Could not read experimental plugin package profile ${path}`, { cause: error });\n\t}\n\tif (\n\t\ttypeof parsed !== \"object\" ||\n\t\tparsed === null ||\n\t\tArray.isArray(parsed) ||\n\t\tObject.keys(parsed).some(\n\t\t\t(key) => key !== \"version\" && key !== \"packagePaths\" && !(key === \"sessionPath\" && sessionPath !== undefined),\n\t\t) ||\n\t\t!(\"version\" in parsed) ||\n\t\tparsed.version !== PLUGIN_PACKAGE_PROFILE_VERSION ||\n\t\t(sessionPath === undefined\n\t\t\t? \"sessionPath\" in parsed\n\t\t\t: !(\"sessionPath\" in parsed) || parsed.sessionPath !== sessionPath) ||\n\t\t!(\"packagePaths\" in parsed) ||\n\t\t!Array.isArray(parsed.packagePaths) ||\n\t\t(!allowEmpty && parsed.packagePaths.length === 0) ||\n\t\tparsed.packagePaths.some((packagePath) => typeof packagePath !== \"string\" || packagePath.length === 0)\n\t) {\n\t\tthrow new Error(`Invalid experimental plugin package profile ${path}`);\n\t}\n\treturn normalizePluginPackagePaths(parsed.packagePaths as readonly string[]);\n}\n\nfunction writePluginPackageProfile(path: string, packagePaths: readonly string[], sessionPath?: string): Promise<void> {\n\treturn writeFile(\n\t\tpath,\n\t\t`${JSON.stringify(\n\t\t\t{\n\t\t\t\tversion: PLUGIN_PACKAGE_PROFILE_VERSION,\n\t\t\t\t...(sessionPath === undefined ? {} : { sessionPath }),\n\t\t\t\tpackagePaths,\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t)}\\n`,\n\t\t{ encoding: \"utf8\", mode: 0o600 },\n\t);\n}\n\nexport function normalizePluginPackagePaths(packagePaths: readonly string[]): readonly string[] {\n\tconst normalized = packagePaths.map((packagePath) => {\n\t\tif (packagePath.length === 0) throw new Error(\"Plugin package path must not be empty\");\n\t\treturn resolve(packagePath);\n\t});\n\tif (new Set(normalized).size !== normalized.length) {\n\t\tthrow new Error(\"Plugin package paths must be unique\");\n\t}\n\treturn Object.freeze(normalized);\n}\n\nfunction sessionPluginProfilePath(directory: string, serverId: ServerId, sessionPath: string): string {\n\tconst hash = createHash(\"sha256\").update(sessionPath).digest(\"hex\").slice(0, 24);\n\treturn join(directory, `session-plugin-packages-${serverId}-${hash}.json`);\n}\n\nfunction pluginBuildDirectoryName(packagePath: string): string {\n\tconst packageDirectory = basename(packagePath) === \"package.json\" ? dirname(packagePath) : packagePath;\n\tconst base = basename(packageDirectory).replaceAll(/[^a-zA-Z0-9._-]/gu, \"-\") || \"plugin\";\n\tconst label = base.endsWith(\"-plugin\") ? base : `${base}-plugin`;\n\tconst hash = createHash(\"sha256\").update(packagePath).digest(\"hex\").slice(0, 12);\n\treturn `${label}-${hash}`;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
export declare const INTERNAL_PROCESS_ENV = "__PI_INTERNAL_SPAWN";
|
|
3
|
+
export type InternalProcessRole = "coordinator" | "server" | "session-worker";
|
|
4
|
+
/** Detect a directly executed source or unbundled internal-process module. */
|
|
5
|
+
export declare function isDirectInternalProcessEntry(moduleUrl: string): boolean;
|
|
6
|
+
/** Read and validate an internal process role without consuming it. */
|
|
7
|
+
export declare function getInternalProcessRole(): InternalProcessRole | undefined;
|
|
8
|
+
/** Read, validate, and remove the role so descendants do not inherit it. */
|
|
9
|
+
export declare function consumeInternalProcessRole(): InternalProcessRole | undefined;
|
|
10
|
+
export interface InternalProcessSpawnOptions {
|
|
11
|
+
readonly entryUrl?: URL;
|
|
12
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
13
|
+
}
|
|
14
|
+
/** Spawn a detached Pi-owned process consistently across Node and compiled Bun. */
|
|
15
|
+
export declare function spawnInternalProcess(role: InternalProcessRole, args: readonly string[], options?: InternalProcessSpawnOptions): ChildProcess;
|
|
16
|
+
/** Force a spawned internal process to exit and wait until it can no longer take ownership. */
|
|
17
|
+
export declare function terminateInternalProcess(child: ChildProcess): Promise<void>;
|
|
18
|
+
export declare const MAX_CONTROL_LINE_BYTES: number;
|
|
19
|
+
export declare function encodeControlLine(message: unknown): string;
|
|
20
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/experimental/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAK9D,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAE9E,8EAA8E;AAC9E,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,SAAS,CAKxE;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,IAAI,mBAAmB,GAAG,SAAS,CAI5E;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACjC;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,2BAAgC,GACvC,YAAY,CAyBd;AAED,+FAA+F;AAC/F,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjF;AAkBD,eAAO,MAAM,sBAAsB,QAAoB,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAI1D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import { getPackageDir, isBunBinary, isBundledNode } from "../config.js";
|
|
5
|
+
export const INTERNAL_PROCESS_ENV = "__PI_INTERNAL_SPAWN";
|
|
6
|
+
/** Detect a directly executed source or unbundled internal-process module. */
|
|
7
|
+
export function isDirectInternalProcessEntry(moduleUrl) {
|
|
8
|
+
return (!isBunBinary &&
|
|
9
|
+
!isBundledNode &&
|
|
10
|
+
process.argv[1] !== undefined &&
|
|
11
|
+
resolve(process.argv[1]) === fileURLToPath(moduleUrl));
|
|
12
|
+
}
|
|
13
|
+
/** Read and validate an internal process role without consuming it. */
|
|
14
|
+
export function getInternalProcessRole() {
|
|
15
|
+
const role = process.env[INTERNAL_PROCESS_ENV];
|
|
16
|
+
if (role === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (role === "coordinator" || role === "server" || role === "session-worker")
|
|
19
|
+
return role;
|
|
20
|
+
throw new Error(`Unsupported internal process role: ${role}`);
|
|
21
|
+
}
|
|
22
|
+
/** Read, validate, and remove the role so descendants do not inherit it. */
|
|
23
|
+
export function consumeInternalProcessRole() {
|
|
24
|
+
const role = getInternalProcessRole();
|
|
25
|
+
delete process.env[INTERNAL_PROCESS_ENV];
|
|
26
|
+
return role;
|
|
27
|
+
}
|
|
28
|
+
/** Spawn a detached Pi-owned process consistently across Node and compiled Bun. */
|
|
29
|
+
export function spawnInternalProcess(role, args, options = {}) {
|
|
30
|
+
if (isBunBinary && options.entryUrl) {
|
|
31
|
+
throw new Error("A compiled Bun executable cannot launch an external internal-process entrypoint");
|
|
32
|
+
}
|
|
33
|
+
const entryUrl = defaultEntryUrl(role, options.entryUrl);
|
|
34
|
+
const sourceRuntimeArgs = import.meta.url.endsWith(".ts")
|
|
35
|
+
? ["--import", fileURLToPath(new URL("source-resolver.ts", import.meta.url))]
|
|
36
|
+
: [];
|
|
37
|
+
const child = spawn(process.execPath, isBunBinary ? [...args] : [...sourceRuntimeArgs, fileURLToPath(entryUrl), ...args], {
|
|
38
|
+
cwd: process.cwd(),
|
|
39
|
+
detached: true,
|
|
40
|
+
env: {
|
|
41
|
+
...process.env,
|
|
42
|
+
...options.env,
|
|
43
|
+
[INTERNAL_PROCESS_ENV]: role,
|
|
44
|
+
},
|
|
45
|
+
stdio: "ignore",
|
|
46
|
+
windowsHide: true,
|
|
47
|
+
});
|
|
48
|
+
child.unref();
|
|
49
|
+
return child;
|
|
50
|
+
}
|
|
51
|
+
/** Force a spawned internal process to exit and wait until it can no longer take ownership. */
|
|
52
|
+
export async function terminateInternalProcess(child) {
|
|
53
|
+
if (child.pid === undefined || child.exitCode !== null || child.signalCode !== null)
|
|
54
|
+
return;
|
|
55
|
+
const terminated = new Promise((resolve) => {
|
|
56
|
+
child.once("exit", () => resolve());
|
|
57
|
+
child.once("error", () => resolve());
|
|
58
|
+
});
|
|
59
|
+
child.kill("SIGKILL");
|
|
60
|
+
await terminated;
|
|
61
|
+
}
|
|
62
|
+
function defaultEntryUrl(role, override) {
|
|
63
|
+
if (override)
|
|
64
|
+
return override;
|
|
65
|
+
if (isBundledNode) {
|
|
66
|
+
const entry = role === "coordinator" ? "coordinator.js" : "cli.js";
|
|
67
|
+
return pathToFileURL(join(getPackageDir(), "dist", "bundle", entry));
|
|
68
|
+
}
|
|
69
|
+
const javaScript = import.meta.url.endsWith(".js");
|
|
70
|
+
if (role === "coordinator") {
|
|
71
|
+
return new URL(javaScript ? "coordinator.js" : "coordinator.ts", import.meta.url);
|
|
72
|
+
}
|
|
73
|
+
if (role === "server") {
|
|
74
|
+
return new URL(javaScript ? "server.js" : "server.ts", import.meta.url);
|
|
75
|
+
}
|
|
76
|
+
return new URL(javaScript ? "session-worker.js" : "session-worker.ts", import.meta.url);
|
|
77
|
+
}
|
|
78
|
+
export const MAX_CONTROL_LINE_BYTES = 128 * 1024 * 1024;
|
|
79
|
+
export function encodeControlLine(message) {
|
|
80
|
+
const line = `${JSON.stringify(message)}\n`;
|
|
81
|
+
if (Buffer.byteLength(line) > MAX_CONTROL_LINE_BYTES)
|
|
82
|
+
throw new Error("Internal control message is too large");
|
|
83
|
+
return line;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/experimental/process.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { getPackageDir, isBunBinary, isBundledNode } from \"../config.ts\";\n\nexport const INTERNAL_PROCESS_ENV = \"__PI_INTERNAL_SPAWN\";\n\nexport type InternalProcessRole = \"coordinator\" | \"server\" | \"session-worker\";\n\n/** Detect a directly executed source or unbundled internal-process module. */\nexport function isDirectInternalProcessEntry(moduleUrl: string): boolean {\n\treturn (\n\t\t!isBunBinary &&\n\t\t!isBundledNode &&\n\t\tprocess.argv[1] !== undefined &&\n\t\tresolve(process.argv[1]) === fileURLToPath(moduleUrl)\n\t);\n}\n\n/** Read and validate an internal process role without consuming it. */\nexport function getInternalProcessRole(): InternalProcessRole | undefined {\n\tconst role = process.env[INTERNAL_PROCESS_ENV];\n\tif (role === undefined) return undefined;\n\tif (role === \"coordinator\" || role === \"server\" || role === \"session-worker\") return role;\n\tthrow new Error(`Unsupported internal process role: ${role}`);\n}\n\n/** Read, validate, and remove the role so descendants do not inherit it. */\nexport function consumeInternalProcessRole(): InternalProcessRole | undefined {\n\tconst role = getInternalProcessRole();\n\tdelete process.env[INTERNAL_PROCESS_ENV];\n\treturn role;\n}\n\nexport interface InternalProcessSpawnOptions {\n\treadonly entryUrl?: URL;\n\treadonly env?: NodeJS.ProcessEnv;\n}\n\n/** Spawn a detached Pi-owned process consistently across Node and compiled Bun. */\nexport function spawnInternalProcess(\n\trole: InternalProcessRole,\n\targs: readonly string[],\n\toptions: InternalProcessSpawnOptions = {},\n): ChildProcess {\n\tif (isBunBinary && options.entryUrl) {\n\t\tthrow new Error(\"A compiled Bun executable cannot launch an external internal-process entrypoint\");\n\t}\n\tconst entryUrl = defaultEntryUrl(role, options.entryUrl);\n\tconst sourceRuntimeArgs = import.meta.url.endsWith(\".ts\")\n\t\t? [\"--import\", fileURLToPath(new URL(\"source-resolver.ts\", import.meta.url))]\n\t\t: [];\n\tconst child = spawn(\n\t\tprocess.execPath,\n\t\tisBunBinary ? [...args] : [...sourceRuntimeArgs, fileURLToPath(entryUrl), ...args],\n\t\t{\n\t\t\tcwd: process.cwd(),\n\t\t\tdetached: true,\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t...options.env,\n\t\t\t\t[INTERNAL_PROCESS_ENV]: role,\n\t\t\t},\n\t\t\tstdio: \"ignore\",\n\t\t\twindowsHide: true,\n\t\t},\n\t);\n\tchild.unref();\n\treturn child;\n}\n\n/** Force a spawned internal process to exit and wait until it can no longer take ownership. */\nexport async function terminateInternalProcess(child: ChildProcess): Promise<void> {\n\tif (child.pid === undefined || child.exitCode !== null || child.signalCode !== null) return;\n\tconst terminated = new Promise<void>((resolve) => {\n\t\tchild.once(\"exit\", () => resolve());\n\t\tchild.once(\"error\", () => resolve());\n\t});\n\tchild.kill(\"SIGKILL\");\n\tawait terminated;\n}\n\nfunction defaultEntryUrl(role: InternalProcessRole, override: URL | undefined): URL {\n\tif (override) return override;\n\tif (isBundledNode) {\n\t\tconst entry = role === \"coordinator\" ? \"coordinator.js\" : \"cli.js\";\n\t\treturn pathToFileURL(join(getPackageDir(), \"dist\", \"bundle\", entry));\n\t}\n\tconst javaScript = import.meta.url.endsWith(\".js\");\n\tif (role === \"coordinator\") {\n\t\treturn new URL(javaScript ? \"coordinator.js\" : \"coordinator.ts\", import.meta.url);\n\t}\n\tif (role === \"server\") {\n\t\treturn new URL(javaScript ? \"server.js\" : \"server.ts\", import.meta.url);\n\t}\n\treturn new URL(javaScript ? \"session-worker.js\" : \"session-worker.ts\", import.meta.url);\n}\n\nexport const MAX_CONTROL_LINE_BYTES = 128 * 1024 * 1024;\n\nexport function encodeControlLine(message: unknown): string {\n\tconst line = `${JSON.stringify(message)}\\n`;\n\tif (Buffer.byteLength(line) > MAX_CONTROL_LINE_BYTES) throw new Error(\"Internal control message is too large\");\n\treturn line;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AuthInput } from "../cli/experimental/command-options.ts";
|
|
2
|
+
export declare const ENV_RADIUS_GATEWAY = "PI_RADIUS_GATEWAY";
|
|
3
|
+
export interface RadiusRelayAuth {
|
|
4
|
+
readonly gateway: string;
|
|
5
|
+
readonly token: string;
|
|
6
|
+
}
|
|
7
|
+
/** Resolve explicit or stored Radius credentials anew for every relay connection attempt. */
|
|
8
|
+
export declare class RadiusRelayAuthResolver {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(input?: AuthInput, gateway?: string);
|
|
11
|
+
get gateway(): string;
|
|
12
|
+
resolve(options: {
|
|
13
|
+
readonly required: boolean;
|
|
14
|
+
readonly signal?: AbortSignal;
|
|
15
|
+
}): Promise<RadiusRelayAuth | undefined>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=radius-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radius-auth.d.ts","sourceRoot":"","sources":["../../src/experimental/radius-auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAIxE,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,6FAA6F;AAC7F,qBAAa,uBAAuB;;gBAKvB,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,SAA4D;IAKlG,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEK,OAAO,CAAC,OAAO,EAAE;QACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;KAC9B,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;CAiCxC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { DEFAULT_RADIUS_GATEWAY, normalizeRadiusGatewayUrl } from "@earendil-works/pi-ai/providers/radius-config";
|
|
3
|
+
import { getAuthCredential } from "../cli/auth-command.js";
|
|
4
|
+
import { ModelRuntime } from "../core/model-runtime.js";
|
|
5
|
+
import { resolvePath } from "../utils/paths.js";
|
|
6
|
+
export const ENV_RADIUS_GATEWAY = "PI_RADIUS_GATEWAY";
|
|
7
|
+
/** Resolve explicit or stored Radius credentials anew for every relay connection attempt. */
|
|
8
|
+
export class RadiusRelayAuthResolver {
|
|
9
|
+
#input;
|
|
10
|
+
#gateway;
|
|
11
|
+
#modelRuntime;
|
|
12
|
+
constructor(input, gateway = process.env[ENV_RADIUS_GATEWAY] ?? DEFAULT_RADIUS_GATEWAY) {
|
|
13
|
+
this.#input = input;
|
|
14
|
+
this.#gateway = normalizeRadiusGatewayUrl(gateway);
|
|
15
|
+
}
|
|
16
|
+
get gateway() {
|
|
17
|
+
return this.#gateway;
|
|
18
|
+
}
|
|
19
|
+
async resolve(options) {
|
|
20
|
+
options.signal?.throwIfAborted();
|
|
21
|
+
if (process.env.PI_OFFLINE !== undefined) {
|
|
22
|
+
if (options.required)
|
|
23
|
+
throw new Error("Radius relay connections are unavailable in offline mode");
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const explicit = await this.#explicitToken(options.signal);
|
|
27
|
+
if (explicit !== undefined)
|
|
28
|
+
return { gateway: this.#gateway, token: explicit };
|
|
29
|
+
this.#modelRuntime ??= ModelRuntime.create({ refreshOnCreate: false, allowModelNetwork: false });
|
|
30
|
+
const runtime = await this.#modelRuntime;
|
|
31
|
+
options.signal?.throwIfAborted();
|
|
32
|
+
const token = getAuthCredential(await runtime.getAuth("radius", { minOAuthValidityMs: 5 * 60_000, signal: options.signal }));
|
|
33
|
+
if (token !== undefined && token.length > 0)
|
|
34
|
+
return { gateway: this.#gateway, token };
|
|
35
|
+
if (options.required) {
|
|
36
|
+
throw new Error("Radius authentication is required; start Pi and run /login radius, then retry");
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
async #explicitToken(signal) {
|
|
41
|
+
if (this.#input === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
const value = this.#input.type === "token"
|
|
44
|
+
? this.#input.token
|
|
45
|
+
: await readFile(resolvePath(this.#input.path), { encoding: "utf8", signal });
|
|
46
|
+
const token = value.trim();
|
|
47
|
+
if (token.length === 0)
|
|
48
|
+
throw new Error("Radius authentication token must not be empty");
|
|
49
|
+
return token;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=radius-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radius-auth.js","sourceRoot":"","sources":["../../src/experimental/radius-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { DEFAULT_RADIUS_GATEWAY, normalizeRadiusGatewayUrl } from \"@earendil-works/pi-ai/providers/radius-config\";\nimport { getAuthCredential } from \"../cli/auth-command.ts\";\nimport type { AuthInput } from \"../cli/experimental/command-options.ts\";\nimport { ModelRuntime } from \"../core/model-runtime.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\n\nexport const ENV_RADIUS_GATEWAY = \"PI_RADIUS_GATEWAY\";\n\nexport interface RadiusRelayAuth {\n\treadonly gateway: string;\n\treadonly token: string;\n}\n\n/** Resolve explicit or stored Radius credentials anew for every relay connection attempt. */\nexport class RadiusRelayAuthResolver {\n\treadonly #input: AuthInput | undefined;\n\treadonly #gateway: string;\n\t#modelRuntime: Promise<ModelRuntime> | undefined;\n\n\tconstructor(input?: AuthInput, gateway = process.env[ENV_RADIUS_GATEWAY] ?? DEFAULT_RADIUS_GATEWAY) {\n\t\tthis.#input = input;\n\t\tthis.#gateway = normalizeRadiusGatewayUrl(gateway);\n\t}\n\n\tget gateway(): string {\n\t\treturn this.#gateway;\n\t}\n\n\tasync resolve(options: {\n\t\treadonly required: boolean;\n\t\treadonly signal?: AbortSignal;\n\t}): Promise<RadiusRelayAuth | undefined> {\n\t\toptions.signal?.throwIfAborted();\n\t\tif (process.env.PI_OFFLINE !== undefined) {\n\t\t\tif (options.required) throw new Error(\"Radius relay connections are unavailable in offline mode\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst explicit = await this.#explicitToken(options.signal);\n\t\tif (explicit !== undefined) return { gateway: this.#gateway, token: explicit };\n\n\t\tthis.#modelRuntime ??= ModelRuntime.create({ refreshOnCreate: false, allowModelNetwork: false });\n\t\tconst runtime = await this.#modelRuntime;\n\t\toptions.signal?.throwIfAborted();\n\t\tconst token = getAuthCredential(\n\t\t\tawait runtime.getAuth(\"radius\", { minOAuthValidityMs: 5 * 60_000, signal: options.signal }),\n\t\t);\n\t\tif (token !== undefined && token.length > 0) return { gateway: this.#gateway, token };\n\t\tif (options.required) {\n\t\t\tthrow new Error(\"Radius authentication is required; start Pi and run /login radius, then retry\");\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tasync #explicitToken(signal: AbortSignal | undefined): Promise<string | undefined> {\n\t\tif (this.#input === undefined) return undefined;\n\t\tconst value =\n\t\t\tthis.#input.type === \"token\"\n\t\t\t\t? this.#input.token\n\t\t\t\t: await readFile(resolvePath(this.#input.path), { encoding: \"utf8\", signal });\n\t\tconst token = value.trim();\n\t\tif (token.length === 0) throw new Error(\"Radius authentication token must not be empty\");\n\t\treturn token;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { ByteTransportFactory, Client } from "@earendil-works/pi-client";
|
|
2
|
+
import { type ServerId } from "@earendil-works/pi-protocol";
|
|
3
|
+
import type { Server } from "@earendil-works/pi-server";
|
|
4
|
+
import type { RadiusRelayAuthResolver } from "./radius-auth.ts";
|
|
5
|
+
export declare const RADIUS_RELAY_HOST_SUBPROTOCOL = "pi-session-relay.host.v1";
|
|
6
|
+
export declare const RADIUS_RELAY_CLIENT_SUBPROTOCOL = "pi-session-relay.client.v1";
|
|
7
|
+
interface RadiusRelayMessageEvent extends Event {
|
|
8
|
+
readonly data: unknown;
|
|
9
|
+
}
|
|
10
|
+
interface RadiusRelayCloseEvent extends Event {
|
|
11
|
+
readonly code: number;
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
}
|
|
14
|
+
interface RadiusRelayErrorEvent extends Event {
|
|
15
|
+
readonly error?: unknown;
|
|
16
|
+
readonly message?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RadiusRelayWebSocket {
|
|
19
|
+
binaryType: "arraybuffer" | "blob";
|
|
20
|
+
readonly bufferedAmount: number;
|
|
21
|
+
readonly protocol: string;
|
|
22
|
+
readonly readyState: number;
|
|
23
|
+
readonly OPEN: number;
|
|
24
|
+
send(data: string | ArrayBuffer): void;
|
|
25
|
+
close(code?: number, reason?: string): void;
|
|
26
|
+
addEventListener(type: "open", listener: (event: Event) => void, options?: {
|
|
27
|
+
once?: boolean;
|
|
28
|
+
}): void;
|
|
29
|
+
addEventListener(type: "message", listener: (event: RadiusRelayMessageEvent) => void, options?: {
|
|
30
|
+
once?: boolean;
|
|
31
|
+
}): void;
|
|
32
|
+
addEventListener(type: "close", listener: (event: RadiusRelayCloseEvent) => void, options?: {
|
|
33
|
+
once?: boolean;
|
|
34
|
+
}): void;
|
|
35
|
+
addEventListener(type: "error", listener: (event: RadiusRelayErrorEvent) => void, options?: {
|
|
36
|
+
once?: boolean;
|
|
37
|
+
}): void;
|
|
38
|
+
removeEventListener(type: "open", listener: (event: Event) => void): void;
|
|
39
|
+
removeEventListener(type: "message", listener: (event: RadiusRelayMessageEvent) => void): void;
|
|
40
|
+
removeEventListener(type: "close", listener: (event: RadiusRelayCloseEvent) => void): void;
|
|
41
|
+
removeEventListener(type: "error", listener: (event: RadiusRelayErrorEvent) => void): void;
|
|
42
|
+
}
|
|
43
|
+
export type RadiusRelayWebSocketFactory = (options: {
|
|
44
|
+
readonly url: string;
|
|
45
|
+
readonly protocol: string;
|
|
46
|
+
readonly authorization: string;
|
|
47
|
+
}) => RadiusRelayWebSocket;
|
|
48
|
+
export type RadiusRelayHostStatus = {
|
|
49
|
+
readonly status: "not_authenticated";
|
|
50
|
+
} | {
|
|
51
|
+
readonly status: "connecting";
|
|
52
|
+
} | {
|
|
53
|
+
readonly status: "connected";
|
|
54
|
+
} | {
|
|
55
|
+
readonly status: "retrying";
|
|
56
|
+
readonly error: string;
|
|
57
|
+
};
|
|
58
|
+
export interface RadiusRelayHostOptions {
|
|
59
|
+
readonly serverId: ServerId;
|
|
60
|
+
readonly server: Pick<Server, "accept">;
|
|
61
|
+
readonly auth: RadiusRelayAuthResolver;
|
|
62
|
+
readonly webSocketFactory?: RadiusRelayWebSocketFactory;
|
|
63
|
+
readonly onStatus?: (status: RadiusRelayHostStatus) => void;
|
|
64
|
+
}
|
|
65
|
+
/** Maintain the experimental server's multiplexed, authenticated Radius host connection. */
|
|
66
|
+
export declare class RadiusRelayHost {
|
|
67
|
+
#private;
|
|
68
|
+
constructor(options: RadiusRelayHostOptions);
|
|
69
|
+
start(): void;
|
|
70
|
+
close(): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
export declare function createRadiusClientTransportFactory(options: {
|
|
73
|
+
readonly serverId: ServerId;
|
|
74
|
+
readonly auth: RadiusRelayAuthResolver;
|
|
75
|
+
readonly webSocketFactory?: RadiusRelayWebSocketFactory;
|
|
76
|
+
}): ByteTransportFactory;
|
|
77
|
+
type RadiusReconnectClient = Pick<Client, "attachment" | "connected" | "connectionState" | "disconnect" | "onAttachmentChange" | "onConnectionStateChange" | "reconnect">;
|
|
78
|
+
/** Reconnect one established Radius client and restore its last selected Session. */
|
|
79
|
+
export declare class RadiusClientReconnect {
|
|
80
|
+
#private;
|
|
81
|
+
constructor(client: RadiusReconnectClient, reattach: (sessionId: string) => Promise<void>);
|
|
82
|
+
dispose(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export declare function encodeRelayDataFrame(connectionId: string, payload: Uint8Array): ArrayBuffer;
|
|
85
|
+
export declare function parseRelayDataFrame(frame: ArrayBuffer): {
|
|
86
|
+
readonly connectionId: string;
|
|
87
|
+
readonly payload: ArrayBuffer;
|
|
88
|
+
} | undefined;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=radius-relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radius-relay.d.ts","sourceRoot":"","sources":["../../src/experimental/radius-relay.ts"],"names":[],"mappings":"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"}
|