@pentoshi/clai 4.12.1 → 4.13.1

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 (483) hide show
  1. package/CODE_OF_CONDUCT.md +132 -0
  2. package/CONTRIBUTING.md +102 -0
  3. package/PROVIDERS.md +149 -0
  4. package/README.md +217 -464
  5. package/SECURITY.md +33 -0
  6. package/dist/agent/compaction/summary-execution.js +2 -2
  7. package/dist/agent/compaction/summary-execution.js.map +1 -1
  8. package/dist/agent/compaction-summary.d.ts +5 -2
  9. package/dist/agent/compaction-summary.js +10 -4
  10. package/dist/agent/compaction-summary.js.map +1 -1
  11. package/dist/agent/context/compact-with-summary.d.ts +1 -0
  12. package/dist/agent/context/compact-with-summary.js +25 -3
  13. package/dist/agent/context/compact-with-summary.js.map +1 -1
  14. package/dist/agent/context/compaction-recent-history.d.ts +12 -0
  15. package/dist/agent/context/compaction-recent-history.js +114 -0
  16. package/dist/agent/context/compaction-recent-history.js.map +1 -0
  17. package/dist/agent/context/user-credentials.d.ts +1 -0
  18. package/dist/agent/context/user-credentials.js +3 -0
  19. package/dist/agent/context/user-credentials.js.map +1 -1
  20. package/dist/agent/context-manager.js +2 -1
  21. package/dist/agent/context-manager.js.map +1 -1
  22. package/dist/agent/evidence/task-classification.js +2 -5
  23. package/dist/agent/evidence/task-classification.js.map +1 -1
  24. package/dist/agent/loop-guard.js +1 -5
  25. package/dist/agent/loop-guard.js.map +1 -1
  26. package/dist/agent/outcomes.js +9 -1
  27. package/dist/agent/outcomes.js.map +1 -1
  28. package/dist/agent/parser/arg-formatting.js +3 -16
  29. package/dist/agent/parser/arg-formatting.js.map +1 -1
  30. package/dist/agent/parser/bare-recognition.js +12 -6
  31. package/dist/agent/parser/bare-recognition.js.map +1 -1
  32. package/dist/agent/parser/xml-protocol.js +0 -2
  33. package/dist/agent/parser/xml-protocol.js.map +1 -1
  34. package/dist/agent/plan-implement-compact.js +2 -1
  35. package/dist/agent/plan-implement-compact.js.map +1 -1
  36. package/dist/agent/request-budget.d.ts +1 -0
  37. package/dist/agent/request-budget.js +6 -1
  38. package/dist/agent/request-budget.js.map +1 -1
  39. package/dist/agent/runner.js +2 -2
  40. package/dist/agent/runner.js.map +1 -1
  41. package/dist/agent/session-policy.d.ts +1 -0
  42. package/dist/agent/session-policy.js +1 -4
  43. package/dist/agent/session-policy.js.map +1 -1
  44. package/dist/agent/subagents/manager.d.ts +5 -1
  45. package/dist/agent/subagents/manager.js +95 -15
  46. package/dist/agent/subagents/manager.js.map +1 -1
  47. package/dist/agent/subagents/read-only-tools.js +44 -20
  48. package/dist/agent/subagents/read-only-tools.js.map +1 -1
  49. package/dist/agent/subagents/tools.d.ts +8 -1
  50. package/dist/agent/subagents/tools.js +21 -13
  51. package/dist/agent/subagents/tools.js.map +1 -1
  52. package/dist/agent/subagents/types.d.ts +7 -0
  53. package/dist/agent/subagents/worker.js +48 -7
  54. package/dist/agent/subagents/worker.js.map +1 -1
  55. package/dist/agent/task-evidence.js +2 -11
  56. package/dist/agent/task-evidence.js.map +1 -1
  57. package/dist/agent/tool-output-formatting.js +8 -2
  58. package/dist/agent/tool-output-formatting.js.map +1 -1
  59. package/dist/agent/turn/automatic-compaction-execution.js +1 -0
  60. package/dist/agent/turn/automatic-compaction-execution.js.map +1 -1
  61. package/dist/agent/turn/compaction-coordinator.js +4 -4
  62. package/dist/agent/turn/compaction-coordinator.js.map +1 -1
  63. package/dist/agent/turn/compaction-replay-selection.js +1 -0
  64. package/dist/agent/turn/compaction-replay-selection.js.map +1 -1
  65. package/dist/agent/turn/loop/run-rounds.js +11 -3
  66. package/dist/agent/turn/loop/run-rounds.js.map +1 -1
  67. package/dist/agent/turn/prompt-sections.js +4 -9
  68. package/dist/agent/turn/prompt-sections.js.map +1 -1
  69. package/dist/agent/turn/setup/turn-messages.js +2 -1
  70. package/dist/agent/turn/setup/turn-messages.js.map +1 -1
  71. package/dist/agent/turn/subagent-inbox.d.ts +5 -5
  72. package/dist/agent/turn/subagent-inbox.js +90 -11
  73. package/dist/agent/turn/subagent-inbox.js.map +1 -1
  74. package/dist/agent/turn/system-sections.d.ts +1 -0
  75. package/dist/agent/turn/system-sections.js +1 -1
  76. package/dist/agent/turn/system-sections.js.map +1 -1
  77. package/dist/agent/turn/task-autostart.js +2 -0
  78. package/dist/agent/turn/task-autostart.js.map +1 -1
  79. package/dist/agent/turn/tool-execution/single-tool.js +1 -3
  80. package/dist/agent/turn/tool-execution/single-tool.js.map +1 -1
  81. package/dist/agent/turn/tool-result-recorder.js +5 -0
  82. package/dist/agent/turn/tool-result-recorder.js.map +1 -1
  83. package/dist/agent/turn/tool-routing.d.ts +1 -1
  84. package/dist/agent/turn/tool-routing.js +11 -11
  85. package/dist/agent/turn/tool-routing.js.map +1 -1
  86. package/dist/agent/workspace-orient.js +2 -2
  87. package/dist/agent/workspace-orient.js.map +1 -1
  88. package/dist/app/adapters/agent-event-adapter.js +5 -0
  89. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  90. package/dist/app/adapters/current-store-adapter.js +2 -2
  91. package/dist/app/adapters/current-store-adapter.js.map +1 -1
  92. package/dist/app/commands/catalog.js +2 -0
  93. package/dist/app/commands/catalog.js.map +1 -1
  94. package/dist/app/commands/registry.js +1 -1
  95. package/dist/app/commands/registry.js.map +1 -1
  96. package/dist/app/controllers/session-compact-helper.js +1 -0
  97. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  98. package/dist/app/controllers/session-controller.d.ts +8 -0
  99. package/dist/app/controllers/session-controller.js +58 -10
  100. package/dist/app/controllers/session-controller.js.map +1 -1
  101. package/dist/app/controllers/session-naming.d.ts +4 -5
  102. package/dist/app/controllers/session-naming.js +38 -80
  103. package/dist/app/controllers/session-naming.js.map +1 -1
  104. package/dist/app/controllers/session-prompt-history.d.ts +4 -0
  105. package/dist/app/controllers/session-prompt-history.js +33 -0
  106. package/dist/app/controllers/session-prompt-history.js.map +1 -0
  107. package/dist/app/controllers/session-prompt-queue.d.ts +1 -0
  108. package/dist/app/controllers/session-prompt-queue.js +1 -1
  109. package/dist/app/controllers/session-prompt-queue.js.map +1 -1
  110. package/dist/app/events/artifact-output.d.ts +1 -0
  111. package/dist/app/events/artifact-output.js +32 -0
  112. package/dist/app/events/artifact-output.js.map +1 -0
  113. package/dist/app/events/event-buffer.d.ts +13 -1
  114. package/dist/app/events/event-buffer.js +92 -4
  115. package/dist/app/events/event-buffer.js.map +1 -1
  116. package/dist/app/operation-review.js +1 -1
  117. package/dist/app/operation-review.js.map +1 -1
  118. package/dist/app/ports/persistence-port.d.ts +2 -1
  119. package/dist/classic/app/ClassicApp.js +33 -2
  120. package/dist/classic/app/ClassicApp.js.map +1 -1
  121. package/dist/classic/app/action-handlers.js +0 -2
  122. package/dist/classic/app/action-handlers.js.map +1 -1
  123. package/dist/classic/app/app-wiring.d.ts +1 -2
  124. package/dist/classic/app/app-wiring.js +1 -8
  125. package/dist/classic/app/app-wiring.js.map +1 -1
  126. package/dist/classic/app/wiring-interactions.d.ts +0 -2
  127. package/dist/classic/app/wiring-interactions.js +5 -13
  128. package/dist/classic/app/wiring-interactions.js.map +1 -1
  129. package/dist/classic/app/wiring-types.d.ts +2 -2
  130. package/dist/classic/blocks/batch-lines.js +10 -8
  131. package/dist/classic/blocks/batch-lines.js.map +1 -1
  132. package/dist/classic/blocks/block-context.d.ts +1 -0
  133. package/dist/classic/blocks/block-context.js.map +1 -1
  134. package/dist/classic/blocks/tool-lines.js +20 -39
  135. package/dist/classic/blocks/tool-lines.js.map +1 -1
  136. package/dist/classic/bootstrap/renderer-handle.d.ts +5 -1
  137. package/dist/classic/bootstrap/renderer-handle.js.map +1 -1
  138. package/dist/classic/bootstrap/start-classic.js +12 -12
  139. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  140. package/dist/classic/chrome/context-limit-editor.d.ts +7 -0
  141. package/dist/classic/chrome/context-limit-editor.js +5 -0
  142. package/dist/classic/chrome/context-limit-editor.js.map +1 -1
  143. package/dist/classic/chrome/status-rows.d.ts +4 -0
  144. package/dist/classic/chrome/status-rows.js +11 -0
  145. package/dist/classic/chrome/status-rows.js.map +1 -1
  146. package/dist/classic/feed/feed-blocks.d.ts +1 -1
  147. package/dist/classic/feed/feed-blocks.js +13 -6
  148. package/dist/classic/feed/feed-blocks.js.map +1 -1
  149. package/dist/classic/panels/keys-panel.js +12 -3
  150. package/dist/classic/panels/keys-panel.js.map +1 -1
  151. package/dist/classic/panels/pager-panel.js +0 -6
  152. package/dist/classic/panels/pager-panel.js.map +1 -1
  153. package/dist/classic/panels/pager-source-controller.d.ts +34 -0
  154. package/dist/classic/panels/pager-source-controller.js +209 -0
  155. package/dist/classic/panels/pager-source-controller.js.map +1 -0
  156. package/dist/classic/panels/panel-controller.d.ts +1 -5
  157. package/dist/classic/panels/panel-controller.js +19 -88
  158. package/dist/classic/panels/panel-controller.js.map +1 -1
  159. package/dist/classic/panels/panel-effect.d.ts +0 -4
  160. package/dist/classic/panels/panel-effect.js.map +1 -1
  161. package/dist/classic/panels/panel-effects.js +0 -6
  162. package/dist/classic/panels/panel-effects.js.map +1 -1
  163. package/dist/classic/panels/panel-types.d.ts +0 -2
  164. package/dist/classic/panels/picker-panel.js +1 -1
  165. package/dist/classic/panels/picker-panel.js.map +1 -1
  166. package/dist/commands/providers.d.ts +1 -0
  167. package/dist/commands/providers.js +1 -0
  168. package/dist/commands/providers.js.map +1 -1
  169. package/dist/commands/qoder.d.ts +8 -0
  170. package/dist/commands/qoder.js +85 -0
  171. package/dist/commands/qoder.js.map +1 -0
  172. package/dist/index.js +19 -15
  173. package/dist/index.js.map +1 -1
  174. package/dist/interactive-session/transport-node-pty.js +3 -5
  175. package/dist/interactive-session/transport-node-pty.js.map +1 -1
  176. package/dist/llm/capability/state.d.ts +1 -1
  177. package/dist/llm/capability/tool-dialect.js +1 -0
  178. package/dist/llm/capability/tool-dialect.js.map +1 -1
  179. package/dist/llm/capability/vision-patterns.js +1 -0
  180. package/dist/llm/capability/vision-patterns.js.map +1 -1
  181. package/dist/llm/context-windows.js +2 -3
  182. package/dist/llm/context-windows.js.map +1 -1
  183. package/dist/llm/provider-identity.js +5 -0
  184. package/dist/llm/provider-identity.js.map +1 -1
  185. package/dist/llm/provider-info-text.js +25 -0
  186. package/dist/llm/provider-info-text.js.map +1 -1
  187. package/dist/llm/qoder/qoder-accounts.d.ts +9 -0
  188. package/dist/llm/qoder/qoder-accounts.js +53 -0
  189. package/dist/llm/qoder/qoder-accounts.js.map +1 -0
  190. package/dist/llm/qoder/qoder-auth.d.ts +59 -0
  191. package/dist/llm/qoder/qoder-auth.js +203 -0
  192. package/dist/llm/qoder/qoder-auth.js.map +1 -0
  193. package/dist/llm/qoder/qoder-credential.d.ts +31 -0
  194. package/dist/llm/qoder/qoder-credential.js +82 -0
  195. package/dist/llm/qoder/qoder-credential.js.map +1 -0
  196. package/dist/llm/qoder/qoder-login.d.ts +28 -0
  197. package/dist/llm/qoder/qoder-login.js +153 -0
  198. package/dist/llm/qoder/qoder-login.js.map +1 -0
  199. package/dist/llm/qoder/qoder-refresh.d.ts +4 -0
  200. package/dist/llm/qoder/qoder-refresh.js +165 -0
  201. package/dist/llm/qoder/qoder-refresh.js.map +1 -0
  202. package/dist/llm/qoder/qoder-signer.d.ts +66 -0
  203. package/dist/llm/qoder/qoder-signer.js +119 -0
  204. package/dist/llm/qoder/qoder-signer.js.map +1 -0
  205. package/dist/llm/qoder/qoder.d.ts +20 -0
  206. package/dist/llm/qoder/qoder.js +441 -0
  207. package/dist/llm/qoder/qoder.js.map +1 -0
  208. package/dist/llm/qoder/signer-glue.generated.d.ts +1 -0
  209. package/dist/llm/qoder/signer-glue.generated.js +4 -0
  210. package/dist/llm/qoder/signer-glue.generated.js.map +1 -0
  211. package/dist/llm/qoder/signer-wasm.generated.d.ts +3 -0
  212. package/dist/llm/qoder/signer-wasm.generated.js +6 -0
  213. package/dist/llm/qoder/signer-wasm.generated.js.map +1 -0
  214. package/dist/llm/reasoning-capability.js +1 -0
  215. package/dist/llm/reasoning-capability.js.map +1 -1
  216. package/dist/llm/routing/attempt-complete.js +4 -2
  217. package/dist/llm/routing/attempt-complete.js.map +1 -1
  218. package/dist/llm/routing/attempt-request.d.ts +2 -1
  219. package/dist/llm/routing/attempt-request.js +35 -1
  220. package/dist/llm/routing/attempt-request.js.map +1 -1
  221. package/dist/llm/routing/attempt-stream.js +4 -2
  222. package/dist/llm/routing/attempt-stream.js.map +1 -1
  223. package/dist/llm/routing/provider-selection.js +3 -0
  224. package/dist/llm/routing/provider-selection.js.map +1 -1
  225. package/dist/llm/tool-protocol.js +6 -0
  226. package/dist/llm/tool-protocol.js.map +1 -1
  227. package/dist/llm/wire/reasoning-payload.d.ts +1 -1
  228. package/dist/llm/wire/reasoning-payload.js +6 -0
  229. package/dist/llm/wire/reasoning-payload.js.map +1 -1
  230. package/dist/modes/ask.js +26 -10
  231. package/dist/modes/ask.js.map +1 -1
  232. package/dist/noninteractive/stream-blocks.d.ts +2 -4
  233. package/dist/noninteractive/stream-blocks.js +5 -5
  234. package/dist/noninteractive/stream-blocks.js.map +1 -1
  235. package/dist/noninteractive/stream-renderer.js +1 -1
  236. package/dist/noninteractive/stream-renderer.js.map +1 -1
  237. package/dist/prompts/embedded.js +2 -2
  238. package/dist/prompts/embedded.js.map +1 -1
  239. package/dist/prompts/index.d.ts +3 -1
  240. package/dist/prompts/index.js +25 -9
  241. package/dist/prompts/index.js.map +1 -1
  242. package/dist/prompts/system.agent.md +11 -11
  243. package/dist/prompts/system.ask.md +5 -3
  244. package/dist/safety/shell-command-words.d.ts +11 -0
  245. package/dist/safety/shell-command-words.js +193 -0
  246. package/dist/safety/shell-command-words.js.map +1 -0
  247. package/dist/safety/shell-filesystem-effects.js +46 -40
  248. package/dist/safety/shell-filesystem-effects.js.map +1 -1
  249. package/dist/safety/tool-classification.js +0 -14
  250. package/dist/safety/tool-classification.js.map +1 -1
  251. package/dist/session-runtime/binding.js +4 -1
  252. package/dist/session-runtime/binding.js.map +1 -1
  253. package/dist/session-runtime/client.js +111 -7
  254. package/dist/session-runtime/client.js.map +1 -1
  255. package/dist/session-runtime/discovery.d.ts +1 -1
  256. package/dist/session-runtime/discovery.js +2 -2
  257. package/dist/session-runtime/discovery.js.map +1 -1
  258. package/dist/session-runtime/host.d.ts +10 -2
  259. package/dist/session-runtime/host.js +206 -83
  260. package/dist/session-runtime/host.js.map +1 -1
  261. package/dist/session-runtime/input-commands.d.ts +2 -0
  262. package/dist/session-runtime/input-commands.js +11 -0
  263. package/dist/session-runtime/input-commands.js.map +1 -0
  264. package/dist/session-runtime/input-stream.d.ts +15 -0
  265. package/dist/session-runtime/input-stream.js +128 -0
  266. package/dist/session-runtime/input-stream.js.map +1 -0
  267. package/dist/session-runtime/types.d.ts +9 -0
  268. package/dist/store/config.js +1 -0
  269. package/dist/store/config.js.map +1 -1
  270. package/dist/store/history/freshness.d.ts +9 -0
  271. package/dist/store/history/freshness.js +29 -0
  272. package/dist/store/history/freshness.js.map +1 -0
  273. package/dist/store/history/jsonl-backend.js +2 -16
  274. package/dist/store/history/jsonl-backend.js.map +1 -1
  275. package/dist/store/history/lifecycle.js +6 -2
  276. package/dist/store/history/lifecycle.js.map +1 -1
  277. package/dist/store/history/recovery.d.ts +1 -3
  278. package/dist/store/history/recovery.js +72 -111
  279. package/dist/store/history/recovery.js.map +1 -1
  280. package/dist/store/history/session-queries.js +5 -5
  281. package/dist/store/history/session-queries.js.map +1 -1
  282. package/dist/store/history-index.d.ts +5 -0
  283. package/dist/store/history-index.js +41 -9
  284. package/dist/store/history-index.js.map +1 -1
  285. package/dist/store/history.d.ts +7 -2
  286. package/dist/store/history.js +13 -7
  287. package/dist/store/history.js.map +1 -1
  288. package/dist/store/rtk-usage.d.ts +2 -0
  289. package/dist/store/rtk-usage.js +44 -0
  290. package/dist/store/rtk-usage.js.map +1 -0
  291. package/dist/store/session-prompts-format.d.ts +2 -0
  292. package/dist/store/session-prompts-format.js +29 -0
  293. package/dist/store/session-prompts-format.js.map +1 -0
  294. package/dist/store/session-prompts.d.ts +40 -0
  295. package/dist/store/session-prompts.js +213 -0
  296. package/dist/store/session-prompts.js.map +1 -0
  297. package/dist/store/subagents.d.ts +5 -1
  298. package/dist/store/subagents.js +64 -4
  299. package/dist/store/subagents.js.map +1 -1
  300. package/dist/tools/call-normalization.js +0 -3
  301. package/dist/tools/call-normalization.js.map +1 -1
  302. package/dist/tools/definitions/aggregate.js +0 -4
  303. package/dist/tools/definitions/aggregate.js.map +1 -1
  304. package/dist/tools/definitions/define.js +0 -3
  305. package/dist/tools/definitions/define.js.map +1 -1
  306. package/dist/tools/definitions/files.js +3 -111
  307. package/dist/tools/definitions/files.js.map +1 -1
  308. package/dist/tools/definitions/fs-read.d.ts +3 -0
  309. package/dist/tools/definitions/fs-read.js +43 -0
  310. package/dist/tools/definitions/fs-read.js.map +1 -0
  311. package/dist/tools/definitions/selection.js +0 -45
  312. package/dist/tools/definitions/selection.js.map +1 -1
  313. package/dist/tools/fs/read-budget.d.ts +8 -0
  314. package/dist/tools/fs/read-budget.js +30 -0
  315. package/dist/tools/fs/read-budget.js.map +1 -0
  316. package/dist/tools/fs/read-input.d.ts +16 -0
  317. package/dist/tools/fs/read-input.js +73 -0
  318. package/dist/tools/fs/read-input.js.map +1 -0
  319. package/dist/tools/fs/read-many.d.ts +6 -0
  320. package/dist/tools/fs/read-many.js +50 -0
  321. package/dist/tools/fs/read-many.js.map +1 -0
  322. package/dist/tools/fs/read-sections.d.ts +11 -0
  323. package/dist/tools/fs/read-sections.js +71 -0
  324. package/dist/tools/fs/read-sections.js.map +1 -0
  325. package/dist/tools/fs/read-window.d.ts +1 -1
  326. package/dist/tools/fs/read-window.js +57 -25
  327. package/dist/tools/fs/read-window.js.map +1 -1
  328. package/dist/tools/fs/read.d.ts +0 -4
  329. package/dist/tools/fs/read.js +34 -17
  330. package/dist/tools/fs/read.js.map +1 -1
  331. package/dist/tools/fs.d.ts +2 -2
  332. package/dist/tools/fs.js +1 -2
  333. package/dist/tools/fs.js.map +1 -1
  334. package/dist/tools/handlers/files-1.js +11 -35
  335. package/dist/tools/handlers/files-1.js.map +1 -1
  336. package/dist/tools/handlers/files-2.js.map +1 -1
  337. package/dist/tools/handlers/shell-1.js +8 -2
  338. package/dist/tools/handlers/shell-1.js.map +1 -1
  339. package/dist/tools/jobs/types.d.ts +3 -0
  340. package/dist/tools/jobs.js +8 -1
  341. package/dist/tools/jobs.js.map +1 -1
  342. package/dist/tools/read-only-shell.d.ts +2 -0
  343. package/dist/tools/read-only-shell.js +65 -0
  344. package/dist/tools/read-only-shell.js.map +1 -0
  345. package/dist/tools/registry.js +0 -9
  346. package/dist/tools/registry.js.map +1 -1
  347. package/dist/tools/retired-tools.js +1 -1
  348. package/dist/tools/retired-tools.js.map +1 -1
  349. package/dist/tools/rtk/rewrite.d.ts +3 -2
  350. package/dist/tools/rtk/rewrite.js +4 -5
  351. package/dist/tools/rtk/rewrite.js.map +1 -1
  352. package/dist/tools/shell/exec-attempt.js +1 -0
  353. package/dist/tools/shell/exec-attempt.js.map +1 -1
  354. package/dist/tools/shell/spawn-argv.js +1 -1
  355. package/dist/tools/shell/spawn-argv.js.map +1 -1
  356. package/dist/tools/shell.d.ts +1 -0
  357. package/dist/tools/shell.js.map +1 -1
  358. package/dist/tui-v2/bootstrap/start-tui-v2.js +0 -2
  359. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  360. package/dist/tui-v2/components/modal/keys-modal.js +42 -6
  361. package/dist/tui-v2/components/modal/keys-modal.js.map +1 -1
  362. package/dist/tui-v2/components/pager/pager.js +36 -58
  363. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  364. package/dist/tui-v2/components/transcript/tool-card.js +21 -19
  365. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  366. package/dist/tui-v2/components/transcript/transcript-view.js +24 -21
  367. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  368. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +1 -0
  369. package/dist/tui-v2/components/transcript/use-transcript-selection.js +12 -1
  370. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -1
  371. package/dist/types.d.ts +16 -1
  372. package/dist/types.js +1 -0
  373. package/dist/types.js.map +1 -1
  374. package/dist/ui/mentions/expand.js +1 -1
  375. package/dist/ui-core/actions/action-id.d.ts +1 -1
  376. package/dist/ui-core/actions/action-id.js +0 -2
  377. package/dist/ui-core/actions/action-id.js.map +1 -1
  378. package/dist/ui-core/actions/format-shortcuts.js +0 -2
  379. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  380. package/dist/ui-core/actions/keymap.js +0 -6
  381. package/dist/ui-core/actions/keymap.js.map +1 -1
  382. package/dist/ui-core/bootstrap/composition-root.d.ts +0 -3
  383. package/dist/ui-core/bootstrap/composition-root.js +0 -8
  384. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  385. package/dist/ui-core/bootstrap/session-resume.d.ts +5 -0
  386. package/dist/ui-core/bootstrap/session-resume.js +13 -35
  387. package/dist/ui-core/bootstrap/session-resume.js.map +1 -1
  388. package/dist/ui-core/commands/command-handlers.js +3 -1
  389. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  390. package/dist/ui-core/commands/config-commands.js +5 -1
  391. package/dist/ui-core/commands/config-commands.js.map +1 -1
  392. package/dist/ui-core/commands/key-commands.js +50 -30
  393. package/dist/ui-core/commands/key-commands.js.map +1 -1
  394. package/dist/ui-core/commands/keys/auth-picker.d.ts +3 -0
  395. package/dist/ui-core/commands/keys/auth-picker.js +29 -0
  396. package/dist/ui-core/commands/keys/auth-picker.js.map +1 -0
  397. package/dist/ui-core/commands/keys/qoder.d.ts +4 -0
  398. package/dist/ui-core/commands/keys/qoder.js +194 -0
  399. package/dist/ui-core/commands/keys/qoder.js.map +1 -0
  400. package/dist/ui-core/commands/picker-commands.js +19 -1
  401. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  402. package/dist/ui-core/commands/prompt-commands.d.ts +2 -0
  403. package/dist/ui-core/commands/prompt-commands.js +10 -0
  404. package/dist/ui-core/commands/prompt-commands.js.map +1 -0
  405. package/dist/ui-core/commands/rtk-commands.js +35 -16
  406. package/dist/ui-core/commands/rtk-commands.js.map +1 -1
  407. package/dist/ui-core/commands/session-commands.js +13 -5
  408. package/dist/ui-core/commands/session-commands.js.map +1 -1
  409. package/dist/ui-core/controllers/overlay-controller.d.ts +7 -0
  410. package/dist/ui-core/controllers/overlay-controller.js +6 -0
  411. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  412. package/dist/ui-core/rendering/batch-sections.d.ts +1 -1
  413. package/dist/ui-core/rendering/batch-sections.js +18 -4
  414. package/dist/ui-core/rendering/batch-sections.js.map +1 -1
  415. package/dist/ui-core/rendering/duration.js +1 -1
  416. package/dist/ui-core/rendering/duration.js.map +1 -1
  417. package/dist/ui-core/rendering/open-tool-output.js +4 -1
  418. package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
  419. package/dist/ui-core/rendering/pager-source.js +3 -0
  420. package/dist/ui-core/rendering/pager-source.js.map +1 -1
  421. package/dist/ui-core/rendering/pager-text.js +3 -0
  422. package/dist/ui-core/rendering/pager-text.js.map +1 -1
  423. package/dist/ui-core/rendering/pager-view-policy.js +4 -2
  424. package/dist/ui-core/rendering/pager-view-policy.js.map +1 -1
  425. package/dist/ui-core/rendering/session-prompts-pager-source.d.ts +3 -0
  426. package/dist/ui-core/rendering/session-prompts-pager-source.js +40 -0
  427. package/dist/ui-core/rendering/session-prompts-pager-source.js.map +1 -0
  428. package/dist/ui-core/rendering/subagent-source.d.ts +1 -1
  429. package/dist/ui-core/rendering/subagent-source.js +37 -1
  430. package/dist/ui-core/rendering/subagent-source.js.map +1 -1
  431. package/dist/ui-core/rendering/text-width.d.ts +1 -0
  432. package/dist/ui-core/rendering/text-width.js +31 -0
  433. package/dist/ui-core/rendering/text-width.js.map +1 -1
  434. package/dist/ui-core/rendering/tool-presenter.d.ts +9 -4
  435. package/dist/ui-core/rendering/tool-presenter.js +43 -91
  436. package/dist/ui-core/rendering/tool-presenter.js.map +1 -1
  437. package/dist/ui-core/state/transcript-store.js +7 -2
  438. package/dist/ui-core/state/transcript-store.js.map +1 -1
  439. package/dist/ui-core/state/transcript-types.d.ts +1 -1
  440. package/dist/ui-core/state/transcript-types.js +4 -2
  441. package/dist/ui-core/state/transcript-types.js.map +1 -1
  442. package/dist/version.generated.d.ts +2 -2
  443. package/dist/version.generated.js +2 -2
  444. package/package.json +8 -3
  445. package/dist/agent/turn/pentest-tools.d.ts +0 -3
  446. package/dist/agent/turn/pentest-tools.js +0 -17
  447. package/dist/agent/turn/pentest-tools.js.map +0 -1
  448. package/dist/classic/bootstrap/suspend-port.d.ts +0 -14
  449. package/dist/classic/bootstrap/suspend-port.js +0 -29
  450. package/dist/classic/bootstrap/suspend-port.js.map +0 -1
  451. package/dist/tools/capabilities.d.ts +0 -12
  452. package/dist/tools/capabilities.js +0 -225
  453. package/dist/tools/capabilities.js.map +0 -1
  454. package/dist/tools/definitions/network.d.ts +0 -2
  455. package/dist/tools/definitions/network.js +0 -17
  456. package/dist/tools/definitions/network.js.map +0 -1
  457. package/dist/tools/definitions/orchestration.d.ts +0 -2
  458. package/dist/tools/definitions/orchestration.js +0 -27
  459. package/dist/tools/definitions/orchestration.js.map +0 -1
  460. package/dist/tools/fs/search.d.ts +0 -32
  461. package/dist/tools/fs/search.js +0 -431
  462. package/dist/tools/fs/search.js.map +0 -1
  463. package/dist/tools/handlers/network-3.d.ts +0 -2
  464. package/dist/tools/handlers/network-3.js +0 -13
  465. package/dist/tools/handlers/network-3.js.map +0 -1
  466. package/dist/tools/handlers/orchestration-2.d.ts +0 -2
  467. package/dist/tools/handlers/orchestration-2.js +0 -16
  468. package/dist/tools/handlers/orchestration-2.js.map +0 -1
  469. package/dist/tools/net-ping-sweep.d.ts +0 -18
  470. package/dist/tools/net-ping-sweep.js +0 -274
  471. package/dist/tools/net-ping-sweep.js.map +0 -1
  472. package/dist/tools/wordlists.d.ts +0 -6
  473. package/dist/tools/wordlists.js +0 -390
  474. package/dist/tools/wordlists.js.map +0 -1
  475. package/dist/tui-v2/bootstrap/pager-export.d.ts +0 -7
  476. package/dist/tui-v2/bootstrap/pager-export.js +0 -19
  477. package/dist/tui-v2/bootstrap/pager-export.js.map +0 -1
  478. package/dist/ui-core/ports/pager-export-port.d.ts +0 -16
  479. package/dist/ui-core/ports/pager-export-port.js +0 -68
  480. package/dist/ui-core/ports/pager-export-port.js.map +0 -1
  481. package/dist/ui-core/rendering/fs-search-summary.d.ts +0 -11
  482. package/dist/ui-core/rendering/fs-search-summary.js +0 -65
  483. package/dist/ui-core/rendering/fs-search-summary.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { asRecord, expiryMilliseconds, pickString, QoderAuthError, } from "./qoder-auth.js";
