@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":"trailer.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/trailer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAmBpF"}
@@ -0,0 +1,69 @@
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
+ const MAX_TRAILER_EVIDENCE_CHARS = 2000;
11
+ export function readDevinTrailerError(trailer) {
12
+ const text = trailer.trim();
13
+ if (!text)
14
+ return undefined;
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(text);
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ if (!isRecord(parsed) || !isRecord(parsed.error))
23
+ return undefined;
24
+ const code = typeof parsed.error.code === "string" ? parsed.error.code : "";
25
+ const message = typeof parsed.error.message === "string" ? parsed.error.message : "";
26
+ if (!code && !message)
27
+ return undefined;
28
+ const detail = summarizeDetails(parsed.error.details);
29
+ return {
30
+ code,
31
+ message,
32
+ formatted: `Devin stream error${code ? ` ${code}` : ""}: ${message}${detail ? ` [details: ${detail}]` : ""}`,
33
+ };
34
+ }
35
+ function summarizeDetails(details) {
36
+ if (!Array.isArray(details) || details.length === 0)
37
+ return undefined;
38
+ const parts = [];
39
+ for (const entry of details) {
40
+ if (!isRecord(entry))
41
+ continue;
42
+ const type = typeof entry.type === "string" && entry.type ? entry.type : undefined;
43
+ const evidence = evidenceOf(entry);
44
+ const part = type && evidence ? `${type}: ${evidence}` : (type ?? evidence);
45
+ if (part)
46
+ parts.push(part);
47
+ }
48
+ const summary = parts.join("; ");
49
+ if (!summary)
50
+ return undefined;
51
+ return summary.length > MAX_TRAILER_EVIDENCE_CHARS ? `${summary.slice(0, MAX_TRAILER_EVIDENCE_CHARS)}…` : summary;
52
+ }
53
+ function evidenceOf(entry) {
54
+ if (entry.debug !== undefined) {
55
+ if (typeof entry.debug === "string")
56
+ return entry.debug;
57
+ try {
58
+ return JSON.stringify(entry.debug);
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ }
64
+ return typeof entry.value === "string" && entry.value ? entry.value : undefined;
65
+ }
66
+ function isRecord(value) {
67
+ return typeof value === "object" && value !== null && !Array.isArray(value);
68
+ }
69
+ //# sourceMappingURL=trailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailer.js","sourceRoot":"","sources":["../../../src/api/devin-agent/trailer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Connect end-of-stream trailer errors.\n *\n * Cascade rejects a turn (`invalid_argument`, `permission_denied`, ...) with an\n * HTTP 200 whose only frame is the trailer `{ error: { code, message, details } }`.\n * The trailer is the sole server-side evidence for such a rejection, so it is\n * parsed with guards - never asserted - and its details are folded into the\n * message a user sees.\n */\n\nconst MAX_TRAILER_EVIDENCE_CHARS = 2000;\n\nexport interface DevinTrailerError {\n\tcode: string;\n\tmessage: string;\n\tformatted: string;\n}\n\nexport function readDevinTrailerError(trailer: string): DevinTrailerError | undefined {\n\tconst text = trailer.trim();\n\tif (!text) return undefined;\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(text);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(parsed) || !isRecord(parsed.error)) return undefined;\n\tconst code = typeof parsed.error.code === \"string\" ? parsed.error.code : \"\";\n\tconst message = typeof parsed.error.message === \"string\" ? parsed.error.message : \"\";\n\tif (!code && !message) return undefined;\n\tconst detail = summarizeDetails(parsed.error.details);\n\treturn {\n\t\tcode,\n\t\tmessage,\n\t\tformatted: `Devin stream error${code ? ` ${code}` : \"\"}: ${message}${detail ? ` [details: ${detail}]` : \"\"}`,\n\t};\n}\n\nfunction summarizeDetails(details: unknown): string | undefined {\n\tif (!Array.isArray(details) || details.length === 0) return undefined;\n\tconst parts: string[] = [];\n\tfor (const entry of details) {\n\t\tif (!isRecord(entry)) continue;\n\t\tconst type = typeof entry.type === \"string\" && entry.type ? entry.type : undefined;\n\t\tconst evidence = evidenceOf(entry);\n\t\tconst part = type && evidence ? `${type}: ${evidence}` : (type ?? evidence);\n\t\tif (part) parts.push(part);\n\t}\n\tconst summary = parts.join(\"; \");\n\tif (!summary) return undefined;\n\treturn summary.length > MAX_TRAILER_EVIDENCE_CHARS ? `${summary.slice(0, MAX_TRAILER_EVIDENCE_CHARS)}…` : summary;\n}\n\nfunction evidenceOf(entry: Record<string, unknown>): string | undefined {\n\tif (entry.debug !== undefined) {\n\t\tif (typeof entry.debug === \"string\") return entry.debug;\n\t\ttry {\n\t\t\treturn JSON.stringify(entry.debug);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn typeof entry.value === \"string\" && entry.value ? entry.value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\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,3 @@
1
+ /** Options accepted by the devin-agent (Cascade) API. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -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,26 @@
1
+ /**
2
+ * Unary Cascade RPCs (`GetUserJwt`, `AssignModel`, `GetCliModelConfigs`).
3
+ *
4
+ * Unlike the streaming chat call these carry a bare protobuf body both ways.
5
+ * Edges variously answer with plain or gzipped protobuf, so decoding tries the
6
+ * bytes as-is before falling back to gunzip. Discovery reaches this module from
7
+ * the provider factory, which is root-reachable, so the gunzip path uses the
8
+ * web `DecompressionStream` rather than `node:zlib`.
9
+ */
10
+ import { type DescMessage, type MessageInitShape, type MessageShape } from "@bufbuild/protobuf";
11
+ export declare class DevinUnaryError extends Error {
12
+ readonly rpc: string;
13
+ readonly status: number;
14
+ constructor(rpc: string, status: number, detail: string);
15
+ }
16
+ export interface DevinUnaryInput<TRequest extends DescMessage, TResponse extends DescMessage> {
17
+ baseUrl: string;
18
+ path: string;
19
+ requestSchema: TRequest;
20
+ request: MessageInitShape<TRequest>;
21
+ responseSchema: TResponse;
22
+ signal?: AbortSignal;
23
+ }
24
+ export declare function postDevinUnary<TRequest extends DescMessage, TResponse extends DescMessage>(input: DevinUnaryInput<TRequest, TResponse>): Promise<MessageShape<TResponse>>;
25
+ export declare function decodeDevinUnary<TSchema extends DescMessage>(schema: TSchema, payload: Uint8Array): Promise<MessageShape<TSchema> | undefined>;
26
+ //# sourceMappingURL=unary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unary.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/unary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEN,KAAK,WAAW,EAEhB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAEjB,MAAM,oBAAoB,CAAC;AAG5B,qBAAa,eAAgB,SAAQ,KAAK;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAKtD;CACD;AAED,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS,WAAW,EAAE,SAAS,SAAS,WAAW;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,QAAQ,CAAC;IACxB,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpC,cAAc,EAAE,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,QAAQ,SAAS,WAAW,EAAE,SAAS,SAAS,WAAW,EAC/F,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,GACzC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAclC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,WAAW,EACjE,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAU5C"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Unary Cascade RPCs (`GetUserJwt`, `AssignModel`, `GetCliModelConfigs`).
3
+ *
4
+ * Unlike the streaming chat call these carry a bare protobuf body both ways.
5
+ * Edges variously answer with plain or gzipped protobuf, so decoding tries the
6
+ * bytes as-is before falling back to gunzip. Discovery reaches this module from
7
+ * the provider factory, which is root-reachable, so the gunzip path uses the
8
+ * web `DecompressionStream` rather than `node:zlib`.
9
+ */
10
+ import { create, fromBinary, toBinary, } from "@bufbuild/protobuf";
11
+ import { DEVIN_UNARY_HEADERS } from "./paths.js";
12
+ export class DevinUnaryError extends Error {
13
+ constructor(rpc, status, detail) {
14
+ super(`Devin ${rpc} failed (HTTP ${status})${detail ? `: ${detail}` : ""}`);
15
+ this.name = "DevinUnaryError";
16
+ this.rpc = rpc;
17
+ this.status = status;
18
+ }
19
+ }
20
+ export async function postDevinUnary(input) {
21
+ const response = await fetch(input.baseUrl + input.path, {
22
+ method: "POST",
23
+ headers: DEVIN_UNARY_HEADERS,
24
+ body: copyOf(toBinary(input.requestSchema, create(input.requestSchema, input.request))),
25
+ signal: input.signal,
26
+ });
27
+ const payload = new Uint8Array(await response.arrayBuffer());
28
+ if (!response.ok) {
29
+ throw new DevinUnaryError(rpcName(input.path), response.status, new TextDecoder().decode(payload).slice(0, 500));
30
+ }
31
+ const decoded = await decodeDevinUnary(input.responseSchema, payload);
32
+ if (!decoded)
33
+ throw new DevinUnaryError(rpcName(input.path), response.status, "response is not a protobuf message");
34
+ return decoded;
35
+ }
36
+ export async function decodeDevinUnary(schema, payload) {
37
+ try {
38
+ return fromBinary(schema, payload);
39
+ }
40
+ catch {
41
+ try {
42
+ return fromBinary(schema, await gunzip(payload));
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ }
49
+ async function gunzip(payload) {
50
+ const inflated = new Blob([copyOf(payload)]).stream().pipeThrough(new DecompressionStream("gzip"));
51
+ return new Uint8Array(await new Response(inflated).arrayBuffer());
52
+ }
53
+ function rpcName(path) {
54
+ return path.slice(path.lastIndexOf("/") + 1);
55
+ }
56
+ function copyOf(source) {
57
+ const out = new Uint8Array(source.byteLength);
58
+ out.set(source);
59
+ return out;
60
+ }
61
+ //# sourceMappingURL=unary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unary.js","sourceRoot":"","sources":["../../../src/api/devin-agent/unary.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unary Cascade RPCs (`GetUserJwt`, `AssignModel`, `GetCliModelConfigs`).\n *\n * Unlike the streaming chat call these carry a bare protobuf body both ways.\n * Edges variously answer with plain or gzipped protobuf, so decoding tries the\n * bytes as-is before falling back to gunzip. Discovery reaches this module from\n * the provider factory, which is root-reachable, so the gunzip path uses the\n * web `DecompressionStream` rather than `node:zlib`.\n */\n\nimport {\n\tcreate,\n\ttype DescMessage,\n\tfromBinary,\n\ttype MessageInitShape,\n\ttype MessageShape,\n\ttoBinary,\n} from \"@bufbuild/protobuf\";\nimport { DEVIN_UNARY_HEADERS } from \"./paths.ts\";\n\nexport class DevinUnaryError extends Error {\n\treadonly rpc: string;\n\treadonly status: number;\n\n\tconstructor(rpc: string, status: number, detail: string) {\n\t\tsuper(`Devin ${rpc} failed (HTTP ${status})${detail ? `: ${detail}` : \"\"}`);\n\t\tthis.name = \"DevinUnaryError\";\n\t\tthis.rpc = rpc;\n\t\tthis.status = status;\n\t}\n}\n\nexport interface DevinUnaryInput<TRequest extends DescMessage, TResponse extends DescMessage> {\n\tbaseUrl: string;\n\tpath: string;\n\trequestSchema: TRequest;\n\trequest: MessageInitShape<TRequest>;\n\tresponseSchema: TResponse;\n\tsignal?: AbortSignal;\n}\n\nexport async function postDevinUnary<TRequest extends DescMessage, TResponse extends DescMessage>(\n\tinput: DevinUnaryInput<TRequest, TResponse>,\n): Promise<MessageShape<TResponse>> {\n\tconst response = await fetch(input.baseUrl + input.path, {\n\t\tmethod: \"POST\",\n\t\theaders: DEVIN_UNARY_HEADERS,\n\t\tbody: copyOf(toBinary(input.requestSchema, create(input.requestSchema, input.request))),\n\t\tsignal: input.signal,\n\t});\n\tconst payload = new Uint8Array(await response.arrayBuffer());\n\tif (!response.ok) {\n\t\tthrow new DevinUnaryError(rpcName(input.path), response.status, new TextDecoder().decode(payload).slice(0, 500));\n\t}\n\tconst decoded = await decodeDevinUnary(input.responseSchema, payload);\n\tif (!decoded) throw new DevinUnaryError(rpcName(input.path), response.status, \"response is not a protobuf message\");\n\treturn decoded;\n}\n\nexport async function decodeDevinUnary<TSchema extends DescMessage>(\n\tschema: TSchema,\n\tpayload: Uint8Array,\n): Promise<MessageShape<TSchema> | undefined> {\n\ttry {\n\t\treturn fromBinary(schema, payload);\n\t} catch {\n\t\ttry {\n\t\t\treturn fromBinary(schema, await gunzip(payload));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n\nasync function gunzip(payload: Uint8Array): Promise<Uint8Array<ArrayBuffer>> {\n\tconst inflated = new Blob([copyOf(payload)]).stream().pipeThrough(new DecompressionStream(\"gzip\"));\n\treturn new Uint8Array(await new Response(inflated).arrayBuffer());\n}\n\nfunction rpcName(path: string): string {\n\treturn path.slice(path.lastIndexOf(\"/\") + 1);\n}\n\nfunction copyOf(source: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBuffer> {\n\tconst out = new Uint8Array(source.byteLength);\n\tout.set(source);\n\treturn out;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /** Cascade wire surface: paths, identity metadata, frame codec, unary RPCs and request building. */
2
+ export { type DevinFrame, decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from "./frames.ts";
3
+ export { DEVIN_CLI_IDENTITY, DEVIN_DISCOVERY_IDENTITY, DEVIN_SUPPORTED_MODEL_DISPLAYS, devinCliMetadata, devinDiscoveryMetadata, normalizeDevinSessionToken, } from "./metadata.ts";
4
+ export { DEVIN_ASSIGN_MODEL_PATH, DEVIN_CHAT_HEADERS, DEVIN_CHAT_MESSAGE_PATH, DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_UNARY_HEADERS, DEVIN_USER_JWT_PATH, } from "./paths.ts";
5
+ export { buildDevinChatRequest, buildDevinRouterPrompt, DEVIN_DEFAULT_STOP_PATTERNS, type DevinChatRequestInput, type DevinModelAssignment, } from "./request.ts";
6
+ export { type DevinTrailerError, readDevinTrailerError } from "./trailer.ts";
7
+ export { DevinUnaryError, type DevinUnaryInput, decodeDevinUnary, postDevinUnary } from "./unary.ts";
8
+ //# 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,oGAAoG;AAEpG,OAAO,EAAE,KAAK,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,8BAA8B,EAC9B,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Cascade wire surface: paths, identity metadata, frame codec, unary RPCs and request building. */
2
+ export { decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from "./frames.js";
3
+ export { DEVIN_CLI_IDENTITY, DEVIN_DISCOVERY_IDENTITY, DEVIN_SUPPORTED_MODEL_DISPLAYS, devinCliMetadata, devinDiscoveryMetadata, normalizeDevinSessionToken, } from "./metadata.js";
4
+ export { DEVIN_ASSIGN_MODEL_PATH, DEVIN_CHAT_HEADERS, DEVIN_CHAT_MESSAGE_PATH, DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_UNARY_HEADERS, DEVIN_USER_JWT_PATH, } from "./paths.js";
5
+ export { buildDevinChatRequest, buildDevinRouterPrompt, DEVIN_DEFAULT_STOP_PATTERNS, } from "./request.js";
6
+ export { readDevinTrailerError } from "./trailer.js";
7
+ export { DevinUnaryError, decodeDevinUnary, postDevinUnary } from "./unary.js";
8
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/api/devin-agent/wire.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,EAAmB,iBAAiB,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,8BAA8B,EAC9B,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,GAG3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAA0B,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAwB,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/** Cascade wire surface: paths, identity metadata, frame codec, unary RPCs and request building. */\n\nexport { type DevinFrame, decodeDevinFrames, encodeDevinFrame as encodeDevinRequestFrame } from \"./frames.ts\";\nexport {\n\tDEVIN_CLI_IDENTITY,\n\tDEVIN_DISCOVERY_IDENTITY,\n\tDEVIN_SUPPORTED_MODEL_DISPLAYS,\n\tdevinCliMetadata,\n\tdevinDiscoveryMetadata,\n\tnormalizeDevinSessionToken,\n} from \"./metadata.ts\";\nexport {\n\tDEVIN_ASSIGN_MODEL_PATH,\n\tDEVIN_CHAT_HEADERS,\n\tDEVIN_CHAT_MESSAGE_PATH,\n\tDEVIN_CLI_MODEL_CONFIGS_PATH,\n\tDEVIN_DEFAULT_BASE_URL,\n\tDEVIN_MAX_FRAME_PAYLOAD,\n\tDEVIN_UNARY_HEADERS,\n\tDEVIN_USER_JWT_PATH,\n} from \"./paths.ts\";\nexport {\n\tbuildDevinChatRequest,\n\tbuildDevinRouterPrompt,\n\tDEVIN_DEFAULT_STOP_PATTERNS,\n\ttype DevinChatRequestInput,\n\ttype DevinModelAssignment,\n} from \"./request.ts\";\nexport { type DevinTrailerError, readDevinTrailerError } from \"./trailer.ts\";\nexport { DevinUnaryError, type DevinUnaryInput, decodeDevinUnary, postDevinUnary } from \"./unary.ts\";\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Devin (Cognition/Codeium Cascade) agent API.
3
+ *
4
+ * One assistant turn is up to three RPCs, exactly as the released Devin CLI
5
+ * performs them:
6
+ * 1. `GetUserJwt` mints the short-lived user JWT the chat call must carry and
7
+ * names the account's API host, which can differ from the seeded one;
8
+ * 2. `AssignModel` resolves a server-side router into a concrete model uid plus
9
+ * the JWT that authorizes it (router models only);
10
+ * 3. `GetChatMessage` streams the turn: a single gzipped Connect frame out, a
11
+ * frame sequence of deltas back, closed by a JSON trailer that either
12
+ * carries the rejection or is empty.
13
+ *
14
+ * Cascade reports text, thinking and tool calls as separate delta fields on the
15
+ * same message, so this adapter owns the block bookkeeping senpi's event
16
+ * protocol expects.
17
+ */
18
+ import type { StreamFunction } from "../types.ts";
19
+ import type { DevinAgentOptions } from "./devin-agent/types.ts";
20
+ export declare const stream: StreamFunction<"devin-agent", DevinAgentOptions>;
21
+ export declare const streamSimple: StreamFunction<"devin-agent", DevinAgentOptions>;
22
+ //# 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;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAoC,cAAc,EAAY,MAAM,aAAa,CAAC;AAW9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAiBhE,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,217 @@
1
+ /**
2
+ * Devin (Cognition/Codeium Cascade) agent API.
3
+ *
4
+ * One assistant turn is up to three RPCs, exactly as the released Devin CLI
5
+ * performs them:
6
+ * 1. `GetUserJwt` mints the short-lived user JWT the chat call must carry and
7
+ * names the account's API host, which can differ from the seeded one;
8
+ * 2. `AssignModel` resolves a server-side router into a concrete model uid plus
9
+ * the JWT that authorizes it (router models only);
10
+ * 3. `GetChatMessage` streams the turn: a single gzipped Connect frame out, a
11
+ * frame sequence of deltas back, closed by a JSON trailer that either
12
+ * carries the rejection or is empty.
13
+ *
14
+ * Cascade reports text, thinking and tool calls as separate delta fields on the
15
+ * same message, so this adapter owns the block bookkeeping senpi's event
16
+ * protocol expects.
17
+ */
18
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
19
+ import { AssignModelRequestSchema, AssignModelResponseSchema, GetChatMessageRequestSchema, GetChatMessageResponseSchema, GetUserJwtRequestSchema, GetUserJwtResponseSchema, } from "./devin-agent/gen/cascade_pb.js";
20
+ import { applyDevinResponse, createDevinStreamState } from "./devin-agent/stream-state.js";
21
+ import { buildDevinChatRequest, buildDevinRouterPrompt, DEVIN_ASSIGN_MODEL_PATH, DEVIN_CHAT_HEADERS, DEVIN_CHAT_MESSAGE_PATH, DEVIN_DEFAULT_BASE_URL, DEVIN_USER_JWT_PATH, decodeDevinFrames, devinCliMetadata, encodeDevinRequestFrame, postDevinUnary, readDevinTrailerError, } from "./devin-agent/wire.js";
22
+ export const stream = (model, context, options) => {
23
+ const events = new AssistantMessageEventStream();
24
+ void run(model, context, events, options);
25
+ return events;
26
+ };
27
+ export const streamSimple = stream;
28
+ async function run(model, context, events, options) {
29
+ const output = {
30
+ role: "assistant",
31
+ content: [],
32
+ api: "devin-agent",
33
+ provider: model.provider,
34
+ model: model.id,
35
+ usage: {
36
+ input: 0,
37
+ output: 0,
38
+ cacheRead: 0,
39
+ cacheWrite: 0,
40
+ totalTokens: 0,
41
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
42
+ },
43
+ stopReason: "stop",
44
+ timestamp: Date.now(),
45
+ };
46
+ const state = createDevinStreamState();
47
+ const signal = options?.signal;
48
+ try {
49
+ events.push({ type: "start", partial: output });
50
+ const baseUrl = (model.baseUrl || DEVIN_DEFAULT_BASE_URL).replace(/\/+$/, "");
51
+ const cascadeId = options?.cascadeId ?? crypto.randomUUID();
52
+ const session = await mintUserJwt(baseUrl, options?.apiKey, signal);
53
+ const assignment = model.compat?.modelRouter === true
54
+ ? await assignModel(model, context, session.chatBaseUrl, cascadeId, options?.apiKey, signal)
55
+ : undefined;
56
+ if (assignment)
57
+ output.responseModel = assignment.modelUid;
58
+ const request = buildDevinChatRequest({
59
+ model,
60
+ context,
61
+ apiKey: options?.apiKey,
62
+ userJwt: session.userJwt,
63
+ cascadeId,
64
+ ...(assignment ? { assignment } : {}),
65
+ ...(options?.maxTokens !== undefined ? { maxTokens: options.maxTokens } : {}),
66
+ ...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),
67
+ });
68
+ const response = await fetch(session.chatBaseUrl + DEVIN_CHAT_MESSAGE_PATH, {
69
+ method: "POST",
70
+ headers: DEVIN_CHAT_HEADERS,
71
+ body: encodeDevinRequestFrame(GetChatMessageRequestSchema, request),
72
+ signal,
73
+ });
74
+ await options?.onResponse?.({ status: response.status, headers: headersOf(response) }, model);
75
+ if (!response.ok || !response.body) {
76
+ throw new Error(`Devin request failed (HTTP ${response.status})${await detail(response)}`);
77
+ }
78
+ for await (const frame of decodeDevinFrames(response.body, GetChatMessageResponseSchema)) {
79
+ if (frame.message)
80
+ applyDevinResponse(frame.message, output, events, state);
81
+ if (frame.trailer !== undefined) {
82
+ const rejection = readDevinTrailerError(frame.trailer);
83
+ if (rejection)
84
+ throw new Error(rejection.formatted);
85
+ }
86
+ }
87
+ finalizeBlocks(output, events, state);
88
+ // Cascade can close a turn that carries a tool call without ever sending an
89
+ // explicit stop reason. Only the default "stop" is upgraded: a server-reported
90
+ // "length" means the turn was truncated, and a truncated tool call must not be
91
+ // advertised as a complete one.
92
+ if (output.stopReason === "stop" && output.content.some(isToolCall))
93
+ output.stopReason = "toolUse";
94
+ // Cascade reports a server error or a content filter as a stop reason on an
95
+ // otherwise well-formed stream. senpi's protocol has no "done because it
96
+ // failed", so that turn terminates as an error event, not a done event.
97
+ if (output.stopReason === "error") {
98
+ output.errorMessage ??= "Devin ended the turn with a server error or a content filter";
99
+ events.push({ type: "error", reason: "error", error: output });
100
+ events.end();
101
+ return;
102
+ }
103
+ events.push({ type: "done", reason: doneReasonOf(output.stopReason), message: output });
104
+ events.end();
105
+ }
106
+ catch (error) {
107
+ finalizeBlocks(output, events, state);
108
+ const aborted = signal?.aborted === true || (error instanceof Error && error.name === "AbortError");
109
+ output.stopReason = aborted ? "aborted" : "error";
110
+ output.errorMessage = aborted ? "Request was aborted" : messageOf(error);
111
+ events.push({ type: "error", reason: output.stopReason, error: output });
112
+ events.end();
113
+ }
114
+ }
115
+ async function mintUserJwt(baseUrl, apiKey, signal) {
116
+ const response = await postDevinUnary({
117
+ baseUrl,
118
+ path: DEVIN_USER_JWT_PATH,
119
+ requestSchema: GetUserJwtRequestSchema,
120
+ request: { metadata: devinCliMetadata(apiKey) },
121
+ responseSchema: GetUserJwtResponseSchema,
122
+ ...(signal ? { signal } : {}),
123
+ });
124
+ if (!response.userJwt)
125
+ throw new Error("Devin GetUserJwt returned an empty user JWT");
126
+ const customHost = response.customApiServerUrl.trim().replace(/\/+$/, "");
127
+ return { userJwt: response.userJwt, chatBaseUrl: customHost || baseUrl };
128
+ }
129
+ /**
130
+ * A router uid is never a legal chat model uid, so a failed assignment fails the
131
+ * turn instead of falling back to sending the router id to GetChatMessage.
132
+ */
133
+ async function assignModel(model, context, baseUrl, cascadeId, apiKey, signal) {
134
+ const routerPrompt = buildDevinRouterPrompt(context.messages);
135
+ const response = await postDevinUnary({
136
+ baseUrl,
137
+ path: DEVIN_ASSIGN_MODEL_PATH,
138
+ requestSchema: AssignModelRequestSchema,
139
+ request: {
140
+ metadata: devinCliMetadata(apiKey),
141
+ modelRouterUid: model.upstreamModelId ?? model.id,
142
+ cascadeId,
143
+ ...(routerPrompt ? { chatMessagePrompt: routerPrompt } : {}),
144
+ },
145
+ responseSchema: AssignModelResponseSchema,
146
+ ...(signal ? { signal } : {}),
147
+ });
148
+ const assignment = response.assignment;
149
+ if (!assignment?.modelUid || !assignment.assignmentJwt) {
150
+ throw new Error("Devin AssignModel returned no model uid and assignment JWT");
151
+ }
152
+ return { modelUid: assignment.modelUid, assignmentJwt: assignment.assignmentJwt };
153
+ }
154
+ /** Narrows a settled stop reason to the three senpi accepts on a done event. */
155
+ function doneReasonOf(stopReason) {
156
+ switch (stopReason) {
157
+ case "length":
158
+ return "length";
159
+ case "toolUse":
160
+ return "toolUse";
161
+ default:
162
+ return "stop";
163
+ }
164
+ }
165
+ function headersOf(response) {
166
+ const headers = {};
167
+ response.headers.forEach((value, key) => {
168
+ headers[key] = value;
169
+ });
170
+ return headers;
171
+ }
172
+ function isToolCall(content) {
173
+ return content.type === "toolCall";
174
+ }
175
+ function finalizeBlocks(output, events, state) {
176
+ if (state.thinkingIndex !== undefined) {
177
+ const block = output.content[state.thinkingIndex];
178
+ if (block?.type === "thinking") {
179
+ events.push({
180
+ type: "thinking_end",
181
+ contentIndex: state.thinkingIndex,
182
+ content: block.thinking,
183
+ partial: output,
184
+ });
185
+ }
186
+ state.thinkingIndex = undefined;
187
+ }
188
+ if (state.textIndex !== undefined) {
189
+ const block = output.content[state.textIndex];
190
+ if (block?.type === "text") {
191
+ events.push({ type: "text_end", contentIndex: state.textIndex, content: block.text, partial: output });
192
+ }
193
+ state.textIndex = undefined;
194
+ }
195
+ for (const [, entry] of state.toolCalls) {
196
+ const block = output.content[entry.contentIndex];
197
+ if (block?.type === "toolCall") {
198
+ events.push({ type: "toolcall_end", contentIndex: entry.contentIndex, toolCall: block, partial: output });
199
+ }
200
+ }
201
+ state.toolCalls.clear();
202
+ }
203
+ async function detail(response) {
204
+ try {
205
+ const body = await response.text();
206
+ return body ? `: ${body.slice(0, 500)}` : "";
207
+ }
208
+ catch {
209
+ return "";
210
+ }
211
+ }
212
+ function messageOf(error) {
213
+ if (error instanceof Error)
214
+ return error.message;
215
+ return String(error);
216
+ }
217
+ //# 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 assistant turn is up to three RPCs, exactly as the released Devin CLI\n * performs them:\n * 1. `GetUserJwt` mints the short-lived user JWT the chat call must carry and\n * names the account's API host, which can differ from the seeded one;\n * 2. `AssignModel` resolves a server-side router into a concrete model uid plus\n * the JWT that authorizes it (router models only);\n * 3. `GetChatMessage` streams the turn: a single gzipped Connect frame out, a\n * frame sequence of deltas back, closed by a JSON trailer that either\n * carries the rejection or is empty.\n *\n * Cascade reports text, thinking and tool calls as separate delta fields on the\n * same message, so this adapter owns the block bookkeeping senpi's event\n * protocol expects.\n */\n\nimport type { AssistantMessage, Context, Model, StreamFunction, ToolCall } from \"../types.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport {\n\tAssignModelRequestSchema,\n\tAssignModelResponseSchema,\n\tGetChatMessageRequestSchema,\n\tGetChatMessageResponseSchema,\n\tGetUserJwtRequestSchema,\n\tGetUserJwtResponseSchema,\n} from \"./devin-agent/gen/cascade_pb.ts\";\nimport { applyDevinResponse, createDevinStreamState, type DevinStreamState } from \"./devin-agent/stream-state.ts\";\nimport type { DevinAgentOptions } from \"./devin-agent/types.ts\";\nimport {\n\tbuildDevinChatRequest,\n\tbuildDevinRouterPrompt,\n\tDEVIN_ASSIGN_MODEL_PATH,\n\tDEVIN_CHAT_HEADERS,\n\tDEVIN_CHAT_MESSAGE_PATH,\n\tDEVIN_DEFAULT_BASE_URL,\n\tDEVIN_USER_JWT_PATH,\n\ttype DevinModelAssignment,\n\tdecodeDevinFrames,\n\tdevinCliMetadata,\n\tencodeDevinRequestFrame,\n\tpostDevinUnary,\n\treadDevinTrailerError,\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\ninterface DevinSession {\n\tuserJwt: string;\n\t/** Host the account is provisioned on; GetUserJwt may move it off the seed. */\n\tchatBaseUrl: string;\n}\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 = createDevinStreamState();\n\tconst signal = options?.signal;\n\n\ttry {\n\t\tevents.push({ type: \"start\", partial: output });\n\t\tconst baseUrl = (model.baseUrl || DEVIN_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\t\tconst cascadeId = options?.cascadeId ?? crypto.randomUUID();\n\t\tconst session = await mintUserJwt(baseUrl, options?.apiKey, signal);\n\t\tconst assignment =\n\t\t\tmodel.compat?.modelRouter === true\n\t\t\t\t? await assignModel(model, context, session.chatBaseUrl, cascadeId, options?.apiKey, signal)\n\t\t\t\t: undefined;\n\t\tif (assignment) output.responseModel = assignment.modelUid;\n\n\t\tconst request = buildDevinChatRequest({\n\t\t\tmodel,\n\t\t\tcontext,\n\t\t\tapiKey: options?.apiKey,\n\t\t\tuserJwt: session.userJwt,\n\t\t\tcascadeId,\n\t\t\t...(assignment ? { assignment } : {}),\n\t\t\t...(options?.maxTokens !== undefined ? { maxTokens: options.maxTokens } : {}),\n\t\t\t...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),\n\t\t});\n\t\tconst response = await fetch(session.chatBaseUrl + DEVIN_CHAT_MESSAGE_PATH, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: DEVIN_CHAT_HEADERS,\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\tif (frame.trailer !== undefined) {\n\t\t\t\tconst rejection = readDevinTrailerError(frame.trailer);\n\t\t\t\tif (rejection) throw new Error(rejection.formatted);\n\t\t\t}\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\nasync function mintUserJwt(\n\tbaseUrl: string,\n\tapiKey: string | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<DevinSession> {\n\tconst response = await postDevinUnary({\n\t\tbaseUrl,\n\t\tpath: DEVIN_USER_JWT_PATH,\n\t\trequestSchema: GetUserJwtRequestSchema,\n\t\trequest: { metadata: devinCliMetadata(apiKey) },\n\t\tresponseSchema: GetUserJwtResponseSchema,\n\t\t...(signal ? { signal } : {}),\n\t});\n\tif (!response.userJwt) throw new Error(\"Devin GetUserJwt returned an empty user JWT\");\n\tconst customHost = response.customApiServerUrl.trim().replace(/\\/+$/, \"\");\n\treturn { userJwt: response.userJwt, chatBaseUrl: customHost || baseUrl };\n}\n\n/**\n * A router uid is never a legal chat model uid, so a failed assignment fails the\n * turn instead of falling back to sending the router id to GetChatMessage.\n */\nasync function assignModel(\n\tmodel: Model<\"devin-agent\">,\n\tcontext: Context,\n\tbaseUrl: string,\n\tcascadeId: string,\n\tapiKey: string | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<DevinModelAssignment> {\n\tconst routerPrompt = buildDevinRouterPrompt(context.messages);\n\tconst response = await postDevinUnary({\n\t\tbaseUrl,\n\t\tpath: DEVIN_ASSIGN_MODEL_PATH,\n\t\trequestSchema: AssignModelRequestSchema,\n\t\trequest: {\n\t\t\tmetadata: devinCliMetadata(apiKey),\n\t\t\tmodelRouterUid: model.upstreamModelId ?? model.id,\n\t\t\tcascadeId,\n\t\t\t...(routerPrompt ? { chatMessagePrompt: routerPrompt } : {}),\n\t\t},\n\t\tresponseSchema: AssignModelResponseSchema,\n\t\t...(signal ? { signal } : {}),\n\t});\n\tconst assignment = response.assignment;\n\tif (!assignment?.modelUid || !assignment.assignmentJwt) {\n\t\tthrow new Error(\"Devin AssignModel returned no model uid and assignment JWT\");\n\t}\n\treturn { modelUid: assignment.modelUid, assignmentJwt: assignment.assignmentJwt };\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,5 @@
1
+ import type { ProviderStreams } from "../types.ts";
2
+ declare const loadDevinAgentModule: () => Promise<ProviderStreams>;
3
+ export declare const devinAgentApi: () => ProviderStreams;
4
+ export { loadDevinAgentModule };
5
+ //# sourceMappingURL=devin-agent.lazy.d.ts.map
@@ -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"}
@@ -0,0 +1,23 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { lazyApi } from "./lazy.js";
10
+ /**
11
+ * Loads the devin-agent implementation through a variable specifier so bundlers
12
+ * (browser smoke, Bun compile) cannot follow the import into the Node-only
13
+ * Connect transport. The `.ts`/`.js` rewrite keeps the trick working from both
14
+ * source and built output.
15
+ */
16
+ const importNodeOnlyApi = (specifier) => {
17
+ const runtimeSpecifier = import.meta.url.endsWith(".js") ? specifier.replace(/\.ts$/, ".js") : specifier;
18
+ return import(__rewriteRelativeImportExtension(runtimeSpecifier));
19
+ };
20
+ const loadDevinAgentModule = () => importNodeOnlyApi("./devin-agent.ts");
21
+ export const devinAgentApi = () => lazyApi(loadDevinAgentModule);
22
+ export { loadDevinAgentModule };
23
+ //# sourceMappingURL=devin-agent.lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin-agent.lazy.js","sourceRoot":"","sources":["../../src/api/devin-agent.lazy.ts"],"names":[],"mappings":";;;;;;;;AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAoB,EAAE;IACjE,MAAM,gBAAgB,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzG,OAAO,MAAM,kCAAC,gBAAgB,EAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAA6B,EAAE,CAC3D,iBAAiB,CAAC,kBAAkB,CAA6B,CAAC;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,CAAC","sourcesContent":["import type { ProviderStreams } from \"../types.ts\";\nimport { lazyApi } from \"./lazy.ts\";\n\n/**\n * Loads the devin-agent implementation through a variable specifier so bundlers\n * (browser smoke, Bun compile) cannot follow the import into the Node-only\n * Connect transport. The `.ts`/`.js` rewrite keeps the trick working from both\n * source and built output.\n */\nconst importNodeOnlyApi = (specifier: string): Promise<unknown> => {\n\tconst runtimeSpecifier = import.meta.url.endsWith(\".js\") ? specifier.replace(/\\.ts$/, \".js\") : specifier;\n\treturn import(runtimeSpecifier);\n};\n\nconst loadDevinAgentModule = (): Promise<ProviderStreams> =>\n\timportNodeOnlyApi(\"./devin-agent.ts\") as Promise<ProviderStreams>;\n\nexport const devinAgentApi = () => lazyApi(loadDevinAgentModule);\nexport { loadDevinAgentModule };\n"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Devin CLI OAuth loopback callback.
3
+ *
4
+ * Devin registers ONE redirect URI for the CLI, so the callback binds the fixed
5
+ * loopback port 59653 instead of an ephemeral one: a different port is rejected
6
+ * by the authorize page. The server is one-shot, validates the issued state
7
+ * before spending the code, and renders the shared OAuth result pages.
8
+ */
9
+ import type { OAuthCredential } from "../types.ts";
10
+ export declare const DEVIN_CALLBACK_PORT = 59653;
11
+ export declare const DEVIN_CALLBACK_PATH = "/callback";
12
+ export type DevinCallbackServer = {
13
+ callbackUrl: string;
14
+ close: () => void;
15
+ /** Hand the login to manual code entry unless a callback already claimed it. */
16
+ cancelWait: () => void;
17
+ waitForCredential: () => Promise<OAuthCredential | null>;
18
+ };
19
+ export declare function startDevinCallbackServer(input: {
20
+ state: string;
21
+ verifier: string;
22
+ signal: AbortSignal;
23
+ loginTimeoutMs: number;
24
+ }): Promise<DevinCallbackServer>;
25
+ //# sourceMappingURL=devin-callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin-callback.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/devin-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gFAAgF;IAChF,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACzD,CAAC;AAaF,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsG/B"}