@code-yeongyu/senpi 2026.7.25 → 2026.7.26
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 +81 -0
- package/README.md +1 -1
- package/dist/beta/omo-local-update.d.ts +207 -0
- package/dist/beta/omo-local-update.d.ts.map +1 -0
- package/dist/beta/omo-local-update.js +708 -0
- package/dist/beta/omo-local-update.js.map +1 -0
- package/dist/cli/args.d.ts +4 -16
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -25
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/grok-neo-gate.d.ts +12 -0
- package/dist/cli/grok-neo-gate.d.ts.map +1 -0
- package/dist/cli/grok-neo-gate.js +18 -0
- package/dist/cli/grok-neo-gate.js.map +1 -0
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +33 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +22 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +202 -58
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -2
- package/dist/core/auth-providers.js +2 -2
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +30 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +20 -17
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js +3 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/format.js +9 -2
- package/dist/core/extensions/builtin/goal/format.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +38 -23
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.js +141 -0
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +66 -181
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/transitions.js +45 -0
- package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.js +2 -2
- package/dist/core/extensions/builtin/goal/types.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +2 -0
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.js +24 -12
- package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +0 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +8 -5
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +32 -0
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.js +1 -1
- package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +30 -14
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.js +16 -2
- package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +2 -1
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +99 -48
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.js +2 -4
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +12 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +12 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +25 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +0 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +32 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +91 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-resolver.d.ts +10 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +13 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +19 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +13 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +7 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +13 -0
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js +5 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -35
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +9 -2
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/timings.d.ts +7 -2
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +11 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -0
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/inspector-policy.d.ts +22 -0
- package/dist/inspector-policy.d.ts.map +1 -0
- package/dist/inspector-policy.js +84 -0
- package/dist/inspector-policy.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +1 -0
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/threads/goal-handlers.js +4 -2
- package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.js +1 -0
- package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
- package/dist/modes/app-server/threads/handlers.d.ts +1 -0
- package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js +2 -0
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
- package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
- package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turns.js +47 -3
- package/dist/modes/app-server/threads/turns.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +9 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +29 -4
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +43 -17
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
- package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
- package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
- package/dist/modes/interactive/grok/chrome.d.ts +51 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome.js +105 -0
- package/dist/modes/interactive/grok/chrome.js.map +1 -0
- package/dist/modes/interactive/grok/footer.d.ts +14 -0
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
- package/dist/modes/interactive/grok/footer.js +27 -0
- package/dist/modes/interactive/grok/footer.js.map +1 -0
- package/dist/modes/interactive/grok/input-card.d.ts +9 -0
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/input-card.js +30 -0
- package/dist/modes/interactive/grok/input-card.js.map +1 -0
- package/dist/modes/interactive/grok/palette.d.ts +145 -0
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
- package/dist/modes/interactive/grok/palette.js +92 -0
- package/dist/modes/interactive/grok/palette.js.map +1 -0
- package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
- package/dist/modes/interactive/grok/tool-row.js +26 -0
- package/dist/modes/interactive/grok/tool-row.js.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.js +30 -0
- package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +117 -54
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/grok-day.json +77 -0
- package/dist/modes/interactive/theme/grok-night.json +93 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +3 -3
- package/dist/modes/rpc/connection-handler.js +6 -6
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +6 -7
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +6 -7
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.js +5 -5
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/senpi +2 -0
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +2 -2
- package/docs/grok-neo.md +77 -0
- package/docs/keybindings.md +0 -1
- package/docs/settings.md +14 -3
- package/docs/terminal-tools.md +6 -3
- package/docs/usage.md +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +6 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +210 -26
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +39 -20
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +8 -8
- package/dist/cli/neo/build-argv.d.ts +0 -19
- package/dist/cli/neo/build-argv.d.ts.map +0 -1
- package/dist/cli/neo/build-argv.js +0 -84
- package/dist/cli/neo/build-argv.js.map +0 -1
- package/dist/cli/neo/daemon-launch.d.ts +0 -25
- package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
- package/dist/cli/neo/daemon-launch.js +0 -97
- package/dist/cli/neo/daemon-launch.js.map +0 -1
- package/dist/cli/neo/gate.d.ts +0 -15
- package/dist/cli/neo/gate.d.ts.map +0 -1
- package/dist/cli/neo/gate.js +0 -21
- package/dist/cli/neo/gate.js.map +0 -1
- package/dist/cli/neo/launch.d.ts +0 -24
- package/dist/cli/neo/launch.d.ts.map +0 -1
- package/dist/cli/neo/launch.js +0 -66
- package/dist/cli/neo/launch.js.map +0 -1
- package/dist/cli/neo/platform.d.ts +0 -38
- package/dist/cli/neo/platform.d.ts.map +0 -1
- package/dist/cli/neo/platform.js +0 -54
- package/dist/cli/neo/platform.js.map +0 -1
- package/dist/cli/neo/resolve-binary.d.ts +0 -39
- package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
- package/dist/cli/neo/resolve-binary.js +0 -66
- package/dist/cli/neo/resolve-binary.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
- package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.js +0 -36
- package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
- package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
- package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
- package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
- package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
- package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.js +0 -37
- package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
- package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
- package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
- package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.js +0 -2
- package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
- package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
- package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.js +0 -267
- package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
- package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
- package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
- package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.js +0 -209
- package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
- package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
- package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.js +0 -92
- package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
- package/docs/neo.md +0 -111
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
package/docs/neo.md
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
# neo (Go TUI) — coding-agent integration notes
|
|
2
|
-
|
|
3
|
-
> Minimal scaffold. Expanded by plan task 22 (docs + infra-sync). This file
|
|
4
|
-
> currently covers only the pieces landed by task 15 (the TypeScript daemon).
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
`senpi --neo` launches a Go-native terminal UI that drives the existing agent
|
|
9
|
-
runtime over the JSONL RPC protocol. Multiple neo windows in the SAME cwd share
|
|
10
|
-
one backend via a small TypeScript **daemon**, instead of each spawning its own
|
|
11
|
-
runtime. `--neo-isolated` opts out of sharing (per-instance stdio backend).
|
|
12
|
-
|
|
13
|
-
## Daemon architecture (task 15)
|
|
14
|
-
|
|
15
|
-
### Process model
|
|
16
|
-
|
|
17
|
-
- `senpi --listen <socket>` runs the daemon **supervisor**. It binds the socket,
|
|
18
|
-
self-registers, and serves connections. It does NOT construct an
|
|
19
|
-
`AgentSessionRuntime` in the supervisor process.
|
|
20
|
-
- Each accepted connection is served by its own child `senpi --mode rpc`
|
|
21
|
-
**worker** process, spawned with the connection's cwd and its own
|
|
22
|
-
`SENPI_CODING_AGENT_DIR`. The worker is a standard single-connection rpc
|
|
23
|
-
runtime with its own module state and its own `AuthStorage`.
|
|
24
|
-
|
|
25
|
-
### Why one worker process per connection (isolation)
|
|
26
|
-
|
|
27
|
-
Running N `createAgentSessionRuntime` instances concurrently in ONE node process
|
|
28
|
-
is not safe: pi-ai keeps a **process-global provider registry** that
|
|
29
|
-
`ModelRegistry.refresh()` / `AgentSession.reload()` reset
|
|
30
|
-
(`resetApiProviders()` / `resetOAuthProviders()`), and pi-agent-core mints entry
|
|
31
|
-
IDs from a **module-level UUIDv7 counter**. Two concurrent in-process runtimes
|
|
32
|
-
would cross-talk through both. Both live in shared libraries that are out of
|
|
33
|
-
scope to change, so the daemon uses child-process workers instead — real
|
|
34
|
-
concurrency, full isolation, and `--api-key` that can never leak across
|
|
35
|
-
connections. See `.omo/evidence/task-15-neo-go-tui.md` §1 for the full spike.
|
|
36
|
-
|
|
37
|
-
### Handshake
|
|
38
|
-
|
|
39
|
-
A connection's first line is a `hello`:
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
{"type":"hello","token":"<registry token>","version":1,"capabilities":[],"runtimeOptions":{...}}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
The daemon replies `{"type":"welcome","version":1}` or
|
|
46
|
-
`{"type":"refuse","code":"bad_token|version_mismatch|unsupported_options|malformed_hello","reason":"..."}`.
|
|
47
|
-
`runtimeOptions` is the typed `NeoRuntimeOptions` payload (every classic runtime
|
|
48
|
-
flag: provider/model/models/thinking/api-key, session selection, approval, tool
|
|
49
|
-
scoping, resource loading, system prompt overrides, extension flags, and raw
|
|
50
|
-
initial inputs). Its field
|
|
51
|
-
set is generated from the classic runtime-construction path by an extraction
|
|
52
|
-
test — a new consumer of a `parsed.*` field fails the test until it is threaded
|
|
53
|
-
through the payload or documented as a carve-out.
|
|
54
|
-
|
|
55
|
-
**Carve-out:** piped-stdin input never reaches the daemon — a TTY-less
|
|
56
|
-
`senpi --neo` falls back to classic print-mode in the launcher.
|
|
57
|
-
|
|
58
|
-
### Registry / race protocol
|
|
59
|
-
|
|
60
|
-
- The daemon binds the socket FIRST — the bind is the mutex. The race loser gets
|
|
61
|
-
`EADDRINUSE` and its client attaches to the winner.
|
|
62
|
-
- After a successful `listen`, and only with `--register`, the daemon atomically
|
|
63
|
-
writes `~/.senpi/agent/neo-daemon/<cwd-key>.json` (temp file + `rename`, mode
|
|
64
|
-
`0600`) as the LAST listen step. `<cwd-key>` uses the same safe-path scheme as
|
|
65
|
-
the session manager. Clients NEVER write the registry.
|
|
66
|
-
- On spawn, a stale record (dead pid) and its leftover socket file are cleaned up
|
|
67
|
-
before binding.
|
|
68
|
-
|
|
69
|
-
### Connection lifecycle
|
|
70
|
-
|
|
71
|
-
There is no live-reattach lease. A socket disconnect aborts that connection's
|
|
72
|
-
in-flight turn and disposes its worker. Sessions persist incrementally to disk,
|
|
73
|
-
so recovery is resume-from-file (the Go client reloads via `get_state` +
|
|
74
|
-
`get_entries{since}`). The daemon shuts down after a configurable no-connection
|
|
75
|
-
idle period (`neoDaemon.idleShutdownMs` setting, default 30 minutes; `0`
|
|
76
|
-
disables). The last client does NOT kill the daemon — the idle timer owns
|
|
77
|
-
lifecycle.
|
|
78
|
-
|
|
79
|
-
## Project-trust semantics in the daemon
|
|
80
|
-
|
|
81
|
-
Each worker runs `--mode rpc`, which is **non-interactive**. In rpc mode the
|
|
82
|
-
project-trust context has `hasUI: false`, so `resolveProjectTrusted` returns
|
|
83
|
-
`false` for project-local resources unless:
|
|
84
|
-
|
|
85
|
-
- the global `defaultProjectTrust` setting is `"always"`, or
|
|
86
|
-
- the connection passes `--approve` (`projectTrustOverride: true`) in its
|
|
87
|
-
`runtimeOptions`.
|
|
88
|
-
|
|
89
|
-
This is the same behavior as classic `senpi --mode rpc` today (the daemon adds no
|
|
90
|
-
new trust surface). The classic **interactive** TUI prompts for trust; the neo
|
|
91
|
-
client is responsible for surfacing an equivalent confirm through the
|
|
92
|
-
extension-UI bridge and forwarding the user's choice as `--approve`/`--no-approve`
|
|
93
|
-
(wired in plan task 13). No project-local code is trusted implicitly by the
|
|
94
|
-
daemon.
|
|
95
|
-
|
|
96
|
-
## cwd-threading audit (per-user-daemon safety)
|
|
97
|
-
|
|
98
|
-
Verdict: **per-cwd, child-per-connection is safe** with respect to cwd.
|
|
99
|
-
|
|
100
|
-
- There are **zero** `process.chdir()` calls in `packages/coding-agent/src`.
|
|
101
|
-
- Tool execution is closure-captured: each tool is created with an explicit
|
|
102
|
-
`cwd` (from `AgentSession.config.cwd`) and threads it to every spawn/path call.
|
|
103
|
-
The bash tool passes `cwd` explicitly to `spawn(...)`; it never inherits
|
|
104
|
-
`process.cwd()`.
|
|
105
|
-
- `resolvePath()` / `SessionManager` fall back to `process.cwd()` only as a
|
|
106
|
-
default when no explicit base/cwd is given; the runtime path always passes one.
|
|
107
|
-
- Because each connection is its own child process spawned with an explicit
|
|
108
|
-
`cwd`, the child's `process.cwd()` is already the client's directory, so even
|
|
109
|
-
the fallback paths resolve correctly. No cross-connection cwd hazard remains.
|
|
110
|
-
|
|
111
|
-
Per-cwd remains the default regardless (one daemon serves one cwd).
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import type { KernelToHostMessage } from "../bridge/protocol.ts";
|
|
2
|
-
import type { AgentExecuteTool } from "../bridges/agent-bridge.ts";
|
|
3
|
-
import { JavaScriptKernel } from "../kernels/js/context-manager.ts";
|
|
4
|
-
import { marshalToolResult } from "../tool/image.ts";
|
|
5
|
-
|
|
6
|
-
const MAX_ACTIVE_CELLS = 4;
|
|
7
|
-
const MAX_PENDING_OUTPUT_CHARS = 100_000;
|
|
8
|
-
const MAX_TERMINAL_ERROR_CHARS = 4_096;
|
|
9
|
-
const RECURSIVE_TOOLS = new Set(["eval", "exec", "wait"]);
|
|
10
|
-
|
|
11
|
-
export type CodeModeCellState = "yielded" | "result" | "terminated" | "error" | "missing";
|
|
12
|
-
|
|
13
|
-
export interface CodeModeObservation {
|
|
14
|
-
readonly cellId: string;
|
|
15
|
-
readonly state: CodeModeCellState;
|
|
16
|
-
readonly output: string;
|
|
17
|
-
readonly error?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface CodeModeRuntimeOptions {
|
|
21
|
-
readonly sessionId: string;
|
|
22
|
-
readonly cwd: string;
|
|
23
|
-
readonly parallelPoolWidth: number;
|
|
24
|
-
readonly executeTool: AgentExecuteTool;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class CodeModeCapacityError extends Error {
|
|
28
|
-
readonly name = "CodeModeCapacityError";
|
|
29
|
-
|
|
30
|
-
constructor() {
|
|
31
|
-
super(`Code Mode supports at most ${MAX_ACTIVE_CELLS} active cells`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class CodeModeSessionRuntime {
|
|
36
|
-
readonly #options: CodeModeRuntimeOptions;
|
|
37
|
-
readonly #cells = new Map<string, CodeModeCell>();
|
|
38
|
-
#nextCell = 0;
|
|
39
|
-
#disposed = false;
|
|
40
|
-
|
|
41
|
-
constructor(options: CodeModeRuntimeOptions) {
|
|
42
|
-
this.#options = options;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async execute(code: string, yieldTimeMs: number, signal: AbortSignal | undefined): Promise<CodeModeObservation> {
|
|
46
|
-
this.#assertActive();
|
|
47
|
-
const cellId = `exec-${++this.#nextCell}`;
|
|
48
|
-
if (signal?.aborted) return { cellId, state: "terminated", output: "" };
|
|
49
|
-
if (this.#cells.size >= MAX_ACTIVE_CELLS) throw new CodeModeCapacityError();
|
|
50
|
-
const cell = new CodeModeCell(cellId, this.#options);
|
|
51
|
-
this.#cells.set(cellId, cell);
|
|
52
|
-
cell.start(code);
|
|
53
|
-
const observation = await cell.observe(yieldTimeMs, signal);
|
|
54
|
-
this.#releaseIfTerminal(observation);
|
|
55
|
-
return observation;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async wait(
|
|
59
|
-
cellId: string,
|
|
60
|
-
yieldTimeMs: number,
|
|
61
|
-
terminate: boolean,
|
|
62
|
-
signal: AbortSignal | undefined,
|
|
63
|
-
): Promise<CodeModeObservation> {
|
|
64
|
-
const cell = this.#cells.get(cellId);
|
|
65
|
-
if (cell === undefined) return { cellId, state: "missing", output: "" };
|
|
66
|
-
const observation = terminate ? await cell.terminate() : await cell.observe(yieldTimeMs, signal);
|
|
67
|
-
this.#releaseIfTerminal(observation);
|
|
68
|
-
return observation;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async dispose(): Promise<void> {
|
|
72
|
-
if (this.#disposed) return;
|
|
73
|
-
this.#disposed = true;
|
|
74
|
-
const cells = [...this.#cells.values()];
|
|
75
|
-
this.#cells.clear();
|
|
76
|
-
await Promise.all(cells.map((cell) => cell.terminate()));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
#releaseIfTerminal(observation: CodeModeObservation): void {
|
|
80
|
-
if (observation.state !== "yielded") this.#cells.delete(observation.cellId);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
#assertActive(): void {
|
|
84
|
-
if (this.#disposed) throw new Error("Code Mode session has been disposed");
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
class CodeModeCell {
|
|
89
|
-
readonly #id: string;
|
|
90
|
-
readonly #options: CodeModeRuntimeOptions;
|
|
91
|
-
readonly #kernel: JavaScriptKernel;
|
|
92
|
-
readonly #abort = new AbortController();
|
|
93
|
-
#output = "";
|
|
94
|
-
#outputTruncated = false;
|
|
95
|
-
#completion: Promise<void> | undefined;
|
|
96
|
-
#state: "running" | "result" | "terminated" | "error" = "running";
|
|
97
|
-
#error: string | undefined;
|
|
98
|
-
|
|
99
|
-
constructor(id: string, options: CodeModeRuntimeOptions) {
|
|
100
|
-
this.#id = id;
|
|
101
|
-
this.#options = options;
|
|
102
|
-
this.#kernel = new JavaScriptKernel({
|
|
103
|
-
sessionId: `${options.sessionId}:${id}`,
|
|
104
|
-
cwd: options.cwd,
|
|
105
|
-
parallelPoolWidth: options.parallelPoolWidth,
|
|
106
|
-
onMessage: (message) => this.#handleMessage(message),
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
start(code: string): void {
|
|
111
|
-
this.#completion = this.#kernel
|
|
112
|
-
.run({ cellId: this.#id, code })
|
|
113
|
-
.then((result) => {
|
|
114
|
-
if (this.#state !== "running") return;
|
|
115
|
-
if (result.ok) {
|
|
116
|
-
this.#state = "result";
|
|
117
|
-
if (result.valueRepr) this.#appendOutput(`${result.valueRepr}\n`);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
this.#state = "error";
|
|
121
|
-
this.#error = truncateTerminalError(result.error.message);
|
|
122
|
-
})
|
|
123
|
-
.catch((error: unknown) => {
|
|
124
|
-
if (this.#state !== "running") return;
|
|
125
|
-
this.#state = "error";
|
|
126
|
-
this.#error = truncateTerminalError(error instanceof Error ? error.message : String(error));
|
|
127
|
-
})
|
|
128
|
-
.finally(async () => {
|
|
129
|
-
if (this.#state !== "running") await this.#kernel.close();
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async observe(yieldTimeMs: number, signal: AbortSignal | undefined): Promise<CodeModeObservation> {
|
|
134
|
-
if (signal?.aborted) return await this.terminate();
|
|
135
|
-
if (this.#state !== "running") return this.#observation();
|
|
136
|
-
const completion = this.#completion;
|
|
137
|
-
if (completion === undefined) throw new Error("Code Mode cell has not started");
|
|
138
|
-
const timeout = Math.max(1, Math.trunc(yieldTimeMs));
|
|
139
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
140
|
-
let abortListener: (() => void) | undefined;
|
|
141
|
-
const timedOut = new Promise<"yielded">((resolve) => {
|
|
142
|
-
timer = setTimeout(() => resolve("yielded"), timeout);
|
|
143
|
-
});
|
|
144
|
-
const completed = completion.then(() => "completed" as const);
|
|
145
|
-
const aborted = new Promise<"aborted">((resolve) => {
|
|
146
|
-
if (!signal) return;
|
|
147
|
-
abortListener = () => resolve("aborted");
|
|
148
|
-
signal.addEventListener("abort", abortListener, { once: true });
|
|
149
|
-
});
|
|
150
|
-
try {
|
|
151
|
-
const outcome = await Promise.race([completed, timedOut, aborted]);
|
|
152
|
-
if (outcome === "aborted") return await this.terminate();
|
|
153
|
-
return this.#observation();
|
|
154
|
-
} finally {
|
|
155
|
-
if (timer !== undefined) clearTimeout(timer);
|
|
156
|
-
if (abortListener && signal) signal.removeEventListener("abort", abortListener);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async terminate(): Promise<CodeModeObservation> {
|
|
161
|
-
if (this.#state === "terminated") return this.#observation();
|
|
162
|
-
if (this.#state === "result" || this.#state === "error") return this.#observation();
|
|
163
|
-
this.#state = "terminated";
|
|
164
|
-
this.#abort.abort(new Error("Code Mode cell terminated"));
|
|
165
|
-
try {
|
|
166
|
-
await this.#kernel.interrupt("Code Mode cell terminated");
|
|
167
|
-
} finally {
|
|
168
|
-
await this.#kernel.close();
|
|
169
|
-
}
|
|
170
|
-
return this.#observation();
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
#handleMessage(message: KernelToHostMessage): void {
|
|
174
|
-
if (message.type === "text") {
|
|
175
|
-
this.#appendOutput(message.data);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
if (message.type === "display") {
|
|
179
|
-
this.#appendOutput(`[display ${message.mimeType}]\n`);
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (message.type === "tool-call") void this.#invokeTool(message);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async #invokeTool(message: Extract<KernelToHostMessage, { type: "tool-call" }>): Promise<void> {
|
|
186
|
-
if (RECURSIVE_TOOLS.has(message.toolName)) {
|
|
187
|
-
this.#kernel.deliverToolReply({
|
|
188
|
-
type: "tool-reply",
|
|
189
|
-
callId: message.callId,
|
|
190
|
-
ok: false,
|
|
191
|
-
error: { message: `recursive Code Mode tool "${message.toolName}" is not allowed` },
|
|
192
|
-
});
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (this.#options.executeTool.isToolAvailable?.(message.toolName) === false) {
|
|
196
|
-
this.#kernel.deliverToolReply({
|
|
197
|
-
type: "tool-reply",
|
|
198
|
-
callId: message.callId,
|
|
199
|
-
ok: false,
|
|
200
|
-
error: { message: `nested tool "${message.toolName}" is not active` },
|
|
201
|
-
});
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
try {
|
|
205
|
-
const result = await this.#options.executeTool(message.toolName, message.args, { signal: this.#abort.signal });
|
|
206
|
-
this.#kernel.deliverToolReply({
|
|
207
|
-
type: "tool-reply",
|
|
208
|
-
callId: message.callId,
|
|
209
|
-
ok: true,
|
|
210
|
-
value: marshalToolResult(result),
|
|
211
|
-
});
|
|
212
|
-
} catch (error) {
|
|
213
|
-
this.#kernel.deliverToolReply({
|
|
214
|
-
type: "tool-reply",
|
|
215
|
-
callId: message.callId,
|
|
216
|
-
ok: false,
|
|
217
|
-
error: { message: error instanceof Error ? error.message : String(error) },
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
#observation(): CodeModeObservation {
|
|
223
|
-
let output = this.#output;
|
|
224
|
-
this.#output = "";
|
|
225
|
-
if (this.#outputTruncated) {
|
|
226
|
-
output += "\n[output truncated]\n";
|
|
227
|
-
this.#outputTruncated = false;
|
|
228
|
-
}
|
|
229
|
-
if (this.#state === "running") return { cellId: this.#id, state: "yielded", output };
|
|
230
|
-
if (this.#state === "terminated") return { cellId: this.#id, state: "terminated", output };
|
|
231
|
-
if (this.#state === "error") {
|
|
232
|
-
const error = this.#error ?? "Code Mode cell failed";
|
|
233
|
-
if (output !== "") output += output.endsWith("\n") ? error : `\n${error}`;
|
|
234
|
-
else output = error;
|
|
235
|
-
return { cellId: this.#id, state: "error", output, error };
|
|
236
|
-
}
|
|
237
|
-
return { cellId: this.#id, state: "result", output };
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
#appendOutput(value: string): void {
|
|
241
|
-
const remaining = MAX_PENDING_OUTPUT_CHARS - this.#output.length;
|
|
242
|
-
if (remaining <= 0) {
|
|
243
|
-
this.#outputTruncated = true;
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
if (value.length > remaining) {
|
|
247
|
-
this.#output += value.slice(0, remaining);
|
|
248
|
-
this.#outputTruncated = true;
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
this.#output += value;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
function truncateTerminalError(message: string): string {
|
|
256
|
-
if (message.length <= MAX_TERMINAL_ERROR_CHARS) return message;
|
|
257
|
-
return `${message.slice(0, MAX_TERMINAL_ERROR_CHARS)}\n[error truncated]`;
|
|
258
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import type { AgentToolResult, ToolDefinition } from "@code-yeongyu/senpi";
|
|
2
|
-
import { type Static, Type } from "typebox";
|
|
3
|
-
import type { CodeModeCellState, CodeModeObservation, CodeModeSessionRuntime } from "./runtime.ts";
|
|
4
|
-
|
|
5
|
-
const DEFAULT_YIELD_TIME_MS = 10_000;
|
|
6
|
-
|
|
7
|
-
const execInputSchema = Type.Object({
|
|
8
|
-
code: Type.String({ minLength: 1, description: "JavaScript program to execute in a dedicated Code Mode cell." }),
|
|
9
|
-
yield_time_ms: Type.Optional(
|
|
10
|
-
Type.Integer({ minimum: 1, maximum: 60_000, description: "Return a yielded cell after this many milliseconds." }),
|
|
11
|
-
),
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const waitInputSchema = Type.Object({
|
|
15
|
-
cell_id: Type.String({ minLength: 1, description: "Code Mode cell id returned by exec." }),
|
|
16
|
-
yield_time_ms: Type.Optional(
|
|
17
|
-
Type.Integer({ minimum: 1, maximum: 60_000, description: "Return again after this many milliseconds." }),
|
|
18
|
-
),
|
|
19
|
-
terminate: Type.Optional(Type.Boolean({ description: "Interrupt and close the cell instead of waiting." })),
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
type ExecInput = Static<typeof execInputSchema>;
|
|
23
|
-
type WaitInput = Static<typeof waitInputSchema>;
|
|
24
|
-
|
|
25
|
-
export interface CodeModeToolDetails {
|
|
26
|
-
readonly cellId: string;
|
|
27
|
-
readonly state: CodeModeCellState;
|
|
28
|
-
readonly isError?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export type CodeModeTool =
|
|
32
|
-
| ToolDefinition<typeof execInputSchema, CodeModeToolDetails>
|
|
33
|
-
| ToolDefinition<typeof waitInputSchema, CodeModeToolDetails>;
|
|
34
|
-
|
|
35
|
-
export interface CreateCodeModeToolsOptions {
|
|
36
|
-
readonly runtime: CodeModeSessionRuntime;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function createCodeModeTools(options: CreateCodeModeToolsOptions): {
|
|
40
|
-
readonly exec: ToolDefinition<typeof execInputSchema, CodeModeToolDetails>;
|
|
41
|
-
readonly wait: ToolDefinition<typeof waitInputSchema, CodeModeToolDetails>;
|
|
42
|
-
} {
|
|
43
|
-
return {
|
|
44
|
-
exec: {
|
|
45
|
-
name: "exec",
|
|
46
|
-
label: "GPT Code Mode Exec",
|
|
47
|
-
description:
|
|
48
|
-
"Run JavaScript in a dedicated GPT Code Mode cell. Call active Senpi tools as `tools.<name>(args)`. " +
|
|
49
|
-
"If the cell yields, call wait with its cell_id.",
|
|
50
|
-
promptSnippet: "Execute JavaScript that composes active tools in a dedicated Code Mode cell.",
|
|
51
|
-
promptGuidelines: [
|
|
52
|
-
"Use exec for bounded JavaScript composition of active tools; use eval for persistent multi-language analysis.",
|
|
53
|
-
"Call wait only when exec reports a yielded cell, and terminate abandoned cells with wait({ cell_id, terminate: true }).",
|
|
54
|
-
],
|
|
55
|
-
parameters: execInputSchema,
|
|
56
|
-
executionMode: "sequential",
|
|
57
|
-
async execute(_toolCallId, params: ExecInput, signal) {
|
|
58
|
-
return resultFrom(
|
|
59
|
-
await options.runtime.execute(params.code, params.yield_time_ms ?? DEFAULT_YIELD_TIME_MS, signal),
|
|
60
|
-
);
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
wait: {
|
|
64
|
-
name: "wait",
|
|
65
|
-
label: "GPT Code Mode Wait",
|
|
66
|
-
description: "Observe a yielded GPT Code Mode cell or terminate it.",
|
|
67
|
-
promptSnippet: "Wait for, or terminate, a yielded GPT Code Mode cell.",
|
|
68
|
-
parameters: waitInputSchema,
|
|
69
|
-
executionMode: "sequential",
|
|
70
|
-
async execute(_toolCallId, params: WaitInput, signal) {
|
|
71
|
-
return resultFrom(
|
|
72
|
-
await options.runtime.wait(
|
|
73
|
-
params.cell_id,
|
|
74
|
-
params.yield_time_ms ?? DEFAULT_YIELD_TIME_MS,
|
|
75
|
-
params.terminate ?? false,
|
|
76
|
-
signal,
|
|
77
|
-
),
|
|
78
|
-
);
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function resultFrom(observation: CodeModeObservation): AgentToolResult<CodeModeToolDetails> {
|
|
85
|
-
const text =
|
|
86
|
-
observation.output ||
|
|
87
|
-
(observation.state === "yielded"
|
|
88
|
-
? `Code Mode cell ${observation.cellId} is still running. Call wait with this cell_id.`
|
|
89
|
-
: observation.state === "missing"
|
|
90
|
-
? `Code Mode cell ${observation.cellId} does not exist.`
|
|
91
|
-
: observation.state === "terminated"
|
|
92
|
-
? `Code Mode cell ${observation.cellId} was terminated.`
|
|
93
|
-
: (observation.error ?? `Code Mode cell ${observation.cellId} completed.`));
|
|
94
|
-
return {
|
|
95
|
-
content: [{ type: "text", text }],
|
|
96
|
-
details: {
|
|
97
|
-
cellId: observation.cellId,
|
|
98
|
-
state: observation.state,
|
|
99
|
-
...(observation.state === "error" || observation.state === "missing" ? { isError: true } : {}),
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function isGptCodeModeModel(modelId: string | undefined): boolean {
|
|
105
|
-
return modelId !== undefined && /(^|[/.:])gpt[-.]/iu.test(modelId);
|
|
106
|
-
}
|