@action-llama/action-llama 0.15.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.
Files changed (137) hide show
  1. package/dist/build-info.json +1 -1
  2. package/dist/cli/commands/doctor.d.ts +1 -0
  3. package/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/dist/cli/commands/doctor.js +101 -4
  5. package/dist/cli/commands/doctor.js.map +1 -1
  6. package/dist/cli/commands/webhook.d.ts +11 -0
  7. package/dist/cli/commands/webhook.d.ts.map +1 -0
  8. package/dist/cli/commands/webhook.js +271 -0
  9. package/dist/cli/commands/webhook.js.map +1 -0
  10. package/dist/cli/main.js +17 -0
  11. package/dist/cli/main.js.map +1 -1
  12. package/dist/docker/local-runtime.d.ts.map +1 -1
  13. package/dist/docker/local-runtime.js +36 -7
  14. package/dist/docker/local-runtime.js.map +1 -1
  15. package/dist/docker/runtime.d.ts +4 -0
  16. package/dist/docker/runtime.d.ts.map +1 -1
  17. package/dist/gateway/index.d.ts +2 -0
  18. package/dist/gateway/index.d.ts.map +1 -1
  19. package/dist/gateway/index.js +1 -1
  20. package/dist/gateway/index.js.map +1 -1
  21. package/dist/gateway/routes/webhooks.d.ts +2 -1
  22. package/dist/gateway/routes/webhooks.d.ts.map +1 -1
  23. package/dist/gateway/routes/webhooks.js +3 -2
  24. package/dist/gateway/routes/webhooks.js.map +1 -1
  25. package/dist/remote/push.d.ts.map +1 -1
  26. package/dist/remote/push.js +11 -2
  27. package/dist/remote/push.js.map +1 -1
  28. package/dist/scheduler/event-queue-unified.d.ts +50 -0
  29. package/dist/scheduler/event-queue-unified.d.ts.map +1 -0
  30. package/dist/scheduler/event-queue-unified.js +280 -0
  31. package/dist/scheduler/event-queue-unified.js.map +1 -0
  32. package/dist/scheduler/execution.d.ts +2 -1
  33. package/dist/scheduler/execution.d.ts.map +1 -1
  34. package/dist/scheduler/execution.js +48 -8
  35. package/dist/scheduler/execution.js.map +1 -1
  36. package/dist/scheduler/gateway-setup.d.ts +2 -1
  37. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  38. package/dist/scheduler/gateway-setup.js +2 -1
  39. package/dist/scheduler/gateway-setup.js.map +1 -1
  40. package/dist/scheduler/index.js +1 -1
  41. package/dist/scheduler/index.js.map +1 -1
  42. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts +114 -0
  43. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts.map +1 -0
  44. package/dist/scheduler/lifecycle/agent-lifecycle.js +236 -0
  45. package/dist/scheduler/lifecycle/agent-lifecycle.js.map +1 -0
  46. package/dist/scheduler/lifecycle/index.d.ts +60 -0
  47. package/dist/scheduler/lifecycle/index.d.ts.map +1 -0
  48. package/dist/scheduler/lifecycle/index.js +103 -0
  49. package/dist/scheduler/lifecycle/index.js.map +1 -0
  50. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts +88 -0
  51. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts.map +1 -0
  52. package/dist/scheduler/lifecycle/instance-lifecycle.js +142 -0
  53. package/dist/scheduler/lifecycle/instance-lifecycle.js.map +1 -0
  54. package/dist/scheduler/types.d.ts +2 -0
  55. package/dist/scheduler/types.d.ts.map +1 -1
  56. package/dist/scheduler/webhook-setup.d.ts +1 -0
  57. package/dist/scheduler/webhook-setup.d.ts.map +1 -1
  58. package/dist/scheduler/webhook-setup.js +14 -2
  59. package/dist/scheduler/webhook-setup.js.map +1 -1
  60. package/dist/shared/config.d.ts +1 -0
  61. package/dist/shared/config.d.ts.map +1 -1
  62. package/dist/shared/config.js.map +1 -1
  63. package/dist/shared/constants.d.ts +16 -0
  64. package/dist/shared/constants.d.ts.map +1 -1
  65. package/dist/shared/constants.js +54 -0
  66. package/dist/shared/constants.js.map +1 -1
  67. package/dist/shared/persistence/adapters/state-store.d.ts +24 -0
  68. package/dist/shared/persistence/adapters/state-store.d.ts.map +1 -0
  69. package/dist/shared/persistence/adapters/state-store.js +32 -0
  70. package/dist/shared/persistence/adapters/state-store.js.map +1 -0
  71. package/dist/shared/persistence/adapters/stats-store.d.ts +49 -0
  72. package/dist/shared/persistence/adapters/stats-store.d.ts.map +1 -0
  73. package/dist/shared/persistence/adapters/stats-store.js +213 -0
  74. package/dist/shared/persistence/adapters/stats-store.js.map +1 -0
  75. package/dist/shared/persistence/backends/memory.d.ts +39 -0
  76. package/dist/shared/persistence/backends/memory.d.ts.map +1 -0
  77. package/dist/shared/persistence/backends/memory.js +214 -0
  78. package/dist/shared/persistence/backends/memory.js.map +1 -0
  79. package/dist/shared/persistence/backends/sqlite.d.ts +38 -0
  80. package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -0
  81. package/dist/shared/persistence/backends/sqlite.js +250 -0
  82. package/dist/shared/persistence/backends/sqlite.js.map +1 -0
  83. package/dist/shared/persistence/event-store.d.ts +77 -0
  84. package/dist/shared/persistence/event-store.d.ts.map +1 -0
  85. package/dist/shared/persistence/event-store.js +139 -0
  86. package/dist/shared/persistence/event-store.js.map +1 -0
  87. package/dist/shared/persistence/index.d.ts +119 -0
  88. package/dist/shared/persistence/index.d.ts.map +1 -0
  89. package/dist/shared/persistence/index.js +93 -0
  90. package/dist/shared/persistence/index.js.map +1 -0
  91. package/dist/shared/persistence/migration.d.ts +47 -0
  92. package/dist/shared/persistence/migration.d.ts.map +1 -0
  93. package/dist/shared/persistence/migration.js +297 -0
  94. package/dist/shared/persistence/migration.js.map +1 -0
  95. package/dist/shared/validation.d.ts +61 -0
  96. package/dist/shared/validation.d.ts.map +1 -0
  97. package/dist/shared/validation.js +280 -0
  98. package/dist/shared/validation.js.map +1 -0
  99. package/dist/stats/event-store.d.ts +37 -0
  100. package/dist/stats/event-store.d.ts.map +1 -0
  101. package/dist/stats/event-store.js +366 -0
  102. package/dist/stats/event-store.js.map +1 -0
  103. package/dist/tui/status-tracker.d.ts +19 -0
  104. package/dist/tui/status-tracker.d.ts.map +1 -1
  105. package/dist/tui/status-tracker.js +96 -1
  106. package/dist/tui/status-tracker.js.map +1 -1
  107. package/dist/webhooks/providers/github.d.ts +1 -1
  108. package/dist/webhooks/providers/github.d.ts.map +1 -1
  109. package/dist/webhooks/providers/github.js +2 -2
  110. package/dist/webhooks/providers/github.js.map +1 -1
  111. package/dist/webhooks/providers/linear.d.ts +1 -1
  112. package/dist/webhooks/providers/linear.d.ts.map +1 -1
  113. package/dist/webhooks/providers/linear.js +2 -2
  114. package/dist/webhooks/providers/linear.js.map +1 -1
  115. package/dist/webhooks/providers/mintlify.d.ts +1 -1
  116. package/dist/webhooks/providers/mintlify.d.ts.map +1 -1
  117. package/dist/webhooks/providers/mintlify.js +2 -2
  118. package/dist/webhooks/providers/mintlify.js.map +1 -1
  119. package/dist/webhooks/providers/sentry.d.ts +1 -1
  120. package/dist/webhooks/providers/sentry.d.ts.map +1 -1
  121. package/dist/webhooks/providers/sentry.js +2 -2
  122. package/dist/webhooks/providers/sentry.js.map +1 -1
  123. package/dist/webhooks/providers/test.d.ts +1 -1
  124. package/dist/webhooks/providers/test.d.ts.map +1 -1
  125. package/dist/webhooks/providers/test.js +1 -1
  126. package/dist/webhooks/providers/test.js.map +1 -1
  127. package/dist/webhooks/registry.d.ts +8 -2
  128. package/dist/webhooks/registry.d.ts.map +1 -1
  129. package/dist/webhooks/registry.js +155 -3
  130. package/dist/webhooks/registry.js.map +1 -1
  131. package/dist/webhooks/types.d.ts +28 -1
  132. package/dist/webhooks/types.d.ts.map +1 -1
  133. package/dist/webhooks/validation.d.ts +7 -6
  134. package/dist/webhooks/validation.d.ts.map +1 -1
  135. package/dist/webhooks/validation.js +11 -9
  136. package/dist/webhooks/validation.js.map +1 -1
  137. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Unified persistence layer combining key-value storage, event sourcing, and query capabilities.
