@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,92 @@
1
+ import type { KernelDb } from "../db/kernel-schema.js";
2
+ import type { StorageService } from "../storage/storage.service.js";
3
+ /**
4
+ * A conversation's file outputs (UI refresh B, spec §5.8 / §5.9): the files the agent delivered
5
+ * (`artifact_created`), grouped by `sourcePath` into versions, newest first. Read from the log on
6
+ * every request (no cache); `status` comes from the object store.
7
+ */
8
+ /** Versions listed per file (newest first). */
9
+ export declare const FILE_VERSIONS_MAX = 20;
10
+ /** Largest `limit` of the files list. */
11
+ export declare const FILES_PAGE_MAX = 100;
12
+ /** Largest `limit` (bytes) of the text content route. */
13
+ export declare const FILE_CONTENT_MAX_BYTES: number;
14
+ export interface FileOutput {
15
+ /** artifactId of the latest version. */
16
+ id: string;
17
+ name: string;
18
+ contentType: string;
19
+ size: number;
20
+ sourcePath: string;
21
+ /** 1-based count of deliveries with the same sourcePath, in log order. */
22
+ version: number;
23
+ /** Newest first, at most {@link FILE_VERSIONS_MAX}. */
24
+ versions: {
25
+ id: string;
26
+ size: number;
27
+ createdAt: Date;
28
+ }[];
29
+ callId: string;
30
+ createdAt: Date;
31
+ /** `removed`: the latest version's object is gone from storage (decision 8). */
32
+ status: "available" | "removed";
33
+ previewable: "image" | "text" | null;
34
+ }
35
+ /** Text content of one file version, at most the requested bytes. */
36
+ export interface FileContent {
37
+ body: Buffer;
38
+ /**
39
+ * Always `text/plain; charset=utf-8`: agent output is never served as a script, stylesheet or
40
+ * page on the app origin (review I2).
41
+ */
42
+ contentType: string;
43
+ /** The stored type without parameters (sent as `X-Content-Original-Type`). */
44
+ originalType: string;
45
+ truncated: boolean;
46
+ }
47
+ export interface ConversationFilesDeps {
48
+ db: KernelDb;
49
+ storage: Pick<StorageService, "kernel">;
50
+ /** Same visibility as the event stream (`ConversationsService.isAccessible`). */
51
+ isAccessible(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
52
+ }
53
+ /** Storage HEADs a files list sends at once (review M1). */
54
+ export declare const HEAD_CONCURRENCY = 8;
55
+ export declare class ConversationFiles {
56
+ private readonly d;
57
+ constructor(d: ConversationFilesDeps);
58
+ private checkAccess;
59
+ /** Every delivery of the conversation in log order. */
60
+ private deliveries;
61
+ /**
62
+ * Files newest first by their **first** delivery, so a new version keeps the file's place and a
63
+ * cursor stays stable while files are re-delivered (review M2). `after` is a file id from the
64
+ * previous page (any version's id finds its file); a cursor that names no file gives an empty
65
+ * page. Storage HEADs run at most {@link HEAD_CONCURRENCY} at a time.
66
+ */
67
+ list(orgId: string, conversationId: string, viewer: string, opts: {
68
+ after?: string;
69
+ limit: number;
70
+ }): Promise<{
71
+ files: FileOutput[];
72
+ next: string | null;
73
+ }>;
74
+ /**
75
+ * One file version of the conversation (any version's id) with its object key, after checking
76
+ * the viewer can read the conversation. For the kernel only (previewers, embed grants): the key
77
+ * never leaves the kernel.
78
+ */
79
+ file(orgId: string, conversationId: string, viewer: string, fileId: string): Promise<{
80
+ id: string;
81
+ name: string;
82
+ contentType: string;
83
+ size: number;
84
+ objectKey: string;
85
+ }>;
86
+ /**
87
+ * The first `limit` bytes of a text file version (any version's id). Not text, or NUL bytes in
88
+ * what was read → `conversation.artifact_not_previewable`; the object is gone →
89
+ * `conversation.artifact_removed`. A cut never splits a UTF-8 character.
90
+ */
91
+ content(orgId: string, conversationId: string, viewer: string, fileId: string, limit: number): Promise<FileContent>;
92
+ }
@@ -0,0 +1,213 @@
1
+ import { sql } from "kysely";
2
+ import { ApiError } from "../errors.js";
3
+ import { UUID_RE } from "../ui/registry.js";
4
+ import { isInlineArtifactType, isTextArtifactType } from "./artifacts.js";
5
+ /**
6
+ * A conversation's file outputs (UI refresh B, spec §5.8 / §5.9): the files the agent delivered
7
+ * (`artifact_created`), grouped by `sourcePath` into versions, newest first. Read from the log on
8
+ * every request (no cache); `status` comes from the object store.
9
+ */
10
+ /** Versions listed per file (newest first). */
11
+ export const FILE_VERSIONS_MAX = 20;
12
+ /** Largest `limit` of the files list. */
13
+ export const FILES_PAGE_MAX = 100;
14
+ /** Largest `limit` (bytes) of the text content route. */
15
+ export const FILE_CONTENT_MAX_BYTES = 1024 * 1024;
16
+ const conversationNotFound = () => new ApiError("conversation.not_found", "Conversation not found");
17
+ const artifactNotFound = () => new ApiError("conversation.artifact_not_found", "Artifact not found");
18
+ /** Drops an incomplete UTF-8 sequence at the end of a cut buffer. */
19
+ function trimUtf8(b) {
20
+ let i = b.length - 1;
21
+ let cont = 0;
22
+ while (i >= 0 && cont < 3 && (b[i] & 0xc0) === 0x80) {
23
+ i--;
24
+ cont++;
25
+ }
26
+ if (i < 0)
27
+ return b;
28
+ const lead = b[i];
29
+ const need = lead >= 0xf0 ? 3 : lead >= 0xe0 ? 2 : lead >= 0xc0 ? 1 : 0;
30
+ return need > cont ? b.subarray(0, i) : b;
31
+ }
32
+ async function readPrefix(body, max) {
33
+ const reader = body.getReader();
34
+ const chunks = [];
35
+ let n = 0;
36
+ try {
37
+ while (n < max) {
38
+ const { done, value } = await reader.read();
39
+ if (done)
40
+ break;
41
+ const take = value.subarray(0, Math.min(value.byteLength, max - n));
42
+ chunks.push(take);
43
+ n += take.byteLength;
44
+ }
45
+ }
46
+ finally {
47
+ await reader.cancel().catch(() => { });
48
+ }
49
+ return Buffer.concat(chunks, n);
50
+ }
51
+ /** Storage HEADs a files list sends at once (review M1). */
52
+ export const HEAD_CONCURRENCY = 8;
53
+ /** `Promise.all(xs.map(fn))` with at most `limit` calls in flight; results in input order. */
54
+ async function mapLimit(xs, limit, fn) {
55
+ const out = new Array(xs.length);
56
+ let next = 0;
57
+ const worker = async () => {
58
+ for (;;) {
59
+ const i = next++;
60
+ if (i >= xs.length)
61
+ return;
62
+ out[i] = await fn(xs[i]);
63
+ }
64
+ };
65
+ await Promise.all(Array.from({ length: Math.min(limit, xs.length) }, worker));
66
+ return out;
67
+ }
68
+ export class ConversationFiles {
69
+ d;
70
+ constructor(d) {
71
+ this.d = d;
72
+ }
73
+ async checkAccess(orgId, conversationId, viewer) {
74
+ if (!UUID_RE.test(conversationId))
75
+ throw conversationNotFound();
76
+ if (!(await this.d.isAccessible(orgId, conversationId, viewer)))
77
+ throw conversationNotFound();
78
+ }
79
+ /** Every delivery of the conversation in log order. */
80
+ async deliveries(conversationId) {
81
+ const rows = await this.d.db
82
+ .selectFrom("conversation_events")
83
+ .select(["payload", "created_at"])
84
+ .where("conversation_id", "=", conversationId)
85
+ .where("type", "=", "artifact_created")
86
+ .orderBy("seq")
87
+ .execute();
88
+ return rows.map((r) => ({
89
+ ...r.payload,
90
+ createdAt: r.created_at,
91
+ }));
92
+ }
93
+ /**
94
+ * Files newest first by their **first** delivery, so a new version keeps the file's place and a
95
+ * cursor stays stable while files are re-delivered (review M2). `after` is a file id from the
96
+ * previous page (any version's id finds its file); a cursor that names no file gives an empty
97
+ * page. Storage HEADs run at most {@link HEAD_CONCURRENCY} at a time.
98
+ */
99
+ async list(orgId, conversationId, viewer, opts) {
100
+ await this.checkAccess(orgId, conversationId, viewer);
101
+ const groups = new Map();
102
+ for (const d of await this.deliveries(conversationId)) {
103
+ // insertion order = first delivery (oldest first)
104
+ const g = groups.get(d.sourcePath) ?? [];
105
+ g.push(d);
106
+ groups.set(d.sourcePath, g);
107
+ }
108
+ const ordered = [...groups.values()].reverse();
109
+ let start = 0;
110
+ if (opts.after !== undefined) {
111
+ const after = opts.after;
112
+ const at = ordered.findIndex((g) => g.some((d) => d.artifactId === after));
113
+ if (at < 0)
114
+ return { files: [], next: null };
115
+ start = at + 1;
116
+ }
117
+ const page = ordered.slice(start, start + opts.limit);
118
+ const store = this.d.storage.kernel(orgId);
119
+ const files = await mapLimit(page, HEAD_CONCURRENCY, async (g) => {
120
+ const latest = g.at(-1);
121
+ const head = await store.head(latest.objectKey);
122
+ return {
123
+ id: latest.artifactId,
124
+ name: latest.name,
125
+ contentType: latest.contentType,
126
+ size: latest.size,
127
+ sourcePath: latest.sourcePath,
128
+ version: g.length,
129
+ versions: g
130
+ .slice(-FILE_VERSIONS_MAX)
131
+ .reverse()
132
+ .map((d) => ({ id: d.artifactId, size: d.size, createdAt: d.createdAt })),
133
+ callId: latest.callId,
134
+ createdAt: latest.createdAt,
135
+ status: head ? "available" : "removed",
136
+ previewable: isInlineArtifactType(latest.contentType)
137
+ ? "image"
138
+ : isTextArtifactType(latest.contentType)
139
+ ? "text"
140
+ : null,
141
+ };
142
+ });
143
+ const next = start + opts.limit < ordered.length ? (files.at(-1)?.id ?? null) : null;
144
+ return { files, next };
145
+ }
146
+ /**
147
+ * One file version of the conversation (any version's id) with its object key, after checking
148
+ * the viewer can read the conversation. For the kernel only (previewers, embed grants): the key
149
+ * never leaves the kernel.
150
+ */
151
+ async file(orgId, conversationId, viewer, fileId) {
152
+ await this.checkAccess(orgId, conversationId, viewer);
153
+ if (!UUID_RE.test(fileId))
154
+ throw artifactNotFound();
155
+ const row = await this.d.db
156
+ .selectFrom("conversation_events")
157
+ .select("payload")
158
+ .where("conversation_id", "=", conversationId)
159
+ .where("type", "=", "artifact_created")
160
+ .where(sql `payload->>'artifactId'`, "=", fileId)
161
+ .limit(1)
162
+ .executeTakeFirst();
163
+ if (!row)
164
+ throw artifactNotFound();
165
+ const a = row.payload;
166
+ return {
167
+ id: a.artifactId,
168
+ name: a.name,
169
+ contentType: a.contentType,
170
+ size: a.size,
171
+ objectKey: a.objectKey,
172
+ };
173
+ }
174
+ /**
175
+ * The first `limit` bytes of a text file version (any version's id). Not text, or NUL bytes in
176
+ * what was read → `conversation.artifact_not_previewable`; the object is gone →
177
+ * `conversation.artifact_removed`. A cut never splits a UTF-8 character.
178
+ */
179
+ async content(orgId, conversationId, viewer, fileId, limit) {
180
+ await this.checkAccess(orgId, conversationId, viewer);
181
+ if (!UUID_RE.test(fileId))
182
+ throw artifactNotFound();
183
+ const row = await this.d.db
184
+ .selectFrom("conversation_events")
185
+ .select("payload")
186
+ .where("conversation_id", "=", conversationId)
187
+ .where("type", "=", "artifact_created")
188
+ .where(sql `payload->>'artifactId'`, "=", fileId)
189
+ .limit(1)
190
+ .executeTakeFirst();
191
+ if (!row)
192
+ throw artifactNotFound();
193
+ const a = row.payload;
194
+ if (!isTextArtifactType(a.contentType)) {
195
+ throw new ApiError("conversation.artifact_not_previewable", "Only text files have content");
196
+ }
197
+ const max = Math.min(limit, FILE_CONTENT_MAX_BYTES);
198
+ const got = await this.d.storage
199
+ .kernel(orgId)
200
+ .get(a.objectKey, { range: { start: 0, end: max - 1 } });
201
+ if (!got)
202
+ throw new ApiError("conversation.artifact_removed", "The file is no longer available");
203
+ let body = await readPrefix(got.body, max);
204
+ if (body.includes(0)) {
205
+ throw new ApiError("conversation.artifact_not_previewable", "This file contains binary data and has no text content");
206
+ }
207
+ const truncated = got.head.size > body.byteLength;
208
+ if (truncated)
209
+ body = trimUtf8(body);
210
+ const base = (a.contentType.split(";")[0] ?? "").trim().toLowerCase();
211
+ return { body, contentType: "text/plain; charset=utf-8", originalType: base, truncated };
212
+ }
213
+ }
@@ -0,0 +1,34 @@
1
+ /** 一次最多返回的字符数(也是默认值):大存档按字符分页取。 */
2
+ export declare const OUTPUT_PAGE_MAX_CHARS = 200000;
3
+ export interface OutputPage {
4
+ id: string;
5
+ /** 本页正文:`[offset, offset + limit)` 个字符。 */
6
+ text: string;
7
+ offset: number;
8
+ /** 存档全文的字符数。 */
9
+ totalChars: number;
10
+ /** 下一页的 offset;已到末尾为 null。 */
11
+ next: number | null;
12
+ }
13
+ export interface ConversationOutputsDeps {
14
+ /** 会话可见性(与会话 SSE 流同一判定:`ConversationsService.isAccessible`)。 */
15
+ isAccessible(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
16
+ /** 读本会话未过期的存档(`ToolOutputs.load`):不存在 / 过期 / 属于别的会话 → null。 */
17
+ load(scope: {
18
+ orgId: string;
19
+ conversationId: string;
20
+ }, id: string): Promise<string | null>;
21
+ }
22
+ /**
23
+ * 网页读工具输出存档(运行标签看全文):先按会话流的规则判定会话可见(不可见 → `conversation.not_found`),
24
+ * 再只在这个会话的存档里找(别的会话 / 过期 → `conversation.output_not_found`)。
25
+ * 按字符分页(单行可能就很长,按行分页不能保证页大小);id 不是 UUID 时直接 404,不打到数据库。
26
+ */
27
+ export declare class ConversationOutputs {
28
+ private readonly d;
29
+ constructor(d: ConversationOutputsDeps);
30
+ read(orgId: string, conversationId: string, viewerAccountId: string, outputId: string, page: {
31
+ offset: number;
32
+ limit: number;
33
+ }): Promise<OutputPage>;
34
+ }
@@ -0,0 +1,37 @@
1
+ import { ApiError } from "../errors.js";
2
+ import { UUID_RE } from "../ui/registry.js";
3
+ /** 一次最多返回的字符数(也是默认值):大存档按字符分页取。 */
4
+ export const OUTPUT_PAGE_MAX_CHARS = 200_000;
5
+ const conversationNotFound = () => new ApiError("conversation.not_found", "Conversation not found");
6
+ const outputNotFound = () => new ApiError("conversation.output_not_found", "Output not found or expired");
7
+ /**
8
+ * 网页读工具输出存档(运行标签看全文):先按会话流的规则判定会话可见(不可见 → `conversation.not_found`),
9
+ * 再只在这个会话的存档里找(别的会话 / 过期 → `conversation.output_not_found`)。
10
+ * 按字符分页(单行可能就很长,按行分页不能保证页大小);id 不是 UUID 时直接 404,不打到数据库。
11
+ */
12
+ export class ConversationOutputs {
13
+ d;
14
+ constructor(d) {
15
+ this.d = d;
16
+ }
17
+ async read(orgId, conversationId, viewerAccountId, outputId, page) {
18
+ if (!UUID_RE.test(conversationId))
19
+ throw conversationNotFound();
20
+ if (!(await this.d.isAccessible(orgId, conversationId, viewerAccountId)))
21
+ throw conversationNotFound();
22
+ if (!UUID_RE.test(outputId))
23
+ throw outputNotFound();
24
+ const content = await this.d.load({ orgId, conversationId }, outputId);
25
+ if (content === null)
26
+ throw outputNotFound();
27
+ const offset = Math.min(page.offset, content.length);
28
+ const end = Math.min(content.length, offset + page.limit);
29
+ return {
30
+ id: outputId,
31
+ text: content.slice(offset, end),
32
+ offset,
33
+ totalChars: content.length,
34
+ next: end < content.length ? end : null,
35
+ };
36
+ }
37
+ }
@@ -0,0 +1,169 @@
1
+ import { type Transaction } from "kysely";
2
+ import { type ModelRef } from "../agents/definition.js";
3
+ import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
4
+ import { type AttachmentRef, type ConversationsService, type RunControl } from "./conversations.service.js";
5
+ import { type AppendEvent, type EventLog } from "./event-log.js";
6
+ import type { ConversationEvent } from "./events.js";
7
+ /**
8
+ * Queued messages (UI refresh B, spec §5.7): messages a person queued while a run was going. They
9
+ * are conversation state in PG, not events: the model has not seen them, so they enter the log only
10
+ * when sent. `RunQueue.ensureRun` sends the head item, one per run, when the conversation is idle
11
+ * (no unconsumed message, no active run, not paused), under the conversation row lock, so exactly
12
+ * one replica sends each item. A run that fails or is stopped pauses the queue (`finishRunIn`).
13
+ */
14
+ /** The most messages a conversation can hold in its queue. */
15
+ export declare const QUEUE_MAX_ITEMS = 20;
16
+ /**
17
+ * Why a queue paused (0062): a run failed or was stopped, the head item's author can no longer use
18
+ * the conversation, or the head item's skill can no longer be invoked (phase D Task 9).
19
+ */
20
+ export type QueuePauseReason = "run_ended" | "author_cannot_send" | "skill_not_invocable";
21
+ type KernelTrx = Transaction<KernelDatabase>;
22
+ /** A queued message as the API returns it. */
23
+ export interface QueueItem {
24
+ id: string;
25
+ text: string;
26
+ /** Uploaded files, bound to the conversation when queued. */
27
+ files: QueuedFile[];
28
+ /** `@` resources, read when queued (decision 15). */
29
+ attachments: {
30
+ connectorId: string;
31
+ name: string;
32
+ uri: string;
33
+ }[];
34
+ clientMessageId: string;
35
+ /** The model the message switches to when sent (null: no pick). */
36
+ model: ModelRef | null;
37
+ /** The effort the message switches to when sent (null: no pick). */
38
+ effort: string | null;
39
+ /**
40
+ * A skill invocation (phase D Task 9), rendered when queued; `text` is its arguments as typed.
41
+ * `name` is the name the person invoked.
42
+ */
43
+ skill?: {
44
+ name: string;
45
+ arguments: string;
46
+ mode: "inline" | "fork";
47
+ };
48
+ createdAt: Date;
49
+ /** Increasing in queue order (not dense: deleted items leave gaps). */
50
+ position: number;
51
+ }
52
+ export interface QueuedFile {
53
+ attachmentId: string;
54
+ name: string;
55
+ mediaType: string;
56
+ }
57
+ /** What `POST …/queue` takes (the message fields that can be queued). */
58
+ export interface QueueInput {
59
+ text: string;
60
+ clientMessageId: string;
61
+ attachments?: AttachmentRef[];
62
+ files?: string[];
63
+ /** A model / effort pick, applied when the message is sent (as a direct send's). */
64
+ model?: ModelRef;
65
+ effort?: string;
66
+ /** Invoke this skill (phase D): rendered now, `text` is the arguments. */
67
+ skill?: {
68
+ name: string;
69
+ };
70
+ }
71
+ interface QueueRow {
72
+ id: string;
73
+ conversation_id: string;
74
+ account_id: string;
75
+ position: string;
76
+ text: string;
77
+ content: unknown;
78
+ attachments: unknown;
79
+ files: unknown;
80
+ client_message_id: string;
81
+ model: unknown;
82
+ effort: string | null;
83
+ skill: unknown;
84
+ created_at: Date;
85
+ }
86
+ /** The `user_message` a queued item becomes, as `postUserMessage` would have written it. */
87
+ export declare function queuedUserMessage(r: QueueRow): AppendEvent;
88
+ /**
89
+ * Appends a queued item inside `t` (the caller holds the conversation row lock): its pick, re-planned
90
+ * against the selection in effect now, becomes a `model_switched` before the `user_message`, as a
91
+ * direct send writes it (final review I1), and the cached selection follows the log. A model that
92
+ * stopped resolving since the item was queued is still written: the run worker's fallback
93
+ * (`model_switched { reason: "unavailable" }` before `run_started`) handles it, as it does for a
94
+ * direct switch whose model disappears. Returns the `user_message` and whether it switched.
95
+ */
96
+ export declare function appendQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "append">, conversationId: string, r: QueueRow): Promise<{
97
+ event: ConversationEvent;
98
+ switched: boolean;
99
+ }>;
100
+ /** Pauses the queue with `reason` (inside `t`, holding the conversation row lock). */
101
+ export declare function pauseQueueWith(t: KernelTrx, conversationId: string, reason: QueuePauseReason): Promise<void>;
102
+ /**
103
+ * Sends the queue's head item as a `user_message` inside `t` (the caller holds the conversation
104
+ * row lock and has checked the conversation is idle and not paused); returns the event, or null
105
+ * when the queue is empty. An item whose message is already in the log (a retried enqueue after it
106
+ * was sent) is dropped and the next one is taken. A head item whose skill can no longer be invoked
107
+ * stays queued and the queue pauses (`skill_not_invocable`): `{ paused }`. The caller notifies
108
+ * after commit.
109
+ */
110
+ export declare function dispatchQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "append">, conversationId: string): Promise<{
111
+ event: ConversationEvent;
112
+ switched: boolean;
113
+ } | {
114
+ paused: QueuePauseReason;
115
+ } | null>;
116
+ /**
117
+ * Pauses the queue of a conversation whose run just failed or was stopped, when it holds items
118
+ * (inside the terminal transaction, see `finishRunIn`).
119
+ */
120
+ export declare function pauseQueueIn(t: KernelTrx, conversationId: string): Promise<void>;
121
+ export interface ConversationQueueDeps {
122
+ db: KernelDb;
123
+ eventLog: Pick<EventLog, "append" | "notify" | "publishChanged" | "findByIdem">;
124
+ conversations: Pick<ConversationsService, "get" | "writable" | "resolveExtra" | "bindIn" | "checkFilesSupported" | "checkPick" | "prepareQueuedSkill">;
125
+ runs?: Pick<RunControl, "ensureRun">;
126
+ }
127
+ /**
128
+ * The queue API (owner only, as the conversation): list, add, edit the text, delete, send now and
129
+ * resume. Every change publishes `changed: queue`.
130
+ */
131
+ export declare class ConversationQueue {
132
+ private readonly d;
133
+ constructor(d: ConversationQueueDeps);
134
+ list(orgId: string, conversationId: string, accountId: string): Promise<{
135
+ items: QueueItem[];
136
+ paused: boolean;
137
+ pauseReason?: QueuePauseReason;
138
+ }>;
139
+ /**
140
+ * Queues a message. `@` resources are read now with the caller's credentials and stored with the
141
+ * item, and uploaded files are bound to the conversation now, so sending later needs nobody's
142
+ * credentials. The same `clientMessageId` again returns the queued item (`created: false`), or,
143
+ * when it was already sent, the sent `user_message` with `item: null`. Then `ensureRun`: on an
144
+ * idle conversation the item goes out at once.
145
+ */
146
+ add(orgId: string, conversationId: string, accountId: string, input: QueueInput): Promise<{
147
+ item: QueueItem | null;
148
+ event?: ConversationEvent;
149
+ created: boolean;
150
+ }>;
151
+ /**
152
+ * Changes a queued item's text (its resources and files stay as queued). A skill invocation's
153
+ * text is its arguments: the skill is rendered again with them now (phase D Task 9).
154
+ */
155
+ edit(orgId: string, conversationId: string, accountId: string, itemId: string, text: string): Promise<QueueItem>;
156
+ remove(orgId: string, conversationId: string, accountId: string, itemId: string): Promise<void>;
157
+ /**
158
+ * Sends a queued item now: it leaves the queue and is posted as a user message in the same
159
+ * transaction (an interjection when a run is active; the items before it keep their place).
160
+ * Racing the dispatcher, exactly one of them takes the item; the loser sees it gone (404).
161
+ */
162
+ sendNow(orgId: string, conversationId: string, accountId: string, itemId: string): Promise<ConversationEvent>;
163
+ /** "Continue sending": clears the pause and lets `ensureRun` send the head item. */
164
+ resume(orgId: string, conversationId: string, accountId: string): Promise<void>;
165
+ /** A queued item or a sent message for this client id (outside any transaction). */
166
+ private prior;
167
+ private lockConversation;
168
+ }
169
+ export {};