@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3

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 (670) hide show
  1. package/dist/admin/admin.controller.d.ts +17 -17
  2. package/dist/admin/admin.controller.js +43 -26
  3. package/dist/admin/admin.module.d.ts +3 -0
  4. package/dist/admin/admin.module.js +22 -0
  5. package/dist/admin/extensions.controller.d.ts +14 -14
  6. package/dist/admin/extensions.controller.js +30 -17
  7. package/dist/admin/setup-lock.d.ts +16 -0
  8. package/dist/admin/setup-lock.js +47 -0
  9. package/dist/admin/setup.controller.d.ts +8 -8
  10. package/dist/admin/setup.controller.js +27 -25
  11. package/dist/admin/setup.service.d.ts +19 -27
  12. package/dist/admin/setup.service.js +61 -61
  13. package/dist/agents/agent-lookup.d.ts +53 -0
  14. package/dist/agents/agent-lookup.js +187 -0
  15. package/dist/agents/agents.controller.d.ts +1 -1
  16. package/dist/agents/agents.controller.js +14 -8
  17. package/dist/agents/agents.module.d.ts +7 -0
  18. package/dist/agents/agents.module.js +41 -0
  19. package/dist/agents/agents.service.d.ts +39 -58
  20. package/dist/agents/agents.service.js +280 -335
  21. package/dist/agents/definition.d.ts +39 -8
  22. package/dist/agents/definition.js +201 -17
  23. package/dist/agents/models.controller.d.ts +1 -1
  24. package/dist/agents/models.controller.js +2 -2
  25. package/dist/agents/templates.controller.d.ts +1 -1
  26. package/dist/agents/templates.controller.js +2 -2
  27. package/dist/agents/templates.d.ts +6 -8
  28. package/dist/agents/templates.js +39 -8
  29. package/dist/app.d.ts +93 -0
  30. package/dist/app.js +150 -0
  31. package/dist/catalog/admin-catalog.controller.d.ts +3 -3
  32. package/dist/catalog/admin-catalog.controller.js +27 -13
  33. package/dist/catalog/catalog-content.d.ts +185 -0
  34. package/dist/catalog/catalog-content.js +326 -0
  35. package/dist/catalog/catalog-items.d.ts +186 -0
  36. package/dist/catalog/catalog-items.js +410 -0
  37. package/dist/catalog/catalog.module.d.ts +14 -0
  38. package/dist/catalog/catalog.module.js +71 -0
  39. package/dist/catalog/catalog.service.d.ts +34 -188
  40. package/dist/catalog/catalog.service.js +155 -489
  41. package/dist/catalog/claude/agents.js +13 -10
  42. package/dist/catalog/cli.d.ts +3 -2
  43. package/dist/catalog/cli.js +13 -31
  44. package/dist/catalog/job-ids.d.ts +15 -0
  45. package/dist/catalog/job-ids.js +15 -0
  46. package/dist/catalog/jobs.d.ts +27 -0
  47. package/dist/catalog/jobs.js +70 -0
  48. package/dist/catalog/locks.d.ts +24 -0
  49. package/dist/catalog/locks.js +63 -0
  50. package/dist/catalog/marketplaces.controller.d.ts +4 -4
  51. package/dist/catalog/marketplaces.controller.js +22 -11
  52. package/dist/catalog/marketplaces.service.d.ts +31 -14
  53. package/dist/catalog/marketplaces.service.js +330 -256
  54. package/dist/catalog/org-catalog.controller.d.ts +4 -3
  55. package/dist/catalog/org-catalog.controller.js +29 -14
  56. package/dist/catalog/org-catalog.service.d.ts +32 -198
  57. package/dist/catalog/org-catalog.service.js +159 -400
  58. package/dist/catalog/plugin-import.d.ts +73 -34
  59. package/dist/catalog/plugin-import.js +356 -217
  60. package/dist/catalog/plugin-install.d.ts +83 -41
  61. package/dist/catalog/plugin-install.js +421 -269
  62. package/dist/catalog/plugin-upgrade.d.ts +59 -4
  63. package/dist/catalog/plugin-upgrade.js +407 -282
  64. package/dist/catalog/requests.service.d.ts +27 -15
  65. package/dist/catalog/requests.service.js +201 -145
  66. package/dist/catalog/upgrade-targets.d.ts +4 -7
  67. package/dist/channels/actions.d.ts +6 -4
  68. package/dist/channels/actions.js +1 -1
  69. package/dist/channels/cards.d.ts +10 -4
  70. package/dist/channels/cards.js +16 -8
  71. package/dist/channels/channels.module.d.ts +40 -0
  72. package/dist/channels/channels.module.js +128 -0
  73. package/dist/channels/connections.controller.d.ts +1 -1
  74. package/dist/channels/connections.controller.js +11 -6
  75. package/dist/channels/connections.service.d.ts +43 -21
  76. package/dist/channels/connections.service.js +236 -131
  77. package/dist/channels/inbound.d.ts +34 -38
  78. package/dist/channels/inbound.js +107 -41
  79. package/dist/channels/job-ids.d.ts +10 -0
  80. package/dist/channels/job-ids.js +10 -0
  81. package/dist/channels/jobs.d.ts +85 -0
  82. package/dist/channels/jobs.js +157 -0
  83. package/dist/channels/outbound.d.ts +60 -82
  84. package/dist/channels/outbound.js +165 -194
  85. package/dist/channels/supervisor.d.ts +88 -46
  86. package/dist/channels/supervisor.js +230 -132
  87. package/dist/channels/threads.d.ts +29 -8
  88. package/dist/channels/threads.js +71 -13
  89. package/dist/channels/webhook.d.ts +20 -14
  90. package/dist/channels/webhook.js +51 -20
  91. package/dist/config/load.d.ts +3 -2
  92. package/dist/config/load.js +3 -2
  93. package/dist/config/nacos-source.js +11 -2
  94. package/dist/config/schema.d.ts +1 -0
  95. package/dist/config/schema.js +12 -6
  96. package/dist/conversations/access.d.ts +29 -0
  97. package/dist/conversations/access.js +86 -0
  98. package/dist/conversations/artifacts.d.ts +11 -11
  99. package/dist/conversations/artifacts.js +36 -10
  100. package/dist/conversations/attachments.controller.d.ts +1 -1
  101. package/dist/conversations/attachments.controller.js +8 -6
  102. package/dist/conversations/attachments.module.d.ts +7 -0
  103. package/dist/conversations/attachments.module.js +25 -0
  104. package/dist/conversations/attachments.service.d.ts +30 -22
  105. package/dist/conversations/attachments.service.js +119 -46
  106. package/dist/conversations/conversations.controller.d.ts +8 -7
  107. package/dist/conversations/conversations.controller.js +59 -29
  108. package/dist/conversations/conversations.module.d.ts +8 -0
  109. package/dist/conversations/conversations.module.js +69 -0
  110. package/dist/conversations/conversations.service.d.ts +40 -38
  111. package/dist/conversations/conversations.service.js +130 -140
  112. package/dist/conversations/event-log.d.ts +39 -18
  113. package/dist/conversations/event-log.js +93 -27
  114. package/dist/conversations/events.d.ts +23 -3
  115. package/dist/conversations/events.js +26 -14
  116. package/dist/conversations/files.d.ts +10 -10
  117. package/dist/conversations/files.js +37 -11
  118. package/dist/conversations/idem-keys.d.ts +5 -0
  119. package/dist/conversations/idem-keys.js +5 -0
  120. package/dist/conversations/job-ids.d.ts +6 -0
  121. package/dist/conversations/job-ids.js +6 -0
  122. package/dist/conversations/outputs-read.d.ts +11 -11
  123. package/dist/conversations/outputs-read.js +31 -7
  124. package/dist/conversations/queue.d.ts +48 -56
  125. package/dist/conversations/queue.js +13 -289
  126. package/dist/conversations/queue.service.d.ts +60 -0
  127. package/dist/conversations/queue.service.js +343 -0
  128. package/dist/conversations/sandbox-status.d.ts +13 -10
  129. package/dist/conversations/sandbox-status.js +36 -8
  130. package/dist/conversations/titles.d.ts +71 -24
  131. package/dist/conversations/titles.js +159 -63
  132. package/dist/ctx/bus.js +9 -3
  133. package/dist/ctx/create-ctx.d.ts +6 -0
  134. package/dist/ctx/create-ctx.js +7 -9
  135. package/dist/ctx/lock.d.ts +7 -3
  136. package/dist/ctx/lock.js +9 -20
  137. package/dist/ctx/secrets.d.ts +10 -2
  138. package/dist/ctx/secrets.js +7 -3
  139. package/dist/db/kernel-schema.d.ts +4 -4
  140. package/dist/db/pool.d.ts +5 -0
  141. package/dist/db/pool.js +1 -0
  142. package/dist/errors.d.ts +1 -0
  143. package/dist/errors.js +1 -0
  144. package/dist/evals/budget.d.ts +42 -21
  145. package/dist/evals/budget.js +114 -62
  146. package/dist/evals/evals.module.d.ts +31 -0
  147. package/dist/evals/evals.module.js +114 -0
  148. package/dist/evals/jobs.d.ts +20 -0
  149. package/dist/evals/jobs.js +45 -0
  150. package/dist/evals/recorded-tools.d.ts +27 -1
  151. package/dist/evals/recorded-tools.js +85 -10
  152. package/dist/evals/run-replay.d.ts +61 -8
  153. package/dist/evals/run-replay.js +159 -85
  154. package/dist/evals/runs.controller.d.ts +1 -1
  155. package/dist/evals/runs.controller.js +17 -8
  156. package/dist/evals/runs.service.d.ts +23 -45
  157. package/dist/evals/runs.service.js +245 -234
  158. package/dist/evals/sets.controller.d.ts +1 -1
  159. package/dist/evals/sets.controller.js +17 -8
  160. package/dist/evals/sets.service.d.ts +22 -6
  161. package/dist/evals/sets.service.js +248 -194
  162. package/dist/evals/snapshot.d.ts +2 -2
  163. package/dist/evals/step-replay.d.ts +2 -2
  164. package/dist/evals/step-replay.js +1 -1
  165. package/dist/evals/trajectory.controller.d.ts +1 -1
  166. package/dist/evals/trajectory.controller.js +11 -7
  167. package/dist/evals/trajectory.d.ts +2 -2
  168. package/dist/evals/trajectory.service.d.ts +5 -4
  169. package/dist/evals/trajectory.service.js +30 -7
  170. package/dist/evals/worker.d.ts +44 -27
  171. package/dist/evals/worker.js +220 -121
  172. package/dist/extensions/admin-ops.d.ts +61 -33
  173. package/dist/extensions/admin-ops.js +248 -154
  174. package/dist/extensions/admin-view.d.ts +38 -27
  175. package/dist/extensions/admin-view.js +126 -55
  176. package/dist/extensions/approvals.d.ts +12 -8
  177. package/dist/extensions/approvals.js +73 -46
  178. package/dist/extensions/blobs.d.ts +27 -10
  179. package/dist/extensions/blobs.js +111 -45
  180. package/dist/extensions/bootstrap.d.ts +58 -31
  181. package/dist/extensions/bootstrap.js +175 -121
  182. package/dist/extensions/cli.d.ts +20 -10
  183. package/dist/extensions/cli.js +41 -96
  184. package/dist/extensions/config-issues.d.ts +7 -0
  185. package/dist/extensions/config-issues.js +31 -0
  186. package/dist/extensions/deployment-config-store.d.ts +49 -0
  187. package/dist/extensions/deployment-config-store.js +133 -0
  188. package/dist/extensions/deployment-config.d.ts +58 -67
  189. package/dist/extensions/deployment-config.js +202 -230
  190. package/dist/extensions/enabled.d.ts +5 -5
  191. package/dist/extensions/extensions.module.d.ts +8 -0
  192. package/dist/extensions/extensions.module.js +77 -0
  193. package/dist/extensions/hooks.d.ts +3 -2
  194. package/dist/extensions/hooks.js +1 -1
  195. package/dist/extensions/host.d.ts +72 -68
  196. package/dist/extensions/host.js +191 -152
  197. package/dist/extensions/installs.d.ts +49 -16
  198. package/dist/extensions/installs.js +128 -32
  199. package/dist/extensions/job-ids.d.ts +6 -0
  200. package/dist/extensions/job-ids.js +6 -0
  201. package/dist/extensions/lifecycle-topics.d.ts +18 -0
  202. package/dist/extensions/lifecycle-topics.js +18 -0
  203. package/dist/extensions/lifecycle.d.ts +35 -47
  204. package/dist/extensions/lifecycle.js +103 -39
  205. package/dist/extensions/locks.d.ts +33 -0
  206. package/dist/extensions/locks.js +86 -0
  207. package/dist/extensions/migrate-lock.d.ts +3 -4
  208. package/dist/extensions/org-config.controller.d.ts +1 -1
  209. package/dist/extensions/org-config.controller.js +8 -5
  210. package/dist/extensions/org-config.d.ts +48 -46
  211. package/dist/extensions/org-config.js +284 -226
  212. package/dist/extensions/registry.d.ts +50 -2
  213. package/dist/extensions/registry.js +89 -4
  214. package/dist/extensions/sources.d.ts +12 -8
  215. package/dist/extensions/sources.js +34 -13
  216. package/dist/files/files.module.d.ts +3 -0
  217. package/dist/files/files.module.js +22 -0
  218. package/dist/files/previewers.controller.d.ts +7 -2
  219. package/dist/files/previewers.controller.js +17 -9
  220. package/dist/files/previewers.d.ts +13 -18
  221. package/dist/files/previewers.js +83 -36
  222. package/dist/http/adapter.d.ts +3 -0
  223. package/dist/http/adapter.js +25 -0
  224. package/dist/http/api.module.d.ts +3 -110
  225. package/dist/http/api.module.js +47 -355
  226. package/dist/http/app.d.ts +11 -15
  227. package/dist/http/app.js +17 -62
  228. package/dist/http/error-filter.module.d.ts +5 -0
  229. package/dist/http/error-filter.module.js +18 -0
  230. package/dist/http/error.filter.js +2 -2
  231. package/dist/identity/accounts.d.ts +82 -29
  232. package/dist/identity/accounts.js +294 -175
  233. package/dist/identity/api-tokens.d.ts +11 -7
  234. package/dist/identity/api-tokens.js +71 -44
  235. package/dist/identity/audit.d.ts +7 -4
  236. package/dist/identity/audit.js +5 -1
  237. package/dist/identity/auth.controller.d.ts +11 -10
  238. package/dist/identity/auth.controller.js +31 -25
  239. package/dist/identity/auth.guard.d.ts +3 -3
  240. package/dist/identity/auth.guard.js +6 -4
  241. package/dist/identity/binding.d.ts +9 -11
  242. package/dist/identity/binding.js +41 -13
  243. package/dist/identity/enterprise-admin.d.ts +18 -12
  244. package/dist/identity/enterprise-admin.js +67 -13
  245. package/dist/identity/external-identity-lock.d.ts +17 -0
  246. package/dist/identity/external-identity-lock.js +39 -0
  247. package/dist/identity/external.d.ts +19 -15
  248. package/dist/identity/external.js +163 -125
  249. package/dist/identity/identity.module.d.ts +6 -0
  250. package/dist/identity/identity.module.js +56 -0
  251. package/dist/identity/me.controller.d.ts +16 -15
  252. package/dist/identity/me.controller.js +37 -31
  253. package/dist/identity/sessions.d.ts +12 -10
  254. package/dist/identity/sessions.js +74 -42
  255. package/dist/identity/settings.d.ts +20 -14
  256. package/dist/identity/settings.js +86 -58
  257. package/dist/identity/sso.controller.d.ts +7 -7
  258. package/dist/identity/sso.controller.js +13 -9
  259. package/dist/identity/sso.d.ts +9 -12
  260. package/dist/identity/sso.js +54 -24
  261. package/dist/inbox/inbox.module.d.ts +3 -0
  262. package/dist/inbox/inbox.module.js +22 -0
  263. package/dist/inbox/inbox.service.d.ts +7 -9
  264. package/dist/inbox/inbox.service.js +32 -11
  265. package/dist/index.d.ts +16 -11
  266. package/dist/index.js +9 -6
  267. package/dist/infra/cache/cache.module.d.ts +3 -0
  268. package/dist/infra/cache/cache.module.js +16 -0
  269. package/dist/infra/cache/cache.service.d.ts +21 -0
  270. package/dist/infra/cache/cache.service.js +80 -0
  271. package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
  272. package/dist/infra/cache/cacheable.decorator.js +83 -0
  273. package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
  274. package/dist/infra/cli/kernel-cli.module.js +165 -0
  275. package/dist/infra/close-within.d.ts +15 -0
  276. package/dist/infra/close-within.js +36 -0
  277. package/dist/infra/config/config.module.d.ts +13 -0
  278. package/dist/infra/config/config.module.js +39 -0
  279. package/dist/infra/config/kernel-config.service.d.ts +25 -0
  280. package/dist/infra/config/kernel-config.service.js +126 -0
  281. package/dist/infra/database/after-commit.d.ts +6 -0
  282. package/dist/infra/database/after-commit.js +9 -0
  283. package/dist/infra/database/database.module.d.ts +25 -0
  284. package/dist/infra/database/database.module.js +90 -0
  285. package/dist/infra/database/kernel-db.d.ts +22 -0
  286. package/dist/infra/database/kernel-db.js +65 -0
  287. package/dist/infra/database/transaction-host.d.ts +50 -0
  288. package/dist/infra/database/transaction-host.js +125 -0
  289. package/dist/infra/database/transactional.decorator.d.ts +15 -0
  290. package/dist/infra/database/transactional.decorator.js +27 -0
  291. package/dist/infra/database/xact-lock.d.ts +17 -0
  292. package/dist/infra/database/xact-lock.js +43 -0
  293. package/dist/infra/events/kernel-events.d.ts +96 -0
  294. package/dist/infra/events/kernel-events.js +65 -0
  295. package/dist/infra/health/health.controller.d.ts +26 -0
  296. package/dist/infra/health/health.controller.js +104 -0
  297. package/dist/infra/health/health.module.d.ts +9 -0
  298. package/dist/infra/health/health.module.js +24 -0
  299. package/dist/infra/health/health.options.d.ts +10 -0
  300. package/dist/infra/health/health.options.js +15 -0
  301. package/dist/infra/health/shutdown-state.d.ts +6 -0
  302. package/dist/infra/health/shutdown-state.js +2 -0
  303. package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
  304. package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
  305. package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
  306. package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
  307. package/dist/infra/lifecycle/process-guards.d.ts +52 -0
  308. package/dist/infra/lifecycle/process-guards.js +86 -0
  309. package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
  310. package/dist/infra/lifecycle/shutdown-signals.js +48 -0
  311. package/dist/infra/lock/key-template.d.ts +13 -0
  312. package/dist/infra/lock/key-template.js +46 -0
  313. package/dist/infra/lock/lock.module.d.ts +3 -0
  314. package/dist/infra/lock/lock.module.js +16 -0
  315. package/dist/infra/lock/lock.service.d.ts +120 -0
  316. package/dist/infra/lock/lock.service.js +343 -0
  317. package/dist/infra/lock/shared-lease.d.ts +44 -0
  318. package/dist/infra/lock/shared-lease.js +121 -0
  319. package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
  320. package/dist/infra/lock/with-lock.decorator.js +49 -0
  321. package/dist/infra/logging/logging.module.d.ts +16 -0
  322. package/dist/infra/logging/logging.module.js +34 -0
  323. package/dist/infra/queue/configured-processor.d.ts +18 -0
  324. package/dist/infra/queue/configured-processor.js +23 -0
  325. package/dist/infra/queue/job-failure.d.ts +18 -0
  326. package/dist/infra/queue/job-failure.js +26 -0
  327. package/dist/infra/queue/queue-shutdown.d.ts +27 -0
  328. package/dist/infra/queue/queue-shutdown.js +81 -0
  329. package/dist/infra/queue/queue.module.d.ts +16 -0
  330. package/dist/infra/queue/queue.module.js +61 -0
  331. package/dist/infra/queue/redis-connection.d.ts +7 -0
  332. package/dist/infra/queue/redis-connection.js +18 -0
  333. package/dist/infra/queue/retired-schedulers.d.ts +7 -0
  334. package/dist/infra/queue/retired-schedulers.js +9 -0
  335. package/dist/infra/queue/run-job.d.ts +16 -0
  336. package/dist/infra/queue/run-job.js +19 -0
  337. package/dist/infra/redis/redis.module.d.ts +24 -0
  338. package/dist/infra/redis/redis.module.js +87 -0
  339. package/dist/infra/schedule/cron-tick.d.ts +12 -0
  340. package/dist/infra/schedule/cron-tick.js +25 -0
  341. package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
  342. package/dist/infra/schedule/locked-cron.decorator.js +53 -0
  343. package/dist/infra/schedule/locked-interval.d.ts +69 -0
  344. package/dist/infra/schedule/locked-interval.js +190 -0
  345. package/dist/infra/schedule/locked-tick.d.ts +90 -0
  346. package/dist/infra/schedule/locked-tick.js +137 -0
  347. package/dist/infra/schedule/schedule.module.d.ts +8 -0
  348. package/dist/infra/schedule/schedule.module.js +27 -0
  349. package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
  350. package/dist/infra/schedule/scheduled-runs.js +163 -0
  351. package/dist/infra/swagger/swagger.d.ts +16 -0
  352. package/dist/infra/swagger/swagger.js +31 -0
  353. package/dist/infra/throttler/credential-throttler.d.ts +35 -0
  354. package/dist/infra/throttler/credential-throttler.js +77 -0
  355. package/dist/infra/throttler/named-throttlers.d.ts +31 -0
  356. package/dist/infra/throttler/named-throttlers.js +119 -0
  357. package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
  358. package/dist/infra/throttler/redis-throttler-storage.js +130 -0
  359. package/dist/infra/throttler/throttler.guard.d.ts +23 -0
  360. package/dist/infra/throttler/throttler.guard.js +68 -0
  361. package/dist/infra/throttler/throttler.module.d.ts +15 -0
  362. package/dist/infra/throttler/throttler.module.js +53 -0
  363. package/dist/infra/tokens.d.ts +15 -0
  364. package/dist/infra/tokens.js +15 -0
  365. package/dist/infra/validation/create-zod-dto.d.ts +23 -0
  366. package/dist/infra/validation/create-zod-dto.js +35 -0
  367. package/dist/infra/validation/parse-with-zod.d.ts +7 -0
  368. package/dist/infra/validation/parse-with-zod.js +12 -0
  369. package/dist/infra/validation/validation.module.d.ts +3 -0
  370. package/dist/infra/validation/validation.module.js +16 -0
  371. package/dist/infra/validation/zod-params.d.ts +7 -0
  372. package/dist/infra/validation/zod-params.js +42 -0
  373. package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
  374. package/dist/infra/validation/zod-validation.pipe.js +31 -0
  375. package/dist/kernel.d.ts +9 -244
  376. package/dist/kernel.js +8 -1305
  377. package/dist/kernel.module.d.ts +17 -0
  378. package/dist/kernel.module.js +136 -0
  379. package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
  380. package/dist/lifecycle/kernel-lifecycle.js +456 -0
  381. package/dist/lifecycle/tokens.d.ts +3 -0
  382. package/dist/lifecycle/tokens.js +3 -0
  383. package/dist/log-context.d.ts +2 -0
  384. package/dist/log-context.js +4 -0
  385. package/dist/models/models.module.d.ts +3 -0
  386. package/dist/models/models.module.js +24 -0
  387. package/dist/models/prices.d.ts +8 -2
  388. package/dist/models/prices.js +65 -37
  389. package/dist/models/purposes.controller.d.ts +1 -1
  390. package/dist/models/purposes.controller.js +5 -6
  391. package/dist/models/purposes.d.ts +35 -13
  392. package/dist/models/purposes.js +101 -51
  393. package/dist/orgs/directory-sync.controller.d.ts +1 -1
  394. package/dist/orgs/directory-sync.controller.js +2 -2
  395. package/dist/orgs/directory-sync.d.ts +61 -31
  396. package/dist/orgs/directory-sync.js +212 -125
  397. package/dist/orgs/invitations.controller.d.ts +8 -8
  398. package/dist/orgs/invitations.controller.js +27 -26
  399. package/dist/orgs/invitations.service.d.ts +12 -9
  400. package/dist/orgs/invitations.service.js +130 -92
  401. package/dist/orgs/job-ids.d.ts +8 -0
  402. package/dist/orgs/job-ids.js +8 -0
  403. package/dist/orgs/members.service.d.ts +19 -12
  404. package/dist/orgs/members.service.js +161 -117
  405. package/dist/orgs/offboarding.d.ts +54 -57
  406. package/dist/orgs/offboarding.js +161 -71
  407. package/dist/orgs/org-lock.d.ts +28 -19
  408. package/dist/orgs/org-lock.js +81 -35
  409. package/dist/orgs/org.guard.d.ts +1 -1
  410. package/dist/orgs/org.guard.js +2 -2
  411. package/dist/orgs/orgs.controller.d.ts +13 -13
  412. package/dist/orgs/orgs.controller.js +29 -17
  413. package/dist/orgs/orgs.module.d.ts +6 -0
  414. package/dist/orgs/orgs.module.js +68 -0
  415. package/dist/orgs/orgs.service.d.ts +30 -19
  416. package/dist/orgs/orgs.service.js +139 -86
  417. package/dist/orgs/settings.controller.d.ts +1 -1
  418. package/dist/orgs/settings.controller.js +8 -6
  419. package/dist/orgs/settings.service.d.ts +16 -10
  420. package/dist/orgs/settings.service.js +77 -48
  421. package/dist/overrides.d.ts +56 -0
  422. package/dist/overrides.js +30 -0
  423. package/dist/roles/gateway-role.d.ts +43 -0
  424. package/dist/roles/gateway-role.js +98 -0
  425. package/dist/roles/gateway.module.d.ts +8 -0
  426. package/dist/roles/gateway.module.js +28 -0
  427. package/dist/roles/worker-role.d.ts +63 -0
  428. package/dist/roles/worker-role.js +144 -0
  429. package/dist/roles/worker.module.d.ts +14 -0
  430. package/dist/roles/worker.module.js +90 -0
  431. package/dist/runtime/abort.js +19 -2
  432. package/dist/runtime/checkpointer.d.ts +8 -3
  433. package/dist/runtime/checkpointer.js +87 -55
  434. package/dist/runtime/context/build.d.ts +6 -6
  435. package/dist/runtime/context/build.js +18 -8
  436. package/dist/runtime/context/claude-tools.d.ts +2 -1
  437. package/dist/runtime/context/claude-tools.js +9 -10
  438. package/dist/runtime/context/legacy-text.d.ts +22 -0
  439. package/dist/runtime/context/legacy-text.js +37 -0
  440. package/dist/runtime/context/skills.d.ts +29 -11
  441. package/dist/runtime/context/skills.js +37 -30
  442. package/dist/runtime/conversation-lock.d.ts +20 -11
  443. package/dist/runtime/conversation-lock.js +62 -72
  444. package/dist/runtime/hook-calls.d.ts +3 -3
  445. package/dist/runtime/hook-calls.js +1 -6
  446. package/dist/runtime/job-ids.d.ts +10 -0
  447. package/dist/runtime/job-ids.js +10 -0
  448. package/dist/runtime/langgraph-loop.js +1 -1
  449. package/dist/runtime/loop.d.ts +8 -1
  450. package/dist/runtime/loop.js +14 -0
  451. package/dist/runtime/maintenance-queue.d.ts +10 -0
  452. package/dist/runtime/maintenance-queue.js +10 -0
  453. package/dist/runtime/maintenance.d.ts +45 -74
  454. package/dist/runtime/maintenance.js +139 -137
  455. package/dist/runtime/model-call.d.ts +7 -4
  456. package/dist/runtime/model-call.js +25 -58
  457. package/dist/runtime/providers.d.ts +17 -6
  458. package/dist/runtime/providers.js +66 -25
  459. package/dist/runtime/quota.d.ts +17 -3
  460. package/dist/runtime/quota.js +27 -2
  461. package/dist/runtime/retired-schedulers.d.ts +7 -0
  462. package/dist/runtime/retired-schedulers.js +31 -0
  463. package/dist/runtime/run-control.d.ts +33 -0
  464. package/dist/runtime/run-control.js +77 -0
  465. package/dist/runtime/run-finish.d.ts +27 -18
  466. package/dist/runtime/run-finish.js +98 -51
  467. package/dist/runtime/run-jobs.d.ts +48 -0
  468. package/dist/runtime/run-jobs.js +95 -0
  469. package/dist/runtime/run-processors.d.ts +60 -0
  470. package/dist/runtime/run-processors.js +185 -0
  471. package/dist/runtime/run-queue.d.ts +32 -57
  472. package/dist/runtime/run-queue.js +291 -295
  473. package/dist/runtime/run-steps.d.ts +39 -0
  474. package/dist/runtime/run-steps.js +96 -0
  475. package/dist/runtime/run-worker.d.ts +122 -76
  476. package/dist/runtime/run-worker.js +343 -229
  477. package/dist/runtime/runtime.module.d.ts +10 -0
  478. package/dist/runtime/runtime.module.js +112 -0
  479. package/dist/runtime/step-log.d.ts +40 -0
  480. package/dist/runtime/step-log.js +94 -0
  481. package/dist/runtime/stream.controller.d.ts +5 -8
  482. package/dist/runtime/stream.controller.js +14 -12
  483. package/dist/runtime/stream.d.ts +24 -6
  484. package/dist/runtime/stream.js +78 -7
  485. package/dist/runtime/subagents/child.d.ts +3 -44
  486. package/dist/runtime/subagents/child.js +0 -79
  487. package/dist/runtime/subagents/definition.d.ts +5 -10
  488. package/dist/runtime/subagents/definition.js +13 -14
  489. package/dist/runtime/subagents/dispatch.d.ts +89 -8
  490. package/dist/runtime/subagents/dispatch.js +137 -142
  491. package/dist/runtime/subagents/limits.d.ts +9 -4
  492. package/dist/runtime/subagents/limits.js +4 -2
  493. package/dist/runtime/subagents/org-agents.d.ts +4 -4
  494. package/dist/runtime/subagents/org-agents.js +3 -2
  495. package/dist/runtime/subagents/progress.d.ts +2 -2
  496. package/dist/runtime/subagents/roster.d.ts +4 -4
  497. package/dist/runtime/subagents/roster.js +2 -2
  498. package/dist/runtime/subagents/skill-fork.d.ts +8 -9
  499. package/dist/runtime/subagents/skill-fork.js +17 -6
  500. package/dist/runtime/subagents/subagents.service.d.ts +40 -0
  501. package/dist/runtime/subagents/subagents.service.js +101 -0
  502. package/dist/runtime/usage-report.d.ts +94 -52
  503. package/dist/runtime/usage-report.js +200 -100
  504. package/dist/runtime/waits.d.ts +127 -59
  505. package/dist/runtime/waits.js +433 -210
  506. package/dist/sandbox/job-ids.d.ts +10 -0
  507. package/dist/sandbox/job-ids.js +10 -0
  508. package/dist/sandbox/jobs.d.ts +41 -0
  509. package/dist/sandbox/jobs.js +113 -0
  510. package/dist/sandbox/leases.d.ts +39 -31
  511. package/dist/sandbox/leases.js +117 -257
  512. package/dist/sandbox/providers.d.ts +19 -0
  513. package/dist/sandbox/providers.js +38 -0
  514. package/dist/sandbox/sandbox.module.d.ts +8 -0
  515. package/dist/sandbox/sandbox.module.js +30 -0
  516. package/dist/sandbox/sandbox.service.d.ts +24 -29
  517. package/dist/sandbox/sandbox.service.js +106 -75
  518. package/dist/skills/catalog.d.ts +37 -24
  519. package/dist/skills/catalog.js +100 -57
  520. package/dist/skills/changes.controller.d.ts +4 -4
  521. package/dist/skills/changes.controller.js +15 -9
  522. package/dist/skills/changes.service.d.ts +30 -20
  523. package/dist/skills/changes.service.js +425 -367
  524. package/dist/skills/invocable.controller.d.ts +1 -1
  525. package/dist/skills/invocable.controller.js +8 -5
  526. package/dist/skills/invocation-keys.d.ts +1 -1
  527. package/dist/skills/invocation-keys.js +1 -1
  528. package/dist/skills/invoke.d.ts +17 -16
  529. package/dist/skills/invoke.js +53 -21
  530. package/dist/skills/skills.controller.d.ts +1 -1
  531. package/dist/skills/skills.controller.js +11 -6
  532. package/dist/skills/skills.module.d.ts +6 -0
  533. package/dist/skills/skills.module.js +30 -0
  534. package/dist/skills/skills.service.d.ts +47 -30
  535. package/dist/skills/skills.service.js +221 -158
  536. package/dist/storage/job-ids.d.ts +6 -0
  537. package/dist/storage/job-ids.js +6 -0
  538. package/dist/storage/purge.d.ts +22 -7
  539. package/dist/storage/purge.js +55 -3
  540. package/dist/storage/storage.module.d.ts +6 -0
  541. package/dist/storage/storage.module.js +23 -0
  542. package/dist/storage/storage.service.d.ts +18 -4
  543. package/dist/storage/storage.service.js +44 -3
  544. package/dist/tools/approvals.controller.d.ts +1 -1
  545. package/dist/tools/approvals.controller.js +12 -8
  546. package/dist/tools/approvals.service.d.ts +33 -25
  547. package/dist/tools/approvals.service.js +343 -259
  548. package/dist/tools/breaker.d.ts +2 -2
  549. package/dist/tools/breaker.js +21 -3
  550. package/dist/tools/builtin-names.d.ts +73 -0
  551. package/dist/tools/builtin-names.js +116 -0
  552. package/dist/tools/builtins/agent.d.ts +7 -7
  553. package/dist/tools/builtins/agent.js +7 -11
  554. package/dist/tools/builtins/ask-user.d.ts +3 -3
  555. package/dist/tools/builtins/ask-user.js +3 -3
  556. package/dist/tools/builtins/builtin-tools.d.ts +21 -0
  557. package/dist/tools/builtins/builtin-tools.js +80 -0
  558. package/dist/tools/builtins/read-tool-output.d.ts +3 -3
  559. package/dist/tools/builtins/read-tool-output.js +3 -3
  560. package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
  561. package/dist/tools/builtins/sandbox/bash.js +33 -30
  562. package/dist/tools/builtins/sandbox/common.d.ts +5 -4
  563. package/dist/tools/builtins/sandbox/common.js +2 -2
  564. package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
  565. package/dist/tools/builtins/sandbox/deliver.js +13 -13
  566. package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
  567. package/dist/tools/builtins/sandbox/edit.js +42 -31
  568. package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
  569. package/dist/tools/builtins/sandbox/file-state.js +34 -0
  570. package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
  571. package/dist/tools/builtins/sandbox/glob-match.js +1 -1
  572. package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
  573. package/dist/tools/builtins/sandbox/glob.js +6 -6
  574. package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
  575. package/dist/tools/builtins/sandbox/grep.js +149 -32
  576. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  577. package/dist/tools/builtins/sandbox/index.js +1 -1
  578. package/dist/tools/builtins/sandbox/read.d.ts +2 -2
  579. package/dist/tools/builtins/sandbox/read.js +22 -15
  580. package/dist/tools/builtins/sandbox/write.d.ts +1 -1
  581. package/dist/tools/builtins/sandbox/write.js +38 -34
  582. package/dist/tools/builtins/skill-load.d.ts +6 -6
  583. package/dist/tools/builtins/skill-load.js +33 -17
  584. package/dist/tools/builtins/skill-write.d.ts +4 -4
  585. package/dist/tools/builtins/skill-write.js +10 -10
  586. package/dist/tools/builtins/tool-search.d.ts +13 -9
  587. package/dist/tools/builtins/tool-search.js +25 -14
  588. package/dist/tools/canonical-json.d.ts +6 -0
  589. package/dist/tools/canonical-json.js +16 -0
  590. package/dist/tools/connector-content.controller.d.ts +1 -1
  591. package/dist/tools/connector-content.controller.js +11 -6
  592. package/dist/tools/connector-content.d.ts +12 -15
  593. package/dist/tools/connector-content.js +53 -18
  594. package/dist/tools/connectors.controller.d.ts +1 -1
  595. package/dist/tools/connectors.controller.js +21 -10
  596. package/dist/tools/connectors.service.d.ts +31 -13
  597. package/dist/tools/connectors.service.js +438 -348
  598. package/dist/tools/credentials.d.ts +17 -20
  599. package/dist/tools/credentials.js +55 -34
  600. package/dist/tools/display-names.d.ts +9 -0
  601. package/dist/tools/display-names.js +24 -0
  602. package/dist/tools/drift.d.ts +29 -41
  603. package/dist/tools/drift.js +116 -84
  604. package/dist/tools/elicitation.js +1 -1
  605. package/dist/tools/info.d.ts +32 -13
  606. package/dist/tools/info.js +88 -39
  607. package/dist/tools/job-ids.d.ts +13 -0
  608. package/dist/tools/job-ids.js +15 -0
  609. package/dist/tools/jobs.d.ts +24 -0
  610. package/dist/tools/jobs.js +69 -0
  611. package/dist/tools/legacy-data.d.ts +34 -0
  612. package/dist/tools/legacy-data.js +76 -0
  613. package/dist/tools/legacy-keys.d.ts +51 -0
  614. package/dist/tools/legacy-keys.js +115 -0
  615. package/dist/tools/naming.d.ts +1 -5
  616. package/dist/tools/naming.js +1 -7
  617. package/dist/tools/oauth/flow-paths.d.ts +16 -0
  618. package/dist/tools/oauth/flow-paths.js +38 -0
  619. package/dist/tools/oauth/flow.d.ts +30 -30
  620. package/dist/tools/oauth/flow.js +109 -81
  621. package/dist/tools/oauth/oauth.controller.d.ts +3 -3
  622. package/dist/tools/oauth/oauth.controller.js +12 -9
  623. package/dist/tools/oauth/tokens.d.ts +11 -3
  624. package/dist/tools/oauth/tokens.js +15 -14
  625. package/dist/tools/outputs.d.ts +13 -4
  626. package/dist/tools/outputs.js +48 -4
  627. package/dist/tools/pipeline.d.ts +72 -50
  628. package/dist/tools/pipeline.js +239 -100
  629. package/dist/tools/policy.d.ts +3 -16
  630. package/dist/tools/policy.js +13 -19
  631. package/dist/tools/questions.controller.d.ts +2 -2
  632. package/dist/tools/questions.controller.js +9 -6
  633. package/dist/tools/questions.service.d.ts +26 -25
  634. package/dist/tools/questions.service.js +201 -142
  635. package/dist/tools/registry.d.ts +43 -38
  636. package/dist/tools/registry.js +100 -72
  637. package/dist/tools/resources.d.ts +1 -1
  638. package/dist/tools/resources.js +1 -1
  639. package/dist/tools/specs.d.ts +5 -4
  640. package/dist/tools/specs.js +3 -1
  641. package/dist/tools/tools.module.d.ts +10 -0
  642. package/dist/tools/tools.module.js +91 -0
  643. package/dist/ui/call-extension.d.ts +16 -0
  644. package/dist/ui/call-extension.js +38 -0
  645. package/dist/ui/embed-token.d.ts +9 -5
  646. package/dist/ui/embed-token.js +34 -6
  647. package/dist/ui/ui-stream.d.ts +22 -17
  648. package/dist/ui/ui-stream.js +72 -12
  649. package/dist/ui/ui.module.d.ts +7 -0
  650. package/dist/ui/ui.module.js +28 -0
  651. package/dist/ui/views.controller.d.ts +14 -12
  652. package/dist/ui/views.controller.js +32 -25
  653. package/dist/ui/views.d.ts +9 -57
  654. package/dist/ui/views.js +43 -45
  655. package/package.json +10 -3
  656. package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
  657. package/dist/http/health.controller.d.ts +0 -26
  658. package/dist/http/health.controller.js +0 -79
  659. package/dist/http/tokens.d.ts +0 -131
  660. package/dist/http/tokens.js +0 -131
  661. package/dist/http/zod.pipe.d.ts +0 -8
  662. package/dist/http/zod.pipe.js +0 -14
  663. package/dist/identity/rate-limit.d.ts +0 -55
  664. package/dist/identity/rate-limit.js +0 -121
  665. package/dist/sandbox/lifecycle.d.ts +0 -21
  666. package/dist/sandbox/lifecycle.js +0 -68
  667. package/dist/tools/builtins/sandbox/names.d.ts +0 -7
  668. package/dist/tools/builtins/sandbox/names.js +0 -20
  669. /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
  670. /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
