@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.5

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 (507) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +39 -13
  3. package/dist/admin/admin.controller.js +33 -17
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +51 -22
  19. package/dist/agents/agents.service.js +172 -70
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/org-templates.d.ts +176 -0
  27. package/dist/agents/org-templates.js +827 -0
  28. package/dist/agents/pending-connector-requests.d.ts +77 -0
  29. package/dist/agents/pending-connector-requests.js +215 -0
  30. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  31. package/dist/agents/pending-connectors.controller.js +91 -0
  32. package/dist/agents/pending-connectors.service.d.ts +62 -0
  33. package/dist/agents/pending-connectors.service.js +282 -0
  34. package/dist/agents/templates.controller.d.ts +86 -5
  35. package/dist/agents/templates.controller.js +171 -7
  36. package/dist/agents/templates.d.ts +127 -23
  37. package/dist/agents/templates.js +475 -52
  38. package/dist/background/background.module.js +8 -1
  39. package/dist/background/finish.d.ts +3 -2
  40. package/dist/background/launch-lock.d.ts +4 -3
  41. package/dist/background/launch-lock.js +4 -3
  42. package/dist/background/poll.job.d.ts +9 -6
  43. package/dist/background/poll.job.js +30 -22
  44. package/dist/background/session.d.ts +13 -2
  45. package/dist/background/session.js +13 -0
  46. package/dist/background/stop.d.ts +12 -6
  47. package/dist/background/stop.js +57 -39
  48. package/dist/background/store.d.ts +18 -6
  49. package/dist/background/store.js +12 -6
  50. package/dist/background/tasks.service.d.ts +15 -5
  51. package/dist/background/tasks.service.js +42 -17
  52. package/dist/background/wake-rules.d.ts +27 -18
  53. package/dist/background/wake-rules.js +52 -22
  54. package/dist/background/wake.d.ts +13 -11
  55. package/dist/background/wake.js +20 -14
  56. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  57. package/dist/catalog/admin-catalog.controller.js +213 -42
  58. package/dist/catalog/catalog-content.d.ts +58 -32
  59. package/dist/catalog/catalog-content.js +34 -8
  60. package/dist/catalog/catalog-import.module.d.ts +7 -0
  61. package/dist/catalog/catalog-import.module.js +60 -0
  62. package/dist/catalog/catalog-items.d.ts +111 -7
  63. package/dist/catalog/catalog-items.js +279 -13
  64. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  65. package/dist/catalog/catalog-scope.service.js +1116 -0
  66. package/dist/catalog/catalog.module.d.ts +7 -9
  67. package/dist/catalog/catalog.module.js +41 -31
  68. package/dist/catalog/catalog.service.d.ts +101 -29
  69. package/dist/catalog/catalog.service.js +104 -106
  70. package/dist/catalog/cli.d.ts +11 -1
  71. package/dist/catalog/cli.js +26 -1
  72. package/dist/catalog/component-promotion.d.ts +96 -0
  73. package/dist/catalog/component-promotion.js +395 -0
  74. package/dist/catalog/component-scope.controller.d.ts +152 -0
  75. package/dist/catalog/component-scope.controller.js +287 -0
  76. package/dist/catalog/component-scope.service.d.ts +303 -0
  77. package/dist/catalog/component-scope.service.js +936 -0
  78. package/dist/catalog/component-state.d.ts +174 -0
  79. package/dist/catalog/component-state.js +437 -0
  80. package/dist/catalog/job-ids.d.ts +30 -0
  81. package/dist/catalog/job-ids.js +25 -0
  82. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  83. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  84. package/dist/catalog/marketplaces.controller.js +56 -7
  85. package/dist/catalog/marketplaces.service.d.ts +54 -14
  86. package/dist/catalog/marketplaces.service.js +71 -22
  87. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  88. package/dist/catalog/org-catalog.controller.js +181 -65
  89. package/dist/catalog/org-catalog.service.d.ts +65 -33
  90. package/dist/catalog/org-catalog.service.js +324 -157
  91. package/dist/catalog/org-extension-switch.d.ts +41 -0
  92. package/dist/catalog/org-extension-switch.js +115 -0
  93. package/dist/catalog/org-extension.controller.d.ts +119 -0
  94. package/dist/catalog/org-extension.controller.js +266 -0
  95. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  96. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  97. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  98. package/dist/catalog/org-plugin-uploads.js +116 -0
  99. package/dist/catalog/owned-items.d.ts +184 -0
  100. package/dist/catalog/owned-items.js +789 -0
  101. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  102. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  103. package/dist/catalog/ownership.d.ts +172 -0
  104. package/dist/catalog/ownership.js +326 -0
  105. package/dist/catalog/platform-components.d.ts +221 -0
  106. package/dist/catalog/platform-components.js +761 -0
  107. package/dist/catalog/platform-migration.d.ts +115 -0
  108. package/dist/catalog/platform-migration.js +582 -0
  109. package/dist/catalog/plugin-import.d.ts +178 -34
  110. package/dist/catalog/plugin-import.js +622 -82
  111. package/dist/catalog/plugin-install.d.ts +185 -41
  112. package/dist/catalog/plugin-install.js +758 -126
  113. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  114. package/dist/catalog/plugin-upgrade.js +1147 -1136
  115. package/dist/catalog/request-rules.d.ts +65 -0
  116. package/dist/catalog/request-rules.js +217 -0
  117. package/dist/catalog/requests.service.d.ts +193 -118
  118. package/dist/catalog/requests.service.js +526 -343
  119. package/dist/catalog/reserved-names.d.ts +8 -0
  120. package/dist/catalog/reserved-names.js +42 -0
  121. package/dist/catalog/scope-orgs.d.ts +21 -0
  122. package/dist/catalog/scope-orgs.js +67 -0
  123. package/dist/catalog/scope-state.d.ts +35 -0
  124. package/dist/catalog/scope-state.js +87 -0
  125. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  126. package/dist/catalog/scope-sync-workers.js +29 -0
  127. package/dist/catalog/scope-sync.d.ts +176 -0
  128. package/dist/catalog/scope-sync.js +576 -0
  129. package/dist/catalog/scope.d.ts +42 -0
  130. package/dist/catalog/scope.js +42 -0
  131. package/dist/catalog/unshare.d.ts +22 -0
  132. package/dist/catalog/unshare.js +118 -0
  133. package/dist/channels/actions.js +1 -0
  134. package/dist/channels/cards.js +20 -2
  135. package/dist/channels/channels.module.js +2 -0
  136. package/dist/channels/inbound.d.ts +9 -1
  137. package/dist/channels/inbound.js +67 -5
  138. package/dist/channels/phrases.d.ts +35 -0
  139. package/dist/channels/phrases.js +29 -0
  140. package/dist/config/docs.js +3 -1
  141. package/dist/config/schema.d.ts +6 -2
  142. package/dist/config/schema.js +46 -22
  143. package/dist/conversations/access.d.ts +6 -4
  144. package/dist/conversations/access.js +27 -5
  145. package/dist/conversations/agent-tree.d.ts +46 -0
  146. package/dist/conversations/agent-tree.js +92 -0
  147. package/dist/conversations/conversations.controller.d.ts +43 -18
  148. package/dist/conversations/conversations.controller.js +79 -38
  149. package/dist/conversations/conversations.module.d.ts +1 -1
  150. package/dist/conversations/conversations.module.js +7 -7
  151. package/dist/conversations/conversations.service.d.ts +69 -12
  152. package/dist/conversations/conversations.service.js +106 -27
  153. package/dist/conversations/environment-status.d.ts +24 -0
  154. package/dist/conversations/environment-status.js +71 -0
  155. package/dist/conversations/event-log.d.ts +20 -5
  156. package/dist/conversations/event-log.js +60 -0
  157. package/dist/conversations/events.d.ts +84 -2
  158. package/dist/conversations/events.js +91 -17
  159. package/dist/conversations/queue.service.d.ts +1 -1
  160. package/dist/conversations/queue.service.js +5 -0
  161. package/dist/conversations/titles.d.ts +5 -3
  162. package/dist/conversations/titles.js +21 -8
  163. package/dist/conversations/tree.d.ts +17 -0
  164. package/dist/conversations/tree.js +42 -0
  165. package/dist/ctx/create-ctx.d.ts +5 -0
  166. package/dist/ctx/create-ctx.js +15 -5
  167. package/dist/db/kernel-schema.d.ts +362 -18
  168. package/dist/environments/access.d.ts +41 -0
  169. package/dist/environments/access.js +77 -0
  170. package/dist/environments/conversation-environments.d.ts +61 -0
  171. package/dist/environments/conversation-environments.js +170 -0
  172. package/dist/environments/dto.d.ts +25 -0
  173. package/dist/environments/dto.js +12 -0
  174. package/dist/environments/environments.controller.d.ts +33 -0
  175. package/dist/environments/environments.controller.js +110 -0
  176. package/dist/environments/environments.module.d.ts +8 -0
  177. package/dist/environments/environments.module.js +27 -0
  178. package/dist/environments/environments.service.d.ts +153 -0
  179. package/dist/environments/environments.service.js +541 -0
  180. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  181. package/dist/environments/legacy-cleanup.job.js +141 -0
  182. package/dist/errors.d.ts +82 -2
  183. package/dist/errors.js +82 -2
  184. package/dist/evals/reconstruct.d.ts +18 -9
  185. package/dist/evals/reconstruct.js +26 -7
  186. package/dist/evals/run-replay.d.ts +4 -2
  187. package/dist/evals/run-replay.js +16 -4
  188. package/dist/evals/step-replay.d.ts +2 -5
  189. package/dist/evals/step-replay.js +1 -1
  190. package/dist/evals/trajectory.service.d.ts +8 -3
  191. package/dist/evals/trajectory.service.js +26 -14
  192. package/dist/evals/worker.d.ts +5 -5
  193. package/dist/evals/worker.js +9 -3
  194. package/dist/extensions/admin-ops.d.ts +36 -10
  195. package/dist/extensions/admin-ops.js +65 -42
  196. package/dist/extensions/admin-view.d.ts +37 -10
  197. package/dist/extensions/admin-view.js +103 -20
  198. package/dist/extensions/bootstrap.d.ts +17 -4
  199. package/dist/extensions/bootstrap.js +70 -9
  200. package/dist/extensions/cli.d.ts +12 -0
  201. package/dist/extensions/cli.js +11 -2
  202. package/dist/extensions/deployment-config.d.ts +28 -5
  203. package/dist/extensions/deployment-config.js +48 -7
  204. package/dist/extensions/effective-config.d.ts +127 -0
  205. package/dist/extensions/effective-config.js +368 -0
  206. package/dist/extensions/extensions.module.js +8 -2
  207. package/dist/extensions/hooks.d.ts +37 -4
  208. package/dist/extensions/hooks.js +82 -16
  209. package/dist/extensions/host.d.ts +19 -1
  210. package/dist/extensions/host.js +30 -7
  211. package/dist/extensions/installs.d.ts +20 -8
  212. package/dist/extensions/installs.js +37 -15
  213. package/dist/extensions/org-config.d.ts +75 -6
  214. package/dist/extensions/org-config.js +184 -32
  215. package/dist/extensions/org-levels.d.ts +37 -0
  216. package/dist/extensions/org-levels.js +71 -0
  217. package/dist/extensions/org-overrides.d.ts +151 -0
  218. package/dist/extensions/org-overrides.js +524 -0
  219. package/dist/extensions/permission-view.d.ts +16 -4
  220. package/dist/extensions/permission-view.js +4 -4
  221. package/dist/extensions/plugin-items.d.ts +21 -0
  222. package/dist/extensions/plugin-items.js +42 -0
  223. package/dist/extensions/point-defaults.d.ts +12 -5
  224. package/dist/extensions/point-defaults.js +37 -9
  225. package/dist/extensions/resolve.d.ts +5 -1
  226. package/dist/extensions/resolve.js +15 -2
  227. package/dist/files/previewers.d.ts +8 -1
  228. package/dist/files/previewers.js +35 -6
  229. package/dist/http/api.module.js +23 -3
  230. package/dist/http/app.d.ts +11 -2
  231. package/dist/http/app.js +31 -5
  232. package/dist/identity/accounts.d.ts +29 -29
  233. package/dist/identity/accounts.js +47 -47
  234. package/dist/identity/audit.d.ts +2 -1
  235. package/dist/identity/auth.guard.d.ts +13 -5
  236. package/dist/identity/auth.guard.js +26 -9
  237. package/dist/identity/identity.module.d.ts +1 -1
  238. package/dist/identity/identity.module.js +4 -4
  239. package/dist/identity/me.controller.js +1 -1
  240. package/dist/identity/principal.d.ts +3 -3
  241. package/dist/identity/principal.js +3 -3
  242. package/dist/identity/settings.d.ts +22 -11
  243. package/dist/identity/settings.js +53 -18
  244. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  245. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  246. package/dist/inbox/inbox.module.d.ts +4 -1
  247. package/dist/inbox/inbox.module.js +7 -3
  248. package/dist/inbox/inbox.service.d.ts +62 -3
  249. package/dist/inbox/inbox.service.js +74 -4
  250. package/dist/inbox/org-notices.d.ts +63 -0
  251. package/dist/inbox/org-notices.js +91 -0
  252. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  253. package/dist/inbox/platform-inbox.controller.js +58 -0
  254. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  255. package/dist/inbox/platform-inbox.service.js +263 -0
  256. package/dist/inbox/platform-notices.d.ts +19 -0
  257. package/dist/inbox/platform-notices.js +9 -0
  258. package/dist/index.d.ts +1 -1
  259. package/dist/index.js +1 -1
  260. package/dist/infra/cli/kernel-cli.module.js +9 -1
  261. package/dist/infra/config/kernel-config.service.js +21 -1
  262. package/dist/infra/database/xact-lock.d.ts +1 -1
  263. package/dist/infra/database/xact-lock.js +1 -1
  264. package/dist/infra/events/kernel-events.d.ts +11 -2
  265. package/dist/infra/queue/add-job-once.d.ts +14 -0
  266. package/dist/infra/queue/add-job-once.js +16 -0
  267. package/dist/kernel.module.js +6 -0
  268. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  269. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  270. package/dist/models/prices.d.ts +5 -5
  271. package/dist/models/prices.js +4 -4
  272. package/dist/models/purposes.controller.d.ts +6 -4
  273. package/dist/models/purposes.controller.js +13 -7
  274. package/dist/models/purposes.d.ts +20 -9
  275. package/dist/models/purposes.js +17 -8
  276. package/dist/orgs/directory-sync.d.ts +14 -5
  277. package/dist/orgs/directory-sync.js +41 -17
  278. package/dist/orgs/offboarding.d.ts +9 -7
  279. package/dist/orgs/offboarding.js +28 -17
  280. package/dist/orgs/org-lock.d.ts +5 -0
  281. package/dist/orgs/org-lock.js +13 -0
  282. package/dist/orgs/org.guard.d.ts +10 -0
  283. package/dist/orgs/org.guard.js +43 -32
  284. package/dist/orgs/orgs.module.js +3 -0
  285. package/dist/orgs/orgs.service.d.ts +20 -7
  286. package/dist/orgs/orgs.service.js +32 -12
  287. package/dist/orgs/roles.d.ts +1 -1
  288. package/dist/orgs/roles.js +5 -1
  289. package/dist/orgs/settings.controller.d.ts +1 -1
  290. package/dist/orgs/settings.service.d.ts +15 -3
  291. package/dist/orgs/settings.service.js +6 -2
  292. package/dist/overrides.d.ts +3 -0
  293. package/dist/overrides.js +2 -0
  294. package/dist/platform/actor.d.ts +48 -0
  295. package/dist/platform/actor.js +100 -0
  296. package/dist/platform/agent-docs.d.ts +18 -0
  297. package/dist/platform/agent-docs.js +59 -0
  298. package/dist/platform/availability.d.ts +14 -0
  299. package/dist/platform/availability.js +43 -0
  300. package/dist/platform/errors.d.ts +11 -0
  301. package/dist/platform/errors.js +26 -0
  302. package/dist/platform/exclusions.d.ts +12 -0
  303. package/dist/platform/exclusions.js +1387 -0
  304. package/dist/platform/method.d.ts +6 -0
  305. package/dist/platform/method.js +15 -0
  306. package/dist/platform/operation.d.ts +92 -0
  307. package/dist/platform/operation.js +35 -0
  308. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  309. package/dist/platform/ops/agent-templates.ops.js +92 -0
  310. package/dist/platform/ops/agents.ops.d.ts +19 -0
  311. package/dist/platform/ops/agents.ops.js +294 -0
  312. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  313. package/dist/platform/ops/connectors.ops.js +126 -0
  314. package/dist/platform/ops/errors.d.ts +11 -0
  315. package/dist/platform/ops/errors.js +22 -0
  316. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  317. package/dist/platform/ops/extensions.ops.js +116 -0
  318. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  319. package/dist/platform/ops/marketplaces.ops.js +157 -0
  320. package/dist/platform/ops/paging.d.ts +14 -0
  321. package/dist/platform/ops/paging.js +20 -0
  322. package/dist/platform/ops/platform.ops.d.ts +23 -0
  323. package/dist/platform/ops/platform.ops.js +158 -0
  324. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  325. package/dist/platform/ops/plugins.ops.js +377 -0
  326. package/dist/platform/ops/requests.ops.d.ts +14 -0
  327. package/dist/platform/ops/requests.ops.js +153 -0
  328. package/dist/platform/ops/role.d.ts +4 -0
  329. package/dist/platform/ops/role.js +10 -0
  330. package/dist/platform/ops/skills.ops.d.ts +13 -0
  331. package/dist/platform/ops/skills.ops.js +98 -0
  332. package/dist/platform/ops/summary.d.ts +10 -0
  333. package/dist/platform/ops/summary.js +18 -0
  334. package/dist/platform/platform-ops.module.d.ts +7 -0
  335. package/dist/platform/platform-ops.module.js +55 -0
  336. package/dist/platform/platform.module.d.ts +8 -0
  337. package/dist/platform/platform.module.js +25 -0
  338. package/dist/platform/redact-orgs.d.ts +7 -0
  339. package/dist/platform/redact-orgs.js +52 -0
  340. package/dist/platform/registry.d.ts +30 -0
  341. package/dist/platform/registry.js +111 -0
  342. package/dist/roles/worker-role.d.ts +6 -4
  343. package/dist/roles/worker-role.js +14 -7
  344. package/dist/roles/worker.module.d.ts +1 -1
  345. package/dist/roles/worker.module.js +9 -1
  346. package/dist/runtime/context/build.d.ts +6 -4
  347. package/dist/runtime/context/build.js +26 -7
  348. package/dist/runtime/context/claude-tools.d.ts +2 -1
  349. package/dist/runtime/context/claude-tools.js +5 -4
  350. package/dist/runtime/context/compaction.js +9 -0
  351. package/dist/runtime/context/reminders.d.ts +2 -0
  352. package/dist/runtime/context/reminders.js +2 -0
  353. package/dist/runtime/context/skills.js +9 -2
  354. package/dist/runtime/context/tool-changes.d.ts +27 -0
  355. package/dist/runtime/context/tool-changes.js +60 -0
  356. package/dist/runtime/hook-calls.js +2 -0
  357. package/dist/runtime/langgraph-loop.d.ts +3 -1
  358. package/dist/runtime/langgraph-loop.js +35 -17
  359. package/dist/runtime/loop.d.ts +32 -4
  360. package/dist/runtime/maintenance.d.ts +7 -4
  361. package/dist/runtime/maintenance.js +23 -8
  362. package/dist/runtime/model-call.d.ts +30 -8
  363. package/dist/runtime/model-call.js +69 -19
  364. package/dist/runtime/run-control.d.ts +11 -1
  365. package/dist/runtime/run-control.js +12 -0
  366. package/dist/runtime/run-drafts.d.ts +85 -0
  367. package/dist/runtime/run-drafts.js +230 -0
  368. package/dist/runtime/run-jobs.d.ts +3 -5
  369. package/dist/runtime/run-jobs.js +3 -7
  370. package/dist/runtime/run-queue.d.ts +37 -3
  371. package/dist/runtime/run-queue.js +188 -11
  372. package/dist/runtime/run-worker.d.ts +11 -5
  373. package/dist/runtime/run-worker.js +54 -31
  374. package/dist/runtime/runtime.module.js +3 -0
  375. package/dist/runtime/step-log.d.ts +9 -4
  376. package/dist/runtime/step-log.js +8 -5
  377. package/dist/runtime/stream.controller.d.ts +23 -1
  378. package/dist/runtime/stream.controller.js +60 -3
  379. package/dist/runtime/stream.d.ts +4 -1
  380. package/dist/runtime/stream.js +27 -3
  381. package/dist/runtime/subagents/child.d.ts +55 -7
  382. package/dist/runtime/subagents/child.js +105 -7
  383. package/dist/runtime/subagents/definition.d.ts +12 -3
  384. package/dist/runtime/subagents/definition.js +43 -29
  385. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  386. package/dist/runtime/subagents/deliveries.js +228 -0
  387. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  388. package/dist/runtime/subagents/dispatch.js +212 -141
  389. package/dist/runtime/subagents/limits.d.ts +24 -5
  390. package/dist/runtime/subagents/limits.js +40 -6
  391. package/dist/runtime/subagents/messages.d.ts +95 -0
  392. package/dist/runtime/subagents/messages.js +328 -0
  393. package/dist/runtime/subagents/preamble.d.ts +4 -4
  394. package/dist/runtime/subagents/preamble.js +9 -7
  395. package/dist/runtime/subagents/progress.d.ts +8 -6
  396. package/dist/runtime/subagents/progress.js +11 -6
  397. package/dist/runtime/subagents/render.d.ts +30 -0
  398. package/dist/runtime/subagents/render.js +53 -0
  399. package/dist/runtime/subagents/roster.d.ts +24 -7
  400. package/dist/runtime/subagents/roster.js +47 -11
  401. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  402. package/dist/runtime/subagents/skill-fork.js +8 -4
  403. package/dist/runtime/subagents/status.d.ts +14 -0
  404. package/dist/runtime/subagents/status.js +23 -0
  405. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  406. package/dist/runtime/subagents/subagents.service.js +11 -6
  407. package/dist/runtime/usage-report.js +17 -12
  408. package/dist/runtime/waits.d.ts +140 -37
  409. package/dist/runtime/waits.js +394 -106
  410. package/dist/sandbox/jobs.d.ts +40 -13
  411. package/dist/sandbox/jobs.js +57 -20
  412. package/dist/sandbox/leases.d.ts +37 -54
  413. package/dist/sandbox/leases.js +71 -115
  414. package/dist/sandbox/providers.d.ts +2 -2
  415. package/dist/sandbox/providers.js +1 -1
  416. package/dist/sandbox/sandbox.module.d.ts +3 -2
  417. package/dist/sandbox/sandbox.module.js +4 -3
  418. package/dist/sandbox/sandbox.service.d.ts +229 -134
  419. package/dist/sandbox/sandbox.service.js +630 -409
  420. package/dist/skills/catalog.d.ts +3 -2
  421. package/dist/skills/catalog.js +21 -43
  422. package/dist/skills/changes.controller.d.ts +7 -0
  423. package/dist/skills/changes.controller.js +19 -1
  424. package/dist/skills/invoke.js +8 -3
  425. package/dist/skills/package.d.ts +20 -1
  426. package/dist/skills/package.js +28 -1
  427. package/dist/skills/skills.controller.d.ts +39 -4
  428. package/dist/skills/skills.controller.js +88 -10
  429. package/dist/skills/skills.module.js +10 -1
  430. package/dist/skills/skills.service.d.ts +106 -26
  431. package/dist/skills/skills.service.js +421 -75
  432. package/dist/skills/usable.d.ts +81 -0
  433. package/dist/skills/usable.js +379 -0
  434. package/dist/tools/approvals.service.d.ts +20 -2
  435. package/dist/tools/approvals.service.js +23 -4
  436. package/dist/tools/builtin-names.d.ts +21 -5
  437. package/dist/tools/builtin-names.js +30 -5
  438. package/dist/tools/builtins/agent.d.ts +23 -21
  439. package/dist/tools/builtins/agent.js +62 -55
  440. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  441. package/dist/tools/builtins/builtin-tools.js +37 -12
  442. package/dist/tools/builtins/handback.d.ts +28 -0
  443. package/dist/tools/builtins/handback.js +53 -0
  444. package/dist/tools/builtins/platform.d.ts +34 -0
  445. package/dist/tools/builtins/platform.js +362 -0
  446. package/dist/tools/builtins/sandbox/bash.js +13 -3
  447. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  448. package/dist/tools/builtins/sandbox/common.js +80 -45
  449. package/dist/tools/builtins/sandbox/edit.js +2 -2
  450. package/dist/tools/builtins/sandbox/glob.js +2 -2
  451. package/dist/tools/builtins/sandbox/grep.js +2 -4
  452. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  453. package/dist/tools/builtins/sandbox/index.js +1 -1
  454. package/dist/tools/builtins/sandbox/read.js +1 -1
  455. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  456. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  457. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  458. package/dist/tools/builtins/sandbox/write.js +2 -2
  459. package/dist/tools/builtins/send-message.d.ts +56 -0
  460. package/dist/tools/builtins/send-message.js +100 -0
  461. package/dist/tools/builtins/skill-load.d.ts +22 -14
  462. package/dist/tools/builtins/skill-load.js +86 -57
  463. package/dist/tools/builtins/skill-write.js +1 -1
  464. package/dist/tools/builtins/web/extract.js +5 -1
  465. package/dist/tools/builtins/web/fetch.js +1 -0
  466. package/dist/tools/builtins/web/search.js +1 -0
  467. package/dist/tools/connectors.controller.d.ts +10 -0
  468. package/dist/tools/connectors.controller.js +12 -0
  469. package/dist/tools/connectors.service.d.ts +46 -5
  470. package/dist/tools/connectors.service.js +94 -15
  471. package/dist/tools/extension-tools.controller.d.ts +14 -0
  472. package/dist/tools/extension-tools.controller.js +37 -0
  473. package/dist/tools/info.d.ts +42 -1
  474. package/dist/tools/info.js +64 -1
  475. package/dist/tools/org-tool-switches.d.ts +74 -0
  476. package/dist/tools/org-tool-switches.js +184 -0
  477. package/dist/tools/pipeline.d.ts +46 -40
  478. package/dist/tools/pipeline.js +187 -364
  479. package/dist/tools/policy.d.ts +1 -1
  480. package/dist/tools/policy.js +36 -16
  481. package/dist/tools/registry.d.ts +98 -5
  482. package/dist/tools/registry.js +87 -9
  483. package/dist/tools/tools.module.js +12 -2
  484. package/dist/ui/views.d.ts +2 -1
  485. package/dist/ui/views.js +17 -3
  486. package/package.json +3 -3
  487. package/src/migrations/0074_subagent_tree.sql +50 -0
  488. package/src/migrations/0075_plugin_scope.sql +61 -0
  489. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  490. package/src/migrations/0077_scope_requests.sql +52 -0
  491. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  492. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  493. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  494. package/src/migrations/0081_platform_components.sql +129 -0
  495. package/src/migrations/0082_platform_migration.sql +33 -0
  496. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  497. package/src/migrations/0084_org_owned_items.sql +85 -0
  498. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  499. package/src/migrations/0086_org_layering.sql +30 -0
  500. package/src/migrations/0087_approval_summary.sql +6 -0
  501. package/src/migrations/0088_environments.sql +80 -0
  502. package/dist/catalog/upgrade-targets.d.ts +0 -56
  503. package/dist/catalog/upgrade-targets.js +0 -90
  504. package/dist/conversations/sandbox-status.d.ts +0 -24
  505. package/dist/conversations/sandbox-status.js +0 -52
  506. package/dist/extensions/org-config.controller.d.ts +0 -32
  507. package/dist/extensions/org-config.controller.js +0 -70
