@plumbus/core 0.4.2 → 0.5.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.
- package/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/api/route-generator.d.ts.map +1 -1
- package/dist/api/route-generator.js +27 -14
- package/dist/api/route-generator.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +2 -1
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +38 -149
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +92 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/event.d.ts.map +1 -1
- package/dist/cli/commands/event.js +3 -0
- package/dist/cli/commands/event.js.map +1 -1
- package/dist/cli/commands/events-ops.d.ts +4 -0
- package/dist/cli/commands/events-ops.d.ts.map +1 -0
- package/dist/cli/commands/events-ops.js +203 -0
- package/dist/cli/commands/events-ops.js.map +1 -0
- package/dist/cli/commands/flow.d.ts.map +1 -1
- package/dist/cli/commands/flow.js +49 -1
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +94 -3
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +13 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +2 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/start.d.ts +3 -6
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +71 -180
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/verify.d.ts +3 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +17 -9
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/worker.d.ts +19 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/worker.js +234 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/mcp-serve-context.d.ts +3 -0
- package/dist/cli/mcp-serve-context.d.ts.map +1 -1
- package/dist/cli/mcp-serve-context.js +16 -1
- package/dist/cli/mcp-serve-context.js.map +1 -1
- package/dist/cli/templates/resources.d.ts.map +1 -1
- package/dist/cli/templates/resources.js +7 -2
- package/dist/cli/templates/resources.js.map +1 -1
- package/dist/cli/utils.d.ts +4 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +9 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/data/drift-inspector.d.ts +2 -2
- package/dist/data/drift-inspector.d.ts.map +1 -1
- package/dist/data/drift-inspector.js +2 -1
- package/dist/data/drift-inspector.js.map +1 -1
- package/dist/data/migration.d.ts.map +1 -1
- package/dist/data/migration.js +2 -0
- package/dist/data/migration.js.map +1 -1
- package/dist/define/defineCapability.d.ts +5 -0
- package/dist/define/defineCapability.d.ts.map +1 -1
- package/dist/define/defineCapability.js +23 -0
- package/dist/define/defineCapability.js.map +1 -1
- package/dist/errors/http.d.ts.map +1 -1
- package/dist/errors/http.js +1 -0
- package/dist/errors/http.js.map +1 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +1 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/events/dispatcher.d.ts +4 -0
- package/dist/events/dispatcher.d.ts.map +1 -1
- package/dist/events/dispatcher.js +24 -1
- package/dist/events/dispatcher.js.map +1 -1
- package/dist/events/emitter.d.ts +2 -0
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +6 -3
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/queue-adapter.d.ts +7 -0
- package/dist/events/queue-adapter.d.ts.map +1 -0
- package/dist/events/queue-adapter.js +4 -0
- package/dist/events/queue-adapter.js.map +1 -0
- package/dist/events/queue.d.ts +16 -13
- package/dist/events/queue.d.ts.map +1 -1
- package/dist/events/queue.js +79 -22
- package/dist/events/queue.js.map +1 -1
- package/dist/events/worker.d.ts +4 -0
- package/dist/events/worker.d.ts.map +1 -1
- package/dist/events/worker.js +47 -1
- package/dist/events/worker.js.map +1 -1
- package/dist/execution/canonical-name.d.ts +13 -0
- package/dist/execution/canonical-name.d.ts.map +1 -0
- package/dist/execution/canonical-name.js +17 -0
- package/dist/execution/canonical-name.js.map +1 -0
- package/dist/execution/capability-executor.d.ts +1 -1
- package/dist/execution/capability-executor.d.ts.map +1 -1
- package/dist/execution/capability-executor.js +52 -24
- package/dist/execution/capability-executor.js.map +1 -1
- package/dist/execution/capability-invocation.d.ts +34 -0
- package/dist/execution/capability-invocation.d.ts.map +1 -0
- package/dist/execution/capability-invocation.js +138 -0
- package/dist/execution/capability-invocation.js.map +1 -0
- package/dist/execution/capability-registry.d.ts +6 -4
- package/dist/execution/capability-registry.d.ts.map +1 -1
- package/dist/execution/capability-registry.js +13 -7
- package/dist/execution/capability-registry.js.map +1 -1
- package/dist/execution/context-factory.d.ts.map +1 -1
- package/dist/execution/context-factory.js +12 -1
- package/dist/execution/context-factory.js.map +1 -1
- package/dist/execution/index.d.ts +4 -0
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +2 -0
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/invocation-emit-scope.d.ts +11 -0
- package/dist/execution/invocation-emit-scope.d.ts.map +1 -0
- package/dist/execution/invocation-emit-scope.js +8 -0
- package/dist/execution/invocation-emit-scope.js.map +1 -0
- package/dist/flows/engine.d.ts +7 -1
- package/dist/flows/engine.d.ts.map +1 -1
- package/dist/flows/engine.js +73 -10
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/flow-delayed.d.ts +34 -0
- package/dist/flows/flow-delayed.d.ts.map +1 -0
- package/dist/flows/flow-delayed.js +60 -0
- package/dist/flows/flow-delayed.js.map +1 -0
- package/dist/flows/flow-queue.d.ts +10 -0
- package/dist/flows/flow-queue.d.ts.map +1 -0
- package/dist/flows/flow-queue.js +25 -0
- package/dist/flows/flow-queue.js.map +1 -0
- package/dist/flows/scheduler.d.ts +0 -12
- package/dist/flows/scheduler.d.ts.map +1 -1
- package/dist/flows/scheduler.js +15 -0
- package/dist/flows/scheduler.js.map +1 -1
- package/dist/flows/schema.d.ts +17 -0
- package/dist/flows/schema.d.ts.map +1 -1
- package/dist/flows/schema.js +2 -0
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/step-consumer.d.ts +24 -0
- package/dist/flows/step-consumer.d.ts.map +1 -0
- package/dist/flows/step-consumer.js +72 -0
- package/dist/flows/step-consumer.js.map +1 -0
- package/dist/flows/triggers.d.ts +1 -1
- package/dist/flows/triggers.d.ts.map +1 -1
- package/dist/flows/triggers.js +5 -7
- package/dist/flows/triggers.js.map +1 -1
- package/dist/governance/capability-source-scan.d.ts +7 -0
- package/dist/governance/capability-source-scan.d.ts.map +1 -0
- package/dist/governance/capability-source-scan.js +80 -0
- package/dist/governance/capability-source-scan.js.map +1 -0
- package/dist/governance/rules/architecture.d.ts.map +1 -1
- package/dist/governance/rules/architecture.js +2 -0
- package/dist/governance/rules/architecture.js.map +1 -1
- package/dist/governance/rules/capability-dependencies.d.ts +8 -0
- package/dist/governance/rules/capability-dependencies.d.ts.map +1 -0
- package/dist/governance/rules/capability-dependencies.js +195 -0
- package/dist/governance/rules/capability-dependencies.js.map +1 -0
- package/dist/governance/rules/index.d.ts +2 -0
- package/dist/governance/rules/index.d.ts.map +1 -1
- package/dist/governance/rules/index.js +2 -0
- package/dist/governance/rules/index.js.map +1 -1
- package/dist/governance/rules/worker.d.ts +9 -0
- package/dist/governance/rules/worker.d.ts.map +1 -0
- package/dist/governance/rules/worker.js +89 -0
- package/dist/governance/rules/worker.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs/dispatch.d.ts +18 -0
- package/dist/jobs/dispatch.d.ts.map +1 -0
- package/dist/jobs/dispatch.js +50 -0
- package/dist/jobs/dispatch.js.map +1 -0
- package/dist/jobs/index.d.ts +9 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +8 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/routes.d.ts +10 -0
- package/dist/jobs/routes.d.ts.map +1 -0
- package/dist/jobs/routes.js +44 -0
- package/dist/jobs/routes.js.map +1 -0
- package/dist/jobs/schema.d.ts +264 -0
- package/dist/jobs/schema.d.ts.map +1 -0
- package/dist/jobs/schema.js +34 -0
- package/dist/jobs/schema.js.map +1 -0
- package/dist/jobs/service.d.ts +52 -0
- package/dist/jobs/service.d.ts.map +1 -0
- package/dist/jobs/service.js +168 -0
- package/dist/jobs/service.js.map +1 -0
- package/dist/jobs/types.d.ts +30 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +4 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/mcp/manifest-generator.d.ts.map +1 -1
- package/dist/mcp/manifest-generator.js +3 -2
- package/dist/mcp/manifest-generator.js.map +1 -1
- package/dist/observability/metrics.d.ts +9 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +28 -1
- package/dist/observability/metrics.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +51 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +140 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/load-extensions.d.ts +4 -0
- package/dist/runtime/load-extensions.d.ts.map +1 -0
- package/dist/runtime/load-extensions.js +41 -0
- package/dist/runtime/load-extensions.js.map +1 -0
- package/dist/runtime/queue-factory.d.ts +44 -0
- package/dist/runtime/queue-factory.d.ts.map +1 -0
- package/dist/runtime/queue-factory.js +156 -0
- package/dist/runtime/queue-factory.js.map +1 -0
- package/dist/runtime/register-consumers.d.ts +29 -0
- package/dist/runtime/register-consumers.d.ts.map +1 -0
- package/dist/runtime/register-consumers.js +233 -0
- package/dist/runtime/register-consumers.js.map +1 -0
- package/dist/runtime/start-worker-pool.d.ts +32 -0
- package/dist/runtime/start-worker-pool.d.ts.map +1 -0
- package/dist/runtime/start-worker-pool.js +91 -0
- package/dist/runtime/start-worker-pool.js.map +1 -0
- package/dist/runtime/worker-health.d.ts +19 -0
- package/dist/runtime/worker-health.d.ts.map +1 -0
- package/dist/runtime/worker-health.js +41 -0
- package/dist/runtime/worker-health.js.map +1 -0
- package/dist/server/bootstrap.d.ts +6 -0
- package/dist/server/bootstrap.d.ts.map +1 -1
- package/dist/server/bootstrap.js +18 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/testing/context.d.ts +3 -0
- package/dist/testing/context.d.ts.map +1 -1
- package/dist/testing/context.js +10 -0
- package/dist/testing/context.js.map +1 -1
- package/dist/testing/simulate-flow.d.ts.map +1 -1
- package/dist/testing/simulate-flow.js +10 -0
- package/dist/testing/simulate-flow.js.map +1 -1
- package/dist/types/capability.d.ts +8 -0
- package/dist/types/capability.d.ts.map +1 -1
- package/dist/types/capability.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/context.d.ts +34 -1
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/enums.d.ts +1 -0
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +1 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/errors.d.ts +1 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/event.d.ts +10 -0
- package/dist/types/event.d.ts.map +1 -1
- package/dist/types/event.js +5 -1
- package/dist/types/event.js.map +1 -1
- package/dist/worker/bootstrap.d.ts +32 -1
- package/dist/worker/bootstrap.d.ts.map +1 -1
- package/dist/worker/bootstrap.js +166 -2
- package/dist/worker/bootstrap.js.map +1 -1
- package/instructions/capabilities.md +36 -1
- package/instructions/deployment.md +96 -11
- package/instructions/events.md +11 -0
- package/instructions/flows.md +12 -4
- package/instructions/governance.md +6 -0
- package/instructions/mcp.md +1 -1
- package/instructions/patterns.md +1 -0
- package/instructions/security.md +9 -0
- package/instructions/testing.md +12 -1
- package/instructions/upgrading-0.5-capabilities.md +181 -0
- package/package.json +12 -4
package/dist/worker/bootstrap.js
CHANGED
|
@@ -8,12 +8,16 @@ import { createOutboxDispatcher } from '../events/dispatcher.js';
|
|
|
8
8
|
import { createEventEmitter } from '../events/emitter.js';
|
|
9
9
|
import { createIdempotencyService } from '../events/idempotency.js';
|
|
10
10
|
import { createEventWorker } from '../events/worker.js';
|
|
11
|
+
import { buildCapabilityRuntimeDeps } from '../execution/capability-invocation.js';
|
|
11
12
|
import { createExecutionContext } from '../execution/context-factory.js';
|
|
12
13
|
import { createFlowEngine, generateWorkerId } from '../flows/engine.js';
|
|
13
14
|
import { createFlowService } from '../flows/flow-service.js';
|
|
14
15
|
import { FlowStatus } from '../flows/state-machine.js';
|
|
15
16
|
import { createFlowScheduler } from '../flows/scheduler.js';
|
|
17
|
+
import { createFlowDelayedPromoter, scheduleDelayedFlowWake } from '../flows/flow-delayed.js';
|
|
18
|
+
import { createFlowStepConsumer } from '../flows/step-consumer.js';
|
|
16
19
|
import { createFlowTriggerHandler } from '../flows/triggers.js';
|
|
20
|
+
import { registerCapabilityConsumers } from '../runtime/register-consumers.js';
|
|
17
21
|
// ── Error description helper ──
|
|
18
22
|
// Drizzle wraps the underlying driver error in `cause`, and its own `message`
|
|
19
23
|
// is just the literal SQL with a "Failed query:" prefix. Without the cause
|
|
@@ -89,16 +93,31 @@ export async function assertFlowLeaseColumns(db) {
|
|
|
89
93
|
}
|
|
90
94
|
/** Create and configure a worker pool with all background processes */
|
|
91
95
|
export function createWorkerPool(poolConfig) {
|
|
92
|
-
const { db, queue, consumers, flows, stepDeps, audit, outboxPollIntervalMs = 1000, schedulerPollIntervalMs = 60_000, flowPollIntervalMs = 1000, enableDispatcher = true, enableEventWorker = true, enableScheduler = true, enableFlowRunner = true, } = poolConfig;
|
|
96
|
+
const { db, queue, consumers, flows, stepDeps, audit, outboxPollIntervalMs = 1000, schedulerPollIntervalMs = 60_000, flowPollIntervalMs: flowPollIntervalMsConfig = 1000, enableDispatcher = true, enableEventWorker = true, enableScheduler = true, enableFlowRunner = true, } = poolConfig;
|
|
97
|
+
const jobsQueue = poolConfig.jobsQueue ?? queue;
|
|
98
|
+
const flowsQueue = poolConfig.flowsQueue ?? queue;
|
|
99
|
+
const flowPollIntervalMs = poolConfig.queuesDurable
|
|
100
|
+
? Math.max(flowPollIntervalMsConfig, 30_000)
|
|
101
|
+
: flowPollIntervalMsConfig;
|
|
93
102
|
const logger = poolConfig.logger ?? createWorkerLogger();
|
|
103
|
+
const metrics = poolConfig.metrics;
|
|
94
104
|
const eventRegistry = poolConfig.eventRegistry;
|
|
95
105
|
// Idempotency service for event worker
|
|
96
106
|
const idempotency = createIdempotencyService(db);
|
|
107
|
+
const systemWorkerAuth = {
|
|
108
|
+
userId: 'system-worker',
|
|
109
|
+
roles: ['system'],
|
|
110
|
+
scopes: [],
|
|
111
|
+
provider: 'worker',
|
|
112
|
+
};
|
|
113
|
+
const workerAudit = audit ?? createAuditService({ db, auth: systemWorkerAuth, component: 'event-worker' });
|
|
97
114
|
// Outbox dispatcher
|
|
98
115
|
const dispatcherConfig = {
|
|
99
116
|
db,
|
|
100
117
|
queue,
|
|
118
|
+
audit: workerAudit,
|
|
101
119
|
pollIntervalMs: outboxPollIntervalMs,
|
|
120
|
+
metrics,
|
|
102
121
|
};
|
|
103
122
|
const dispatcher = enableDispatcher ? createOutboxDispatcher(dispatcherConfig) : null;
|
|
104
123
|
// Event delivery worker
|
|
@@ -107,8 +126,20 @@ export function createWorkerPool(poolConfig) {
|
|
|
107
126
|
queue,
|
|
108
127
|
consumers,
|
|
109
128
|
idempotency,
|
|
129
|
+
audit: workerAudit,
|
|
130
|
+
metrics,
|
|
110
131
|
};
|
|
111
132
|
const eventWorker = enableEventWorker ? createEventWorker(eventWorkerConfig) : null;
|
|
133
|
+
const jobEventWorker = enableEventWorker && jobsQueue !== queue
|
|
134
|
+
? createEventWorker({
|
|
135
|
+
db,
|
|
136
|
+
queue: jobsQueue,
|
|
137
|
+
consumers,
|
|
138
|
+
idempotency,
|
|
139
|
+
audit: workerAudit,
|
|
140
|
+
metrics,
|
|
141
|
+
})
|
|
142
|
+
: null;
|
|
112
143
|
// Flow engine + scheduler
|
|
113
144
|
const { createDataService } = poolConfig;
|
|
114
145
|
const flowEngineConfig = {
|
|
@@ -123,6 +154,17 @@ export function createWorkerPool(poolConfig) {
|
|
|
123
154
|
flowHeartbeatIntervalMs: poolConfig.flowHeartbeatIntervalMs,
|
|
124
155
|
flowClaimBatchSize: poolConfig.flowClaimBatchSize,
|
|
125
156
|
logger,
|
|
157
|
+
onFlowStepEnqueue: poolConfig.queuesDurable ? poolConfig.onFlowStepEnqueue : undefined,
|
|
158
|
+
onFlowDelayedSchedule: poolConfig.queuesDurable && poolConfig.redisClient && poolConfig.flowsPrefix
|
|
159
|
+
? async (executionId, wakeAt) => {
|
|
160
|
+
await scheduleDelayedFlowWake({
|
|
161
|
+
client: poolConfig.redisClient,
|
|
162
|
+
flowsPrefix: poolConfig.flowsPrefix,
|
|
163
|
+
executionId,
|
|
164
|
+
wakeAt,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
: undefined,
|
|
126
168
|
createDataService: createDataService ? (auth) => createDataService(auth) : undefined,
|
|
127
169
|
createEventService: eventRegistry
|
|
128
170
|
? (auth) => createEventEmitter({
|
|
@@ -134,6 +176,21 @@ export function createWorkerPool(poolConfig) {
|
|
|
134
176
|
: undefined,
|
|
135
177
|
};
|
|
136
178
|
const flowEngine = createFlowEngine(flowEngineConfig);
|
|
179
|
+
if (poolConfig.capabilities && poolConfig.entities && eventRegistry) {
|
|
180
|
+
registerCapabilityConsumers({
|
|
181
|
+
capabilities: poolConfig.capabilities,
|
|
182
|
+
consumers,
|
|
183
|
+
events: eventRegistry,
|
|
184
|
+
entities: poolConfig.entities,
|
|
185
|
+
db,
|
|
186
|
+
config: poolConfig.config,
|
|
187
|
+
flowEngine,
|
|
188
|
+
aiService: poolConfig.aiService,
|
|
189
|
+
logger,
|
|
190
|
+
metrics,
|
|
191
|
+
onMcpJobComplete: poolConfig.onMcpJobComplete,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
137
194
|
// Auto-register flow trigger consumer for all event-triggered flows
|
|
138
195
|
const triggerEventTypes = new Set();
|
|
139
196
|
for (const flow of flows.getAll()) {
|
|
@@ -200,6 +257,7 @@ export function createWorkerPool(poolConfig) {
|
|
|
200
257
|
audit: systemAudit,
|
|
201
258
|
logger,
|
|
202
259
|
config: poolConfig.config,
|
|
260
|
+
...(poolConfig.capabilities ? buildCapabilityRuntimeDeps(poolConfig.capabilities) : {}),
|
|
203
261
|
});
|
|
204
262
|
for (const row of claimed) {
|
|
205
263
|
try {
|
|
@@ -272,8 +330,65 @@ export function createWorkerPool(poolConfig) {
|
|
|
272
330
|
logger.error('Flow claim cycle failed', describeError(err));
|
|
273
331
|
}
|
|
274
332
|
}
|
|
333
|
+
function buildFlowRunnerContext() {
|
|
334
|
+
const systemAuth = {
|
|
335
|
+
userId: 'system-flow-runner',
|
|
336
|
+
roles: ['system'],
|
|
337
|
+
scopes: [],
|
|
338
|
+
provider: 'worker',
|
|
339
|
+
};
|
|
340
|
+
const systemAudit = audit ?? createAuditService({ db, auth: systemAuth });
|
|
341
|
+
const dataService = poolConfig.createDataService
|
|
342
|
+
? poolConfig.createDataService()
|
|
343
|
+
: {};
|
|
344
|
+
const eventService = eventRegistry
|
|
345
|
+
? createEventEmitter({
|
|
346
|
+
db,
|
|
347
|
+
auth: systemAuth,
|
|
348
|
+
registry: eventRegistry,
|
|
349
|
+
audit: systemAudit,
|
|
350
|
+
})
|
|
351
|
+
: undefined;
|
|
352
|
+
return createExecutionContext({
|
|
353
|
+
auth: systemAuth,
|
|
354
|
+
data: dataService,
|
|
355
|
+
events: eventService,
|
|
356
|
+
flows: createFlowService(flowEngine, systemAuth),
|
|
357
|
+
ai: poolConfig.aiService,
|
|
358
|
+
audit: systemAudit,
|
|
359
|
+
logger,
|
|
360
|
+
config: poolConfig.config,
|
|
361
|
+
...(poolConfig.capabilities ? buildCapabilityRuntimeDeps(poolConfig.capabilities) : {}),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
const flowStepConsumer = enableFlowRunner && flowsQueue
|
|
365
|
+
? createFlowStepConsumer({
|
|
366
|
+
flowsQueue,
|
|
367
|
+
engine: flowEngine,
|
|
368
|
+
buildContext: buildFlowRunnerContext,
|
|
369
|
+
logger,
|
|
370
|
+
metrics,
|
|
371
|
+
onReenqueue: poolConfig.onFlowStepEnqueue
|
|
372
|
+
? async (executionId) => {
|
|
373
|
+
await poolConfig.onFlowStepEnqueue?.(executionId);
|
|
374
|
+
}
|
|
375
|
+
: undefined,
|
|
376
|
+
})
|
|
377
|
+
: null;
|
|
378
|
+
const flowDelayedPromoter = enableFlowRunner && poolConfig.queuesDurable && poolConfig.redisClient && poolConfig.flowsPrefix
|
|
379
|
+
? createFlowDelayedPromoter({
|
|
380
|
+
client: poolConfig.redisClient,
|
|
381
|
+
flowsPrefix: poolConfig.flowsPrefix,
|
|
382
|
+
flowsQueue,
|
|
383
|
+
logger,
|
|
384
|
+
})
|
|
385
|
+
: null;
|
|
386
|
+
let depthRefreshTimer = null;
|
|
275
387
|
let running = false;
|
|
276
388
|
return {
|
|
389
|
+
get flowEngine() {
|
|
390
|
+
return flowEngine;
|
|
391
|
+
},
|
|
277
392
|
async start() {
|
|
278
393
|
if (running)
|
|
279
394
|
return;
|
|
@@ -308,6 +423,34 @@ export function createWorkerPool(poolConfig) {
|
|
|
308
423
|
eventWorker.start();
|
|
309
424
|
logger.info('Event delivery worker started');
|
|
310
425
|
}
|
|
426
|
+
if (jobEventWorker) {
|
|
427
|
+
jobEventWorker.start();
|
|
428
|
+
logger.info('Job delivery worker started');
|
|
429
|
+
}
|
|
430
|
+
if (flowStepConsumer) {
|
|
431
|
+
flowStepConsumer.start();
|
|
432
|
+
logger.info('Flow step queue consumer started');
|
|
433
|
+
}
|
|
434
|
+
if (flowDelayedPromoter) {
|
|
435
|
+
flowDelayedPromoter.start();
|
|
436
|
+
logger.info('Flow delayed wake promoter started');
|
|
437
|
+
}
|
|
438
|
+
if (poolConfig.refreshQueueDepths && metrics) {
|
|
439
|
+
const refresh = async () => {
|
|
440
|
+
try {
|
|
441
|
+
await poolConfig.refreshQueueDepths?.();
|
|
442
|
+
}
|
|
443
|
+
catch (err) {
|
|
444
|
+
logger.warn('Queue depth refresh failed', {
|
|
445
|
+
error: err instanceof Error ? err.message : String(err),
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
await refresh();
|
|
450
|
+
depthRefreshTimer = setInterval(() => {
|
|
451
|
+
void refresh();
|
|
452
|
+
}, 15_000);
|
|
453
|
+
}
|
|
311
454
|
logger.info('Worker pool started');
|
|
312
455
|
},
|
|
313
456
|
async stop() {
|
|
@@ -328,11 +471,32 @@ export function createWorkerPool(poolConfig) {
|
|
|
328
471
|
dispatcher.stop();
|
|
329
472
|
logger.info('Outbox dispatcher stopped');
|
|
330
473
|
}
|
|
474
|
+
if (flowStepConsumer) {
|
|
475
|
+
flowStepConsumer.stop();
|
|
476
|
+
logger.info('Flow step queue consumer stopped');
|
|
477
|
+
}
|
|
478
|
+
if (flowDelayedPromoter) {
|
|
479
|
+
flowDelayedPromoter.stop();
|
|
480
|
+
logger.info('Flow delayed wake promoter stopped');
|
|
481
|
+
}
|
|
482
|
+
if (depthRefreshTimer) {
|
|
483
|
+
clearInterval(depthRefreshTimer);
|
|
484
|
+
depthRefreshTimer = null;
|
|
485
|
+
}
|
|
486
|
+
if (jobEventWorker && jobEventWorker !== eventWorker) {
|
|
487
|
+
jobEventWorker.stop();
|
|
488
|
+
logger.info('Job delivery worker stopped');
|
|
489
|
+
}
|
|
331
490
|
if (eventWorker) {
|
|
332
491
|
eventWorker.stop();
|
|
333
492
|
logger.info('Event delivery worker stopped');
|
|
334
493
|
}
|
|
335
|
-
|
|
494
|
+
if (poolConfig.onQueuesClose) {
|
|
495
|
+
await poolConfig.onQueuesClose();
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
await queue.close();
|
|
499
|
+
}
|
|
336
500
|
logger.info('Queue closed');
|
|
337
501
|
running = false;
|
|
338
502
|
logger.info('Worker pool stopped');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/worker/bootstrap.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,mDAAmD;AACnD,gEAAgE;AAChE,6CAA6C;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAMhE,iCAAiC;AACjC,8EAA8E;AAC9E,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,iEAAiE;AACjE,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E;AAC3E,oDAAoD;AACpD,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,GAAG,GAA4B,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAE5D,MAAM,KAAK,GAAI,GAA2B,CAAC,KAAK,CAAC;IACjD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,MAAM,QAAQ,GAAG;YACf,MAAM;YACN,QAAQ;YACR,MAAM;YACN,UAAU;YACV,OAAO;YACP,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,YAAY;YACZ,SAAS;YACT,UAAU;SACF,CAAC;QACX,MAAM,EAAE,GAA4B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,GAAI,KAA4C,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;gBAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9C,CAAC;SAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+BAA+B;AAC/B,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,kEAAkE;AAClE,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,EAAE;AACF,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAsB;IACjE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,mEAAmE,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAE,GAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,MAAM,MAAM,GACV,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;YACnD,CAAC,CAAE,KAA4B,CAAC,IAAI;YACpC,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,0FAA0F;gBACxF,sFAAsF,CACzF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AA8DD,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,UAA4B;IAC3D,MAAM,EACJ,EAAE,EACF,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,KAAK,EACL,oBAAoB,GAAG,IAAI,EAC3B,uBAAuB,GAAG,MAAM,EAChC,kBAAkB,GAAG,IAAI,EACzB,gBAAgB,GAAG,IAAI,EACvB,iBAAiB,GAAG,IAAI,EACxB,eAAe,GAAG,IAAI,EACtB,gBAAgB,GAAG,IAAI,GACxB,GAAG,UAAU,CAAC;IAEf,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;IACzD,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IAE/C,uCAAuC;IACvC,MAAM,WAAW,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAEjD,oBAAoB;IACpB,MAAM,gBAAgB,GAAqB;QACzC,EAAE;QACF,KAAK;QACL,cAAc,EAAE,oBAAoB;KACrC,CAAC;IACF,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtF,wBAAwB;IACxB,MAAM,iBAAiB,GAAiB;QACtC,EAAE;QACF,KAAK;QACL,SAAS;QACT,WAAW;KACZ,CAAC;IACF,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpF,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,EAAE,GAAG,UAAU,CAAC;IACzC,MAAM,gBAAgB,GAAqB;QACzC,EAAE;QACF,QAAQ,EAAE,KAAK;QACf,QAAQ;QACR,KAAK;QACL,KAAK;QACL,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,QAAQ,EAAE,gBAAgB,EAAE;QAC5B,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;QACnD,uBAAuB,EAAE,UAAU,CAAC,uBAAuB;QAC3D,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,MAAM;QACN,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACpF,kBAAkB,EAAE,aAAa;YAC/B,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CACP,kBAAkB,CAAC;gBACjB,EAAE;gBACF,IAAI;gBACJ,QAAQ,EAAE,aAAa;gBACvB,KAAK,EAAE,KAAK,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;aACjD,CAAC;YACN,CAAC,CAAC,SAAS;KACd,CAAC;IACF,MAAM,UAAU,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,oEAAoE;IACpE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACxB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,SAAS,CAAC,QAAQ,CAAC;YACjB,EAAE,EAAE,sBAAsB;YAC1B,UAAU,EAAE,CAAC,GAAG,iBAAiB,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC1B,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,wCAAwC,iBAAiB,CAAC,IAAI,cAAc,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,eAAe,GAAoB;QACvC,EAAE;QACF,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,UAAU;QAClB,cAAc,EAAE,uBAAuB;KACxC,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,IAAI,eAAe,GAA0C,IAAI,CAAC;IAElE,KAAK,UAAU,YAAY;QACzB,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAEjC,MAAM,UAAU,GAAG;gBACjB,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,CAAC,QAAQ,CAAC;gBACjB,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,MAAM,WAAW,GAAG,KAAK,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB;gBAC9C,CAAC,CAAC,UAAU,CAAC,iBAAiB,EAAE;gBAChC,CAAC,CAAE,EAAkB,CAAC;YACxB,MAAM,YAAY,GAAG,aAAa;gBAChC,CAAC,CAAC,kBAAkB,CAAC;oBACjB,EAAE;oBACF,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,aAAa;oBACvB,KAAK,EAAE,WAAW;iBACnB,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,OAAO,GAAG,sBAAsB,CAAC;gBACrC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,YAAY;gBACpB,sEAAsE;gBACtE,wDAAwD;gBACxD,uEAAuE;gBACvE,qEAAqE;gBACrE,qEAAqE;gBACrE,YAAY;gBACZ,KAAK,EAAE,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC;gBAChD,EAAE,EAAE,UAAU,CAAC,SAAS;gBACxB,KAAK,EAAE,WAAW;gBAClB,MAAM;gBACN,MAAM,EAAE,UAAU,CAAC,MAA4C;aAChE,CAAC,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,oDAAoD;oBACpD,EAAE;oBACF,uDAAuD;oBACvD,+DAA+D;oBAC/D,wDAAwD;oBACxD,6DAA6D;oBAC7D,6DAA6D;oBAC7D,+DAA+D;oBAC/D,6DAA6D;oBAC7D,gEAAgE;oBAChE,+DAA+D;oBAC/D,uDAAuD;oBACvD,EAAE;oBACF,+DAA+D;oBAC/D,4DAA4D;oBAC5D,+DAA+D;oBAC/D,6DAA6D;oBAC7D,0DAA0D;oBAC1D,+DAA+D;oBAC/D,+DAA+D;oBAC/D,gEAAgE;oBAChE,+DAA+D;oBAC/D,wBAAwB;oBACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC;oBAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,OAAO,QAAQ,GAAG,gBAAgB,EAAE,CAAC;wBACnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wBACzD,QAAQ,IAAI,CAAC,CAAC;wBACd,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;4BACzC,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,QAAQ,IAAI,gBAAgB,EAAE,CAAC;wBACjC,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE;4BACvE,WAAW,EAAE,GAAG,CAAC,EAAE;4BACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;4BAC7B,QAAQ;4BACR,gBAAgB;yBACjB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;wBACxC,WAAW,EAAE,GAAG,CAAC,EAAE;wBACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;wBAC7B,GAAG,aAAa,CAAC,GAAG,CAAC;qBACtB,CAAC,CAAC;oBACH,qEAAqE;oBACrE,6DAA6D;oBAC7D,kEAAkE;oBAClE,kEAAkE;oBAClE,sEAAsE;oBACtE,IAAI,CAAC;wBACH,MAAM,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBACrD,CAAC;oBAAC,OAAO,WAAW,EAAE,CAAC;wBACrB,MAAM,CAAC,KAAK,CAAC,mDAAmD,EAAE;4BAChE,WAAW,EAAE,GAAG,CAAC,EAAE;4BACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;4BAC7B,GAAG,aAAa,CAAC,WAAW,CAAC;yBAC9B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,KAAK,CAAC,KAAK;YACT,IAAI,OAAO;gBAAE,OAAO;YAEpB,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,kEAAkE;YAClE,oCAAoC;YACpC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC;YAED,OAAO,GAAG,IAAI,CAAC;YAEf,4BAA4B;YAC5B,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,iBAAiB,CAAC,CAAC;gBAC/C,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACrB,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;oBACjC,KAAK,YAAY,EAAE,CAAC;gBACtB,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBACvB,KAAK,YAAY,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAE5C,wDAAwD;YACxD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,aAAa,CAAC,eAAe,CAAC,CAAC;gBAC/B,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE5B,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,SAAS;YACX,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,sBAAsB;AAEtB,SAAS,kBAAkB;IACzB,MAAM,MAAM,GAAG,kBAAkB,CAAC;IAClC,OAAO;QACL,KAAK,CAAC,OAAO,EAAE,QAAQ;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,QAAQ;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,QAAQ;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,QAAQ;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/worker/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ export const getUser = defineCapability({
|
|
|
23
23
|
data: ["User"],
|
|
24
24
|
events: [],
|
|
25
25
|
external: [],
|
|
26
|
+
capabilities: [], // canonical invoke targets: ["billing.getInvoice"]
|
|
26
27
|
ai: false,
|
|
27
28
|
},
|
|
28
29
|
|
|
@@ -106,11 +107,35 @@ Every capability must declare its side effects in the `effects` field:
|
|
|
106
107
|
- `data` — entity names this capability reads from or writes to
|
|
107
108
|
- `events` — event types this capability may emit
|
|
108
109
|
- `external` — external integrations this capability calls (APIs, services)
|
|
110
|
+
- `capabilities` — canonical names (`<domain>.<name>`) this handler may invoke via `ctx.capabilities.invoke`
|
|
109
111
|
- `flows` — flow names this capability may start (optional)
|
|
110
112
|
- `ai` — whether this capability uses AI operations
|
|
111
113
|
|
|
112
114
|
Effects are used by governance rules to analyze the system.
|
|
113
115
|
|
|
116
|
+
## Capability-to-capability invocation
|
|
117
|
+
|
|
118
|
+
The only sanctioned path for synchronous composition is `ctx.capabilities.invoke`:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
handler: async (ctx, input) => {
|
|
122
|
+
const invoice = await ctx.capabilities.invoke("billing.getInvoice", {
|
|
123
|
+
invoiceId: input.invoiceId,
|
|
124
|
+
});
|
|
125
|
+
return { invoice };
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Rules:
|
|
130
|
+
|
|
131
|
+
- Declare every invoke target in `effects.capabilities` using **canonical names** (`billing.getInvoice`, not `getInvoice`).
|
|
132
|
+
- Undeclared calls, cycles, missing targets, and synchronous job invokes fail at runtime with `dependencyViolation`.
|
|
133
|
+
- Do **not** import other capability handlers or call `.handler` directly — `plumbus verify` flags direct handler imports.
|
|
134
|
+
- Handler-visible `ctx.__runtime` does not expose internal invokers; use `ctx.capabilities.invoke` only.
|
|
135
|
+
- Prefer flows for multi-step orchestration; use invoke when you need a callee's result in the same execution path.
|
|
136
|
+
|
|
137
|
+
The local `name` field in `defineCapability` stays short (`getInvoice`); the framework derives the canonical registry key from `domain` + `name`. Run `plumbus generate` after changes so `RegisteredCapabilityName` and manifests stay in sync.
|
|
138
|
+
|
|
114
139
|
## Explanation Tracking
|
|
115
140
|
|
|
116
141
|
Capabilities that use AI (`effects.ai: true`) should enable explanation tracking:
|
|
@@ -208,4 +233,14 @@ export const generateReport = defineCapability({
|
|
|
208
233
|
});
|
|
209
234
|
```
|
|
210
235
|
|
|
211
|
-
Job capabilities are exposed as `POST` endpoints
|
|
236
|
+
Job capabilities are exposed as `POST` endpoints. From **0.5.0**, when the API wires `jobQueue` (any job capability on `plumbus dev` / `plumbus start` — including in-memory queues), routes return **`202 Accepted`** with `{ data: { jobId, status: "accepted" } }` and enqueue via the jobs queue. This is **not** gated on whether a worker pool runs in the same process; `PLUMBUS_RUNTIME_ROLE=api` still returns **202** but needs a separate `plumbus worker` to execute jobs.
|
|
237
|
+
|
|
238
|
+
Poll completion with:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
GET /api/jobs/:jobId
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Response: `{ data: { jobId, status, output, error, … } }`. Status values include `queued`, `running`, `completed`, `failed`, and `dead_lettered` from `job_executions`. Run `plumbus migrate generate && plumbus migrate apply` **before** job traffic — routes fail at the DB layer if the table is missing.
|
|
245
|
+
|
|
246
|
+
**Pre-0.5.0 note:** job routes often returned **200** with the handler output synchronously because the server did not wire a job queue. Update HTTP clients that assumed synchronous job responses. See `deployment.md` (Upgrading to 0.5) for the full checklist.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Deployment
|
|
2
2
|
|
|
3
|
-
Plumbus applications deploy as up to
|
|
3
|
+
Plumbus applications deploy as up to four services — a **backend** (Fastify API server), an optional **worker** (background queues), a **frontend** (Next.js), and optionally an **admin dashboard** (Next.js) — backed by PostgreSQL and Redis.
|
|
4
4
|
|
|
5
5
|
## Service Topology
|
|
6
6
|
|
|
@@ -11,16 +11,18 @@ Plumbus applications deploy as up to three services — a **backend** (Fastify A
|
|
|
11
11
|
| :3001 |---->| :3002 |---->| :3000 |
|
|
12
12
|
+-----------+ +-----------+ +-----+-----+
|
|
13
13
|
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
+---------------------------+---------------------------+
|
|
15
|
+
| | |
|
|
16
|
+
+-----v-----+ +-----v-----+ +-----v-----+
|
|
17
|
+
| worker | | PG | | Redis |
|
|
18
|
+
| (optional)| | :5432 | | :6379 |
|
|
19
|
+
| :3001 | +-----------+ +-----------+
|
|
20
|
+
+-----------+
|
|
20
21
|
```
|
|
21
22
|
|
|
22
23
|
- **Frontend** and **admin** proxy API calls to the backend server-side. Browsers never connect directly to the backend.
|
|
23
|
-
- **Backend** connects to PostgreSQL (data) and Redis (
|
|
24
|
+
- **Backend** connects to PostgreSQL (data) and Redis (shared event/flow/job queues).
|
|
25
|
+
- **Worker** (optional) runs `plumbus worker` for background processing. Omit when using colocated mode (`plumbus start` with default `PLUMBUS_RUNTIME_ROLE=all`). Required for horizontal scaling with `PLUMBUS_RUNTIME_ROLE=api`.
|
|
24
26
|
|
|
25
27
|
---
|
|
26
28
|
|
|
@@ -181,6 +183,74 @@ npx plumbus migrate apply
|
|
|
181
183
|
|
|
182
184
|
Use `/ready` for container health checks and load balancer probes.
|
|
183
185
|
|
|
186
|
+
### Split API + Worker Deployment
|
|
187
|
+
|
|
188
|
+
For production deployments that scale API and background work independently:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# API container — no worker pool
|
|
192
|
+
PLUMBUS_RUNTIME_ROLE=api npx plumbus start --port 3000
|
|
193
|
+
|
|
194
|
+
# Worker container — no public API routes
|
|
195
|
+
npx plumbus worker start --health-port 3001
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Redis is required** when API and worker run as separate replicas. Set `QUEUE_URL` or `REDIS_URL` on both containers.
|
|
199
|
+
|
|
200
|
+
### Upgrading to 0.5 (workers, queues, and capability invocation)
|
|
201
|
+
|
|
202
|
+
When upgrading `@plumbus/core` to **0.5.x** from 0.4.x:
|
|
203
|
+
|
|
204
|
+
**Capability invocation (canonical names, invoke policy, flow auth):** read `node_modules/@plumbus/core/instructions/upgrading-0.5-capabilities.md` for the agent-facing migration playbook. Summary:
|
|
205
|
+
|
|
206
|
+
1. **Canonical names** — update flow `step.capability`, `effects.capabilities`, `ctx.capabilities.invoke`, tests, and MCP references to `<domain>.<name>`.
|
|
207
|
+
2. **Invoke policy** — declare `effects.capabilities`; replace direct handler imports with `ctx.capabilities.invoke`.
|
|
208
|
+
3. **Flow auth snapshot** — user-triggered flow steps run under the caller's stored roles (no auto-`system`); fix `access.roles` on step targets.
|
|
209
|
+
4. **Regenerate and verify** — `plumbus generate` then `plumbus verify`.
|
|
210
|
+
|
|
211
|
+
**Workers and queues:**
|
|
212
|
+
|
|
213
|
+
1. **Migrate** — `plumbus migrate generate && plumbus migrate apply` (adds `job_executions` and `auth_snapshot_json` on `flow_executions`). Apply **before** job routes and new flow executions receive traffic.
|
|
214
|
+
2. **HTTP job clients** — `kind: 'job'` `POST` routes return **202** with `{ data: { jobId, status: "accepted" } }` when job capabilities exist; poll `GET /api/jobs/:jobId`. Pre-0.5.0 often returned **200** synchronously.
|
|
215
|
+
3. **Optional peers** — `pnpm add redis` for multi-replica production; `pnpm add cron-parser` if flows use schedule triggers.
|
|
216
|
+
4. **Split deploy** — `PLUMBUS_RUNTIME_ROLE=api` on API containers plus `plumbus worker start` on worker containers; API-only without a worker enqueues but never executes.
|
|
217
|
+
5. **`eventHandler`** — add `trigger: { event: "…" }` for auto-registration, or keep manual `ConsumerRegistry` wiring.
|
|
218
|
+
|
|
219
|
+
Full monorepo checklists: `docs/upgrading-workers.md` and `docs/upgrading-capability-names.md` (framework repo; not in the npm package).
|
|
220
|
+
|
|
221
|
+
| Container | Command | Probes | Notes |
|
|
222
|
+
|-----------|---------|--------|-------|
|
|
223
|
+
| API | `plumbus start` | `GET /health`, `GET /ready` on port 3000 | Set `PLUMBUS_RUNTIME_ROLE=api` |
|
|
224
|
+
| Worker | `plumbus worker start` | `GET /health`, `GET /ready` on `--health-port` (default 3001) | Exposes `/metrics` for Prometheus |
|
|
225
|
+
|
|
226
|
+
Install optional peers in both images when needed:
|
|
227
|
+
|
|
228
|
+
```dockerfile
|
|
229
|
+
RUN npm install redis cron-parser
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- `redis` — durable shared queues (required for split/multi-replica)
|
|
233
|
+
- `cron-parser` — only if flows use `schedule` triggers
|
|
234
|
+
|
|
235
|
+
Worker entrypoint example:
|
|
236
|
+
|
|
237
|
+
```sh
|
|
238
|
+
#!/bin/sh
|
|
239
|
+
set -e
|
|
240
|
+
exec npx plumbus worker start --health-port 3001
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Worker health probes (Kubernetes):
|
|
244
|
+
|
|
245
|
+
```yaml
|
|
246
|
+
livenessProbe:
|
|
247
|
+
httpGet: { path: /health, port: 3001 }
|
|
248
|
+
readinessProbe:
|
|
249
|
+
httpGet: { path: /ready, port: 3001 }
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Colocated mode (single `plumbus start` process, no separate worker container) remains the default and requires no `PLUMBUS_RUNTIME_ROLE` override. See `docs/architecture/workers-and-queues.md` for runtime mode details.
|
|
253
|
+
|
|
184
254
|
---
|
|
185
255
|
|
|
186
256
|
## Frontend Deployment
|
|
@@ -243,6 +313,10 @@ After a standalone build, copy static files alongside the server:
|
|
|
243
313
|
| `AI_OPENAI_MODEL` | No | `gpt-4o-mini` | Default OpenAI model |
|
|
244
314
|
| `AI_DEFAULT_MODEL` | No | `gpt-4o` | Fallback model |
|
|
245
315
|
| `TRUST_PROXY` | No | — | Set to `true` behind a reverse proxy so `request.ip` reflects `X-Forwarded-For` |
|
|
316
|
+
| `PLUMBUS_RUNTIME_ROLE` | No | `all` | `api` for API-only replicas; use `plumbus worker` separately |
|
|
317
|
+
| `QUEUE_URL` | No | — | Redis connection URL (preferred over host/port) |
|
|
318
|
+
| `REDIS_URL` | No | — | Alias for `QUEUE_URL` |
|
|
319
|
+
| `QUEUE_BACKEND` | No | auto | Force `memory` or `redis` queue backend |
|
|
246
320
|
|
|
247
321
|
### Frontend / Admin
|
|
248
322
|
|
|
@@ -264,6 +338,7 @@ After a standalone build, copy static files alongside the server:
|
|
|
264
338
|
| Frontend | ~150-200 MB | > 400 MB |
|
|
265
339
|
| Admin | ~150-200 MB | > 400 MB |
|
|
266
340
|
| Backend | ~500-700 MB | > 1 GB |
|
|
341
|
+
| Worker | ~500-700 MB | > 1 GB |
|
|
267
342
|
|
|
268
343
|
If images exceed these sizes, you are likely not using `pnpm deploy` (Rule 5) or not stripping backend deps (Rule 7, Rule 14).
|
|
269
344
|
|
|
@@ -402,8 +477,13 @@ services:
|
|
|
402
477
|
image: redis:7-alpine
|
|
403
478
|
backend:
|
|
404
479
|
build: { dockerfile: Dockerfile.backend }
|
|
480
|
+
environment: { PLUMBUS_RUNTIME_ROLE: api }
|
|
405
481
|
depends_on: [postgres, redis]
|
|
406
482
|
volumes: [uploads_data:/app/uploads]
|
|
483
|
+
worker:
|
|
484
|
+
build: { dockerfile: Dockerfile.backend }
|
|
485
|
+
command: ['npx', 'plumbus', 'worker', 'start', '--health-port', '3001']
|
|
486
|
+
depends_on: [postgres, redis]
|
|
407
487
|
frontend:
|
|
408
488
|
build: { dockerfile: Dockerfile.frontend }
|
|
409
489
|
depends_on: [backend]
|
|
@@ -477,7 +557,8 @@ cookies().set("auth_token", token, {
|
|
|
477
557
|
|
|
478
558
|
| Resource | Purpose |
|
|
479
559
|
|----------|---------|
|
|
480
|
-
| `Deployment` (backend) + `Service` | Plumbus API server — stateless, scales horizontally |
|
|
560
|
+
| `Deployment` (backend) + `Service` | Plumbus API server — stateless, scales horizontally (`PLUMBUS_RUNTIME_ROLE=api`) |
|
|
561
|
+
| `Deployment` (worker) + `Service` | Background worker pool — scales independently (`plumbus worker`) |
|
|
481
562
|
| `Deployment` (frontend) + `Service` | Next.js user-facing app — stateless |
|
|
482
563
|
| `Deployment` (admin) + `Service` | Next.js admin dashboard — stateless |
|
|
483
564
|
| `Ingress` | Routes traffic: `/api` -> backend, `/` -> frontend, `/admin` -> admin |
|
|
@@ -521,7 +602,8 @@ readinessProbe:
|
|
|
521
602
|
|
|
522
603
|
### Scaling
|
|
523
604
|
|
|
524
|
-
- **Backend**: Stateless — safe to scale. All replicas must share the same `AUTH_SECRET`.
|
|
605
|
+
- **Backend**: Stateless — safe to scale. All replicas must share the same `AUTH_SECRET`. Set `PLUMBUS_RUNTIME_ROLE=api` and run separate worker replicas.
|
|
606
|
+
- **Workers**: Stateless — scale independently. Require shared Redis (`QUEUE_URL`). Probe `/ready` on the worker health port.
|
|
525
607
|
- **Frontends**: Stateless — scale freely behind a load balancer.
|
|
526
608
|
- **Uploads**: Replace local `uploads/` with object storage (S3, GCS) or a `ReadWriteMany` PVC.
|
|
527
609
|
- **PostgreSQL / Redis**: Use managed services (RDS, ElastiCache) — not the Docker Compose images.
|
|
@@ -539,7 +621,10 @@ readinessProbe:
|
|
|
539
621
|
- [ ] Health checks on `/ready`
|
|
540
622
|
- [ ] `config/app.config.ts` uses dynamic environment detection
|
|
541
623
|
- [ ] AI provider API keys configured
|
|
542
|
-
- [ ] Redis available for
|
|
624
|
+
- [ ] Redis available for shared queues (required for split API + worker)
|
|
625
|
+
- [ ] `redis` npm package installed when using Redis backend
|
|
626
|
+
- [ ] `cron-parser` installed if flows use schedule triggers
|
|
627
|
+
- [ ] Worker health probes configured when running `plumbus worker` separately
|
|
543
628
|
|
|
544
629
|
### Docker — Image Size
|
|
545
630
|
|
package/instructions/events.md
CHANGED
|
@@ -76,6 +76,7 @@ export const onOrderPlaced = defineCapability({
|
|
|
76
76
|
name: "onOrderPlaced",
|
|
77
77
|
kind: "eventHandler",
|
|
78
78
|
domain: "fulfillment",
|
|
79
|
+
trigger: { event: "order.placed" }, // auto-registers at worker startup (0.5+)
|
|
79
80
|
// ...
|
|
80
81
|
handler: async (ctx, event) => {
|
|
81
82
|
// event is the typed payload
|
|
@@ -84,6 +85,16 @@ export const onOrderPlaced = defineCapability({
|
|
|
84
85
|
});
|
|
85
86
|
```
|
|
86
87
|
|
|
88
|
+
### Auto-registration (`trigger.event`)
|
|
89
|
+
|
|
90
|
+
From **0.5.0**, set `trigger: { event: "<event.name>", versionConstraint?: "..." }` on `eventHandler` capabilities. The worker pool registers a queue consumer automatically — no manual `ConsumerRegistry` entry required.
|
|
91
|
+
|
|
92
|
+
- **Manual registration still works** and takes precedence when the consumer id equals the capability name.
|
|
93
|
+
- **`plumbus verify`** and **`plumbus doctor`** warn when `eventHandler` capabilities omit `trigger.event` (advisory).
|
|
94
|
+
- **`trigger` is only valid on `kind: "eventHandler"`** — other kinds throw at define time.
|
|
95
|
+
|
|
96
|
+
Dequeue uses tenant binding from the `event_outbox` row (fail-closed). Do not push forged messages to Redis; use `plumbus events replay` or `plumbus events dead-letter retry` for operational recovery.
|
|
97
|
+
|
|
87
98
|
## Idempotency
|
|
88
99
|
|
|
89
100
|
Consumers should be idempotent — processing the same event twice must produce the same result. The framework tracks delivered event+consumer pairs to support this.
|
package/instructions/flows.md
CHANGED
|
@@ -16,11 +16,11 @@ export const refundApproval = defineFlow({
|
|
|
16
16
|
state: z.object({ approved: z.boolean().default(false) }),
|
|
17
17
|
|
|
18
18
|
steps: [
|
|
19
|
-
{ type: "capability", name: "validateRefund" },
|
|
19
|
+
{ type: "capability", name: "validateRefund", capability: "billing.validateRefund" },
|
|
20
20
|
{ type: "conditional", name: "checkAmount", if: "amount > 100", then: "managerApproval", else: "autoApprove" },
|
|
21
21
|
{ type: "wait", name: "managerApproval", event: "refund.approved" },
|
|
22
|
-
{ type: "capability", name: "autoApprove" },
|
|
23
|
-
{ type: "capability", name: "processRefund" },
|
|
22
|
+
{ type: "capability", name: "autoApprove", capability: "billing.autoApprove" },
|
|
23
|
+
{ type: "capability", name: "processRefund", capability: "billing.processRefund" },
|
|
24
24
|
{ type: "eventEmit", name: "notifyCustomer", event: "refund.completed" },
|
|
25
25
|
],
|
|
26
26
|
|
|
@@ -33,7 +33,7 @@ export const refundApproval = defineFlow({
|
|
|
33
33
|
|
|
34
34
|
| Type | Purpose | Key Fields |
|
|
35
35
|
|------|---------|-----------|
|
|
36
|
-
| `capability` | Execute a named capability | `name` (capability name) |
|
|
36
|
+
| `capability` | Execute a named capability | `name` (step id), `capability` (canonical `<domain>.<name>`) |
|
|
37
37
|
| `conditional` | Branch based on condition | `if`, `then`, `else` |
|
|
38
38
|
| `wait` | Pause until event or timeout | `event` |
|
|
39
39
|
| `delay` | Pause for a fixed duration | `duration` (e.g., `"24h"`, `"5m"`) |
|
|
@@ -63,6 +63,14 @@ The `then` and `else` values reference step **names** within the same flow. Exec
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
All branches execute concurrently. The flow waits for **all** branches to complete before advancing. If any branch fails, the entire parallel step fails.
|
|
66
|
+
## Flow step auth and job blocking
|
|
67
|
+
|
|
68
|
+
Flow capability steps run under the **caller's auth snapshot** stored in `flow_executions.auth_snapshot_json` — not auto-`system` on user-triggered flows. Capabilities must allow the original caller's roles/scopes (or `public`). Scheduled flows still run under explicit `system` auth from the scheduler.
|
|
69
|
+
|
|
70
|
+
**Job capabilities** cannot run synchronously inside a flow step. Use job dispatch, events, or async consumers instead — the step executor returns `dependencyViolation` when a step references `kind: 'job'`.
|
|
71
|
+
|
|
72
|
+
Flow steps are **not** subject to a parent capability's `effects.capabilities`; only handler-to-handler `ctx.capabilities.invoke` requires declared dependencies.
|
|
73
|
+
|
|
66
74
|
## State Management
|
|
67
75
|
|
|
68
76
|
Flows maintain a `state` object persisted across steps. Each step can read and modify state through the flow execution context.
|
|
@@ -32,6 +32,12 @@ Plumbus governance is **advisory, not blocking** — "guardrails, not gates." Ru
|
|
|
32
32
|
- Capabilities with too many side effects
|
|
33
33
|
- Flows with excessive branching depth
|
|
34
34
|
- Large handler implementations (complexity warning)
|
|
35
|
+
- **`architecture.non-canonical-capability-reference`** — flow `step.capability` or `effects.capabilities` entries missing `<domain>.<name>` prefix
|
|
36
|
+
- **`architecture.missing-capability-dependency`** — declared invoke target not registered
|
|
37
|
+
- **`architecture.circular-capability-dependency`** — cycle in `effects.capabilities` graph
|
|
38
|
+
- **`architecture.deep-capability-chain`** — deep nested invoke chains (info; consider a flow)
|
|
39
|
+
- **`architecture.job-capability-dependency`** — `kind: 'job'` declared as synchronous invoke target
|
|
40
|
+
- **`architecture.direct-capability-handler-import`** — capability module imports another handler (source scan under `app/capabilities/`)
|
|
35
41
|
|
|
36
42
|
### AI
|
|
37
43
|
- Prompts receiving sensitive classified data
|
package/instructions/mcp.md
CHANGED
|
@@ -17,4 +17,4 @@ Plumbus capabilities can be exposed to external AI agents as MCP tools. **Contra
|
|
|
17
17
|
- **`plumbus generate`** — MCP manifest + skill files (no `@plumbus/mcp` install required).
|
|
18
18
|
- **`plumbus mcp serve` / `list-tools` / `mcp generate`** — CLI entry points; `mcp.agents` in `plumbus.config.ts`.
|
|
19
19
|
|
|
20
|
-
Install the runtime when serving agents: `pnpm add @plumbus/mcp` (optional peer of `@plumbus/core`, version-locked `0.
|
|
20
|
+
Install the runtime when serving agents: `pnpm add @plumbus/mcp` (optional peer of `@plumbus/core`, version-locked `0.5.x`).
|
package/instructions/patterns.md
CHANGED
|
@@ -56,6 +56,7 @@ app/prompts/<name>.prompt.ts
|
|
|
56
56
|
- **Don't** emit events outside of capabilities — the outbox pattern requires a capability transaction.
|
|
57
57
|
- **Don't** bypass `ctx.auth` checks — the framework evaluates access policies before your handler runs.
|
|
58
58
|
- **Don't** bypass `ctx.*` subsystems with custom infrastructure layers unless the framework explicitly documents that extension point.
|
|
59
|
+
- **Don't** import another capability module and call its `.handler` or `executeCapability` directly — declare the dependency in `effects.capabilities` and use `ctx.capabilities.invoke('<domain>.<name>', input)`.
|
|
59
60
|
- **Don't** mutate the `ctx` object — it is scoped and controlled by the framework.
|
|
60
61
|
- **Don't** import framework internals — use only the public SDK surface (`defineCapability`, `defineFlow`, etc.).
|
|
61
62
|
- **Don't** store secrets in code — use `ctx.config` and environment variables.
|
package/instructions/security.md
CHANGED
|
@@ -24,6 +24,15 @@ access: {
|
|
|
24
24
|
|
|
25
25
|
If any check fails → **403 Forbidden** with audit record.
|
|
26
26
|
|
|
27
|
+
## Flow auth snapshot (0.5+)
|
|
28
|
+
|
|
29
|
+
Flow capability steps run under the **caller's stored auth snapshot**, not the worker's `system` identity. When a flow starts, the framework persists the full `AuthContext` in `flow_executions.auth_snapshot_json` and restores it on each step (with `actor` / `tenant_id` from the execution row).
|
|
30
|
+
|
|
31
|
+
- **User-triggered flows** (HTTP, API, manual `ctx.flows.start`) — steps enforce the original caller's roles and scopes. Capabilities must list those roles in `access.roles` (or `public: true`). There is no implicit `system` elevation on every step.
|
|
32
|
+
- **Scheduled / worker-owned flows** — still run under explicit `system` auth from the scheduler or worker bootstrap.
|
|
33
|
+
|
|
34
|
+
If flow steps return **403** after upgrading to 0.5.x, audit `access.roles` on step target capabilities. See `upgrading-0.5-capabilities.md` for the migration checklist.
|
|
35
|
+
|
|
27
36
|
## Auth Context (`ctx.auth`)
|
|
28
37
|
|
|
29
38
|
| Property | Type | Description |
|