@ashx-j/lunr 0.2.26 → 0.2.28
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 +25 -1
- package/LICENSE +22 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +6 -10
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +94 -108
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -2
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
- package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +17 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +78 -42
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +134 -28
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +26 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
- package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +18 -9
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js +28 -17
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
- package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
- package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
- package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
- package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +48 -73
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/google-vertex.json +1 -1
- package/dist/catalog/providers/google.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/cli/install-cli.d.ts.map +1 -1
- package/dist/cli/install-cli.js +38 -30
- package/dist/cli/install-cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +13 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +75 -11
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +46 -21
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +344 -126
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/runtime.d.ts +2 -0
- package/dist/core/browser/runtime.d.ts.map +1 -1
- package/dist/core/browser/runtime.js +80 -45
- package/dist/core/browser/runtime.js.map +1 -1
- package/dist/core/browser/setup.d.ts.map +1 -1
- package/dist/core/browser/setup.js +12 -1
- package/dist/core/browser/setup.js.map +1 -1
- package/dist/core/cache-stats.d.ts +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -11
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +38 -92
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts.map +1 -1
- package/dist/core/computer-use/adapter.js +7 -2
- package/dist/core/computer-use/adapter.js.map +1 -1
- package/dist/core/computer-use/image.d.ts.map +1 -1
- package/dist/core/computer-use/image.js +17 -5
- package/dist/core/computer-use/image.js.map +1 -1
- package/dist/core/computer-use/schemas.d.ts.map +1 -1
- package/dist/core/computer-use/schemas.js +23 -6
- package/dist/core/computer-use/schemas.js.map +1 -1
- package/dist/core/computer-use/workflow.d.ts.map +1 -1
- package/dist/core/computer-use/workflow.js +459 -119
- package/dist/core/computer-use/workflow.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +2 -2
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +22 -20
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/cron/jobs.d.ts +26 -8
- package/dist/core/cron/jobs.d.ts.map +1 -1
- package/dist/core/cron/jobs.js +357 -232
- package/dist/core/cron/jobs.js.map +1 -1
- package/dist/core/cron/origin-context.d.ts +1 -0
- package/dist/core/cron/origin-context.d.ts.map +1 -1
- package/dist/core/cron/origin-context.js.map +1 -1
- package/dist/core/cron/scheduler.d.ts +22 -17
- package/dist/core/cron/scheduler.d.ts.map +1 -1
- package/dist/core/cron/scheduler.js +153 -73
- package/dist/core/cron/scheduler.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/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +11 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +4 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +22 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/large-subagent-launch.d.ts +1 -1
- package/dist/core/large-subagent-launch.d.ts.map +1 -1
- package/dist/core/large-subagent-launch.js +7 -7
- package/dist/core/large-subagent-launch.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +4 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +40 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +3 -3
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +11 -35
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts +5 -13
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +126 -116
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-resource-bridge.d.ts +12 -0
- package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
- package/dist/core/prompt-resource-bridge.js +9 -0
- package/dist/core/prompt-resource-bridge.js.map +1 -0
- package/dist/core/protected-targets.d.ts +6 -0
- package/dist/core/protected-targets.d.ts.map +1 -0
- package/dist/core/protected-targets.js +45 -0
- package/dist/core/protected-targets.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rollback.d.ts +19 -3
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +172 -56
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +3 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +14 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +11 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +111 -33
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-ownership.d.ts.map +1 -1
- package/dist/core/session-ownership.js +8 -3
- package/dist/core/session-ownership.js.map +1 -1
- package/dist/core/session-retention.d.ts.map +1 -1
- package/dist/core/session-retention.js +18 -7
- package/dist/core/session-retention.js.map +1 -1
- package/dist/core/session-startup-settings.d.ts +10 -0
- package/dist/core/session-startup-settings.d.ts.map +1 -0
- package/dist/core/session-startup-settings.js +70 -0
- package/dist/core/session-startup-settings.js.map +1 -0
- package/dist/core/subscriptions.d.ts +16 -7
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js +96 -55
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/trust-manager.d.ts +2 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +6 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/update-check.d.ts.map +1 -1
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/usage-accounting.d.ts +47 -0
- package/dist/core/usage-accounting.d.ts.map +1 -0
- package/dist/core/usage-accounting.js +205 -0
- package/dist/core/usage-accounting.js.map +1 -0
- package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
- package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.js +2 -2
- package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +3 -3
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts +2 -2
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +3 -3
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-adapters/zai.d.ts +2 -2
- package/dist/core/usage-adapters/zai.d.ts.map +1 -1
- package/dist/core/usage-adapters/zai.js +2 -2
- package/dist/core/usage-adapters/zai.js.map +1 -1
- package/dist/core/usage-history.d.ts +1 -18
- package/dist/core/usage-history.d.ts.map +1 -1
- package/dist/core/usage-history.js +46 -114
- package/dist/core/usage-history.js.map +1 -1
- package/dist/core/usage-service.d.ts +9 -2
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +95 -50
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +9 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +91 -37
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/buttons.d.ts +8 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +76 -18
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/commands.d.ts +1 -0
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +10 -4
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts +12 -11
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +65 -56
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +2 -1
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts +1 -0
- package/dist/gateway/mobile-commands.d.ts.map +1 -1
- package/dist/gateway/mobile-commands.js +69 -15
- package/dist/gateway/mobile-commands.js.map +1 -1
- package/dist/gateway/presenter.d.ts +12 -2
- package/dist/gateway/presenter.d.ts.map +1 -1
- package/dist/gateway/presenter.js +73 -38
- package/dist/gateway/presenter.js.map +1 -1
- package/dist/gateway/router.d.ts +2 -2
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +17 -2
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts +2 -0
- package/dist/gateway/service.d.ts.map +1 -1
- package/dist/gateway/service.js +153 -0
- package/dist/gateway/service.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +86 -33
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/context-view.js +2 -2
- package/dist/modes/interactive/components/context-view.js.map +1 -1
- package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
- package/dist/modes/interactive/components/copyable-text.js +3 -2
- package/dist/modes/interactive/components/copyable-text.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -12
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +5 -0
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +21 -6
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -7
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +151 -131
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
- package/dist/modes/interactive/smooth-streaming.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
- package/dist/node-runtime/agent-session-services-RTUGP3XR.js +54 -0
- package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
- package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.js} +8 -7
- package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
- package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
- package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
- package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
- package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
- package/dist/node-runtime/chunk-4QRUZ64T.js +1203 -0
- package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
- package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
- package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
- package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
- package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
- package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
- package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
- package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
- package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
- package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
- package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
- package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
- package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
- package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
- package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
- package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
- package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
- package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
- package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
- package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
- package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
- package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
- package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
- package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
- package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
- package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
- package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
- package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
- package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
- package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
- package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
- package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
- package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
- package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
- package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
- package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
- package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
- package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
- package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
- package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
- package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
- package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
- package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
- package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
- package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
- package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
- package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
- package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
- package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
- package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
- package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
- package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
- package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
- package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
- package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
- package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
- package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
- package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
- package/dist/node-runtime/cli-runtime.js +4 -4
- package/dist/node-runtime/{command-FSBU2EVZ.js → command-YRT7I2BW.js} +5 -5
- package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
- package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
- package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
- package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
- package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
- package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
- package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-DBQRRMAY.js} +4 -4
- package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
- package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
- package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
- package/dist/node-runtime/{gateway-DQM333YV.js → gateway-V6K2CDWN.js} +51 -42
- package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
- package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
- package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
- package/dist/node-runtime/{goal-NJEE5CTU.js → goal-J7TYMOBK.js} +14 -8
- package/dist/node-runtime/index.js +51 -48
- package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
- package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
- package/dist/node-runtime/interactive-mode-ASZ7APYP.js +75 -0
- package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
- package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
- package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
- package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
- package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-WD3YH4CR.js} +93 -80
- package/dist/node-runtime/main.js +43 -41
- package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.js} +12 -12
- package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
- package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
- package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
- package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
- package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
- package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
- package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
- package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
- package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
- package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-QPU3OXE4.js} +114 -167
- package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
- package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
- package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
- package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
- package/dist/node-runtime/rpc-entry.js +43 -41
- package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
- package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
- package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
- package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
- package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
- package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LYH53ESV.js} +4 -4
- package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.js} +3 -3
- package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
- package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
- package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
- package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
- package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
- package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-UI6SHG3X.js} +412 -288
- package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
- package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
- package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
- package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
- package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
- package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
- package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
- package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +25 -10
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +2 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +33 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/sanitize-terminal-text.d.ts +7 -0
- package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
- package/dist/utils/sanitize-terminal-text.js +67 -0
- package/dist/utils/sanitize-terminal-text.js.map +1 -0
- package/docs/browser.md +1 -1
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +8 -4
- package/docs/features.md +25 -7
- package/docs/keybindings.md +1 -1
- package/docs/models.md +5 -5
- package/docs/packages.md +1 -1
- package/docs/providers.md +2 -2
- package/docs/rpc.md +7 -7
- package/docs/security.md +10 -5
- package/docs/sessions.md +2 -2
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +7 -7
- package/docs/themes.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +1 -1
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
- 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/index.ts +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +2 -2
- package/examples/extensions/gondolin/index.ts +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +2 -2
- package/examples/extensions/input-transform-streaming.ts +2 -2
- package/examples/extensions/input-transform.ts +2 -2
- package/examples/extensions/interactive-shell.ts +1 -1
- package/examples/extensions/kimi-deferred-tools.ts +1 -1
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +1 -1
- package/examples/extensions/overlay-test.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/preset.ts +3 -3
- package/examples/extensions/project-trust.ts +4 -4
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +7 -7
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/subagent/README.md +3 -3
- package/examples/extensions/subagent/index.ts +2 -2
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +1 -1
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/install-lock/package-lock.json +24 -24
- package/install-lock/package.json +2 -2
- package/npm-shrinkwrap.json +60 -24
- package/package.json +9 -9
- package/dist/modes/interactive/components/exit-card.d.ts +0 -22
- package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
- package/dist/modes/interactive/components/exit-card.js +0 -69
- package/dist/modes/interactive/components/exit-card.js.map +0 -1
- package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
- package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
- package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
- package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
- package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
- package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
- package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
- package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
- package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
- package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
|
@@ -0,0 +1,1203 @@
|
|
|
1
|
+
import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
createPairingStore
|
|
4
|
+
} from "./chunk-NNNR3QIY.js";
|
|
5
|
+
import {
|
|
6
|
+
atomicJson
|
|
7
|
+
} from "./chunk-WXYNALHD.js";
|
|
8
|
+
import {
|
|
9
|
+
noOpUIContext
|
|
10
|
+
} from "./chunk-BYC6RKCN.js";
|
|
11
|
+
import {
|
|
12
|
+
getSubagentCancellation
|
|
13
|
+
} from "./chunk-BBUVIEZB.js";
|
|
14
|
+
import {
|
|
15
|
+
NO_HANDLER_REASON,
|
|
16
|
+
PERMISSION_MODES,
|
|
17
|
+
getPermissionMode,
|
|
18
|
+
registerApprovalHandler,
|
|
19
|
+
setPermissionMode
|
|
20
|
+
} from "./chunk-APVM5NEU.js";
|
|
21
|
+
import {
|
|
22
|
+
SessionManager
|
|
23
|
+
} from "./chunk-PWHTSQC4.js";
|
|
24
|
+
import {
|
|
25
|
+
gatewayConfigPath,
|
|
26
|
+
loadGatewayConfig,
|
|
27
|
+
platformConfigFor,
|
|
28
|
+
saveGatewayConfig
|
|
29
|
+
} from "./chunk-RHCGYWO7.js";
|
|
30
|
+
import {
|
|
31
|
+
getAgentDir
|
|
32
|
+
} from "./chunk-64XTQNLA.js";
|
|
33
|
+
|
|
34
|
+
// packages/coding-agent/dist/gateway/mobile-commands.js
|
|
35
|
+
import { mkdirSync as mkdirSync2, readdirSync, realpathSync, statSync } from "node:fs";
|
|
36
|
+
import { basename, dirname as dirname2, isAbsolute, join as join4, relative, resolve } from "node:path";
|
|
37
|
+
|
|
38
|
+
// packages/coding-agent/dist/gateway/authz.js
|
|
39
|
+
function envFlagEnabled(name) {
|
|
40
|
+
let raw = process.env[name];
|
|
41
|
+
return raw === void 0 ? !1 : ["1", "true", "yes", "on"].includes(raw.toLowerCase());
|
|
42
|
+
}
|
|
43
|
+
function globalAllowedUsers() {
|
|
44
|
+
let raw = process.env.LUNR_GATEWAY_ALLOWED_USERS;
|
|
45
|
+
return raw ? raw.split(",").map((u) => u.trim()).filter((u) => u.length > 0) : [];
|
|
46
|
+
}
|
|
47
|
+
function requireAuthorized(source, cfg = loadGatewayConfig()) {
|
|
48
|
+
if (!isAuthorized(source, cfg))
|
|
49
|
+
throw new Error("Gateway access is not approved for this user or chat.");
|
|
50
|
+
}
|
|
51
|
+
function isAuthorized(source, cfg, pairing = createPairingStore()) {
|
|
52
|
+
if ((source.platform === "telegram" || source.platform === "discord") && cfg.owners?.[source.platform].includes(source.userId) || envFlagEnabled("LUNR_GATEWAY_ALLOW_ALL_USERS"))
|
|
53
|
+
return !0;
|
|
54
|
+
let platformCfg = platformConfigFor(cfg, source.platform);
|
|
55
|
+
return !!(platformCfg?.allowedChats.includes(source.chatId) || source.roleAuthorized === !0 || source.userId && pairing.isPaired(source.platform, source.userId) || source.userId && (platformCfg?.allowedUsers.includes(source.userId) || globalAllowedUsers().includes(source.userId)));
|
|
56
|
+
}
|
|
57
|
+
function addAllowedUser(platform, userId) {
|
|
58
|
+
let cfg = loadGatewayConfig(), platformCfg = platformConfigFor(cfg, platform);
|
|
59
|
+
if (!platformCfg)
|
|
60
|
+
throw new Error(`Unknown platform "${platform}"`);
|
|
61
|
+
platformCfg.allowedUsers.includes(userId) || (platformCfg.allowedUsers.push(userId), saveGatewayConfig(cfg));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// packages/coding-agent/dist/gateway/buttons.js
|
|
65
|
+
import { randomBytes } from "node:crypto";
|
|
66
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
67
|
+
|
|
68
|
+
// packages/coding-agent/dist/gateway/conversations.js
|
|
69
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
70
|
+
import { join } from "node:path";
|
|
71
|
+
var path = () => join(getAgentDir(), "gateway-conversations.json");
|
|
72
|
+
function conversationBindings() {
|
|
73
|
+
if (!existsSync(path()))
|
|
74
|
+
return {};
|
|
75
|
+
let raw = JSON.parse(readFileSync(path(), "utf8"));
|
|
76
|
+
if (!raw || typeof raw != "object" || Array.isArray(raw))
|
|
77
|
+
throw new Error("Invalid gateway conversation store. Restore it before continuing.");
|
|
78
|
+
return raw;
|
|
79
|
+
}
|
|
80
|
+
function conversationBinding(key) {
|
|
81
|
+
return conversationBindings()[key];
|
|
82
|
+
}
|
|
83
|
+
function bindConversation(key, source, options = {}) {
|
|
84
|
+
let all = conversationBindings(), old = all[key];
|
|
85
|
+
all[key] = {
|
|
86
|
+
...old,
|
|
87
|
+
...options,
|
|
88
|
+
source,
|
|
89
|
+
recentProjects: options.cwd ? [.../* @__PURE__ */ new Set([options.cwd, ...old?.recentProjects ?? []])].slice(0, 12) : old?.recentProjects ?? []
|
|
90
|
+
}, atomicJson(path(), all);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// packages/coding-agent/dist/gateway/buttons.js
|
|
94
|
+
var PICKER_TTL_MS = 900 * 1e3, SWEEP_INTERVAL_MS = 60 * 1e3, DEFAULT_PER_PAGE = 8, BUTTONS_PER_ROW = 2, CODE_ALPHABET = "ABCDEFGHJKMNPQRSTUVWXYZ23456789", CODE_LENGTH = 8, CALLBACK_PREFIX = "cp:", GatewayPickerCancelled = class extends Error {
|
|
95
|
+
}, registry = /* @__PURE__ */ new Map(), generations = /* @__PURE__ */ new Map();
|
|
96
|
+
function gatewayPickerGeneration(key) {
|
|
97
|
+
return generations.get(key) ?? 0;
|
|
98
|
+
}
|
|
99
|
+
function invalidateGatewayPickers(key) {
|
|
100
|
+
generations.set(key, gatewayPickerGeneration(key) + 1);
|
|
101
|
+
for (let [id, picker] of registry)
|
|
102
|
+
picker.sessionKey !== key || picker.completed !== void 0 || (registry.delete(id), picker.onCancel?.());
|
|
103
|
+
}
|
|
104
|
+
function pickerRequesterValid(picker) {
|
|
105
|
+
let binding = conversationBinding(picker.sessionKey);
|
|
106
|
+
return !binding || (!binding.owner || binding.owner === picker.invokerId) && binding.source.platform === picker.source.platform && binding.source.chatId === picker.source.chatId && binding.source.userId === picker.invokerId && binding.source.threadId === picker.source.threadId;
|
|
107
|
+
}
|
|
108
|
+
function pickerValid(picker) {
|
|
109
|
+
return picker.generation === gatewayPickerGeneration(picker.sessionKey) && pickerRequesterValid(picker) && (!picker.validate || picker.validate());
|
|
110
|
+
}
|
|
111
|
+
var sweeper;
|
|
112
|
+
function generatePickerId() {
|
|
113
|
+
let id = "", bytes = randomBytes(CODE_LENGTH);
|
|
114
|
+
for (let i = 0; i < CODE_LENGTH; i++)
|
|
115
|
+
id += CODE_ALPHABET[bytes[i] % CODE_ALPHABET.length];
|
|
116
|
+
return id;
|
|
117
|
+
}
|
|
118
|
+
function makeCallbackData(id, action, payload) {
|
|
119
|
+
return action === "noop" ? `${CALLBACK_PREFIX}${id}:` : action === "cancel" ? `${CALLBACK_PREFIX}${id}:x` : action === "page" ? `${CALLBACK_PREFIX}${id}:p${payload ?? "0"}` : `${CALLBACK_PREFIX}${id}:${payload ?? ""}`;
|
|
120
|
+
}
|
|
121
|
+
function parseCallbackData(data) {
|
|
122
|
+
if (!data.startsWith(CALLBACK_PREFIX))
|
|
123
|
+
return null;
|
|
124
|
+
let rest = data.slice(CALLBACK_PREFIX.length), colon = rest.indexOf(":");
|
|
125
|
+
if (colon === -1)
|
|
126
|
+
return null;
|
|
127
|
+
let id = rest.slice(0, colon), tail = rest.slice(colon + 1);
|
|
128
|
+
return tail === "" ? { id, action: "noop" } : tail === "x" ? { id, action: "cancel" } : tail.startsWith("p") ? { id, action: "page", payload: tail.slice(1) } : { id, action: "select", payload: tail };
|
|
129
|
+
}
|
|
130
|
+
function isSameChat(a, b) {
|
|
131
|
+
return a.platform === b.platform && a.chatId === b.chatId && a.threadId === b.threadId;
|
|
132
|
+
}
|
|
133
|
+
function sourceForAuth(picker, cb) {
|
|
134
|
+
return {
|
|
135
|
+
platform: picker.source.platform,
|
|
136
|
+
chatId: cb.chatId,
|
|
137
|
+
chatType: picker.source.chatType,
|
|
138
|
+
userId: cb.userId,
|
|
139
|
+
userName: cb.userName,
|
|
140
|
+
threadId: cb.threadId,
|
|
141
|
+
// Do NOT inherit the original invoker's role authorization.
|
|
142
|
+
roleAuthorized: void 0
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function renderPage(picker) {
|
|
146
|
+
let { id, title, breadcrumbs, items, page, perPage } = picker, totalPages = Math.max(1, Math.ceil(items.length / perPage)), clampedPage = Math.max(0, Math.min(page, totalPages - 1)), start = clampedPage * perPage, pageItems = items.slice(start, start + perPage), rows = [];
|
|
147
|
+
for (let i = 0; i < pageItems.length; i += BUTTONS_PER_ROW) {
|
|
148
|
+
let row = [];
|
|
149
|
+
for (let j = 0; j < BUTTONS_PER_ROW && i + j < pageItems.length; j++) {
|
|
150
|
+
let index = start + i + j;
|
|
151
|
+
row.push({ label: pageItems[i + j].label, data: makeCallbackData(id, "select", String(index)) });
|
|
152
|
+
}
|
|
153
|
+
rows.push(row);
|
|
154
|
+
}
|
|
155
|
+
if (totalPages > 1) {
|
|
156
|
+
let nav = [];
|
|
157
|
+
clampedPage > 0 && nav.push({ label: "\u25C0 Prev", data: makeCallbackData(id, "page", String(clampedPage - 1)) }), nav.push({ label: `${clampedPage + 1}/${totalPages}`, data: makeCallbackData(id, "noop") }), clampedPage < totalPages - 1 && nav.push({ label: "Next \u25B6", data: makeCallbackData(id, "page", String(clampedPage + 1)) }), rows.push(nav);
|
|
158
|
+
}
|
|
159
|
+
rows.push([{ label: "\u2717 Cancel", data: makeCallbackData(id, "cancel") }]);
|
|
160
|
+
let header = breadcrumbs ? `${title} \xB7 ${breadcrumbs}` : title;
|
|
161
|
+
return { text: items.length === 0 ? `${header}
|
|
162
|
+
|
|
163
|
+
No options available.` : `${header} (${clampedPage + 1}/${totalPages}):`, buttons: rows };
|
|
164
|
+
}
|
|
165
|
+
async function createPicker(adapter, source, spec, opts) {
|
|
166
|
+
let id = generatePickerId(), pending2 = {
|
|
167
|
+
...spec,
|
|
168
|
+
generation: spec.generation ?? gatewayPickerGeneration(spec.sessionKey),
|
|
169
|
+
id,
|
|
170
|
+
chatId: source.chatId,
|
|
171
|
+
source,
|
|
172
|
+
adapter,
|
|
173
|
+
messageId: "",
|
|
174
|
+
page: 0,
|
|
175
|
+
perPage: spec.perPage ?? DEFAULT_PER_PAGE,
|
|
176
|
+
createdAt: Date.now()
|
|
177
|
+
};
|
|
178
|
+
if (!pickerValid(pending2))
|
|
179
|
+
return { success: !1, error: "Picker expired." };
|
|
180
|
+
if (source.userId !== spec.invokerId || existsSync2(gatewayConfigPath()) && !isAuthorized(source, loadGatewayConfig()))
|
|
181
|
+
return { success: !1, error: "Gateway access is no longer approved." };
|
|
182
|
+
let { text, buttons } = renderPage(pending2), result = await adapter.sendButtons(source.chatId, text, buttons, opts);
|
|
183
|
+
return result.success ? pickerValid(pending2) ? (result.messageId && (pending2.messageId = result.messageId, registry.set(id, pending2)), result) : (pending2.onCancel?.(), result) : result;
|
|
184
|
+
}
|
|
185
|
+
async function answerExpired(adapter, cb) {
|
|
186
|
+
await adapter.answerCallback(cb.id, "Picker expired \u2014 run the command again.").catch(() => {
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async function answerUnauthorized(adapter, cb) {
|
|
190
|
+
await adapter.answerCallback(cb.id, "\u26D4 Not authorized.").catch(() => {
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async function answerNotYourPicker(adapter, cb) {
|
|
194
|
+
await adapter.answerCallback(cb.id, "\u26D4 Not your picker.").catch(() => {
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async function handleCallback(cb, deps) {
|
|
198
|
+
let { adapter, pairing } = deps, freshConfig = () => existsSync2(gatewayConfigPath()) ? loadGatewayConfig() : deps.cfg, parsed = parseCallbackData(cb.data);
|
|
199
|
+
if (!parsed)
|
|
200
|
+
return;
|
|
201
|
+
let picker = registry.get(parsed.id);
|
|
202
|
+
if (!picker) {
|
|
203
|
+
await answerExpired(adapter, cb);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (picker.completed === void 0 && !pickerValid(picker)) {
|
|
207
|
+
registry.delete(parsed.id), picker.onCancel?.(), await answerExpired(adapter, cb);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (adapter.platform !== picker.source.platform || !isSameChat(picker.source, sourceForAuth(picker, cb))) {
|
|
211
|
+
await answerExpired(adapter, cb);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (cb.userId !== picker.invokerId) {
|
|
215
|
+
await answerNotYourPicker(adapter, cb);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (!isAuthorized(sourceForAuth(picker, cb), freshConfig(), pairing)) {
|
|
219
|
+
await answerUnauthorized(adapter, cb);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
let authorized = () => pickerRequesterValid(picker) && isAuthorized(sourceForAuth(picker, cb), freshConfig(), pairing);
|
|
223
|
+
if (Date.now() > picker.createdAt + PICKER_TTL_MS) {
|
|
224
|
+
picker.completed || picker.onCancel?.(), registry.delete(parsed.id);
|
|
225
|
+
try {
|
|
226
|
+
await picker.adapter.editMessage(picker.chatId, picker.messageId, "\u23F1 Expired \u2014 run the command again.", []);
|
|
227
|
+
} catch {
|
|
228
|
+
}
|
|
229
|
+
await answerExpired(adapter, cb);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (picker.completed !== void 0) {
|
|
233
|
+
await adapter.answerCallback(cb.id, "Already completed.").catch(() => {
|
|
234
|
+
});
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (parsed.action === "cancel") {
|
|
238
|
+
registry.delete(parsed.id), picker.onCancel?.();
|
|
239
|
+
try {
|
|
240
|
+
await picker.adapter.editMessage(picker.chatId, picker.messageId, "Cancelled.", []);
|
|
241
|
+
} catch {
|
|
242
|
+
}
|
|
243
|
+
await adapter.answerCallback(cb.id).catch(() => {
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (parsed.action === "noop") {
|
|
248
|
+
await adapter.answerCallback(cb.id).catch(() => {
|
|
249
|
+
});
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (parsed.action === "page") {
|
|
253
|
+
let page = Number.parseInt(parsed.payload ?? "0", 10), totalPages = Math.max(1, Math.ceil(picker.items.length / picker.perPage));
|
|
254
|
+
picker.page = Math.max(0, Math.min(page, totalPages - 1));
|
|
255
|
+
let { text, buttons } = renderPage(picker);
|
|
256
|
+
try {
|
|
257
|
+
await picker.adapter.editMessage(picker.chatId, picker.messageId, text, buttons);
|
|
258
|
+
} catch {
|
|
259
|
+
}
|
|
260
|
+
await adapter.answerCallback(cb.id).catch(() => {
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
let index = Number.parseInt(parsed.payload ?? "", 10), item = picker.items[index];
|
|
265
|
+
if (!item) {
|
|
266
|
+
await adapter.answerCallback(cb.id, "Invalid selection.").catch(() => {
|
|
267
|
+
});
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (picker.resolving) {
|
|
271
|
+
await adapter.answerCallback(cb.id, "Selection is still running.").catch(() => {
|
|
272
|
+
});
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
picker.resolving = !0, await adapter.answerCallback(cb.id).catch(() => {
|
|
276
|
+
});
|
|
277
|
+
try {
|
|
278
|
+
if (!pickerValid(picker) || !authorized())
|
|
279
|
+
return;
|
|
280
|
+
let result = await picker.resolve(item);
|
|
281
|
+
if (!result.done) {
|
|
282
|
+
if (!pickerValid(picker) || !authorized())
|
|
283
|
+
return;
|
|
284
|
+
picker.items = result.items, picker.title = result.title, picker.breadcrumbs = result.breadcrumbs, picker.page = 0;
|
|
285
|
+
let { text, buttons } = renderPage(picker);
|
|
286
|
+
try {
|
|
287
|
+
await picker.adapter.editMessage(picker.chatId, picker.messageId, text, buttons);
|
|
288
|
+
} catch {
|
|
289
|
+
}
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
picker.completed = result.text, await confirmPicker(picker, result.text, authorized);
|
|
293
|
+
} catch (err) {
|
|
294
|
+
if (err instanceof GatewayPickerCancelled)
|
|
295
|
+
return;
|
|
296
|
+
let message = err instanceof Error ? err.message : String(err);
|
|
297
|
+
picker.completed = `\u26A0 ${message}`, await confirmPicker(picker, picker.completed, authorized);
|
|
298
|
+
} finally {
|
|
299
|
+
picker.resolving = !1;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
async function confirmPicker(picker, text, authorized) {
|
|
303
|
+
if (!authorized() || (await picker.adapter.editMessage(picker.chatId, picker.messageId, text, []).catch(() => ({ success: !1 }))).success || !authorized())
|
|
304
|
+
return;
|
|
305
|
+
(await picker.adapter.send(picker.chatId, text, { threadId: picker.source.threadId }).catch(() => ({ success: !1 }))).success || console.error(`[gateway] picker confirmation failed on ${picker.adapter.platform}`);
|
|
306
|
+
}
|
|
307
|
+
function startButtonSweeper() {
|
|
308
|
+
sweeper || (sweeper = setInterval(() => {
|
|
309
|
+
let cutoff = Date.now() - PICKER_TTL_MS;
|
|
310
|
+
for (let [id, entry] of registry)
|
|
311
|
+
entry.createdAt > cutoff || (registry.delete(id), !entry.completed && (entry.onCancel?.(), !(!pickerRequesterValid(entry) || !isAuthorized({ ...entry.source, roleAuthorized: void 0 }, loadGatewayConfig())) && entry.adapter.editMessage(entry.chatId, entry.messageId, "\u23F1 Expired \u2014 run the command again.", []).catch(() => {
|
|
312
|
+
})));
|
|
313
|
+
}, SWEEP_INTERVAL_MS), sweeper.unref?.());
|
|
314
|
+
}
|
|
315
|
+
function stopButtonSweeper() {
|
|
316
|
+
sweeper && (clearInterval(sweeper), sweeper = void 0);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// packages/coding-agent/dist/gateway/presenter.js
|
|
320
|
+
import { randomUUID } from "node:crypto";
|
|
321
|
+
import { existsSync as existsSync4, readFileSync as readFileSync3 } from "node:fs";
|
|
322
|
+
import { join as join3 } from "node:path";
|
|
323
|
+
|
|
324
|
+
// packages/coding-agent/dist/gateway/approval.js
|
|
325
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
326
|
+
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
327
|
+
|
|
328
|
+
// packages/coding-agent/dist/gateway/store.js
|
|
329
|
+
import { existsSync as existsSync3, mkdirSync, readFileSync as readFileSync2, renameSync, writeFileSync } from "node:fs";
|
|
330
|
+
import { dirname, join as join2 } from "node:path";
|
|
331
|
+
var storePathOverride;
|
|
332
|
+
function storePath() {
|
|
333
|
+
return storePathOverride ?? join2(getAgentDir(), "gateway-sessions.json");
|
|
334
|
+
}
|
|
335
|
+
function readStore() {
|
|
336
|
+
let path3 = storePath();
|
|
337
|
+
if (!existsSync3(path3))
|
|
338
|
+
return {};
|
|
339
|
+
try {
|
|
340
|
+
let parsed = JSON.parse(readFileSync2(path3, "utf-8"));
|
|
341
|
+
if (parsed == null || typeof parsed != "object" || Array.isArray(parsed))
|
|
342
|
+
return {};
|
|
343
|
+
let out = {};
|
|
344
|
+
for (let [key, value] of Object.entries(parsed)) {
|
|
345
|
+
if (value == null || typeof value != "object")
|
|
346
|
+
continue;
|
|
347
|
+
let v = value;
|
|
348
|
+
typeof v.sessionId != "string" || typeof v.sessionFile != "string" || (out[key] = {
|
|
349
|
+
sessionId: v.sessionId,
|
|
350
|
+
sessionFile: v.sessionFile,
|
|
351
|
+
createdAt: typeof v.createdAt == "string" ? v.createdAt : (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
352
|
+
lastActiveAt: typeof v.lastActiveAt == "string" ? v.lastActiveAt : (/* @__PURE__ */ new Date(0)).toISOString()
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return out;
|
|
356
|
+
} catch {
|
|
357
|
+
return {};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function writeStore(data) {
|
|
361
|
+
let path3 = storePath(), dir = dirname(path3);
|
|
362
|
+
existsSync3(dir) || mkdirSync(dir, { recursive: !0 });
|
|
363
|
+
let tmp = `${path3}.tmp-${process.pid}`;
|
|
364
|
+
writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
|
|
365
|
+
`, "utf-8"), renameSync(tmp, path3);
|
|
366
|
+
}
|
|
367
|
+
function getSession(key) {
|
|
368
|
+
return readStore()[key];
|
|
369
|
+
}
|
|
370
|
+
function putSession(key, entry) {
|
|
371
|
+
let data = readStore(), existing = data[key], stored = {
|
|
372
|
+
sessionId: entry.sessionId,
|
|
373
|
+
sessionFile: entry.sessionFile,
|
|
374
|
+
createdAt: existing?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
375
|
+
lastActiveAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
376
|
+
};
|
|
377
|
+
return data[key] = stored, writeStore(data), stored;
|
|
378
|
+
}
|
|
379
|
+
function touchSession(key) {
|
|
380
|
+
let data = readStore(), existing = data[key];
|
|
381
|
+
existing && (existing.lastActiveAt = (/* @__PURE__ */ new Date()).toISOString(), writeStore(data));
|
|
382
|
+
}
|
|
383
|
+
function removeSession(key) {
|
|
384
|
+
let data = readStore();
|
|
385
|
+
return key in data ? (delete data[key], writeStore(data), !0) : !1;
|
|
386
|
+
}
|
|
387
|
+
function listSessions() {
|
|
388
|
+
return readStore();
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// packages/coding-agent/dist/gateway/approval.js
|
|
392
|
+
var CALLBACK_PREFIX2 = "ap:", ID_LENGTH = 8, CODE_ALPHABET2 = "ABCDEFGHJKMNPQRSTUVWXYZ23456789", DEFAULT_TIMEOUT_MS = 300 * 1e3, approvalContext = new AsyncLocalStorage(), pending = /* @__PURE__ */ new Map();
|
|
393
|
+
function generateId() {
|
|
394
|
+
let id = "", bytes = randomBytes2(ID_LENGTH);
|
|
395
|
+
for (let i = 0; i < ID_LENGTH; i++)
|
|
396
|
+
id += CODE_ALPHABET2[bytes[i] % CODE_ALPHABET2.length];
|
|
397
|
+
return id;
|
|
398
|
+
}
|
|
399
|
+
function makeCallbackData2(id, action) {
|
|
400
|
+
return `${CALLBACK_PREFIX2}${id}:${action}`;
|
|
401
|
+
}
|
|
402
|
+
function parseCallbackData2(data) {
|
|
403
|
+
if (!data.startsWith(CALLBACK_PREFIX2))
|
|
404
|
+
return null;
|
|
405
|
+
let rest = data.slice(CALLBACK_PREFIX2.length), colon = rest.indexOf(":");
|
|
406
|
+
if (colon === -1)
|
|
407
|
+
return null;
|
|
408
|
+
let id = rest.slice(0, colon), action = rest.slice(colon + 1);
|
|
409
|
+
return action === "once" || action === "session" || action === "reject" || action === "cancel" ? { id, action } : null;
|
|
410
|
+
}
|
|
411
|
+
function runWithApprovalContext(ctx, fn) {
|
|
412
|
+
return approvalContext.run(ctx, fn);
|
|
413
|
+
}
|
|
414
|
+
async function createApprovalPrompt(adapter, source, req, timeoutMs = DEFAULT_TIMEOUT_MS, key) {
|
|
415
|
+
let id = generateId(), title = req.kind === "large-subagent-launch" ? `Approve large subagent launch?
|
|
416
|
+
${req.detail}` : `Approve ${req.toolName}?
|
|
417
|
+
${req.detail}`, rows = [
|
|
418
|
+
[
|
|
419
|
+
{ label: "\u2713 Approve once", data: makeCallbackData2(id, "once") },
|
|
420
|
+
{ label: "\u2713 Approve session", data: makeCallbackData2(id, "session") }
|
|
421
|
+
],
|
|
422
|
+
[{ label: "\u2717 Reject", data: makeCallbackData2(id, "reject") }]
|
|
423
|
+
];
|
|
424
|
+
return new Promise((resolve2, reject) => {
|
|
425
|
+
let messageId, timeout = setTimeout(() => {
|
|
426
|
+
pending.delete(id), reject(new Error("Approval request timed out")), messageId && adapter.editMessage(source.chatId, messageId, "\u23F1 Approval expired.", []).catch(() => {
|
|
427
|
+
});
|
|
428
|
+
}, timeoutMs), entry = {
|
|
429
|
+
key,
|
|
430
|
+
source,
|
|
431
|
+
plan: req.kind === "plan",
|
|
432
|
+
resolve: resolve2,
|
|
433
|
+
reject,
|
|
434
|
+
timeout,
|
|
435
|
+
adapter,
|
|
436
|
+
chatId: source.chatId,
|
|
437
|
+
threadId: source.threadId,
|
|
438
|
+
userId: source.userId
|
|
439
|
+
};
|
|
440
|
+
pending.set(id, entry), (async () => {
|
|
441
|
+
try {
|
|
442
|
+
let result = await adapter.sendButtons(source.chatId, title, rows, { threadId: source.threadId });
|
|
443
|
+
if (!result.success || !result.messageId)
|
|
444
|
+
throw new Error(result.error ?? "Failed to send approval prompt");
|
|
445
|
+
if (messageId = result.messageId, pending.get(id) !== entry) {
|
|
446
|
+
await adapter.editMessage(source.chatId, messageId, "Approval cancelled or expired.", []).catch(() => {
|
|
447
|
+
});
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
entry.messageId = messageId;
|
|
451
|
+
} catch (err) {
|
|
452
|
+
clearTimeout(timeout), pending.delete(id), reject(err);
|
|
453
|
+
}
|
|
454
|
+
})();
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
async function createGatewayApprovalRequest(req) {
|
|
458
|
+
let ctx = approvalContext.getStore();
|
|
459
|
+
if (!ctx)
|
|
460
|
+
throw new Error(NO_HANDLER_REASON);
|
|
461
|
+
return createApprovalPrompt(ctx.adapter, ctx.source, req, ctx.timeoutMs, ctx.key);
|
|
462
|
+
}
|
|
463
|
+
function registerGatewayApprovalHandler() {
|
|
464
|
+
registerApprovalHandler(createGatewayApprovalRequest);
|
|
465
|
+
}
|
|
466
|
+
async function handleApprovalCallback(event, adapter) {
|
|
467
|
+
let parsed = parseCallbackData2(event.data);
|
|
468
|
+
if (!parsed)
|
|
469
|
+
return !1;
|
|
470
|
+
let entry = pending.get(parsed.id);
|
|
471
|
+
if (!entry)
|
|
472
|
+
return await adapter?.answerCallback(event.id, "Approval expired.").catch(() => {
|
|
473
|
+
}), !0;
|
|
474
|
+
if (event.userId !== entry.userId || event.chatId !== entry.chatId || event.threadId !== entry.threadId || adapter && adapter.platform !== entry.adapter.platform)
|
|
475
|
+
return await entry.adapter.answerCallback(event.id, "\u26D4 Not your approval.").catch(() => {
|
|
476
|
+
}), !0;
|
|
477
|
+
clearTimeout(entry.timeout), pending.delete(parsed.id);
|
|
478
|
+
let response = parsed.action === "reject" || parsed.action === "cancel" ? "reject" : parsed.action, binding = entry.key ? conversationBinding(entry.key) : void 0;
|
|
479
|
+
if (binding?.owner && binding.owner !== event.userId)
|
|
480
|
+
return entry.resolve("reject"), await entry.adapter.answerCallback(event.id, "This session belongs to a different user.").catch(() => {
|
|
481
|
+
}), !0;
|
|
482
|
+
if (binding && !isAuthorized(entry.source, loadGatewayConfig(), createPairingStore()))
|
|
483
|
+
return entry.resolve("reject"), !0;
|
|
484
|
+
if (entry.plan && response !== "reject" && entry.key) {
|
|
485
|
+
let sessionId = getSession(entry.key)?.sessionId;
|
|
486
|
+
sessionId && setPermissionMode("yolo", sessionId);
|
|
487
|
+
}
|
|
488
|
+
entry.resolve(response);
|
|
489
|
+
let label = parsed.action === "reject" || parsed.action === "cancel" ? "Rejected." : `Approved (${parsed.action}).`;
|
|
490
|
+
return await entry.adapter.editMessage(entry.chatId, entry.messageId ?? "", label, []).catch(() => {
|
|
491
|
+
}), await entry.adapter.answerCallback(event.id).catch(() => {
|
|
492
|
+
}), !0;
|
|
493
|
+
}
|
|
494
|
+
function cancelGatewayApprovals(key) {
|
|
495
|
+
for (let [id, entry] of pending)
|
|
496
|
+
entry.key === key && (clearTimeout(entry.timeout), pending.delete(id), entry.resolve("reject"), entry.messageId && entry.adapter.editMessage(entry.chatId, entry.messageId, "Approval cancelled.", []).catch(() => {
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// packages/coding-agent/dist/gateway/text.js
|
|
501
|
+
function utf16Len(s) {
|
|
502
|
+
return s.length;
|
|
503
|
+
}
|
|
504
|
+
var graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
505
|
+
function surrogateSafeCut(s, cut) {
|
|
506
|
+
if (cut > 0) {
|
|
507
|
+
let code = s.charCodeAt(cut - 1);
|
|
508
|
+
if (code >= 55296 && code <= 56319)
|
|
509
|
+
return cut - 1;
|
|
510
|
+
}
|
|
511
|
+
return cut;
|
|
512
|
+
}
|
|
513
|
+
function graphemeSafeCut(s, maxIndex) {
|
|
514
|
+
if (maxIndex <= 0)
|
|
515
|
+
return 0;
|
|
516
|
+
let end = 0;
|
|
517
|
+
for (let segment of graphemeSegmenter.segment(s)) {
|
|
518
|
+
let nextEnd = segment.index + segment.segment.length;
|
|
519
|
+
if (nextEnd > maxIndex)
|
|
520
|
+
break;
|
|
521
|
+
end = nextEnd;
|
|
522
|
+
}
|
|
523
|
+
return surrogateSafeCut(s, end);
|
|
524
|
+
}
|
|
525
|
+
function findSplitPoint(window, limit) {
|
|
526
|
+
let blank = window.lastIndexOf(`
|
|
527
|
+
|
|
528
|
+
`);
|
|
529
|
+
if (blank > 0)
|
|
530
|
+
return blank + 1;
|
|
531
|
+
let newline = window.lastIndexOf(`
|
|
532
|
+
`);
|
|
533
|
+
if (newline > 0)
|
|
534
|
+
return newline + 1;
|
|
535
|
+
let space = window.lastIndexOf(" ");
|
|
536
|
+
return space > 0 ? space + 1 : graphemeSafeCut(window, limit);
|
|
537
|
+
}
|
|
538
|
+
var FENCE_RE = /^\s*```/;
|
|
539
|
+
function openFenceAtEnd(chunk) {
|
|
540
|
+
let opener;
|
|
541
|
+
for (let line of chunk.split(`
|
|
542
|
+
`))
|
|
543
|
+
FENCE_RE.test(line) && (opener = opener === void 0 ? line.trim() : void 0);
|
|
544
|
+
return opener;
|
|
545
|
+
}
|
|
546
|
+
var FENCE_CLOSE = "\n```";
|
|
547
|
+
function splitRaw(text, limit) {
|
|
548
|
+
let chunks = [], rest = text;
|
|
549
|
+
for (; utf16Len(rest) > limit; ) {
|
|
550
|
+
let cut = findSplitPoint(rest.slice(0, limit), limit), chunk = rest.slice(0, cut).replace(/\s+$/, ""), opener = openFenceAtEnd(chunk);
|
|
551
|
+
for (; opener !== void 0 && chunk.length + FENCE_CLOSE.length > limit; )
|
|
552
|
+
cut = findSplitPoint(rest.slice(0, limit - FENCE_CLOSE.length), limit - FENCE_CLOSE.length), chunk = rest.slice(0, cut).replace(/\s+$/, ""), opener = openFenceAtEnd(chunk);
|
|
553
|
+
opener !== void 0 && chunk === opener && (cut = graphemeSafeCut(rest, Math.max(1, limit - FENCE_CLOSE.length)), chunk = rest.slice(0, cut), opener = openFenceAtEnd(chunk), opener !== void 0 && chunk === opener && (cut = graphemeSafeCut(rest, limit), chunk = rest.slice(0, cut), opener = void 0)), rest = rest.slice(cut).replace(/^\n+/, ""), opener !== void 0 && (chunk += FENCE_CLOSE, rest = `${opener}
|
|
554
|
+
${rest}`), chunk.length > 0 && chunks.push(chunk);
|
|
555
|
+
}
|
|
556
|
+
return rest.length > 0 && chunks.push(rest), chunks;
|
|
557
|
+
}
|
|
558
|
+
function indicatorReserve(m) {
|
|
559
|
+
return 4 + 2 * String(m).length;
|
|
560
|
+
}
|
|
561
|
+
function splitMessage(text, max) {
|
|
562
|
+
if (max < 1)
|
|
563
|
+
throw new RangeError("max must be >= 1");
|
|
564
|
+
if (utf16Len(text) <= max)
|
|
565
|
+
return [text];
|
|
566
|
+
let chunks = splitRaw(text, max);
|
|
567
|
+
if (chunks.length > 1 && max - indicatorReserve(chunks.length) >= 1) {
|
|
568
|
+
let reserve = indicatorReserve(chunks.length), adjusted = splitRaw(text, max - reserve);
|
|
569
|
+
chunks = indicatorReserve(adjusted.length) === reserve ? adjusted : splitRaw(text, max - indicatorReserve(adjusted.length));
|
|
570
|
+
}
|
|
571
|
+
return chunks.length <= 1 ? chunks : chunks.map((chunk, i) => `${chunk} (${i + 1}/${chunks.length})`);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// packages/coding-agent/dist/gateway/presenter.js
|
|
575
|
+
var epochs = /* @__PURE__ */ new Map(), sessionIdentities = /* @__PURE__ */ new Map();
|
|
576
|
+
function sessionIdentity(key) {
|
|
577
|
+
let identity = sessionIdentities.get(key);
|
|
578
|
+
return identity || (identity = {}, sessionIdentities.set(key, identity)), identity;
|
|
579
|
+
}
|
|
580
|
+
function invalidateGatewaySession(key) {
|
|
581
|
+
let previous = sessionIdentity(key), next = {};
|
|
582
|
+
return sessionIdentities.set(key, next), invalidateGatewayDialogs(key), () => {
|
|
583
|
+
sessionIdentities.get(key) === next && (invalidateGatewayDialogs(key), sessionIdentities.set(key, previous));
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
var inputs = /* @__PURE__ */ new Map(), dialogs = /* @__PURE__ */ new Map(), adapters = /* @__PURE__ */ new Map(), deliveryConfigs = /* @__PURE__ */ new Map(), roleGrants = /* @__PURE__ */ new Map(), timer, activeDeliveries = /* @__PURE__ */ new Map(), MAX_ATTEMPTS = 5, path2 = () => join3(getAgentDir(), "gateway-outbox.json"), outbox = [];
|
|
587
|
+
function sourceWithCurrentRole(key, source) {
|
|
588
|
+
let grant = roleGrants.get(key);
|
|
589
|
+
return {
|
|
590
|
+
...source,
|
|
591
|
+
roleAuthorized: grant?.userId === source.userId && grant.chatId === source.chatId && grant.threadId === source.threadId
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
function rememberGatewayRole(key, source) {
|
|
595
|
+
source.roleAuthorized === !0 ? roleGrants.set(key, { userId: source.userId, chatId: source.chatId, threadId: source.threadId }) : roleGrants.delete(key);
|
|
596
|
+
}
|
|
597
|
+
function canDeliverGatewayText(key, source, fallbackConfig, pairing = createPairingStore()) {
|
|
598
|
+
let binding = conversationBinding(key), cfg = existsSync4(gatewayConfigPath()) ? loadGatewayConfig() : fallbackConfig ?? loadGatewayConfig();
|
|
599
|
+
return (!binding || binding.source.platform === source.platform && binding.source.chatId === source.chatId && binding.source.userId === source.userId && binding.source.threadId === source.threadId && (!binding.owner || binding.owner === source.userId)) && isAuthorized(sourceWithCurrentRole(key, source), cfg, pairing);
|
|
600
|
+
}
|
|
601
|
+
function canDeliver(key) {
|
|
602
|
+
let binding = conversationBinding(key);
|
|
603
|
+
return !!binding && canDeliverGatewayText(key, binding.source);
|
|
604
|
+
}
|
|
605
|
+
function gatewayDestination(key) {
|
|
606
|
+
let binding = conversationBinding(key), adapter = binding && adapters.get(binding.source.platform);
|
|
607
|
+
if (!binding || !adapter || !canDeliver(key))
|
|
608
|
+
throw new Error("This chat is no longer authorized or its platform is disconnected.");
|
|
609
|
+
return { adapter, source: binding.source };
|
|
610
|
+
}
|
|
611
|
+
function withGatewayPresentation(key, run) {
|
|
612
|
+
let { adapter, source } = gatewayDestination(key);
|
|
613
|
+
return runWithApprovalContext({ adapter, source, key }, run);
|
|
614
|
+
}
|
|
615
|
+
function startGatewayPresenter(connected) {
|
|
616
|
+
if (adapters = connected, existsSync4(path2()))
|
|
617
|
+
try {
|
|
618
|
+
let raw = JSON.parse(readFileSync3(path2(), "utf8"));
|
|
619
|
+
if (!Array.isArray(raw) || !raw.every((item) => item && typeof item.id == "string" && typeof item.key == "string" && typeof item.text == "string"))
|
|
620
|
+
throw new Error("Invalid outbox");
|
|
621
|
+
outbox = raw;
|
|
622
|
+
} catch {
|
|
623
|
+
throw new Error("Gateway outbox is invalid. Restore it before starting.");
|
|
624
|
+
}
|
|
625
|
+
else
|
|
626
|
+
outbox = [];
|
|
627
|
+
for (let item of outbox)
|
|
628
|
+
item.kind === "notice" && epochs.set(item.key, Math.max(epochs.get(item.key) ?? 0, item.epoch ?? 0));
|
|
629
|
+
timer && clearInterval(timer), timer = setInterval(() => {
|
|
630
|
+
flushOutbox().catch((error) => console.error("[gateway] outbox flush failed:", error));
|
|
631
|
+
}, 3e3), timer.unref(), flushOutbox().catch((error) => console.error("[gateway] outbox flush failed:", error));
|
|
632
|
+
}
|
|
633
|
+
function stopGatewayPresenter() {
|
|
634
|
+
timer && clearInterval(timer), timer = void 0;
|
|
635
|
+
for (let key of /* @__PURE__ */ new Set([...sessionIdentities.keys(), ...dialogs.keys()]))
|
|
636
|
+
invalidateGatewaySession(key);
|
|
637
|
+
adapters = /* @__PURE__ */ new Map(), deliveryConfigs.clear(), roleGrants.clear();
|
|
638
|
+
}
|
|
639
|
+
function gatewayEpoch(key) {
|
|
640
|
+
return epochs.get(key) ?? 0;
|
|
641
|
+
}
|
|
642
|
+
async function sendGatewayNotice(key, text, kind = "notice", epoch = gatewayEpoch(key)) {
|
|
643
|
+
let clean = text.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").trim();
|
|
644
|
+
if (!clean || !canDeliver(key))
|
|
645
|
+
return;
|
|
646
|
+
let { adapter, source } = gatewayDestination(key);
|
|
647
|
+
await queueGatewayText(key, source, adapter, clean, { kind, epoch });
|
|
648
|
+
}
|
|
649
|
+
async function queueGatewayText(key, source, adapter, text, options) {
|
|
650
|
+
if (!text || options.kind === "notice" && options.epoch !== void 0 && options.epoch !== gatewayEpoch(key))
|
|
651
|
+
return;
|
|
652
|
+
adapters.set(source.platform, adapter), options.cfg && deliveryConfigs.set(key, options.cfg);
|
|
653
|
+
let chunks = options.chunks ?? splitMessage(text, adapter.maxMessageLength), batchId = randomUUID();
|
|
654
|
+
for (let [index, chunk] of chunks.entries())
|
|
655
|
+
outbox.push({
|
|
656
|
+
id: randomUUID(),
|
|
657
|
+
batchId,
|
|
658
|
+
key,
|
|
659
|
+
source: { ...source, roleAuthorized: void 0 },
|
|
660
|
+
epoch: options.epoch ?? gatewayEpoch(key),
|
|
661
|
+
text: chunk,
|
|
662
|
+
kind: options.kind,
|
|
663
|
+
replyTo: index === 0 ? options.replyTo : void 0
|
|
664
|
+
});
|
|
665
|
+
atomicJson(path2(), outbox), activeDeliveries.has(key) && await activeDeliveries.get(key), await flushKey(key);
|
|
666
|
+
}
|
|
667
|
+
function flushOutbox() {
|
|
668
|
+
return Promise.all([...new Set(outbox.map((item) => item.key))].map(flushKey)).then(() => {
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
function flushKey(key) {
|
|
672
|
+
let current = activeDeliveries.get(key);
|
|
673
|
+
if (current)
|
|
674
|
+
return current;
|
|
675
|
+
let running = drainKey(key).finally(() => {
|
|
676
|
+
activeDeliveries.delete(key);
|
|
677
|
+
});
|
|
678
|
+
return activeDeliveries.set(key, running), running;
|
|
679
|
+
}
|
|
680
|
+
async function drainKey(key) {
|
|
681
|
+
let failedBatches = new Set(outbox.filter((item) => item.failed && item.batchId).map((item) => item.batchId));
|
|
682
|
+
for (let item of [...outbox].filter((item2) => item2.key === key)) {
|
|
683
|
+
if (item.failed || item.batchId && failedBatches.has(item.batchId))
|
|
684
|
+
continue;
|
|
685
|
+
if (item.kind === "notice" && item.epoch !== (epochs.get(item.key) ?? 0)) {
|
|
686
|
+
outbox = outbox.filter((v) => v.id !== item.id), atomicJson(path2(), outbox);
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
let binding = conversationBinding(item.key), source = item.source ?? binding?.source;
|
|
690
|
+
if (!source)
|
|
691
|
+
break;
|
|
692
|
+
if (!canDeliverGatewayText(key, source, deliveryConfigs.get(key))) {
|
|
693
|
+
outbox = outbox.filter((v) => v.id !== item.id), atomicJson(path2(), outbox);
|
|
694
|
+
continue;
|
|
695
|
+
}
|
|
696
|
+
let adapter = adapters.get(source.platform);
|
|
697
|
+
if (!adapter || (item.nextAttempt ?? 0) > Date.now())
|
|
698
|
+
break;
|
|
699
|
+
let opts = { threadId: source.threadId, replyTo: item.replyTo }, result = await adapter.send(source.chatId, item.text, opts).catch((error) => ({ success: !1, error: String(error), retryable: !0 }));
|
|
700
|
+
if (result.success)
|
|
701
|
+
outbox = outbox.filter((v) => v.id !== item.id), atomicJson(path2(), outbox);
|
|
702
|
+
else {
|
|
703
|
+
if (item.attempts = (item.attempts ?? 0) + 1, item.failed = result.retryable === !1 || item.attempts >= MAX_ATTEMPTS, item.nextAttempt = Date.now() + Math.min(6e4, 3e3 * 2 ** (item.attempts - 1)), item.failed && item.batchId) {
|
|
704
|
+
failedBatches.add(item.batchId);
|
|
705
|
+
for (let pending2 of outbox)
|
|
706
|
+
pending2.batchId === item.batchId && (pending2.failed = !0);
|
|
707
|
+
}
|
|
708
|
+
atomicJson(path2(), outbox), console.error(`[gateway] delivery ${item.failed ? "failed permanently" : "retry scheduled"} for ${source.platform}: ${result.error ?? "unknown error"}`);
|
|
709
|
+
break;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
function invalidateGatewayDialogs(key) {
|
|
714
|
+
invalidateGatewayPickers(key), epochs.set(key, (epochs.get(key) ?? 0) + 1);
|
|
715
|
+
let remaining = outbox.filter((item) => item.key !== key || item.kind !== "notice");
|
|
716
|
+
remaining.length !== outbox.length && (outbox = remaining, atomicJson(path2(), outbox));
|
|
717
|
+
for (let cancel of dialogs.get(key) ?? [])
|
|
718
|
+
cancel();
|
|
719
|
+
dialogs.delete(key), inputs.delete(key);
|
|
720
|
+
}
|
|
721
|
+
function acceptGatewayInput(key, event) {
|
|
722
|
+
let input = inputs.get(key);
|
|
723
|
+
return !input || input.userId !== event.source.userId || !canDeliver(key) || event.text.startsWith("/") && event.text !== "/cancel" ? !1 : (input.resolve(event.text === "/cancel" ? void 0 : event.text), !0);
|
|
724
|
+
}
|
|
725
|
+
function dialog(key, opts, show, request) {
|
|
726
|
+
if (request && request.generation !== gatewayPickerGeneration(key))
|
|
727
|
+
return Promise.resolve(void 0);
|
|
728
|
+
let epoch = epochs.get(key) ?? 0, source = request?.source ?? conversationBinding(key)?.source;
|
|
729
|
+
return new Promise((resolve2, reject) => {
|
|
730
|
+
let settled = !1, finish = (value, error) => {
|
|
731
|
+
settled || (settled = !0, clearTimeout(timeout), opts?.signal?.removeEventListener("abort", cancel), inputs.get(key)?.resolve === done && inputs.delete(key), dialogs.get(key)?.delete(cancel), error !== void 0 ? reject(error) : resolve2(value));
|
|
732
|
+
}, done = (value) => finish(value), cancel = () => done(void 0), timeout = setTimeout(cancel, opts?.timeout ?? 3e5), set = dialogs.get(key) ?? /* @__PURE__ */ new Set();
|
|
733
|
+
if (set.add(cancel), dialogs.set(key, set), opts?.signal?.addEventListener("abort", cancel, { once: !0 }), opts?.signal?.aborted) {
|
|
734
|
+
cancel();
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
show(done, () => !settled && (epochs.get(key) ?? 0) === epoch && !!source && canDeliverGatewayText(key, source)).catch((error) => {
|
|
738
|
+
finish(void 0, error);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
function gatewaySelect(key, title, options, opts, request) {
|
|
743
|
+
return dialog(key, opts, async (done, valid) => {
|
|
744
|
+
let { adapter, source: destination } = gatewayDestination(key), source = request?.source ?? destination, result = await createPicker(adapter, source, {
|
|
745
|
+
kind: "dialog",
|
|
746
|
+
generation: request?.generation,
|
|
747
|
+
sessionKey: key,
|
|
748
|
+
invokerId: source.userId,
|
|
749
|
+
title,
|
|
750
|
+
items: options.map((value) => ({ label: value, value })),
|
|
751
|
+
validate: valid,
|
|
752
|
+
onCancel: () => done(void 0),
|
|
753
|
+
resolve: async (item) => (done(item.value), { done: !0, text: `${title}
|
|
754
|
+
${item.value}` })
|
|
755
|
+
}, { threadId: source.threadId });
|
|
756
|
+
if (!result.success)
|
|
757
|
+
throw new Error(result.error ?? "Could not send picker.");
|
|
758
|
+
}, request);
|
|
759
|
+
}
|
|
760
|
+
function gatewayInput(key, title, placeholder, opts, request) {
|
|
761
|
+
if (inputs.has(key))
|
|
762
|
+
return Promise.reject(new Error("Answer or cancel the existing question first."));
|
|
763
|
+
let epoch = gatewayEpoch(key);
|
|
764
|
+
return dialog(key, opts, async (done, valid) => {
|
|
765
|
+
if (!valid()) {
|
|
766
|
+
done(void 0);
|
|
767
|
+
return;
|
|
768
|
+
}
|
|
769
|
+
let source = request?.source ?? gatewayDestination(key).source;
|
|
770
|
+
inputs.set(key, { userId: source.userId, resolve: done }), await sendGatewayNotice(key, `${title}${placeholder ? `
|
|
771
|
+
${placeholder}` : ""}
|
|
772
|
+
Reply with text, or /cancel.`, "notice", epoch);
|
|
773
|
+
}, request);
|
|
774
|
+
}
|
|
775
|
+
function createGatewayUI(key) {
|
|
776
|
+
let identity = sessionIdentity(key), source = conversationBinding(key)?.source, valid = () => sessionIdentity(key) === identity && !!source && canDeliverGatewayText(key, source);
|
|
777
|
+
return {
|
|
778
|
+
...noOpUIContext,
|
|
779
|
+
select: (title, options, opts) => valid() ? gatewaySelect(key, title, options, opts) : Promise.resolve(void 0),
|
|
780
|
+
confirm: async (title, message, opts) => valid() && await gatewaySelect(key, `${title}
|
|
781
|
+
${message}`, ["Approve", "Decline"], opts) === "Approve",
|
|
782
|
+
input: (title, placeholder, opts) => valid() ? gatewayInput(key, title, placeholder, opts) : Promise.resolve(void 0),
|
|
783
|
+
editor: (title, prefill) => valid() ? gatewayInput(key, title, prefill) : Promise.resolve(void 0),
|
|
784
|
+
notify: (message) => {
|
|
785
|
+
valid() && sendGatewayNotice(key, message).catch(() => {
|
|
786
|
+
});
|
|
787
|
+
},
|
|
788
|
+
custom: async () => {
|
|
789
|
+
throw new Error("This command requires the terminal interface. Use the gateway's text commands or button pickers.");
|
|
790
|
+
},
|
|
791
|
+
pasteToEditor: (text) => {
|
|
792
|
+
valid() && sendGatewayNotice(key, text).catch(() => {
|
|
793
|
+
});
|
|
794
|
+
},
|
|
795
|
+
setEditorText: (text) => {
|
|
796
|
+
valid() && sendGatewayNotice(key, text).catch(() => {
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// packages/coding-agent/dist/gateway/mobile-commands.js
|
|
803
|
+
var MOBILE_COMMANDS = [
|
|
804
|
+
{ name: "project", description: "Browse folders and choose a project" },
|
|
805
|
+
{ name: "continue", description: "Continue a handoff or the latest TUI session" },
|
|
806
|
+
{ name: "sessions", description: "Browse saved sessions across projects" },
|
|
807
|
+
{ name: "mode", description: "Choose yolo, auto, or read-only permissions" },
|
|
808
|
+
{ name: "plan", description: "Plan work and approve it from this chat" },
|
|
809
|
+
{ name: "settings", description: "Change this session's model, thinking, or permissions" },
|
|
810
|
+
{ name: "stopall", description: "Stop this session and its background subagents" },
|
|
811
|
+
{ name: "download", description: "Send a file from the current project" },
|
|
812
|
+
{ name: "usage", description: "Show session tokens and subscription usage" },
|
|
813
|
+
{ name: "processes", description: "List or stop this session's shell processes" },
|
|
814
|
+
{ name: "refresh", description: "Refresh available models" },
|
|
815
|
+
{ name: "skill", description: "Choose a skill and send it a task" },
|
|
816
|
+
{ name: "fast", description: "Toggle OpenAI Codex fast mode" }
|
|
817
|
+
], FORWARDED_COMMANDS = [
|
|
818
|
+
{ name: "goal", description: "Set or manage the session goal" },
|
|
819
|
+
{ name: "cron", description: "Schedule prompts and manage scheduled jobs" },
|
|
820
|
+
{ name: "run", description: "Launch a subagent task" },
|
|
821
|
+
{ name: "chain", description: "Run a sequence of subagent tasks" },
|
|
822
|
+
{ name: "parallel", description: "Run independent subagent tasks" },
|
|
823
|
+
{ name: "mcp", description: "Show configured MCP servers" },
|
|
824
|
+
{ name: "lsp", description: "Show language server status" }
|
|
825
|
+
];
|
|
826
|
+
function resolveWithinRoots(path3, roots) {
|
|
827
|
+
let actual = realpathSync(resolve(path3));
|
|
828
|
+
if (!roots.some((root) => {
|
|
829
|
+
try {
|
|
830
|
+
let rel = relative(realpathSync(root), actual);
|
|
831
|
+
return rel === "" || !rel.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && rel !== ".." && !isAbsolute(rel);
|
|
832
|
+
} catch {
|
|
833
|
+
return !1;
|
|
834
|
+
}
|
|
835
|
+
}))
|
|
836
|
+
throw new Error("That path is outside the approved folders.");
|
|
837
|
+
return actual;
|
|
838
|
+
}
|
|
839
|
+
function createProjectFolder(parent, name, roots) {
|
|
840
|
+
if (!name || name === "." || name === ".." || /[\\/\x00-\x1f<>:"|?*]/.test(name) || /[. ]$/.test(name) || /^(con|prn|aux|nul|com\d|lpt\d)(\.|$)/i.test(name))
|
|
841
|
+
throw new Error("Use a simple folder name without slashes or reserved characters.");
|
|
842
|
+
let actual = resolveWithinRoots(parent, roots);
|
|
843
|
+
return mkdirSync2(join4(actual, name)), resolveWithinRoots(join4(actual, name), roots);
|
|
844
|
+
}
|
|
845
|
+
function commandRequest(ctx) {
|
|
846
|
+
return { generation: ctx.pickerGeneration ?? gatewayPickerGeneration(ctx.key), source: ctx.event.source };
|
|
847
|
+
}
|
|
848
|
+
function selectForCommand(ctx, title, options, opts) {
|
|
849
|
+
return gatewaySelect(ctx.key, title, options, opts, commandRequest(ctx));
|
|
850
|
+
}
|
|
851
|
+
function inputForCommand(ctx, title) {
|
|
852
|
+
return gatewayInput(ctx.key, title, void 0, void 0, commandRequest(ctx));
|
|
853
|
+
}
|
|
854
|
+
async function browseProject(ctx, initialPath) {
|
|
855
|
+
let { key, event, adapter, bridge } = ctx, roots = ctx.cfg.projectRoots ?? [];
|
|
856
|
+
if (!roots.length)
|
|
857
|
+
throw new Error("Add approved project folders with lunr gateway setup first.");
|
|
858
|
+
let current = initialPath ? resolveWithinRoots(initialPath, ctx.cfg.projectRoots ?? []) : void 0, view = () => {
|
|
859
|
+
if (!current)
|
|
860
|
+
return {
|
|
861
|
+
title: "Choose a project folder",
|
|
862
|
+
items: [.../* @__PURE__ */ new Set([...conversationBinding(key)?.recentProjects ?? [], ...roots])].filter((p) => {
|
|
863
|
+
try {
|
|
864
|
+
return resolveWithinRoots(p, roots), !0;
|
|
865
|
+
} catch {
|
|
866
|
+
return !1;
|
|
867
|
+
}
|
|
868
|
+
}).map((p) => ({ label: p, value: p }))
|
|
869
|
+
};
|
|
870
|
+
current = resolveWithinRoots(current, roots);
|
|
871
|
+
let items = [
|
|
872
|
+
{ label: "Use this folder", value: "use" },
|
|
873
|
+
{ label: "New folder", value: "new" },
|
|
874
|
+
{ label: "Recent and roots", value: "roots" }
|
|
875
|
+
];
|
|
876
|
+
try {
|
|
877
|
+
let up = resolveWithinRoots(dirname2(current), roots);
|
|
878
|
+
up !== current && items.push({ label: "Up", value: up });
|
|
879
|
+
} catch {
|
|
880
|
+
}
|
|
881
|
+
for (let item of readdirSync(current, { withFileTypes: !0 }).sort((a, b) => a.name.localeCompare(b.name)))
|
|
882
|
+
if (!(!item.isDirectory() && !item.isSymbolicLink()))
|
|
883
|
+
try {
|
|
884
|
+
let path3 = resolveWithinRoots(join4(current, item.name), roots);
|
|
885
|
+
statSync(path3).isDirectory() && items.push({ label: item.name, value: path3 });
|
|
886
|
+
} catch {
|
|
887
|
+
}
|
|
888
|
+
return { title: current, items };
|
|
889
|
+
}, initial = view();
|
|
890
|
+
await createPicker(adapter, event.source, {
|
|
891
|
+
kind: "project",
|
|
892
|
+
sessionKey: key,
|
|
893
|
+
generation: ctx.pickerGeneration,
|
|
894
|
+
invokerId: event.source.userId,
|
|
895
|
+
...initial,
|
|
896
|
+
validate: () => isAuthorized(event.source, loadGatewayConfig()),
|
|
897
|
+
resolve: async (item) => {
|
|
898
|
+
if (requireAuthorized(event.source), item.value === "use" && current) {
|
|
899
|
+
let cwd = resolveWithinRoots(current, loadGatewayConfig().projectRoots ?? []);
|
|
900
|
+
if (bridge.getStatus(key).busy)
|
|
901
|
+
throw new Error("Stop the current turn or wait before switching projects.");
|
|
902
|
+
let committed = !1;
|
|
903
|
+
if (await bridge.reset(key, {
|
|
904
|
+
validate: () => {
|
|
905
|
+
requireAuthorized(event.source);
|
|
906
|
+
let binding = conversationBinding(key);
|
|
907
|
+
if (!binding || binding.owner !== event.source.userId || binding.source.userId !== event.source.userId || binding.source.platform !== event.source.platform || binding.source.chatId !== event.source.chatId || binding.source.threadId !== event.source.threadId)
|
|
908
|
+
throw new GatewayPickerCancelled("Project requester changed before selection completed.");
|
|
909
|
+
resolveWithinRoots(cwd, loadGatewayConfig().projectRoots ?? []);
|
|
910
|
+
},
|
|
911
|
+
commit: () => {
|
|
912
|
+
bindConversation(key, event.source, { cwd, owner: event.source.userId }), committed = !0;
|
|
913
|
+
}
|
|
914
|
+
}), !committed)
|
|
915
|
+
throw new Error("The gateway did not commit project replacement. Retry with an updated gateway.");
|
|
916
|
+
return {
|
|
917
|
+
done: !0,
|
|
918
|
+
text: `Project selected: ${cwd}
|
|
919
|
+
Send a task to begin. Existing sessions are still available through /sessions.`
|
|
920
|
+
};
|
|
921
|
+
}
|
|
922
|
+
if (item.value === "new" && current) {
|
|
923
|
+
let name = await inputForCommand(ctx, "New folder name");
|
|
924
|
+
if (ctx.pickerGeneration !== gatewayPickerGeneration(key))
|
|
925
|
+
return { done: !0, text: "Selection cancelled." };
|
|
926
|
+
name && (current = createProjectFolder(current, name, loadGatewayConfig().projectRoots ?? []));
|
|
927
|
+
} else
|
|
928
|
+
current = item.value === "roots" ? void 0 : item.value;
|
|
929
|
+
return { done: !1, ...view() };
|
|
930
|
+
}
|
|
931
|
+
}, { threadId: event.source.threadId });
|
|
932
|
+
}
|
|
933
|
+
var transfers = /* @__PURE__ */ new Map();
|
|
934
|
+
function cancelMobileTransfer(key) {
|
|
935
|
+
transfers.get(key)?.abort();
|
|
936
|
+
}
|
|
937
|
+
async function continueSession(ctx, file) {
|
|
938
|
+
if (transfers.has(ctx.key))
|
|
939
|
+
throw new Error("A session transfer is already pending. Use /stop to cancel it.");
|
|
940
|
+
let controller = new AbortController();
|
|
941
|
+
transfers.set(ctx.key, controller);
|
|
942
|
+
try {
|
|
943
|
+
await performContinue(ctx, file, controller.signal);
|
|
944
|
+
} finally {
|
|
945
|
+
transfers.delete(ctx.key);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
async function performContinue(ctx, file, signal) {
|
|
949
|
+
requireAuthorized(ctx.event.source);
|
|
950
|
+
let { requestSessionTransfer, SessionTransferError } = await import("./session-handoff-LYH53ESV.js"), { key, bridge } = ctx;
|
|
951
|
+
if (bridge.peekSession?.(key)?.sessionManager?.getSessionFile() === file) {
|
|
952
|
+
await ctx.adapter.send(ctx.event.source.chatId, "This session is already open here.");
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
955
|
+
if (bridge.getStatus(key).busy)
|
|
956
|
+
throw new Error("Stop the current phone session before switching.");
|
|
957
|
+
try {
|
|
958
|
+
await requestSessionTransfer(file, { timeoutMs: 3e3, signal });
|
|
959
|
+
} catch (error) {
|
|
960
|
+
if (!(error instanceof SessionTransferError) || !["busy", "timeout"].includes(error.code))
|
|
961
|
+
throw error;
|
|
962
|
+
let choice = await selectForCommand(ctx, `${error instanceof Error ? error.message : "Session is in use"}
|
|
963
|
+
How should lunR continue?`, ["Wait until idle", "Stop and continue", "Cancel"], { signal });
|
|
964
|
+
if (!choice || choice === "Cancel")
|
|
965
|
+
return;
|
|
966
|
+
if (choice === "Stop and continue")
|
|
967
|
+
await requestSessionTransfer(file, { stop: !0, timeoutMs: 3e4, signal });
|
|
968
|
+
else {
|
|
969
|
+
let deadline = Date.now() + 12e4;
|
|
970
|
+
for (; ; ) {
|
|
971
|
+
signal.throwIfAborted(), requireAuthorized(ctx.event.source);
|
|
972
|
+
try {
|
|
973
|
+
await requestSessionTransfer(file, { timeoutMs: 3e3, signal });
|
|
974
|
+
break;
|
|
975
|
+
} catch (retryError) {
|
|
976
|
+
if (!(retryError instanceof SessionTransferError) || !["busy", "timeout"].includes(retryError.code) || Date.now() >= deadline)
|
|
977
|
+
throw retryError;
|
|
978
|
+
}
|
|
979
|
+
await new Promise((resolve2) => setTimeout(resolve2, 500));
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
if (signal.throwIfAborted(), requireAuthorized(ctx.event.source), ctx.pickerGeneration !== gatewayPickerGeneration(key))
|
|
984
|
+
return;
|
|
985
|
+
await bridge.switchSession(key, file), ctx.pickerGeneration = gatewayPickerGeneration(key);
|
|
986
|
+
let session = await bridge.getSession(key), cwd = session?.sessionManager?.getCwd();
|
|
987
|
+
bindConversation(key, ctx.event.source, { cwd, owner: ctx.event.source.userId });
|
|
988
|
+
let id = session?.sessionManager?.getSessionId();
|
|
989
|
+
if (id && ["auto", "yolo"].includes(getPermissionMode(id))) {
|
|
990
|
+
let requested = getPermissionMode(id);
|
|
991
|
+
setPermissionMode("read-only", id), session?.sessionManager?.setPermissionMode?.("read-only"), await selectForCommand(ctx, `Continue with ${requested} permissions? Tools can change files and run commands without individual approval.`, ["Keep read-only", `Use ${requested}`]) === `Use ${requested}` && (setPermissionMode(requested, id), session?.sessionManager?.setPermissionMode?.(requested));
|
|
992
|
+
}
|
|
993
|
+
await ctx.adapter.send(ctx.event.source.chatId, `Continuing ${session?.sessionManager?.getSessionName() ?? basename(file)}
|
|
994
|
+
Project: ${cwd}
|
|
995
|
+
Send your next instruction.`, { threadId: ctx.event.source.threadId });
|
|
996
|
+
}
|
|
997
|
+
async function browseSessions(ctx, args, quick) {
|
|
998
|
+
let handoff = await import("./session-handoff-LYH53ESV.js");
|
|
999
|
+
if (quick) {
|
|
1000
|
+
let candidates = handoff.listHandoffCandidates();
|
|
1001
|
+
if (!candidates.length) {
|
|
1002
|
+
let latest = handoff.latestTuiSession();
|
|
1003
|
+
if (!latest)
|
|
1004
|
+
throw new Error("No recent TUI session found. Use /sessions or mark one in the terminal with /handoff.");
|
|
1005
|
+
await continueSession(ctx, latest.sessionFile);
|
|
1006
|
+
return;
|
|
1007
|
+
}
|
|
1008
|
+
if (candidates.length === 1) {
|
|
1009
|
+
await continueSession(ctx, candidates[0].sessionFile);
|
|
1010
|
+
return;
|
|
1011
|
+
}
|
|
1012
|
+
await sessionPicker(ctx, candidates.map((s) => ({ label: `${s.cwd} \xB7 ${basename(s.sessionFile)}`, value: s.sessionFile })));
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
let sessions = await SessionManager.listAll(), known = new Set(sessions.map((s) => s.path));
|
|
1016
|
+
for (let file of handoff.listRegisteredSessionPaths())
|
|
1017
|
+
if (!known.has(file))
|
|
1018
|
+
try {
|
|
1019
|
+
let manager = SessionManager.openReadOnly(file), header = manager.getHeader();
|
|
1020
|
+
header && sessions.push({
|
|
1021
|
+
id: header.id,
|
|
1022
|
+
path: file,
|
|
1023
|
+
cwd: manager.getCwd(),
|
|
1024
|
+
name: manager.getSessionName(),
|
|
1025
|
+
created: new Date(header.timestamp),
|
|
1026
|
+
modified: statSync(file).mtime,
|
|
1027
|
+
messageCount: manager.getEntries().length,
|
|
1028
|
+
firstMessage: "",
|
|
1029
|
+
allMessagesText: ""
|
|
1030
|
+
});
|
|
1031
|
+
} catch {
|
|
1032
|
+
}
|
|
1033
|
+
let query = args.toLowerCase(), items = sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime()).filter((s) => !query || `${s.name ?? ""} ${s.cwd} ${s.id}`.toLowerCase().includes(query)).map((s) => ({
|
|
1034
|
+
label: `${s.name || s.firstMessage.slice(0, 35) || s.id.slice(0, 8)} \xB7 ${basename(s.cwd)} \xB7 ${s.modified.toLocaleDateString()}`,
|
|
1035
|
+
value: s.path
|
|
1036
|
+
}));
|
|
1037
|
+
await sessionPicker(ctx, items);
|
|
1038
|
+
}
|
|
1039
|
+
async function sessionPicker(ctx, items) {
|
|
1040
|
+
await createPicker(ctx.adapter, ctx.event.source, {
|
|
1041
|
+
kind: "sessions",
|
|
1042
|
+
sessionKey: ctx.key,
|
|
1043
|
+
generation: ctx.pickerGeneration,
|
|
1044
|
+
invokerId: ctx.event.source.userId,
|
|
1045
|
+
title: "Choose a session. Use /sessions <search> to filter.",
|
|
1046
|
+
items,
|
|
1047
|
+
validate: () => isAuthorized(ctx.event.source, loadGatewayConfig()),
|
|
1048
|
+
resolve: async (item) => (await continueSession(ctx, item.value), { done: !0, text: "Session selection finished." })
|
|
1049
|
+
}, { threadId: ctx.event.source.threadId });
|
|
1050
|
+
}
|
|
1051
|
+
async function handleMobileCommand(ctx, command, args) {
|
|
1052
|
+
if (!MOBILE_COMMANDS.some((c) => c.name === command) && command !== "resume")
|
|
1053
|
+
return !1;
|
|
1054
|
+
if (requireAuthorized(ctx.event.source, ctx.cfg), command === "project" && invalidateGatewayDialogs(ctx.key), ctx.pickerGeneration = gatewayPickerGeneration(ctx.key), bindConversation(ctx.key, ctx.event.source, { owner: ctx.event.source.userId }), command === "project")
|
|
1055
|
+
return await browseProject(ctx, args.trim() || void 0), !0;
|
|
1056
|
+
if (command === "sessions" || command === "resume" || command === "continue")
|
|
1057
|
+
return await browseSessions(ctx, args, command === "continue"), !0;
|
|
1058
|
+
let session = await ctx.bridge.getSession(ctx.key);
|
|
1059
|
+
if (!session)
|
|
1060
|
+
throw new Error("Select a project and send a task, or use /continue first.");
|
|
1061
|
+
if (ctx.pickerGeneration !== gatewayPickerGeneration(ctx.key))
|
|
1062
|
+
return !0;
|
|
1063
|
+
let id = session.sessionManager?.getSessionId();
|
|
1064
|
+
if (command === "usage") {
|
|
1065
|
+
let stats = session.getSessionStats(), plans = await (await import("./usage-service-CPAGBED5.js")).getAllPlanUsageResults(session.model?.provider, session.modelRuntime);
|
|
1066
|
+
return await ctx.adapter.send(ctx.event.source.chatId, [
|
|
1067
|
+
`Parent tokens including auxiliary requests: ${stats.tokens.total} \xB7 cost: $${stats.cost.toFixed(4)}`,
|
|
1068
|
+
...stats.childUsage?.requests || stats.childUsage?.total ? [
|
|
1069
|
+
`Children: ${stats.childUsage.total} tokens \xB7 cost: $${stats.childUsage.cost.toFixed(4)}`,
|
|
1070
|
+
`Combined: ${stats.combinedUsage?.total ?? stats.tokens.total + stats.childUsage.total} tokens \xB7 cost: $${(stats.combinedUsage?.cost ?? stats.cost + stats.childUsage.cost).toFixed(4)}`
|
|
1071
|
+
] : [],
|
|
1072
|
+
...stats.combinedUsage?.unknownRequests ? [`Usage unavailable for ${stats.combinedUsage.unknownRequests} request(s).`] : [],
|
|
1073
|
+
...stats.combinedUsage?.partialRequests ? [`Usage incomplete for ${stats.combinedUsage.partialRequests} request(s).`] : [],
|
|
1074
|
+
...plans.usages.flatMap((p) => p.windows.map((w) => `${p.provider} ${w.label}: ${w.usedPercent.toFixed(1)}% used`)),
|
|
1075
|
+
...plans.errors
|
|
1076
|
+
].join(`
|
|
1077
|
+
`)), !0;
|
|
1078
|
+
}
|
|
1079
|
+
if (command === "processes") {
|
|
1080
|
+
if (!id)
|
|
1081
|
+
throw new Error("No session identity.");
|
|
1082
|
+
let processes = await import("./process-registry-Q4QWIU33.js"), own = processes.list(id);
|
|
1083
|
+
if (args) {
|
|
1084
|
+
let [action, raw] = args.split(/\s+/), pid = Number(raw);
|
|
1085
|
+
if (action !== "stop" || !own.some((p) => p.pid === pid))
|
|
1086
|
+
throw new Error("Usage: /processes stop <pid> from this session's process list.");
|
|
1087
|
+
processes.kill(pid), await ctx.adapter.send(ctx.event.source.chatId, `Stop requested for process ${pid}.`);
|
|
1088
|
+
} else
|
|
1089
|
+
await ctx.adapter.send(ctx.event.source.chatId, own.length ? own.map((p) => `${p.pid} \xB7 ${p.status} \xB7 ${p.command}`).join(`
|
|
1090
|
+
`).slice(0, ctx.adapter.maxMessageLength) : "No tracked processes.");
|
|
1091
|
+
return !0;
|
|
1092
|
+
}
|
|
1093
|
+
if (command === "stopall") {
|
|
1094
|
+
await ctx.bridge.abort(ctx.key);
|
|
1095
|
+
let result = id ? await getSubagentCancellation(id)?.stop() : void 0, processes = await import("./process-registry-Q4QWIU33.js"), count = id ? processes.list(id).filter((p) => p.status !== "exited").length : 0;
|
|
1096
|
+
return id && processes.killAll(id), await ctx.adapter.send(ctx.event.source.chatId, `Stopped the current turn. Requested stop for ${result?.requested ?? 0} background runs and ${count} tracked processes${result?.failed ? `; ${result.failed} requests failed` : ""}. Wait for them to exit before transferring.`), !0;
|
|
1097
|
+
}
|
|
1098
|
+
if (ctx.bridge.getStatus(ctx.key).busy)
|
|
1099
|
+
throw new Error("Wait for the current turn or use /stop first.");
|
|
1100
|
+
if (command === "refresh")
|
|
1101
|
+
return await session.modelRuntime.refresh(), await ctx.adapter.send(ctx.event.source.chatId, "Model catalog refreshed. Use /model to choose."), !0;
|
|
1102
|
+
if (command === "fast") {
|
|
1103
|
+
if (session.model?.provider !== "openai-codex" || !session.settingsManager)
|
|
1104
|
+
throw new Error("Fast mode is available only for OpenAI Codex subscriptions.");
|
|
1105
|
+
let current = session.settingsManager.getOpenAIFastMode();
|
|
1106
|
+
if (args && !["on", "off", "status"].includes(args))
|
|
1107
|
+
throw new Error("Usage: /fast on|off|status");
|
|
1108
|
+
return args !== "status" && session.settingsManager.setOpenAIFastMode(args ? args === "on" : !current), await ctx.adapter.send(ctx.event.source.chatId, `Fast mode: ${session.settingsManager.getOpenAIFastMode() ? "on" : "off"}`), !0;
|
|
1109
|
+
}
|
|
1110
|
+
if (command === "skill") {
|
|
1111
|
+
let names = session.resourceLoader?.getSkills().skills.map((s) => s.name) ?? [], [name, ...task] = args.split(/\s+/).filter(Boolean), chosen = name || await selectForCommand(ctx, "Choose a skill", names);
|
|
1112
|
+
if (!chosen || ctx.pickerGeneration !== gatewayPickerGeneration(ctx.key))
|
|
1113
|
+
return !0;
|
|
1114
|
+
if (!names.includes(chosen))
|
|
1115
|
+
throw new Error("That skill is not loaded for this project.");
|
|
1116
|
+
return ctx.event.text = `/skill:${chosen} ${task.join(" ") || await inputForCommand(ctx, "What should this skill do?") || ""}`, ctx.pickerGeneration !== gatewayPickerGeneration(ctx.key);
|
|
1117
|
+
}
|
|
1118
|
+
if (command === "download") {
|
|
1119
|
+
if (!ctx.adapter.sendFile)
|
|
1120
|
+
throw new Error("This platform cannot send files.");
|
|
1121
|
+
if (!args)
|
|
1122
|
+
throw new Error("Usage: /download <project-relative path>");
|
|
1123
|
+
let cwd = session.sessionManager?.getCwd();
|
|
1124
|
+
if (!cwd)
|
|
1125
|
+
throw new Error("No project selected.");
|
|
1126
|
+
let file = resolveWithinRoots(resolve(cwd, args), [cwd]), stat = statSync(file);
|
|
1127
|
+
if (!stat.isFile() || stat.size > 8 * 1024 * 1024)
|
|
1128
|
+
throw new Error("Choose a file no larger than 8 MB.");
|
|
1129
|
+
if (/(^|[\\/])(?:\.env(?:\.[^\\/]*)?|auth\.json|gateway\.json|credentials[^\\/]*|id_rsa|id_ed25519)([\\/]|$)/i.test(file))
|
|
1130
|
+
throw new Error("Credential files cannot be sent through chat.");
|
|
1131
|
+
let result = await ctx.adapter.sendFile(ctx.event.source.chatId, file, { threadId: ctx.event.source.threadId });
|
|
1132
|
+
if (!result.success)
|
|
1133
|
+
throw new Error(result.error ?? "File delivery failed.");
|
|
1134
|
+
return !0;
|
|
1135
|
+
}
|
|
1136
|
+
if (command === "settings") {
|
|
1137
|
+
let choice = await selectForCommand(ctx, "Session settings", ["Model", "Thinking", "Permissions"]);
|
|
1138
|
+
if (choice === "Model" || choice === "Thinking") {
|
|
1139
|
+
let { CHAT_COMMANDS, runChatCommand } = await import("./commands-2ETOWWRA.js");
|
|
1140
|
+
if (ctx.pickerGeneration !== gatewayPickerGeneration(ctx.key))
|
|
1141
|
+
return !0;
|
|
1142
|
+
let cmd = CHAT_COMMANDS.find((c) => c.name === choice.toLowerCase());
|
|
1143
|
+
return cmd && await runChatCommand(cmd, {
|
|
1144
|
+
...ctx,
|
|
1145
|
+
args: "",
|
|
1146
|
+
reply: async (text) => {
|
|
1147
|
+
await ctx.adapter.send(ctx.event.source.chatId, text);
|
|
1148
|
+
}
|
|
1149
|
+
}), !0;
|
|
1150
|
+
}
|
|
1151
|
+
if (choice !== "Permissions")
|
|
1152
|
+
return !0;
|
|
1153
|
+
}
|
|
1154
|
+
let requested = command === "plan" ? "read-only" : args || await selectForCommand(ctx, `Permission mode: ${getPermissionMode(id)}`, [...PERMISSION_MODES]);
|
|
1155
|
+
if (!requested || ctx.pickerGeneration !== gatewayPickerGeneration(ctx.key))
|
|
1156
|
+
return !0;
|
|
1157
|
+
let mode = requested === "read" ? "read-only" : requested;
|
|
1158
|
+
if (!PERMISSION_MODES.includes(mode))
|
|
1159
|
+
throw new Error("Choose yolo, auto, or read-only.");
|
|
1160
|
+
return setPermissionMode(mode, id), session.sessionManager?.setPermissionMode?.(mode), await ctx.adapter.send(ctx.event.source.chatId, `Permission mode: ${mode}`), command === "plan" && args ? (ctx.event.text = `Create a plan for: ${args}`, !1) : !0;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
export {
|
|
1164
|
+
requireAuthorized,
|
|
1165
|
+
isAuthorized,
|
|
1166
|
+
addAllowedUser,
|
|
1167
|
+
conversationBinding,
|
|
1168
|
+
bindConversation,
|
|
1169
|
+
getSession,
|
|
1170
|
+
putSession,
|
|
1171
|
+
touchSession,
|
|
1172
|
+
removeSession,
|
|
1173
|
+
listSessions,
|
|
1174
|
+
runWithApprovalContext,
|
|
1175
|
+
registerGatewayApprovalHandler,
|
|
1176
|
+
handleApprovalCallback,
|
|
1177
|
+
cancelGatewayApprovals,
|
|
1178
|
+
GatewayPickerCancelled,
|
|
1179
|
+
gatewayPickerGeneration,
|
|
1180
|
+
createPicker,
|
|
1181
|
+
handleCallback,
|
|
1182
|
+
startButtonSweeper,
|
|
1183
|
+
stopButtonSweeper,
|
|
1184
|
+
splitMessage,
|
|
1185
|
+
invalidateGatewaySession,
|
|
1186
|
+
rememberGatewayRole,
|
|
1187
|
+
canDeliverGatewayText,
|
|
1188
|
+
withGatewayPresentation,
|
|
1189
|
+
startGatewayPresenter,
|
|
1190
|
+
stopGatewayPresenter,
|
|
1191
|
+
gatewayEpoch,
|
|
1192
|
+
sendGatewayNotice,
|
|
1193
|
+
queueGatewayText,
|
|
1194
|
+
invalidateGatewayDialogs,
|
|
1195
|
+
acceptGatewayInput,
|
|
1196
|
+
createGatewayUI,
|
|
1197
|
+
MOBILE_COMMANDS,
|
|
1198
|
+
FORWARDED_COMMANDS,
|
|
1199
|
+
resolveWithinRoots,
|
|
1200
|
+
createProjectFolder,
|
|
1201
|
+
cancelMobileTransfer,
|
|
1202
|
+
handleMobileCommand
|
|
1203
|
+
};
|