3
+ *
4
+ * Replaces the fragmented StateStore/StatsStore/WorkQueue pattern with a single abstraction
5
+ * that supports namespaces, TTL, and append-only event storage for features like replay,
6
+ * audit, and high availability.
7
+ */
8
+ /**
9
+ * Create a persistence store from configuration.
10
+ */
11
+ export async function createPersistenceStore(config) {
12
+ let backend;
13
+ switch (config.type) {
14
+ case "sqlite":
15
+ const { SqliteBackend } = await import("./backends/sqlite.js");
16
+ backend = new SqliteBackend(config.path || ":memory:");
17
+ break;
18
+ case "memory":
19
+ const { MemoryBackend } = await import("./backends/memory.js");
20
+ backend = new MemoryBackend(config.maxSize);
21
+ break;
22
+ default:
23
+ throw new Error(`Unsupported persistence backend: ${config.type}`);
24
+ }
25
+ await backend.init();
26
+ return new PersistenceStoreImpl(backend);
27
+ }
28
+ /**
29
+ * Implementation of PersistenceStore that delegates to a backend.
30
+ */
31
+ class PersistenceStoreImpl {
32
+ backend;
33
+ streams = new Map();
34
+ constructor(backend) {
35
+ this.backend = backend;
36
+ }
37
+ get kv() {
38
+ return {
39
+ get: (namespace, key) => this.backend.kvGet(namespace, key),
40
+ set: (namespace, key, value, opts) => this.backend.kvSet(namespace, key, value, opts?.ttl ? opts.ttl * 1000 : undefined),
41
+ delete: (namespace, key) => this.backend.kvDelete(namespace, key),
42
+ deleteAll: (namespace) => this.backend.kvDeleteAll(namespace),
43
+ list: (namespace) => this.backend.kvList(namespace),
44
+ };
45
+ }
46
+ get events() {
47
+ return {
48
+ stream: (name) => {
49
+ if (!this.streams.has(name)) {
50
+ this.streams.set(name, new EventStreamImpl(name, this.backend));
51
+ }
52
+ return this.streams.get(name);
53
+ },
54
+ listStreams: () => this.backend.eventListStreams(),
55
+ };
56
+ }
57
+ get query() {
58
+ return {
59
+ sql: (query, params) => this.backend.querySql(query, params),
60
+ };
61
+ }
62
+ async transaction(fn) {
63
+ return this.backend.transactionRun(() => fn(this));
64
+ }
65
+ async close() {
66
+ await this.backend.close();
67
+ this.streams.clear();
68
+ }
69
+ }
70
+ /**
71
+ * Implementation of EventStream that delegates to a backend.
72
+ */
73
+ class EventStreamImpl {
74
+ name;
75
+ backend;
76
+ constructor(name, backend) {
77
+ this.name = name;
78
+ this.backend = backend;
79
+ }
80
+ append(event) {
81
+ return this.backend.eventAppend(this.name, event);
82
+ }
83
+ replay(query) {
84
+ return this.backend.eventReplay(this.name, query);
85
+ }
86
+ getSnapshot(type) {
87
+ return this.backend.eventGetSnapshot(this.name, type);
88
+ }
89
+ saveSnapshot(type, data, eventId) {
90
+ return this.backend.eventSaveSnapshot(this.name, type, data, eventId);
91
+ }
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/persistence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Migration utilities for transitioning from legacy StateStore/StatsStore to unified persistence.
3
+ *
4
+ * Provides atomic migration with rollback support and progress reporting.
5
+ */
6
+ import type { StateStore } from "../state-store.js";
7
+ import type { StatsStore } from "../../stats/store.js";
8
+ import type { PersistenceStore } from "./index.js";
9
+ export interface MigrationProgress {
10
+ /** Current step being performed */
11
+ step: string;
12
+ /** Number of items processed */
13
+ processed: number;
14
+ /** Total items to process */
15
+ total: number;
16
+ /** Estimated completion percentage */
17
+ percentage: number;
18
+ }
19
+ export interface MigrationOptions {
20
+ /** Progress callback */
21
+ onProgress?: (progress: MigrationProgress) => void;
22
+ /** Batch size for processing large datasets */
23
+ batchSize?: number;
24
+ /** Whether to preserve original data after migration */
25
+ preserveOriginal?: boolean;
26
+ }
27
+ export declare class LegacyMigrator {
28
+ private newStore;
29
+ constructor(newStore: PersistenceStore);
30
+ /**
31
+ * Migrate from legacy StateStore to new persistence layer.
32
+ */
33
+ migrateStateStore(legacyStore: StateStore, options?: MigrationOptions): Promise<void>;
34
+ /**
35
+ * Migrate from legacy StatsStore to event-sourced analytics.
36
+ */
37
+ migrateStatsStore(legacyStore: StatsStore, options?: MigrationOptions): Promise<void>;
38
+ /**
39
+ * Perform complete migration from all legacy stores.
40
+ */
41
+ migrateAll(legacyStateStore?: StateStore, legacyStatsStore?: StatsStore, options?: MigrationOptions): Promise<void>;
42
+ }
43
+ /**
44
+ * Helper function to run migration with console progress reporting.
45
+ */
46
+ export declare function migrateFromLegacy(newStore: PersistenceStore, legacyStateStore?: StateStore, legacyStatsStore?: StatsStore, options?: Omit<MigrationOptions, 'onProgress'>): Promise<void>;
47
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/shared/persistence/migration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAE9C;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,UAAU,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAiFhB;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,UAAU,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAsLhB;;OAEG;IACG,UAAU,CACd,gBAAgB,CAAC,EAAE,UAAU,EAC7B,gBAAgB,CAAC,EAAE,UAAU,EAC7B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC;CA4EjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,CAAC,EAAE,UAAU,EAC7B,gBAAgB,CAAC,EAAE,UAAU,EAC7B,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAM,GACjD,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Migration utilities for transitioning from legacy StateStore/StatsStore to unified persistence.
3
+ *
4
+ * Provides atomic migration with rollback support and progress reporting.
5
+ */
6
+ import { createEvent, EventTypes } from "./event-store.js";
7
+ export class LegacyMigrator {
8
+ newStore;
9
+ constructor(newStore) {
10
+ this.newStore = newStore;
11
+ }
12
+ /**
13
+ * Migrate from legacy StateStore to new persistence layer.
14
+ */
15
+ async migrateStateStore(legacyStore, options = {}) {
16
+ const { onProgress, preserveOriginal = true } = options;
17
+ // Get all namespaces by querying common ones
18
+ const commonNamespaces = ["locks", "lock-holders", "sessions", "calls", "containers"];
19
+ let totalItems = 0;
20
+ const namespaceData = new Map();
21
+ // Count total items first
22
+ for (const namespace of commonNamespaces) {
23
+ try {
24
+ const items = await legacyStore.list(namespace);
25
+ namespaceData.set(namespace, items);
26
+ totalItems += items.length;
27
+ }
28
+ catch (error) {
29
+ // Namespace might not exist, skip
30
+ continue;
31
+ }
32
+ }
33
+ if (totalItems === 0) {
34
+ onProgress?.({ step: "No data to migrate", processed: 0, total: 0, percentage: 100 });
35
+ return;
36
+ }
37
+ let processed = 0;
38
+ await this.newStore.transaction(async (store) => {
39
+ for (const [namespace, items] of namespaceData) {
40
+ onProgress?.({
41
+ step: `Migrating namespace: ${namespace}`,
42
+ processed,
43
+ total: totalItems,
44
+ percentage: Math.floor((processed / totalItems) * 100),
45
+ });
46
+ for (const item of items) {
47
+ await store.kv.set(namespace, item.key, item.value);
48
+ // Create audit event for the migration
49
+ await store.events.stream("migration").append(createEvent("state.migrated", {
50
+ namespace,
51
+ key: item.key,
52
+ source: "legacy-state-store",
53
+ }, {
54
+ source: "migrator",
55
+ tags: ["migration", "state-store"],
56
+ }));
57
+ processed++;
58
+ if (processed % 100 === 0) {
59
+ onProgress?.({
60
+ step: `Migrating namespace: ${namespace}`,
61
+ processed,
62
+ total: totalItems,
63
+ percentage: Math.floor((processed / totalItems) * 100),
64
+ });
65
+ }
66
+ }
67
+ }
68
+ onProgress?.({
69
+ step: "Migration completed",
70
+ processed: totalItems,
71
+ total: totalItems,
72
+ percentage: 100,
73
+ });
74
+ });
75
+ if (!preserveOriginal) {
76
+ for (const namespace of namespaceData.keys()) {
77
+ await legacyStore.deleteAll(namespace);
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Migrate from legacy StatsStore to event-sourced analytics.
83
+ */
84
+ async migrateStatsStore(legacyStore, options = {}) {
85
+ const { onProgress, batchSize = 1000, preserveOriginal = true } = options;
86
+ // Migration is complex because we need to convert SQL data to events
87
+ // We'll query the runs and call_edges tables and convert them to events
88
+ let processed = 0;
89
+ onProgress?.({
90
+ step: "Counting historical data",
91
+ processed: 0,
92
+ total: 0,
93
+ percentage: 0,
94
+ });
95
+ // Use direct SQL to get all data efficiently
96
+ const runs = await this.newStore.query.sql("SELECT * FROM runs ORDER BY started_at ASC").catch(() => []); // Table might not exist
97
+ const callEdges = await this.newStore.query.sql("SELECT * FROM call_edges ORDER BY started_at ASC").catch(() => []);
98
+ const totalItems = runs.length + callEdges.length;
99
+ if (totalItems === 0) {
100
+ onProgress?.({ step: "No stats data to migrate", processed: 0, total: 0, percentage: 100 });
101
+ return;
102
+ }
103
+ await this.newStore.transaction(async (store) => {
104
+ const statsStream = store.events.stream("stats");
105
+ // Migrate run records to events
106
+ onProgress?.({
107
+ step: "Migrating run records",
108
+ processed,
109
+ total: totalItems,
110
+ percentage: Math.floor((processed / totalItems) * 100),
111
+ });
112
+ for (const run of runs) {
113
+ // Convert to run started event
114
+ await statsStream.append(createEvent(EventTypes.RUN_STARTED, {
115
+ instanceId: run.instance_id,
116
+ agentName: run.agent_name,
117
+ triggerType: run.trigger_type,
118
+ triggerSource: run.trigger_source,
119
+ }, {
120
+ source: "migrator",
121
+ correlationId: run.instance_id,
122
+ tags: ["migration", "stats"],
123
+ }));
124
+ // Convert to run completed/failed event
125
+ const eventType = run.result === "error" ? EventTypes.RUN_FAILED : EventTypes.RUN_COMPLETED;
126
+ await statsStream.append(createEvent(eventType, {
127
+ instanceId: run.instance_id,
128
+ agentName: run.agent_name,
129
+ result: run.result,
130
+ exitCode: run.exit_code,
131
+ durationMs: run.duration_ms,
132
+ inputTokens: run.input_tokens,
133
+ outputTokens: run.output_tokens,
134
+ cacheReadTokens: run.cache_read_tokens,
135
+ cacheWriteTokens: run.cache_write_tokens,
136
+ totalTokens: run.total_tokens,
137
+ costUsd: run.cost_usd,
138
+ turnCount: run.turn_count,
139
+ errorMessage: run.error_message,
140
+ preHookMs: run.pre_hook_ms,
141
+ postHookMs: run.post_hook_ms,
142
+ }, {
143
+ source: "migrator",
144
+ correlationId: run.instance_id,
145
+ tags: ["migration", "stats"],
146
+ }));
147
+ processed++;
148
+ if (processed % 100 === 0) {
149
+ onProgress?.({
150
+ step: "Migrating run records",
151
+ processed,
152
+ total: totalItems,
153
+ percentage: Math.floor((processed / totalItems) * 100),
154
+ });
155
+ }
156
+ }
157
+ // Migrate call edge records to events
158
+ onProgress?.({
159
+ step: "Migrating call records",
160
+ processed,
161
+ total: totalItems,
162
+ percentage: Math.floor((processed / totalItems) * 100),
163
+ });
164
+ for (const call of callEdges) {
165
+ // Convert to call initiated event
166
+ await statsStream.append(createEvent(EventTypes.CALL_INITIATED, {
167
+ callerAgent: call.caller_agent,
168
+ callerInstance: call.caller_instance,
169
+ targetAgent: call.target_agent,
170
+ targetInstance: call.target_instance,
171
+ depth: call.depth,
172
+ }, {
173
+ source: "migrator",
174
+ correlationId: call.caller_instance,
175
+ tags: ["migration", "stats"],
176
+ }));
177
+ // Convert to call completed/failed event if finished
178
+ if (call.duration_ms !== null) {
179
+ const eventType = call.status === "error" ? EventTypes.CALL_FAILED : EventTypes.CALL_COMPLETED;
180
+ await statsStream.append(createEvent(eventType, {
181
+ callerAgent: call.caller_agent,
182
+ callerInstance: call.caller_instance,
183
+ targetAgent: call.target_agent,
184
+ targetInstance: call.target_instance,
185
+ depth: call.depth,
186
+ durationMs: call.duration_ms,
187
+ status: call.status,
188
+ }, {
189
+ source: "migrator",
190
+ correlationId: call.caller_instance,
191
+ tags: ["migration", "stats"],
192
+ }));
193
+ }
194
+ processed++;
195
+ if (processed % 100 === 0) {
196
+ onProgress?.({
197
+ step: "Migrating call records",
198
+ processed,
199
+ total: totalItems,
200
+ percentage: Math.floor((processed / totalItems) * 100),
201
+ });
202
+ }
203
+ }
204
+ // Create a migration completed event
205
+ await store.events.stream("migration").append(createEvent("stats.migrated", {
206
+ runsCount: runs.length,
207
+ callEdgesCount: callEdges.length,
208
+ source: "legacy-stats-store",
209
+ }, {
210
+ source: "migrator",
211
+ tags: ["migration", "stats-store"],
212
+ }));
213
+ onProgress?.({
214
+ step: "Migration completed",
215
+ processed: totalItems,
216
+ total: totalItems,
217
+ percentage: 100,
218
+ });
219
+ });
220
+ }
221
+ /**
222
+ * Perform complete migration from all legacy stores.
223
+ */
224
+ async migrateAll(legacyStateStore, legacyStatsStore, options = {}) {
225
+ const { onProgress } = options;
226
+ onProgress?.({
227
+ step: "Starting complete migration",
228
+ processed: 0,
229
+ total: 100,
230
+ percentage: 0,
231
+ });
232
+ try {
233
+ if (legacyStateStore) {
234
+ onProgress?.({
235
+ step: "Migrating state store",
236
+ processed: 25,
237
+ total: 100,
238
+ percentage: 25,
239
+ });
240
+ await this.migrateStateStore(legacyStateStore, {
241
+ ...options,
242
+ onProgress: undefined, // Don't double-report
243
+ });
244
+ }
245
+ if (legacyStatsStore) {
246
+ onProgress?.({
247
+ step: "Migrating stats store",
248
+ processed: 50,
249
+ total: 100,
250
+ percentage: 50,
251
+ });
252
+ await this.migrateStatsStore(legacyStatsStore, {
253
+ ...options,
254
+ onProgress: undefined, // Don't double-report
255
+ });
256
+ }
257
+ // Create final migration marker
258
+ await this.newStore.events.stream("migration").append(createEvent("migration.completed", {
259
+ timestamp: Date.now(),
260
+ version: "1.0.0",
261
+ }, {
262
+ source: "migrator",
263
+ tags: ["migration", "completion"],
264
+ }));
265
+ onProgress?.({
266
+ step: "All migrations completed",
267
+ processed: 100,
268
+ total: 100,
269
+ percentage: 100,
270
+ });
271
+ }
272
+ catch (error) {
273
+ // Create error event
274
+ await this.newStore.events.stream("migration").append(createEvent("migration.failed", {
275
+ error: error instanceof Error ? error.message : String(error),
276
+ timestamp: Date.now(),
277
+ }, {
278
+ source: "migrator",
279
+ tags: ["migration", "error"],
280
+ }));
281
+ throw error;
282
+ }
283
+ }
284
+ }
285
+ /**
286
+ * Helper function to run migration with console progress reporting.
287
+ */
288
+ export async function migrateFromLegacy(newStore, legacyStateStore, legacyStatsStore, options = {}) {
289
+ const migrator = new LegacyMigrator(newStore);
290
+ await migrator.migrateAll(legacyStateStore, legacyStatsStore, {
291
+ ...options,
292
+ onProgress: (progress) => {
293
+ console.log(`Migration: ${progress.step} (${progress.percentage}%)`);
294
+ },
295
+ });
296
+ }
297
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/shared/persistence/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Enhanced validation functions for Action Llama configurations.
3
+ * Provides schema validation, unknown field detection, cron validation,
4
+ * model/provider compatibility checks, and unsafe config warnings.
5
+ */
6
+ import type { AgentConfig, GlobalConfig } from "./config.js";
7
+ export interface ValidationError {
8
+ type: "error" | "warning";
9
+ message: string;
10
+ field?: string;
11
+ context?: string;
12
+ }
13
+ export interface ValidationResult {
14
+ valid: boolean;
15
+ errors: ValidationError[];
16
+ warnings: ValidationError[];
17
+ }
18
+ export interface ConfigSchema {
19
+ required: Set<string>;
20
+ optional: Set<string>;
21
+ nested: Record<string, ConfigSchema>;
22
+ }
23
+ /**
24
+ * Validate a cron expression using the croner library.
25
+ */
26
+ export declare function validateCronExpression(schedule: string): {
27
+ valid: boolean;
28
+ error?: string;
29
+ };
30
+ /**
31
+ * Validate model/provider/authType compatibility.
32
+ */
33
+ export declare function validateModelProviderCompat(provider: string, model: string, authType: string): {
34
+ valid: boolean;
35
+ error?: string;
36
+ };
37
+ /**
38
+ * Validate config against a schema and return validation errors.
39
+ */
40
+ export declare function validateConfigSchema(config: unknown, schema: ConfigSchema, path?: string): ValidationResult;
41
+ /**
42
+ * Detect unknown fields in config that are not in the schema.
43
+ */
44
+ export declare function detectUnknownFields(config: unknown, schema: ConfigSchema, path?: string): string[];
45
+ /**
46
+ * Validate global config with comprehensive checks.
47
+ */
48
+ export declare function validateGlobalConfig(config: GlobalConfig, raw?: unknown): ValidationResult;
49
+ /**
50
+ * Validate agent config with comprehensive checks.
51
+ */
52
+ export declare function validateAgentConfig(config: AgentConfig, raw?: unknown): ValidationResult;
53
+ /**
54
+ * Check for unknown fields in global config.
55
+ */
56
+ export declare function detectGlobalConfigUnknownFields(raw: unknown): string[];
57
+ /**
58
+ * Check for unknown fields in agent config.
59
+ */
60
+ export declare function detectAgentConfigUnknownFields(raw: unknown): string[];
61
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/shared/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAG1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACtC;AA4DD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAY3F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,EACpB,IAAI,SAAK,GACR,gBAAgB,CA2ClB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,EACpB,IAAI,SAAK,GACR,MAAM,EAAE,CAwBV;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAyC1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAsDxF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAErE"}