@plumbus/core 0.4.2 → 0.6.0

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 (324) hide show
  1. package/README.md +2 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/ai/ai/cost-tracker.d.ts +93 -0
  4. package/dist/ai/ai/derive-ledger-usage.d.ts +10 -0
  5. package/dist/ai/ai/model-pricing.d.ts +51 -0
  6. package/dist/ai/ai/provider.d.ts +214 -0
  7. package/dist/ai/ai/refusal.d.ts +27 -0
  8. package/dist/ai/ai/usage-client.d.ts +30 -0
  9. package/dist/ai/ai-service.d.ts +1 -1
  10. package/dist/ai/ai-service.d.ts.map +1 -1
  11. package/dist/ai/ai-service.js +21 -16
  12. package/dist/ai/ai-service.js.map +1 -1
  13. package/dist/ai/cost-tracker.d.ts +17 -1
  14. package/dist/ai/cost-tracker.d.ts.map +1 -1
  15. package/dist/ai/cost-tracker.js +8 -6
  16. package/dist/ai/cost-tracker.js.map +1 -1
  17. package/dist/ai/derive-ledger-usage.d.ts +11 -0
  18. package/dist/ai/derive-ledger-usage.d.ts.map +1 -0
  19. package/dist/ai/derive-ledger-usage.js +36 -0
  20. package/dist/ai/derive-ledger-usage.js.map +1 -0
  21. package/dist/ai/index.d.ts +1 -0
  22. package/dist/ai/index.d.ts.map +1 -1
  23. package/dist/ai/index.js +1 -0
  24. package/dist/ai/index.js.map +1 -1
  25. package/dist/ai/types/config.d.ts +72 -0
  26. package/dist/ai/types/enums.d.ts +73 -0
  27. package/dist/api/route-generator.d.ts.map +1 -1
  28. package/dist/api/route-generator.js +27 -14
  29. package/dist/api/route-generator.js.map +1 -1
  30. package/dist/cli/cli.d.ts.map +1 -1
  31. package/dist/cli/cli.js +3 -1
  32. package/dist/cli/cli.js.map +1 -1
  33. package/dist/cli/commands/dev.d.ts.map +1 -1
  34. package/dist/cli/commands/dev.js +38 -149
  35. package/dist/cli/commands/dev.js.map +1 -1
  36. package/dist/cli/commands/doctor.d.ts +6 -0
  37. package/dist/cli/commands/doctor.d.ts.map +1 -1
  38. package/dist/cli/commands/doctor.js +92 -4
  39. package/dist/cli/commands/doctor.js.map +1 -1
  40. package/dist/cli/commands/event.d.ts.map +1 -1
  41. package/dist/cli/commands/event.js +3 -0
  42. package/dist/cli/commands/event.js.map +1 -1
  43. package/dist/cli/commands/events-ops.d.ts +4 -0
  44. package/dist/cli/commands/events-ops.d.ts.map +1 -0
  45. package/dist/cli/commands/events-ops.js +203 -0
  46. package/dist/cli/commands/events-ops.js.map +1 -0
  47. package/dist/cli/commands/flow-schedule-list.d.ts +31 -0
  48. package/dist/cli/commands/flow-schedule-list.d.ts.map +1 -0
  49. package/dist/cli/commands/flow-schedule-list.js +93 -0
  50. package/dist/cli/commands/flow-schedule-list.js.map +1 -0
  51. package/dist/cli/commands/flow.d.ts.map +1 -1
  52. package/dist/cli/commands/flow.js +75 -1
  53. package/dist/cli/commands/flow.js.map +1 -1
  54. package/dist/cli/commands/generate.d.ts +4 -0
  55. package/dist/cli/commands/generate.d.ts.map +1 -1
  56. package/dist/cli/commands/generate.js +94 -3
  57. package/dist/cli/commands/generate.js.map +1 -1
  58. package/dist/cli/commands/index.d.ts +2 -0
  59. package/dist/cli/commands/index.d.ts.map +1 -1
  60. package/dist/cli/commands/index.js +2 -0
  61. package/dist/cli/commands/index.js.map +1 -1
  62. package/dist/cli/commands/init.d.ts +1 -1
  63. package/dist/cli/commands/init.d.ts.map +1 -1
  64. package/dist/cli/commands/init.js +55 -4
  65. package/dist/cli/commands/init.js.map +1 -1
  66. package/dist/cli/commands/mcp.d.ts.map +1 -1
  67. package/dist/cli/commands/mcp.js +2 -0
  68. package/dist/cli/commands/mcp.js.map +1 -1
  69. package/dist/cli/commands/start.d.ts +3 -6
  70. package/dist/cli/commands/start.d.ts.map +1 -1
  71. package/dist/cli/commands/start.js +71 -180
  72. package/dist/cli/commands/start.js.map +1 -1
  73. package/dist/cli/commands/verify.d.ts +3 -1
  74. package/dist/cli/commands/verify.d.ts.map +1 -1
  75. package/dist/cli/commands/verify.js +17 -9
  76. package/dist/cli/commands/verify.js.map +1 -1
  77. package/dist/cli/commands/voice.d.ts +12 -0
  78. package/dist/cli/commands/voice.d.ts.map +1 -0
  79. package/dist/cli/commands/voice.js +109 -0
  80. package/dist/cli/commands/voice.js.map +1 -0
  81. package/dist/cli/commands/worker.d.ts +19 -0
  82. package/dist/cli/commands/worker.d.ts.map +1 -0
  83. package/dist/cli/commands/worker.js +234 -0
  84. package/dist/cli/commands/worker.js.map +1 -0
  85. package/dist/cli/mcp-serve-context.d.ts +3 -0
  86. package/dist/cli/mcp-serve-context.d.ts.map +1 -1
  87. package/dist/cli/mcp-serve-context.js +133 -111
  88. package/dist/cli/mcp-serve-context.js.map +1 -1
  89. package/dist/cli/templates/resources.d.ts.map +1 -1
  90. package/dist/cli/templates/resources.js +7 -2
  91. package/dist/cli/templates/resources.js.map +1 -1
  92. package/dist/cli/utils.d.ts +4 -0
  93. package/dist/cli/utils.d.ts.map +1 -1
  94. package/dist/cli/utils.js +9 -0
  95. package/dist/cli/utils.js.map +1 -1
  96. package/dist/cli/voice-agent-bootstrap.d.ts +22 -0
  97. package/dist/cli/voice-agent-bootstrap.d.ts.map +1 -0
  98. package/dist/cli/voice-agent-bootstrap.js +12 -0
  99. package/dist/cli/voice-agent-bootstrap.js.map +1 -0
  100. package/dist/cli/voice-serve-context.d.ts +7 -0
  101. package/dist/cli/voice-serve-context.d.ts.map +1 -0
  102. package/dist/cli/voice-serve-context.js +26 -0
  103. package/dist/cli/voice-serve-context.js.map +1 -0
  104. package/dist/data/drift-inspector.d.ts +2 -2
  105. package/dist/data/drift-inspector.d.ts.map +1 -1
  106. package/dist/data/drift-inspector.js +2 -1
  107. package/dist/data/drift-inspector.js.map +1 -1
  108. package/dist/data/migration.d.ts.map +1 -1
  109. package/dist/data/migration.js +2 -0
  110. package/dist/data/migration.js.map +1 -1
  111. package/dist/define/defineCapability.d.ts +5 -0
  112. package/dist/define/defineCapability.d.ts.map +1 -1
  113. package/dist/define/defineCapability.js +23 -0
  114. package/dist/define/defineCapability.js.map +1 -1
  115. package/dist/errors/http.d.ts.map +1 -1
  116. package/dist/errors/http.js +1 -0
  117. package/dist/errors/http.js.map +1 -1
  118. package/dist/errors/index.d.ts.map +1 -1
  119. package/dist/errors/index.js +1 -0
  120. package/dist/errors/index.js.map +1 -1
  121. package/dist/events/dispatcher.d.ts +4 -0
  122. package/dist/events/dispatcher.d.ts.map +1 -1
  123. package/dist/events/dispatcher.js +24 -1
  124. package/dist/events/dispatcher.js.map +1 -1
  125. package/dist/events/emitter.d.ts +2 -0
  126. package/dist/events/emitter.d.ts.map +1 -1
  127. package/dist/events/emitter.js +6 -3
  128. package/dist/events/emitter.js.map +1 -1
  129. package/dist/events/queue-adapter.d.ts +7 -0
  130. package/dist/events/queue-adapter.d.ts.map +1 -0
  131. package/dist/events/queue-adapter.js +4 -0
  132. package/dist/events/queue-adapter.js.map +1 -0
  133. package/dist/events/queue.d.ts +16 -13
  134. package/dist/events/queue.d.ts.map +1 -1
  135. package/dist/events/queue.js +79 -22
  136. package/dist/events/queue.js.map +1 -1
  137. package/dist/events/worker.d.ts +4 -0
  138. package/dist/events/worker.d.ts.map +1 -1
  139. package/dist/events/worker.js +47 -1
  140. package/dist/events/worker.js.map +1 -1
  141. package/dist/execution/canonical-name.d.ts +13 -0
  142. package/dist/execution/canonical-name.d.ts.map +1 -0
  143. package/dist/execution/canonical-name.js +17 -0
  144. package/dist/execution/canonical-name.js.map +1 -0
  145. package/dist/execution/capability-executor.d.ts +1 -1
  146. package/dist/execution/capability-executor.d.ts.map +1 -1
  147. package/dist/execution/capability-executor.js +52 -24
  148. package/dist/execution/capability-executor.js.map +1 -1
  149. package/dist/execution/capability-invocation.d.ts +34 -0
  150. package/dist/execution/capability-invocation.d.ts.map +1 -0
  151. package/dist/execution/capability-invocation.js +138 -0
  152. package/dist/execution/capability-invocation.js.map +1 -0
  153. package/dist/execution/capability-registry.d.ts +6 -4
  154. package/dist/execution/capability-registry.d.ts.map +1 -1
  155. package/dist/execution/capability-registry.js +13 -7
  156. package/dist/execution/capability-registry.js.map +1 -1
  157. package/dist/execution/context-factory.d.ts.map +1 -1
  158. package/dist/execution/context-factory.js +18 -1
  159. package/dist/execution/context-factory.js.map +1 -1
  160. package/dist/execution/index.d.ts +4 -0
  161. package/dist/execution/index.d.ts.map +1 -1
  162. package/dist/execution/index.js +2 -0
  163. package/dist/execution/index.js.map +1 -1
  164. package/dist/execution/invocation-emit-scope.d.ts +11 -0
  165. package/dist/execution/invocation-emit-scope.d.ts.map +1 -0
  166. package/dist/execution/invocation-emit-scope.js +8 -0
  167. package/dist/execution/invocation-emit-scope.js.map +1 -0
  168. package/dist/flows/engine.d.ts +7 -1
  169. package/dist/flows/engine.d.ts.map +1 -1
  170. package/dist/flows/engine.js +75 -10
  171. package/dist/flows/engine.js.map +1 -1
  172. package/dist/flows/flow-delayed.d.ts +34 -0
  173. package/dist/flows/flow-delayed.d.ts.map +1 -0
  174. package/dist/flows/flow-delayed.js +60 -0
  175. package/dist/flows/flow-delayed.js.map +1 -0
  176. package/dist/flows/flow-queue.d.ts +10 -0
  177. package/dist/flows/flow-queue.d.ts.map +1 -0
  178. package/dist/flows/flow-queue.js +25 -0
  179. package/dist/flows/flow-queue.js.map +1 -0
  180. package/dist/flows/scheduler.d.ts +0 -12
  181. package/dist/flows/scheduler.d.ts.map +1 -1
  182. package/dist/flows/scheduler.js +15 -0
  183. package/dist/flows/scheduler.js.map +1 -1
  184. package/dist/flows/schema.d.ts +17 -0
  185. package/dist/flows/schema.d.ts.map +1 -1
  186. package/dist/flows/schema.js +2 -0
  187. package/dist/flows/schema.js.map +1 -1
  188. package/dist/flows/step-consumer.d.ts +24 -0
  189. package/dist/flows/step-consumer.d.ts.map +1 -0
  190. package/dist/flows/step-consumer.js +72 -0
  191. package/dist/flows/step-consumer.js.map +1 -0
  192. package/dist/flows/triggers.d.ts +1 -1
  193. package/dist/flows/triggers.d.ts.map +1 -1
  194. package/dist/flows/triggers.js +5 -7
  195. package/dist/flows/triggers.js.map +1 -1
  196. package/dist/governance/capability-source-scan.d.ts +7 -0
  197. package/dist/governance/capability-source-scan.d.ts.map +1 -0
  198. package/dist/governance/capability-source-scan.js +80 -0
  199. package/dist/governance/capability-source-scan.js.map +1 -0
  200. package/dist/governance/rules/architecture.d.ts.map +1 -1
  201. package/dist/governance/rules/architecture.js +2 -0
  202. package/dist/governance/rules/architecture.js.map +1 -1
  203. package/dist/governance/rules/capability-dependencies.d.ts +8 -0
  204. package/dist/governance/rules/capability-dependencies.d.ts.map +1 -0
  205. package/dist/governance/rules/capability-dependencies.js +195 -0
  206. package/dist/governance/rules/capability-dependencies.js.map +1 -0
  207. package/dist/governance/rules/index.d.ts +2 -0
  208. package/dist/governance/rules/index.d.ts.map +1 -1
  209. package/dist/governance/rules/index.js +2 -0
  210. package/dist/governance/rules/index.js.map +1 -1
  211. package/dist/governance/rules/worker.d.ts +9 -0
  212. package/dist/governance/rules/worker.d.ts.map +1 -0
  213. package/dist/governance/rules/worker.js +89 -0
  214. package/dist/governance/rules/worker.js.map +1 -0
  215. package/dist/index.d.ts +8 -3
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +4 -2
  218. package/dist/index.js.map +1 -1
  219. package/dist/jobs/dispatch.d.ts +18 -0
  220. package/dist/jobs/dispatch.d.ts.map +1 -0
  221. package/dist/jobs/dispatch.js +50 -0
  222. package/dist/jobs/dispatch.js.map +1 -0
  223. package/dist/jobs/index.d.ts +9 -0
  224. package/dist/jobs/index.d.ts.map +1 -0
  225. package/dist/jobs/index.js +8 -0
  226. package/dist/jobs/index.js.map +1 -0
  227. package/dist/jobs/routes.d.ts +10 -0
  228. package/dist/jobs/routes.d.ts.map +1 -0
  229. package/dist/jobs/routes.js +44 -0
  230. package/dist/jobs/routes.js.map +1 -0
  231. package/dist/jobs/schema.d.ts +264 -0
  232. package/dist/jobs/schema.d.ts.map +1 -0
  233. package/dist/jobs/schema.js +34 -0
  234. package/dist/jobs/schema.js.map +1 -0
  235. package/dist/jobs/service.d.ts +52 -0
  236. package/dist/jobs/service.d.ts.map +1 -0
  237. package/dist/jobs/service.js +168 -0
  238. package/dist/jobs/service.js.map +1 -0
  239. package/dist/jobs/types.d.ts +30 -0
  240. package/dist/jobs/types.d.ts.map +1 -0
  241. package/dist/jobs/types.js +4 -0
  242. package/dist/jobs/types.js.map +1 -0
  243. package/dist/mcp/manifest-generator.d.ts.map +1 -1
  244. package/dist/mcp/manifest-generator.js +3 -2
  245. package/dist/mcp/manifest-generator.js.map +1 -1
  246. package/dist/observability/metrics.d.ts +9 -1
  247. package/dist/observability/metrics.d.ts.map +1 -1
  248. package/dist/observability/metrics.js +28 -1
  249. package/dist/observability/metrics.js.map +1 -1
  250. package/dist/runtime/bootstrap.d.ts +51 -0
  251. package/dist/runtime/bootstrap.d.ts.map +1 -0
  252. package/dist/runtime/bootstrap.js +140 -0
  253. package/dist/runtime/bootstrap.js.map +1 -0
  254. package/dist/runtime/index.d.ts +7 -0
  255. package/dist/runtime/index.d.ts.map +1 -0
  256. package/dist/runtime/index.js +6 -0
  257. package/dist/runtime/index.js.map +1 -0
  258. package/dist/runtime/load-extensions.d.ts +4 -0
  259. package/dist/runtime/load-extensions.d.ts.map +1 -0
  260. package/dist/runtime/load-extensions.js +41 -0
  261. package/dist/runtime/load-extensions.js.map +1 -0
  262. package/dist/runtime/queue-factory.d.ts +44 -0
  263. package/dist/runtime/queue-factory.d.ts.map +1 -0
  264. package/dist/runtime/queue-factory.js +156 -0
  265. package/dist/runtime/queue-factory.js.map +1 -0
  266. package/dist/runtime/register-consumers.d.ts +29 -0
  267. package/dist/runtime/register-consumers.d.ts.map +1 -0
  268. package/dist/runtime/register-consumers.js +233 -0
  269. package/dist/runtime/register-consumers.js.map +1 -0
  270. package/dist/runtime/start-worker-pool.d.ts +32 -0
  271. package/dist/runtime/start-worker-pool.d.ts.map +1 -0
  272. package/dist/runtime/start-worker-pool.js +91 -0
  273. package/dist/runtime/start-worker-pool.js.map +1 -0
  274. package/dist/runtime/worker-health.d.ts +19 -0
  275. package/dist/runtime/worker-health.d.ts.map +1 -0
  276. package/dist/runtime/worker-health.js +41 -0
  277. package/dist/runtime/worker-health.js.map +1 -0
  278. package/dist/server/bootstrap.d.ts +6 -0
  279. package/dist/server/bootstrap.d.ts.map +1 -1
  280. package/dist/server/bootstrap.js +24 -1
  281. package/dist/server/bootstrap.js.map +1 -1
  282. package/dist/testing/context.d.ts +3 -0
  283. package/dist/testing/context.d.ts.map +1 -1
  284. package/dist/testing/context.js +12 -0
  285. package/dist/testing/context.js.map +1 -1
  286. package/dist/testing/e2e.d.ts +6 -0
  287. package/dist/testing/e2e.d.ts.map +1 -1
  288. package/dist/testing/e2e.js +2 -0
  289. package/dist/testing/e2e.js.map +1 -1
  290. package/dist/testing/simulate-flow.d.ts.map +1 -1
  291. package/dist/testing/simulate-flow.js +10 -0
  292. package/dist/testing/simulate-flow.js.map +1 -1
  293. package/dist/types/capability.d.ts +8 -0
  294. package/dist/types/capability.d.ts.map +1 -1
  295. package/dist/types/capability.js.map +1 -1
  296. package/dist/types/config.d.ts +2 -0
  297. package/dist/types/config.d.ts.map +1 -1
  298. package/dist/types/context.d.ts +49 -1
  299. package/dist/types/context.d.ts.map +1 -1
  300. package/dist/types/enums.d.ts +1 -0
  301. package/dist/types/enums.d.ts.map +1 -1
  302. package/dist/types/enums.js +1 -0
  303. package/dist/types/enums.js.map +1 -1
  304. package/dist/types/errors.d.ts +1 -0
  305. package/dist/types/errors.d.ts.map +1 -1
  306. package/dist/types/event.d.ts +10 -0
  307. package/dist/types/event.d.ts.map +1 -1
  308. package/dist/types/event.js +5 -1
  309. package/dist/types/event.js.map +1 -1
  310. package/dist/worker/bootstrap.d.ts +32 -1
  311. package/dist/worker/bootstrap.d.ts.map +1 -1
  312. package/dist/worker/bootstrap.js +166 -2
  313. package/dist/worker/bootstrap.js.map +1 -1
  314. package/instructions/capabilities.md +36 -1
  315. package/instructions/deployment.md +96 -11
  316. package/instructions/events.md +11 -0
  317. package/instructions/flows.md +12 -4
  318. package/instructions/governance.md +6 -0
  319. package/instructions/mcp.md +1 -1
  320. package/instructions/patterns.md +1 -0
  321. package/instructions/security.md +9 -0
  322. package/instructions/testing.md +12 -1
  323. package/instructions/upgrading-0.5-capabilities.md +181 -0
  324. package/package.json +16 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,2BAA2B,EAC3B,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,YAAY,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // ── Runtime Module ──
