@code-yeongyu/senpi 2026.9.10 → 2026.9.12-2

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.
Files changed (422) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  3. package/dist/core/agent-session-runtime.js +5 -1
  4. package/dist/core/agent-session-runtime.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +70 -9
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +183 -140
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/auth-storage.d.ts +2 -0
  10. package/dist/core/auth-storage.d.ts.map +1 -1
  11. package/dist/core/auth-storage.js +49 -17
  12. package/dist/core/auth-storage.js.map +1 -1
  13. package/dist/core/brand.d.ts +5 -0
  14. package/dist/core/brand.d.ts.map +1 -1
  15. package/dist/core/brand.js +13 -0
  16. package/dist/core/brand.js.map +1 -1
  17. package/dist/core/changelog-source.d.ts +8 -0
  18. package/dist/core/changelog-source.d.ts.map +1 -0
  19. package/dist/core/changelog-source.js +19 -0
  20. package/dist/core/changelog-source.js.map +1 -0
  21. package/dist/core/credential-accounts.d.ts +3 -0
  22. package/dist/core/credential-accounts.d.ts.map +1 -1
  23. package/dist/core/credential-accounts.js +20 -1
  24. package/dist/core/credential-accounts.js.map +1 -1
  25. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  26. package/dist/core/credential-pool/classify.js +8 -0
  27. package/dist/core/credential-pool/classify.js.map +1 -1
  28. package/dist/core/cursor-history-admission.d.ts +50 -0
  29. package/dist/core/cursor-history-admission.d.ts.map +1 -0
  30. package/dist/core/cursor-history-admission.js +130 -0
  31. package/dist/core/cursor-history-admission.js.map +1 -0
  32. package/dist/core/extensions/builtin/account/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/account/index.js +7 -3
  34. package/dist/core/extensions/builtin/account/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/account-display-name.d.ts +7 -0
  36. package/dist/core/extensions/builtin/account-display-name.d.ts.map +1 -0
  37. package/dist/core/extensions/builtin/account-display-name.js +40 -0
  38. package/dist/core/extensions/builtin/account-display-name.js.map +1 -0
  39. package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/ask-user/format.js +7 -2
  41. package/dist/core/extensions/builtin/ask-user/format.js.map +1 -1
  42. package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/ask-user/pending.js +3 -0
  44. package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +21 -9
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts +1 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js +11 -6
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts +9 -0
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js +10 -1
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
  56. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +3 -0
  57. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  58. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +19 -10
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
  61. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +3 -9
  63. package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
  64. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/config-reload/routine-settings.js +1 -0
  66. package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
  67. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +5 -3
  69. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
  70. package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts +1 -0
  71. package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
  72. package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.js.map +1 -1
  73. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +2 -1
  75. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  76. package/dist/core/extensions/builtin/cursor-cli-oauth/settings.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js +3 -9
  78. package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js.map +1 -1
  79. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/goal/agent-end-continuation.js +13 -1
  81. package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
  82. package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/goal/prompt.js +11 -8
  84. package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
  85. package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts +1 -0
  86. package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/goal/terminal-provider-error.js +28 -0
  88. package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
  89. package/dist/core/extensions/builtin/goal/todo-gate.js +2 -2
  90. package/dist/core/extensions/builtin/goal/todo-gate.js.map +1 -1
  91. package/dist/core/extensions/builtin/goal/tool-registration.js +2 -2
  92. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  93. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/gpt-account.js +19 -8
  95. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  96. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts +3 -0
  97. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts.map +1 -0
  98. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js +19 -0
  99. package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js.map +1 -0
  100. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +6 -6
  101. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  102. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +26 -7
  103. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  104. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/prompt-preset/presets.js +29 -0
  106. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  107. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  108. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  110. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  111. package/dist/core/high-reasoning-warning.d.ts.map +1 -1
  112. package/dist/core/high-reasoning-warning.js +5 -1
  113. package/dist/core/high-reasoning-warning.js.map +1 -1
  114. package/dist/core/manual-continue.d.ts +14 -0
  115. package/dist/core/manual-continue.d.ts.map +1 -1
  116. package/dist/core/manual-continue.js +13 -0
  117. package/dist/core/manual-continue.js.map +1 -1
  118. package/dist/core/model-runtime.d.ts.map +1 -1
  119. package/dist/core/model-runtime.js +2 -2
  120. package/dist/core/model-runtime.js.map +1 -1
  121. package/dist/core/remote-catalog-merge.d.ts +16 -0
  122. package/dist/core/remote-catalog-merge.d.ts.map +1 -0
  123. package/dist/core/remote-catalog-merge.js +75 -0
  124. package/dist/core/remote-catalog-merge.js.map +1 -0
  125. package/dist/core/remote-catalog-provider.d.ts +3 -0
  126. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  127. package/dist/core/remote-catalog-provider.js +12 -40
  128. package/dist/core/remote-catalog-provider.js.map +1 -1
  129. package/dist/core/session-entry-materializer.d.ts +12 -0
  130. package/dist/core/session-entry-materializer.d.ts.map +1 -0
  131. package/dist/core/session-entry-materializer.js +26 -0
  132. package/dist/core/session-entry-materializer.js.map +1 -0
  133. package/dist/core/session-manager.d.ts +38 -1
  134. package/dist/core/session-manager.d.ts.map +1 -1
  135. package/dist/core/session-manager.js +60 -21
  136. package/dist/core/session-manager.js.map +1 -1
  137. package/dist/core/session-write-reservation.d.ts +9 -0
  138. package/dist/core/session-write-reservation.d.ts.map +1 -1
  139. package/dist/core/session-write-reservation.js +33 -0
  140. package/dist/core/session-write-reservation.js.map +1 -1
  141. package/dist/core/settings-manager.d.ts +3 -0
  142. package/dist/core/settings-manager.d.ts.map +1 -1
  143. package/dist/core/settings-manager.js +10 -0
  144. package/dist/core/settings-manager.js.map +1 -1
  145. package/dist/modes/app-server/daemon/process.d.ts +6 -1
  146. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  147. package/dist/modes/app-server/daemon/process.js +23 -4
  148. package/dist/modes/app-server/daemon/process.js.map +1 -1
  149. package/dist/modes/app-server/protocol/account.d.ts +2 -0
  150. package/dist/modes/app-server/protocol/account.d.ts.map +1 -1
  151. package/dist/modes/app-server/protocol/account.js.map +1 -1
  152. package/dist/modes/interactive/components/ask-user-async-widget.d.ts +2 -0
  153. package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/ask-user-async-widget.js +17 -1
  155. package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -1
  156. package/dist/modes/interactive/components/ask-user-question-keys.d.ts +1 -1
  157. package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/ask-user-question-keys.js +65 -17
  159. package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -1
  160. package/dist/modes/interactive/components/ask-user-question-render.d.ts +2 -1
  161. package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -1
  162. package/dist/modes/interactive/components/ask-user-question-render.js +39 -9
  163. package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -1
  164. package/dist/modes/interactive/components/ask-user-question-state.d.ts +14 -4
  165. package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/ask-user-question-state.js +63 -6
  167. package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -1
  168. package/dist/modes/interactive/components/ask-user-question.d.ts +2 -0
  169. package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -1
  170. package/dist/modes/interactive/components/ask-user-question.js +27 -14
  171. package/dist/modes/interactive/components/ask-user-question.js.map +1 -1
  172. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/footer.js +51 -19
  174. package/dist/modes/interactive/components/footer.js.map +1 -1
  175. package/dist/modes/interactive/components/login-dialog.d.ts +11 -0
  176. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/login-dialog.js +29 -9
  178. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  179. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  180. package/dist/modes/interactive/components/tree-selector.js +7 -0
  181. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  182. package/dist/modes/interactive/help-content.d.ts.map +1 -1
  183. package/dist/modes/interactive/help-content.js +4 -0
  184. package/dist/modes/interactive/help-content.js.map +1 -1
  185. package/dist/modes/interactive/interactive-mode.d.ts +13 -4
  186. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  187. package/dist/modes/interactive/interactive-mode.js +46 -17
  188. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  189. package/dist/modes/interactive/tips/catalog/input-tips.js +1 -1
  190. package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
  191. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  192. package/dist/modes/rpc/connection-handler.js +3 -1
  193. package/dist/modes/rpc/connection-handler.js.map +1 -1
  194. package/dist/modes/rpc/connection-question-bridge.js +1 -1
  195. package/dist/modes/rpc/connection-question-bridge.js.map +1 -1
  196. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  197. package/dist/modes/rpc/host-ensure.js +33 -11
  198. package/dist/modes/rpc/host-ensure.js.map +1 -1
  199. package/dist/modes/rpc/host-lifecycle.d.ts +14 -0
  200. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  201. package/dist/modes/rpc/host-lifecycle.js +31 -5
  202. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  203. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  204. package/dist/modes/rpc/rpc-input-validation.js +2 -0
  205. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  206. package/dist/modes/rpc/rpc-types.d.ts +4 -1
  207. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  208. package/dist/modes/rpc/rpc-types.js +1 -0
  209. package/dist/modes/rpc/rpc-types.js.map +1 -1
  210. package/dist/modes/rpc/session-path-reservations.d.ts +30 -0
  211. package/dist/modes/rpc/session-path-reservations.d.ts.map +1 -0
  212. package/dist/modes/rpc/session-path-reservations.js +58 -0
  213. package/dist/modes/rpc/session-path-reservations.js.map +1 -0
  214. package/dist/modes/rpc/session-registry.d.ts +3 -1
  215. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  216. package/dist/modes/rpc/session-registry.js.map +1 -1
  217. package/dist/modes/rpc/session-worker-client.d.ts +10 -8
  218. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  219. package/dist/modes/rpc/session-worker-client.js +14 -23
  220. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  221. package/dist/modes/rpc/session-worker-credit.d.ts +17 -0
  222. package/dist/modes/rpc/session-worker-credit.d.ts.map +1 -0
  223. package/dist/modes/rpc/session-worker-credit.js +39 -0
  224. package/dist/modes/rpc/session-worker-credit.js.map +1 -0
  225. package/dist/modes/rpc/session-worker-protocol.d.ts +10 -0
  226. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
  227. package/dist/modes/rpc/session-worker-protocol.js +2 -0
  228. package/dist/modes/rpc/session-worker-protocol.js.map +1 -1
  229. package/dist/modes/rpc/session-worker-signals.d.ts +7 -0
  230. package/dist/modes/rpc/session-worker-signals.d.ts.map +1 -0
  231. package/dist/modes/rpc/session-worker-signals.js +19 -0
  232. package/dist/modes/rpc/session-worker-signals.js.map +1 -0
  233. package/dist/modes/rpc/session-worker.js +12 -16
  234. package/dist/modes/rpc/session-worker.js.map +1 -1
  235. package/dist/modes/rpc/worker-session-registry.d.ts +12 -0
  236. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
  237. package/dist/modes/rpc/worker-session-registry.js +51 -24
  238. package/dist/modes/rpc/worker-session-registry.js.map +1 -1
  239. package/dist/utils/changelog.d.ts +3 -1
  240. package/dist/utils/changelog.d.ts.map +1 -1
  241. package/dist/utils/changelog.js +89 -23
  242. package/dist/utils/changelog.js.map +1 -1
  243. package/dist/utils/paths.d.ts +5 -0
  244. package/dist/utils/paths.d.ts.map +1 -1
  245. package/dist/utils/paths.js +14 -1
  246. package/dist/utils/paths.js.map +1 -1
  247. package/docs/app-server.md +6 -0
  248. package/docs/extensions.md +19 -3
  249. package/docs/rpc.md +24 -6
  250. package/docs/settings.md +2 -1
  251. package/docs/tui.md +1 -1
  252. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +52 -0
  253. package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -4
  254. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  255. package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output-buffer.ts +58 -0
  256. package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output.ts +9 -64
  257. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +1 -1
  258. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  259. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +11 -0
  260. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -1
  261. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +18 -0
  262. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
  263. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +1 -1
  264. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  265. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +5 -1
  266. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  267. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts +19 -0
  268. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts.map +1 -0
  269. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js +135 -0
  270. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js.map +1 -0
  271. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts +23 -0
  272. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts.map +1 -0
  273. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js +71 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js.map +1 -0
  275. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts +1261 -0
  276. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts.map +1 -0
  277. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js +431 -0
  278. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js.map +1 -0
  279. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts +42 -0
  280. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts.map +1 -0
  281. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js +68 -0
  282. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js.map +1 -0
  283. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts +43 -0
  284. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts.map +1 -0
  285. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js +43 -0
  286. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js.map +1 -0
  287. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts +36 -0
  288. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts.map +1 -0
  289. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js +158 -0
  290. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js.map +1 -0
  291. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts +26 -0
  292. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts.map +1 -0
  293. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js +145 -0
  294. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js.map +1 -0
  295. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts +16 -0
  296. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts.map +1 -0
  297. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js +69 -0
  298. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js.map +1 -0
  299. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts +12 -0
  300. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts.map +1 -0
  301. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js +3 -0
  302. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js.map +1 -0
  303. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts +26 -0
  304. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts.map +1 -0
  305. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js +61 -0
  306. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js.map +1 -0
  307. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts +8 -0
  308. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts.map +1 -0
  309. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js +8 -0
  310. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js.map +1 -0
  311. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts +22 -0
  312. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts.map +1 -0
  313. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js +217 -0
  314. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js.map +1 -0
  315. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts +5 -0
  316. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts.map +1 -0
  317. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js +23 -0
  318. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js.map +1 -0
  319. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts +25 -0
  320. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts.map +1 -0
  321. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js +124 -0
  322. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js.map +1 -0
  323. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts +18 -0
  324. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts.map +1 -0
  325. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js +101 -0
  326. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js.map +1 -0
  327. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts +19 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts.map +1 -0
  329. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js +116 -0
  330. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js.map +1 -0
  331. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +5 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts +24 -0
  335. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
  336. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js +86 -0
  337. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js.map +1 -0
  338. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
  339. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
  341. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +51 -4
  343. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +196 -7
  345. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +8 -0
  347. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +10 -0
  349. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  350. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +9 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  352. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  353. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
  354. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
  355. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
  356. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
  357. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  358. package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -0
  359. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  360. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts +32 -0
  361. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts.map +1 -0
  362. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js +62 -0
  363. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js.map +1 -0
  364. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
  365. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +2 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
  367. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -4
  368. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  369. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
  370. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  371. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -1
  372. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  373. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +11 -1
  374. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  375. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  376. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +1 -1
  377. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  378. package/node_modules/@earendil-works/pi-ai/dist/models.js +14 -5
  379. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  380. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  381. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  382. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +2 -1
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  392. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
  395. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts +12 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts.map +1 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js +62 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js.map +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts +12 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts.map +1 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js +37 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js.map +1 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +3 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  406. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts +12 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js +93 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  412. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +4 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  415. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  416. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  417. package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts +1 -1
  418. package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js +55 -16
  420. package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  422. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACN,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEb,MAAM,qBAAqB,CAAC;AAO7B,eAAO,MAAM,kBAAkB;aAC9B,OAAO,EAAE,WAAW;aACpB,OAAO,EAAE,QAAQ;aACjB,UAAU,EAAE,UAAU;aACtB,aAAa,EAAE,QAAQ;aACvB,gBAAgB,EAAE,UAAU;aAC5B,MAAM;aACN,EAAE;CACO,CAAC;AAEX,eAAO,MAAM,wBAAwB;aACpC,OAAO,EAAE,QAAQ;aACjB,UAAU,EAAE,WAAW;aACvB,aAAa,EAAE,QAAQ;aACvB,gBAAgB,EAAE,WAAW;aAC7B,MAAM;aACN,EAAE;CACO,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,aAAa,EAMlE,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,SAAK,GAAG,QAAQ,CAMnF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAM3E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Cascade `Metadata` construction.
