@pentoshi/clai 4.14.4 → 4.15.0

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 (463) hide show
  1. package/CONTRIBUTING.md +4 -0
  2. package/PROVIDERS.md +2 -0
  3. package/README.md +41 -5
  4. package/dist/agent/compaction-summary.d.ts +6 -1
  5. package/dist/agent/compaction-summary.js +46 -20
  6. package/dist/agent/compaction-summary.js.map +1 -1
  7. package/dist/agent/confirm-port.d.ts +3 -8
  8. package/dist/agent/confirm-port.js +9 -7
  9. package/dist/agent/confirm-port.js.map +1 -1
  10. package/dist/agent/context/compact-with-summary.js +55 -14
  11. package/dist/agent/context/compact-with-summary.js.map +1 -1
  12. package/dist/agent/context/compaction-recent-history.js +4 -2
  13. package/dist/agent/context/compaction-recent-history.js.map +1 -1
  14. package/dist/agent/context/compaction-user-instructions.d.ts +12 -0
  15. package/dist/agent/context/compaction-user-instructions.js +264 -0
  16. package/dist/agent/context/compaction-user-instructions.js.map +1 -0
  17. package/dist/agent/context/compaction-work-history.d.ts +13 -0
  18. package/dist/agent/context/compaction-work-history.js +150 -0
  19. package/dist/agent/context/compaction-work-history.js.map +1 -0
  20. package/dist/agent/context-manager.js +19 -5
  21. package/dist/agent/context-manager.js.map +1 -1
  22. package/dist/agent/plan-implement-compact.js +2 -1
  23. package/dist/agent/plan-implement-compact.js.map +1 -1
  24. package/dist/agent/subagents/read-only-tools.js +2 -2
  25. package/dist/agent/subagents/read-only-tools.js.map +1 -1
  26. package/dist/agent/turn/loop/stream-session.js +33 -27
  27. package/dist/agent/turn/loop/stream-session.js.map +1 -1
  28. package/dist/agent/turn/tool-execution/authorization.js +1 -1
  29. package/dist/agent/turn/tool-execution/authorization.js.map +1 -1
  30. package/dist/app/adapters/current-store-adapter.js +2 -2
  31. package/dist/app/adapters/current-store-adapter.js.map +1 -1
  32. package/dist/app/adapters/current-updates-adapter.d.ts +1 -1
  33. package/dist/app/adapters/current-updates-adapter.js +4 -13
  34. package/dist/app/adapters/current-updates-adapter.js.map +1 -1
  35. package/dist/app/commands/catalog.js +1 -0
  36. package/dist/app/commands/catalog.js.map +1 -1
  37. package/dist/app/controllers/session-changes.d.ts +24 -0
  38. package/dist/app/controllers/session-changes.js +75 -0
  39. package/dist/app/controllers/session-changes.js.map +1 -0
  40. package/dist/app/controllers/session-controller.d.ts +9 -0
  41. package/dist/app/controllers/session-controller.js +67 -7
  42. package/dist/app/controllers/session-controller.js.map +1 -1
  43. package/dist/app/ports/confirm-port.d.ts +4 -1
  44. package/dist/app/ports/persistence-port.d.ts +2 -0
  45. package/dist/app/ports/transcript-item.d.ts +2 -0
  46. package/dist/app/ports/updates-port.d.ts +1 -1
  47. package/dist/classic/app/ClassicApp.js +42 -33
  48. package/dist/classic/app/ClassicApp.js.map +1 -1
  49. package/dist/classic/app/action-handlers.js +7 -0
  50. package/dist/classic/app/action-handlers.js.map +1 -1
  51. package/dist/classic/app/app-wiring.d.ts +8 -1
  52. package/dist/classic/app/app-wiring.js +23 -4
  53. package/dist/classic/app/app-wiring.js.map +1 -1
  54. package/dist/classic/app/paint-pacing.d.ts +3 -1
  55. package/dist/classic/app/paint-pacing.js +9 -1
  56. package/dist/classic/app/paint-pacing.js.map +1 -1
  57. package/dist/classic/app/use-feed.js +8 -3
  58. package/dist/classic/app/use-feed.js.map +1 -1
  59. package/dist/classic/app/wiring-composer-pointer.d.ts +3 -0
  60. package/dist/classic/app/wiring-composer-pointer.js +22 -0
  61. package/dist/classic/app/wiring-composer-pointer.js.map +1 -0
  62. package/dist/classic/app/wiring-disclosure.d.ts +3 -0
  63. package/dist/classic/app/wiring-disclosure.js +31 -0
  64. package/dist/classic/app/wiring-disclosure.js.map +1 -0
  65. package/dist/classic/app/wiring-interactions.d.ts +1 -0
  66. package/dist/classic/app/wiring-interactions.js +16 -16
  67. package/dist/classic/app/wiring-interactions.js.map +1 -1
  68. package/dist/classic/app/wiring-jump-to-latest.d.ts +3 -0
  69. package/dist/classic/app/wiring-jump-to-latest.js +38 -0
  70. package/dist/classic/app/wiring-jump-to-latest.js.map +1 -0
  71. package/dist/classic/app/wiring-lifecycle.d.ts +1 -1
  72. package/dist/classic/app/wiring-lifecycle.js +19 -10
  73. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  74. package/dist/classic/app/wiring-selection.d.ts +1 -0
  75. package/dist/classic/app/wiring-selection.js +10 -1
  76. package/dist/classic/app/wiring-selection.js.map +1 -1
  77. package/dist/classic/app/wiring-types.d.ts +12 -1
  78. package/dist/classic/blocks/assistant-lines.js +1 -1
  79. package/dist/classic/blocks/assistant-lines.js.map +1 -1
  80. package/dist/classic/blocks/batch-lines.d.ts +1 -1
  81. package/dist/classic/blocks/batch-lines.js +47 -59
  82. package/dist/classic/blocks/batch-lines.js.map +1 -1
  83. package/dist/classic/blocks/block-context.d.ts +8 -1
  84. package/dist/classic/blocks/block-context.js.map +1 -1
  85. package/dist/classic/blocks/compacted-lines.d.ts +0 -1
  86. package/dist/classic/blocks/compacted-lines.js +12 -44
  87. package/dist/classic/blocks/compacted-lines.js.map +1 -1
  88. package/dist/classic/blocks/diff-lines.d.ts +3 -5
  89. package/dist/classic/blocks/diff-lines.js +113 -152
  90. package/dist/classic/blocks/diff-lines.js.map +1 -1
  91. package/dist/classic/blocks/disclosure-lines.d.ts +16 -0
  92. package/dist/classic/blocks/disclosure-lines.js +20 -0
  93. package/dist/classic/blocks/disclosure-lines.js.map +1 -0
  94. package/dist/classic/blocks/intro-lines.js +2 -0
  95. package/dist/classic/blocks/intro-lines.js.map +1 -1
  96. package/dist/classic/blocks/notice-lines.js +4 -16
  97. package/dist/classic/blocks/notice-lines.js.map +1 -1
  98. package/dist/classic/blocks/output-lines.d.ts +10 -0
  99. package/dist/classic/blocks/output-lines.js +35 -0
  100. package/dist/classic/blocks/output-lines.js.map +1 -0
  101. package/dist/classic/blocks/thinking-lines.d.ts +0 -1
  102. package/dist/classic/blocks/thinking-lines.js +15 -32
  103. package/dist/classic/blocks/thinking-lines.js.map +1 -1
  104. package/dist/classic/blocks/tool-label.d.ts +2 -0
  105. package/dist/classic/blocks/tool-label.js +8 -0
  106. package/dist/classic/blocks/tool-label.js.map +1 -0
  107. package/dist/classic/blocks/tool-lines.d.ts +3 -5
  108. package/dist/classic/blocks/tool-lines.js +90 -150
  109. package/dist/classic/blocks/tool-lines.js.map +1 -1
  110. package/dist/classic/blocks/turn-summary-lines.js +7 -1
  111. package/dist/classic/blocks/turn-summary-lines.js.map +1 -1
  112. package/dist/classic/blocks/user-lines.js +9 -15
  113. package/dist/classic/blocks/user-lines.js.map +1 -1
  114. package/dist/classic/bootstrap/start-classic.js +2 -0
  115. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  116. package/dist/classic/chrome/Composer.d.ts +4 -2
  117. package/dist/classic/chrome/Composer.js +12 -6
  118. package/dist/classic/chrome/Composer.js.map +1 -1
  119. package/dist/classic/chrome/composer-controller.d.ts +3 -0
  120. package/dist/classic/chrome/composer-controller.js +15 -22
  121. package/dist/classic/chrome/composer-controller.js.map +1 -1
  122. package/dist/classic/chrome/composer-frame.d.ts +1 -1
  123. package/dist/classic/chrome/composer-frame.js +2 -1
  124. package/dist/classic/chrome/composer-frame.js.map +1 -1
  125. package/dist/classic/chrome/composer-mentions.d.ts +2 -0
  126. package/dist/classic/chrome/composer-mentions.js +16 -0
  127. package/dist/classic/chrome/composer-mentions.js.map +1 -0
  128. package/dist/classic/chrome/composer-pointer.d.ts +13 -0
  129. package/dist/classic/chrome/composer-pointer.js +22 -0
  130. package/dist/classic/chrome/composer-pointer.js.map +1 -0
  131. package/dist/classic/chrome/directory-row.d.ts +20 -2
  132. package/dist/classic/chrome/directory-row.js +45 -1
  133. package/dist/classic/chrome/directory-row.js.map +1 -1
  134. package/dist/classic/chrome/editor-view.js +6 -1
  135. package/dist/classic/chrome/editor-view.js.map +1 -1
  136. package/dist/classic/chrome/queue-rows.d.ts +1 -0
  137. package/dist/classic/chrome/queue-rows.js +12 -2
  138. package/dist/classic/chrome/queue-rows.js.map +1 -1
  139. package/dist/classic/chrome/status-rows.d.ts +1 -0
  140. package/dist/classic/chrome/status-rows.js +5 -4
  141. package/dist/classic/chrome/status-rows.js.map +1 -1
  142. package/dist/classic/chrome/toast-rows.js +7 -6
  143. package/dist/classic/chrome/toast-rows.js.map +1 -1
  144. package/dist/classic/feed/LiveTail.d.ts +4 -3
  145. package/dist/classic/feed/LiveTail.js +26 -15
  146. package/dist/classic/feed/LiveTail.js.map +1 -1
  147. package/dist/classic/feed/feed-blocks.d.ts +2 -0
  148. package/dist/classic/feed/feed-blocks.js +4 -2
  149. package/dist/classic/feed/feed-blocks.js.map +1 -1
  150. package/dist/classic/feed/transcript-disclosure.d.ts +6 -0
  151. package/dist/classic/feed/transcript-disclosure.js +9 -0
  152. package/dist/classic/feed/transcript-disclosure.js.map +1 -0
  153. package/dist/classic/feed/transcript-resources.d.ts +23 -0
  154. package/dist/classic/feed/transcript-resources.js +140 -0
  155. package/dist/classic/feed/transcript-resources.js.map +1 -0
  156. package/dist/classic/feed/transcript-window.js +43 -18
  157. package/dist/classic/feed/transcript-window.js.map +1 -1
  158. package/dist/classic/input/input-router.d.ts +2 -0
  159. package/dist/classic/input/input-router.js +6 -0
  160. package/dist/classic/input/input-router.js.map +1 -1
  161. package/dist/classic/input/raw-decoder.js +3 -2
  162. package/dist/classic/input/raw-decoder.js.map +1 -1
  163. package/dist/classic/panels/confirm-panel.js +17 -10
  164. package/dist/classic/panels/confirm-panel.js.map +1 -1
  165. package/dist/classic/panels/pager-panel.d.ts +6 -2
  166. package/dist/classic/panels/pager-panel.js +11 -4
  167. package/dist/classic/panels/pager-panel.js.map +1 -1
  168. package/dist/classic/panels/panel-controller.js +4 -1
  169. package/dist/classic/panels/panel-controller.js.map +1 -1
  170. package/dist/classic/panels/panel-host.js +1 -1
  171. package/dist/classic/panels/panel-host.js.map +1 -1
  172. package/dist/classic/panels/panel-wheel.js +1 -1
  173. package/dist/classic/panels/panel-wheel.js.map +1 -1
  174. package/dist/classic/render/shell-width.d.ts +0 -2
  175. package/dist/classic/render/shell-width.js +0 -6
  176. package/dist/classic/render/shell-width.js.map +1 -1
  177. package/dist/commands/update/detection.d.ts +20 -0
  178. package/dist/commands/update/detection.js +207 -0
  179. package/dist/commands/update/detection.js.map +1 -0
  180. package/dist/commands/update/download.d.ts +3 -0
  181. package/dist/commands/update/download.js +63 -0
  182. package/dist/commands/update/download.js.map +1 -0
  183. package/dist/commands/update/installers.d.ts +16 -5
  184. package/dist/commands/update/installers.js +12 -513
  185. package/dist/commands/update/installers.js.map +1 -1
  186. package/dist/commands/update/lock.d.ts +6 -0
  187. package/dist/commands/update/lock.js +86 -0
  188. package/dist/commands/update/lock.js.map +1 -0
  189. package/dist/commands/update/metadata.d.ts +6 -0
  190. package/dist/commands/update/metadata.js +36 -0
  191. package/dist/commands/update/metadata.js.map +1 -0
  192. package/dist/commands/update/native.d.ts +3 -0
  193. package/dist/commands/update/native.js +179 -0
  194. package/dist/commands/update/native.js.map +1 -0
  195. package/dist/commands/update/package-managers.d.ts +4 -0
  196. package/dist/commands/update/package-managers.js +158 -0
  197. package/dist/commands/update/package-managers.js.map +1 -0
  198. package/dist/commands/update/process.d.ts +17 -0
  199. package/dist/commands/update/process.js +114 -0
  200. package/dist/commands/update/process.js.map +1 -0
  201. package/dist/commands/update/source-worker.d.ts +2 -0
  202. package/dist/commands/update/source-worker.js +71 -0
  203. package/dist/commands/update/source-worker.js.map +1 -0
  204. package/dist/commands/update/source.d.ts +2 -0
  205. package/dist/commands/update/source.js +79 -0
  206. package/dist/commands/update/source.js.map +1 -0
  207. package/dist/commands/update/verification.d.ts +7 -0
  208. package/dist/commands/update/verification.js +73 -0
  209. package/dist/commands/update/verification.js.map +1 -0
  210. package/dist/commands/update/windows-stage.d.ts +21 -0
  211. package/dist/commands/update/windows-stage.js +186 -0
  212. package/dist/commands/update/windows-stage.js.map +1 -0
  213. package/dist/commands/update-install.d.ts +4 -13
  214. package/dist/commands/update-install.js +20 -152
  215. package/dist/commands/update-install.js.map +1 -1
  216. package/dist/commands/update.d.ts +4 -9
  217. package/dist/commands/update.js +51 -103
  218. package/dist/commands/update.js.map +1 -1
  219. package/dist/index.js +1 -1
  220. package/dist/index.js.map +1 -1
  221. package/dist/instructions/record.d.ts +1 -1
  222. package/dist/instructions/record.js +3 -3
  223. package/dist/llm/free-client.d.ts +2 -0
  224. package/dist/llm/free-client.js +52 -0
  225. package/dist/llm/free-client.js.map +1 -0
  226. package/dist/llm/free.d.ts +1 -0
  227. package/dist/llm/free.js +77 -176
  228. package/dist/llm/free.js.map +1 -1
  229. package/dist/llm/key-rotation.d.ts +1 -0
  230. package/dist/llm/key-rotation.js +13 -2
  231. package/dist/llm/key-rotation.js.map +1 -1
  232. package/dist/llm/reasoning-errors.js +1 -1
  233. package/dist/llm/reasoning-errors.js.map +1 -1
  234. package/dist/llm/responses-error.d.ts +3 -0
  235. package/dist/llm/responses-error.js +37 -0
  236. package/dist/llm/responses-error.js.map +1 -0
  237. package/dist/llm/responses-http.js +5 -2
  238. package/dist/llm/responses-http.js.map +1 -1
  239. package/dist/llm/responses-replay.d.ts +2 -0
  240. package/dist/llm/responses-replay.js +37 -1
  241. package/dist/llm/responses-replay.js.map +1 -1
  242. package/dist/llm/responses-stream-events.js +3 -20
  243. package/dist/llm/responses-stream-events.js.map +1 -1
  244. package/dist/llm/responses-stream.js +2 -0
  245. package/dist/llm/responses-stream.js.map +1 -1
  246. package/dist/llm/wire/reasoning-artifacts.js +1 -1
  247. package/dist/llm/wire/reasoning-artifacts.js.map +1 -1
  248. package/dist/noninteractive/stdio-confirm-port.js +4 -3
  249. package/dist/noninteractive/stdio-confirm-port.js.map +1 -1
  250. package/dist/os/bun-runtime.js +2 -1
  251. package/dist/os/bun-runtime.js.map +1 -1
  252. package/dist/os/update-origin.d.ts +7 -0
  253. package/dist/os/update-origin.js +30 -0
  254. package/dist/os/update-origin.js.map +1 -0
  255. package/dist/prompts/embedded.js +2 -2
  256. package/dist/prompts/embedded.js.map +1 -1
  257. package/dist/prompts/index.js +25 -22
  258. package/dist/prompts/index.js.map +1 -1
  259. package/dist/prompts/system.agent.md +7 -1
  260. package/dist/prompts/system.ask.md +1 -1
  261. package/dist/safety/filesystem-permissions.d.ts +8 -0
  262. package/dist/safety/filesystem-permissions.js +38 -18
  263. package/dist/safety/filesystem-permissions.js.map +1 -1
  264. package/dist/safety/patterns.d.ts +1 -1
  265. package/dist/safety/patterns.js +7 -7
  266. package/dist/safety/patterns.js.map +1 -1
  267. package/dist/safety/permission-mode.js +1 -1
  268. package/dist/safety/permission-mode.js.map +1 -1
  269. package/dist/safety/shell-classification.js +1 -1
  270. package/dist/safety/shell-classification.js.map +1 -1
  271. package/dist/session-runtime/client.js +2 -1
  272. package/dist/session-runtime/client.js.map +1 -1
  273. package/dist/session-runtime/view-manager.js +1 -1
  274. package/dist/session-runtime/view-manager.js.map +1 -1
  275. package/dist/store/history/jsonl-lock.js +10 -7
  276. package/dist/store/history/jsonl-lock.js.map +1 -1
  277. package/dist/store/history/recovery.d.ts +1 -0
  278. package/dist/store/history/recovery.js +2 -1
  279. package/dist/store/history/recovery.js.map +1 -1
  280. package/dist/store/history/sqlite-backend.js +2 -0
  281. package/dist/store/history/sqlite-backend.js.map +1 -1
  282. package/dist/store/history.d.ts +2 -2
  283. package/dist/store/history.js +8 -4
  284. package/dist/store/history.js.map +1 -1
  285. package/dist/store/session-prompts.d.ts +5 -0
  286. package/dist/store/session-prompts.js +60 -1
  287. package/dist/store/session-prompts.js.map +1 -1
  288. package/dist/tools/definitions/aggregate.js +7 -2
  289. package/dist/tools/definitions/aggregate.js.map +1 -1
  290. package/dist/tools/definitions/fs-read.js +1 -1
  291. package/dist/tools/definitions/fs-read.js.map +1 -1
  292. package/dist/tools/fs/read-input.d.ts +1 -1
  293. package/dist/tools/fs/read-input.js +2 -2
  294. package/dist/tools/fs/read-input.js.map +1 -1
  295. package/dist/tools/instructions.js +8 -1
  296. package/dist/tools/instructions.js.map +1 -1
  297. package/dist/tui-v2/app/App.js +18 -7
  298. package/dist/tui-v2/app/App.js.map +1 -1
  299. package/dist/tui-v2/bootstrap/frame-pacing.d.ts +4 -0
  300. package/dist/tui-v2/bootstrap/frame-pacing.js +5 -0
  301. package/dist/tui-v2/bootstrap/frame-pacing.js.map +1 -0
  302. package/dist/tui-v2/bootstrap/runtime-view.js +2 -0
  303. package/dist/tui-v2/bootstrap/runtime-view.js.map +1 -1
  304. package/dist/tui-v2/bootstrap/start-tui-v2.js +2 -0
  305. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  306. package/dist/tui-v2/components/modal/confirm-modal.d.ts +2 -0
  307. package/dist/tui-v2/components/modal/confirm-modal.js +21 -35
  308. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
  309. package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
  310. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  311. package/dist/tui-v2/components/pager/pager.js +4 -1
  312. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  313. package/dist/tui-v2/components/plan/plan-interaction.d.ts +11 -0
  314. package/dist/tui-v2/components/plan/plan-interaction.js +56 -0
  315. package/dist/tui-v2/components/plan/plan-interaction.js.map +1 -0
  316. package/dist/tui-v2/components/plan/plan-view.d.ts +7 -1
  317. package/dist/tui-v2/components/plan/plan-view.js +78 -175
  318. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  319. package/dist/tui-v2/components/plan/task-title.d.ts +9 -0
  320. package/dist/tui-v2/components/plan/task-title.js +17 -0
  321. package/dist/tui-v2/components/plan/task-title.js.map +1 -0
  322. package/dist/tui-v2/components/plan/use-task-disclosure.d.ts +25 -0
  323. package/dist/tui-v2/components/plan/use-task-disclosure.js +125 -0
  324. package/dist/tui-v2/components/plan/use-task-disclosure.js.map +1 -0
  325. package/dist/tui-v2/components/queue/queue-panel.js +2 -7
  326. package/dist/tui-v2/components/queue/queue-panel.js.map +1 -1
  327. package/dist/tui-v2/components/status/jump-to-latest.d.ts +7 -0
  328. package/dist/tui-v2/components/status/jump-to-latest.js +16 -0
  329. package/dist/tui-v2/components/status/jump-to-latest.js.map +1 -0
  330. package/dist/tui-v2/components/status/status-line.d.ts +1 -0
  331. package/dist/tui-v2/components/status/status-line.js +14 -4
  332. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  333. package/dist/tui-v2/components/toast/toast-host.js +4 -7
  334. package/dist/tui-v2/components/toast/toast-host.js.map +1 -1
  335. package/dist/tui-v2/components/transcript/file-diff-card.d.ts +1 -0
  336. package/dist/tui-v2/components/transcript/file-diff-card.js +25 -11
  337. package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
  338. package/dist/tui-v2/components/transcript/tool-card.js +24 -20
  339. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  340. package/dist/tui-v2/components/transcript/transcript-row.js +6 -3
  341. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  342. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +1 -0
  343. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +3 -1
  344. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -1
  345. package/dist/tui-v2/components/transcript/transcript-scrollbar.js +17 -11
  346. package/dist/tui-v2/components/transcript/transcript-scrollbar.js.map +1 -1
  347. package/dist/tui-v2/components/transcript/transcript-view.js +41 -21
  348. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  349. package/dist/tui-v2/composer/composer-editor.js +17 -9
  350. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  351. package/dist/tui-v2/rendering/pager-markdown.d.ts +3 -0
  352. package/dist/tui-v2/rendering/pager-markdown.js +3 -0
  353. package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
  354. package/dist/types.d.ts +12 -0
  355. package/dist/types.js.map +1 -1
  356. package/dist/ui/mentions/file-suggestions.js +17 -8
  357. package/dist/ui/mentions/file-suggestions.js.map +1 -1
  358. package/dist/ui-core/actions/action-id.d.ts +1 -1
  359. package/dist/ui-core/actions/action-id.js +7 -0
  360. package/dist/ui-core/actions/action-id.js.map +1 -1
  361. package/dist/ui-core/actions/format-shortcuts.js +9 -0
  362. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  363. package/dist/ui-core/bootstrap/overlay-ports.js +8 -3
  364. package/dist/ui-core/bootstrap/overlay-ports.js.map +1 -1
  365. package/dist/ui-core/bootstrap/session-resume.js +1 -0
  366. package/dist/ui-core/bootstrap/session-resume.js.map +1 -1
  367. package/dist/ui-core/commands/change-commands.d.ts +4 -0
  368. package/dist/ui-core/commands/change-commands.js +48 -0
  369. package/dist/ui-core/commands/change-commands.js.map +1 -0
  370. package/dist/ui-core/commands/command-handlers.js +2 -0
  371. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  372. package/dist/ui-core/commands/config-commands.js +12 -6
  373. package/dist/ui-core/commands/config-commands.js.map +1 -1
  374. package/dist/ui-core/commands/prompt-commands.d.ts +1 -1
  375. package/dist/ui-core/commands/prompt-commands.js +12 -2
  376. package/dist/ui-core/commands/prompt-commands.js.map +1 -1
  377. package/dist/ui-core/composer/arrow-intent.js +2 -0
  378. package/dist/ui-core/composer/arrow-intent.js.map +1 -1
  379. package/dist/ui-core/composer/paste-placeholder.js +2 -2
  380. package/dist/ui-core/composer/paste-placeholder.js.map +1 -1
  381. package/dist/ui-core/composer/prompt-history.d.ts +12 -0
  382. package/dist/ui-core/composer/prompt-history.js +75 -1
  383. package/dist/ui-core/composer/prompt-history.js.map +1 -1
  384. package/dist/ui-core/composer/saved-prompt-history.d.ts +5 -0
  385. package/dist/ui-core/composer/saved-prompt-history.js +33 -0
  386. package/dist/ui-core/composer/saved-prompt-history.js.map +1 -0
  387. package/dist/ui-core/controllers/overlay-controller.d.ts +1 -0
  388. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  389. package/dist/ui-core/controllers/toast-controller.js +4 -4
  390. package/dist/ui-core/controllers/toast-controller.js.map +1 -1
  391. package/dist/ui-core/react/use-transcript-store.js +4 -2
  392. package/dist/ui-core/react/use-transcript-store.js.map +1 -1
  393. package/dist/ui-core/rendering/artifact-pager-source.d.ts +3 -0
  394. package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
  395. package/dist/ui-core/rendering/batch-sections.d.ts +3 -2
  396. package/dist/ui-core/rendering/batch-sections.js +5 -5
  397. package/dist/ui-core/rendering/batch-sections.js.map +1 -1
  398. package/dist/ui-core/rendering/card-style.d.ts +2 -0
  399. package/dist/ui-core/rendering/card-style.js +3 -0
  400. package/dist/ui-core/rendering/card-style.js.map +1 -0
  401. package/dist/ui-core/rendering/confirmation-preview.d.ts +9 -0
  402. package/dist/ui-core/rendering/confirmation-preview.js +33 -0
  403. package/dist/ui-core/rendering/confirmation-preview.js.map +1 -0
  404. package/dist/ui-core/rendering/duration.d.ts +2 -1
  405. package/dist/ui-core/rendering/duration.js +4 -6
  406. package/dist/ui-core/rendering/duration.js.map +1 -1
  407. package/dist/ui-core/rendering/intro-header.d.ts +1 -0
  408. package/dist/ui-core/rendering/intro-header.js +19 -15
  409. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  410. package/dist/ui-core/rendering/jump-to-latest.d.ts +1 -0
  411. package/dist/ui-core/rendering/jump-to-latest.js +7 -0
  412. package/dist/ui-core/rendering/jump-to-latest.js.map +1 -0
  413. package/dist/ui-core/rendering/line-change-labels.d.ts +6 -0
  414. package/dist/ui-core/rendering/line-change-labels.js +12 -0
  415. package/dist/ui-core/rendering/line-change-labels.js.map +1 -0
  416. package/dist/ui-core/rendering/markdown.d.ts +5 -1
  417. package/dist/ui-core/rendering/markdown.js +20 -5
  418. package/dist/ui-core/rendering/markdown.js.map +1 -1
  419. package/dist/ui-core/rendering/plan-view.js +24 -12
  420. package/dist/ui-core/rendering/plan-view.js.map +1 -1
  421. package/dist/ui-core/rendering/render-markdown-lines.d.ts +3 -0
  422. package/dist/ui-core/rendering/render-markdown-lines.js +6 -1
  423. package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -1
  424. package/dist/ui-core/rendering/session-prompts-pager-source.js +2 -0
  425. package/dist/ui-core/rendering/session-prompts-pager-source.js.map +1 -1
  426. package/dist/ui-core/rendering/status-segments.js +10 -5
  427. package/dist/ui-core/rendering/status-segments.js.map +1 -1
  428. package/dist/ui-core/rendering/subagent-presentation.js +39 -11
  429. package/dist/ui-core/rendering/subagent-presentation.js.map +1 -1
  430. package/dist/ui-core/rendering/subagent-source.js +11 -48
  431. package/dist/ui-core/rendering/subagent-source.js.map +1 -1
  432. package/dist/ui-core/rendering/subagent-tool-usage.d.ts +5 -0
  433. package/dist/ui-core/rendering/subagent-tool-usage.js +42 -0
  434. package/dist/ui-core/rendering/subagent-tool-usage.js.map +1 -0
  435. package/dist/ui-core/rendering/task-disclosure.d.ts +19 -0
  436. package/dist/ui-core/rendering/task-disclosure.js +70 -0
  437. package/dist/ui-core/rendering/task-disclosure.js.map +1 -0
  438. package/dist/ui-core/rendering/tool-diff-preview.d.ts +21 -0
  439. package/dist/ui-core/rendering/tool-diff-preview.js +27 -0
  440. package/dist/ui-core/rendering/tool-diff-preview.js.map +1 -0
  441. package/dist/ui-core/rendering/tool-presenter.d.ts +4 -2
  442. package/dist/ui-core/rendering/tool-presenter.js +19 -4
  443. package/dist/ui-core/rendering/tool-presenter.js.map +1 -1
  444. package/dist/ui-core/rendering/tool-usage-label.d.ts +2 -0
  445. package/dist/ui-core/rendering/tool-usage-label.js +42 -0
  446. package/dist/ui-core/rendering/tool-usage-label.js.map +1 -0
  447. package/dist/ui-core/state/hydrate/classic-transcript.js +2 -0
  448. package/dist/ui-core/state/hydrate/classic-transcript.js.map +1 -1
  449. package/dist/ui-core/state/transcript/apply-app-event.js +16 -5
  450. package/dist/ui-core/state/transcript/apply-app-event.js.map +1 -1
  451. package/dist/ui-core/state/transcript-hydrate.js +1 -0
  452. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  453. package/dist/ui-core/state/transcript-types.d.ts +4 -0
  454. package/dist/ui-core/state/transcript-types.js.map +1 -1
  455. package/dist/version.generated.d.ts +2 -2
  456. package/dist/version.generated.js +2 -2
  457. package/package.json +1 -1
  458. package/dist/classic/feed/ScrollbarGutter.d.ts +0 -9
  459. package/dist/classic/feed/ScrollbarGutter.js +0 -41
  460. package/dist/classic/feed/ScrollbarGutter.js.map +0 -1
  461. package/dist/classic/feed/scrollbar-rows.d.ts +0 -5
  462. package/dist/classic/feed/scrollbar-rows.js +0 -17
  463. package/dist/classic/feed/scrollbar-rows.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/commands/update/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ReleaseMetadata {
2
+ readonly tag_name: string;
3
+ readonly html_url: string;
4
+ readonly published_at: string;
5
+ }
6
+ export declare function fetchLatestRelease(signal?: AbortSignal): Promise<ReleaseMetadata | null>;
@@ -0,0 +1,36 @@
1
+ import { downloadBinary } from "./download.js";
2
+ import { mirrorBaseUrl, REPO } from "./installers.js";
3
+ import { throwIfCancelled } from "./process.js";
4
+ import { releaseVersion } from "./verification.js";
5
+ async function metadata(url, signal) {
6
+ const bytes = await downloadBinary(url, 5000, undefined, signal, 256 * 1024);
7
+ return JSON.parse(bytes.toString("utf8"));
8
+ }
9
+ async function releaseFrom(url, mirror, signal) {
10
+ try {
11
+ const value = await metadata(url, signal);
12
+ if (!value || typeof value !== "object")
13
+ return null;
14
+ const tag = mirror ? ("version" in value ? value.version : undefined) : ("tag_name" in value ? value.tag_name : undefined);
15
+ const version = releaseVersion(tag);
16
+ if (!version)
17
+ return null;
18
+ const date = "published_at" in value && typeof value.published_at === "string" ? Date.parse(value.published_at) : NaN;
19
+ return {
20
+ tag_name: `v${version}`,
21
+ html_url: `https://github.com/${REPO}/releases/tag/v${version}`,
22
+ published_at: Number.isFinite(date) ? new Date(date).toISOString() : "",
23
+ };
24
+ }
25
+ catch {
26
+ throwIfCancelled(signal);
27
+ return null;
28
+ }
29
+ }
30
+ export async function fetchLatestRelease(signal) {
31
+ const release = await releaseFrom(`https://api.github.com/repos/${REPO}/releases/latest`, false, signal);
32
+ if (release || process.env.CLAI_NO_MIRROR === "1")
33
+ return release;
34
+ return releaseFrom(`${mirrorBaseUrl()}/version.json`, true, signal);
35
+ }
36
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/update/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQnD,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAoB;IACvD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,MAAe,EAAE,MAAoB;IAC3E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3H,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,cAAc,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtH,OAAO;YACL,QAAQ,EAAE,IAAI,OAAO,EAAE;YACvB,QAAQ,EAAE,sBAAsB,IAAI,kBAAkB,OAAO,EAAE;YAC/D,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,gCAAgC,IAAI,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzG,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClE,OAAO,WAAW,CAAC,GAAG,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
2
+ export declare function writableDirectory(path: string, platform?: NodeJS.Platform): boolean;
3
+ export declare function installDirectBinary(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
@@ -0,0 +1,179 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { accessSync, chmodSync, constants, copyFileSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { evictSudoSession, formatSudoStdinPassword, looksLikeSudoAuthError, obtainSudoPassword } from "../../tools/sudo-session.js";
6
+ import { canonicalPath } from "./detection.js";
7
+ import { downloadBinary } from "./download.js";
8
+ import { currentPlatformTarget, ELEVATION_TIMEOUT_MS, mirrorBaseUrl, REPO } from "./installers.js";
9
+ import { runUpdateCommand, throwIfCancelled } from "./process.js";
10
+ import { verifyExecutable } from "./verification.js";
11
+ import { stageWindowsUpdate } from "./windows-stage.js";
12
+ function digest(bytes) {
13
+ return createHash("sha256").update(bytes).digest("hex");
14
+ }
15
+ export function writableDirectory(path, platform = process.platform) {
16
+ try {
17
+ if (platform === "win32") {
18
+ const probe = mkdtempSync(join(path, ".clai-write-probe-"));
19
+ rmSync(probe, { recursive: true });
20
+ }
21
+ else
22
+ accessSync(path, constants.W_OK | constants.X_OK);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async function binaryChecksum(urls, options) {
30
+ for (const url of urls) {
31
+ try {
32
+ const value = (await downloadBinary(url, 20_000, undefined, options.signal, 4096)).toString("utf8").trim().split(/\s+/)[0];
33
+ if (value && /^[a-f\d]{64}$/i.test(value))
34
+ return value.toLowerCase();
35
+ }
36
+ catch (error) {
37
+ if (options.signal?.aborted)
38
+ throw error;
39
+ }
40
+ }
41
+ throw new Error("could not obtain a valid release checksum; existing installation was kept");
42
+ }
43
+ async function verifiedDownload(urls, expected, options) {
44
+ let failure = new Error("update download failed");
45
+ for (const [index, url] of urls.entries()) {
46
+ try {
47
+ const bytes = await downloadBinary(url, 120_000, (progress) => options.onProgress?.({ phase: "downloading", ...progress }), options.signal);
48
+ options.onProgress?.({ phase: "verifying" });
49
+ if (digest(bytes) !== expected)
50
+ throw new Error("checksum mismatch for update download");
51
+ return bytes;
52
+ }
53
+ catch (error) {
54
+ throwIfCancelled(options.signal);
55
+ failure = error instanceof Error ? error : new Error(String(error));
56
+ if (index + 1 < urls.length)
57
+ options.log?.("Mirror unavailable or invalid; trying GitHub releases…");
58
+ }
59
+ }
60
+ throw failure;
61
+ }
62
+ async function authorizeReplacement(destination, options) {
63
+ if (options.elevation?.auth.status === "cancelled")
64
+ throw new Error("update cancelled before replacing the executable");
65
+ if (options.elevation?.auth.status === "failed")
66
+ throw new Error("sudo authentication failed");
67
+ if (options.elevation || writableDirectory(dirname(destination)) || !options.requestSecret)
68
+ return options.elevation;
69
+ const auth = await obtainSudoPassword({
70
+ requestSecret: options.requestSecret,
71
+ operation: { name: "clai.update", args: { version: options.version, destination, elevation: "sudo", action: "install verified update atomically" } },
72
+ title: "Administrator access",
73
+ prompt: `Updating clai needs admin permission to replace ${destination}. Enter your sudo password; it is sent only to sudo stdin. Esc cancels.`,
74
+ ...(options.signal ? { signal: options.signal } : {}),
75
+ }, {});
76
+ if (auth.status === "failed")
77
+ throw new Error(`sudo authentication failed — could not replace ${destination}`);
78
+ if (auth.status === "cancelled")
79
+ throw new Error("update cancelled before replacing the executable");
80
+ return { auth };
81
+ }
82
+ async function promote(source, destination, options, elevation) {
83
+ const pending = `${destination}.update-${randomUUID()}`;
84
+ try {
85
+ copyFileSync(source, pending, constants.COPYFILE_EXCL);
86
+ chmodSync(pending, 0o755);
87
+ renameSync(pending, destination);
88
+ return;
89
+ }
90
+ catch (error) {
91
+ const code = error instanceof Error && "code" in error ? error.code : undefined;
92
+ if (code !== "EACCES" && code !== "EPERM")
93
+ throw error;
94
+ }
95
+ finally {
96
+ rmSync(pending, { force: true });
97
+ }
98
+ if (elevation?.auth.status === "cancelled")
99
+ throw new Error("update cancelled before replacing the executable");
100
+ const password = elevation?.auth.status === "granted" ? elevation.auth.password : undefined;
101
+ const args = password === undefined ? ["-n"] : ["-S", "-p", ""];
102
+ const script = 'set -eu; stage=$(mktemp "$2.update.XXXXXX"); trap \'rm -f "$stage"\' EXIT; install -m 755 "$1" "$stage"; mv -f "$stage" "$2"';
103
+ try {
104
+ await runUpdateCommand({ file: "sudo", args: [...args, "--", "sh", "-c", script, "clai-update", source, destination] }, {
105
+ signal: options.signal,
106
+ timeoutMs: password === undefined ? ELEVATION_TIMEOUT_MS : 30_000,
107
+ ...(password === undefined ? {} : { input: formatSudoStdinPassword(password) }),
108
+ });
109
+ }
110
+ catch (error) {
111
+ if (password && error instanceof Error && looksLikeSudoAuthError(error.message))
112
+ evictSudoSession(password);
113
+ throwIfCancelled(options.signal);
114
+ throw new Error(`needs elevated permission to replace ${destination} — run \`sudo clai update\` using this installation, or retry the admin prompt`);
115
+ }
116
+ }
117
+ export async function installDirectBinary(options) {
118
+ throwIfCancelled(options.signal);
119
+ const target = options.target ?? currentPlatformTarget();
120
+ const destination = canonicalPath(options.execPath ?? options.method.executablePath ?? process.execPath);
121
+ const base = `https://github.com/${options.repo ?? REPO}/releases/download/v${options.version}`;
122
+ const mirror = `${mirrorBaseUrl()}/v${options.version}`;
123
+ const useMirror = process.env.CLAI_NO_MIRROR !== "1";
124
+ const binaryUrls = useMirror ? [`${mirror}/${target.file}`, `${base}/${target.file}`] : [`${base}/${target.file}`];
125
+ const sums = useMirror ? [`${base}/${target.file}.sha256`, `${mirror}/${target.file}.sha256`] : [`${base}/${target.file}.sha256`];
126
+ const elevation = process.platform === "win32" ? undefined : await authorizeReplacement(destination, options);
127
+ const previous = readFileSync(destination);
128
+ const previousDigest = digest(previous);
129
+ const expected = await binaryChecksum(sums, options);
130
+ options.log?.(`Downloading ${target.file} (v${options.version})…`);
131
+ const bytes = await verifiedDownload(binaryUrls, expected, options);
132
+ const stage = mkdtempSync(join(tmpdir(), "clai-update-"));
133
+ let preserve = false;
134
+ try {
135
+ const source = join(stage, target.file);
136
+ const backup = join(stage, "previous-clai");
137
+ writeFileSync(source, bytes, { mode: 0o755 });
138
+ writeFileSync(backup, previous, { mode: 0o755 });
139
+ await verifyExecutable(source, options.version, { signal: options.signal });
140
+ if (digest(readFileSync(destination)) !== previousDigest)
141
+ throw new Error("installation changed during update; retry without other update processes");
142
+ throwIfCancelled(options.signal);
143
+ options.onProgress?.({ phase: "installing", detail: destination });
144
+ if (process.platform === "win32") {
145
+ const statusFile = await stageWindowsUpdate({ kind: "binary", source, destination, digest: expected, previousDigest, version: options.version }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, !writableDirectory(dirname(destination)));
146
+ return { ok: true, method: "binary", outcome: "staged", needsRestart: true, statusFile, message: `verified update staged; close this installation to apply it. Result: ${statusFile}` };
147
+ }
148
+ throwIfCancelled(options.signal);
149
+ try {
150
+ await promote(source, destination, { ...options, signal: undefined }, elevation);
151
+ if (digest(readFileSync(destination)) !== expected)
152
+ throw new Error("installed binary checksum mismatch");
153
+ const installedVersion = await verifyExecutable(destination, options.version);
154
+ return { ok: true, method: "binary", outcome: "applied", installedVersion, needsRestart: true, message: `installed and verified v${installedVersion} → ${destination}` };
155
+ }
156
+ catch (error) {
157
+ let unchanged = false;
158
+ try {
159
+ unchanged = digest(readFileSync(destination)) === previousDigest;
160
+ }
161
+ catch { }
162
+ if (unchanged)
163
+ throw error;
164
+ try {
165
+ await promote(backup, destination, { ...options, signal: undefined }, elevation);
166
+ }
167
+ catch {
168
+ preserve = true;
169
+ throw new Error(`update verification and rollback failed for ${destination}; recovery executable retained at ${backup}`);
170
+ }
171
+ throw new Error(`update verification failed; previous executable restored: ${error instanceof Error ? error.message : String(error)}`);
172
+ }
173
+ }
174
+ finally {
175
+ if (!preserve)
176
+ rmSync(stage, { recursive: true, force: true });
177
+ }
178
+ }
179
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/commands/update/native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type InstallMethod, type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
2
+ import { type UpdateCommand } from "./process.js";
3
+ export declare function managerUpdateCommands(method: InstallMethod, version: string, platform?: NodeJS.Platform, groupSpec?: string): readonly UpdateCommand[];
4
+ export declare function installViaPackageManager(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
@@ -0,0 +1,158 @@
1
+ import { accessSync, constants, existsSync, readFileSync } from "node:fs";
2
+ import { delimiter, dirname, isAbsolute, join, posix, win32 } from "node:path";
3
+ import { formatSudoStdinPassword, obtainSudoPassword } from "../../tools/sudo-session.js";
4
+ import { PACKAGE_NAME, REPO } from "./installers.js";
5
+ import { writableDirectory } from "./native.js";
6
+ import { runUpdateCommand, throwIfCancelled, windowsCommand } from "./process.js";
7
+ import { installedVersionCommand, releaseVersion, verifyCommand } from "./verification.js";
8
+ import { stageWindowsUpdate } from "./windows-stage.js";
9
+ export function managerUpdateCommands(method, version, platform = process.platform, groupSpec) {
10
+ const api = platform === "win32" ? win32 : posix;
11
+ const suffix = platform === "win32" ? ".cmd" : "";
12
+ const file = method.managerPath ?? `${method.type}${suffix}`;
13
+ const spec = `${PACKAGE_NAME}@${version}`;
14
+ if (method.type === "brew") {
15
+ return [{ file: method.managerPath ?? "brew", args: ["update"] }, { file: method.managerPath ?? "brew", args: ["upgrade", `${REPO}/clai`] }];
16
+ }
17
+ if (!method.prefix)
18
+ throw new Error(`cannot safely target the active ${method.type} installation without its installation directory`);
19
+ const cwd = method.prefix;
20
+ if (method.type === "scoop") {
21
+ const env = method.scope === "global" ? { SCOOP_GLOBAL: cwd } : { SCOOP: cwd };
22
+ const scoop = method.managerPath ?? api.join(cwd, "apps", "scoop", "current", "bin", "scoop.ps1");
23
+ return [{ file: scoop, args: ["update"], env }, { file: scoop, args: ["update", "clai", ...(method.scope === "global" ? ["--global"] : [])], env }];
24
+ }
25
+ if (!method.packageRoot || !method.runtimePath)
26
+ throw new Error("cannot safely update an unidentified JS package installation");
27
+ switch (method.type) {
28
+ case "npm":
29
+ return [{ file, args: ["install", ...(method.scope === "global" ? ["--global"] : ["--save-exact"]), "--prefix", cwd, spec, "--no-audit", "--no-fund"], cwd }];
30
+ case "bun": {
31
+ const standardGlobal = method.scope === "global" && /[\\/]install[\\/]global$/.test(cwd);
32
+ const env = standardGlobal ? { BUN_INSTALL_GLOBAL_DIR: cwd, BUN_INSTALL_BIN: api.join(api.dirname(api.dirname(cwd)), "bin") } : undefined;
33
+ return [{ file: method.managerPath ?? (platform === "win32" ? "bun.exe" : "bun"), args: ["add", ...(standardGlobal ? ["--global"] : []), "--exact", spec], cwd, ...(env ? { env } : {}) }];
34
+ }
35
+ case "pnpm": {
36
+ if (method.scope !== "global")
37
+ return [{ file, args: ["add", "--save-exact", spec], cwd }];
38
+ const normalized = cwd.replace(/\\/g, "/");
39
+ const isolated = normalized.indexOf("/global/v");
40
+ const home = isolated >= 0 ? cwd.slice(0, isolated) : api.dirname(api.dirname(cwd));
41
+ const bin = isolated >= 0 ? api.join(home, "bin") : home;
42
+ const path = `${bin}${platform === "win32" ? ";" : ":"}${process.env.PATH ?? ""}`;
43
+ return [{ file, args: ["add", "--global", "--global-dir", api.join(home, "global"), groupSpec ?? spec], ...(isolated >= 0 ? { cwd } : {}), env: { PNPM_HOME: home, PNPM_SHIM_BYPASS: "1", PATH: path } }];
44
+ }
45
+ case "yarn":
46
+ return [{ file, args: ["--cwd", cwd, "add", "--exact", spec], cwd }];
47
+ default: throw new Error(`no package manager command for install method: ${method.type}`);
48
+ }
49
+ }
50
+ function absoluteManager(file) {
51
+ if (isAbsolute(file))
52
+ return file;
53
+ for (const directory of (process.env.PATH ?? "").split(delimiter)) {
54
+ const candidate = join(directory, file);
55
+ try {
56
+ accessSync(candidate, constants.X_OK);
57
+ return candidate;
58
+ }
59
+ catch { }
60
+ }
61
+ throw new Error(`could not locate ${file}; install the original package manager before updating`);
62
+ }
63
+ async function runManager(command, options) {
64
+ const method = options.method;
65
+ if (method.scope !== "global" || !method.packageRoot || writableDirectory(dirname(method.packageRoot))) {
66
+ await runUpdateCommand(command, { signal: options.signal, log: options.log });
67
+ return;
68
+ }
69
+ const auth = options.elevation?.auth ?? (options.requestSecret ? await obtainSudoPassword({
70
+ requestSecret: options.requestSecret,
71
+ title: "Administrator access",
72
+ prompt: `Updating this ${method.type} installation at ${method.packageRoot} needs sudo permission. Enter your password; Esc cancels.`,
73
+ operation: { name: "clai.update", args: { version: options.version, destination: method.packageRoot, manager: method.type, elevation: "sudo" } },
74
+ ...(options.signal ? { signal: options.signal } : {}),
75
+ }, {}) : undefined);
76
+ if (auth?.status === "cancelled")
77
+ throw new Error("update cancelled before the package-manager operation");
78
+ if (auth?.status === "failed")
79
+ throw new Error("sudo authentication failed before the package-manager operation");
80
+ throwIfCancelled(options.signal);
81
+ const args = auth?.status === "granted" ? ["-S", "-p", ""] : ["-n"];
82
+ const env = { PATH: process.env.PATH ?? "", ...command.env };
83
+ const environment = Object.entries(env).filter((entry) => entry[1] !== undefined).map(([key, value]) => `${key}=${value}`);
84
+ try {
85
+ await runUpdateCommand({ file: "sudo", args: [...args, "--", "env", ...environment, absoluteManager(command.file), ...command.args], ...(command.cwd ? { cwd: command.cwd } : {}) }, {
86
+ signal: options.signal, log: options.log, ...(auth?.status === "granted" ? { input: formatSudoStdinPassword(auth.password) } : {}),
87
+ });
88
+ }
89
+ catch (error) {
90
+ throwIfCancelled(options.signal);
91
+ throw new Error(`could not update protected ${method.type} installation at ${method.packageRoot}; retry the administrator prompt or run this installation's update with sudo: ${error instanceof Error ? error.message : String(error)}`);
92
+ }
93
+ }
94
+ const JS_MANAGER_ENTRIES = { npm: [["npm", "bin", "npm-cli.js"]], pnpm: [["pnpm", "bin", "pnpm.mjs"], ["pnpm", "bin", "pnpm.cjs"]], yarn: [["yarn", "bin", "yarn.js"]] };
95
+ function nativeManagerCommand(command, method) {
96
+ if (process.platform !== "win32" || !/\.cmd$/i.test(command.file))
97
+ return command;
98
+ if (method.type !== "npm" && method.type !== "pnpm" && method.type !== "yarn")
99
+ return command;
100
+ const file = absoluteManager(command.file);
101
+ const base = join(dirname(file), "node_modules");
102
+ const entries = [...JS_MANAGER_ENTRIES[method.type].map((relative) => join(base, ...relative)), join(base, "corepack", "dist", `${method.type}.js`)];
103
+ const entry = entries.find(existsSync);
104
+ const node = join(dirname(file), "node.exe");
105
+ const runtime = existsSync(node) ? node : method.runtimePath;
106
+ if (entry && runtime)
107
+ return { ...command, file: runtime, args: [entry, ...command.args] };
108
+ if (command.args.some((arg) => /%[^%]+%/.test(arg)))
109
+ throw new Error("cannot safely pass this Windows installation path through an unidentified .cmd wrapper; reinstall the original package manager");
110
+ return command;
111
+ }
112
+ function isolatedGroupSpec(method, version) {
113
+ if (method.type !== "pnpm" || method.scope !== "global" || !method.prefix || !/[\\/]global[\\/]v\d+[\\/]/.test(method.prefix))
114
+ return undefined;
115
+ const manifest = JSON.parse(readFileSync(join(method.prefix, "package.json"), "utf8"));
116
+ if (!manifest || typeof manifest !== "object" || !("dependencies" in manifest) || !manifest.dependencies || typeof manifest.dependencies !== "object" || !(PACKAGE_NAME in manifest.dependencies))
117
+ throw new Error("cannot safely identify clai's isolated global pnpm group");
118
+ const entries = Object.entries(manifest.dependencies);
119
+ const specs = entries.map(([name, selector]) => {
120
+ if (!/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) || typeof selector !== "string")
121
+ throw new Error("invalid isolated pnpm group dependency");
122
+ if (name === PACKAGE_NAME)
123
+ return `${name}@${version}`;
124
+ const installed = JSON.parse(readFileSync(join(method.prefix, "node_modules", name, "package.json"), "utf8"));
125
+ if (!installed || typeof installed !== "object" || !("version" in installed))
126
+ throw new Error(`cannot preserve bundled pnpm dependency: ${name}`);
127
+ const pinned = releaseVersion(installed.version);
128
+ if (!pinned || /^(?:file:|link:|workspace:|git|https?:)/.test(selector))
129
+ throw new Error(`bundled pnpm dependency ${name} needs a manual update; existing group was kept`);
130
+ if (selector.startsWith("npm:")) {
131
+ if (!("name" in installed) || typeof installed.name !== "string" || !/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(installed.name))
132
+ throw new Error("invalid bundled pnpm alias");
133
+ return `${name}@npm:${installed.name}@${pinned}`;
134
+ }
135
+ return `${name}@${pinned}`;
136
+ });
137
+ return specs.sort().join(",");
138
+ }
139
+ export async function installViaPackageManager(options) {
140
+ throwIfCancelled(options.signal);
141
+ const groupSpec = isolatedGroupSpec(options.method, options.version);
142
+ const commands = managerUpdateCommands(options.method, options.version, process.platform, groupSpec).map((command) => nativeManagerCommand(command, options.method));
143
+ const verification = installedVersionCommand(options.method);
144
+ const allowNewer = options.method.type === "brew" || options.method.type === "scoop";
145
+ options.onProgress?.({ phase: "installing", detail: `${options.method.type} · ${options.method.prefix ?? options.method.detail}` });
146
+ if (process.platform === "win32") {
147
+ const elevated = options.method.scope === "global" && options.method.prefix !== undefined && !writableDirectory(options.method.packageRoot ? dirname(options.method.packageRoot) : options.method.prefix);
148
+ const statusFile = await stageWindowsUpdate({ kind: "commands", commands: commands.map(windowsCommand), verification: windowsCommand(verification), version: options.version, allowNewer }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, elevated);
149
+ return { ok: true, method: options.method.type, outcome: "staged", needsRestart: true, statusFile, message: `update staged for this ${options.method.type} installation; close clai to apply and verify it. Result: ${statusFile}` };
150
+ }
151
+ for (const command of commands) {
152
+ options.log?.(`Running ${command.file} ${command.args.join(" ")}`);
153
+ await runManager(command, options);
154
+ }
155
+ const installedVersion = await verifyCommand(verification, options.version, {}, allowNewer);
156
+ return { ok: true, method: options.method.type, outcome: "applied", installedVersion, needsRestart: true, message: `updated and verified v${installedVersion} via ${options.method.type}` };
157
+ }
158
+ //# sourceMappingURL=package-managers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-managers.js","sourceRoot":"","sources":["../../../src/commands/update/package-managers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface UpdateCommand {
2
+ readonly file: string;
3
+ readonly args: readonly string[];
4
+ readonly cwd?: string;
5
+ readonly env?: NodeJS.ProcessEnv;
6
+ }
7
+ export interface RunOptions {
8
+ readonly signal?: AbortSignal | undefined;
9
+ readonly timeoutMs?: number;
10
+ readonly log?: ((line: string) => void) | undefined;
11
+ readonly input?: string;
12
+ readonly platform?: NodeJS.Platform;
13
+ }
14
+ export declare function throwIfCancelled(signal?: AbortSignal): void;
15
+ export declare function psQuote(value: string): string;
16
+ export declare function windowsCommand(command: UpdateCommand): UpdateCommand;
17
+ export declare function runUpdateCommand(command: UpdateCommand, options?: RunOptions): Promise<string>;
@@ -0,0 +1,114 @@
1
+ import { spawn } from "node:child_process";
2
+ export function throwIfCancelled(signal) {
3
+ if (signal?.aborted)
4
+ throw new Error("update cancelled");
5
+ }
6
+ export function psQuote(value) {
7
+ if (/[\0\r\n]/.test(value))
8
+ throw new Error("invalid update command argument");
9
+ return `'${value.replace(/'/g, "''")}'`;
10
+ }
11
+ export function windowsCommand(command) {
12
+ if (!/\.(?:cmd|bat|ps1)$/i.test(command.file))
13
+ return command;
14
+ if (/\.(?:cmd|bat)$/i.test(command.file) && [command.file, ...command.args].some((value) => value.includes("%"))) {
15
+ throw new Error("cannot safely pass percent-containing paths or arguments through an unidentified Windows command wrapper; use the original manager's Node/Bun entrypoint");
16
+ }
17
+ const invocation = `& ${psQuote(command.file)} ${command.args.map(psQuote).join(" ")}; if (-not $?) { exit 1 }; exit $LASTEXITCODE`;
18
+ return { ...command, file: "powershell.exe", args: ["-NoProfile", "-NonInteractive", "-Command", invocation] };
19
+ }
20
+ function killTree(child, platform, force) {
21
+ if (!child.pid) {
22
+ child.kill(force ? "SIGKILL" : "SIGTERM");
23
+ return;
24
+ }
25
+ try {
26
+ if (platform === "win32") {
27
+ const killer = spawn("taskkill.exe", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore", windowsHide: true });
28
+ killer.on("error", () => child.kill("SIGKILL"));
29
+ return;
30
+ }
31
+ process.kill(-child.pid, force ? "SIGKILL" : "SIGTERM");
32
+ }
33
+ catch {
34
+ child.kill(force ? "SIGKILL" : "SIGTERM");
35
+ }
36
+ }
37
+ export function runUpdateCommand(command, options = {}) {
38
+ throwIfCancelled(options.signal);
39
+ const platform = options.platform ?? process.platform;
40
+ const launch = platform === "win32" ? windowsCommand(command) : command;
41
+ return new Promise((resolve, reject) => {
42
+ const child = spawn(launch.file, [...launch.args], {
43
+ ...(launch.cwd ? { cwd: launch.cwd } : {}),
44
+ env: { ...process.env, ...launch.env, CI: "1" },
45
+ stdio: [options.input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
46
+ detached: platform !== "win32", windowsHide: true,
47
+ });
48
+ let stdout = "";
49
+ let stderr = "";
50
+ let outLine = "";
51
+ let errLine = "";
52
+ let failure;
53
+ let settled = false;
54
+ let killTimer;
55
+ let stopTimer;
56
+ const finish = (error) => {
57
+ if (settled)
58
+ return;
59
+ settled = true;
60
+ clearTimeout(timer);
61
+ clearTimeout(killTimer);
62
+ clearTimeout(stopTimer);
63
+ options.signal?.removeEventListener("abort", abort);
64
+ if (error)
65
+ reject(error);
66
+ else
67
+ resolve(stdout.trim());
68
+ };
69
+ const stop = (error) => {
70
+ if (settled || failure)
71
+ return;
72
+ failure = error;
73
+ killTree(child, platform, false);
74
+ killTimer = setTimeout(() => killTree(child, platform, true), 1000);
75
+ stopTimer = setTimeout(() => finish(error), 3000);
76
+ };
77
+ const abort = () => stop(new Error("update cancelled"));
78
+ const timer = setTimeout(() => stop(new Error(`${command.file} timed out during update`)), options.timeoutMs ?? 600_000);
79
+ options.signal?.addEventListener("abort", abort, { once: true });
80
+ const feed = (chunk, error) => {
81
+ const text = chunk.toString();
82
+ if (error)
83
+ stderr = (stderr + text).slice(-16_384);
84
+ else
85
+ stdout = (stdout + text).slice(-16_384);
86
+ const lines = ((error ? errLine : outLine) + text).split(/\r?\n/);
87
+ const tail = (lines.pop() ?? "").slice(-2048);
88
+ if (error)
89
+ errLine = tail;
90
+ else
91
+ outLine = tail;
92
+ for (const line of lines)
93
+ if (line.trim())
94
+ options.log?.(line.slice(-2048).trimEnd());
95
+ };
96
+ child.stdout?.on("data", (data) => feed(data, false));
97
+ child.stderr?.on("data", (data) => feed(data, true));
98
+ child.on("error", (error) => finish(failure ?? new Error(`could not run ${command.file}: ${error.message}`)));
99
+ child.on("close", (code) => {
100
+ for (const line of [outLine, errLine])
101
+ if (line.trim())
102
+ options.log?.(line.trimEnd());
103
+ const detail = (stderr || stdout).trim().split("\n").slice(-4).join(" ");
104
+ finish(failure ?? (code === 0 ? undefined : new Error(`${command.file} exited with status ${code ?? "error"}${detail ? ` — ${detail}` : ""}`)));
105
+ });
106
+ if (options.signal?.aborted)
107
+ abort();
108
+ if (options.input !== undefined) {
109
+ child.stdin?.on("error", () => { });
110
+ child.stdin?.end(options.input);
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/update/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const sourceApplyWorker: string;
2
+ export declare const sourceCleanupWorker: string;