@getpaseo/server 0.1.62 → 0.1.63
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/README.md +4 -0
- package/dist/server/client/daemon-client-runtime-metrics.d.ts +6 -6
- package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -1
- package/dist/server/client/daemon-client-transport-types.d.ts +13 -13
- package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts +1 -1
- package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -1
- package/dist/server/client/daemon-client-websocket-transport.js +5 -4
- package/dist/server/client/daemon-client-websocket-transport.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +59 -37
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +62 -17
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-loading.d.ts.map +1 -1
- package/dist/server/server/agent/agent-loading.js +5 -3
- package/dist/server/server/agent/agent-loading.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +45 -19
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +393 -290
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts +6 -6
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +46 -38
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
- package/dist/server/server/agent/agent-projections.d.ts +4 -6
- package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
- package/dist/server/server/agent/agent-projections.js +59 -65
- package/dist/server/server/agent/agent-projections.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts +4 -4
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +58 -45
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +43 -40
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
- package/dist/server/server/agent/agent-storage.d.ts +2 -2
- package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
- package/dist/server/server/agent/agent-storage.js +29 -36
- package/dist/server/server/agent/agent-storage.js.map +1 -1
- package/dist/server/server/agent/agent-stream-coalescer.d.ts +6 -6
- package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store-types.d.ts +10 -10
- package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.d.ts +2 -2
- package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -1
- package/dist/server/server/agent/agent-timeline-store.js +85 -64
- package/dist/server/server/agent/agent-timeline-store.js.map +1 -1
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +185 -148
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +9 -2
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-shared.js +2 -0
- package/dist/server/server/agent/mcp-shared.js.map +1 -1
- package/dist/server/server/agent/model-resolver.d.ts +2 -2
- package/dist/server/server/agent/model-resolver.d.ts.map +1 -1
- package/dist/server/server/agent/model-resolver.js +9 -5
- package/dist/server/server/agent/model-resolver.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +28 -17
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +20 -9
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts +4 -2
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +24 -21
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +6 -5
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +40 -31
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.d.ts +11 -12
- package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/acp-agent.js +148 -122
- package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +2 -0
- package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js +47 -45
- package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +10 -5
- package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +11 -2
- package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js +20 -13
- package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts +20 -8
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +610 -460
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +49 -44
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +27 -8
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +564 -492
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +2 -2
- package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-rollout-timeline.js +58 -47
- package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +3 -3
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -1
- package/dist/server/server/agent/providers/diagnostic-utils.js +82 -9
- package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.d.ts +2 -2
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +385 -360
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -0
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +109 -140
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +3 -1
- package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +3 -3
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js +102 -73
- package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +2 -2
- package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.d.ts.map +1 -1
- package/dist/server/server/agent/stt-manager.js +63 -53
- package/dist/server/server/agent/stt-manager.js.map +1 -1
- package/dist/server/server/agent/timeline-projection.d.ts +6 -6
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +11 -6
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/agent/tts-manager.d.ts.map +1 -1
- package/dist/server/server/agent/tts-manager.js +1 -0
- package/dist/server/server/agent/tts-manager.js.map +1 -1
- package/dist/server/server/agent-attention-policy.d.ts +2 -2
- package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
- package/dist/server/server/bootstrap.d.ts +4 -4
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +493 -485
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/chat/chat-service.d.ts +1 -1
- package/dist/server/server/chat/chat-service.d.ts.map +1 -1
- package/dist/server/server/chat/chat-service.js +3 -3
- package/dist/server/server/chat/chat-service.js.map +1 -1
- package/dist/server/server/checkout-diff-manager.d.ts +2 -2
- package/dist/server/server/checkout-diff-manager.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.d.ts +5 -3
- package/dist/server/server/checkout-git-utils.d.ts.map +1 -1
- package/dist/server/server/checkout-git-utils.js +1 -2
- package/dist/server/server/checkout-git-utils.js.map +1 -1
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +68 -39
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/connection-offer.d.ts +2 -2
- package/dist/server/server/connection-offer.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.d.ts +5 -3
- package/dist/server/server/daemon-config-store.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.js +26 -0
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/daemon-keypair.d.ts +2 -2
- package/dist/server/server/daemon-keypair.d.ts.map +1 -1
- package/dist/server/server/editor-targets.d.ts +4 -4
- package/dist/server/server/editor-targets.d.ts.map +1 -1
- package/dist/server/server/editor-targets.js +11 -15
- package/dist/server/server/editor-targets.js.map +1 -1
- package/dist/server/server/exports.d.ts +3 -3
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -3
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/file-download/token-store.d.ts +4 -4
- package/dist/server/server/file-download/token-store.d.ts.map +1 -1
- package/dist/server/server/index.js +16 -12
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/logger.d.ts +4 -4
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +26 -20
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +52 -52
- package/dist/server/server/loop-service.d.ts +13 -12
- package/dist/server/server/loop-service.d.ts.map +1 -1
- package/dist/server/server/loop-service.js +22 -18
- package/dist/server/server/loop-service.js.map +1 -1
- package/dist/server/server/package-version.d.ts +2 -2
- package/dist/server/server/package-version.d.ts.map +1 -1
- package/dist/server/server/package-version.js +19 -17
- package/dist/server/server/package-version.js.map +1 -1
- package/dist/server/server/pairing-offer.d.ts +2 -2
- package/dist/server/server/pairing-offer.d.ts.map +1 -1
- package/dist/server/server/paseo-env.d.ts +9 -0
- package/dist/server/server/paseo-env.d.ts.map +1 -0
- package/dist/server/server/paseo-env.js +70 -0
- package/dist/server/server/paseo-env.js.map +1 -0
- package/dist/server/server/paseo-worktree-archive-service.d.ts +4 -4
- package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-archive-service.js +11 -11
- package/dist/server/server/paseo-worktree-archive-service.js.map +1 -1
- package/dist/server/server/persisted-config.d.ts +62 -62
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +4 -4
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/persistence-hooks.d.ts +8 -9
- package/dist/server/server/persistence-hooks.d.ts.map +1 -1
- package/dist/server/server/persistence-hooks.js +4 -12
- package/dist/server/server/persistence-hooks.js.map +1 -1
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/push/push-service.d.ts.map +1 -1
- package/dist/server/server/push/push-service.js +1 -3
- package/dist/server/server/push/push-service.js.map +1 -1
- package/dist/server/server/relay-transport.d.ts +8 -8
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +27 -16
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +2 -2
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/script-health-monitor.d.ts.map +1 -1
- package/dist/server/server/script-health-monitor.js +7 -6
- package/dist/server/server/script-health-monitor.js.map +1 -1
- package/dist/server/server/script-proxy.js +1 -1
- package/dist/server/server/script-proxy.js.map +1 -1
- package/dist/server/server/script-status-projection.d.ts +4 -4
- package/dist/server/server/script-status-projection.d.ts.map +1 -1
- package/dist/server/server/script-status-projection.js +54 -44
- package/dist/server/server/script-status-projection.js.map +1 -1
- package/dist/server/server/server-id.d.ts +4 -4
- package/dist/server/server/server-id.d.ts.map +1 -1
- package/dist/server/server/session.d.ts +45 -14
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +1098 -761
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/audio.js +1 -1
- package/dist/server/server/speech/audio.js.map +1 -1
- package/dist/server/server/speech/providers/local/config.d.ts +6 -6
- package/dist/server/server/speech/providers/local/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/config.js +41 -16
- package/dist/server/server/speech/providers/local/config.js.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +2 -2
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +42 -19
- package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/runtime.js +108 -77
- package/dist/server/server/speech/providers/local/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +1 -4
- package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +19 -19
- package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +28 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +23 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +35 -28
- package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +5 -5
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +7 -7
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +5 -0
- package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +3 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +10 -4
- package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +4 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +2 -2
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +18 -11
- package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -1
- package/dist/server/server/speech/providers/openai/config.d.ts +2 -2
- package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/config.js +58 -31
- package/dist/server/server/speech/providers/openai/config.js.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +2 -2
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.d.ts +4 -4
- package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/runtime.js +37 -32
- package/dist/server/server/speech/providers/openai/runtime.js.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/stt.js +4 -3
- package/dist/server/server/speech/providers/openai/stt.js.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -1
- package/dist/server/server/speech/providers/openai/tts.js +3 -2
- package/dist/server/server/speech/providers/openai/tts.js.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -1
- package/dist/server/server/speech/speech-config-resolver.js +46 -17
- package/dist/server/server/speech/speech-config-resolver.js.map +1 -1
- package/dist/server/server/speech/speech-provider.d.ts +2 -2
- package/dist/server/server/speech/speech-provider.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.d.ts +6 -6
- package/dist/server/server/speech/speech-runtime.d.ts.map +1 -1
- package/dist/server/server/speech/speech-runtime.js +17 -17
- package/dist/server/server/speech/speech-runtime.js.map +1 -1
- package/dist/server/server/speech/speech-types.d.ts +2 -2
- package/dist/server/server/speech/speech-types.d.ts.map +1 -1
- package/dist/server/server/speech/turn-detection-provider.d.ts +2 -2
- package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.d.ts +0 -3
- package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -1
- package/dist/server/server/utils/diff-highlighter.js +67 -66
- package/dist/server/server/utils/diff-highlighter.js.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -1
- package/dist/server/server/voice/voice-turn-controller.js +1 -0
- package/dist/server/server/voice/voice-turn-controller.js.map +1 -1
- package/dist/server/server/voice-types.d.ts +2 -2
- package/dist/server/server/voice-types.d.ts.map +1 -1
- package/dist/server/server/websocket-server.d.ts +31 -21
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +299 -197
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-git-metadata.d.ts +2 -2
- package/dist/server/server/workspace-git-metadata.d.ts.map +1 -1
- package/dist/server/server/workspace-git-metadata.js +2 -32
- package/dist/server/server/workspace-git-metadata.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +8 -4
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +163 -115
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.d.ts +5 -4
- package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
- package/dist/server/server/workspace-reconciliation-service.js +82 -82
- package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-bootstrap.js +40 -33
- package/dist/server/server/workspace-registry-bootstrap.js.map +1 -1
- package/dist/server/server/workspace-registry-model.d.ts +19 -6
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-model.js +35 -21
- package/dist/server/server/workspace-registry-model.js.map +1 -1
- package/dist/server/server/workspace-registry.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts +2 -2
- package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -1
- package/dist/server/server/workspace-service-env.js +3 -3
- package/dist/server/server/workspace-service-env.js.map +1 -1
- package/dist/server/server/worktree-bootstrap.d.ts +4 -4
- package/dist/server/server/worktree-bootstrap.d.ts.map +1 -1
- package/dist/server/server/worktree-bootstrap.js +95 -67
- package/dist/server/server/worktree-bootstrap.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts +8 -8
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +27 -19
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/services/github-service.d.ts +1 -7
- package/dist/server/services/github-service.d.ts.map +1 -1
- package/dist/server/services/github-service.js +123 -143
- package/dist/server/services/github-service.js.map +1 -1
- package/dist/server/shared/agent-attention-notification.d.ts +9 -8
- package/dist/server/shared/agent-attention-notification.d.ts.map +1 -1
- package/dist/server/shared/agent-attention-notification.js +27 -17
- package/dist/server/shared/agent-attention-notification.js.map +1 -1
- package/dist/server/shared/daemon-endpoints.d.ts +2 -2
- package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
- package/dist/server/shared/daemon-endpoints.js +17 -2
- package/dist/server/shared/daemon-endpoints.js.map +1 -1
- package/dist/server/shared/messages.d.ts +21962 -3049
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +79 -2
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/terminal-stream-protocol.d.ts +2 -2
- package/dist/server/shared/terminal-stream-protocol.d.ts.map +1 -1
- package/dist/server/shared/tool-call-display.d.ts +2 -2
- package/dist/server/shared/tool-call-display.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.d.ts.map +1 -1
- package/dist/server/terminal/terminal-manager.js +1 -3
- package/dist/server/terminal/terminal-manager.js.map +1 -1
- package/dist/server/terminal/terminal-output-coalescer.d.ts +6 -6
- package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -1
- package/dist/server/terminal/terminal.d.ts +3 -2
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +57 -19
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts +13 -12
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +351 -281
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.js +12 -33
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/server/utils/executable.d.ts +1 -14
- package/dist/server/utils/executable.d.ts.map +1 -1
- package/dist/server/utils/executable.js +13 -49
- package/dist/server/utils/executable.js.map +1 -1
- package/dist/server/utils/github-remote.d.ts +13 -0
- package/dist/server/utils/github-remote.d.ts.map +1 -0
- package/dist/server/utils/github-remote.js +128 -0
- package/dist/server/utils/github-remote.js.map +1 -0
- package/dist/server/utils/paseo-config-file.d.ts +30 -0
- package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-file.js +90 -0
- package/dist/server/utils/paseo-config-file.js.map +1 -0
- package/dist/server/utils/paseo-config-schema.d.ts +290 -0
- package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
- package/dist/server/utils/paseo-config-schema.js +60 -0
- package/dist/server/utils/paseo-config-schema.js.map +1 -0
- package/dist/server/utils/project-icon.d.ts.map +1 -1
- package/dist/server/utils/project-icon.js +84 -109
- package/dist/server/utils/project-icon.js.map +1 -1
- package/dist/server/utils/promise-timeout.d.ts +2 -2
- package/dist/server/utils/promise-timeout.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.d.ts +3 -1
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +10 -1
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/server/utils/script-hostname.d.ts +2 -2
- package/dist/server/utils/script-hostname.d.ts.map +1 -1
- package/dist/server/utils/spawn.d.ts +10 -3
- package/dist/server/utils/spawn.d.ts.map +1 -1
- package/dist/server/utils/spawn.js +30 -5
- package/dist/server/utils/spawn.js.map +1 -1
- package/dist/server/utils/windows-command.d.ts +15 -0
- package/dist/server/utils/windows-command.d.ts.map +1 -0
- package/dist/server/utils/windows-command.js +37 -0
- package/dist/server/utils/windows-command.js.map +1 -0
- package/dist/server/utils/worktree.d.ts +10 -7
- package/dist/server/utils/worktree.d.ts.map +1 -1
- package/dist/server/utils/worktree.js +64 -55
- package/dist/server/utils/worktree.js.map +1 -1
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +15 -20
- package/dist/server/server/agent/llm-openai.d.ts +0 -7
- package/dist/server/server/agent/llm-openai.d.ts.map +0 -1
- package/dist/server/server/agent/llm-openai.js +0 -8
- package/dist/server/server/agent/llm-openai.js.map +0 -1
- package/dist/server/server/agent/orchestrator.d.ts +0 -12
- package/dist/server/server/agent/orchestrator.d.ts.map +0 -1
- package/dist/server/server/agent/orchestrator.js +0 -12
- package/dist/server/server/agent/orchestrator.js.map +0 -1
- package/dist/server/server/types.d.ts +0 -5
- package/dist/server/server/types.d.ts.map +0 -1
- package/dist/server/server/types.js +0 -3
- package/dist/server/server/types.js.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.d.ts +0 -37
- package/dist/server/server/workspace-registry.test-helpers.d.ts.map +0 -1
- package/dist/server/server/workspace-registry.test-helpers.js +0 -121
- package/dist/server/server/workspace-registry.test-helpers.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import { createOpencodeClient, } from "@opencode-ai/sdk/v2/client";
|
|
3
3
|
import net from "node:net";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
5
|
+
import { createProviderEnvSpec, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
|
|
6
6
|
import { findExecutable, isCommandAvailable } from "../../../utils/executable.js";
|
|
7
7
|
import { withTimeout } from "../../../utils/promise-timeout.js";
|
|
8
8
|
import { spawnProcess } from "../../../utils/spawn.js";
|
|
@@ -140,20 +140,18 @@ function toOpenCodeMcpConfig(config) {
|
|
|
140
140
|
enabled: true,
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
|
-
function
|
|
144
|
-
if (
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
function toTerminalTurnEvent(event) {
|
|
144
|
+
if (event.type === "turn_failed") {
|
|
145
|
+
return {
|
|
146
|
+
type: "turn_failed",
|
|
147
|
+
provider: "opencode",
|
|
148
|
+
error: toDiagnosticErrorMessage(event.error),
|
|
149
|
+
};
|
|
149
150
|
}
|
|
150
|
-
|
|
151
|
-
return
|
|
151
|
+
if (event.type === "turn_completed" || event.type === "turn_canceled") {
|
|
152
|
+
return event;
|
|
152
153
|
}
|
|
153
|
-
|
|
154
|
-
function normalizeTurnFailureError(error) {
|
|
155
|
-
const normalized = stringifyUnknownError(error).trim();
|
|
156
|
-
return normalized.length > 0 ? normalized : "Unknown error";
|
|
154
|
+
return null;
|
|
157
155
|
}
|
|
158
156
|
function isOpenCodeNotFoundError(error) {
|
|
159
157
|
return (typeof error === "object" &&
|
|
@@ -171,14 +169,14 @@ async function reconcileOpenCodeSessionClose(params) {
|
|
|
171
169
|
if (response.error && !isOpenCodeNotFoundError(response.error)) {
|
|
172
170
|
logger.warn({
|
|
173
171
|
sessionId,
|
|
174
|
-
error:
|
|
172
|
+
error: toDiagnosticErrorMessage(response.error),
|
|
175
173
|
}, "Failed to abort OpenCode session during close");
|
|
176
174
|
}
|
|
177
175
|
}
|
|
178
176
|
catch (error) {
|
|
179
177
|
logger.warn({
|
|
180
178
|
sessionId,
|
|
181
|
-
error:
|
|
179
|
+
error: toDiagnosticErrorMessage(error),
|
|
182
180
|
}, "Failed to abort OpenCode session during close");
|
|
183
181
|
}
|
|
184
182
|
try {
|
|
@@ -190,14 +188,14 @@ async function reconcileOpenCodeSessionClose(params) {
|
|
|
190
188
|
if (response.error && !isOpenCodeNotFoundError(response.error)) {
|
|
191
189
|
logger.warn({
|
|
192
190
|
sessionId,
|
|
193
|
-
error:
|
|
191
|
+
error: toDiagnosticErrorMessage(response.error),
|
|
194
192
|
}, "Failed to archive OpenCode session during close");
|
|
195
193
|
}
|
|
196
194
|
}
|
|
197
195
|
catch (error) {
|
|
198
196
|
logger.warn({
|
|
199
197
|
sessionId,
|
|
200
|
-
error:
|
|
198
|
+
error: toDiagnosticErrorMessage(error),
|
|
201
199
|
}, "Failed to archive OpenCode session during close");
|
|
202
200
|
}
|
|
203
201
|
}
|
|
@@ -216,18 +214,19 @@ function isOpenCodeHeadersTimeoutFailure(error) {
|
|
|
216
214
|
if (!current) {
|
|
217
215
|
continue;
|
|
218
216
|
}
|
|
219
|
-
const normalized =
|
|
217
|
+
const normalized = toDiagnosticErrorMessage(current).trim().toLowerCase();
|
|
220
218
|
if (normalized) {
|
|
221
219
|
diagnostics.add(normalized);
|
|
222
220
|
}
|
|
223
221
|
if (typeof current === "object") {
|
|
224
222
|
const record = current;
|
|
225
223
|
for (const value of [record.message, record.code, record.name]) {
|
|
226
|
-
if (typeof value
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
224
|
+
if (typeof value !== "string") {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const diagnostic = value.trim().toLowerCase();
|
|
228
|
+
if (diagnostic) {
|
|
229
|
+
diagnostics.add(diagnostic);
|
|
231
230
|
}
|
|
232
231
|
}
|
|
233
232
|
if (record.cause) {
|
|
@@ -238,7 +237,7 @@ function isOpenCodeHeadersTimeoutFailure(error) {
|
|
|
238
237
|
return [...diagnostics].some((diagnostic) => OPENCODE_HEADERS_TIMEOUT_TOKENS.some((token) => diagnostic.includes(token)));
|
|
239
238
|
}
|
|
240
239
|
function isAlreadyPresentMcpError(error) {
|
|
241
|
-
const normalized =
|
|
240
|
+
const normalized = toDiagnosticErrorMessage(error).toLowerCase();
|
|
242
241
|
return MCP_ALREADY_PRESENT_ERROR_TOKENS.some((token) => normalized.includes(token));
|
|
243
242
|
}
|
|
244
243
|
async function findAvailablePort() {
|
|
@@ -602,16 +601,39 @@ export class OpenCodeServerManager {
|
|
|
602
601
|
return new Promise((resolve, reject) => {
|
|
603
602
|
const serverProcess = spawnProcess(launchPrefix.command, [...launchPrefix.args, "serve", "--port", String(port)], {
|
|
604
603
|
stdio: ["ignore", "pipe", "pipe"],
|
|
605
|
-
|
|
604
|
+
...createProviderEnvSpec({ runtimeSettings: this.runtimeSettings }),
|
|
606
605
|
});
|
|
607
606
|
let started = false;
|
|
607
|
+
let stderrBuffer = "";
|
|
608
|
+
let stdoutBuffer = "";
|
|
609
|
+
const STARTUP_BUFFER_CAP = 8192;
|
|
610
|
+
const appendCapped = (current, chunk) => {
|
|
611
|
+
if (current.length >= STARTUP_BUFFER_CAP) {
|
|
612
|
+
return current;
|
|
613
|
+
}
|
|
614
|
+
const remaining = STARTUP_BUFFER_CAP - current.length;
|
|
615
|
+
return current + chunk.slice(0, remaining);
|
|
616
|
+
};
|
|
617
|
+
const buildStartupErrorMessage = (headline) => {
|
|
618
|
+
const sections = [headline];
|
|
619
|
+
const stderrTrimmed = stderrBuffer.trim();
|
|
620
|
+
if (stderrTrimmed.length > 0) {
|
|
621
|
+
sections.push(`stderr: ${stderrTrimmed}`);
|
|
622
|
+
}
|
|
623
|
+
const stdoutTrimmed = stdoutBuffer.trim();
|
|
624
|
+
if (stdoutTrimmed.length > 0) {
|
|
625
|
+
sections.push(`stdout: ${stdoutTrimmed}`);
|
|
626
|
+
}
|
|
627
|
+
return sections.join("\n");
|
|
628
|
+
};
|
|
608
629
|
const timeout = setTimeout(() => {
|
|
609
630
|
if (!started) {
|
|
610
|
-
reject(new Error("OpenCode server startup timeout"));
|
|
631
|
+
reject(new Error(buildStartupErrorMessage("OpenCode server startup timeout")));
|
|
611
632
|
}
|
|
612
633
|
}, 30000);
|
|
613
634
|
serverProcess.stdout?.on("data", (data) => {
|
|
614
635
|
const output = data.toString();
|
|
636
|
+
stdoutBuffer = appendCapped(stdoutBuffer, output);
|
|
615
637
|
if (output.includes("listening on") && !started) {
|
|
616
638
|
started = true;
|
|
617
639
|
clearTimeout(timeout);
|
|
@@ -625,16 +647,19 @@ export class OpenCodeServerManager {
|
|
|
625
647
|
}
|
|
626
648
|
});
|
|
627
649
|
serverProcess.stderr?.on("data", (data) => {
|
|
628
|
-
|
|
650
|
+
const output = data.toString();
|
|
651
|
+
stderrBuffer = appendCapped(stderrBuffer, output);
|
|
652
|
+
this.logger.error({ stderr: output.trim() }, "OpenCode server stderr");
|
|
629
653
|
});
|
|
630
654
|
serverProcess.on("error", (error) => {
|
|
631
655
|
clearTimeout(timeout);
|
|
632
|
-
|
|
656
|
+
const headline = error instanceof Error ? error.message : String(error);
|
|
657
|
+
reject(new Error(buildStartupErrorMessage(headline)));
|
|
633
658
|
});
|
|
634
659
|
serverProcess.on("exit", (code) => {
|
|
635
660
|
if (!started) {
|
|
636
661
|
clearTimeout(timeout);
|
|
637
|
-
reject(new Error(`OpenCode server exited with code ${code}`));
|
|
662
|
+
reject(new Error(buildStartupErrorMessage(`OpenCode server exited with code ${code}`)));
|
|
638
663
|
}
|
|
639
664
|
if (this.currentServer?.process === serverProcess) {
|
|
640
665
|
this.currentServer = null;
|
|
@@ -652,9 +677,7 @@ export class OpenCodeServerManager {
|
|
|
652
677
|
...(this.currentServer ? [this.currentServer] : []),
|
|
653
678
|
...Array.from(this.retiredServers),
|
|
654
679
|
];
|
|
655
|
-
|
|
656
|
-
await this.killServer(server);
|
|
657
|
-
}
|
|
680
|
+
await Promise.all(servers.map((server) => this.killServer(server)));
|
|
658
681
|
this.currentServer = null;
|
|
659
682
|
this.retiredServers.clear();
|
|
660
683
|
}
|
|
@@ -671,13 +694,21 @@ export class OpenCodeServerManager {
|
|
|
671
694
|
return;
|
|
672
695
|
}
|
|
673
696
|
await new Promise((resolve) => {
|
|
697
|
+
let pendingResolve = resolve;
|
|
698
|
+
const settle = () => {
|
|
699
|
+
if (!pendingResolve)
|
|
700
|
+
return;
|
|
701
|
+
const fn = pendingResolve;
|
|
702
|
+
pendingResolve = null;
|
|
703
|
+
fn();
|
|
704
|
+
};
|
|
674
705
|
const timeout = setTimeout(() => {
|
|
675
706
|
server.process.kill("SIGKILL");
|
|
676
|
-
|
|
707
|
+
settle();
|
|
677
708
|
}, 5000);
|
|
678
709
|
server.process.on("exit", () => {
|
|
679
710
|
clearTimeout(timeout);
|
|
680
|
-
|
|
711
|
+
settle();
|
|
681
712
|
});
|
|
682
713
|
server.process.kill("SIGTERM");
|
|
683
714
|
});
|
|
@@ -839,7 +870,7 @@ export class OpenCodeAgentClient {
|
|
|
839
870
|
serverStatus = `Running (${url})`;
|
|
840
871
|
}
|
|
841
872
|
catch (error) {
|
|
842
|
-
serverStatus = `Unavailable (${
|
|
873
|
+
serverStatus = `Unavailable (${toDiagnosticErrorMessage(error)})`;
|
|
843
874
|
}
|
|
844
875
|
if (available) {
|
|
845
876
|
try {
|
|
@@ -1039,310 +1070,316 @@ export function translateOpenCodeEvent(event, state) {
|
|
|
1039
1070
|
const events = [];
|
|
1040
1071
|
switch (event.type) {
|
|
1041
1072
|
case "session.created":
|
|
1042
|
-
case "session.updated":
|
|
1043
|
-
|
|
1044
|
-
events.push({
|
|
1045
|
-
type: "thread_started",
|
|
1046
|
-
sessionId: state.sessionId,
|
|
1047
|
-
provider: "opencode",
|
|
1048
|
-
});
|
|
1049
|
-
}
|
|
1050
|
-
break;
|
|
1051
|
-
}
|
|
1052
|
-
case "message.updated": {
|
|
1053
|
-
const info = event.properties.info;
|
|
1054
|
-
if (info.sessionID !== state.sessionId) {
|
|
1055
|
-
break;
|
|
1056
|
-
}
|
|
1057
|
-
state.messageRoles.set(info.id, info.role);
|
|
1058
|
-
if (info.role === "assistant") {
|
|
1059
|
-
const modelLookupKey = resolveOpenCodeModelLookupKeyFromAssistantMessage(info);
|
|
1060
|
-
if (modelLookupKey) {
|
|
1061
|
-
const contextWindowMaxTokens = state.modelContextWindowsByModelKey?.get(modelLookupKey);
|
|
1062
|
-
if (contextWindowMaxTokens !== undefined) {
|
|
1063
|
-
state.onAssistantModelContextWindowResolved?.(contextWindowMaxTokens);
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
if (!state.emittedStructuredMessageIds.has(info.id) && info.time?.completed !== undefined) {
|
|
1067
|
-
const text = stringifyStructuredAssistantMessage(info.structured);
|
|
1068
|
-
if (text) {
|
|
1069
|
-
state.emittedStructuredMessageIds.add(info.id);
|
|
1070
|
-
events.push({
|
|
1071
|
-
type: "timeline",
|
|
1072
|
-
provider: "opencode",
|
|
1073
|
-
item: { type: "assistant_message", text },
|
|
1074
|
-
});
|
|
1075
|
-
}
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
break;
|
|
1079
|
-
}
|
|
1080
|
-
case "message.part.updated": {
|
|
1081
|
-
const part = event.properties.part;
|
|
1082
|
-
if (part.sessionID !== state.sessionId) {
|
|
1083
|
-
break;
|
|
1084
|
-
}
|
|
1085
|
-
const messageRole = state.messageRoles.get(part.messageID);
|
|
1086
|
-
state.partTypes.set(part.id, part.type);
|
|
1087
|
-
if (part.type === "text") {
|
|
1088
|
-
const partKey = resolvePartDedupeKey(part, "text");
|
|
1089
|
-
if (messageRole === "user") {
|
|
1090
|
-
break;
|
|
1091
|
-
}
|
|
1092
|
-
if (part.time?.end) {
|
|
1093
|
-
if (partKey && state.streamedPartKeys.delete(partKey)) {
|
|
1094
|
-
break;
|
|
1095
|
-
}
|
|
1096
|
-
if (part.text) {
|
|
1097
|
-
events.push({
|
|
1098
|
-
type: "timeline",
|
|
1099
|
-
provider: "opencode",
|
|
1100
|
-
item: { type: "assistant_message", text: part.text },
|
|
1101
|
-
});
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
}
|
|
1105
|
-
else if (part.type === "reasoning") {
|
|
1106
|
-
const partKey = resolvePartDedupeKey(part, "reasoning");
|
|
1107
|
-
if (part.time.end) {
|
|
1108
|
-
if (partKey && state.streamedPartKeys.delete(partKey)) {
|
|
1109
|
-
break;
|
|
1110
|
-
}
|
|
1111
|
-
if (part.text) {
|
|
1112
|
-
events.push({
|
|
1113
|
-
type: "timeline",
|
|
1114
|
-
provider: "opencode",
|
|
1115
|
-
item: { type: "reasoning", text: part.text },
|
|
1116
|
-
});
|
|
1117
|
-
}
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
else if (part.type === "tool") {
|
|
1121
|
-
const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
|
|
1122
|
-
if (parsedToolPart.success && parsedToolPart.data) {
|
|
1123
|
-
events.push({
|
|
1124
|
-
type: "timeline",
|
|
1125
|
-
provider: "opencode",
|
|
1126
|
-
item: parsedToolPart.data,
|
|
1127
|
-
});
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
else if (part.type === "compaction") {
|
|
1131
|
-
events.push({
|
|
1132
|
-
type: "timeline",
|
|
1133
|
-
provider: "opencode",
|
|
1134
|
-
item: createCompactionTimelineItem("loading", part.auto ? "auto" : "manual"),
|
|
1135
|
-
});
|
|
1136
|
-
}
|
|
1137
|
-
else if (part.type === "step-finish") {
|
|
1138
|
-
mergeOpenCodeStepFinishUsage(state.accumulatedUsage, part);
|
|
1139
|
-
if (hasNormalizedOpenCodeUsage(state.accumulatedUsage)) {
|
|
1140
|
-
events.push({
|
|
1141
|
-
type: "usage_updated",
|
|
1142
|
-
provider: "opencode",
|
|
1143
|
-
usage: { ...state.accumulatedUsage },
|
|
1144
|
-
});
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1073
|
+
case "session.updated":
|
|
1074
|
+
appendOpenCodeSessionCreatedOrUpdated(event, state, events);
|
|
1147
1075
|
break;
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
const { sessionID, messageID, partID, field, delta } = event.properties;
|
|
1151
|
-
if (sessionID !== state.sessionId) {
|
|
1152
|
-
break;
|
|
1153
|
-
}
|
|
1154
|
-
if (!delta || !field) {
|
|
1155
|
-
break;
|
|
1156
|
-
}
|
|
1157
|
-
const messageRole = messageID ? state.messageRoles.get(messageID) : undefined;
|
|
1158
|
-
const knownPartType = partID ? state.partTypes.get(partID) : undefined;
|
|
1159
|
-
const isReasoning = knownPartType === "reasoning" || field === "reasoning";
|
|
1160
|
-
if (isReasoning) {
|
|
1161
|
-
if (partID) {
|
|
1162
|
-
state.streamedPartKeys.add(`reasoning:${partID}`);
|
|
1163
|
-
}
|
|
1164
|
-
events.push({
|
|
1165
|
-
type: "timeline",
|
|
1166
|
-
provider: "opencode",
|
|
1167
|
-
item: { type: "reasoning", text: delta },
|
|
1168
|
-
});
|
|
1169
|
-
}
|
|
1170
|
-
else if (field === "text") {
|
|
1171
|
-
if (messageRole === "user") {
|
|
1172
|
-
break;
|
|
1173
|
-
}
|
|
1174
|
-
if (partID) {
|
|
1175
|
-
state.streamedPartKeys.add(`text:${partID}`);
|
|
1176
|
-
}
|
|
1177
|
-
events.push({
|
|
1178
|
-
type: "timeline",
|
|
1179
|
-
provider: "opencode",
|
|
1180
|
-
item: { type: "assistant_message", text: delta },
|
|
1181
|
-
});
|
|
1182
|
-
}
|
|
1076
|
+
case "message.updated":
|
|
1077
|
+
appendOpenCodeMessageUpdated(event, state, events);
|
|
1183
1078
|
break;
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
if (event.properties.sessionID !== state.sessionId) {
|
|
1187
|
-
break;
|
|
1188
|
-
}
|
|
1189
|
-
const metadata = readOpenCodeRecord(event.properties.metadata);
|
|
1190
|
-
const tool = readOpenCodeRecord(event.properties.tool);
|
|
1191
|
-
const patterns = Array.isArray(event.properties.patterns)
|
|
1192
|
-
? event.properties.patterns.filter((value) => typeof value === "string")
|
|
1193
|
-
: [];
|
|
1194
|
-
const command = readPermissionField(metadata, PERMISSION_COMMAND_KEYS);
|
|
1195
|
-
const cwd = readPermissionField(metadata, PERMISSION_CWD_KEYS);
|
|
1196
|
-
const reason = readPermissionField(metadata, PERMISSION_REASON_KEYS);
|
|
1197
|
-
const input = buildOpenCodePermissionInput({
|
|
1198
|
-
patterns,
|
|
1199
|
-
metadata,
|
|
1200
|
-
tool,
|
|
1201
|
-
command,
|
|
1202
|
-
});
|
|
1203
|
-
const detail = buildOpenCodePermissionDetail({
|
|
1204
|
-
permission: event.properties.permission,
|
|
1205
|
-
input,
|
|
1206
|
-
command,
|
|
1207
|
-
cwd,
|
|
1208
|
-
});
|
|
1209
|
-
const description = buildOpenCodePermissionDescription({
|
|
1210
|
-
reason,
|
|
1211
|
-
patterns,
|
|
1212
|
-
});
|
|
1213
|
-
events.push({
|
|
1214
|
-
type: "permission_requested",
|
|
1215
|
-
provider: "opencode",
|
|
1216
|
-
request: {
|
|
1217
|
-
id: event.properties.id,
|
|
1218
|
-
provider: "opencode",
|
|
1219
|
-
name: event.properties.permission,
|
|
1220
|
-
kind: "tool",
|
|
1221
|
-
title: toHumanReadablePermissionTitle(event.properties.permission),
|
|
1222
|
-
...(description ? { description } : {}),
|
|
1223
|
-
input,
|
|
1224
|
-
detail,
|
|
1225
|
-
},
|
|
1226
|
-
});
|
|
1079
|
+
case "message.part.updated":
|
|
1080
|
+
appendOpenCodeMessagePartUpdated(event, state, events);
|
|
1227
1081
|
break;
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
if (event.properties.sessionID !== state.sessionId) {
|
|
1231
|
-
break;
|
|
1232
|
-
}
|
|
1233
|
-
const questions = event.properties.questions.flatMap((q) => {
|
|
1234
|
-
if (!q.question || !q.header) {
|
|
1235
|
-
return [];
|
|
1236
|
-
}
|
|
1237
|
-
const options = q.options?.map((o) => ({
|
|
1238
|
-
label: o.label,
|
|
1239
|
-
...(o.description ? { description: o.description } : {}),
|
|
1240
|
-
})) ?? [];
|
|
1241
|
-
return [
|
|
1242
|
-
{
|
|
1243
|
-
question: q.question,
|
|
1244
|
-
header: q.header,
|
|
1245
|
-
options,
|
|
1246
|
-
...(q.multiple === true ? { multiSelect: true } : {}),
|
|
1247
|
-
},
|
|
1248
|
-
];
|
|
1249
|
-
});
|
|
1250
|
-
if (questions.length === 0) {
|
|
1251
|
-
break;
|
|
1252
|
-
}
|
|
1253
|
-
events.push({
|
|
1254
|
-
type: "permission_requested",
|
|
1255
|
-
provider: "opencode",
|
|
1256
|
-
request: {
|
|
1257
|
-
id: event.properties.id,
|
|
1258
|
-
provider: "opencode",
|
|
1259
|
-
name: "question",
|
|
1260
|
-
kind: "question",
|
|
1261
|
-
title: "Question",
|
|
1262
|
-
input: { questions },
|
|
1263
|
-
metadata: {
|
|
1264
|
-
source: "opencode_question",
|
|
1265
|
-
...(event.properties.tool ?? {}),
|
|
1266
|
-
},
|
|
1267
|
-
},
|
|
1268
|
-
});
|
|
1082
|
+
case "message.part.delta":
|
|
1083
|
+
appendOpenCodeMessagePartDelta(event, state, events);
|
|
1269
1084
|
break;
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
if (event.properties.sessionID !== state.sessionId) {
|
|
1273
|
-
break;
|
|
1274
|
-
}
|
|
1275
|
-
events.push({
|
|
1276
|
-
type: "timeline",
|
|
1277
|
-
provider: "opencode",
|
|
1278
|
-
item: mapOpenCodeTodosToTimelineItems(event.properties.todos),
|
|
1279
|
-
});
|
|
1085
|
+
case "permission.asked":
|
|
1086
|
+
appendOpenCodePermissionAsked(event, state, events);
|
|
1280
1087
|
break;
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
if (event.properties.sessionID !== state.sessionId) {
|
|
1284
|
-
break;
|
|
1285
|
-
}
|
|
1286
|
-
events.push({
|
|
1287
|
-
type: "timeline",
|
|
1288
|
-
provider: "opencode",
|
|
1289
|
-
item: createCompactionTimelineItem("completed"),
|
|
1290
|
-
});
|
|
1088
|
+
case "question.asked":
|
|
1089
|
+
appendOpenCodeQuestionAsked(event, state, events);
|
|
1291
1090
|
break;
|
|
1292
|
-
|
|
1293
|
-
case "session.idle": {
|
|
1091
|
+
case "todo.updated":
|
|
1294
1092
|
if (event.properties.sessionID === state.sessionId) {
|
|
1295
|
-
state.streamedPartKeys.clear();
|
|
1296
|
-
state.partTypes.clear();
|
|
1297
1093
|
events.push({
|
|
1298
|
-
type: "
|
|
1094
|
+
type: "timeline",
|
|
1299
1095
|
provider: "opencode",
|
|
1300
|
-
|
|
1096
|
+
item: mapOpenCodeTodosToTimelineItems(event.properties.todos),
|
|
1301
1097
|
});
|
|
1302
1098
|
}
|
|
1303
1099
|
break;
|
|
1304
|
-
|
|
1305
|
-
case "session.error": {
|
|
1100
|
+
case "session.compacted":
|
|
1306
1101
|
if (event.properties.sessionID === state.sessionId) {
|
|
1307
|
-
state.streamedPartKeys.clear();
|
|
1308
|
-
state.partTypes.clear();
|
|
1309
1102
|
events.push({
|
|
1310
|
-
type: "
|
|
1103
|
+
type: "timeline",
|
|
1311
1104
|
provider: "opencode",
|
|
1312
|
-
|
|
1105
|
+
item: createCompactionTimelineItem("completed"),
|
|
1313
1106
|
});
|
|
1314
1107
|
}
|
|
1315
1108
|
break;
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
}
|
|
1321
|
-
const { status } = event.properties;
|
|
1322
|
-
if (status.type === "idle") {
|
|
1323
|
-
state.streamedPartKeys.clear();
|
|
1324
|
-
state.partTypes.clear();
|
|
1325
|
-
events.push({
|
|
1326
|
-
type: "turn_completed",
|
|
1327
|
-
provider: "opencode",
|
|
1328
|
-
usage: undefined,
|
|
1329
|
-
});
|
|
1109
|
+
case "session.idle":
|
|
1110
|
+
if (event.properties.sessionID === state.sessionId) {
|
|
1111
|
+
resetOpenCodeTurnTrackingState(state);
|
|
1112
|
+
events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
|
|
1330
1113
|
}
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1114
|
+
break;
|
|
1115
|
+
case "session.error":
|
|
1116
|
+
if (event.properties.sessionID === state.sessionId) {
|
|
1117
|
+
resetOpenCodeTurnTrackingState(state);
|
|
1334
1118
|
events.push({
|
|
1335
1119
|
type: "turn_failed",
|
|
1336
1120
|
provider: "opencode",
|
|
1337
|
-
error:
|
|
1121
|
+
error: toDiagnosticErrorMessage(event.properties.error),
|
|
1338
1122
|
});
|
|
1339
1123
|
}
|
|
1340
|
-
// "retry" and "busy" are transient — no terminal event.
|
|
1341
1124
|
break;
|
|
1342
|
-
|
|
1125
|
+
case "session.status":
|
|
1126
|
+
appendOpenCodeSessionStatus(event, state, events);
|
|
1127
|
+
break;
|
|
1343
1128
|
}
|
|
1344
1129
|
return events;
|
|
1345
1130
|
}
|
|
1131
|
+
function resetOpenCodeTurnTrackingState(state) {
|
|
1132
|
+
state.streamedPartKeys.clear();
|
|
1133
|
+
state.partTypes.clear();
|
|
1134
|
+
}
|
|
1135
|
+
function appendOpenCodeSessionCreatedOrUpdated(event, state, events) {
|
|
1136
|
+
if (event.properties.info.id === state.sessionId) {
|
|
1137
|
+
events.push({
|
|
1138
|
+
type: "thread_started",
|
|
1139
|
+
sessionId: state.sessionId,
|
|
1140
|
+
provider: "opencode",
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
function appendOpenCodeMessageUpdated(event, state, events) {
|
|
1145
|
+
const info = event.properties.info;
|
|
1146
|
+
if (info.sessionID !== state.sessionId) {
|
|
1147
|
+
return;
|
|
1148
|
+
}
|
|
1149
|
+
state.messageRoles.set(info.id, info.role);
|
|
1150
|
+
if (info.role !== "assistant") {
|
|
1151
|
+
return;
|
|
1152
|
+
}
|
|
1153
|
+
const modelLookupKey = resolveOpenCodeModelLookupKeyFromAssistantMessage(info);
|
|
1154
|
+
if (modelLookupKey) {
|
|
1155
|
+
const contextWindowMaxTokens = state.modelContextWindowsByModelKey?.get(modelLookupKey);
|
|
1156
|
+
if (contextWindowMaxTokens !== undefined) {
|
|
1157
|
+
state.onAssistantModelContextWindowResolved?.(contextWindowMaxTokens);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
if (state.emittedStructuredMessageIds.has(info.id) || info.time?.completed === undefined) {
|
|
1161
|
+
return;
|
|
1162
|
+
}
|
|
1163
|
+
const text = stringifyStructuredAssistantMessage(info.structured);
|
|
1164
|
+
if (!text) {
|
|
1165
|
+
return;
|
|
1166
|
+
}
|
|
1167
|
+
state.emittedStructuredMessageIds.add(info.id);
|
|
1168
|
+
events.push({
|
|
1169
|
+
type: "timeline",
|
|
1170
|
+
provider: "opencode",
|
|
1171
|
+
item: { type: "assistant_message", text },
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
function appendOpenCodeMessagePartUpdated(event, state, events) {
|
|
1175
|
+
const part = event.properties.part;
|
|
1176
|
+
if (part.sessionID !== state.sessionId) {
|
|
1177
|
+
return;
|
|
1178
|
+
}
|
|
1179
|
+
const messageRole = state.messageRoles.get(part.messageID);
|
|
1180
|
+
state.partTypes.set(part.id, part.type);
|
|
1181
|
+
if (part.type === "text") {
|
|
1182
|
+
appendOpenCodeTextPart(part, messageRole, state, events);
|
|
1183
|
+
return;
|
|
1184
|
+
}
|
|
1185
|
+
if (part.type === "reasoning") {
|
|
1186
|
+
appendOpenCodeReasoningPart(part, state, events);
|
|
1187
|
+
return;
|
|
1188
|
+
}
|
|
1189
|
+
if (part.type === "tool") {
|
|
1190
|
+
const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
|
|
1191
|
+
if (parsedToolPart.success && parsedToolPart.data) {
|
|
1192
|
+
events.push({ type: "timeline", provider: "opencode", item: parsedToolPart.data });
|
|
1193
|
+
}
|
|
1194
|
+
return;
|
|
1195
|
+
}
|
|
1196
|
+
if (part.type === "compaction") {
|
|
1197
|
+
events.push({
|
|
1198
|
+
type: "timeline",
|
|
1199
|
+
provider: "opencode",
|
|
1200
|
+
item: createCompactionTimelineItem("loading", part.auto ? "auto" : "manual"),
|
|
1201
|
+
});
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
if (part.type === "step-finish") {
|
|
1205
|
+
mergeOpenCodeStepFinishUsage(state.accumulatedUsage, part);
|
|
1206
|
+
if (hasNormalizedOpenCodeUsage(state.accumulatedUsage)) {
|
|
1207
|
+
events.push({
|
|
1208
|
+
type: "usage_updated",
|
|
1209
|
+
provider: "opencode",
|
|
1210
|
+
usage: { ...state.accumulatedUsage },
|
|
1211
|
+
});
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
function appendOpenCodeTextPart(part, messageRole, state, events) {
|
|
1216
|
+
if (messageRole === "user") {
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
if (!part.time?.end) {
|
|
1220
|
+
return;
|
|
1221
|
+
}
|
|
1222
|
+
const partKey = resolvePartDedupeKey(part, "text");
|
|
1223
|
+
if (partKey && state.streamedPartKeys.delete(partKey)) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
if (part.text) {
|
|
1227
|
+
events.push({
|
|
1228
|
+
type: "timeline",
|
|
1229
|
+
provider: "opencode",
|
|
1230
|
+
item: { type: "assistant_message", text: part.text },
|
|
1231
|
+
});
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
function appendOpenCodeReasoningPart(part, state, events) {
|
|
1235
|
+
if (!part.time.end) {
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1238
|
+
const partKey = resolvePartDedupeKey(part, "reasoning");
|
|
1239
|
+
if (partKey && state.streamedPartKeys.delete(partKey)) {
|
|
1240
|
+
return;
|
|
1241
|
+
}
|
|
1242
|
+
if (part.text) {
|
|
1243
|
+
events.push({
|
|
1244
|
+
type: "timeline",
|
|
1245
|
+
provider: "opencode",
|
|
1246
|
+
item: { type: "reasoning", text: part.text },
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
function appendOpenCodeMessagePartDelta(event, state, events) {
|
|
1251
|
+
const { sessionID, messageID, partID, field, delta } = event.properties;
|
|
1252
|
+
if (sessionID !== state.sessionId) {
|
|
1253
|
+
return;
|
|
1254
|
+
}
|
|
1255
|
+
if (!delta || !field) {
|
|
1256
|
+
return;
|
|
1257
|
+
}
|
|
1258
|
+
const messageRole = messageID ? state.messageRoles.get(messageID) : undefined;
|
|
1259
|
+
const knownPartType = partID ? state.partTypes.get(partID) : undefined;
|
|
1260
|
+
const isReasoning = knownPartType === "reasoning" || field === "reasoning";
|
|
1261
|
+
if (isReasoning) {
|
|
1262
|
+
if (partID) {
|
|
1263
|
+
state.streamedPartKeys.add(`reasoning:${partID}`);
|
|
1264
|
+
}
|
|
1265
|
+
events.push({
|
|
1266
|
+
type: "timeline",
|
|
1267
|
+
provider: "opencode",
|
|
1268
|
+
item: { type: "reasoning", text: delta },
|
|
1269
|
+
});
|
|
1270
|
+
return;
|
|
1271
|
+
}
|
|
1272
|
+
if (field !== "text") {
|
|
1273
|
+
return;
|
|
1274
|
+
}
|
|
1275
|
+
if (messageRole === "user") {
|
|
1276
|
+
return;
|
|
1277
|
+
}
|
|
1278
|
+
if (partID) {
|
|
1279
|
+
state.streamedPartKeys.add(`text:${partID}`);
|
|
1280
|
+
}
|
|
1281
|
+
events.push({
|
|
1282
|
+
type: "timeline",
|
|
1283
|
+
provider: "opencode",
|
|
1284
|
+
item: { type: "assistant_message", text: delta },
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
function appendOpenCodePermissionAsked(event, state, events) {
|
|
1288
|
+
if (event.properties.sessionID !== state.sessionId) {
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
const metadata = readOpenCodeRecord(event.properties.metadata);
|
|
1292
|
+
const tool = readOpenCodeRecord(event.properties.tool);
|
|
1293
|
+
const patterns = Array.isArray(event.properties.patterns)
|
|
1294
|
+
? event.properties.patterns.filter((value) => typeof value === "string")
|
|
1295
|
+
: [];
|
|
1296
|
+
const command = readPermissionField(metadata, PERMISSION_COMMAND_KEYS);
|
|
1297
|
+
const cwd = readPermissionField(metadata, PERMISSION_CWD_KEYS);
|
|
1298
|
+
const reason = readPermissionField(metadata, PERMISSION_REASON_KEYS);
|
|
1299
|
+
const input = buildOpenCodePermissionInput({ patterns, metadata, tool, command });
|
|
1300
|
+
const detail = buildOpenCodePermissionDetail({
|
|
1301
|
+
permission: event.properties.permission,
|
|
1302
|
+
input,
|
|
1303
|
+
command,
|
|
1304
|
+
cwd,
|
|
1305
|
+
});
|
|
1306
|
+
const description = buildOpenCodePermissionDescription({ reason, patterns });
|
|
1307
|
+
events.push({
|
|
1308
|
+
type: "permission_requested",
|
|
1309
|
+
provider: "opencode",
|
|
1310
|
+
request: {
|
|
1311
|
+
id: event.properties.id,
|
|
1312
|
+
provider: "opencode",
|
|
1313
|
+
name: event.properties.permission,
|
|
1314
|
+
kind: "tool",
|
|
1315
|
+
title: toHumanReadablePermissionTitle(event.properties.permission),
|
|
1316
|
+
...(description ? { description } : {}),
|
|
1317
|
+
input,
|
|
1318
|
+
detail,
|
|
1319
|
+
},
|
|
1320
|
+
});
|
|
1321
|
+
}
|
|
1322
|
+
function appendOpenCodeQuestionAsked(event, state, events) {
|
|
1323
|
+
if (event.properties.sessionID !== state.sessionId) {
|
|
1324
|
+
return;
|
|
1325
|
+
}
|
|
1326
|
+
const questions = event.properties.questions.flatMap((q) => {
|
|
1327
|
+
if (!q.question || !q.header) {
|
|
1328
|
+
return [];
|
|
1329
|
+
}
|
|
1330
|
+
const options = q.options?.map((o) => ({
|
|
1331
|
+
label: o.label,
|
|
1332
|
+
...(o.description ? { description: o.description } : {}),
|
|
1333
|
+
})) ?? [];
|
|
1334
|
+
return [
|
|
1335
|
+
{
|
|
1336
|
+
question: q.question,
|
|
1337
|
+
header: q.header,
|
|
1338
|
+
options,
|
|
1339
|
+
...(q.multiple === true ? { multiSelect: true } : {}),
|
|
1340
|
+
},
|
|
1341
|
+
];
|
|
1342
|
+
});
|
|
1343
|
+
if (questions.length === 0) {
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
events.push({
|
|
1347
|
+
type: "permission_requested",
|
|
1348
|
+
provider: "opencode",
|
|
1349
|
+
request: {
|
|
1350
|
+
id: event.properties.id,
|
|
1351
|
+
provider: "opencode",
|
|
1352
|
+
name: "question",
|
|
1353
|
+
kind: "question",
|
|
1354
|
+
title: "Question",
|
|
1355
|
+
input: { questions },
|
|
1356
|
+
metadata: {
|
|
1357
|
+
source: "opencode_question",
|
|
1358
|
+
...event.properties.tool,
|
|
1359
|
+
},
|
|
1360
|
+
},
|
|
1361
|
+
});
|
|
1362
|
+
}
|
|
1363
|
+
function appendOpenCodeSessionStatus(event, state, events) {
|
|
1364
|
+
if (event.properties.sessionID !== state.sessionId) {
|
|
1365
|
+
return;
|
|
1366
|
+
}
|
|
1367
|
+
const { status } = event.properties;
|
|
1368
|
+
if (status.type === "idle") {
|
|
1369
|
+
resetOpenCodeTurnTrackingState(state);
|
|
1370
|
+
events.push({ type: "turn_completed", provider: "opencode", usage: undefined });
|
|
1371
|
+
return;
|
|
1372
|
+
}
|
|
1373
|
+
if (status.type === "retry" && isFatalOpenCodeRetryMessage(status.message)) {
|
|
1374
|
+
resetOpenCodeTurnTrackingState(state);
|
|
1375
|
+
events.push({
|
|
1376
|
+
type: "turn_failed",
|
|
1377
|
+
provider: "opencode",
|
|
1378
|
+
error: toDiagnosticErrorMessage(status.message),
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
// "retry" and "busy" are transient — no terminal event.
|
|
1382
|
+
}
|
|
1346
1383
|
class OpenCodeAgentSession {
|
|
1347
1384
|
constructor(config, client, sessionId, logger, modelContextWindowsByModelKey = new Map(), releaseServer) {
|
|
1348
1385
|
this.provider = "opencode";
|
|
@@ -1526,12 +1563,13 @@ class OpenCodeAgentSession {
|
|
|
1526
1563
|
}, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
|
|
1527
1564
|
return;
|
|
1528
1565
|
}
|
|
1529
|
-
const errorMsg =
|
|
1566
|
+
const errorMsg = toDiagnosticErrorMessage(response.error);
|
|
1530
1567
|
this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: errorMsg }, turnId);
|
|
1531
1568
|
}
|
|
1532
1569
|
else {
|
|
1533
1570
|
this.finishForegroundTurn({ type: "turn_completed", provider: "opencode", usage: undefined }, turnId);
|
|
1534
1571
|
}
|
|
1572
|
+
return;
|
|
1535
1573
|
})
|
|
1536
1574
|
.catch((err) => {
|
|
1537
1575
|
if (isOpenCodeHeadersTimeoutFailure(err)) {
|
|
@@ -1542,7 +1580,7 @@ class OpenCodeAgentSession {
|
|
|
1542
1580
|
}, "OpenCode slash command hit a header timeout; waiting for SSE terminal event");
|
|
1543
1581
|
return;
|
|
1544
1582
|
}
|
|
1545
|
-
this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error:
|
|
1583
|
+
this.finishForegroundTurn({ type: "turn_failed", provider: "opencode", error: toDiagnosticErrorMessage(err) }, turnId);
|
|
1546
1584
|
});
|
|
1547
1585
|
}
|
|
1548
1586
|
else {
|
|
@@ -1569,15 +1607,16 @@ class OpenCodeAgentSession {
|
|
|
1569
1607
|
this.finishForegroundTurn({
|
|
1570
1608
|
type: "turn_failed",
|
|
1571
1609
|
provider: "opencode",
|
|
1572
|
-
error:
|
|
1610
|
+
error: toDiagnosticErrorMessage(promptResponse.error),
|
|
1573
1611
|
}, turnId);
|
|
1574
1612
|
}
|
|
1613
|
+
return;
|
|
1575
1614
|
})
|
|
1576
1615
|
.catch((error) => {
|
|
1577
1616
|
this.finishForegroundTurn({
|
|
1578
1617
|
type: "turn_failed",
|
|
1579
1618
|
provider: "opencode",
|
|
1580
|
-
error:
|
|
1619
|
+
error: toDiagnosticErrorMessage(error),
|
|
1581
1620
|
}, turnId);
|
|
1582
1621
|
});
|
|
1583
1622
|
}
|
|
@@ -1604,19 +1643,9 @@ class OpenCodeAgentSession {
|
|
|
1604
1643
|
if (e.type === "timeline" && e.item.type === "tool_call") {
|
|
1605
1644
|
this.trackToolCall(e.item);
|
|
1606
1645
|
}
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
if (e.type === "turn_failed") {
|
|
1611
|
-
this.finishForegroundTurn({
|
|
1612
|
-
type: "turn_failed",
|
|
1613
|
-
provider: "opencode",
|
|
1614
|
-
error: normalizeTurnFailureError(e.error),
|
|
1615
|
-
}, turnId);
|
|
1616
|
-
}
|
|
1617
|
-
else {
|
|
1618
|
-
this.finishForegroundTurn(e, turnId);
|
|
1619
|
-
}
|
|
1646
|
+
const terminalEvent = toTerminalTurnEvent(e);
|
|
1647
|
+
if (terminalEvent) {
|
|
1648
|
+
this.finishForegroundTurn(terminalEvent, turnId);
|
|
1620
1649
|
return;
|
|
1621
1650
|
}
|
|
1622
1651
|
this.notifySubscribers(e, turnId);
|
|
@@ -1635,7 +1664,7 @@ class OpenCodeAgentSession {
|
|
|
1635
1664
|
this.finishForegroundTurn({
|
|
1636
1665
|
type: "turn_failed",
|
|
1637
1666
|
provider: "opencode",
|
|
1638
|
-
error:
|
|
1667
|
+
error: toDiagnosticErrorMessage(error),
|
|
1639
1668
|
}, turnId);
|
|
1640
1669
|
}
|
|
1641
1670
|
}
|
|
@@ -1729,34 +1758,33 @@ class OpenCodeAgentSession {
|
|
|
1729
1758
|
else {
|
|
1730
1759
|
let emittedAssistantText = false;
|
|
1731
1760
|
for (const part of parts) {
|
|
1732
|
-
if (part.type === "text") {
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1761
|
+
if (part.type === "text" && part.text) {
|
|
1762
|
+
emittedAssistantText = true;
|
|
1763
|
+
yield {
|
|
1764
|
+
type: "timeline",
|
|
1765
|
+
provider: "opencode",
|
|
1766
|
+
item: { type: "assistant_message", text: part.text },
|
|
1767
|
+
};
|
|
1768
|
+
continue;
|
|
1769
|
+
}
|
|
1770
|
+
if (part.type === "reasoning" && part.text) {
|
|
1771
|
+
yield {
|
|
1772
|
+
type: "timeline",
|
|
1773
|
+
provider: "opencode",
|
|
1774
|
+
item: { type: "reasoning", text: part.text },
|
|
1775
|
+
};
|
|
1776
|
+
continue;
|
|
1741
1777
|
}
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
yield {
|
|
1745
|
-
type: "timeline",
|
|
1746
|
-
provider: "opencode",
|
|
1747
|
-
item: { type: "reasoning", text: part.text },
|
|
1748
|
-
};
|
|
1749
|
-
}
|
|
1778
|
+
if (part.type !== "tool") {
|
|
1779
|
+
continue;
|
|
1750
1780
|
}
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
};
|
|
1759
|
-
}
|
|
1781
|
+
const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
|
|
1782
|
+
if (parsedToolPart.success && parsedToolPart.data) {
|
|
1783
|
+
yield {
|
|
1784
|
+
type: "timeline",
|
|
1785
|
+
provider: "opencode",
|
|
1786
|
+
item: parsedToolPart.data,
|
|
1787
|
+
};
|
|
1760
1788
|
}
|
|
1761
1789
|
}
|
|
1762
1790
|
if (!emittedAssistantText) {
|
|
@@ -1950,10 +1978,7 @@ class OpenCodeAgentSession {
|
|
|
1950
1978
|
}
|
|
1951
1979
|
}
|
|
1952
1980
|
async configureMcpServers(mcpServers) {
|
|
1953
|
-
|
|
1954
|
-
const mappedConfig = toOpenCodeMcpConfig(serverConfig);
|
|
1955
|
-
await this.registerMcpServer(name, mappedConfig);
|
|
1956
|
-
}
|
|
1981
|
+
await Promise.all(Object.entries(mcpServers).map(([name, serverConfig]) => this.registerMcpServer(name, toOpenCodeMcpConfig(serverConfig))));
|
|
1957
1982
|
}
|
|
1958
1983
|
async registerMcpServer(name, config) {
|
|
1959
1984
|
await this.runMcpOperation("add", name, () => this.client.mcp.add({
|
|
@@ -1975,7 +2000,7 @@ class OpenCodeAgentSession {
|
|
|
1975
2000
|
if (isAlreadyPresentMcpError(error)) {
|
|
1976
2001
|
return;
|
|
1977
2002
|
}
|
|
1978
|
-
throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${
|
|
2003
|
+
throw new Error(`Failed to ${operation} OpenCode MCP server '${name}': ${toDiagnosticErrorMessage(error)}`);
|
|
1979
2004
|
}
|
|
1980
2005
|
translateEvent(event) {
|
|
1981
2006
|
const translated = translateOpenCodeEvent(event, {
|