@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.
- package/README.md +2 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/ai/ai/cost-tracker.d.ts +93 -0
- package/dist/ai/ai/derive-ledger-usage.d.ts +10 -0
- package/dist/ai/ai/model-pricing.d.ts +51 -0
- package/dist/ai/ai/provider.d.ts +214 -0
- package/dist/ai/ai/refusal.d.ts +27 -0
- package/dist/ai/ai/usage-client.d.ts +30 -0
- package/dist/ai/ai-service.d.ts +1 -1
- package/dist/ai/ai-service.d.ts.map +1 -1
- package/dist/ai/ai-service.js +21 -16
- package/dist/ai/ai-service.js.map +1 -1
- package/dist/ai/cost-tracker.d.ts +17 -1
- package/dist/ai/cost-tracker.d.ts.map +1 -1
- package/dist/ai/cost-tracker.js +8 -6
- package/dist/ai/cost-tracker.js.map +1 -1
- package/dist/ai/derive-ledger-usage.d.ts +11 -0
- package/dist/ai/derive-ledger-usage.d.ts.map +1 -0
- package/dist/ai/derive-ledger-usage.js +36 -0
- package/dist/ai/derive-ledger-usage.js.map +1 -0
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/types/config.d.ts +72 -0
- package/dist/ai/types/enums.d.ts +73 -0
- 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 +3 -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-schedule-list.d.ts +31 -0
- package/dist/cli/commands/flow-schedule-list.d.ts.map +1 -0
- package/dist/cli/commands/flow-schedule-list.js +93 -0
- package/dist/cli/commands/flow-schedule-list.js.map +1 -0
- package/dist/cli/commands/flow.d.ts.map +1 -1
- package/dist/cli/commands/flow.js +75 -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 +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -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 +55 -4
- 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/voice.d.ts +12 -0
- package/dist/cli/commands/voice.d.ts.map +1 -0
- package/dist/cli/commands/voice.js +109 -0
- package/dist/cli/commands/voice.js.map +1 -0
- 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 +133 -111
- 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/cli/voice-agent-bootstrap.d.ts +22 -0
- package/dist/cli/voice-agent-bootstrap.d.ts.map +1 -0
- package/dist/cli/voice-agent-bootstrap.js +12 -0
- package/dist/cli/voice-agent-bootstrap.js.map +1 -0
- package/dist/cli/voice-serve-context.d.ts +7 -0
- package/dist/cli/voice-serve-context.d.ts.map +1 -0
- package/dist/cli/voice-serve-context.js +26 -0
- package/dist/cli/voice-serve-context.js.map +1 -0
- 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 +18 -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 +75 -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 +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- 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 +24 -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 +12 -0
- package/dist/testing/context.js.map +1 -1
- package/dist/testing/e2e.d.ts +6 -0
- package/dist/testing/e2e.d.ts.map +1 -1
- package/dist/testing/e2e.js +2 -0
- package/dist/testing/e2e.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 +49 -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 +16 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAuBlC,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,GAAG;IAAE,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAAC,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAAE,GACzF,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAqH5C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoH5D"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// ── plumbus worker ──
|
|
2
|
+
// Dedicated worker process for background queues, flows, and jobs.
|
|
3
|
+
import { eq, sql } from 'drizzle-orm';
|
|
4
|
+
import { closeDatabaseConnection, resolveDatabaseConnection, } from '../../data/connection.js';
|
|
5
|
+
import { deadLetterTable, outboxTable } from '../../events/outbox.js';
|
|
6
|
+
import { PromptRegistry } from '../../ai/prompt-registry.js';
|
|
7
|
+
import { loadConfig, validateConfig } from '../../config/loader.js';
|
|
8
|
+
import { EntityRegistry } from '../../data/registry.js';
|
|
9
|
+
import { ConsumerRegistry } from '../../events/consumer-registry.js';
|
|
10
|
+
import { EventRegistry } from '../../events/registry.js';
|
|
11
|
+
import { CapabilityRegistry } from '../../execution/capability-registry.js';
|
|
12
|
+
import { FlowRegistry } from '../../flows/registry.js';
|
|
13
|
+
import { discoverRuntimeResources, needsWorkerPool, resolveRuntimeRole, } from '../../runtime/bootstrap.js';
|
|
14
|
+
import { loadServerExtensions } from '../../runtime/load-extensions.js';
|
|
15
|
+
import { resolveRuntimeQueues, shouldUseRedisBackend } from '../../runtime/queue-factory.js';
|
|
16
|
+
import { startWorkerPool } from '../../runtime/start-worker-pool.js';
|
|
17
|
+
import { createWorkerHealthServer } from '../../runtime/worker-health.js';
|
|
18
|
+
import { createPlumbusMetrics } from '../../observability/metrics.js';
|
|
19
|
+
import { logHookError } from '../../errors/hook-log.js';
|
|
20
|
+
import { info, error as logError } from '../utils.js';
|
|
21
|
+
/**
|
|
22
|
+
* Start a worker-only process (no HTTP API).
|
|
23
|
+
* Used with PLUMBUS_RUNTIME_ROLE=worker or `plumbus worker`.
|
|
24
|
+
*/
|
|
25
|
+
export async function startWorkerProcess(options) {
|
|
26
|
+
const config = loadConfig();
|
|
27
|
+
const validation = validateConfig(config);
|
|
28
|
+
if (!validation.valid) {
|
|
29
|
+
throw new Error(`Config validation failed: ${validation.errors.join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
const runtimeRole = resolveRuntimeRole('worker');
|
|
32
|
+
if (runtimeRole !== 'worker') {
|
|
33
|
+
info(`Runtime role resolved to "${runtimeRole}" (expected worker)`);
|
|
34
|
+
}
|
|
35
|
+
info('Plumbus Worker');
|
|
36
|
+
const resources = await discoverRuntimeResources();
|
|
37
|
+
if (!needsWorkerPool(resources)) {
|
|
38
|
+
info('No background work detected — worker will still drain outbox if events exist');
|
|
39
|
+
}
|
|
40
|
+
const capabilities = new CapabilityRegistry();
|
|
41
|
+
capabilities.registerAll(resources.capabilities);
|
|
42
|
+
const entities = new EntityRegistry();
|
|
43
|
+
entities.registerAll(resources.entities);
|
|
44
|
+
const events = new EventRegistry();
|
|
45
|
+
events.registerAll(resources.events);
|
|
46
|
+
const flows = new FlowRegistry();
|
|
47
|
+
flows.registerAll(resources.flows);
|
|
48
|
+
const consumers = new ConsumerRegistry();
|
|
49
|
+
const promptRegistry = new PromptRegistry();
|
|
50
|
+
for (const prompt of resources.prompts) {
|
|
51
|
+
promptRegistry.register(prompt);
|
|
52
|
+
}
|
|
53
|
+
const dbConnection = await resolveDatabaseConnection(config.database, options);
|
|
54
|
+
const db = dbConnection.db;
|
|
55
|
+
info('Database connected');
|
|
56
|
+
const extensions = await loadServerExtensions();
|
|
57
|
+
const queues = await resolveRuntimeQueues(config, {
|
|
58
|
+
onWarning: (message) => info(`Queue: ${message}`),
|
|
59
|
+
});
|
|
60
|
+
const metrics = createPlumbusMetrics();
|
|
61
|
+
const healthPort = parseInt(options.healthPort ?? '3001', 10);
|
|
62
|
+
const healthHost = options.host ?? '0.0.0.0';
|
|
63
|
+
const workerPool = await startWorkerPool({
|
|
64
|
+
config,
|
|
65
|
+
db,
|
|
66
|
+
queues,
|
|
67
|
+
capabilities,
|
|
68
|
+
entities,
|
|
69
|
+
events,
|
|
70
|
+
flows,
|
|
71
|
+
consumers,
|
|
72
|
+
promptRegistry,
|
|
73
|
+
extensions,
|
|
74
|
+
metrics,
|
|
75
|
+
});
|
|
76
|
+
info('Worker pool started');
|
|
77
|
+
const health = createWorkerHealthServer({
|
|
78
|
+
port: healthPort,
|
|
79
|
+
host: healthHost,
|
|
80
|
+
db,
|
|
81
|
+
queues,
|
|
82
|
+
workerPool,
|
|
83
|
+
metrics,
|
|
84
|
+
});
|
|
85
|
+
const healthAddress = await health.start();
|
|
86
|
+
info(`Worker health: ${healthAddress}/health`);
|
|
87
|
+
info(`Worker metrics: ${healthAddress}/metrics`);
|
|
88
|
+
let shuttingDown = false;
|
|
89
|
+
const shutdown = async () => {
|
|
90
|
+
if (shuttingDown)
|
|
91
|
+
return;
|
|
92
|
+
shuttingDown = true;
|
|
93
|
+
info('Graceful shutdown initiated...');
|
|
94
|
+
await health.stop();
|
|
95
|
+
await workerPool.stop();
|
|
96
|
+
await closeDatabaseConnection(dbConnection);
|
|
97
|
+
info('Worker stopped');
|
|
98
|
+
};
|
|
99
|
+
const onSignal = () => {
|
|
100
|
+
void shutdown();
|
|
101
|
+
};
|
|
102
|
+
process.on('SIGINT', onSignal);
|
|
103
|
+
process.on('SIGTERM', onSignal);
|
|
104
|
+
if (extensions.onProcessError) {
|
|
105
|
+
const errorHook = extensions.onProcessError;
|
|
106
|
+
process.on('uncaughtException', (err) => {
|
|
107
|
+
logError(`Uncaught exception: ${err.message}`);
|
|
108
|
+
Promise.resolve(errorHook({ source: 'uncaughtException', message: err.message, stack: err.stack })).catch((hookErr) => {
|
|
109
|
+
logHookError('onProcessError', hookErr);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
process.on('unhandledRejection', (reason) => {
|
|
113
|
+
const message = reason instanceof Error ? reason.message : String(reason ?? 'Unknown rejection');
|
|
114
|
+
logError(`Unhandled rejection: ${message}`);
|
|
115
|
+
Promise.resolve(errorHook({
|
|
116
|
+
source: 'unhandledRejection',
|
|
117
|
+
message,
|
|
118
|
+
stack: reason instanceof Error ? reason.stack : undefined,
|
|
119
|
+
})).catch((hookErr) => {
|
|
120
|
+
logHookError('onProcessError', hookErr);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return { shutdown };
|
|
125
|
+
}
|
|
126
|
+
export function registerWorkerCommand(program) {
|
|
127
|
+
const worker = program.command('worker').description('Background worker process');
|
|
128
|
+
worker
|
|
129
|
+
.command('start', { isDefault: true })
|
|
130
|
+
.description('Start the worker pool (default)')
|
|
131
|
+
.option('--health-port <port>', 'Health/metrics HTTP port', '3001')
|
|
132
|
+
.option('-H, --host <host>', 'Health server host', '0.0.0.0')
|
|
133
|
+
.action(async (opts) => {
|
|
134
|
+
try {
|
|
135
|
+
await startWorkerProcess({
|
|
136
|
+
healthPort: opts.healthPort,
|
|
137
|
+
host: opts.host,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
logError(`Failed to start worker: ${err instanceof Error ? err.message : String(err)}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
worker
|
|
146
|
+
.command('status')
|
|
147
|
+
.description('Summarize worker-related configuration (static check)')
|
|
148
|
+
.option('--json', 'Output JSON')
|
|
149
|
+
.action(async (opts) => {
|
|
150
|
+
const config = loadConfig();
|
|
151
|
+
const resources = await discoverRuntimeResources();
|
|
152
|
+
const role = resolveRuntimeRole('worker');
|
|
153
|
+
const queues = await resolveRuntimeQueues(config, { preferInMemory: true });
|
|
154
|
+
const configuredDurable = shouldUseRedisBackend(config);
|
|
155
|
+
let dbProbes = { dbAvailable: false };
|
|
156
|
+
try {
|
|
157
|
+
const connection = await resolveDatabaseConnection(config.database, {});
|
|
158
|
+
try {
|
|
159
|
+
const pending = await connection.db
|
|
160
|
+
.select({ count: sql `count(*)::int` })
|
|
161
|
+
.from(outboxTable)
|
|
162
|
+
.where(eq(outboxTable.status, 'pending'));
|
|
163
|
+
const dlq = await connection.db
|
|
164
|
+
.select({ count: sql `count(*)::int` })
|
|
165
|
+
.from(deadLetterTable);
|
|
166
|
+
let queueDepths = null;
|
|
167
|
+
if (configuredDurable) {
|
|
168
|
+
const liveQueues = await resolveRuntimeQueues(config);
|
|
169
|
+
try {
|
|
170
|
+
queueDepths = liveQueues.getDepths ? await liveQueues.getDepths() : null;
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
await liveQueues.close();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
dbProbes = {
|
|
177
|
+
dbAvailable: true,
|
|
178
|
+
outboxPending: pending[0]?.count ?? 0,
|
|
179
|
+
deadLetterCount: dlq[0]?.count ?? 0,
|
|
180
|
+
queueDepths,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
await closeDatabaseConnection(connection);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
dbProbes = { dbAvailable: false };
|
|
189
|
+
}
|
|
190
|
+
const summary = {
|
|
191
|
+
runtimeRole: role,
|
|
192
|
+
needsWorkerPool: needsWorkerPool(resources),
|
|
193
|
+
queueBackend: queues.backend,
|
|
194
|
+
queueDurable: configuredDurable,
|
|
195
|
+
components: {
|
|
196
|
+
outboxDispatcher: true,
|
|
197
|
+
eventWorker: true,
|
|
198
|
+
jobWorker: resources.capabilities.some((c) => c.kind === 'job'),
|
|
199
|
+
flowRunner: resources.flows.length > 0,
|
|
200
|
+
flowScheduler: resources.flows.some((f) => f.schedule),
|
|
201
|
+
flowStepConsumer: configuredDurable && resources.flows.length > 0,
|
|
202
|
+
flowDelayedPromoter: configuredDurable && resources.flows.length > 0,
|
|
203
|
+
},
|
|
204
|
+
capabilities: resources.capabilities.length,
|
|
205
|
+
eventHandlers: resources.capabilities.filter((c) => c.kind === 'eventHandler').length,
|
|
206
|
+
jobs: resources.capabilities.filter((c) => c.kind === 'job').length,
|
|
207
|
+
flows: resources.flows.length,
|
|
208
|
+
events: resources.events.length,
|
|
209
|
+
probes: dbProbes,
|
|
210
|
+
};
|
|
211
|
+
await queues.close();
|
|
212
|
+
if (opts.json) {
|
|
213
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
info(`Runtime role: ${summary.runtimeRole}`);
|
|
217
|
+
info(`Needs worker pool: ${summary.needsWorkerPool}`);
|
|
218
|
+
info(`Queue backend: ${summary.queueBackend} (durable: ${summary.queueDurable})`);
|
|
219
|
+
info(`Worker components: dispatcher, eventWorker${summary.components.jobWorker ? ', jobWorker' : ''}${summary.components.flowRunner ? ', flowRunner' : ''}${summary.components.flowScheduler ? ', scheduler' : ''}${summary.components.flowStepConsumer ? ', flowStepConsumer' : ''}${summary.components.flowDelayedPromoter ? ', delayedPromoter' : ''}`);
|
|
220
|
+
info(`Resources: ${summary.capabilities} capabilities, ${summary.flows} flows, ${summary.events} events`);
|
|
221
|
+
if (dbProbes.dbAvailable) {
|
|
222
|
+
info(`Outbox pending: ${dbProbes.outboxPending ?? 0}`);
|
|
223
|
+
info(`Dead letter: ${dbProbes.deadLetterCount ?? 0}`);
|
|
224
|
+
if (dbProbes.queueDepths) {
|
|
225
|
+
const d = dbProbes.queueDepths;
|
|
226
|
+
info(`Queue depths — events: ${d.events}, flows: ${d.flows}, jobs: ${d.jobs}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
info('Database probes unavailable (connection failed)');
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/cli/commands/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,14 @@ import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
|
|
|
2
2
|
import type { RouteGeneratorConfig } from '../api/route-generator.js';
|
|
3
3
|
import { CapabilityRegistry } from '../execution/capability-registry.js';
|
|
4
4
|
import type { PlumbusConfig } from '../types/config.js';
|
|
5
|
+
import type { EventQueue } from '../events/queue.js';
|
|
5
6
|
export interface McpServeContext {
|
|
6
7
|
config: PlumbusConfig;
|
|
7
8
|
db: PostgresJsDatabase;
|
|
8
9
|
capabilities: CapabilityRegistry;
|
|
9
10
|
routeConfig: RouteGeneratorConfig;
|
|
11
|
+
jobQueue?: EventQueue;
|
|
12
|
+
closeQueues: () => Promise<void>;
|
|
10
13
|
closeDb: () => Promise<void>;
|
|
11
14
|
}
|
|
12
15
|
export declare function buildMcpServeContext(): Promise<McpServeContext>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-serve-context.d.ts","sourceRoot":"","sources":["../../src/cli/mcp-serve-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-serve-context.d.ts","sourceRoot":"","sources":["../../src/cli/mcp-serve-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAUzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,kBAAkB,CAAC;IACvB,YAAY,EAAE,kBAAkB,CAAC;IACjC,WAAW,EAAE,oBAAoB,CAAC;IAClC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAoBD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,eAAe,CAAC,CA+GrE"}
|
|
@@ -1,119 +1,141 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
1
|
+
import { PromptRegistry } from "../ai/prompt-registry.js";
|
|
2
|
+
import { createAuditService } from "../audit/service.js";
|
|
3
|
+
import { createJwtAdapter } from "../auth/adapter.js";
|
|
4
|
+
import { loadConfig } from "../config/loader.js";
|
|
5
|
+
import { closeDatabaseConnection, resolveDatabaseConnection } from "../data/connection.js";
|
|
6
|
+
import { EntityRegistry } from "../data/registry.js";
|
|
7
|
+
import { createEventEmitter } from "../events/emitter.js";
|
|
8
|
+
import { EventRegistry } from "../events/registry.js";
|
|
9
|
+
import { CapabilityRegistry } from "../execution/capability-registry.js";
|
|
10
|
+
import { buildCapabilityRuntimeDeps } from "../execution/capability-invocation.js";
|
|
11
|
+
import {
|
|
12
|
+
createInvocationEmitScope,
|
|
13
|
+
resolveInvocationCausationId
|
|
14
|
+
} from "../execution/invocation-emit-scope.js";
|
|
15
|
+
import { createFlowEngine } from "../flows/engine.js";
|
|
16
|
+
import { createFlowService } from "../flows/flow-service.js";
|
|
17
|
+
import { FlowRegistry } from "../flows/registry.js";
|
|
18
|
+
import { createTranslationService, TranslationRegistry } from "../translations/index.js";
|
|
19
|
+
import { buildWorkerAiService } from "../runtime/bootstrap.js";
|
|
20
|
+
import { loadServerExtensions } from "../runtime/load-extensions.js";
|
|
21
|
+
import { resolveRuntimeQueues } from "../runtime/queue-factory.js";
|
|
22
|
+
import { warn } from "./utils.js";
|
|
23
|
+
import { discoverResources } from "./discover.js";
|
|
20
24
|
async function resolveMcpServeAuthAdapter(config) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
warn('plumbus.config.mcp.agents is not configured — MCP requests will be anonymous and only `access.public: true` capabilities will be callable. See docs/mcp/agent-authentication.md.');
|
|
29
|
-
return createJwtAdapter({
|
|
30
|
-
secret: config.auth.secret ?? 'development-secret-placeholder-32chars-min',
|
|
31
|
-
issuer: config.auth.issuer,
|
|
32
|
-
audience: config.auth.audience,
|
|
25
|
+
if (config.mcp?.agents && Object.keys(config.mcp.agents).length > 0) {
|
|
26
|
+
const { createMcpAuthAdapter } = await import("@plumbus/mcp");
|
|
27
|
+
return createMcpAuthAdapter({
|
|
28
|
+
agents: config.mcp.agents,
|
|
29
|
+
envToken: process.env.PLUMBUS_MCP_TOKEN
|
|
33
30
|
});
|
|
31
|
+
}
|
|
32
|
+
warn(
|
|
33
|
+
"plumbus.config.mcp.agents is not configured \u2014 MCP requests will be anonymous and only `access.public: true` capabilities will be callable. See docs/mcp/agent-authentication.md."
|
|
34
|
+
);
|
|
35
|
+
return createJwtAdapter({
|
|
36
|
+
secret: config.auth.secret ?? "development-secret-placeholder-32chars-min",
|
|
37
|
+
issuer: config.auth.issuer,
|
|
38
|
+
audience: config.auth.audience
|
|
39
|
+
});
|
|
34
40
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
41
|
+
async function buildMcpServeContext() {
|
|
42
|
+
const config = loadConfig({ environment: "development" });
|
|
43
|
+
const resources = await discoverResources();
|
|
44
|
+
const capabilities = new CapabilityRegistry();
|
|
45
|
+
capabilities.registerAll(resources.capabilities);
|
|
46
|
+
const promptRegistry = new PromptRegistry();
|
|
47
|
+
for (const prompt of resources.prompts) {
|
|
48
|
+
promptRegistry.register(prompt);
|
|
49
|
+
}
|
|
50
|
+
const entities = new EntityRegistry();
|
|
51
|
+
entities.registerAll(resources.entities);
|
|
52
|
+
const events = new EventRegistry();
|
|
53
|
+
events.registerAll(resources.events);
|
|
54
|
+
const flows = new FlowRegistry();
|
|
55
|
+
flows.registerAll(resources.flows);
|
|
56
|
+
const dbConnection = await resolveDatabaseConnection(config.database, {});
|
|
57
|
+
const db = dbConnection.db;
|
|
58
|
+
const queues = await resolveRuntimeQueues(config);
|
|
59
|
+
const logger = {
|
|
60
|
+
info: (msg) => console.log(msg),
|
|
61
|
+
warn: (msg) => console.warn(msg),
|
|
62
|
+
error: (msg) => console.error(msg),
|
|
63
|
+
debug: (msg) => console.debug(msg)
|
|
64
|
+
};
|
|
65
|
+
const translationRegistry = new TranslationRegistry();
|
|
66
|
+
translationRegistry.registerAll(resources.translations ?? []);
|
|
67
|
+
const defaultLocale = resources.translations?.[0]?.defaultLocale ?? "en";
|
|
68
|
+
const authAdapter = await resolveMcpServeAuthAdapter(config);
|
|
69
|
+
const extensions = await loadServerExtensions();
|
|
70
|
+
const aiService = buildWorkerAiService({
|
|
71
|
+
config,
|
|
72
|
+
db,
|
|
73
|
+
promptRegistry,
|
|
74
|
+
onAICostRecorded: extensions.onAICostRecorded,
|
|
75
|
+
resolveAiOverrides: extensions.resolveAiOverrides,
|
|
76
|
+
enableStrictStructuredOutputs: extensions.enableStrictStructuredOutputs
|
|
77
|
+
});
|
|
78
|
+
const requestFlowEngine = createFlowEngine({
|
|
79
|
+
db,
|
|
80
|
+
registry: flows,
|
|
81
|
+
stepDeps: {
|
|
82
|
+
async executeCapability() {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: "Flow execution is worker-owned in MCP serve bootstrap"
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
evaluateCondition() {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
68
91
|
}
|
|
69
|
-
|
|
92
|
+
});
|
|
93
|
+
const routeConfig = {
|
|
94
|
+
db,
|
|
95
|
+
authAdapter,
|
|
96
|
+
createDependencies: (auth, options) => {
|
|
97
|
+
const audit = createAuditService({ db, auth });
|
|
98
|
+
const data = entities.createDataService({
|
|
70
99
|
db,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
};
|
|
78
|
-
},
|
|
79
|
-
evaluateCondition() {
|
|
80
|
-
return false;
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
const routeConfig = {
|
|
100
|
+
auth,
|
|
101
|
+
audit,
|
|
102
|
+
bypassTenantScope: options?.bypassTenantScope
|
|
103
|
+
});
|
|
104
|
+
const invocationEmitScope = createInvocationEmitScope();
|
|
105
|
+
const eventService = createEventEmitter({
|
|
85
106
|
db,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
events: eventService,
|
|
100
|
-
flows: createFlowService(requestFlowEngine, auth),
|
|
101
|
-
ai: aiService,
|
|
102
|
-
audit,
|
|
103
|
-
logger,
|
|
104
|
-
config: config,
|
|
105
|
-
translations: createTranslationService(translationRegistry, defaultLocale),
|
|
106
|
-
};
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
return {
|
|
107
|
+
auth,
|
|
108
|
+
registry: events,
|
|
109
|
+
audit,
|
|
110
|
+
getCausationId: () => resolveInvocationCausationId(invocationEmitScope)
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
auth,
|
|
114
|
+
data,
|
|
115
|
+
events: eventService,
|
|
116
|
+
flows: createFlowService(requestFlowEngine, auth),
|
|
117
|
+
ai: aiService,
|
|
118
|
+
audit,
|
|
119
|
+
logger,
|
|
110
120
|
config,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
translations: createTranslationService(translationRegistry, defaultLocale),
|
|
122
|
+
invocationEmitScope,
|
|
123
|
+
...buildCapabilityRuntimeDeps(capabilities)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
config,
|
|
129
|
+
db,
|
|
130
|
+
capabilities,
|
|
131
|
+
routeConfig,
|
|
132
|
+
...queues.isDurable ? { jobQueue: queues.jobs } : {},
|
|
133
|
+
closeQueues: () => queues.close(),
|
|
134
|
+
closeDb: async () => {
|
|
135
|
+
await closeDatabaseConnection(dbConnection);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
118
138
|
}
|
|
119
|
-
|
|
139
|
+
export {
|
|
140
|
+
buildMcpServeContext
|
|
141
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-serve-context.js","sourceRoot":"","sources":["../../src/cli/mcp-serve-context.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,yFAAyF;AAGzF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-serve-context.js","sourceRoot":"","sources":["../../src/cli/mcp-serve-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/resources.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/resources.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuDrF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBjE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0BtE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAexD"}
|
|
@@ -46,7 +46,12 @@ export const ${toCamelCase(name)} = defineCapability({
|
|
|
46
46
|
handler: async (ctx, input) => {
|
|
47
47
|
// TODO: implement ${pascal}
|
|
48
48
|
return {};
|
|
49
|
-
}
|
|
49
|
+
},${kind === 'eventHandler'
|
|
50
|
+
? `
|
|
51
|
+
|
|
52
|
+
// Optional: auto-register this handler on the events queue when workers run.
|
|
53
|
+
// trigger: { event: "your.domain.event" },`
|
|
54
|
+
: ''}
|
|
50
55
|
});
|
|
51
56
|
`;
|
|
52
57
|
}
|
|
@@ -97,7 +102,7 @@ export const ${toCamelCase(name)}Flow = defineFlow({
|
|
|
97
102
|
{
|
|
98
103
|
name: "step1",
|
|
99
104
|
type: "capability",
|
|
100
|
-
capability: "
|
|
105
|
+
capability: "${domain}.stepName",
|
|
101
106
|
},
|
|
102
107
|
],
|
|
103
108
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/cli/templates/resources.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,+CAA+C;AAE/C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;;;eAGM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;WACJ,IAAI;aACF,MAAM;;;;;;wDAMqC,IAAI;;;;;;yBAMnC,MAAM,IAAI,IAAI;;;;;;;;;;;;;;;;;;;;;;;yBAuBd,MAAM
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/cli/templates/resources.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,+CAA+C;AAE/C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;;;eAGM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;WACJ,IAAI;aACF,MAAM;;;;;;wDAMqC,IAAI;;;;;;yBAMnC,MAAM,IAAI,IAAI;;;;;;;;;;;;;;;;;;;;;;;yBAuBd,MAAM;;MAG3B,IAAI,KAAK,cAAc;QACrB,CAAC,CAAC;;;8CAGsC;QACxC,CAAC,CAAC,EACN;;CAED,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,OAAe;IAClE,OAAO;cACK,WAAW,CAAC,IAAI,CAAC;;YAEnB,YAAY,CAAC,IAAI,CAAC;;;;;;CAM7B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;;eAEM,WAAW,CAAC,IAAI,CAAC;WACrB,MAAM;;;;;;;;;;;;CAYhB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,OAAO;;;eAGM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;aACF,MAAM;;;;;;;;;;qBAUE,MAAM;;;;CAI1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAe;IAC5D,OAAO;;WAEE,WAAW,CAAC,IAAI,CAAC;;YAEhB,YAAY,CAAC,IAAI,CAAC;;wCAEU,WAAW,CAAC,IAAI,CAAC;;;;;;;;wCAQjB,WAAW,CAAC,IAAI,CAAC;;;;;;;;;;CAUxD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO;;;eAGM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;;;;;;CAMd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO;;;eAGM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;;;;;;;;;;;;;;;;CAgBd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO;;eAEM,WAAW,CAAC,IAAI,CAAC;WACrB,IAAI;;;;;;;;;;CAUd,CAAC;AACF,CAAC"}
|
package/dist/cli/utils.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export declare function readJson<T = unknown>(filePath: string): T;
|
|
|
8
8
|
export declare function writeFile(filePath: string, content: string): void;
|
|
9
9
|
/** Convert a string to kebab-case */
|
|
10
10
|
export declare function toKebabCase(str: string): string;
|
|
11
|
+
/** Skill file basename for a capability (short name or canonical `domain.name`). */
|
|
12
|
+
export declare function capabilitySkillBasename(ref: {
|
|
13
|
+
name: string;
|
|
14
|
+
} | string): string;
|
|
11
15
|
/** Convert a string to PascalCase */
|
|
12
16
|
export declare function toPascalCase(str: string): string;
|
|
13
17
|
/** Convert a string to camelCase */
|
package/dist/cli/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAMA,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEzD;AAED,0CAA0C;AAC1C,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAGzD;AAED,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjE;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAM/E;AAED,4BAA4B;AAC5B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,yBAAyB;AACzB,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAuBvF;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,GAAE,MAAsB,GAAG,cAAc,CAqBxF;AAID,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CA6D7E;AA2BD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3D"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAMA,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEzD;AAED,0CAA0C;AAC1C,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAGzD;AAED,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjE;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,MAAM,CAO9E;AAED,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAM/E;AAED,4BAA4B;AAC5B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,4BAA4B;AAC5B,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,yBAAyB;AACzB,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAuBvF;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,GAAE,MAAsB,GAAG,cAAc,CAqBxF;AAID,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CA6D7E;AA2BD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3D"}
|
package/dist/cli/utils.js
CHANGED
|
@@ -30,6 +30,15 @@ export function toKebabCase(str) {
|
|
|
30
30
|
.replace(/[\s_]+/g, '-')
|
|
31
31
|
.toLowerCase();
|
|
32
32
|
}
|
|
33
|
+
/** Skill file basename for a capability (short name or canonical `domain.name`). */
|
|
34
|
+
export function capabilitySkillBasename(ref) {
|
|
35
|
+
if (typeof ref === 'string') {
|
|
36
|
+
const dot = ref.indexOf('.');
|
|
37
|
+
const shortName = dot > 0 ? ref.slice(dot + 1) : ref;
|
|
38
|
+
return toKebabCase(shortName);
|
|
39
|
+
}
|
|
40
|
+
return toKebabCase(ref.name);
|
|
41
|
+
}
|
|
33
42
|
/** Convert a string to PascalCase */
|
|
34
43
|
export function toPascalCase(str) {
|
|
35
44
|
return str
|