@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,34 @@
|
|
|
1
|
+
import type { CapabilityContract } from '../types/capability.js';
|
|
2
|
+
import type { CapabilityService, ExecutionContext, ExecutionRuntimeMetadata } from '../types/context.js';
|
|
3
|
+
import type { CapabilityRegistry } from './capability-registry.js';
|
|
4
|
+
import type { CapabilityResult } from './capability-executor.js';
|
|
5
|
+
import type { InvocationEmitScope } from './invocation-emit-scope.js';
|
|
6
|
+
export type DependencyViolationReason = 'undeclaredInvocation' | 'circularInvocation' | 'missingCapability' | 'invocationUnavailable' | 'unsupportedTargetKind';
|
|
7
|
+
export interface DependencyViolationMetadata {
|
|
8
|
+
caller?: string;
|
|
9
|
+
target: string;
|
|
10
|
+
reason: DependencyViolationReason;
|
|
11
|
+
capabilityStack: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export type InternalCapabilityInvoker = (name: string, ctx: ExecutionContext, input: unknown) => Promise<CapabilityResult<unknown>>;
|
|
14
|
+
export interface CapabilityInvocationRuntime {
|
|
15
|
+
invoker: InternalCapabilityInvoker;
|
|
16
|
+
resolveCapability: (name: string) => CapabilityContract | undefined;
|
|
17
|
+
emitScope?: InvocationEmitScope;
|
|
18
|
+
}
|
|
19
|
+
/** Strip internal invoker/registry/emit scope from handler-visible runtime metadata. */
|
|
20
|
+
export declare function stripHandlerRuntime(runtime?: ExecutionRuntimeMetadata): ExecutionRuntimeMetadata | undefined;
|
|
21
|
+
/** Runtime deps for nested capability invocation (wire into ContextDependencies). */
|
|
22
|
+
export declare function buildCapabilityRuntimeDeps(registry: CapabilityRegistry): {
|
|
23
|
+
invokeCapability: InternalCapabilityInvoker;
|
|
24
|
+
resolveCapability: (name: string) => CapabilityContract | undefined;
|
|
25
|
+
};
|
|
26
|
+
export declare function buildRegistryInvoker(registry: CapabilityRegistry): InternalCapabilityInvoker;
|
|
27
|
+
export declare function buildDependencyViolationMessage(metadata: DependencyViolationMetadata): string;
|
|
28
|
+
/**
|
|
29
|
+
* Build the public `ctx.capabilities` service for a running capability handler.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createCapabilityInvokeService(capability: CapabilityContract, ctx: ExecutionContext, runtime: CapabilityInvocationRuntime): CapabilityService;
|
|
32
|
+
/** Invoke surface that always reports invocation unavailability. */
|
|
33
|
+
export declare function createUnavailableCapabilityService(ctx: ExecutionContext): CapabilityService;
|
|
34
|
+
//# sourceMappingURL=capability-invocation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-invocation.d.ts","sourceRoot":"","sources":["../../src/execution/capability-invocation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GACjC,sBAAsB,GACtB,oBAAoB,GACpB,mBAAmB,GACnB,uBAAuB,GACvB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,yBAAyB,CAAC;IAClC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AAExC,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,yBAAyB,CAAC;IACnC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACpE,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,wBAAwB,GACjC,wBAAwB,GAAG,SAAS,CAStC;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG;IACxE,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;CACrE,CAKA;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,yBAAyB,CAW5F;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,2BAA2B,GAAG,MAAM,CAkB7F;AAcD;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,EAC9B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,2BAA2B,GACnC,iBAAiB,CA0EnB;AAED,oEAAoE;AACpE,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,gBAAgB,GAAG,iBAAiB,CAU3F"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { CapabilityKind } from '../types/enums.js';
|
|
2
|
+
import { getCanonicalCapabilityName } from './canonical-name.js';
|
|
3
|
+
import { executeCapability } from './capability-executor.js';
|
|
4
|
+
/** Strip internal invoker/registry/emit scope from handler-visible runtime metadata. */
|
|
5
|
+
export function stripHandlerRuntime(runtime) {
|
|
6
|
+
if (!runtime)
|
|
7
|
+
return undefined;
|
|
8
|
+
const { invokeCapability: _invoker, resolveCapability: _resolve, invocationEmitScope: _emitScope, ...handlerVisible } = runtime;
|
|
9
|
+
return handlerVisible;
|
|
10
|
+
}
|
|
11
|
+
/** Runtime deps for nested capability invocation (wire into ContextDependencies). */
|
|
12
|
+
export function buildCapabilityRuntimeDeps(registry) {
|
|
13
|
+
return {
|
|
14
|
+
invokeCapability: buildRegistryInvoker(registry),
|
|
15
|
+
resolveCapability: (name) => registry.get(name),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function buildRegistryInvoker(registry) {
|
|
19
|
+
return async (name, ctx, input) => {
|
|
20
|
+
const capability = registry.get(name);
|
|
21
|
+
if (!capability) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: ctx.errors.notFound(`Capability "${name}" not found`, { capability: name }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return executeCapability(capability, ctx, input);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function buildDependencyViolationMessage(metadata) {
|
|
31
|
+
const { caller, target, reason, capabilityStack } = metadata;
|
|
32
|
+
switch (reason) {
|
|
33
|
+
case 'undeclaredInvocation':
|
|
34
|
+
return `Capability ${caller ?? '(unknown)'} attempted to invoke ${target}, but ${target} is not declared in ${caller ?? '(unknown)'} effects.capabilities.`;
|
|
35
|
+
case 'circularInvocation':
|
|
36
|
+
return `Circular capability invocation detected: ${[...capabilityStack, target].join(' -> ')}.`;
|
|
37
|
+
case 'missingCapability':
|
|
38
|
+
return `Capability ${caller ?? '(unknown)'} declared or attempted to invoke ${target}, but no registered capability with that name exists.`;
|
|
39
|
+
case 'invocationUnavailable':
|
|
40
|
+
return 'Capability invocation is unavailable in this execution context because no capability registry-backed invoker was provided.';
|
|
41
|
+
case 'unsupportedTargetKind':
|
|
42
|
+
return `Capability ${caller ?? '(unknown)'} attempted to invoke ${target}, but job capabilities cannot be invoked synchronously — use job dispatch, flows, or events instead.`;
|
|
43
|
+
default: {
|
|
44
|
+
const _exhaustive = reason;
|
|
45
|
+
return _exhaustive;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function throwDependencyViolation(ctx, metadata) {
|
|
50
|
+
const message = buildDependencyViolationMessage(metadata);
|
|
51
|
+
throw ctx.errors.dependencyViolation(message, { ...metadata });
|
|
52
|
+
}
|
|
53
|
+
function isDeclaredCapabilityDependency(capability, target) {
|
|
54
|
+
return (capability.effects.capabilities ?? []).includes(target);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build the public `ctx.capabilities` service for a running capability handler.
|
|
58
|
+
*/
|
|
59
|
+
export function createCapabilityInvokeService(capability, ctx, runtime) {
|
|
60
|
+
const caller = getCanonicalCapabilityName(capability);
|
|
61
|
+
const { invoker, resolveCapability, emitScope } = runtime;
|
|
62
|
+
return {
|
|
63
|
+
async invoke(name, input) {
|
|
64
|
+
const stack = ctx.__runtime?.capabilityStack ?? [];
|
|
65
|
+
if (!isDeclaredCapabilityDependency(capability, name)) {
|
|
66
|
+
throwDependencyViolation(ctx, {
|
|
67
|
+
caller,
|
|
68
|
+
target: name,
|
|
69
|
+
reason: 'undeclaredInvocation',
|
|
70
|
+
capabilityStack: stack,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (stack.includes(name)) {
|
|
74
|
+
throwDependencyViolation(ctx, {
|
|
75
|
+
caller,
|
|
76
|
+
target: name,
|
|
77
|
+
reason: 'circularInvocation',
|
|
78
|
+
capabilityStack: stack,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const targetCap = resolveCapability(name);
|
|
82
|
+
if (!targetCap) {
|
|
83
|
+
throwDependencyViolation(ctx, {
|
|
84
|
+
caller,
|
|
85
|
+
target: name,
|
|
86
|
+
reason: 'missingCapability',
|
|
87
|
+
capabilityStack: stack,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (targetCap.kind === CapabilityKind.Job) {
|
|
91
|
+
throwDependencyViolation(ctx, {
|
|
92
|
+
caller,
|
|
93
|
+
target: name,
|
|
94
|
+
reason: 'unsupportedTargetKind',
|
|
95
|
+
capabilityStack: stack,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const nestedCtx = {
|
|
99
|
+
...ctx,
|
|
100
|
+
__runtime: {
|
|
101
|
+
...ctx.__runtime,
|
|
102
|
+
capabilityStack: [...stack, caller],
|
|
103
|
+
invocationCaller: caller,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const prevInvocationCaller = emitScope?.invocationCaller;
|
|
107
|
+
if (emitScope) {
|
|
108
|
+
emitScope.invocationCaller = caller;
|
|
109
|
+
}
|
|
110
|
+
let result;
|
|
111
|
+
try {
|
|
112
|
+
result = await invoker(name, nestedCtx, input);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (emitScope) {
|
|
116
|
+
emitScope.invocationCaller = prevInvocationCaller;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!result.success) {
|
|
120
|
+
throw result.error;
|
|
121
|
+
}
|
|
122
|
+
return result.data;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Invoke surface that always reports invocation unavailability. */
|
|
127
|
+
export function createUnavailableCapabilityService(ctx) {
|
|
128
|
+
return {
|
|
129
|
+
async invoke(name) {
|
|
130
|
+
throwDependencyViolation(ctx, {
|
|
131
|
+
target: name,
|
|
132
|
+
reason: 'invocationUnavailable',
|
|
133
|
+
capabilityStack: ctx.__runtime?.capabilityStack ?? [],
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=capability-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-invocation.js","sourceRoot":"","sources":["../../src/execution/capability-invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA6B7D,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CACjC,OAAkC;IAElC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,EACJ,gBAAgB,EAAE,QAAQ,EAC1B,iBAAiB,EAAE,QAAQ,EAC3B,mBAAmB,EAAE,UAAU,EAC/B,GAAG,cAAc,EAClB,GAAG,OAAO,CAAC;IACZ,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,0BAA0B,CAAC,QAA4B;IAIrE,OAAO;QACL,gBAAgB,EAAE,oBAAoB,CAAC,QAAQ,CAAC;QAChD,iBAAiB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA4B;IAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,IAAI,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aACnF,CAAC;QACJ,CAAC;QACD,OAAO,iBAAiB,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,QAAqC;IACnF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC;IAC7D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,sBAAsB;YACzB,OAAO,cAAc,MAAM,IAAI,WAAW,wBAAwB,MAAM,SAAS,MAAM,uBAAuB,MAAM,IAAI,WAAW,wBAAwB,CAAC;QAC9J,KAAK,oBAAoB;YACvB,OAAO,4CAA4C,CAAC,GAAG,eAAe,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAClG,KAAK,mBAAmB;YACtB,OAAO,cAAc,MAAM,IAAI,WAAW,oCAAoC,MAAM,uDAAuD,CAAC;QAC9I,KAAK,uBAAuB;YAC1B,OAAO,4HAA4H,CAAC;QACtI,KAAK,uBAAuB;YAC1B,OAAO,cAAc,MAAM,IAAI,WAAW,wBAAwB,MAAM,sGAAsG,CAAC;QACjL,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,GAAqB,EACrB,QAAqC;IAErC,MAAM,OAAO,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,8BAA8B,CAAC,UAA8B,EAAE,MAAc;IACpF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,UAA8B,EAC9B,GAAqB,EACrB,OAAoC;IAEpC,MAAM,MAAM,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE1D,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAA8B,EAAE,KAAc;YACzD,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,eAAe,IAAI,EAAE,CAAC;YAEnD,IAAI,CAAC,8BAA8B,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;gBACtD,wBAAwB,CAAC,GAAG,EAAE;oBAC5B,MAAM;oBACN,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,sBAAsB;oBAC9B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,wBAAwB,CAAC,GAAG,EAAE;oBAC5B,MAAM;oBACN,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,oBAAoB;oBAC5B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,wBAAwB,CAAC,GAAG,EAAE;oBAC5B,MAAM;oBACN,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,mBAAmB;oBAC3B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;gBAC1C,wBAAwB,CAAC,GAAG,EAAE;oBAC5B,MAAM;oBACN,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,uBAAuB;oBAC/B,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAqB;gBAClC,GAAG,GAAG;gBACN,SAAS,EAAE;oBACT,GAAG,GAAG,CAAC,SAAS;oBAChB,eAAe,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC;oBACnC,gBAAgB,EAAE,MAAM;iBACzB;aACF,CAAC;YAEF,MAAM,oBAAoB,GAAG,SAAS,EAAE,gBAAgB,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,gBAAgB,GAAG,MAAM,CAAC;YACtC,CAAC;YACD,IAAI,MAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC;oBAAS,CAAC;gBACT,IAAI,SAAS,EAAE,CAAC;oBACd,SAAS,CAAC,gBAAgB,GAAG,oBAAoB,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,MAAM,CAAC,KAAK,CAAC;YACrB,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,kCAAkC,CAAC,GAAqB;IACtE,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAA8B;YACzC,wBAAwB,CAAC,GAAG,EAAE;gBAC5B,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,uBAAuB;gBAC/B,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,IAAI,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { CapabilityContract } from '../types/capability.js';
|
|
2
2
|
/**
|
|
3
3
|
* Registry that holds all discovered/registered capabilities,
|
|
4
|
-
* indexed by name for lookup during execution
|
|
4
|
+
* indexed by canonical name (`<domain>.<capabilityName>`) for lookup during execution.
|
|
5
5
|
*/
|
|
6
6
|
export declare class CapabilityRegistry {
|
|
7
7
|
private capabilities;
|
|
8
8
|
/**
|
|
9
|
-
* Register a capability contract. Throws on duplicate names.
|
|
9
|
+
* Register a capability contract. Throws on duplicate canonical names.
|
|
10
10
|
*/
|
|
11
11
|
register(capability: CapabilityContract): void;
|
|
12
12
|
/**
|
|
@@ -14,7 +14,7 @@ export declare class CapabilityRegistry {
|
|
|
14
14
|
*/
|
|
15
15
|
registerAll(capabilities: CapabilityContract[]): void;
|
|
16
16
|
/**
|
|
17
|
-
* Get a capability by name.
|
|
17
|
+
* Get a capability by canonical name.
|
|
18
18
|
*/
|
|
19
19
|
get(name: string): CapabilityContract | undefined;
|
|
20
20
|
/**
|
|
@@ -26,8 +26,10 @@ export declare class CapabilityRegistry {
|
|
|
26
26
|
*/
|
|
27
27
|
getByDomain(domain: string): CapabilityContract[];
|
|
28
28
|
/**
|
|
29
|
-
* Check if a capability is registered.
|
|
29
|
+
* Check if a capability is registered by canonical name.
|
|
30
30
|
*/
|
|
31
31
|
has(name: string): boolean;
|
|
32
|
+
/** Canonical names of all registered capabilities. */
|
|
33
|
+
getCanonicalNames(): string[];
|
|
32
34
|
}
|
|
33
35
|
//# sourceMappingURL=capability-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/execution/capability-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/execution/capability-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAyC;IAE7D;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAQ9C;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAMrD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIjD;;OAEG;IACH,MAAM,IAAI,kBAAkB,EAAE;IAI9B;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAIjD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,sDAAsD;IACtD,iBAAiB,IAAI,MAAM,EAAE;CAG9B"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
import { getCanonicalCapabilityName } from './canonical-name.js';
|
|
1
2
|
/**
|
|
2
3
|
* Registry that holds all discovered/registered capabilities,
|
|
3
|
-
* indexed by name for lookup during execution
|
|
4
|
+
* indexed by canonical name (`<domain>.<capabilityName>`) for lookup during execution.
|
|
4
5
|
*/
|
|
5
6
|
export class CapabilityRegistry {
|
|
6
7
|
capabilities = new Map();
|
|
7
8
|
/**
|
|
8
|
-
* Register a capability contract. Throws on duplicate names.
|
|
9
|
+
* Register a capability contract. Throws on duplicate canonical names.
|
|
9
10
|
*/
|
|
10
11
|
register(capability) {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
const canonical = getCanonicalCapabilityName(capability);
|
|
13
|
+
if (this.capabilities.has(canonical)) {
|
|
14
|
+
throw new Error(`Capability "${canonical}" is already registered`);
|
|
13
15
|
}
|
|
14
|
-
this.capabilities.set(
|
|
16
|
+
this.capabilities.set(canonical, capability);
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Register multiple capabilities at once.
|
|
@@ -22,7 +24,7 @@ export class CapabilityRegistry {
|
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
|
-
* Get a capability by name.
|
|
27
|
+
* Get a capability by canonical name.
|
|
26
28
|
*/
|
|
27
29
|
get(name) {
|
|
28
30
|
return this.capabilities.get(name);
|
|
@@ -40,10 +42,14 @@ export class CapabilityRegistry {
|
|
|
40
42
|
return this.getAll().filter((c) => c.domain === domain);
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
|
-
* Check if a capability is registered.
|
|
45
|
+
* Check if a capability is registered by canonical name.
|
|
44
46
|
*/
|
|
45
47
|
has(name) {
|
|
46
48
|
return this.capabilities.has(name);
|
|
47
49
|
}
|
|
50
|
+
/** Canonical names of all registered capabilities. */
|
|
51
|
+
getCanonicalNames() {
|
|
52
|
+
return Array.from(this.capabilities.keys());
|
|
53
|
+
}
|
|
48
54
|
}
|
|
49
55
|
//# sourceMappingURL=capability-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/execution/capability-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/execution/capability-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE7D;;OAEG;IACH,QAAQ,CAAC,UAA8B;QACrC,MAAM,SAAS,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,eAAe,SAAS,yBAAyB,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,YAAkC;QAC5C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,sDAAsD;IACtD,iBAAiB;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../../src/execution/context-factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../../src/execution/context-factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,gBAAgB,EAKjB,MAAM,qBAAqB,CAAC;AAK7B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAyG/D;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,CA8BlF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createErrorService } from '../errors/index.js';
|
|
2
|
+
import { createUnavailableCapabilityService } from './capability-invocation.js';
|
|
2
3
|
const noopAudit = {
|
|
3
4
|
async record() { },
|
|
4
5
|
};
|
|
@@ -22,6 +23,12 @@ const noopFlows = {
|
|
|
22
23
|
async heartbeat() { },
|
|
23
24
|
};
|
|
24
25
|
const noopAI = {
|
|
26
|
+
async recordProviderCost() {
|
|
27
|
+
throw new Error('AI service not configured');
|
|
28
|
+
},
|
|
29
|
+
checkProviderCostBudget() {
|
|
30
|
+
throw new Error('AI service not configured');
|
|
31
|
+
},
|
|
25
32
|
async generate() {
|
|
26
33
|
throw new Error('AI service not configured');
|
|
27
34
|
},
|
|
@@ -93,7 +100,13 @@ function createSecurityService(auth) {
|
|
|
93
100
|
* Missing optional services are replaced with safe defaults/stubs.
|
|
94
101
|
*/
|
|
95
102
|
export function createExecutionContext(deps) {
|
|
96
|
-
|
|
103
|
+
const baseRuntime = {
|
|
104
|
+
invokeCapability: deps.invokeCapability,
|
|
105
|
+
resolveCapability: deps.resolveCapability,
|
|
106
|
+
correlationId: deps.correlationId,
|
|
107
|
+
invocationEmitScope: deps.invocationEmitScope,
|
|
108
|
+
};
|
|
109
|
+
const ctx = {
|
|
97
110
|
auth: deps.auth,
|
|
98
111
|
data: deps.data,
|
|
99
112
|
events: deps.events ?? noopEvents,
|
|
@@ -108,6 +121,10 @@ export function createExecutionContext(deps) {
|
|
|
108
121
|
translations: deps.translations ?? noopTranslations,
|
|
109
122
|
request: deps.request,
|
|
110
123
|
progress: deps.progress,
|
|
124
|
+
capabilities: createUnavailableCapabilityService({}),
|
|
125
|
+
__runtime: baseRuntime,
|
|
111
126
|
};
|
|
127
|
+
ctx.capabilities = createUnavailableCapabilityService(ctx);
|
|
128
|
+
return ctx;
|
|
112
129
|
}
|
|
113
130
|
//# sourceMappingURL=context-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../../src/execution/context-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../../src/execution/context-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAcxD,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAIhF,MAAM,SAAS,GAAiB;IAC9B,KAAK,CAAC,MAAM,KAAI,CAAC;CAClB,CAAC;AAEF,MAAM,gBAAgB,GAAuB;IAC3C,MAAM,EAAE,IAAI;IACZ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG;CAChB,CAAC;AAEF,MAAM,UAAU,GAAiB;IAC/B,KAAK,CAAC,IAAI,KAAI,CAAC;IACf,KAAK,CAAC,QAAQ,KAAI,CAAC;CACpB,CAAC;AAEF,MAAM,SAAS,GAAgB;IAC7B,KAAK,CAAC,KAAK;QACT,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,MAAM,KAAI,CAAC;IACjB,KAAK,CAAC,MAAM,KAAI,CAAC;IACjB,KAAK,CAAC,MAAM;QACV,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,SAAS,KAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,GAAc;IACxB,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,uBAAuB;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,cAAc;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,MAAM,aAAa,GAAkB;IACnC,KAAK,CAAC,OAAO,EAAE,QAAQ;QACrB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,QAAQ;QACpB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,QAAQ;QACpB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,QAAQ;QACrB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;CACF,CAAC;AAEF,MAAM,QAAQ,GAAgB;IAC5B,GAAG;QACD,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;CACF,CAAC;AAEF,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,OAAO;QACL,OAAO,CAAC,IAAY;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ,CAAC,KAAa;YACpB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,WAAW,CAAC,KAAe;YACzB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,YAAY,CAAC,MAAgB;YAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,WAAW,CAAC,IAAY;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,IAAI,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QACD,YAAY,CAAC,KAAa;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,EAAE;oBACrE,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAyB;IAC9D,MAAM,WAAW,GAAG;QAClB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;KAC9C,CAAC;IAEF,MAAM,GAAG,GAAqB;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,UAAU;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC9B,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC9B,MAAM,EAAE,kBAAkB,EAAE;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa;QACpC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,QAAQ,EAAE,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,gBAAgB;QACnD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,kCAAkC,CAAC,EAAsB,CAAC;QACxE,SAAS,EAAE,WAAW;KACvB,CAAC;IAEF,GAAG,CAAC,YAAY,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAC;IAE3D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -5,4 +5,8 @@ export type { CapabilityResult, ExecutionFailure, ExecutionResult, } from './cap
|
|
|
5
5
|
export { evaluateAccess } from './authorization.js';
|
|
6
6
|
export type { AuthorizationResult } from './authorization.js';
|
|
7
7
|
export { CapabilityRegistry } from './capability-registry.js';
|
|
8
|
+
export { getCanonicalCapabilityName, isCanonicalCapabilityName, } from './canonical-name.js';
|
|
9
|
+
export type { CanonicalCapabilityRef } from './canonical-name.js';
|
|
10
|
+
export { buildCapabilityRuntimeDeps, buildDependencyViolationMessage, buildRegistryInvoker, createCapabilityInvokeService, createUnavailableCapabilityService, } from './capability-invocation.js';
|
|
11
|
+
export type { DependencyViolationMetadata, DependencyViolationReason, InternalCapabilityInvoker, } from './capability-invocation.js';
|
|
8
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,EACpB,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC"}
|
package/dist/execution/index.js
CHANGED
|
@@ -7,4 +7,6 @@ export { createExecutionContext } from './context-factory.js';
|
|
|
7
7
|
export { executeCapability } from './capability-executor.js';
|
|
8
8
|
export { evaluateAccess } from './authorization.js';
|
|
9
9
|
export { CapabilityRegistry } from './capability-registry.js';
|
|
10
|
+
export { getCanonicalCapabilityName, isCanonicalCapabilityName, } from './canonical-name.js';
|
|
11
|
+
export { buildCapabilityRuntimeDeps, buildDependencyViolationMessage, buildRegistryInvoker, createCapabilityInvokeService, createUnavailableCapabilityService, } from './capability-invocation.js';
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,mFAAmF;AACnF,yFAAyF;AACzF,EAAE;AACF,6FAA6F;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,mFAAmF;AACnF,yFAAyF;AACzF,EAAE;AACF,6FAA6F;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAO7D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,EACpB,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Mutable scope for nested capability event causation (wired into event emitters). */
|
|
2
|
+
export interface InvocationEmitScope {
|
|
3
|
+
/** Canonical name of the capability currently executing its handler. */
|
|
4
|
+
executingCapability?: string;
|
|
5
|
+
/** Canonical name of the caller when running a nested callee handler. */
|
|
6
|
+
invocationCaller?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createInvocationEmitScope(): InvocationEmitScope;
|
|
9
|
+
/** Causation for nested emits: caller canonical name, else the executing capability. */
|
|
10
|
+
export declare function resolveInvocationCausationId(scope?: InvocationEmitScope): string | undefined;
|
|
11
|
+
//# sourceMappingURL=invocation-emit-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation-emit-scope.d.ts","sourceRoot":"","sources":["../../src/execution/invocation-emit-scope.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CAE/D;AAED,wFAAwF;AACxF,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAE5F"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function createInvocationEmitScope() {
|
|
2
|
+
return {};
|
|
3
|
+
}
|
|
4
|
+
/** Causation for nested emits: caller canonical name, else the executing capability. */
|
|
5
|
+
export function resolveInvocationCausationId(scope) {
|
|
6
|
+
return scope?.invocationCaller ?? scope?.executingCapability;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=invocation-emit-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation-emit-scope.js","sourceRoot":"","sources":["../../src/execution/invocation-emit-scope.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,yBAAyB;IACvC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAAC,KAA2B;IACtE,OAAO,KAAK,EAAE,gBAAgB,IAAI,KAAK,EAAE,mBAAmB,CAAC;AAC/D,CAAC"}
|
package/dist/flows/engine.d.ts
CHANGED
|
@@ -33,6 +33,10 @@ export interface FlowEngineConfig {
|
|
|
33
33
|
flowHeartbeatIntervalMs?: number;
|
|
34
34
|
/** Max executions to claim per poll cycle. Default: 50. */
|
|
35
35
|
flowClaimBatchSize?: number;
|
|
36
|
+
/** When set, enqueue flow step wake messages (durable queue deployments). */
|
|
37
|
+
onFlowStepEnqueue?: (executionId: string, correlationId?: string) => Promise<void>;
|
|
38
|
+
/** When set, schedule delayed flow wake via Redis sorted set (durable deployments). */
|
|
39
|
+
onFlowDelayedSchedule?: (executionId: string, wakeAt: Date, correlationId?: string) => Promise<void>;
|
|
36
40
|
/**
|
|
37
41
|
* Optional logger used for diagnostic events (heartbeat ticks, unexpected
|
|
38
42
|
* lease-extension failures, etc). If omitted, the engine is silent. The
|
|
@@ -56,6 +60,7 @@ interface FlowExecutionRow {
|
|
|
56
60
|
wakeAt: Date | null;
|
|
57
61
|
actor: string;
|
|
58
62
|
tenantId: string | null;
|
|
63
|
+
authSnapshotJson: unknown;
|
|
59
64
|
correlationId: string | null;
|
|
60
65
|
triggerEventId: string | null;
|
|
61
66
|
createdAt: Date;
|
|
@@ -82,9 +87,10 @@ export declare function createFlowEngine(config: FlowEngineConfig): {
|
|
|
82
87
|
}) => Promise<FlowExecution>;
|
|
83
88
|
runNext: (executionId: string, ctx: ExecutionContext) => Promise<FlowExecution>;
|
|
84
89
|
resume: (executionId: string, signal?: unknown) => Promise<void>;
|
|
85
|
-
resumeWaitingByEvent: (eventType: string, signal?: unknown) => Promise<
|
|
90
|
+
resumeWaitingByEvent: (eventType: string, signal?: unknown) => Promise<string[]>;
|
|
86
91
|
listRunnable: (limit?: number) => Promise<string[]>;
|
|
87
92
|
claimNext: (batchSize?: number) => Promise<FlowExecutionRow[]>;
|
|
93
|
+
claimExecution: (executionId: string) => Promise<FlowExecutionRow | undefined>;
|
|
88
94
|
cancel: (executionId: string) => Promise<void>;
|
|
89
95
|
status: (executionId: string) => Promise<FlowExecution>;
|
|
90
96
|
markFailedFromRunner: (executionId: string, error: unknown) => Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/flows/engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAEV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AASlD,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,kBAAkB,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,CAAC;IACvD,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC;IACzD,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,kBAAkB,CAAC;KACzB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/flows/engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAEV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AASlD,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,kBAAkB,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,CAAC;IACvD,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC;IACzD,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,kBAAkB,CAAC;KACzB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,uFAAuF;IACvF,qBAAqB,CAAC,EAAE,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,IAAI,EACZ,aAAa,CAAC,EAAE,MAAM,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CAC7B;AAmCD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;sBAgC3C,MAAM,SACT,OAAO,QACR,WAAW,SACV;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KACzD,OAAO,CAAC,aAAa,CAAC;2BA6NW,MAAM,OAAO,gBAAgB,KAAG,OAAO,CAAC,aAAa,CAAC;0BAkXvD,MAAM,WAAW,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC;sCAsC5B,MAAM,WAAW,OAAO,KAAG,OAAO,CAAC,MAAM,EAAE,CAAC;sCAsClD,OAAO,CAAC,MAAM,EAAE,CAAC;4BA/lBrB,MAAM,KAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;kCAqD9B,MAAM,KAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;0BAikBtD,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;0BAyCtB,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC;wCAoHjB,MAAM,SAAS,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;;EA+D3F;AA8ED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAO,GAAG,MAAM,CAKjG"}
|
package/dist/flows/engine.js
CHANGED
|
@@ -31,6 +31,23 @@ function getRowsAffected(result) {
|
|
|
31
31
|
return r.length;
|
|
32
32
|
return 0;
|
|
33
33
|
}
|
|
34
|
+
/** Type-safe partial update payload for flow executions. */
|
|
35
|
+
/** Step auth from stored snapshot; falls back to worker auth for legacy rows. */
|
|
36
|
+
function resolveFlowStepAuth(row, workerAuth) {
|
|
37
|
+
const snapshot = row.authSnapshotJson;
|
|
38
|
+
if (snapshot) {
|
|
39
|
+
return {
|
|
40
|
+
...snapshot,
|
|
41
|
+
userId: row.actor ?? snapshot.userId,
|
|
42
|
+
tenantId: row.tenantId ?? snapshot.tenantId,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
...workerAuth,
|
|
47
|
+
tenantId: row.tenantId ?? workerAuth.tenantId,
|
|
48
|
+
userId: row.actor ?? workerAuth.userId,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
34
51
|
/**
|
|
35
52
|
* Generate a deterministic-ish worker id for the current process.
|
|
36
53
|
*/
|
|
@@ -51,6 +68,13 @@ export function createFlowEngine(config) {
|
|
|
51
68
|
const heartbeatIntervalMs = config.flowHeartbeatIntervalMs ?? Math.floor(leaseDurationMs / 3);
|
|
52
69
|
const claimBatchSize = config.flowClaimBatchSize ?? DEFAULT_CLAIM_BATCH_SIZE;
|
|
53
70
|
const logger = config.logger;
|
|
71
|
+
const onFlowStepEnqueue = config.onFlowStepEnqueue;
|
|
72
|
+
const onFlowDelayedSchedule = config.onFlowDelayedSchedule;
|
|
73
|
+
async function maybeEnqueueFlowStep(executionId, correlationId) {
|
|
74
|
+
if (onFlowStepEnqueue) {
|
|
75
|
+
await onFlowStepEnqueue(executionId, correlationId ?? executionId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
54
78
|
/**
|
|
55
79
|
* AbortControllers for currently-executing steps in THIS engine instance,
|
|
56
80
|
* keyed by executionId. `cancel()` uses this to abort the running step
|
|
@@ -90,6 +114,7 @@ export function createFlowEngine(config) {
|
|
|
90
114
|
stepHistory: [],
|
|
91
115
|
actor: auth.userId ?? 'system',
|
|
92
116
|
tenantId: auth.tenantId ?? null,
|
|
117
|
+
authSnapshotJson: auth,
|
|
93
118
|
correlationId: opts?.correlationId ?? null,
|
|
94
119
|
triggerEventId: opts?.triggerEventId ?? null,
|
|
95
120
|
});
|
|
@@ -102,6 +127,7 @@ export function createFlowEngine(config) {
|
|
|
102
127
|
outcome: 'success',
|
|
103
128
|
});
|
|
104
129
|
}
|
|
130
|
+
await maybeEnqueueFlowStep(executionId, opts?.correlationId);
|
|
105
131
|
return {
|
|
106
132
|
id: executionId,
|
|
107
133
|
flowName,
|
|
@@ -158,6 +184,39 @@ export function createFlowEngine(config) {
|
|
|
158
184
|
}
|
|
159
185
|
return rows;
|
|
160
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Claim a specific execution by ID (used by flow step queue consumer).
|
|
189
|
+
* Returns the row when claimed, undefined when not runnable or already leased.
|
|
190
|
+
*/
|
|
191
|
+
async function claimExecution(executionId) {
|
|
192
|
+
const leaseDurationInterval = `${leaseDurationMs} milliseconds`;
|
|
193
|
+
const result = await db.execute(sql `
|
|
194
|
+
UPDATE flow_executions
|
|
195
|
+
SET status = ${FlowStatus.Running},
|
|
196
|
+
lease_owner = ${workerId},
|
|
197
|
+
lease_expires_at = now() + ${leaseDurationInterval}::interval,
|
|
198
|
+
updated_at = now()
|
|
199
|
+
WHERE id = ${executionId}
|
|
200
|
+
AND (
|
|
201
|
+
status = ${FlowStatus.Created}
|
|
202
|
+
OR (status = ${FlowStatus.Running} AND lease_expires_at < now())
|
|
203
|
+
OR (status = ${FlowStatus.Waiting} AND waiting_for_event IS NULL AND wake_at <= now())
|
|
204
|
+
)
|
|
205
|
+
RETURNING *
|
|
206
|
+
`);
|
|
207
|
+
const rows = result;
|
|
208
|
+
const row = rows[0];
|
|
209
|
+
if (row && audit) {
|
|
210
|
+
await audit.record('flow.lease.claimed', {
|
|
211
|
+
executionId: row.id,
|
|
212
|
+
flowName: row.flowName,
|
|
213
|
+
workerId,
|
|
214
|
+
step: row.currentStep,
|
|
215
|
+
source: 'claimExecution',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return row;
|
|
219
|
+
}
|
|
161
220
|
/**
|
|
162
221
|
* Extend the lease for a flow execution.
|
|
163
222
|
* Returns true if the lease was extended, false if the lease was lost.
|
|
@@ -275,13 +334,8 @@ export function createFlowEngine(config) {
|
|
|
275
334
|
await failFlow(executionId, row.flowName, `Step "${currentStepName}" not found in flow definition`, row);
|
|
276
335
|
return { id: executionId, flowName: row.flowName, status: FlowStatus.Failed };
|
|
277
336
|
}
|
|
278
|
-
// Build flow-scoped context
|
|
279
|
-
const flowAuth =
|
|
280
|
-
...ctx.auth,
|
|
281
|
-
tenantId: row.tenantId ?? ctx.auth.tenantId,
|
|
282
|
-
userId: row.actor ?? ctx.auth.userId,
|
|
283
|
-
roles: ctx.auth.roles.includes('system') ? ctx.auth.roles : [...ctx.auth.roles, 'system'],
|
|
284
|
-
};
|
|
337
|
+
// Build flow-scoped context from stored auth snapshot (not worker systemAuth roles)
|
|
338
|
+
const flowAuth = resolveFlowStepAuth(row, ctx.auth);
|
|
285
339
|
const flowData = config.createDataService ? config.createDataService(flowAuth) : ctx.data;
|
|
286
340
|
const flowEvents = createEventService ? createEventService(flowAuth) : ctx.events;
|
|
287
341
|
// Create a heartbeat function for manual use by step handlers
|
|
@@ -458,16 +512,20 @@ export function createFlowEngine(config) {
|
|
|
458
512
|
catch (err) {
|
|
459
513
|
return handleStepFailure(executionId, row, flow, history, err instanceof Error ? err.message : String(err));
|
|
460
514
|
}
|
|
515
|
+
const wakeAt = new Date(Date.now() + delayMs);
|
|
461
516
|
await guardedUpdate(executionId, {
|
|
462
517
|
status: FlowStatus.Waiting,
|
|
463
518
|
state: nextState,
|
|
464
519
|
stepHistory: history,
|
|
465
520
|
currentStep: nextStep,
|
|
466
521
|
waitingForEvent: null,
|
|
467
|
-
wakeAt
|
|
522
|
+
wakeAt,
|
|
468
523
|
leaseOwner: null,
|
|
469
524
|
leaseExpiresAt: null,
|
|
470
525
|
});
|
|
526
|
+
if (onFlowDelayedSchedule) {
|
|
527
|
+
await onFlowDelayedSchedule(executionId, wakeAt, row.correlationId ?? executionId);
|
|
528
|
+
}
|
|
471
529
|
return { id: executionId, flowName: row.flowName, status: FlowStatus.Waiting };
|
|
472
530
|
}
|
|
473
531
|
// Parallel step — execute all branches concurrently, then advance
|
|
@@ -559,11 +617,12 @@ export function createFlowEngine(config) {
|
|
|
559
617
|
leaseOwner: null,
|
|
560
618
|
leaseExpiresAt: null,
|
|
561
619
|
});
|
|
620
|
+
await maybeEnqueueFlowStep(executionId, row.correlationId);
|
|
562
621
|
}
|
|
563
622
|
/**
|
|
564
623
|
* Resume all flows waiting on a specific event type.
|
|
565
624
|
* Uses FOR UPDATE SKIP LOCKED to prevent duplicate resumes across workers.
|
|
566
|
-
* Returns
|
|
625
|
+
* Returns execution IDs resumed.
|
|
567
626
|
*/
|
|
568
627
|
async function resumeWaitingByEvent(eventType, signal) {
|
|
569
628
|
const result = await db.execute(sql `
|
|
@@ -590,7 +649,10 @@ export function createFlowEngine(config) {
|
|
|
590
649
|
await updateExecution(row.id, { state: signal });
|
|
591
650
|
}
|
|
592
651
|
}
|
|
593
|
-
|
|
652
|
+
for (const row of rows) {
|
|
653
|
+
await maybeEnqueueFlowStep(row.id);
|
|
654
|
+
}
|
|
655
|
+
return rows.map((row) => row.id);
|
|
594
656
|
}
|
|
595
657
|
/**
|
|
596
658
|
* Returns execution IDs that should be processed now.
|
|
@@ -787,6 +849,7 @@ export function createFlowEngine(config) {
|
|
|
787
849
|
resumeWaitingByEvent,
|
|
788
850
|
listRunnable,
|
|
789
851
|
claimNext,
|
|
852
|
+
claimExecution,
|
|
790
853
|
cancel,
|
|
791
854
|
status,
|
|
792
855
|
markFailedFromRunner,
|
|
@@ -806,6 +869,8 @@ function wrapAiWithDefaultSignal(ai, defaultSignal) {
|
|
|
806
869
|
signal: params.signal ?? defaultSignal,
|
|
807
870
|
});
|
|
808
871
|
return {
|
|
872
|
+
recordProviderCost: (entry, costContext) => ai.recordProviderCost(entry, costContext),
|
|
873
|
+
checkProviderCostBudget: (config) => ai.checkProviderCostBudget(config),
|
|
809
874
|
generate: (params) => ai.generate(withSignal(params)),
|
|
810
875
|
generateWithUsage: (params) => ai.generateWithUsage(withSignal(params)),
|
|
811
876
|
streamGenerate: (params) => ai.streamGenerate(withSignal(params)),
|