@@ -6,19 +6,18 @@
6
6
  * English, fixed (Decision 15: not tailored to the agent's tools; it says "when it is in your
7
7
  * tools" instead). Changing it only affects snapshots written afterwards: a conversation's next
8
8
  * run writes a new snapshot announcing the new map, and old snapshots keep their text (phase C
9
- * changed the Task / Agent line, sub-agents spec §16.5).
9
+ * changed the Task / Agent line, sub-agents spec §16.5; the tool-naming change shortened it to the
10
+ * Claude Code names, spec 2026-10-29 §6).
10
11
  */
11
12
  export const CLAUDE_CODE_TOOL_MAP = [
12
- "Some skills in this conversation were written for Claude Code and name its tools. Use these tools instead:",
13
- "- Bash -> sandbox_bash",
14
- "- Read -> sandbox_read; Write -> sandbox_write; Edit and MultiEdit -> sandbox_edit; Glob -> sandbox_glob; Grep -> sandbox_grep",
15
- '- Skill -> skill_load (a name such as "superpowers:brainstorming" also works)',
16
- "- TodoWrite -> todo__write when it is in your tools; otherwise keep the task list in your replies",
17
- "- AskUserQuestion -> ask_user",
18
- "- ToolSearch -> tool_search when it is in your tools",
19
- "- Task and Agent (sub-agents) -> agent when it is in your tools (subagent_type names one of the types its description lists; model names haiku / sonnet / opus -> fast / standard / capable; SendMessage to a sub-agent -> agent with resume); otherwise not available: do the steps yourself, in order",
13
+ "Some skills in this conversation were written for Claude Code. Its tools Bash, Read, Write, Edit,",
14
+ "Glob, Grep, Skill, AskUserQuestion, ToolSearch and Agent have the same names here, when they are",
15
+ "in your tools. For the others:",
16
+ "- MultiEdit -> several Edit calls",
17
+ "- TodoWrite -> plugin__todo__write when it is in your tools; otherwise keep the task list in your replies",
18
+ "- Task -> Agent; SendMessage to a sub-agent -> Agent with resume; model names haiku / sonnet / opus -> fast / standard / capable",
20
19
  "- TaskOutput, TaskStop -> not available",
21
20
  "- Any other tool a skill names (for example WebFetch, WebSearch, NotebookEdit, EnterWorktree) -> not available unless one of your tools does the same job",
22
21
  // biome-ignore lint/suspicious/noTemplateCurlyInString: the literal Claude Code variable the model reads
23
- "The sandbox tools exist only when this agent has a sandbox; without them a skill's scripts cannot run. A path such as ${CLAUDE_PLUGIN_ROOT}/skills/<name>/... means /skills/<name>/... after skill_load has copied that skill into the sandbox.",
22
+ "The sandbox tools exist only when this agent has a sandbox; without them a skill's scripts cannot run. A path such as ${CLAUDE_PLUGIN_ROOT}/skills/<name>/... means /skills/<name>/... after Skill has copied that skill into the sandbox.",
24
23
  ].join("\n");
