@wjarka/cezarion 0.10.0-pr30.54

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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +838 -0
  3. package/dist/agent-config/account-identity.d.ts +44 -0
  4. package/dist/agent-config/account-identity.js +128 -0
  5. package/dist/agent-config/account-identity.js.map +1 -0
  6. package/dist/agent-config/catalog.d.ts +72 -0
  7. package/dist/agent-config/catalog.js +223 -0
  8. package/dist/agent-config/catalog.js.map +1 -0
  9. package/dist/agent-config/files.d.ts +46 -0
  10. package/dist/agent-config/files.js +119 -0
  11. package/dist/agent-config/files.js.map +1 -0
  12. package/dist/agent-config/model-settings/claude.d.ts +2 -0
  13. package/dist/agent-config/model-settings/claude.js +11 -0
  14. package/dist/agent-config/model-settings/claude.js.map +1 -0
  15. package/dist/agent-config/model-settings/codex.d.ts +2 -0
  16. package/dist/agent-config/model-settings/codex.js +16 -0
  17. package/dist/agent-config/model-settings/codex.js.map +1 -0
  18. package/dist/agent-config/model-settings/opencode.d.ts +2 -0
  19. package/dist/agent-config/model-settings/opencode.js +8 -0
  20. package/dist/agent-config/model-settings/opencode.js.map +1 -0
  21. package/dist/agent-config/model-settings/pi.d.ts +12 -0
  22. package/dist/agent-config/model-settings/pi.js +18 -0
  23. package/dist/agent-config/model-settings/pi.js.map +1 -0
  24. package/dist/agent-config/model-settings/shared.d.ts +9 -0
  25. package/dist/agent-config/model-settings/shared.js +93 -0
  26. package/dist/agent-config/model-settings/shared.js.map +1 -0
  27. package/dist/agent-config/model-settings/types.d.ts +9 -0
  28. package/dist/agent-config/model-settings/types.js +2 -0
  29. package/dist/agent-config/model-settings/types.js.map +1 -0
  30. package/dist/agent-config/models.d.ts +9 -0
  31. package/dist/agent-config/models.js +32 -0
  32. package/dist/agent-config/models.js.map +1 -0
  33. package/dist/agent-config/seed.d.ts +7 -0
  34. package/dist/agent-config/seed.js +90 -0
  35. package/dist/agent-config/seed.js.map +1 -0
  36. package/dist/agent-config/service.d.ts +44 -0
  37. package/dist/agent-config/service.js +71 -0
  38. package/dist/agent-config/service.js.map +1 -0
  39. package/dist/agent-config/validate.d.ts +21 -0
  40. package/dist/agent-config/validate.js +76 -0
  41. package/dist/agent-config/validate.js.map +1 -0
  42. package/dist/automations/coordinator.d.ts +26 -0
  43. package/dist/automations/coordinator.js +66 -0
  44. package/dist/automations/coordinator.js.map +1 -0
  45. package/dist/automations/github-poller.d.ts +74 -0
  46. package/dist/automations/github-poller.js +234 -0
  47. package/dist/automations/github-poller.js.map +1 -0
  48. package/dist/automations/scheduler.d.ts +42 -0
  49. package/dist/automations/scheduler.js +192 -0
  50. package/dist/automations/scheduler.js.map +1 -0
  51. package/dist/automations/store.d.ts +65 -0
  52. package/dist/automations/store.js +298 -0
  53. package/dist/automations/store.js.map +1 -0
  54. package/dist/automations/task-template.d.ts +18 -0
  55. package/dist/automations/task-template.js +95 -0
  56. package/dist/automations/task-template.js.map +1 -0
  57. package/dist/automations/types.d.ts +255 -0
  58. package/dist/automations/types.js +159 -0
  59. package/dist/automations/types.js.map +1 -0
  60. package/dist/config.d.ts +77 -0
  61. package/dist/config.js +242 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/contract/agent-config.d.ts +153 -0
  64. package/dist/contract/agent-profiles.d.ts +347 -0
  65. package/dist/contract/automations.d.ts +935 -0
  66. package/dist/contract/events.d.ts +104 -0
  67. package/dist/contract/github.d.ts +556 -0
  68. package/dist/contract/health.d.ts +102 -0
  69. package/dist/contract/index.d.ts +16 -0
  70. package/dist/contract/index.js +1895 -0
  71. package/dist/contract/projects.d.ts +210 -0
  72. package/dist/contract/repo.d.ts +234 -0
  73. package/dist/contract/runs.d.ts +1473 -0
  74. package/dist/contract/skills.d.ts +232 -0
  75. package/dist/contract/workflows.d.ts +218 -0
  76. package/dist/contract/workspace.d.ts +579 -0
  77. package/dist/core/agent-env.d.ts +31 -0
  78. package/dist/core/agent-env.js +371 -0
  79. package/dist/core/agent-env.js.map +1 -0
  80. package/dist/core/agent-model-policy.d.ts +10 -0
  81. package/dist/core/agent-model-policy.js +36 -0
  82. package/dist/core/agent-model-policy.js.map +1 -0
  83. package/dist/core/agent-profiles.d.ts +62 -0
  84. package/dist/core/agent-profiles.js +90 -0
  85. package/dist/core/agent-profiles.js.map +1 -0
  86. package/dist/core/agent-runner.d.ts +211 -0
  87. package/dist/core/agent-runner.js +68 -0
  88. package/dist/core/agent-runner.js.map +1 -0
  89. package/dist/core/ask.d.ts +105 -0
  90. package/dist/core/ask.js +187 -0
  91. package/dist/core/ask.js.map +1 -0
  92. package/dist/core/backend-detect.d.ts +16 -0
  93. package/dist/core/backend-detect.js +155 -0
  94. package/dist/core/backend-detect.js.map +1 -0
  95. package/dist/core/claude-cli-runner.d.ts +59 -0
  96. package/dist/core/claude-cli-runner.js +483 -0
  97. package/dist/core/claude-cli-runner.js.map +1 -0
  98. package/dist/core/claude-ui-mapper.d.ts +80 -0
  99. package/dist/core/claude-ui-mapper.js +598 -0
  100. package/dist/core/claude-ui-mapper.js.map +1 -0
  101. package/dist/core/codex-app-server-runner.d.ts +41 -0
  102. package/dist/core/codex-app-server-runner.js +584 -0
  103. package/dist/core/codex-app-server-runner.js.map +1 -0
  104. package/dist/core/codex-app-server-transport.d.ts +35 -0
  105. package/dist/core/codex-app-server-transport.js +150 -0
  106. package/dist/core/codex-app-server-transport.js.map +1 -0
  107. package/dist/core/codex-model-catalog.d.ts +10 -0
  108. package/dist/core/codex-model-catalog.js +110 -0
  109. package/dist/core/codex-model-catalog.js.map +1 -0
  110. package/dist/core/codex-ui-mapper.d.ts +112 -0
  111. package/dist/core/codex-ui-mapper.js +766 -0
  112. package/dist/core/codex-ui-mapper.js.map +1 -0
  113. package/dist/core/model-identity.d.ts +125 -0
  114. package/dist/core/model-identity.js +132 -0
  115. package/dist/core/model-identity.js.map +1 -0
  116. package/dist/core/model-presets.d.ts +21 -0
  117. package/dist/core/model-presets.js +81 -0
  118. package/dist/core/model-presets.js.map +1 -0
  119. package/dist/core/ndjson.d.ts +6 -0
  120. package/dist/core/ndjson.js +23 -0
  121. package/dist/core/ndjson.js.map +1 -0
  122. package/dist/core/opencode-model-catalog.d.ts +32 -0
  123. package/dist/core/opencode-model-catalog.js +153 -0
  124. package/dist/core/opencode-model-catalog.js.map +1 -0
  125. package/dist/core/opencode-server-runner.d.ts +32 -0
  126. package/dist/core/opencode-server-runner.js +882 -0
  127. package/dist/core/opencode-server-runner.js.map +1 -0
  128. package/dist/core/opencode-ui-mapper.d.ts +137 -0
  129. package/dist/core/opencode-ui-mapper.js +800 -0
  130. package/dist/core/opencode-ui-mapper.js.map +1 -0
  131. package/dist/core/pi-model-catalog.d.ts +31 -0
  132. package/dist/core/pi-model-catalog.js +152 -0
  133. package/dist/core/pi-model-catalog.js.map +1 -0
  134. package/dist/core/pi-runner.d.ts +24 -0
  135. package/dist/core/pi-runner.js +403 -0
  136. package/dist/core/pi-runner.js.map +1 -0
  137. package/dist/core/pi-ui-mapper.d.ts +36 -0
  138. package/dist/core/pi-ui-mapper.js +304 -0
  139. package/dist/core/pi-ui-mapper.js.map +1 -0
  140. package/dist/core/process-usage.d.ts +66 -0
  141. package/dist/core/process-usage.js +193 -0
  142. package/dist/core/process-usage.js.map +1 -0
  143. package/dist/core/provider-auth.d.ts +154 -0
  144. package/dist/core/provider-auth.js +509 -0
  145. package/dist/core/provider-auth.js.map +1 -0
  146. package/dist/core/provider-availability.d.ts +3 -0
  147. package/dist/core/provider-availability.js +14 -0
  148. package/dist/core/provider-availability.js.map +1 -0
  149. package/dist/core/runner-factory.d.ts +8 -0
  150. package/dist/core/runner-factory.js +25 -0
  151. package/dist/core/runner-factory.js.map +1 -0
  152. package/dist/core/runner-model-catalog.d.ts +29 -0
  153. package/dist/core/runner-model-catalog.js +78 -0
  154. package/dist/core/runner-model-catalog.js.map +1 -0
  155. package/dist/core/secret-redaction.d.ts +37 -0
  156. package/dist/core/secret-redaction.js +115 -0
  157. package/dist/core/secret-redaction.js.map +1 -0
  158. package/dist/core/shell-env.d.ts +28 -0
  159. package/dist/core/shell-env.js +56 -0
  160. package/dist/core/shell-env.js.map +1 -0
  161. package/dist/core/tool-display.d.ts +31 -0
  162. package/dist/core/tool-display.js +179 -0
  163. package/dist/core/tool-display.js.map +1 -0
  164. package/dist/core/ui-events.d.ts +335 -0
  165. package/dist/core/ui-events.js +25 -0
  166. package/dist/core/ui-events.js.map +1 -0
  167. package/dist/core/usage-limit.d.ts +42 -0
  168. package/dist/core/usage-limit.js +209 -0
  169. package/dist/core/usage-limit.js.map +1 -0
  170. package/dist/core/usage.d.ts +11 -0
  171. package/dist/core/usage.js +15 -0
  172. package/dist/core/usage.js.map +1 -0
  173. package/dist/core/v1-text-coalescer.d.ts +36 -0
  174. package/dist/core/v1-text-coalescer.js +72 -0
  175. package/dist/core/v1-text-coalescer.js.map +1 -0
  176. package/dist/git-diff-base.d.ts +85 -0
  177. package/dist/git-diff-base.js +180 -0
  178. package/dist/git-diff-base.js.map +1 -0
  179. package/dist/git-refs.d.ts +11 -0
  180. package/dist/git-refs.js +14 -0
  181. package/dist/git-refs.js.map +1 -0
  182. package/dist/git-worktree.d.ts +161 -0
  183. package/dist/git-worktree.js +508 -0
  184. package/dist/git-worktree.js.map +1 -0
  185. package/dist/handoff.d.ts +62 -0
  186. package/dist/handoff.js +154 -0
  187. package/dist/handoff.js.map +1 -0
  188. package/dist/index.d.ts +2 -0
  189. package/dist/index.js +680 -0
  190. package/dist/index.js.map +1 -0
  191. package/dist/install-as-command.d.ts +40 -0
  192. package/dist/install-as-command.js +52 -0
  193. package/dist/install-as-command.js.map +1 -0
  194. package/dist/pack-check.d.ts +17 -0
  195. package/dist/pack-check.js +27 -0
  196. package/dist/pack-check.js.map +1 -0
  197. package/dist/paths.d.ts +140 -0
  198. package/dist/paths.js +192 -0
  199. package/dist/paths.js.map +1 -0
  200. package/dist/planner.d.ts +27 -0
  201. package/dist/planner.js +268 -0
  202. package/dist/planner.js.map +1 -0
  203. package/dist/release/manifests.d.ts +81 -0
  204. package/dist/release/manifests.js +74 -0
  205. package/dist/release/manifests.js.map +1 -0
  206. package/dist/release/snapshot.d.ts +67 -0
  207. package/dist/release/snapshot.js +97 -0
  208. package/dist/release/snapshot.js.map +1 -0
  209. package/dist/release/stable.d.ts +38 -0
  210. package/dist/release/stable.js +55 -0
  211. package/dist/release/stable.js.map +1 -0
  212. package/dist/runs/agent-tmpdir.d.ts +41 -0
  213. package/dist/runs/agent-tmpdir.js +183 -0
  214. package/dist/runs/agent-tmpdir.js.map +1 -0
  215. package/dist/runs/auto-name.d.ts +75 -0
  216. package/dist/runs/auto-name.js +179 -0
  217. package/dist/runs/auto-name.js.map +1 -0
  218. package/dist/runs/event-history.d.ts +50 -0
  219. package/dist/runs/event-history.js +613 -0
  220. package/dist/runs/event-history.js.map +1 -0
  221. package/dist/runs/retention.d.ts +60 -0
  222. package/dist/runs/retention.js +86 -0
  223. package/dist/runs/retention.js.map +1 -0
  224. package/dist/runs/review-gate.d.ts +18 -0
  225. package/dist/runs/review-gate.js +21 -0
  226. package/dist/runs/review-gate.js.map +1 -0
  227. package/dist/runs/run-index.d.ts +19 -0
  228. package/dist/runs/run-index.js +43 -0
  229. package/dist/runs/run-index.js.map +1 -0
  230. package/dist/runs/store.d.ts +446 -0
  231. package/dist/runs/store.js +1118 -0
  232. package/dist/runs/store.js.map +1 -0
  233. package/dist/runs/task-markers.d.ts +28 -0
  234. package/dist/runs/task-markers.js +74 -0
  235. package/dist/runs/task-markers.js.map +1 -0
  236. package/dist/runs/task-refs.d.ts +25 -0
  237. package/dist/runs/task-refs.js +74 -0
  238. package/dist/runs/task-refs.js.map +1 -0
  239. package/dist/runs/ui-event-sink.d.ts +81 -0
  240. package/dist/runs/ui-event-sink.js +210 -0
  241. package/dist/runs/ui-event-sink.js.map +1 -0
  242. package/dist/server/app-type.d.ts +21 -0
  243. package/dist/server/app-type.js +2 -0
  244. package/dist/server/app-type.js.map +1 -0
  245. package/dist/server/capabilities.d.ts +70 -0
  246. package/dist/server/capabilities.js +152 -0
  247. package/dist/server/capabilities.js.map +1 -0
  248. package/dist/server/checkout.d.ts +128 -0
  249. package/dist/server/checkout.js +296 -0
  250. package/dist/server/checkout.js.map +1 -0
  251. package/dist/server/forge/github.d.ts +513 -0
  252. package/dist/server/forge/github.js +2364 -0
  253. package/dist/server/forge/github.js.map +1 -0
  254. package/dist/server/forge/index.d.ts +40 -0
  255. package/dist/server/forge/index.js +72 -0
  256. package/dist/server/forge/index.js.map +1 -0
  257. package/dist/server/forge/types.d.ts +242 -0
  258. package/dist/server/forge/types.js +2 -0
  259. package/dist/server/forge/types.js.map +1 -0
  260. package/dist/server/fs-browse.d.ts +105 -0
  261. package/dist/server/fs-browse.js +182 -0
  262. package/dist/server/fs-browse.js.map +1 -0
  263. package/dist/server/git-changes.d.ts +213 -0
  264. package/dist/server/git-changes.js +555 -0
  265. package/dist/server/git-changes.js.map +1 -0
  266. package/dist/server/git.d.ts +28 -0
  267. package/dist/server/git.js +112 -0
  268. package/dist/server/git.js.map +1 -0
  269. package/dist/server/github.d.ts +9 -0
  270. package/dist/server/github.js +8 -0
  271. package/dist/server/github.js.map +1 -0
  272. package/dist/server/launch-key.d.ts +7 -0
  273. package/dist/server/launch-key.js +33 -0
  274. package/dist/server/launch-key.js.map +1 -0
  275. package/dist/server/open-in-app.d.ts +66 -0
  276. package/dist/server/open-in-app.js +211 -0
  277. package/dist/server/open-in-app.js.map +1 -0
  278. package/dist/server/open-in-terminal.d.ts +70 -0
  279. package/dist/server/open-in-terminal.js +179 -0
  280. package/dist/server/open-in-terminal.js.map +1 -0
  281. package/dist/server/pr.d.ts +7 -0
  282. package/dist/server/pr.js +7 -0
  283. package/dist/server/pr.js.map +1 -0
  284. package/dist/server/project-context.d.ts +120 -0
  285. package/dist/server/project-context.js +182 -0
  286. package/dist/server/project-context.js.map +1 -0
  287. package/dist/server/provider-action-gate.d.ts +8 -0
  288. package/dist/server/provider-action-gate.js +56 -0
  289. package/dist/server/provider-action-gate.js.map +1 -0
  290. package/dist/server/provider-auth-runtime.d.ts +21 -0
  291. package/dist/server/provider-auth-runtime.js +66 -0
  292. package/dist/server/provider-auth-runtime.js.map +1 -0
  293. package/dist/server/server.d.ts +13138 -0
  294. package/dist/server/server.js +5263 -0
  295. package/dist/server/server.js.map +1 -0
  296. package/dist/server/static-ui.d.ts +49 -0
  297. package/dist/server/static-ui.js +92 -0
  298. package/dist/server/static-ui.js.map +1 -0
  299. package/dist/server/validators.d.ts +97 -0
  300. package/dist/server/validators.js +86 -0
  301. package/dist/server/validators.js.map +1 -0
  302. package/dist/server/ws.d.ts +85 -0
  303. package/dist/server/ws.js +218 -0
  304. package/dist/server/ws.js.map +1 -0
  305. package/dist/server/wsl.d.ts +25 -0
  306. package/dist/server/wsl.js +92 -0
  307. package/dist/server/wsl.js.map +1 -0
  308. package/dist/server-install/engine.d.ts +50 -0
  309. package/dist/server-install/engine.js +324 -0
  310. package/dist/server-install/engine.js.map +1 -0
  311. package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
  312. package/dist/server-install/platforms/macosx-ngrok.js +345 -0
  313. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
  314. package/dist/server-install/platforms/ubuntu-vps.d.ts +78 -0
  315. package/dist/server-install/platforms/ubuntu-vps.js +1016 -0
  316. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
  317. package/dist/server-install/state.d.ts +52 -0
  318. package/dist/server-install/state.js +182 -0
  319. package/dist/server-install/state.js.map +1 -0
  320. package/dist/server-install/steps.d.ts +109 -0
  321. package/dist/server-install/steps.js +334 -0
  322. package/dist/server-install/steps.js.map +1 -0
  323. package/dist/server-install/strategies.d.ts +4 -0
  324. package/dist/server-install/strategies.js +20 -0
  325. package/dist/server-install/strategies.js.map +1 -0
  326. package/dist/server-install/types.d.ts +287 -0
  327. package/dist/server-install/types.js +121 -0
  328. package/dist/server-install/types.js.map +1 -0
  329. package/dist/server-install/ui.d.ts +42 -0
  330. package/dist/server-install/ui.js +130 -0
  331. package/dist/server-install/ui.js.map +1 -0
  332. package/dist/skills-banner.d.ts +22 -0
  333. package/dist/skills-banner.js +41 -0
  334. package/dist/skills-banner.js.map +1 -0
  335. package/dist/skills-remote.d.ts +84 -0
  336. package/dist/skills-remote.js +468 -0
  337. package/dist/skills-remote.js.map +1 -0
  338. package/dist/skills-update.d.ts +88 -0
  339. package/dist/skills-update.js +392 -0
  340. package/dist/skills-update.js.map +1 -0
  341. package/dist/skills.d.ts +82 -0
  342. package/dist/skills.js +251 -0
  343. package/dist/skills.js.map +1 -0
  344. package/dist/todos.d.ts +48 -0
  345. package/dist/todos.js +201 -0
  346. package/dist/todos.js.map +1 -0
  347. package/dist/ui-state.d.ts +26 -0
  348. package/dist/ui-state.js +38 -0
  349. package/dist/ui-state.js.map +1 -0
  350. package/dist/update-check.d.ts +12 -0
  351. package/dist/update-check.js +41 -0
  352. package/dist/update-check.js.map +1 -0
  353. package/dist/workflows/load.d.ts +15 -0
  354. package/dist/workflows/load.js +56 -0
  355. package/dist/workflows/load.js.map +1 -0
  356. package/dist/workflows/run.d.ts +758 -0
  357. package/dist/workflows/run.js +3389 -0
  358. package/dist/workflows/run.js.map +1 -0
  359. package/dist/workflows/types.d.ts +153 -0
  360. package/dist/workflows/types.js +212 -0
  361. package/dist/workflows/types.js.map +1 -0
  362. package/dist/workspace/agent-accounts.d.ts +153 -0
  363. package/dist/workspace/agent-accounts.js +304 -0
  364. package/dist/workspace/agent-accounts.js.map +1 -0
  365. package/dist/workspace/agent-profiles.d.ts +78 -0
  366. package/dist/workspace/agent-profiles.js +115 -0
  367. package/dist/workspace/agent-profiles.js.map +1 -0
  368. package/dist/workspace/config.d.ts +169 -0
  369. package/dist/workspace/config.js +379 -0
  370. package/dist/workspace/config.js.map +1 -0
  371. package/dist/workspace/migrations.d.ts +45 -0
  372. package/dist/workspace/migrations.js +147 -0
  373. package/dist/workspace/migrations.js.map +1 -0
  374. package/dist/workspace/projects-cli.d.ts +25 -0
  375. package/dist/workspace/projects-cli.js +172 -0
  376. package/dist/workspace/projects-cli.js.map +1 -0
  377. package/dist/workspace/projects.d.ts +109 -0
  378. package/dist/workspace/projects.js +250 -0
  379. package/dist/workspace/projects.js.map +1 -0
  380. package/dist/workspace/semaphore.d.ts +179 -0
  381. package/dist/workspace/semaphore.js +195 -0
  382. package/dist/workspace/semaphore.js.map +1 -0
  383. package/dist/workspace/ui-state.d.ts +34 -0
  384. package/dist/workspace/ui-state.js +53 -0
  385. package/dist/workspace/ui-state.js.map +1 -0
  386. package/package.json +70 -0
  387. package/scripts/check-pack.mjs +46 -0
  388. package/scripts/inline-contract.mjs +112 -0
  389. package/scripts/install-as-command.mjs +120 -0
  390. package/scripts/mock-claude.mjs +520 -0
  391. package/scripts/mock-pi-rpc.mjs +83 -0
  392. package/scripts/sync-readme.mjs +20 -0
  393. package/scripts/test-process-usage.mjs +47 -0
  394. package/web/dist/assets/alert-dialog-B4Ofsgv7.js +1 -0
  395. package/web/dist/assets/arrow-down-Dy8dup7j.js +1 -0
  396. package/web/dist/assets/arrow-left-BJaucbhn.js +1 -0
  397. package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
  398. package/web/dist/assets/centered-state-duPW0phQ.js +43 -0
  399. package/web/dist/assets/chevron-right-Be4A5TCS.js +1 -0
  400. package/web/dist/assets/chunk-BO2N2NFS-DE6qKn3r.js +131 -0
  401. package/web/dist/assets/collapsible-DdcNBdSk.js +1 -0
  402. package/web/dist/assets/commit-list-CgvN9vec.js +1 -0
  403. package/web/dist/assets/compare-variants-CQA2nd65.js +1 -0
  404. package/web/dist/assets/core-BCsw8oQw.js +12 -0
  405. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  406. package/web/dist/assets/diff-B6Agp5Hl.js +3 -0
  407. package/web/dist/assets/diff-stat-BoXuGkgq.js +1 -0
  408. package/web/dist/assets/diff-view-CD8XI-fj.js +6 -0
  409. package/web/dist/assets/diff-woXpYk--.js +1 -0
  410. package/web/dist/assets/dropdown-menu-B3SYw-k5.js +1 -0
  411. package/web/dist/assets/editable-title-B-hjp5wl.js +1 -0
  412. package/web/dist/assets/ellipsis-vertical-BYwzw0xl.js +1 -0
  413. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  414. package/web/dist/assets/file-BRj5eISx.js +1 -0
  415. package/web/dist/assets/folder-z4oT5981.js +1 -0
  416. package/web/dist/assets/git-toolbar-owSEkYld.js +1 -0
  417. package/web/dist/assets/github-Bz2VgRX3.js +1 -0
  418. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  419. package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
  420. package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
  421. package/web/dist/assets/html-BY76lXLH.js +1 -0
  422. package/web/dist/assets/image-preview-h3WFluuy.js +1 -0
  423. package/web/dist/assets/index-BbcQNT92.css +2 -0
  424. package/web/dist/assets/index-EtQQQ6Kj.js +7 -0
  425. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  426. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  427. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  428. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  429. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  430. package/web/dist/assets/json-qhed-kSA.js +1 -0
  431. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  432. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  433. package/web/dist/assets/lib-BQXq3kEf.js +1 -0
  434. package/web/dist/assets/lib-BxQXEXDF.js +1 -0
  435. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  436. package/web/dist/assets/markdown-DqBKYPiB.js +2 -0
  437. package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
  438. package/web/dist/assets/new-task-form-BdJKRBJX.js +1 -0
  439. package/web/dist/assets/pill-BQfmfpYp.js +1 -0
  440. package/web/dist/assets/project-router-DxgFZY1l.js +1 -0
  441. package/web/dist/assets/prompt-templates-B6m16gq-.js +15 -0
  442. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  443. package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
  444. package/web/dist/assets/refresh-cw-mhSpxf2a.js +1 -0
  445. package/web/dist/assets/repo-git-CUNRxR3_.js +1 -0
  446. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  447. package/web/dist/assets/run-diff-DsmmDVfx.js +3 -0
  448. package/web/dist/assets/run-header-BkhrseLJ.js +1 -0
  449. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  450. package/web/dist/assets/search-x-BqDMB2g8.js +1 -0
  451. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  452. package/web/dist/assets/skill-empty-hint-BWEvTggc.js +1 -0
  453. package/web/dist/assets/skills-9oR_oHse.js +1 -0
  454. package/web/dist/assets/skills-DwIxnnWO.js +1 -0
  455. package/web/dist/assets/sparkles-DIoTQpyx.js +1 -0
  456. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  457. package/web/dist/assets/square-terminal-Cc7CuQxc.js +1 -0
  458. package/web/dist/assets/tab-link-D1fQgpmO.js +1 -0
  459. package/web/dist/assets/task-changes-BKeLlDpK.js +1 -0
  460. package/web/dist/assets/task-commits-gcEFZIa5.js +1 -0
  461. package/web/dist/assets/task-files-BGAqoXTW.js +2 -0
  462. package/web/dist/assets/task-thread-DT8aUYTS.js +9 -0
  463. package/web/dist/assets/textarea-BOVbfy5C.js +1 -0
  464. package/web/dist/assets/thread-loading-CypW73KD.js +1 -0
  465. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  466. package/web/dist/assets/trash-2-CJq6LHWn.js +1 -0
  467. package/web/dist/assets/triangle-alert-CjDFvU27.js +1 -0
  468. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  469. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  470. package/web/dist/assets/upload-CPDZlJeK.js +1 -0
  471. package/web/dist/assets/use-desktop-5JsLmi0a.js +1 -0
  472. package/web/dist/assets/use-submit-shortcut-CHVFevty.js +1 -0
  473. package/web/dist/assets/utils-DiO6zyJd.js +64 -0
  474. package/web/dist/assets/workflows-rQDFzWRt.js +11 -0
  475. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  476. package/web/dist/assets/zoomable-image-COWqb11v.js +1 -0
  477. package/web/dist/index.html +80 -0
  478. package/web/dist/open-mercato.svg +11 -0