3
+ *
4
+ * Cascade gates behavior on the caller's identity tuple, and the two identities
5
+ * below are the ones the released Devin CLI actually presents:
6
+ * - the released chat identity (`devin-cli` / `chisel`) unlocks the CLI model
7
+ * surface and router assignment on `GetUserJwt`, `AssignModel` and
8
+ * `GetChatMessage`;
9
+ * - the dev-channel `chisel` identity is what the CLI announces on
10
+ * `GetCliModelConfigs`, and it is the one that returns the full catalog.
11
+ *
12
+ * The session token is scheme-prefixed on the wire, and `userJwt` stays empty
13
+ * for the calls the CLI makes with the session token alone.
14
+ */
15
+ import { create } from "@bufbuild/protobuf";
16
+ import { DisplayOption as DisplayOptionValue, MetadataSchema, } from "./gen/cascade_pb.js";
17
+ const DEVIN_SESSION_TOKEN_PREFIX = "devin-session-token$";
18
+ const DEVIN_OS = process.platform === "darwin" ? "darwin" : process.platform === "win32" ? "windows" : "linux";
19
+ const DEVIN_LOCALE = "en";
20
+ export const DEVIN_CLI_IDENTITY = {
21
+ ideName: "devin-cli",
22
+ ideType: "chisel",
23
+ ideVersion: "3000.6.2",
24
+ extensionName: "chisel",
25
+ extensionVersion: "3000.6.2",
26
+ locale: DEVIN_LOCALE,
27
+ os: DEVIN_OS,
28
+ };
29
+ export const DEVIN_DISCOVERY_IDENTITY = {
30
+ ideName: "chisel",
31
+ ideVersion: "0.0.0-dev",
32
+ extensionName: "chisel",
33
+ extensionVersion: "0.0.0-dev",
34
+ locale: DEVIN_LOCALE,
35
+ os: DEVIN_OS,
36
+ };
37
+ /**
38
+ * Asking for the internal slots is what makes Cascade return its full catalog;
39
+ * the internal ones are filtered client-side, exactly as the native client does.
40
+ */
41
+ export const DEVIN_SUPPORTED_MODEL_DISPLAYS = [
42
+ DisplayOptionValue.MODEL_ROUTER,
43
+ DisplayOptionValue.QUICK_REVIEW,
44
+ DisplayOptionValue.INTERNAL_DEFAULT,
45
+ DisplayOptionValue.UNCLASSIFIED,
46
+ DisplayOptionValue.NORMAL,
47
+ ];
48
+ /** Session token as the wire format carries it: the scheme prefix is required. */
49
+ export function normalizeDevinSessionToken(apiKey) {
50
+ if (!apiKey)
51
+ return "";
52
+ return apiKey.startsWith(DEVIN_SESSION_TOKEN_PREFIX) ? apiKey : `${DEVIN_SESSION_TOKEN_PREFIX}${apiKey}`;
53
+ }
54
+ export function devinCliMetadata(apiKey, userJwt = "") {
55
+ return create(MetadataSchema, {
56
+ ...DEVIN_CLI_IDENTITY,
57
+ apiKey: normalizeDevinSessionToken(apiKey),
58
+ userJwt,
59
+ });
60
+ }
61
+ export function devinDiscoveryMetadata(apiKey) {
62
+ return create(MetadataSchema, {
63
+ ...DEVIN_DISCOVERY_IDENTITY,
64
+ apiKey: normalizeDevinSessionToken(apiKey),
65
+ supportedModelDisplays: [...DEVIN_SUPPORTED_MODEL_DISPLAYS],
66
+ });
67
+ }
68
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/api/devin-agent/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAEN,aAAa,IAAI,kBAAkB,EAEnC,cAAc,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AAE1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/G,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,UAAU;IACtB,aAAa,EAAE,QAAQ;IACvB,gBAAgB,EAAE,UAAU;IAC5B,MAAM,EAAE,YAAY;IACpB,EAAE,EAAE,QAAQ;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,QAAQ;IACvB,gBAAgB,EAAE,WAAW;IAC7B,MAAM,EAAE,YAAY;IACpB,EAAE,EAAE,QAAQ;CACH,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAA6B;IACvE,kBAAkB,CAAC,YAAY;IAC/B,kBAAkB,CAAC,YAAY;IAC/B,kBAAkB,CAAC,gBAAgB;IACnC,kBAAkB,CAAC,YAAY;IAC/B,kBAAkB,CAAC,MAAM;CACzB,CAAC;AAEF,kFAAkF;AAClF,MAAM,UAAU,0BAA0B,CAAC,MAA0B;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,0BAA0B,GAAG,MAAM,EAAE,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA0B,EAAE,OAAO,GAAG,EAAE;IACxE,OAAO,MAAM,CAAC,cAAc,EAAE;QAC7B,GAAG,kBAAkB;QACrB,MAAM,EAAE,0BAA0B,CAAC,MAAM,CAAC;QAC1C,OAAO;KACP,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA0B;IAChE,OAAO,MAAM,CAAC,cAAc,EAAE;QAC7B,GAAG,wBAAwB;QAC3B,MAAM,EAAE,0BAA0B,CAAC,MAAM,CAAC;QAC1C,sBAAsB,EAAE,CAAC,GAAG,8BAA8B,CAAC;KAC3D,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Cascade `Metadata` construction.\n *\n * Cascade gates behavior on the caller's identity tuple, and the two identities\n * below are the ones the released Devin CLI actually presents:\n * - the released chat identity (`devin-cli` / `chisel`) unlocks the CLI model\n * surface and router assignment on `GetUserJwt`, `AssignModel` and\n * `GetChatMessage`;\n * - the dev-channel `chisel` identity is what the CLI announces on\n * `GetCliModelConfigs`, and it is the one that returns the full catalog.\n *\n * The session token is scheme-prefixed on the wire, and `userJwt` stays empty\n * for the calls the CLI makes with the session token alone.\n */\n\nimport { create } from \"@bufbuild/protobuf\";\nimport {\n\ttype DisplayOption,\n\tDisplayOption as DisplayOptionValue,\n\ttype Metadata,\n\tMetadataSchema,\n} from \"./gen/cascade_pb.ts\";\n\nconst DEVIN_SESSION_TOKEN_PREFIX = \"devin-session-token$\";\n\nconst DEVIN_OS = process.platform === \"darwin\" ? \"darwin\" : process.platform === \"win32\" ? \"windows\" : \"linux\";\nconst DEVIN_LOCALE = \"en\";\n\nexport const DEVIN_CLI_IDENTITY = {\n\tideName: \"devin-cli\",\n\tideType: \"chisel\",\n\tideVersion: \"3000.6.2\",\n\textensionName: \"chisel\",\n\textensionVersion: \"3000.6.2\",\n\tlocale: DEVIN_LOCALE,\n\tos: DEVIN_OS,\n} as const;\n\nexport const DEVIN_DISCOVERY_IDENTITY = {\n\tideName: \"chisel\",\n\tideVersion: \"0.0.0-dev\",\n\textensionName: \"chisel\",\n\textensionVersion: \"0.0.0-dev\",\n\tlocale: DEVIN_LOCALE,\n\tos: DEVIN_OS,\n} as const;\n\n/**\n * Asking for the internal slots is what makes Cascade return its full catalog;\n * the internal ones are filtered client-side, exactly as the native client does.\n */\nexport const DEVIN_SUPPORTED_MODEL_DISPLAYS: readonly DisplayOption[] = [\n\tDisplayOptionValue.MODEL_ROUTER,\n\tDisplayOptionValue.QUICK_REVIEW,\n\tDisplayOptionValue.INTERNAL_DEFAULT,\n\tDisplayOptionValue.UNCLASSIFIED,\n\tDisplayOptionValue.NORMAL,\n];\n\n/** Session token as the wire format carries it: the scheme prefix is required. */\nexport function normalizeDevinSessionToken(apiKey: string | undefined): string {\n\tif (!apiKey) return \"\";\n\treturn apiKey.startsWith(DEVIN_SESSION_TOKEN_PREFIX) ? apiKey : `${DEVIN_SESSION_TOKEN_PREFIX}${apiKey}`;\n}\n\nexport function devinCliMetadata(apiKey: string | undefined, userJwt = \"\"): Metadata {\n\treturn create(MetadataSchema, {\n\t\t...DEVIN_CLI_IDENTITY,\n\t\tapiKey: normalizeDevinSessionToken(apiKey),\n\t\tuserJwt,\n\t});\n}\n\nexport function devinDiscoveryMetadata(apiKey: string | undefined): Metadata {\n\treturn create(MetadataSchema, {\n\t\t...DEVIN_DISCOVERY_IDENTITY,\n\t\tapiKey: normalizeDevinSessionToken(apiKey),\n\t\tsupportedModelDisplays: [...DEVIN_SUPPORTED_MODEL_DISPLAYS],\n\t});\n}\n"]}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Cascade RPC paths and wire constants.
3
+ *
4
+ * Devin's released CLI speaks the Connect protocol over HTTP/1.1 against
5
+ * Codeium's Cascade edge. The service paths are spelled out here rather than
6
+ * derived from a generated service descriptor: the vendored schema in
7
+ * packages/ai/proto/devin/cascade.proto carries only the message subset the
8
+ * transport needs, so its package name is cosmetic while these paths are the
9
+ * real contract.
10
+ */
11
+ export declare const DEVIN_DEFAULT_BASE_URL = "https://server.codeium.com";
12
+ export declare const DEVIN_CHAT_MESSAGE_PATH = "/exa.api_server_pb.ApiServerService/GetChatMessage";
13
+ export declare const DEVIN_CLI_MODEL_CONFIGS_PATH = "/exa.api_server_pb.ApiServerService/GetCliModelConfigs";
14
+ export declare const DEVIN_ASSIGN_MODEL_PATH = "/exa.api_server_pb.ApiServerService/AssignModel";
15
+ export declare const DEVIN_USER_JWT_PATH = "/exa.auth_pb.AuthService/GetUserJwt";
16
+ /**
17
+ * Request headers the released CLI sends on the streaming chat call. Auth rides
18
+ * inside `Metadata.api_key`, so there is no `authorization` header.
19
+ */
20
+ export declare const DEVIN_CHAT_HEADERS: {
21
+ readonly "content-type": "application/connect+proto";
22
+ readonly "connect-protocol-version": "1";
23
+ readonly "connect-content-encoding": "gzip";
24
+ readonly "accept-encoding": "identity";
25
+ readonly "user-agent": "connect-go/1.18.1 (go1.26.3)";
26
+ readonly "connect-accept-encoding": "gzip";
27
+ };
28
+ /** Unary Connect calls carry a bare protobuf body, not the 5-byte streaming frame. */
29
+ export declare const DEVIN_UNARY_HEADERS: {
30
+ readonly "content-type": "application/proto";
31
+ readonly "connect-protocol-version": "1";
32
+ readonly accept: "*/*";
33
+ };
34
+ /** Connect frame flags: bit 0 marks a gzipped payload, bit 1 the end-of-stream trailer. */
35
+ export declare const DEVIN_COMPRESSED_FLAG = 1;
36
+ export declare const DEVIN_TRAILER_FLAG = 2;
37
+ /**
38
+ * Hard upper bound on one Connect frame payload. The 4-byte length prefix can
39
+ * describe 4 GiB; a corrupted or hostile prefix must not turn into an
40
+ * allocation of that size, so anything larger is a protocol error.
41
+ */
42
+ export declare const DEVIN_MAX_FRAME_PAYLOAD: number;
43
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,uBAAuB,uDAAuD,CAAC;AAC5F,eAAO,MAAM,4BAA4B,2DAA2D,CAAC;AACrG,eAAO,MAAM,uBAAuB,oDAAoD,CAAC;AACzF,eAAO,MAAM,mBAAmB,wCAAwC,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;aAC9B,cAAc,EAAE,2BAA2B;aAC3C,0BAA0B,EAAE,GAAG;aAC/B,0BAA0B,EAAE,MAAM;aAClC,iBAAiB,EAAE,UAAU;aAC7B,YAAY,EAAE,8BAA8B;aAC5C,yBAAyB,EAAE,MAAM;CACxB,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,mBAAmB;aAC/B,cAAc,EAAE,mBAAmB;aACnC,0BAA0B,EAAE,GAAG;aAC/B,MAAM,EAAE,KAAK;CACJ,CAAC;AAEX,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB,IAAO,CAAC;AAC1C,eAAO,MAAM,kBAAkB,IAAO,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAmB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Cascade RPC paths and wire constants.
3
+ *
4
+ * Devin's released CLI speaks the Connect protocol over HTTP/1.1 against
5
+ * Codeium's Cascade edge. The service paths are spelled out here rather than
6
+ * derived from a generated service descriptor: the vendored schema in
7
+ * packages/ai/proto/devin/cascade.proto carries only the message subset the
8
+ * transport needs, so its package name is cosmetic while these paths are the
9
+ * real contract.
10
+ */
11
+ export const DEVIN_DEFAULT_BASE_URL = "https://server.codeium.com";
12
+ export const DEVIN_CHAT_MESSAGE_PATH = "/exa.api_server_pb.ApiServerService/GetChatMessage";
13
+ export const DEVIN_CLI_MODEL_CONFIGS_PATH = "/exa.api_server_pb.ApiServerService/GetCliModelConfigs";
14
+ export const DEVIN_ASSIGN_MODEL_PATH = "/exa.api_server_pb.ApiServerService/AssignModel";
15
+ export const DEVIN_USER_JWT_PATH = "/exa.auth_pb.AuthService/GetUserJwt";
16
+ /**
17
+ * Request headers the released CLI sends on the streaming chat call. Auth rides
18
+ * inside `Metadata.api_key`, so there is no `authorization` header.
19
+ */
20
+ export const DEVIN_CHAT_HEADERS = {
21
+ "content-type": "application/connect+proto",
22
+ "connect-protocol-version": "1",
23
+ "connect-content-encoding": "gzip",
24
+ "accept-encoding": "identity",
25
+ "user-agent": "connect-go/1.18.1 (go1.26.3)",
26
+ "connect-accept-encoding": "gzip",
27
+ };
28
+ /** Unary Connect calls carry a bare protobuf body, not the 5-byte streaming frame. */
29
+ export const DEVIN_UNARY_HEADERS = {
30
+ "content-type": "application/proto",
31
+ "connect-protocol-version": "1",
32
+ accept: "*/*",
33
+ };
34
+ /** Connect frame flags: bit 0 marks a gzipped payload, bit 1 the end-of-stream trailer. */
35
+ export const DEVIN_COMPRESSED_FLAG = 0x01;
36
+ export const DEVIN_TRAILER_FLAG = 0x02;
37
+ /**
38
+ * Hard upper bound on one Connect frame payload. The 4-byte length prefix can
39
+ * describe 4 GiB; a corrupted or hostile prefix must not turn into an
40
+ * allocation of that size, so anything larger is a protocol error.
41
+ */
42
+ export const DEVIN_MAX_FRAME_PAYLOAD = 64 * 1024 * 1024;
43
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/api/devin-agent/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,oDAAoD,CAAC;AAC5F,MAAM,CAAC,MAAM,4BAA4B,GAAG,wDAAwD,CAAC;AACrG,MAAM,CAAC,MAAM,uBAAuB,GAAG,iDAAiD,CAAC;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,cAAc,EAAE,2BAA2B;IAC3C,0BAA0B,EAAE,GAAG;IAC/B,0BAA0B,EAAE,MAAM;IAClC,iBAAiB,EAAE,UAAU;IAC7B,YAAY,EAAE,8BAA8B;IAC5C,yBAAyB,EAAE,MAAM;CACxB,CAAC;AAEX,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,cAAc,EAAE,mBAAmB;IACnC,0BAA0B,EAAE,GAAG;IAC/B,MAAM,EAAE,KAAK;CACJ,CAAC;AAEX,2FAA2F;AAC3F,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC","sourcesContent":["/**\n * Cascade RPC paths and wire constants.\n *\n * Devin's released CLI speaks the Connect protocol over HTTP/1.1 against\n * Codeium's Cascade edge. The service paths are spelled out here rather than\n * derived from a generated service descriptor: the vendored schema in\n * packages/ai/proto/devin/cascade.proto carries only the message subset the\n * transport needs, so its package name is cosmetic while these paths are the\n * real contract.\n */\n\nexport const DEVIN_DEFAULT_BASE_URL = \"https://server.codeium.com\";\nexport const DEVIN_CHAT_MESSAGE_PATH = \"/exa.api_server_pb.ApiServerService/GetChatMessage\";\nexport const DEVIN_CLI_MODEL_CONFIGS_PATH = \"/exa.api_server_pb.ApiServerService/GetCliModelConfigs\";\nexport const DEVIN_ASSIGN_MODEL_PATH = \"/exa.api_server_pb.ApiServerService/AssignModel\";\nexport const DEVIN_USER_JWT_PATH = \"/exa.auth_pb.AuthService/GetUserJwt\";\n\n/**\n * Request headers the released CLI sends on the streaming chat call. Auth rides\n * inside `Metadata.api_key`, so there is no `authorization` header.\n */\nexport const DEVIN_CHAT_HEADERS = {\n\t\"content-type\": \"application/connect+proto\",\n\t\"connect-protocol-version\": \"1\",\n\t\"connect-content-encoding\": \"gzip\",\n\t\"accept-encoding\": \"identity\",\n\t\"user-agent\": \"connect-go/1.18.1 (go1.26.3)\",\n\t\"connect-accept-encoding\": \"gzip\",\n} as const;\n\n/** Unary Connect calls carry a bare protobuf body, not the 5-byte streaming frame. */\nexport const DEVIN_UNARY_HEADERS = {\n\t\"content-type\": \"application/proto\",\n\t\"connect-protocol-version\": \"1\",\n\taccept: \"*/*\",\n} as const;\n\n/** Connect frame flags: bit 0 marks a gzipped payload, bit 1 the end-of-stream trailer. */\nexport const DEVIN_COMPRESSED_FLAG = 0x01;\nexport const DEVIN_TRAILER_FLAG = 0x02;\n\n/**\n * Hard upper bound on one Connect frame payload. The 4-byte length prefix can\n * describe 4 GiB; a corrupted or hostile prefix must not turn into an\n * allocation of that size, so anything larger is a protocol error.\n */\nexport const DEVIN_MAX_FRAME_PAYLOAD = 64 * 1024 * 1024;\n"]}
@@ -0,0 +1,36 @@
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 must be UUID-shaped; they are
8
+ * derived deterministically from the conversation id and the entry index so a
9
+ * retried turn re-sends the same ids instead of forking the server-side
10
+ * transcript, while a native Devin turn is replayed under the id the server
11
+ * minted for it.
12
+ */
13
+ import type { Context, Message, Model } from "../../types.ts";
14
+ import { type ChatMessagePrompt, type GetChatMessageRequest } from "./gen/cascade_pb.ts";
15
+ /** Cascade's own stop vocabulary; the server echoes these as STOP_PATTERN. */
16
+ export declare const DEVIN_DEFAULT_STOP_PATTERNS: readonly ["<|user|>", "<|bot|>", "<|context_request|>", "<|endoftext|>", "<|end_of_turn|>"];
17
+ export interface DevinModelAssignment {
18
+ modelUid: string;
19
+ assignmentJwt: string;
20
+ }
21
+ export interface DevinChatRequestInput {
22
+ model: Model<"devin-agent">;
23
+ context: Context;
24
+ apiKey: string | undefined;
25
+ userJwt?: string;
26
+ cascadeId: string;
27
+ assignment?: DevinModelAssignment;
28
+ maxTokens?: number;
29
+ temperature?: number;
30
+ topP?: number;
31
+ stopSequences?: readonly string[];
32
+ }
33
+ export declare function buildDevinChatRequest(input: DevinChatRequestInput): GetChatMessageRequest;
34
+ /** The router scores the latest user turn alone; the chat request mints the turn's id. */
35
+ export declare function buildDevinRouterPrompt(messages: readonly Message[]): ChatMessagePrompt | undefined;
36
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/request.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAQ,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAEN,KAAK,iBAAiB,EAQtB,KAAK,qBAAqB,EAK1B,MAAM,qBAAqB,CAAC;AAG7B,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,YACvC,UAAU,EACV,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,iBAAiB,CACR,CAAC;AAOX,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,CA6BzF;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,iBAAiB,GAAG,SAAS,CAMlG"}
@@ -0,0 +1,158 @@
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 must be UUID-shaped; they are
8
+ * derived deterministically from the conversation id and the entry index so a
9
+ * retried turn re-sends the same ids instead of forking the server-side
10
+ * transcript, while a native Devin turn is replayed under the id the server
11
+ * minted for it.
12
+ */
13
+ import { create } from "@bufbuild/protobuf";
14
+ import { deterministicUuid } from "../cursor-agent/deterministic-id.js";
15
+ import { CacheControlType, ChatMessagePromptSchema, ChatMessageRequestType, ChatMessageSource, ChatToolCallSchema, ChatToolDefinitionSchema, CompletionConfigurationSchema, ConversationalPlannerMode, GetChatMessageRequestSchema, ImageDataSchema, PromptCacheOptionsSchema, } from "./gen/cascade_pb.js";
16
+ import { devinCliMetadata } from "./metadata.js";
17
+ /** Cascade's own stop vocabulary; the server echoes these as STOP_PATTERN. */
18
+ export const DEVIN_DEFAULT_STOP_PATTERNS = [
19
+ "<|user|>",
20
+ "<|bot|>",
21
+ "<|context_request|>",
22
+ "<|endoftext|>",
23
+ "<|end_of_turn|>",
24
+ ];
25
+ const DEFAULT_MAX_TOKENS = 64_000;
26
+ const DEFAULT_TEMPERATURE = 0.4;
27
+ /** Cascade refuses a temperature of exactly 0 (proto3 drops it) with an opaque invalid_argument. */
28
+ const MIN_TEMPERATURE = 0.0001;
29
+ export function buildDevinChatRequest(input) {
30
+ const temperature = Math.max(input.temperature ?? DEFAULT_TEMPERATURE, MIN_TEMPERATURE);
31
+ const stopPatterns = [...DEVIN_DEFAULT_STOP_PATTERNS, ...(input.stopSequences ?? [])];
32
+ return create(GetChatMessageRequestSchema, {
33
+ metadata: devinCliMetadata(input.apiKey, input.userJwt ?? ""),
34
+ prompt: input.context.systemPrompt ?? "",
35
+ chatMessagePrompts: mapHistory(input.context.messages, input.cascadeId, input.model),
36
+ requestType: ChatMessageRequestType.CASCADE,
37
+ plannerMode: ConversationalPlannerMode.DEFAULT,
38
+ chatModelUid: input.assignment?.modelUid ?? input.model.upstreamModelId ?? input.model.id,
39
+ ...(input.assignment ? { modelAssignmentJwt: input.assignment.assignmentJwt } : {}),
40
+ cascadeId: input.cascadeId,
41
+ executionId: crypto.randomUUID(),
42
+ tools: (input.context.tools ?? []).map(toolDefinition),
43
+ toolChoice: { choice: { case: "optionName", value: "auto" } },
44
+ systemPromptCacheOptions: create(PromptCacheOptionsSchema, { type: CacheControlType.EPHEMERAL }),
45
+ disableParallelToolCalls: input.model.compat?.supportsParallelToolCalls !== true,
46
+ configuration: create(CompletionConfigurationSchema, {
47
+ numCompletions: 1n,
48
+ maxTokens: BigInt(input.maxTokens ?? input.model.maxTokens ?? DEFAULT_MAX_TOKENS),
49
+ maxNewlines: 200n,
50
+ temperature,
51
+ firstTemperature: temperature,
52
+ topK: 50n,
53
+ topP: input.topP ?? 1,
54
+ stopPatterns,
55
+ fimEotProbThreshold: 1,
56
+ }),
57
+ });
58
+ }
59
+ /** The router scores the latest user turn alone; the chat request mints the turn's id. */
60
+ export function buildDevinRouterPrompt(messages) {
61
+ for (let index = messages.length - 1; index >= 0; index--) {
62
+ const message = messages[index];
63
+ if (message?.role === "user")
64
+ return userPrompt(message, "");
65
+ }
66
+ return undefined;
67
+ }
68
+ function toolDefinition(tool) {
69
+ return create(ChatToolDefinitionSchema, {
70
+ name: tool.name,
71
+ description: tool.description,
72
+ jsonSchemaString: JSON.stringify(tool.parameters ?? {}),
73
+ strict: false,
74
+ });
75
+ }
76
+ function mapHistory(messages, cascadeId, model) {
77
+ const prompts = [];
78
+ for (const [index, message] of messages.entries()) {
79
+ const seed = `${cascadeId}\u0000${index}\u0000${message.role}`;
80
+ if (message.role === "user")
81
+ prompts.push(userPrompt(message, deterministicUuid(seed)));
82
+ else if (message.role === "assistant") {
83
+ const prompt = assistantPrompt(message, model, `bot-${deterministicUuid(seed)}`);
84
+ if (prompt)
85
+ prompts.push(prompt);
86
+ }
87
+ else if (message.role === "toolResult") {
88
+ prompts.push(toolResultPrompt(message, deterministicUuid(`${seed}\u0000${message.toolCallId}`)));
89
+ }
90
+ }
91
+ return prompts;
92
+ }
93
+ function userPrompt(message, messageId) {
94
+ const { text, images } = splitContent(typeof message.content === "string" ? [] : message.content);
95
+ return create(ChatMessagePromptSchema, {
96
+ messageId,
97
+ source: ChatMessageSource.USER,
98
+ prompt: typeof message.content === "string" ? message.content : text,
99
+ images,
100
+ });
101
+ }
102
+ function assistantPrompt(message, model, fallbackId) {
103
+ const native = message.api === model.api && message.provider === model.provider && message.model === model.id;
104
+ let text = "";
105
+ let thinking = "";
106
+ let signature = "";
107
+ const toolCalls = [];
108
+ for (const block of message.content) {
109
+ if (block.type === "text")
110
+ text += block.text;
111
+ else if (block.type === "thinking") {
112
+ thinking += block.thinking;
113
+ if (native && !signature && block.thinkingSignature)
114
+ signature = block.thinkingSignature;
115
+ }
116
+ else if (block.type === "toolCall") {
117
+ toolCalls.push(create(ChatToolCallSchema, {
118
+ id: block.id,
119
+ name: block.name,
120
+ argumentsJson: JSON.stringify(block.arguments ?? {}),
121
+ }));
122
+ }
123
+ }
124
+ if (!text && !thinking && !signature && toolCalls.length === 0)
125
+ return undefined;
126
+ return create(ChatMessagePromptSchema, {
127
+ messageId: native && message.responseId ? message.responseId : fallbackId,
128
+ source: ChatMessageSource.SYSTEM,
129
+ prompt: text,
130
+ thinking,
131
+ signature,
132
+ signatureType: "",
133
+ toolCalls,
134
+ });
135
+ }
136
+ function toolResultPrompt(message, messageId) {
137
+ const { text, images } = splitContent(message.content);
138
+ return create(ChatMessagePromptSchema, {
139
+ messageId,
140
+ source: ChatMessageSource.TOOL,
141
+ prompt: text,
142
+ images,
143
+ toolCallId: message.toolCallId,
144
+ toolResultIsError: message.isError === true,
145
+ });
146
+ }
147
+ function splitContent(content) {
148
+ let text = "";
149
+ const images = [];
150
+ for (const block of content) {
151
+ if (block.type === "text")
152
+ text += block.text;
153
+ else
154
+ images.push(create(ImageDataSchema, { base64Data: block.data, mimeType: block.mimeType }));
155
+ }
156
+ return { text, images };
157
+ }
158
+ //# 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 must be UUID-shaped; they are\n * derived deterministically from the conversation id and the entry index so a\n * retried turn re-sends the same ids instead of forking the server-side\n * transcript, while a native Devin turn is replayed under the id the server\n * minted for it.\n */\n\nimport { create } from \"@bufbuild/protobuf\";\nimport type { Context, Message, Model, Tool } from \"../../types.ts\";\nimport { deterministicUuid } from \"../cursor-agent/deterministic-id.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\ttype ImageData,\n\tImageDataSchema,\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\nconst DEFAULT_MAX_TOKENS = 64_000;\nconst DEFAULT_TEMPERATURE = 0.4;\n/** Cascade refuses a temperature of exactly 0 (proto3 drops it) with an opaque invalid_argument. */\nconst MIN_TEMPERATURE = 0.0001;\n\nexport interface DevinModelAssignment {\n\tmodelUid: string;\n\tassignmentJwt: string;\n}\n\nexport interface DevinChatRequestInput {\n\tmodel: Model<\"devin-agent\">;\n\tcontext: Context;\n\tapiKey: string | undefined;\n\tuserJwt?: string;\n\tcascadeId: string;\n\tassignment?: DevinModelAssignment;\n\tmaxTokens?: number;\n\ttemperature?: number;\n\ttopP?: number;\n\tstopSequences?: readonly string[];\n}\n\ntype UserMessage = Extract<Message, { role: \"user\" }>;\ntype AssistantMessage = Extract<Message, { role: \"assistant\" }>;\ntype ToolResultMessage = Extract<Message, { role: \"toolResult\" }>;\n\nexport function buildDevinChatRequest(input: DevinChatRequestInput): GetChatMessageRequest {\n\tconst temperature = Math.max(input.temperature ?? DEFAULT_TEMPERATURE, MIN_TEMPERATURE);\n\tconst stopPatterns = [...DEVIN_DEFAULT_STOP_PATTERNS, ...(input.stopSequences ?? [])];\n\treturn create(GetChatMessageRequestSchema, {\n\t\tmetadata: devinCliMetadata(input.apiKey, input.userJwt ?? \"\"),\n\t\tprompt: input.context.systemPrompt ?? \"\",\n\t\tchatMessagePrompts: mapHistory(input.context.messages, input.cascadeId, input.model),\n\t\trequestType: ChatMessageRequestType.CASCADE,\n\t\tplannerMode: ConversationalPlannerMode.DEFAULT,\n\t\tchatModelUid: input.assignment?.modelUid ?? input.model.upstreamModelId ?? input.model.id,\n\t\t...(input.assignment ? { modelAssignmentJwt: input.assignment.assignmentJwt } : {}),\n\t\tcascadeId: input.cascadeId,\n\t\texecutionId: crypto.randomUUID(),\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\tdisableParallelToolCalls: input.model.compat?.supportsParallelToolCalls !== true,\n\t\tconfiguration: create(CompletionConfigurationSchema, {\n\t\t\tnumCompletions: 1n,\n\t\t\tmaxTokens: BigInt(input.maxTokens ?? input.model.maxTokens ?? DEFAULT_MAX_TOKENS),\n\t\t\tmaxNewlines: 200n,\n\t\t\ttemperature,\n\t\t\tfirstTemperature: temperature,\n\t\t\ttopK: 50n,\n\t\t\ttopP: input.topP ?? 1,\n\t\t\tstopPatterns,\n\t\t\tfimEotProbThreshold: 1,\n\t\t}),\n\t});\n}\n\n/** The router scores the latest user turn alone; the chat request mints the turn's id. */\nexport function buildDevinRouterPrompt(messages: readonly Message[]): ChatMessagePrompt | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (message?.role === \"user\") return userPrompt(message, \"\");\n\t}\n\treturn undefined;\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\tstrict: false,\n\t});\n}\n\nfunction mapHistory(messages: readonly Message[], cascadeId: string, model: Model<\"devin-agent\">): ChatMessagePrompt[] {\n\tconst prompts: ChatMessagePrompt[] = [];\n\tfor (const [index, message] of messages.entries()) {\n\t\tconst seed = `${cascadeId}\\u0000${index}\\u0000${message.role}`;\n\t\tif (message.role === \"user\") prompts.push(userPrompt(message, deterministicUuid(seed)));\n\t\telse if (message.role === \"assistant\") {\n\t\t\tconst prompt = assistantPrompt(message, model, `bot-${deterministicUuid(seed)}`);\n\t\t\tif (prompt) prompts.push(prompt);\n\t\t} else if (message.role === \"toolResult\") {\n\t\t\tprompts.push(toolResultPrompt(message, deterministicUuid(`${seed}\\u0000${message.toolCallId}`)));\n\t\t}\n\t}\n\treturn prompts;\n}\n\nfunction userPrompt(message: UserMessage, messageId: string): ChatMessagePrompt {\n\tconst { text, images } = splitContent(typeof message.content === \"string\" ? [] : message.content);\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId,\n\t\tsource: ChatMessageSource.USER,\n\t\tprompt: typeof message.content === \"string\" ? message.content : text,\n\t\timages,\n\t});\n}\n\nfunction assistantPrompt(\n\tmessage: AssistantMessage,\n\tmodel: Model<\"devin-agent\">,\n\tfallbackId: string,\n): ChatMessagePrompt | undefined {\n\tconst native = message.api === model.api && message.provider === model.provider && message.model === model.id;\n\tlet text = \"\";\n\tlet thinking = \"\";\n\tlet signature = \"\";\n\tconst toolCalls = [];\n\tfor (const block of message.content) {\n\t\tif (block.type === \"text\") text += block.text;\n\t\telse if (block.type === \"thinking\") {\n\t\t\tthinking += block.thinking;\n\t\t\tif (native && !signature && 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\tif (!text && !thinking && !signature && toolCalls.length === 0) return undefined;\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId: native && message.responseId ? message.responseId : fallbackId,\n\t\tsource: ChatMessageSource.SYSTEM,\n\t\tprompt: text,\n\t\tthinking,\n\t\tsignature,\n\t\tsignatureType: \"\",\n\t\ttoolCalls,\n\t});\n}\n\nfunction toolResultPrompt(message: ToolResultMessage, messageId: string): ChatMessagePrompt {\n\tconst { text, images } = splitContent(message.content);\n\treturn create(ChatMessagePromptSchema, {\n\t\tmessageId,\n\t\tsource: ChatMessageSource.TOOL,\n\t\tprompt: text,\n\t\timages,\n\t\ttoolCallId: message.toolCallId,\n\t\ttoolResultIsError: message.isError === true,\n\t});\n}\n\nfunction splitContent(\n\tcontent: readonly ({ type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string })[],\n): { text: string; images: ImageData[] } {\n\tlet text = \"\";\n\tconst images: ImageData[] = [];\n\tfor (const block of content) {\n\t\tif (block.type === \"text\") text += block.text;\n\t\telse images.push(create(ImageDataSchema, { base64Data: block.data, mimeType: block.mimeType }));\n\t}\n\treturn { text, images };\n}\n"]}
@@ -0,0 +1,26 @@
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 DevinToolCallState {
13
+ contentIndex: number;
14
+ /** Raw JSON accumulated across chunks; the content block holds the parsed view. */
15
+ argumentsJson: string;
16
+ }
17
+ export interface DevinStreamState {
18
+ textIndex: number | undefined;
19
+ thinkingIndex: number | undefined;
20
+ toolCalls: Map<string, DevinToolCallState>;
21
+ /** Chunks after the first arrive without an id; they belong to this call. */
22
+ activeToolCallId: string | undefined;
23
+ }
24
+ export declare function createDevinStreamState(): DevinStreamState;
25
+ export declare function applyDevinResponse(message: GetChatMessageResponse, output: AssistantMessage, events: AssistantMessageEventStream, state: DevinStreamState): void;
26
+ //# 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;AAE/E,OAAO,EAAE,KAAK,sBAAsB,EAAc,MAAM,qBAAqB,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;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,145 @@
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 { parseStreamingJson } from "../../utils/json-parse.js";
10
+ import { StopReason } from "./gen/cascade_pb.js";
11
+ export function createDevinStreamState() {
12
+ return { textIndex: undefined, thinkingIndex: undefined, toolCalls: new Map(), activeToolCallId: undefined };
13
+ }
14
+ export function applyDevinResponse(message, output, events, state) {
15
+ if (message.messageId && !output.responseId)
16
+ output.responseId = message.messageId;
17
+ if (message.actualModelUid)
18
+ output.responseModel = message.actualModelUid;
19
+ if (message.deltaThinking)
20
+ appendThinking(message, output, events, state);
21
+ if (message.deltaText)
22
+ appendText(message.deltaText, output, events, state);
23
+ for (const call of message.deltaToolCalls)
24
+ appendToolCall(call, output, events, state);
25
+ if (message.usage)
26
+ applyUsage(message, output);
27
+ if (message.stopReason !== StopReason.UNSPECIFIED)
28
+ output.stopReason = mapStopReason(message.stopReason);
29
+ }
30
+ function appendThinking(message, output, events, state) {
31
+ // A thinking block interleaved after text starts a new block, matching the
32
+ // order Cascade streamed it in.
33
+ if (state.textIndex !== undefined)
34
+ closeText(output, events, state);
35
+ if (state.thinkingIndex === undefined) {
36
+ output.content.push({ type: "thinking", thinking: "", ...(message.thinkingRedacted ? { redacted: true } : {}) });
37
+ state.thinkingIndex = output.content.length - 1;
38
+ events.push({ type: "thinking_start", contentIndex: state.thinkingIndex, partial: output });
39
+ }
40
+ const block = output.content[state.thinkingIndex];
41
+ if (block?.type !== "thinking")
42
+ return;
43
+ block.thinking += message.deltaThinking;
44
+ if (message.deltaSignature)
45
+ block.thinkingSignature = message.deltaSignature;
46
+ events.push({
47
+ type: "thinking_delta",
48
+ contentIndex: state.thinkingIndex,
49
+ delta: message.deltaThinking,
50
+ partial: output,
51
+ });
52
+ }
53
+ function appendText(delta, output, events, state) {
54
+ if (state.thinkingIndex !== undefined)
55
+ closeThinking(output, events, state);
56
+ if (state.textIndex === undefined) {
57
+ output.content.push({ type: "text", text: "" });
58
+ state.textIndex = output.content.length - 1;
59
+ events.push({ type: "text_start", contentIndex: state.textIndex, partial: output });
60
+ }
61
+ const block = output.content[state.textIndex];
62
+ if (block?.type !== "text")
63
+ return;
64
+ block.text += delta;
65
+ events.push({ type: "text_delta", contentIndex: state.textIndex, delta, partial: output });
66
+ }
67
+ function appendToolCall(call, output, events, state) {
68
+ if (state.textIndex !== undefined)
69
+ closeText(output, events, state);
70
+ if (state.thinkingIndex !== undefined)
71
+ closeThinking(output, events, state);
72
+ const toolCallId = call.id || state.activeToolCallId;
73
+ if (!toolCallId)
74
+ return;
75
+ state.activeToolCallId = toolCallId;
76
+ let entry = state.toolCalls.get(toolCallId);
77
+ if (entry === undefined) {
78
+ const block = { type: "toolCall", id: toolCallId, name: call.name, arguments: {} };
79
+ output.content.push(block);
80
+ entry = { contentIndex: output.content.length - 1, argumentsJson: "" };
81
+ state.toolCalls.set(toolCallId, entry);
82
+ events.push({ type: "toolcall_start", contentIndex: entry.contentIndex, partial: output });
83
+ }
84
+ const block = output.content[entry.contentIndex];
85
+ if (block?.type !== "toolCall")
86
+ return;
87
+ if (call.name)
88
+ block.name = call.name;
89
+ if (!call.argumentsJson)
90
+ return;
91
+ // A chunk either repeats everything so far plus new bytes, or carries only the new bytes.
92
+ const accumulated = call.argumentsJson.startsWith(entry.argumentsJson)
93
+ ? call.argumentsJson
94
+ : entry.argumentsJson + call.argumentsJson;
95
+ const delta = accumulated.slice(entry.argumentsJson.length);
96
+ entry.argumentsJson = accumulated;
97
+ block.arguments = parseStreamingJson(accumulated);
98
+ if (delta)
99
+ events.push({ type: "toolcall_delta", contentIndex: entry.contentIndex, delta, partial: output });
100
+ }
101
+ function closeText(output, events, state) {
102
+ const index = state.textIndex;
103
+ if (index === undefined)
104
+ return;
105
+ const block = output.content[index];
106
+ state.textIndex = undefined;
107
+ if (block?.type === "text")
108
+ events.push({ type: "text_end", contentIndex: index, content: block.text, partial: output });
109
+ }
110
+ function closeThinking(output, events, state) {
111
+ const index = state.thinkingIndex;
112
+ if (index === undefined)
113
+ return;
114
+ const block = output.content[index];
115
+ state.thinkingIndex = undefined;
116
+ if (block?.type === "thinking")
117
+ events.push({ type: "thinking_end", contentIndex: index, content: block.thinking, partial: output });
118
+ }
119
+ function applyUsage(message, output) {
120
+ const usage = message.usage;
121
+ if (!usage)
122
+ return;
123
+ output.usage.input = Number(usage.inputTokens);
124
+ output.usage.output = Number(usage.outputTokens);
125
+ output.usage.cacheRead = Number(usage.cacheReadTokens);
126
+ output.usage.cacheWrite = Number(usage.cacheWriteTokens);
127
+ output.usage.totalTokens =
128
+ output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
129
+ }
130
+ /** Cascade's stop vocabulary reduced to senpi's. */
131
+ function mapStopReason(reason) {
132
+ switch (reason) {
133
+ case StopReason.FUNCTION_CALL:
134
+ return "toolUse";
135
+ case StopReason.MAX_TOKENS:
136
+ case StopReason.MAX_NEWLINES:
137
+ return "length";
138
+ case StopReason.ERROR:
139
+ case StopReason.CONTENT_FILTER:
140
+ return "error";
141
+ default:
142
+ return "stop";
143
+ }
144
+ }
145
+ //# 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 { parseStreamingJson } from \"../../utils/json-parse.ts\";\nimport { type GetChatMessageResponse, StopReason } from \"./gen/cascade_pb.ts\";\n\nexport interface DevinToolCallState {\n\tcontentIndex: number;\n\t/** Raw JSON accumulated across chunks; the content block holds the parsed view. */\n\targumentsJson: string;\n}\n\nexport interface DevinStreamState {\n\ttextIndex: number | undefined;\n\tthinkingIndex: number | undefined;\n\ttoolCalls: Map<string, DevinToolCallState>;\n\t/** Chunks after the first arrive without an id; they belong to this call. */\n\tactiveToolCallId: string | undefined;\n}\n\nexport function createDevinStreamState(): DevinStreamState {\n\treturn { textIndex: undefined, thinkingIndex: undefined, toolCalls: new Map(), activeToolCallId: undefined };\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 toolCallId = call.id || state.activeToolCallId;\n\tif (!toolCallId) return;\n\tstate.activeToolCallId = toolCallId;\n\tlet entry = state.toolCalls.get(toolCallId);\n\tif (entry === undefined) {\n\t\tconst block: ToolCall = { type: \"toolCall\", id: toolCallId, name: call.name, arguments: {} };\n\t\toutput.content.push(block);\n\t\tentry = { contentIndex: output.content.length - 1, argumentsJson: \"\" };\n\t\tstate.toolCalls.set(toolCallId, entry);\n\t\tevents.push({ type: \"toolcall_start\", contentIndex: entry.contentIndex, partial: output });\n\t}\n\tconst block = output.content[entry.contentIndex];\n\tif (block?.type !== \"toolCall\") return;\n\tif (call.name) block.name = call.name;\n\tif (!call.argumentsJson) return;\n\t// A chunk either repeats everything so far plus new bytes, or carries only the new bytes.\n\tconst accumulated = call.argumentsJson.startsWith(entry.argumentsJson)\n\t\t? call.argumentsJson\n\t\t: entry.argumentsJson + call.argumentsJson;\n\tconst delta = accumulated.slice(entry.argumentsJson.length);\n\tentry.argumentsJson = accumulated;\n\tblock.arguments = parseStreamingJson(accumulated);\n\tif (delta) events.push({ type: \"toolcall_delta\", contentIndex: entry.contentIndex, delta, partial: output });\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"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Connect end-of-stream trailer errors.
3
+ *
4
+ * Cascade rejects a turn (`invalid_argument`, `permission_denied`, ...) with an
5
+ * HTTP 200 whose only frame is the trailer `{ error: { code, message, details } }`.
6
+ * The trailer is the sole server-side evidence for such a rejection, so it is
7
+ * parsed with guards - never asserted - and its details are folded into the
8
+ * message a user sees.
9
+ */
10
+ export interface DevinTrailerError {
11
+ code: string;
12
+ message: string;
13
+ formatted: string;
14
+ }
15
+ export declare function readDevinTrailerError(trailer: string): DevinTrailerError | undefined;
16
+ //# sourceMappingURL=trailer.d.ts.map