@@ -0,0 +1,22 @@
1
+ import type { SkillTexts } from "./skills.js";
2
+ /**
3
+ * The system texts of a request as the release candidates rendered them, naming the old builtins
4
+ * (`skill_load`, `tool_search`). FROZEN: verbatim copies from `main` at 02b9634b
5
+ * (`runtime/context/skills.ts`, `tools/builtins/tool-search.ts`); never edit them. A request whose
6
+ * tools hold an old builtin key (a recording made before the rename) is rebuilt with these, so it
7
+ * reconstructs with no `system_hash` drift (tool naming spec §10). `check:terms` exempts this file.
8
+ *
9
+ * The skills texts (`skills.ts`) naming `skill_load`.
10
+ */
11
+ export declare const LEGACY_SKILL_TEXTS: SkillTexts;
12
+ /** The tool catalog header (`tools/builtins/tool-search.ts` `CATALOG_HEADER`) naming `tool_search`. */
13
+ export declare const LEGACY_CATALOG_HEADER: string;
14
+ /**
15
+ * Was this request's tool list recorded before the rename? True when one of its tool keys is a
16
+ * release-candidate builtin name (the run's tools, as the request carries them). Every request
17
+ * that renders one of these texts offers the tool it names (`skill_load` whenever the log has a
18
+ * skills catalog or an invocation, `tool_search` with a tool catalog), so the tools decide it.
19
+ */
20
+ export declare function usesLegacyToolNames(tools: readonly {
21
+ key: string;
22
+ }[]): boolean;
@@ -0,0 +1,37 @@
1
+ import { isLegacyBuiltinKey } from "../../tools/legacy-keys.js";
2
+ /**
3
+ * The system texts of a request as the release candidates rendered them, naming the old builtins
4
+ * (`skill_load`, `tool_search`). FROZEN: verbatim copies from `main` at 02b9634b
5
+ * (`runtime/context/skills.ts`, `tools/builtins/tool-search.ts`); never edit them. A request whose
6
+ * tools hold an old builtin key (a recording made before the rename) is rebuilt with these, so it
7
+ * reconstructs with no `system_hash` drift (tool naming spec §10). `check:terms` exempts this file.
8
+ *
9
+ * The skills texts (`skills.ts`) naming `skill_load`.
10
+ */
11
+ export const LEGACY_SKILL_TEXTS = Object.freeze({
12
+ skillsCatalogHeader: "Skills are available in this conversation. A skill is a set of instructions, sometimes with " +
13
+ "scripts or other files, for a specific kind of task. When a task matches a skill's description, " +
14
+ "call skill_load with the skill's name to read its instructions before you start; do not guess " +
15
+ "what a skill says. Available skills:",
16
+ newSkills: "New skills (call skill_load with the name to use one):",
17
+ updatedSkills: "Updated skills (call skill_load again before relying on earlier instructions):",
18
+ currentSkills: "Skills available in this conversation now (this replaces any earlier list of skills; call " +
19
+ "skill_load with a name to read a skill's instructions):",
20
+ invokedSkills: (names) => `Skills the user invoked earlier in this conversation: ${names.join(", ")}. Call skill_load with a name to read its instructions again.`,
21
+ pinnedSkillsHeader: "Pinned skills: the owner of this agent pinned these skills, so their instructions apply " +
22
+ "throughout this conversation. Follow them without calling skill_load; call skill_load " +
23
+ "only to copy a pinned skill's files into the sandbox.",
24
+ });
25
+ /** The tool catalog header (`tools/builtins/tool-search.ts` `CATALOG_HEADER`) naming `tool_search`. */
26
+ export const LEGACY_CATALOG_HEADER = "More tools are available but not loaded. To use one, first call tool_search with keywords; " +
27
+ "it returns the full definitions and loads the matching tools for your next step. " +
28
+ "Calling a tool that is not loaded returns an error. Tool catalog:";
29
+ /**
30
+ * Was this request's tool list recorded before the rename? True when one of its tool keys is a
31
+ * release-candidate builtin name (the run's tools, as the request carries them). Every request
32
+ * that renders one of these texts offers the tool it names (`skill_load` whenever the log has a
33
+ * skills catalog or an invocation, `tool_search` with a tool catalog), so the tools decide it.
34
+ */
35
+ export function usesLegacyToolNames(tools) {
36
+ return tools.some((t) => isLegacyBuiltinKey(t.key));
37
+ }
@@ -13,14 +13,32 @@ export type PinnedSkill = NonNullable<SkillsSnapshot["pinned"]>[number];
13
13
  export type SkillsCatalogEvent = Extract<ConversationEvent, {
14
14
  type: "skills_catalog";
15
15
  }>;