@@ -0,0 +1,468 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { homedir } from 'node:os';
5
+ import { basename, dirname, join } from 'node:path';
6
+ import { loadConfig } from './config.js';
7
+ import { parseFrontmatter } from './skills.js';
8
+ /**
9
+ * Team skills from remote git repos (spec 005), janitor-style: a bare clone
10
+ * without a checkout, listed with `git ls-tree` and read with `git show`.
11
+ * The cache lives in `~/.cache/cez/skills/<owner>__<name>/` — global, so one
12
+ * fetch serves every project. Everything degrades: no network / no access to
13
+ * the skills repo means the team skills quietly disappear from the list while
14
+ * local skills keep working. Nothing here ever blocks startup.
15
+ */
16
+ const LIST_TIMEOUT_MS = 10_000; // ls-tree / show / rev-parse
17
+ const CLONE_TIMEOUT_MS = 60_000; // clone / fetch
18
+ /**
19
+ * Hardening applied to *every* git invocation here (#428). The `repo`/`ref`
20
+ * strings ultimately come from a file — `.ai/cezar/config.json` — that an
21
+ * attacker might influence (a prompt-injected Write-only agent, a synced
22
+ * config), so git must never be able to pick a remote-helper transport:
23
+ * - `protocol.ext.allow=never` / `fd.allow=never` kill the `ext::`/`fd::`
24
+ * helpers — the arbitrary-command-execution vector (`ext::sh -c …`).
25
+ * - `GIT_ALLOW_PROTOCOL` allowlists only real transports; anything else
26
+ * (including `ext`) is refused even if a value slips past validation.
27
+ * - `protocol.file.allow=user` keeps direct local-path clones (a documented
28
+ * source shape) working while blocking submodule/recursive file abuse.
29
+ * - `GIT_TERMINAL_PROMPT=0` stops git blocking on a credential prompt — this
30
+ * runs on cockpit open and must never hang the boot.
31
+ */
32
+ const GIT_HARDENING_ARGS = [
33
+ '-c',
34
+ 'protocol.ext.allow=never',
35
+ '-c',
36
+ 'protocol.fd.allow=never',
37
+ '-c',
38
+ 'protocol.file.allow=user',
39
+ ];
40
+ const GIT_HARDENING_ENV = {
41
+ GIT_ALLOW_PROTOCOL: 'https:http:ssh:git:file',
42
+ GIT_TERMINAL_PROMPT: '0',
43
+ };
44
+ function git(args, timeoutMs, cwd) {
45
+ return new Promise((resolve) => {
46
+ execFile('git', [...GIT_HARDENING_ARGS, ...args], {
47
+ cwd,
48
+ timeout: timeoutMs,
49
+ killSignal: 'SIGKILL',
50
+ maxBuffer: 16 * 1024 * 1024,
51
+ encoding: 'utf8',
52
+ env: { ...process.env, ...GIT_HARDENING_ENV },
53
+ }, (err, stdout, stderr) => resolve({ ok: !err, stdout: stdout ?? '', stderr: stderr ?? '' }));
54
+ });
55
+ }
56
+ const ALLOWED_URL_SCHEMES = new Set(['https', 'http', 'ssh', 'git', 'file']);
57
+ /**
58
+ * The git remote for a configured source, or null when the value is unsafe to
59
+ * hand to `git` (#428). Team-skill repos are code-trusted — their skill bodies
60
+ * become agent system prompts — but the *string* is attacker-influenceable, so
61
+ * it must never be able to select a transport helper or pose as a git option.
62
+ * We accept exactly:
63
+ * - `owner/name` GitHub shorthand → canonical https
64
+ * - `https://` `http://` web URLs
65
+ * - `ssh://…` or scp-like `git@host:path`
66
+ * - a local path (`/abs`, `./`, `../`, `~/…`, `C:\…`) or `file://…`
67
+ * and reject the RCE/argument-injection surface: a leading `-`, the `::`
68
+ * remote-helper syntax (`ext::sh -c …`, `fd::…`), and any other URL scheme.
69
+ *
70
+ * Every reject here maps to a real vector. Shapes that are merely *unusual* —
71
+ * a Windows drive path, `~/…` — stay accepted: `BACKWARD_COMPATIBILITY.md` §5
72
+ * protects the `skillsRepos` source shape, so narrowing it is a breaking change
73
+ * and needs a migration path, not a silent refusal.
74
+ */
75
+ export function safeRemoteFor(repo) {
76
+ const value = repo.trim();
77
+ if (!value)
78
+ return null;
79
+ // git would read a leading `-` as an option, not a repo — argument injection.
80
+ if (value.startsWith('-'))
81
+ return null;
82
+ // `ext::`, `fd::`, and friends: remote-helper transports = command execution.
83
+ if (value.includes('::'))
84
+ return null;
85
+ // Local paths are matched before the `owner/name` shorthand: `.` and `-` are
86
+ // in the shorthand charset, so `./rel` would otherwise be read as the GitHub
87
+ // repo `./rel` and rewritten to `https://github.com/./rel.git`.
88
+ //
89
+ // `~/…` — git runs via execFile with no shell, so expand it here or git would
90
+ // look for a directory literally named `~`.
91
+ if (/^~\//.test(value))
92
+ return join(homedir(), value.slice(2));
93
+ if (/^(\/|\.\/|\.\.\/)/.test(value))
94
+ return value;
95
+ // Windows drive-letter path (`C:\repo`, `C:/repo`). Not a transport — no
96
+ // scheme, and a leading `-` is already refused above — and win32 is a
97
+ // supported platform, so this shape must keep working (BC §5, local path).
98
+ if (/^[A-Za-z]:[\\/]/.test(value))
99
+ return value;
100
+ // GitHub shorthand → the canonical https remote.
101
+ if (/^[\w.-]+\/[\w.-]+$/.test(value))
102
+ return `https://github.com/${value}.git`;
103
+ // Explicit URL scheme: allowlist safe transports only (blocks `ext:` etc.).
104
+ const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(value);
105
+ if (scheme) {
106
+ return ALLOWED_URL_SCHEMES.has(scheme[1].toLowerCase()) ? value : null;
107
+ }
108
+ // scp-like `user@host:path` (no scheme, host before the first colon).
109
+ if (/^[\w.-]+@[\w.-]+:/.test(value))
110
+ return value;
111
+ return null;
112
+ }
113
+ /**
114
+ * A ref safe to pass to `git` as a positional revision (#428): a branch, tag,
115
+ * or commit SHA. Rejects a leading `-` (argument injection against git's option
116
+ * surface), range/pathspec metacharacters, and anything outside the git
117
+ * ref-name charset — so `${ref}:${path}` in `git show` can never be a `-`-flag.
118
+ */
119
+ export function isSafeRef(ref) {
120
+ return (ref.length > 0 &&
121
+ ref.length <= 256 &&
122
+ !ref.startsWith('-') &&
123
+ !ref.includes('..') &&
124
+ /^[A-Za-z0-9._/-]+$/.test(ref));
125
+ }
126
+ /** A full commit SHA (sha-1 or sha-256) — a pinned, immutable ref (#428). */
127
+ export function isPinnedSha(ref) {
128
+ return /^[0-9a-f]{40}$/i.test(ref) || /^[0-9a-f]{64}$/i.test(ref);
129
+ }
130
+ /** Stable cache directory name: the last two path segments, `owner__name`. */
131
+ export function bareDirFor(repo) {
132
+ const trimmed = repo
133
+ .replace(/\/+$/, '')
134
+ .replace(/\.git$/, '')
135
+ .replace(/^[a-z+]+:\/\//i, '')
136
+ .replace(/^~\//, '');
137
+ const segments = trimmed.split(/[/:]/).filter(Boolean).map(sanitizeSegment);
138
+ const key = segments.slice(-2).join('__') || 'skills';
139
+ return join(homedir(), '.cache', 'cez', 'skills', key);
140
+ }
141
+ function sanitizeSegment(s) {
142
+ return s.replace(/[^\w.-]/g, '-');
143
+ }
144
+ /** One warning per bad source per process — this runs on every cockpit open. */
145
+ const warnedUnsafeRemotes = new Set();
146
+ function warnUnsafeRemoteOnce(repo) {
147
+ if (warnedUnsafeRemotes.has(repo))
148
+ return;
149
+ warnedUnsafeRemotes.add(repo);
150
+ console.warn(`[cez] ignoring skills repo ${JSON.stringify(repo)} — not an accepted source shape ` +
151
+ `(owner/name, an https/http/ssh/git URL, git@host:path, or a local/file:// path). ` +
152
+ `Check "skillsRepos" in .ai/cezar/config.json.`);
153
+ }
154
+ /** Clone the skills repo bare (no checkout) into the global cache, once. */
155
+ export async function ensureBareClone(repo) {
156
+ // Validate before anything else, cache hit or not: "this source is refusable"
157
+ // should never depend on whether a clone happens to exist already.
158
+ const remote = safeRemoteFor(repo);
159
+ if (!remote) {
160
+ // Everything else in this module degrades silently (offline, no access —
161
+ // all expected). A refusal is different: it means the config is wrong or
162
+ // tampered with, and the operator otherwise just sees skills disappear.
163
+ warnUnsafeRemoteOnce(repo);
164
+ throw new Error(`refusing unsafe skills repo remote: ${repo}`);
165
+ }
166
+ const bareDir = bareDirFor(repo);
167
+ if (existsSync(join(bareDir, 'HEAD')))
168
+ return { bareDir, created: false };
169
+ await mkdir(dirname(bareDir), { recursive: true });
170
+ // `--` separates options from the remote/dir operands: even a value that
171
+ // slipped past validation can't pose as a git option.
172
+ const res = await git(['clone', '--bare', '--', remote, bareDir], CLONE_TIMEOUT_MS);
173
+ if (!res.ok)
174
+ throw new Error(`git clone --bare ${remote} failed: ${res.stderr.trim()}`);
175
+ return { bareDir, created: true };
176
+ }
177
+ /** "Refresh" — update every branch head in the bare clone from origin. */
178
+ export async function fetchAll(bareDir) {
179
+ const res = await git(['fetch', 'origin', '--prune', '+refs/heads/*:refs/heads/*'], CLONE_TIMEOUT_MS, bareDir);
180
+ if (!res.ok)
181
+ throw new Error(`git fetch failed: ${res.stderr.trim() || res.stdout.trim()}`);
182
+ }
183
+ /**
184
+ * Resolve a source ref to the immutable commit SHA it names, or null (#428).
185
+ * An unsafe ref is refused outright. A ref pinned to a full commit SHA is
186
+ * verified to name exactly that commit and is *never* replaced by a moving
187
+ * `HEAD` fallback — that is the whole point of pinning against a force-push /
188
+ * supply-chain swap. A branch/tag falls back through the usual candidates.
189
+ *
190
+ * Always returning a SHA (never the mutable name) means one listing reads every
191
+ * skill at a single commit: a concurrent `refreshTeamSkills` can move the branch
192
+ * head mid-read without the list and the bodies drifting apart.
193
+ */
194
+ async function resolveRef(bareDir, ref) {
195
+ if (!isSafeRef(ref))
196
+ return null;
197
+ if (isPinnedSha(ref)) {
198
+ const sha = ref.toLowerCase();
199
+ const probe = await git(['rev-parse', '--verify', '--quiet', `${sha}^{commit}`], LIST_TIMEOUT_MS, bareDir);
200
+ // Pinned means pinned: only accept when rev-parse names exactly this commit.
201
+ return probe.ok && probe.stdout.trim() === sha ? sha : null;
202
+ }
203
+ for (const candidate of [ref, `refs/heads/${ref}`, 'HEAD']) {
204
+ const probe = await git(['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`], LIST_TIMEOUT_MS, bareDir);
205
+ if (probe.ok && probe.stdout.trim())
206
+ return probe.stdout.trim();
207
+ }
208
+ return null;
209
+ }
210
+ /**
211
+ * Match the janitor conventions plus our own:
212
+ * - `**\/SKILL.md` → skill named after the parent directory (with references/)
213
+ * - `**\/commands/<n>.md` → skill `<n>`
214
+ * - `.ai/skills/**\/*.md` or `.ai/cezar/skills/**\/*.md` → frontmatter/basename name
215
+ */
216
+ function matchSkillPath(line) {
217
+ if (line === 'SKILL.md' || line.endsWith('/SKILL.md')) {
218
+ const parts = line.split('/');
219
+ if (parts.length < 2)
220
+ return null;
221
+ const parent = parts[parts.length - 2];
222
+ return parent && parent !== '.' ? { name: parent, kind: 'skill' } : null;
223
+ }
224
+ const cmd = /(?:^|\/)commands\/([^/]+)\.md$/.exec(line);
225
+ if (cmd)
226
+ return { name: cmd[1], kind: 'command' };
227
+ if (/(?:^|\/)\.ai\/(?:cezar\/)?skills\/.+\.md$/.test(line))
228
+ return { name: null, kind: 'markdown' };
229
+ return null;
230
+ }
231
+ /**
232
+ * Read one file from the bare clone at the source's ref. Null on any failure.
233
+ * `atCommit` pins the read to an already-resolved commit, so a caller listing
234
+ * many files reads them all at the same commit (and skips re-resolving).
235
+ */
236
+ export async function readRemoteSkill(src, path, atCommit) {
237
+ const bareDir = bareDirFor(src.repo);
238
+ if (!existsSync(join(bareDir, 'HEAD')))
239
+ return null;
240
+ const ref = atCommit ?? (await resolveRef(bareDir, src.ref));
241
+ if (ref === null)
242
+ return null;
243
+ const res = await git(['show', `${ref}:${path}`], LIST_TIMEOUT_MS, bareDir);
244
+ return res.ok ? res.stdout : null;
245
+ }
246
+ /**
247
+ * List every skill the repo defines at `src.ref`. Reads from the local bare
248
+ * clone only — no network. Empty list when the clone doesn't exist yet or
249
+ * the ref can't be resolved.
250
+ */
251
+ export async function listRemoteSkills(src) {
252
+ const bareDir = bareDirFor(src.repo);
253
+ if (!existsSync(join(bareDir, 'HEAD')))
254
+ return [];
255
+ // An immutable SHA (#428): the tree listing and every body below are read at
256
+ // this one commit, and it is what gets recorded on each skill.
257
+ const commit = await resolveRef(bareDir, src.ref);
258
+ if (commit === null)
259
+ return [];
260
+ // `--` after the ref keeps a `-`-leading value out of git's option surface.
261
+ const ls = await git(['ls-tree', '-r', '--name-only', commit, '--'], LIST_TIMEOUT_MS, bareDir);
262
+ if (!ls.ok)
263
+ return [];
264
+ const skills = [];
265
+ const seen = new Set();
266
+ for (const line of ls.stdout.split('\n')) {
267
+ if (!line)
268
+ continue;
269
+ const hit = matchSkillPath(line);
270
+ if (!hit)
271
+ continue;
272
+ const raw = await readRemoteSkill(src, line, commit);
273
+ if (raw === null)
274
+ continue;
275
+ const { frontmatter, body } = parseFrontmatter(raw);
276
+ const name = hit.name ??
277
+ (typeof frontmatter.name === 'string' && frontmatter.name.trim()
278
+ ? frontmatter.name.trim()
279
+ : basename(line, '.md'));
280
+ if (seen.has(name))
281
+ continue;
282
+ seen.add(name);
283
+ const description = typeof frontmatter.description === 'string' && frontmatter.description.trim()
284
+ ? frontmatter.description.trim()
285
+ : undefined;
286
+ skills.push({
287
+ name,
288
+ description,
289
+ body,
290
+ path: `${src.repo}@${src.ref}:${line}`,
291
+ source: 'team',
292
+ team: { repo: src.repo, ref: src.ref, path: line, dir: hit.kind === 'skill', commit },
293
+ });
294
+ }
295
+ return skills;
296
+ }
297
+ // ---- materialization (directory skills) ---------------------------------------
298
+ /**
299
+ * Copy a directory skill (SKILL.md + references/…) out of the bare clone into
300
+ * `<repoRoot>/.claude/skills/<name>/` so claude sees the references on disk,
301
+ * and keep it out of the user's git via `.git/info/exclude`. Returns false
302
+ * when there is nothing to materialize (not a directory skill, no clone…).
303
+ */
304
+ export async function materializeSkillDir(repoRoot, skill) {
305
+ if (!skill.team?.dir || !skill.team.path.endsWith('SKILL.md'))
306
+ return false;
307
+ const bareDir = bareDirFor(skill.team.repo);
308
+ if (!existsSync(join(bareDir, 'HEAD')))
309
+ return false;
310
+ const ref = await resolveRef(bareDir, skill.team.ref);
311
+ if (ref === null)
312
+ return false;
313
+ const srcDir = skill.team.path.slice(0, -'/SKILL.md'.length);
314
+ const ls = await git(['ls-tree', '-r', '--name-only', ref, '--', srcDir], LIST_TIMEOUT_MS, bareDir);
315
+ if (!ls.ok)
316
+ return false;
317
+ const destDir = join(repoRoot, '.claude', 'skills', skill.name);
318
+ let wrote = 0;
319
+ for (const file of ls.stdout.split('\n').filter(Boolean)) {
320
+ const rel = file.slice(srcDir.length + 1);
321
+ // git paths are repo-relative and normalized, but never trust them blindly.
322
+ if (!rel || rel.split('/').includes('..'))
323
+ continue;
324
+ const show = await git(['show', `${ref}:${file}`], LIST_TIMEOUT_MS, bareDir);
325
+ if (!show.ok)
326
+ continue;
327
+ const target = join(destDir, rel);
328
+ await mkdir(dirname(target), { recursive: true });
329
+ await writeFile(target, show.stdout, 'utf8');
330
+ wrote++;
331
+ }
332
+ if (wrote === 0)
333
+ return false;
334
+ await excludeFromGit(repoRoot, `.claude/skills/${skill.name}/`);
335
+ return true;
336
+ }
337
+ /** Append a pattern to git's `info/exclude` (idempotent, non-fatal). */
338
+ async function excludeFromGit(repoRoot, pattern) {
339
+ try {
340
+ // Resolve the real exclude file: in a linked worktree (spec 006) `.git`
341
+ // is a file and `info/exclude` lives in the shared common dir — which
342
+ // also means one exclude entry covers every task worktree.
343
+ const probe = await git(['rev-parse', '--path-format=absolute', '--git-common-dir'], LIST_TIMEOUT_MS, repoRoot);
344
+ const gitDir = probe.ok && probe.stdout.trim() ? probe.stdout.trim() : join(repoRoot, '.git');
345
+ const excludePath = join(gitDir, 'info', 'exclude');
346
+ let prev = '';
347
+ try {
348
+ prev = await readFile(excludePath, 'utf8');
349
+ }
350
+ catch {
351
+ // no exclude file yet
352
+ }
353
+ if (prev.split('\n').includes(pattern))
354
+ return;
355
+ await mkdir(dirname(excludePath), { recursive: true });
356
+ await writeFile(excludePath, prev + (prev && !prev.endsWith('\n') ? '\n' : '') + pattern + '\n', 'utf8');
357
+ }
358
+ catch {
359
+ // non-fatal — `.git` might be a linked file (worktree) or absent entirely
360
+ }
361
+ }
362
+ // ---- in-process cache ----------------------------------------------------------
363
+ // Clone attempts are expensive when the network is down (git can hang on
364
+ // DNS/TCP), so each source gets one implicit attempt per process. "Refresh"
365
+ // always retries.
366
+ const cloneAttempted = new Set();
367
+ // Isolated review worktrees have no local `.agents/skills` (gitignored, absent
368
+ // in a fresh checkout), so codex reads skills straight from this global bare
369
+ // cache. A clone left by an earlier run — or one this long-running process
370
+ // fetched hours ago — silently serves a stale template. Passive loads therefore
371
+ // fetch on the first touch per process and then at most once per TTL, keeping
372
+ // the cache current without a manual "Refresh" and without fetching on every
373
+ // catalog read. `refresh` (the explicit button / #613's post-update
374
+ // invalidateCatalog) still fetches unconditionally.
375
+ const PASSIVE_FETCH_TTL_MS = 6 * 60 * 60 * 1_000;
376
+ const lastFetchByRepo = new Map();
377
+ /**
378
+ * Whether a passive (non-`refresh`) load should `git fetch` an existing bare
379
+ * clone: yes on the first touch this process, and yes once the last fetch is
380
+ * older than `ttlMs`. Pure so the freshness policy is unit-tested without git.
381
+ */
382
+ export function shouldPassiveFetch(opts) {
383
+ return !opts.attempted || opts.now - opts.fetchedAt > opts.ttlMs;
384
+ }
385
+ // Both maps are keyed by `repoRoot` (multi-project workspace, step 2.6): each
386
+ // project resolves its own `.ai/cezar/config.json` → `skillsRepos`, so one
387
+ // project's team-skill list must never be served under another project's scope.
388
+ const teamSkillsByRoot = new Map();
389
+ const firstLoadByRoot = new Map();
390
+ function initialTeamSkillsLoad(repoRoot) {
391
+ const existing = firstLoadByRoot.get(repoRoot);
392
+ if (existing)
393
+ return existing;
394
+ const load = loadTeamSkills(repoRoot, false).catch(() => teamSkillsByRoot.get(repoRoot) ?? []);
395
+ firstLoadByRoot.set(repoRoot, load);
396
+ return load;
397
+ }
398
+ /**
399
+ * The current team-skill list for this project, straight from memory. The
400
+ * first call per `repoRoot` kicks off an async background load (clone + list)
401
+ * and returns immediately — the GUI refetches, so remote skills appear moments
402
+ * later instead of blocking the first `GET /api/skills`.
403
+ */
404
+ export function getTeamSkillsCached(repoRoot) {
405
+ void initialTeamSkillsLoad(repoRoot);
406
+ return teamSkillsByRoot.get(repoRoot) ?? [];
407
+ }
408
+ /**
409
+ * Wait for the same non-refreshing load kicked off by `getTeamSkillsCached`.
410
+ * The normal catalog read stays immediate; callers use this only for a
411
+ * background convergence read after they have already rendered local skills.
412
+ */
413
+ export function waitForTeamSkills(repoRoot) {
414
+ return initialTeamSkillsLoad(repoRoot);
415
+ }
416
+ /** Refresh: clone missing sources, `git fetch` existing ones, reload the list. */
417
+ export async function refreshTeamSkills(repoRoot) {
418
+ const load = loadTeamSkills(repoRoot, true).catch(() => teamSkillsByRoot.get(repoRoot) ?? []);
419
+ firstLoadByRoot.set(repoRoot, load);
420
+ return load;
421
+ }
422
+ async function loadTeamSkills(repoRoot, refresh) {
423
+ const config = await loadConfig(repoRoot);
424
+ const out = [];
425
+ const seen = new Set();
426
+ for (const src of config.skillsRepos) {
427
+ try {
428
+ if (refresh) {
429
+ const { bareDir, created } = await ensureBareClone(src.repo);
430
+ if (!created)
431
+ await fetchAll(bareDir);
432
+ cloneAttempted.add(src.repo);
433
+ lastFetchByRepo.set(src.repo, Date.now());
434
+ }
435
+ else if (shouldPassiveFetch({
436
+ attempted: cloneAttempted.has(src.repo),
437
+ fetchedAt: lastFetchByRepo.get(src.repo) ?? 0,
438
+ now: Date.now(),
439
+ ttlMs: PASSIVE_FETCH_TTL_MS,
440
+ })) {
441
+ cloneAttempted.add(src.repo);
442
+ const { bareDir, created } = await ensureBareClone(src.repo);
443
+ // A clone left by an earlier run is very likely behind origin; fetch it
444
+ // so worktree reviews never read a stale skills template.
445
+ if (!created)
446
+ await fetchAll(bareDir);
447
+ lastFetchByRepo.set(src.repo, Date.now());
448
+ }
449
+ }
450
+ catch {
451
+ // offline / no access — list whatever an older clone has (or nothing)
452
+ }
453
+ try {
454
+ for (const skill of await listRemoteSkills(src)) {
455
+ if (seen.has(skill.name))
456
+ continue;
457
+ seen.add(skill.name);
458
+ out.push(skill);
459
+ }
460
+ }
461
+ catch {
462
+ // degrade: this source contributes nothing
463
+ }
464
+ }
465
+ teamSkillsByRoot.set(repoRoot, out);
466
+ return out;
467
+ }
468
+ //# sourceMappingURL=skills-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-remote.js","sourceRoot":"","sources":["../src/skills-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ export type SkillsUpdateScope = 'project' | 'global';
2
+ export type SkillsUpdateStatus = 'idle' | 'checking' | 'available' | 'updating' | 'current' | 'unavailable' | 'error';
3
+ export interface SkillsUpdateScopeState {
4
+ scope: SkillsUpdateScope;
5
+ status: SkillsUpdateStatus;
6
+ available: boolean;
7
+ skills: string[];
8
+ checkedAt: string | null;
9
+ updatedAt: string | null;
10
+ reason?: string;
11
+ }
12
+ export interface SkillsUpdateState {
13
+ status: SkillsUpdateStatus;
14
+ available: boolean;
15
+ autoUpdateEnabled: boolean;
16
+ inherited: boolean;
17
+ checkedAt: string | null;
18
+ updatedAt: string | null;
19
+ scopes: SkillsUpdateScopeState[];
20
+ needsUpgradeNotes: boolean;
21
+ }
22
+ interface CommandResult {
23
+ stdout: string;
24
+ stderr: string;
25
+ }
26
+ export interface SkillsUpdateServiceOptions {
27
+ homeDir?: string;
28
+ now?: () => number;
29
+ timeoutMs?: number;
30
+ run?: (file: string, args: readonly string[], cwd: string, timeoutMs: number) => Promise<CommandResult>;
31
+ resolveNpx?: () => Promise<string | null>;
32
+ invalidateCatalog?: (repoRoot: string) => Promise<unknown> | unknown;
33
+ }
34
+ /** A manual apply distinguishes contention from ordinary unavailable state. */
35
+ export declare class SkillsUpdateConflictError extends Error {
36
+ constructor();
37
+ }
38
+ /** Accept only GitHub's canonical host and the documented owner/repo shorthand. */
39
+ export declare function isOpenMercatoSkillsSource(value: unknown): boolean;
40
+ export declare class SkillsUpdateService {
41
+ private readonly home;
42
+ private readonly now;
43
+ private readonly timeoutMs;
44
+ private readonly runCommand;
45
+ private readonly resolveNpx;
46
+ private readonly invalidateCatalog;
47
+ private readonly states;
48
+ private readonly pending;
49
+ private globalScopeCache?;
50
+ private operationTail;
51
+ constructor(options?: SkillsUpdateServiceOptions);
52
+ snapshot(repoRoot: string): SkillsUpdateState;
53
+ check(repoRoot: string, force?: boolean): Promise<SkillsUpdateState>;
54
+ /** Apply only names proven available by the latest check. Browser callers
55
+ * cannot widen this list: ownership is re-read from the lock immediately
56
+ * before each fixed-argument invocation. */
57
+ update(repoRoot: string, rejectIfBusy?: boolean): Promise<SkillsUpdateState>;
58
+ evict(repoRoot: string): void;
59
+ private serialized;
60
+ private makeState;
61
+ private performCheck;
62
+ private performUpdate;
63
+ private checkScope;
64
+ private acquireLock;
65
+ private readLockMetadata;
66
+ }
67
+ export interface SkillsUpdateProject {
68
+ id: string;
69
+ root: string;
70
+ status?: string;
71
+ }
72
+ /** Post-listen owner for background checks. Its tail deliberately swallows
73
+ * failures: update availability can never reject or delay server startup. */
74
+ export declare class SkillsUpdateCoordinator {
75
+ private readonly service;
76
+ private readonly autoUpdateEnabled;
77
+ private readonly roots;
78
+ private tail;
79
+ private stopped;
80
+ constructor(service: SkillsUpdateService, autoUpdateEnabled: () => Promise<boolean>);
81
+ start(projects: readonly SkillsUpdateProject[]): void;
82
+ add(id: string, root: string): void;
83
+ remove(id: string): void;
84
+ stop(): void;
85
+ /** Test/lifecycle hook: resolves after all work queued so far. */
86
+ settled(): Promise<void>;
87
+ }
88
+ export {};