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

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 (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  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 +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  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/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -5,26 +5,29 @@ import { type CatalogSkill } from "../../runtime/context/skills.js";
5
5
  import type { BuiltinCallContext, BuiltinTool } from "../registry.js";
6
6
  import { type SandboxToolDeps } from "./sandbox/common.js";
7
7
  /**
8
- * 内置工具 `Skill`(M5 T14,Ruling M17):按日志里最新一份技能目录快照把名字解析为 id 与版本,返回该版本
9
- * SKILL.md 的正文与文件清单(结果里写明版本)。技能带其他文件时把整个技能复制进本对话沙箱的 `/skills/<name>/`
10
- * (提供方以 root 写,命令用户只读);没有沙箱提供方时只给正文,并说明脚本不可用。
8
+ * Builtin tool `Skill` (M5 T14, ruling M17): resolves the name against the latest skills catalog
9
+ * snapshot in the log to an id and version, and returns that version's SKILL.md body and file list
10
+ * (the result names the version). A skill with other files is copied whole into the conversation's
11
+ * environment at `/skills/<name>@<digest>/` (the provider writes as root, commands read only; the
12
+ * digest is {@link skillDigest} of the version's file manifest, so versions of one skill coexist in
13
+ * the shared file system). Without a sandbox provider only the body is given, with a note that
14
+ * scripts are unavailable.
11
15
  *
12
- * - 存储里读出的每个文件都按清单的 sha256 核对,不符即拒绝(不把被替换的内容给模型或放进沙箱)。
13
- * - 复制记录在内核控制的标记文件(每个技能一个,{@link skillMarkerPath}:`/skills/.capybara/<name>.json`,
14
- * 命令用户改不了):`{ id, version, prefix, files, stale }`。新建 / 重建的沙箱、版本或来源前缀变化、同名换了技能时
15
- * 重新复制,否则跳过。
16
- * - agent 没有任何沙箱工具时不创建沙箱、不复制(模型也跑不了脚本),只给正文并说明。
17
- * - 可执行位:提供方写的文件一律不可执行(0644)。不扩展 `sandbox@1` 的 `writeFile`,而是在结果里告诉模型用解释器
18
- * 运行(`sh` / `python3` / `node`):契约与两个提供方不变,技能包里的 shebang 脚本照样能跑,代价只是不能 `./x`。
19
- * - 旧版本多出的文件:`sandbox@1` 没有删除原语,命令用户也删不了 `/skills` 下的文件,所以新版本原地覆盖,
20
- * 旧版本独有的文件留在原处、记进标记的 `stale`,每次加载都在结果里列出「不属于当前版本、忽略它们」。
16
+ * - Every file read from storage is checked against the manifest's sha256; a mismatch is refused.
17
+ * - The copy is recorded in a kernel-controlled marker, one per skill version
18
+ * ({@link skillMarkerPath}: `/skills/.capybara/<name>@<digest>.json`, commands cannot change it):
19
+ * `{ digest, files }`. A present marker with the same digest skips the copy.
20
+ * - An agent without any sandbox tool creates no sandbox and copies nothing (the model could not
21
+ * run the scripts), and is told so.
22
+ * - Executable bit: files the provider writes are never executable (0644). The result tells the model
23
+ * to run scripts with an interpreter (`sh` / `python3` / `node`).
21
24
  */
22
25
  /**
23
26
  * 已复制进沙箱的技能的标记目录(内核控制:`/skills` 只有提供方以 root 能写;技能名不以 `.` 开头,不会撞名)。
24
27
  */
25
28
  export declare const SKILLS_MARKER_DIR = "/skills/.capybara";
26
- /** 一个技能的标记文件。 */
27
- export declare const skillMarkerPath: (name: string) => string;
29
+ /** The marker file of one skill version. */
30
+ export declare const skillMarkerPath: (name: string, digest: string) => string;
28
31
  /** 依赖:沙箱工具的依赖,加上读技能行用的库与读快照用的日志。 */
29
32
  export interface SkillLoadDeps extends SandboxToolDeps {
30
33
  db: KernelSchemaDb;
@@ -44,6 +47,11 @@ export declare function readSkillFile(store: ObjectStore, key: string, file: Ski
44
47
  * 批准时草稿前缀原样成为版本前缀,版本号变了也能找到),再找本对话发起、仍待批准、前缀相同的技能改动(试用草稿:
45
48
  * 没有 `skill_versions` 行,新技能连 `skills` 行都没有)。绝不按版本号解析——被拒绝的草稿与之后别人批准的同号版本
46
49
  * 内容不同。都没有 → undefined(已移除)。
50
+ *
51
+ * Phase 2 (ruling D2): a `platform:<prefix>` source is a platform skill version: found by its
52
+ * prefix for the platform skill with the entry's id, or the platform skill an org copy with that id
53
+ * links to (ruling B2), while neither is deleted. The returned `object_prefix` keeps the
54
+ * `platform:` form; `skillFileStore` picks the store for it.
47
55
  */
48
56
  export declare function findSkillVersion(db: KernelSchemaDb, ctx: Pick<BuiltinCallContext, "orgId" | "conversationId">, entry: Pick<CatalogSkill, "id" | "source">): Promise<{
49
57
  manifest: SkillManifest;
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { parseSkillMd, renderSkillBody, SKILL_ENTRY_FILE, SKILL_INVOCATION_LIMITS, SKILLS_SANDBOX_ROOT, skillSandboxPath, ToolError, } from "@capybara-hq/plugin-sdk";
2
+ import { parseSkillMd, renderSkillBody, SKILL_ENTRY_FILE, SKILL_INVOCATION_LIMITS, SKILLS_SANDBOX_ROOT, skillDigest, skillSandboxDir, skillSandboxPath, ToolError, } from "@capybara-hq/plugin-sdk";
3
3
  import { sql } from "kysely";
4
4
  import { normalizeStoredDefinition } from "../../agents/definition.js";
5
5
  import { ApiError } from "../../errors.js";
@@ -7,29 +7,33 @@ import { latestInvocation } from "../../runtime/context/skills.js";
7
7
  import { dispatchOfChildRun } from "../../runtime/subagents/child.js";
8
8
  import { resolveSkillForkType } from "../../runtime/subagents/roster.js";
9
9
  import { invocationOf, resolveSkills } from "../../skills/catalog.js";
10
+ import { PLATFORM_SOURCE, skillFileStore } from "../../skills/usable.js";
10
11
  import { AGENT_TOOL, SANDBOX_TOOL_NAMES } from "../builtin-names.js";
11
12
  import { clip, display, inSandbox, sandboxBaseTimeoutMs, withNotices, withPathLease, } from "./sandbox/common.js";
12
13
  /**
13
- * 内置工具 `Skill`(M5 T14,Ruling M17):按日志里最新一份技能目录快照把名字解析为 id 与版本,返回该版本
14
- * SKILL.md 的正文与文件清单(结果里写明版本)。技能带其他文件时把整个技能复制进本对话沙箱的 `/skills/<name>/`
15
- * (提供方以 root 写,命令用户只读);没有沙箱提供方时只给正文,并说明脚本不可用。
14
+ * Builtin tool `Skill` (M5 T14, ruling M17): resolves the name against the latest skills catalog
15
+ * snapshot in the log to an id and version, and returns that version's SKILL.md body and file list
16
+ * (the result names the version). A skill with other files is copied whole into the conversation's
17
+ * environment at `/skills/<name>@<digest>/` (the provider writes as root, commands read only; the
18
+ * digest is {@link skillDigest} of the version's file manifest, so versions of one skill coexist in
19
+ * the shared file system). Without a sandbox provider only the body is given, with a note that
20
+ * scripts are unavailable.
16
21
  *
17
- * - 存储里读出的每个文件都按清单的 sha256 核对,不符即拒绝(不把被替换的内容给模型或放进沙箱)。
18
- * - 复制记录在内核控制的标记文件(每个技能一个,{@link skillMarkerPath}:`/skills/.capybara/<name>.json`,
19
- * 命令用户改不了):`{ id, version, prefix, files, stale }`。新建 / 重建的沙箱、版本或来源前缀变化、同名换了技能时
20
- * 重新复制,否则跳过。
21
- * - agent 没有任何沙箱工具时不创建沙箱、不复制(模型也跑不了脚本),只给正文并说明。
22
- * - 可执行位:提供方写的文件一律不可执行(0644)。不扩展 `sandbox@1` 的 `writeFile`,而是在结果里告诉模型用解释器
23
- * 运行(`sh` / `python3` / `node`):契约与两个提供方不变,技能包里的 shebang 脚本照样能跑,代价只是不能 `./x`。
24
- * - 旧版本多出的文件:`sandbox@1` 没有删除原语,命令用户也删不了 `/skills` 下的文件,所以新版本原地覆盖,
25
- * 旧版本独有的文件留在原处、记进标记的 `stale`,每次加载都在结果里列出「不属于当前版本、忽略它们」。
22
+ * - Every file read from storage is checked against the manifest's sha256; a mismatch is refused.
23
+ * - The copy is recorded in a kernel-controlled marker, one per skill version
24
+ * ({@link skillMarkerPath}: `/skills/.capybara/<name>@<digest>.json`, commands cannot change it):
25
+ * `{ digest, files }`. A present marker with the same digest skips the copy.
26
+ * - An agent without any sandbox tool creates no sandbox and copies nothing (the model could not
27
+ * run the scripts), and is told so.
28
+ * - Executable bit: files the provider writes are never executable (0644). The result tells the model
29
+ * to run scripts with an interpreter (`sh` / `python3` / `node`).
26
30
  */
27
31
  /**
28
32
  * 已复制进沙箱的技能的标记目录(内核控制:`/skills` 只有提供方以 root 能写;技能名不以 `.` 开头,不会撞名)。
29
33
  */
30
34
  export const SKILLS_MARKER_DIR = `${SKILLS_SANDBOX_ROOT}/.capybara`;
31
- /** 一个技能的标记文件。 */
32
- export const skillMarkerPath = (name) => `${SKILLS_MARKER_DIR}/${name}.json`;
35
+ /** The marker file of one skill version. */
36
+ export const skillMarkerPath = (name, digest) => `${SKILLS_MARKER_DIR}/${name}@${digest}.json`;
33
37
  const MARKER_MAX_BYTES = 256 * 1024;
34
38
  /** 结果里最多列出的文件数(其余只给数量)。 */
35
39
  const MAX_LISTED_FILES = 200;
@@ -42,9 +46,8 @@ const SPEC = {
42
46
  description: "Load a skill from the skills list: returns the skill's instructions " +
43
47
  "(its SKILL.md) and the list of its files. Call it before starting a task that matches a " +
44
48
  "skill's description, then follow the returned instructions. If the skill has scripts or other " +
45
- "files, they are copied read-only to /skills/<name>/ in this conversation's sandbox; run scripts " +
46
- "there with an interpreter (sh, python3, node). Call it again when the skills list changes or " +
47
- "the sandbox was recreated. Pass args when the task gives the skill arguments (they replace " +
49
+ "files, they are copied read-only to /skills/<name>@<version-id>/ in this environment; run scripts " +
50
+ "there with an interpreter (sh, python3, node). Call it again when the skills list changes. Pass args when the task gives the skill arguments (they replace " +
48
51
  "$ARGUMENTS and $1, $2… in the instructions). Do not use it for skills that are not in the list.",
49
52
  inputSchema: {
50
53
  type: "object",
@@ -79,22 +82,20 @@ const removedText = (name) => `Skill "${name}" was removed after the skills list
79
82
  const forkAvailableText = (type) => `This skill is written to run in a sub-agent: call Agent with subagent_type "${type}" and a prompt containing these instructions and the details of the task, then use its report; do not follow the instructions yourself.`;
80
83
  const FORK_UNAVAILABLE_TEXT = "This skill is written to run in a sub-agent, which is not available here; follow the instructions yourself.";
81
84
  const integrityText = (name) => `Skill "${name}" failed an integrity check (its stored files do not match the uploaded package); ask an administrator to upload the skill again.`;
82
- const strings = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
83
- /** 解析一个技能的标记文件;坏的按没有处理(重新复制)。 */
85
+ /** Parses a version's marker; a broken one counts as missing (the version is copied again). */
84
86
  function parseMarker(data) {
85
87
  try {
86
88
  const r = JSON.parse(new TextDecoder().decode(data));
87
89
  if (r === null || typeof r !== "object" || Array.isArray(r))
88
90
  return undefined;
89
91
  const e = r;
90
- if (typeof e.id !== "string" || typeof e.version !== "number")
92
+ if (typeof e.digest !== "string")
91
93
  return undefined;
92
94
  return {
93
- id: e.id,
94
- version: e.version,
95
- ...(typeof e.prefix === "string" && { prefix: e.prefix }),
96
- files: strings(e.files),
97
- stale: strings(e.stale),
95
+ digest: e.digest,
96
+ files: Array.isArray(e.files)
97
+ ? e.files.filter((x) => typeof x === "string")
98
+ : [],
98
99
  };
99
100
  }
100
101
  catch {
@@ -156,34 +157,25 @@ async function readVerified(store, key, file, skill, signal) {
156
157
  }
157
158
  }
158
159
  /**
159
- * 把技能整个复制到 `/skills/<name>/`(标记命中则跳过)。每个文件按清单核对后写入,全部写完才更新标记:
160
- * 中途失败下次整体重来。返回旧版本留下的文件。
160
+ * Copies the skill version whole to `/skills/<name>@<digest>/` (skipped when its marker matches).
161
+ * Every file is checked against the manifest before it is written; the marker is written last, so
162
+ * a failure midway means the next call starts over.
161
163
  */
162
164
  async function copySkill(s, v) {
163
- const { name, id, version } = v.entry;
164
- const markerPath = skillMarkerPath(name);
165
- let cur;
166
- if (!s.reset) {
167
- const m = await s.p.readFile(s.h, markerPath, { maxBytes: MARKER_MAX_BYTES, signal: s.signal });
168
- if (m && !m.truncated)
169
- cur = parseMarker(m.data);
170
- }
171
- if (cur && cur.id === id && cur.version === version && cur.prefix === v.prefix) {
172
- return { stale: cur.stale };
173
- }
165
+ const { name } = v.entry;
166
+ const markerPath = skillMarkerPath(name, v.digest);
167
+ const m = await s.p.readFile(s.h, markerPath, { maxBytes: MARKER_MAX_BYTES, signal: s.signal });
168
+ const cur = m && !m.truncated ? parseMarker(m.data) : undefined;
169
+ if (cur?.digest === v.digest)
170
+ return;
174
171
  for (const f of v.manifest.files) {
175
172
  const data = f.path === SKILL_ENTRY_FILE
176
173
  ? v.entryBytes
177
- : await readVerified(v.store, `${v.prefix}${f.path}`, f, name, s.signal);
178
- await s.p.writeFile(s.h, skillSandboxPath(name, f.path), data, s.signal);
174
+ : await readVerified(v.store, `${v.keyPrefix}${f.path}`, f, name, s.signal);
175
+ await s.p.writeFile(s.h, skillSandboxPath(name, v.digest, f.path), data, s.signal);
179
176
  }
180
- const files = v.manifest.files.map((f) => f.path);
181
- const now = new Set(files);
182
- const stale = cur ? [...new Set([...cur.stale, ...cur.files])].filter((p) => !now.has(p)) : [];
183
- stale.sort();
184
- const entry = { id, version, prefix: v.prefix, files, stale };
177
+ const entry = { digest: v.digest, files: v.manifest.files.map((f) => f.path) };
185
178
  await s.p.writeFile(s.h, markerPath, new TextEncoder().encode(JSON.stringify(entry)), s.signal);
186
- return { stale };
187
179
  }
188
180
  /** 本步可用的工具里是否有沙箱工具(没有时模型用不了复制进去的文件)。 */
189
181
  const hasSandboxTools = (ctx) => (ctx.tools ?? []).some((t) => t.source.kind === "builtin" &&
@@ -200,8 +192,15 @@ function fileList(files) {
200
192
  * 批准时草稿前缀原样成为版本前缀,版本号变了也能找到),再找本对话发起、仍待批准、前缀相同的技能改动(试用草稿:
201
193
  * 没有 `skill_versions` 行,新技能连 `skills` 行都没有)。绝不按版本号解析——被拒绝的草稿与之后别人批准的同号版本
202
194
  * 内容不同。都没有 → undefined(已移除)。
195
+ *
196
+ * Phase 2 (ruling D2): a `platform:<prefix>` source is a platform skill version: found by its
197
+ * prefix for the platform skill with the entry's id, or the platform skill an org copy with that id
198
+ * links to (ruling B2), while neither is deleted. The returned `object_prefix` keeps the
199
+ * `platform:` form; `skillFileStore` picks the store for it.
203
200
  */
204
201
  export async function findSkillVersion(db, ctx, entry) {
202
+ if (entry.source.startsWith(PLATFORM_SOURCE))
203
+ return findPlatformVersion(db, ctx.orgId, entry);
205
204
  const row = await db
206
205
  .selectFrom("skills")
207
206
  .innerJoin("skill_versions", "skill_versions.skill_id", "skills.id")
@@ -225,6 +224,29 @@ export async function findSkillVersion(db, ctx, entry) {
225
224
  return undefined;
226
225
  return { manifest: draft.proposed_version.manifest, object_prefix: draft.object_prefix };
227
226
  }
227
+ /** {@link findSkillVersion} for a `platform:<prefix>` source. */
228
+ async function findPlatformVersion(db, orgId, entry) {
229
+ const row = await db
230
+ .selectFrom("platform_skill_versions as v")
231
+ .innerJoin("platform_skills as p", "p.id", "v.skill_id")
232
+ .select(["v.manifest"])
233
+ .where("v.object_prefix", "=", entry.source.slice(PLATFORM_SOURCE.length))
234
+ .where("p.deleted_at", "is", null)
235
+ // a platform skill disabled on the deployment is not loaded, even from an older snapshot
236
+ .where("p.disabled", "=", false)
237
+ .where((eb) => eb.or([
238
+ eb("p.id", "=", entry.id),
239
+ eb("p.id", "in", eb
240
+ .selectFrom("skills")
241
+ .select("platform_skill_id")
242
+ .where("id", "=", entry.id)
243
+ .where("org_id", "=", orgId)
244
+ .where("deleted_at", "is", null)
245
+ .where("platform_skill_id", "is not", null)),
246
+ ]))
247
+ .executeTakeFirst();
248
+ return row && { manifest: row.manifest, object_prefix: entry.source };
249
+ }
228
250
  /** A Claude Code style qualified name `<plugin>:<skill>` (phase B, spec §9.3). */
229
251
  const QUALIFIED_NAME_RE = /^([a-z0-9][a-z0-9-]{0,63}):(.+)$/;
230
252
  /**
@@ -385,13 +407,23 @@ export function skillLoadTool(deps) {
385
407
  if (!row)
386
408
  throw new ToolError(removedText(name));
387
409
  const manifest = row.manifest;
388
- const store = deps.storage.kernel(ctx.orgId);
410
+ // the marker records the source (`platform:` included); keys use the store's own prefix
389
411
  const prefix = row.object_prefix;
412
+ const { store, prefix: keyPrefix } = skillFileStore(deps.storage, ctx.orgId, prefix);
390
413
  const md = manifest.files.find((f) => f.path === SKILL_ENTRY_FILE);
391
414
  if (!md)
392
415
  throw new ToolError(integrityText(name));
393
- const mdBytes = await readVerified(store, `${prefix}${md.path}`, md, name, ctx.signal);
394
- const v = { entry, manifest, prefix, store, entryBytes: mdBytes };
416
+ const mdBytes = await readVerified(store, `${keyPrefix}${md.path}`, md, name, ctx.signal);
417
+ const digest = skillDigest(manifest.files);
418
+ const v = {
419
+ entry,
420
+ manifest,
421
+ digest,
422
+ prefix,
423
+ keyPrefix,
424
+ store,
425
+ entryBytes: mdBytes,
426
+ };
395
427
  let parsed;
396
428
  try {
397
429
  parsed = parseSkillMd(new TextDecoder("utf-8", { fatal: true }).decode(mdBytes), {
@@ -403,7 +435,7 @@ export function skillLoadTool(deps) {
403
435
  }
404
436
  if ("errors" in parsed)
405
437
  throw new ToolError(integrityText(name));
406
- const dir = `${SKILLS_SANDBOX_ROOT}/${name}/`;
438
+ const dir = `${skillSandboxDir(name, digest)}/`;
407
439
  const others = manifest.files.filter((f) => f.path !== SKILL_ENTRY_FILE);
408
440
  let notices = [];
409
441
  let filesText;
@@ -425,22 +457,19 @@ export function skillLoadTool(deps) {
425
457
  }
426
458
  else {
427
459
  // the skill's marker is read, compared and written: one holder at a time per skill
428
- const r = await inSandbox(deps, ctx, (s) => withPathLease(deps, ctx, skillMarkerPath(v.entry.name), s.signal, (signal) => copySkill({ ...s, signal }, v)));
460
+ const r = await inSandbox(deps, ctx, (s) => withPathLease(deps, s, skillMarkerPath(name, digest), s.signal, (signal) => copySkill({ ...s, signal }, v)));
429
461
  notices = r.notices;
430
- const stale = r.value.stale.length > 0
431
- ? `\nFiles left over from an earlier version (not part of this version; ignore them): ${r.value.stale.join(", ")}`
432
- : "";
433
462
  filesText =
434
463
  `Skill files (copied to ${dir} in the sandbox, read-only):\n${fileList(manifest.files)}\n` +
435
464
  `Run scripts with an interpreter, e.g. \`sh ${dir}<script>.sh\`, \`python3 ${dir}<script>.py\` ` +
436
465
  "or `node`; the files are not executable, so `./script` does not work. Write outputs under " +
437
- `/workspace, not ${SKILLS_SANDBOX_ROOT}.${stale}`;
466
+ `/workspace, not ${SKILLS_SANDBOX_ROOT}.`;
438
467
  }
439
468
  const invocation = invocationOf(manifest);
440
469
  const fork = invocation.fork;
441
470
  let instructions;
442
471
  try {
443
- instructions = renderSkillBody(parsed.body.trim(), invocation, args ?? "", name);
472
+ instructions = renderSkillBody(parsed.body.trim(), invocation, args ?? "", name, digest);
444
473
  }
445
474
  catch (e) {
446
475
  if (!(e instanceof RangeError))
@@ -29,7 +29,7 @@ const SPEC = {
29
29
  "user-invocable, context, agent, argument-hint and arguments, which are kept; with " +
30
30
  "disable-model-invocation: true only a person can invoke the skill and you cannot load it). " +
31
31
  "Every other entry in `files` is stored at " +
32
- "/skills/<name>/<path>. Files of the previous version that you leave out are not part of the new " +
32
+ "/skills/<name>@<version-id>/<path> once loaded. Files of the previous version that you leave out are not part of the new " +
33
33
  "version. Text files only, at most 1 MB per skill in total. Use an existing skill's name to update " +
34
34
  "it; an organization skill with the same name is shadowed by this agent's own skill. On a private " +
35
35
  "agent the new version takes effect immediately. On a shared agent the change is sent to the " +
@@ -209,7 +209,11 @@ async function logUsage(deps, ctx, runId, step, u) {
209
209
  callId: ctx.callId,
210
210
  },
211
211
  };
212
- const written = await appendCounted(deps, { conversationId: ctx.conversationId, parentRunId: ctx.parentRunId }, [event]);
212
+ const written = await appendCounted(deps, {
213
+ conversationId: ctx.conversationId,
214
+ parentRunId: ctx.parentRunId,
215
+ budgetRunId: ctx.budgetRunId,
216
+ }, [event]);
213
217
  const usage = written.find((e) => e.type === "usage");
214
218
  if (usage)
215
219
  void deps.usageReport?.enqueue(ctx.conversationId, usage.seq);
@@ -105,6 +105,7 @@ export async function fetchPage(deps, ctx, url) {
105
105
  fetched = await resolved.impl.fetch({
106
106
  url,
107
107
  orgConfig: resolved.orgConfig,
108
+ config: resolved.config,
108
109
  signal: ctx.signal,
109
110
  });
110
111
  }
@@ -185,6 +185,7 @@ export function webSearchTool(deps) {
185
185
  ...(blocked !== undefined && blocked.length > 0 && { blockedDomains: blocked }),
186
186
  maxResults: max,
187
187
  orgConfig: resolved.orgConfig,
188
+ config: resolved.config,
188
189
  signal: ctx.signal,
189
190
  });
190
191
  results = Array.isArray(out?.results) ? out.results : [];
@@ -174,6 +174,16 @@ export declare class ConnectorsController {
174
174
  list(org: OrgContext): Promise<{
175
175
  connectors: ConnectorSummary[];
176
176
  }>;
177
+ /**
178
+ * The connector kinds the org can create connectors of, each with the plugin providing it (the
179
+ * install wizard offers only these; an empty list means no connector extension is enabled).
180
+ */
181
+ kinds(org: OrgContext): Promise<{
182
+ kinds: {
183
+ kind: string;
184
+ plugin: string;
185
+ }[];
186
+ }>;
177
187
  create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateBody>): Promise<{
178
188
  connector: ConnectorDetail;
179
189
  issues: ToolIssue[];
@@ -99,6 +99,13 @@ let ConnectorsController = class ConnectorsController {
99
99
  async list(org) {
100
100
  return { connectors: (await this.connectors.list(org.orgId)).map((a) => forViewer(org, a)) };
101
101
  }
102
+ /**
103
+ * The connector kinds the org can create connectors of, each with the plugin providing it (the
104
+ * install wizard offers only these; an empty list means no connector extension is enabled).
105
+ */
106
+ async kinds(org) {
107
+ return { kinds: await this.connectors.kinds(org.orgId) };
108
+ }
102
109
  async create(principal, org, body) {
103
110
  const p = requireUser(principal);
104
111
  return this.connectors.create(org.orgId, p.account.id, body, patTokenId(p));
@@ -156,6 +163,11 @@ __decorate([
156
163
  OrgAction("connectors.use"),
157
164
  __param(0, CurrentOrg())
158
165
  ], ConnectorsController.prototype, "list", null);
166
+ __decorate([
167
+ Get("kinds"),
168
+ OrgAction("connectors.manage"),
169
+ __param(0, CurrentOrg())
170
+ ], ConnectorsController.prototype, "kinds", null);
159
171
  __decorate([
160
172
  Post(),
161
173
  OrgAction("connectors.manage"),
@@ -15,6 +15,8 @@ type ToolSource = "connector" | "resources";
15
15
  export interface ConnectorToolView {
16
16
  name: string;
17
17
  key: string;
18
+ /** The reviewed definition's display-only title (`ToolSpec.title`), or null. */
19
+ title: string | null;
18
20
  description: string;
19
21
  inputSchema: Record<string, unknown>;
20
22
  annotations: ToolAnnotations | null;
@@ -59,6 +61,11 @@ export interface ConnectorSummary {
59
61
  endpoint: unknown;
60
62
  auth: ConnectorAuth;
61
63
  status: "active" | "disabled";
64
+ /**
65
+ * The platform connector template it was made from (`connectors.platform_template_id`), null for
66
+ * a custom one: the web offers it for a pending connector of that template (ruling P4-7).
67
+ */
68
+ platformTemplateId: string | null;
62
69
  createdBy: string;
63
70
  createdAt: Date;
64
71
  updatedAt: Date;
@@ -79,7 +86,7 @@ export interface CreateConnectorInput {
79
86
  auth: ConnectorAuth;
80
87
  credential?: unknown;
81
88
  /**
82
- * Install from an enterprise catalog connector template (T26, filled in by the catalog service,
89
+ * Install from a platform catalog connector template (T26, filled in by the catalog service,
83
90
  * not accepted over HTTP): the connector records its source item and version, the item policy is
84
91
  * re-checked in the transaction (a template inside an app passes the app item); once the tool
85
92
  * snapshot exists, `defaultToolPolicies` set the default policies (`policy_source 'template'`).
@@ -87,6 +94,17 @@ export interface CreateConnectorInput {
87
94
  * (`catalog.custom_disabled`).
88
95
  */
89
96
  template?: ConnectorTemplateRef | undefined;
97
+ /**
98
+ * The name and slug are chosen under the org lock (one more connector from a template, ruling
99
+ * P4-T6-10; not accepted over HTTP; `slug` must be absent): the first free of `name` (else
100
+ * `display`) with its derived slug, then `<display> 2` with `_2`, `3` with `_3`, … (a given
101
+ * `name` is kept, only its slug suffixed), among the org's live connectors and the installed
102
+ * plugins' names. Chosen after the outbound calls, so a race never repeats them.
103
+ */
104
+ slugDefault?: {
105
+ display: string;
106
+ name?: string | undefined;
107
+ } | undefined;
90
108
  }
91
109
  /** 连接器来自哪个目录条目的哪个模板。 */
92
110
  export interface ConnectorTemplateRef {
@@ -97,10 +115,16 @@ export interface ConnectorTemplateRef {
97
115
  defaultToolPolicies?: Record<string, ToolPolicy> | undefined;
98
116
  /** The item whose policy approves this install (a dependency's template: the installed plugin). */
99
117
  approvedBy?: string | undefined;
118
+ /**
119
+ * One more connector from a platform connector template (ruling P4-T6-8): the template must be
120
+ * on in the org, re-checked under the org lock (`component.off` / `component.not_found`).
121
+ */
122
+ mustBeOn?: boolean | undefined;
100
123
  }
101
124
  /**
102
- * A connector updated to another version of its catalog template (an org plugin upgrade, package
103
- * ecosystem spec §10): only template-owned fields change (endpoint preset, auth preset, default tool
125
+ * A connector updated to another version of its catalog template (the platform plugin update fans
126
+ * a changed template out to every connector with its `platform_template_id`, ruling E2): only
127
+ * template-owned fields change (endpoint preset, auth preset, default tool
104
128
  * policies still at the template default); the name, slug, status, tools and credentials stay,
105
129
  * unless `resetCredentials`.
106
130
  */
@@ -199,6 +223,11 @@ export declare class ConnectorsService {
199
223
  */
200
224
  private parseEndpoint;
201
225
  private slugTaken;
226
+ /**
227
+ * The first free default name and slug ({@link CreateConnectorInput.slugDefault}), read in the
228
+ * caller's transaction under the org lock.
229
+ */
230
+ private freeName;
202
231
  private resolveSlug;
203
232
  /**
204
233
  * OAuth 连接器安装前的准备(A16):授权码流按 `discovery` 取端点(MCP 发现或手填)、按 `client` 动态注册或用请求里
@@ -231,7 +260,7 @@ export declare class ConnectorsService {
231
260
  /** The org-locked, re-checked insert of {@link create} (the outbound checks ran before). */
232
261
  private createIn;
233
262
  /**
234
- * Checks a template update before anything is written (an org plugin upgrade): the endpoint
263
+ * Checks a template update before anything is written (the platform plugin update): the endpoint
235
264
  * against the connector's schema, and with `resetCredentials` the new credential's shape, or for
236
265
  * OAuth the client setup (discovery, dynamic registration or the client credentials token; an
237
266
  * outbound failure -> 502 `connector.connect_failed`). Writes nothing.
@@ -247,6 +276,16 @@ export declare class ConnectorsService {
247
276
  * Audits `connector.template_applied`. Deleted / missing -> `connector.not_found`.
248
277
  */
249
278
  applyTemplateIn(orgId: string, connectorId: string, actorAccountId: string, p: PreparedTemplateUpdate, actorTokenId?: string): Promise<void>;
279
+ /** Refuses a loaded kind whose extension is not enabled in the org (the same notion as {@link kinds}). */
280
+ private assertKindAvailable;
281
+ /**
282
+ * The connector kinds the org can create connectors of (the install wizard's protocol step): a
283
+ * kind is listed when its `connector@1` extension is loaded and enabled in the org.
284
+ */
285
+ kinds(orgId: string): Promise<{
286
+ kind: string;
287
+ plugin: string;
288
+ }[]>;
250
289
  /**
251
290
  * Previews a connector (Ruling A20, for the install wizard): after checking the connector, the
252
291
  * endpoint (credential pattern check included) and the credential shape, reads the endpoint
@@ -275,7 +314,9 @@ export declare class ConnectorsService {
275
314
  * 在调用方事务里软删除连接器(调用方已锁组织行并按需复核角色;应用安装的回滚与卸载用):删全部凭据与授权,
276
315
  * 审计 `connector.deleted`(`reason` 并进 detail)。已删除 / 不存在 → `connector.not_found`。
277
316
  */
278
- removeIn(orgId: string, connectorId: string, actorAccountId: string, actorTokenId?: string, reason?: string): Promise<void>;
317
+ removeIn(orgId: string, connectorId: string,
318
+ /** null: the kernel itself (the plugin scope sync uninstalling a plugin). */
319
+ actorAccountId: string | null, actorTokenId?: string, reason?: string): Promise<void>;
279
320
  /**
280
321
  * 重新 listTools 并按漂移检测的规则比对写入(见 drift.ts):新增 / 定义变化的工具待复核(旧定义保留供对比),
281
322
  * 消失的工具停用;连接器从未拍过快照时首个快照直接启用。