@animalabs/agent-framework 0.14.0 ā 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -1
- package/dist/src/agent.d.ts +42 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +94 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/server.d.ts +9 -0
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +156 -0
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +15 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/framework.d.ts +423 -5
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1906 -102
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +16 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +41 -3
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +172 -0
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +444 -2
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +9 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +71 -13
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +145 -0
- package/dist/src/modules/history/index.d.ts.map +1 -0
- package/dist/src/modules/history/index.js +1150 -0
- package/dist/src/modules/history/index.js.map +1 -0
- package/dist/src/modules/history/search-regex-worker.d.ts +23 -0
- package/dist/src/modules/history/search-regex-worker.d.ts.map +1 -0
- package/dist/src/modules/history/search-regex-worker.js +57 -0
- package/dist/src/modules/history/search-regex-worker.js.map +1 -0
- package/dist/src/modules/index.d.ts +1 -0
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -0
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +42 -1
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +5 -0
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/operator-log.d.ts +78 -0
- package/dist/src/operator-log.d.ts.map +1 -0
- package/dist/src/operator-log.js +102 -0
- package/dist/src/operator-log.js.map +1 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.js +20 -0
- package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
- package/dist/src/types/framework.d.ts +24 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +40 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.js +199 -1
- package/dist/test/agent-runtime-settings.test.js.map +1 -1
- package/dist/test/api-admin-gate.test.d.ts +2 -0
- package/dist/test/api-admin-gate.test.d.ts.map +1 -0
- package/dist/test/api-admin-gate.test.js +116 -0
- package/dist/test/api-admin-gate.test.js.map +1 -0
- package/dist/test/channel-label-history.test.d.ts +2 -0
- package/dist/test/channel-label-history.test.d.ts.map +1 -0
- package/dist/test/channel-label-history.test.js +424 -0
- package/dist/test/channel-label-history.test.js.map +1 -0
- package/dist/test/discord-awareness-outbox.test.js +16 -0
- package/dist/test/discord-awareness-outbox.test.js.map +1 -1
- package/dist/test/event-gate.test.js +44 -0
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
- package/dist/test/helpers/quiesce-crash-child.js +156 -0
- package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
- package/dist/test/history-module-overview.test.d.ts +2 -0
- package/dist/test/history-module-overview.test.d.ts.map +1 -0
- package/dist/test/history-module-overview.test.js +711 -0
- package/dist/test/history-module-overview.test.js.map +1 -0
- package/dist/test/history-module.test.d.ts +2 -0
- package/dist/test/history-module.test.d.ts.map +1 -0
- package/dist/test/history-module.test.js +595 -0
- package/dist/test/history-module.test.js.map +1 -0
- package/dist/test/host-quiesce.test.d.ts +2 -0
- package/dist/test/host-quiesce.test.d.ts.map +1 -0
- package/dist/test/host-quiesce.test.js +863 -0
- package/dist/test/host-quiesce.test.js.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +2 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.js +189 -0
- package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -0
- package/dist/test/kv-unified-wiring.test.js +39 -0
- package/dist/test/kv-unified-wiring.test.js.map +1 -1
- package/dist/test/operator-surgery.test.d.ts +2 -0
- package/dist/test/operator-surgery.test.d.ts.map +1 -0
- package/dist/test/operator-surgery.test.js +398 -0
- package/dist/test/operator-surgery.test.js.map +1 -0
- package/dist/test/puppet-tool-call.test.js +118 -1
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +2 -0
- package/dist/test/puppet-turn-reservation.test.d.ts.map +1 -0
- package/dist/test/puppet-turn-reservation.test.js +139 -0
- package/dist/test/puppet-turn-reservation.test.js.map +1 -0
- package/dist/test/save-recent-image.test.js +29 -0
- package/dist/test/save-recent-image.test.js.map +1 -1
- package/dist/test/tool-result-spill.test.js +114 -0
- package/dist/test/tool-result-spill.test.js.map +1 -1
- package/dist/test/workspace-read-text.test.d.ts +2 -0
- package/dist/test/workspace-read-text.test.d.ts.map +1 -0
- package/dist/test/workspace-read-text.test.js +101 -0
- package/dist/test/workspace-read-text.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +110 -0
- package/src/api/server.ts +159 -2
- package/src/api/types.ts +15 -0
- package/src/framework.ts +2196 -115
- package/src/gate/event-gate.ts +47 -4
- package/src/index.ts +5 -1
- package/src/mcpl/channel-registry.ts +495 -2
- package/src/mcpl/server-connection.ts +73 -13
- package/src/modules/history/index.ts +1277 -0
- package/src/modules/history/search-regex-worker.ts +76 -0
- package/src/modules/index.ts +2 -0
- package/src/modules/workspace/index.ts +42 -1
- package/src/modules/workspace/types.ts +5 -0
- package/src/operator-log.ts +132 -0
- package/src/recovery/discord-awareness-outbox.ts +19 -0
- package/src/types/framework.ts +27 -0
- package/src/types/trace.ts +46 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { JsStore } from '@animalabs/chronicle';
|
|
7
|
+
import { WorkspaceModule } from '../src/modules/workspace/index.js';
|
|
8
|
+
async function setup(t, content) {
|
|
9
|
+
const root = mkdtempSync(join(tmpdir(), 'workspace-read-text-'));
|
|
10
|
+
const store = JsStore.openOrCreate({ path: join(root, 'store') });
|
|
11
|
+
const workspace = new WorkspaceModule({
|
|
12
|
+
mounts: [{ name: 'work', path: root, mode: 'read-write', watch: 'never' }],
|
|
13
|
+
});
|
|
14
|
+
workspace.initStore(store);
|
|
15
|
+
t.after(() => { store.close(); rmSync(root, { recursive: true, force: true }); });
|
|
16
|
+
assert.equal((await workspace.writeBinary('work/text.txt', Buffer.from(content), 'text/plain')).success, true);
|
|
17
|
+
const read = (input = {}) => workspace.handleToolCall({
|
|
18
|
+
id: 'read', name: 'read', input: { path: 'work/text.txt', ...input },
|
|
19
|
+
});
|
|
20
|
+
return { workspace, read };
|
|
21
|
+
}
|
|
22
|
+
test('line reads retain numbering, ranges, and the 2000-line default', async (t) => {
|
|
23
|
+
const { read } = await setup(t, Array.from({ length: 2005 }, (_, i) => `line ${i + 1}`).join('\n'));
|
|
24
|
+
const result = await read({ offset: 2, limit: 2 });
|
|
25
|
+
assert.deepEqual(result.data, {
|
|
26
|
+
path: 'work/text.txt', totalLines: 2005, fromLine: 2, toLine: 3,
|
|
27
|
+
note: 'Truncated at 2 lines (file has 2005). Use offset/limit to read more.',
|
|
28
|
+
content: ' 2\tline 2\n 3\tline 3',
|
|
29
|
+
});
|
|
30
|
+
const defaults = (await read()).data;
|
|
31
|
+
assert.equal(defaults.toLine, 2000);
|
|
32
|
+
assert.equal(defaults.content.split('\n').length, 2000);
|
|
33
|
+
});
|
|
34
|
+
test('character mode can be selected by either parameter and reports EOF', async (t) => {
|
|
35
|
+
const { read } = await setup(t, 'a'.repeat(3000));
|
|
36
|
+
assert.deepEqual((await read({ offsetChars: 0 })).data, {
|
|
37
|
+
path: 'work/text.txt', totalChars: 3000, offsetChars: 0, nextOffsetChars: 2000, content: 'a'.repeat(2000),
|
|
38
|
+
});
|
|
39
|
+
assert.equal((await read({ limitChars: 3 })).data.content, 'aaa');
|
|
40
|
+
assert.deepEqual((await read({ offsetChars: 2999, limitChars: 10 })).data, {
|
|
41
|
+
path: 'work/text.txt', totalChars: 3000, offsetChars: 2999, nextOffsetChars: null, content: 'a',
|
|
42
|
+
});
|
|
43
|
+
for (const offsetChars of [3000, 4000, Number.MAX_SAFE_INTEGER]) {
|
|
44
|
+
assert.deepEqual((await read({ offsetChars })).data, {
|
|
45
|
+
path: 'work/text.txt', totalChars: 3000, offsetChars: 3000, nextOffsetChars: null, content: '',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
test('character pages preserve Unicode and raw newlines, even with limitChars 1', async (t) => {
|
|
50
|
+
const body = 'ša\r\nš·e\u0301ēµ';
|
|
51
|
+
const { read } = await setup(t, body);
|
|
52
|
+
let offsetChars = 0;
|
|
53
|
+
let recovered = '';
|
|
54
|
+
do {
|
|
55
|
+
const result = await read({ offsetChars, limitChars: 1 });
|
|
56
|
+
assert.equal(result.success, true);
|
|
57
|
+
const page = result.data;
|
|
58
|
+
assert.ok(page.content.length >= 1 && page.content.length <= 2);
|
|
59
|
+
assert.equal(Buffer.from(page.content).toString(), page.content, 'UTF-8 transport cannot replace half a pair');
|
|
60
|
+
recovered += page.content;
|
|
61
|
+
if (page.nextOffsetChars === null)
|
|
62
|
+
break;
|
|
63
|
+
assert.ok(page.nextOffsetChars > offsetChars);
|
|
64
|
+
offsetChars = page.nextOffsetChars;
|
|
65
|
+
} while (true);
|
|
66
|
+
assert.equal(recovered, body);
|
|
67
|
+
const invalid = await read({ offsetChars: 1 });
|
|
68
|
+
assert.equal(invalid.success, false);
|
|
69
|
+
assert.match(invalid.error, /surrogate pair/);
|
|
70
|
+
});
|
|
71
|
+
test('empty text returns an empty final character page', async (t) => {
|
|
72
|
+
const { read } = await setup(t, '');
|
|
73
|
+
assert.deepEqual((await read({ offsetChars: 0 })).data, {
|
|
74
|
+
path: 'work/text.txt', totalChars: 0, offsetChars: 0, nextOffsetChars: null, content: '',
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
test('character paging rejects invalid numbers and ambiguous line/character inputs', async (t) => {
|
|
78
|
+
const { read } = await setup(t, 'hello');
|
|
79
|
+
for (const input of [
|
|
80
|
+
{ offsetChars: -1 }, { offsetChars: 0.5 }, { offsetChars: NaN }, { offsetChars: Infinity },
|
|
81
|
+
{ offsetChars: Number.MAX_SAFE_INTEGER + 1 }, { offsetChars: '0' }, { offsetChars: null },
|
|
82
|
+
{ limitChars: 0 }, { limitChars: -1 }, { limitChars: 0.5 }, { limitChars: NaN },
|
|
83
|
+
{ limitChars: Infinity }, { limitChars: Number.MAX_SAFE_INTEGER + 1 },
|
|
84
|
+
{ limitChars: '2' }, { limitChars: null },
|
|
85
|
+
{ offset: 1, offsetChars: 0 }, { limit: 2, limitChars: 1 },
|
|
86
|
+
{ offset: 1, limitChars: 1 }, { limit: 2, offsetChars: 0 },
|
|
87
|
+
]) {
|
|
88
|
+
const result = await read(input);
|
|
89
|
+
assert.equal(result.success, false, JSON.stringify(input));
|
|
90
|
+
assert.equal(result.isError, true);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
test('character reads use the same mount containment and missing-file checks', async (t) => {
|
|
94
|
+
const { read } = await setup(t, 'hello');
|
|
95
|
+
for (const path of ['work/../escape', 'unknown/file', 'work/missing']) {
|
|
96
|
+
const result = await read({ path, offsetChars: 0 });
|
|
97
|
+
assert.equal(result.success, false, path);
|
|
98
|
+
assert.equal(result.isError, true);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=workspace-read-text.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-read-text.test.js","sourceRoot":"","sources":["../../test/workspace-read-text.test.ts"],"names":[],"mappings":"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"}
|