@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,19 @@
1
+ /**
2
+ * Cascade model discovery.
3
+ *
4
+ * `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in
5
+ * account may actually use, which differs per plan and per rollout. A failed or
6
+ * empty response therefore returns undefined so callers KEEP their static seed
7
+ * instead of publishing an empty catalog.
8
+ */
9
+ import type { Model } from "../../types.ts";
10
+ import { type ClientModelConfig } from "./gen/cascade_pb.ts";
11
+ export interface DevinDiscoveryOptions {
12
+ apiKey: string | undefined;
13
+ baseUrl?: string;
14
+ timeoutMs?: number;
15
+ signal?: AbortSignal;
16
+ }
17
+ export declare function fetchDevinModels(options: DevinDiscoveryOptions): Promise<Model<"devin-agent">[] | undefined>;
18
+ export declare function normalizeDevinModels(configs: readonly ClientModelConfig[], baseUrl: string): Model<"devin-agent">[];
19
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACN,KAAK,iBAAiB,EAKtB,MAAM,qBAAqB,CAAC;AAwB7B,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,CAAC,CAwBlH;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,CAcnH"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Cascade model discovery.
3
+ *
4
+ * `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in
5
+ * account may actually use, which differs per plan and per rollout. A failed or
6
+ * empty response therefore returns undefined so callers KEEP their static seed
7
+ * instead of publishing an empty catalog.
8
+ */
9
+ import { DisplayOption, GetCliModelConfigsRequestSchema, GetCliModelConfigsResponseSchema, ModelDimensionKind, } from "./gen/cascade_pb.js";
10
+ import { devinDiscoveryMetadata } from "./metadata.js";
11
+ import { DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL } from "./paths.js";
12
+ import { postDevinUnary } from "./unary.js";
13
+ const DISCOVERY_TIMEOUT_MS = 5_000;
14
+ const DEFAULT_CONTEXT_WINDOW = 200_000;
15
+ const DEFAULT_MAX_TOKENS = 64_000;
16
+ /** Slots requested for parity with the native client but never surfaced as models. */
17
+ const INTERNAL_DISPLAYS = new Set([
18
+ DisplayOption.QUICK_REVIEW,
19
+ DisplayOption.INTERNAL_DEFAULT,
20
+ ]);
21
+ /**
22
+ * Lanes whose configs advertise image support while the backend silently drops
23
+ * `ChatMessagePrompt.images` (verified live on SWE-1.6 and SWE-1.6 Fast).
24
+ */
25
+ const IMAGE_BLIND_UIDS = new Set(["swe-1-6", "swe-1-6-fast"]);
26
+ const REASONING_LABEL = /think|thinking|minimal|high|medium|low|xhigh|max|reasoning/i;
27
+ const NO_REASONING_LABEL = /\bno thinking\b/i;
28
+ export async function fetchDevinModels(options) {
29
+ const baseUrl = (options.baseUrl ?? DEVIN_DEFAULT_BASE_URL).replace(/\/+$/, "");
30
+ const controller = new AbortController();
31
+ const onAbort = () => controller.abort();
32
+ options.signal?.addEventListener("abort", onAbort, { once: true });
33
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DISCOVERY_TIMEOUT_MS);
34
+ try {
35
+ const response = await postDevinUnary({
36
+ baseUrl,
37
+ path: DEVIN_CLI_MODEL_CONFIGS_PATH,
38
+ requestSchema: GetCliModelConfigsRequestSchema,
39
+ request: { metadata: devinDiscoveryMetadata(options.apiKey) },
40
+ responseSchema: GetCliModelConfigsResponseSchema,
41
+ signal: controller.signal,
42
+ });
43
+ const models = normalizeDevinModels(response.clientModelConfigs, baseUrl);
44
+ return models.length > 0 ? models : undefined;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ finally {
50
+ clearTimeout(timeout);
51
+ options.signal?.removeEventListener("abort", onAbort);
52
+ }
53
+ }
54
+ export function normalizeDevinModels(configs, baseUrl) {
55
+ const seen = new Set();
56
+ const models = [];
57
+ for (const config of configs) {
58
+ if (config.disabled)
59
+ continue;
60
+ const display = config.modelInfo?.displayOption ?? DisplayOption.UNSPECIFIED;
61
+ if (INTERNAL_DISPLAYS.has(display))
62
+ continue;
63
+ const uid = config.modelUid.trim();
64
+ if (!uid || seen.has(uid))
65
+ continue;
66
+ seen.add(uid);
67
+ const isRouter = display === DisplayOption.MODEL_ROUTER || config.modelInfo?.isModelRouter === true;
68
+ models.push(toModel(config, uid, baseUrl, isRouter));
69
+ }
70
+ return models.sort((a, b) => a.id.localeCompare(b.id));
71
+ }
72
+ function toModel(config, uid, baseUrl, isRouter) {
73
+ const features = config.modelInfo?.modelFeatures;
74
+ const supportsImages = (features ? features.supportsImages : config.supportsImages) && !IMAGE_BLIND_UIDS.has(uid);
75
+ const maxOutputTokens = config.modelInfo?.maxOutputTokens ?? 0;
76
+ const compat = {
77
+ ...(isRouter ? { modelRouter: true } : {}),
78
+ ...(features?.supportsParallelToolCalls === true ? { supportsParallelToolCalls: true } : {}),
79
+ };
80
+ return {
81
+ id: uid,
82
+ name: config.label.trim() || uid,
83
+ api: "devin-agent",
84
+ provider: "devin",
85
+ baseUrl,
86
+ reasoning: supportsThinking(config),
87
+ input: supportsImages ? ["text", "image"] : ["text"],
88
+ cost: costOf(config),
89
+ contextWindow: config.maxTokens > 0 ? config.maxTokens : DEFAULT_CONTEXT_WINDOW,
90
+ maxTokens: maxOutputTokens > 0 ? maxOutputTokens : DEFAULT_MAX_TOKENS,
91
+ ...(Object.keys(compat).length > 0 ? { compat } : {}),
92
+ };
93
+ }
94
+ function supportsThinking(config) {
95
+ const features = config.modelInfo?.modelFeatures;
96
+ if (features !== undefined)
97
+ return features.supportsThinking;
98
+ if (NO_REASONING_LABEL.test(config.label))
99
+ return false;
100
+ return REASONING_LABEL.test(config.label);
101
+ }
102
+ /** Per-million rates from the cost dimensions; Devin bills cache writes at the input rate, so cacheWrite stays 0. */
103
+ function costOf(config) {
104
+ const cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
105
+ for (const dimension of config.modelDimensions) {
106
+ if (dimension.kind !== ModelDimensionKind.COST && dimension.kind !== ModelDimensionKind.COST_FUZZY)
107
+ continue;
108
+ // Dimension values arrive as protobuf floats (0.1 decodes as 0.10000000149…); round at sub-cent precision.
109
+ const perMillion = Math.round(((dimension.value * 1_000_000) / denominatorTokens(dimension.denominator)) * 1e6) / 1e6;
110
+ switch (dimension.label.trim().toLowerCase()) {
111
+ case "input":
112
+ cost.input = perMillion;
113
+ break;
114
+ case "cached input":
115
+ cost.cacheRead = perMillion;
116
+ break;
117
+ case "output":
118
+ cost.output = perMillion;
119
+ break;
120
+ default:
121
+ break;
122
+ }
123
+ }
124
+ return cost;
125
+ }
126
+ const DENOMINATOR_SCALE = { k: 1_000, m: 1_000_000, b: 1_000_000_000 };
127
+ function denominatorTokens(denominator) {
128
+ const match = /(\d+(?:\.\d+)?)\s*([kmb])?/i.exec(denominator);
129
+ if (!match?.[1])
130
+ return 1_000_000;
131
+ const scale = match[2] ? (DENOMINATOR_SCALE[match[2].toLowerCase()] ?? 1) : 1;
132
+ const tokens = Number(match[1]) * scale;
133
+ return tokens > 0 ? tokens : 1_000_000;
134
+ }
135
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/api/devin-agent/discovery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cascade model discovery.\n *\n * `GetCliModelConfigs` is credential-scoped: it reports the models the signed-in\n * account may actually use, which differs per plan and per rollout. A failed or\n * empty response therefore returns undefined so callers KEEP their static seed\n * instead of publishing an empty catalog.\n */\n\nimport type { Model } from \"../../types.ts\";\nimport {\n\ttype ClientModelConfig,\n\tDisplayOption,\n\tGetCliModelConfigsRequestSchema,\n\tGetCliModelConfigsResponseSchema,\n\tModelDimensionKind,\n} from \"./gen/cascade_pb.ts\";\nimport { devinDiscoveryMetadata } from \"./metadata.ts\";\nimport { DEVIN_CLI_MODEL_CONFIGS_PATH, DEVIN_DEFAULT_BASE_URL } from \"./paths.ts\";\nimport { postDevinUnary } from \"./unary.ts\";\n\nconst DISCOVERY_TIMEOUT_MS = 5_000;\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst DEFAULT_MAX_TOKENS = 64_000;\n\n/** Slots requested for parity with the native client but never surfaced as models. */\nconst INTERNAL_DISPLAYS: ReadonlySet<DisplayOption> = new Set([\n\tDisplayOption.QUICK_REVIEW,\n\tDisplayOption.INTERNAL_DEFAULT,\n]);\n\n/**\n * Lanes whose configs advertise image support while the backend silently drops\n * `ChatMessagePrompt.images` (verified live on SWE-1.6 and SWE-1.6 Fast).\n */\nconst IMAGE_BLIND_UIDS: ReadonlySet<string> = new Set([\"swe-1-6\", \"swe-1-6-fast\"]);\n\nconst REASONING_LABEL = /think|thinking|minimal|high|medium|low|xhigh|max|reasoning/i;\nconst NO_REASONING_LABEL = /\\bno thinking\\b/i;\n\nexport interface DevinDiscoveryOptions {\n\tapiKey: string | undefined;\n\tbaseUrl?: string;\n\ttimeoutMs?: number;\n\tsignal?: AbortSignal;\n}\n\nexport async function fetchDevinModels(options: DevinDiscoveryOptions): Promise<Model<\"devin-agent\">[] | undefined> {\n\tconst baseUrl = (options.baseUrl ?? DEVIN_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\tconst controller = new AbortController();\n\tconst onAbort = () => controller.abort();\n\toptions.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DISCOVERY_TIMEOUT_MS);\n\n\ttry {\n\t\tconst response = await postDevinUnary({\n\t\t\tbaseUrl,\n\t\t\tpath: DEVIN_CLI_MODEL_CONFIGS_PATH,\n\t\t\trequestSchema: GetCliModelConfigsRequestSchema,\n\t\t\trequest: { metadata: devinDiscoveryMetadata(options.apiKey) },\n\t\t\tresponseSchema: GetCliModelConfigsResponseSchema,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tconst models = normalizeDevinModels(response.clientModelConfigs, baseUrl);\n\t\treturn models.length > 0 ? models : undefined;\n\t} catch {\n\t\treturn undefined;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nexport function normalizeDevinModels(configs: readonly ClientModelConfig[], baseUrl: string): Model<\"devin-agent\">[] {\n\tconst seen = new Set<string>();\n\tconst models: Model<\"devin-agent\">[] = [];\n\tfor (const config of configs) {\n\t\tif (config.disabled) continue;\n\t\tconst display = config.modelInfo?.displayOption ?? DisplayOption.UNSPECIFIED;\n\t\tif (INTERNAL_DISPLAYS.has(display)) continue;\n\t\tconst uid = config.modelUid.trim();\n\t\tif (!uid || seen.has(uid)) continue;\n\t\tseen.add(uid);\n\t\tconst isRouter = display === DisplayOption.MODEL_ROUTER || config.modelInfo?.isModelRouter === true;\n\t\tmodels.push(toModel(config, uid, baseUrl, isRouter));\n\t}\n\treturn models.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction toModel(config: ClientModelConfig, uid: string, baseUrl: string, isRouter: boolean): Model<\"devin-agent\"> {\n\tconst features = config.modelInfo?.modelFeatures;\n\tconst supportsImages = (features ? features.supportsImages : config.supportsImages) && !IMAGE_BLIND_UIDS.has(uid);\n\tconst maxOutputTokens = config.modelInfo?.maxOutputTokens ?? 0;\n\tconst compat = {\n\t\t...(isRouter ? { modelRouter: true } : {}),\n\t\t...(features?.supportsParallelToolCalls === true ? { supportsParallelToolCalls: true } : {}),\n\t};\n\treturn {\n\t\tid: uid,\n\t\tname: config.label.trim() || uid,\n\t\tapi: \"devin-agent\",\n\t\tprovider: \"devin\",\n\t\tbaseUrl,\n\t\treasoning: supportsThinking(config),\n\t\tinput: supportsImages ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: costOf(config),\n\t\tcontextWindow: config.maxTokens > 0 ? config.maxTokens : DEFAULT_CONTEXT_WINDOW,\n\t\tmaxTokens: maxOutputTokens > 0 ? maxOutputTokens : DEFAULT_MAX_TOKENS,\n\t\t...(Object.keys(compat).length > 0 ? { compat } : {}),\n\t};\n}\n\nfunction supportsThinking(config: ClientModelConfig): boolean {\n\tconst features = config.modelInfo?.modelFeatures;\n\tif (features !== undefined) return features.supportsThinking;\n\tif (NO_REASONING_LABEL.test(config.label)) return false;\n\treturn REASONING_LABEL.test(config.label);\n}\n\n/** Per-million rates from the cost dimensions; Devin bills cache writes at the input rate, so cacheWrite stays 0. */\nfunction costOf(config: ClientModelConfig): Model<\"devin-agent\">[\"cost\"] {\n\tconst cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\tfor (const dimension of config.modelDimensions) {\n\t\tif (dimension.kind !== ModelDimensionKind.COST && dimension.kind !== ModelDimensionKind.COST_FUZZY) continue;\n\t\t// Dimension values arrive as protobuf floats (0.1 decodes as 0.10000000149…); round at sub-cent precision.\n\t\tconst perMillion =\n\t\t\tMath.round(((dimension.value * 1_000_000) / denominatorTokens(dimension.denominator)) * 1e6) / 1e6;\n\t\tswitch (dimension.label.trim().toLowerCase()) {\n\t\t\tcase \"input\":\n\t\t\t\tcost.input = perMillion;\n\t\t\t\tbreak;\n\t\t\tcase \"cached input\":\n\t\t\t\tcost.cacheRead = perMillion;\n\t\t\t\tbreak;\n\t\t\tcase \"output\":\n\t\t\t\tcost.output = perMillion;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn cost;\n}\n\nconst DENOMINATOR_SCALE: Readonly<Record<string, number>> = { k: 1_000, m: 1_000_000, b: 1_000_000_000 };\n\nfunction denominatorTokens(denominator: string): number {\n\tconst match = /(\\d+(?:\\.\\d+)?)\\s*([kmb])?/i.exec(denominator);\n\tif (!match?.[1]) return 1_000_000;\n\tconst scale = match[2] ? (DENOMINATOR_SCALE[match[2].toLowerCase()] ?? 1) : 1;\n\tconst tokens = Number(match[1]) * scale;\n\treturn tokens > 0 ? tokens : 1_000_000;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Connect streaming frame codec.
3
+ *
4
+ * Each frame is a 5-byte prefix - one flag byte plus a big-endian payload
5
+ * length - followed by the payload. Requests are gzipped (flag 0x01); the final
6
+ * response frame carries JSON trailers (flag 0x02) instead of a message.
7
+ */
8
+ import { type DescMessage, type MessageShape } from "@bufbuild/protobuf";
9
+ export interface DevinFrame<TSchema extends DescMessage> {
10
+ /** Decoded message, absent on the end-of-stream trailer frame. */
11
+ message?: MessageShape<TSchema>;
12
+ /** Raw trailer JSON, present only on the end-of-stream frame. */
13
+ trailer?: string;
14
+ }
15
+ /** Encodes one request message as a single gzipped Connect frame. */
16
+ export declare function encodeDevinFrame<TSchema extends DescMessage>(schema: TSchema, message: MessageShape<TSchema>): Uint8Array<ArrayBuffer>;
17
+ /**
18
+ * Decodes a Connect frame stream. Yields one entry per frame in arrival order
19
+ * so callers can map deltas as they land; the trailer frame yields its raw JSON
20
+ * instead of a message.
21
+ */
22
+ export declare function decodeDevinFrames<TSchema extends DescMessage>(body: ReadableStream<Uint8Array>, schema: TSchema): AsyncGenerator<DevinFrame<TSchema>>;
23
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../src/api/devin-agent/frames.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,WAAW,EAAc,KAAK,YAAY,EAAY,MAAM,oBAAoB,CAAC;AAG/F,MAAM,WAAW,UAAU,CAAC,OAAO,SAAS,WAAW;IACtD,kEAAkE;IAClE,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,WAAW,EAC3D,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAC5B,UAAU,CAAC,WAAW,CAAC,CAOzB;AAED;;;;GAIG;AACH,wBAAuB,iBAAiB,CAAC,OAAO,SAAS,WAAW,EACnE,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,EAAE,OAAO,GACb,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CA4BrC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Connect streaming frame codec.
3
+ *
4
+ * Each frame is a 5-byte prefix - one flag byte plus a big-endian payload
5
+ * length - followed by the payload. Requests are gzipped (flag 0x01); the final
6
+ * response frame carries JSON trailers (flag 0x02) instead of a message.
7
+ */
8
+ import { gunzipSync, gzipSync } from "node:zlib";
9
+ import { fromBinary, toBinary } from "@bufbuild/protobuf";
10
+ import { DEVIN_COMPRESSED_FLAG, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_TRAILER_FLAG } from "./paths.js";
11
+ /** Encodes one request message as a single gzipped Connect frame. */
12
+ export function encodeDevinFrame(schema, message) {
13
+ const payload = gzipSync(toBinary(schema, message));
14
+ const frame = new Uint8Array(5 + payload.byteLength);
15
+ frame[0] = DEVIN_COMPRESSED_FLAG;
16
+ new DataView(frame.buffer).setUint32(1, payload.byteLength, false);
17
+ frame.set(payload, 5);
18
+ return frame;
19
+ }
20
+ /**
21
+ * Decodes a Connect frame stream. Yields one entry per frame in arrival order
22
+ * so callers can map deltas as they land; the trailer frame yields its raw JSON
23
+ * instead of a message.
24
+ */
25
+ export async function* decodeDevinFrames(body, schema) {
26
+ let pending = new Uint8Array(0);
27
+ const reader = body.getReader();
28
+ try {
29
+ for (;;) {
30
+ const { done, value } = await reader.read();
31
+ if (value && value.byteLength > 0)
32
+ pending = append(pending, value);
33
+ while (pending.byteLength >= 5) {
34
+ const view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);
35
+ const length = view.getUint32(1, false);
36
+ if (length > DEVIN_MAX_FRAME_PAYLOAD) {
37
+ throw new Error(`Devin Connect frame length ${length} exceeds the ${DEVIN_MAX_FRAME_PAYLOAD}-byte cap`);
38
+ }
39
+ if (pending.byteLength < 5 + length)
40
+ break;
41
+ const flags = pending[0] ?? 0;
42
+ const raw = pending.subarray(5, 5 + length);
43
+ const payload = (flags & DEVIN_COMPRESSED_FLAG) === 0 ? copyOf(raw) : copyOf(gunzipSync(raw));
44
+ pending = pending.subarray(5 + length);
45
+ yield (flags & DEVIN_TRAILER_FLAG) === 0
46
+ ? { message: fromBinary(schema, payload) }
47
+ : { trailer: new TextDecoder().decode(payload) };
48
+ }
49
+ if (done)
50
+ break;
51
+ }
52
+ }
53
+ finally {
54
+ reader.releaseLock();
55
+ }
56
+ }
57
+ /** protobuf-es requires an ArrayBuffer-backed view; Node buffers may be shared. */
58
+ function copyOf(source) {
59
+ const out = new Uint8Array(source.byteLength);
60
+ out.set(source);
61
+ return out;
62
+ }
63
+ function append(head, tail) {
64
+ if (head.byteLength === 0)
65
+ return tail;
66
+ const out = new Uint8Array(head.byteLength + tail.byteLength);
67
+ out.set(head, 0);
68
+ out.set(tail, head.byteLength);
69
+ return out;
70
+ }
71
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../../src/api/devin-agent/frames.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Connect streaming frame codec.\n *\n * Each frame is a 5-byte prefix - one flag byte plus a big-endian payload\n * length - followed by the payload. Requests are gzipped (flag 0x01); the final\n * response frame carries JSON trailers (flag 0x02) instead of a message.\n */\n\nimport { gunzipSync, gzipSync } from \"node:zlib\";\nimport { type DescMessage, fromBinary, type MessageShape, toBinary } from \"@bufbuild/protobuf\";\nimport { DEVIN_COMPRESSED_FLAG, DEVIN_MAX_FRAME_PAYLOAD, DEVIN_TRAILER_FLAG } from \"./paths.ts\";\n\nexport interface DevinFrame<TSchema extends DescMessage> {\n\t/** Decoded message, absent on the end-of-stream trailer frame. */\n\tmessage?: MessageShape<TSchema>;\n\t/** Raw trailer JSON, present only on the end-of-stream frame. */\n\ttrailer?: string;\n}\n\n/** Encodes one request message as a single gzipped Connect frame. */\nexport function encodeDevinFrame<TSchema extends DescMessage>(\n\tschema: TSchema,\n\tmessage: MessageShape<TSchema>,\n): Uint8Array<ArrayBuffer> {\n\tconst payload = gzipSync(toBinary(schema, message));\n\tconst frame = new Uint8Array(5 + payload.byteLength);\n\tframe[0] = DEVIN_COMPRESSED_FLAG;\n\tnew DataView(frame.buffer).setUint32(1, payload.byteLength, false);\n\tframe.set(payload, 5);\n\treturn frame;\n}\n\n/**\n * Decodes a Connect frame stream. Yields one entry per frame in arrival order\n * so callers can map deltas as they land; the trailer frame yields its raw JSON\n * instead of a message.\n */\nexport async function* decodeDevinFrames<TSchema extends DescMessage>(\n\tbody: ReadableStream<Uint8Array>,\n\tschema: TSchema,\n): AsyncGenerator<DevinFrame<TSchema>> {\n\tlet pending: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n\tconst reader = body.getReader();\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (value && value.byteLength > 0) pending = append(pending, value);\n\t\t\twhile (pending.byteLength >= 5) {\n\t\t\t\tconst view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);\n\t\t\t\tconst length = view.getUint32(1, false);\n\t\t\t\tif (length > DEVIN_MAX_FRAME_PAYLOAD) {\n\t\t\t\t\tthrow new Error(`Devin Connect frame length ${length} exceeds the ${DEVIN_MAX_FRAME_PAYLOAD}-byte cap`);\n\t\t\t\t}\n\t\t\t\tif (pending.byteLength < 5 + length) break;\n\t\t\t\tconst flags = pending[0] ?? 0;\n\t\t\t\tconst raw = pending.subarray(5, 5 + length);\n\t\t\t\tconst payload: Uint8Array<ArrayBuffer> =\n\t\t\t\t\t(flags & DEVIN_COMPRESSED_FLAG) === 0 ? copyOf(raw) : copyOf(gunzipSync(raw));\n\t\t\t\tpending = pending.subarray(5 + length);\n\t\t\t\tyield (flags & DEVIN_TRAILER_FLAG) === 0\n\t\t\t\t\t? { message: fromBinary(schema, payload) }\n\t\t\t\t\t: { trailer: new TextDecoder().decode(payload) };\n\t\t\t}\n\t\t\tif (done) break;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\n/** protobuf-es requires an ArrayBuffer-backed view; Node buffers may be shared. */\nfunction copyOf(source: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBuffer> {\n\tconst out = new Uint8Array(source.byteLength);\n\tout.set(source);\n\treturn out;\n}\n\nfunction append(head: Uint8Array<ArrayBufferLike>, tail: Uint8Array<ArrayBufferLike>): Uint8Array<ArrayBufferLike> {\n\tif (head.byteLength === 0) return tail;\n\tconst out = new Uint8Array(head.byteLength + tail.byteLength);\n\tout.set(head, 0);\n\tout.set(tail, head.byteLength);\n\treturn out;\n}\n"]}