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.
- package/out/api/http.d.ts.map +1 -1
- package/out/api/http.js +136 -0
- package/out/api/http.js.map +1 -1
- package/out/language/generated/ast.d.ts +87 -44
- package/out/language/generated/ast.d.ts.map +1 -1
- package/out/language/generated/ast.js +65 -31
- package/out/language/generated/ast.js.map +1 -1
- package/out/language/generated/grammar.d.ts.map +1 -1
- package/out/language/generated/grammar.js +337 -330
- package/out/language/generated/grammar.js.map +1 -1
- package/out/language/main.cjs +396 -361
- package/out/language/main.cjs.map +2 -2
- package/out/language/parser.d.ts +11 -1
- package/out/language/parser.d.ts.map +1 -1
- package/out/language/parser.js +74 -8
- package/out/language/parser.js.map +1 -1
- package/out/language/syntax.d.ts +14 -0
- package/out/language/syntax.d.ts.map +1 -1
- package/out/language/syntax.js +60 -27
- package/out/language/syntax.js.map +1 -1
- package/out/runtime/agents/common.d.ts +2 -2
- package/out/runtime/agents/common.js +1 -1
- package/out/runtime/api.d.ts +2 -0
- package/out/runtime/api.d.ts.map +1 -1
- package/out/runtime/api.js +3 -0
- package/out/runtime/api.js.map +1 -1
- package/out/runtime/datefns.d.ts +34 -0
- package/out/runtime/datefns.d.ts.map +1 -0
- package/out/runtime/datefns.js +82 -0
- package/out/runtime/datefns.js.map +1 -0
- package/out/runtime/exec-graph.d.ts.map +1 -1
- package/out/runtime/exec-graph.js +22 -3
- package/out/runtime/exec-graph.js.map +1 -1
- package/out/runtime/interpreter.d.ts +9 -0
- package/out/runtime/interpreter.d.ts.map +1 -1
- package/out/runtime/interpreter.js +85 -20
- package/out/runtime/interpreter.js.map +1 -1
- package/out/runtime/module.d.ts +8 -0
- package/out/runtime/module.d.ts.map +1 -1
- package/out/runtime/module.js +23 -0
- package/out/runtime/module.js.map +1 -1
- package/out/runtime/modules/ai.d.ts +9 -8
- package/out/runtime/modules/ai.d.ts.map +1 -1
- package/out/runtime/modules/ai.js +92 -37
- package/out/runtime/modules/ai.js.map +1 -1
- package/out/runtime/modules/core.d.ts.map +1 -1
- package/out/runtime/modules/core.js +5 -1
- package/out/runtime/modules/core.js.map +1 -1
- package/out/runtime/monitor.d.ts +6 -0
- package/out/runtime/monitor.d.ts.map +1 -1
- package/out/runtime/monitor.js +21 -1
- package/out/runtime/monitor.js.map +1 -1
- package/out/runtime/relgraph.d.ts.map +1 -1
- package/out/runtime/relgraph.js +7 -3
- package/out/runtime/relgraph.js.map +1 -1
- package/out/runtime/resolvers/interface.d.ts +3 -2
- package/out/runtime/resolvers/interface.d.ts.map +1 -1
- package/out/runtime/resolvers/interface.js +3 -2
- package/out/runtime/resolvers/interface.js.map +1 -1
- package/out/runtime/resolvers/sqldb/dbutil.d.ts.map +1 -1
- package/out/runtime/resolvers/sqldb/dbutil.js +17 -4
- package/out/runtime/resolvers/sqldb/dbutil.js.map +1 -1
- package/out/runtime/resolvers/sqldb/impl.d.ts +1 -1
- package/out/runtime/resolvers/sqldb/impl.d.ts.map +1 -1
- package/out/runtime/resolvers/sqldb/impl.js +17 -7
- package/out/runtime/resolvers/sqldb/impl.js.map +1 -1
- package/out/runtime/services/documentFetcher.js +2 -2
- package/out/runtime/services/documentFetcher.js.map +1 -1
- package/out/runtime/util.d.ts +12 -1
- package/out/runtime/util.d.ts.map +1 -1
- package/out/runtime/util.js +38 -2
- package/out/runtime/util.js.map +1 -1
- package/out/syntaxes/agentlang.monarch.js +1 -1
- package/out/syntaxes/agentlang.monarch.js.map +1 -1
- package/out/test-harness.d.ts +36 -0
- package/out/test-harness.d.ts.map +1 -0
- package/out/test-harness.js +341 -0
- package/out/test-harness.js.map +1 -0
- package/out/utils/fs/index.d.ts +12 -2
- package/out/utils/fs/index.d.ts.map +1 -1
- package/out/utils/fs/index.js +27 -6
- package/out/utils/fs/index.js.map +1 -1
- package/package.json +4 -1
- package/src/api/http.ts +138 -0
- package/src/language/agentlang.langium +9 -10
- package/src/language/generated/ast.ts +98 -44
- package/src/language/generated/grammar.ts +337 -330
- package/src/language/parser.ts +87 -6
- package/src/language/syntax.ts +71 -24
- package/src/runtime/agents/common.ts +1 -1
- package/src/runtime/api.ts +5 -0
- package/src/runtime/datefns.ts +112 -0
- package/src/runtime/exec-graph.ts +23 -2
- package/src/runtime/interpreter.ts +107 -19
- package/src/runtime/module.ts +26 -0
- package/src/runtime/modules/ai.ts +110 -54
- package/src/runtime/modules/core.ts +5 -1
- package/src/runtime/monitor.ts +27 -1
- package/src/runtime/relgraph.ts +7 -3
- package/src/runtime/resolvers/interface.ts +4 -2
- package/src/runtime/resolvers/sqldb/dbutil.ts +20 -6
- package/src/runtime/resolvers/sqldb/impl.ts +17 -7
- package/src/runtime/services/documentFetcher.ts +2 -2
- package/src/runtime/util.ts +62 -2
- package/src/syntaxes/agentlang.monarch.ts +1 -1
- package/src/test-harness.ts +423 -0
- 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":"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"}
|
package/out/utils/fs/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/out/utils/fs/index.js
CHANGED
|
@@ -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
|
-
//
|
|
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;
|
|
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.
|
|
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,
|