@forestadmin/workflow-executor 1.0.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 (123) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +141 -0
  3. package/dist/adapters/activity-log-drainer.d.ts +6 -0
  4. package/dist/adapters/activity-log-drainer.js +21 -0
  5. package/dist/adapters/agent-client-agent-port.d.ts +27 -0
  6. package/dist/adapters/agent-client-agent-port.js +211 -0
  7. package/dist/adapters/ai-client-adapter.d.ts +11 -0
  8. package/dist/adapters/ai-client-adapter.js +38 -0
  9. package/dist/adapters/always-error-ai-model-port.d.ts +8 -0
  10. package/dist/adapters/always-error-ai-model-port.js +23 -0
  11. package/dist/adapters/console-logger.d.ts +7 -0
  12. package/dist/adapters/console-logger.js +15 -0
  13. package/dist/adapters/forest-server-workflow-port.d.ts +25 -0
  14. package/dist/adapters/forest-server-workflow-port.js +163 -0
  15. package/dist/adapters/forestadmin-client-activity-log-port-factory.d.ts +12 -0
  16. package/dist/adapters/forestadmin-client-activity-log-port-factory.js +22 -0
  17. package/dist/adapters/forestadmin-client-activity-log-port.d.ts +15 -0
  18. package/dist/adapters/forestadmin-client-activity-log-port.js +78 -0
  19. package/dist/adapters/pretty-logger.d.ts +9 -0
  20. package/dist/adapters/pretty-logger.js +37 -0
  21. package/dist/adapters/record-id-serializer.d.ts +4 -0
  22. package/dist/adapters/record-id-serializer.js +20 -0
  23. package/dist/adapters/run-to-available-step-mapper.d.ts +4 -0
  24. package/dist/adapters/run-to-available-step-mapper.js +137 -0
  25. package/dist/adapters/server-ai-adapter.d.ts +16 -0
  26. package/dist/adapters/server-ai-adapter.js +60 -0
  27. package/dist/adapters/server-types.d.ts +181 -0
  28. package/dist/adapters/server-types.js +35 -0
  29. package/dist/adapters/step-definition-mapper.d.ts +4 -0
  30. package/dist/adapters/step-definition-mapper.js +68 -0
  31. package/dist/adapters/step-outcome-to-update-step-mapper.d.ts +4 -0
  32. package/dist/adapters/step-outcome-to-update-step-mapper.js +34 -0
  33. package/dist/adapters/with-retry.d.ts +6 -0
  34. package/dist/adapters/with-retry.js +40 -0
  35. package/dist/build-workflow-executor.d.ts +35 -0
  36. package/dist/build-workflow-executor.js +175 -0
  37. package/dist/cli-core.d.ts +26 -0
  38. package/dist/cli-core.js +228 -0
  39. package/dist/cli.d.ts +3 -0
  40. package/dist/cli.js +17 -0
  41. package/dist/defaults.d.ts +9 -0
  42. package/dist/defaults.js +12 -0
  43. package/dist/errors.d.ts +153 -0
  44. package/dist/errors.js +327 -0
  45. package/dist/executors/activity-log.d.ts +14 -0
  46. package/dist/executors/activity-log.js +33 -0
  47. package/dist/executors/agent-with-log.d.ts +33 -0
  48. package/dist/executors/agent-with-log.js +76 -0
  49. package/dist/executors/base-step-executor.d.ts +40 -0
  50. package/dist/executors/base-step-executor.js +267 -0
  51. package/dist/executors/condition-step-executor.d.ts +15 -0
  52. package/dist/executors/condition-step-executor.js +108 -0
  53. package/dist/executors/guidance-step-executor.d.ts +12 -0
  54. package/dist/executors/guidance-step-executor.js +39 -0
  55. package/dist/executors/load-related-record-step-executor.d.ts +38 -0
  56. package/dist/executors/load-related-record-step-executor.js +478 -0
  57. package/dist/executors/mcp-step-executor.d.ts +22 -0
  58. package/dist/executors/mcp-step-executor.js +188 -0
  59. package/dist/executors/read-record-step-executor.d.ts +10 -0
  60. package/dist/executors/read-record-step-executor.js +100 -0
  61. package/dist/executors/record-step-executor.d.ts +19 -0
  62. package/dist/executors/record-step-executor.js +108 -0
  63. package/dist/executors/step-executor-factory.d.ts +24 -0
  64. package/dist/executors/step-executor-factory.js +99 -0
  65. package/dist/executors/summary/step-execution-formatters.d.ts +8 -0
  66. package/dist/executors/summary/step-execution-formatters.js +49 -0
  67. package/dist/executors/summary/step-summary-builder.d.ts +7 -0
  68. package/dist/executors/summary/step-summary-builder.js +52 -0
  69. package/dist/executors/trigger-record-action-step-executor.d.ts +17 -0
  70. package/dist/executors/trigger-record-action-step-executor.js +169 -0
  71. package/dist/executors/update-record-step-executor.d.ts +13 -0
  72. package/dist/executors/update-record-step-executor.js +245 -0
  73. package/dist/http/executor-http-server.d.ts +25 -0
  74. package/dist/http/executor-http-server.js +170 -0
  75. package/dist/http/pending-data-validators.d.ts +25 -0
  76. package/dist/http/pending-data-validators.js +79 -0
  77. package/dist/http/step-serializer.d.ts +3 -0
  78. package/dist/http/step-serializer.js +47 -0
  79. package/dist/in-flight-run-registry.d.ts +9 -0
  80. package/dist/in-flight-run-registry.js +30 -0
  81. package/dist/index.d.ts +38 -0
  82. package/dist/index.js +88 -0
  83. package/dist/ports/activity-log-port.d.ts +24 -0
  84. package/dist/ports/activity-log-port.js +3 -0
  85. package/dist/ports/agent-port.d.ts +54 -0
  86. package/dist/ports/agent-port.js +3 -0
  87. package/dist/ports/ai-model-port.d.ts +7 -0
  88. package/dist/ports/ai-model-port.js +3 -0
  89. package/dist/ports/logger-port.d.ts +6 -0
  90. package/dist/ports/logger-port.js +3 -0
  91. package/dist/ports/run-store.d.ts +9 -0
  92. package/dist/ports/run-store.js +3 -0
  93. package/dist/ports/workflow-port.d.ts +30 -0
  94. package/dist/ports/workflow-port.js +3 -0
  95. package/dist/remote-tool-fetcher.d.ts +19 -0
  96. package/dist/remote-tool-fetcher.js +56 -0
  97. package/dist/runner.d.ts +50 -0
  98. package/dist/runner.js +317 -0
  99. package/dist/schema-cache.d.ts +11 -0
  100. package/dist/schema-cache.js +37 -0
  101. package/dist/schema-resolver.d.ts +11 -0
  102. package/dist/schema-resolver.js +24 -0
  103. package/dist/stores/build-run-store.d.ts +5 -0
  104. package/dist/stores/build-run-store.js +28 -0
  105. package/dist/stores/database-store.d.ts +17 -0
  106. package/dist/stores/database-store.js +119 -0
  107. package/dist/stores/in-memory-store.d.ts +11 -0
  108. package/dist/stores/in-memory-store.js +48 -0
  109. package/dist/types/execution-context.d.ts +37 -0
  110. package/dist/types/execution-context.js +3 -0
  111. package/dist/types/step-execution-data.d.ts +137 -0
  112. package/dist/types/step-execution-data.js +3 -0
  113. package/dist/types/validated/collection.d.ts +126 -0
  114. package/dist/types/validated/collection.js +96 -0
  115. package/dist/types/validated/execution.d.ts +362 -0
  116. package/dist/types/validated/execution.js +43 -0
  117. package/dist/types/validated/step-definition.d.ts +243 -0
  118. package/dist/types/validated/step-definition.js +128 -0
  119. package/dist/types/validated/step-outcome.d.ts +108 -0
  120. package/dist/types/validated/step-outcome.js +66 -0
  121. package/dist/validate-secrets.d.ts +5 -0
  122. package/dist/validate-secrets.js +14 -0
  123. package/package.json +50 -0
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildDatabaseRunStore = buildDatabaseRunStore;
7
+ exports.buildInMemoryRunStore = buildInMemoryRunStore;
8
+ const sequelize_1 = require("sequelize");
9
+ const database_store_1 = __importDefault(require("./database-store"));
10
+ const in_memory_store_1 = __importDefault(require("./in-memory-store"));
11
+ async function buildDatabaseRunStore(options) {
12
+ const sequelize = new sequelize_1.Sequelize({ logging: false, ...options });
13
+ const store = new database_store_1.default({ sequelize });
14
+ try {
15
+ await store.init();
16
+ }
17
+ catch (error) {
18
+ await sequelize.close();
19
+ throw error;
20
+ }
21
+ return store;
22
+ }
23
+ async function buildInMemoryRunStore() {
24
+ const store = new in_memory_store_1.default();
25
+ await store.init();
26
+ return store;
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtcnVuLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9idWlsZC1ydW4tc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFRQSxzREFhQztBQUVELHNEQUtDO0FBekJELHlDQUFzQztBQUV0QyxzRUFBNkM7QUFDN0Msd0VBQThDO0FBRXZDLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxPQUFnQjtJQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVoRSxNQUFNLEtBQUssR0FBRyxJQUFJLHdCQUFhLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRU0sS0FBSyxVQUFVLHFCQUFxQjtJQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLHlCQUFhLEVBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
@@ -0,0 +1,17 @@
1
+ import type { Logger } from '../ports/logger-port';
2
+ import type { RunStore } from '../ports/run-store';
3
+ import type { StepExecutionData } from '../types/step-execution-data';
4
+ import type { Sequelize } from 'sequelize';
5
+ export interface DatabaseStoreOptions {
6
+ sequelize: Sequelize;
7
+ }
8
+ export default class DatabaseStore implements RunStore {
9
+ private readonly sequelize;
10
+ constructor(options: DatabaseStoreOptions);
11
+ init(logger?: Logger): Promise<void>;
12
+ getStepExecutions(runId: string): Promise<StepExecutionData[]>;
13
+ saveStepExecution(runId: string, stepExecution: StepExecutionData): Promise<void>;
14
+ close(logger?: Logger): Promise<void>;
15
+ private callPort;
16
+ }
17
+ //# sourceMappingURL=database-store.d.ts.map
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sequelize_1 = require("sequelize");
4
+ const umzug_1 = require("umzug");
5
+ const errors_1 = require("../errors");
6
+ const TABLE_NAME = 'workflow_step_executions';
7
+ class DatabaseStore {
8
+ constructor(options) {
9
+ this.sequelize = options.sequelize;
10
+ }
11
+ async init(logger) {
12
+ const umzug = new umzug_1.Umzug({
13
+ migrations: [
14
+ {
15
+ name: '001_create_workflow_step_executions',
16
+ up: async ({ context }) => {
17
+ await context.createTable(TABLE_NAME, {
18
+ id: {
19
+ type: sequelize_1.DataTypes.INTEGER,
20
+ primaryKey: true,
21
+ autoIncrement: true,
22
+ },
23
+ runId: {
24
+ type: sequelize_1.DataTypes.STRING(255),
25
+ allowNull: false,
26
+ field: 'run_id',
27
+ },
28
+ stepIndex: {
29
+ type: sequelize_1.DataTypes.INTEGER,
30
+ allowNull: false,
31
+ field: 'step_index',
32
+ },
33
+ data: {
34
+ type: sequelize_1.DataTypes.JSON,
35
+ allowNull: false,
36
+ },
37
+ createdAt: {
38
+ type: sequelize_1.DataTypes.DATE,
39
+ allowNull: false,
40
+ defaultValue: sequelize_1.DataTypes.NOW,
41
+ field: 'created_at',
42
+ },
43
+ updatedAt: {
44
+ type: sequelize_1.DataTypes.DATE,
45
+ allowNull: false,
46
+ defaultValue: sequelize_1.DataTypes.NOW,
47
+ field: 'updated_at',
48
+ },
49
+ });
50
+ await context.addIndex(TABLE_NAME, ['run_id'], { name: 'idx_run_id' });
51
+ await context.addIndex(TABLE_NAME, ['run_id', 'step_index'], {
52
+ unique: true,
53
+ name: 'idx_run_id_step_index',
54
+ });
55
+ },
56
+ down: async ({ context }) => {
57
+ await context.dropTable(TABLE_NAME);
58
+ },
59
+ },
60
+ ],
61
+ context: this.sequelize.getQueryInterface(),
62
+ storage: new umzug_1.SequelizeStorage({ sequelize: this.sequelize }),
63
+ logger: undefined,
64
+ });
65
+ return this.callPort('init', async () => {
66
+ try {
67
+ await umzug.up();
68
+ }
69
+ catch (error) {
70
+ logger?.error('Database migration failed', {
71
+ error: (0, errors_1.extractErrorMessage)(error),
72
+ });
73
+ throw error;
74
+ }
75
+ });
76
+ }
77
+ async getStepExecutions(runId) {
78
+ return this.callPort('getStepExecutions', async () => {
79
+ const [rows] = await this.sequelize.query(`SELECT data FROM ${TABLE_NAME} WHERE run_id = :runId ORDER BY step_index ASC`, { replacements: { runId } });
80
+ return rows.map(row => typeof row.data === 'string' ? JSON.parse(row.data) : row.data);
81
+ });
82
+ }
83
+ async saveStepExecution(runId, stepExecution) {
84
+ return this.callPort('saveStepExecution', async () => {
85
+ await this.sequelize.transaction(async (transaction) => {
86
+ const now = new Date();
87
+ const data = JSON.stringify(stepExecution);
88
+ const replacements = { runId, stepIndex: stepExecution.stepIndex, data, now };
89
+ // Delete + insert in transaction: dialect-agnostic upsert (avoids ON CONFLICT / ON DUPLICATE)
90
+ await this.sequelize.query(`DELETE FROM ${TABLE_NAME} WHERE run_id = :runId AND step_index = :stepIndex`, { replacements, transaction });
91
+ await this.sequelize.query(`INSERT INTO ${TABLE_NAME} (run_id, step_index, data, created_at, updated_at) VALUES (:runId, :stepIndex, :data, :now, :now)`, { replacements, transaction });
92
+ });
93
+ });
94
+ }
95
+ async close(logger) {
96
+ return this.callPort('close', async () => {
97
+ try {
98
+ await this.sequelize.close();
99
+ }
100
+ catch (error) {
101
+ logger?.error('Failed to close database connection', {
102
+ error: (0, errors_1.extractErrorMessage)(error),
103
+ });
104
+ }
105
+ });
106
+ }
107
+ async callPort(operation, fn) {
108
+ try {
109
+ return await fn();
110
+ }
111
+ catch (cause) {
112
+ if (cause instanceof errors_1.WorkflowExecutorError)
113
+ throw cause;
114
+ throw new errors_1.RunStorePortError(operation, cause);
115
+ }
116
+ }
117
+ }
118
+ exports.default = DatabaseStore;
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2Utc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmVzL2RhdGFiYXNlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0EseUNBQXNDO0FBQ3RDLGlDQUFnRDtBQUVoRCxzQ0FBMEY7QUFFMUYsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUM7QUFNOUMsTUFBcUIsYUFBYTtJQUdoQyxZQUFZLE9BQTZCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFlO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksYUFBSyxDQUFDO1lBQ3RCLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxJQUFJLEVBQUUscUNBQXFDO29CQUMzQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUErQixFQUFFLEVBQUU7d0JBQ3JELE1BQU0sT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7NEJBQ3BDLEVBQUUsRUFBRTtnQ0FDRixJQUFJLEVBQUUscUJBQVMsQ0FBQyxPQUFPO2dDQUN2QixVQUFVLEVBQUUsSUFBSTtnQ0FDaEIsYUFBYSxFQUFFLElBQUk7NkJBQ3BCOzRCQUNELEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUscUJBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dDQUMzQixTQUFTLEVBQUUsS0FBSztnQ0FDaEIsS0FBSyxFQUFFLFFBQVE7NkJBQ2hCOzRCQUNELFNBQVMsRUFBRTtnQ0FDVCxJQUFJLEVBQUUscUJBQVMsQ0FBQyxPQUFPO2dDQUN2QixTQUFTLEVBQUUsS0FBSztnQ0FDaEIsS0FBSyxFQUFFLFlBQVk7NkJBQ3BCOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUscUJBQVMsQ0FBQyxJQUFJO2dDQUNwQixTQUFTLEVBQUUsS0FBSzs2QkFDakI7NEJBQ0QsU0FBUyxF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
@@ -0,0 +1,11 @@
1
+ import type { RunStore } from '../ports/run-store';
2
+ import type { StepExecutionData } from '../types/step-execution-data';
3
+ export default class InMemoryStore implements RunStore {
4
+ private readonly data;
5
+ init(): Promise<void>;
6
+ close(): Promise<void>;
7
+ getStepExecutions(runId: string): Promise<StepExecutionData[]>;
8
+ saveStepExecution(runId: string, stepExecution: StepExecutionData): Promise<void>;
9
+ private callPort;
10
+ }
11
+ //# sourceMappingURL=in-memory-store.d.ts.map
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../errors");
4
+ class InMemoryStore {
5
+ constructor() {
6
+ this.data = new Map();
7
+ }
8
+ async init() {
9
+ return this.callPort('init', async () => {
10
+ // No-op: in-memory store requires no initialization
11
+ });
12
+ }
13
+ async close() {
14
+ return this.callPort('close', async () => {
15
+ // No-op: nothing to clean up
16
+ });
17
+ }
18
+ async getStepExecutions(runId) {
19
+ return this.callPort('getStepExecutions', async () => {
20
+ const runData = this.data.get(runId);
21
+ if (!runData)
22
+ return [];
23
+ return [...runData.values()].sort((a, b) => a.stepIndex - b.stepIndex);
24
+ });
25
+ }
26
+ async saveStepExecution(runId, stepExecution) {
27
+ return this.callPort('saveStepExecution', async () => {
28
+ let runData = this.data.get(runId);
29
+ if (!runData) {
30
+ runData = new Map();
31
+ this.data.set(runId, runData);
32
+ }
33
+ runData.set(stepExecution.stepIndex, stepExecution);
34
+ });
35
+ }
36
+ async callPort(operation, fn) {
37
+ try {
38
+ return await fn();
39
+ }
40
+ catch (cause) {
41
+ if (cause instanceof errors_1.WorkflowExecutorError)
42
+ throw cause;
43
+ throw new errors_1.RunStorePortError(operation, cause);
44
+ }
45
+ }
46
+ }
47
+ exports.default = InMemoryStore;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tbWVtb3J5LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9pbi1tZW1vcnktc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxzQ0FBcUU7QUFFckUsTUFBcUIsYUFBYTtJQUFsQztRQUNtQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7SUE2QzVFLENBQUM7SUEzQ0MsS0FBSyxDQUFDLElBQUk7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RDLG9EQUFvRDtRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkMsNkJBQTZCO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUV4QixPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLGFBQWdDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQUksU0FBaUIsRUFBRSxFQUFvQjtRQUMvRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSw4QkFBcUI7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFDeEQsTUFBTSxJQUFJLDBCQUFpQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBOUNELGdDQThDQyJ9
@@ -0,0 +1,37 @@
1
+ import type ActivityLog from '../executors/activity-log';
2
+ import type AgentWithLog from '../executors/agent-with-log';
3
+ import type { Logger } from '../ports/logger-port';
4
+ import type { RunStore } from '../ports/run-store';
5
+ import type SchemaResolver from '../schema-resolver';
6
+ import type { RecordRef } from './validated/collection';
7
+ import type { AvailableStepExecution, Step, StepUser } from './validated/execution';
8
+ import type { StepDefinition } from './validated/step-definition';
9
+ import type { StepOutcome } from './validated/step-outcome';
10
+ import type { BaseChatModel } from '@forestadmin/ai-proxy';
11
+ export type { AvailableStepExecution, Step, StepUser };
12
+ export interface StepExecutionResult {
13
+ stepOutcome: StepOutcome;
14
+ }
15
+ export interface IStepExecutor {
16
+ execute(): Promise<StepExecutionResult>;
17
+ }
18
+ export interface ExecutionContext<TStep extends StepDefinition = StepDefinition> {
19
+ readonly runId: string;
20
+ readonly stepId: string;
21
+ readonly stepIndex: number;
22
+ readonly collectionId: string;
23
+ readonly baseRecordRef: RecordRef;
24
+ readonly stepDefinition: TStep;
25
+ readonly model: BaseChatModel;
26
+ readonly agent: AgentWithLog;
27
+ readonly activityLog: ActivityLog;
28
+ readonly runStore: RunStore;
29
+ readonly user: StepUser;
30
+ readonly schemaResolver: SchemaResolver;
31
+ readonly previousSteps: ReadonlyArray<Readonly<Step>>;
32
+ readonly logger: Logger;
33
+ readonly incomingPendingData?: unknown;
34
+ readonly stepTimeoutMs?: number;
35
+ readonly aiInvokeTimeoutMs?: number;
36
+ }
37
+ //# sourceMappingURL=execution-context.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXhlY3V0aW9uLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,137 @@
1
+ import type { RecordId, RecordRef } from './validated/collection';
2
+ import type { LoadRelatedRecordConfirmation, McpConfirmation, TriggerActionConfirmation, UpdateRecordConfirmation } from '../http/pending-data-validators';
3
+ interface BaseStepExecutionData {
4
+ stepIndex: number;
5
+ }
6
+ interface MutatingStepExecutionData extends BaseStepExecutionData {
7
+ idempotencyPhase?: 'executing' | 'done';
8
+ }
9
+ export interface WithUserConfirmation<T extends Record<string, unknown> = Record<string, unknown>> {
10
+ userConfirmation?: T;
11
+ }
12
+ export interface ConditionStepExecutionData extends BaseStepExecutionData {
13
+ type: 'condition';
14
+ executionParams: {
15
+ answer: string | null;
16
+ reasoning?: string;
17
+ };
18
+ executionResult?: {
19
+ answer: string;
20
+ };
21
+ }
22
+ export interface FieldRef {
23
+ name: string;
24
+ displayName: string;
25
+ }
26
+ export type FieldWithValue = FieldRef & {
27
+ value: unknown;
28
+ };
29
+ export interface FieldReadSuccess extends FieldRef {
30
+ value: unknown;
31
+ }
32
+ export interface FieldReadError extends FieldRef {
33
+ error: string;
34
+ }
35
+ export type FieldReadResult = FieldReadSuccess | FieldReadError;
36
+ export interface ReadRecordStepExecutionData extends BaseStepExecutionData {
37
+ type: 'read-record';
38
+ executionParams: {
39
+ fields: FieldRef[];
40
+ };
41
+ executionResult: {
42
+ fields: FieldReadResult[];
43
+ };
44
+ selectedRecordRef: RecordRef;
45
+ }
46
+ export interface UpdateRecordStepExecutionData extends MutatingStepExecutionData, WithUserConfirmation<UpdateRecordConfirmation> {
47
+ type: 'update-record';
48
+ executionParams?: FieldWithValue;
49
+ executionResult?: {
50
+ updatedValues: Record<string, unknown>;
51
+ } | {
52
+ skipped: true;
53
+ };
54
+ pendingData?: FieldWithValue;
55
+ selectedRecordRef: RecordRef;
56
+ }
57
+ export interface ActionRef {
58
+ name: string;
59
+ displayName: string;
60
+ }
61
+ export interface RelationRef {
62
+ name: string;
63
+ displayName: string;
64
+ }
65
+ export interface TriggerRecordActionStepExecutionData extends MutatingStepExecutionData, WithUserConfirmation<TriggerActionConfirmation> {
66
+ type: 'trigger-action';
67
+ executionParams?: ActionRef;
68
+ executionResult?: {
69
+ success: true;
70
+ actionResult: unknown;
71
+ } | {
72
+ skipped: true;
73
+ };
74
+ pendingData?: ActionRef;
75
+ selectedRecordRef: RecordRef;
76
+ }
77
+ export interface McpToolRef {
78
+ name: string;
79
+ sourceId: string;
80
+ }
81
+ export interface McpToolCall extends McpToolRef {
82
+ input: Record<string, unknown>;
83
+ }
84
+ export interface McpStepExecutionData extends MutatingStepExecutionData, WithUserConfirmation<McpConfirmation> {
85
+ type: 'mcp';
86
+ executionParams?: McpToolCall;
87
+ executionResult?: {
88
+ success: true;
89
+ toolResult: unknown;
90
+ formattedResponse?: string;
91
+ } | {
92
+ skipped: true;
93
+ };
94
+ pendingData?: McpToolCall;
95
+ }
96
+ export interface RecordStepExecutionData extends BaseStepExecutionData {
97
+ type: 'record';
98
+ executionParams?: Record<string, unknown>;
99
+ executionResult?: Record<string, unknown>;
100
+ toolConfirmationInterruption?: Record<string, unknown>;
101
+ }
102
+ export interface LoadRelatedRecordCandidate {
103
+ recordId: RecordId;
104
+ referenceFieldValue: string | null;
105
+ }
106
+ export interface LoadRelatedRecordPendingData {
107
+ availableFields: RelationRef[];
108
+ suggestedField: RelationRef;
109
+ availableRecordIds: LoadRelatedRecordCandidate[];
110
+ suggestedRecord?: LoadRelatedRecordCandidate;
111
+ }
112
+ export interface LoadRelatedRecordStepExecutionData extends BaseStepExecutionData, WithUserConfirmation<LoadRelatedRecordConfirmation> {
113
+ type: 'load-related-record';
114
+ pendingData?: LoadRelatedRecordPendingData;
115
+ selectedRecordRef: RecordRef;
116
+ executionParams?: RelationRef;
117
+ executionResult?: {
118
+ relation: RelationRef;
119
+ record: RecordRef;
120
+ } | {
121
+ skipped: true;
122
+ };
123
+ }
124
+ export interface GuidanceStepExecutionData extends BaseStepExecutionData {
125
+ type: 'guidance';
126
+ pendingData?: {
127
+ userInput?: string;
128
+ };
129
+ executionResult?: {
130
+ userInput?: string;
131
+ };
132
+ }
133
+ export type ConfirmableStepExecutionData = UpdateRecordStepExecutionData | TriggerRecordActionStepExecutionData | McpStepExecutionData | LoadRelatedRecordStepExecutionData;
134
+ export type StepExecutionData = ConditionStepExecutionData | ReadRecordStepExecutionData | UpdateRecordStepExecutionData | TriggerRecordActionStepExecutionData | RecordStepExecutionData | LoadRelatedRecordStepExecutionData | McpStepExecutionData | GuidanceStepExecutionData;
135
+ export type ExecutedStepExecutionData = StepExecutionData;
136
+ export {};
137
+ //# sourceMappingURL=step-execution-data.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRpb24tZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9zdGVwLWV4ZWN1dGlvbi1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,126 @@
1
+ import { z } from 'zod';
2
+ export declare const PRIMITIVE_TYPES: readonly ["Boolean", "Binary", "Date", "Dateonly", "Enum", "File", "Json", "Number", "Point", "String", "Time", "Timeonly", "Uuid"];
3
+ export type PrimitiveType = (typeof PRIMITIVE_TYPES)[number];
4
+ export declare const FieldSchemaSchema: z.ZodObject<{
5
+ fieldName: z.ZodString;
6
+ displayName: z.ZodString;
7
+ isRelationship: z.ZodBoolean;
8
+ relationType: z.ZodOptional<z.ZodEnum<{
9
+ BelongsTo: "BelongsTo";
10
+ HasMany: "HasMany";
11
+ HasOne: "HasOne";
12
+ BelongsToMany: "BelongsToMany";
13
+ }>>;
14
+ relatedCollectionName: z.ZodOptional<z.ZodString>;
15
+ type: z.ZodOptional<z.ZodNullable<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>>;
16
+ enumValues: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ }, z.core.$strip>;
18
+ export type FieldSchema = z.infer<typeof FieldSchemaSchema>;
19
+ export declare const ActionSchemaSchema: z.ZodObject<{
20
+ name: z.ZodString;
21
+ displayName: z.ZodString;
22
+ endpoint: z.ZodString;
23
+ fields: z.ZodOptional<z.ZodArray<z.ZodObject<{}, z.core.$loose>>>;
24
+ hooks: z.ZodOptional<z.ZodObject<{
25
+ load: z.ZodBoolean;
26
+ change: z.ZodArray<z.ZodUnknown>;
27
+ }, z.core.$strip>>;
28
+ }, z.core.$strip>;
29
+ export type ActionSchema = z.infer<typeof ActionSchemaSchema>;
30
+ export declare const CollectionSchemaSchema: z.ZodPipe<z.ZodObject<{
31
+ collectionName: z.ZodString;
32
+ collectionId: z.ZodString;
33
+ collectionDisplayName: z.ZodNullable<z.ZodString>;
34
+ primaryKeyFields: z.ZodArray<z.ZodString>;
35
+ referenceField: z.ZodOptional<z.ZodNullable<z.ZodString>>;
36
+ fields: z.ZodArray<z.ZodObject<{
37
+ fieldName: z.ZodString;
38
+ displayName: z.ZodString;
39
+ isRelationship: z.ZodBoolean;
40
+ relationType: z.ZodOptional<z.ZodEnum<{
41
+ BelongsTo: "BelongsTo";
42
+ HasMany: "HasMany";
43
+ HasOne: "HasOne";
44
+ BelongsToMany: "BelongsToMany";
45
+ }>>;
46
+ relatedCollectionName: z.ZodOptional<z.ZodString>;
47
+ type: z.ZodOptional<z.ZodNullable<z.ZodType<any, unknown, z.core.$ZodTypeInternals<any, unknown>>>>;
48
+ enumValues: z.ZodOptional<z.ZodArray<z.ZodString>>;
49
+ }, z.core.$strip>>;
50
+ actions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
51
+ name: z.ZodString;
52
+ displayName: z.ZodString;
53
+ endpoint: z.ZodString;
54
+ fields: z.ZodOptional<z.ZodArray<z.ZodObject<{}, z.core.$loose>>>;
55
+ hooks: z.ZodOptional<z.ZodObject<{
56
+ load: z.ZodBoolean;
57
+ change: z.ZodArray<z.ZodUnknown>;
58
+ }, z.core.$strip>>;
59
+ }, z.core.$strip>>>>;
60
+ }, z.core.$strip>, z.ZodTransform<{
61
+ collectionDisplayName: string;
62
+ collectionName: string;
63
+ collectionId: string;
64
+ primaryKeyFields: string[];
65
+ fields: {
66
+ fieldName: string;
67
+ displayName: string;
68
+ isRelationship: boolean;
69
+ relationType?: "BelongsTo" | "HasMany" | "HasOne" | "BelongsToMany";
70
+ relatedCollectionName?: string;
71
+ type?: any;
72
+ enumValues?: string[];
73
+ }[];
74
+ actions: {
75
+ name: string;
76
+ displayName: string;
77
+ endpoint: string;
78
+ fields?: {
79
+ [x: string]: unknown;
80
+ }[];
81
+ hooks?: {
82
+ load: boolean;
83
+ change: unknown[];
84
+ };
85
+ }[];
86
+ referenceField?: string;
87
+ }, {
88
+ collectionName: string;
89
+ collectionId: string;
90
+ primaryKeyFields: string[];
91
+ fields: {
92
+ fieldName: string;
93
+ displayName: string;
94
+ isRelationship: boolean;
95
+ relationType?: "BelongsTo" | "HasMany" | "HasOne" | "BelongsToMany";
96
+ relatedCollectionName?: string;
97
+ type?: any;
98
+ enumValues?: string[];
99
+ }[];
100
+ actions: {
101
+ name: string;
102
+ displayName: string;
103
+ endpoint: string;
104
+ fields?: {
105
+ [x: string]: unknown;
106
+ }[];
107
+ hooks?: {
108
+ load: boolean;
109
+ change: unknown[];
110
+ };
111
+ }[];
112
+ collectionDisplayName?: string;
113
+ referenceField?: string;
114
+ }>>;
115
+ export type CollectionSchema = z.infer<typeof CollectionSchemaSchema>;
116
+ export declare const RecordRefSchema: z.ZodObject<{
117
+ collectionName: z.ZodString;
118
+ recordId: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
119
+ stepIndex: z.ZodNumber;
120
+ }, z.core.$strict>;
121
+ export type RecordRef = z.infer<typeof RecordRefSchema>;
122
+ export type RecordId = RecordRef['recordId'];
123
+ export type RecordData = Omit<RecordRef, 'stepIndex'> & {
124
+ values: Record<string, unknown>;
125
+ };
126
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordRefSchema = exports.CollectionSchemaSchema = exports.ActionSchemaSchema = exports.FieldSchemaSchema = exports.PRIMITIVE_TYPES = void 0;
4
+ const zod_1 = require("zod");
5
+ // -- Schema types (structure of a collection — source: WorkflowPort) --
6
+ //
7
+ // These schemas (Field/Action/Collection) come from the orchestrator, which deploys independently
8
+ // and evolves this contract over time. They intentionally omit `.strict()` so unknown keys are
9
+ // stripped, not rejected, and require only structural fields — step-specific props are optional and
10
+ // asserted at use-time by the consuming executor. Don't re-add `.strict()` here.
11
+ // Mirrors PrimitiveTypes from @forestadmin/datasource-toolkit — kept local to avoid
12
+ // adding a hard dependency on datasource-toolkit from the executor package.
13
+ exports.PRIMITIVE_TYPES = [
14
+ 'Boolean',
15
+ 'Binary',
16
+ 'Date',
17
+ 'Dateonly',
18
+ 'Enum',
19
+ 'File',
20
+ 'Json',
21
+ 'Number',
22
+ 'Point',
23
+ 'String',
24
+ 'Time',
25
+ 'Timeonly',
26
+ 'Uuid',
27
+ ];
28
+ // Mirrors ColumnType = PrimitiveTypes | [ColumnType] | { [key: string]: ColumnType }.
29
+ // The orchestrator additionally serializes composite types as { fields: [{ field, type }] }
30
+ // (array-of-entries wire form) — accepted here and normalized to the native record shape.
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ const ColumnTypeSchema = zod_1.z.lazy(() => zod_1.z.union([
33
+ zod_1.z.enum(exports.PRIMITIVE_TYPES),
34
+ zod_1.z.tuple([ColumnTypeSchema]),
35
+ zod_1.z.record(zod_1.z.string(), ColumnTypeSchema),
36
+ zod_1.z
37
+ .object({
38
+ fields: zod_1.z.array(zod_1.z.object({ field: zod_1.z.string(), type: ColumnTypeSchema })),
39
+ })
40
+ .transform(obj => Object.fromEntries(obj.fields.map(f => [f.field, f.type]))),
41
+ ]));
42
+ exports.FieldSchemaSchema = zod_1.z.object({
43
+ fieldName: zod_1.z.string().min(1),
44
+ displayName: zod_1.z.string().min(1),
45
+ isRelationship: zod_1.z.boolean(),
46
+ relationType: zod_1.z.enum(['BelongsTo', 'HasMany', 'HasOne', 'BelongsToMany']).optional(),
47
+ relatedCollectionName: zod_1.z.string().optional(),
48
+ type: ColumnTypeSchema.nullable().optional(),
49
+ enumValues: zod_1.z.array(zod_1.z.string()).min(1).optional(),
50
+ });
51
+ // ActionSchema.fields / hooks content is a discriminated union owned by the upstream
52
+ // `@forestadmin/forestadmin-client` lib and consumed downstream by `@forestadmin/agent-client`.
53
+ // We validate the envelope shape only — detail re-validation would duplicate the lib's job.
54
+ const ActionFieldsSchema = zod_1.z.array(zod_1.z.looseObject({})).optional();
55
+ const ActionHooksSchema = zod_1.z
56
+ .object({
57
+ load: zod_1.z.boolean(),
58
+ change: zod_1.z.array(zod_1.z.unknown()),
59
+ })
60
+ .optional();
61
+ exports.ActionSchemaSchema = zod_1.z.object({
62
+ name: zod_1.z.string().min(1),
63
+ displayName: zod_1.z.string().min(1),
64
+ endpoint: zod_1.z.string().min(1),
65
+ /** Static form fields. Used as fallback when the agent's /hooks/load route 404s (old Ruby agents). */
66
+ fields: ActionFieldsSchema,
67
+ /** Action lifecycle hooks. Drives agent-client's dynamic form loading. */
68
+ hooks: ActionHooksSchema,
69
+ });
70
+ exports.CollectionSchemaSchema = zod_1.z
71
+ .object({
72
+ collectionName: zod_1.z.string().min(1),
73
+ collectionId: zod_1.z.string().min(1),
74
+ // null when the rendering has no explicit displayName configured — normalized to collectionName.
75
+ collectionDisplayName: zod_1.z.string().nullable(),
76
+ primaryKeyFields: zod_1.z.array(zod_1.z.string().min(1)).min(1),
77
+ // Layout-level "reference field" used to display a record (e.g. "name", "title").
78
+ // Null when the team didn't configure one; callers fall back to the primary key.
79
+ referenceField: zod_1.z.string().nullable().optional(),
80
+ fields: zod_1.z.array(exports.FieldSchemaSchema),
81
+ actions: zod_1.z.array(exports.ActionSchemaSchema).optional().default([]),
82
+ })
83
+ .transform(data => ({
84
+ ...data,
85
+ collectionDisplayName: data.collectionDisplayName || data.collectionName,
86
+ }));
87
+ // -- Record types (data — source: AgentPort/RunStore) --
88
+ exports.RecordRefSchema = zod_1.z
89
+ .object({
90
+ collectionName: zod_1.z.string().min(1),
91
+ recordId: zod_1.z.array(zod_1.z.union([zod_1.z.string().min(1), zod_1.z.number()])).min(1),
92
+ // Index of the workflow step that loaded this record.
93
+ stepIndex: zod_1.z.number().int().nonnegative(),
94
+ })
95
+ .strict();
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy92YWxpZGF0ZWQvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBd0I7QUFFeEIsd0VBQXdFO0FBQ3hFLEVBQUU7QUFDRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLG9HQUFvRztBQUNwRyxpRkFBaUY7QUFFakYsb0ZBQW9GO0FBQ3BGLDRFQUE0RTtBQUMvRCxRQUFBLGVBQWUsR0FBRztJQUM3QixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFVBQVU7SUFDVixNQUFNO0NBQ0UsQ0FBQztBQUdYLHNGQUFzRjtBQUN0Riw0RkFBNEY7QUFDNUYsMEZBQTBGO0FBQzFGLDhEQUE4RDtBQUM5RCxNQUFNLGdCQUFnQixHQUFtQixPQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNuRCxPQUFDLENBQUMsS0FBSyxDQUFDO0lBQ04sT0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBZSxDQUFDO0lBQ3ZCLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzNCLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGdCQUFnQixDQUFDO0lBQ3RDLE9BQUM7U0FDRSxNQUFNLENBQUM7UUFDTixNQUFNLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0tBQ3pFLENBQUM7U0FDRCxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FB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