@animalabs/agent-framework 0.10.0 → 0.11.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/dist/src/agent.d.ts +1 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +58 -0
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +437 -28
- package/dist/src/framework.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +21 -5
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +5 -3
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/sync.d.ts.map +1 -1
- package/dist/src/modules/workspace/sync.js +9 -3
- package/dist/src/modules/workspace/sync.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +9 -6
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/queue.d.ts.map +1 -1
- package/dist/src/queue.js +9 -2
- package/dist/src/queue.js.map +1 -1
- package/dist/src/types/agent.d.ts +3 -1
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +7 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/busy-agent-scheduler.test.js +29 -0
- package/dist/test/busy-agent-scheduler.test.js.map +1 -1
- package/dist/test/discord-history-delete-window.test.d.ts +2 -0
- package/dist/test/discord-history-delete-window.test.d.ts.map +1 -0
- package/dist/test/discord-history-delete-window.test.js +81 -0
- package/dist/test/discord-history-delete-window.test.js.map +1 -0
- package/dist/test/discord-history-sync.test.d.ts +2 -0
- package/dist/test/discord-history-sync.test.d.ts.map +1 -0
- package/dist/test/discord-history-sync.test.js +56 -0
- package/dist/test/discord-history-sync.test.js.map +1 -0
- package/dist/test/explicit-prose-routing.test.js +42 -0
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/framework.test.js +33 -0
- package/dist/test/framework.test.js.map +1 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +2 -0
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +1 -0
- package/dist/test/provider-acceleration-cooldown.test.js +286 -0
- package/dist/test/provider-acceleration-cooldown.test.js.map +1 -0
- package/dist/test/puppet-tool-call.test.d.ts +2 -0
- package/dist/test/puppet-tool-call.test.d.ts.map +1 -0
- package/dist/test/puppet-tool-call.test.js +106 -0
- package/dist/test/puppet-tool-call.test.js.map +1 -0
- package/dist/test/release-changelog.test.d.ts +2 -0
- package/dist/test/release-changelog.test.d.ts.map +1 -0
- package/dist/test/release-changelog.test.js +159 -0
- package/dist/test/release-changelog.test.js.map +1 -0
- package/dist/test/workspace-path-containment.test.d.ts +19 -0
- package/dist/test/workspace-path-containment.test.d.ts.map +1 -0
- package/dist/test/workspace-path-containment.test.js +91 -0
- package/dist/test/workspace-path-containment.test.js.map +1 -0
- package/dist/test/workspace-watcher.test.js +15 -3
- package/dist/test/workspace-watcher.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/agent.ts +1 -1
- package/src/framework.ts +467 -27
- package/src/modules/discord/index.ts +24 -6
- package/src/modules/workspace/index.ts +5 -3
- package/src/modules/workspace/sync.ts +9 -3
- package/src/modules/workspace/watcher.ts +9 -6
- package/src/queue.ts +8 -2
- package/src/types/agent.ts +3 -1
- package/src/types/trace.ts +13 -0
- package/dist/test/fixtures/awareness-barrier-mcpl-server.mjs +0 -276
- package/dist/test/fixtures/flaky-mcpl-server.mjs +0 -41
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { AgentFramework } from '../src/framework.js';
|
|
4
|
+
function puppetHarness(opts) {
|
|
5
|
+
const stored = [];
|
|
6
|
+
const traces = [];
|
|
7
|
+
const executed = [];
|
|
8
|
+
const status = opts?.status ?? 'idle';
|
|
9
|
+
const surface = opts?.surface ?? ['mcpl--eido--look'];
|
|
10
|
+
// Real MCPL results are MCP content arrays — the helper renders them plain.
|
|
11
|
+
const result = opts?.result ?? {
|
|
12
|
+
success: true,
|
|
13
|
+
data: [{ type: 'text', text: 'You are "p" in world "w".' }],
|
|
14
|
+
isError: false,
|
|
15
|
+
};
|
|
16
|
+
const agent = {
|
|
17
|
+
name: 'princess',
|
|
18
|
+
state: { status },
|
|
19
|
+
canUseTool: (name) => surface.includes(name),
|
|
20
|
+
getContextManager: () => ({
|
|
21
|
+
addMessage: (participant, content) => {
|
|
22
|
+
stored.push({ participant, content });
|
|
23
|
+
return `msg-${stored.length}`;
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
const framework = Object.create(AgentFramework.prototype);
|
|
28
|
+
framework.agents =
|
|
29
|
+
new Map([['princess', agent]]);
|
|
30
|
+
framework.getToolsForAgent =
|
|
31
|
+
() => surface.map((name) => ({ name }));
|
|
32
|
+
framework.executeToolCall =
|
|
33
|
+
async (call) => {
|
|
34
|
+
executed.push(call);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
framework.resolveToolResultInlineCap =
|
|
38
|
+
() => ({ cap: undefined });
|
|
39
|
+
framework.emitTrace =
|
|
40
|
+
(e) => { traces.push(e); };
|
|
41
|
+
return { framework, stored, traces, executed };
|
|
42
|
+
}
|
|
43
|
+
test('puppetToolCall executes with agent provenance and stores the pair', async () => {
|
|
44
|
+
const { framework, stored, traces, executed } = puppetHarness();
|
|
45
|
+
const quiet = console.log;
|
|
46
|
+
console.log = () => { };
|
|
47
|
+
try {
|
|
48
|
+
const { toolUseId, result } = await framework.puppetToolCall('princess', 'mcpl--eido--look', {});
|
|
49
|
+
assert.match(toolUseId, /^toolu_01[A-Za-z0-9]{22}$/, 'anthropic-shaped id');
|
|
50
|
+
assert.equal(result.success, true);
|
|
51
|
+
assert.equal(executed.length, 1);
|
|
52
|
+
assert.equal(executed[0].callerAgentName, 'princess', 'executes AS the agent');
|
|
53
|
+
assert.equal(executed[0].id, toolUseId, 'wire call carries the stored id');
|
|
54
|
+
assert.equal(stored.length, 2, 'exactly the pair, nothing else');
|
|
55
|
+
const [use, res] = stored;
|
|
56
|
+
assert.equal(use.participant, 'princess', 'tool_use is the agent turn');
|
|
57
|
+
assert.equal(use.content.length, 1, 'bare tool_use — no fabricated text/thinking');
|
|
58
|
+
assert.equal(use.content[0].type, 'tool_use');
|
|
59
|
+
assert.equal(use.content[0].id, toolUseId);
|
|
60
|
+
assert.equal(res.participant, 'user', 'tool_result rides a user message');
|
|
61
|
+
assert.equal(res.content[0].type, 'tool_result');
|
|
62
|
+
assert.equal(res.content[0].toolUseId, toolUseId, 'result pairs with the call');
|
|
63
|
+
assert.equal(res.content[0].toolName, 'mcpl--eido--look');
|
|
64
|
+
assert.equal(res.content[0].isError, false);
|
|
65
|
+
assert.match(String(res.content[0].content), /You are "p"/, 'real result text stored');
|
|
66
|
+
assert.equal(traces.length, 1);
|
|
67
|
+
assert.equal(traces[0].type, 'puppet:tool-call');
|
|
68
|
+
assert.equal(traces[0].agentName, 'princess');
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
console.log = quiet;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
test('puppetToolCall refuses a non-idle agent', async () => {
|
|
75
|
+
const { framework, stored } = puppetHarness({ status: 'streaming' });
|
|
76
|
+
await assert.rejects(() => framework.puppetToolCall('princess', 'mcpl--eido--look', {}), /requires idle/);
|
|
77
|
+
assert.equal(stored.length, 0, 'nothing stored on refusal');
|
|
78
|
+
});
|
|
79
|
+
test('puppetToolCall refuses a tool off the agent surface', async () => {
|
|
80
|
+
const { framework, stored, executed } = puppetHarness();
|
|
81
|
+
await assert.rejects(() => framework.puppetToolCall('princess', 'mcpl--other--nuke', {}), /not on princess's surface/);
|
|
82
|
+
assert.equal(executed.length, 0, 'never executed');
|
|
83
|
+
assert.equal(stored.length, 0, 'nothing stored');
|
|
84
|
+
});
|
|
85
|
+
test('puppetToolCall refuses an unknown agent', async () => {
|
|
86
|
+
const { framework } = puppetHarness();
|
|
87
|
+
await assert.rejects(() => framework.puppetToolCall('ghost', 'mcpl--eido--look', {}), /Unknown agent/);
|
|
88
|
+
});
|
|
89
|
+
test('puppetToolCall stores an error result as isError, still paired', async () => {
|
|
90
|
+
const { framework, stored } = puppetHarness({
|
|
91
|
+
result: { success: false, error: 'MCPL server unreachable', isError: true },
|
|
92
|
+
});
|
|
93
|
+
const quiet = console.log;
|
|
94
|
+
console.log = () => { };
|
|
95
|
+
try {
|
|
96
|
+
const { result } = await framework.puppetToolCall('princess', 'mcpl--eido--look', {});
|
|
97
|
+
assert.equal(result.isError, true);
|
|
98
|
+
assert.equal(stored.length, 2, 'error results are stored too — same as a real turn');
|
|
99
|
+
assert.equal(stored[1].content[0].isError, true);
|
|
100
|
+
assert.match(String(stored[1].content[0].content), /unreachable/);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
console.log = quiet;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=puppet-tool-call.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppet-tool-call.test.js","sourceRoot":"","sources":["../../test/puppet-tool-call.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-changelog.test.d.ts","sourceRoot":"","sources":["../../test/release-changelog.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Black-box coverage of scripts/release-changelog.mjs: each case runs the
|
|
2
|
+
// real script in a throwaway directory, so assembly, validation, and the
|
|
3
|
+
// deletion of consumed fragments are all exercised exactly as `npm version`
|
|
4
|
+
// would run them.
|
|
5
|
+
import { test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
import { mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
const SCRIPT = fileURLToPath(new URL("../../scripts/release-changelog.mjs", import.meta.url));
|
|
13
|
+
const BASE_CHANGELOG = [
|
|
14
|
+
"# Changelog",
|
|
15
|
+
"",
|
|
16
|
+
"Intro that mentions ## Unreleased inline, which must not count as a heading.",
|
|
17
|
+
"",
|
|
18
|
+
"## Unreleased",
|
|
19
|
+
"",
|
|
20
|
+
"## 1.0.0 — 2026-01-01",
|
|
21
|
+
"",
|
|
22
|
+
"### Fixed",
|
|
23
|
+
"",
|
|
24
|
+
"- Old entry.",
|
|
25
|
+
"",
|
|
26
|
+
].join("\n");
|
|
27
|
+
function setup(f) {
|
|
28
|
+
const dir = mkdtempSync(join(tmpdir(), "release-changelog-"));
|
|
29
|
+
writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "fixture", version: f.version ?? "1.1.0" }));
|
|
30
|
+
writeFileSync(join(dir, "CHANGELOG.md"), f.changelog ?? BASE_CHANGELOG);
|
|
31
|
+
mkdirSync(join(dir, "changelog.d"));
|
|
32
|
+
writeFileSync(join(dir, "changelog.d", "README.md"), "# Pending fragments\n");
|
|
33
|
+
for (const [name, body] of Object.entries(f.fragments ?? {})) {
|
|
34
|
+
const path = join(dir, "changelog.d", name);
|
|
35
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
36
|
+
writeFileSync(path, body);
|
|
37
|
+
}
|
|
38
|
+
return dir;
|
|
39
|
+
}
|
|
40
|
+
function run(dir) {
|
|
41
|
+
try {
|
|
42
|
+
const stdout = execFileSync(process.execPath, [SCRIPT], {
|
|
43
|
+
cwd: dir,
|
|
44
|
+
encoding: "utf8",
|
|
45
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
46
|
+
});
|
|
47
|
+
return { status: 0, stdout, stderr: "" };
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
const err = e;
|
|
51
|
+
return { status: err.status, stdout: err.stdout ?? "", stderr: err.stderr ?? "" };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function section(text, version) {
|
|
55
|
+
const lines = text.split("\n");
|
|
56
|
+
const start = lines.findIndex((l) => l.startsWith(`## ${version} — `));
|
|
57
|
+
assert.notEqual(start, -1, `no '## ${version}' section in:\n${text}`);
|
|
58
|
+
const rest = lines.slice(start + 1);
|
|
59
|
+
const end = rest.findIndex((l) => l.startsWith("## "));
|
|
60
|
+
return rest.slice(0, end === -1 ? undefined : end).join("\n").trim();
|
|
61
|
+
}
|
|
62
|
+
const changelog = (dir) => readFileSync(join(dir, "CHANGELOG.md"), "utf8");
|
|
63
|
+
const pending = (dir) => readdirSync(join(dir, "changelog.d")).sort();
|
|
64
|
+
test("folds fragments into a versioned section in canonical order and deletes them", () => {
|
|
65
|
+
const dir = setup({
|
|
66
|
+
fragments: {
|
|
67
|
+
"z-later.fixed.md": "- Fixed thing.\n",
|
|
68
|
+
"a-first.added.md": "- Added thing,\n continued on an indented line.\n",
|
|
69
|
+
"m.breaking.md": "- **Module authors:** breaking thing.\n",
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
const r = run(dir);
|
|
73
|
+
assert.equal(r.status, 0, r.stderr);
|
|
74
|
+
const text = changelog(dir);
|
|
75
|
+
assert.equal(section(text, "1.1.0"), [
|
|
76
|
+
"### Breaking",
|
|
77
|
+
"",
|
|
78
|
+
"- **Module authors:** breaking thing.",
|
|
79
|
+
"",
|
|
80
|
+
"### Added",
|
|
81
|
+
"",
|
|
82
|
+
"- Added thing,",
|
|
83
|
+
" continued on an indented line.",
|
|
84
|
+
"",
|
|
85
|
+
"### Fixed",
|
|
86
|
+
"",
|
|
87
|
+
"- Fixed thing.",
|
|
88
|
+
].join("\n"));
|
|
89
|
+
assert.match(text, /^## Unreleased\n\n## 1\.1\.0 — \d{4}-\d{2}-\d{2}\n/m, "fresh empty Unreleased above the cut");
|
|
90
|
+
assert.ok(text.startsWith("# Changelog\n\nIntro that mentions"), "file header preserved");
|
|
91
|
+
assert.equal(section(text, "1.0.0"), "### Fixed\n\n- Old entry.", "older section untouched");
|
|
92
|
+
assert.deepEqual(pending(dir), ["README.md"], "consumed fragments deleted, README kept");
|
|
93
|
+
});
|
|
94
|
+
test("merges fragments into directly-filed Unreleased entries, reordering subsections canonically", () => {
|
|
95
|
+
const dir = setup({
|
|
96
|
+
changelog: BASE_CHANGELOG.replace("## Unreleased\n", "## Unreleased\n\n### Fixed\n\n- Manual fix.\n\n### Added\n\n- Manual add.\n"),
|
|
97
|
+
fragments: { "x.fixed.md": "- Fragment fix.\n" },
|
|
98
|
+
});
|
|
99
|
+
const r = run(dir);
|
|
100
|
+
assert.equal(r.status, 0, r.stderr);
|
|
101
|
+
assert.equal(section(changelog(dir), "1.1.0"), "### Added\n\n- Manual add.\n\n### Fixed\n\n- Manual fix.\n\n- Fragment fix.");
|
|
102
|
+
});
|
|
103
|
+
test("breaking fragments join an audience-qualified Breaking heading", () => {
|
|
104
|
+
const dir = setup({
|
|
105
|
+
changelog: BASE_CHANGELOG.replace("## Unreleased\n", "## Unreleased\n\n### Fixed\n\n- Manual fix.\n\n### Breaking (module authors only)\n\n- Manual break.\n"),
|
|
106
|
+
fragments: { "b.breaking.md": "- Fragment break.\n" },
|
|
107
|
+
});
|
|
108
|
+
const r = run(dir);
|
|
109
|
+
assert.equal(r.status, 0, r.stderr);
|
|
110
|
+
assert.equal(section(changelog(dir), "1.1.0"), "### Breaking (module authors only)\n\n- Manual break.\n\n- Fragment break.\n\n### Fixed\n\n- Manual fix.");
|
|
111
|
+
});
|
|
112
|
+
test("accepts nested bullets and multi-line continuations", () => {
|
|
113
|
+
const dir = setup({
|
|
114
|
+
fragments: { "n.fixed.md": "- one\n - nested\n more text\n- two\n" },
|
|
115
|
+
});
|
|
116
|
+
const r = run(dir);
|
|
117
|
+
assert.equal(r.status, 0, r.stderr);
|
|
118
|
+
assert.equal(section(changelog(dir), "1.1.0"), "### Fixed\n\n- one\n - nested\n more text\n- two");
|
|
119
|
+
});
|
|
120
|
+
test("accepts bullet content that merely resembles headings or rules", () => {
|
|
121
|
+
const body = "- **Module authors:** bold opener.\n- -1 is now the sentinel.\n- #123 is referenced inline.\n- ***emphasis*** then text.\n";
|
|
122
|
+
const dir = setup({ fragments: { "r.fixed.md": body } });
|
|
123
|
+
const r = run(dir);
|
|
124
|
+
assert.equal(r.status, 0, r.stderr);
|
|
125
|
+
assert.equal(section(changelog(dir), "1.1.0"), `### Fixed\n\n${body.trim()}`);
|
|
126
|
+
});
|
|
127
|
+
const refusals = [
|
|
128
|
+
["nothing to release", {}, /nothing to release as 1\.1\.0/],
|
|
129
|
+
["duplicate version section", { version: "1.0.0", fragments: { "a.fixed.md": "- x\n" } }, /'## 1\.0\.0' section already exists/],
|
|
130
|
+
["unrecognized category suffix", { fragments: { "oops.md": "- x\n" } }, /changelog\.d\/oops\.md: unrecognized file/],
|
|
131
|
+
["stray non-markdown file", { fragments: { "notes.txt": "hi\n", "a.fixed.md": "- x\n" } }, /changelog\.d\/notes\.txt: unrecognized file/],
|
|
132
|
+
["empty fragment", { fragments: { "e.fixed.md": "\n" } }, /changelog\.d\/e\.fixed\.md: empty fragment/],
|
|
133
|
+
["fragment nested under a branch-name directory", { fragments: { "fix/foo.fixed.md": "- x\n", "a.fixed.md": "- y\n" } }, /changelog\.d\/fix: not a file/],
|
|
134
|
+
["plain prose", { fragments: { "p.fixed.md": "prose only\n" } }, /offending line: 'prose only'/],
|
|
135
|
+
["prose after a valid bullet", { fragments: { "p.fixed.md": "- ok\nrogue prose\n" } }, /offending line: 'rogue prose'/],
|
|
136
|
+
["top-level heading after a bullet", { fragments: { "h.fixed.md": "- ok\n\n## 9.9.9 — fake\n" } }, /offending line: '## 9\.9\.9 — fake'/],
|
|
137
|
+
["indented ATX heading", { fragments: { "h.fixed.md": "- ok\n ## 8.8.8 — injected\n - beneath\n" } }, /offending line: ' ## 8\.8\.8 — injected'/],
|
|
138
|
+
["indented setext underline / rule", { fragments: { "s.fixed.md": "- ok\n ---\n" } }, /offending line: ' ---'/],
|
|
139
|
+
["spaced thematic break shaped like a bullet", { fragments: { "s.fixed.md": "- ok\n- - -\n" } }, /offending line: '- - -'/],
|
|
140
|
+
["asterisk thematic break with spaces", { fragments: { "s.fixed.md": "- ok\n* * *\n" } }, /offending line: '\* \* \*'/],
|
|
141
|
+
["rule as bullet content", { fragments: { "s.fixed.md": "- ---\n" } }, /offending line: '- ---'/],
|
|
142
|
+
["heading as bullet content", { fragments: { "h.fixed.md": "- ## 9.9.9 — embedded heading\n" } }, /offending line: '- ## 9\.9\.9 — embedded heading'/],
|
|
143
|
+
["heading as nested bullet content", { fragments: { "h.fixed.md": "- ok\n - ### nested heading\n" } }, /offending line: ' - ### nested heading'/],
|
|
144
|
+
["tab-indented continuation", { fragments: { "t.fixed.md": "- ok\n\tcontinued\n" } }, /offending line: '\tcontinued'/],
|
|
145
|
+
["no Unreleased heading", { changelog: "# Changelog\n\n## 1.0.0 — 2026-01-01\n\n- x\n", fragments: { "a.fixed.md": "- x\n" } }, /no '## Unreleased' section/],
|
|
146
|
+
["two Unreleased headings", { changelog: BASE_CHANGELOG + "\n## Unreleased\n\n- stranded\n", fragments: { "a.fixed.md": "- x\n" } }, /2 '## Unreleased' headings/],
|
|
147
|
+
];
|
|
148
|
+
for (const [name, fixture, message] of refusals) {
|
|
149
|
+
test(`refuses ${name} without touching anything`, () => {
|
|
150
|
+
const dir = setup(fixture);
|
|
151
|
+
const before = { changelog: changelog(dir), pending: pending(dir) };
|
|
152
|
+
const r = run(dir);
|
|
153
|
+
assert.equal(r.status, 1, `expected refusal, got exit ${r.status}:\n${r.stdout}${r.stderr}`);
|
|
154
|
+
assert.match(r.stderr, message);
|
|
155
|
+
assert.equal(changelog(dir), before.changelog, "CHANGELOG.md must be untouched");
|
|
156
|
+
assert.deepEqual(pending(dir), before.pending, "no fragment may be deleted on refusal");
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=release-changelog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-changelog.test.js","sourceRoot":"","sources":["../../test/release-changelog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount containment on Windows (path-separator regression).
|
|
3
|
+
*
|
|
4
|
+
* The mount boundary checks (parsePath traversal guard, sync's safePath)
|
|
5
|
+
* appended a POSIX '/' to the mount root before prefix-matching, but
|
|
6
|
+
* node's resolve() emits backslash-separated paths on Windows — so the
|
|
7
|
+
* prefix never matched and EVERY legitimate in-mount path was rejected:
|
|
8
|
+
* read/write threw "Path traversal detected" and syncFromFs reported every
|
|
9
|
+
* real file as outside its mount. ls was unaffected (tree listing takes a
|
|
10
|
+
* different path), which made a populated mount look empty-but-haunted.
|
|
11
|
+
*
|
|
12
|
+
* These tests drive the public tool surface over a real tmpdir mount, so
|
|
13
|
+
* they exercise the platform's actual separators: on Windows they fail
|
|
14
|
+
* against the unfixed guards; on POSIX the fix is a no-op and they pin
|
|
15
|
+
* the behavior either way. The traversal rejection itself is asserted
|
|
16
|
+
* too — the fix must not widen the boundary.
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=workspace-path-containment.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path-containment.test.d.ts","sourceRoot":"","sources":["../../test/workspace-path-containment.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount containment on Windows (path-separator regression).
|
|
3
|
+
*
|
|
4
|
+
* The mount boundary checks (parsePath traversal guard, sync's safePath)
|
|
5
|
+
* appended a POSIX '/' to the mount root before prefix-matching, but
|
|
6
|
+
* node's resolve() emits backslash-separated paths on Windows — so the
|
|
7
|
+
* prefix never matched and EVERY legitimate in-mount path was rejected:
|
|
8
|
+
* read/write threw "Path traversal detected" and syncFromFs reported every
|
|
9
|
+
* real file as outside its mount. ls was unaffected (tree listing takes a
|
|
10
|
+
* different path), which made a populated mount look empty-but-haunted.
|
|
11
|
+
*
|
|
12
|
+
* These tests drive the public tool surface over a real tmpdir mount, so
|
|
13
|
+
* they exercise the platform's actual separators: on Windows they fail
|
|
14
|
+
* against the unfixed guards; on POSIX the fix is a no-op and they pin
|
|
15
|
+
* the behavior either way. The traversal rejection itself is asserted
|
|
16
|
+
* too — the fix must not widen the boundary.
|
|
17
|
+
*/
|
|
18
|
+
import test from 'node:test';
|
|
19
|
+
import assert from 'node:assert/strict';
|
|
20
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
21
|
+
import { tmpdir } from 'node:os';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { JsStore } from '@animalabs/chronicle';
|
|
24
|
+
import { WorkspaceModule } from '../src/modules/workspace/index.js';
|
|
25
|
+
function makeWorkspace(t) {
|
|
26
|
+
const root = mkdtempSync(join(tmpdir(), 'af-path-containment-'));
|
|
27
|
+
const mountDir = join(root, 'mount');
|
|
28
|
+
mkdirSync(mountDir, { recursive: true });
|
|
29
|
+
const store = JsStore.openOrCreate({ path: join(root, 'workspace.chronicle') });
|
|
30
|
+
const workspace = new WorkspaceModule({
|
|
31
|
+
mounts: [{ name: 'work', path: mountDir, mode: 'read-write', watch: 'never' }],
|
|
32
|
+
});
|
|
33
|
+
workspace.initStore(store);
|
|
34
|
+
t.after(() => {
|
|
35
|
+
store.close();
|
|
36
|
+
rmSync(root, { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
return { mountDir, workspace };
|
|
39
|
+
}
|
|
40
|
+
function call(workspace, name, input) {
|
|
41
|
+
return workspace.handleToolCall({ id: `call-${name}`, name, input });
|
|
42
|
+
}
|
|
43
|
+
function resultText(result) {
|
|
44
|
+
return typeof result.data === 'string' ? result.data : JSON.stringify(result.data ?? '');
|
|
45
|
+
}
|
|
46
|
+
test('sync + read reach a real file inside the mount', async (t) => {
|
|
47
|
+
const { mountDir, workspace } = makeWorkspace(t);
|
|
48
|
+
writeFileSync(join(mountDir, 'hello.txt'), 'hola desde el mount\n');
|
|
49
|
+
const sync = await call(workspace, 'sync', { mount: 'work' });
|
|
50
|
+
assert.equal(sync.success, true, `sync should succeed: ${sync.error ?? ''}`);
|
|
51
|
+
assert.ok(!resultText(sync).includes('outside'), 'sync must not report an in-mount file as outside the mount');
|
|
52
|
+
const read = await call(workspace, 'read', { path: 'work/hello.txt' });
|
|
53
|
+
assert.equal(read.success, true, `read should succeed: ${read.error ?? ''}`);
|
|
54
|
+
assert.ok(resultText(read).includes('hola desde el mount'), 'read returns the file content');
|
|
55
|
+
});
|
|
56
|
+
test('write lands inside the mount', async (t) => {
|
|
57
|
+
const { workspace } = makeWorkspace(t);
|
|
58
|
+
const write = await call(workspace, 'write', { path: 'work/out.txt', content: 'producto' });
|
|
59
|
+
assert.equal(write.success, true, `write should succeed: ${write.error ?? ''}`);
|
|
60
|
+
const read = await call(workspace, 'read', { path: 'work/out.txt' });
|
|
61
|
+
assert.equal(read.success, true);
|
|
62
|
+
assert.ok(resultText(read).includes('producto'));
|
|
63
|
+
});
|
|
64
|
+
test('nested files sync and read under /-separated logical paths', async (t) => {
|
|
65
|
+
const { mountDir, workspace } = makeWorkspace(t);
|
|
66
|
+
mkdirSync(join(mountDir, 'sub', 'deep'), { recursive: true });
|
|
67
|
+
writeFileSync(join(mountDir, 'sub', 'deep', 'nested.txt'), 'anidado\n');
|
|
68
|
+
const sync = await call(workspace, 'sync', { mount: 'work' });
|
|
69
|
+
assert.equal(sync.success, true, `sync should succeed: ${sync.error ?? ''}`);
|
|
70
|
+
// Logical workspace paths are '/'-separated everywhere — the walker must
|
|
71
|
+
// not leak platform separators into tree paths (relative() emits
|
|
72
|
+
// backslashes on Windows).
|
|
73
|
+
const ls = await call(workspace, 'ls', { path: 'work', recursive: true });
|
|
74
|
+
assert.equal(ls.success, true);
|
|
75
|
+
const listing = resultText(ls);
|
|
76
|
+
assert.ok(listing.includes('sub/deep/nested.txt'), `listing should use '/' paths, got: ${listing.slice(0, 300)}`);
|
|
77
|
+
assert.ok(!listing.includes('sub\\deep'), 'listing must not contain backslash-separated paths');
|
|
78
|
+
const read = await call(workspace, 'read', { path: 'work/sub/deep/nested.txt' });
|
|
79
|
+
assert.equal(read.success, true, `nested read should succeed: ${read.error ?? ''}`);
|
|
80
|
+
assert.ok(resultText(read).includes('anidado'));
|
|
81
|
+
});
|
|
82
|
+
test('traversal outside the mount is still rejected', async (t) => {
|
|
83
|
+
const { workspace } = makeWorkspace(t);
|
|
84
|
+
const read = await call(workspace, 'read', { path: 'work/../escape.txt' });
|
|
85
|
+
assert.equal(read.success, false, 'escaping read must be rejected');
|
|
86
|
+
assert.match(read.error ?? '', /traversal/i);
|
|
87
|
+
const write = await call(workspace, 'write', { path: 'work/../../evil.txt', content: 'nope' });
|
|
88
|
+
assert.equal(write.success, false, 'escaping write must be rejected');
|
|
89
|
+
assert.match(write.error ?? '', /traversal/i);
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=workspace-path-containment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-path-containment.test.js","sourceRoot":"","sources":["../../test/workspace-path-containment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -159,7 +159,13 @@ describe('MountWatcher lifecycle', () => {
|
|
|
159
159
|
assert.ok(!existsSync(roPath), 'read-only mount must not mkdir -p behind the user\'s back');
|
|
160
160
|
await watcher.stop();
|
|
161
161
|
});
|
|
162
|
-
|
|
162
|
+
// Root-liveness re-attach cases are authoritative on Linux (written around
|
|
163
|
+
// inode-reuse semantics there). Under Node 24 on macOS the native watcher
|
|
164
|
+
// delivers a different event stream — root not recreated, duplicate
|
|
165
|
+
// reattach, read-only root re-attached — tracked in #130.
|
|
166
|
+
it('read-write mount recreates a deleted root and re-attaches', {
|
|
167
|
+
skip: process.platform !== 'linux',
|
|
168
|
+
}, async () => {
|
|
163
169
|
let readyCount = 0;
|
|
164
170
|
let reattachCount = 0;
|
|
165
171
|
const { watcher } = collectWithNative({
|
|
@@ -204,7 +210,10 @@ describe('MountWatcher lifecycle', () => {
|
|
|
204
210
|
await watcher.stop();
|
|
205
211
|
}
|
|
206
212
|
});
|
|
207
|
-
|
|
213
|
+
// Linux-only for the same reason as above (#130).
|
|
214
|
+
it('fires onReattach exactly once for one remove and recreate cycle', {
|
|
215
|
+
skip: process.platform !== 'linux',
|
|
216
|
+
}, async () => {
|
|
208
217
|
let readyCount = 0;
|
|
209
218
|
let reattachCount = 0;
|
|
210
219
|
const { watcher } = collectWithNative({
|
|
@@ -246,7 +255,10 @@ describe('MountWatcher lifecycle', () => {
|
|
|
246
255
|
await watcher.stop();
|
|
247
256
|
}
|
|
248
257
|
});
|
|
249
|
-
|
|
258
|
+
// Linux-only for the same reason as above (#130).
|
|
259
|
+
it('keeps a deleted read-only root detached and stops cleanly', {
|
|
260
|
+
skip: process.platform !== 'linux',
|
|
261
|
+
}, async () => {
|
|
250
262
|
let ready = false;
|
|
251
263
|
let reattachCount = 0;
|
|
252
264
|
const watcher = new MountWatcher({ ...makeConfig(), mode: 'read-only' }, () => { }, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-watcher.test.js","sourceRoot":"","sources":["../../test/workspace-watcher.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-watcher.test.js","sourceRoot":"","sources":["../../test/workspace-watcher.test.ts"],"names":[],"mappings":"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"}
|