2
+ // Shared bootstrap, queue resolution, and consumer registration for CLI entry points.
3
+ export { RuntimeRole, buildStepDeps, buildWorkerAiService, discoverRuntimeResources, needsJobQueuePublish, needsWorkerPool, resolveRuntimeRole, shouldStartApiServer, shouldStartWorkerPool, } from './bootstrap.js';
4
+ export { QueueBackend, resolveRuntimeQueues, shouldUseRedisBackend, tryCreateRedisClient, } from './queue-factory.js';
5
+ export { registerCapabilityConsumers } from './register-consumers.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,sFAAsF;AAEtF,OAAO,EACL,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ServerExtensions } from './bootstrap.js';
2
+ /** Load optional hooks from app/server.ts or app/server.js. */
3
+ export declare function loadServerExtensions(cwd?: string): Promise<ServerExtensions>;
4
+ //# sourceMappingURL=load-extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-extensions.d.ts","sourceRoot":"","sources":["../../src/runtime/load-extensions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,+DAA+D;AAC/D,wBAAsB,oBAAoB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCzF"}
@@ -0,0 +1,41 @@
1
+ import * as fs from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import * as path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ /** Load optional hooks from app/server.ts or app/server.js. */
6
+ export async function loadServerExtensions(cwd = process.cwd()) {
7
+ let unregisterTsx;
8
+ try {
9
+ const req = createRequire(import.meta.url);
10
+ const tsxPath = req.resolve('tsx/esm/api');
11
+ const tsx = await import(pathToFileURL(tsxPath).href);
12
+ unregisterTsx = tsx.register();
13
+ }
14
+ catch {
15
+ // tsx not available
16
+ }
17
+ const extensions = {};
18
+ for (const ext of ['app/server.ts', 'app/server.js']) {
19
+ const extPath = path.resolve(cwd, ext);
20
+ if (!fs.existsSync(extPath))
21
+ continue;
22
+ try {
23
+ const mod = await import(pathToFileURL(extPath).href);
24
+ extensions.onRoutesRegistered = mod.onRoutesRegistered ?? mod.default?.onRoutesRegistered;
25
+ extensions.resolveAiOverrides = mod.resolveAiOverrides ?? mod.default?.resolveAiOverrides;
26
+ extensions.onCapabilityError = mod.onCapabilityError ?? mod.default?.onCapabilityError;
27
+ extensions.onProcessError = mod.onProcessError ?? mod.default?.onProcessError;
28
+ extensions.onAICostRecorded = mod.onAICostRecorded ?? mod.default?.onAICostRecorded;
29
+ extensions.enableStrictStructuredOutputs =
30
+ mod.enableStrictStructuredOutputs ?? mod.default?.enableStrictStructuredOutputs;
31
+ extensions.onFlowError = mod.onFlowError ?? mod.default?.onFlowError;
32
+ }
33
+ catch {
34
+ // caller may log
35
+ }
36
+ break;
37
+ }
38
+ unregisterTsx?.();
39
+ return extensions;
40
+ }
41
+ //# sourceMappingURL=load-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-extensions.js","sourceRoot":"","sources":["../../src/runtime/load-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5D,IAAI,aAAuC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACtD,aAAa,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,UAAU,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC;YAC1F,UAAU,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC;YAC1F,UAAU,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC;YACvF,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC;YAC9E,UAAU,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC;YACpF,UAAU,CAAC,6BAA6B;gBACtC,GAAG,CAAC,6BAA6B,IAAI,GAAG,CAAC,OAAO,EAAE,6BAA6B,CAAC;YAClF,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,MAAM;IACR,CAAC;IAED,aAAa,EAAE,EAAE,CAAC;IAClB,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { EventQueue } from '../events/queue.js';
2
+ import { type RedisClient } from '../events/queue.js';
3
+ import type { PlumbusConfig, QueueConfig } from '../types/config.js';
4
+ export declare const QueueBackend: {
5
+ readonly Memory: "memory";
6
+ readonly Redis: "redis";
7
+ };
8
+ export type QueueBackend = (typeof QueueBackend)[keyof typeof QueueBackend];
9
+ export interface RuntimeQueues {
10
+ events: EventQueue;
11
+ flows: EventQueue;
12
+ jobs: EventQueue;
13
+ backend: QueueBackend;
14
+ /** True when using a durable external broker (Redis), not in-memory. */
15
+ isDurable: boolean;
16
+ /** Flows queue Redis prefix (durable backend only). */
17
+ flowsPrefix?: string;
18
+ /** Shared Redis client (durable backend only). */
19
+ redisClient?: import('../events/queue.js').RedisClient;
20
+ /** Best-effort queue depths (Redis only). */
21
+ getDepths?: () => Promise<{
22
+ events: number;
23
+ flows: number;
24
+ jobs: number;
25
+ }>;
26
+ /** Ping Redis when durable (for /ready probes). */
27
+ pingRedis?: () => Promise<void>;
28
+ close(): Promise<void>;
29
+ }
30
+ export interface ResolveRuntimeQueuesOptions {
31
+ /** Force in-memory even when Redis is configured (dev default). */
32
+ preferInMemory?: boolean;
33
+ onWarning?: (message: string) => void;
34
+ }
35
+ /** Whether Redis should be used based on config and environment. */
36
+ export declare function shouldUseRedisBackend(config: PlumbusConfig, env?: Record<string, string | undefined>): boolean;
37
+ /** Lazy-load redis package; returns null when not installed. */
38
+ export declare function tryCreateRedisClient(queueConfig: QueueConfig, env?: Record<string, string | undefined>): Promise<RedisClient | null>;
39
+ /**
40
+ * Resolve the three runtime queues (events, flows, jobs).
41
+ * Default: in-memory (backward compatible). Redis when configured and available.
42
+ */
43
+ export declare function resolveRuntimeQueues(config: PlumbusConfig, options?: ResolveRuntimeQueuesOptions): Promise<RuntimeQueues>;
44
+ //# sourceMappingURL=queue-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-factory.d.ts","sourceRoot":"","sources":["../../src/runtime/queue-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAErE,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,oBAAoB,EAAE,WAAW,CAAC;IACvD,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAaD,oEAAoE;AACpE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAST;AAED,gEAAgE;AAChE,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,WAAW,EACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0E7B;AAkBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,aAAa,CAAC,CAuExB"}
@@ -0,0 +1,156 @@
1
+ // ── Runtime Queue Factory ──
2
+ // Resolves events/flows/jobs queues with in-memory (default) or Redis backends.
3
+ import { createInMemoryQueue, createRedisQueue } from '../events/queue.js';
4
+ export const QueueBackend = {
5
+ Memory: 'memory',
6
+ Redis: 'redis',
7
+ };
8
+ function queueUrlFromEnv(env) {
9
+ return env.QUEUE_URL ?? env.REDIS_URL;
10
+ }
11
+ function explicitBackend(env) {
12
+ const raw = env.QUEUE_BACKEND?.toLowerCase();
13
+ if (raw === 'memory')
14
+ return QueueBackend.Memory;
15
+ if (raw === 'redis')
16
+ return QueueBackend.Redis;
17
+ return undefined;
18
+ }
19
+ /** Whether Redis should be used based on config and environment. */
20
+ export function shouldUseRedisBackend(config, env = process.env) {
21
+ const forced = explicitBackend(env);
22
+ if (forced === QueueBackend.Memory)
23
+ return false;
24
+ if (forced === QueueBackend.Redis)
25
+ return true;
26
+ if (queueUrlFromEnv(env))
27
+ return true;
28
+ // Auto-detect: non-default Redis host/port or explicit password implies intent
29
+ const host = config.queue.host;
30
+ const hasNonDefaultHost = host !== 'localhost' && host !== '127.0.0.1';
31
+ return hasNonDefaultHost || config.queue.password !== undefined;
32
+ }
33
+ /** Lazy-load redis package; returns null when not installed. */
34
+ export async function tryCreateRedisClient(queueConfig, env = process.env) {
35
+ try {
36
+ const redisMod = (await import('redis'));
37
+ const url = queueUrlFromEnv(env);
38
+ const client = url
39
+ ? redisMod.createClient({ url })
40
+ : redisMod.createClient({
41
+ socket: { host: queueConfig.host, port: queueConfig.port },
42
+ password: queueConfig.password,
43
+ });
44
+ await client.connect();
45
+ return {
46
+ lpush: (key, ...values) => client.lPush(key, ...values),
47
+ rpoplpush: (source, dest) => client.rPopLPush(source, dest),
48
+ lrem: (key, count, value) => client.lRem(key, count, value),
49
+ lrange: (key, start, stop) => client.lRange(key, start, stop),
50
+ llen: (key) => (client.lLen ? client.lLen(key) : Promise.resolve(0)),
51
+ zadd: (key, score, member) => client.zAdd
52
+ ? client.zAdd(key, [{ score, value: member }])
53
+ : Promise.reject(new Error('Redis client does not support ZADD')),
54
+ zrangebyscore: (key, min, max, options) => {
55
+ if (!client.zRangeByScore) {
56
+ return Promise.reject(new Error('Redis client does not support ZRANGEBYSCORE'));
57
+ }
58
+ const limit = options?.limit;
59
+ return client.zRangeByScore(key, min, max, limit != null ? { LIMIT: { offset: 0, count: limit } } : undefined);
60
+ },
61
+ zrem: (key, member) => client.zRem
62
+ ? client.zRem(key, member)
63
+ : Promise.reject(new Error('Redis client does not support ZREM')),
64
+ ping: () => (client.ping ? client.ping() : Promise.resolve('PONG')),
65
+ eval: (script, options) => client.eval
66
+ ? client.eval(script, { keys: options.keys, arguments: options.arguments })
67
+ : Promise.resolve(null),
68
+ quit: () => client.quit(),
69
+ };
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ function memoryQueues() {
76
+ const events = createInMemoryQueue();
77
+ const flows = createInMemoryQueue();
78
+ const jobs = createInMemoryQueue();
79
+ return {
80
+ events,
81
+ flows,
82
+ jobs,
83
+ backend: QueueBackend.Memory,
84
+ isDurable: false,
85
+ async close() {
86
+ await Promise.all([events.close(), flows.close(), jobs.close()]);
87
+ },
88
+ };
89
+ }
90
+ /**
91
+ * Resolve the three runtime queues (events, flows, jobs).
92
+ * Default: in-memory (backward compatible). Redis when configured and available.
93
+ */
94
+ export async function resolveRuntimeQueues(config, options) {
95
+ const env = process.env;
96
+ const warn = options?.onWarning ?? (() => { });
97
+ if (options?.preferInMemory || explicitBackend(env) === QueueBackend.Memory) {
98
+ return memoryQueues();
99
+ }
100
+ const wantsRedis = shouldUseRedisBackend(config, env);
101
+ if (!wantsRedis) {
102
+ if (config.environment === 'production' || config.environment === 'staging') {
103
+ warn('In-memory queue is active (single-instance only). Configure Redis (QUEUE_URL or REDIS_HOST) for multi-replica deployments.');
104
+ }
105
+ return memoryQueues();
106
+ }
107
+ const redisClient = await tryCreateRedisClient(config.queue, env);
108
+ if (!redisClient) {
109
+ warn('Redis queue requested but the "redis" package is not installed. Falling back to in-memory queue. Run: pnpm add redis');
110
+ return memoryQueues();
111
+ }
112
+ const client = redisClient;
113
+ const basePrefix = config.queue.prefix ?? `plumbus:${config.environment}`;
114
+ const queueOpts = {
115
+ visibilityTimeoutSec: config.queue.visibilityTimeoutSec,
116
+ ownsClient: false,
117
+ };
118
+ const eventsPrefix = `${basePrefix}:events`;
119
+ const flowsPrefix = `${basePrefix}:flows`;
120
+ const jobsPrefix = `${basePrefix}:jobs`;
121
+ const events = createRedisQueue(client, { prefix: eventsPrefix, ...queueOpts });
122
+ const flows = createRedisQueue(client, { prefix: flowsPrefix, ...queueOpts });
123
+ const jobs = createRedisQueue(client, { prefix: jobsPrefix, ...queueOpts });
124
+ async function depthFor(prefix) {
125
+ if (!client.llen)
126
+ return 0;
127
+ const pending = await client.llen(`${prefix}:pending`);
128
+ const processing = await client.llen(`${prefix}:processing`);
129
+ return pending + processing;
130
+ }
131
+ return {
132
+ events,
133
+ flows,
134
+ jobs,
135
+ backend: QueueBackend.Redis,
136
+ isDurable: true,
137
+ flowsPrefix,
138
+ redisClient: client,
139
+ async getDepths() {
140
+ const [eventsDepth, flowsDepth, jobsDepth] = await Promise.all([
141
+ depthFor(eventsPrefix),
142
+ depthFor(flowsPrefix),
143
+ depthFor(jobsPrefix),
144
+ ]);
145
+ return { events: eventsDepth, flows: flowsDepth, jobs: jobsDepth };
146
+ },
147
+ async pingRedis() {
148
+ await client.ping?.();
149
+ },
150
+ async close() {
151
+ await Promise.all([events.close(), flows.close(), jobs.close()]);
152
+ await client.quit();
153
+ },
154
+ };
155
+ }
156
+ //# sourceMappingURL=queue-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-factory.js","sourceRoot":"","sources":["../../src/runtime/queue-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
2
+ import type { ConsumerRegistry } from '../events/consumer-registry.js';
3
+ import type { EventRegistry } from '../events/registry.js';
4
+ import type { CapabilityRegistry } from '../execution/capability-registry.js';
5
+ import type { createFlowEngine } from '../flows/engine.js';
6
+ import type { EntityRegistry } from '../data/registry.js';
7
+ import type { PlumbusConfig } from '../types/config.js';
8
+ import type { AIService, LoggerService } from '../types/context.js';
9
+ import type { PlumbusMetrics } from '../observability/metrics.js';
10
+ export interface RegisterCapabilityConsumersOptions {
11
+ capabilities: CapabilityRegistry;
12
+ consumers: ConsumerRegistry;
13
+ events: EventRegistry;
14
+ entities: EntityRegistry;
15
+ db: PostgresJsDatabase;
16
+ config: PlumbusConfig;
17
+ flowEngine?: ReturnType<typeof createFlowEngine>;
18
+ aiService?: AIService;
19
+ logger?: LoggerService;
20
+ metrics?: PlumbusMetrics;
21
+ /** Called when MCP task rows need status sync (optional @plumbus/mcp integration). */
22
+ onMcpJobComplete?: (jobId: string, result: 'completed' | 'failed', payload?: unknown, error?: unknown, tenantId?: string | null) => Promise<void>;
23
+ }
24
+ /**
25
+ * Register eventHandler (with trigger.event) and job capabilities as queue consumers.
26
+ * Skips handlers whose consumer id is already registered manually.
27
+ */
28
+ export declare function registerCapabilityConsumers(opts: RegisterCapabilityConsumersOptions): void;
29
+ //# sourceMappingURL=register-consumers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-consumers.d.ts","sourceRoot":"","sources":["../../src/runtime/register-consumers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAO3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,MAAM,WAAW,kCAAkC;IACjD,YAAY,EAAE,kBAAkB,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,kBAAkB,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,CACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,OAAO,CAAC,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AA6GD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,kCAAkC,GAAG,IAAI,CA2J1F"}
@@ -0,0 +1,233 @@
1
+ // ── Capability Consumer Registration ──
2
+ // Auto-wires eventHandler and job capabilities into the ConsumerRegistry.
3
+ import { eq } from 'drizzle-orm';
4
+ import { createAuditService } from '../audit/service.js';
5
+ import { createEventEmitter } from '../events/emitter.js';
6
+ import { outboxTable } from '../events/outbox.js';
7
+ import { TrustedReplayActor } from '../types/event.js';
8
+ import { CapabilityKind } from '../types/enums.js';
9
+ import { buildCapabilityRuntimeDeps } from '../execution/capability-invocation.js';
10
+ import { executeCapability } from '../execution/capability-executor.js';
11
+ import { evaluateAccess } from '../execution/authorization.js';
12
+ import { createExecutionContext } from '../execution/context-factory.js';
13
+ import { createFlowService } from '../flows/flow-service.js';
14
+ import { createJobService, JobClaimResult } from '../jobs/service.js';
15
+ import { jobEventType } from '../jobs/types.js';
16
+ function eventWorkerAuth(cap, envelope, tenantId) {
17
+ const serviceAccount = cap.access?.serviceAccounts?.[0] ?? 'event-worker';
18
+ return {
19
+ userId: serviceAccount,
20
+ roles: ['system'],
21
+ scopes: [],
22
+ provider: 'event-worker',
23
+ tenantId: tenantId ?? envelope.tenantId,
24
+ };
25
+ }
26
+ const TRUSTED_REPLAY_ACTORS = new Set([
27
+ TrustedReplayActor.OpsRetry,
28
+ TrustedReplayActor.OutboxReplay,
29
+ ]);
30
+ function isTrustedReplay(envelope) {
31
+ return TRUSTED_REPLAY_ACTORS.has(envelope.actor);
32
+ }
33
+ function tenantFromTrustedReplay(envelope) {
34
+ if (envelope.tenantId != null) {
35
+ return envelope.tenantId;
36
+ }
37
+ const metaTenant = envelope.metadata?.tenantId;
38
+ if (typeof metaTenant === 'string') {
39
+ return metaTenant;
40
+ }
41
+ return undefined;
42
+ }
43
+ async function resolveEventHandlerTenantId(db, envelope, logger) {
44
+ const rows = await db
45
+ .select({ tenantId: outboxTable.tenantId, eventType: outboxTable.eventType })
46
+ .from(outboxTable)
47
+ .where(eq(outboxTable.id, envelope.id))
48
+ .limit(1);
49
+ const row = rows[0];
50
+ if (!row) {
51
+ if (isTrustedReplay(envelope)) {
52
+ const tenantId = tenantFromTrustedReplay(envelope);
53
+ logger?.info?.('Trusted replay delivery without outbox row', {
54
+ eventId: envelope.id,
55
+ eventType: envelope.eventType,
56
+ actor: envelope.actor,
57
+ tenantId,
58
+ });
59
+ return tenantId;
60
+ }
61
+ throw new Error(`Event handler rejected: no outbox row for event "${envelope.id}" — possible forged queue message. ` +
62
+ 'Redis is a trust boundary; replay via plumbus events replay/dead-letter retry only.');
63
+ }
64
+ if (row.eventType !== envelope.eventType) {
65
+ throw new Error(`Event envelope type mismatch for "${envelope.id}": queue=${envelope.eventType} outbox=${row.eventType}`);
66
+ }
67
+ if (row.tenantId != null && envelope.tenantId != null && row.tenantId !== envelope.tenantId) {
68
+ throw new Error(`Event envelope tenant mismatch for "${envelope.id}": queue=${envelope.tenantId} outbox=${row.tenantId}`);
69
+ }
70
+ return row.tenantId ?? envelope.tenantId;
71
+ }
72
+ function buildConsumerContext(opts, auth, eventMeta) {
73
+ const audit = createAuditService({ db: opts.db, auth });
74
+ const data = opts.entities.createDataService({ db: opts.db, auth, audit });
75
+ const eventService = createEventEmitter({
76
+ db: opts.db,
77
+ auth,
78
+ registry: opts.events,
79
+ audit,
80
+ correlationId: eventMeta?.correlationId,
81
+ causationId: eventMeta?.causationId,
82
+ });
83
+ const flows = opts.flowEngine ? createFlowService(opts.flowEngine, auth) : undefined;
84
+ const capRuntime = buildCapabilityRuntimeDeps(opts.capabilities);
85
+ return createExecutionContext({
86
+ auth,
87
+ data,
88
+ events: eventService,
89
+ flows,
90
+ ai: opts.aiService,
91
+ audit,
92
+ logger: opts.logger,
93
+ config: opts.config,
94
+ correlationId: eventMeta?.correlationId,
95
+ ...capRuntime,
96
+ });
97
+ }
98
+ /**
99
+ * Register eventHandler (with trigger.event) and job capabilities as queue consumers.
100
+ * Skips handlers whose consumer id is already registered manually.
101
+ */
102
+ export function registerCapabilityConsumers(opts) {
103
+ const jobs = createJobService(opts.db);
104
+ for (const cap of opts.capabilities.getAll()) {
105
+ if (cap.kind === CapabilityKind.EventHandler && cap.trigger?.event) {
106
+ if (opts.consumers.getById(cap.name)) {
107
+ opts.logger?.debug?.(`Skipping auto-registration for "${cap.name}" — manual consumer exists`);
108
+ continue;
109
+ }
110
+ opts.consumers.register({
111
+ id: cap.name,
112
+ eventTypes: [cap.trigger.event],
113
+ versionConstraint: cap.trigger.versionConstraint,
114
+ handler: async (envelope) => {
115
+ const tenantId = await resolveEventHandlerTenantId(opts.db, envelope, opts.logger);
116
+ const auth = eventWorkerAuth(cap, envelope, tenantId);
117
+ const authz = evaluateAccess(cap.access, auth);
118
+ if (!authz.allowed) {
119
+ throw new Error(authz.reason ?? 'Event handler access denied');
120
+ }
121
+ const parsed = cap.input.safeParse(envelope.payload);
122
+ if (!parsed.success) {
123
+ throw new Error(`Event payload validation failed for handler "${cap.name}"`);
124
+ }
125
+ const ctx = buildConsumerContext(opts, auth, {
126
+ correlationId: envelope.correlationId,
127
+ causationId: envelope.id,
128
+ });
129
+ const started = Date.now();
130
+ const result = await executeCapability(cap, ctx, parsed.data);
131
+ opts.metrics?.capabilityDuration.observe(Date.now() - started, {
132
+ capability: cap.name,
133
+ kind: 'eventHandler',
134
+ });
135
+ if (!result.success) {
136
+ opts.metrics?.eventFailed.inc({ consumer: cap.name });
137
+ throw new Error(result.error.message);
138
+ }
139
+ opts.metrics?.eventDelivered.inc({ consumer: cap.name });
140
+ },
141
+ });
142
+ }
143
+ if (cap.kind === CapabilityKind.Job) {
144
+ const eventType = jobEventType(cap.domain, cap.name);
145
+ const consumerId = `job:${cap.domain}:${cap.name}`;
146
+ if (opts.consumers.getById(consumerId)) {
147
+ continue;
148
+ }
149
+ opts.consumers.register({
150
+ id: consumerId,
151
+ eventTypes: [eventType],
152
+ handler: async (envelope) => {
153
+ const payload = envelope.payload;
154
+ const started = Date.now();
155
+ const record = await jobs.getById(payload.jobExecutionId);
156
+ if (!record) {
157
+ throw new Error(`Job execution "${payload.jobExecutionId}" not found`);
158
+ }
159
+ if (record.capabilityDomain !== cap.domain ||
160
+ record.capabilityName !== cap.name ||
161
+ payload.capability.domain !== cap.domain ||
162
+ payload.capability.name !== cap.name) {
163
+ await jobs.markFailed(payload.jobExecutionId, {
164
+ code: 'capability_mismatch',
165
+ message: 'Job capability mismatch at dequeue',
166
+ });
167
+ throw new Error('Job capability mismatch at dequeue');
168
+ }
169
+ const auth = record.authSnapshotJson;
170
+ if (!auth) {
171
+ await jobs.markFailed(payload.jobExecutionId, {
172
+ code: 'missing_auth_snapshot',
173
+ message: 'Job auth snapshot missing at dequeue',
174
+ });
175
+ throw new Error('Job auth snapshot missing at dequeue');
176
+ }
177
+ const authz = evaluateAccess(cap.access, auth);
178
+ if (!authz.allowed) {
179
+ await jobs.markFailed(payload.jobExecutionId, {
180
+ code: 'forbidden',
181
+ message: authz.reason ?? 'Job access denied at dequeue',
182
+ });
183
+ throw new Error(authz.reason ?? 'Job access denied');
184
+ }
185
+ const staleAfterMs = (opts.config.queue?.visibilityTimeoutSec ?? 30) * 1000;
186
+ const claimResult = await jobs.tryClaimForExecution(payload.jobExecutionId, staleAfterMs);
187
+ if (claimResult === JobClaimResult.Terminal) {
188
+ opts.logger?.debug?.('Job already terminal — acknowledging duplicate delivery', {
189
+ jobExecutionId: payload.jobExecutionId,
190
+ });
191
+ return;
192
+ }
193
+ if (claimResult === JobClaimResult.Retry) {
194
+ throw new Error(`Job "${payload.jobExecutionId}" claim failed — will retry`);
195
+ }
196
+ const ctx = buildConsumerContext(opts, auth, {
197
+ correlationId: envelope.correlationId,
198
+ causationId: envelope.id,
199
+ });
200
+ const jobInput = record.inputJson ?? payload.input;
201
+ const parsed = cap.input.safeParse(jobInput);
202
+ if (!parsed.success) {
203
+ await jobs.markFailed(payload.jobExecutionId, {
204
+ code: 'validation',
205
+ message: 'Invalid job input at dequeue',
206
+ });
207
+ throw new Error('Invalid job input');
208
+ }
209
+ const result = await executeCapability(cap, ctx, parsed.data);
210
+ opts.metrics?.capabilityDuration.observe(Date.now() - started, {
211
+ capability: cap.name,
212
+ kind: 'job',
213
+ });
214
+ if (result.success) {
215
+ await jobs.markCompleted(payload.jobExecutionId, result.data);
216
+ await opts.onMcpJobComplete?.(payload.jobExecutionId, 'completed', result.data, undefined, record.tenantId);
217
+ opts.metrics?.eventDelivered.inc({ consumer: consumerId });
218
+ }
219
+ else {
220
+ await jobs.markFailed(payload.jobExecutionId, {
221
+ code: result.error.code,
222
+ message: result.error.message,
223
+ });
224
+ await opts.onMcpJobComplete?.(payload.jobExecutionId, 'failed', undefined, result.error, record.tenantId);
225
+ opts.metrics?.eventFailed.inc({ consumer: consumerId });
226
+ throw new Error(result.error.message);
227
+ }
228
+ },
229
+ });
230
+ }
231
+ }
232
+ }
233
+ //# sourceMappingURL=register-consumers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-consumers.js","sourceRoot":"","sources":["../../src/runtime/register-consumers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
2
+ import type { PromptRegistry } from '../ai/prompt-registry.js';
3
+ import type { ConsumerRegistry } from '../events/consumer-registry.js';
4
+ import type { EventRegistry } from '../events/registry.js';
5
+ import type { FlowRegistry } from '../flows/registry.js';
6
+ import type { CapabilityRegistry } from '../execution/capability-registry.js';
7
+ import type { EntityRegistry } from '../data/registry.js';
8
+ import type { PlumbusConfig } from '../types/config.js';
9
+ import type { WorkerPool } from '../worker/bootstrap.js';
10
+ import { type ServerExtensions } from './bootstrap.js';
11
+ import type { PlumbusMetrics } from '../observability/metrics.js';
12
+ import type { RuntimeQueues } from './queue-factory.js';
13
+ export interface StartWorkerPoolOptions {
14
+ config: PlumbusConfig;
15
+ db: PostgresJsDatabase;
16
+ queues: RuntimeQueues;
17
+ capabilities: CapabilityRegistry;
18
+ entities: EntityRegistry;
19
+ events: EventRegistry;
20
+ flows: FlowRegistry;
21
+ consumers: ConsumerRegistry;
22
+ promptRegistry?: PromptRegistry;
23
+ extensions?: ServerExtensions;
24
+ logger?: import('../types/context.js').LoggerService;
25
+ metrics?: PlumbusMetrics;
26
+ }
27
+ /**
28
+ * Register capability consumers and start the worker pool.
29
+ * Used by plumbus dev, start (role=all), and plumbus worker.
30
+ */
31
+ export declare function startWorkerPool(options: StartWorkerPoolOptions): Promise<WorkerPool>;
32
+ //# sourceMappingURL=start-worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-worker-pool.d.ts","sourceRoot":"","sources":["../../src/runtime/start-worker-pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,kBAAkB,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,kBAAkB,CAAC;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,qBAAqB,EAAE,aAAa,CAAC;IACrD,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyG1F"}