@@ -8,6 +8,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
10
  import { Inject, Injectable } from "@nestjs/common";
11
+ import { PluginScopeSyncProcessor } from "../catalog/scope-sync.js";
11
12
  import { ChannelsProcessor } from "../channels/channels.module.js";
12
13
  import { ChannelOutbound } from "../channels/outbound.js";
13
14
  import { TitleQueue } from "../conversations/titles.js";
@@ -24,8 +25,8 @@ import { UsageReporter } from "../runtime/usage-report.js";
24
25
  /**
25
26
  * The worker role's parts, driven by `KernelLifecycle` at fixed points of its start order and stop
26
27
  * phases (so they stay ordered after the extension load and before the extension host closes): the
27
- * queue consumers (runs, sub-agent runs, evals, maintenance, channel deliveries, `usage.report`,
28
- * titles) and the schedulers of the `@LockedCron` / `@LockedInterval` jobs. Provided only by
28
+ * queue consumers (runs, sub-agent runs, evals, maintenance, the plugin scope sync, channel
29
+ * deliveries, `usage.report`, titles) and the schedulers of the `@LockedCron` / `@LockedInterval` jobs. Provided only by
29
30
  * `WorkerModule`, so a process without the worker role has none of them.
30
31
  */
31
32
  let WorkerRole = class WorkerRole {
@@ -44,13 +45,14 @@ let WorkerRole = class WorkerRole {
44
45
  channelsProcessor;
45
46
  evalsProcessor;
46
47
  maintenanceProcessor;
48
+ scopeProcessor;
47
49
  /** The startup config (the roles). */
48
50
  config;
49
51
  /** The run worker was started: the runs phase drains it. */
50
52
  runsStarted = false;
51
53
  /** The eval worker was started: the runs phase drains it. */
52
54
  evalsStarted = false;
53
- constructor(config, log, intervals, scheduledRuns, runWorker, evalWorker, usageReport, titles, channelOutbound, runsProcessor, subagentRunsProcessor, usageProcessor, titleProcessor, channelsProcessor, evalsProcessor, maintenanceProcessor) {
55
+ constructor(config, log, intervals, scheduledRuns, runWorker, evalWorker, usageReport, titles, channelOutbound, runsProcessor, subagentRunsProcessor, usageProcessor, titleProcessor, channelsProcessor, evalsProcessor, maintenanceProcessor, scopeProcessor) {
54
56
  this.log = log;
55
57
  this.intervals = intervals;
56
58
  this.scheduledRuns = scheduledRuns;
@@ -66,6 +68,7 @@ let WorkerRole = class WorkerRole {
66
68
  this.channelsProcessor = channelsProcessor;
67
69
  this.evalsProcessor = evalsProcessor;
68
70
  this.maintenanceProcessor = maintenanceProcessor;
71
+ this.scopeProcessor = scopeProcessor;
69
72
  this.config = config.get();
70
73
  }
71
74
  /**
@@ -92,6 +95,7 @@ let WorkerRole = class WorkerRole {
92
95
  }
93
96
  checkpoint();
94
97
  this.maintenanceProcessor.start();
98
+ this.scopeProcessor.start();
95
99
  this.channelOutbound.startWorker(this.channelsProcessor.worker);
96
100
  this.usageReport.startWorker(this.usageProcessor.worker);
97
101
  this.titles.startWorker(this.titleProcessor.worker);
@@ -101,6 +105,8 @@ let WorkerRole = class WorkerRole {
101
105
  // The gate opens: from here on ticks run; the runOnStart jobs run once now, in the background
102
106
  this.scheduledRuns.open();
103
107
  this.intervals.runStartJobs();
108
+ // Every plugin's scope converges once per worker start (a failed or lost sync is retried)
109
+ this.scopeProcessor.resync();
104
110
  }
105
111
  /**
106
112
  * Closes the start gate and stops the schedulers (no new tick; the runs in progress get the stop
@@ -117,9 +123,9 @@ let WorkerRole = class WorkerRole {
117
123
  drainEvals(budgetMs) {
118
124
  return this.evalsStarted ? this.evalWorker.close(budgetMs) : undefined;
119
125
  }
120
- /** Closes the maintenance queue's worker. */
121
- closeMaintenance() {
122
- return this.maintenanceProcessor.worker.close();
126
+ /** Closes the maintenance queue's worker and the plugin scope sync's (it stops between pairs). */
127
+ async closeMaintenance() {
128
+ await Promise.all([this.maintenanceProcessor.worker.close(), this.scopeProcessor.close()]);
123
129
  }
124
130
  };
125
131
  WorkerRole = __decorate([
@@ -139,6 +145,7 @@ WorkerRole = __decorate([
139
145
  __param(12, Inject(TitleProcessor)),
140
146
  __param(13, Inject(ChannelsProcessor)),
141
147
  __param(14, Inject(EvalsProcessor)),
142
- __param(15, Inject(MaintenanceProcessor))
148
+ __param(15, Inject(MaintenanceProcessor)),
149
+ __param(16, Inject(PluginScopeSyncProcessor))
143
150
  ], WorkerRole);
144
151
  export { WorkerRole };
@@ -5,7 +5,7 @@ import type { KernelConfig } from "../config/schema.js";
5
5
  * `worker`: the cron scheduler and the `@LockedInterval` scheduler (`KernelScheduleModule`, the one
6
6
  * place `ScheduleModule.forRoot` is imported), every fixed-period job (`@LockedCron` /
7
7
  * `@LockedInterval`, each once per tick across replicas), every queue consumer (`@Processor`: runs,
8
- * sub-agent runs, `usage.report`, titles, evals, maintenance, channel deliveries) and
8
+ * sub-agent runs, `usage.report`, titles, evals, maintenance, channel deliveries, the plugin scope sync) and
9
9
  * {@link WorkerRole}, which `KernelLifecycle` drives. A process without the worker role runs no cron
10
10
  * and no BullMQ worker (the queues' producers exist on every role).
11
11
  */
@@ -10,18 +10,22 @@ import { BackgroundModule } from "../background/background.module.js";
10
10
  import { BackgroundTaskPollJob } from "../background/poll.job.js";
11
11
  import { CatalogModule } from "../catalog/catalog.module.js";
12
12
  import { CatalogJobs } from "../catalog/jobs.js";
13
+ import { PlatformMigration } from "../catalog/platform-migration.js";
14
+ import { PluginScopeWorkersModule } from "../catalog/scope-sync-workers.js";
13
15
  import { ChannelsModule, ChannelWorkersModule } from "../channels/channels.module.js";
14
16
  import { GatewayCheckJob } from "../channels/supervisor.js";
15
17
  import { AttachmentsModule } from "../conversations/attachments.module.js";
16
18
  import { AttachmentCleanupJob } from "../conversations/attachments.service.js";
17
19
  import { EventLogModule } from "../conversations/event-log.js";
18
20
  import { TitlesModule } from "../conversations/titles.js";
21
+ import { LegacySandboxCleanupJob } from "../environments/legacy-cleanup.job.js";
19
22
  import { EvalWorkersModule } from "../evals/evals.module.js";
20
23
  import { ExtensionsModule } from "../extensions/extensions.module.js";
21
24
  import { PluginsReconcileJob } from "../extensions/lifecycle.js";
22
25
  import { KernelScheduleModule } from "../infra/schedule/schedule.module.js";
23
26
  import { DirectoryScanJob } from "../orgs/directory-sync.js";
24
27
  import { OffboardSweepJob } from "../orgs/offboarding.js";
28
+ import { OrgLockModule } from "../orgs/org-lock.js";
25
29
  import { OrgsModule } from "../orgs/orgs.module.js";
26
30
  import { MaintenanceModule } from "../runtime/maintenance.js";
27
31
  import { RuntimeWorkersModule } from "../runtime/run-processors.js";
@@ -40,7 +44,7 @@ import { WorkerRole } from "./worker-role.js";
40
44
  * `worker`: the cron scheduler and the `@LockedInterval` scheduler (`KernelScheduleModule`, the one
41
45
  * place `ScheduleModule.forRoot` is imported), every fixed-period job (`@LockedCron` /
42
46
  * `@LockedInterval`, each once per tick across replicas), every queue consumer (`@Processor`: runs,
43
- * sub-agent runs, `usage.report`, titles, evals, maintenance, channel deliveries) and
47
+ * sub-agent runs, `usage.report`, titles, evals, maintenance, channel deliveries, the plugin scope sync) and
44
48
  * {@link WorkerRole}, which `KernelLifecycle` drives. A process without the worker role runs no cron
45
49
  * and no BullMQ worker (the queues' producers exist on every role).
46
50
  */
@@ -55,6 +59,7 @@ let WorkerModule = WorkerModule_1 = class WorkerModule {
55
59
  EvalWorkersModule.forRoot(config),
56
60
  ChannelWorkersModule.forRoot(config),
57
61
  MaintenanceModule,
62
+ PluginScopeWorkersModule,
58
63
  // the domains the fixed-period jobs call
59
64
  RuntimeModule,
60
65
  UsageReportModule,
@@ -67,6 +72,7 @@ let WorkerModule = WorkerModule_1 = class WorkerModule {
67
72
  ToolsModule,
68
73
  CatalogModule,
69
74
  OrgsModule,
75
+ OrgLockModule,
70
76
  ExtensionsModule,
71
77
  ChannelsModule,
72
78
  ],
@@ -76,9 +82,11 @@ let WorkerModule = WorkerModule_1 = class WorkerModule {
76
82
  AttachmentCleanupJob,
77
83
  StoragePurgeJob,
78
84
  SandboxSweepJobs,
85
+ LegacySandboxCleanupJob,
79
86
  BackgroundTaskPollJob,
80
87
  ToolJobs,
81
88
  CatalogJobs,
89
+ PlatformMigration,
82
90
  DirectoryScanJob,
83
91
  OffboardSweepJob,
84
92
  PluginsReconcileJob,
@@ -54,8 +54,8 @@ export interface BuildModelRequestInput {
54
54
  model: ModelInfo;
55
55
  step: number;
56
56
  /**
57
- * loop 已吸收到的位置(R31):the largest seq of the absorbable events (`user_message` and
58
- * `background_task_finished`, {@link isAbsorbable}) the loop took. 提供时:
57
+ * loop 已吸收到的位置(R31):the largest seq of the absorbable events (`user_message`,
58
+ * `background_task_finished` and `subagent_delivery`, {@link isAbsorbable}) the loop took. 提供时:
59
59
  * - seq 大于它的可吸收事件不进请求(运行中途到达、尚未被吸收的插话或后台任务结束,由后续步骤吸收或触发下一轮);
60
60
  * - 每个可吸收事件放在**吸收它的那次模型调用**的位置:日志里第一个 `request.absorbedUpToSeq`
61
61
  * 不小于它的 `model_call` 之前(没有该字段的旧 model_call 视为吸收了它之前的全部消息),
@@ -232,8 +232,10 @@ export declare function summaryText(summary: string): string;
232
232
  * - messages:最近一条摘要(若有)作为首条 user 消息,其后按 seq 回放 `coversUpToSeq` 之后的
233
233
  * `user_message` / `assistant_message`(content 原样,含 opaque;aborted 的也回放;媒体引用按
234
234
  * {@link resolveMedia} 换成 base64 或文字占位)/ `reminder`
235
- * (`role: "system"`,放在它所在的位置)/ `background_task_finished`(`role: "system"`, the text of
236
- * {@link renderBackgroundFinished}, placed like a user_message);`tool_result` 事件还原为紧随其 assistant 消息之后的一条 user 消息
235
+ * (`role: "system"`,放在它所在的位置)/ `tools_changed` (`role: "system"`, the text of {@link toolsChangedText}, at its position) /
236
+ * `background_task_finished`(`role: "system"`, the text of
237
+ * {@link renderBackgroundFinished}, placed like a user_message)/ `subagent_delivery` (likewise,
238
+ * the text of {@link renderSubagentDelivery});`tool_result` 事件还原为紧随其 assistant 消息之后的一条 user 消息
237
239
  * (同一步的多个结果合并,按该 assistant 消息里 tool_call 的顺序;找不到对应调用的结果不进请求)。
238
240
  * 其他事件不进请求。提供 `absorbedUpToSeq` 时,
239
241
  * 尚未被吸收的可吸收事件不进请求,运行中途到达的放在吸收它的调用处(见 BuildModelRequestInput)。
@@ -3,8 +3,10 @@ import { MEDIA_LIMITS, } from "@capybara-hq/plugin-sdk";
3
3
  import { renderBackgroundFinished } from "../../background/render.js";
4
4
  import { isAbsorbable, } from "../../conversations/events.js";
5
5
  import { catalogText, isAlwaysLoaded } from "../../tools/builtins/tool-search.js";
6
+ import { renderSubagentDelivery } from "../subagents/render.js";
6
7
  import { LEGACY_CATALOG_HEADER, LEGACY_SKILL_TEXTS, usesLegacyToolNames } from "./legacy-text.js";
7
8
  import { invokedSkillNames, invokedSkillsText, SKILL_TEXTS, skillsCatalogEvents, snapshotChangeText, snapshotCurrentText, snapshotSystemText, systemSkillsCatalog, } from "./skills.js";
9
+ import { toolsChangedText } from "./tool-changes.js";
8
10
  /**
9
11
  * 平台行为规范(模型可见,英文)。短而通用(spec 6 原则 5);不放时间戳、会话 ID 等会变化的内容,
10
12
  * 保证同一 agent 版本在所有会话中 system 前缀一致、可命中提示词缓存。改动它会让所有缓存失效。
@@ -332,8 +334,10 @@ export function summaryText(summary) {
332
334
  * - messages:最近一条摘要(若有)作为首条 user 消息,其后按 seq 回放 `coversUpToSeq` 之后的
333
335
  * `user_message` / `assistant_message`(content 原样,含 opaque;aborted 的也回放;媒体引用按
334
336
  * {@link resolveMedia} 换成 base64 或文字占位)/ `reminder`
335
- * (`role: "system"`,放在它所在的位置)/ `background_task_finished`(`role: "system"`, the text of
336
- * {@link renderBackgroundFinished}, placed like a user_message);`tool_result` 事件还原为紧随其 assistant 消息之后的一条 user 消息
337
+ * (`role: "system"`,放在它所在的位置)/ `tools_changed` (`role: "system"`, the text of {@link toolsChangedText}, at its position) /
338
+ * `background_task_finished`(`role: "system"`, the text of
339
+ * {@link renderBackgroundFinished}, placed like a user_message)/ `subagent_delivery` (likewise,
340
+ * the text of {@link renderSubagentDelivery});`tool_result` 事件还原为紧随其 assistant 消息之后的一条 user 消息
337
341
  * (同一步的多个结果合并,按该 assistant 消息里 tool_call 的顺序;找不到对应调用的结果不进请求)。
338
342
  * 其他事件不进请求。提供 `absorbedUpToSeq` 时,
339
343
  * 尚未被吸收的可吸收事件不进请求,运行中途到达的放在吸收它的调用处(见 BuildModelRequestInput)。
@@ -381,7 +385,7 @@ export function buildModelRequest(input) {
381
385
  lastCall = absorbedBy(e);
382
386
  }
383
387
  /**
384
- * 第 i 个事件(可吸收事件:user_message / background_task_finished)的放置方式:
388
+ * 第 i 个事件(可吸收事件:user_message / background_task_finished / subagent_delivery)的放置方式:
385
389
  * - `inline`:在吸收它的调用(之后第一个 `absorbedBy ≥ seq` 的 model_call,或本次请求)之前,
386
390
  * 没有「由未吸收它的调用生成的回复」→ 按 seq 原位回放(常规情况,与不提供 absorbedUpToSeq 时一致);
387
391
  * - `deferred`:它之后有非空 assistant_message 是由一次没有吸收它的 model_call 生成的(它在那一步
@@ -467,10 +471,20 @@ export function buildModelRequest(input) {
467
471
  };
468
472
  /** 被某次模型调用跳过(运行中途到达)、尚未被吸收的可吸收事件,按 seq 升序。 */
469
473
  let deferred = [];
470
- /** An absorbable event as a request message: a user turn, or a finished task's system text. */
471
- const absorbableMessage = (e) => e.type === "user_message"
472
- ? { role: "user", content: userBlocks(e) }
473
- : { role: "system", content: renderBackgroundFinished(e.payload) };
474
+ /**
475
+ * An absorbable event as a request message: a user turn, or the system text of a finished task
476
+ * or a sub-agent's delivery.
477
+ */
478
+ const absorbableMessage = (e) => {
479
+ switch (e.type) {
480
+ case "user_message":
481
+ return { role: "user", content: userBlocks(e) };
482
+ case "background_task_finished":
483
+ return { role: "system", content: renderBackgroundFinished(e.payload) };
484
+ case "subagent_delivery":
485
+ return { role: "system", content: renderSubagentDelivery(e.payload) };
486
+ }
487
+ };
474
488
  /**
475
489
  * 把已被吸收(seq ≤ upTo)的延后消息按 seq 顺序放进 messages,插在末尾连续的 system 提醒之前
476
490
  * (若有)。这样某一步自己写在 model_call 之前的提醒(含收尾提醒)仍排在它所跟随的用户消息之后,
@@ -575,6 +589,11 @@ export function buildModelRequest(input) {
575
589
  messages.push({ role: "system", content: e.payload.text });
576
590
  reminderSeqs.push(e.seq);
577
591
  break;
592
+ // the tool set changed since the previous request (tool naming spec §9.1); one covered by
593
+ // the summary is dropped: the request's tool list is current anyway
594
+ case "tools_changed":
595
+ messages.push({ role: "system", content: toolsChangedText(e.payload) });
596
+ break;
578
597
  // hook_denied is not model-visible: the model sees only the denied tool call's tool_result
579
598
  // (and nothing for a denied model request), so request building skips it
580
599
  case "hook_denied":
@@ -8,6 +8,7 @@
8
8
  * run writes a new snapshot announcing the new map, and old snapshots keep their text (phase C
9
9
  * changed the Task / Agent line, sub-agents spec §16.5; the tool-naming change shortened it to the
10
10
  * Claude Code names, spec 2026-10-29 §6; background Bash made TaskOutput and TaskStop available,
11
- * spec 2026-11-05 §4.4; WebFetch and WebSearch joined the same-name list with the web tools).
11
+ * spec 2026-11-05 §4.4; WebFetch and WebSearch joined the same-name list with the web tools;
12
+ * SendMessage joined it when it replaced `Agent` with `resume`, agent map spec §4.2).
12
13
  */
13
14
  export declare const CLAUDE_CODE_TOOL_MAP: string;
@@ -8,17 +8,18 @@
8
8
  * run writes a new snapshot announcing the new map, and old snapshots keep their text (phase C
9
9
  * changed the Task / Agent line, sub-agents spec §16.5; the tool-naming change shortened it to the
10
10
  * Claude Code names, spec 2026-10-29 §6; background Bash made TaskOutput and TaskStop available,
11
- * spec 2026-11-05 §4.4; WebFetch and WebSearch joined the same-name list with the web tools).
11
+ * spec 2026-11-05 §4.4; WebFetch and WebSearch joined the same-name list with the web tools;
12
+ * SendMessage joined it when it replaced `Agent` with `resume`, agent map spec §4.2).
12
13
  */
13
14
  export const CLAUDE_CODE_TOOL_MAP = [
14
15
  "Some skills in this conversation were written for Claude Code. Its tools Bash, Read, Write, Edit,",
15
- "Glob, Grep, Skill, AskUserQuestion, ToolSearch, Agent, WebFetch and WebSearch have the same names here, when they are",
16
+ "Glob, Grep, Skill, AskUserQuestion, ToolSearch, Agent, SendMessage, WebFetch and WebSearch have the same names here, when they are",
16
17
  "in your tools. For the others:",
17
18
  "- MultiEdit -> several Edit calls",
18
19
  "- TodoWrite -> plugin__todo__write when it is in your tools; otherwise keep the task list in your replies",
19
- "- Task -> Agent; SendMessage to a sub-agent -> Agent with resume; model names haiku / sonnet / opus -> fast / standard / capable",
20
+ "- Task -> Agent; model names haiku / sonnet / opus -> fast / standard / capable",
20
21
  "- TaskOutput -> TaskOutput, TaskStop -> TaskStop",
21
22
  "- Any other tool a skill names (for example NotebookEdit, EnterWorktree) -> not available unless one of your tools does the same job",
22
23
  // 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 has copied that skill into the sandbox.",
24
+ "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>@<version-id>/... after Skill has copied that skill into the sandbox.",
24
25
  ].join("\n");
@@ -1,5 +1,7 @@
1
1
  import { renderBackgroundFinished } from "../../background/render.js";
2
+ import { renderSubagentDelivery } from "../subagents/render.js";
2
3
  import { latestSummary } from "./build.js";
4
+ import { toolsChangedText } from "./tool-changes.js";
3
5
  /** 压缩请求的标记:放在 system 中,便于识别(model-fake 据此返回摘要)。 */
4
6
  export const COMPACTION_MARKER = "CAPYBARA_COMPACTION";
5
7
  /** 压缩请求的输出上限。 */
@@ -112,9 +114,16 @@ function transcriptLine(e) {
112
114
  }
113
115
  case "reminder":
114
116
  return `System reminder: ${e.payload.text}`;
117
+ // a tool set change is a system message of the request (build.ts); kept in the transcript so
118
+ // the summary does not carry an earlier "I have no such tool" forward as current
119
+ case "tools_changed":
120
+ return `System reminder: ${toolsChangedText(e.payload)}`;
115
121
  // a finished background task is a system message of the request (build.ts)
116
122
  case "background_task_finished":
117
123
  return `System reminder: ${renderBackgroundFinished(e.payload)}`;
124
+ // a sub-agent's delivery is a system message of the request (build.ts)
125
+ case "subagent_delivery":
126
+ return `System reminder: ${renderSubagentDelivery(e.payload)}`;
118
127
  // phase D: a forked skill's report is user content of the request (build.ts)
119
128
  case "skill_fork_result":
120
129
  return `User: ${e.payload.text}`;
@@ -3,3 +3,5 @@
3
3
  * 调用方先把它写成 `reminder` 事件,再由 `buildModelRequest` 按事件重建进请求。
4
4
  */
5
5
  export declare function turnLimitReminder(step: number, maxSteps: number): string | null;
6
+ /** 所用模型不支持工具(`capabilities.tools` 为 false)时的提醒(模型可见,英文)。 */
7
+ export declare const TOOLS_UNSUPPORTED_REMINDER = "Tools are unavailable for this model. Answer without calling tools.";
@@ -9,3 +9,5 @@ export function turnLimitReminder(step, maxSteps) {
9
9
  return null;
10
10
  return `You are close to the step limit for this turn (step ${step} of ${maxSteps}). Wrap up and give the user your best answer now.`;
11
11
  }
12
+ /** 所用模型不支持工具(`capabilities.tools` 为 false)时的提醒(模型可见,英文)。 */
13
+ export const TOOLS_UNSUPPORTED_REMINDER = "Tools are unavailable for this model. Answer without calling tools.";
@@ -81,11 +81,18 @@ export function sameSnapshot(a, b) {
81
81
  function catalogChanges(prev, next, pinnedIds) {
82
82
  const before = new Map(prev.map((s) => [s.id, s]));
83
83
  const after = new Map(next.map((s) => [s.id, s]));
84
- const added = next.filter((s) => !before.has(s.id));
85
- const removed = prev.filter((s) => !after.has(s.id));
84
+ // A skill renamed under its id (the platform components migration renames a clashing org skill)
85
+ // reads as its old name removed and its new name added: the model calls skills by name.
86
+ const renamed = (s, other) => {
87
+ const o = other.get(s.id);
88
+ return o !== undefined && o.name !== s.name;
89
+ };
90
+ const added = next.filter((s) => !before.has(s.id) || renamed(s, before));
91
+ const removed = prev.filter((s) => !after.has(s.id) || renamed(s, after));
86
92
  const updated = next.filter((s) => {
87
93
  const p = before.get(s.id);
88
94
  return (p !== undefined &&
95
+ p.name === s.name &&
89
96
  !pinnedIds?.has(s.id) &&
90
97
  (p.version !== s.version || p.description !== s.description || p.source !== s.source));
91
98
  });
@@ -0,0 +1,27 @@
1
+ import type { ConversationEvent, EventPayload } from "../../conversations/events.js";
2
+ /**
3
+ * Tool set changes mid-conversation (tool naming spec §9.1). The kernel resolves the tools on every
4
+ * step, so an extension switched on in the org, a connector set up or a sub-agent roster added
5
+ * changes the next request's tool list; earlier answers in the history ("I have no web search")
6
+ * would still contradict it. A step whose resolved set differs from the one the previous request
7
+ * offered logs a `tools_changed` event before its request; request building renders it at its
8
+ * position as a system message ({@link toolsChangedText}).
9
+ */
10
+ export type ToolsChange = Pick<EventPayload<"tools_changed">, "added" | "removed">;
11
+ /**
12
+ * The tool set the conversation's previous model request offered, from the log alone: the last
13
+ * `model_call`'s `tools` and `catalog` keys (with `ToolSearch` the catalog holds the deferred
14
+ * tools, so the union is the whole resolved set), then any `tools_changed` logged after it (a
15
+ * step that logged its change and crashed before its request: the change is not logged twice).
16
+ * Skipped: a `model_call` without recorded tools (older logs) and a call whose tools were left out
17
+ * because its model has no tool support (empty, with that step's unsupported reminder): those say
18
+ * nothing about the resolved set. Null when no request offered a known set yet.
19
+ */
20
+ export declare function previousToolSet(events: readonly ConversationEvent[]): Set<string> | null;
21
+ /**
22
+ * The change from the previous request's tool set to `current` (sorted names), or null: before
23
+ * the conversation's first request (its list is the baseline) and when nothing changed.
24
+ */
25
+ export declare function toolSetChange(events: readonly ConversationEvent[], current: readonly string[]): ToolsChange | null;
26
+ /** The model-visible text of a `tools_changed` event (English). */
27
+ export declare function toolsChangedText(change: ToolsChange): string;
@@ -0,0 +1,60 @@
1
+ import { TOOLS_UNSUPPORTED_REMINDER } from "./reminders.js";
2
+ /**
3
+ * The tool set the conversation's previous model request offered, from the log alone: the last
4
+ * `model_call`'s `tools` and `catalog` keys (with `ToolSearch` the catalog holds the deferred
5
+ * tools, so the union is the whole resolved set), then any `tools_changed` logged after it (a
6
+ * step that logged its change and crashed before its request: the change is not logged twice).
7
+ * Skipped: a `model_call` without recorded tools (older logs) and a call whose tools were left out
8
+ * because its model has no tool support (empty, with that step's unsupported reminder): those say
9
+ * nothing about the resolved set. Null when no request offered a known set yet.
10
+ */
11
+ export function previousToolSet(events) {
12
+ const unsupported = new Set();
13
+ for (const e of events) {
14
+ if (e.type === "reminder" && e.payload.text === TOOLS_UNSUPPORTED_REMINDER) {
15
+ unsupported.add(`${e.runId ?? ""}\u0000${e.payload.step}`);
16
+ }
17
+ }
18
+ let known = null;
19
+ for (const e of events) {
20
+ if (e.type === "model_call") {
21
+ const { tools, catalog } = e.payload.request;
22
+ if (tools === undefined)
23
+ continue;
24
+ const keys = [...tools, ...(catalog ?? [])].map((t) => t.key);
25
+ if (keys.length === 0 && unsupported.has(`${e.runId ?? ""}\u0000${e.payload.step}`))
26
+ continue;
27
+ known = new Set(keys);
28
+ }
29
+ else if (e.type === "tools_changed" && known !== null) {
30
+ for (const k of e.payload.removed)
31
+ known.delete(k);
32
+ for (const k of e.payload.added)
33
+ known.add(k);
34
+ }
35
+ }
36
+ return known;
37
+ }
38
+ /**
39
+ * The change from the previous request's tool set to `current` (sorted names), or null: before
40
+ * the conversation's first request (its list is the baseline) and when nothing changed.
41
+ */
42
+ export function toolSetChange(events, current) {
43
+ const before = previousToolSet(events);
44
+ if (before === null)
45
+ return null;
46
+ const now = new Set(current);
47
+ const added = [...now].filter((k) => !before.has(k)).sort();
48
+ const removed = [...before].filter((k) => !now.has(k)).sort();
49
+ return added.length === 0 && removed.length === 0 ? null : { added, removed };
50
+ }
51
+ /** The model-visible text of a `tools_changed` event (English). */
52
+ export function toolsChangedText(change) {
53
+ const parts = ["Your tools changed."];
54
+ if (change.added.length > 0)
55
+ parts.push(`Now available: ${change.added.join(", ")}.`);
56
+ if (change.removed.length > 0)
57
+ parts.push(`No longer available: ${change.removed.join(", ")}.`);
58
+ parts.push("Use the current tool list; it replaces anything said earlier in this conversation about which tools you have.");
59
+ return parts.join(" ");
60
+ }
@@ -112,6 +112,8 @@ export function hookDeniedAudit(at, payload, denial) {
112
112
  : {}),
113
113
  // M-1: the named plugin is enabled but not loaded on the replica that handled the call
114
114
  ...(denial.notLoaded ? { notLoaded: true } : {}),
115
+ // layering spec A §6: the named plugin's effective config is not valid in the organization
116
+ ...(denial.needsConfig ? { needsConfig: true } : {}),
115
117
  },
116
118
  };
117
119
  }
@@ -32,7 +32,9 @@ export interface LangGraphLoopHooks {
32
32
  * worker 崩溃后由其他副本从最近的 checkpoint 续跑(spec 4.4、Review Focus 1)。
33
33
  *
34
34
  * 图:`prepare → model →(tool_use)tools → prepare …`;prepare 发现步数超过上限 → `wrapUp` → 结束;
35
- * prepare finding the deadline passed, or (a sub-agent's run) its parent's token budget used up → end;
35
+ * prepare finding the deadline passed → end; a sub-agent's run finding its tree's token budget used
36
+ * up → `wrapUp` (one tool-less call that hands back its findings) → end, or end at once when the
37
+ * run has made no step yet (nothing new to report);
36
38
  * 模型中止或正常结束 → 结束。`durability: "sync"`:每个节点的 checkpoint 在下一个节点开始前落库。
37
39
  *
38
40
  * 幂等:`runModelStep` / `runFinalWrapUp` 按 (runId, step) 幂等,续跑重新执行 model 节点时若回复已在日志里,
@@ -1,15 +1,20 @@
1
1
  import { Annotation, END, START, StateGraph } from "@langchain/langgraph";
2
2
  import { MediaCache } from "./media-cache.js";
3
3
  import { runFinalWrapUp, runModelStep, } from "./model-call.js";
4
- import { subagentBudgetUsedUp } from "./subagents/limits.js";
4
+ import { budgetRunOf, subagentBudgetUsedUp } from "./subagents/limits.js";
5
5
  import { isForkInvocation } from "./subagents/skill-fork.js";
6
6
  /**
7
7
  * 图状态:只记录进度,消息每步从事件日志重建(runModelStep 自己读日志),checkpoint 很小。
8
8
  * - `step`:当前(最近一次进入的)步骤编号,prepare 节点 +1;
9
- * - `consumedUpToSeq`:已吸收的最大可吸收事件 seq(user_message / background_task_finished; a
10
- * finish TaskOutput or TaskStop already reported is absorbed like any other, rendered short);
9
+ * - `consumedUpToSeq`:已吸收的最大可吸收事件 seq(user_message / background_task_finished /
10
+ * subagent_delivery; a finish TaskOutput or TaskStop already reported is absorbed like any
11
+ * other, rendered short);
11
12
  * - `lastStopReason`:最近一步模型调用的停止原因;
12
13
  * - `outcome`:图的结束方式(在决定结束的节点里写入,续跑已结束的图时直接读出,不依赖当前时间)。
14
+ * - `budgetWrapUp`: set when a sub-agent's tree used its token budget after the run made a step: the
15
+ * run goes to the `wrapUp` node for one tool-less call that hands back what it found, then ends
16
+ * with `budget` (sub-agents spec §8.3). Null otherwise (the step limit routes there by `step`; a channel cannot share the
17
+ * node's name).
13
18
  *
14
19
  * 所有 channel 都是默认的 LastValue(不用实验性的 DeltaChannel,也没有子图):
15
20
  * 每个 checkpoint 自带完整状态,`pruneToLatest` 之后仍能独立还原(R19)。
@@ -19,8 +24,15 @@ const LoopState = Annotation.Root({
19
24
  consumedUpToSeq: Annotation(),
20
25
  lastStopReason: Annotation(),
21
26
  outcome: Annotation(),
27
+ budgetWrapUp: Annotation(),
22
28
  });
23
- const INITIAL = { step: 0, consumedUpToSeq: 0, lastStopReason: null, outcome: null };
29
+ const INITIAL = {
30
+ step: 0,
31
+ consumedUpToSeq: 0,
32
+ lastStopReason: null,
33
+ outcome: null,
34
+ budgetWrapUp: null,
35
+ };
24
36
  /**
25
37
  * prepare 节点在停机信号下抛出:本次 invoke 以它结束,checkpoint 停在 prepare 之前
26
38
  * (LangGraph 把出错的任务记为该 checkpoint 上的 pending error,`invoke(null)` 续跑时重新执行它)。
@@ -56,7 +68,9 @@ class LoopSuspended extends Error {
56
68
  * worker 崩溃后由其他副本从最近的 checkpoint 续跑(spec 4.4、Review Focus 1)。
57
69
  *
58
70
  * 图:`prepare → model →(tool_use)tools → prepare …`;prepare 发现步数超过上限 → `wrapUp` → 结束;
59
- * prepare finding the deadline passed, or (a sub-agent's run) its parent's token budget used up → end;
71
+ * prepare finding the deadline passed → end; a sub-agent's run finding its tree's token budget used
72
+ * up → `wrapUp` (one tool-less call that hands back its findings) → end, or end at once when the
73
+ * run has made no step yet (nothing new to report);
60
74
  * 模型中止或正常结束 → 结束。`durability: "sync"`:每个节点的 checkpoint 在下一个节点开始前落库。
61
75
  *
62
76
  * 幂等:`runModelStep` / `runFinalWrapUp` 按 (runId, step) 幂等,续跑重新执行 model 节点时若回复已在日志里,
@@ -130,6 +144,7 @@ export class LangGraphLoop {
130
144
  accountId: ctx.triggerAccountId,
131
145
  ...(ctx.conversationKind !== undefined && { conversationKind: ctx.conversationKind }),
132
146
  ...(ctx.parent !== undefined && { parentRunId: ctx.parent.runId, parent: ctx.parent }),
147
+ ...(ctx.subagent === true && { subagent: true }),
133
148
  });
134
149
  const deps = this.stepDeps;
135
150
  const hooks = this.hooks;
@@ -140,11 +155,14 @@ export class LangGraphLoop {
140
155
  // 否则 consumed_seq 越过它们、也不会再起新一轮。
141
156
  if (timedOut())
142
157
  return { outcome: "max_duration" };
143
- // a sub-agent stops before its next request once its parent run's children used their token
144
- // budget (spec §8.3; fresh read, in-flight requests of siblings may overshoot by one each)
158
+ // a sub-agent stops before its next request once its tree used its token budget (spec §8.3,
159
+ // agent map §6: on the budget run; fresh read, in-flight requests of others may overshoot by
160
+ // one each). A run that made a step hands back what it found in one final tool-less call
161
+ // (one more over); a run stopped before its first step (a wake of a stopped tree) has
162
+ // nothing new to report and ends at once.
145
163
  if (ctx.parent !== undefined &&
146
- (await subagentBudgetUsedUp(deps.db, deps.config, ctx.orgId, ctx.parent.runId))) {
147
- return { outcome: "budget" };
164
+ (await subagentBudgetUsedUp(deps.db, deps.config, ctx.orgId, ctx.parent.budgetRunId ?? (await budgetRunOf(deps.db, ctx.parent.runId))))) {
165
+ return s.step > 0 ? { step: s.step + 1, budgetWrapUp: true } : { outcome: "budget" };
148
166
  }
149
167
  let consumed = s.consumedUpToSeq;
150
168
  // the run's first prepare (also when it runs again after a suspend on its fork's sub-agent)
@@ -173,8 +191,10 @@ export class LangGraphLoop {
173
191
  const model = async (s) => {
174
192
  const r = await runModelStep(deps, input(s.step, s.consumedUpToSeq));
175
193
  await hooks.afterModelStep?.(ctx.runId, s.step, r);
194
+ // budget used up by a compaction call before the step's request: hand back in the wrap-up,
195
+ // at this step (it logged no request)
176
196
  if (r.budget)
177
- return { outcome: "budget" };
197
+ return { budgetWrapUp: true };
178
198
  if (r.aborted) {
179
199
  return { lastStopReason: "aborted", outcome: timedOut() ? "max_duration" : "aborted" };
180
200
  }
@@ -218,11 +238,12 @@ export class LangGraphLoop {
218
238
  return {};
219
239
  };
220
240
  const wrapUp = async (s) => {
221
- const r = await runFinalWrapUp(deps, input(s.step, s.consumedUpToSeq));
241
+ const budget = s.budgetWrapUp === true;
242
+ const r = await runFinalWrapUp(deps, input(s.step, s.consumedUpToSeq), budget ? "budget" : "max_steps");
222
243
  await hooks.afterModelStep?.(ctx.runId, s.step, r);
223
244
  return {
224
245
  lastStopReason: r.aborted ? "aborted" : r.stopReason,
225
- outcome: r.budget ? "budget" : r.aborted && !timedOut() ? "aborted" : "max_steps",
246
+ outcome: r.aborted && !timedOut() ? "aborted" : budget || r.budget ? "budget" : "max_steps",
226
247
  };
227
248
  };
228
249
  return new StateGraph(LoopState)
@@ -235,12 +256,9 @@ export class LangGraphLoop {
235
256
  // (aborted / completed: a fork invocation's run ended in its first prepare, phase D)
236
257
  if (s.outcome !== null)
237
258
  return END;
238
- return s.step > ctx.limits.maxSteps ? "wrapUp" : "model";
259
+ return s.budgetWrapUp === true || s.step > ctx.limits.maxSteps ? "wrapUp" : "model";
239
260
  }, ["model", "wrapUp", END])
240
- .addConditionalEdges("model", (s) => (s.outcome === null ? "tools" : END), [
241
- "tools",
242
- END,
243
- ])
261
+ .addConditionalEdges("model", (s) => (s.budgetWrapUp === true ? "wrapUp" : s.outcome === null ? "tools" : END), ["tools", "wrapUp", END])
244
262
  .addEdge("tools", "prepare")
245
263
  .addEdge("wrapUp", END)
246
264
  .compile({ checkpointer: this.saver });