@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.
Files changed (134) hide show
  1. package/README.md +22 -1
  2. package/dist/src/agent.d.ts +42 -0
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +94 -0
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/server.d.ts +9 -0
  7. package/dist/src/api/server.d.ts.map +1 -1
  8. package/dist/src/api/server.js +156 -0
  9. package/dist/src/api/server.js.map +1 -1
  10. package/dist/src/api/types.d.ts +15 -0
  11. package/dist/src/api/types.d.ts.map +1 -1
  12. package/dist/src/framework.d.ts +423 -5
  13. package/dist/src/framework.d.ts.map +1 -1
  14. package/dist/src/framework.js +1906 -102
  15. package/dist/src/framework.js.map +1 -1
  16. package/dist/src/gate/event-gate.d.ts +16 -0
  17. package/dist/src/gate/event-gate.d.ts.map +1 -1
  18. package/dist/src/gate/event-gate.js +41 -3
  19. package/dist/src/gate/event-gate.js.map +1 -1
  20. package/dist/src/index.d.ts +4 -1
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +3 -1
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/mcpl/channel-registry.d.ts +172 -0
  25. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  26. package/dist/src/mcpl/channel-registry.js +444 -2
  27. package/dist/src/mcpl/channel-registry.js.map +1 -1
  28. package/dist/src/mcpl/server-connection.d.ts +9 -0
  29. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  30. package/dist/src/mcpl/server-connection.js +71 -13
  31. package/dist/src/mcpl/server-connection.js.map +1 -1
  32. package/dist/src/modules/history/index.d.ts +145 -0
  33. package/dist/src/modules/history/index.d.ts.map +1 -0
  34. package/dist/src/modules/history/index.js +1150 -0
  35. package/dist/src/modules/history/index.js.map +1 -0
  36. package/dist/src/modules/history/search-regex-worker.d.ts +23 -0
  37. package/dist/src/modules/history/search-regex-worker.d.ts.map +1 -0
  38. package/dist/src/modules/history/search-regex-worker.js +57 -0
  39. package/dist/src/modules/history/search-regex-worker.js.map +1 -0
  40. package/dist/src/modules/index.d.ts +1 -0
  41. package/dist/src/modules/index.d.ts.map +1 -1
  42. package/dist/src/modules/index.js +1 -0
  43. package/dist/src/modules/index.js.map +1 -1
  44. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  45. package/dist/src/modules/workspace/index.js +42 -1
  46. package/dist/src/modules/workspace/index.js.map +1 -1
  47. package/dist/src/modules/workspace/types.d.ts +5 -0
  48. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  49. package/dist/src/modules/workspace/types.js.map +1 -1
  50. package/dist/src/operator-log.d.ts +78 -0
  51. package/dist/src/operator-log.d.ts.map +1 -0
  52. package/dist/src/operator-log.js +102 -0
  53. package/dist/src/operator-log.js.map +1 -0
  54. package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
  55. package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
  56. package/dist/src/recovery/discord-awareness-outbox.js +20 -0
  57. package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
  58. package/dist/src/types/framework.d.ts +24 -0
  59. package/dist/src/types/framework.d.ts.map +1 -1
  60. package/dist/src/types/trace.d.ts +40 -0
  61. package/dist/src/types/trace.d.ts.map +1 -1
  62. package/dist/test/agent-runtime-settings.test.js +199 -1
  63. package/dist/test/agent-runtime-settings.test.js.map +1 -1
  64. package/dist/test/api-admin-gate.test.d.ts +2 -0
  65. package/dist/test/api-admin-gate.test.d.ts.map +1 -0
  66. package/dist/test/api-admin-gate.test.js +116 -0
  67. package/dist/test/api-admin-gate.test.js.map +1 -0
  68. package/dist/test/channel-label-history.test.d.ts +2 -0
  69. package/dist/test/channel-label-history.test.d.ts.map +1 -0
  70. package/dist/test/channel-label-history.test.js +424 -0
  71. package/dist/test/channel-label-history.test.js.map +1 -0
  72. package/dist/test/discord-awareness-outbox.test.js +16 -0
  73. package/dist/test/discord-awareness-outbox.test.js.map +1 -1
  74. package/dist/test/event-gate.test.js +44 -0
  75. package/dist/test/event-gate.test.js.map +1 -1
  76. package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
  77. package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
  78. package/dist/test/helpers/quiesce-crash-child.js +156 -0
  79. package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
  80. package/dist/test/history-module-overview.test.d.ts +2 -0
  81. package/dist/test/history-module-overview.test.d.ts.map +1 -0
  82. package/dist/test/history-module-overview.test.js +711 -0
  83. package/dist/test/history-module-overview.test.js.map +1 -0
  84. package/dist/test/history-module.test.d.ts +2 -0
  85. package/dist/test/history-module.test.d.ts.map +1 -0
  86. package/dist/test/history-module.test.js +595 -0
  87. package/dist/test/history-module.test.js.map +1 -0
  88. package/dist/test/host-quiesce.test.d.ts +2 -0
  89. package/dist/test/host-quiesce.test.d.ts.map +1 -0
  90. package/dist/test/host-quiesce.test.js +863 -0
  91. package/dist/test/host-quiesce.test.js.map +1 -0
  92. package/dist/test/kv-unified-open-flight-retry.test.d.ts +2 -0
  93. package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +1 -0
  94. package/dist/test/kv-unified-open-flight-retry.test.js +189 -0
  95. package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -0
  96. package/dist/test/kv-unified-wiring.test.js +39 -0
  97. package/dist/test/kv-unified-wiring.test.js.map +1 -1
  98. package/dist/test/operator-surgery.test.d.ts +2 -0
  99. package/dist/test/operator-surgery.test.d.ts.map +1 -0
  100. package/dist/test/operator-surgery.test.js +398 -0
  101. package/dist/test/operator-surgery.test.js.map +1 -0
  102. package/dist/test/puppet-tool-call.test.js +118 -1
  103. package/dist/test/puppet-tool-call.test.js.map +1 -1
  104. package/dist/test/puppet-turn-reservation.test.d.ts +2 -0
  105. package/dist/test/puppet-turn-reservation.test.d.ts.map +1 -0
  106. package/dist/test/puppet-turn-reservation.test.js +139 -0
  107. package/dist/test/puppet-turn-reservation.test.js.map +1 -0
  108. package/dist/test/save-recent-image.test.js +29 -0
  109. package/dist/test/save-recent-image.test.js.map +1 -1
  110. package/dist/test/tool-result-spill.test.js +114 -0
  111. package/dist/test/tool-result-spill.test.js.map +1 -1
  112. package/dist/test/workspace-read-text.test.d.ts +2 -0
  113. package/dist/test/workspace-read-text.test.d.ts.map +1 -0
  114. package/dist/test/workspace-read-text.test.js +101 -0
  115. package/dist/test/workspace-read-text.test.js.map +1 -0
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +3 -3
  118. package/src/agent.ts +110 -0
  119. package/src/api/server.ts +159 -2
  120. package/src/api/types.ts +15 -0
  121. package/src/framework.ts +2196 -115
  122. package/src/gate/event-gate.ts +47 -4
  123. package/src/index.ts +5 -1
  124. package/src/mcpl/channel-registry.ts +495 -2
  125. package/src/mcpl/server-connection.ts +73 -13
  126. package/src/modules/history/index.ts +1277 -0
  127. package/src/modules/history/search-regex-worker.ts +76 -0
  128. package/src/modules/index.ts +2 -0
  129. package/src/modules/workspace/index.ts +42 -1
  130. package/src/modules/workspace/types.ts +5 -0
  131. package/src/operator-log.ts +132 -0
  132. package/src/recovery/discord-awareness-outbox.ts +19 -0
  133. package/src/types/framework.ts +27 -0
  134. 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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"}