@lostgradient/weft 0.14.0 → 0.16.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 +3 -8
- package/dist/alerting/alert-manager.d.ts +2 -0
- package/dist/alerting/alert-manager.js +3 -0
- package/dist/cli/api.js +5 -19
- package/dist/cli/console.d.ts +12 -0
- package/dist/cli/console.js +62 -0
- package/dist/cli/generated/operation-catalog.snapshot.json +1061 -90
- package/dist/cli/generated/operation-client.generated.d.ts +29 -23
- package/dist/cli/generated/operation-client.generated.js +2 -0
- package/dist/cli/help-text.d.ts +1 -1
- package/dist/cli/help-text.js +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/json-input.d.ts +20 -0
- package/dist/cli/json-input.js +33 -0
- package/dist/cli/parse-arguments.js +2 -0
- package/dist/cli/schedule.js +7 -9
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli/workflow-commands.js +5 -25
- package/dist/cli-main.js +4 -2
- package/dist/core/aggregate-validation.d.ts +2 -5
- package/dist/core/aggregate-validation.js +2 -10
- package/dist/core/atomic-state.js +21 -24
- package/dist/core/engine/index.d.ts +3 -0
- package/dist/core/engine/index.js +3 -0
- package/dist/core/engine/schedules.js +4 -1
- package/dist/core/inline-execution-strategy.js +8 -46
- package/dist/core/list-filter-validation.d.ts +2 -5
- package/dist/core/list-filter-validation.js +2 -10
- package/dist/core/types/schedules.d.ts +13 -31
- package/dist/core/validation-issues.d.ts +13 -0
- package/dist/core/validation-issues.js +9 -0
- package/dist/diagnostics/recommendations.js +1 -9
- package/dist/http.js +2 -2
- package/dist/indexeddb.js +1 -1
- package/dist/mcp/session.js +2 -10
- package/dist/mcp/tools.js +2 -10
- package/dist/mcp/tuple-list-equality.d.ts +1 -0
- package/dist/mcp/tuple-list-equality.js +12 -0
- package/dist/server/authorization-scope.d.ts +1 -1
- package/dist/server/authorization-scope.js +0 -2
- package/dist/server/dashboard-assets.d.ts +26 -0
- package/dist/server/dashboard-assets.js +95 -0
- package/dist/server/index.d.ts +10 -1
- package/dist/server/index.js +11 -2
- package/dist/server/interactive-operations.js +1 -0
- package/dist/server/operation-catalog/types.d.ts +1 -1
- package/dist/server/operation-registry.d.ts +2 -31
- package/dist/server/operations/bulk-filter-helpers.d.ts +17 -17
- package/dist/server/operations/bulk-filter-helpers.js +16 -37
- package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +27 -27
- package/dist/server/operations/bulk-signal-workflows.d.ts +26 -26
- package/dist/server/operations/create-schedule.js +26 -65
- package/dist/server/operations/event-stream-contracts.d.ts +20 -0
- package/dist/server/operations/event-stream-contracts.js +67 -0
- package/dist/server/operations/fleet-events-sse.js +21 -50
- package/dist/server/operations/fleet-events-subscription.js +8 -12
- package/dist/server/operations/list-alerts.d.ts +26 -0
- package/dist/server/operations/list-alerts.js +54 -0
- package/dist/server/operations/list-workflows.d.ts +43 -43
- package/dist/server/operations/list-workflows.js +9 -30
- package/dist/server/operations/purge-workflows.d.ts +11 -11
- package/dist/server/operations/schedule-faults.d.ts +9 -1
- package/dist/server/operations/schedule-faults.js +51 -0
- package/dist/server/operations/schedule-rest-body.d.ts +11 -0
- package/dist/server/operations/schedule-rest-body.js +28 -0
- package/dist/server/operations/update-schedule.js +13 -72
- package/dist/server/operations/workflow-events-sse.js +29 -67
- package/dist/server/operations/workflow-events-subscription.js +9 -27
- package/dist/server/rest-bindings.js +3 -0
- package/dist/server/runtime/task-polling.js +3 -5
- package/dist/server/task-state.d.ts +2 -8
- package/dist/server/task-state.js +10 -7
- package/dist/service-worker/index.d.ts +4 -1
- package/dist/service-worker/index.js +2 -2
- package/dist/service-worker/setup.d.ts +20 -0
- package/dist/service-worker/setup.js +5 -5
- package/dist/storage/bun-sql.js +65 -80
- package/dist/storage/conditional-batch-body.d.ts +7 -0
- package/dist/storage/conditional-batch-body.js +14 -0
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +2 -2
- package/dist/storage/node-sqlite-loader.d.ts +2 -2
- package/dist/storage/node-sqlite.js +32 -17
- package/dist/storage/postgres.js +2 -2
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/execute-with-interceptors.d.ts +1 -1
- package/dist/worker/execute-with-interceptors.js +2 -2
- package/dist/worker/index.js +5 -5
- package/dist/worker/long-poll.js +3 -4
- package/dist/worker/protocol-messages.d.ts +11 -19
- package/dist/worker/protocol-schemas.d.ts +8 -8
- package/dist/worker/protocol-schemas.js +4 -4
- package/dist/worker/protocol-task-result.d.ts +1 -0
- package/dist/worker/protocol-task-result.js +1 -3
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/types.d.ts +2 -7
- package/dist/worker/registry.d.ts +3 -9
- package/dist/worker/registry.js +2 -5
- package/package.json +5 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type CatalogWeftClient, type WeftClientConnection } from '../operation-client-runtime.ts';
|
|
2
|
-
export declare const CATALOG_OPERATION_NAMES: readonly ["weft.activities.complete", "weft.activities.fail", "weft.recover.all", "weft.retention.get", "weft.reviews.decision.submit", "weft.reviews.get", "weft.reviews.list", "weft.schedules.cancel", "weft.schedules.create", "weft.schedules.get", "weft.schedules.list", "weft.schedules.pause", "weft.schedules.resume", "weft.schedules.update", "weft.storage.capabilities", "weft.system.lease", "weft.system.metrics", "weft.system.registry", "weft.task.queues.list", "weft.tasks.diagnostics", "weft.updates.result.get", "weft.worker.deployments.drain", "weft.worker.deployments.resume", "weft.workers.drain", "weft.workers.list", "weft.workers.resume", "weft.workflows.activities.pending.list", "weft.workflows.aggregate", "weft.workflows.attributes.get", "weft.workflows.attributes.set", "weft.workflows.bulk.cancel", "weft.workflows.bulk.delete", "weft.workflows.bulk.retryfailed", "weft.workflows.bulk.signal", "weft.workflows.bulk.tags", "weft.workflows.cancel", "weft.workflows.checkpoints.get", "weft.workflows.checkpoints.list", "weft.workflows.events.list", "weft.workflows.finalizer.get", "weft.workflows.fork", "weft.workflows.get", "weft.workflows.list", "weft.workflows.purge", "weft.workflows.query", "weft.workflows.replay", "weft.workflows.result.get", "weft.workflows.resume", "weft.workflows.scheduleprovenance.get", "weft.workflows.signal", "weft.workflows.start", "weft.workflows.startorsignal", "weft.workflows.streams.chunks", "weft.workflows.suspend", "weft.workflows.tags.add", "weft.workflows.tags.remove", "weft.workflows.timeline.get", "weft.workflows.timeout", "weft.workflows.update"];
|
|
2
|
+
export declare const CATALOG_OPERATION_NAMES: readonly ["weft.activities.complete", "weft.activities.fail", "weft.alerts.list", "weft.recover.all", "weft.retention.get", "weft.reviews.decision.submit", "weft.reviews.get", "weft.reviews.list", "weft.schedules.cancel", "weft.schedules.create", "weft.schedules.get", "weft.schedules.list", "weft.schedules.pause", "weft.schedules.resume", "weft.schedules.update", "weft.storage.capabilities", "weft.system.lease", "weft.system.metrics", "weft.system.registry", "weft.task.queues.list", "weft.tasks.diagnostics", "weft.updates.result.get", "weft.worker.deployments.drain", "weft.worker.deployments.resume", "weft.workers.drain", "weft.workers.list", "weft.workers.resume", "weft.workflows.activities.pending.list", "weft.workflows.aggregate", "weft.workflows.attributes.get", "weft.workflows.attributes.set", "weft.workflows.bulk.cancel", "weft.workflows.bulk.delete", "weft.workflows.bulk.retryfailed", "weft.workflows.bulk.signal", "weft.workflows.bulk.tags", "weft.workflows.cancel", "weft.workflows.checkpoints.get", "weft.workflows.checkpoints.list", "weft.workflows.events.list", "weft.workflows.finalizer.get", "weft.workflows.fork", "weft.workflows.get", "weft.workflows.list", "weft.workflows.purge", "weft.workflows.query", "weft.workflows.replay", "weft.workflows.result.get", "weft.workflows.resume", "weft.workflows.scheduleprovenance.get", "weft.workflows.signal", "weft.workflows.start", "weft.workflows.startorsignal", "weft.workflows.streams.chunks", "weft.workflows.suspend", "weft.workflows.tags.add", "weft.workflows.tags.remove", "weft.workflows.timeline.get", "weft.workflows.timeout", "weft.workflows.update"];
|
|
3
3
|
export type CatalogOperationName = (typeof CATALOG_OPERATION_NAMES)[number];
|
|
4
|
-
export declare const CLIENT_OPERATION_NAMES: readonly ["weft.activities.complete", "weft.activities.fail", "weft.recover.all", "weft.retention.get", "weft.reviews.decision.submit", "weft.reviews.get", "weft.reviews.list", "weft.schedules.cancel", "weft.schedules.create", "weft.schedules.get", "weft.schedules.list", "weft.schedules.pause", "weft.schedules.resume", "weft.schedules.update", "weft.storage.capabilities", "weft.system.lease", "weft.system.metrics", "weft.system.registry", "weft.task.queues.list", "weft.tasks.diagnostics", "weft.tasks.diagnostics.deadletters.clear", "weft.updates.result.get", "weft.worker.deployments.drain", "weft.worker.deployments.resume", "weft.workers.drain", "weft.workers.list", "weft.workers.resume", "weft.workflows.activities.pending.list", "weft.workflows.aggregate", "weft.workflows.attributes.get", "weft.workflows.attributes.set", "weft.workflows.bulk.cancel", "weft.workflows.bulk.delete", "weft.workflows.bulk.retryfailed", "weft.workflows.bulk.signal", "weft.workflows.bulk.tags", "weft.workflows.cancel", "weft.workflows.checkpoints.get", "weft.workflows.checkpoints.list", "weft.workflows.events.list", "weft.workflows.finalizer.get", "weft.workflows.fork", "weft.workflows.get", "weft.workflows.list", "weft.workflows.purge", "weft.workflows.query", "weft.workflows.replay", "weft.workflows.result.get", "weft.workflows.resume", "weft.workflows.scheduleprovenance.get", "weft.workflows.signal", "weft.workflows.start", "weft.workflows.startorsignal", "weft.workflows.streams.chunks", "weft.workflows.suspend", "weft.workflows.tags.add", "weft.workflows.tags.remove", "weft.workflows.timeline.get", "weft.workflows.timeout", "weft.workflows.update"];
|
|
4
|
+
export declare const CLIENT_OPERATION_NAMES: readonly ["weft.activities.complete", "weft.activities.fail", "weft.alerts.list", "weft.recover.all", "weft.retention.get", "weft.reviews.decision.submit", "weft.reviews.get", "weft.reviews.list", "weft.schedules.cancel", "weft.schedules.create", "weft.schedules.get", "weft.schedules.list", "weft.schedules.pause", "weft.schedules.resume", "weft.schedules.update", "weft.storage.capabilities", "weft.system.lease", "weft.system.metrics", "weft.system.registry", "weft.task.queues.list", "weft.tasks.diagnostics", "weft.tasks.diagnostics.deadletters.clear", "weft.updates.result.get", "weft.worker.deployments.drain", "weft.worker.deployments.resume", "weft.workers.drain", "weft.workers.list", "weft.workers.resume", "weft.workflows.activities.pending.list", "weft.workflows.aggregate", "weft.workflows.attributes.get", "weft.workflows.attributes.set", "weft.workflows.bulk.cancel", "weft.workflows.bulk.delete", "weft.workflows.bulk.retryfailed", "weft.workflows.bulk.signal", "weft.workflows.bulk.tags", "weft.workflows.cancel", "weft.workflows.checkpoints.get", "weft.workflows.checkpoints.list", "weft.workflows.events.list", "weft.workflows.finalizer.get", "weft.workflows.fork", "weft.workflows.get", "weft.workflows.list", "weft.workflows.purge", "weft.workflows.query", "weft.workflows.replay", "weft.workflows.result.get", "weft.workflows.resume", "weft.workflows.scheduleprovenance.get", "weft.workflows.signal", "weft.workflows.start", "weft.workflows.startorsignal", "weft.workflows.streams.chunks", "weft.workflows.suspend", "weft.workflows.tags.add", "weft.workflows.tags.remove", "weft.workflows.timeline.get", "weft.workflows.timeout", "weft.workflows.update"];
|
|
5
5
|
export type ClientOperationName = (typeof CLIENT_OPERATION_NAMES)[number];
|
|
6
6
|
export declare const CLIENT_REST_OPERATION_BINDINGS: {
|
|
7
7
|
readonly 'weft.tasks.diagnostics.deadletters.clear': {
|
|
@@ -19,8 +19,8 @@ export declare const CLIENT_REST_OPERATION_BINDINGS: {
|
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
|
-
type
|
|
23
|
-
readonly attributes?: ReadonlyArray<
|
|
22
|
+
type SharedAttributesBulkConcurrenc_ff397168 = {
|
|
23
|
+
readonly attributes?: ReadonlyArray<SharedGtGteKey_e658e64c>;
|
|
24
24
|
readonly bulkConcurrency?: number;
|
|
25
25
|
readonly confirmationToken?: string;
|
|
26
26
|
readonly createdAt?: SharedGtGteLt_d9a61361;
|
|
@@ -39,8 +39,8 @@ type SharedAttributesBulkConcurrenc_f62debcf = {
|
|
|
39
39
|
readonly type?: string;
|
|
40
40
|
readonly updatedAt?: SharedGtGteLt_d9a61361;
|
|
41
41
|
};
|
|
42
|
-
type
|
|
43
|
-
readonly attributes?: ReadonlyArray<
|
|
42
|
+
type SharedAttributesCreatedAtExecu_0caddefc = {
|
|
43
|
+
readonly attributes?: ReadonlyArray<SharedGtGteKey_e658e64c>;
|
|
44
44
|
readonly createdAt?: SharedGtGteLt_d9a61361;
|
|
45
45
|
readonly executionDeadline?: SharedGtGteLt_d9a61361;
|
|
46
46
|
readonly failureCategory?: unknown;
|
|
@@ -55,10 +55,10 @@ type SharedAttributesCreatedAtExecu_2af7f9ff = {
|
|
|
55
55
|
readonly type?: string;
|
|
56
56
|
readonly updatedAt?: SharedGtGteLt_d9a61361;
|
|
57
57
|
};
|
|
58
|
-
type
|
|
58
|
+
type SharedGtGteKey_e658e64c = {
|
|
59
59
|
readonly gt?: unknown;
|
|
60
60
|
readonly gte?: unknown;
|
|
61
|
-
readonly key:
|
|
61
|
+
readonly key: unknown;
|
|
62
62
|
readonly lt?: unknown;
|
|
63
63
|
readonly lte?: unknown;
|
|
64
64
|
readonly value?: unknown;
|
|
@@ -93,6 +93,19 @@ export type ClientOperationTypes = {
|
|
|
93
93
|
};
|
|
94
94
|
readonly faults: 'InvalidParams' | 'NotFound';
|
|
95
95
|
};
|
|
96
|
+
'weft.alerts.list': {
|
|
97
|
+
readonly input: {};
|
|
98
|
+
readonly output: {
|
|
99
|
+
readonly items: ReadonlyArray<{
|
|
100
|
+
readonly currentValue: number;
|
|
101
|
+
readonly firedAt: unknown;
|
|
102
|
+
readonly metric: 'workflow.failure_rate' | 'activity.p99_duration' | 'storage.size';
|
|
103
|
+
readonly threshold: number;
|
|
104
|
+
readonly window: unknown;
|
|
105
|
+
}>;
|
|
106
|
+
};
|
|
107
|
+
readonly faults: never;
|
|
108
|
+
};
|
|
96
109
|
'weft.recover.all': {
|
|
97
110
|
readonly input: {};
|
|
98
111
|
readonly output: {
|
|
@@ -411,14 +424,7 @@ export type ClientOperationTypes = {
|
|
|
411
424
|
};
|
|
412
425
|
'weft.workflows.aggregate': {
|
|
413
426
|
readonly input: {
|
|
414
|
-
readonly attributes?: ReadonlyArray<
|
|
415
|
-
readonly gt?: unknown;
|
|
416
|
-
readonly gte?: unknown;
|
|
417
|
-
readonly key: unknown;
|
|
418
|
-
readonly lt?: unknown;
|
|
419
|
-
readonly lte?: unknown;
|
|
420
|
-
readonly value?: unknown;
|
|
421
|
-
}>;
|
|
427
|
+
readonly attributes?: ReadonlyArray<SharedGtGteKey_e658e64c>;
|
|
422
428
|
readonly createdAt?: SharedGtGteLt_d9a61361;
|
|
423
429
|
readonly executionDeadline?: SharedGtGteLt_d9a61361;
|
|
424
430
|
readonly failureCategory?: unknown;
|
|
@@ -461,23 +467,23 @@ export type ClientOperationTypes = {
|
|
|
461
467
|
readonly faults: never;
|
|
462
468
|
};
|
|
463
469
|
'weft.workflows.bulk.cancel': {
|
|
464
|
-
readonly input:
|
|
470
|
+
readonly input: SharedAttributesBulkConcurrenc_ff397168;
|
|
465
471
|
readonly output: unknown;
|
|
466
472
|
readonly faults: never;
|
|
467
473
|
};
|
|
468
474
|
'weft.workflows.bulk.delete': {
|
|
469
|
-
readonly input:
|
|
475
|
+
readonly input: SharedAttributesBulkConcurrenc_ff397168;
|
|
470
476
|
readonly output: unknown;
|
|
471
477
|
readonly faults: 'Unprocessable';
|
|
472
478
|
};
|
|
473
479
|
'weft.workflows.bulk.retryfailed': {
|
|
474
|
-
readonly input:
|
|
480
|
+
readonly input: SharedAttributesBulkConcurrenc_ff397168;
|
|
475
481
|
readonly output: unknown;
|
|
476
482
|
readonly faults: never;
|
|
477
483
|
};
|
|
478
484
|
'weft.workflows.bulk.signal': {
|
|
479
485
|
readonly input: {
|
|
480
|
-
readonly attributes?: ReadonlyArray<
|
|
486
|
+
readonly attributes?: ReadonlyArray<SharedGtGteKey_e658e64c>;
|
|
481
487
|
readonly bulkConcurrency?: number;
|
|
482
488
|
readonly confirmationToken?: string;
|
|
483
489
|
readonly createdAt?: SharedGtGteLt_d9a61361;
|
|
@@ -506,7 +512,7 @@ export type ClientOperationTypes = {
|
|
|
506
512
|
readonly bulkConcurrency?: number;
|
|
507
513
|
readonly confirmationToken?: string;
|
|
508
514
|
readonly dryRun?: boolean;
|
|
509
|
-
readonly filter?:
|
|
515
|
+
readonly filter?: SharedAttributesCreatedAtExecu_0caddefc;
|
|
510
516
|
readonly operation: 'add' | 'remove';
|
|
511
517
|
readonly requestId?: string;
|
|
512
518
|
readonly tags: ReadonlyArray<string>;
|
|
@@ -569,7 +575,7 @@ export type ClientOperationTypes = {
|
|
|
569
575
|
};
|
|
570
576
|
'weft.workflows.list': {
|
|
571
577
|
readonly input: {
|
|
572
|
-
readonly attributes?: ReadonlyArray<
|
|
578
|
+
readonly attributes?: ReadonlyArray<SharedGtGteKey_e658e64c>;
|
|
573
579
|
readonly createdAt?: SharedGtGteLt_d9a61361;
|
|
574
580
|
readonly executionDeadline?: SharedGtGteLt_d9a61361;
|
|
575
581
|
readonly failureCategory?: unknown;
|
|
@@ -589,7 +595,7 @@ export type ClientOperationTypes = {
|
|
|
589
595
|
readonly faults: 'Unprocessable';
|
|
590
596
|
};
|
|
591
597
|
'weft.workflows.purge': {
|
|
592
|
-
readonly input:
|
|
598
|
+
readonly input: SharedAttributesCreatedAtExecu_0caddefc;
|
|
593
599
|
readonly output: unknown;
|
|
594
600
|
readonly faults: never;
|
|
595
601
|
};
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
export const CATALOG_OPERATION_NAMES = [
|
|
6
6
|
"weft.activities.complete",
|
|
7
7
|
"weft.activities.fail",
|
|
8
|
+
"weft.alerts.list",
|
|
8
9
|
"weft.recover.all",
|
|
9
10
|
"weft.retention.get",
|
|
10
11
|
"weft.reviews.decision.submit",
|
|
@@ -65,6 +66,7 @@ export const CATALOG_OPERATION_NAMES = [
|
|
|
65
66
|
], CLIENT_OPERATION_NAMES = [
|
|
66
67
|
"weft.activities.complete",
|
|
67
68
|
"weft.activities.fail",
|
|
69
|
+
"weft.alerts.list",
|
|
68
70
|
"weft.recover.all",
|
|
69
71
|
"weft.retention.get",
|
|
70
72
|
"weft.reviews.decision.submit",
|
package/dist/cli/help-text.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const HELP_TEXT = "\nweft - Bun-native durable execution engine\n\nUsage: weft [command] [options]\n\nCommands:\n serve Start the Weft server (default)\n doctor Run diagnostics on the Weft database\n conformance Run RemoteWorker protocol conformance checks\n schedule Manage recurring schedules\n timeline Inspect workflow timeline and replay history\n version:check Check workflow version compatibility\n validate Lint workflow definitions for design-time anti-patterns\n codegen Generate TypeScript declarations from a registry snapshot\n api Inspect and invoke catalog operations on a running server\n server Inspect a running server's health and operation surface\n workflow List, inspect, start, signal, and cancel workflows on a server\n tail Stream a workflow's events as Server-Sent Events\n completions Generate or install shell completion scripts\n version Print the installed Weft version\n\nVersion (leading token only; a subcommand owns its own option line):\n weft version | weft --version | weft -v Print the installed Weft version\n\nServe Options:\n -p, --port <port> Server port (default: 7233)\n -d, --database <path> Database file path (default: ./weft.db)\n -s, --storage <backend> Storage backend: sqlite, lmdb, memory (default: sqlite)\n -w, --workflows <path> Path to workflow module to register on startup\n -h, --help Show this help message\n";
|
|
1
|
+
export declare const HELP_TEXT = "\nweft - Bun-native durable execution engine\n\nUsage: weft [command] [options]\n\nCommands:\n serve Start the Weft server (default)\n doctor Run diagnostics on the Weft database\n conformance Run RemoteWorker protocol conformance checks\n schedule Manage recurring schedules\n timeline Inspect workflow timeline and replay history\n version:check Check workflow version compatibility\n validate Lint workflow definitions for design-time anti-patterns\n codegen Generate TypeScript declarations from a registry snapshot\n api Inspect and invoke catalog operations on a running server\n server Inspect a running server's health and operation surface\n workflow List, inspect, start, signal, and cancel workflows on a server\n tail Stream a workflow's events as Server-Sent Events\n completions Generate or install shell completion scripts\n version Print the installed Weft version\n\nVersion (leading token only; a subcommand owns its own option line):\n weft version | weft --version | weft -v Print the installed Weft version\n\nServe Options:\n -p, --port <port> Server port (default: 7233)\n -d, --database <path> Database file path (default: ./weft.db)\n -s, --storage <backend> Storage backend: sqlite, lmdb, memory (default: sqlite)\n -w, --workflows <path> Path to workflow module to register on startup\n --console Mount @lostgradient/weft-console\n -h, --help Show this help message\n";
|
|
2
2
|
export declare const API_HELP_TEXT = "\nweft api - Inspect and invoke catalog operations on a running server\n\nUsage:\n weft api --list [options]\n weft api --describe <operation-name> [options]\n weft api <operation-name> [--input <json> | --input-file <path|->] [options]\n\nOptions:\n --server <url> Server URL (default: WEFT_ADDR, profile, run lockfile, or localhost)\n --token <token> Bearer token (default: WEFT_TOKEN)\n --profile <name> Profile from ~/.weft/config (default: WEFT_PROFILE or default_profile)\n --input <json> JSON object input for the operation\n --input-file <path> Read JSON object input from a file, or '-' for stdin\n --list List catalog operations\n --describe <name> Print one operation's schema and metadata\n --yes Confirm destructive operations without prompting\n -j, --json Emit machine-readable JSON output\n -h, --help Show this help message\n\nExit codes:\n 0 Success\n 1 Operation failed or destructive operation was not confirmed\n 2 Connection error\n 3 Usage or input validation error\n";
|
|
3
3
|
export declare const CONFORMANCE_HELP_TEXT = "\nweft conformance - Run RemoteWorker protocol conformance checks\n\nUsage: weft conformance [options] -- <worker-command> [args...]\n\nThe worker command receives:\n WEFT_WORKER_URL\n WEFT_WORKER_QUEUE\n WEFT_WORKER_ACTIVITIES\n WEFT_WORKER_PROTOCOL_VERSION\n\nOptions:\n --timeout <ms> Per-check timeout in milliseconds (default: 15000)\n -j, --json Output results as JSON\n -h, --help Show this help message\n";
|
|
4
4
|
export declare const DOCTOR_HELP_TEXT = "\nweft doctor - Run diagnostics on the Weft database\n\nUsage: weft doctor [options]\n\nOptions:\n -d, --database <path> Database file path (default: ./weft.db)\n -j, --json Output results as JSON\n -h, --help Show this help message\n";
|
package/dist/cli/help-text.js
CHANGED
|
@@ -27,6 +27,7 @@ Serve Options:
|
|
|
27
27
|
-d, --database <path> Database file path (default: ./weft.db)
|
|
28
28
|
-s, --storage <backend> Storage backend: sqlite, lmdb, memory (default: sqlite)
|
|
29
29
|
-w, --workflows <path> Path to workflow module to register on startup
|
|
30
|
+
--console Mount @lostgradient/weft-console
|
|
30
31
|
-h, --help Show this help message
|
|
31
32
|
`, API_HELP_TEXT = `
|
|
32
33
|
weft api - Inspect and invoke catalog operations on a running server
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { executeApi } from './api.ts';
|
|
|
4
4
|
export { executeCodegen } from './codegen.ts';
|
|
5
5
|
export { executeCompletions } from './completions.ts';
|
|
6
6
|
export { executeConformance } from './conformance.ts';
|
|
7
|
+
export { loadConsoleMount } from './console.ts';
|
|
7
8
|
export { executeDoctor } from './doctor.ts';
|
|
8
9
|
export { createWeftClient } from './generated/operation-client.generated.ts';
|
|
9
10
|
export type { CatalogOperationName, WeftClient } from './generated/operation-client.generated.ts';
|
package/dist/cli/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { executeApi } from "./api.js";
|
|
|
4
4
|
export { executeCodegen } from "./codegen.js";
|
|
5
5
|
export { executeCompletions } from "./completions.js";
|
|
6
6
|
export { executeConformance } from "./conformance.js";
|
|
7
|
+
export { loadConsoleMount } from "./console.js";
|
|
7
8
|
export { executeDoctor } from "./doctor.js";
|
|
8
9
|
export { createWeftClient } from "./generated/operation-client.generated.js";
|
|
9
10
|
export {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type JsonInputFailure = {
|
|
2
|
+
readonly kind: 'invalid-json';
|
|
3
|
+
readonly detail: string;
|
|
4
|
+
readonly message: string;
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: 'missing-file';
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly path: string;
|
|
9
|
+
};
|
|
10
|
+
export type JsonInputResult = {
|
|
11
|
+
readonly ok: true;
|
|
12
|
+
readonly value: unknown;
|
|
13
|
+
} | {
|
|
14
|
+
readonly ok: false;
|
|
15
|
+
readonly error: JsonInputFailure;
|
|
16
|
+
};
|
|
17
|
+
/** Parse one inline JSON source without applying a command-specific error format. */
|
|
18
|
+
export declare function parseJsonInput(source: string): JsonInputResult;
|
|
19
|
+
/** Load JSON from inline input, a file, or stdin without applying caller policy. */
|
|
20
|
+
export declare function loadJsonInput(input: string | undefined, inputFile: string | undefined, readStdin?: () => Promise<string>): Promise<JsonInputResult>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function errorMessage(error) {
|
|
2
|
+
return error instanceof Error ? error.message : String(error);
|
|
3
|
+
}
|
|
4
|
+
export function parseJsonInput(source) {
|
|
5
|
+
try {
|
|
6
|
+
return { ok: !0, value: JSON.parse(source) };
|
|
7
|
+
} catch (error) {
|
|
8
|
+
const detail = errorMessage(error);
|
|
9
|
+
return {
|
|
10
|
+
ok: !1,
|
|
11
|
+
error: { kind: "invalid-json", detail, message: `invalid JSON input: ${detail}` }
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function loadJsonInput(input, inputFile, readStdin = () => Bun.stdin.text()) {
|
|
16
|
+
if (input !== void 0)
|
|
17
|
+
return parseJsonInput(input);
|
|
18
|
+
if (inputFile === void 0)
|
|
19
|
+
return { ok: !0, value: void 0 };
|
|
20
|
+
if (inputFile === "-")
|
|
21
|
+
return parseJsonInput(await readStdin());
|
|
22
|
+
const file = Bun.file(inputFile);
|
|
23
|
+
if (!await file.exists())
|
|
24
|
+
return {
|
|
25
|
+
ok: !1,
|
|
26
|
+
error: {
|
|
27
|
+
kind: "missing-file",
|
|
28
|
+
message: `input file not found: ${inputFile}`,
|
|
29
|
+
path: inputFile
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return parseJsonInput(await file.text());
|
|
33
|
+
}
|
|
@@ -75,6 +75,7 @@ function parseServeArguments(args) {
|
|
|
75
75
|
database: { type: "string", short: "d", default: "./weft.db" },
|
|
76
76
|
storage: { type: "string", short: "s", default: "sqlite" },
|
|
77
77
|
help: { type: "boolean", short: "h", default: !1 },
|
|
78
|
+
console: { type: "boolean", default: !1 },
|
|
78
79
|
workflows: { type: "string", short: "w" }
|
|
79
80
|
},
|
|
80
81
|
strict: !0,
|
|
@@ -89,6 +90,7 @@ function parseServeArguments(args) {
|
|
|
89
90
|
database: values.database ?? "./weft.db",
|
|
90
91
|
storage: parseStorageBackend(values.storage),
|
|
91
92
|
help: values.help ?? !1,
|
|
93
|
+
console: values.console ?? !1,
|
|
92
94
|
...values.workflows ? { workflows: values.workflows } : {}
|
|
93
95
|
};
|
|
94
96
|
}
|
package/dist/cli/schedule.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { registerOnRuntimeEngine, runtimeWorkflowEngine } from "../core/runtime-workflow-engine.js";
|
|
2
|
+
import { parseJsonInput } from "./json-input.js";
|
|
2
3
|
import { createStorage } from "./storage-factory.js";
|
|
3
4
|
function formatScheduleCadence(schedule) {
|
|
4
5
|
if (schedule.intervalMs !== void 0)
|
|
@@ -42,13 +43,6 @@ function getScheduleCreateValidationError(options) {
|
|
|
42
43
|
return "Error: provide a <cronExpression> argument or an --every <duration> flag for schedule create";
|
|
43
44
|
return null;
|
|
44
45
|
}
|
|
45
|
-
function parseScheduleInput(input) {
|
|
46
|
-
try {
|
|
47
|
-
return { ok: !0, value: JSON.parse(input) };
|
|
48
|
-
} catch (error) {
|
|
49
|
-
return { ok: !1, message: `Error: could not parse --input JSON: ${error instanceof Error ? error.message : String(error)}` };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
46
|
async function registerScheduleWorkflows(engine, workflowsPath, loadRegistrationsFromModule) {
|
|
53
47
|
const loaded = await loadRegistrationsFromModule(workflowsPath);
|
|
54
48
|
for (const definition of Object.values(loaded.registrations))
|
|
@@ -59,9 +53,13 @@ async function executeScheduleCreate(options, engine, loadRegistrationsFromModul
|
|
|
59
53
|
if (validationError !== null)
|
|
60
54
|
return { stdout: "", stderr: validationError, exitCode: 1 };
|
|
61
55
|
await registerScheduleWorkflows(engine, options.workflows, loadRegistrationsFromModule);
|
|
62
|
-
const parsedInput =
|
|
56
|
+
const parsedInput = parseJsonInput(options.input);
|
|
63
57
|
if (!parsedInput.ok)
|
|
64
|
-
return {
|
|
58
|
+
return {
|
|
59
|
+
stdout: "",
|
|
60
|
+
stderr: parsedInput.error.kind === "invalid-json" ? `Error: could not parse --input JSON: ${parsedInput.error.detail}` : `Error: ${parsedInput.error.message}`,
|
|
61
|
+
exitCode: 1
|
|
62
|
+
};
|
|
65
63
|
const spec = options.every !== void 0 ? { every: options.every } : options.cronExpression, handle = await engine.schedule(options.workflowType, parsedInput.value, spec, {
|
|
66
64
|
...options.id !== void 0 ? { id: options.id } : {},
|
|
67
65
|
...options.overlap !== void 0 ? { overlap: options.overlap } : {},
|
package/dist/cli/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { loadJsonInput } from "./json-input.js";
|
|
1
2
|
import {
|
|
2
3
|
confirmDestructive,
|
|
3
4
|
formatTimestamp,
|
|
4
|
-
messageOf,
|
|
5
5
|
ndjson,
|
|
6
6
|
prettyJson,
|
|
7
7
|
truncateToWidth
|
|
@@ -105,30 +105,10 @@ async function executeWorkflowEvents(command, connection) {
|
|
|
105
105
|
}).join(`
|
|
106
106
|
`), exitCode: 0 };
|
|
107
107
|
}
|
|
108
|
-
async function readInlineInput(input, inputFile) {
|
|
109
|
-
if (input !== void 0)
|
|
110
|
-
return parseJson(input);
|
|
111
|
-
if (inputFile !== void 0) {
|
|
112
|
-
if (inputFile === "-")
|
|
113
|
-
return parseJson(await Bun.stdin.text());
|
|
114
|
-
const file = Bun.file(inputFile);
|
|
115
|
-
if (!await file.exists())
|
|
116
|
-
return { ok: !1, message: `input file not found: ${inputFile}` };
|
|
117
|
-
return parseJson(await file.text());
|
|
118
|
-
}
|
|
119
|
-
return { ok: !0, value: void 0 };
|
|
120
|
-
}
|
|
121
|
-
function parseJson(source) {
|
|
122
|
-
try {
|
|
123
|
-
return { ok: !0, value: JSON.parse(source) };
|
|
124
|
-
} catch (error) {
|
|
125
|
-
return { ok: !1, message: `invalid JSON input: ${messageOf(error)}` };
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
108
|
async function executeWorkflowStart(command, connection) {
|
|
129
|
-
const parsed = await
|
|
109
|
+
const parsed = await loadJsonInput(command.input, command.inputFile);
|
|
130
110
|
if (!parsed.ok)
|
|
131
|
-
return { stdout: "", stderr: `workflow start: ${parsed.message}`, exitCode: 3 };
|
|
111
|
+
return { stdout: "", stderr: `workflow start: ${parsed.error.message}`, exitCode: 3 };
|
|
132
112
|
const result = await callCatalogOperation(connection, "weft.workflows.start", {
|
|
133
113
|
type: command.workflowType,
|
|
134
114
|
...parsed.value === void 0 ? {} : { input: parsed.value },
|
|
@@ -169,9 +149,9 @@ async function executeWorkflowCancel(command, connection) {
|
|
|
169
149
|
};
|
|
170
150
|
}
|
|
171
151
|
async function executeWorkflowSignal(command, connection) {
|
|
172
|
-
const parsed = await
|
|
152
|
+
const parsed = await loadJsonInput(command.input, command.inputFile);
|
|
173
153
|
if (!parsed.ok)
|
|
174
|
-
return { stdout: "", stderr: `workflow signal: ${parsed.message}`, exitCode: 3 };
|
|
154
|
+
return { stdout: "", stderr: `workflow signal: ${parsed.error.message}`, exitCode: 3 };
|
|
175
155
|
const result = await callCatalogOperation(connection, "weft.workflows.signal", {
|
|
176
156
|
workflowId: command.workflowId,
|
|
177
157
|
signalName: command.signalName,
|
package/dist/cli-main.js
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
executeWorkflow,
|
|
22
22
|
findCliSubcommandName,
|
|
23
23
|
HELP_TEXT,
|
|
24
|
+
loadConsoleMount,
|
|
24
25
|
parseCliArguments,
|
|
25
26
|
removeRunLockfile,
|
|
26
27
|
SCHEDULE_HELP_TEXT,
|
|
@@ -53,7 +54,7 @@ if (parsedArguments.command === "version") {
|
|
|
53
54
|
console.log(HELP_TEXT);
|
|
54
55
|
process.exit(0);
|
|
55
56
|
}
|
|
56
|
-
const storage = await createStorage(parsedArguments.storage, parsedArguments.database), engine = new Engine({ storage });
|
|
57
|
+
const consoleMount = parsedArguments.console ? await loadConsoleMount() : void 0, storage = await createStorage(parsedArguments.storage, parsedArguments.database), engine = new Engine({ storage });
|
|
57
58
|
if (parsedArguments.workflows) {
|
|
58
59
|
const { loadRegistrationsFromModule } = await import("./diagnostics/validate.js"), { registerModuleExports } = await import("./cli/serve-registrations.js"), loaded = await loadRegistrationsFromModule(parsedArguments.workflows);
|
|
59
60
|
registerModuleExports(engine, loaded.registrations, loaded.activities);
|
|
@@ -61,7 +62,8 @@ if (parsedArguments.command === "version") {
|
|
|
61
62
|
console.log("No --workflows module provided; starting in inspect-only mode.");
|
|
62
63
|
const server = serve({
|
|
63
64
|
engine,
|
|
64
|
-
port: Number(parsedArguments.port)
|
|
65
|
+
port: Number(parsedArguments.port),
|
|
66
|
+
...consoleMount
|
|
65
67
|
});
|
|
66
68
|
await writeRunLockfile(server.url);
|
|
67
69
|
console.log(`Weft API running at ${new URL("/api/v1", server.url).href}`);
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* @module core/aggregate-validation
|
|
12
12
|
*/
|
|
13
13
|
import { z } from 'zod';
|
|
14
|
+
import { type ValidationIssue } from './validation-issues.ts';
|
|
14
15
|
import { WeftError } from './weft-error.ts';
|
|
15
16
|
/**
|
|
16
17
|
* Group-by dimension for `engine.aggregate()`. Either a fixed structural
|
|
@@ -54,11 +55,7 @@ export declare const aggregateOptionsObjectSchema: z.ZodObject<{
|
|
|
54
55
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
55
56
|
}, z.core.$strict>;
|
|
56
57
|
/** A flattened Zod issue suitable for cross-transport serialization. */
|
|
57
|
-
export type AggregateOptionsValidationIssue =
|
|
58
|
-
readonly path: ReadonlyArray<string | number>;
|
|
59
|
-
readonly message: string;
|
|
60
|
-
readonly code: string;
|
|
61
|
-
};
|
|
58
|
+
export type AggregateOptionsValidationIssue = ValidationIssue;
|
|
62
59
|
/**
|
|
63
60
|
* Thrown by {@link normalizeAggregateOptions} when input fails validation.
|
|
64
61
|
* Carries flattened Zod issues so transport adapters can map directly to
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { flattenZodIssue } from "./validation-issues.js";
|
|
2
3
|
import { WeftError } from "./weft-error.js";
|
|
3
4
|
const attributeDimensionSchema = z.object({ attribute: z.string().min(1) }).strict(), groupBySchema = z.union([
|
|
4
5
|
z.literal("status"),
|
|
@@ -10,15 +11,6 @@ export const AGGREGATE_DEFAULT_LIMIT = 1000, AGGREGATE_MAX_LIMIT = 1e4, MAX_AGGR
|
|
|
10
11
|
groupBy: groupBySchema,
|
|
11
12
|
limit: z.number().int().min(1).max(AGGREGATE_MAX_LIMIT).optional()
|
|
12
13
|
}).strict();
|
|
13
|
-
function flattenIssue(issue) {
|
|
14
|
-
const path = [];
|
|
15
|
-
for (const segment of issue.path)
|
|
16
|
-
if (typeof segment === "string" || typeof segment === "number")
|
|
17
|
-
path.push(segment);
|
|
18
|
-
else
|
|
19
|
-
path.push(String(segment));
|
|
20
|
-
return { path, message: issue.message, code: issue.code };
|
|
21
|
-
}
|
|
22
14
|
|
|
23
15
|
export class AggregateOptionsValidationError extends WeftError {
|
|
24
16
|
issues;
|
|
@@ -42,7 +34,7 @@ export class AggregateDistinctKeyCapExceededError extends WeftError {
|
|
|
42
34
|
export function normalizeAggregateOptions(input) {
|
|
43
35
|
const result = aggregateOptionsObjectSchema.safeParse(input ?? {});
|
|
44
36
|
if (!result.success)
|
|
45
|
-
throw new AggregateOptionsValidationError(result.error.issues.map(
|
|
37
|
+
throw new AggregateOptionsValidationError(result.error.issues.map(flattenZodIssue));
|
|
46
38
|
const { groupBy, limit } = result.data;
|
|
47
39
|
return { groupBy, ...limit !== void 0 && { limit } };
|
|
48
40
|
}
|
|
@@ -121,35 +121,18 @@ export class AtomicState extends EventTarget {
|
|
|
121
121
|
return (await this.#read()).value;
|
|
122
122
|
}
|
|
123
123
|
async update(updater) {
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return nextValue;
|
|
129
|
-
}
|
|
130
|
-
dispatchAtomicStateEvent(this, new AtomicStateConflictEvent(this.#stateKey, attempt + 1));
|
|
131
|
-
if (attempt < this.#maxRetries - 1)
|
|
132
|
-
await this.#sleep(retryDelay(attempt));
|
|
133
|
-
}
|
|
134
|
-
dispatchAtomicStateEvent(this, new AtomicStateExhaustedEvent(this.#stateKey, this.#maxRetries));
|
|
135
|
-
throw new AtomicStateConflictError(this.#stateKey, this.#maxRetries);
|
|
124
|
+
return this.#runOptimisticMutation(async (snapshot) => {
|
|
125
|
+
const nextValue = updater(snapshot.value);
|
|
126
|
+
return { commit: await commitAtomicStateValue(this.#storage, this.#dataKey, snapshot.version, nextValue), result: nextValue, eventValue: nextValue };
|
|
127
|
+
});
|
|
136
128
|
}
|
|
137
129
|
async set(value) {
|
|
138
130
|
return this.update(() => value);
|
|
139
131
|
}
|
|
140
132
|
async delete() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
dispatchAtomicStateEvent(this, new AtomicStateChangeEvent(void 0, snapshot.value, commit.version));
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
dispatchAtomicStateEvent(this, new AtomicStateConflictEvent(this.#stateKey, attempt + 1));
|
|
148
|
-
if (attempt < this.#maxRetries - 1)
|
|
149
|
-
await this.#sleep(retryDelay(attempt));
|
|
150
|
-
}
|
|
151
|
-
dispatchAtomicStateEvent(this, new AtomicStateExhaustedEvent(this.#stateKey, this.#maxRetries));
|
|
152
|
-
throw new AtomicStateConflictError(this.#stateKey, this.#maxRetries);
|
|
133
|
+
await this.#runOptimisticMutation(async (snapshot) => {
|
|
134
|
+
return { commit: await commitAtomicStateDelete(this.#storage, this.#dataKey, snapshot.version), result: void 0, eventValue: void 0 };
|
|
135
|
+
});
|
|
153
136
|
}
|
|
154
137
|
increment(amount = 1) {
|
|
155
138
|
return this.update((current) => (current ?? 0) + amount);
|
|
@@ -225,6 +208,20 @@ export class AtomicState extends EventTarget {
|
|
|
225
208
|
this.removeEventListener("exhausted", listener);
|
|
226
209
|
}
|
|
227
210
|
}
|
|
211
|
+
async#runOptimisticMutation(attemptMutation) {
|
|
212
|
+
for (let attempt = 0;attempt < this.#maxRetries; attempt++) {
|
|
213
|
+
const snapshot = await this.#read(), mutation = await attemptMutation(snapshot);
|
|
214
|
+
if (mutation.commit.applied) {
|
|
215
|
+
dispatchAtomicStateEvent(this, new AtomicStateChangeEvent(mutation.eventValue, snapshot.value, mutation.commit.version));
|
|
216
|
+
return mutation.result;
|
|
217
|
+
}
|
|
218
|
+
dispatchAtomicStateEvent(this, new AtomicStateConflictEvent(this.#stateKey, attempt + 1));
|
|
219
|
+
if (attempt < this.#maxRetries - 1)
|
|
220
|
+
await this.#sleep(retryDelay(attempt));
|
|
221
|
+
}
|
|
222
|
+
dispatchAtomicStateEvent(this, new AtomicStateExhaustedEvent(this.#stateKey, this.#maxRetries));
|
|
223
|
+
throw new AtomicStateConflictError(this.#stateKey, this.#maxRetries);
|
|
224
|
+
}
|
|
228
225
|
async#read() {
|
|
229
226
|
return readAtomicStateSnapshot(this.#storage, this.#dataKey, this.#options);
|
|
230
227
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AlertState } from '../../alerting/types.ts';
|
|
1
2
|
import { type Storage as WeftStorage } from '../../storage/interface.ts';
|
|
2
3
|
import { type ActivityMetadata, type ActivityRegistrationOptions, type RegisteredActivityFunction } from '../activity-registry.ts';
|
|
3
4
|
import type { StoredStreamChunk } from '../context.ts';
|
|
@@ -145,6 +146,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
145
146
|
removeEventListener<K extends Extract<keyof WeftEventMap, string>>(type: K, listener: (event: WeftEventMap[K]) => void, options?: boolean | EventListenerOptions): void;
|
|
146
147
|
removeEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
|
|
147
148
|
get state(): EngineStateNamespace;
|
|
149
|
+
/** Return the alert rules that are currently firing. */
|
|
150
|
+
getActiveAlerts(): readonly AlertState[];
|
|
148
151
|
/**
|
|
149
152
|
* Register a workflow by name or definition, or register an activity
|
|
150
153
|
* definition. Definition overloads return this same engine with the
|
|
@@ -522,6 +522,9 @@ export class Engine extends EventTarget {
|
|
|
522
522
|
workflow: (workflowType, key, options) => new AtomicState(storage, KEYS.stateWorkflow(workflowType, key), options)
|
|
523
523
|
};
|
|
524
524
|
}
|
|
525
|
+
getActiveAlerts() {
|
|
526
|
+
return getInternals(this).alertManager?.activeStates ?? [];
|
|
527
|
+
}
|
|
525
528
|
async#handleStrategyMessage(message) {
|
|
526
529
|
return handleStrategyMessageFromInternals(getInternals(this), message, this.#createInlineParkingCallbacks());
|
|
527
530
|
}
|
|
@@ -100,7 +100,10 @@ async function hasCurrentScheduleTimer(internals, state) {
|
|
|
100
100
|
}
|
|
101
101
|
export function toScheduleSummary(state) {
|
|
102
102
|
const { input: _input, ...summary } = state;
|
|
103
|
-
return {
|
|
103
|
+
return {
|
|
104
|
+
...summary,
|
|
105
|
+
queuedRuns: summary.queuedRuns.map((queuedRun) => ({ ...queuedRun }))
|
|
106
|
+
};
|
|
104
107
|
}
|
|
105
108
|
export async function pauseSchedule(internals, scheduleId) {
|
|
106
109
|
const normalizedScheduleId = coerceScheduleId(scheduleId, "scheduleId"), state = await requireScheduleState(internals, normalizedScheduleId);
|
|
@@ -128,11 +128,17 @@ export class InlineExecutionStrategy {
|
|
|
128
128
|
this[Symbol.dispose]();
|
|
129
129
|
}
|
|
130
130
|
#driveGenerator(workflowId, generator, lastResult) {
|
|
131
|
+
return this.#advanceGenerator(workflowId, () => generator.next(lastResult), void 0);
|
|
132
|
+
}
|
|
133
|
+
#throwIntoGenerator(workflowId, generator, error, operationFailureCategory) {
|
|
134
|
+
return this.#advanceGenerator(workflowId, () => generator.throw(error), operationFailureCategory);
|
|
135
|
+
}
|
|
136
|
+
#advanceGenerator(workflowId, advance, fallbackFailureCategory) {
|
|
131
137
|
return this.#trackWorkflowAdvance(workflowId, (async () => {
|
|
132
138
|
try {
|
|
133
139
|
if (this.#abortControllers.get(workflowId)?.signal.aborted)
|
|
134
140
|
return;
|
|
135
|
-
const iterationResult = await
|
|
141
|
+
const iterationResult = await advance();
|
|
136
142
|
if (iterationResult.done) {
|
|
137
143
|
this.#cleanup(workflowId, {
|
|
138
144
|
preserveTrackedAdvance: !0,
|
|
@@ -161,7 +167,7 @@ export class InlineExecutionStrategy {
|
|
|
161
167
|
type: "failed",
|
|
162
168
|
workflowId,
|
|
163
169
|
error: error instanceof Error ? error.message : String(error),
|
|
164
|
-
failureCategory: classifyErrorAsFailureCategory(error, {
|
|
170
|
+
failureCategory: fallbackFailureCategory ?? classifyErrorAsFailureCategory(error, {
|
|
165
171
|
defaultErrorCategory: "application"
|
|
166
172
|
})
|
|
167
173
|
};
|
|
@@ -171,50 +177,6 @@ export class InlineExecutionStrategy {
|
|
|
171
177
|
}
|
|
172
178
|
})());
|
|
173
179
|
}
|
|
174
|
-
#throwIntoGenerator(workflowId, generator, error, operationFailureCategory) {
|
|
175
|
-
return this.#trackWorkflowAdvance(workflowId, (async () => {
|
|
176
|
-
try {
|
|
177
|
-
if (this.#abortControllers.get(workflowId)?.signal.aborted)
|
|
178
|
-
return;
|
|
179
|
-
const iterationResult = await generator.throw(error);
|
|
180
|
-
if (iterationResult.done) {
|
|
181
|
-
this.#cleanup(workflowId, {
|
|
182
|
-
preserveTrackedAdvance: !0,
|
|
183
|
-
preserveTrackedTurn: !0
|
|
184
|
-
});
|
|
185
|
-
this.#emit({
|
|
186
|
-
type: "completed",
|
|
187
|
-
workflowId,
|
|
188
|
-
result: iterationResult.value
|
|
189
|
-
});
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const operation = iterationResult.value;
|
|
193
|
-
this.#emit({
|
|
194
|
-
type: "checkpoint",
|
|
195
|
-
workflowId,
|
|
196
|
-
checkpoint: new ArrayBuffer(0),
|
|
197
|
-
operationRequest: operation
|
|
198
|
-
});
|
|
199
|
-
} catch (innerError) {
|
|
200
|
-
this.#cleanup(workflowId, {
|
|
201
|
-
preserveTrackedAdvance: !0,
|
|
202
|
-
preserveTrackedTurn: !0
|
|
203
|
-
});
|
|
204
|
-
const failedMessage = {
|
|
205
|
-
type: "failed",
|
|
206
|
-
workflowId,
|
|
207
|
-
error: innerError instanceof Error ? innerError.message : String(innerError),
|
|
208
|
-
failureCategory: operationFailureCategory ?? classifyErrorAsFailureCategory(innerError, {
|
|
209
|
-
defaultErrorCategory: "application"
|
|
210
|
-
})
|
|
211
|
-
};
|
|
212
|
-
if (innerError instanceof Error && innerError.stack !== void 0)
|
|
213
|
-
failedMessage.errorStack = innerError.stack;
|
|
214
|
-
this.#emit(failedMessage);
|
|
215
|
-
}
|
|
216
|
-
})());
|
|
217
|
-
}
|
|
218
180
|
#trackWorkflowAdvance(workflowId, pendingAdvance) {
|
|
219
181
|
const trackedAdvance = pendingAdvance.finally(() => {
|
|
220
182
|
if (this.#workflowAdvances.get(workflowId) === trackedAdvance)
|