agentlang 0.10.0 → 0.10.2

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 (107) hide show
  1. package/out/api/http.d.ts.map +1 -1
  2. package/out/api/http.js +136 -0
  3. package/out/api/http.js.map +1 -1
  4. package/out/language/generated/ast.d.ts +87 -44
  5. package/out/language/generated/ast.d.ts.map +1 -1
  6. package/out/language/generated/ast.js +65 -31
  7. package/out/language/generated/ast.js.map +1 -1
  8. package/out/language/generated/grammar.d.ts.map +1 -1
  9. package/out/language/generated/grammar.js +337 -330
  10. package/out/language/generated/grammar.js.map +1 -1
  11. package/out/language/main.cjs +396 -361
  12. package/out/language/main.cjs.map +2 -2
  13. package/out/language/parser.d.ts +11 -1
  14. package/out/language/parser.d.ts.map +1 -1
  15. package/out/language/parser.js +74 -8
  16. package/out/language/parser.js.map +1 -1
  17. package/out/language/syntax.d.ts +14 -0
  18. package/out/language/syntax.d.ts.map +1 -1
  19. package/out/language/syntax.js +60 -27
  20. package/out/language/syntax.js.map +1 -1
  21. package/out/runtime/agents/common.d.ts +2 -2
  22. package/out/runtime/agents/common.js +1 -1
  23. package/out/runtime/api.d.ts +2 -0
  24. package/out/runtime/api.d.ts.map +1 -1
  25. package/out/runtime/api.js +3 -0
  26. package/out/runtime/api.js.map +1 -1
  27. package/out/runtime/datefns.d.ts +34 -0
  28. package/out/runtime/datefns.d.ts.map +1 -0
  29. package/out/runtime/datefns.js +82 -0
  30. package/out/runtime/datefns.js.map +1 -0
  31. package/out/runtime/exec-graph.d.ts.map +1 -1
  32. package/out/runtime/exec-graph.js +22 -3
  33. package/out/runtime/exec-graph.js.map +1 -1
  34. package/out/runtime/interpreter.d.ts +9 -0
  35. package/out/runtime/interpreter.d.ts.map +1 -1
  36. package/out/runtime/interpreter.js +85 -20
  37. package/out/runtime/interpreter.js.map +1 -1
  38. package/out/runtime/module.d.ts +8 -0
  39. package/out/runtime/module.d.ts.map +1 -1
  40. package/out/runtime/module.js +23 -0
  41. package/out/runtime/module.js.map +1 -1
  42. package/out/runtime/modules/ai.d.ts +9 -8
  43. package/out/runtime/modules/ai.d.ts.map +1 -1
  44. package/out/runtime/modules/ai.js +92 -37
  45. package/out/runtime/modules/ai.js.map +1 -1
  46. package/out/runtime/modules/core.d.ts.map +1 -1
  47. package/out/runtime/modules/core.js +5 -1
  48. package/out/runtime/modules/core.js.map +1 -1
  49. package/out/runtime/monitor.d.ts +6 -0
  50. package/out/runtime/monitor.d.ts.map +1 -1
  51. package/out/runtime/monitor.js +21 -1
  52. package/out/runtime/monitor.js.map +1 -1
  53. package/out/runtime/relgraph.d.ts.map +1 -1
  54. package/out/runtime/relgraph.js +7 -3
  55. package/out/runtime/relgraph.js.map +1 -1
  56. package/out/runtime/resolvers/interface.d.ts +3 -2
  57. package/out/runtime/resolvers/interface.d.ts.map +1 -1
  58. package/out/runtime/resolvers/interface.js +3 -2
  59. package/out/runtime/resolvers/interface.js.map +1 -1
  60. package/out/runtime/resolvers/sqldb/dbutil.d.ts.map +1 -1
  61. package/out/runtime/resolvers/sqldb/dbutil.js +17 -4
  62. package/out/runtime/resolvers/sqldb/dbutil.js.map +1 -1
  63. package/out/runtime/resolvers/sqldb/impl.d.ts +1 -1
  64. package/out/runtime/resolvers/sqldb/impl.d.ts.map +1 -1
  65. package/out/runtime/resolvers/sqldb/impl.js +17 -7
  66. package/out/runtime/resolvers/sqldb/impl.js.map +1 -1
  67. package/out/runtime/services/documentFetcher.js +2 -2
  68. package/out/runtime/services/documentFetcher.js.map +1 -1
  69. package/out/runtime/util.d.ts +12 -1
  70. package/out/runtime/util.d.ts.map +1 -1
  71. package/out/runtime/util.js +38 -2
  72. package/out/runtime/util.js.map +1 -1
  73. package/out/syntaxes/agentlang.monarch.js +1 -1
  74. package/out/syntaxes/agentlang.monarch.js.map +1 -1
  75. package/out/test-harness.d.ts +36 -0
  76. package/out/test-harness.d.ts.map +1 -0
  77. package/out/test-harness.js +341 -0
  78. package/out/test-harness.js.map +1 -0
  79. package/out/utils/fs/index.d.ts +12 -2
  80. package/out/utils/fs/index.d.ts.map +1 -1
  81. package/out/utils/fs/index.js +27 -6
  82. package/out/utils/fs/index.js.map +1 -1
  83. package/package.json +4 -1
  84. package/src/api/http.ts +138 -0
  85. package/src/language/agentlang.langium +9 -10
  86. package/src/language/generated/ast.ts +98 -44
  87. package/src/language/generated/grammar.ts +337 -330
  88. package/src/language/parser.ts +87 -6
  89. package/src/language/syntax.ts +71 -24
  90. package/src/runtime/agents/common.ts +1 -1
  91. package/src/runtime/api.ts +5 -0
  92. package/src/runtime/datefns.ts +112 -0
  93. package/src/runtime/exec-graph.ts +23 -2
  94. package/src/runtime/interpreter.ts +107 -19
  95. package/src/runtime/module.ts +26 -0
  96. package/src/runtime/modules/ai.ts +110 -54
  97. package/src/runtime/modules/core.ts +5 -1
  98. package/src/runtime/monitor.ts +27 -1
  99. package/src/runtime/relgraph.ts +7 -3
  100. package/src/runtime/resolvers/interface.ts +4 -2
  101. package/src/runtime/resolvers/sqldb/dbutil.ts +20 -6
  102. package/src/runtime/resolvers/sqldb/impl.ts +17 -7
  103. package/src/runtime/services/documentFetcher.ts +2 -2
  104. package/src/runtime/util.ts +62 -2
  105. package/src/syntaxes/agentlang.monarch.ts +1 -1
  106. package/src/test-harness.ts +423 -0
  107. package/src/utils/fs/index.ts +30 -6