16
- /** 加载技能的内置工具名。 */
17
- export declare const SKILL_LOAD = "skill_load";
16
+ /**
17
+ * The model-visible skills texts that name the skill-loading builtin. A request recorded before the
18
+ * tool rename renders {@link LEGACY_SKILL_TEXTS} instead (`./legacy-text.ts`, chosen from the
19
+ * request's tools by `usesLegacyToolNames`), so its system text stays as it was sent.
20
+ */
21
+ export interface SkillTexts {
22
+ /** The header of the first catalog (in the system cache segment). */
23
+ skillsCatalogHeader: string;
24
+ /** The heading of the added skills in a change notice. */
25
+ newSkills: string;
26
+ /** The heading of the updated skills in a change notice. */
27
+ updatedSkills: string;
28
+ /** The heading of the current catalog after a compaction summary. */
29
+ currentSkills: string;
30
+ /** The line restored after a compaction summary for the invoked skills (`names` non-empty). */
31
+ invokedSkills: (names: readonly string[]) => string;
32
+ /** The header of the pinned skills in the system cache segment. */
33
+ pinnedSkillsHeader: string;
34
+ }
35
+ export declare const SKILL_TEXTS: SkillTexts;
18
36
  /** 目录开头的说明(system 缓存段里的第一份目录)。 */
