@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.1

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 (637) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +26 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1126 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +237 -0
  112. package/dist/config/schema.js +1192 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +423 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +151 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +211 -0
  166. package/dist/errors.js +213 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +790 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +176 -0
  210. package/dist/extensions/bootstrap.js +535 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +220 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +69 -0
  318. package/dist/index.js +67 -0
  319. package/dist/kernel.d.ts +259 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log-config.d.ts +9 -0
  322. package/dist/log-config.js +27 -0
  323. package/dist/log-context.d.ts +32 -0
  324. package/dist/log-context.js +40 -0
  325. package/dist/log-loki.d.ts +34 -0
  326. package/dist/log-loki.js +145 -0
  327. package/dist/log.d.ts +79 -0
  328. package/dist/log.js +303 -0
  329. package/dist/models/prices.d.ts +53 -0
  330. package/dist/models/prices.js +121 -0
  331. package/dist/models/purposes.controller.d.ts +19 -0
  332. package/dist/models/purposes.controller.js +56 -0
  333. package/dist/models/purposes.d.ts +140 -0
  334. package/dist/models/purposes.js +267 -0
  335. package/dist/net/proxy.d.ts +44 -0
  336. package/dist/net/proxy.js +162 -0
  337. package/dist/net/public-address.d.ts +60 -0
  338. package/dist/net/public-address.js +272 -0
  339. package/dist/net/safe-fetch.d.ts +38 -0
  340. package/dist/net/safe-fetch.js +140 -0
  341. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  342. package/dist/orgs/directory-sync.controller.js +40 -0
  343. package/dist/orgs/directory-sync.d.ts +166 -0
  344. package/dist/orgs/directory-sync.js +558 -0
  345. package/dist/orgs/invitations.controller.d.ts +58 -0
  346. package/dist/orgs/invitations.controller.js +137 -0
  347. package/dist/orgs/invitations.service.d.ts +80 -0
  348. package/dist/orgs/invitations.service.js +217 -0
  349. package/dist/orgs/members.service.d.ts +63 -0
  350. package/dist/orgs/members.service.js +234 -0
  351. package/dist/orgs/offboarding.d.ts +141 -0
  352. package/dist/orgs/offboarding.js +398 -0
  353. package/dist/orgs/org-lock.d.ts +32 -0
  354. package/dist/orgs/org-lock.js +46 -0
  355. package/dist/orgs/org.guard.d.ts +35 -0
  356. package/dist/orgs/org.guard.js +95 -0
  357. package/dist/orgs/orgs.controller.d.ts +78 -0
  358. package/dist/orgs/orgs.controller.js +192 -0
  359. package/dist/orgs/orgs.service.d.ts +61 -0
  360. package/dist/orgs/orgs.service.js +209 -0
  361. package/dist/orgs/roles.d.ts +13 -0
  362. package/dist/orgs/roles.js +58 -0
  363. package/dist/orgs/settings.controller.d.ts +20 -0
  364. package/dist/orgs/settings.controller.js +53 -0
  365. package/dist/orgs/settings.service.d.ts +120 -0
  366. package/dist/orgs/settings.service.js +178 -0
  367. package/dist/packages/npm.d.ts +50 -0
  368. package/dist/packages/npm.js +218 -0
  369. package/dist/packages/provenance.d.ts +47 -0
  370. package/dist/packages/provenance.js +147 -0
  371. package/dist/packages/tgz.d.ts +76 -0
  372. package/dist/packages/tgz.js +225 -0
  373. package/dist/runtime/abort.d.ts +32 -0
  374. package/dist/runtime/abort.js +71 -0
  375. package/dist/runtime/checkpointer.d.ts +32 -0
  376. package/dist/runtime/checkpointer.js +243 -0
  377. package/dist/runtime/context/build.d.ts +254 -0
  378. package/dist/runtime/context/build.js +693 -0
  379. package/dist/runtime/context/claude-tools.d.ts +11 -0
  380. package/dist/runtime/context/claude-tools.js +24 -0
  381. package/dist/runtime/context/compaction.d.ts +26 -0
  382. package/dist/runtime/context/compaction.js +195 -0
  383. package/dist/runtime/context/pairing.d.ts +11 -0
  384. package/dist/runtime/context/pairing.js +82 -0
  385. package/dist/runtime/context/reminders.d.ts +5 -0
  386. package/dist/runtime/context/reminders.js +11 -0
  387. package/dist/runtime/context/skills.d.ts +105 -0
  388. package/dist/runtime/context/skills.js +283 -0
  389. package/dist/runtime/context/tokens.d.ts +19 -0
  390. package/dist/runtime/context/tokens.js +104 -0
  391. package/dist/runtime/conversation-lock.d.ts +40 -0
  392. package/dist/runtime/conversation-lock.js +97 -0
  393. package/dist/runtime/hook-calls.d.ts +84 -0
  394. package/dist/runtime/hook-calls.js +136 -0
  395. package/dist/runtime/langgraph-loop.d.ts +52 -0
  396. package/dist/runtime/langgraph-loop.js +247 -0
  397. package/dist/runtime/loop.d.ts +93 -0
  398. package/dist/runtime/loop.js +7 -0
  399. package/dist/runtime/maintenance.d.ts +80 -0
  400. package/dist/runtime/maintenance.js +148 -0
  401. package/dist/runtime/media-cache.d.ts +21 -0
  402. package/dist/runtime/media-cache.js +51 -0
  403. package/dist/runtime/model-call.d.ts +176 -0
  404. package/dist/runtime/model-call.js +1049 -0
  405. package/dist/runtime/providers.d.ts +86 -0
  406. package/dist/runtime/providers.js +224 -0
  407. package/dist/runtime/quota.d.ts +29 -0
  408. package/dist/runtime/quota.js +70 -0
  409. package/dist/runtime/run-finish.d.ts +45 -0
  410. package/dist/runtime/run-finish.js +69 -0
  411. package/dist/runtime/run-queue.d.ts +121 -0
  412. package/dist/runtime/run-queue.js +493 -0
  413. package/dist/runtime/run-worker.d.ts +138 -0
  414. package/dist/runtime/run-worker.js +806 -0
  415. package/dist/runtime/stream.controller.d.ts +34 -0
  416. package/dist/runtime/stream.controller.js +122 -0
  417. package/dist/runtime/stream.d.ts +63 -0
  418. package/dist/runtime/stream.js +262 -0
  419. package/dist/runtime/subagents/child.d.ts +80 -0
  420. package/dist/runtime/subagents/child.js +225 -0
  421. package/dist/runtime/subagents/definition.d.ts +103 -0
  422. package/dist/runtime/subagents/definition.js +392 -0
  423. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  424. package/dist/runtime/subagents/dispatch.js +502 -0
  425. package/dist/runtime/subagents/limits.d.ts +23 -0
  426. package/dist/runtime/subagents/limits.js +34 -0
  427. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  428. package/dist/runtime/subagents/org-agents.js +70 -0
  429. package/dist/runtime/subagents/preamble.d.ts +7 -0
  430. package/dist/runtime/subagents/preamble.js +11 -0
  431. package/dist/runtime/subagents/progress.d.ts +26 -0
  432. package/dist/runtime/subagents/progress.js +36 -0
  433. package/dist/runtime/subagents/roster.d.ts +55 -0
  434. package/dist/runtime/subagents/roster.js +111 -0
  435. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  436. package/dist/runtime/subagents/skill-fork.js +259 -0
  437. package/dist/runtime/usage-report.d.ts +163 -0
  438. package/dist/runtime/usage-report.js +551 -0
  439. package/dist/runtime/waits.d.ts +233 -0
  440. package/dist/runtime/waits.js +883 -0
  441. package/dist/sandbox/leases.d.ts +169 -0
  442. package/dist/sandbox/leases.js +515 -0
  443. package/dist/sandbox/lifecycle.d.ts +21 -0
  444. package/dist/sandbox/lifecycle.js +68 -0
  445. package/dist/sandbox/sandbox.service.d.ts +249 -0
  446. package/dist/sandbox/sandbox.service.js +908 -0
  447. package/dist/skills/catalog.d.ts +149 -0
  448. package/dist/skills/catalog.js +405 -0
  449. package/dist/skills/changes.controller.d.ts +56 -0
  450. package/dist/skills/changes.controller.js +136 -0
  451. package/dist/skills/changes.service.d.ts +175 -0
  452. package/dist/skills/changes.service.js +805 -0
  453. package/dist/skills/invocable.controller.d.ts +23 -0
  454. package/dist/skills/invocable.controller.js +50 -0
  455. package/dist/skills/invocation-keys.d.ts +23 -0
  456. package/dist/skills/invocation-keys.js +44 -0
  457. package/dist/skills/invoke.d.ts +135 -0
  458. package/dist/skills/invoke.js +286 -0
  459. package/dist/skills/package.d.ts +87 -0
  460. package/dist/skills/package.js +227 -0
  461. package/dist/skills/skills.controller.d.ts +40 -0
  462. package/dist/skills/skills.controller.js +110 -0
  463. package/dist/skills/skills.service.d.ts +192 -0
  464. package/dist/skills/skills.service.js +567 -0
  465. package/dist/storage/prefix.d.ts +36 -0
  466. package/dist/storage/prefix.js +104 -0
  467. package/dist/storage/purge.d.ts +27 -0
  468. package/dist/storage/purge.js +75 -0
  469. package/dist/storage/storage.service.d.ts +44 -0
  470. package/dist/storage/storage.service.js +145 -0
  471. package/dist/text.d.ts +13 -0
  472. package/dist/text.js +13 -0
  473. package/dist/tools/approvals.controller.d.ts +53 -0
  474. package/dist/tools/approvals.controller.js +128 -0
  475. package/dist/tools/approvals.service.d.ts +172 -0
  476. package/dist/tools/approvals.service.js +568 -0
  477. package/dist/tools/breaker.d.ts +28 -0
  478. package/dist/tools/breaker.js +72 -0
  479. package/dist/tools/builtins/agent.d.ts +81 -0
  480. package/dist/tools/builtins/agent.js +223 -0
  481. package/dist/tools/builtins/ask-user.d.ts +28 -0
  482. package/dist/tools/builtins/ask-user.js +139 -0
  483. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  484. package/dist/tools/builtins/read-tool-output.js +108 -0
  485. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  486. package/dist/tools/builtins/sandbox/bash.js +137 -0
  487. package/dist/tools/builtins/sandbox/common.d.ts +116 -0
  488. package/dist/tools/builtins/sandbox/common.js +306 -0
  489. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  490. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  491. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  492. package/dist/tools/builtins/sandbox/edit.js +98 -0
  493. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  494. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  495. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  496. package/dist/tools/builtins/sandbox/glob.js +104 -0
  497. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  498. package/dist/tools/builtins/sandbox/grep.js +133 -0
  499. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  500. package/dist/tools/builtins/sandbox/index.js +27 -0
  501. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  502. package/dist/tools/builtins/sandbox/names.js +20 -0
  503. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  504. package/dist/tools/builtins/sandbox/read.js +121 -0
  505. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  506. package/dist/tools/builtins/sandbox/write.js +88 -0
  507. package/dist/tools/builtins/skill-load.d.ts +53 -0
  508. package/dist/tools/builtins/skill-load.js +446 -0
  509. package/dist/tools/builtins/skill-write.d.ts +59 -0
  510. package/dist/tools/builtins/skill-write.js +244 -0
  511. package/dist/tools/builtins/tool-search.d.ts +31 -0
  512. package/dist/tools/builtins/tool-search.js +171 -0
  513. package/dist/tools/connector-content.controller.d.ts +34 -0
  514. package/dist/tools/connector-content.controller.js +78 -0
  515. package/dist/tools/connector-content.d.ts +104 -0
  516. package/dist/tools/connector-content.js +267 -0
  517. package/dist/tools/connectors.controller.d.ts +210 -0
  518. package/dist/tools/connectors.controller.js +234 -0
  519. package/dist/tools/connectors.service.d.ts +303 -0
  520. package/dist/tools/connectors.service.js +1102 -0
  521. package/dist/tools/credentials.d.ts +139 -0
  522. package/dist/tools/credentials.js +351 -0
  523. package/dist/tools/drift.d.ts +141 -0
  524. package/dist/tools/drift.js +539 -0
  525. package/dist/tools/elicitation.d.ts +81 -0
  526. package/dist/tools/elicitation.js +266 -0
  527. package/dist/tools/endpoint.d.ts +18 -0
  528. package/dist/tools/endpoint.js +115 -0
  529. package/dist/tools/info.d.ts +67 -0
  530. package/dist/tools/info.js +113 -0
  531. package/dist/tools/naming.d.ts +27 -0
  532. package/dist/tools/naming.js +47 -0
  533. package/dist/tools/oauth/discovery.d.ts +65 -0
  534. package/dist/tools/oauth/discovery.js +307 -0
  535. package/dist/tools/oauth/flow.d.ts +63 -0
  536. package/dist/tools/oauth/flow.js +237 -0
  537. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  538. package/dist/tools/oauth/oauth.controller.js +95 -0
  539. package/dist/tools/oauth/tokens.d.ts +111 -0
  540. package/dist/tools/oauth/tokens.js +258 -0
  541. package/dist/tools/outputs.d.ts +61 -0
  542. package/dist/tools/outputs.js +156 -0
  543. package/dist/tools/pipeline.d.ts +322 -0
  544. package/dist/tools/pipeline.js +1236 -0
  545. package/dist/tools/policy.d.ts +60 -0
  546. package/dist/tools/policy.js +236 -0
  547. package/dist/tools/questions.controller.d.ts +24 -0
  548. package/dist/tools/questions.controller.js +58 -0
  549. package/dist/tools/questions.service.d.ts +103 -0
  550. package/dist/tools/questions.service.js +295 -0
  551. package/dist/tools/redact.d.ts +20 -0
  552. package/dist/tools/redact.js +60 -0
  553. package/dist/tools/registry.d.ts +246 -0
  554. package/dist/tools/registry.js +481 -0
  555. package/dist/tools/resources.d.ts +16 -0
  556. package/dist/tools/resources.js +76 -0
  557. package/dist/tools/specs.d.ts +14 -0
  558. package/dist/tools/specs.js +31 -0
  559. package/dist/tools/validate.d.ts +20 -0
  560. package/dist/tools/validate.js +183 -0
  561. package/dist/tools/view.d.ts +43 -0
  562. package/dist/tools/view.js +225 -0
  563. package/dist/ui/embed-token.d.ts +31 -0
  564. package/dist/ui/embed-token.js +132 -0
  565. package/dist/ui/registry.d.ts +58 -0
  566. package/dist/ui/registry.js +90 -0
  567. package/dist/ui/ui-stream.d.ts +37 -0
  568. package/dist/ui/ui-stream.js +162 -0
  569. package/dist/ui/views.controller.d.ts +81 -0
  570. package/dist/ui/views.controller.js +261 -0
  571. package/dist/ui/views.d.ts +155 -0
  572. package/dist/ui/views.js +306 -0
  573. package/dist/version.d.ts +5 -0
  574. package/dist/version.js +6 -0
  575. package/package.json +69 -3
  576. package/src/migrations/0001_init.sql +8 -0
  577. package/src/migrations/0002_secrets.sql +8 -0
  578. package/src/migrations/0003_identity.sql +117 -0
  579. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  580. package/src/migrations/0005_agents.sql +27 -0
  581. package/src/migrations/0006_conversations.sql +37 -0
  582. package/src/migrations/0007_checkpoints.sql +26 -0
  583. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  584. package/src/migrations/0009_runs_active_unique.sql +4 -0
  585. package/src/migrations/0010_tools.sql +125 -0
  586. package/src/migrations/0011_approvals_spec.sql +10 -0
  587. package/src/migrations/0012_run_waits.sql +24 -0
  588. package/src/migrations/0013_app_tools_source.sql +4 -0
  589. package/src/migrations/0014_tool_specs.sql +8 -0
  590. package/src/migrations/0015_tool_drift.sql +20 -0
  591. package/src/migrations/0016_plugin_permissions.sql +11 -0
  592. package/src/migrations/0017_identity_sources.sql +6 -0
  593. package/src/migrations/0018_channels.sql +74 -0
  594. package/src/migrations/0019_identity_trust.sql +17 -0
  595. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  596. package/src/migrations/0021_org_storage_purge.sql +9 -0
  597. package/src/migrations/0022_attachments.sql +29 -0
  598. package/src/migrations/0023_sandboxes.sql +37 -0
  599. package/src/migrations/0024_skills.sql +46 -0
  600. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  601. package/src/migrations/0026_skill_changes.sql +34 -0
  602. package/src/migrations/0027_model_prices.sql +18 -0
  603. package/src/migrations/0028_evals.sql +105 -0
  604. package/src/migrations/0029_model_purposes.sql +18 -0
  605. package/src/migrations/0030_plugin_installs.sql +73 -0
  606. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  607. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  608. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  609. package/src/migrations/0034_directory.sql +49 -0
  610. package/src/migrations/0035_catalogs.sql +40 -0
  611. package/src/migrations/0036_app_import_staging.sql +17 -0
  612. package/src/migrations/0037_directory_installs.sql +92 -0
  613. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  614. package/src/migrations/0039_channel_card_pending.sql +8 -0
  615. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  616. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  617. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  618. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  619. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  620. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  621. package/src/migrations/0046_git_sources.sql +25 -0
  622. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  623. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  624. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  625. package/src/migrations/0050_bootstrap.sql +53 -0
  626. package/src/migrations/0051_claude_compat.sql +26 -0
  627. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  628. package/src/migrations/0053_subagents.sql +73 -0
  629. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  630. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  631. package/src/migrations/0056_approval_reason.sql +3 -0
  632. package/src/migrations/0057_conversation_titles.sql +11 -0
  633. package/src/migrations/0058_conversation_selection.sql +4 -0
  634. package/src/migrations/0059_conversation_queue.sql +22 -0
  635. package/src/migrations/0060_file_previewers.sql +10 -0
  636. package/src/migrations/0061_queue_selection.sql +5 -0
  637. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,283 @@
