@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,9 @@
1
+ import type { KernelConfig } from "./config/schema.js";
2
+ import { type KernelLogger, type LoggerOptions } from "./log.js";
3
+ /**
4
+ * Logger options from the kernel config: the console format, `role` (the process's roles joined
5
+ * by `,`) on every record, and the Loki output when `log.loki.url` is set. `extra` overrides (tests).
6
+ */
7
+ export declare function loggerOptionsFromConfig(config: KernelConfig, extra?: Partial<LoggerOptions>): LoggerOptions;
8
+ /** The process logger as configured by `log.*` and `roles`. */
9
+ export declare function createConfiguredLogger(config: KernelConfig): KernelLogger;
@@ -0,0 +1,27 @@
1
+ import { createLogger } from "./log.js";
2
+ /**
3
+ * Logger options from the kernel config: the console format, `role` (the process's roles joined
4
+ * by `,`) on every record, and the Loki output when `log.loki.url` is set. `extra` overrides (tests).
5
+ */
6
+ export function loggerOptionsFromConfig(config, extra = {}) {
7
+ const role = config.roles.join(",");
8
+ const { url, username, password, labels } = config.log.loki;
9
+ return {
10
+ format: config.log.format,
11
+ base: { role },
12
+ ...(url !== undefined && {
13
+ loki: {
14
+ url,
15
+ labels,
16
+ role,
17
+ ...(username !== undefined && { username }),
18
+ ...(password !== undefined && { password }),
19
+ },
20
+ }),
21
+ ...extra,
22
+ };
23
+ }
24
+ /** The process logger as configured by `log.*` and `roles`. */
25
+ export function createConfiguredLogger(config) {
26
+ return createLogger(config.log.level, loggerOptionsFromConfig(config));
27
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Fields every log record written inside the current async context carries (`reqId` for an HTTP
3
+ * request, `queue` / `jobId` / `runId` for a queue job). Read by the logger's pino mixin; the
4
+ * context is per async call chain, never shared between requests.
5
+ */
6
+ export type LogContext = Readonly<Record<string, string>>;
7
+ /** A source of extra per-record fields, e.g. the active trace / span ids when tracing is on. */
8
+ type ContextSource = () => Record<string, string> | undefined;
9
+ /** The fields of the current context (plus the trace source's), or undefined outside any. */
10
+ export declare function logContext(): LogContext | undefined;
11
+ /**
12
+ * Registers the source of trace fields (`traceId` / `spanId`); set by the tracing bootstrap only
13
+ * when tracing is enabled, so the kernel never imports OpenTelemetry itself.
14
+ */
15
+ export declare function setTraceContextSource(source: ContextSource | undefined): void;
16
+ /** Runs `fn` with `fields` added to the current context (undefined values are skipped). */
17
+ export declare function withLogContext<T>(fields: Record<string, string | undefined>, fn: () => T): T;
18
+ /** The part of a BullMQ job the context reads. */
19
+ export interface ContextJob {
20
+ id?: string | undefined;
21
+ data?: unknown;
22
+ }
23
+ /** Hooks around every queue job (the tracing bootstrap wraps jobs in a span through this). */
24
+ export type JobWrapper = <T>(queue: string, job: ContextJob, fn: () => Promise<T>) => Promise<T>;
25
+ /** Registers a wrapper run around every job processor (tracing); undefined removes it. */
26
+ export declare function setJobWrapper(wrapper: JobWrapper | undefined): void;
27
+ /**
28
+ * Runs a queue job's processor with `queue`, `jobId` and, when the job data has one, `runId` in the
29
+ * log context (and inside the registered job wrapper, if any).
30
+ */
31
+ export declare function withJobContext<T>(queue: string, job: ContextJob, fn: () => Promise<T>): Promise<T>;
32
+ export {};
@@ -0,0 +1,40 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const storage = new AsyncLocalStorage();
3
+ let traceSource;
4
+ /** The fields of the current context (plus the trace source's), or undefined outside any. */
5
+ export function logContext() {
6
+ const own = storage.getStore();
7
+ const trace = traceSource?.();
8
+ if (!trace)
9
+ return own;
10
+ return own ? { ...own, ...trace } : trace;
11
+ }
12
+ /**
13
+ * Registers the source of trace fields (`traceId` / `spanId`); set by the tracing bootstrap only
14
+ * when tracing is enabled, so the kernel never imports OpenTelemetry itself.
15
+ */
16
+ export function setTraceContextSource(source) {
17
+ traceSource = source;
18
+ }
19
+ /** Runs `fn` with `fields` added to the current context (undefined values are skipped). */
20
+ export function withLogContext(fields, fn) {
21
+ const next = { ...storage.getStore() };
22
+ for (const [k, v] of Object.entries(fields))
23
+ if (v !== undefined)
24
+ next[k] = v;
25
+ return storage.run(next, fn);
26
+ }
27
+ let jobWrapper;
28
+ /** Registers a wrapper run around every job processor (tracing); undefined removes it. */
29
+ export function setJobWrapper(wrapper) {
30
+ jobWrapper = wrapper;
31
+ }
32
+ /**
33
+ * Runs a queue job's processor with `queue`, `jobId` and, when the job data has one, `runId` in the
34
+ * log context (and inside the registered job wrapper, if any).
35
+ */
36
+ export function withJobContext(queue, job, fn) {
37
+ const data = job.data;
38
+ const runId = typeof data?.runId === "string" ? data.runId : undefined;
39
+ return withLogContext({ queue, jobId: job.id, runId }, () => jobWrapper ? jobWrapper(queue, job, fn) : fn());
40
+ }
@@ -0,0 +1,34 @@
1
+ /** Loki output of the kernel logger (`log.loki.*`). */
2
+ export interface LokiOptions {
3
+ /** Loki base URL (`http://loki:3100`) or the full push URL (`…/loki/api/v1/push`). */
4
+ url: string;
5
+ username?: string;
6
+ password?: string;
7
+ /** Extra stream labels; `role` and `level` are always the record's own. */
8
+ labels: Record<string, string>;
9
+ /** The `role` label: the process's roles joined by `,`. */
10
+ role: string;
11
+ /** Push interval in ms; default 2000. */
12
+ intervalMs?: number;
13
+ /** Records kept while Loki is slow or down; the oldest are dropped beyond it. Default 10000. */
14
+ maxBuffer?: number;
15
+ /** Where push failures are reported (at most once per minute); default stderr. */
16
+ onError?: (message: string) => void;
17
+ /** Clock for the error rate limit (tests). */
18
+ now?: () => number;
19
+ }
20
+ /** A pino destination that batches records and pushes them to Loki. */
21
+ export interface LokiStream {
22
+ write(line: string): void;
23
+ /** Pushes everything buffered (waits for a push in flight first). Never rejects. */
24
+ flush(): Promise<void>;
25
+ /** Flushes and stops the interval. */
26
+ close(): Promise<void>;
27
+ }
28
+ /**
29
+ * Batches JSON log lines and POSTs them to Loki's push API (JSON body), one stream per level with
30
+ * the labels `{ job: "capybara", ...labels, role, level }`. Pushing never blocks or throws into the
31
+ * caller: a failed push drops its batch and is reported to `onError` at most once per minute; while
32
+ * Loki is down at most `maxBuffer` records are kept. The interval timer is unref'd.
33
+ */
34
+ export declare function createLokiStream(opts: LokiOptions): LokiStream;
@@ -0,0 +1,145 @@
1
+ const PUSH_PATH = "/loki/api/v1/push";
2
+ const PUSH_TIMEOUT_MS = 10_000;
3
+ /** A batch is pushed right away once it reaches this many records. */
4
+ const BATCH_SIZE = 1_000;
5
+ const ERROR_NOTE_INTERVAL_MS = 60_000;
6
+ function pushUrl(url) {
7
+ const u = new URL(url);
8
+ if (!u.pathname.endsWith(PUSH_PATH))
9
+ u.pathname = `${u.pathname.replace(/\/+$/, "")}${PUSH_PATH}`;
10
+ return u;
11
+ }
12
+ /**
13
+ * Batches JSON log lines and POSTs them to Loki's push API (JSON body), one stream per level with
14
+ * the labels `{ job: "capybara", ...labels, role, level }`. Pushing never blocks or throws into the
15
+ * caller: a failed push drops its batch and is reported to `onError` at most once per minute; while
16
+ * Loki is down at most `maxBuffer` records are kept. The interval timer is unref'd.
17
+ */
18
+ export function createLokiStream(opts) {
19
+ const url = pushUrl(opts.url);
20
+ const intervalMs = opts.intervalMs ?? 2_000;
21
+ const maxBuffer = opts.maxBuffer ?? 10_000;
22
+ const now = opts.now ?? Date.now;
23
+ const onError = opts.onError ?? ((m) => void process.stderr.write(`capybara: ${m}\n`));
24
+ // the marker keeps these pushes out of HTTP client traces (apps/capybara tracing.ts)
25
+ const headers = {
26
+ "content-type": "application/json",
27
+ "x-capybara-log-push": "1",
28
+ };
29
+ if (opts.username !== undefined || opts.password !== undefined) {
30
+ const token = Buffer.from(`${opts.username ?? ""}:${opts.password ?? ""}`).toString("base64");
31
+ headers.authorization = `Basic ${token}`;
32
+ }
33
+ const baseLabels = { job: "capybara", ...opts.labels, role: opts.role };
34
+ let buffer = [];
35
+ let dropped = 0;
36
+ let inFlight;
37
+ let timer;
38
+ let lastNote = Number.NEGATIVE_INFINITY;
39
+ let closed = false;
40
+ /** Reports at most once a minute; `message` names the Loki origin only (a URL may carry credentials). */
41
+ const report = (message) => {
42
+ const t = now();
43
+ if (t - lastNote < ERROR_NOTE_INTERVAL_MS)
44
+ return;
45
+ lastNote = t;
46
+ onError(`${message}; further Loki errors are not reported for a minute`);
47
+ };
48
+ const note = (reason) => report(`cannot push logs to Loki at ${url.origin} (${reason}); records are dropped until it recovers`);
49
+ const pushBatch = async (batch, lost) => {
50
+ const streams = new Map();
51
+ for (const e of batch) {
52
+ const values = streams.get(e.level) ?? [];
53
+ values.push([e.ns, e.line]);
54
+ streams.set(e.level, values);
55
+ }
56
+ const body = JSON.stringify({
57
+ streams: [...streams].map(([level, values]) => ({
58
+ stream: { ...baseLabels, level },
59
+ values,
60
+ })),
61
+ });
62
+ try {
63
+ const res = await fetch(url, {
64
+ method: "POST",
65
+ headers,
66
+ body,
67
+ signal: AbortSignal.timeout(PUSH_TIMEOUT_MS),
68
+ });
69
+ await res.body?.cancel();
70
+ if (!res.ok)
71
+ note(`HTTP ${res.status}`);
72
+ else if (lost > 0) {
73
+ report(`${lost} log records for Loki at ${url.origin} were dropped: the buffer was full`);
74
+ }
75
+ }
76
+ catch (e) {
77
+ note(e instanceof Error ? (e.cause instanceof Error ? e.cause.message : e.message) : "error");
78
+ }
79
+ };
80
+ /** Starts a push of the current buffer unless one is in flight. */
81
+ const kick = () => {
82
+ if (inFlight || buffer.length === 0)
83
+ return inFlight ?? Promise.resolve();
84
+ const batch = buffer;
85
+ const lost = dropped;
86
+ buffer = [];
87
+ dropped = 0;
88
+ inFlight = pushBatch(batch, lost).finally(() => {
89
+ inFlight = undefined;
90
+ });
91
+ return inFlight;
92
+ };
93
+ const ensureTimer = () => {
94
+ if (timer || closed)
95
+ return;
96
+ timer = setInterval(() => void kick(), intervalMs);
97
+ timer.unref();
98
+ };
99
+ return {
100
+ write(chunk) {
101
+ for (const line of chunk.split("\n")) {
102
+ if (line === "")
103
+ continue;
104
+ let level = "info";
105
+ let ms = Date.now();
106
+ try {
107
+ const rec = JSON.parse(line);
108
+ if (typeof rec.level === "string")
109
+ level = rec.level;
110
+ if (typeof rec.time === "string") {
111
+ const t = Date.parse(rec.time);
112
+ if (!Number.isNaN(t))
113
+ ms = t;
114
+ }
115
+ }
116
+ catch {
117
+ // not JSON: push it as is
118
+ }
119
+ buffer.push({ level, ns: `${BigInt(ms) * 1000000n}`, line });
120
+ if (buffer.length > maxBuffer) {
121
+ buffer.shift();
122
+ dropped++;
123
+ }
124
+ }
125
+ ensureTimer();
126
+ if (buffer.length >= BATCH_SIZE)
127
+ void kick();
128
+ },
129
+ async flush() {
130
+ while (inFlight || buffer.length > 0) {
131
+ if (inFlight)
132
+ await inFlight;
133
+ else
134
+ await kick();
135
+ }
136
+ },
137
+ async close() {
138
+ closed = true;
139
+ if (timer)
140
+ clearInterval(timer);
141
+ timer = undefined;
142
+ await this.flush();
143
+ },
144
+ };
145
+ }
package/dist/log.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ import type { Logger } from "@capybara-hq/plugin-sdk";
2
+ import { type LokiOptions } from "./log-loki.js";
3
+ /** 日志级别,按严重程度递增。 */
4
+ export declare const LOG_LEVELS: readonly ["debug", "info", "warn", "error"];
5
+ /** 日志级别。 */
6
+ export type LogLevel = (typeof LOG_LEVELS)[number];
7
+ /** 内核 logger:在插件 Logger 之上增加 debug、运行时改级别与登记需打码的密钥值。 */
8
+ export interface KernelLogger extends Logger {
9
+ debug(msg: string, fields?: Record<string, unknown>): void;
10
+ readonly level: LogLevel;
11
+ /** 修改级别;非法级别抛错且保持原级别。 */
12
+ setLevel(level: string): void;
13
+ /**
14
+ * 登记部署方(运维)给的密钥值:内核配置与插件部署级配置里的 secret 字段。此后日志消息与字段里出现这些值都替换为
15
+ * `[REDACTED]`(顶层的 `time` / `level` 不打码)。字符串与数字(转成字符串)登记,布尔不登记;
16
+ * 数组与对象递归展开其中的标量;短于 4 个字符的值不登记(会误伤普通文本)。
17
+ * 数值字段的字符串形式等于已登记值时同样打码。
18
+ */
19
+ addSecrets(values: readonly unknown[]): void;
20
+ /**
21
+ * 登记组织级插件配置里的密钥值(来源是组织管理员,不完全可信):只登记长度 ≥ 12 的值,
22
+ * 放在单独的有界集合里(默认最多 10000 个,满了淘汰最早登记的),防止任一租户用 `info` 这类短值
23
+ * 遮蔽其他租户的日志,也防止集合无限增长;只在字段里打码,不动顶层 `msg`。展开规则同 `addSecrets`。
24
+ */
25
+ addOrgSecrets(values: readonly unknown[]): void;
26
+ /**
27
+ * 按已登记的密钥(部署方与组织来源,同日志字段的规则)给一段文本打码;写到日志之外的地方(如 PG 里给后台看的
28
+ * 报错说明)之前用。
29
+ */
30
+ redact(text: string): string;
31
+ /** Waits until buffered records reached every output (Loki); never rejects. Call before exit. */
32
+ flush(): Promise<void>;
33
+ }
34
+ /**
35
+ * 用与 logger 相同的匹配器打码任意文本(工具结果等不经过日志的内容用):展开规则同 `addOrgSecrets`
36
+ * (URL 形式的值另登记 `user:password@` 片段),只取长度 ≥ `minLength` 的值(默认 12,同组织来源密钥;
37
+ * 不得小于匹配器的分桶前缀长度 4)。没有可用的值时原样返回。
38
+ */
39
+ export declare function createRedactor(values: readonly unknown[], minLength?: number): (s: string) => string;
40
+ /** Console format: `pretty` (pino-pretty, one line per record), `json`, or `auto` (pretty on a TTY). */
41
+ export declare const LOG_FORMATS: readonly ["auto", "pretty", "json"];
42
+ /** Console format. */
43
+ export type LogFormat = (typeof LOG_FORMATS)[number];
44
+ /** A minimal writable the console output goes to (`process.stdout` by default). */
45
+ export interface LogOutput {
46
+ write(chunk: string): unknown;
47
+ }
48
+ /** Options of {@link createLogger}. */
49
+ export interface LoggerOptions {
50
+ /**
51
+ * Receives every record as one JSON line (no trailing newline) instead of the console; the
52
+ * console format is ignored. Used by tests and embedders that collect records themselves.
53
+ */
54
+ write?: (line: string) => void;
55
+ /** Console format; default `auto`. */
56
+ format?: LogFormat;
57
+ /** Console stream; default `process.stdout`. */
58
+ out?: LogOutput;
59
+ /** Whether the console is a terminal (picks `auto` and colors); default `process.stdout.isTTY`. */
60
+ isTTY?: boolean;
61
+ /** Also push every record to Loki. */
62
+ loki?: LokiOptions;
63
+ /** Fields on every record (e.g. `role`); log calls cannot overwrite them. */
64
+ base?: Record<string, string>;
65
+ /** Capacity of the org secret set (tests). */
66
+ orgSecretCapacity?: number;
67
+ /** Called on every matcher rebuild (tests). */
68
+ onMatcherBuild?: () => void;
69
+ }
70
+ /**
71
+ * Creates the kernel logger on pino. Each record is `{ time, level, msg, ...base, ...fields }` with
72
+ * `level` the label and `time` ISO 8601; fields cannot overwrite time / level / msg or the base
73
+ * fields; an Error becomes name / message / stack (and cause). Redaction happens before pino, so
74
+ * every output sees the same redacted record: deployment secrets (`addSecrets`) in msg and every
75
+ * field string, org secrets (`addOrgSecrets`) in fields only; level and time are never redacted.
76
+ * The console gets pino-pretty or JSON lines per `opts.format`; `opts.write` replaces the console
77
+ * with a JSON line sink.
78
+ */
79
+ export declare function createLogger(level?: string, opts?: LoggerOptions): KernelLogger;
package/dist/log.js ADDED
@@ -0,0 +1,303 @@
1
+ import { pino } from "pino";
2
+ import { prettyFactory } from "pino-pretty";
3
+ import { secretScalars } from "./config/fields.js";
4
+ import { logContext } from "./log-context.js";
5
+ import { createLokiStream } from "./log-loki.js";
6
+ /** 日志级别,按严重程度递增。 */
7
+ export const LOG_LEVELS = ["debug", "info", "warn", "error"];
8
+ const LEVELS = LOG_LEVELS;
9
+ const REDACTED = "[REDACTED]";
10
+ const RESERVED = new Set(["time", "level", "msg"]);
11
+ /** 部署方密钥的最短登记长度:过短的值打码会误伤普通文本。 */
12
+ const MIN_SECRET_LEN = 4;
13
+ /** 组织来源密钥的最短登记长度。 */
14
+ const MIN_ORG_SECRET_LEN = 12;
15
+ /** 组织来源密钥集合的默认容量。 */
16
+ const ORG_SECRET_CAPACITY = 10_000;
17
+ /** 匹配器按前缀分桶的前缀长度(不超过两种最短登记长度)。 */
18
+ const PREFIX_LEN = MIN_SECRET_LEN;
19
+ /**
20
+ * 编译后的打码匹配器:按值的前 `PREFIX_LEN` 个字符分桶,桶内按长度降序。扫描字符串时每个位置查一次桶、
21
+ * 记下最长命中的区间,重叠或相邻的区间合并后替换;开销与字符串长度成正比,与登记的密钥数基本无关。
22
+ */
23
+ function compileMatcher(values) {
24
+ const buckets = new Map();
25
+ for (const v of values) {
26
+ const key = v.slice(0, PREFIX_LEN);
27
+ const b = buckets.get(key);
28
+ if (b)
29
+ b.push(v);
30
+ else
31
+ buckets.set(key, [v]);
32
+ }
33
+ if (buckets.size === 0)
34
+ return (s) => s;
35
+ for (const b of buckets.values())
36
+ b.sort((a, c) => c.length - a.length);
37
+ return (s) => {
38
+ if (s.length < PREFIX_LEN)
39
+ return s;
40
+ // 每个位置都记下最长命中的区间 [i, i + len),不跳过(否则先开始的密钥会吞掉与之重叠的后一个密钥的开头,
41
+ // 使后者剩余部分明文输出);重叠或相邻的区间合并后整段替换为一个 [REDACTED]。
42
+ let out = "";
43
+ let last = 0;
44
+ let runStart = -1;
45
+ let runEnd = -1;
46
+ for (let i = 0; i <= s.length - PREFIX_LEN; i++) {
47
+ const b = buckets.get(s.slice(i, i + PREFIX_LEN));
48
+ const hit = b?.find((v) => s.startsWith(v, i));
49
+ if (!hit)
50
+ continue;
51
+ const end = i + hit.length;
52
+ if (runStart >= 0 && i <= runEnd) {
53
+ if (end > runEnd)
54
+ runEnd = end;
55
+ continue;
56
+ }
57
+ if (runStart >= 0) {
58
+ out += s.slice(last, runStart) + REDACTED;
59
+ last = runEnd;
60
+ }
61
+ runStart = i;
62
+ runEnd = end;
63
+ }
64
+ if (runStart < 0)
65
+ return s;
66
+ return out + s.slice(last, runStart) + REDACTED + s.slice(runEnd);
67
+ };
68
+ }
69
+ /**
70
+ * 用与 logger 相同的匹配器打码任意文本(工具结果等不经过日志的内容用):展开规则同 `addOrgSecrets`
71
+ * (URL 形式的值另登记 `user:password@` 片段),只取长度 ≥ `minLength` 的值(默认 12,同组织来源密钥;
72
+ * 不得小于匹配器的分桶前缀长度 4)。没有可用的值时原样返回。
73
+ */
74
+ export function createRedactor(values, minLength = MIN_ORG_SECRET_LEN) {
75
+ const min = Math.max(minLength, PREFIX_LEN);
76
+ const set = new Set();
77
+ for (const v of secretScalars(values)) {
78
+ for (const s of expandSecret(v))
79
+ if (s.length >= min)
80
+ set.add(s);
81
+ }
82
+ return compileMatcher(set);
83
+ }
84
+ function isLevel(v) {
85
+ return LEVELS.includes(v);
86
+ }
87
+ function parseLevel(v) {
88
+ if (!isLevel(v))
89
+ throw new Error(`invalid log level "${v}" (expected ${LEVELS.join(", ")})`);
90
+ return v;
91
+ }
92
+ /**
93
+ * URL 形式的密钥(连接串)另外登记 `user:password@` 片段:同一凭据可能以别的 host / 参数出现。
94
+ * 不单独登记裸密码——开发环境常见「密码 = 用户名 = 库名 = schema 名」,会把正常字段全部打码。
95
+ */
96
+ function expandSecret(value) {
97
+ const out = [value];
98
+ try {
99
+ const u = new URL(value);
100
+ if (u.password)
101
+ out.push(`${u.username}:${u.password}@`);
102
+ }
103
+ catch {
104
+ // 不是 URL
105
+ }
106
+ return out;
107
+ }
108
+ /** Console format: `pretty` (pino-pretty, one line per record), `json`, or `auto` (pretty on a TTY). */
109
+ export const LOG_FORMATS = ["auto", "pretty", "json"];
110
+ /** Fields shown in the pretty prefix instead of the trailing object, in this order. */
111
+ const PREFIX_FIELDS = ["reqId", "traceId", "jobId", "runId", "plugin"];
112
+ /** pino-pretty's message format: `[role] [reqId=…] [plugin=…] msg`, each part only when present. */
113
+ function prettyMessage(log, messageKey) {
114
+ const parts = [];
115
+ if (typeof log.role === "string")
116
+ parts.push(`[${log.role}]`);
117
+ for (const k of PREFIX_FIELDS) {
118
+ const v = log[k];
119
+ if (typeof v === "string" || typeof v === "number")
120
+ parts.push(`[${k}=${v}]`);
121
+ }
122
+ parts.push(String(log[messageKey] ?? ""));
123
+ return parts.join(" ");
124
+ }
125
+ function consoleStream(opts) {
126
+ if (opts.write) {
127
+ const write = opts.write;
128
+ // pino hands each record as one string ending in "\n"
129
+ return { write: (s) => write(s.endsWith("\n") ? s.slice(0, -1) : s) };
130
+ }
131
+ const format = opts.format ?? "auto";
132
+ if (!LOG_FORMATS.includes(format)) {
133
+ throw new Error(`invalid log.format "${format}" (expected ${LOG_FORMATS.join(", ")})`);
134
+ }
135
+ const out = opts.out ?? process.stdout;
136
+ const isTTY = opts.isTTY ?? process.stdout.isTTY === true;
137
+ const pretty = format === "pretty" || (format === "auto" && isTTY);
138
+ if (!pretty)
139
+ return { write: (s) => out.write(s) };
140
+ // In process (no worker thread): pino-pretty formats each line synchronously.
141
+ const format_ = prettyFactory({
142
+ colorize: isTTY,
143
+ colorizeObjects: isTTY,
144
+ singleLine: true,
145
+ // errors stay inside the one-line object instead of a multi-line stack block
146
+ errorLikeObjectKeys: [],
147
+ translateTime: "SYS:HH:MM:ss.l",
148
+ ignore: ["pid", "hostname", "role", "spanId", ...PREFIX_FIELDS].join(","),
149
+ messageFormat: (log, messageKey) => prettyMessage(log, messageKey),
150
+ });
151
+ return { write: (s) => out.write(format_(s)) };
152
+ }
153
+ /**
154
+ * Creates the kernel logger on pino. Each record is `{ time, level, msg, ...base, ...fields }` with
155
+ * `level` the label and `time` ISO 8601; fields cannot overwrite time / level / msg or the base
156
+ * fields; an Error becomes name / message / stack (and cause). Redaction happens before pino, so
157
+ * every output sees the same redacted record: deployment secrets (`addSecrets`) in msg and every
158
+ * field string, org secrets (`addOrgSecrets`) in fields only; level and time are never redacted.
159
+ * The console gets pino-pretty or JSON lines per `opts.format`; `opts.write` replaces the console
160
+ * with a JSON line sink.
161
+ */
162
+ export function createLogger(level = "info", opts = {}) {
163
+ let current = parseLevel(level);
164
+ const base = opts.base ?? {};
165
+ const reserved = new Set([...RESERVED, ...Object.keys(base)]);
166
+ const orgCapacity = opts.orgSecretCapacity ?? ORG_SECRET_CAPACITY;
167
+ /** 部署方密钥(数量由配置决定,不淘汰)。 */
168
+ const secrets = new Set();
169
+ /** 组织来源密钥:Set 保持插入顺序,重复登记时移到末尾,满了从头淘汰(LRU)。 */
170
+ const orgSecrets = new Set();
171
+ /** 字段用:两个集合的并集;任一集合变化后置空,下次打码时重建一次。 */
172
+ let matcher;
173
+ /** 顶层 msg 用:只含部署方密钥;部署方集合变化后置空。 */
174
+ let deployMatcher;
175
+ const redact = (s) => {
176
+ if (!matcher) {
177
+ matcher = compileMatcher(new Set([...secrets, ...orgSecrets]));
178
+ opts.onMatcherBuild?.();
179
+ }
180
+ return matcher(s);
181
+ };
182
+ /** 顶层 msg 只按部署方密钥打码:组织来源的值不能遮蔽日志消息。 */
183
+ const redactMsg = (s) => {
184
+ if (!deployMatcher) {
185
+ deployMatcher = compileMatcher(secrets);
186
+ opts.onMatcherBuild?.();
187
+ }
188
+ return deployMatcher(s);
189
+ };
190
+ const isSecret = (v) => secrets.has(v) || orgSecrets.has(v);
191
+ /** Redacts and serializes the fields to JSON (errors expanded, cycles cut). */
192
+ const serialize = (entry) => {
193
+ const seen = new WeakSet();
194
+ return JSON.stringify(entry, (_key, value) => {
195
+ if (typeof value === "string")
196
+ return redact(value);
197
+ if ((typeof value === "number" || typeof value === "bigint") && isSecret(String(value))) {
198
+ return REDACTED;
199
+ }
200
+ if (value instanceof Error) {
201
+ const e = {
202
+ name: value.name,
203
+ message: value.message,
204
+ stack: value.stack,
205
+ };
206
+ if (value.cause !== undefined)
207
+ e.cause = value.cause;
208
+ return e;
209
+ }
210
+ if (typeof value === "bigint")
211
+ return value.toString();
212
+ if (typeof value === "object" && value !== null) {
213
+ if (seen.has(value))
214
+ return "[Circular]";
215
+ seen.add(value);
216
+ }
217
+ return value;
218
+ });
219
+ };
220
+ const loki = opts.loki ? createLokiStream(opts.loki) : undefined;
221
+ const sink = pino({
222
+ level: "debug",
223
+ base,
224
+ messageKey: "msg",
225
+ timestamp: pino.stdTimeFunctions.isoTime,
226
+ formatters: { level: (label) => ({ level: label }) },
227
+ // request / job / trace fields of the current async context (log-context.ts)
228
+ mixin: () => ({ ...logContext() }),
229
+ // fields arrive already serialized: no pino serializers, no depth or size limits
230
+ serializers: { err: (e) => e },
231
+ depthLimit: Number.MAX_SAFE_INTEGER,
232
+ edgeLimit: Number.MAX_SAFE_INTEGER,
233
+ },
234
+ // level filtering is ours (setLevel); every stream takes everything that got this far
235
+ loki
236
+ ? pino.multistream([
237
+ { level: "debug", stream: consoleStream(opts) },
238
+ { level: "debug", stream: loki },
239
+ ])
240
+ : consoleStream(opts));
241
+ const emit = (lvl, msg, fields) => {
242
+ if (LEVELS.indexOf(lvl) < LEVELS.indexOf(current))
243
+ return;
244
+ const entry = {};
245
+ for (const [k, v] of Object.entries(fields ?? {}))
246
+ if (!reserved.has(k))
247
+ entry[k] = v;
248
+ let obj;
249
+ try {
250
+ obj = JSON.parse(serialize(entry));
251
+ }
252
+ catch {
253
+ obj = { logError: "unserializable fields" };
254
+ }
255
+ sink[lvl](obj, redactMsg(msg));
256
+ };
257
+ return {
258
+ debug: (msg, fields) => emit("debug", msg, fields),
259
+ info: (msg, fields) => emit("info", msg, fields),
260
+ warn: (msg, fields) => emit("warn", msg, fields),
261
+ error: (msg, fields) => emit("error", msg, fields),
262
+ get level() {
263
+ return current;
264
+ },
265
+ redact: (text) => redact(text),
266
+ flush: async () => {
267
+ await loki?.flush();
268
+ },
269
+ setLevel(l) {
270
+ current = parseLevel(l);
271
+ },
272
+ addSecrets(values) {
273
+ for (const v of secretScalars(values)) {
274
+ for (const s of expandSecret(v)) {
275
+ if (s.length >= MIN_SECRET_LEN && !secrets.has(s)) {
276
+ secrets.add(s);
277
+ matcher = undefined;
278
+ deployMatcher = undefined;
279
+ }
280
+ }
281
+ }
282
+ },
283
+ addOrgSecrets(values) {
284
+ for (const v of secretScalars(values)) {
285
+ for (const s of expandSecret(v)) {
286
+ if (s.length < MIN_ORG_SECRET_LEN)
287
+ continue;
288
+ if (orgSecrets.has(s)) {
289
+ // 刷新位置,不改变集合内容,无需重建匹配器
290
+ orgSecrets.delete(s);
291
+ orgSecrets.add(s);
292
+ continue;
293
+ }
294
+ orgSecrets.add(s);
295
+ while (orgSecrets.size > orgCapacity) {
296
+ orgSecrets.delete(orgSecrets.values().next().value);
297
+ }
298
+ matcher = undefined;
299
+ }
300
+ }
301
+ },
302
+ };
303
+ }