19
37
  export declare const SKILLS_CATALOG_HEADER: string;
20
- /** 目录里每个技能描述最多的码点数(超出确定地截断;`skill_load` 仍返回完整正文)。 */
38
+ /** 目录里每个技能描述最多的码点数(超出确定地截断;`Skill` 仍返回完整正文)。 */
21
39
  export declare const CATALOG_DESCRIPTION_MAX_CHARS = 300;
22
40
  /** 第一份目录(进 system 缓存段),按名字排序。 */
23
- export declare function skillsCatalogText(skills: readonly CatalogSkill[]): string;
41
+ export declare function skillsCatalogText(skills: readonly CatalogSkill[], texts?: SkillTexts): string;
24
42
  /** 两份快照是否相同(按 id、版本、名字、描述与来源)。顺序无关。 */
25
43
  export declare function sameSkills(a: readonly CatalogSkill[], b: readonly CatalogSkill[]): boolean;
26
44
  /**
@@ -41,14 +59,14 @@ export declare function sameSnapshot(a: SkillsSnapshot, b: SkillsSnapshot): bool
41
59
  * 试用草稿被拒绝 / 批准了别人的同号版本时,内容变了而版本号可能不变)。
42
60
  * `prev` 为上一份快照(没有为空)。
43
61
  */