@@ -0,0 +1,341 @@
1
+ import { parseAndEvaluateStatement } from './runtime/interpreter.js';
2
+ import { fetchModule, Instance } from './runtime/module.js';
3
+ function formatValue(value) {
4
+ if (typeof value === 'string')
5
+ return `"${value}"`;
6
+ if (Array.isArray(value))
7
+ return '[' + value.map(formatValue).join(', ') + ']';
8
+ return String(value);
9
+ }
10
+ function buildEntityPattern(fqName, attrs, queryMode = false) {
11
+ const parts = [];
12
+ for (const [key, value] of Object.entries(attrs)) {
13
+ if (queryMode === true) {
14
+ parts.push(`${key}? ${formatValue(value)}`);
15
+ }
16
+ else if (typeof queryMode === 'string' && key === queryMode) {
17
+ parts.push(`${key}? ${formatValue(value)}`);
18
+ }
19
+ else {
20
+ parts.push(`${key} ${formatValue(value)}`);
21
+ }
22
+ }
23
+ return `{${fqName} {${parts.join(', ')}}}`;
24
+ }
25
+ function buildRelEntityPattern(moduleName, spec) {
26
+ const fqName = `${moduleName}/${spec.entity}`;
27
+ let pattern;
28
+ if (spec.query && Object.keys(spec.attrs).length === 0) {
29
+ pattern = `{${fqName}? {}}`;
30
+ }
31
+ else {
32
+ pattern = buildEntityPattern(fqName, spec.attrs, spec.query === true);
33
+ }
34
+ if (spec.rels) {
35
+ // Strip trailing } and append nested rels
36
+ const inner = pattern.slice(0, -1);
37
+ const relParts = buildRelParts(moduleName, spec.rels);
38
+ pattern = `${inner},\n${relParts}}`;
39
+ }
40
+ return pattern;
41
+ }
42
+ function buildRelParts(moduleName, rels) {
43
+ const parts = [];
44
+ for (const [relName, relEntities] of Object.entries(rels)) {
45
+ if (Array.isArray(relEntities)) {
46
+ const entityPatterns = relEntities.map(e => buildRelEntityPattern(moduleName, e));
47
+ parts.push(`${relName} [${entityPatterns.join(', ')}]`);
48
+ }
49
+ else {
50
+ parts.push(`${relName} ${buildRelEntityPattern(moduleName, relEntities)}`);
51
+ }
52
+ }
53
+ return parts.join(',\n');
54
+ }
55
+ function buildPattern(fqName, attrs, queryMode = false, moduleName, rels) {
56
+ const parts = [];
57
+ for (const [key, value] of Object.entries(attrs)) {
58
+ if (queryMode === true) {
59
+ parts.push(`${key}? ${formatValue(value)}`);
60
+ }
61
+ else if (typeof queryMode === 'string' && key === queryMode) {
62
+ parts.push(`${key}? ${formatValue(value)}`);
63
+ }
64
+ else {
65
+ parts.push(`${key} ${formatValue(value)}`);
66
+ }
67
+ }
68
+ let pattern = `{${fqName} {${parts.join(', ')}}}`;
69
+ if (rels && moduleName) {
70
+ // Strip outer closing } and append relationship parts
71
+ pattern = pattern.slice(0, -1);
72
+ const relParts = buildRelParts(moduleName, rels);
73
+ pattern = `${pattern},\n${relParts}}`;
74
+ }
75
+ return pattern;
76
+ }
77
+ function toObject(result) {
78
+ if (result instanceof Instance) {
79
+ const obj = result.userAttributesAsObject();
80
+ if (result.relatedInstances) {
81
+ result.relatedInstances.forEach((insts, relName) => {
82
+ obj[relName] = insts.map(toObject);
83
+ });
84
+ }
85
+ return obj;
86
+ }
87
+ if (Array.isArray(result)) {
88
+ return result.map(toObject);
89
+ }
90
+ return result;
91
+ }
92
+ async function evalPattern(pattern) {
93
+ var _a;
94
+ try {
95
+ const result = await parseAndEvaluateStatement(pattern);
96
+ return toObject(result);
97
+ }
98
+ catch (err) {
99
+ const message = (_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : String(err);
100
+ throw new Error(`Error evaluating pattern: ${pattern}\n ${message}`);
101
+ }
102
+ }
103
+ export function is(condition, message) {
104
+ if (!condition) {
105
+ const err = new Error(message !== null && message !== void 0 ? message : 'Assertion failed');
106
+ if (err.stack) {
107
+ const lines = err.stack.split('\n');
108
+ const callerLine = lines.find(l => !l.includes('test-harness') && l.includes('.test.'));
109
+ if (callerLine) {
110
+ err.message += `\n at ${callerLine.trim()}`;
111
+ }
112
+ }
113
+ throw err;
114
+ }
115
+ }
116
+ class TestAssertionError extends Error {
117
+ constructor(message) {
118
+ super(message);
119
+ this.name = 'TestAssertionError';
120
+ }
121
+ }
122
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
123
+ export async function runTests(moduleDefinition, testScript, initModule) {
124
+ var _a;
125
+ const start = Date.now();
126
+ const assertions = [];
127
+ let testError;
128
+ const match = moduleDefinition.match(/^\s*module\s+([\w.]+)/);
129
+ if (!match) {
130
+ return {
131
+ passed: false,
132
+ total: 0,
133
+ failures: 1,
134
+ results: [],
135
+ error: { message: 'Invalid module definition: missing "module <name>" declaration' },
136
+ duration: Date.now() - start,
137
+ };
138
+ }
139
+ const moduleName = match[1];
140
+ const moduleBody = moduleDefinition.substring(match[0].length);
141
+ try {
142
+ const proxy = await testModule(moduleName, moduleBody, initModule);
143
+ const trackingIs = (condition, message) => {
144
+ if (condition) {
145
+ assertions.push({ passed: true, message: message !== null && message !== void 0 ? message : 'OK' });
146
+ }
147
+ else {
148
+ const failMsg = message !== null && message !== void 0 ? message : 'Assertion failed';
149
+ assertions.push({ passed: false, message: failMsg });
150
+ throw new TestAssertionError(failMsg);
151
+ }
152
+ };
153
+ const paramNames = Object.keys(proxy);
154
+ const paramValues = Object.values(proxy);
155
+ const testFn = new AsyncFunction(...paramNames, 'is', testScript);
156
+ await testFn(...paramValues, trackingIs);
157
+ }
158
+ catch (err) {
159
+ if (!(err instanceof TestAssertionError)) {
160
+ const message = (_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : String(err);
161
+ const patternMatch = message.match(/Error evaluating pattern: (.+)\n/);
162
+ testError = {
163
+ message,
164
+ pattern: patternMatch ? patternMatch[1] : undefined,
165
+ };
166
+ }
167
+ }
168
+ const failures = assertions.filter(a => !a.passed).length;
169
+ return {
170
+ passed: !testError && failures === 0,
171
+ total: assertions.length,
172
+ failures,
173
+ results: assertions,
174
+ error: testError,
175
+ duration: Date.now() - start,
176
+ };
177
+ }
178
+ function splitTopLevel(s) {
179
+ const parts = [];
180
+ let current = '';
181
+ let depth = 0;
182
+ let inString = false;
183
+ for (let i = 0; i < s.length; i++) {
184
+ const ch = s[i];
185
+ if (ch === '"' && (i === 0 || s[i - 1] !== '\\')) {
186
+ inString = !inString;
187
+ }
188
+ if (!inString) {
189
+ if (ch === '[' || ch === '{')
190
+ depth++;
191
+ else if (ch === ']' || ch === '}')
192
+ depth--;
193
+ else if (ch === ',' && depth === 0) {
194
+ parts.push(current.trim());
195
+ current = '';
196
+ continue;
197
+ }
198
+ }
199
+ current += ch;
200
+ }
201
+ if (current.trim())
202
+ parts.push(current.trim());
203
+ return parts;
204
+ }
205
+ function parseAttr(s) {
206
+ const m = s.match(/^(\w+)(\?)?\s+([\s\S]+)$/);
207
+ if (!m)
208
+ throw new Error(`Cannot parse attribute: ${s}`);
209
+ return { name: m[1], query: !!m[2], value: m[3].trim() };
210
+ }
211
+ function parseCrudPattern(s) {
212
+ let input = s.trim();
213
+ const isDelete = input.startsWith('delete');
214
+ if (isDelete)
215
+ input = input.replace(/^delete\s+/, '');
216
+ if (input[0] !== '{')
217
+ return null;
218
+ // Skip outer opening {
219
+ let i = 1;
220
+ while (i < input.length && input[i] === ' ')
221
+ i++;
222
+ // Read fqName
223
+ let fqName = '';
224
+ while (i < input.length && !/[\s{?]/.test(input[i])) {
225
+ fqName += input[i];
226
+ i++;
227
+ }
228
+ if (!fqName.includes('/'))
229
+ return null;
230
+ // Check for entity-level query ?
231
+ while (i < input.length && input[i] === ' ')
232
+ i++;
233
+ let entityQuery = false;
234
+ if (input[i] === '?') {
235
+ entityQuery = true;
236
+ i++;
237
+ }
238
+ // Find inner {attrs} - match braces
239
+ while (i < input.length && input[i] !== '{')
240
+ i++;
241
+ if (i >= input.length)
242
+ return null;
243
+ let depth = 0;
244
+ const start = i;
245
+ while (i < input.length) {
246
+ if (input[i] === '"') {
247
+ i++;
248
+ while (i < input.length && input[i] !== '"')
249
+ i++;
250
+ }
251
+ else if (input[i] === '{') {
252
+ depth++;
253
+ }
254
+ else if (input[i] === '}') {
255
+ depth--;
256
+ if (depth === 0)
257
+ break;
258
+ }
259
+ i++;
260
+ }
261
+ const attrsStr = input.substring(start + 1, i).trim();
262
+ const attrs = attrsStr ? splitTopLevel(attrsStr).map(parseAttr) : [];
263
+ return { isDelete, fqName, entityQuery, attrs };
264
+ }
265
+ function patternToScript(pattern, eventNames) {
266
+ const trimmed = pattern.trim();
267
+ if (trimmed.startsWith('is('))
268
+ return trimmed;
269
+ const parsed = parseCrudPattern(trimmed);
270
+ if (!parsed)
271
+ throw new Error(`Cannot parse pattern: ${trimmed}`);
272
+ const entryName = parsed.fqName.split('/')[1];
273
+ const jsObj = parsed.attrs.map(a => `${a.name}: ${a.value}`).join(', ');
274
+ if (parsed.isDelete) {
275
+ return `result = await delete_${entryName}({${jsObj}});`;
276
+ }
277
+ if (eventNames.has(entryName)) {
278
+ return `result = await ${entryName}({${jsObj}});`;
279
+ }
280
+ if (parsed.entityQuery || parsed.attrs.every(a => a.query)) {
281
+ return `result = (await get_${entryName}({${jsObj}}))[0];`;
282
+ }
283
+ if (parsed.attrs.some(a => a.query)) {
284
+ return `result = await update_${entryName}({${jsObj}});`;
285
+ }
286
+ return `result = await create_${entryName}({${jsObj}});`;
287
+ }
288
+ export async function runPatternTests(moduleDefinition, patterns, initModule) {
289
+ const eventNames = new Set();
290
+ for (const m of moduleDefinition.matchAll(/\bevent\s+(\w+)\s*\{/g)) {
291
+ eventNames.add(m[1]);
292
+ }
293
+ const lines = ['let result;'];
294
+ for (const pat of patterns) {
295
+ lines.push(patternToScript(pat, eventNames));
296
+ }
297
+ return runTests(moduleDefinition, lines.join('\n'), initModule);
298
+ }
299
+ export async function testModule(moduleName, code, initModule) {
300
+ await initModule(moduleName, code);
301
+ const mod = fetchModule(moduleName);
302
+ const proxy = {};
303
+ for (const entityName of mod.getEntityNames()) {
304
+ const fqName = `${moduleName}/${entityName}`;
305
+ const record = mod.getEntry(entityName);
306
+ const idAttrName = record.getIdAttributeName();
307
+ proxy[`create_${entityName}`] = async (attrs, rels) => {
308
+ const pattern = buildPattern(fqName, attrs, false, moduleName, rels);
309
+ return await evalPattern(pattern);
310
+ };
311
+ proxy[`get_${entityName}`] = async (attrs, rels) => {
312
+ const pattern = buildPattern(fqName, attrs, true, moduleName, rels);
313
+ return await evalPattern(pattern);
314
+ };
315
+ proxy[`update_${entityName}`] = async (attrs, rels) => {
316
+ if (!idAttrName) {
317
+ throw new Error(`Cannot update ${fqName}: no @id attribute defined`);
318
+ }
319
+ if (!(idAttrName in attrs)) {
320
+ throw new Error(`Cannot update ${fqName}: @id attribute '${idAttrName}' not provided`);
321
+ }
322
+ const pattern = buildPattern(fqName, attrs, idAttrName, moduleName, rels);
323
+ return await evalPattern(pattern);
324
+ };
325
+ proxy[`delete_${entityName}`] = async (attrs) => {
326
+ const pattern = `delete ${buildPattern(fqName, attrs, true)}`;
327
+ return await evalPattern(pattern);
328
+ };
329
+ }
330
+ for (const eventName of mod.getEventNames()) {
331
+ if (mod.isPrePostEvent(eventName))
332
+ continue;
333
+ const fqName = `${moduleName}/${eventName}`;
334
+ proxy[eventName] = async (attrs) => {
335
+ const pattern = buildPattern(fqName, attrs);
336
+ return await evalPattern(pattern);
337
+ };
338
+ }
339
+ return proxy;
340
+ }
341
+ //# sourceMappingURL=test-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../src/test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAkB,MAAM,qBAAqB,CAAC;AAiB5E,SAAS,WAAW,CAAC,KAAU;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,GAAG,CAAC;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC/E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAc,EACd,KAAmB,EACnB,YAA8B,KAAK;IAEnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB,EAAE,IAAe;IAChE,MAAM,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9C,IAAI,OAAe,CAAC;IACpB,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,OAAO,GAAG,IAAI,MAAM,OAAO,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,0CAA0C;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,GAAG,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,IAAa;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CACnB,MAAc,EACd,KAAmB,EACnB,YAA8B,KAAK,EACnC,UAAmB,EACnB,IAAc;IAEd,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;QACvB,sDAAsD;QACtD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,GAAG,GAAG,OAAO,MAAM,QAAQ,GAAG,CAAC;IACxC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAW;IAC3B,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAQ,MAAM,CAAC,sBAAsB,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAiB,EAAE,OAAe,EAAE,EAAE;gBACrE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe;;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,mCAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,SAAkB,EAAE,OAAgB;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,kBAAkB,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxF,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,OAAO,IAAI,UAAU,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAgBD,MAAM,kBAAmB,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,eAAc,CAAC,CAAC,CAAC,WAAW,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,gBAAwB,EACxB,UAAkB,EAClB,UAA+D;;IAE/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,SAA4D,CAAC;IAEjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE,OAAO,EAAE,gEAAgE,EAAE;YACpF,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,UAAU,GAAG,CAAC,SAAkB,EAAE,OAAgB,EAAE,EAAE;YAC1D,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,kBAAkB,CAAC;gBAC9C,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACrD,MAAM,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,GAAG,YAAY,kBAAkB,CAAC,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,mCAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACvE,SAAS,GAAG;gBACV,OAAO;gBACP,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC1D,OAAO;QACL,MAAM,EAAE,CAAC,SAAS,IAAI,QAAQ,KAAK,CAAC;QACpC,KAAK,EAAE,UAAU,CAAC,MAAM;QACxB,QAAQ;QACR,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC;AAiBD,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACjD,QAAQ,GAAG,CAAC,QAAQ,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACjC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACtC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3B,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAElC,uBAAuB;IACvB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,CAAC,EAAE,CAAC;IAEjD,cAAc;IACd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,iCAAiC;IACjC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,CAAC,EAAE,CAAC;IACjD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACrB,WAAW,GAAG,IAAI,CAAC;QACnB,CAAC,EAAE,CAAC;IACN,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,CAAC,EAAE,CAAC;IACjD,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;QACzB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,UAAuB;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAEjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,yBAAyB,SAAS,KAAK,KAAK,KAAK,CAAC;IAC3D,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,kBAAkB,SAAS,KAAK,KAAK,KAAK,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,uBAAuB,SAAS,KAAK,KAAK,SAAS,CAAC;IAC7D,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,yBAAyB,SAAS,KAAK,KAAK,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,yBAAyB,SAAS,KAAK,KAAK,KAAK,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAAwB,EACxB,QAAkB,EAClB,UAA+D;IAE/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACnE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,aAAa,CAAC,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,IAAY,EACZ,UAA+D;IAE/D,MAAM,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAW,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAW,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAE/C,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,GAAG,KAAK,EAAE,KAAmB,EAAE,IAAc,EAAE,EAAE;YAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACrE,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,KAAK,CAAC,OAAO,UAAU,EAAE,CAAC,GAAG,KAAK,EAAE,KAAmB,EAAE,IAAc,EAAE,EAAE;YACzE,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACpE,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,GAAG,KAAK,EAAE,KAAmB,EAAE,IAAc,EAAE,EAAE;YAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,4BAA4B,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,oBAAoB,UAAU,gBAAgB,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1E,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,GAAG,KAAK,EAAE,KAAmB,EAAE,EAAE;YAC5D,MAAM,OAAO,GAAG,UAAU,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9D,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;QAC5C,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC;YAAE,SAAS;QAC5C,MAAM,MAAM,GAAG,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;QAE5C,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,KAAmB,EAAE,EAAE;YAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -5,10 +5,20 @@ export * from './interfaces.js';
5
5
  import { ExtendedFileSystem } from './interfaces.js';
6
6
  /**
7
7
  * Create the appropriate filesystem implementation based on environment
8
+ * Uses dynamic imports to avoid bundling Node.js-specific code in browser builds
8
9
  * @returns Promise resolving to appropriate filesystem implementation
9
10
  */
10
11
  export declare function createFS(options?: any): Promise<ExtendedFileSystem>;
11
- export { createNodeFS } from './node-fs.js';
12
- export { createLightningFS } from './lightning-fs.js';
13
12
  export * from './interfaces.js';
13
+ /**
14
+ * Create Node.js filesystem - only works in Node.js environment
15
+ * @returns Promise resolving to NodeFileSystem instance
16
+ */
17
+ export declare function createNodeFS(): Promise<ExtendedFileSystem>;
18
+ /**
19
+ * Create Lightning FS - works in browser environment
20
+ * @param options Optional configuration for Lightning FS
21
+ * @returns Promise resolving to LightningFileSystem instance
22
+ */
23
+ export declare function createLightningFS(options?: any): Promise<ExtendedFileSystem>;
14
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIrD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CASzE;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAWzE;AAGD,cAAc,iBAAiB,CAAC;AAKhC;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAMhE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAGlF"}
@@ -2,25 +2,46 @@
2
2
  * Filesystem module exports
3
3
  */
4
4
  export * from './interfaces.js';
5
- import { createNodeFS } from './node-fs.js';
6
- import { createLightningFS } from './lightning-fs.js';
7
5
  /**
8
6
  * Create the appropriate filesystem implementation based on environment
7
+ * Uses dynamic imports to avoid bundling Node.js-specific code in browser builds
9
8
  * @returns Promise resolving to appropriate filesystem implementation
10
9
  */
11
10
  export async function createFS(options) {
12
11
  // Check if we're in a browser or Node environment
13
12
  if (typeof window === 'undefined') {
14
- // Node.js environment
13
+ // Node.js environment - use dynamic import to avoid bundling in browser
14
+ const { createNodeFS } = await import('./node-fs.js');
15
15
  return createNodeFS();
16
16
  }
17
17
  else {
18
18
  // Browser environment - use Lightning FS
19
+ const { createLightningFS } = await import('./lightning-fs.js');
19
20
  return createLightningFS(options);
20
21
  }
21
22
  }
22
- // Export the specific filesystem implementations
23
- export { createNodeFS } from './node-fs.js';
24
- export { createLightningFS } from './lightning-fs.js';
23
+ // Re-export interface types (these are safe for browser)
25
24
  export * from './interfaces.js';
25
+ // Export factory functions that use dynamic imports internally
26
+ // These are async to support dynamic loading based on environment
27
+ /**
28
+ * Create Node.js filesystem - only works in Node.js environment
29
+ * @returns Promise resolving to NodeFileSystem instance
30
+ */
31
+ export async function createNodeFS() {
32
+ if (typeof window !== 'undefined') {
33
+ throw new Error('createNodeFS is only available in Node.js environment');
34
+ }
35
+ const module = await import('./node-fs.js');
36
+ return module.createNodeFS();
37
+ }
38
+ /**
39
+ * Create Lightning FS - works in browser environment
40
+ * @param options Optional configuration for Lightning FS
41
+ * @returns Promise resolving to LightningFileSystem instance
42
+ */
43
+ export async function createLightningFS(options) {
44
+ const module = await import('./lightning-fs.js');
45
+ return module.createLightningFS(options);
46
+ }
26
47
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAa;IAC1C,kDAAkD;IAClD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,sBAAsB;QACtB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/fs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAGhC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAa;IAC1C,kDAAkD;IAClD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,wEAAwE;QACxE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAChE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,cAAc,iBAAiB,CAAC;AAEhC,+DAA+D;AAC/D,kEAAkE;AAElE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAa;IACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentlang",
3
3
  "description": "The easiest way to build the most reliable AI agents - enterprise-grade teams of AI agents that collaborate with each other and humans",
4
- "version": "0.10.0",
4
+ "version": "0.10.2",
5
5
  "license": "Sustainable Use License",
6
6
  "author": "agentlang-ai",
7
7
  "homepage": "https://github.com/agentlang-ai/agentlang#readme",
@@ -52,6 +52,8 @@
52
52
  "buffer": "^6.0.3",
53
53
  "chalk": "~5.6.2",
54
54
  "commander": "~14.0.2",
55
+ "date-fns": "^4.1.0",
56
+ "date-fns-tz": "^3.2.0",
55
57
  "deep-object-diff": "^1.1.9",
56
58
  "express": "^5.2.1",
57
59
  "handlebars": "^4.7.8",
@@ -69,6 +71,7 @@
69
71
  "vscode-languageserver": "^9.0.1",
70
72
  "winston": "^3.19.0",
71
73
  "winston-daily-rotate-file": "^5.0.0",
74
+ "xlsx": "^0.18.5",
72
75
  "zod": "^4.3.6"
73
76
  },
74
77
  "overrides": {
package/src/api/http.ts CHANGED
@@ -58,6 +58,8 @@ import {
58
58
  createFileRecord,
59
59
  deleteFileRecord,
60
60
  } from '../runtime/modules/files.js';
61
+ import * as XLSX from 'xlsx';
62
+ import { objectToQueryPattern } from '../language/parser.js';
61
63
 
62
64
  export async function startServer(
63
65
  appSpec: ApplicationSpec,
@@ -197,6 +199,14 @@ export async function startServer(
197
199
  handleMetaGet(req, res);
198
200
  });
199
201
 
202
+ app.post('/agentlang/QueryAsCsv', (req: Request, res: Response) => {
203
+ handleQueryAsCsvPost(req, res);
204
+ });
205
+
206
+ app.post('/agentlang/QueryAsXlsx', (req: Request, res: Response) => {
207
+ handleQueryAsXlsxPost(req, res);
208
+ });
209
+
200
210
  if (isNodeEnv && upload && uploadDir) {
201
211
  app.post('/uploadFile', upload.single('file'), (req: Request, res: Response) => {
202
212
  handleFileUpload(req, res, config);
@@ -730,6 +740,69 @@ function normalizedResult(r: Result): Result {
730
740
  }
731
741
  }
732
742
 
743
+ /**
744
+ * Converts eval result to an array of flat row objects for CSV/XLSX.
745
+ * Handles:
746
+ * - [{ "EntityName": { "attr": "attrval" } }, ...] -> one row per item, columns = Entity + attrs
747
+ * - [{ "attr": "attrval" }, ...] -> one row per item, columns = attrs
748
+ * - [[ { "EntityName": { ... } }, ... ]] -> unwrap single outer array, then one row per inner item
749
+ */
750
+ function evalResultToRows(data: Result): { [key: string]: unknown }[] {
751
+ let items: Result[];
752
+ if (Array.isArray(data) && data.length === 1 && Array.isArray(data[0])) {
753
+ items = data[0] as Result[];
754
+ } else {
755
+ items = Array.isArray(data) ? (data as Result[]) : [data];
756
+ }
757
+ return items.map((item: Result) => {
758
+ if (item === null || typeof item !== 'object') {
759
+ return { value: item };
760
+ }
761
+ if (Array.isArray(item)) {
762
+ return { value: item };
763
+ }
764
+ const obj = item as { [key: string]: unknown };
765
+ const keys = Object.keys(obj);
766
+ if (keys.length === 1) {
767
+ const [k] = keys;
768
+ const v = obj[k];
769
+ if (
770
+ v !== null &&
771
+ typeof v === 'object' &&
772
+ !Array.isArray(v) &&
773
+ Object.prototype.toString.call(v) === '[object Object]'
774
+ ) {
775
+ return { ...(v as { [key: string]: unknown }) };
776
+ }
777
+ }
778
+ return { ...obj };
779
+ });
780
+ }
781
+
782
+ /**
783
+ * Ensures cell value is stringifiable for CSV/XLSX (nested objects/arrays become JSON string).
784
+ */
785
+ function cellValue(val: unknown): string | number | boolean | null {
786
+ if (val === null || val === undefined) return '';
787
+ if (typeof val === 'object') return JSON.stringify(val);
788
+ return val as string | number | boolean;
789
+ }
790
+
791
+ /**
792
+ * Parses column names from the first instance and returns an array-of-arrays
793
+ * for the sheet: first row = column names, following rows = data. This ensures
794
+ * CSV/XLSX output has proper headers (col1, col2, ...) not 0, 1, 2, ...
795
+ */
796
+ function rowsToSheetAoa(
797
+ rows: { [key: string]: unknown }[]
798
+ ): (string | number | boolean | null)[][] {
799
+ if (rows.length === 0) return [];
800
+ const columns = Object.keys(rows[0] as object);
801
+ const headerRow = columns;
802
+ const dataRows = rows.map(row => columns.map(col => cellValue(row[col])));
803
+ return [headerRow, ...dataRows];
804
+ }
805
+
733
806
  async function handleMetaGet(req: Request, res: Response): Promise<void> {
734
807
  try {
735
808
  const sessionInfo = await verifyAuth('', '', req.headers.authorization);
@@ -957,6 +1030,71 @@ async function handleMetaGet(req: Request, res: Response): Promise<void> {
957
1030
  }
958
1031
  }
959
1032
 
1033
+ async function handleQueryAsCsvPost(req: Request, res: Response): Promise<void> {
1034
+ try {
1035
+ const sessionInfo = await verifyAuth('', '', req.headers.authorization);
1036
+ if (isNoSession(sessionInfo)) {
1037
+ res.status(401).send('Authorization required');
1038
+ return;
1039
+ }
1040
+ const q = req.body?.q;
1041
+ if (q === undefined) {
1042
+ res.status(400).send('Missing or invalid pattern');
1043
+ return;
1044
+ }
1045
+ const qs = objectToQueryPattern(q);
1046
+ const result = await parseAndEvaluateStatement(qs, sessionInfo.userId);
1047
+ const normalized = normalizedResult(result);
1048
+ const rows = evalResultToRows(normalized);
1049
+ const aoa = rowsToSheetAoa(rows);
1050
+ const worksheet = XLSX.utils.aoa_to_sheet(aoa);
1051
+ const workbook = XLSX.utils.book_new();
1052
+ XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
1053
+ const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'csv' });
1054
+ const filename = `eval-${Date.now()}.csv`;
1055
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
1056
+ res.contentType('text/csv');
1057
+ res.send(buffer);
1058
+ } catch (err: any) {
1059
+ logger.error(err);
1060
+ if (!res.headersSent) {
1061
+ res.status(statusFromErrorType(err)).send(err?.message ?? err?.toString());
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ async function handleQueryAsXlsxPost(req: Request, res: Response): Promise<void> {
1067
+ try {
1068
+ const sessionInfo = await verifyAuth('', '', req.headers.authorization);
1069
+ if (isNoSession(sessionInfo)) {
1070
+ res.status(401).send('Authorization required');
1071
+ return;
1072
+ }
1073
+ const q = req.body?.q;
1074
+ if (q === undefined) {
1075
+ res.status(400).send('Missing or invalid pattern');
1076
+ return;
1077
+ }
1078
+ const qs = objectToQueryPattern(q);
1079
+ const result = await parseAndEvaluateStatement(qs, sessionInfo.userId);
1080
+ const normalized = normalizedResult(result);
1081
+ const rows = evalResultToRows(normalized);
1082
+ const aoa = rowsToSheetAoa(rows);
1083
+ const worksheet = XLSX.utils.aoa_to_sheet(aoa);
1084
+ const workbook = XLSX.utils.book_new();
1085
+ XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
1086
+ const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' });
1087
+ const filename = `eval-${Date.now()}.xlsx`;
1088
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
1089
+ res.contentType('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
1090
+ res.send(buffer);
1091
+ } catch (err: any) {
1092
+ logger.error(err);
1093
+ if (!res.headersSent) {
1094
+ res.status(statusFromErrorType(err)).send(err?.message ?? err?.toString());
1095
+ }
1096
+ }
1097
+ }
960
1098
  async function handleFileUpload(
961
1099
  req: Request & { file?: Express.Multer.File },
962
1100
  res: Response,