@greppleai/grip 0.1.5 → 0.1.7

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 (587) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/embedded-assets.d.ts.map +1 -1
  6. package/dist/bun/embedded-assets.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  9. package/dist/bun/restore-sandbox-env.js.map +1 -1
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +2 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/core/agent-session.d.ts +38 -1
  29. package/dist/core/agent-session.d.ts.map +1 -1
  30. package/dist/core/agent-session.js +289 -154
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/auth-guidance.d.ts.map +1 -1
  33. package/dist/core/auth-guidance.js.map +1 -1
  34. package/dist/core/auth-storage.d.ts +4 -0
  35. package/dist/core/auth-storage.d.ts.map +1 -1
  36. package/dist/core/auth-storage.js +3 -10
  37. package/dist/core/auth-storage.js.map +1 -1
  38. package/dist/core/bash-executor.d.ts.map +1 -1
  39. package/dist/core/bash-executor.js +19 -23
  40. package/dist/core/bash-executor.js.map +1 -1
  41. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  42. package/dist/core/compaction/branch-summarization.js.map +1 -1
  43. package/dist/core/compaction/compaction.d.ts.map +1 -1
  44. package/dist/core/compaction/compaction.js +9 -2
  45. package/dist/core/compaction/compaction.js.map +1 -1
  46. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
  47. package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
  48. package/dist/core/compaction/compression-detector.d.ts +1 -0
  49. package/dist/core/compaction/compression-detector.d.ts.map +1 -1
  50. package/dist/core/compaction/compression-detector.js +10 -21
  51. package/dist/core/compaction/compression-detector.js.map +1 -1
  52. package/dist/core/compaction/compression-economics.d.ts.map +1 -1
  53. package/dist/core/compaction/compression-economics.js.map +1 -1
  54. package/dist/core/compaction/utils.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.js.map +1 -1
  56. package/dist/core/defaults.d.ts.map +1 -1
  57. package/dist/core/diagnostics.d.ts.map +1 -1
  58. package/dist/core/event-bus.d.ts.map +1 -1
  59. package/dist/core/event-bus.js.map +1 -1
  60. package/dist/core/exec.d.ts.map +1 -1
  61. package/dist/core/exec.js.map +1 -1
  62. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  63. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  64. package/dist/core/export-html/index.d.ts.map +1 -1
  65. package/dist/core/export-html/index.js.map +1 -1
  66. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  67. package/dist/core/export-html/tool-renderer.js.map +1 -1
  68. package/dist/core/extensions/loader.d.ts.map +1 -1
  69. package/dist/core/extensions/loader.js.map +1 -1
  70. package/dist/core/extensions/runner.d.ts +3 -0
  71. package/dist/core/extensions/runner.d.ts.map +1 -1
  72. package/dist/core/extensions/runner.js +40 -30
  73. package/dist/core/extensions/runner.js.map +1 -1
  74. package/dist/core/extensions/types.d.ts +21 -1
  75. package/dist/core/extensions/types.d.ts.map +1 -1
  76. package/dist/core/extensions/types.js.map +1 -1
  77. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  78. package/dist/core/extensions/wrapper.js.map +1 -1
  79. package/dist/core/footer-data-provider.d.ts.map +1 -1
  80. package/dist/core/footer-data-provider.js +15 -16
  81. package/dist/core/footer-data-provider.js.map +1 -1
  82. package/dist/core/grip-agent.d.ts.map +1 -1
  83. package/dist/core/grip-agent.js +7 -21
  84. package/dist/core/grip-agent.js.map +1 -1
  85. package/dist/core/grip-manifest.d.ts.map +1 -1
  86. package/dist/core/grip-manifest.js.map +1 -1
  87. package/dist/core/hooks/aggregate.d.ts.map +1 -1
  88. package/dist/core/hooks/aggregate.js.map +1 -1
  89. package/dist/core/hooks/config.d.ts.map +1 -1
  90. package/dist/core/hooks/config.js.map +1 -1
  91. package/dist/core/hooks/executor.d.ts.map +1 -1
  92. package/dist/core/hooks/executor.js.map +1 -1
  93. package/dist/core/hooks/index.d.ts.map +1 -1
  94. package/dist/core/hooks/index.js.map +1 -1
  95. package/dist/core/hooks/matcher.d.ts.map +1 -1
  96. package/dist/core/hooks/matcher.js.map +1 -1
  97. package/dist/core/hooks/trust-store.d.ts.map +1 -1
  98. package/dist/core/hooks/trust-store.js +0 -3
  99. package/dist/core/hooks/trust-store.js.map +1 -1
  100. package/dist/core/hooks/types.d.ts.map +1 -1
  101. package/dist/core/hooks/types.js.map +1 -1
  102. package/dist/core/http-dispatcher.d.ts.map +1 -1
  103. package/dist/core/http-dispatcher.js.map +1 -1
  104. package/dist/core/instruction-resource-loader.d.ts +1 -0
  105. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  106. package/dist/core/instruction-resource-loader.js +2 -4
  107. package/dist/core/instruction-resource-loader.js.map +1 -1
  108. package/dist/core/keybindings.d.ts.map +1 -1
  109. package/dist/core/keybindings.js +0 -1
  110. package/dist/core/keybindings.js.map +1 -1
  111. package/dist/core/lsp/abort.d.ts.map +1 -1
  112. package/dist/core/lsp/abort.js.map +1 -1
  113. package/dist/core/lsp/client.d.ts.map +1 -1
  114. package/dist/core/lsp/client.js +8 -22
  115. package/dist/core/lsp/client.js.map +1 -1
  116. package/dist/core/lsp/config-loader.d.ts.map +1 -1
  117. package/dist/core/lsp/config-loader.js.map +1 -1
  118. package/dist/core/lsp/config.d.ts.map +1 -1
  119. package/dist/core/lsp/config.js.map +1 -1
  120. package/dist/core/lsp/diagnostics.d.ts.map +1 -1
  121. package/dist/core/lsp/diagnostics.js.map +1 -1
  122. package/dist/core/lsp/file-sync.d.ts.map +1 -1
  123. package/dist/core/lsp/file-sync.js +7 -9
  124. package/dist/core/lsp/file-sync.js.map +1 -1
  125. package/dist/core/lsp/integration.d.ts.map +1 -1
  126. package/dist/core/lsp/integration.js.map +1 -1
  127. package/dist/core/lsp/language-map.d.ts.map +1 -1
  128. package/dist/core/lsp/language-map.js +2 -7
  129. package/dist/core/lsp/language-map.js.map +1 -1
  130. package/dist/core/lsp/manager.d.ts.map +1 -1
  131. package/dist/core/lsp/manager.js +18 -29
  132. package/dist/core/lsp/manager.js.map +1 -1
  133. package/dist/core/lsp/navigation.d.ts.map +1 -1
  134. package/dist/core/lsp/navigation.js.map +1 -1
  135. package/dist/core/lsp/portable-path.d.ts.map +1 -1
  136. package/dist/core/lsp/portable-path.js.map +1 -1
  137. package/dist/core/lsp/refactor.d.ts.map +1 -1
  138. package/dist/core/lsp/refactor.js.map +1 -1
  139. package/dist/core/lsp/transport.d.ts.map +1 -1
  140. package/dist/core/lsp/transport.js.map +1 -1
  141. package/dist/core/messages.d.ts.map +1 -1
  142. package/dist/core/messages.js +30 -1
  143. package/dist/core/messages.js.map +1 -1
  144. package/dist/core/model-registry.d.ts.map +1 -1
  145. package/dist/core/model-registry.js +5 -7
  146. package/dist/core/model-registry.js.map +1 -1
  147. package/dist/core/model-resolver.d.ts.map +1 -1
  148. package/dist/core/model-resolver.js.map +1 -1
  149. package/dist/core/output-guard.d.ts.map +1 -1
  150. package/dist/core/output-guard.js.map +1 -1
  151. package/dist/core/package-manager.d.ts.map +1 -1
  152. package/dist/core/package-manager.js +0 -6
  153. package/dist/core/package-manager.js.map +1 -1
  154. package/dist/core/prompt-templates.d.ts.map +1 -1
  155. package/dist/core/prompt-templates.js.map +1 -1
  156. package/dist/core/provider-display-names.d.ts.map +1 -1
  157. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  158. package/dist/core/remote-workspace-protocol/contract.js +4 -2
  159. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  160. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
  161. package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
  162. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
  163. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
  164. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
  165. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
  166. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
  167. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
  168. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
  169. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
  170. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
  171. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
  172. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
  173. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  174. package/dist/core/remote-workspace-protocol/session.js +27 -65
  175. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  176. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
  177. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
  178. package/dist/core/resolve-config-value.d.ts.map +1 -1
  179. package/dist/core/resolve-config-value.js.map +1 -1
  180. package/dist/core/resource-loader.d.ts.map +1 -1
  181. package/dist/core/resource-loader.js +0 -48
  182. package/dist/core/resource-loader.js.map +1 -1
  183. package/dist/core/rules.d.ts.map +1 -1
  184. package/dist/core/rules.js.map +1 -1
  185. package/dist/core/sandbox/command.d.ts.map +1 -1
  186. package/dist/core/sandbox/command.js.map +1 -1
  187. package/dist/core/sandbox/config.d.ts.map +1 -1
  188. package/dist/core/sandbox/config.js.map +1 -1
  189. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
  190. package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
  191. package/dist/core/sandbox/lima.d.ts +2 -0
  192. package/dist/core/sandbox/lima.d.ts.map +1 -1
  193. package/dist/core/sandbox/lima.js +3 -9
  194. package/dist/core/sandbox/lima.js.map +1 -1
  195. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
  196. package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
  197. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
  198. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
  199. package/dist/core/session/constants.d.ts.map +1 -1
  200. package/dist/core/session/context-metadata.d.ts.map +1 -1
  201. package/dist/core/session/context-metadata.js.map +1 -1
  202. package/dist/core/session/context.d.ts.map +1 -1
  203. package/dist/core/session/context.js.map +1 -1
  204. package/dist/core/session/ids.d.ts.map +1 -1
  205. package/dist/core/session/ids.js.map +1 -1
  206. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  207. package/dist/core/session/in-memory-session-manager.js +0 -1
  208. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  209. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  210. package/dist/core/session/in-memory-session.js.map +1 -1
  211. package/dist/core/session/jsonl-errors.d.ts.map +1 -1
  212. package/dist/core/session/jsonl-errors.js +0 -11
  213. package/dist/core/session/jsonl-errors.js.map +1 -1
  214. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  215. package/dist/core/session/jsonl-helpers.js.map +1 -1
  216. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  217. package/dist/core/session/local-session-manager.js +4 -6
  218. package/dist/core/session/local-session-manager.js.map +1 -1
  219. package/dist/core/session/local-session.d.ts.map +1 -1
  220. package/dist/core/session/local-session.js.map +1 -1
  221. package/dist/core/session/migrations.d.ts.map +1 -1
  222. package/dist/core/session/migrations.js.map +1 -1
  223. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  224. package/dist/core/session/remote-session-client.js +0 -6
  225. package/dist/core/session/remote-session-client.js.map +1 -1
  226. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  227. package/dist/core/session/remote-session-manager.js +0 -3
  228. package/dist/core/session/remote-session-manager.js.map +1 -1
  229. package/dist/core/session/remote-session.d.ts.map +1 -1
  230. package/dist/core/session/remote-session.js +0 -1
  231. package/dist/core/session/remote-session.js.map +1 -1
  232. package/dist/core/session/session-manager.d.ts.map +1 -1
  233. package/dist/core/session/session.d.ts.map +1 -1
  234. package/dist/core/session/session.js +1 -5
  235. package/dist/core/session/session.js.map +1 -1
  236. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  237. package/dist/core/session/stores/in-memory-session-store.js +7 -6
  238. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  239. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  240. package/dist/core/session/stores/jsonl-session-store.js +6 -14
  241. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  242. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  243. package/dist/core/session/stores/remote-session-store.js +3 -8
  244. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  245. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  246. package/dist/core/session/types.d.ts.map +1 -1
  247. package/dist/core/session/usage-ledger.d.ts.map +1 -1
  248. package/dist/core/session/usage-ledger.js.map +1 -1
  249. package/dist/core/session-cwd.d.ts.map +1 -1
  250. package/dist/core/session-cwd.js +0 -1
  251. package/dist/core/session-cwd.js.map +1 -1
  252. package/dist/core/settings-manager.d.ts.map +1 -1
  253. package/dist/core/settings-manager.js +9 -17
  254. package/dist/core/settings-manager.js.map +1 -1
  255. package/dist/core/skills.d.ts.map +1 -1
  256. package/dist/core/skills.js +3 -2
  257. package/dist/core/skills.js.map +1 -1
  258. package/dist/core/slash-commands.d.ts.map +1 -1
  259. package/dist/core/source-info.d.ts.map +1 -1
  260. package/dist/core/source-info.js.map +1 -1
  261. package/dist/core/system-prompt.d.ts +1 -1
  262. package/dist/core/system-prompt.d.ts.map +1 -1
  263. package/dist/core/system-prompt.js +3 -2
  264. package/dist/core/system-prompt.js.map +1 -1
  265. package/dist/core/telemetry.d.ts.map +1 -1
  266. package/dist/core/telemetry.js.map +1 -1
  267. package/dist/core/timings.d.ts.map +1 -1
  268. package/dist/core/timings.js.map +1 -1
  269. package/dist/core/tools/bash.d.ts +1 -0
  270. package/dist/core/tools/bash.d.ts.map +1 -1
  271. package/dist/core/tools/bash.js +34 -28
  272. package/dist/core/tools/bash.js.map +1 -1
  273. package/dist/core/tools/compress-context.d.ts.map +1 -1
  274. package/dist/core/tools/compress-context.js.map +1 -1
  275. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  276. package/dist/core/tools/edit-diff.js.map +1 -1
  277. package/dist/core/tools/edit.d.ts.map +1 -1
  278. package/dist/core/tools/edit.js.map +1 -1
  279. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  280. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  281. package/dist/core/tools/find.d.ts.map +1 -1
  282. package/dist/core/tools/find.js.map +1 -1
  283. package/dist/core/tools/grep.d.ts.map +1 -1
  284. package/dist/core/tools/grep.js.map +1 -1
  285. package/dist/core/tools/hash-store.d.ts.map +1 -1
  286. package/dist/core/tools/hash-store.js.map +1 -1
  287. package/dist/core/tools/hashline/apply.d.ts.map +1 -1
  288. package/dist/core/tools/hashline/apply.js.map +1 -1
  289. package/dist/core/tools/hashline/hash.d.ts.map +1 -1
  290. package/dist/core/tools/hashline/hash.js.map +1 -1
  291. package/dist/core/tools/hashline/parse.d.ts.map +1 -1
  292. package/dist/core/tools/hashline/parse.js.map +1 -1
  293. package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
  294. package/dist/core/tools/hashline/resolve.js.map +1 -1
  295. package/dist/core/tools/hashline-utils.d.ts.map +1 -1
  296. package/dist/core/tools/hashline-utils.js.map +1 -1
  297. package/dist/core/tools/index.d.ts.map +1 -1
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/ls.d.ts.map +1 -1
  300. package/dist/core/tools/ls.js.map +1 -1
  301. package/dist/core/tools/operations.d.ts +11 -0
  302. package/dist/core/tools/operations.d.ts.map +1 -1
  303. package/dist/core/tools/operations.js +54 -28
  304. package/dist/core/tools/operations.js.map +1 -1
  305. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  306. package/dist/core/tools/output-accumulator.js +12 -18
  307. package/dist/core/tools/output-accumulator.js.map +1 -1
  308. package/dist/core/tools/path-utils.d.ts.map +1 -1
  309. package/dist/core/tools/path-utils.js.map +1 -1
  310. package/dist/core/tools/read.d.ts.map +1 -1
  311. package/dist/core/tools/read.js.map +1 -1
  312. package/dist/core/tools/render-utils.d.ts.map +1 -1
  313. package/dist/core/tools/render-utils.js.map +1 -1
  314. package/dist/core/tools/replace-diff.d.ts.map +1 -1
  315. package/dist/core/tools/replace-diff.js.map +1 -1
  316. package/dist/core/tools/replace-normalize.d.ts.map +1 -1
  317. package/dist/core/tools/replace-normalize.js.map +1 -1
  318. package/dist/core/tools/replace-render.d.ts +1 -1
  319. package/dist/core/tools/replace-render.d.ts.map +1 -1
  320. package/dist/core/tools/replace-render.js.map +1 -1
  321. package/dist/core/tools/runtime.d.ts.map +1 -1
  322. package/dist/core/tools/runtime.js.map +1 -1
  323. package/dist/core/tools/session-history.d.ts.map +1 -1
  324. package/dist/core/tools/session-history.js.map +1 -1
  325. package/dist/core/tools/subagent-agents.d.ts.map +1 -1
  326. package/dist/core/tools/subagent-agents.js.map +1 -1
  327. package/dist/core/tools/subagent.d.ts.map +1 -1
  328. package/dist/core/tools/subagent.js.map +1 -1
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  330. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  331. package/dist/core/tools/truncate.d.ts.map +1 -1
  332. package/dist/core/tools/truncate.js.map +1 -1
  333. package/dist/core/tools/websearch.d.ts.map +1 -1
  334. package/dist/core/tools/websearch.js.map +1 -1
  335. package/dist/core/tools/workspace-tool-host.d.ts +1 -0
  336. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
  337. package/dist/core/tools/workspace-tool-host.js +36 -22
  338. package/dist/core/tools/workspace-tool-host.js.map +1 -1
  339. package/dist/core/tools/write.d.ts.map +1 -1
  340. package/dist/core/tools/write.js +0 -1
  341. package/dist/core/tools/write.js.map +1 -1
  342. package/dist/core/workspace-identity.d.ts.map +1 -1
  343. package/dist/daemon/activity-budget.d.ts.map +1 -1
  344. package/dist/daemon/activity-budget.js +2 -3
  345. package/dist/daemon/activity-budget.js.map +1 -1
  346. package/dist/daemon/command.d.ts.map +1 -1
  347. package/dist/daemon/command.js.map +1 -1
  348. package/dist/daemon/config.d.ts +2 -0
  349. package/dist/daemon/config.d.ts.map +1 -1
  350. package/dist/daemon/config.js +4 -0
  351. package/dist/daemon/config.js.map +1 -1
  352. package/dist/daemon/help.d.ts.map +1 -1
  353. package/dist/daemon/help.js +4 -3
  354. package/dist/daemon/help.js.map +1 -1
  355. package/dist/daemon/lsp-config.d.ts.map +1 -1
  356. package/dist/daemon/lsp-config.js.map +1 -1
  357. package/dist/daemon/outbound-budget.d.ts.map +1 -1
  358. package/dist/daemon/outbound-budget.js +2 -4
  359. package/dist/daemon/outbound-budget.js.map +1 -1
  360. package/dist/daemon/security.d.ts.map +1 -1
  361. package/dist/daemon/security.js.map +1 -1
  362. package/dist/daemon/server.d.ts.map +1 -1
  363. package/dist/daemon/server.js.map +1 -1
  364. package/dist/daemon/shared-connection.d.ts.map +1 -1
  365. package/dist/daemon/shared-connection.js +10 -15
  366. package/dist/daemon/shared-connection.js.map +1 -1
  367. package/dist/daemon/shared-revision.d.ts.map +1 -1
  368. package/dist/daemon/shared-revision.js +2 -1
  369. package/dist/daemon/shared-revision.js.map +1 -1
  370. package/dist/daemon/shared-roots.d.ts.map +1 -1
  371. package/dist/daemon/shared-roots.js +0 -1
  372. package/dist/daemon/shared-roots.js.map +1 -1
  373. package/dist/daemon/workspace-runtime.d.ts +2 -0
  374. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  375. package/dist/daemon/workspace-runtime.js +43 -15
  376. package/dist/daemon/workspace-runtime.js.map +1 -1
  377. package/dist/index.d.ts +1 -1
  378. package/dist/index.d.ts.map +1 -1
  379. package/dist/index.js.map +1 -1
  380. package/dist/main.d.ts.map +1 -1
  381. package/dist/main.js +8 -3
  382. package/dist/main.js.map +1 -1
  383. package/dist/migrations.d.ts.map +1 -1
  384. package/dist/migrations.js.map +1 -1
  385. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.js +3 -10
  387. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  388. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/bash-execution.js +4 -9
  390. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  391. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  393. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  394. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  396. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  397. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  398. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  399. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  400. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  401. package/dist/modes/interactive/components/config-selector.js +6 -16
  402. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  403. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  405. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  406. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  407. package/dist/modes/interactive/components/custom-editor.js +1 -8
  408. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  409. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  410. package/dist/modes/interactive/components/custom-message.js +1 -6
  411. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  412. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/diff.js.map +1 -1
  414. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  416. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  417. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/extension-editor.js +1 -7
  419. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  420. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/extension-input.js +2 -8
  422. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  423. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  424. package/dist/modes/interactive/components/extension-selector.js +1 -9
  425. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  426. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/footer.js +8 -4
  428. package/dist/modes/interactive/components/footer.js.map +1 -1
  429. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/hook-execution.js +2 -5
  431. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  432. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  434. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/login-dialog.js +3 -9
  436. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  437. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  439. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  441. package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/message-card.js +0 -1
  443. package/dist/modes/interactive/components/message-card.js.map +1 -1
  444. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/model-selector.js +13 -28
  446. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  447. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  449. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  450. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  452. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  453. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  455. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/session-selector.js +33 -58
  457. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/settings-selector.js +0 -4
  460. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  461. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  463. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  464. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  466. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  467. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/theme-selector.js +0 -2
  469. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  470. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  472. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  473. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/tool-execution.js +9 -24
  475. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  476. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/tree-selector.js +18 -34
  478. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  479. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  481. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  482. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/user-message.js +0 -4
  484. package/dist/modes/interactive/components/user-message.js.map +1 -1
  485. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  487. package/dist/modes/interactive/interactive-mode.d.ts +13 -0
  488. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  489. package/dist/modes/interactive/interactive-mode.js +162 -136
  490. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  491. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  492. package/dist/modes/interactive/theme/theme.js +0 -7
  493. package/dist/modes/interactive/theme/theme.js.map +1 -1
  494. package/dist/modes/json-event.d.ts.map +1 -1
  495. package/dist/modes/json-event.js.map +1 -1
  496. package/dist/modes/print-mode.d.ts.map +1 -1
  497. package/dist/modes/print-mode.js.map +1 -1
  498. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  499. package/dist/modes/rpc/jsonl.js.map +1 -1
  500. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  501. package/dist/modes/rpc/rpc-client.js +10 -11
  502. package/dist/modes/rpc/rpc-client.js.map +1 -1
  503. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  504. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  505. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  506. package/dist/package-manager-cli.d.ts.map +1 -1
  507. package/dist/package-manager-cli.js +33 -2
  508. package/dist/package-manager-cli.js.map +1 -1
  509. package/dist/utils/ansi.d.ts.map +1 -1
  510. package/dist/utils/ansi.js.map +1 -1
  511. package/dist/utils/binary-self-update.d.ts +25 -0
  512. package/dist/utils/binary-self-update.d.ts.map +1 -0
  513. package/dist/utils/binary-self-update.js +159 -0
  514. package/dist/utils/binary-self-update.js.map +1 -0
  515. package/dist/utils/changelog.d.ts.map +1 -1
  516. package/dist/utils/changelog.js.map +1 -1
  517. package/dist/utils/child-process.d.ts.map +1 -1
  518. package/dist/utils/child-process.js.map +1 -1
  519. package/dist/utils/clipboard-image.d.ts.map +1 -1
  520. package/dist/utils/clipboard-image.js.map +1 -1
  521. package/dist/utils/clipboard-native.d.ts.map +1 -1
  522. package/dist/utils/clipboard-native.js.map +1 -1
  523. package/dist/utils/clipboard.d.ts.map +1 -1
  524. package/dist/utils/clipboard.js.map +1 -1
  525. package/dist/utils/deprecation.d.ts.map +1 -1
  526. package/dist/utils/deprecation.js.map +1 -1
  527. package/dist/utils/directory-completions.d.ts +8 -0
  528. package/dist/utils/directory-completions.d.ts.map +1 -1
  529. package/dist/utils/directory-completions.js +42 -1
  530. package/dist/utils/directory-completions.js.map +1 -1
  531. package/dist/utils/exif-orientation.d.ts.map +1 -1
  532. package/dist/utils/exif-orientation.js.map +1 -1
  533. package/dist/utils/frontmatter.d.ts.map +1 -1
  534. package/dist/utils/frontmatter.js.map +1 -1
  535. package/dist/utils/fs-watch.d.ts.map +1 -1
  536. package/dist/utils/fs-watch.js.map +1 -1
  537. package/dist/utils/git.d.ts.map +1 -1
  538. package/dist/utils/git.js.map +1 -1
  539. package/dist/utils/grip-user-agent.d.ts.map +1 -1
  540. package/dist/utils/grip-user-agent.js.map +1 -1
  541. package/dist/utils/html.d.ts.map +1 -1
  542. package/dist/utils/html.js.map +1 -1
  543. package/dist/utils/image-convert.d.ts.map +1 -1
  544. package/dist/utils/image-convert.js.map +1 -1
  545. package/dist/utils/image-process.d.ts.map +1 -1
  546. package/dist/utils/image-process.js.map +1 -1
  547. package/dist/utils/image-resize-core.d.ts.map +1 -1
  548. package/dist/utils/image-resize-core.js.map +1 -1
  549. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  550. package/dist/utils/image-resize-worker.js.map +1 -1
  551. package/dist/utils/image-resize.d.ts.map +1 -1
  552. package/dist/utils/image-resize.js.map +1 -1
  553. package/dist/utils/json.d.ts.map +1 -1
  554. package/dist/utils/json.js.map +1 -1
  555. package/dist/utils/mime.d.ts.map +1 -1
  556. package/dist/utils/mime.js.map +1 -1
  557. package/dist/utils/open-browser.d.ts.map +1 -1
  558. package/dist/utils/open-browser.js.map +1 -1
  559. package/dist/utils/paths.d.ts.map +1 -1
  560. package/dist/utils/paths.js.map +1 -1
  561. package/dist/utils/photon.d.ts.map +1 -1
  562. package/dist/utils/photon.js +10 -5
  563. package/dist/utils/photon.js.map +1 -1
  564. package/dist/utils/shell.d.ts.map +1 -1
  565. package/dist/utils/shell.js.map +1 -1
  566. package/dist/utils/sleep.d.ts.map +1 -1
  567. package/dist/utils/sleep.js.map +1 -1
  568. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  569. package/dist/utils/syntax-highlight.js +1 -1
  570. package/dist/utils/syntax-highlight.js.map +1 -1
  571. package/dist/utils/tools-manager.d.ts.map +1 -1
  572. package/dist/utils/tools-manager.js.map +1 -1
  573. package/dist/utils/version-check.d.ts.map +1 -1
  574. package/dist/utils/version-check.js.map +1 -1
  575. package/dist/utils/windows-self-update.d.ts.map +1 -1
  576. package/dist/utils/windows-self-update.js.map +1 -1
  577. package/docs/extensions.md +31 -1
  578. package/docs/sandbox.md +6 -0
  579. package/docs/sessions.md +1 -1
  580. package/docs/skills.md +4 -4
  581. package/docs/usage.md +2 -1
  582. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  583. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  584. package/examples/extensions/sandbox/package.json +2 -2
  585. package/examples/extensions/with-deps/package.json +1 -1
  586. package/npm-shrinkwrap.json +602 -834
  587. package/package.json +20 -21
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager-cli.d.ts","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AA6dtE,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB1E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB3E","sourcesContent":["import { Markdown, type MarkdownTheme } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { selectConfig } from \"./cli/config-selector.ts\";\nimport {\n\tAPP_NAME,\n\tdetectInstallMethod,\n\tgetAgentDir,\n\tgetPackageDir,\n\tgetSelfUpdateCommand,\n\tgetSelfUpdateUnavailableInstruction,\n\tPACKAGE_NAME,\n\ttype SelfUpdateCommand,\n\tVERSION,\n} from \"./config.ts\";\nimport { type ConfiguredPackage, DefaultPackageManager } from \"./core/package-manager.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { spawnProcess } from \"./utils/child-process.ts\";\nimport { getLatestGripRelease, isNewerPackageVersion } from \"./utils/version-check.ts\";\nimport {\n\tcleanupWindowsSelfUpdateQuarantine,\n\tquarantineWindowsNativeDependencies,\n} from \"./utils/windows-self-update.ts\";\n\nexport type PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\n\ntype UpdateTarget = { type: \"all\" } | { type: \"self\" } | { type: \"extensions\"; source?: string };\n\nconst SELF_UPDATE_NOTE_MARKDOWN_THEME: MarkdownTheme = {\n\theading: (text) => chalk.bold(chalk.yellow(text)),\n\tlink: (text) => chalk.cyan(text),\n\tlinkUrl: (text) => chalk.dim(text),\n\tcode: (text) => chalk.yellow(text),\n\tcodeBlock: (text) => chalk.dim(text),\n\tcodeBlockBorder: (text) => chalk.dim(text),\n\tquote: (text) => chalk.dim(text),\n\tquoteBorder: (text) => chalk.dim(text),\n\thr: (text) => chalk.dim(text),\n\tlistBullet: (text) => chalk.yellow(text),\n\tbold: (text) => chalk.bold(text),\n\titalic: (text) => chalk.italic(text),\n\tstrikethrough: (text) => chalk.strikethrough(text),\n\tunderline: (text) => chalk.underline(text),\n};\n\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tupdateTarget?: UpdateTarget;\n\tlocal: boolean;\n\tforce: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n}\n\ntype UpdateFlag = \"self\" | \"extensions\" | \"force\";\n\ninterface PackageCommandParseState {\n\tcommand: PackageCommand;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n\tsource?: string;\n\tupdateFlags: Record<UpdateFlag, boolean>;\n\textensionFlagSource?: string;\n}\n\nconst UPDATE_FLAG_OPTIONS: ReadonlyMap<string, UpdateFlag> = new Map([\n\t[\"--self\", \"self\"],\n\t[\"--extensions\", \"extensions\"],\n\t[\"--force\", \"force\"],\n]);\n\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\n\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source|self|grip] [--self] [--extensions] [--extension <source>] [--force]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\n\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\n\nInstall a package and add it to settings.\n\nOptions:\n -l, --local Install project-locally (.grip/settings.json)\n\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https://github.com/user/repo\n ${APP_NAME} install ssh://git@github.com/user/repo\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\n\nRemove a package and its source from settings.\nAlias: ${APP_NAME} uninstall <source> [-l]\n\nOptions:\n -l, --local Remove from project settings (.grip/settings.json)\n\nExamples:\n ${APP_NAME} remove npm:@foo/bar\n ${APP_NAME} uninstall npm:@foo/bar\n`);\n\t\t\treturn;\n\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\n\nUpdate grip and installed packages.\n\nOptions:\n --self Update grip only\n --extensions Update installed packages only\n --extension <source> Update one package only\n --force Reinstall grip even if the current version is latest\n\nShort forms:\n ${APP_NAME} update Update grip and all extensions\n ${APP_NAME} update <source> Update one package\n ${APP_NAME} update grip Update grip only (self works as alias to grip)\n`);\n\t\t\treturn;\n\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\n\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\n\nfunction parsePackageCommandName(rawCommand: string | undefined): PackageCommand | undefined {\n\tif (rawCommand === \"uninstall\") return \"remove\";\n\tif (rawCommand === \"install\" || rawCommand === \"remove\" || rawCommand === \"update\" || rawCommand === \"list\") {\n\t\treturn rawCommand;\n\t}\n\treturn undefined;\n}\n\nfunction consumeExtensionOption(rest: string[], index: number, state: PackageCommandParseState): number {\n\tif (state.command !== \"update\") {\n\t\tstate.invalidOption ??= \"--extension\";\n\t\treturn index;\n\t}\n\n\tconst value = rest[index + 1];\n\tif (!value || value.startsWith(\"-\")) {\n\t\tstate.missingOptionValue ??= \"--extension\";\n\t\treturn index;\n\t}\n\tif (state.extensionFlagSource) {\n\t\tstate.conflictingOptions ??= \"--extension can only be provided once\";\n\t\treturn index + 1;\n\t}\n\tstate.extensionFlagSource = value;\n\treturn index + 1;\n}\n\nfunction recordUnrecognizedPackageArgument(arg: string, state: PackageCommandParseState): void {\n\tif (arg.startsWith(\"-\")) {\n\t\tstate.invalidOption ??= arg;\n\t\treturn;\n\t}\n\tif (!state.source) state.source = arg;\n\telse state.invalidArgument ??= arg;\n}\n\nfunction consumePackageCommandArgument(rest: string[], index: number, state: PackageCommandParseState): number {\n\tconst arg = rest[index];\n\tif (arg === \"-h\" || arg === \"--help\") {\n\t\tstate.help = true;\n\t\treturn index;\n\t}\n\tif (arg === \"-l\" || arg === \"--local\") {\n\t\tif (state.command === \"install\" || state.command === \"remove\") state.local = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\n\tconst updateFlag = UPDATE_FLAG_OPTIONS.get(arg);\n\tif (updateFlag) {\n\t\tif (state.command === \"update\") state.updateFlags[updateFlag] = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\tif (arg === \"--extension\") return consumeExtensionOption(rest, index, state);\n\trecordUnrecognizedPackageArgument(arg, state);\n\treturn index;\n}\n\nfunction resolveExtensionFlagUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tif (state.updateFlags.self || state.updateFlags.extensions) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with --self or --extensions\";\n\t}\n\tif (state.source) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with a positional source\";\n\t}\n\treturn { type: \"extensions\", source: state.extensionFlagSource };\n}\n\nfunction resolvePositionalUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tconst source = state.source!;\n\tif (source === \"self\" || source === \"grip\") {\n\t\treturn state.updateFlags.extensions ? { type: \"all\" } : { type: \"self\" };\n\t}\n\tif (state.updateFlags.extensions || state.updateFlags.self) {\n\t\tstate.conflictingOptions ??= \"positional update targets cannot be combined with --self or --extensions\";\n\t}\n\treturn { type: \"extensions\", source };\n}\n\nfunction resolveUpdateTarget(state: PackageCommandParseState): UpdateTarget | undefined {\n\tif (state.command !== \"update\") return undefined;\n\tif (state.extensionFlagSource) return resolveExtensionFlagUpdateTarget(state);\n\tif (state.source) return resolvePositionalUpdateTarget(state);\n\tif (state.updateFlags.self && state.updateFlags.extensions) return { type: \"all\" };\n\tif (state.updateFlags.self) return { type: \"self\" };\n\tif (state.updateFlags.extensions) return { type: \"extensions\" };\n\treturn { type: \"all\" };\n}\n\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [rawCommand, ...rest] = args;\n\tconst command = parsePackageCommandName(rawCommand);\n\tif (!command) return undefined;\n\n\tconst state: PackageCommandParseState = {\n\t\tcommand,\n\t\tlocal: false,\n\t\thelp: false,\n\t\tupdateFlags: { self: false, extensions: false, force: false },\n\t};\n\tfor (let index = 0; index < rest.length; index++) {\n\t\tindex = consumePackageCommandArgument(rest, index, state);\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tsource: state.source,\n\t\tupdateTarget: resolveUpdateTarget(state),\n\t\tlocal: state.local,\n\t\tforce: state.updateFlags.force,\n\t\thelp: state.help,\n\t\tinvalidOption: state.invalidOption,\n\t\tinvalidArgument: state.invalidArgument,\n\t\tmissingOptionValue: state.missingOptionValue,\n\t\tconflictingOptions: state.conflictingOptions,\n\t};\n}\n\nfunction updateTargetIncludesSelf(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"self\";\n}\n\nfunction updateTargetIncludesExtensions(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"extensions\";\n}\n\nfunction printSelfUpdateUnavailable(npmCommand?: string[]): void {\n\tconsole.error(`error: ${APP_NAME} cannot self-update this installation.`);\n\tconsole.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));\n\n\tconst entrypoint = process.argv[1];\n\tif (entrypoint) {\n\t\tconsole.error(\"\");\n\t\tconsole.error(`Location of grip executable: ${entrypoint}`);\n\t}\n}\n\nfunction printSelfUpdateFallback(command: SelfUpdateCommand): void {\n\tconsole.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));\n}\n\nfunction printPnpmSelfUpdateMetadataHint(): void {\n\tconsole.error(chalk.yellow(\"If pnpm reports missing package versions, its cached registry metadata may be stale.\"));\n\tconsole.error(chalk.yellow(`Run \\`pnpm store prune\\` and retry \\`${APP_NAME} update --self\\`.`));\n}\n\nfunction printSelfUpdateNote(note: string): void {\n\tconst trimmedNote = note.trim();\n\tif (!trimmedNote) {\n\t\treturn;\n\t}\n\n\tconsole.log();\n\tconsole.log(chalk.bold(chalk.yellow(\"Update note\")));\n\ttry {\n\t\tconst width = Math.max(20, process.stdout.columns ?? 80);\n\t\tconst renderedLines = new Markdown(trimmedNote, 0, 0, SELF_UPDATE_NOTE_MARKDOWN_THEME)\n\t\t\t.render(width)\n\t\t\t.map((line) => line.trimEnd());\n\t\tconsole.log(renderedLines.join(\"\\n\"));\n\t} catch {\n\t\tconsole.log(trimmedNote);\n\t}\n\tconsole.log();\n}\n\ninterface SelfUpdatePlan {\n\tshouldRun: boolean;\n\tnote?: string;\n}\n\nasync function getSelfUpdatePlan(force: boolean): Promise<SelfUpdatePlan> {\n\tif (force) return { shouldRun: true };\n\n\ttry {\n\t\tconst latestRelease = await getLatestGripRelease(VERSION);\n\t\tif (!latestRelease || isNewerPackageVersion(latestRelease.version, VERSION)) {\n\t\t\treturn { shouldRun: true, ...(latestRelease?.note ? { note: latestRelease.note } : {}) };\n\t\t}\n\t} catch {\n\t\treturn { shouldRun: true };\n\t}\n\n\tconsole.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));\n\treturn { shouldRun: false };\n}\nasync function runSelfUpdate(command: SelfUpdateCommand): Promise<void> {\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawnProcess(command.command, command.args, { stdio: \"inherit\" });\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"close\", (code, signal) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse if (signal) reject(new Error(`${command.display} terminated by signal ${signal}`));\n\t\t\telse reject(new Error(`${command.display} exited with code ${code ?? \"unknown\"}`));\n\t\t});\n\t});\n}\n\nfunction prepareWindowsNpmSelfUpdate(): void {\n\tif (process.platform !== \"win32\") {\n\t\treturn;\n\t}\n\n\tconst packageDir = getPackageDir();\n\tcleanupWindowsSelfUpdateQuarantine(packageDir);\n\tquarantineWindowsNativeDependencies(packageDir);\n}\n\nfunction handlePackageCommandPreflight(options: PackageCommandOptions): boolean {\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t} else if (options.missingOptionValue) {\n\t\tconsole.error(chalk.red(`Missing value for ${options.missingOptionValue}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.invalidArgument) {\n\t\tconsole.error(chalk.red(`Unexpected argument ${options.invalidArgument}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.conflictingOptions) {\n\t\tconsole.error(chalk.red(options.conflictingOptions));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if ((options.command === \"install\" || options.command === \"remove\") && !options.source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else {\n\t\treturn false;\n\t}\n\tprocess.exitCode = 1;\n\treturn true;\n}\n\nfunction printConfiguredPackage(pkg: ConfiguredPackage): void {\n\tconst display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;\n\tconsole.log(` ${display}`);\n\tif (pkg.installedPath) console.log(chalk.dim(` ${pkg.installedPath}`));\n}\n\nfunction listConfiguredPackages(packageManager: DefaultPackageManager): void {\n\tconst configuredPackages = packageManager.listConfiguredPackages();\n\tconst userPackages = configuredPackages.filter((pkg) => pkg.scope === \"user\");\n\tconst projectPackages = configuredPackages.filter((pkg) => pkg.scope === \"project\");\n\tif (configuredPackages.length === 0) {\n\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\treturn;\n\t}\n\tif (userPackages.length > 0) {\n\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\tfor (const pkg of userPackages) printConfiguredPackage(pkg);\n\t}\n\tif (projectPackages.length > 0) {\n\t\tif (userPackages.length > 0) console.log();\n\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\tfor (const pkg of projectPackages) printConfiguredPackage(pkg);\n\t}\n}\n\nasync function updateConfiguredPackages(packageManager: DefaultPackageManager, target: UpdateTarget): Promise<void> {\n\tif (!updateTargetIncludesExtensions(target)) return;\n\tconst updateSource = target.type === \"extensions\" ? target.source : undefined;\n\tawait packageManager.update(updateSource);\n\tconsole.log(chalk.green(updateSource ? `Updated ${updateSource}` : \"Updated packages\"));\n}\n\nasync function updateSelf(force: boolean, npmCommand?: string[]): Promise<void> {\n\tconst selfUpdatePlan = await getSelfUpdatePlan(force);\n\tif (!selfUpdatePlan.shouldRun) return;\n\tconst installMethod = detectInstallMethod();\n\tif (process.platform === \"win32\" && installMethod !== \"npm\" && installMethod !== \"pnpm\") {\n\t\tconsole.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));\n\t\tconsole.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, npmCommand);\n\tif (!selfUpdateCommand) {\n\t\tprintSelfUpdateUnavailable(npmCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (selfUpdatePlan.note) printSelfUpdateNote(selfUpdatePlan.note);\n\ttry {\n\t\tif (installMethod === \"npm\") prepareWindowsNpmSelfUpdate();\n\t\tawait runSelfUpdate(selfUpdateCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tif (installMethod === \"pnpm\") printPnpmSelfUpdateMetadataHint();\n\t\tprintSelfUpdateFallback(selfUpdateCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.log(chalk.green(`Updated ${APP_NAME}`));\n}\n\nasync function executePackageCommand(\n\toptions: PackageCommandOptions,\n\tpackageManager: DefaultPackageManager,\n\tselfUpdateNpmCommand: string[] | undefined,\n): Promise<boolean> {\n\tconst source = options.source;\n\tswitch (options.command) {\n\t\tcase \"install\":\n\t\t\tawait packageManager.installAndPersist(source!, { local: options.local });\n\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\treturn true;\n\t\tcase \"remove\": {\n\t\t\tconst removed = await packageManager.removeAndPersist(source!, { local: options.local });\n\t\t\tif (!removed) {\n\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\treturn true;\n\t\t}\n\t\tcase \"list\":\n\t\t\tlistConfiguredPackages(packageManager);\n\t\t\treturn true;\n\t\tcase \"update\": {\n\t\t\tconst target = options.updateTarget ?? { type: \"all\" };\n\t\t\tawait updateConfiguredPackages(packageManager, target);\n\t\t\tif (updateTargetIncludesSelf(target)) await updateSelf(options.force, selfUpdateNpmCommand);\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nexport async function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\n\tprocess.exit(0);\n}\n\nexport async function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) return false;\n\tif (handlePackageCommandPreflight(options)) return true;\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst selfUpdateNpmCommand = settingsManager.getGlobalSettings().npmCommand;\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") process.stdout.write(chalk.dim(`${event.message}\\n`));\n\t});\n\n\ttry {\n\t\treturn await executePackageCommand(options, packageManager, selfUpdateNpmCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"package-manager-cli.d.ts","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAyftE,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB1E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB3E"}
@@ -4,7 +4,9 @@ import { selectConfig } from "./cli/config-selector.js";
4
4
  import { APP_NAME, detectInstallMethod, getAgentDir, getPackageDir, getSelfUpdateCommand, getSelfUpdateUnavailableInstruction, PACKAGE_NAME, VERSION, } from "./config.js";
5
5
  import { DefaultPackageManager } from "./core/package-manager.js";
6
6
  import { SettingsManager } from "./core/settings-manager.js";
7
+ import { updateBinaryExecutable } from "./utils/binary-self-update.js";
7
8
  import { spawnProcess } from "./utils/child-process.js";
9
+ import { getGripUserAgent } from "./utils/grip-user-agent.js";
8
10
  import { getLatestGripRelease, isNewerPackageVersion } from "./utils/version-check.js";
9
11
  import { cleanupWindowsSelfUpdateQuarantine, quarantineWindowsNativeDependencies, } from "./utils/windows-self-update.js";
10
12
  const SELF_UPDATE_NOTE_MARKDOWN_THEME = {
@@ -279,8 +281,14 @@ async function getSelfUpdatePlan(force) {
279
281
  return { shouldRun: true };
280
282
  try {
281
283
  const latestRelease = await getLatestGripRelease(VERSION);
282
- if (!latestRelease || isNewerPackageVersion(latestRelease.version, VERSION)) {
283
- return { shouldRun: true, ...(latestRelease?.note ? { note: latestRelease.note } : {}) };
284
+ if (!latestRelease)
285
+ return { shouldRun: true };
286
+ if (isNewerPackageVersion(latestRelease.version, VERSION)) {
287
+ return {
288
+ shouldRun: true,
289
+ version: latestRelease.version,
290
+ ...(latestRelease.note ? { note: latestRelease.note } : {}),
291
+ };
284
292
  }
285
293
  }
286
294
  catch {
@@ -289,6 +297,25 @@ async function getSelfUpdatePlan(force) {
289
297
  console.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));
290
298
  return { shouldRun: false };
291
299
  }
300
+ async function updateBinarySelf(plan) {
301
+ if (plan.note)
302
+ printSelfUpdateNote(plan.note);
303
+ const target = plan.version ? `v${plan.version}` : "the latest release";
304
+ console.log(chalk.dim(`Updating ${APP_NAME} executable ${process.execPath} to ${target}...`));
305
+ try {
306
+ const result = await updateBinaryExecutable({
307
+ ...(plan.version ? { version: plan.version } : {}),
308
+ userAgent: getGripUserAgent(VERSION),
309
+ });
310
+ console.log(chalk.green(`Updated ${APP_NAME} (${result.executablePath})`));
311
+ }
312
+ catch (error) {
313
+ const message = error instanceof Error ? error.message : "Unknown binary update error";
314
+ console.error(chalk.red(`Error: ${message}`));
315
+ console.error(chalk.dim(getSelfUpdateUnavailableInstruction(PACKAGE_NAME)));
316
+ process.exitCode = 1;
317
+ }
318
+ }
292
319
  async function runSelfUpdate(command) {
293
320
  console.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));
294
321
  await new Promise((resolve, reject) => {
@@ -382,6 +409,10 @@ async function updateSelf(force, npmCommand) {
382
409
  if (!selfUpdatePlan.shouldRun)
383
410
  return;
384
411
  const installMethod = detectInstallMethod();
412
+ if (installMethod === "bun-binary") {
413
+ await updateBinarySelf(selfUpdatePlan);
414
+ return;
415
+ }
385
416
  if (process.platform === "win32" && installMethod !== "npm" && installMethod !== "pnpm") {
386
417
  console.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));
387
418
  console.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager-cli.js","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { Markdown, type MarkdownTheme } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { selectConfig } from \"./cli/config-selector.ts\";\nimport {\n\tAPP_NAME,\n\tdetectInstallMethod,\n\tgetAgentDir,\n\tgetPackageDir,\n\tgetSelfUpdateCommand,\n\tgetSelfUpdateUnavailableInstruction,\n\tPACKAGE_NAME,\n\ttype SelfUpdateCommand,\n\tVERSION,\n} from \"./config.ts\";\nimport { type ConfiguredPackage, DefaultPackageManager } from \"./core/package-manager.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { spawnProcess } from \"./utils/child-process.ts\";\nimport { getLatestGripRelease, isNewerPackageVersion } from \"./utils/version-check.ts\";\nimport {\n\tcleanupWindowsSelfUpdateQuarantine,\n\tquarantineWindowsNativeDependencies,\n} from \"./utils/windows-self-update.ts\";\n\nexport type PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\n\ntype UpdateTarget = { type: \"all\" } | { type: \"self\" } | { type: \"extensions\"; source?: string };\n\nconst SELF_UPDATE_NOTE_MARKDOWN_THEME: MarkdownTheme = {\n\theading: (text) => chalk.bold(chalk.yellow(text)),\n\tlink: (text) => chalk.cyan(text),\n\tlinkUrl: (text) => chalk.dim(text),\n\tcode: (text) => chalk.yellow(text),\n\tcodeBlock: (text) => chalk.dim(text),\n\tcodeBlockBorder: (text) => chalk.dim(text),\n\tquote: (text) => chalk.dim(text),\n\tquoteBorder: (text) => chalk.dim(text),\n\thr: (text) => chalk.dim(text),\n\tlistBullet: (text) => chalk.yellow(text),\n\tbold: (text) => chalk.bold(text),\n\titalic: (text) => chalk.italic(text),\n\tstrikethrough: (text) => chalk.strikethrough(text),\n\tunderline: (text) => chalk.underline(text),\n};\n\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tupdateTarget?: UpdateTarget;\n\tlocal: boolean;\n\tforce: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n}\n\ntype UpdateFlag = \"self\" | \"extensions\" | \"force\";\n\ninterface PackageCommandParseState {\n\tcommand: PackageCommand;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n\tsource?: string;\n\tupdateFlags: Record<UpdateFlag, boolean>;\n\textensionFlagSource?: string;\n}\n\nconst UPDATE_FLAG_OPTIONS: ReadonlyMap<string, UpdateFlag> = new Map([\n\t[\"--self\", \"self\"],\n\t[\"--extensions\", \"extensions\"],\n\t[\"--force\", \"force\"],\n]);\n\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\n\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source|self|grip] [--self] [--extensions] [--extension <source>] [--force]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\n\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\n\nInstall a package and add it to settings.\n\nOptions:\n -l, --local Install project-locally (.grip/settings.json)\n\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https://github.com/user/repo\n ${APP_NAME} install ssh://git@github.com/user/repo\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\n\nRemove a package and its source from settings.\nAlias: ${APP_NAME} uninstall <source> [-l]\n\nOptions:\n -l, --local Remove from project settings (.grip/settings.json)\n\nExamples:\n ${APP_NAME} remove npm:@foo/bar\n ${APP_NAME} uninstall npm:@foo/bar\n`);\n\t\t\treturn;\n\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\n\nUpdate grip and installed packages.\n\nOptions:\n --self Update grip only\n --extensions Update installed packages only\n --extension <source> Update one package only\n --force Reinstall grip even if the current version is latest\n\nShort forms:\n ${APP_NAME} update Update grip and all extensions\n ${APP_NAME} update <source> Update one package\n ${APP_NAME} update grip Update grip only (self works as alias to grip)\n`);\n\t\t\treturn;\n\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\n\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\n\nfunction parsePackageCommandName(rawCommand: string | undefined): PackageCommand | undefined {\n\tif (rawCommand === \"uninstall\") return \"remove\";\n\tif (rawCommand === \"install\" || rawCommand === \"remove\" || rawCommand === \"update\" || rawCommand === \"list\") {\n\t\treturn rawCommand;\n\t}\n\treturn undefined;\n}\n\nfunction consumeExtensionOption(rest: string[], index: number, state: PackageCommandParseState): number {\n\tif (state.command !== \"update\") {\n\t\tstate.invalidOption ??= \"--extension\";\n\t\treturn index;\n\t}\n\n\tconst value = rest[index + 1];\n\tif (!value || value.startsWith(\"-\")) {\n\t\tstate.missingOptionValue ??= \"--extension\";\n\t\treturn index;\n\t}\n\tif (state.extensionFlagSource) {\n\t\tstate.conflictingOptions ??= \"--extension can only be provided once\";\n\t\treturn index + 1;\n\t}\n\tstate.extensionFlagSource = value;\n\treturn index + 1;\n}\n\nfunction recordUnrecognizedPackageArgument(arg: string, state: PackageCommandParseState): void {\n\tif (arg.startsWith(\"-\")) {\n\t\tstate.invalidOption ??= arg;\n\t\treturn;\n\t}\n\tif (!state.source) state.source = arg;\n\telse state.invalidArgument ??= arg;\n}\n\nfunction consumePackageCommandArgument(rest: string[], index: number, state: PackageCommandParseState): number {\n\tconst arg = rest[index];\n\tif (arg === \"-h\" || arg === \"--help\") {\n\t\tstate.help = true;\n\t\treturn index;\n\t}\n\tif (arg === \"-l\" || arg === \"--local\") {\n\t\tif (state.command === \"install\" || state.command === \"remove\") state.local = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\n\tconst updateFlag = UPDATE_FLAG_OPTIONS.get(arg);\n\tif (updateFlag) {\n\t\tif (state.command === \"update\") state.updateFlags[updateFlag] = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\tif (arg === \"--extension\") return consumeExtensionOption(rest, index, state);\n\trecordUnrecognizedPackageArgument(arg, state);\n\treturn index;\n}\n\nfunction resolveExtensionFlagUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tif (state.updateFlags.self || state.updateFlags.extensions) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with --self or --extensions\";\n\t}\n\tif (state.source) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with a positional source\";\n\t}\n\treturn { type: \"extensions\", source: state.extensionFlagSource };\n}\n\nfunction resolvePositionalUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tconst source = state.source!;\n\tif (source === \"self\" || source === \"grip\") {\n\t\treturn state.updateFlags.extensions ? { type: \"all\" } : { type: \"self\" };\n\t}\n\tif (state.updateFlags.extensions || state.updateFlags.self) {\n\t\tstate.conflictingOptions ??= \"positional update targets cannot be combined with --self or --extensions\";\n\t}\n\treturn { type: \"extensions\", source };\n}\n\nfunction resolveUpdateTarget(state: PackageCommandParseState): UpdateTarget | undefined {\n\tif (state.command !== \"update\") return undefined;\n\tif (state.extensionFlagSource) return resolveExtensionFlagUpdateTarget(state);\n\tif (state.source) return resolvePositionalUpdateTarget(state);\n\tif (state.updateFlags.self && state.updateFlags.extensions) return { type: \"all\" };\n\tif (state.updateFlags.self) return { type: \"self\" };\n\tif (state.updateFlags.extensions) return { type: \"extensions\" };\n\treturn { type: \"all\" };\n}\n\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [rawCommand, ...rest] = args;\n\tconst command = parsePackageCommandName(rawCommand);\n\tif (!command) return undefined;\n\n\tconst state: PackageCommandParseState = {\n\t\tcommand,\n\t\tlocal: false,\n\t\thelp: false,\n\t\tupdateFlags: { self: false, extensions: false, force: false },\n\t};\n\tfor (let index = 0; index < rest.length; index++) {\n\t\tindex = consumePackageCommandArgument(rest, index, state);\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tsource: state.source,\n\t\tupdateTarget: resolveUpdateTarget(state),\n\t\tlocal: state.local,\n\t\tforce: state.updateFlags.force,\n\t\thelp: state.help,\n\t\tinvalidOption: state.invalidOption,\n\t\tinvalidArgument: state.invalidArgument,\n\t\tmissingOptionValue: state.missingOptionValue,\n\t\tconflictingOptions: state.conflictingOptions,\n\t};\n}\n\nfunction updateTargetIncludesSelf(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"self\";\n}\n\nfunction updateTargetIncludesExtensions(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"extensions\";\n}\n\nfunction printSelfUpdateUnavailable(npmCommand?: string[]): void {\n\tconsole.error(`error: ${APP_NAME} cannot self-update this installation.`);\n\tconsole.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));\n\n\tconst entrypoint = process.argv[1];\n\tif (entrypoint) {\n\t\tconsole.error(\"\");\n\t\tconsole.error(`Location of grip executable: ${entrypoint}`);\n\t}\n}\n\nfunction printSelfUpdateFallback(command: SelfUpdateCommand): void {\n\tconsole.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));\n}\n\nfunction printPnpmSelfUpdateMetadataHint(): void {\n\tconsole.error(chalk.yellow(\"If pnpm reports missing package versions, its cached registry metadata may be stale.\"));\n\tconsole.error(chalk.yellow(`Run \\`pnpm store prune\\` and retry \\`${APP_NAME} update --self\\`.`));\n}\n\nfunction printSelfUpdateNote(note: string): void {\n\tconst trimmedNote = note.trim();\n\tif (!trimmedNote) {\n\t\treturn;\n\t}\n\n\tconsole.log();\n\tconsole.log(chalk.bold(chalk.yellow(\"Update note\")));\n\ttry {\n\t\tconst width = Math.max(20, process.stdout.columns ?? 80);\n\t\tconst renderedLines = new Markdown(trimmedNote, 0, 0, SELF_UPDATE_NOTE_MARKDOWN_THEME)\n\t\t\t.render(width)\n\t\t\t.map((line) => line.trimEnd());\n\t\tconsole.log(renderedLines.join(\"\\n\"));\n\t} catch {\n\t\tconsole.log(trimmedNote);\n\t}\n\tconsole.log();\n}\n\ninterface SelfUpdatePlan {\n\tshouldRun: boolean;\n\tnote?: string;\n}\n\nasync function getSelfUpdatePlan(force: boolean): Promise<SelfUpdatePlan> {\n\tif (force) return { shouldRun: true };\n\n\ttry {\n\t\tconst latestRelease = await getLatestGripRelease(VERSION);\n\t\tif (!latestRelease || isNewerPackageVersion(latestRelease.version, VERSION)) {\n\t\t\treturn { shouldRun: true, ...(latestRelease?.note ? { note: latestRelease.note } : {}) };\n\t\t}\n\t} catch {\n\t\treturn { shouldRun: true };\n\t}\n\n\tconsole.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));\n\treturn { shouldRun: false };\n}\nasync function runSelfUpdate(command: SelfUpdateCommand): Promise<void> {\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawnProcess(command.command, command.args, { stdio: \"inherit\" });\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"close\", (code, signal) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse if (signal) reject(new Error(`${command.display} terminated by signal ${signal}`));\n\t\t\telse reject(new Error(`${command.display} exited with code ${code ?? \"unknown\"}`));\n\t\t});\n\t});\n}\n\nfunction prepareWindowsNpmSelfUpdate(): void {\n\tif (process.platform !== \"win32\") {\n\t\treturn;\n\t}\n\n\tconst packageDir = getPackageDir();\n\tcleanupWindowsSelfUpdateQuarantine(packageDir);\n\tquarantineWindowsNativeDependencies(packageDir);\n}\n\nfunction handlePackageCommandPreflight(options: PackageCommandOptions): boolean {\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t} else if (options.missingOptionValue) {\n\t\tconsole.error(chalk.red(`Missing value for ${options.missingOptionValue}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.invalidArgument) {\n\t\tconsole.error(chalk.red(`Unexpected argument ${options.invalidArgument}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.conflictingOptions) {\n\t\tconsole.error(chalk.red(options.conflictingOptions));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if ((options.command === \"install\" || options.command === \"remove\") && !options.source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else {\n\t\treturn false;\n\t}\n\tprocess.exitCode = 1;\n\treturn true;\n}\n\nfunction printConfiguredPackage(pkg: ConfiguredPackage): void {\n\tconst display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;\n\tconsole.log(` ${display}`);\n\tif (pkg.installedPath) console.log(chalk.dim(` ${pkg.installedPath}`));\n}\n\nfunction listConfiguredPackages(packageManager: DefaultPackageManager): void {\n\tconst configuredPackages = packageManager.listConfiguredPackages();\n\tconst userPackages = configuredPackages.filter((pkg) => pkg.scope === \"user\");\n\tconst projectPackages = configuredPackages.filter((pkg) => pkg.scope === \"project\");\n\tif (configuredPackages.length === 0) {\n\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\treturn;\n\t}\n\tif (userPackages.length > 0) {\n\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\tfor (const pkg of userPackages) printConfiguredPackage(pkg);\n\t}\n\tif (projectPackages.length > 0) {\n\t\tif (userPackages.length > 0) console.log();\n\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\tfor (const pkg of projectPackages) printConfiguredPackage(pkg);\n\t}\n}\n\nasync function updateConfiguredPackages(packageManager: DefaultPackageManager, target: UpdateTarget): Promise<void> {\n\tif (!updateTargetIncludesExtensions(target)) return;\n\tconst updateSource = target.type === \"extensions\" ? target.source : undefined;\n\tawait packageManager.update(updateSource);\n\tconsole.log(chalk.green(updateSource ? `Updated ${updateSource}` : \"Updated packages\"));\n}\n\nasync function updateSelf(force: boolean, npmCommand?: string[]): Promise<void> {\n\tconst selfUpdatePlan = await getSelfUpdatePlan(force);\n\tif (!selfUpdatePlan.shouldRun) return;\n\tconst installMethod = detectInstallMethod();\n\tif (process.platform === \"win32\" && installMethod !== \"npm\" && installMethod !== \"pnpm\") {\n\t\tconsole.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));\n\t\tconsole.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, npmCommand);\n\tif (!selfUpdateCommand) {\n\t\tprintSelfUpdateUnavailable(npmCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (selfUpdatePlan.note) printSelfUpdateNote(selfUpdatePlan.note);\n\ttry {\n\t\tif (installMethod === \"npm\") prepareWindowsNpmSelfUpdate();\n\t\tawait runSelfUpdate(selfUpdateCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tif (installMethod === \"pnpm\") printPnpmSelfUpdateMetadataHint();\n\t\tprintSelfUpdateFallback(selfUpdateCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.log(chalk.green(`Updated ${APP_NAME}`));\n}\n\nasync function executePackageCommand(\n\toptions: PackageCommandOptions,\n\tpackageManager: DefaultPackageManager,\n\tselfUpdateNpmCommand: string[] | undefined,\n): Promise<boolean> {\n\tconst source = options.source;\n\tswitch (options.command) {\n\t\tcase \"install\":\n\t\t\tawait packageManager.installAndPersist(source!, { local: options.local });\n\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\treturn true;\n\t\tcase \"remove\": {\n\t\t\tconst removed = await packageManager.removeAndPersist(source!, { local: options.local });\n\t\t\tif (!removed) {\n\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\treturn true;\n\t\t}\n\t\tcase \"list\":\n\t\t\tlistConfiguredPackages(packageManager);\n\t\t\treturn true;\n\t\tcase \"update\": {\n\t\t\tconst target = options.updateTarget ?? { type: \"all\" };\n\t\t\tawait updateConfiguredPackages(packageManager, target);\n\t\t\tif (updateTargetIncludesSelf(target)) await updateSelf(options.force, selfUpdateNpmCommand);\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nexport async function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\n\tprocess.exit(0);\n}\n\nexport async function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) return false;\n\tif (handlePackageCommandPreflight(options)) return true;\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst selfUpdateNpmCommand = settingsManager.getGlobalSettings().npmCommand;\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") process.stdout.write(chalk.dim(`${event.message}\\n`));\n\t});\n\n\ttry {\n\t\treturn await executePackageCommand(options, packageManager, selfUpdateNpmCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"package-manager-cli.js","sourceRoot":"","sources":["../src/package-manager-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,mCAAmC,EACnC,YAAY,EAEZ,OAAO,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EAA0B,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EACN,kCAAkC,EAClC,mCAAmC,GACnC,MAAM,gCAAgC,CAAC;AAMxC,MAAM,+BAA+B,GAAkB;IACtD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;CAC1C,CAAC;AA8BF,MAAM,mBAAmB,GAAoC,IAAI,GAAG,CAAC;IACpE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,cAAc,EAAE,YAAY,CAAC;IAC9B,CAAC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,eAAgC,EAAE,OAAe;IAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAC7C,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,OAAO,KAAK,KAAK,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACtD,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,SAAS;YACb,OAAO,GAAG,QAAQ,wBAAwB,CAAC;QAC5C,KAAK,QAAQ;YACZ,OAAO,GAAG,QAAQ,uBAAuB,CAAC;QAC3C,KAAK,QAAQ;YACZ,OAAO,GAAG,QAAQ,qFAAqF,CAAC;QACzG,KAAK,MAAM;YACV,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC5B,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAuB;IACvD,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,SAAS;YACb,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,SAAS,CAAC;;;;;;;;IAQjC,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,QAAQ;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,QAAQ,CAAC;;;SAG3B,QAAQ;;;;;;IAMb,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,QAAQ;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,QAAQ,CAAC;;;;;;;;;;;IAWhC,QAAQ;IACR,QAAQ;IACR,QAAQ;CACX,CAAC,CAAC;YACA,OAAO;QAER,KAAK,MAAM;YACV,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC,sBAAsB,CAAC,MAAM,CAAC;;;CAGjC,CAAC,CAAC;YACA,OAAO;IACT,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,UAA8B;IAC9D,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC7G,OAAO,UAAU,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAc,EAAE,KAAa,EAAE,KAA+B;IAC7F,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,aAAa,KAAK,aAAa,CAAC;QACtC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,kBAAkB,KAAK,aAAa,CAAC;QAC3C,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/B,KAAK,CAAC,kBAAkB,KAAK,uCAAuC,CAAC;QACrE,OAAO,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC;IAClC,OAAO,KAAK,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,iCAAiC,CAAC,GAAW,EAAE,KAA+B;IACtF,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QAC5B,OAAO;IACR,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;;QACjC,KAAK,CAAC,eAAe,KAAK,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,6BAA6B,CAAC,IAAc,EAAE,KAAa,EAAE,KAA+B;IACpG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;;YAC7E,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;;YAChE,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,GAAG,KAAK,aAAa;QAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7E,iCAAiC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gCAAgC,CAAC,KAA+B;IACxE,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5D,KAAK,CAAC,kBAAkB,KAAK,4DAA4D,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,kBAAkB,KAAK,yDAAyD,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,6BAA6B,CAAC,KAA+B;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAO,CAAC;IAC7B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1E,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC5D,KAAK,CAAC,kBAAkB,KAAK,0EAA0E,CAAC;IACzG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+B;IAC3D,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,KAAK,CAAC,mBAAmB;QAAE,OAAO,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnF,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IAC1C,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,KAAK,GAA6B;QACvC,OAAO;QACP,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;KAC7D,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,KAAK,GAAG,6BAA6B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACN,OAAO;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC5C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAoB;IACrD,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AACxD,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAoB;IAC3D,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;AAC9D,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAqB;IACxD,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,wCAAwC,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA0B;IAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,+BAA+B;IACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sFAAsF,CAAC,CAAC,CAAC;IACpH,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,QAAQ,mBAAmB,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO;IACR,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;aACpF,MAAM,CAAC,KAAK,CAAC;aACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAQD,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,qBAAqB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACN,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,aAAa,CAAC,OAAO;gBAC9B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC;QACH,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,4BAA4B,OAAO,GAAG,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACnD,IAAI,IAAI,CAAC,IAAI;QAAE,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,eAAe,OAAO,CAAC,QAAQ,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;IAC9F,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,QAAQ,KAAK,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AACD,KAAK,UAAU,aAAa,CAAC,OAA0B;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,SAAS,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;iBACrB,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,yBAAyB,MAAM,EAAE,CAAC,CAAC,CAAC;;gBACnF,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,qBAAqB,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,kCAAkC,CAAC,UAAU,CAAC,CAAC;IAC/C,mCAAmC,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,6BAA6B,CAAC,OAA8B;IACpE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,aAAa,SAAS,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,QAAQ,gBAAgB,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,CAAC;SAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/F,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAsB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAqC;IACpE,MAAM,kBAAkB,GAAG,cAAc,CAAC,sBAAsB,EAAE,CAAC;IACnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IACpF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjD,OAAO;IACR,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,YAAY;YAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,eAAe;YAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,cAAqC,EAAE,MAAoB;IAClG,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC;QAAE,OAAO;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,YAAY,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAc,EAAE,UAAqB;IAC9D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,SAAS;QAAE,OAAO;IACtC,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;IAC5C,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,sEAAsE,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,aAAa,YAAY,QAAQ,YAAY,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxB,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,IAAI,cAAc,CAAC,IAAI;QAAE,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,CAAC;QACJ,IAAI,aAAa,KAAK,KAAK;YAAE,2BAA2B,EAAE,CAAC;QAC3D,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,aAAa,KAAK,MAAM;YAAE,+BAA+B,EAAE,CAAC;QAChE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,OAA8B,EAC9B,cAAqC,EACrC,oBAA0C;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,SAAS;YACb,MAAM,cAAc,CAAC,iBAAiB,CAAC,MAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACb,KAAK,QAAQ,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,MAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACb,CAAC;QACD,KAAK,MAAM;YACV,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACb,KAAK,QAAQ,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACvD,MAAM,wBAAwB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,wBAAwB,CAAC,MAAM,CAAC;gBAAE,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAc;IACvD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,oBAAoB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IAErD,MAAM,YAAY,CAAC;QAClB,aAAa;QACb,eAAe;QACf,GAAG;QACH,QAAQ;KACR,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAc;IACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,6BAA6B,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,oBAAoB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACzD,MAAM,oBAAoB,GAAG,eAAe,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,cAAc,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,OAAO,MAAM,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC","sourcesContent":["import { Markdown, type MarkdownTheme } from \"@greppleai/grip-tui\";\nimport chalk from \"chalk\";\nimport { selectConfig } from \"./cli/config-selector.ts\";\nimport {\n\tAPP_NAME,\n\tdetectInstallMethod,\n\tgetAgentDir,\n\tgetPackageDir,\n\tgetSelfUpdateCommand,\n\tgetSelfUpdateUnavailableInstruction,\n\tPACKAGE_NAME,\n\ttype SelfUpdateCommand,\n\tVERSION,\n} from \"./config.ts\";\nimport { type ConfiguredPackage, DefaultPackageManager } from \"./core/package-manager.ts\";\nimport { SettingsManager } from \"./core/settings-manager.ts\";\nimport { updateBinaryExecutable } from \"./utils/binary-self-update.ts\";\nimport { spawnProcess } from \"./utils/child-process.ts\";\nimport { getGripUserAgent } from \"./utils/grip-user-agent.ts\";\nimport { getLatestGripRelease, isNewerPackageVersion } from \"./utils/version-check.ts\";\nimport {\n\tcleanupWindowsSelfUpdateQuarantine,\n\tquarantineWindowsNativeDependencies,\n} from \"./utils/windows-self-update.ts\";\n\nexport type PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\n\ntype UpdateTarget = { type: \"all\" } | { type: \"self\" } | { type: \"extensions\"; source?: string };\n\nconst SELF_UPDATE_NOTE_MARKDOWN_THEME: MarkdownTheme = {\n\theading: (text) => chalk.bold(chalk.yellow(text)),\n\tlink: (text) => chalk.cyan(text),\n\tlinkUrl: (text) => chalk.dim(text),\n\tcode: (text) => chalk.yellow(text),\n\tcodeBlock: (text) => chalk.dim(text),\n\tcodeBlockBorder: (text) => chalk.dim(text),\n\tquote: (text) => chalk.dim(text),\n\tquoteBorder: (text) => chalk.dim(text),\n\thr: (text) => chalk.dim(text),\n\tlistBullet: (text) => chalk.yellow(text),\n\tbold: (text) => chalk.bold(text),\n\titalic: (text) => chalk.italic(text),\n\tstrikethrough: (text) => chalk.strikethrough(text),\n\tunderline: (text) => chalk.underline(text),\n};\n\ninterface PackageCommandOptions {\n\tcommand: PackageCommand;\n\tsource?: string;\n\tupdateTarget?: UpdateTarget;\n\tlocal: boolean;\n\tforce: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n}\n\ntype UpdateFlag = \"self\" | \"extensions\" | \"force\";\n\ninterface PackageCommandParseState {\n\tcommand: PackageCommand;\n\tlocal: boolean;\n\thelp: boolean;\n\tinvalidOption?: string;\n\tinvalidArgument?: string;\n\tmissingOptionValue?: string;\n\tconflictingOptions?: string;\n\tsource?: string;\n\tupdateFlags: Record<UpdateFlag, boolean>;\n\textensionFlagSource?: string;\n}\n\nconst UPDATE_FLAG_OPTIONS: ReadonlyMap<string, UpdateFlag> = new Map([\n\t[\"--self\", \"self\"],\n\t[\"--extensions\", \"extensions\"],\n\t[\"--force\", \"force\"],\n]);\n\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\n\tconst errors = settingsManager.drainErrors();\n\tfor (const { scope, error } of errors) {\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\n\t\tif (error.stack) {\n\t\t\tconsole.error(chalk.dim(error.stack));\n\t\t}\n\t}\n}\n\nfunction getPackageCommandUsage(command: PackageCommand): string {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\n\t\tcase \"remove\":\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\n\t\tcase \"update\":\n\t\t\treturn `${APP_NAME} update [source|self|grip] [--self] [--extensions] [--extension <source>] [--force]`;\n\t\tcase \"list\":\n\t\t\treturn `${APP_NAME} list`;\n\t}\n}\n\nfunction printPackageCommandHelp(command: PackageCommand): void {\n\tswitch (command) {\n\t\tcase \"install\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"install\")}\n\nInstall a package and add it to settings.\n\nOptions:\n -l, --local Install project-locally (.grip/settings.json)\n\nExamples:\n ${APP_NAME} install npm:@foo/bar\n ${APP_NAME} install git:github.com/user/repo\n ${APP_NAME} install git:git@github.com:user/repo\n ${APP_NAME} install https://github.com/user/repo\n ${APP_NAME} install ssh://git@github.com/user/repo\n ${APP_NAME} install ./local/path\n`);\n\t\t\treturn;\n\n\t\tcase \"remove\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"remove\")}\n\nRemove a package and its source from settings.\nAlias: ${APP_NAME} uninstall <source> [-l]\n\nOptions:\n -l, --local Remove from project settings (.grip/settings.json)\n\nExamples:\n ${APP_NAME} remove npm:@foo/bar\n ${APP_NAME} uninstall npm:@foo/bar\n`);\n\t\t\treturn;\n\n\t\tcase \"update\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"update\")}\n\nUpdate grip and installed packages.\n\nOptions:\n --self Update grip only\n --extensions Update installed packages only\n --extension <source> Update one package only\n --force Reinstall grip even if the current version is latest\n\nShort forms:\n ${APP_NAME} update Update grip and all extensions\n ${APP_NAME} update <source> Update one package\n ${APP_NAME} update grip Update grip only (self works as alias to grip)\n`);\n\t\t\treturn;\n\n\t\tcase \"list\":\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\n ${getPackageCommandUsage(\"list\")}\n\nList installed packages from user and project settings.\n`);\n\t\t\treturn;\n\t}\n}\n\nfunction parsePackageCommandName(rawCommand: string | undefined): PackageCommand | undefined {\n\tif (rawCommand === \"uninstall\") return \"remove\";\n\tif (rawCommand === \"install\" || rawCommand === \"remove\" || rawCommand === \"update\" || rawCommand === \"list\") {\n\t\treturn rawCommand;\n\t}\n\treturn undefined;\n}\n\nfunction consumeExtensionOption(rest: string[], index: number, state: PackageCommandParseState): number {\n\tif (state.command !== \"update\") {\n\t\tstate.invalidOption ??= \"--extension\";\n\t\treturn index;\n\t}\n\n\tconst value = rest[index + 1];\n\tif (!value || value.startsWith(\"-\")) {\n\t\tstate.missingOptionValue ??= \"--extension\";\n\t\treturn index;\n\t}\n\tif (state.extensionFlagSource) {\n\t\tstate.conflictingOptions ??= \"--extension can only be provided once\";\n\t\treturn index + 1;\n\t}\n\tstate.extensionFlagSource = value;\n\treturn index + 1;\n}\n\nfunction recordUnrecognizedPackageArgument(arg: string, state: PackageCommandParseState): void {\n\tif (arg.startsWith(\"-\")) {\n\t\tstate.invalidOption ??= arg;\n\t\treturn;\n\t}\n\tif (!state.source) state.source = arg;\n\telse state.invalidArgument ??= arg;\n}\n\nfunction consumePackageCommandArgument(rest: string[], index: number, state: PackageCommandParseState): number {\n\tconst arg = rest[index];\n\tif (arg === \"-h\" || arg === \"--help\") {\n\t\tstate.help = true;\n\t\treturn index;\n\t}\n\tif (arg === \"-l\" || arg === \"--local\") {\n\t\tif (state.command === \"install\" || state.command === \"remove\") state.local = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\n\tconst updateFlag = UPDATE_FLAG_OPTIONS.get(arg);\n\tif (updateFlag) {\n\t\tif (state.command === \"update\") state.updateFlags[updateFlag] = true;\n\t\telse state.invalidOption ??= arg;\n\t\treturn index;\n\t}\n\tif (arg === \"--extension\") return consumeExtensionOption(rest, index, state);\n\trecordUnrecognizedPackageArgument(arg, state);\n\treturn index;\n}\n\nfunction resolveExtensionFlagUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tif (state.updateFlags.self || state.updateFlags.extensions) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with --self or --extensions\";\n\t}\n\tif (state.source) {\n\t\tstate.conflictingOptions ??= \"--extension cannot be combined with a positional source\";\n\t}\n\treturn { type: \"extensions\", source: state.extensionFlagSource };\n}\n\nfunction resolvePositionalUpdateTarget(state: PackageCommandParseState): UpdateTarget {\n\tconst source = state.source!;\n\tif (source === \"self\" || source === \"grip\") {\n\t\treturn state.updateFlags.extensions ? { type: \"all\" } : { type: \"self\" };\n\t}\n\tif (state.updateFlags.extensions || state.updateFlags.self) {\n\t\tstate.conflictingOptions ??= \"positional update targets cannot be combined with --self or --extensions\";\n\t}\n\treturn { type: \"extensions\", source };\n}\n\nfunction resolveUpdateTarget(state: PackageCommandParseState): UpdateTarget | undefined {\n\tif (state.command !== \"update\") return undefined;\n\tif (state.extensionFlagSource) return resolveExtensionFlagUpdateTarget(state);\n\tif (state.source) return resolvePositionalUpdateTarget(state);\n\tif (state.updateFlags.self && state.updateFlags.extensions) return { type: \"all\" };\n\tif (state.updateFlags.self) return { type: \"self\" };\n\tif (state.updateFlags.extensions) return { type: \"extensions\" };\n\treturn { type: \"all\" };\n}\n\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\n\tconst [rawCommand, ...rest] = args;\n\tconst command = parsePackageCommandName(rawCommand);\n\tif (!command) return undefined;\n\n\tconst state: PackageCommandParseState = {\n\t\tcommand,\n\t\tlocal: false,\n\t\thelp: false,\n\t\tupdateFlags: { self: false, extensions: false, force: false },\n\t};\n\tfor (let index = 0; index < rest.length; index++) {\n\t\tindex = consumePackageCommandArgument(rest, index, state);\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tsource: state.source,\n\t\tupdateTarget: resolveUpdateTarget(state),\n\t\tlocal: state.local,\n\t\tforce: state.updateFlags.force,\n\t\thelp: state.help,\n\t\tinvalidOption: state.invalidOption,\n\t\tinvalidArgument: state.invalidArgument,\n\t\tmissingOptionValue: state.missingOptionValue,\n\t\tconflictingOptions: state.conflictingOptions,\n\t};\n}\n\nfunction updateTargetIncludesSelf(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"self\";\n}\n\nfunction updateTargetIncludesExtensions(target: UpdateTarget): boolean {\n\treturn target.type === \"all\" || target.type === \"extensions\";\n}\n\nfunction printSelfUpdateUnavailable(npmCommand?: string[]): void {\n\tconsole.error(`error: ${APP_NAME} cannot self-update this installation.`);\n\tconsole.error(getSelfUpdateUnavailableInstruction(PACKAGE_NAME, npmCommand));\n\n\tconst entrypoint = process.argv[1];\n\tif (entrypoint) {\n\t\tconsole.error(\"\");\n\t\tconsole.error(`Location of grip executable: ${entrypoint}`);\n\t}\n}\n\nfunction printSelfUpdateFallback(command: SelfUpdateCommand): void {\n\tconsole.error(chalk.dim(`If this keeps failing, run this command yourself: ${command.display}`));\n}\n\nfunction printPnpmSelfUpdateMetadataHint(): void {\n\tconsole.error(chalk.yellow(\"If pnpm reports missing package versions, its cached registry metadata may be stale.\"));\n\tconsole.error(chalk.yellow(`Run \\`pnpm store prune\\` and retry \\`${APP_NAME} update --self\\`.`));\n}\n\nfunction printSelfUpdateNote(note: string): void {\n\tconst trimmedNote = note.trim();\n\tif (!trimmedNote) {\n\t\treturn;\n\t}\n\n\tconsole.log();\n\tconsole.log(chalk.bold(chalk.yellow(\"Update note\")));\n\ttry {\n\t\tconst width = Math.max(20, process.stdout.columns ?? 80);\n\t\tconst renderedLines = new Markdown(trimmedNote, 0, 0, SELF_UPDATE_NOTE_MARKDOWN_THEME)\n\t\t\t.render(width)\n\t\t\t.map((line) => line.trimEnd());\n\t\tconsole.log(renderedLines.join(\"\\n\"));\n\t} catch {\n\t\tconsole.log(trimmedNote);\n\t}\n\tconsole.log();\n}\n\ninterface SelfUpdatePlan {\n\tshouldRun: boolean;\n\tversion?: string;\n\tnote?: string;\n}\n\nasync function getSelfUpdatePlan(force: boolean): Promise<SelfUpdatePlan> {\n\tif (force) return { shouldRun: true };\n\n\ttry {\n\t\tconst latestRelease = await getLatestGripRelease(VERSION);\n\t\tif (!latestRelease) return { shouldRun: true };\n\t\tif (isNewerPackageVersion(latestRelease.version, VERSION)) {\n\t\t\treturn {\n\t\t\t\tshouldRun: true,\n\t\t\t\tversion: latestRelease.version,\n\t\t\t\t...(latestRelease.note ? { note: latestRelease.note } : {}),\n\t\t\t};\n\t\t}\n\t} catch {\n\t\treturn { shouldRun: true };\n\t}\n\n\tconsole.log(chalk.green(`${APP_NAME} is already up to date (v${VERSION})`));\n\treturn { shouldRun: false };\n}\n\nasync function updateBinarySelf(plan: SelfUpdatePlan): Promise<void> {\n\tif (plan.note) printSelfUpdateNote(plan.note);\n\tconst target = plan.version ? `v${plan.version}` : \"the latest release\";\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} executable ${process.execPath} to ${target}...`));\n\ttry {\n\t\tconst result = await updateBinaryExecutable({\n\t\t\t...(plan.version ? { version: plan.version } : {}),\n\t\t\tuserAgent: getGripUserAgent(VERSION),\n\t\t});\n\t\tconsole.log(chalk.green(`Updated ${APP_NAME} (${result.executablePath})`));\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown binary update error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tconsole.error(chalk.dim(getSelfUpdateUnavailableInstruction(PACKAGE_NAME)));\n\t\tprocess.exitCode = 1;\n\t}\n}\nasync function runSelfUpdate(command: SelfUpdateCommand): Promise<void> {\n\tconsole.log(chalk.dim(`Updating ${APP_NAME} with ${command.display}...`));\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst child = spawnProcess(command.command, command.args, { stdio: \"inherit\" });\n\t\tchild.on(\"error\", reject);\n\t\tchild.on(\"close\", (code, signal) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse if (signal) reject(new Error(`${command.display} terminated by signal ${signal}`));\n\t\t\telse reject(new Error(`${command.display} exited with code ${code ?? \"unknown\"}`));\n\t\t});\n\t});\n}\n\nfunction prepareWindowsNpmSelfUpdate(): void {\n\tif (process.platform !== \"win32\") {\n\t\treturn;\n\t}\n\n\tconst packageDir = getPackageDir();\n\tcleanupWindowsSelfUpdateQuarantine(packageDir);\n\tquarantineWindowsNativeDependencies(packageDir);\n}\n\nfunction handlePackageCommandPreflight(options: PackageCommandOptions): boolean {\n\tif (options.help) {\n\t\tprintPackageCommandHelp(options.command);\n\t\treturn true;\n\t}\n\tif (options.invalidOption) {\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\n\t} else if (options.missingOptionValue) {\n\t\tconsole.error(chalk.red(`Missing value for ${options.missingOptionValue}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.invalidArgument) {\n\t\tconsole.error(chalk.red(`Unexpected argument ${options.invalidArgument}.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if (options.conflictingOptions) {\n\t\tconsole.error(chalk.red(options.conflictingOptions));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else if ((options.command === \"install\" || options.command === \"remove\") && !options.source) {\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\n\t} else {\n\t\treturn false;\n\t}\n\tprocess.exitCode = 1;\n\treturn true;\n}\n\nfunction printConfiguredPackage(pkg: ConfiguredPackage): void {\n\tconst display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;\n\tconsole.log(` ${display}`);\n\tif (pkg.installedPath) console.log(chalk.dim(` ${pkg.installedPath}`));\n}\n\nfunction listConfiguredPackages(packageManager: DefaultPackageManager): void {\n\tconst configuredPackages = packageManager.listConfiguredPackages();\n\tconst userPackages = configuredPackages.filter((pkg) => pkg.scope === \"user\");\n\tconst projectPackages = configuredPackages.filter((pkg) => pkg.scope === \"project\");\n\tif (configuredPackages.length === 0) {\n\t\tconsole.log(chalk.dim(\"No packages installed.\"));\n\t\treturn;\n\t}\n\tif (userPackages.length > 0) {\n\t\tconsole.log(chalk.bold(\"User packages:\"));\n\t\tfor (const pkg of userPackages) printConfiguredPackage(pkg);\n\t}\n\tif (projectPackages.length > 0) {\n\t\tif (userPackages.length > 0) console.log();\n\t\tconsole.log(chalk.bold(\"Project packages:\"));\n\t\tfor (const pkg of projectPackages) printConfiguredPackage(pkg);\n\t}\n}\n\nasync function updateConfiguredPackages(packageManager: DefaultPackageManager, target: UpdateTarget): Promise<void> {\n\tif (!updateTargetIncludesExtensions(target)) return;\n\tconst updateSource = target.type === \"extensions\" ? target.source : undefined;\n\tawait packageManager.update(updateSource);\n\tconsole.log(chalk.green(updateSource ? `Updated ${updateSource}` : \"Updated packages\"));\n}\n\nasync function updateSelf(force: boolean, npmCommand?: string[]): Promise<void> {\n\tconst selfUpdatePlan = await getSelfUpdatePlan(force);\n\tif (!selfUpdatePlan.shouldRun) return;\n\tconst installMethod = detectInstallMethod();\n\tif (installMethod === \"bun-binary\") {\n\t\tawait updateBinarySelf(selfUpdatePlan);\n\t\treturn;\n\t}\n\tif (process.platform === \"win32\" && installMethod !== \"npm\" && installMethod !== \"pnpm\") {\n\t\tconsole.error(chalk.red(`${APP_NAME} self-update on Windows is only supported for npm and pnpm installs.`));\n\t\tconsole.error(chalk.dim(`Detected install method: ${installMethod}. Update ${APP_NAME} manually.`));\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst selfUpdateCommand = getSelfUpdateCommand(PACKAGE_NAME, npmCommand);\n\tif (!selfUpdateCommand) {\n\t\tprintSelfUpdateUnavailable(npmCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (selfUpdatePlan.note) printSelfUpdateNote(selfUpdatePlan.note);\n\ttry {\n\t\tif (installMethod === \"npm\") prepareWindowsNpmSelfUpdate();\n\t\tawait runSelfUpdate(selfUpdateCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tif (installMethod === \"pnpm\") printPnpmSelfUpdateMetadataHint();\n\t\tprintSelfUpdateFallback(selfUpdateCommand);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.log(chalk.green(`Updated ${APP_NAME}`));\n}\n\nasync function executePackageCommand(\n\toptions: PackageCommandOptions,\n\tpackageManager: DefaultPackageManager,\n\tselfUpdateNpmCommand: string[] | undefined,\n): Promise<boolean> {\n\tconst source = options.source;\n\tswitch (options.command) {\n\t\tcase \"install\":\n\t\t\tawait packageManager.installAndPersist(source!, { local: options.local });\n\t\t\tconsole.log(chalk.green(`Installed ${source}`));\n\t\t\treturn true;\n\t\tcase \"remove\": {\n\t\t\tconst removed = await packageManager.removeAndPersist(source!, { local: options.local });\n\t\t\tif (!removed) {\n\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`Removed ${source}`));\n\t\t\treturn true;\n\t\t}\n\t\tcase \"list\":\n\t\t\tlistConfiguredPackages(packageManager);\n\t\t\treturn true;\n\t\tcase \"update\": {\n\t\t\tconst target = options.updateTarget ?? { type: \"all\" };\n\t\t\tawait updateConfiguredPackages(packageManager, target);\n\t\t\tif (updateTargetIncludesSelf(target)) await updateSelf(options.force, selfUpdateNpmCommand);\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nexport async function handleConfigCommand(args: string[]): Promise<boolean> {\n\tif (args[0] !== \"config\") {\n\t\treturn false;\n\t}\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"config command\");\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tconst resolvedPaths = await packageManager.resolve();\n\n\tawait selectConfig({\n\t\tresolvedPaths,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tagentDir,\n\t});\n\n\tprocess.exit(0);\n}\n\nexport async function handlePackageCommand(args: string[]): Promise<boolean> {\n\tconst options = parsePackageCommand(args);\n\tif (!options) return false;\n\tif (handlePackageCommandPreflight(options)) return true;\n\n\tconst cwd = process.cwd();\n\tconst agentDir = getAgentDir();\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\n\treportSettingsErrors(settingsManager, \"package command\");\n\tconst selfUpdateNpmCommand = settingsManager.getGlobalSettings().npmCommand;\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\n\tpackageManager.setProgressCallback((event) => {\n\t\tif (event.type === \"start\") process.stdout.write(chalk.dim(`${event.message}\\n`));\n\t});\n\n\ttry {\n\t\treturn await executePackageCommand(options, packageManager, selfUpdateNpmCommand);\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\n\t\tconsole.error(chalk.red(`Error: ${message}`));\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AAgDA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc/C","sourcesContent":["/*\n * Portions of this file are derived from:\n * - ansi-regex (https://github.com/chalk/ansi-regex)\n * - strip-ansi (https://github.com/chalk/strip-ansi)\n *\n * MIT License\n *\n * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\ninterface AnsiRegexOptions {\n\tonlyFirst?: boolean;\n}\n\nfunction ansiRegex({ onlyFirst = false }: AnsiRegexOptions = {}): RegExp {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = \"(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)\";\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]\";\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : \"g\");\n}\n\nconst regex = ansiRegex();\n\nexport function stripAnsi(value: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof value}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!value.includes(\"\\u001B\") && !value.includes(\"\\u009B\")) {\n\t\treturn value;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn value.replace(regex, \"\");\n}\n"]}
1
+ {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AAgDA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AA+BA,SAAS,SAAS,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,GAAqB,EAAE,EAAU;IACxE,4DAA4D;IAC5D,MAAM,EAAE,GAAG,oCAAoC,CAAC;IAEhD,mEAAmE;IACnE,MAAM,GAAG,GAAG,0BAA0B,EAAE,GAAG,CAAC;IAE5C,sGAAsG;IACtG,MAAM,GAAG,GAAG,oFAAoF,CAAC;IAEjG,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,CACxD;AAED,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;AAE1B,MAAM,UAAU,SAAS,CAAC,KAAa,EAAU;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,gCAAgC,OAAO,KAAK,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,mDAAmD;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAAA,CAChC","sourcesContent":["/*\n * Portions of this file are derived from:\n * - ansi-regex (https://github.com/chalk/ansi-regex)\n * - strip-ansi (https://github.com/chalk/strip-ansi)\n *\n * MIT License\n *\n * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\ninterface AnsiRegexOptions {\n\tonlyFirst?: boolean;\n}\n\nfunction ansiRegex({ onlyFirst = false }: AnsiRegexOptions = {}): RegExp {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = \"(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)\";\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]\";\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : \"g\");\n}\n\nconst regex = ansiRegex();\n\nexport function stripAnsi(value: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof value}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!value.includes(\"\\u001B\") && !value.includes(\"\\u009B\")) {\n\t\treturn value;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn value.replace(regex, \"\");\n}\n"]}
1
+ {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/utils/ansi.ts"],"names":[],"mappings":"AA+BA,SAAS,SAAS,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,GAAqB,EAAE;IAC9D,4DAA4D;IAC5D,MAAM,EAAE,GAAG,oCAAoC,CAAC;IAEhD,mEAAmE;IACnE,MAAM,GAAG,GAAG,0BAA0B,EAAE,GAAG,CAAC;IAE5C,sGAAsG;IACtG,MAAM,GAAG,GAAG,oFAAoF,CAAC;IAEjG,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;AAE1B,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,gCAAgC,OAAO,KAAK,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,mDAAmD;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC","sourcesContent":["/*\n * Portions of this file are derived from:\n * - ansi-regex (https://github.com/chalk/ansi-regex)\n * - strip-ansi (https://github.com/chalk/strip-ansi)\n *\n * MIT License\n *\n * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\ninterface AnsiRegexOptions {\n\tonlyFirst?: boolean;\n}\n\nfunction ansiRegex({ onlyFirst = false }: AnsiRegexOptions = {}): RegExp {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = \"(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)\";\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]\";\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : \"g\");\n}\n\nconst regex = ansiRegex();\n\nexport function stripAnsi(value: string): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof value}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!value.includes(\"\\u001B\") && !value.includes(\"\\u009B\")) {\n\t\treturn value;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn value.replace(regex, \"\");\n}\n"]}
@@ -0,0 +1,25 @@
1
+ export interface BinarySelfUpdateOptions {
2
+ /** Release version without the `v` prefix. Uses the latest release when omitted. */
3
+ version?: string;
4
+ /** Executable to replace. Defaults to `process.execPath`. */
5
+ executablePath?: string;
6
+ platform?: NodeJS.Platform;
7
+ arch?: string;
8
+ /** Release base URL. Defaults to `GRIP_RELEASE_BASE_URL` or the GitHub releases URL. */
9
+ releaseBaseUrl?: string;
10
+ userAgent?: string;
11
+ fetch?: typeof fetch;
12
+ }
13
+ export interface BinarySelfUpdateResult {
14
+ executablePath: string;
15
+ assetUrl: string;
16
+ }
17
+ export declare function getBinaryReleaseAssetName(platform: NodeJS.Platform, arch: string): string | undefined;
18
+ /**
19
+ * Download the release executable for this platform, verify its SHA-256 checksum, and atomically
20
+ * replace the running executable. Mirrors install.sh / install.ps1.
21
+ */
22
+ export declare function updateBinaryExecutable(options?: BinarySelfUpdateOptions): Promise<BinarySelfUpdateResult>;
23
+ /** Remove executables that a Windows binary update moved aside while they were still running. */
24
+ export declare function cleanupWindowsBinarySelfUpdateLeftovers(executablePath?: string): Promise<void>;
25
+ //# sourceMappingURL=binary-self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-self-update.d.ts","sourceRoot":"","sources":["../../src/utils/binary-self-update.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,uBAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrG;AA+FD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0BnH;AAED,iGAAiG;AACjG,wBAAsB,uCAAuC,CAC5D,cAAc,GAAE,MAAyB,GACvC,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,159 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { createWriteStream } from "node:fs";
3
+ import { access, chmod, constants, lstat, mkdtemp, readdir, realpath, rename, rm, stat } from "node:fs/promises";
4
+ import { basename, dirname, join } from "node:path";
5
+ import { Readable, Transform } from "node:stream";
6
+ import { pipeline } from "node:stream/promises";
7
+ const DEFAULT_RELEASE_BASE_URL = "https://github.com/greppleai/grip/releases";
8
+ const TEMP_DIR_PREFIX = ".grip-update.";
9
+ const WINDOWS_PREVIOUS_SUFFIX = ".grip-previous-";
10
+ const CHECKSUM_TIMEOUT_MS = 30_000;
11
+ const BINARY_TIMEOUT_MS = 10 * 60_000;
12
+ export function getBinaryReleaseAssetName(platform, arch) {
13
+ const os = platform === "darwin" ? "darwin" : platform === "linux" ? "linux" : platform === "win32" ? "windows" : "";
14
+ const cpu = arch === "x64" ? "x64" : arch === "arm64" ? "arm64" : "";
15
+ if (!os || !cpu)
16
+ return undefined;
17
+ return `grip-${os}-${cpu}${os === "windows" ? ".exe" : ""}`;
18
+ }
19
+ function resolveReleaseBaseUrl(override) {
20
+ const base = (override ?? process.env.GRIP_RELEASE_BASE_URL ?? DEFAULT_RELEASE_BASE_URL).replace(/\/+$/, "");
21
+ let url;
22
+ try {
23
+ url = new URL(base);
24
+ }
25
+ catch {
26
+ throw new Error(`Invalid release URL: ${base}`);
27
+ }
28
+ const loopback = url.protocol === "http:" && (url.hostname === "127.0.0.1" || url.hostname === "localhost");
29
+ if (url.protocol !== "https:" && !loopback) {
30
+ throw new Error("Release URL must be HTTPS (or loopback for tests)");
31
+ }
32
+ if (url.search || url.hash || base.includes(".."))
33
+ throw new Error(`Invalid release URL: ${base}`);
34
+ return base;
35
+ }
36
+ function getReleaseDownloadUrl(base, version) {
37
+ if (!version)
38
+ return `${base}/latest/download`;
39
+ const tag = version.startsWith("v") ? version : `v${version}`;
40
+ if (!/^v\d[0-9A-Za-z.+-]*$/.test(tag))
41
+ throw new Error(`Invalid release version: ${version}`);
42
+ return `${base}/download/${tag}`;
43
+ }
44
+ function parseChecksum(content, asset) {
45
+ for (const line of content.split(/\r?\n/)) {
46
+ const match = line.trim().match(/^([a-fA-F0-9]{64})\s+\*?(.+)$/);
47
+ if (match && match[2] === asset)
48
+ return match[1].toLowerCase();
49
+ }
50
+ throw new Error(`Missing or invalid SHA-256 checksum for ${asset}`);
51
+ }
52
+ async function fetchOk(fetchImpl, url, userAgent, timeoutMs) {
53
+ const response = await fetchImpl(url, {
54
+ headers: { "User-Agent": userAgent },
55
+ redirect: "follow",
56
+ signal: AbortSignal.timeout(timeoutMs),
57
+ });
58
+ if (!response.ok) {
59
+ const hint = response.status === 404 ? " (is this release published for your platform yet?)" : "";
60
+ throw new Error(`Download failed: ${url} returned HTTP ${response.status}${hint}`);
61
+ }
62
+ return response;
63
+ }
64
+ async function downloadToFile(response, path) {
65
+ if (!response.body)
66
+ throw new Error(`Download returned an empty body: ${response.url}`);
67
+ const hash = createHash("sha256");
68
+ const hasher = new Transform({
69
+ transform(chunk, _encoding, callback) {
70
+ hash.update(chunk);
71
+ callback(null, chunk);
72
+ },
73
+ });
74
+ await pipeline(Readable.fromWeb(response.body), hasher, createWriteStream(path, { mode: 0o700 }));
75
+ return hash.digest("hex");
76
+ }
77
+ async function resolveExecutableTarget(executablePath) {
78
+ const target = await realpath(executablePath);
79
+ const info = await stat(target);
80
+ if (!info.isFile())
81
+ throw new Error(`Refusing to replace non-file executable: ${target}`);
82
+ try {
83
+ await access(dirname(target), constants.W_OK);
84
+ }
85
+ catch {
86
+ throw new Error(`Cannot write to ${dirname(target)}. Rerun the Grip installer with a writable GRIP_INSTALL_DIR or update with elevated permissions.`);
87
+ }
88
+ return target;
89
+ }
90
+ async function replaceExecutable(source, target, platform) {
91
+ if (platform !== "win32") {
92
+ await rename(source, target);
93
+ return;
94
+ }
95
+ // Windows cannot overwrite a running executable, but it can rename it. Move the current
96
+ // binary aside, then move the verified one into place; cleanup happens on a later start.
97
+ const previous = `${target}${WINDOWS_PREVIOUS_SUFFIX}${randomUUID()}`;
98
+ await rename(target, previous);
99
+ try {
100
+ await rename(source, target);
101
+ }
102
+ catch (error) {
103
+ await rename(previous, target);
104
+ throw error;
105
+ }
106
+ await rm(previous, { force: true }).catch(() => { });
107
+ }
108
+ /**
109
+ * Download the release executable for this platform, verify its SHA-256 checksum, and atomically
110
+ * replace the running executable. Mirrors install.sh / install.ps1.
111
+ */
112
+ export async function updateBinaryExecutable(options = {}) {
113
+ const platform = options.platform ?? process.platform;
114
+ const arch = options.arch ?? process.arch;
115
+ const asset = getBinaryReleaseAssetName(platform, arch);
116
+ if (!asset)
117
+ throw new Error(`No Grip binary release is available for ${platform}-${arch}`);
118
+ const fetchImpl = options.fetch ?? fetch;
119
+ const userAgent = options.userAgent ?? "grip-self-update";
120
+ const downloadUrl = getReleaseDownloadUrl(resolveReleaseBaseUrl(options.releaseBaseUrl), options.version);
121
+ const assetUrl = `${downloadUrl}/${asset}`;
122
+ const target = await resolveExecutableTarget(options.executablePath ?? process.execPath);
123
+ // Download next to the target so the final rename stays on one filesystem.
124
+ const work = await mkdtemp(join(dirname(target), TEMP_DIR_PREFIX));
125
+ try {
126
+ const checksumResponse = await fetchOk(fetchImpl, `${assetUrl}.sha256`, userAgent, CHECKSUM_TIMEOUT_MS);
127
+ const expected = parseChecksum(await checksumResponse.text(), asset);
128
+ const downloaded = join(work, asset);
129
+ const actual = await downloadToFile(await fetchOk(fetchImpl, assetUrl, userAgent, BINARY_TIMEOUT_MS), downloaded);
130
+ if (actual !== expected)
131
+ throw new Error(`SHA-256 mismatch for ${asset}; update aborted`);
132
+ await chmod(downloaded, 0o755);
133
+ await replaceExecutable(downloaded, target, platform);
134
+ }
135
+ finally {
136
+ await rm(work, { recursive: true, force: true }).catch(() => { });
137
+ }
138
+ return { executablePath: target, assetUrl };
139
+ }
140
+ /** Remove executables that a Windows binary update moved aside while they were still running. */
141
+ export async function cleanupWindowsBinarySelfUpdateLeftovers(executablePath = process.execPath) {
142
+ try {
143
+ const target = await realpath(executablePath);
144
+ const dir = dirname(target);
145
+ const previousPrefix = `${basename(target)}${WINDOWS_PREVIOUS_SUFFIX}`;
146
+ for (const entry of await readdir(dir)) {
147
+ if (!entry.startsWith(previousPrefix))
148
+ continue;
149
+ const path = join(dir, entry);
150
+ if (!(await lstat(path)).isFile())
151
+ continue;
152
+ await rm(path, { force: true }).catch(() => { });
153
+ }
154
+ }
155
+ catch {
156
+ // Best effort: the directory may be read-only or another process may still be running the old file.
157
+ }
158
+ }
159
+ //# sourceMappingURL=binary-self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-self-update.js","sourceRoot":"","sources":["../../src/utils/binary-self-update.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { createWriteStream } from \"node:fs\";\nimport { access, chmod, constants, lstat, mkdtemp, readdir, realpath, rename, rm, stat } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { Readable, Transform } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\n\nconst DEFAULT_RELEASE_BASE_URL = \"https://github.com/greppleai/grip/releases\";\nconst TEMP_DIR_PREFIX = \".grip-update.\";\nconst WINDOWS_PREVIOUS_SUFFIX = \".grip-previous-\";\nconst CHECKSUM_TIMEOUT_MS = 30_000;\nconst BINARY_TIMEOUT_MS = 10 * 60_000;\n\nexport interface BinarySelfUpdateOptions {\n\t/** Release version without the `v` prefix. Uses the latest release when omitted. */\n\tversion?: string;\n\t/** Executable to replace. Defaults to `process.execPath`. */\n\texecutablePath?: string;\n\tplatform?: NodeJS.Platform;\n\tarch?: string;\n\t/** Release base URL. Defaults to `GRIP_RELEASE_BASE_URL` or the GitHub releases URL. */\n\treleaseBaseUrl?: string;\n\tuserAgent?: string;\n\tfetch?: typeof fetch;\n}\n\nexport interface BinarySelfUpdateResult {\n\texecutablePath: string;\n\tassetUrl: string;\n}\n\nexport function getBinaryReleaseAssetName(platform: NodeJS.Platform, arch: string): string | undefined {\n\tconst os = platform === \"darwin\" ? \"darwin\" : platform === \"linux\" ? \"linux\" : platform === \"win32\" ? \"windows\" : \"\";\n\tconst cpu = arch === \"x64\" ? \"x64\" : arch === \"arm64\" ? \"arm64\" : \"\";\n\tif (!os || !cpu) return undefined;\n\treturn `grip-${os}-${cpu}${os === \"windows\" ? \".exe\" : \"\"}`;\n}\n\nfunction resolveReleaseBaseUrl(override: string | undefined): string {\n\tconst base = (override ?? process.env.GRIP_RELEASE_BASE_URL ?? DEFAULT_RELEASE_BASE_URL).replace(/\\/+$/, \"\");\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(base);\n\t} catch {\n\t\tthrow new Error(`Invalid release URL: ${base}`);\n\t}\n\tconst loopback = url.protocol === \"http:\" && (url.hostname === \"127.0.0.1\" || url.hostname === \"localhost\");\n\tif (url.protocol !== \"https:\" && !loopback) {\n\t\tthrow new Error(\"Release URL must be HTTPS (or loopback for tests)\");\n\t}\n\tif (url.search || url.hash || base.includes(\"..\")) throw new Error(`Invalid release URL: ${base}`);\n\treturn base;\n}\n\nfunction getReleaseDownloadUrl(base: string, version: string | undefined): string {\n\tif (!version) return `${base}/latest/download`;\n\tconst tag = version.startsWith(\"v\") ? version : `v${version}`;\n\tif (!/^v\\d[0-9A-Za-z.+-]*$/.test(tag)) throw new Error(`Invalid release version: ${version}`);\n\treturn `${base}/download/${tag}`;\n}\n\nfunction parseChecksum(content: string, asset: string): string {\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tconst match = line.trim().match(/^([a-fA-F0-9]{64})\\s+\\*?(.+)$/);\n\t\tif (match && match[2] === asset) return match[1].toLowerCase();\n\t}\n\tthrow new Error(`Missing or invalid SHA-256 checksum for ${asset}`);\n}\n\nasync function fetchOk(fetchImpl: typeof fetch, url: string, userAgent: string, timeoutMs: number): Promise<Response> {\n\tconst response = await fetchImpl(url, {\n\t\theaders: { \"User-Agent\": userAgent },\n\t\tredirect: \"follow\",\n\t\tsignal: AbortSignal.timeout(timeoutMs),\n\t});\n\tif (!response.ok) {\n\t\tconst hint = response.status === 404 ? \" (is this release published for your platform yet?)\" : \"\";\n\t\tthrow new Error(`Download failed: ${url} returned HTTP ${response.status}${hint}`);\n\t}\n\treturn response;\n}\n\nasync function downloadToFile(response: Response, path: string): Promise<string> {\n\tif (!response.body) throw new Error(`Download returned an empty body: ${response.url}`);\n\tconst hash = createHash(\"sha256\");\n\tconst hasher = new Transform({\n\t\ttransform(chunk: Buffer, _encoding, callback) {\n\t\t\thash.update(chunk);\n\t\t\tcallback(null, chunk);\n\t\t},\n\t});\n\tawait pipeline(\n\t\tReadable.fromWeb(response.body as NodeReadableStream<Uint8Array>),\n\t\thasher,\n\t\tcreateWriteStream(path, { mode: 0o700 }),\n\t);\n\treturn hash.digest(\"hex\");\n}\n\nasync function resolveExecutableTarget(executablePath: string): Promise<string> {\n\tconst target = await realpath(executablePath);\n\tconst info = await stat(target);\n\tif (!info.isFile()) throw new Error(`Refusing to replace non-file executable: ${target}`);\n\ttry {\n\t\tawait access(dirname(target), constants.W_OK);\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`Cannot write to ${dirname(target)}. Rerun the Grip installer with a writable GRIP_INSTALL_DIR or update with elevated permissions.`,\n\t\t);\n\t}\n\treturn target;\n}\n\nasync function replaceExecutable(source: string, target: string, platform: NodeJS.Platform): Promise<void> {\n\tif (platform !== \"win32\") {\n\t\tawait rename(source, target);\n\t\treturn;\n\t}\n\t// Windows cannot overwrite a running executable, but it can rename it. Move the current\n\t// binary aside, then move the verified one into place; cleanup happens on a later start.\n\tconst previous = `${target}${WINDOWS_PREVIOUS_SUFFIX}${randomUUID()}`;\n\tawait rename(target, previous);\n\ttry {\n\t\tawait rename(source, target);\n\t} catch (error) {\n\t\tawait rename(previous, target);\n\t\tthrow error;\n\t}\n\tawait rm(previous, { force: true }).catch(() => {});\n}\n\n/**\n * Download the release executable for this platform, verify its SHA-256 checksum, and atomically\n * replace the running executable. Mirrors install.sh / install.ps1.\n */\nexport async function updateBinaryExecutable(options: BinarySelfUpdateOptions = {}): Promise<BinarySelfUpdateResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst arch = options.arch ?? process.arch;\n\tconst asset = getBinaryReleaseAssetName(platform, arch);\n\tif (!asset) throw new Error(`No Grip binary release is available for ${platform}-${arch}`);\n\n\tconst fetchImpl = options.fetch ?? fetch;\n\tconst userAgent = options.userAgent ?? \"grip-self-update\";\n\tconst downloadUrl = getReleaseDownloadUrl(resolveReleaseBaseUrl(options.releaseBaseUrl), options.version);\n\tconst assetUrl = `${downloadUrl}/${asset}`;\n\tconst target = await resolveExecutableTarget(options.executablePath ?? process.execPath);\n\n\t// Download next to the target so the final rename stays on one filesystem.\n\tconst work = await mkdtemp(join(dirname(target), TEMP_DIR_PREFIX));\n\ttry {\n\t\tconst checksumResponse = await fetchOk(fetchImpl, `${assetUrl}.sha256`, userAgent, CHECKSUM_TIMEOUT_MS);\n\t\tconst expected = parseChecksum(await checksumResponse.text(), asset);\n\t\tconst downloaded = join(work, asset);\n\t\tconst actual = await downloadToFile(await fetchOk(fetchImpl, assetUrl, userAgent, BINARY_TIMEOUT_MS), downloaded);\n\t\tif (actual !== expected) throw new Error(`SHA-256 mismatch for ${asset}; update aborted`);\n\t\tawait chmod(downloaded, 0o755);\n\t\tawait replaceExecutable(downloaded, target, platform);\n\t} finally {\n\t\tawait rm(work, { recursive: true, force: true }).catch(() => {});\n\t}\n\treturn { executablePath: target, assetUrl };\n}\n\n/** Remove executables that a Windows binary update moved aside while they were still running. */\nexport async function cleanupWindowsBinarySelfUpdateLeftovers(\n\texecutablePath: string = process.execPath,\n): Promise<void> {\n\ttry {\n\t\tconst target = await realpath(executablePath);\n\t\tconst dir = dirname(target);\n\t\tconst previousPrefix = `${basename(target)}${WINDOWS_PREVIOUS_SUFFIX}`;\n\t\tfor (const entry of await readdir(dir)) {\n\t\t\tif (!entry.startsWith(previousPrefix)) continue;\n\t\t\tconst path = join(dir, entry);\n\t\t\tif (!(await lstat(path)).isFile()) continue;\n\t\t\tawait rm(path, { force: true }).catch(() => {});\n\t\t}\n\t} catch {\n\t\t// Best effort: the directory may be read-only or another process may still be running the old file.\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/utils/changelog.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACvD,OAAO,EAAE,MAAM,CAAC;CAChB;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,EAAE,CA+BtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,MAAM,CAI9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAW9F","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\n\ninterface ChangelogVersion {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n}\n\nexport interface ChangelogEntry extends ChangelogVersion {\n\tcontent: string;\n}\n\nfunction parseChangelogVersionHeader(line: string): ChangelogVersion | null {\n\tconst versionMatch = line.match(/##\\s+\\[?(\\d+)\\.(\\d+)\\.(\\d+)\\]?/);\n\tif (!versionMatch) return null;\n\treturn {\n\t\tmajor: Number.parseInt(versionMatch[1], 10),\n\t\tminor: Number.parseInt(versionMatch[2], 10),\n\t\tpatch: Number.parseInt(versionMatch[3], 10),\n\t};\n}\n\nfunction appendChangelogEntry(entries: ChangelogEntry[], version: ChangelogVersion | null, lines: string[]): void {\n\tif (!version || lines.length === 0) return;\n\tentries.push({ ...version, content: lines.join(\"\\n\").trim() });\n}\n\n/**\n * Parse changelog entries from CHANGELOG.md\n * Scans for ## lines and collects content until next ## or EOF\n */\nexport function parseChangelog(changelogPath: string): ChangelogEntry[] {\n\tif (!existsSync(changelogPath)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(changelogPath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst entries: ChangelogEntry[] = [];\n\n\t\tlet currentLines: string[] = [];\n\t\tlet currentVersion: ChangelogVersion | null = null;\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.startsWith(\"## \")) {\n\t\t\t\tif (currentVersion) currentLines.push(line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\t\t\tcurrentVersion = parseChangelogVersionHeader(line);\n\t\t\tcurrentLines = currentVersion ? [line] : [];\n\t\t}\n\n\t\t// Save last entry\n\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\n\t\treturn entries;\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not parse changelog: ${error}`);\n\t\treturn [];\n\t}\n}\n\n/**\n * Compare versions. Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: ChangelogEntry, v2: ChangelogEntry): number {\n\tif (v1.major !== v2.major) return v1.major - v2.major;\n\tif (v1.minor !== v2.minor) return v1.minor - v2.minor;\n\treturn v1.patch - v2.patch;\n}\n\n/**\n * Get entries newer than lastVersion\n */\nexport function getNewEntries(entries: ChangelogEntry[], lastVersion: string): ChangelogEntry[] {\n\t// Parse lastVersion\n\tconst parts = lastVersion.split(\".\").map(Number);\n\tconst last: ChangelogEntry = {\n\t\tmajor: parts[0] || 0,\n\t\tminor: parts[1] || 0,\n\t\tpatch: parts[2] || 0,\n\t\tcontent: \"\",\n\t};\n\n\treturn entries.filter((entry) => compareVersions(entry, last) > 0);\n}\n"]}
1
+ {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/utils/changelog.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACvD,OAAO,EAAE,MAAM,CAAC;CAChB;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,EAAE,CA+BtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,MAAM,CAI9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAW9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/utils/changelog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\n\ninterface ChangelogVersion {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n}\n\nexport interface ChangelogEntry extends ChangelogVersion {\n\tcontent: string;\n}\n\nfunction parseChangelogVersionHeader(line: string): ChangelogVersion | null {\n\tconst versionMatch = line.match(/##\\s+\\[?(\\d+)\\.(\\d+)\\.(\\d+)\\]?/);\n\tif (!versionMatch) return null;\n\treturn {\n\t\tmajor: Number.parseInt(versionMatch[1], 10),\n\t\tminor: Number.parseInt(versionMatch[2], 10),\n\t\tpatch: Number.parseInt(versionMatch[3], 10),\n\t};\n}\n\nfunction appendChangelogEntry(entries: ChangelogEntry[], version: ChangelogVersion | null, lines: string[]): void {\n\tif (!version || lines.length === 0) return;\n\tentries.push({ ...version, content: lines.join(\"\\n\").trim() });\n}\n\n/**\n * Parse changelog entries from CHANGELOG.md\n * Scans for ## lines and collects content until next ## or EOF\n */\nexport function parseChangelog(changelogPath: string): ChangelogEntry[] {\n\tif (!existsSync(changelogPath)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(changelogPath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst entries: ChangelogEntry[] = [];\n\n\t\tlet currentLines: string[] = [];\n\t\tlet currentVersion: ChangelogVersion | null = null;\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.startsWith(\"## \")) {\n\t\t\t\tif (currentVersion) currentLines.push(line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\t\t\tcurrentVersion = parseChangelogVersionHeader(line);\n\t\t\tcurrentLines = currentVersion ? [line] : [];\n\t\t}\n\n\t\t// Save last entry\n\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\n\t\treturn entries;\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not parse changelog: ${error}`);\n\t\treturn [];\n\t}\n}\n\n/**\n * Compare versions. Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: ChangelogEntry, v2: ChangelogEntry): number {\n\tif (v1.major !== v2.major) return v1.major - v2.major;\n\tif (v1.minor !== v2.minor) return v1.minor - v2.minor;\n\treturn v1.patch - v2.patch;\n}\n\n/**\n * Get entries newer than lastVersion\n */\nexport function getNewEntries(entries: ChangelogEntry[], lastVersion: string): ChangelogEntry[] {\n\t// Parse lastVersion\n\tconst parts = lastVersion.split(\".\").map(Number);\n\tconst last: ChangelogEntry = {\n\t\tmajor: parts[0] || 0,\n\t\tminor: parts[1] || 0,\n\t\tpatch: parts[2] || 0,\n\t\tcontent: \"\",\n\t};\n\n\treturn entries.filter((entry) => compareVersions(entry, last) > 0);\n}\n"]}
1
+ {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/utils/changelog.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\n\ninterface ChangelogVersion {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n}\n\nexport interface ChangelogEntry extends ChangelogVersion {\n\tcontent: string;\n}\n\nfunction parseChangelogVersionHeader(line: string): ChangelogVersion | null {\n\tconst versionMatch = line.match(/##\\s+\\[?(\\d+)\\.(\\d+)\\.(\\d+)\\]?/);\n\tif (!versionMatch) return null;\n\treturn {\n\t\tmajor: Number.parseInt(versionMatch[1], 10),\n\t\tminor: Number.parseInt(versionMatch[2], 10),\n\t\tpatch: Number.parseInt(versionMatch[3], 10),\n\t};\n}\n\nfunction appendChangelogEntry(entries: ChangelogEntry[], version: ChangelogVersion | null, lines: string[]): void {\n\tif (!version || lines.length === 0) return;\n\tentries.push({ ...version, content: lines.join(\"\\n\").trim() });\n}\n\n/**\n * Parse changelog entries from CHANGELOG.md\n * Scans for ## lines and collects content until next ## or EOF\n */\nexport function parseChangelog(changelogPath: string): ChangelogEntry[] {\n\tif (!existsSync(changelogPath)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(changelogPath, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\t\tconst entries: ChangelogEntry[] = [];\n\n\t\tlet currentLines: string[] = [];\n\t\tlet currentVersion: ChangelogVersion | null = null;\n\n\t\tfor (const line of lines) {\n\t\t\tif (!line.startsWith(\"## \")) {\n\t\t\t\tif (currentVersion) currentLines.push(line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\t\t\tcurrentVersion = parseChangelogVersionHeader(line);\n\t\t\tcurrentLines = currentVersion ? [line] : [];\n\t\t}\n\n\t\t// Save last entry\n\t\tappendChangelogEntry(entries, currentVersion, currentLines);\n\n\t\treturn entries;\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not parse changelog: ${error}`);\n\t\treturn [];\n\t}\n}\n\n/**\n * Compare versions. Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: ChangelogEntry, v2: ChangelogEntry): number {\n\tif (v1.major !== v2.major) return v1.major - v2.major;\n\tif (v1.minor !== v2.minor) return v1.minor - v2.minor;\n\treturn v1.patch - v2.patch;\n}\n\n/**\n * Get entries newer than lastVersion\n */\nexport function getNewEntries(entries: ChangelogEntry[], lastVersion: string): ChangelogEntry[] {\n\t// Parse lastVersion\n\tconst parts = lastVersion.split(\".\").map(Number);\n\tconst last: ChangelogEntry = {\n\t\tmajor: parts[0] || 0,\n\t\tminor: parts[1] || 0,\n\t\tpatch: parts[2] || 0,\n\t\tcontent: \"\",\n\t};\n\n\treturn entries.filter((entry) => compareVersions(entry, last) > 0);\n}\n"]}