44
- export declare function skillsChangeText(prev: readonly CatalogSkill[], next: readonly CatalogSkill[], pinnedIds?: ReadonlySet<string>): string;
62
+ export declare function skillsChangeText(prev: readonly CatalogSkill[], next: readonly CatalogSkill[], pinnedIds?: ReadonlySet<string>, texts?: SkillTexts): string;
45
63
  /** 压缩摘要之后补上的「当前目录」(与 system 里的第一份不同时):完整列出,替代之前的目录与提醒。 */
46
- export declare function skillsCurrentText(skills: readonly CatalogSkill[]): string;
64
+ export declare function skillsCurrentText(skills: readonly CatalogSkill[], texts?: SkillTexts): string;
47
65
  /**
48
66
  * The line restored after a compaction summary whose range holds inline skill invocations
49
67
  * (`names`: distinct, code point order); empty for none. Bodies are not re-injected.
50
68
  */
51
- export declare function invokedSkillsText(names: readonly string[]): string;
69
+ export declare function invokedSkillsText(names: readonly string[], texts?: SkillTexts): string;
52
70
  /** The distinct names (code point order) of the inline invocations in `events` up to `upToSeq`. */
53
71
  export declare function invokedSkillNames(events: readonly ConversationEvent[], upToSeq: number): string[];
54
72
  /** A skill a person invoked: the version recorded in their message. */
@@ -78,7 +96,7 @@ export declare const PINNED_SKILLS_HEADER: string;
78
96
  /** One pinned skill with its body. */
79
97
  export declare function pinnedBlock(p: PinnedSkill): string;
80
98
  /** The pinned skills of the system snapshot (non-empty), after the catalog. */
81
- export declare function pinnedSystemText(pinned: readonly PinnedSkill[]): string;
99
+ export declare function pinnedSystemText(pinned: readonly PinnedSkill[], texts?: SkillTexts): string;
82
100
  /**
83
101
  * The pinned change notice between two snapshots ({@link samePinned} false): each entry that is new
84
102
  * or has another version or source, with its whole body; then the names of the removed ones.
@@ -94,12 +112,12 @@ export declare function toolMapChangeText(next: string | undefined): string;
94
112
  * nothing else differs: logs before phase B render exactly as before), the pinned change, the
95
113
  * tool-name map change; joined by blank lines.
96
114
  */
97
- export declare function snapshotChangeText(prev: SkillsSnapshot | undefined, next: SkillsSnapshot): string;
115
+ export declare function snapshotChangeText(prev: SkillsSnapshot | undefined, next: SkillsSnapshot, texts?: SkillTexts): string;
98
116
  /**
99
117
  * What follows a compaction summary when the covered snapshot is not the system one: today's
100
118
  * current catalog (when the skills differ from the system snapshot's), the current pinned skills
101
119
  * (when they differ), the tool-name map (when it differs); joined by blank lines, "" for nothing.
102
120
  */
103
- export declare function snapshotCurrentText(system: SkillsSnapshot | undefined, covered: SkillsSnapshot): string;
121
+ export declare function snapshotCurrentText(system: SkillsSnapshot | undefined, covered: SkillsSnapshot, texts?: SkillTexts): string;
104
122
  /** The system snapshot's text after the agent's instructions: catalog, pinned skills, tool map. */
105
- export declare function snapshotSystemText(s: SkillsSnapshot): string;
123
+ export declare function snapshotSystemText(s: SkillsSnapshot, texts?: SkillTexts): string;
@@ -1,13 +1,23 @@
1
- /** 加载技能的内置工具名。 */
2
- export const SKILL_LOAD = "skill_load";
1
+ import { SKILL_LOAD } from "../../tools/builtin-names.js";
2
+ export const SKILL_TEXTS = Object.freeze({
3
+ skillsCatalogHeader: "Skills are available in this conversation. A skill is a set of instructions, sometimes with " +
4
+ "scripts or other files, for a specific kind of task. When a task matches a skill's description, " +
5
+ `call ${SKILL_LOAD} with the skill's name to read its instructions before you start; do not guess ` +
6
+ "what a skill says. Available skills:",
7
+ newSkills: `New skills (call ${SKILL_LOAD} with the name to use one):`,
8
+ updatedSkills: `Updated skills (call ${SKILL_LOAD} again before relying on earlier instructions):`,
9
+ currentSkills: "Skills available in this conversation now (this replaces any earlier list of skills; call " +
10
+ `${SKILL_LOAD} with a name to read a skill's instructions):`,
11
+ invokedSkills: (names) => `Skills the user invoked earlier in this conversation: ${names.join(", ")}. Call ${SKILL_LOAD} with a name to read its instructions again.`,
12
+ pinnedSkillsHeader: "Pinned skills: the owner of this agent pinned these skills, so their instructions apply " +
13
+ `throughout this conversation. Follow them without calling ${SKILL_LOAD}; call ${SKILL_LOAD} ` +
14
+ "only to copy a pinned skill's files into the sandbox.",
15
+ });
3
16
  /** 目录开头的说明(system 缓存段里的第一份目录)。 */
4
- export const SKILLS_CATALOG_HEADER = "Skills are available in this conversation. A skill is a set of instructions, sometimes with " +
5
- "scripts or other files, for a specific kind of task. When a task matches a skill's description, " +
6
- `call ${SKILL_LOAD} with the skill's name to read its instructions before you start; do not guess ` +
7
- "what a skill says. Available skills:";
17
+ export const SKILLS_CATALOG_HEADER = SKILL_TEXTS.skillsCatalogHeader;
8
18
  /** 按码点比较名字(与区域设置无关,结果确定)。 */