1
+ /** 加载技能的内置工具名。 */
2
+ export const SKILL_LOAD = "skill_load";
3
+ /** 目录开头的说明(system 缓存段里的第一份目录)。 */
4
+ export const SKILLS_CATALOG_HEADER = "Skills are available in this conversation. A skill is a set of instructions, sometimes with " +
5
+ "scripts or other files, for a specific kind of task. When a task matches a skill's description, " +
6
+ `call ${SKILL_LOAD} with the skill's name to read its instructions before you start; do not guess ` +
7
+ "what a skill says. Available skills:";
8
+ /** 按码点比较名字(与区域设置无关,结果确定)。 */
9
+ const byName = (a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
10
+ /** 目录里每个技能描述最多的码点数(超出确定地截断;`skill_load` 仍返回完整正文)。 */
11
+ export const CATALOG_DESCRIPTION_MAX_CHARS = 300;
12
+ /** 折叠成一行,按码点截到 {@link CATALOG_DESCRIPTION_MAX_CHARS}。 */
13
+ function shortDescription(d) {
14
+ const flat = d.replace(/\s+/g, " ").trim();
15
+ const cps = [...flat];
16
+ return cps.length <= CATALOG_DESCRIPTION_MAX_CHARS
17
+ ? flat
18
+ : `${cps.slice(0, CATALOG_DESCRIPTION_MAX_CHARS - 1).join("")}…`;
19
+ }
20
+ /** 一行:`- <name>: <description>`(描述折叠成一行并截断)。 */
21
+ const line = (s) => `- ${s.name}: ${shortDescription(s.description)}`;
22
+ const lines = (skills) => [...skills].sort(byName).map(line).join("\n");
23
+ /** 第一份目录(进 system 缓存段),按名字排序。 */
24
+ export function skillsCatalogText(skills) {
25
+ return `${SKILLS_CATALOG_HEADER}\n${lines(skills)}`;
26
+ }
27
+ /** 两份快照是否相同(按 id、版本、名字、描述与来源)。顺序无关。 */
28
+ export function sameSkills(a, b) {
29
+ if (a.length !== b.length)
30
+ return false;
31
+ const byId = new Map(a.map((s) => [s.id, s]));
32
+ if (byId.size !== a.length)
33
+ return false;
34
+ return b.every((s) => {
35
+ const p = byId.get(s.id);
36
+ return (p !== undefined &&
37
+ p.version === s.version &&
38
+ p.name === s.name &&
39
+ p.description === s.description &&
40
+ p.source === s.source);
41
+ });
42
+ }
43
+ /**
44
+ * Two pinned lists are the same: id, version and source in order (absent = []). Bodies follow the
45
+ * source. The order counts, so a reordered `skills.pinned` writes a new snapshot; that snapshot
46
+ * renders no message ({@link pinnedChangeText} is "" and the catalog part is skipped), and only the
47
+ * system segment of a new conversation or a compaction restore shows the new order. This is
48
+ * deliberate and consistent from the log: do not "fix" the missing message.
49
+ */
50
+ export function samePinned(a, b) {
51
+ const x = a ?? [];
52
+ const y = b ?? [];
53
+ return (x.length === y.length &&
54
+ x.every((p, i) => {
55
+ const q = y[i];
56
+ return q !== undefined && p.id === q.id && p.version === q.version && p.source === q.source;
57
+ }));
58
+ }
59
+ /**
60
+ * Two snapshots are the same: {@link sameSkills} (`plugin` is not compared, so a snapshot written
61
+ * before phase B stays current), {@link samePinned} and the same `toolMap` (absent = undefined).
62
+ */
63
+ export function sameSnapshot(a, b) {
64
+ return (sameSkills(a.skills, b.skills) && samePinned(a.pinned, b.pinned) && a.toolMap === b.toolMap);
65
+ }
66
+ /**
67
+ * The catalog differences between two snapshots. `pinnedIds` (the next snapshot's pinned ids, phase
68
+ * B) are left out of `updated`: a pinned skill's new body is rendered by {@link pinnedChangeText},
69
+ * and the pinned header says not to call `skill_load` for it.
70
+ */
71
+ function catalogChanges(prev, next, pinnedIds) {
72
+ const before = new Map(prev.map((s) => [s.id, s]));
73
+ const after = new Map(next.map((s) => [s.id, s]));
74
+ const added = next.filter((s) => !before.has(s.id));
75
+ const removed = prev.filter((s) => !after.has(s.id));
76
+ const updated = next.filter((s) => {
77
+ const p = before.get(s.id);
78
+ return (p !== undefined &&
79
+ !pinnedIds?.has(s.id) &&
80
+ (p.version !== s.version || p.description !== s.description || p.source !== s.source));
81
+ });
82
+ return { added, updated, removed };
83
+ }
84
+ /**
85
+ * 目录变更提醒(之后的快照在所在位置以 system 消息追加):新增、移除、更新(同一 id 的版本、描述或来源变了:
86
+ * 试用草稿被拒绝 / 批准了别人的同号版本时,内容变了而版本号可能不变)。
87
+ * `prev` 为上一份快照(没有为空)。
88
+ */
89
+ export function skillsChangeText(prev, next, pinnedIds) {
90
+ const { added, updated, removed } = catalogChanges(prev, next, pinnedIds);
91
+ const parts = ["The skills available in this conversation have changed."];
92
+ if (added.length > 0) {
93
+ parts.push(`New skills (call ${SKILL_LOAD} with the name to use one):\n${lines(added)}`);
94
+ }
95
+ if (updated.length > 0) {
96
+ parts.push(`Updated skills (call ${SKILL_LOAD} again before relying on earlier instructions):\n${lines(updated)}`);
97
+ }
98
+ if (removed.length > 0) {
99
+ parts.push(`Removed skills (no longer available; do not use them): ${[...removed]
100
+ .sort(byName)
101
+ .map((s) => s.name)
102
+ .join(", ")}`);
103
+ }
104
+ if (next.length === 0)
105
+ parts.push("No skills are available now.");
106
+ return parts.join("\n\n");
107
+ }
108
+ /** 压缩摘要之后补上的「当前目录」(与 system 里的第一份不同时):完整列出,替代之前的目录与提醒。 */
109
+ export function skillsCurrentText(skills) {
110
+ if (skills.length === 0) {
111
+ return "No skills are available in this conversation now (this replaces any earlier list of skills).";
112
+ }
113
+ return ("Skills available in this conversation now (this replaces any earlier list of skills; call " +
114
+ `${SKILL_LOAD} with a name to read a skill's instructions):\n${lines(skills)}`);
115
+ }
116
+ // ---- Skills a person invoked (phase D spec §4.4; model-visible, English) ----
117
+ /**
118
+ * The line restored after a compaction summary whose range holds inline skill invocations
119
+ * (`names`: distinct, code point order); empty for none. Bodies are not re-injected.
120
+ */
121
+ export function invokedSkillsText(names) {
122
+ if (names.length === 0)
123
+ return "";
124
+ return `Skills the user invoked earlier in this conversation: ${names.join(", ")}. Call ${SKILL_LOAD} with a name to read its instructions again.`;
125
+ }
126
+ /** The distinct names (code point order) of the inline invocations in `events` up to `upToSeq`. */
127
+ export function invokedSkillNames(events, upToSeq) {
128
+ const names = new Set();
129
+ for (const e of events) {
130
+ if (e.seq > upToSeq || e.type !== "user_message")
131
+ continue;
132
+ const s = e.payload.skill;
133
+ if (s?.mode === "inline")
134
+ names.add(s.name);
135
+ }
136
+ return [...names].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
137
+ }
138
+ /**
139
+ * The latest invocation in `events` of the skill `name` (its bare name, or `<plugin>:<name>`),
140
+ * from the `skill` field of the `user_message`s; undefined when none.
141
+ */
142
+ export function latestInvocation(events, name) {
143
+ for (let i = events.length - 1; i >= 0; i--) {
144
+ const e = events[i];
145
+ if (e.type !== "user_message" || e.payload.skill === undefined)
146
+ continue;
147
+ const s = e.payload.skill;
148
+ if (s.name === name || (s.plugin !== undefined && `${s.plugin}:${s.name}` === name)) {
149
+ return {
150
+ id: s.id,
151
+ version: s.version,
152
+ source: s.source,
153
+ name: s.name,
154
+ ...(s.plugin !== undefined && { plugin: s.plugin }),
155
+ };
156
+ }
157
+ }
158
+ return undefined;
159
+ }
160
+ /** 日志里的全部 `skills_catalog` 事件,按 seq 升序。 */
161
+ export function skillsCatalogEvents(events) {
162
+ return events
163
+ .filter((e) => e.type === "skills_catalog")
164
+ .sort((a, b) => a.seq - b.seq);
165
+ }
166
+ /** 最新一份快照;没有为 null。 */
167
+ export function latestSkillsCatalog(events) {
168
+ return skillsCatalogEvents(events).at(-1) ?? null;
169
+ }
170
+ /**
171
+ * 进 system 缓存段的快照:第一份快照,且它之前没有任何 `model_call`(对话已经发过请求之后才有技能时,
172
+ * 改为在所在位置追加提醒,已发送的前缀不变)。没有为 null。
173
+ */
174
+ export function systemSkillsCatalog(events) {
175
+ const first = skillsCatalogEvents(events)[0];
176
+ if (!first)
177
+ return null;
178
+ const earlierCall = events.some((e) => e.type === "model_call" && e.seq < first.seq);
179
+ return earlierCall ? null : first;
180
+ }
181
+ // ---- Pinned skills and the tool-name map (phase B, spec §9.1, §9.4; model-visible, English) ----
182
+ /** The header of the pinned skills in the system cache segment. */
183
+ export const PINNED_SKILLS_HEADER = "Pinned skills: the owner of this agent pinned these skills, so their instructions apply " +
184
+ `throughout this conversation. Follow them without calling ${SKILL_LOAD}; call ${SKILL_LOAD} ` +
185
+ "only to copy a pinned skill's files into the sandbox.";
186
+ /** One pinned skill with its body. */
187
+ export function pinnedBlock(p) {
188
+ return `<pinned_skill name="${p.name}" version="${p.version}">\n${p.body.trim()}\n</pinned_skill>`;
189
+ }
190
+ /** The pinned skills of the system snapshot (non-empty), after the catalog. */
191
+ export function pinnedSystemText(pinned) {
192
+ return `${PINNED_SKILLS_HEADER}\n\n${pinned.map(pinnedBlock).join("\n\n")}`;
193
+ }
194
+ /**
195
+ * The pinned change notice between two snapshots ({@link samePinned} false): each entry that is new
196
+ * or has another version or source, with its whole body; then the names of the removed ones.
197
+ * Empty when nothing changed.
198
+ */
199
+ export function pinnedChangeText(prev, next) {
200
+ const before = new Map((prev ?? []).map((p) => [p.id, p]));
201
+ const after = new Set((next ?? []).map((p) => p.id));
202
+ const parts = [];
203
+ for (const p of next ?? []) {
204
+ const was = before.get(p.id);
205
+ if (was && was.version === p.version && was.source === p.source)
206
+ continue;
207
+ parts.push(`Pinned skill "${p.name}" (version ${p.version}) now applies to this conversation and ` +
208
+ `replaces any previous version of it:\n\n${pinnedBlock(p)}`);
209
+ }
210
+ const removed = (prev ?? []).filter((p) => !after.has(p.id)).map((p) => p.name);
211
+ if (removed.length > 0) {
212
+ parts.push(`Pinned skills removed (their pinned instructions no longer apply): ${removed.join(", ")}`);
213
+ }
214
+ return parts.join("\n\n");
215
+ }
216
+ /** The pinned skills after a compaction summary, when they differ from the system snapshot's. */
217
+ export function pinnedCurrentText(pinned) {
218
+ if (!pinned || pinned.length === 0) {
219
+ return "No skills are pinned now (this replaces any earlier pinned skills).";
220
+ }
221
+ return `Pinned skills now (this replaces any earlier pinned skills):\n\n${pinned
222
+ .map(pinnedBlock)
223
+ .join("\n\n")}`;
224
+ }
225
+ /** The tool-name map change notice (the map differs from the previous one). */
226
+ export function toolMapChangeText(next) {
227
+ return next === undefined
228
+ ? "The Claude Code tool-name map no longer applies."
229
+ : `The following tool-name map now applies:\n${next}`;
230
+ }
231
+ /**
232
+ * The one system message of a later snapshot: the catalog change (when the skills differ, or when
233
+ * nothing else differs: logs before phase B render exactly as before), the pinned change, the
234
+ * tool-name map change; joined by blank lines.
235
+ */
236
+ export function snapshotChangeText(prev, next) {
237
+ const prevSkills = prev?.skills ?? [];
238
+ const pinnedDiff = !samePinned(prev?.pinned, next.pinned);
239
+ const mapDiff = prev?.toolMap !== next.toolMap;
240
+ // a snapshot with pinned skills leaves them out of the "Updated skills" list; when that leaves no
241
+ // catalog change, the catalog text is skipped (the pinned change carries the message). Logs
242
+ // without `pinned` render exactly as before.
243
+ const pinnedIds = next.pinned && next.pinned.length > 0 ? new Set(next.pinned.map((p) => p.id)) : undefined;
244
+ const c = catalogChanges(prevSkills, next.skills, pinnedIds);
245
+ const catalogDiff = pinnedIds
246
+ ? c.added.length + c.updated.length + c.removed.length > 0
247
+ : !sameSkills(prevSkills, next.skills);
248
+ const parts = [];
249
+ if (catalogDiff || (!pinnedDiff && !mapDiff)) {
250
+ parts.push(skillsChangeText(prevSkills, next.skills, pinnedIds));
251
+ }
252
+ if (pinnedDiff)
253
+ parts.push(pinnedChangeText(prev?.pinned, next.pinned));
254
+ if (mapDiff)
255
+ parts.push(toolMapChangeText(next.toolMap));
256
+ return parts.filter((p) => p !== "").join("\n\n");
257
+ }
258
+ /**
259
+ * What follows a compaction summary when the covered snapshot is not the system one: today's
260
+ * current catalog (when the skills differ from the system snapshot's), the current pinned skills
261
+ * (when they differ), the tool-name map (when it differs); joined by blank lines, "" for nothing.
262
+ */
263
+ export function snapshotCurrentText(system, covered) {
264
+ const parts = [];
265
+ if (!sameSkills(system?.skills ?? [], covered.skills)) {
266
+ parts.push(skillsCurrentText(covered.skills));
267
+ }
268
+ if (!samePinned(system?.pinned, covered.pinned))
269
+ parts.push(pinnedCurrentText(covered.pinned));
270
+ if (system?.toolMap !== covered.toolMap) {
271
+ parts.push(toolMapChangeText(covered.toolMap));
272
+ }
273
+ return parts.join("\n\n");
274
+ }
275
+ /** The system snapshot's text after the agent's instructions: catalog, pinned skills, tool map. */
276
+ export function snapshotSystemText(s) {
277
+ let text = skillsCatalogText(s.skills);
278
+ if (s.pinned && s.pinned.length > 0)
279
+ text += `\n\n${pinnedSystemText(s.pinned)}`;
280
+ if (s.toolMap !== undefined)
281
+ text += `\n\n${s.toolMap}`;
282
+ return text;
283
+ }
@@ -0,0 +1,19 @@
1
+ import type { ModelMessage, ModelRequest } from "@capybara-hq/plugin-sdk";
2
+ /**
3
+ * 估算请求的输入 token 数:ASCII 字符数 ÷ 4 + 非 ASCII 字符数 × 1,向上取整。
4
+ * 故意不用 BPE 分词器:长段中文分词会阻塞事件循环(可靠性清单 A);偏差由 `calibrate` 按真实用量校正。
5
+ * 工具定义(名字、描述、inputSchema 的 JSON)计入。供应商私有数据(opaque)大小未知,不计入。
6
+ * 媒体块:传了 `mediaTokens`(`buildModelRequest` 按行信息算好的:图片 1600、PDF 页数 × 1000 等)时
7
+ * 直接用它、不再逐块估算;否则按块兜底(图片 1600,文档按字节 ÷ 3,不解码)。
8
+ */
9
+ export declare function estimateTokens(messages: ModelMessage[], system: ModelRequest["system"], tools?: ModelRequest["tools"], mediaTokens?: number): number;
10
+ /**
11
+ * 用上一轮的真实输入 token 数校正估算:乘以 `inputTokens / estimate`,比例夹在 0.5–3。
12
+ * 没有上一轮(或上一轮估算为 0)时原样返回。
13
+ */
14
+ export declare function calibrate(estimate: number, lastActual: {
15
+ estimate: number;
16
+ inputTokens: number;
17
+ } | null): number;
18
+ /** Token estimate of a text of `bytes` UTF-8 bytes read as ASCII (the rule above: ÷ 4, rounded up). */
19
+ export declare function textBytesTokens(bytes: number): number;
@@ -0,0 +1,104 @@
1
+ import { IMAGE_TOKENS, pdfTokens } from "./build.js";
2
+ /** 文档按「字节数 ÷ 3」估算。 */
3
+ const BYTES_PER_TOKEN = 3;
4
+ /** 未解析的文档引用(不应出现在发出的请求里)的保守估算。 */
5
+ const UNRESOLVED_DOCUMENT_TOKENS = 1000;
6
+ /** base64 解码后的字节数(按长度计算,不解码)。 */
7
+ function base64Bytes(data) {
8
+ const pad = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
9
+ return Math.max(0, Math.floor((data.length / 4) * 3) - pad);
10
+ }
11
+ /**
12
+ * 媒体块的兜底估算(没有构建时算好的 `mediaTokens` 时用,不解码):图片固定 1600;PDF 按大小换算页数
13
+ * (见 `pdfTokens`,绝不按字节 ÷ 3);其他文档按字节 ÷ 3。
14
+ */
15
+ function blockMediaTokens(b) {
16
+ if (b.type === "image")
17
+ return IMAGE_TOKENS;
18
+ if (b.source.kind !== "base64")
19
+ return UNRESOLVED_DOCUMENT_TOKENS;
20
+ const size = base64Bytes(b.source.data);
21
+ if (b.mediaType === "application/pdf")
22
+ return pdfTokens(size, null);
23
+ return Math.ceil(size / BYTES_PER_TOKEN);
24
+ }
25
+ /** 校正比例的上下限:单轮真实值偏差再大,也不让估算失控。 */
26
+ const MIN_RATIO = 0.5;
27
+ const MAX_RATIO = 3;
28
+ /** 逐个 UTF-16 码元计数:ASCII 与非 ASCII 分开累加。线性扫描,不做分词。 */
29
+ class CharCounter {
30
+ ascii = 0;
31
+ other = 0;
32
+ add(text) {
33
+ let ascii = 0;
34
+ const len = text.length;
35
+ for (let i = 0; i < len; i++) {
36
+ if (text.charCodeAt(i) < 128)
37
+ ascii++;
38
+ }
39
+ this.ascii += ascii;
40
+ this.other += len - ascii;
41
+ }
42
+ tokens() {
43
+ return Math.ceil(this.ascii / 4 + this.other);
44
+ }
45
+ }
46
+ /**
47
+ * 估算请求的输入 token 数:ASCII 字符数 ÷ 4 + 非 ASCII 字符数 × 1,向上取整。
48
+ * 故意不用 BPE 分词器:长段中文分词会阻塞事件循环(可靠性清单 A);偏差由 `calibrate` 按真实用量校正。
49
+ * 工具定义(名字、描述、inputSchema 的 JSON)计入。供应商私有数据(opaque)大小未知,不计入。
50
+ * 媒体块:传了 `mediaTokens`(`buildModelRequest` 按行信息算好的:图片 1600、PDF 页数 × 1000 等)时
51
+ * 直接用它、不再逐块估算;否则按块兜底(图片 1600,文档按字节 ÷ 3,不解码)。
52
+ */
53
+ export function estimateTokens(messages, system, tools = [], mediaTokens) {
54
+ const c = new CharCounter();
55
+ let media = 0;
56
+ for (const s of system)
57
+ c.add(s.text);
58
+ for (const t of tools) {
59
+ c.add(t.name);
60
+ c.add(t.description);
61
+ c.add(JSON.stringify(t.inputSchema) ?? "");
62
+ }
63
+ for (const m of messages) {
64
+ if (m.role === "system") {
65
+ c.add(m.content);
66
+ continue;
67
+ }
68
+ for (const b of m.content) {
69
+ switch (b.type) {
70
+ case "text":
71
+ case "thinking":
72
+ c.add(b.text);
73
+ break;
74
+ case "tool_call":
75
+ c.add(b.name);
76
+ c.add(JSON.stringify(b.input) ?? "");
77
+ break;
78
+ case "tool_result":
79
+ c.add(b.content);
80
+ break;
81
+ case "image":
82
+ case "document":
83
+ if (mediaTokens === undefined)
84
+ media += blockMediaTokens(b);
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ return c.tokens() + (mediaTokens ?? media);
90
+ }
91
+ /**
92
+ * 用上一轮的真实输入 token 数校正估算:乘以 `inputTokens / estimate`,比例夹在 0.5–3。
93
+ * 没有上一轮(或上一轮估算为 0)时原样返回。
94
+ */
95
+ export function calibrate(estimate, lastActual) {
96
+ if (!lastActual || lastActual.estimate <= 0)
97
+ return estimate;
98
+ const ratio = Math.min(MAX_RATIO, Math.max(MIN_RATIO, lastActual.inputTokens / lastActual.estimate));
99
+ return Math.ceil(estimate * ratio);
100
+ }
101
+ /** Token estimate of a text of `bytes` UTF-8 bytes read as ASCII (the rule above: ÷ 4, rounded up). */
102
+ export function textBytesTokens(bytes) {
103
+ return Math.ceil(bytes / 4);
104
+ }
@@ -0,0 +1,40 @@
1
+ import type { Logger } from "@capybara-hq/plugin-sdk";
2
+ import type { Redis } from "ioredis";
3
+ /** 会话运行锁的默认 TTL(毫秒):持有方每 `ttlMs / 3` 续租一次。 */
4
+ export declare const CONVERSATION_LOCK_TTL_MS = 30000;
5
+ /** 本进程持有的会话运行锁。 */
6
+ export interface Lease {
7
+ readonly conversationId: string;
8
+ readonly runId: string;
9
+ /** 续租时发现锁已不属于自己(过期后被他人取得);此后不再续租。 */
10
+ readonly lost: boolean;
11
+ /** 立即续租一次;锁已不属于自己 → false(并标记 lost)。 */
12
+ renew(): Promise<boolean>;
13
+ /** 停止续租并释放(只删除自己持有的锁)。 */
14
+ release(): Promise<void>;
15
+ /** 只停止续租、不释放:锁在 TTL 后自然过期(停机超出预算、交给其他副本时使用)。 */
16
+ abandon(): void;
17
+ /** 注册「锁已丢失」回调(续租发现锁不再属于自己时调用一次;已丢失则立即调用)。 */
18
+ onLost(cb: () => void): void;
19
+ }
20
+ /**
21
+ * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
22
+ * 带 TTL;持有期间由本进程的定时器每 `ttlMs / 3` 续租(本进程持有的锁的续租,允许的进程内定时器)。
23
+ * 持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
24
+ */
25
+ export declare class ConversationLock {
26
+ private readonly redis;
27
+ private readonly log?;
28
+ private readonly keyPrefix;
29
+ /** `keyPrefix`:同样语义、按会话互斥的其他用途用别的前缀(如渠道出站投递 `capk:channel-deliver:`)。 */
30
+ constructor(redis: Redis, log?: Pick<Logger, "warn"> | undefined, keyPrefix?: string);
31
+ private lockKey;
32
+ acquire(conversationId: string, runId: string, ttlMs?: number): Promise<Lease | null>;
33
+ /**
34
+ * 释放某个运行持有的锁(只在仍由该 runId 持有时删除),不需要 Lease:用于 BullMQ 已判定任务失败
35
+ * (例如持有者崩溃、stalled 次数超限)后清理死去持有者留下的锁,不必等 TTL 过期。
36
+ */
37
+ releaseFor(conversationId: string, runId: string): Promise<void>;
38
+ /** 当前持有者的 runId;无人持有 → null。 */
39
+ holder(conversationId: string): Promise<string | null>;
40
+ }
@@ -0,0 +1,97 @@
1
+ /** 会话运行锁的默认 TTL(毫秒):持有方每 `ttlMs / 3` 续租一次。 */
2
+ export const CONVERSATION_LOCK_TTL_MS = 30_000;
3
+ /** 会话运行锁的键前缀。 */
4
+ const RUN_LOCK_PREFIX = "capk:conv-run:";
5
+ const RENEW = `
6
+ if redis.call('GET', KEYS[1]) == ARGV[1] then
7
+ return redis.call('PEXPIRE', KEYS[1], ARGV[2])
8
+ end
9
+ return 0
10
+ `;
11
+ const RELEASE = `
12
+ if redis.call('GET', KEYS[1]) == ARGV[1] then
13
+ return redis.call('DEL', KEYS[1])
14
+ end
15
+ return 0
16
+ `;
17
+ /**
18
+ * 会话级运行锁(spec 4.3「同一会话同一时刻只跑一轮」):Redis 键 `capk:conv-run:<id>`,值为 runId,
19
+ * 带 TTL;持有期间由本进程的定时器每 `ttlMs / 3` 续租(本进程持有的锁的续租,允许的进程内定时器)。
20
+ * 持有方崩溃时停止续租,锁在 TTL 后过期,其他副本可以取得。
21
+ */
22
+ export class ConversationLock {
23
+ redis;
24
+ log;
25
+ keyPrefix;
26
+ /** `keyPrefix`:同样语义、按会话互斥的其他用途用别的前缀(如渠道出站投递 `capk:channel-deliver:`)。 */
27
+ constructor(redis, log, keyPrefix = RUN_LOCK_PREFIX) {
28
+ this.redis = redis;
29
+ this.log = log;
30
+ this.keyPrefix = keyPrefix;
31
+ }
32
+ lockKey(conversationId) {
33
+ return `${this.keyPrefix}${conversationId}`;
34
+ }
35
+ async acquire(conversationId, runId, ttlMs = CONVERSATION_LOCK_TTL_MS) {
36
+ const key = this.lockKey(conversationId);
37
+ const ok = await this.redis.set(key, runId, "PX", ttlMs, "NX");
38
+ if (ok !== "OK")
39
+ return null;
40
+ const redis = this.redis;
41
+ const log = this.log;
42
+ let lost = false;
43
+ let timer;
44
+ const lostCallbacks = [];
45
+ const stop = () => {
46
+ clearInterval(timer);
47
+ timer = undefined;
48
+ };
49
+ const lease = {
50
+ conversationId,
51
+ runId,
52
+ get lost() {
53
+ return lost;
54
+ },
55
+ async renew() {
56
+ if (lost)
57
+ return false;
58
+ const r = Number(await redis.eval(RENEW, 1, key, runId, ttlMs));
59
+ if (r !== 1) {
60
+ lost = true;
61
+ stop();
62
+ log?.warn("conversation run lock lost", { conversationId, runId });
63
+ for (const cb of lostCallbacks.splice(0))
64
+ cb();
65
+ }
66
+ return r === 1;
67
+ },
68
+ async release() {
69
+ stop();
70
+ await redis.eval(RELEASE, 1, key, runId);
71
+ },
72
+ abandon: stop,
73
+ onLost(cb) {
74
+ if (lost)
75
+ cb();
76
+ else
77
+ lostCallbacks.push(cb);
78
+ },
79
+ };
80
+ timer = setInterval(() => {
81
+ lease.renew().catch((err) => log?.warn("conversation run lock renew failed", { err }));
82
+ }, Math.max(1, Math.floor(ttlMs / 3)));
83
+ timer.unref();
84
+ return lease;
85
+ }
86
+ /**
87
+ * 释放某个运行持有的锁(只在仍由该 runId 持有时删除),不需要 Lease:用于 BullMQ 已判定任务失败
88
+ * (例如持有者崩溃、stalled 次数超限)后清理死去持有者留下的锁,不必等 TTL 过期。
89
+ */
90
+ async releaseFor(conversationId, runId) {
91
+ await this.redis.eval(RELEASE, 1, this.lockKey(conversationId), runId);
92
+ }
93
+ /** 当前持有者的 runId;无人持有 → null。 */
94
+ holder(conversationId) {
95
+ return this.redis.get(this.lockKey(conversationId));
96
+ }
97
+ }
@@ -0,0 +1,84 @@
1
+ import type { AvailableHook, HookModelRequest, HookParentScope, HookPayloads, HookScope, Logger, ModelRequest } from "@capybara-hq/plugin-sdk";
2
+ import type { AppendEvent, EventLog } from "../conversations/event-log.js";
3
+ import type { EventPayload } from "../conversations/events.js";
4
+ import type { KernelDb } from "../db/kernel-schema.js";
5
+ import type { HookOutcome, HookRegistry } from "../extensions/hooks.js";
6
+ import { audit } from "../identity/audit.js";
7
+ /** What the runtime needs from the host's hook registry (absent in eval replays). */
8
+ export type HookRunner = Pick<HookRegistry, "run" | "has">;
9
+ /**
10
+ * Kind of the conversation a run belongs to; hooks fire for `chat` and `subagent` (F10, P-18,
11
+ * sub-agents spec §11), never for `eval`.
12
+ */
13
+ export type ConversationKindForHooks = "chat" | "eval" | "subagent";
14
+ /** A denial as `run()` returns it. */
15
+ export type HookDenial = Extract<HookOutcome, {
16
+ allowed: false;
17
+ }>;
18
+ /**
19
+ * The scope for hook payloads, or null when hooks must not fire: no registry (eval replays omit it),
20
+ * a conversation that is neither `chat` nor `subagent`, or missing identity fields. A sub-agent's
21
+ * scope carries `parent` (where it was dispatched from).
22
+ */
23
+ export declare function hookScope(hooks: HookRunner | undefined, s: {
24
+ conversationKind?: ConversationKindForHooks;
25
+ orgId: string;
26
+ accountId?: string;
27
+ agentId?: string;
28
+ agentVersion: number;
29
+ conversationId: string;
30
+ runId: string;
31
+ parent?: HookParentScope | undefined;
32
+ }): HookScope | null;
33
+ /**
34
+ * Fires observe-only hooks (`model.response`, `tool.postExecute`) without waiting. `signal` must be
35
+ * run-scoped (not a per-call controller aborted when the call ends), or the hooks would be cut off.
36
+ */
37
+ export declare function fireObserve<K extends "model.response" | "tool.postExecute">(hooks: HookRunner, mount: K, payload: HookPayloads[K], signal: AbortSignal, log: Pick<Logger, "warn">): void;
38
+ /**
39
+ * The `model.request` payload's request (F10, I-3): the request sent to the provider with every image
40
+ * and document block replaced by a {@link HookMediaPlaceholder} (`kind`, `mediaType`, decoded `size`),
41
+ * so hook payloads carry neither media bytes nor attachment ids. Media never sits outside user
42
+ * messages, but every message is projected anyway. Building the copy also keeps the per-call clone
43
+ * and freeze of the payload small. A `ref` source should never reach here (the kernel resolves refs
44
+ * before sending); it becomes a placeholder of size 0 and logs a warning.
45
+ */
46
+ export declare function hookRequestOf(request: ModelRequest, log?: Pick<Logger, "warn">): HookModelRequest;
47
+ /** Where a denial is recorded (conversation, run, actor and the idem key of its `hook_denied`). */
48
+ export interface DenialSite {
49
+ orgId: string;
50
+ conversationId: string;
51
+ runId: string;
52
+ accountId?: string;
53
+ agentId?: string;
54
+ idemKey: string;
55
+ }
56
+ /** The `hook_denied` event of a denial (not model-visible: request building skips it). */
57
+ export declare function hookDeniedEvent(at: DenialSite, mount: Extract<AvailableHook, "model.request" | "tool.preExecute">, denial: HookDenial, where: {
58
+ step: number;
59
+ attempt?: number;
60
+ callId?: string;
61
+ }): AppendEvent & {
62
+ type: "hook_denied";
63
+ payload: EventPayload<"hook_denied">;
64
+ };
65
+ /**
66
+ * The `hook.denied` audit entry of a denial. For an R10 denial (`preflight`) it says that no plugin ran
67
+ * and that the named plugin is only the first policy plugin on the mount.
68
+ */
69
+ export declare function hookDeniedAudit(at: DenialSite, payload: EventPayload<"hook_denied">, denial: HookDenial): AuditEntry;
70
+ /** Audit entry shape (the argument of `audit()`). */
71
+ export type AuditEntry = Parameters<typeof audit>[1];
72
+ /**
73
+ * Writes a model request's `hook_denied` event and its audit entry in one transaction (the tool path
74
+ * writes them with the `tool_result` instead). Idempotent by idem key: a resumed run that finds the
75
+ * denial rethrows it before running the hooks again, so no second audit entry is written.
76
+ */
77
+ export declare function recordHookDenial(d: {
78
+ db: KernelDb;
79
+ eventLog: EventLog;
80
+ }, at: DenialSite, mount: Extract<AvailableHook, "model.request" | "tool.preExecute">, denial: HookDenial, where: {
81
+ step: number;
82
+ attempt?: number;
83
+ callId?: string;
84
+ }): Promise<void>;