funolio-agent 0.17.9 → 1.0.4

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 (155) hide show
  1. package/dist/approval.d.ts +7 -6
  2. package/dist/approval.d.ts.map +1 -1
  3. package/dist/approval.js +40 -10
  4. package/dist/approval.js.map +1 -1
  5. package/dist/auth/auto-detect.d.ts.map +1 -1
  6. package/dist/auth/auto-detect.js +11 -1
  7. package/dist/auth/auto-detect.js.map +1 -1
  8. package/dist/backfill.js +2 -2
  9. package/dist/backfill.js.map +1 -1
  10. package/dist/bot-manager.d.ts +2 -1
  11. package/dist/bot-manager.d.ts.map +1 -1
  12. package/dist/bot-manager.js +9 -2
  13. package/dist/bot-manager.js.map +1 -1
  14. package/dist/clerk-model.d.ts +0 -1
  15. package/dist/clerk-model.d.ts.map +1 -1
  16. package/dist/clerk-model.js +24 -50
  17. package/dist/clerk-model.js.map +1 -1
  18. package/dist/commands/configure-provider.js +2 -2
  19. package/dist/commands/configure-provider.js.map +1 -1
  20. package/dist/commands/configure.d.ts.map +1 -1
  21. package/dist/commands/configure.js +10 -14
  22. package/dist/commands/configure.js.map +1 -1
  23. package/dist/commands/start.d.ts.map +1 -1
  24. package/dist/commands/start.js +23 -4
  25. package/dist/commands/start.js.map +1 -1
  26. package/dist/config.d.ts +1 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +2 -2
  29. package/dist/config.js.map +1 -1
  30. package/dist/context-window.d.ts +2 -8
  31. package/dist/context-window.d.ts.map +1 -1
  32. package/dist/context-window.js +4 -4
  33. package/dist/context-window.js.map +1 -1
  34. package/dist/eval/orchestrator-front-door-replay.js +43 -2
  35. package/dist/eval/orchestrator-front-door-replay.js.map +1 -1
  36. package/dist/eval/orchestrator-todo-dispatch-replay.d.ts +2 -0
  37. package/dist/eval/orchestrator-todo-dispatch-replay.d.ts.map +1 -0
  38. package/dist/eval/orchestrator-todo-dispatch-replay.js +253 -0
  39. package/dist/eval/orchestrator-todo-dispatch-replay.js.map +1 -0
  40. package/dist/eval/orchestrator-todo-planning-replay.d.ts +2 -0
  41. package/dist/eval/orchestrator-todo-planning-replay.d.ts.map +1 -0
  42. package/dist/eval/orchestrator-todo-planning-replay.js +247 -0
  43. package/dist/eval/orchestrator-todo-planning-replay.js.map +1 -0
  44. package/dist/eval/policy-detection-replay.d.ts +2 -0
  45. package/dist/eval/policy-detection-replay.d.ts.map +1 -0
  46. package/dist/eval/policy-detection-replay.js +122 -0
  47. package/dist/eval/policy-detection-replay.js.map +1 -0
  48. package/dist/eval/todo-worker-runtime-replay.d.ts +2 -0
  49. package/dist/eval/todo-worker-runtime-replay.d.ts.map +1 -0
  50. package/dist/eval/todo-worker-runtime-replay.js +520 -0
  51. package/dist/eval/todo-worker-runtime-replay.js.map +1 -0
  52. package/dist/integration-tokens.d.ts +6 -0
  53. package/dist/integration-tokens.d.ts.map +1 -1
  54. package/dist/integration-tokens.js +43 -0
  55. package/dist/integration-tokens.js.map +1 -1
  56. package/dist/local-data.d.ts +128 -1
  57. package/dist/local-data.d.ts.map +1 -1
  58. package/dist/local-data.js +702 -18
  59. package/dist/local-data.js.map +1 -1
  60. package/dist/local-db.d.ts.map +1 -1
  61. package/dist/local-db.js +216 -12
  62. package/dist/local-db.js.map +1 -1
  63. package/dist/local-funnel.d.ts.map +1 -1
  64. package/dist/local-funnel.js +7 -0
  65. package/dist/local-funnel.js.map +1 -1
  66. package/dist/local-server.d.ts.map +1 -1
  67. package/dist/local-server.js +119 -96
  68. package/dist/local-server.js.map +1 -1
  69. package/dist/mcp/bridge-server.d.ts.map +1 -1
  70. package/dist/mcp/bridge-server.js +8 -2
  71. package/dist/mcp/bridge-server.js.map +1 -1
  72. package/dist/mcp/manager.d.ts +5 -0
  73. package/dist/mcp/manager.d.ts.map +1 -1
  74. package/dist/mcp/manager.js +36 -0
  75. package/dist/mcp/manager.js.map +1 -1
  76. package/dist/mcp/sync-cli-config.d.ts +5 -0
  77. package/dist/mcp/sync-cli-config.d.ts.map +1 -1
  78. package/dist/mcp/sync-cli-config.js +10 -2
  79. package/dist/mcp/sync-cli-config.js.map +1 -1
  80. package/dist/message-loop.d.ts +1 -0
  81. package/dist/message-loop.d.ts.map +1 -1
  82. package/dist/message-loop.js +122 -17
  83. package/dist/message-loop.js.map +1 -1
  84. package/dist/mqtt-client.d.ts +44 -0
  85. package/dist/mqtt-client.d.ts.map +1 -1
  86. package/dist/mqtt-client.js.map +1 -1
  87. package/dist/orchestration/front-door-policy.d.ts +26 -9
  88. package/dist/orchestration/front-door-policy.d.ts.map +1 -1
  89. package/dist/orchestration/front-door-policy.js +242 -69
  90. package/dist/orchestration/front-door-policy.js.map +1 -1
  91. package/dist/orchestration/orchestrator-blocked-prompt.d.ts +18 -0
  92. package/dist/orchestration/orchestrator-blocked-prompt.d.ts.map +1 -0
  93. package/dist/orchestration/orchestrator-blocked-prompt.js +46 -0
  94. package/dist/orchestration/orchestrator-blocked-prompt.js.map +1 -0
  95. package/dist/orchestration/orchestrator-final-response-prompt.d.ts +10 -0
  96. package/dist/orchestration/orchestrator-final-response-prompt.d.ts.map +1 -0
  97. package/dist/orchestration/orchestrator-final-response-prompt.js +39 -0
  98. package/dist/orchestration/orchestrator-final-response-prompt.js.map +1 -0
  99. package/dist/orchestration/orchestrator-operating-prompt.d.ts +11 -0
  100. package/dist/orchestration/orchestrator-operating-prompt.d.ts.map +1 -1
  101. package/dist/orchestration/orchestrator-operating-prompt.js +106 -36
  102. package/dist/orchestration/orchestrator-operating-prompt.js.map +1 -1
  103. package/dist/orchestration/policy-prompt.d.ts +6 -0
  104. package/dist/orchestration/policy-prompt.d.ts.map +1 -0
  105. package/dist/orchestration/policy-prompt.js +40 -0
  106. package/dist/orchestration/policy-prompt.js.map +1 -0
  107. package/dist/orchestration/worker-operating-prompt.d.ts +16 -0
  108. package/dist/orchestration/worker-operating-prompt.d.ts.map +1 -0
  109. package/dist/orchestration/worker-operating-prompt.js +75 -0
  110. package/dist/orchestration/worker-operating-prompt.js.map +1 -0
  111. package/dist/orchestrator.d.ts +19 -0
  112. package/dist/orchestrator.d.ts.map +1 -1
  113. package/dist/orchestrator.js +614 -54
  114. package/dist/orchestrator.js.map +1 -1
  115. package/dist/policy-detection.d.ts +40 -0
  116. package/dist/policy-detection.d.ts.map +1 -0
  117. package/dist/policy-detection.js +298 -0
  118. package/dist/policy-detection.js.map +1 -0
  119. package/dist/providers/anthropic.d.ts.map +1 -1
  120. package/dist/providers/anthropic.js +35 -6
  121. package/dist/providers/anthropic.js.map +1 -1
  122. package/dist/providers/claude-cli.d.ts.map +1 -1
  123. package/dist/providers/claude-cli.js +11 -2
  124. package/dist/providers/claude-cli.js.map +1 -1
  125. package/dist/providers/codex-cli.d.ts.map +1 -1
  126. package/dist/providers/codex-cli.js +121 -2
  127. package/dist/providers/codex-cli.js.map +1 -1
  128. package/dist/providers/index.d.ts +4 -0
  129. package/dist/providers/index.d.ts.map +1 -1
  130. package/dist/providers/index.js.map +1 -1
  131. package/dist/summarization-pipeline.d.ts +1 -4
  132. package/dist/summarization-pipeline.d.ts.map +1 -1
  133. package/dist/summarization-pipeline.js +43 -56
  134. package/dist/summarization-pipeline.js.map +1 -1
  135. package/dist/tools/index.d.ts.map +1 -1
  136. package/dist/tools/index.js +2 -0
  137. package/dist/tools/index.js.map +1 -1
  138. package/dist/tools/todo-tasks.d.ts +2 -0
  139. package/dist/tools/todo-tasks.d.ts.map +1 -1
  140. package/dist/tools/todo-tasks.js +203 -6
  141. package/dist/tools/todo-tasks.js.map +1 -1
  142. package/dist/types.d.ts +2 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/dist/wizard-state.d.ts.map +1 -1
  145. package/dist/wizard-state.js +30 -8
  146. package/dist/wizard-state.js.map +1 -1
  147. package/dist/wizard-support.d.ts +2 -2
  148. package/dist/wizard-support.d.ts.map +1 -1
  149. package/dist/wizard-support.js +80 -93
  150. package/dist/wizard-support.js.map +1 -1
  151. package/dist/workflow-engine.d.ts +3 -0
  152. package/dist/workflow-engine.d.ts.map +1 -1
  153. package/dist/workflow-engine.js +111 -82
  154. package/dist/workflow-engine.js.map +1 -1
  155. package/package.json +5 -1
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const fs_1 = __importDefault(require("fs"));
40
+ const os_1 = __importDefault(require("os"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const orchestrator_1 = require("../orchestrator");
43
+ const data = __importStar(require("../local-data"));
44
+ class DispatchStubWorkflowEngine {
45
+ calls = [];
46
+ actions;
47
+ constructor(actions) {
48
+ this.actions = [...actions];
49
+ }
50
+ async execute(prompt, conversationId, agentId, opts) {
51
+ this.calls.push({ prompt, conversationId, agentId, opts });
52
+ const action = this.actions.shift();
53
+ if (!action) {
54
+ return { id: `wf-${this.calls.length}`, status: 'completed', mergedResult: 'No scripted action remained.', steps: [] };
55
+ }
56
+ if (action.type === 'decision') {
57
+ return { id: `wf-${this.calls.length}`, status: 'completed', mergedResult: JSON.stringify(action.payload), steps: [] };
58
+ }
59
+ if (action.type === 'respond') {
60
+ return { id: `wf-${this.calls.length}`, status: 'completed', mergedResult: action.text, steps: [] };
61
+ }
62
+ const task = conversationId ? data.getNextActiveTodoForConversation(conversationId) : undefined;
63
+ if (!task)
64
+ throw new Error('No active TODO task found for scripted worker action');
65
+ if (action.type === 'complete') {
66
+ data.completeTodoTaskByWorker(task.id, {
67
+ outputSummary: action.outputSummary,
68
+ handoffPrompt: action.handoffPrompt,
69
+ actor: { actorType: 'llm', actorId: task.owner_name || 'Worker' },
70
+ });
71
+ return { id: `wf-${this.calls.length}`, status: 'completed', mergedResult: action.outputSummary, steps: [] };
72
+ }
73
+ data.blockTodoTaskByWorker(task.id, {
74
+ blockerSummary: action.blockerSummary,
75
+ checkedContext: action.checkedContext,
76
+ userQuestion: action.userQuestion,
77
+ actor: { actorType: 'llm', actorId: task.owner_name || 'Worker' },
78
+ });
79
+ return { id: `wf-${this.calls.length}`, status: 'completed', mergedResult: action.blockerSummary, steps: [] };
80
+ }
81
+ getActiveWorkflows() {
82
+ return [];
83
+ }
84
+ }
85
+ function parseArgs(argv) {
86
+ const args = {};
87
+ for (let i = 0; i < argv.length; i += 1) {
88
+ if (argv[i] === '--output' && argv[i + 1]) {
89
+ args.output = argv[i + 1];
90
+ i += 1;
91
+ }
92
+ }
93
+ return args;
94
+ }
95
+ function setupTempDb() {
96
+ const tempRoot = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'funolio-orchestrator-todo-dispatch-'));
97
+ process.env.FUNOLIO_LOCAL_DB_PATH = path_1.default.join(tempRoot, 'local.db');
98
+ data.closeDb();
99
+ return tempRoot;
100
+ }
101
+ function teardownTempDb(tempRoot) {
102
+ data.closeDb();
103
+ delete process.env.FUNOLIO_LOCAL_DB_PATH;
104
+ fs_1.default.rmSync(tempRoot, { recursive: true, force: true });
105
+ }
106
+ function seedContext() {
107
+ const orchestratorBot = data.createAgentProfile({
108
+ provider: 'claude-cli',
109
+ model: 'claude-opus-4-6',
110
+ name: 'Ben',
111
+ roleClass: 'coding',
112
+ isOrchestrator: true,
113
+ });
114
+ const john = data.createAgentProfile({
115
+ provider: 'codex-cli',
116
+ model: 'gpt-5.2-codex',
117
+ name: 'John',
118
+ roleClass: 'qa',
119
+ });
120
+ const project = data.createProject({ name: 'Dispatch Eval Project', folder: 'C:\\Projects\\Funolio' });
121
+ const conversation = data.createConversation(orchestratorBot.id, 'Dispatch Eval Conversation', 'local', { projectId: project.id });
122
+ return { orchestratorBot, john, project, conversation };
123
+ }
124
+ function makeOpts(projectId) {
125
+ return {
126
+ projectDir: 'C:\\Projects\\Funolio',
127
+ projectId,
128
+ onProgress: () => { },
129
+ onWorkerChunk: undefined,
130
+ mqttPublish: async () => { },
131
+ commandId: 'cmd-dispatch-eval',
132
+ };
133
+ }
134
+ async function runScenarios() {
135
+ const scenarios = [];
136
+ {
137
+ const tempRoot = setupTempDb();
138
+ try {
139
+ const { project, conversation } = seedContext();
140
+ const engine = new DispatchStubWorkflowEngine([
141
+ {
142
+ type: 'decision',
143
+ payload: {
144
+ mode: 'workflow',
145
+ reason: 'User explicitly requested TODO workflow.',
146
+ workflow_request: 'Ben coding then John QA',
147
+ },
148
+ },
149
+ { type: 'complete', outputSummary: 'Implemented the page.', handoffPrompt: 'Implementation complete for QA.' },
150
+ { type: 'complete', outputSummary: 'QA passed.', handoffPrompt: 'The page is complete and QA passed.' },
151
+ { type: 'respond', text: 'The page is complete and QA passed.' },
152
+ ]);
153
+ const orchestrator = new orchestrator_1.OrchestratorAgent({}, engine);
154
+ const response = await orchestrator.handleUserMessage('Use the TODO list with Ben for coding and John for QA after coding is complete.', conversation.id, makeOpts(project.id));
155
+ const completed = data.listCompletedTodoTasksForConversation(conversation.id);
156
+ scenarios.push({
157
+ name: 'automatic_dispatch_final_response',
158
+ expected: 'Workflow planning should dispatch worker TODOs in order and end with a final orchestrator response.',
159
+ pass: response === 'The page is complete and QA passed.'
160
+ && data.getNextActiveTodoForConversation(conversation.id) === undefined
161
+ && completed.map((task) => task.owner_name).join(',') === 'Ben,John',
162
+ details: {
163
+ response,
164
+ completedOwners: completed.map((task) => task.owner_name),
165
+ completedSummaries: completed.map((task) => task.output_summary),
166
+ callCount: engine.calls.length,
167
+ callOrder: engine.calls.map((call) => ({
168
+ agentId: call.agentId,
169
+ promptPreview: call.prompt.slice(0, 120),
170
+ })),
171
+ },
172
+ });
173
+ }
174
+ finally {
175
+ teardownTempDb(tempRoot);
176
+ }
177
+ }
178
+ {
179
+ const tempRoot = setupTempDb();
180
+ try {
181
+ const { project, conversation } = seedContext();
182
+ const engine = new DispatchStubWorkflowEngine([
183
+ {
184
+ type: 'decision',
185
+ payload: {
186
+ mode: 'delegate',
187
+ reason: 'User explicitly requested Ben-only TODO delegation.',
188
+ delegate_target: 'Ben',
189
+ delegate_role: 'coding',
190
+ delegate_request: 'Build the requested page.',
191
+ },
192
+ },
193
+ {
194
+ type: 'block',
195
+ blockerSummary: 'The output location is missing.',
196
+ checkedContext: 'Checked the current TODO, summary, and recent turns.',
197
+ userQuestion: 'Where should the finished HTML file be written?',
198
+ },
199
+ { type: 'respond', text: 'Where should the finished HTML file be written?' },
200
+ ]);
201
+ const orchestrator = new orchestrator_1.OrchestratorAgent({}, engine);
202
+ const response = await orchestrator.handleUserMessage('Use the TODO list with Ben only. Ben should code this request.', conversation.id, makeOpts(project.id));
203
+ const blockedTask = data.getNextActiveTodoForConversation(conversation.id);
204
+ scenarios.push({
205
+ name: 'automatic_dispatch_blocked_resolution',
206
+ expected: 'A blocked worker should return control to the orchestrator, which should ask the user the one unblock question.',
207
+ pass: response === 'Where should the finished HTML file be written?'
208
+ && blockedTask?.blocker_summary === 'The output location is missing.'
209
+ && blockedTask?.blocker_question === 'Where should the finished HTML file be written?',
210
+ details: {
211
+ response,
212
+ blockedTaskId: blockedTask?.id ?? null,
213
+ blockerSummary: blockedTask?.blocker_summary ?? null,
214
+ blockerQuestion: blockedTask?.blocker_question ?? null,
215
+ callCount: engine.calls.length,
216
+ callOrder: engine.calls.map((call) => ({
217
+ agentId: call.agentId,
218
+ promptPreview: call.prompt.slice(0, 120),
219
+ })),
220
+ },
221
+ });
222
+ }
223
+ finally {
224
+ teardownTempDb(tempRoot);
225
+ }
226
+ }
227
+ return scenarios;
228
+ }
229
+ async function main() {
230
+ const args = parseArgs(process.argv.slice(2));
231
+ const scenarios = await runScenarios();
232
+ const passed = scenarios.filter((item) => item.pass).length;
233
+ const report = {
234
+ generatedAt: new Date().toISOString(),
235
+ slice: 'orchestrator-todo-dispatch',
236
+ passed,
237
+ total: scenarios.length,
238
+ success: passed === scenarios.length,
239
+ scenarios,
240
+ };
241
+ const serialized = JSON.stringify(report, null, 2);
242
+ if (args.output) {
243
+ fs_1.default.writeFileSync(path_1.default.resolve(args.output), serialized, 'utf8');
244
+ }
245
+ else {
246
+ console.log(serialized);
247
+ }
248
+ }
249
+ main().catch((err) => {
250
+ console.error(err);
251
+ process.exit(1);
252
+ });
253
+ //# sourceMappingURL=orchestrator-todo-dispatch-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-todo-dispatch-replay.js","sourceRoot":"","sources":["../../src/eval/orchestrator-todo-dispatch-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=orchestrator-todo-planning-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-todo-planning-replay.d.ts","sourceRoot":"","sources":["../../src/eval/orchestrator-todo-planning-replay.ts"],"names":[],"mappings":""}
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ class StubWorkflowEngine {
40
+ calls = [];
41
+ responses;
42
+ constructor(responses) {
43
+ this.responses = [...responses];
44
+ }
45
+ async execute(prompt, conversationId, agentId, opts) {
46
+ this.calls.push({ prompt, conversationId, agentId, opts });
47
+ const mergedResult = this.responses.shift() ?? JSON.stringify({ mode: 'respond', reason: 'default', response: 'default' });
48
+ return {
49
+ id: `wf-${this.calls.length}`,
50
+ status: 'completed',
51
+ mergedResult,
52
+ steps: [],
53
+ };
54
+ }
55
+ getActiveWorkflows() {
56
+ return [];
57
+ }
58
+ }
59
+ function parseArgs(argv) {
60
+ const args = {};
61
+ for (let i = 0; i < argv.length; i += 1) {
62
+ if (argv[i] === '--output' && argv[i + 1]) {
63
+ args.output = argv[i + 1];
64
+ i += 1;
65
+ }
66
+ }
67
+ return args;
68
+ }
69
+ async function withTempDb(fn) {
70
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'funolio-orchestrator-todo-eval-'));
71
+ process.env.FUNOLIO_LOCAL_DB_PATH = path.join(tempRoot, 'local.db');
72
+ const data = await Promise.resolve().then(() => __importStar(require('../local-data')));
73
+ const orchestratorModule = await Promise.resolve().then(() => __importStar(require('../orchestrator')));
74
+ data.closeDb();
75
+ try {
76
+ return await fn({ data, OrchestratorAgent: orchestratorModule.OrchestratorAgent });
77
+ }
78
+ finally {
79
+ data.closeDb();
80
+ delete process.env.FUNOLIO_LOCAL_DB_PATH;
81
+ fs.rmSync(tempRoot, { recursive: true, force: true });
82
+ }
83
+ }
84
+ function makeOpts(projectId) {
85
+ return {
86
+ projectDir: process.cwd(),
87
+ projectId,
88
+ autoDispatchTodos: false,
89
+ onProgress: () => { },
90
+ onWorkerChunk: undefined,
91
+ mqttPublish: async () => { },
92
+ commandId: 'eval-cmd',
93
+ };
94
+ }
95
+ async function seedContext(data) {
96
+ const orchestratorBot = data.createAgentProfile({
97
+ provider: 'claude-cli',
98
+ model: 'claude-opus-4-6',
99
+ name: 'Ben',
100
+ roleClass: 'coding',
101
+ isOrchestrator: true,
102
+ });
103
+ const brain = data.createAgentProfile({
104
+ provider: 'openai',
105
+ model: 'gpt-5.2-chat-latest',
106
+ name: 'Brain',
107
+ roleClass: 'research',
108
+ });
109
+ const john = data.createAgentProfile({
110
+ provider: 'codex-cli',
111
+ model: 'gpt-5.2-codex',
112
+ name: 'John',
113
+ roleClass: 'qa',
114
+ });
115
+ const project = data.createProject({ name: 'Planning Eval Project', folder: process.cwd() });
116
+ const conversation = data.createConversation(orchestratorBot.id, 'Planning Eval Conversation', 'local', { projectId: project.id });
117
+ return { orchestratorBot, brain, john, project, conversation };
118
+ }
119
+ async function runScenarios() {
120
+ const scenarios = [];
121
+ scenarios.push(await withTempDb(async ({ data, OrchestratorAgent }) => {
122
+ const { project, conversation } = await seedContext(data);
123
+ const engine = new StubWorkflowEngine([
124
+ JSON.stringify({
125
+ mode: 'workflow',
126
+ reason: 'User explicitly asked for TODO workflow orchestration.',
127
+ workflow_request: 'Brain research, Ben code, John QA',
128
+ }),
129
+ ]);
130
+ const orchestrator = new OrchestratorAgent({}, engine);
131
+ const response = await orchestrator.handleUserMessage('Use the TODO workflow. Brain should brainstorm the design, Ben should code it, and John should QA it.', conversation.id, makeOpts(project.id));
132
+ const activeTasks = data.listTodoTasks({ state: 'active', projectId: project.id }).filter((task) => task.conversation_id === conversation.id);
133
+ return {
134
+ name: 'explicit_workflow_creates_chain',
135
+ expected: 'Explicit workflow request creates a 3-step TODO chain with next-worker wiring.',
136
+ pass: activeTasks.length === 3
137
+ && activeTasks.map((task) => task.owner_name).join('|') === 'Brain|Ben|John'
138
+ && activeTasks.map((task) => task.next_worker_name ?? 'NONE').join('|') === 'Ben|John|NONE',
139
+ details: {
140
+ response,
141
+ taskOwners: activeTasks.map((task) => task.owner_name),
142
+ nextWorkers: activeTasks.map((task) => task.next_worker_name),
143
+ workflowEngineCalls: engine.calls.length,
144
+ },
145
+ };
146
+ }));
147
+ scenarios.push(await withTempDb(async ({ data, OrchestratorAgent }) => {
148
+ const { project, conversation } = await seedContext(data);
149
+ const engine = new StubWorkflowEngine([
150
+ JSON.stringify({
151
+ mode: 'delegate',
152
+ reason: 'User explicitly requested delegation.',
153
+ delegate_target: 'John',
154
+ delegate_role: 'qa',
155
+ delegate_request: 'QA the requested change and report findings.',
156
+ }),
157
+ ]);
158
+ const orchestrator = new OrchestratorAgent({}, engine);
159
+ const response = await orchestrator.handleUserMessage('Delegate this to John for QA.', conversation.id, makeOpts(project.id));
160
+ const activeTasks = data.listTodoTasks({ state: 'active', projectId: project.id }).filter((task) => task.conversation_id === conversation.id);
161
+ return {
162
+ name: 'explicit_delegate_creates_single_todo',
163
+ expected: 'Explicit delegate request creates one queued TODO for the target worker.',
164
+ pass: activeTasks.length === 1 && activeTasks[0].owner_name === 'John' && activeTasks[0].task_type === 'qa',
165
+ details: {
166
+ response,
167
+ tasks: activeTasks.map((task) => ({ owner: task.owner_name, taskType: task.task_type, title: task.title })),
168
+ workflowEngineCalls: engine.calls.length,
169
+ },
170
+ };
171
+ }));
172
+ scenarios.push(await withTempDb(async ({ data, OrchestratorAgent }) => {
173
+ const { orchestratorBot, brain, john, project, conversation } = await seedContext(data);
174
+ const template = data.createWorkflowTemplate({ projectId: project.id, name: 'Normal Workflow', description: 'Research, code, QA' });
175
+ data.addWorkflowTemplateStep({ templateId: template.id, orderIndex: 1, agentId: brain.id, instruction: 'Research and plan the work.' });
176
+ data.addWorkflowTemplateStep({ templateId: template.id, orderIndex: 2, agentId: orchestratorBot.id, instruction: 'Implement the work.' });
177
+ data.addWorkflowTemplateStep({ templateId: template.id, orderIndex: 3, agentId: john.id, instruction: 'QA the finished work.', isCheckpoint: true });
178
+ const engine = new StubWorkflowEngine([]);
179
+ const orchestrator = new OrchestratorAgent({}, engine);
180
+ const response = await orchestrator.handleUserMessage('Please run the selected workflow for this feature.', conversation.id, {
181
+ ...makeOpts(project.id),
182
+ workflowTemplateId: template.id,
183
+ });
184
+ const activeTasks = data.listTodoTasks({ state: 'active', projectId: project.id }).filter((task) => task.conversation_id === conversation.id);
185
+ return {
186
+ name: 'selected_template_creates_chain',
187
+ expected: 'Selecting a workflow template creates TODOs directly from the template without front-door LLM routing.',
188
+ pass: activeTasks.length === 3
189
+ && activeTasks.map((task) => task.owner_name).join('|') === 'Brain|Ben|John'
190
+ && engine.calls.length === 0,
191
+ details: {
192
+ response,
193
+ taskTypes: activeTasks.map((task) => task.task_type),
194
+ workflowEngineCalls: engine.calls.length,
195
+ },
196
+ };
197
+ }));
198
+ scenarios.push(await withTempDb(async ({ data, OrchestratorAgent }) => {
199
+ const { project, conversation } = await seedContext(data);
200
+ const engine = new StubWorkflowEngine([
201
+ JSON.stringify({
202
+ mode: 'execute_self',
203
+ reason: 'Direct work is appropriate.',
204
+ }),
205
+ 'Direct work result',
206
+ ]);
207
+ const orchestrator = new OrchestratorAgent({}, engine);
208
+ const response = await orchestrator.handleUserMessage('Build a simple direct response without workflow.', conversation.id, makeOpts(project.id));
209
+ const activeTasks = data.listTodoTasks({ state: 'active', projectId: project.id }).filter((task) => task.conversation_id === conversation.id);
210
+ return {
211
+ name: 'direct_mode_does_not_create_todos',
212
+ expected: 'Direct execute-self path should not create TODO items.',
213
+ pass: activeTasks.length === 0 && response.includes('Direct work result'),
214
+ details: {
215
+ response,
216
+ activeTaskCount: activeTasks.length,
217
+ workflowEngineCalls: engine.calls.length,
218
+ },
219
+ };
220
+ }));
221
+ return scenarios;
222
+ }
223
+ async function main() {
224
+ const args = parseArgs(process.argv.slice(2));
225
+ const scenarios = await runScenarios();
226
+ const passed = scenarios.filter((item) => item.pass).length;
227
+ const report = {
228
+ generatedAt: new Date().toISOString(),
229
+ slice: 'orchestrator-todo-planning',
230
+ passed,
231
+ total: scenarios.length,
232
+ success: passed === scenarios.length,
233
+ scenarios,
234
+ };
235
+ const serialized = JSON.stringify(report, null, 2);
236
+ if (args.output) {
237
+ fs.writeFileSync(path.resolve(args.output), serialized, 'utf8');
238
+ }
239
+ else {
240
+ console.log(serialized);
241
+ }
242
+ }
243
+ main().catch((err) => {
244
+ console.error(err);
245
+ process.exit(1);
246
+ });
247
+ //# sourceMappingURL=orchestrator-todo-planning-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-todo-planning-replay.js","sourceRoot":"","sources":["../../src/eval/orchestrator-todo-planning-replay.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAa7B,MAAM,kBAAkB;IACf,KAAK,GAAyF,EAAE,CAAC;IAChG,SAAS,CAAW;IAE5B,YAAY,SAAmB;QAC7B,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,cAA6B,EAAE,OAAe,EAAE,IAAS;QACrF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3H,OAAO;YACL,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAC7B,MAAM,EAAE,WAAW;YACnB,YAAY;YACZ,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,kBAAkB;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAI,EAAyI;IACpK,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,wDAAa,eAAe,GAAC,CAAC;IAC3C,MAAM,kBAAkB,GAAG,wDAAa,iBAAiB,GAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;IACf,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACrF,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACzC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IACjC,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;QACzB,SAAS;QACT,iBAAiB,EAAE,KAAK;QACxB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,aAAa,EAAE,SAAS;QACxB,WAAW,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC3B,SAAS,EAAE,UAAU;KACtB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAoC;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC9C,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,QAAQ;QACnB,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACpC,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACnC,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAAE,4BAA4B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACnI,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,SAAS,GAAqB,EAAE,CAAC;IAEvC,SAAS,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,wDAAwD;gBAChE,gBAAgB,EAAE,mCAAmC;aACtD,CAAC;SACH,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,EAAS,EAAE,MAAa,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,CACnD,uGAAuG,EACvG,YAAY,CAAC,EAAE,EACf,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CACrB,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9I,OAAO;YACL,IAAI,EAAE,iCAAiC;YACvC,QAAQ,EAAE,gFAAgF;YAC1F,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;mBACzB,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB;mBACzE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,eAAe;YAC7F,OAAO,EAAE;gBACP,QAAQ;gBACR,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtD,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC7D,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;aACzC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC,CAAC;IAEJ,SAAS,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,uCAAuC;gBAC/C,eAAe,EAAE,MAAM;gBACvB,aAAa,EAAE,IAAI;gBACnB,gBAAgB,EAAE,8CAA8C;aACjE,CAAC;SACH,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,EAAS,EAAE,MAAa,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,CACnD,+BAA+B,EAC/B,YAAY,CAAC,EAAE,EACf,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CACrB,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9I,OAAO;YACL,IAAI,EAAE,uCAAuC;YAC7C,QAAQ,EAAE,0EAA0E;YACpF,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI;YAC3G,OAAO,EAAE;gBACP,QAAQ;gBACR,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC3G,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;aACzC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC,CAAC;IAEJ,SAAS,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpI,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACxI,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC1I,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACrJ,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,EAAS,EAAE,MAAa,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,CACnD,oDAAoD,EACpD,YAAY,CAAC,EAAE,EACf;YACE,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,kBAAkB,EAAE,QAAQ,CAAC,EAAE;SAChC,CACF,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9I,OAAO;YACL,IAAI,EAAE,iCAAiC;YACvC,QAAQ,EAAE,wGAAwG;YAClH,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;mBACzB,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB;mBACzE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAC9B,OAAO,EAAE;gBACP,QAAQ;gBACR,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpD,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;aACzC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC,CAAC;IAEJ,SAAS,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,6BAA6B;aACtC,CAAC;YACF,oBAAoB;SACrB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,EAAS,EAAE,MAAa,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,CACnD,kDAAkD,EAClD,YAAY,CAAC,EAAE,EACf,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CACrB,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9I,OAAO;YACL,IAAI,EAAE,mCAAmC;YACzC,QAAQ,EAAE,wDAAwD;YAClE,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACzE,OAAO,EAAE;gBACP,QAAQ;gBACR,eAAe,EAAE,WAAW,CAAC,MAAM;gBACnC,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;aACzC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,4BAA4B;QACnC,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,MAAM;QACpC,SAAS;KACV,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=policy-detection-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-detection-replay.d.ts","sourceRoot":"","sources":["../../src/eval/policy-detection-replay.ts"],"names":[],"mappings":""}