@code-yeongyu/senpi 2026.9.10 → 2026.9.11
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 +83 -0
- package/dist/core/agent-session.d.ts +57 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +130 -20
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +49 -17
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/brand.d.ts +5 -0
- package/dist/core/brand.d.ts.map +1 -1
- package/dist/core/brand.js +13 -0
- package/dist/core/brand.js.map +1 -1
- package/dist/core/changelog-source.d.ts +8 -0
- package/dist/core/changelog-source.d.ts.map +1 -0
- package/dist/core/changelog-source.js +19 -0
- package/dist/core/changelog-source.js.map +1 -0
- package/dist/core/credential-accounts.d.ts +3 -0
- package/dist/core/credential-accounts.d.ts.map +1 -1
- package/dist/core/credential-accounts.js +20 -1
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/classify.d.ts.map +1 -1
- package/dist/core/credential-pool/classify.js +8 -0
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/extensions/builtin/account/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/account/index.js +7 -3
- package/dist/core/extensions/builtin/account/index.js.map +1 -1
- package/dist/core/extensions/builtin/account-display-name.d.ts +7 -0
- package/dist/core/extensions/builtin/account-display-name.d.ts.map +1 -0
- package/dist/core/extensions/builtin/account-display-name.js +40 -0
- package/dist/core/extensions/builtin/account-display-name.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/format.js +7 -2
- package/dist/core/extensions/builtin/ask-user/format.js.map +1 -1
- package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/pending.js +3 -0
- package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +21 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js +11 -6
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts +9 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js +10 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +19 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +3 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +5 -3
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js +3 -9
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js +13 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.js +11 -8
- package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +28 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/goal/todo-gate.js +2 -2
- package/dist/core/extensions/builtin/goal/todo-gate.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +19 -8
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js +19 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +6 -6
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +26 -7
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +29 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/high-reasoning-warning.d.ts.map +1 -1
- package/dist/core/high-reasoning-warning.js +5 -1
- package/dist/core/high-reasoning-warning.js.map +1 -1
- package/dist/core/manual-continue.d.ts +14 -0
- package/dist/core/manual-continue.d.ts.map +1 -1
- package/dist/core/manual-continue.js +13 -0
- package/dist/core/manual-continue.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +2 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/remote-catalog-merge.d.ts +16 -0
- package/dist/core/remote-catalog-merge.d.ts.map +1 -0
- package/dist/core/remote-catalog-merge.js +75 -0
- package/dist/core/remote-catalog-merge.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +3 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +12 -40
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/session-entry-materializer.d.ts +12 -0
- package/dist/core/session-entry-materializer.d.ts.map +1 -0
- package/dist/core/session-entry-materializer.js +26 -0
- package/dist/core/session-entry-materializer.js.map +1 -0
- package/dist/core/session-manager.d.ts +36 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +38 -8
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/app-server/daemon/process.d.ts +6 -1
- package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.js +23 -4
- package/dist/modes/app-server/daemon/process.js.map +1 -1
- package/dist/modes/app-server/protocol/account.d.ts +2 -0
- package/dist/modes/app-server/protocol/account.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/account.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.js +65 -17
- package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-render.d.ts +2 -1
- package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-render.js +39 -9
- package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-state.d.ts +14 -4
- package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-state.js +63 -6
- package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question.d.ts +2 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question.js +27 -14
- package/dist/modes/interactive/components/ask-user-question.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +51 -19
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +11 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +29 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +7 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/help-content.d.ts.map +1 -1
- package/dist/modes/interactive/help-content.js +4 -0
- package/dist/modes/interactive/help-content.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +13 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +44 -15
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +3 -1
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/connection-question-bridge.js +1 -1
- package/dist/modes/rpc/connection-question-bridge.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +33 -11
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +14 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +31 -5
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js +2 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/changelog.d.ts +3 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +89 -23
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/paths.d.ts +5 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -1
- package/dist/utils/paths.js.map +1 -1
- package/docs/app-server.md +6 -0
- package/docs/extensions.md +19 -3
- package/docs/rpc.md +10 -0
- package/docs/settings.md +2 -1
- package/docs/tui.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +28 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output-buffer.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output.ts +9 -64
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js +90 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js +71 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts +873 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js +303 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js +35 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js +116 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js +153 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js +162 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts +25 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js +124 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js +101 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js +111 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js +86 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +51 -4
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +196 -7
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +8 -0
- 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 +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +9 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -4
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +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 +14 -5
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.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/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.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/venice.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/providers/devin.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js +62 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js +28 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +3 -1
- 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/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js +55 -16
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the Cascade `GetChatMessage` request from senpi's provider-neutral
|
|
3
|
+
* context.
|
|
4
|
+
*
|
|
5
|
+
* Cascade has no system role: the system prompt travels in the top-level
|
|
6
|
+
* `prompt` field, and history is a flat list of `ChatMessagePrompt` entries
|
|
7
|
+
* whose `source` carries the role. Message ids are derived deterministically
|
|
8
|
+
* from the conversation id and the entry index so a retried turn re-sends the
|
|
9
|
+
* same ids instead of forking the server-side transcript.
|
|
10
|
+
*/
|
|
11
|
+
import { create } from "@bufbuild/protobuf";
|
|
12
|
+
import { CacheControlType, ChatMessagePromptSchema, ChatMessageRequestType, ChatMessageSource, ChatToolCallSchema, ChatToolDefinitionSchema, CompletionConfigurationSchema, ConversationalPlannerMode, GetChatMessageRequestSchema, PromptCacheOptionsSchema, } from "./gen/cascade_pb.js";
|
|
13
|
+
import { devinCliMetadata } from "./metadata.js";
|
|
14
|
+
/** Cascade's own stop vocabulary; the server echoes these as STOP_PATTERN. */
|
|
15
|
+
export const DEVIN_DEFAULT_STOP_PATTERNS = [
|
|
16
|
+
"<|user|>",
|
|
17
|
+
"<|bot|>",
|
|
18
|
+
"<|context_request|>",
|
|
19
|
+
"<|endoftext|>",
|
|
20
|
+
"<|end_of_turn|>",
|
|
21
|
+
];
|
|
22
|
+
export function buildDevinChatRequest(input) {
|
|
23
|
+
const cascadeId = input.cascadeId ?? "";
|
|
24
|
+
return create(GetChatMessageRequestSchema, {
|
|
25
|
+
metadata: devinCliMetadata(input.apiKey),
|
|
26
|
+
prompt: input.context.systemPrompt ?? "",
|
|
27
|
+
chatMessagePrompts: mapHistory(input.context.messages, cascadeId),
|
|
28
|
+
requestType: ChatMessageRequestType.CASCADE,
|
|
29
|
+
plannerMode: ConversationalPlannerMode.DEFAULT,
|
|
30
|
+
chatModelUid: input.model.id,
|
|
31
|
+
chatModelName: input.model.name ?? input.model.id,
|
|
32
|
+
cascadeId,
|
|
33
|
+
tools: (input.context.tools ?? []).map(toolDefinition),
|
|
34
|
+
toolChoice: { choice: { case: "optionName", value: "auto" } },
|
|
35
|
+
systemPromptCacheOptions: create(PromptCacheOptionsSchema, { type: CacheControlType.EPHEMERAL }),
|
|
36
|
+
configuration: create(CompletionConfigurationSchema, {
|
|
37
|
+
maxTokens: BigInt(input.maxTokens ?? input.model.maxTokens ?? 0),
|
|
38
|
+
temperature: input.temperature ?? 0,
|
|
39
|
+
stopPatterns: [...DEVIN_DEFAULT_STOP_PATTERNS],
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function toolDefinition(tool) {
|
|
44
|
+
return create(ChatToolDefinitionSchema, {
|
|
45
|
+
name: tool.name,
|
|
46
|
+
description: tool.description,
|
|
47
|
+
jsonSchemaString: JSON.stringify(tool.parameters ?? {}),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function mapHistory(messages, cascadeId) {
|
|
51
|
+
const prompts = [];
|
|
52
|
+
for (const [index, message] of messages.entries()) {
|
|
53
|
+
const id = `${cascadeId}\u0000${index}\u0000${message.role}`;
|
|
54
|
+
if (message.role === "user")
|
|
55
|
+
prompts.push(userPrompt(message.content, id));
|
|
56
|
+
else if (message.role === "assistant")
|
|
57
|
+
prompts.push(assistantPrompt(message, id));
|
|
58
|
+
else if (message.role === "toolResult")
|
|
59
|
+
prompts.push(toolResultPrompt(message, id));
|
|
60
|
+
}
|
|
61
|
+
return prompts;
|
|
62
|
+
}
|
|
63
|
+
function userPrompt(content, messageId) {
|
|
64
|
+
const text = typeof content === "string" ? content : joinText(content);
|
|
65
|
+
return create(ChatMessagePromptSchema, {
|
|
66
|
+
messageId,
|
|
67
|
+
source: ChatMessageSource.USER,
|
|
68
|
+
prompt: text,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function assistantPrompt(message, messageId) {
|
|
72
|
+
const text = [];
|
|
73
|
+
let thinking = "";
|
|
74
|
+
let signature = "";
|
|
75
|
+
const toolCalls = [];
|
|
76
|
+
for (const block of message.content) {
|
|
77
|
+
if (block.type === "text")
|
|
78
|
+
text.push(block.text);
|
|
79
|
+
else if (block.type === "thinking") {
|
|
80
|
+
thinking += block.thinking;
|
|
81
|
+
if (block.thinkingSignature)
|
|
82
|
+
signature = block.thinkingSignature;
|
|
83
|
+
}
|
|
84
|
+
else if (block.type === "toolCall") {
|
|
85
|
+
toolCalls.push(create(ChatToolCallSchema, {
|
|
86
|
+
id: block.id,
|
|
87
|
+
name: block.name,
|
|
88
|
+
argumentsJson: JSON.stringify(block.arguments ?? {}),
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return create(ChatMessagePromptSchema, {
|
|
93
|
+
messageId,
|
|
94
|
+
source: ChatMessageSource.SYSTEM,
|
|
95
|
+
prompt: text.join("\n"),
|
|
96
|
+
thinking,
|
|
97
|
+
signature,
|
|
98
|
+
toolCalls,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function toolResultPrompt(message, messageId) {
|
|
102
|
+
return create(ChatMessagePromptSchema, {
|
|
103
|
+
messageId,
|
|
104
|
+
source: ChatMessageSource.TOOL,
|
|
105
|
+
prompt: joinText(message.content),
|
|
106
|
+
toolCallId: message.toolCallId,
|
|
107
|
+
toolResultIsError: message.isError === true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function joinText(content) {
|
|
111
|
+
return content
|
|
112
|
+
.filter((block) => block.type === "text" && typeof block.text === "string")
|
|
113
|
+
.map((block) => block.text)
|
|
114
|
+
.join("\n");
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/api/devin-agent/request.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Builds the Cascade `GetChatMessage` request from senpi's provider-neutral\n * context.\n *\n * Cascade has no system role: the system prompt travels in the top-level\n * `prompt` field, and history is a flat list of `ChatMessagePrompt` entries\n * whose `source` carries the role. Message ids are derived deterministically\n * from the conversation id and the entry index so a retried turn re-sends the\n * same ids instead of forking the server-side transcript.\n */\n\nimport { create } from \"@bufbuild/protobuf\";\nimport type { Context, Message, Model, Tool } from \"../../types.ts\";\nimport {\n\tCacheControlType,\n\ttype ChatMessagePrompt,\n\tChatMessagePromptSchema,\n\tChatMessageRequestType,\n\tChatMessageSource,\n\tChatToolCallSchema,\n\tChatToolDefinitionSchema,\n\tCompletionConfigurationSchema,\n\tConversationalPlannerMode,\n\ttype GetChatMessageRequest,\n\tGetChatMessageRequestSchema,\n\tPromptCacheOptionsSchema,\n} from \"./gen/cascade_pb.ts\";\nimport { devinCliMetadata } from \"./metadata.ts\";\n\n/** Cascade's own stop vocabulary; the server echoes these as STOP_PATTERN. */\nexport const DEVIN_DEFAULT_STOP_PATTERNS = [\n\t\"<|user|>\",\n\t\"<|bot|>\",\n\t\"<|context_request|>\",\n\t\"<|endoftext|>\",\n\t\"<|end_of_turn|>\",\n] as const;\n\nexport interface DevinChatRequestInput {\n\tmodel: Model<\"devin-agent\">;\n\tcontext: Context;\n\tapiKey: string | undefined;\n\tcascadeId?: string;\n\tmaxTokens?: number;\n\ttemperature?: number;\n}\n\nexport function buildDevinChatRequest(input: DevinChatRequestInput): GetChatMessageRequest {\n\tconst cascadeId = input.cascadeId ?? \"\";\n\treturn create(GetChatMessageRequestSchema, {\n\t\tmetadata: devinCliMetadata(input.apiKey),\n\t\tprompt: input.context.systemPrompt ?? \"\",\n\t\tchatMessagePrompts: mapHistory(input.context.messages, cascadeId),\n\t\trequestType: ChatMessageRequestType.CASCADE,\n\t\tplannerMode: ConversationalPlannerMode.DEFAULT,\n\t\tchatModelUid: input.model.id,\n\t\tchatModelName: input.model.name ?? input.model.id,\n\t\tcascadeId,\n\t\ttools: (input.context.tools ?? []).map(toolDefinition),\n\t\ttoolChoice: { choice: { case: \"optionName\", value: \"auto\" } },\n\t\tsystemPromptCacheOptions: create(PromptCacheOptionsSchema, { type: CacheControlType.EPHEMERAL }),\n\t\tconfiguration: create(CompletionConfigurationSchema, {\n\t\t\tmaxTokens: BigInt(input.maxTokens ?? input.model.maxTokens ?? 0),\n\t\t\ttemperature: input.temperature ?? 0,\n\t\t\tstopPatterns: [...DEVIN_DEFAULT_STOP_PATTERNS],\n\t\t}),\n\t});\n}\n\nfunction toolDefinition(tool: Tool) {\n\treturn create(ChatToolDefinitionSchema, {\n\t\tname: tool.name,\n\t\tdescription: tool.description,\n\t\tjsonSchemaString: JSON.stringify(tool.parameters ?? {}),\n\t});\n}\n\nfunction mapHistory(messages: readonly Message[], cascadeId: string): ChatMessagePrompt[] {\n\tconst prompts: ChatMessagePrompt[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tconst id = `${cascadeId}\\u0000${index}\\u0000${message.role}`;\n\t\tif (message.role === \"user\") prompts.push(userPrompt(message.content, id));\n\t\telse if (message.role === \"assistant\") prompts.push(assistantPrompt(message, id));\n\t\telse if (message.role === \"toolResult\") prompts.push(toolResultPrompt(message, id));\n\t}\n\treturn prompts;\n}\n\nfunction userPrompt(content: Extract<Message, { role: \"user\" }>[\"content\"], messageId: string): ChatMessagePrompt {\n\tconst text = typeof content === \"string\" ? content : joinText(content);\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId,\n\t\tsource: ChatMessageSource.USER,\n\t\tprompt: text,\n\t});\n}\n\nfunction assistantPrompt(message: Extract<Message, { role: \"assistant\" }>, messageId: string): ChatMessagePrompt {\n\tconst text: string[] = [];\n\tlet thinking = \"\";\n\tlet signature = \"\";\n\tconst toolCalls = [];\n\tfor (const block of message.content) {\n\t\tif (block.type === \"text\") text.push(block.text);\n\t\telse if (block.type === \"thinking\") {\n\t\t\tthinking += block.thinking;\n\t\t\tif (block.thinkingSignature) signature = block.thinkingSignature;\n\t\t} else if (block.type === \"toolCall\") {\n\t\t\ttoolCalls.push(\n\t\t\t\tcreate(ChatToolCallSchema, {\n\t\t\t\t\tid: block.id,\n\t\t\t\t\tname: block.name,\n\t\t\t\t\targumentsJson: JSON.stringify(block.arguments ?? {}),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId,\n\t\tsource: ChatMessageSource.SYSTEM,\n\t\tprompt: text.join(\"\\n\"),\n\t\tthinking,\n\t\tsignature,\n\t\ttoolCalls,\n\t});\n}\n\nfunction toolResultPrompt(message: Extract<Message, { role: \"toolResult\" }>, messageId: string): ChatMessagePrompt {\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId,\n\t\tsource: ChatMessageSource.TOOL,\n\t\tprompt: joinText(message.content),\n\t\ttoolCallId: message.toolCallId,\n\t\ttoolResultIsError: message.isError === true,\n\t});\n}\n\nfunction joinText(content: readonly { type: string; text?: string }[]): string {\n\treturn content\n\t\t.filter((block) => block.type === \"text\" && typeof block.text === \"string\")\n\t\t.map((block) => block.text as string)\n\t\t.join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade delta bookkeeping.
|
|
3
|
+
*
|
|
4
|
+
* One Cascade response frame can carry a thinking delta, a text delta and a
|
|
5
|
+
* finished tool call at once, and blocks are implicit: the server never opens
|
|
6
|
+
* or closes them. This module owns the open-block state so the adapter emits
|
|
7
|
+
* senpi's start/delta/end triples in the right order.
|
|
8
|
+
*/
|
|
9
|
+
import type { AssistantMessage } from "../../types.ts";
|
|
10
|
+
import type { AssistantMessageEventStream } from "../../utils/event-stream.ts";
|
|
11
|
+
import { type GetChatMessageResponse } from "./gen/cascade_pb.ts";
|
|
12
|
+
export interface DevinStreamState {
|
|
13
|
+
textIndex: number | undefined;
|
|
14
|
+
thinkingIndex: number | undefined;
|
|
15
|
+
toolCalls: Map<string, {
|
|
16
|
+
contentIndex: number;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export declare function applyDevinResponse(message: GetChatMessageResponse, output: AssistantMessage, events: AssistantMessageEventStream, state: DevinStreamState): void;
|
|
20
|
+
//# sourceMappingURL=stream-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-state.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/stream-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,KAAK,sBAAsB,EAAc,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,gBAAgB,GACrB,IAAI,CASN"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascade delta bookkeeping.
|
|
3
|
+
*
|
|
4
|
+
* One Cascade response frame can carry a thinking delta, a text delta and a
|
|
5
|
+
* finished tool call at once, and blocks are implicit: the server never opens
|
|
6
|
+
* or closes them. This module owns the open-block state so the adapter emits
|
|
7
|
+
* senpi's start/delta/end triples in the right order.
|
|
8
|
+
*/
|
|
9
|
+
import { StopReason } from "./gen/cascade_pb.js";
|
|
10
|
+
export function applyDevinResponse(message, output, events, state) {
|
|
11
|
+
if (message.messageId && !output.responseId)
|
|
12
|
+
output.responseId = message.messageId;
|
|
13
|
+
if (message.actualModelUid)
|
|
14
|
+
output.responseModel = message.actualModelUid;
|
|
15
|
+
if (message.deltaThinking)
|
|
16
|
+
appendThinking(message, output, events, state);
|
|
17
|
+
if (message.deltaText)
|
|
18
|
+
appendText(message.deltaText, output, events, state);
|
|
19
|
+
for (const call of message.deltaToolCalls)
|
|
20
|
+
appendToolCall(call, output, events, state);
|
|
21
|
+
if (message.usage)
|
|
22
|
+
applyUsage(message, output);
|
|
23
|
+
if (message.stopReason !== StopReason.UNSPECIFIED)
|
|
24
|
+
output.stopReason = mapStopReason(message.stopReason);
|
|
25
|
+
}
|
|
26
|
+
function appendThinking(message, output, events, state) {
|
|
27
|
+
// A thinking block interleaved after text starts a new block, matching the
|
|
28
|
+
// order Cascade streamed it in.
|
|
29
|
+
if (state.textIndex !== undefined)
|
|
30
|
+
closeText(output, events, state);
|
|
31
|
+
if (state.thinkingIndex === undefined) {
|
|
32
|
+
output.content.push({ type: "thinking", thinking: "", ...(message.thinkingRedacted ? { redacted: true } : {}) });
|
|
33
|
+
state.thinkingIndex = output.content.length - 1;
|
|
34
|
+
events.push({ type: "thinking_start", contentIndex: state.thinkingIndex, partial: output });
|
|
35
|
+
}
|
|
36
|
+
const block = output.content[state.thinkingIndex];
|
|
37
|
+
if (block?.type !== "thinking")
|
|
38
|
+
return;
|
|
39
|
+
block.thinking += message.deltaThinking;
|
|
40
|
+
if (message.deltaSignature)
|
|
41
|
+
block.thinkingSignature = message.deltaSignature;
|
|
42
|
+
events.push({
|
|
43
|
+
type: "thinking_delta",
|
|
44
|
+
contentIndex: state.thinkingIndex,
|
|
45
|
+
delta: message.deltaThinking,
|
|
46
|
+
partial: output,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function appendText(delta, output, events, state) {
|
|
50
|
+
if (state.thinkingIndex !== undefined)
|
|
51
|
+
closeThinking(output, events, state);
|
|
52
|
+
if (state.textIndex === undefined) {
|
|
53
|
+
output.content.push({ type: "text", text: "" });
|
|
54
|
+
state.textIndex = output.content.length - 1;
|
|
55
|
+
events.push({ type: "text_start", contentIndex: state.textIndex, partial: output });
|
|
56
|
+
}
|
|
57
|
+
const block = output.content[state.textIndex];
|
|
58
|
+
if (block?.type !== "text")
|
|
59
|
+
return;
|
|
60
|
+
block.text += delta;
|
|
61
|
+
events.push({ type: "text_delta", contentIndex: state.textIndex, delta, partial: output });
|
|
62
|
+
}
|
|
63
|
+
function appendToolCall(call, output, events, state) {
|
|
64
|
+
if (state.textIndex !== undefined)
|
|
65
|
+
closeText(output, events, state);
|
|
66
|
+
if (state.thinkingIndex !== undefined)
|
|
67
|
+
closeThinking(output, events, state);
|
|
68
|
+
const existing = state.toolCalls.get(call.id);
|
|
69
|
+
if (existing !== undefined) {
|
|
70
|
+
const open = output.content[existing.contentIndex];
|
|
71
|
+
if (open?.type === "toolCall" && call.argumentsJson) {
|
|
72
|
+
open.arguments = parseArguments(call.argumentsJson, open.arguments);
|
|
73
|
+
events.push({
|
|
74
|
+
type: "toolcall_delta",
|
|
75
|
+
contentIndex: existing.contentIndex,
|
|
76
|
+
delta: call.argumentsJson,
|
|
77
|
+
partial: output,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const block = {
|
|
83
|
+
type: "toolCall",
|
|
84
|
+
id: call.id,
|
|
85
|
+
name: call.name,
|
|
86
|
+
arguments: parseArguments(call.argumentsJson, {}),
|
|
87
|
+
};
|
|
88
|
+
output.content.push(block);
|
|
89
|
+
const contentIndex = output.content.length - 1;
|
|
90
|
+
state.toolCalls.set(call.id, { contentIndex });
|
|
91
|
+
events.push({ type: "toolcall_start", contentIndex, partial: output });
|
|
92
|
+
if (call.argumentsJson) {
|
|
93
|
+
events.push({ type: "toolcall_delta", contentIndex, delta: call.argumentsJson, partial: output });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function closeText(output, events, state) {
|
|
97
|
+
const index = state.textIndex;
|
|
98
|
+
if (index === undefined)
|
|
99
|
+
return;
|
|
100
|
+
const block = output.content[index];
|
|
101
|
+
state.textIndex = undefined;
|
|
102
|
+
if (block?.type === "text")
|
|
103
|
+
events.push({ type: "text_end", contentIndex: index, content: block.text, partial: output });
|
|
104
|
+
}
|
|
105
|
+
function closeThinking(output, events, state) {
|
|
106
|
+
const index = state.thinkingIndex;
|
|
107
|
+
if (index === undefined)
|
|
108
|
+
return;
|
|
109
|
+
const block = output.content[index];
|
|
110
|
+
state.thinkingIndex = undefined;
|
|
111
|
+
if (block?.type === "thinking")
|
|
112
|
+
events.push({ type: "thinking_end", contentIndex: index, content: block.thinking, partial: output });
|
|
113
|
+
}
|
|
114
|
+
function applyUsage(message, output) {
|
|
115
|
+
const usage = message.usage;
|
|
116
|
+
if (!usage)
|
|
117
|
+
return;
|
|
118
|
+
output.usage.input = Number(usage.inputTokens);
|
|
119
|
+
output.usage.output = Number(usage.outputTokens);
|
|
120
|
+
output.usage.cacheRead = Number(usage.cacheReadTokens);
|
|
121
|
+
output.usage.cacheWrite = Number(usage.cacheWriteTokens);
|
|
122
|
+
output.usage.totalTokens =
|
|
123
|
+
output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
|
|
124
|
+
}
|
|
125
|
+
/** Cascade's stop vocabulary reduced to senpi's. */
|
|
126
|
+
function mapStopReason(reason) {
|
|
127
|
+
switch (reason) {
|
|
128
|
+
case StopReason.FUNCTION_CALL:
|
|
129
|
+
return "toolUse";
|
|
130
|
+
case StopReason.MAX_TOKENS:
|
|
131
|
+
case StopReason.MAX_NEWLINES:
|
|
132
|
+
return "length";
|
|
133
|
+
case StopReason.ERROR:
|
|
134
|
+
case StopReason.CONTENT_FILTER:
|
|
135
|
+
return "error";
|
|
136
|
+
default:
|
|
137
|
+
return "stop";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function parseArguments(json, fallback) {
|
|
141
|
+
if (!json)
|
|
142
|
+
return fallback;
|
|
143
|
+
try {
|
|
144
|
+
const parsed = JSON.parse(json);
|
|
145
|
+
return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
|
|
146
|
+
? parsed
|
|
147
|
+
: fallback;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return fallback;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=stream-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-state.js","sourceRoot":"","sources":["../../../src/api/devin-agent/stream-state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cascade delta bookkeeping.\n *\n * One Cascade response frame can carry a thinking delta, a text delta and a\n * finished tool call at once, and blocks are implicit: the server never opens\n * or closes them. This module owns the open-block state so the adapter emits\n * senpi's start/delta/end triples in the right order.\n */\n\nimport type { AssistantMessage, ToolCall } from \"../../types.ts\";\nimport type { AssistantMessageEventStream } from \"../../utils/event-stream.ts\";\nimport { type GetChatMessageResponse, StopReason } from \"./gen/cascade_pb.ts\";\n\nexport interface DevinStreamState {\n\ttextIndex: number | undefined;\n\tthinkingIndex: number | undefined;\n\ttoolCalls: Map<string, { contentIndex: number }>;\n}\n\nexport function applyDevinResponse(\n\tmessage: GetChatMessageResponse,\n\toutput: AssistantMessage,\n\tevents: AssistantMessageEventStream,\n\tstate: DevinStreamState,\n): void {\n\tif (message.messageId && !output.responseId) output.responseId = message.messageId;\n\tif (message.actualModelUid) output.responseModel = message.actualModelUid;\n\n\tif (message.deltaThinking) appendThinking(message, output, events, state);\n\tif (message.deltaText) appendText(message.deltaText, output, events, state);\n\tfor (const call of message.deltaToolCalls) appendToolCall(call, output, events, state);\n\tif (message.usage) applyUsage(message, output);\n\tif (message.stopReason !== StopReason.UNSPECIFIED) output.stopReason = mapStopReason(message.stopReason);\n}\n\nfunction appendThinking(\n\tmessage: GetChatMessageResponse,\n\toutput: AssistantMessage,\n\tevents: AssistantMessageEventStream,\n\tstate: DevinStreamState,\n): void {\n\t// A thinking block interleaved after text starts a new block, matching the\n\t// order Cascade streamed it in.\n\tif (state.textIndex !== undefined) closeText(output, events, state);\n\tif (state.thinkingIndex === undefined) {\n\t\toutput.content.push({ type: \"thinking\", thinking: \"\", ...(message.thinkingRedacted ? { redacted: true } : {}) });\n\t\tstate.thinkingIndex = output.content.length - 1;\n\t\tevents.push({ type: \"thinking_start\", contentIndex: state.thinkingIndex, partial: output });\n\t}\n\tconst block = output.content[state.thinkingIndex];\n\tif (block?.type !== \"thinking\") return;\n\tblock.thinking += message.deltaThinking;\n\tif (message.deltaSignature) block.thinkingSignature = message.deltaSignature;\n\tevents.push({\n\t\ttype: \"thinking_delta\",\n\t\tcontentIndex: state.thinkingIndex,\n\t\tdelta: message.deltaThinking,\n\t\tpartial: output,\n\t});\n}\n\nfunction appendText(\n\tdelta: string,\n\toutput: AssistantMessage,\n\tevents: AssistantMessageEventStream,\n\tstate: DevinStreamState,\n): void {\n\tif (state.thinkingIndex !== undefined) closeThinking(output, events, state);\n\tif (state.textIndex === undefined) {\n\t\toutput.content.push({ type: \"text\", text: \"\" });\n\t\tstate.textIndex = output.content.length - 1;\n\t\tevents.push({ type: \"text_start\", contentIndex: state.textIndex, partial: output });\n\t}\n\tconst block = output.content[state.textIndex];\n\tif (block?.type !== \"text\") return;\n\tblock.text += delta;\n\tevents.push({ type: \"text_delta\", contentIndex: state.textIndex, delta, partial: output });\n}\n\nfunction appendToolCall(\n\tcall: { id: string; name: string; argumentsJson: string },\n\toutput: AssistantMessage,\n\tevents: AssistantMessageEventStream,\n\tstate: DevinStreamState,\n): void {\n\tif (state.textIndex !== undefined) closeText(output, events, state);\n\tif (state.thinkingIndex !== undefined) closeThinking(output, events, state);\n\tconst existing = state.toolCalls.get(call.id);\n\tif (existing !== undefined) {\n\t\tconst open = output.content[existing.contentIndex];\n\t\tif (open?.type === \"toolCall\" && call.argumentsJson) {\n\t\t\topen.arguments = parseArguments(call.argumentsJson, open.arguments);\n\t\t\tevents.push({\n\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\tcontentIndex: existing.contentIndex,\n\t\t\t\tdelta: call.argumentsJson,\n\t\t\t\tpartial: output,\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\tconst block: ToolCall = {\n\t\ttype: \"toolCall\",\n\t\tid: call.id,\n\t\tname: call.name,\n\t\targuments: parseArguments(call.argumentsJson, {}),\n\t};\n\toutput.content.push(block);\n\tconst contentIndex = output.content.length - 1;\n\tstate.toolCalls.set(call.id, { contentIndex });\n\tevents.push({ type: \"toolcall_start\", contentIndex, partial: output });\n\tif (call.argumentsJson) {\n\t\tevents.push({ type: \"toolcall_delta\", contentIndex, delta: call.argumentsJson, partial: output });\n\t}\n}\n\nfunction closeText(output: AssistantMessage, events: AssistantMessageEventStream, state: DevinStreamState): void {\n\tconst index = state.textIndex;\n\tif (index === undefined) return;\n\tconst block = output.content[index];\n\tstate.textIndex = undefined;\n\tif (block?.type === \"text\")\n\t\tevents.push({ type: \"text_end\", contentIndex: index, content: block.text, partial: output });\n}\n\nfunction closeThinking(output: AssistantMessage, events: AssistantMessageEventStream, state: DevinStreamState): void {\n\tconst index = state.thinkingIndex;\n\tif (index === undefined) return;\n\tconst block = output.content[index];\n\tstate.thinkingIndex = undefined;\n\tif (block?.type === \"thinking\")\n\t\tevents.push({ type: \"thinking_end\", contentIndex: index, content: block.thinking, partial: output });\n}\n\nfunction applyUsage(message: GetChatMessageResponse, output: AssistantMessage): void {\n\tconst usage = message.usage;\n\tif (!usage) return;\n\toutput.usage.input = Number(usage.inputTokens);\n\toutput.usage.output = Number(usage.outputTokens);\n\toutput.usage.cacheRead = Number(usage.cacheReadTokens);\n\toutput.usage.cacheWrite = Number(usage.cacheWriteTokens);\n\toutput.usage.totalTokens =\n\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n}\n\n/** Cascade's stop vocabulary reduced to senpi's. */\nfunction mapStopReason(reason: StopReason): AssistantMessage[\"stopReason\"] {\n\tswitch (reason) {\n\t\tcase StopReason.FUNCTION_CALL:\n\t\t\treturn \"toolUse\";\n\t\tcase StopReason.MAX_TOKENS:\n\t\tcase StopReason.MAX_NEWLINES:\n\t\t\treturn \"length\";\n\t\tcase StopReason.ERROR:\n\t\tcase StopReason.CONTENT_FILTER:\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\treturn \"stop\";\n\t}\n}\n\nfunction parseArguments(json: string, fallback: Record<string, unknown>): Record<string, unknown> {\n\tif (!json) return fallback;\n\ttry {\n\t\tconst parsed = JSON.parse(json) as unknown;\n\t\treturn parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n\t\t\t? (parsed as Record<string, unknown>)\n\t\t\t: fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Options accepted by the devin-agent (Cascade) API. */
|
|
2
|
+
import type { StreamOptions } from "../../types.ts";
|
|
3
|
+
export interface DevinAgentOptions extends StreamOptions {
|
|
4
|
+
/** Devin CLI session token. Prefixed on the wire when it is not already. */
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Cascade conversation id. Threads a multi-turn exchange server-side and
|
|
8
|
+
* seeds deterministic message ids; a fresh id starts a new transcript.
|
|
9
|
+
*/
|
|
10
|
+
cascadeId?: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACvD,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/devin-agent/types.ts"],"names":[],"mappings":"AAAA,yDAAyD","sourcesContent":["/** Options accepted by the devin-agent (Cascade) API. */\n\nimport type { StreamOptions } from \"../../types.ts\";\n\nexport interface DevinAgentOptions extends StreamOptions {\n\t/** Devin CLI session token. Prefixed on the wire when it is not already. */\n\tapiKey?: string;\n\t/**\n\t * Cascade conversation id. Threads a multi-turn exchange server-side and\n\t * seeds deterministic message ids; a fresh id starts a new transcript.\n\t */\n\tcascadeId?: string;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Cascade wire surface: paths, identity metadata, frame codec and request building. */
|
|
2
|
+
export { type DevinFrame, decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from "./frames.ts";
|
|
3
|
+
export { devinCliMetadata, normalizeDevinSessionToken } from "./metadata.ts";
|
|
4
|
+
export { DEVIN_CHAT_MESSAGE_PATH, DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL, DEVIN_MAX_FRAME_PAYLOAD, } from "./paths.ts";
|
|
5
|
+
export { buildDevinChatRequest, DEVIN_DEFAULT_STOP_PATTERNS, type DevinChatRequestInput } from "./request.ts";
|
|
6
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/wire.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAE,KAAK,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Cascade wire surface: paths, identity metadata, frame codec and request building. */
|
|
2
|
+
export { decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from "./frames.js";
|
|
3
|
+
export { devinCliMetadata, normalizeDevinSessionToken } from "./metadata.js";
|
|
4
|
+
export { DEVIN_CHAT_MESSAGE_PATH, DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL, DEVIN_MAX_FRAME_PAYLOAD, } from "./paths.js";
|
|
5
|
+
export { buildDevinChatRequest, DEVIN_DEFAULT_STOP_PATTERNS } from "./request.js";
|
|
6
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/api/devin-agent/wire.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,EAAmB,iBAAiB,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAA8B,MAAM,cAAc,CAAC","sourcesContent":["/** Cascade wire surface: paths, identity metadata, frame codec and request building. */\n\nexport { type DevinFrame, decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from \"./frames.ts\";\nexport { devinCliMetadata, normalizeDevinSessionToken } from \"./metadata.ts\";\nexport {\n\tDEVIN_CHAT_MESSAGE_PATH,\n\tDEVIN_CLI_MODEL_CONFIGS_PATH,\n\tDEVIN_DEFAULT_BASE_URL,\n\tDEVIN_MAX_FRAME_PAYLOAD,\n} from \"./paths.ts\";\nexport { buildDevinChatRequest, DEVIN_DEFAULT_STOP_PATTERNS, type DevinChatRequestInput } from \"./request.ts\";\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devin (Cognition/Codeium Cascade) agent API.
|
|
3
|
+
*
|
|
4
|
+
* One `GetChatMessage` server-streaming Connect call per assistant turn. The
|
|
5
|
+
* request is a single gzipped frame; the response is a frame sequence of
|
|
6
|
+
* deltas, closed by a JSON trailer frame. Cascade reports text, thinking and
|
|
7
|
+
* tool calls as separate delta fields on the same message, so this adapter owns
|
|
8
|
+
* the block bookkeeping senpi's event protocol expects.
|
|
9
|
+
*/
|
|
10
|
+
import type { StreamFunction } from "../types.ts";
|
|
11
|
+
import type { DevinAgentOptions } from "./devin-agent/types.ts";
|
|
12
|
+
export declare const stream: StreamFunction<"devin-agent", DevinAgentOptions>;
|
|
13
|
+
export declare const streamSimple: StreamFunction<"devin-agent", DevinAgentOptions>;
|
|
14
|
+
//# sourceMappingURL=devin-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devin-agent.d.ts","sourceRoot":"","sources":["../../src/api/devin-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAoC,cAAc,EAAY,MAAM,aAAa,CAAC;AAI9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAUhE,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAQnE,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAAU,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devin (Cognition/Codeium Cascade) agent API.
|
|
3
|
+
*
|
|
4
|
+
* One `GetChatMessage` server-streaming Connect call per assistant turn. The
|
|
5
|
+
* request is a single gzipped frame; the response is a frame sequence of
|
|
6
|
+
* deltas, closed by a JSON trailer frame. Cascade reports text, thinking and
|
|
7
|
+
* tool calls as separate delta fields on the same message, so this adapter owns
|
|
8
|
+
* the block bookkeeping senpi's event protocol expects.
|
|
9
|
+
*/
|
|
10
|
+
import { AssistantMessageEventStream } from "../utils/event-stream.js";
|
|
11
|
+
import { GetChatMessageRequestSchema, GetChatMessageResponseSchema } from "./devin-agent/gen/cascade_pb.js";
|
|
12
|
+
import { applyDevinResponse } from "./devin-agent/stream-state.js";
|
|
13
|
+
import { buildDevinChatRequest, DEVIN_CHAT_MESSAGE_PATH, DEVIN_DEFAULT_BASE_URL, decodeDevinFrames, encodeDevinRequestFrame, normalizeDevinSessionToken, } from "./devin-agent/wire.js";
|
|
14
|
+
export const stream = (model, context, options) => {
|
|
15
|
+
const events = new AssistantMessageEventStream();
|
|
16
|
+
void run(model, context, events, options);
|
|
17
|
+
return events;
|
|
18
|
+
};
|
|
19
|
+
export const streamSimple = stream;
|
|
20
|
+
async function run(model, context, events, options) {
|
|
21
|
+
const output = {
|
|
22
|
+
role: "assistant",
|
|
23
|
+
content: [],
|
|
24
|
+
api: "devin-agent",
|
|
25
|
+
provider: model.provider,
|
|
26
|
+
model: model.id,
|
|
27
|
+
usage: {
|
|
28
|
+
input: 0,
|
|
29
|
+
output: 0,
|
|
30
|
+
cacheRead: 0,
|
|
31
|
+
cacheWrite: 0,
|
|
32
|
+
totalTokens: 0,
|
|
33
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
34
|
+
},
|
|
35
|
+
stopReason: "stop",
|
|
36
|
+
timestamp: Date.now(),
|
|
37
|
+
};
|
|
38
|
+
const state = { textIndex: undefined, thinkingIndex: undefined, toolCalls: new Map() };
|
|
39
|
+
const signal = options?.signal;
|
|
40
|
+
try {
|
|
41
|
+
events.push({ type: "start", partial: output });
|
|
42
|
+
const request = buildDevinChatRequest({
|
|
43
|
+
model,
|
|
44
|
+
context,
|
|
45
|
+
apiKey: options?.apiKey,
|
|
46
|
+
cascadeId: options?.cascadeId,
|
|
47
|
+
maxTokens: options?.maxTokens,
|
|
48
|
+
temperature: options?.temperature,
|
|
49
|
+
});
|
|
50
|
+
const baseUrl = model.baseUrl || DEVIN_DEFAULT_BASE_URL;
|
|
51
|
+
const response = await fetch(baseUrl + DEVIN_CHAT_MESSAGE_PATH, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: {
|
|
54
|
+
"content-type": "application/connect+proto",
|
|
55
|
+
"connect-protocol-version": "1",
|
|
56
|
+
"connect-content-encoding": "gzip",
|
|
57
|
+
"connect-accept-encoding": "gzip",
|
|
58
|
+
authorization: `Bearer ${normalizeDevinSessionToken(options?.apiKey)}`,
|
|
59
|
+
},
|
|
60
|
+
body: encodeDevinRequestFrame(GetChatMessageRequestSchema, request),
|
|
61
|
+
signal,
|
|
62
|
+
});
|
|
63
|
+
await options?.onResponse?.({ status: response.status, headers: headersOf(response) }, model);
|
|
64
|
+
if (!response.ok || !response.body) {
|
|
65
|
+
throw new Error(`Devin request failed (HTTP ${response.status})${await detail(response)}`);
|
|
66
|
+
}
|
|
67
|
+
for await (const frame of decodeDevinFrames(response.body, GetChatMessageResponseSchema)) {
|
|
68
|
+
if (frame.message)
|
|
69
|
+
applyDevinResponse(frame.message, output, events, state);
|
|
70
|
+
}
|
|
71
|
+
finalizeBlocks(output, events, state);
|
|
72
|
+
// Cascade can close a turn that carries a tool call without ever sending an
|
|
73
|
+
// explicit stop reason. Only the default "stop" is upgraded: a server-reported
|
|
74
|
+
// "length" means the turn was truncated, and a truncated tool call must not be
|
|
75
|
+
// advertised as a complete one.
|
|
76
|
+
if (output.stopReason === "stop" && output.content.some(isToolCall))
|
|
77
|
+
output.stopReason = "toolUse";
|
|
78
|
+
// Cascade reports a server error or a content filter as a stop reason on an
|
|
79
|
+
// otherwise well-formed stream. senpi's protocol has no "done because it
|
|
80
|
+
// failed", so that turn terminates as an error event, not a done event.
|
|
81
|
+
if (output.stopReason === "error") {
|
|
82
|
+
output.errorMessage ??= "Devin ended the turn with a server error or a content filter";
|
|
83
|
+
events.push({ type: "error", reason: "error", error: output });
|
|
84
|
+
events.end();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
events.push({ type: "done", reason: doneReasonOf(output.stopReason), message: output });
|
|
88
|
+
events.end();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
finalizeBlocks(output, events, state);
|
|
92
|
+
const aborted = signal?.aborted === true || (error instanceof Error && error.name === "AbortError");
|
|
93
|
+
output.stopReason = aborted ? "aborted" : "error";
|
|
94
|
+
output.errorMessage = aborted ? "Request was aborted" : messageOf(error);
|
|
95
|
+
events.push({ type: "error", reason: output.stopReason, error: output });
|
|
96
|
+
events.end();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Narrows a settled stop reason to the three senpi accepts on a done event. */
|
|
100
|
+
function doneReasonOf(stopReason) {
|
|
101
|
+
switch (stopReason) {
|
|
102
|
+
case "length":
|
|
103
|
+
return "length";
|
|
104
|
+
case "toolUse":
|
|
105
|
+
return "toolUse";
|
|
106
|
+
default:
|
|
107
|
+
return "stop";
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function headersOf(response) {
|
|
111
|
+
const headers = {};
|
|
112
|
+
response.headers.forEach((value, key) => {
|
|
113
|
+
headers[key] = value;
|
|
114
|
+
});
|
|
115
|
+
return headers;
|
|
116
|
+
}
|
|
117
|
+
function isToolCall(content) {
|
|
118
|
+
return content.type === "toolCall";
|
|
119
|
+
}
|
|
120
|
+
function finalizeBlocks(output, events, state) {
|
|
121
|
+
if (state.thinkingIndex !== undefined) {
|
|
122
|
+
const block = output.content[state.thinkingIndex];
|
|
123
|
+
if (block?.type === "thinking") {
|
|
124
|
+
events.push({
|
|
125
|
+
type: "thinking_end",
|
|
126
|
+
contentIndex: state.thinkingIndex,
|
|
127
|
+
content: block.thinking,
|
|
128
|
+
partial: output,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
state.thinkingIndex = undefined;
|
|
132
|
+
}
|
|
133
|
+
if (state.textIndex !== undefined) {
|
|
134
|
+
const block = output.content[state.textIndex];
|
|
135
|
+
if (block?.type === "text") {
|
|
136
|
+
events.push({ type: "text_end", contentIndex: state.textIndex, content: block.text, partial: output });
|
|
137
|
+
}
|
|
138
|
+
state.textIndex = undefined;
|
|
139
|
+
}
|
|
140
|
+
for (const [, entry] of state.toolCalls) {
|
|
141
|
+
const block = output.content[entry.contentIndex];
|
|
142
|
+
if (block?.type === "toolCall") {
|
|
143
|
+
events.push({ type: "toolcall_end", contentIndex: entry.contentIndex, toolCall: block, partial: output });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
state.toolCalls.clear();
|
|
147
|
+
}
|
|
148
|
+
async function detail(response) {
|
|
149
|
+
try {
|
|
150
|
+
const body = await response.text();
|
|
151
|
+
return body ? `: ${body.slice(0, 500)}` : "";
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return "";
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function messageOf(error) {
|
|
158
|
+
if (error instanceof Error)
|
|
159
|
+
return error.message;
|
|
160
|
+
return String(error);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=devin-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devin-agent.js","sourceRoot":"","sources":["../../src/api/devin-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Devin (Cognition/Codeium Cascade) agent API.\n *\n * One `GetChatMessage` server-streaming Connect call per assistant turn. The\n * request is a single gzipped frame; the response is a frame sequence of\n * deltas, closed by a JSON trailer frame. Cascade reports text, thinking and\n * tool calls as separate delta fields on the same message, so this adapter owns\n * the block bookkeeping senpi's event protocol expects.\n */\n\nimport type { AssistantMessage, Context, Model, StreamFunction, ToolCall } from \"../types.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { GetChatMessageRequestSchema, GetChatMessageResponseSchema } from \"./devin-agent/gen/cascade_pb.ts\";\nimport { applyDevinResponse, type DevinStreamState } from \"./devin-agent/stream-state.ts\";\nimport type { DevinAgentOptions } from \"./devin-agent/types.ts\";\nimport {\n\tbuildDevinChatRequest,\n\tDEVIN_CHAT_MESSAGE_PATH,\n\tDEVIN_DEFAULT_BASE_URL,\n\tdecodeDevinFrames,\n\tencodeDevinRequestFrame,\n\tnormalizeDevinSessionToken,\n} from \"./devin-agent/wire.ts\";\n\nexport const stream: StreamFunction<\"devin-agent\", DevinAgentOptions> = (\n\tmodel: Model<\"devin-agent\">,\n\tcontext: Context,\n\toptions?: DevinAgentOptions,\n) => {\n\tconst events = new AssistantMessageEventStream();\n\tvoid run(model, context, events, options);\n\treturn events;\n};\n\nexport const streamSimple: StreamFunction<\"devin-agent\", DevinAgentOptions> = stream;\n\nasync function run(\n\tmodel: Model<\"devin-agent\">,\n\tcontext: Context,\n\tevents: AssistantMessageEventStream,\n\toptions: DevinAgentOptions | undefined,\n): Promise<void> {\n\tconst output: AssistantMessage = {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: \"devin-agent\",\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n\tconst state: DevinStreamState = { textIndex: undefined, thinkingIndex: undefined, toolCalls: new Map() };\n\tconst signal = options?.signal;\n\n\ttry {\n\t\tevents.push({ type: \"start\", partial: output });\n\t\tconst request = buildDevinChatRequest({\n\t\t\tmodel,\n\t\t\tcontext,\n\t\t\tapiKey: options?.apiKey,\n\t\t\tcascadeId: options?.cascadeId,\n\t\t\tmaxTokens: options?.maxTokens,\n\t\t\ttemperature: options?.temperature,\n\t\t});\n\t\tconst baseUrl = model.baseUrl || DEVIN_DEFAULT_BASE_URL;\n\t\tconst response = await fetch(baseUrl + DEVIN_CHAT_MESSAGE_PATH, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"content-type\": \"application/connect+proto\",\n\t\t\t\t\"connect-protocol-version\": \"1\",\n\t\t\t\t\"connect-content-encoding\": \"gzip\",\n\t\t\t\t\"connect-accept-encoding\": \"gzip\",\n\t\t\t\tauthorization: `Bearer ${normalizeDevinSessionToken(options?.apiKey)}`,\n\t\t\t},\n\t\t\tbody: encodeDevinRequestFrame(GetChatMessageRequestSchema, request),\n\t\t\tsignal,\n\t\t});\n\t\tawait options?.onResponse?.({ status: response.status, headers: headersOf(response) }, model);\n\n\t\tif (!response.ok || !response.body) {\n\t\t\tthrow new Error(`Devin request failed (HTTP ${response.status})${await detail(response)}`);\n\t\t}\n\n\t\tfor await (const frame of decodeDevinFrames(response.body, GetChatMessageResponseSchema)) {\n\t\t\tif (frame.message) applyDevinResponse(frame.message, output, events, state);\n\t\t}\n\n\t\tfinalizeBlocks(output, events, state);\n\t\t// Cascade can close a turn that carries a tool call without ever sending an\n\t\t// explicit stop reason. Only the default \"stop\" is upgraded: a server-reported\n\t\t// \"length\" means the turn was truncated, and a truncated tool call must not be\n\t\t// advertised as a complete one.\n\t\tif (output.stopReason === \"stop\" && output.content.some(isToolCall)) output.stopReason = \"toolUse\";\n\t\t// Cascade reports a server error or a content filter as a stop reason on an\n\t\t// otherwise well-formed stream. senpi's protocol has no \"done because it\n\t\t// failed\", so that turn terminates as an error event, not a done event.\n\t\tif (output.stopReason === \"error\") {\n\t\t\toutput.errorMessage ??= \"Devin ended the turn with a server error or a content filter\";\n\t\t\tevents.push({ type: \"error\", reason: \"error\", error: output });\n\t\t\tevents.end();\n\t\t\treturn;\n\t\t}\n\t\tevents.push({ type: \"done\", reason: doneReasonOf(output.stopReason), message: output });\n\t\tevents.end();\n\t} catch (error) {\n\t\tfinalizeBlocks(output, events, state);\n\t\tconst aborted = signal?.aborted === true || (error instanceof Error && error.name === \"AbortError\");\n\t\toutput.stopReason = aborted ? \"aborted\" : \"error\";\n\t\toutput.errorMessage = aborted ? \"Request was aborted\" : messageOf(error);\n\t\tevents.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\tevents.end();\n\t}\n}\n\n/** Narrows a settled stop reason to the three senpi accepts on a done event. */\nfunction doneReasonOf(stopReason: AssistantMessage[\"stopReason\"]): \"stop\" | \"length\" | \"toolUse\" {\n\tswitch (stopReason) {\n\t\tcase \"length\":\n\t\t\treturn \"length\";\n\t\tcase \"toolUse\":\n\t\t\treturn \"toolUse\";\n\t\tdefault:\n\t\t\treturn \"stop\";\n\t}\n}\n\nfunction headersOf(response: Response): Record<string, string> {\n\tconst headers: Record<string, string> = {};\n\tresponse.headers.forEach((value, key) => {\n\t\theaders[key] = value;\n\t});\n\treturn headers;\n}\n\nfunction isToolCall(content: AssistantMessage[\"content\"][number]): content is ToolCall {\n\treturn content.type === \"toolCall\";\n}\n\nfunction finalizeBlocks(output: AssistantMessage, events: AssistantMessageEventStream, state: DevinStreamState): void {\n\tif (state.thinkingIndex !== undefined) {\n\t\tconst block = output.content[state.thinkingIndex];\n\t\tif (block?.type === \"thinking\") {\n\t\t\tevents.push({\n\t\t\t\ttype: \"thinking_end\",\n\t\t\t\tcontentIndex: state.thinkingIndex,\n\t\t\t\tcontent: block.thinking,\n\t\t\t\tpartial: output,\n\t\t\t});\n\t\t}\n\t\tstate.thinkingIndex = undefined;\n\t}\n\tif (state.textIndex !== undefined) {\n\t\tconst block = output.content[state.textIndex];\n\t\tif (block?.type === \"text\") {\n\t\t\tevents.push({ type: \"text_end\", contentIndex: state.textIndex, content: block.text, partial: output });\n\t\t}\n\t\tstate.textIndex = undefined;\n\t}\n\tfor (const [, entry] of state.toolCalls) {\n\t\tconst block = output.content[entry.contentIndex];\n\t\tif (block?.type === \"toolCall\") {\n\t\t\tevents.push({ type: \"toolcall_end\", contentIndex: entry.contentIndex, toolCall: block, partial: output });\n\t\t}\n\t}\n\tstate.toolCalls.clear();\n}\n\nasync function detail(response: Response): Promise<string> {\n\ttry {\n\t\tconst body = await response.text();\n\t\treturn body ? `: ${body.slice(0, 500)}` : \"\";\n\t} catch {\n\t\treturn \"\";\n\t}\n}\n\nfunction messageOf(error: unknown): string {\n\tif (error instanceof Error) return error.message;\n\treturn String(error);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devin-agent.lazy.d.ts","sourceRoot":"","sources":["../../src/api/devin-agent.lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAcnD,QAAA,MAAM,oBAAoB,QAAO,OAAO,CAAC,eAAe,CACU,CAAC;AAEnE,eAAO,MAAM,aAAa,uBAAsC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|