@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,63 @@
1
+ /** 不改变形状的包装(剥掉后看内层)。 */
2
+ const WRAPPERS = new Set([
3
+ "optional",
4
+ "nullable",
5
+ "default",
6
+ "prefault",
7
+ "readonly",
8
+ "catch",
9
+ "nonoptional",
10
+ "success",
11
+ ]);
12
+ const defOf = (s) => s._zod.def;
13
+ function unwrap(s, depth) {
14
+ let node = s;
15
+ for (let i = 0; i < 50; i++) {
16
+ const d = defOf(node);
17
+ if (WRAPPERS.has(d.type) && d.innerType)
18
+ node = d.innerType;
19
+ else if (d.type === "pipe" && d.in)
20
+ node = d.in;
21
+ else if (d.type === "lazy" && d.getter && depth < 20)
22
+ node = d.getter();
23
+ else
24
+ return node;
25
+ }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * zod schema(v4)里是否有点路径 `segs` 指向的字段(连接器模板的 `editableEndpoint` 用):对象按 shape(或非 never 的
30
+ * catchall)、记录类型的任意键、union / 交叉的任一分支;包装(optional、default、pipe 的输入端等)剥掉再看。
31
+ * 空路径即 schema 本身,恒为 true。叶子之下还有路径 → false。
32
+ */
33
+ export function schemaHasPath(schema, segs, depth = 0) {
34
+ if (depth > 40)
35
+ return false;
36
+ const node = unwrap(schema, depth);
37
+ if (!node)
38
+ return false;
39
+ if (segs.length === 0)
40
+ return true;
41
+ const [head, ...rest] = segs;
42
+ const d = defOf(node);
43
+ switch (d.type) {
44
+ case "object": {
45
+ const child = d.shape && Object.hasOwn(d.shape, head) ? d.shape[head] : undefined;
46
+ if (child)
47
+ return schemaHasPath(child, rest, depth + 1);
48
+ if (d.catchall && defOf(d.catchall).type !== "never") {
49
+ return schemaHasPath(d.catchall, rest, depth + 1);
50
+ }
51
+ return false;
52
+ }
53
+ case "record":
54
+ return d.valueType ? schemaHasPath(d.valueType, rest, depth + 1) : false;
55
+ case "union":
56
+ return (d.options ?? []).some((o) => schemaHasPath(o, segs, depth + 1));
57
+ case "intersection":
58
+ return ((d.left !== undefined && schemaHasPath(d.left, segs, depth + 1)) ||
59
+ (d.right !== undefined && schemaHasPath(d.right, segs, depth + 1)));
60
+ default:
61
+ return false;
62
+ }
63
+ }
@@ -0,0 +1,59 @@
1
+ import type { Transaction } from "kysely";
2
+ import type { KernelDatabase, KernelDb } from "../db/kernel-schema.js";
3
+ import type { ExtensionHost } from "../extensions/host.js";
4
+ type Trx = Transaction<KernelDatabase>;
5
+ /**
6
+ * Which versions an org may upgrade an installed plugin to (package ecosystem spec §10, Decision
7
+ * 10, Ruling 8):
8
+ * - a plugin with an extension follows the deployment: the only target is the catalog version
9
+ * whose extension package (sha256) is the one installed on the deployment, the newest import on
10
+ * ties (`1.0.0` and `1.0.0+sha256.x` can share an extension version with different bytes); an
11
+ * extension loaded from the startup config (config, no package) is matched by its
12
+ * version;
13
+ * - a purely declarative plugin may move to any other imported version (an older one is a
14
+ * rollback).
15
+ */
16
+ /** The extension the deployment runs for a plugin name. */
17
+ export interface DeployedExtension {
18
+ /** The installed package's sha256 (null for a config extension). */
19
+ sha256: string | null;
20
+ version: string;
21
+ }
22
+ /** A catalog version row as the target rules read it. */
23
+ export interface TargetVersion {
24
+ version: string;
25
+ manifest: unknown;
26
+ extension_sha256: string | null;
27
+ imported_at: Date;
28
+ }
29
+ /**
30
+ * The deployment's extension for plugin `name`: its install record (`extension_installs`, the
31
+ * deployment's desired package; disabled on the deployment counts as none), else the extension
32
+ * this replica loaded from the startup config; undefined when the deployment runs none (then no
33
+ * upgrade target and no "upgrade pending").
34
+ */
35
+ export declare function deployedExtension(db: KernelDb | Trx, host: Pick<ExtensionHost, "manifests">, name: string): Promise<DeployedExtension | undefined>;
36
+ /** Whether catalog version `v` carries the deployment's extension `d`. */
37
+ export declare const runsDeployed: (v: TargetVersion, d: DeployedExtension) => boolean;
38
+ /**
39
+ * The catalog version an org install of an extension-bearing plugin may move to: the one carrying
40
+ * the deployment's extension, the newest import on ties; undefined when none does.
41
+ */
42
+ export declare function deploymentTarget(versions: readonly TargetVersion[], d: DeployedExtension | undefined): TargetVersion | undefined;
43
+ /** What an install view says about upgrades (Decision 10). */
44
+ export interface UpgradeInfo {
45
+ /** The version an upgrade can move to now (the highest allowed target), null when none. */
46
+ upgradeAvailable: string | null;
47
+ /** An extension-bearing plugin whose org version is not the one the deployment runs. */
48
+ deploymentPending: boolean;
49
+ }
50
+ /**
51
+ * The upgrade info of org installs (`itemId`, `name`, `version`), keyed by `itemId@version`; reads
52
+ * the items' catalog versions and the deployment's extensions in a few queries.
53
+ */
54
+ export declare function upgradeInfo(db: KernelDb, host: Pick<ExtensionHost, "manifests">, installs: readonly {
55
+ itemId: string;
56
+ name: string;
57
+ version: string;
58
+ }[]): Promise<Map<string, UpgradeInfo>>;
59
+ export {};
@@ -0,0 +1,90 @@
1
+ import { compareVersions } from "./versions.js";
2
+ /**
3
+ * The deployment's extension for plugin `name`: its install record (`extension_installs`, the
4
+ * deployment's desired package; disabled on the deployment counts as none), else the extension
5
+ * this replica loaded from the startup config; undefined when the deployment runs none (then no
6
+ * upgrade target and no "upgrade pending").
7
+ */
8
+ export async function deployedExtension(db, host, name) {
9
+ const row = await db
10
+ .selectFrom("extension_installs")
11
+ .select(["sha256", "version", "desired_state"])
12
+ .where("name", "=", name)
13
+ .executeTakeFirst();
14
+ if (row) {
15
+ return row.desired_state === "enabled"
16
+ ? { sha256: row.sha256, version: row.version }
17
+ : undefined;
18
+ }
19
+ const loaded = host.manifests().find((m) => m.name === name);
20
+ return loaded ? { sha256: null, version: loaded.version } : undefined;
21
+ }
22
+ const extensionVersionOf = (v) => v.manifest.extension?.manifest.version;
23
+ /** Whether catalog version `v` carries the deployment's extension `d`. */
24
+ export const runsDeployed = (v, d) => d.sha256 !== null
25
+ ? v.extension_sha256 === d.sha256
26
+ : v.manifest.extension !== undefined && extensionVersionOf(v) === d.version;
27
+ /**
28
+ * The catalog version an org install of an extension-bearing plugin may move to: the one carrying
29
+ * the deployment's extension, the newest import on ties; undefined when none does.
30
+ */
31
+ export function deploymentTarget(versions, d) {
32
+ if (d === undefined)
33
+ return undefined;
34
+ let best;
35
+ for (const v of versions) {
36
+ if (!runsDeployed(v, d))
37
+ continue;
38
+ if (best === undefined ||
39
+ v.imported_at.getTime() > best.imported_at.getTime() ||
40
+ (v.imported_at.getTime() === best.imported_at.getTime() && compareVersions(v, best) > 0)) {
41
+ best = v;
42
+ }
43
+ }
44
+ return best;
45
+ }
46
+ /**
47
+ * The upgrade info of org installs (`itemId`, `name`, `version`), keyed by `itemId@version`; reads
48
+ * the items' catalog versions and the deployment's extensions in a few queries.
49
+ */
50
+ export async function upgradeInfo(db, host, installs) {
51
+ const out = new Map();
52
+ if (installs.length === 0)
53
+ return out;
54
+ const rows = await db
55
+ .selectFrom("catalog_item_versions")
56
+ .select(["item_id", "version", "manifest", "extension_sha256", "imported_at"])
57
+ .where("item_id", "in", [...new Set(installs.map((i) => i.itemId))])
58
+ .execute();
59
+ const deployed = new Map();
60
+ for (const i of installs) {
61
+ const versions = rows.filter((r) => r.item_id === i.itemId);
62
+ const current = versions.find((v) => v.version === i.version);
63
+ if (current && current.manifest.extension !== undefined) {
64
+ if (!deployed.has(i.name))
65
+ deployed.set(i.name, await deployedExtension(db, host, i.name));
66
+ const d = deployed.get(i.name);
67
+ const target = deploymentTarget(versions, d);
68
+ out.set(`${i.itemId}@${i.version}`, {
69
+ upgradeAvailable: target && target.version !== i.version ? target.version : null,
70
+ deploymentPending: d !== undefined && !runsDeployed(current, d),
71
+ });
72
+ continue;
73
+ }
74
+ let newest;
75
+ for (const v of versions) {
76
+ if (newest === undefined || compareVersions(v, newest) > 0)
77
+ newest = v;
78
+ }
79
+ const newer = newest !== undefined &&
80
+ newest.version !== i.version &&
81
+ (current === undefined
82
+ ? compareVersions(newest.version, i.version) > 0
83
+ : compareVersions(newest, current) > 0);
84
+ out.set(`${i.itemId}@${i.version}`, {
85
+ upgradeAvailable: newer ? newest.version : null,
86
+ deploymentPending: false,
87
+ });
88
+ }
89
+ return out;
90
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Catalog version order (package ecosystem spec §5.3), shared by every catalog path: semver,
3
+ * ignoring build metadata; two versions that differ only in build metadata (`1.0.0` and
4
+ * `1.0.0+git.abc`, a re-import whose content changed at the same version) are ordered by import
5
+ * time. Range matching ignores build metadata too and includes prereleases (`0.0.0-git.g…`).
6
+ */
7
+ /** A version with its import time (the tie-break between versions equal but for build metadata). */
8
+ export interface ImportedVersion {
9
+ version: string;
10
+ importedAt?: Date | string | null;
11
+ }
12
+ type Versioned = string | ImportedVersion;
13
+ /**
14
+ * Compares two versions: semver without build metadata, then (when both have one) import time.
15
+ * Negative when `a` is older.
16
+ */
17
+ export declare function compareVersions(a: Versioned, b: Versioned): number;
18
+ /** Newest first (for `Array.prototype.sort`). */
19
+ export declare const newestFirst: (a: Versioned, b: Versioned) => number;
20
+ /** The same release: equal once build metadata is dropped (false when either is not semver). */
21
+ export declare const sameRelease: (a: string, b: string) => boolean;
22
+ /** `version` satisfies `range` (build metadata ignored, prereleases included). */
23
+ export declare const satisfiesRange: (version: string, range: string) => boolean;
24
+ /** The newest of `versions` satisfying `range` (see {@link compareVersions}), undefined when none does. */
25
+ export declare function maxSatisfying<T extends Versioned>(versions: readonly T[], range: string): T | undefined;
26
+ /**
27
+ * `version` with build metadata appended (`1.0.0` + `git.abc` -> `1.0.0+git.abc`; a version that
28
+ * already has build metadata gets it extended: `1.0.0+b1` -> `1.0.0+b1.git.abc`).
29
+ */
30
+ export declare const withBuild: (version: string, build: string) => string;
31
+ export {};
@@ -0,0 +1,44 @@
1
+ import semver from "semver";
2
+ const versionOf = (v) => (typeof v === "string" ? v : v.version);
3
+ const timeOf = (v) => {
4
+ if (typeof v === "string" || v.importedAt === undefined || v.importedAt === null) {
5
+ return undefined;
6
+ }
7
+ return new Date(v.importedAt).getTime();
8
+ };
9
+ /**
10
+ * Compares two versions: semver without build metadata, then (when both have one) import time.
11
+ * Negative when `a` is older.
12
+ */
13
+ export function compareVersions(a, b) {
14
+ const c = semver.compare(versionOf(a), versionOf(b));
15
+ if (c !== 0)
16
+ return c;
17
+ const ta = timeOf(a);
18
+ const tb = timeOf(b);
19
+ if (ta === undefined || tb === undefined || ta === tb)
20
+ return 0;
21
+ return ta < tb ? -1 : 1;
22
+ }
23
+ /** Newest first (for `Array.prototype.sort`). */
24
+ export const newestFirst = (a, b) => compareVersions(b, a);
25
+ /** The same release: equal once build metadata is dropped (false when either is not semver). */
26
+ export const sameRelease = (a, b) => semver.valid(a) !== null && semver.valid(b) !== null && semver.compare(a, b) === 0;
27
+ /** `version` satisfies `range` (build metadata ignored, prereleases included). */
28
+ export const satisfiesRange = (version, range) => semver.satisfies(version, range, { includePrerelease: true });
29
+ /** The newest of `versions` satisfying `range` (see {@link compareVersions}), undefined when none does. */
30
+ export function maxSatisfying(versions, range) {
31
+ let best;
32
+ for (const v of versions) {
33
+ if (!satisfiesRange(versionOf(v), range))
34
+ continue;
35
+ if (best === undefined || compareVersions(v, best) > 0)
36
+ best = v;
37
+ }
38
+ return best;
39
+ }
40
+ /**
41
+ * `version` with build metadata appended (`1.0.0` + `git.abc` -> `1.0.0+git.abc`; a version that
42
+ * already has build metadata gets it extended: `1.0.0+b1` -> `1.0.0+b1.git.abc`).
43
+ */
44
+ export const withBuild = (version, build) => version.includes("+") ? `${version}.${build}` : `${version}+${build}`;
@@ -0,0 +1,37 @@
1
+ import type { ChannelCard, InboundEvent, InboundSender } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelDb } from "../db/kernel-schema.js";
3
+ import type { ApprovalsService } from "../tools/approvals.service.js";
4
+ import type { QuestionsService } from "../tools/questions.service.js";
5
+ import type { ChannelConnectionRow, ChannelConnections } from "./connections.service.js";
6
+ import type { ChannelOutboundScheduler } from "./inbound.js";
7
+ import { type ChannelLocale, type ChannelPhrase } from "./phrases.js";
8
+ type CardActionEvent = Extract<InboundEvent, {
9
+ type: "card_action";
10
+ }>;
11
+ /** 入站处理的第 3 步(发言人 → 账号;失败时已回复并返回 undefined),由 ChannelInbound 提供。 */
12
+ export type SpeakerResolver = (connectionId: string, row: ChannelConnectionRow, sender: InboundSender, isGroup: boolean, locale: ChannelLocale, reply: (key: ChannelPhrase, cards?: ChannelCard[]) => Promise<void>) => Promise<{
13
+ accountId: string;
14
+ threadAccount: string | null;
15
+ } | undefined>;
16
+ export interface ChannelCardActionsDeps {
17
+ db: KernelDb;
18
+ connections: Pick<ChannelConnections, "row" | "send">;
19
+ approvals: Pick<ApprovalsService, "decide">;
20
+ questions: Pick<QuestionsService, "answer">;
21
+ outbound: ChannelOutboundScheduler;
22
+ resolveSpeaker: SpeakerResolver;
23
+ }
24
+ /**
25
+ * IM 卡片上的按钮操作(Review Focus 2):点击者按入站同样的规则映射到账号(未绑定 → 私聊回绑定卡片、群里只提示去私聊),
26
+ * 再以该账号调用 `ApprovalsService.decide` / `QuestionsService.answer`——授权完全由它们判定:
27
+ * 不是审批人 / 不是提问发起人 / 不在该组织 → 回一句「你不能处理这条请求」,卡片不变。
28
+ * 成功后卡片由出站投递按 `approval_decided` / `question_answered` 更新;这里再投递一个出站任务,让续跑的输出接着投到 IM。
29
+ * 先核对卡片确实发在点击所在的 chat(否则只回「不能处理」,不解析发言人、不发绑定链接),再按记下的卡片目标
30
+ * (会话类型、chat、话题)解析发言人与回复——事件里的 `chatType` 只是插件的参考值。
31
+ */
32
+ export declare class ChannelCardActions {
33
+ private readonly deps;
34
+ constructor(deps: ChannelCardActionsDeps);
35
+ handle(connectionId: string, e: CardActionEvent): Promise<void>;
36
+ }
37
+ export {};
@@ -0,0 +1,121 @@
1
+ import { ApiError } from "../errors.js";
2
+ import { readOrgSettings } from "../orgs/settings.service.js";
3
+ import { idempotencyKey } from "./outbound.js";
4
+ import { phrase } from "./phrases.js";
5
+ import { findThread, threadKeyOf } from "./threads.js";
6
+ /** 授权 / 状态类失败 → 回给点击者的一句话(不改卡片);其余错误照常抛出。 */
7
+ const REPLY_FOR = {
8
+ "approval.not_found": "cannotHandle",
9
+ "question.not_found": "cannotHandle",
10
+ forbidden: "cannotHandle",
11
+ "approval.already_decided": "alreadyHandled",
12
+ "question.already_answered": "alreadyHandled",
13
+ validation_failed: "invalidAction",
14
+ };
15
+ /**
16
+ * IM 卡片上的按钮操作(Review Focus 2):点击者按入站同样的规则映射到账号(未绑定 → 私聊回绑定卡片、群里只提示去私聊),
17
+ * 再以该账号调用 `ApprovalsService.decide` / `QuestionsService.answer`——授权完全由它们判定:
18
+ * 不是审批人 / 不是提问发起人 / 不在该组织 → 回一句「你不能处理这条请求」,卡片不变。
19
+ * 成功后卡片由出站投递按 `approval_decided` / `question_answered` 更新;这里再投递一个出站任务,让续跑的输出接着投到 IM。
20
+ * 先核对卡片确实发在点击所在的 chat(否则只回「不能处理」,不解析发言人、不发绑定链接),再按记下的卡片目标
21
+ * (会话类型、chat、话题)解析发言人与回复——事件里的 `chatType` 只是插件的参考值。
22
+ */
23
+ export class ChannelCardActions {
24
+ deps;
25
+ constructor(deps) {
26
+ this.deps = deps;
27
+ }
28
+ async handle(connectionId, e) {
29
+ const { connections } = this.deps;
30
+ const row = await connections.row(connectionId);
31
+ // 连接停用、组织已删除或插件在该组织停用(停用广播与长连接断开之间仍可能有事件到达):什么都不做
32
+ if (row?.status !== "active" || !row.pluginEnabled)
33
+ return;
34
+ const { locale } = await readOrgSettings(this.deps.db, row.orgId);
35
+ const a = e.action;
36
+ // Ruling A13:卡片必须是本连接发在这个 chat 里的(防止伪造卡片 id 去处理别处的请求)。
37
+ // A `pending` row counts (T5a): delivery records the card before sending it, so a click that
38
+ // arrives before the send returns is accepted; connection and chat are checked all the same.
39
+ const card = await this.deps.db
40
+ .selectFrom("channel_card_messages")
41
+ .select(["conversation_id", "target"])
42
+ .where("connection_id", "=", connectionId)
43
+ .where("card_kind", "=", a.cardKind)
44
+ .where("card_id", "=", a.cardId)
45
+ .executeTakeFirst();
46
+ const cardTarget = card?.target;
47
+ // 有平台事件 id 时回复带幂等键(任务重试不重复回复);没有时同一张卡片的不同点击无法区分,不带
48
+ const key = e.eventId !== undefined ? idempotencyKey(`${connectionId}-${e.eventId}-reply`) : undefined;
49
+ const replyTo = (t) => async (k, cards) => {
50
+ await connections.send(connectionId, t, { text: phrase(k, locale), ...(cards !== undefined && { cards }) }, key);
51
+ };
52
+ // Ruling A13:卡片必须是本连接发在这个 chat 里的(防止伪造卡片 id 去处理别处的请求)。在解析发言人之前判断:
53
+ // 卡片 id 被转发 / 重放到别的会话时,绝不在那里发绑定链接或绑定任何人——只回一句「不能处理」,并按群处理
54
+ // (插件给的会话类型只是参考,不可信)。
55
+ if (!card || !cardTarget || cardTarget.chatId !== e.target.chatId) {
56
+ await replyTo({
57
+ chatId: e.target.chatId,
58
+ chatType: "group",
59
+ ...(e.target.threadId !== undefined && { threadId: e.target.threadId }),
60
+ })("cannotHandle");
61
+ return;
62
+ }
63
+ // 会话类型、chat 与话题取发出该卡片时记下的目标(Ruling A26:点击拿不到话题时同样用记下的话题)
64
+ const threadId = cardTarget.threadId ?? e.target.threadId;
65
+ const target = cardTarget.chatType === "group"
66
+ ? {
67
+ chatId: cardTarget.chatId,
68
+ chatType: "group",
69
+ ...(threadId !== undefined && { threadId }),
70
+ }
71
+ : { chatId: cardTarget.chatId, chatType: "dm" };
72
+ const reply = replyTo(target);
73
+ const isGroup = target.chatType === "group";
74
+ const who = await this.deps.resolveSpeaker(connectionId, row, e.sender, isGroup, locale, reply);
75
+ if (who === undefined)
76
+ return;
77
+ // 匿名访客共用一个账号:只能处理自己话题里的卡片,且不能留下「本会话 / 以后都允许」的授权
78
+ const anonymous = who.threadAccount === null;
79
+ if (anonymous) {
80
+ const own = await findThread(this.deps.db, {
81
+ connectionId,
82
+ chatId: e.target.chatId,
83
+ // 点击带了话题就按它判断(更严格),否则用卡片记下的话题
84
+ threadKey: threadKeyOf(isGroup && e.target.threadId !== undefined
85
+ ? { ...target, threadId: e.target.threadId }
86
+ : target, e.sender.externalId, e.messageId),
87
+ accountId: null,
88
+ });
89
+ if (own !== card.conversation_id) {
90
+ await reply("cannotHandle");
91
+ return;
92
+ }
93
+ }
94
+ try {
95
+ if (a.cardKind === "approval" && (a.action === "approve" || a.action === "deny")) {
96
+ const scope = anonymous ? "once" : a.scope;
97
+ await this.deps.approvals.decide(row.orgId, a.cardId, who.accountId, {
98
+ decision: a.action,
99
+ ...(scope !== undefined && { scope }),
100
+ });
101
+ }
102
+ else if (a.cardKind === "question" && a.action === "answer") {
103
+ await this.deps.questions.answer(a.cardId, who.accountId, a.answer ?? {}, row.orgId);
104
+ }
105
+ else {
106
+ await reply("invalidAction");
107
+ return;
108
+ }
109
+ }
110
+ catch (err) {
111
+ const key = err instanceof ApiError ? REPLY_FOR[err.code] : undefined;
112
+ if (key === undefined)
113
+ throw err;
114
+ await reply(key);
115
+ return;
116
+ }
117
+ // the delivery of the card's conversation (the thread's): for a sub-agent's card the decided
118
+ // row is the child's, which has no delivery of its own
119
+ await this.deps.outbound.enqueue(card.conversation_id);
120
+ }
121
+ }
@@ -0,0 +1,44 @@
1
+ import type { ChannelCard, FormAnswer, InputForm, OutboundMessage } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelDb } from "../db/kernel-schema.js";
3
+ import type { ApprovalsService } from "../tools/approvals.service.js";
4
+ import { type ChannelLocale } from "./phrases.js";
5
+ /** 审批卡片里工具参数预览的最大长度(字符)。 */
6
+ export declare const INPUT_PREVIEW_MAX = 500;
7
+ /**
8
+ * 看起来是凭据的参数名(按整词判断,避免误伤 `max_tokens` 这类键):其值在 IM 卡片里打码。
9
+ * 工具参数由模型生成,内核没有「本次注入的凭据」可比对(那是工具结果的打码方式,见 tools/redact.ts),
10
+ * 这里按键名兜底,再由调用方按连接密钥的值打码——IM 消息会留在第三方平台上。
11
+ */
12
+ export declare function isSecretKey(key: string): boolean;
13
+ /** 递归复制,键名像凭据的值替换为 `***`。 */
14
+ export declare function maskSecrets(value: unknown): unknown;
15
+ /**
16
+ * 工具参数预览:凭据样式的键打码后序列化为 JSON,再经 `redact`(连接密钥的按值打码)处理,
17
+ * 截断到 {@link INPUT_PREVIEW_MAX} 字符(含省略号)。
18
+ */
19
+ export declare function inputPreview(input: unknown, redact?: (s: string) => string): string;
20
+ /** 去掉末尾斜杠的 `http.publicUrl`;未配置返回 undefined。 */
21
+ export declare function webBase(publicUrl: string | undefined): string | undefined;
22
+ /** 会话的网页链接(与审批详情的 `conversationPath` 一致:`/chat/<id>`,不含语言前缀)。 */
23
+ export declare const conversationUrl: (base: string, conversationId: string) => string;
24
+ /** 个人连接页里某个连接器的位置(与网页 ConnectCard 的链接一致)。 */
25
+ export declare const connectUrl: (base: string, connectorId: string) => string;
26
+ export interface CardDeps {
27
+ db: KernelDb;
28
+ approvals: Pick<ApprovalsService, "describe">;
29
+ }
30
+ /**
31
+ * 审批卡片(按审批的当前状态);审批不存在返回 undefined。按角色升级的审批只能「仅此一次」。
32
+ * `webUrl` = `http.publicUrl` + 会话路径。
33
+ */
34
+ export declare function approvalCard(d: CardDeps, approvalId: string, base: string, locale: ChannelLocale, redact?: (s: string) => string): Promise<Extract<ChannelCard, {
35
+ kind: "approval";
36
+ }> | undefined>;
37
+ /** 答案摘要:每个字段的值(多选用逗号连接),多个字段用分号分隔。 */
38
+ export declare function answerSummary(answer: FormAnswer | null): string | undefined;
39
+ /** 提问卡片。不能在 IM 内作答的表单(`questionRenderableInline` 为 false)由渠道只渲染网页链接。 */
40
+ export declare function questionCard(questionId: string, form: InputForm, state: "pending" | "answered" | "expired" | "cancelled", webUrl: string, answer?: FormAnswer | null): Extract<ChannelCard, {
41
+ kind: "question";
42
+ }>;
43
+ /** 一条只带一张卡片的消息(随附文本为固定话术)。 */
44
+ export declare const cardMessage: (text: string, card: ChannelCard) => OutboundMessage;
@@ -0,0 +1,156 @@
1
+ import { KEY_SEPARATOR } from "../tools/naming.js";
2
+ import { phrase } from "./phrases.js";
3
+ /** 审批卡片里工具参数预览的最大长度(字符)。 */
4
+ export const INPUT_PREVIEW_MAX = 500;
5
+ /** 打码后替换成的文本。 */
6
+ const MASK = "***";
7
+ /** 出现即视为凭据的整词。 */
8
+ const SECRET_WORDS = new Set([
9
+ "password",
10
+ "passwd",
11
+ "passphrase",
12
+ "secret",
13
+ "credential",
14
+ "credentials",
15
+ "cookie",
16
+ "authorization",
17
+ "apikey",
18
+ ]);
19
+ /** 作为最后一个词时视为凭据(`access_token`、`authToken`;`max_tokens`、`token_count` 不算)。 */
20
+ const SECRET_LAST_WORDS = new Set(["token", "secret", "password"]);
21
+ /** 与 `key` / `id` 相邻构成凭据的前一个词(`api_key`、`private-key`、`session_id`)。 */
22
+ const KEY_PREFIXES = new Set(["api", "access", "private", "secret", "signing", "client"]);
23
+ /** 参数名拆成小写单词:驼峰与 `_` `-` `.` 空格都是分隔。 */
24
+ function words(key) {
25
+ return key
26
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
27
+ .toLowerCase()
28
+ .split(/[^a-z0-9]+/)
29
+ .filter((w) => w !== "");
30
+ }
31
+ /**
32
+ * 看起来是凭据的参数名(按整词判断,避免误伤 `max_tokens` 这类键):其值在 IM 卡片里打码。
33
+ * 工具参数由模型生成,内核没有「本次注入的凭据」可比对(那是工具结果的打码方式,见 tools/redact.ts),
34
+ * 这里按键名兜底,再由调用方按连接密钥的值打码——IM 消息会留在第三方平台上。
35
+ */
36
+ export function isSecretKey(key) {
37
+ const ws = words(key);
38
+ const last = ws[ws.length - 1];
39
+ if (ws.some((w) => SECRET_WORDS.has(w)))
40
+ return true;
41
+ if (last !== undefined && SECRET_LAST_WORDS.has(last))
42
+ return true;
43
+ for (let i = 1; i < ws.length; i++) {
44
+ const w = ws[i];
45
+ const prev = ws[i - 1];
46
+ if (w === "key" && KEY_PREFIXES.has(prev))
47
+ return true;
48
+ if (w === "id" && prev === "session")
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ /** 递归复制,键名像凭据的值替换为 `***`。 */
54
+ export function maskSecrets(value) {
55
+ if (Array.isArray(value))
56
+ return value.map(maskSecrets);
57
+ if (typeof value === "object" && value !== null) {
58
+ const out = {};
59
+ for (const [k, v] of Object.entries(value))
60
+ out[k] = isSecretKey(k) ? MASK : maskSecrets(v);
61
+ return out;
62
+ }
63
+ return value;
64
+ }
65
+ /**
66
+ * 工具参数预览:凭据样式的键打码后序列化为 JSON,再经 `redact`(连接密钥的按值打码)处理,
67
+ * 截断到 {@link INPUT_PREVIEW_MAX} 字符(含省略号)。
68
+ */
69
+ export function inputPreview(input, redact = (s) => s) {
70
+ let s;
71
+ try {
72
+ s = redact(JSON.stringify(maskSecrets(input ?? {})) ?? "");
73
+ }
74
+ catch {
75
+ s = "";
76
+ }
77
+ return s.length <= INPUT_PREVIEW_MAX ? s : `${s.slice(0, INPUT_PREVIEW_MAX - 1)}…`;
78
+ }
79
+ /** 去掉末尾斜杠的 `http.publicUrl`;未配置返回 undefined。 */
80
+ export function webBase(publicUrl) {
81
+ return publicUrl ? publicUrl.replace(/\/+$/, "") : undefined;
82
+ }
83
+ /** 会话的网页链接(与审批详情的 `conversationPath` 一致:`/chat/<id>`,不含语言前缀)。 */
84
+ export const conversationUrl = (base, conversationId) => `${base}/chat/${conversationId}`;
85
+ /** 个人连接页里某个连接器的位置(与网页 ConnectCard 的链接一致)。 */
86
+ export const connectUrl = (base, connectorId) => `${base}/settings/connections#connector-${encodeURIComponent(connectorId)}`;
87
+ /** 来源内的工具名:连接器工具去掉 `<slug>__`(审批详情已处理),插件工具去掉 `<插件>__`。 */
88
+ function shortToolName(v) {
89
+ if (v.connector)
90
+ return v.toolName;
91
+ const i = v.toolKey.indexOf(KEY_SEPARATOR);
92
+ return i > 0 ? v.toolKey.slice(i + KEY_SEPARATOR.length) : v.toolKey;
93
+ }
94
+ /** 账号显示名;不存在返回 undefined。 */
95
+ async function displayName(db, accountId) {
96
+ if (accountId === null)
97
+ return undefined;
98
+ const r = await db
99
+ .selectFrom("accounts")
100
+ .select("display_name")
101
+ .where("id", "=", accountId)
102
+ .executeTakeFirst();
103
+ return r?.display_name || undefined;
104
+ }
105
+ /**
106
+ * 审批卡片(按审批的当前状态);审批不存在返回 undefined。按角色升级的审批只能「仅此一次」。
107
+ * `webUrl` = `http.publicUrl` + 会话路径。
108
+ */
109
+ export async function approvalCard(d, approvalId, base, locale, redact) {
110
+ const v = await d.approvals.describe(approvalId);
111
+ if (!v)
112
+ return undefined;
113
+ const decidedBy = await displayName(d.db, v.decidedBy);
114
+ return {
115
+ kind: "approval",
116
+ id: v.id,
117
+ title: phrase("approvalTitle", locale),
118
+ toolName: shortToolName(v),
119
+ ...(v.connector && { appName: v.connector.name }),
120
+ agentName: v.agent.name || "Agent",
121
+ inputPreview: inputPreview(v.input, redact),
122
+ scopes: v.requestedFor === null ? ["once"] : ["once", "session", "always"],
123
+ expiresAt: v.expiresAt,
124
+ state: v.status,
125
+ ...(decidedBy !== undefined && { decidedBy }),
126
+ // a denial's reason, as the web shows it (UI refresh B); redacted like the input
127
+ ...(v.status === "denied" &&
128
+ v.denyReason !== null &&
129
+ v.denyReason !== "" && { denyReason: redact ? redact(v.denyReason) : v.denyReason }),
130
+ webUrl: `${base}${v.conversationPath}`,
131
+ };
132
+ }
133
+ /** 答案摘要:每个字段的值(多选用逗号连接),多个字段用分号分隔。 */
134
+ export function answerSummary(answer) {
135
+ if (answer === null)
136
+ return undefined;
137
+ const parts = Object.values(answer).map((v) => (Array.isArray(v) ? v.join(", ") : String(v)));
138
+ return parts.length === 0 ? undefined : parts.join("; ");
139
+ }
140
+ /** 提问卡片。不能在 IM 内作答的表单(`questionRenderableInline` 为 false)由渠道只渲染网页链接。 */
141
+ export function questionCard(questionId, form, state, webUrl, answer = null) {
142
+ const summary = answerSummary(answer);
143
+ return {
144
+ kind: "question",
145
+ id: questionId,
146
+ form,
147
+ state,
148
+ ...(summary !== undefined && { answerSummary: summary }),
149
+ webUrl,
150
+ };
151
+ }
152
+ /** 一条只带一张卡片的消息(随附文本为固定话术)。 */
153
+ export const cardMessage = (text, card) => ({
154
+ text,
155
+ cards: [card],
156
+ });