9
19
  const byName = (a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
10
- /** 目录里每个技能描述最多的码点数(超出确定地截断;`skill_load` 仍返回完整正文)。 */
20
+ /** 目录里每个技能描述最多的码点数(超出确定地截断;`Skill` 仍返回完整正文)。 */
11
21
  export const CATALOG_DESCRIPTION_MAX_CHARS = 300;
12
22
  /** 折叠成一行,按码点截到 {@link CATALOG_DESCRIPTION_MAX_CHARS}。 */
13
23
  function shortDescription(d) {
@@ -21,8 +31,8 @@ function shortDescription(d) {
21
31
  const line = (s) => `- ${s.name}: ${shortDescription(s.description)}`;
22
32
  const lines = (skills) => [...skills].sort(byName).map(line).join("\n");
23
33
  /** 第一份目录(进 system 缓存段),按名字排序。 */
24
- export function skillsCatalogText(skills) {
25
- return `${SKILLS_CATALOG_HEADER}\n${lines(skills)}`;
34
+ export function skillsCatalogText(skills, texts = SKILL_TEXTS) {
35
+ return `${texts.skillsCatalogHeader}\n${lines(skills)}`;
26
36
  }
27
37
  /** 两份快照是否相同(按 id、版本、名字、描述与来源)。顺序无关。 */
28
38
  export function sameSkills(a, b) {
@@ -66,7 +76,7 @@ export function sameSnapshot(a, b) {
66
76
  /**
67
77
  * The catalog differences between two snapshots. `pinnedIds` (the next snapshot's pinned ids, phase
68
78
  * B) are left out of `updated`: a pinned skill's new body is rendered by {@link pinnedChangeText},
69
- * and the pinned header says not to call `skill_load` for it.
79
+ * and the pinned header says not to call `Skill` for it.
70
80
  */
71
81
  function catalogChanges(prev, next, pinnedIds) {
72
82
  const before = new Map(prev.map((s) => [s.id, s]));
@@ -86,14 +96,14 @@ function catalogChanges(prev, next, pinnedIds) {
86
96
  * 试用草稿被拒绝 / 批准了别人的同号版本时,内容变了而版本号可能不变)。
87
97
  * `prev` 为上一份快照(没有为空)。
88
98
  */
89
- export function skillsChangeText(prev, next, pinnedIds) {
99
+ export function skillsChangeText(prev, next, pinnedIds, texts = SKILL_TEXTS) {
90
100
  const { added, updated, removed } = catalogChanges(prev, next, pinnedIds);
91
101
  const parts = ["The skills available in this conversation have changed."];
92
102
  if (added.length > 0) {
93
- parts.push(`New skills (call ${SKILL_LOAD} with the name to use one):\n${lines(added)}`);
103
+ parts.push(`${texts.newSkills}\n${lines(added)}`);
94
104
  }
95
105
  if (updated.length > 0) {
96
- parts.push(`Updated skills (call ${SKILL_LOAD} again before relying on earlier instructions):\n${lines(updated)}`);
106
+ parts.push(`${texts.updatedSkills}\n${lines(updated)}`);
97
107
  }
98
108
  if (removed.length > 0) {
99
109
  parts.push(`Removed skills (no longer available; do not use them): ${[...removed]
@@ -106,22 +116,21 @@ export function skillsChangeText(prev, next, pinnedIds) {
106
116
  return parts.join("\n\n");
107
117
  }
108
118
  /** 压缩摘要之后补上的「当前目录」(与 system 里的第一份不同时):完整列出,替代之前的目录与提醒。 */
109
- export function skillsCurrentText(skills) {
119
+ export function skillsCurrentText(skills, texts = SKILL_TEXTS) {
110
120
  if (skills.length === 0) {
111
121
  return "No skills are available in this conversation now (this replaces any earlier list of skills).";
112
122
  }
113
- return ("Skills available in this conversation now (this replaces any earlier list of skills; call " +
114
- `${SKILL_LOAD} with a name to read a skill's instructions):\n${lines(skills)}`);
123
+ return `${texts.currentSkills}\n${lines(skills)}`;
115
124
  }
116
125
  // ---- Skills a person invoked (phase D spec §4.4; model-visible, English) ----
117
126
  /**
118
127
  * The line restored after a compaction summary whose range holds inline skill invocations
119
128
  * (`names`: distinct, code point order); empty for none. Bodies are not re-injected.
120
129
  */
121
- export function invokedSkillsText(names) {
130
+ export function invokedSkillsText(names, texts = SKILL_TEXTS) {
122
131
  if (names.length === 0)
123
132
  return "";
124
- return `Skills the user invoked earlier in this conversation: ${names.join(", ")}. Call ${SKILL_LOAD} with a name to read its instructions again.`;
133
+ return texts.invokedSkills(names);
125
134
  }
126
135
  /** The distinct names (code point order) of the inline invocations in `events` up to `upToSeq`. */
127
136
  export function invokedSkillNames(events, upToSeq) {
@@ -180,16 +189,14 @@ export function systemSkillsCatalog(events) {
180
189
  }
181
190
  // ---- Pinned skills and the tool-name map (phase B, spec §9.1, §9.4; model-visible, English) ----
182
191
  /** The header of the pinned skills in the system cache segment. */
183
- export const PINNED_SKILLS_HEADER = "Pinned skills: the owner of this agent pinned these skills, so their instructions apply " +
184
- `throughout this conversation. Follow them without calling ${SKILL_LOAD}; call ${SKILL_LOAD} ` +
185
- "only to copy a pinned skill's files into the sandbox.";
192
+ export const PINNED_SKILLS_HEADER = SKILL_TEXTS.pinnedSkillsHeader;
186
193
  /** One pinned skill with its body. */
187
194
  export function pinnedBlock(p) {
188
195
  return `<pinned_skill name="${p.name}" version="${p.version}">\n${p.body.trim()}\n</pinned_skill>`;
189
196
  }
190
197
  /** The pinned skills of the system snapshot (non-empty), after the catalog. */
191
- export function pinnedSystemText(pinned) {
192
- return `${PINNED_SKILLS_HEADER}\n\n${pinned.map(pinnedBlock).join("\n\n")}`;
198
+ export function pinnedSystemText(pinned, texts = SKILL_TEXTS) {
199
+ return `${texts.pinnedSkillsHeader}\n\n${pinned.map(pinnedBlock).join("\n\n")}`;
193
200
  }
194
201
  /**
195
202
  * The pinned change notice between two snapshots ({@link samePinned} false): each entry that is new
@@ -233,7 +240,7 @@ export function toolMapChangeText(next) {
233
240
  * nothing else differs: logs before phase B render exactly as before), the pinned change, the
234
241
  * tool-name map change; joined by blank lines.
235
242
  */
236
- export function snapshotChangeText(prev, next) {
243
+ export function snapshotChangeText(prev, next, texts = SKILL_TEXTS) {
237
244
  const prevSkills = prev?.skills ?? [];
238
245
  const pinnedDiff = !samePinned(prev?.pinned, next.pinned);
239
246
  const mapDiff = prev?.toolMap !== next.toolMap;
@@ -247,7 +254,7 @@ export function snapshotChangeText(prev, next) {
247
254
  : !sameSkills(prevSkills, next.skills);
248
255
  const parts = [];
249
256
  if (catalogDiff || (!pinnedDiff && !mapDiff)) {
250
- parts.push(skillsChangeText(prevSkills, next.skills, pinnedIds));
257
+ parts.push(skillsChangeText(prevSkills, next.skills, pinnedIds, texts));
251
258
  }
252
259
  if (pinnedDiff)
253
260
  parts.push(pinnedChangeText(prev?.pinned, next.pinned));
@@ -260,10 +267,10 @@ export function snapshotChangeText(prev, next) {
260
267
  * current catalog (when the skills differ from the system snapshot's), the current pinned skills
261
268
  * (when they differ), the tool-name map (when it differs); joined by blank lines, "" for nothing.
262
269
  */
263
- export function snapshotCurrentText(system, covered) {
270
+ export function snapshotCurrentText(system, covered, texts = SKILL_TEXTS) {
264
271
  const parts = [];
265
272
  if (!sameSkills(system?.skills ?? [], covered.skills)) {
266
- parts.push(skillsCurrentText(covered.skills));
273
+ parts.push(skillsCurrentText(covered.skills, texts));
267
274
  }
268
275
  if (!samePinned(system?.pinned, covered.pinned))
269
276
  parts.push(pinnedCurrentText(covered.pinned));
@@ -273,10 +280,10 @@ export function snapshotCurrentText(system, covered) {
273
280
  return parts.join("\n\n");
274
281
  }
275
282
  /** The system snapshot's text after the agent's instructions: catalog, pinned skills, tool map. */
276
- export function snapshotSystemText(s) {
277
- let text = skillsCatalogText(s.skills);
283
+ export function snapshotSystemText(s, texts = SKILL_TEXTS) {
284
+ let text = skillsCatalogText(s.skills, texts);
278
285
  if (s.pinned && s.pinned.length > 0)
279
- text += `\n\n${pinnedSystemText(s.pinned)}`;
286
+ text += `\n\n${pinnedSystemText(s.pinned, texts)}`;
280
287
  if (s.toolMap !== undefined)
281
288
  text += `\n\n${s.toolMap}`;
282
289
  return text;
@@ -1,12 +1,11 @@
1
- import type { Logger } from "@capybara-hq/plugin-sdk";
2
- import type { Redis } from "ioredis";
1
+ import { LockService } from "../infra/lock/lock.service.js";
3
2
  /** 会话运行锁的默认 TTL(毫秒):持有方每 `ttlMs / 3` 续租一次。 */
4
3
  export declare const CONVERSATION_LOCK_TTL_MS = 30000;
5
4
  /** 本进程持有的会话运行锁。 */
6
5
  export interface Lease {
7
6
  readonly conversationId: string;
8
7
  readonly runId: string;
9
- /** 续租时发现锁已不属于自己(过期后被他人取得);此后不再续租。 */
8
+ /** 续租时发现锁已不属于自己(过期后被他人取得,或续租一直失败到过期);此后不再续租。 */
10
9
  readonly lost: boolean;
11
10
  /** 立即续租一次;锁已不属于自己 → false(并标记 lost)。 */
12
11
  renew(): Promise<boolean>;
@@ -18,16 +17,17 @@ export interface Lease {
18
17
  onLost(cb: () => void): void;
19
18
  }
20
19
  /**
21
- * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
22
- * 带 TTL;持有期间由本进程的定时器每 `ttlMs / 3` 续租(本进程持有的锁的续租,允许的进程内定时器)。
23
- * 持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
20
+ * A per-conversation lease on {@link LockService.hold}: key `<prefix><conversationId>`, value the
21
+ * holder's run id (other replicas read it with {@link holder}), renewed every TTL/3 by the lock
22
+ * service while held; a crashed holder's key expires within the TTL and another replica can take
23
+ * it. Built by {@link ConversationLock} (the run lock) and its {@link ConversationLock.scoped}
24
+ * views (the same lock for another purpose, e.g. the channel delivery `capk:channel-deliver:`).
25
+ * A loss is logged once, by the lock service (`lock lost`, with the key).
24
26
  */
25
- export declare class ConversationLock {
26
- private readonly redis;
27
- private readonly log?;
27
+ export declare class ConversationLeases {
28
+ protected readonly locks: LockService;
28
29
  private readonly keyPrefix;
29
- /** `keyPrefix`:同样语义、按会话互斥的其他用途用别的前缀(如渠道出站投递 `capk:channel-deliver:`)。 */
30
- constructor(redis: Redis, log?: Pick<Logger, "warn"> | undefined, keyPrefix?: string);
30
+ constructor(locks: LockService, keyPrefix: string);
31
31
  private lockKey;
32
32
  acquire(conversationId: string, runId: string, ttlMs?: number): Promise<Lease | null>;
33
33
  /**
@@ -38,3 +38,12 @@ export declare class ConversationLock {
38
38
  /** 当前持有者的 runId;无人持有 → null。 */
39
39
  holder(conversationId: string): Promise<string | null>;
40
40
  }
41
+ /**
42
+ * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
43
+ * 带 TTL,由 {@link LockService} 每 TTL/3 续租。持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
44
+ */
45
+ export declare class ConversationLock extends ConversationLeases {
46
+ constructor(locks: LockService);
47
+ /** The same per-conversation lease under another key prefix (another purpose). */
48
+ scoped(keyPrefix: string): ConversationLeases;
49
+ }
@@ -1,97 +1,87 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from "@nestjs/common";
11
+ import { LockService } from "../infra/lock/lock.service.js";
1
12
  /** 会话运行锁的默认 TTL(毫秒):持有方每 `ttlMs / 3` 续租一次。 */
2
13
  export const CONVERSATION_LOCK_TTL_MS = 30_000;
3
14
  /** 会话运行锁的键前缀。 */
4
15
  const RUN_LOCK_PREFIX = "capk:conv-run:";
5
- const RENEW = `
6
- if redis.call('GET', KEYS[1]) == ARGV[1] then
7
- return redis.call('PEXPIRE', KEYS[1], ARGV[2])
8
- end
9
- return 0
10
- `;
11
- const RELEASE = `
12
- if redis.call('GET', KEYS[1]) == ARGV[1] then
13
- return redis.call('DEL', KEYS[1])
14
- end
15
- return 0
16
- `;
17
16
  /**
18
- * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
19
- * 带 TTL;持有期间由本进程的定时器每 `ttlMs / 3` 续租(本进程持有的锁的续租,允许的进程内定时器)。
20
- * 持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
17
+ * A per-conversation lease on {@link LockService.hold}: key `<prefix><conversationId>`, value the
18
+ * holder's run id (other replicas read it with {@link holder}), renewed every TTL/3 by the lock
19
+ * service while held; a crashed holder's key expires within the TTL and another replica can take
20
+ * it. Built by {@link ConversationLock} (the run lock) and its {@link ConversationLock.scoped}
21
+ * views (the same lock for another purpose, e.g. the channel delivery `capk:channel-deliver:`).
22
+ * A loss is logged once, by the lock service (`lock lost`, with the key).
21
23
  */
22
- export class ConversationLock {
23
- redis;
24
- log;
24
+ export class ConversationLeases {
25
+ locks;
25
26
  keyPrefix;
26
- /** `keyPrefix`:同样语义、按会话互斥的其他用途用别的前缀(如渠道出站投递 `capk:channel-deliver:`)。 */
27
- constructor(redis, log, keyPrefix = RUN_LOCK_PREFIX) {
28
- this.redis = redis;
29
- this.log = log;
27
+ constructor(locks, keyPrefix) {
28
+ this.locks = locks;
30
29
  this.keyPrefix = keyPrefix;
31
30
  }
32
31
  lockKey(conversationId) {
33
32
  return `${this.keyPrefix}${conversationId}`;
34
33
  }
35
34
  async acquire(conversationId, runId, ttlMs = CONVERSATION_LOCK_TTL_MS) {
36
- const key = this.lockKey(conversationId);
37
- const ok = await this.redis.set(key, runId, "PX", ttlMs, "NX");
38
- if (ok !== "OK")
35
+ const held = await this.locks.hold(this.lockKey(conversationId), runId, ttlMs);
36
+ if (!held)
39
37
  return null;
40
- const redis = this.redis;
41
- const log = this.log;
42
- let lost = false;
43
- let timer;
44
- const lostCallbacks = [];
45
- const stop = () => {
46
- clearInterval(timer);
47
- timer = undefined;
48
- };
49
- const lease = {
50
- conversationId,
51
- runId,
52
- get lost() {
53
- return lost;
54
- },
55
- async renew() {
56
- if (lost)
57
- return false;
58
- const r = Number(await redis.eval(RENEW, 1, key, runId, ttlMs));
59
- if (r !== 1) {
60
- lost = true;
61
- stop();
62
- log?.warn("conversation run lock lost", { conversationId, runId });
63
- for (const cb of lostCallbacks.splice(0))
64
- cb();
65
- }
66
- return r === 1;
67
- },
68
- async release() {
69
- stop();
70
- await redis.eval(RELEASE, 1, key, runId);
71
- },
72
- abandon: stop,
73
- onLost(cb) {
74
- if (lost)
75
- cb();
76
- else
77
- lostCallbacks.push(cb);
78
- },
79
- };
80
- timer = setInterval(() => {
81
- lease.renew().catch((err) => log?.warn("conversation run lock renew failed", { err }));
82
- }, Math.max(1, Math.floor(ttlMs / 3)));
83
- timer.unref();
84
- return lease;
38
+ return toLease(held, conversationId, runId);
85
39
  }
86
40
  /**
87
41
  * 释放某个运行持有的锁(只在仍由该 runId 持有时删除),不需要 Lease:用于 BullMQ 已判定任务失败
88
42
  * (例如持有者崩溃、stalled 次数超限)后清理死去持有者留下的锁,不必等 TTL 过期。
89
43
  */
90
44
  async releaseFor(conversationId, runId) {
91
- await this.redis.eval(RELEASE, 1, this.lockKey(conversationId), runId);
45
+ await this.locks.releaseIf(this.lockKey(conversationId), runId);
92
46
  }
93
47
  /** 当前持有者的 runId;无人持有 → null。 */
94
48
  holder(conversationId) {
95
- return this.redis.get(this.lockKey(conversationId));
49
+ return this.locks.holderOf(this.lockKey(conversationId));
96
50
  }
97
51
  }
52
+ function toLease(held, conversationId, runId) {
53
+ return {
54
+ conversationId,
55
+ runId,
56
+ get lost() {
57
+ return held.lost.aborted;
58
+ },
59
+ renew: () => held.renew(),
60
+ release: () => held.release(),
61
+ abandon: () => held.abandon(),
62
+ onLost(cb) {
63
+ if (held.lost.aborted)
64
+ cb();
65
+ else
66
+ held.lost.addEventListener("abort", () => cb(), { once: true });
67
+ },
68
+ };
69
+ }
70
+ /**
71
+ * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
72
+ * 带 TTL,由 {@link LockService} 每 TTL/3 续租。持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
73
+ */
74
+ let ConversationLock = class ConversationLock extends ConversationLeases {
75
+ constructor(locks) {
76
+ super(locks, RUN_LOCK_PREFIX);
77
+ }
78
+ /** The same per-conversation lease under another key prefix (another purpose). */
79
+ scoped(keyPrefix) {
80
+ return new ConversationLeases(this.locks, keyPrefix);
81
+ }
82
+ };
83
+ ConversationLock = __decorate([
84
+ Injectable(),
85
+ __param(0, Inject(LockService))
86
+ ], ConversationLock);
87
+ export { ConversationLock };
@@ -1,9 +1,9 @@
1
1
  import type { AvailableHook, HookModelRequest, HookParentScope, HookPayloads, HookScope, Logger, ModelRequest } from "@capybara-hq/plugin-sdk";
2
2
  import type { AppendEvent, EventLog } from "../conversations/event-log.js";
3
3
  import type { EventPayload } from "../conversations/events.js";
4
- import type { KernelDb } from "../db/kernel-schema.js";
5
4
  import type { HookOutcome, HookRegistry } from "../extensions/hooks.js";
6
- import { audit } from "../identity/audit.js";
5
+ import type { audit } from "../identity/audit.js";
6
+ import type { StepLog } from "./step-log.js";
7
7
  /** What the runtime needs from the host's hook registry (absent in eval replays). */
8
8
  export type HookRunner = Pick<HookRegistry, "run" | "has">;
9
9
  /**
@@ -75,8 +75,8 @@ export type AuditEntry = Parameters<typeof audit>[1];
75
75
  * denial rethrows it before running the hooks again, so no second audit entry is written.
76
76
  */
77
77
  export declare function recordHookDenial(d: {
78
- db: KernelDb;
79
78
  eventLog: EventLog;
79
+ stepLog: Pick<StepLog, "appendAudited">;
80
80
  }, at: DenialSite, mount: Extract<AvailableHook, "model.request" | "tool.preExecute">, denial: HookDenial, where: {
81
81
  step: number;
82
82
  attempt?: number;
@@ -1,4 +1,3 @@
1
- import { audit } from "../identity/audit.js";
2
1
  /**
3
2
  * The scope for hook payloads, or null when hooks must not fire: no registry (eval replays omit it),
4
3
  * a conversation that is neither `chat` nor `subagent`, or missing identity fields. A sub-agent's
@@ -125,11 +124,7 @@ export async function recordHookDenial(d, at, mount, denial, where) {
125
124
  if (await d.eventLog.findByIdem(at.conversationId, at.idemKey))
126
125
  return;
127
126
  const event = hookDeniedEvent(at, mount, denial, where);
128
- const written = await d.db.transaction().execute(async (t) => {
129
- const out = await d.eventLog.append(at.conversationId, [event], t);
130
- await audit(t, hookDeniedAudit(at, event.payload, denial));
131
- return out;
132
- });
127
+ const written = await d.stepLog.appendAudited(at.conversationId, [event], hookDeniedAudit(at, event.payload, denial));
133
128
  if (written.length > 0) {
134
129
  await d.eventLog.notify(at.conversationId, Math.max(...written.map((e) => e.seq)));
135
130
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The maintenance job scheduler ids the runtime's fixed-period jobs had before they became
3
+ * `@LockedCron` jobs: an upgraded deployment still has them in Redis, so the
4
+ * worker removes them at start (`RETIRED_SCHEDULER_IDS`). A leaf module: the maintenance worker
5
+ * imports it without the runtime's providers.
6
+ */
7
+ /** The wait sweep's old scheduler (every 10 minutes). */
8
+ export declare const WAIT_SWEEP_SCHEDULER_ID = "wait-sweep-every-10m";
9
+ /** The usage sweeper's old scheduler (every minute). */
10
+ export declare const USAGE_SWEEP_SCHEDULER_ID = "usage-report-sweep-every";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The maintenance job scheduler ids the runtime's fixed-period jobs had before they became
3
+ * `@LockedCron` jobs: an upgraded deployment still has them in Redis, so the
4
+ * worker removes them at start (`RETIRED_SCHEDULER_IDS`). A leaf module: the maintenance worker
5
+ * imports it without the runtime's providers.
6
+ */
7
+ /** The wait sweep's old scheduler (every 10 minutes). */
8
+ export const WAIT_SWEEP_SCHEDULER_ID = "wait-sweep-every-10m";
9
+ /** The usage sweeper's old scheduler (every minute). */
10
+ export const USAGE_SWEEP_SCHEDULER_ID = "usage-report-sweep-every";
@@ -112,7 +112,7 @@ export class LangGraphLoop {
112
112
  build(ctx) {
113
113
  const timedOut = () => Date.now() >= ctx.limits.deadline;
114
114
  // 本次运行的附件字节缓存:各步共用,运行结束即丢弃(只是优化,见 MediaCache)
115
- const mediaCache = new MediaCache(this.stepDeps.config().attachments.requestMediaBytes);
115
+ const mediaCache = new MediaCache(this.stepDeps.config.get().attachments.requestMediaBytes);
116
116
  const input = (step, absorbedUpToSeq) => ({
117
117
  orgId: ctx.orgId,
118
118
  conversationId: ctx.conversationId,