2
+ import { loadSignerModule } from "./qoder-signer.js";
3
+ function optionalNumber(record, key) {
4
+ const value = record[key];
5
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
6
+ }
7
+ export function parseQoderCredential(value) {
8
+ if (!value)
9
+ throw new QoderAuthError("Qoder authentication required. Run `clai auth qoder` or sign in through /provider qoder.");
10
+ let record;
11
+ try {
12
+ record = asRecord(JSON.parse(value));
13
+ }
14
+ catch {
15
+ throw new QoderAuthError("Qoder credential is not valid JSON.");
16
+ }
17
+ if (!record)
18
+ throw new QoderAuthError("Qoder credential must be an object.");
19
+ const accessToken = pickString(record, "accessToken");
20
+ if (!accessToken)
21
+ throw new QoderAuthError("Qoder credential is missing an access token.");
22
+ const method = record.loginMethod;
23
+ return {
24
+ accessToken,
25
+ uid: pickString(record, "uid"),
26
+ email: pickString(record, "email"),
27
+ name: pickString(record, "name"),
28
+ encryptUserInfo: pickString(record, "encryptUserInfo"),
29
+ key: pickString(record, "key"),
30
+ refreshToken: pickString(record, "refreshToken"),
31
+ expireTime: optionalNumber(record, "expireTime"),
32
+ refreshTokenExpireTime: optionalNumber(record, "refreshTokenExpireTime"),
33
+ personalAccessToken: pickString(record, "personalAccessToken"),
34
+ loginMethod: method === "token" || method === "job_token" || method === "browser" ? method : undefined,
35
+ machineId: pickString(record, "machineId") ?? "",
36
+ machineCode: pickString(record, "machineCode"),
37
+ machineToken: pickString(record, "machineToken") ?? "",
38
+ machineType: pickString(record, "machineType"),
39
+ dataPolicyAgreed: record.dataPolicyAgreed === true,
40
+ };
41
+ }
42
+ export function encodeQoderCredential(credential) {
43
+ return JSON.stringify(credential);
44
+ }
45
+ export function qoderCredentialFromImport(imported) {
46
+ return {
47
+ ...imported,
48
+ machineId: imported.machineId ?? "",
49
+ machineToken: imported.machineToken ?? "",
50
+ };
51
+ }
52
+ export function qoderCredentialExpiry(credential, auth) {
53
+ return expiryMilliseconds(credential.expireTime) ?? auth?.expiresAt;
54
+ }
55
+ export function qoderCredentialMetadata(credential) {
56
+ return { refreshToken: credential.refreshToken, expiresAt: qoderCredentialExpiry(credential) };
57
+ }
58
+ export function qoderAccountLabel(value) {
59
+ try {
60
+ const credential = parseQoderCredential(value);
61
+ return credential.email ?? credential.name ?? credential.uid ?? "Qoder account";
62
+ }
63
+ catch {
64
+ return "Qoder account (sign in again)";
65
+ }
66
+ }
67
+ export async function signQoderCredential(credential) {
68
+ const module = await loadSignerModule();
69
+ const fields = asRecord(JSON.parse(module.generate_runtime_auth_fields(JSON.stringify({
70
+ uid: credential.uid ?? "",
71
+ security_oauth_token: credential.accessToken,
72
+ access_token: credential.accessToken,
73
+ expire_time: credential.expireTime,
74
+ data_policy_agreed: credential.dataPolicyAgreed === true,
75
+ }))));
76
+ const encryptUserInfo = pickString(fields ?? {}, "encrypt_user_info");
77
+ const key = pickString(fields ?? {}, "key");
78
+ if (!encryptUserInfo || !key)
79
+ throw new QoderAuthError("Qoder could not generate runtime authentication fields.");
80
+ return { ...credential, encryptUserInfo, key };
81
+ }
82
+ //# sourceMappingURL=qoder-credential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qoder-credential.js","sourceRoot":"","sources":["../../../src/llm/qoder/qoder-credential.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type QoderAuthRequestOptions } from "./qoder-auth.js";
2
+ import { type QoderCredential, type QoderMachineIdentity } from "./qoder-credential.js";
3
+ export declare const QODER_WEB_ORIGIN = "https://qoder.com";
4
+ export declare const QODER_PAT_URL = "https://qoder.com/account/integrations";
5
+ export declare const QODER_DEVICE_CLIENT_ID = "e883ade2-e6e3-4d6d-adf7-f92ceff5fdcb";
6
+ export declare const QODER_UI_LOGIN_TIMEOUT_MS = 180000;
7
+ export declare function canOpenQoderBrowser(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): boolean;
8
+ export declare function getQoderLoginIdentity(options?: {
9
+ qoderHome?: string | undefined;
10
+ claiHome?: string | undefined;
11
+ }): Promise<QoderMachineIdentity>;
12
+ export interface QoderDeviceAuthStart {
13
+ readonly authUrl: string;
14
+ readonly nonce: string;
15
+ readonly verifier: string;
16
+ readonly identity: QoderMachineIdentity;
17
+ }
18
+ export declare function startQoderDeviceAuth(options?: QoderAuthRequestOptions & {
19
+ identity?: QoderMachineIdentity | undefined;
20
+ }): Promise<QoderDeviceAuthStart>;
21
+ export declare function pollQoderDeviceAuth(start: QoderDeviceAuthStart, options?: QoderAuthRequestOptions & {
22
+ timeoutMs?: number | undefined;
23
+ intervalMs?: number | undefined;
24
+ }): Promise<QoderCredential>;
25
+ export declare function loginQoderWithPat(personalAccessToken: string, options?: QoderAuthRequestOptions & {
26
+ identity?: QoderMachineIdentity | undefined;
27
+ }): Promise<QoderCredential>;
28
+ export declare function importQoderAccount(): Promise<QoderCredential>;
@@ -0,0 +1,153 @@
1
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { setTimeout as delay } from "node:timers/promises";
6
+ import { exchangeQoderPersonalToken, importQoderCliCredential, parseQoderToken, pickString, qoderAuthHeaders, QoderAuthError, QODER_OPENAPI_ORIGIN, readQoderAuthResponse, readQoderMachineId, readQoderMachineIdentity, } from "./qoder-auth.js";
7
+ import { qoderCredentialFromImport, signQoderCredential, } from "./qoder-credential.js";
8
+ export const QODER_WEB_ORIGIN = "https://qoder.com";
9
+ export const QODER_PAT_URL = `${QODER_WEB_ORIGIN}/account/integrations`;
10
+ export const QODER_DEVICE_CLIENT_ID = "e883ade2-e6e3-4d6d-adf7-f92ceff5fdcb";
11
+ export const QODER_UI_LOGIN_TIMEOUT_MS = 180_000;
12
+ export function canOpenQoderBrowser(env = process.env, platform = process.platform) {
13
+ if (env.CLAI_NO_BROWSER || env.CI || env.DEBIAN_FRONTEND === "noninteractive")
14
+ return false;
15
+ if (env.BROWSER === "none" || env.BROWSER === "www-browser")
16
+ return false;
17
+ if (env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY)
18
+ return false;
19
+ return platform !== "linux" || Boolean(env.DISPLAY || env.WAYLAND_DISPLAY || env.MIR_SOCKET);
20
+ }
21
+ async function localMachineId(claiHome) {
22
+ const path = join(claiHome, "qoder-machine-id");
23
+ try {
24
+ const stored = (await readFile(path, "utf8")).trim();
25
+ if (stored)
26
+ return stored;
27
+ }
28
+ catch (error) {
29
+ if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
30
+ throw error;
31
+ }
32
+ await mkdir(claiHome, { recursive: true, mode: 0o700 });
33
+ const id = randomUUID();
34
+ try {
35
+ await writeFile(path, id, { mode: 0o600, flag: "wx" });
36
+ return id;
37
+ }
38
+ catch (error) {
39
+ if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
40
+ throw error;
41
+ const stored = (await readFile(path, "utf8")).trim();
42
+ if (!stored)
43
+ throw new QoderAuthError("Qoder machine identity is empty. Remove ~/.clai/qoder-machine-id and retry.");
44
+ return stored;
45
+ }
46
+ }
47
+ export async function getQoderLoginIdentity(options = {}) {
48
+ const [cliId, machine] = await Promise.all([
49
+ readQoderMachineId(options.qoderHome),
50
+ readQoderMachineIdentity(options.qoderHome),
51
+ ]);
52
+ return {
53
+ machineId: cliId ?? await localMachineId(options.claiHome ?? join(homedir(), ".clai")),
54
+ machineToken: machine?.machineToken ?? "",
55
+ machineCode: machine?.machineCode,
56
+ machineType: machine?.machineType,
57
+ };
58
+ }
59
+ export async function startQoderDeviceAuth(options = {}) {
60
+ options.signal?.throwIfAborted();
61
+ const identity = options.identity ?? await getQoderLoginIdentity();
62
+ options.signal?.throwIfAborted();
63
+ const verifier = randomBytes(64).toString("base64url");
64
+ const challenge = createHash("sha256").update(verifier).digest("base64url");
65
+ const nonce = randomUUID();
66
+ const params = new URLSearchParams({
67
+ challenge,
68
+ challenge_method: "S256",
69
+ nonce,
70
+ machine_id: identity.machineId,
71
+ client_id: QODER_DEVICE_CLIENT_ID,
72
+ });
73
+ if (identity.machineToken)
74
+ params.set("machine_token", identity.machineToken);
75
+ return { authUrl: `${QODER_WEB_ORIGIN}/device/selectAccounts?${params}`, nonce, verifier, identity };
76
+ }
77
+ async function finishQoderLogin(tokens, identity, loginMethod, options, personalAccessToken) {
78
+ const timeout = AbortSignal.timeout(20_000);
79
+ const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;
80
+ signal.throwIfAborted();
81
+ const response = await (options.fetcher ?? fetch)(`${QODER_OPENAPI_ORIGIN}/api/v1/userinfo`, {
82
+ headers: { ...qoderAuthHeaders(), Authorization: `Bearer ${tokens.accessToken}` },
83
+ signal,
84
+ });
85
+ const profile = await readQoderAuthResponse(response);
86
+ const uid = pickString(profile, "id", "user_id", "uid");
87
+ if (!uid)
88
+ throw new QoderAuthError("Qoder profile did not include an account id.");
89
+ const credential = await signQoderCredential({
90
+ ...identity,
91
+ uid,
92
+ accessToken: tokens.accessToken,
93
+ refreshToken: tokens.refreshToken,
94
+ expireTime: tokens.expiresAt !== undefined ? Math.floor(tokens.expiresAt / 1000) : undefined,
95
+ refreshTokenExpireTime: tokens.refreshTokenExpiresAt !== undefined ? Math.floor(tokens.refreshTokenExpiresAt / 1000) : undefined,
96
+ email: pickString(profile, "email"),
97
+ name: pickString(profile, "name", "username", "user_name"),
98
+ personalAccessToken,
99
+ loginMethod,
100
+ dataPolicyAgreed: profile.data_policy_agreed === true || profile.dataPolicyAgreed === true,
101
+ });
102
+ signal.throwIfAborted();
103
+ return credential;
104
+ }
105
+ export async function pollQoderDeviceAuth(start, options = {}) {
106
+ const deadline = AbortSignal.timeout(options.timeoutMs ?? QODER_UI_LOGIN_TIMEOUT_MS);
107
+ const signal = options.signal ? AbortSignal.any([options.signal, deadline]) : deadline;
108
+ const params = new URLSearchParams({ nonce: start.nonce, verifier: start.verifier, challenge_method: "S256" });
109
+ const url = `${QODER_OPENAPI_ORIGIN}/api/v1/deviceToken/poll?${params}`;
110
+ let failures = 0;
111
+ for (;;) {
112
+ signal.throwIfAborted();
113
+ let response;
114
+ try {
115
+ response = await (options.fetcher ?? fetch)(url, {
116
+ headers: qoderAuthHeaders(),
117
+ signal: AbortSignal.any([signal, AbortSignal.timeout(20_000)]),
118
+ });
119
+ failures = 0;
120
+ }
121
+ catch (error) {
122
+ signal.throwIfAborted();
123
+ if (++failures >= 3)
124
+ throw error;
125
+ }
126
+ if (response && response.status !== 404) {
127
+ const tokens = parseQoderToken(await readQoderAuthResponse(response));
128
+ return finishQoderLogin(tokens, start.identity, "browser", { ...options, signal });
129
+ }
130
+ await response?.body?.cancel();
131
+ await delay(options.intervalMs ?? 1000, undefined, { signal });
132
+ }
133
+ }
134
+ export async function loginQoderWithPat(personalAccessToken, options = {}) {
135
+ const pat = personalAccessToken.trim();
136
+ if (!pat)
137
+ throw new QoderAuthError("A Qoder personal access token is required.");
138
+ options.signal?.throwIfAborted();
139
+ const identity = options.identity ?? await getQoderLoginIdentity();
140
+ const tokens = await exchangeQoderPersonalToken({
141
+ ...options,
142
+ personalAccessToken: pat,
143
+ machineId: identity.machineCode || identity.machineId,
144
+ machineToken: identity.machineToken,
145
+ });
146
+ return finishQoderLogin(tokens, identity, "token", options, pat);
147
+ }
148
+ export async function importQoderAccount() {
149
+ const imported = await importQoderCliCredential();
150
+ const identity = await getQoderLoginIdentity();
151
+ return qoderCredentialFromImport({ ...imported, ...identity });
152
+ }
153
+ //# sourceMappingURL=qoder-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qoder-login.js","sourceRoot":"","sources":["../../../src/llm/qoder/qoder-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderAuth } from "../provider.js";
2
+ import { type QoderCredential } from "./qoder-credential.js";
3
+ export declare function refreshQoderAccount(slotId: string): Promise<QoderCredential>;
4
+ export declare function withQoderCredential<T>(auth: ProviderAuth, run: (credential: QoderCredential) => Promise<T>, onStatus?: ((message: string) => void) | undefined, canRetry?: () => boolean): Promise<T>;
@@ -0,0 +1,165 @@
1
+ import { getProviderKeys, replaceProviderKey } from "../../store/keys.js";
2
+ import { ProviderError } from "../http.js";
3
+ import { exchangeQoderPersonalToken, expiryMilliseconds, QoderAuthError, refreshQoderDeviceToken, } from "./qoder-auth.js";
4
+ import { withQoderAccountMutation } from "./qoder-accounts.js";
5
+ import { encodeQoderCredential, parseQoderCredential, qoderCredentialExpiry, qoderCredentialMetadata, signQoderCredential, } from "./qoder-credential.js";
6
+ const REFRESH_BUFFER_MS = 5 * 60 * 1000;
7
+ const REFRESH_GRACE_MS = 30 * 1000;
8
+ class QoderCredentialStoreError extends Error {
9
+ }
10
+ const refreshesInFlight = new Map();
11
+ const rotatedCredentials = new Map();
12
+ function rememberRotation(oldValue, fresh) {
13
+ rotatedCredentials.set(oldValue, fresh);
14
+ while (rotatedCredentials.size > 128) {
15
+ const oldest = rotatedCredentials.keys().next().value;
16
+ if (oldest === undefined)
17
+ break;
18
+ rotatedCredentials.delete(oldest);
19
+ }
20
+ }
21
+ function resolveCredential(value) {
22
+ let current = { credential: parseQoderCredential(value), value };
23
+ for (let i = 0; i < 128; i++) {
24
+ const rotated = rotatedCredentials.get(current.value);
25
+ if (!rotated || rotated.value === current.value)
26
+ break;
27
+ current = rotated;
28
+ }
29
+ return current;
30
+ }
31
+ function updateAuth(auth, fresh) {
32
+ auth.apiKey = fresh.value;
33
+ auth.refreshToken = fresh.credential.refreshToken;
34
+ auth.expiresAt = qoderCredentialExpiry(fresh.credential);
35
+ }
36
+ function renewable(credential, auth) {
37
+ return Boolean(credential.personalAccessToken || credential.refreshToken || auth.refreshToken);
38
+ }
39
+ function isAuthFailure(error) {
40
+ if (error instanceof ProviderError) {
41
+ return error.status === 401 || (error.status === 403 && /expired|invalid|unauthorized/i.test(error.message));
42
+ }
43
+ return error instanceof QoderAuthError && error.status === 401;
44
+ }
45
+ async function persistCredential(oldValue, fresh) {
46
+ try {
47
+ await withQoderAccountMutation(async () => {
48
+ if (await replaceProviderKey("qoder", oldValue, fresh.value, qoderCredentialMetadata(fresh.credential)))
49
+ return;
50
+ const keys = await getProviderKeys("qoder");
51
+ if (keys.source === "env" || keys.keys.some((key) => key.value === fresh.value))
52
+ return;
53
+ throw new QoderCredentialStoreError("Qoder refreshed its credentials, but the matching clai account could not be found to save them.");
54
+ });
55
+ }
56
+ catch (error) {
57
+ if (error instanceof QoderCredentialStoreError)
58
+ throw error;
59
+ throw new QoderCredentialStoreError("Qoder refreshed its credentials, but clai could not save the rotated tokens. Sign in again through /set qoder.");
60
+ }
61
+ rememberRotation(oldValue, fresh);
62
+ }
63
+ async function rotateCredential(credential, auth) {
64
+ const refreshToken = credential.refreshToken ?? auth.refreshToken;
65
+ const refreshExpiresAt = expiryMilliseconds(credential.refreshTokenExpireTime);
66
+ if (!credential.personalAccessToken && refreshExpiresAt !== undefined && refreshExpiresAt <= Date.now()) {
67
+ throw new QoderAuthError("Qoder refresh token has expired. Sign in again through /set qoder.", 401);
68
+ }
69
+ const options = {
70
+ machineId: credential.machineId,
71
+ machineType: credential.machineType,
72
+ machineCode: credential.machineCode,
73
+ loginMethod: credential.loginMethod,
74
+ };
75
+ let result;
76
+ if (credential.personalAccessToken) {
77
+ result = await exchangeQoderPersonalToken({
78
+ personalAccessToken: credential.personalAccessToken,
79
+ machineId: credential.machineCode || credential.machineId,
80
+ machineToken: credential.machineToken,
81
+ });
82
+ }
83
+ else {
84
+ if (!refreshToken)
85
+ throw new ProviderError("Qoder access token expired and no refresh token is available; sign in again through /set qoder.", 401);
86
+ result = await refreshQoderDeviceToken({ ...options, refreshToken });
87
+ }
88
+ return signQoderCredential({
89
+ ...credential,
90
+ accessToken: result.accessToken,
91
+ refreshToken: result.refreshToken ?? refreshToken,
92
+ ...(result.expiresAt !== undefined ? { expireTime: Math.floor(result.expiresAt / 1000) } : {}),
93
+ ...(result.refreshTokenExpiresAt !== undefined ? { refreshTokenExpireTime: Math.floor(result.refreshTokenExpiresAt / 1000) } : {}),
94
+ });
95
+ }
96
+ async function refreshCredential(current, auth) {
97
+ const identity = current.credential.personalAccessToken ?? current.credential.refreshToken ?? auth.refreshToken ?? current.value;
98
+ let refresh = refreshesInFlight.get(identity);
99
+ if (!refresh) {
100
+ refresh = (async () => {
101
+ const credential = await rotateCredential(current.credential, auth);
102
+ const fresh = { credential, value: encodeQoderCredential(credential) };
103
+ await persistCredential(current.value, fresh);
104
+ return fresh;
105
+ })();
106
+ refreshesInFlight.set(identity, refresh);
107
+ }
108
+ try {
109
+ const fresh = await refresh;
110
+ updateAuth(auth, fresh);
111
+ return fresh;
112
+ }
113
+ finally {
114
+ if (refreshesInFlight.get(identity) === refresh)
115
+ refreshesInFlight.delete(identity);
116
+ }
117
+ }
118
+ export async function refreshQoderAccount(slotId) {
119
+ const keys = await getProviderKeys("qoder");
120
+ const slot = keys.source === "env" ? undefined : keys.keys.find((key) => key.id === slotId);
121
+ if (!slot)
122
+ throw new QoderAuthError("Qoder account was not found.");
123
+ const current = resolveCredential(slot.value);
124
+ const auth = { apiKey: current.value, refreshToken: slot.refreshToken, expiresAt: slot.expiresAt };
125
+ return (await refreshCredential(current, auth)).credential;
126
+ }
127
+ export async function withQoderCredential(auth, run, onStatus, canRetry = () => true) {
128
+ if (typeof auth.apiKey !== "string")
129
+ throw new QoderAuthError("Qoder authentication required. Sign in through /provider qoder.");
130
+ let current = resolveCredential(auth.apiKey);
131
+ if (current.value !== auth.apiKey)
132
+ updateAuth(auth, current);
133
+ const expiresAt = qoderCredentialExpiry(current.credential, auth);
134
+ if (renewable(current.credential, auth) && expiresAt !== undefined && expiresAt <= Date.now() + REFRESH_BUFFER_MS) {
135
+ onStatus?.("ℹ Qoder authentication expiring — refreshing token");
136
+ try {
137
+ current = await refreshCredential(current, auth);
138
+ onStatus?.("ℹ Qoder token refreshed");
139
+ }
140
+ catch (error) {
141
+ if (error instanceof QoderCredentialStoreError)
142
+ throw error;
143
+ if (error instanceof QoderAuthError && error.status && [400, 401, 403].includes(error.status))
144
+ throw error;
145
+ if (expiresAt - Date.now() <= REFRESH_GRACE_MS)
146
+ throw error;
147
+ onStatus?.("ℹ Qoder refresh temporarily failed; using the current token until it expires");
148
+ }
149
+ }
150
+ else if (!renewable(current.credential, auth) && expiresAt !== undefined && expiresAt <= Date.now()) {
151
+ throw new ProviderError("Qoder access token expired and no refresh token is available; sign in again through /set qoder.", 401);
152
+ }
153
+ try {
154
+ return await run(current.credential);
155
+ }
156
+ catch (error) {
157
+ if (!isAuthFailure(error) || !renewable(current.credential, auth) || !canRetry())
158
+ throw error;
159
+ onStatus?.("ℹ Qoder authentication rejected — refreshing token");
160
+ const fresh = await refreshCredential(current, auth);
161
+ onStatus?.("ℹ Qoder token refreshed — retrying request");
162
+ return run(fresh.credential);
163
+ }
164
+ }
165
+ //# sourceMappingURL=qoder-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qoder-refresh.js","sourceRoot":"","sources":["../../../src/llm/qoder/qoder-refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ export declare const QODER_CLIENT_TYPE = "5";
2
+ export declare const QODER_BUSINESS_PRODUCT = "cli";
3
+ export declare const QODER_BUSINESS_TYPE = "agent";
4
+ export declare const QODER_SCENE = "assistant";
5
+ export interface QoderSignedRequest {
6
+ url: string;
7
+ headers: Record<string, string>;
8
+ body?: string | undefined;
9
+ }
10
+ export interface QoderSignerIdentity {
11
+ machineId: string;
12
+ cosyVersion: string;
13
+ userInfo?: QoderUserInfo | undefined;
14
+ }
15
+ export interface QoderUserInfo {
16
+ uid?: string | undefined;
17
+ encryptUserInfo?: string | undefined;
18
+ key?: string | undefined;
19
+ }
20
+ interface QoderRequestResult {
21
+ url: string;
22
+ headers: {
23
+ forEach(cb: (value: string, key: string) => void): void;
24
+ };
25
+ body: Uint8Array | string | undefined;
26
+ }
27
+ interface QoderContextHandle {
28
+ prepareRequest(endpoint: string, path: string, method: string, authType: string, body: string | undefined, headers: string | undefined): QoderRequestResult;
29
+ prepareInferRequest(baseUrl: string, body: string, modelKey: string, modelSource: string): QoderRequestResult;
30
+ get_external_providers_access(): string;
31
+ free(): void;
32
+ }
33
+ export interface QoderGlueModule {
34
+ default(options: {
35
+ module_or_path: Uint8Array;
36
+ }): Promise<unknown>;
37
+ QoderContext: new (machineId: string, cosyVersion: string, userInfoJson: string, envJson: string) => QoderContextHandle;
38
+ credential_storage_decrypt(data: string, key: string): Uint8Array | string;
39
+ decrypt_server_response(data: string): string;
40
+ generate_runtime_auth_fields(userInfoJson: string): string;
41
+ }
42
+ export declare function loadSignerModule(): Promise<QoderGlueModule>;
43
+ export declare function qoderUserInfoJson(info?: QoderUserInfo | undefined): string;
44
+ export declare function qoderEnvJson(): string;
45
+ export declare class QoderSigner {
46
+ private readonly context;
47
+ private constructor();
48
+ static create(identity: QoderSignerIdentity): Promise<QoderSigner>;
49
+ prepare(request: {
50
+ endpoint: string;
51
+ path: string;
52
+ method: string;
53
+ authType: string;
54
+ body?: string | undefined;
55
+ headers?: Record<string, string> | undefined;
56
+ }): QoderSignedRequest;
57
+ prepareInfer(request: {
58
+ baseUrl: string;
59
+ body: string;
60
+ modelKey: string;
61
+ modelSource?: string | undefined;
62
+ }): QoderSignedRequest;
63
+ externalProvidersAccess(): string;
64
+ free(): void;
65
+ }
66
+ export {};
@@ -0,0 +1,119 @@
1
+ import { gunzipSync } from "node:zlib";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+ import { isBunRuntime } from "../../os/bun-runtime.js";
8
+ import { QODER_SIGNER_GLUE_JS_BASE64 } from "./signer-glue.generated.js";
9
+ import { QODER_SIGNER_WASM_GZIP_BASE64, QODER_SIGNER_WASM_SHA256, } from "./signer-wasm.generated.js";
10
+ export const QODER_CLIENT_TYPE = "5";
11
+ export const QODER_BUSINESS_PRODUCT = "cli";
12
+ export const QODER_BUSINESS_TYPE = "agent";
13
+ export const QODER_SCENE = "assistant";
14
+ let runtimePromise;
15
+ function signerWasmBytes() {
16
+ const bytes = new Uint8Array(gunzipSync(Buffer.from(QODER_SIGNER_WASM_GZIP_BASE64, "base64")));
17
+ const digest = createHash("sha256").update(bytes).digest("hex");
18
+ if (digest !== QODER_SIGNER_WASM_SHA256) {
19
+ throw new Error("qoder signer wasm failed its integrity check");
20
+ }
21
+ return bytes;
22
+ }
23
+ function loadSignerRuntime() {
24
+ if (runtimePromise)
25
+ return runtimePromise;
26
+ runtimePromise = (async () => {
27
+ const source = Buffer.from(QODER_SIGNER_GLUE_JS_BASE64, "base64").toString("utf8");
28
+ const module = await importSignerGlue(source);
29
+ await module.default({ module_or_path: signerWasmBytes() });
30
+ return module;
31
+ })().catch((error) => {
32
+ runtimePromise = undefined;
33
+ throw error;
34
+ });
35
+ return runtimePromise;
36
+ }
37
+ async function importSignerGlue(source) {
38
+ if (!isBunRuntime()) {
39
+ return await import(`data:text/javascript;base64,${Buffer.from(source, "utf8").toString("base64")}`);
40
+ }
41
+ const directory = await mkdtemp(join(tmpdir(), "clai-qoder-signer-"));
42
+ try {
43
+ const file = join(directory, "signer.mjs");
44
+ await writeFile(file, source, { mode: 0o600, flag: "wx" });
45
+ return await import(pathToFileURL(file).href);
46
+ }
47
+ finally {
48
+ await rm(directory, { recursive: true, force: true });
49
+ }
50
+ }
51
+ export function loadSignerModule() {
52
+ return loadSignerRuntime();
53
+ }
54
+ export function qoderUserInfoJson(info) {
55
+ return JSON.stringify({
56
+ uid: info?.uid ?? "",
57
+ encrypt_user_info: info?.encryptUserInfo ?? "",
58
+ key: info?.key ?? "",
59
+ });
60
+ }
61
+ export function qoderEnvJson() {
62
+ return JSON.stringify({
63
+ client_type: QODER_CLIENT_TYPE,
64
+ business_product: QODER_BUSINESS_PRODUCT,
65
+ business_type: QODER_BUSINESS_TYPE,
66
+ scene: QODER_SCENE,
67
+ });
68
+ }
69
+ function headersToRecord(result) {
70
+ const out = {};
71
+ result.headers.forEach((value, key) => {
72
+ out[key] = value;
73
+ });
74
+ return out;
75
+ }
76
+ function bodyToText(body) {
77
+ if (body === undefined)
78
+ return undefined;
79
+ if (typeof body === "string")
80
+ return body.length > 0 ? body : undefined;
81
+ return body.length > 0 ? new TextDecoder().decode(body) : undefined;
82
+ }
83
+ function toSignedRequest(result) {
84
+ const text = bodyToText(result.body);
85
+ return {
86
+ url: result.url,
87
+ headers: headersToRecord(result),
88
+ ...(text !== undefined ? { body: text } : {}),
89
+ };
90
+ }
91
+ export class QoderSigner {
92
+ context;
93
+ constructor(context) {
94
+ this.context = context;
95
+ }
96
+ static async create(identity) {
97
+ const { QoderContext } = await loadSignerRuntime();
98
+ const context = new QoderContext(identity.machineId, identity.cosyVersion, qoderUserInfoJson(identity.userInfo), qoderEnvJson());
99
+ return new QoderSigner(context);
100
+ }
101
+ prepare(request) {
102
+ return toSignedRequest(this.context.prepareRequest(request.endpoint, request.path, request.method, request.authType, request.body, request.headers ? JSON.stringify(request.headers) : undefined));
103
+ }
104
+ prepareInfer(request) {
105
+ return toSignedRequest(this.context.prepareInferRequest(request.baseUrl, request.body, request.modelKey, request.modelSource ?? "system"));
106
+ }
107
+ externalProvidersAccess() {
108
+ return this.context.get_external_providers_access();
109
+ }
110
+ free() {
111
+ try {
112
+ this.context.free();
113
+ }
114
+ catch {
115
+ // Context was already released by a failed prepare; ignore.
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=qoder-signer.js.map