@nookplot/runtime 0.5.110 → 0.5.114

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 (70) hide show
  1. package/dist/__tests__/autonomous.doomLoop.test.d.ts +2 -0
  2. package/dist/__tests__/autonomous.doomLoop.test.d.ts.map +1 -0
  3. package/dist/__tests__/autonomous.doomLoop.test.js +126 -0
  4. package/dist/__tests__/autonomous.doomLoop.test.js.map +1 -0
  5. package/dist/__tests__/autonomous.getAvailableActions.test.js +41 -0
  6. package/dist/__tests__/autonomous.getAvailableActions.test.js.map +1 -1
  7. package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts +2 -0
  8. package/dist/__tests__/autonomous.loadedSkillRefs.test.d.ts.map +1 -0
  9. package/dist/__tests__/autonomous.loadedSkillRefs.test.js +150 -0
  10. package/dist/__tests__/autonomous.loadedSkillRefs.test.js.map +1 -0
  11. package/dist/__tests__/codegen-drift.test.d.ts +23 -0
  12. package/dist/__tests__/codegen-drift.test.d.ts.map +1 -0
  13. package/dist/__tests__/codegen-drift.test.js +185 -0
  14. package/dist/__tests__/codegen-drift.test.js.map +1 -0
  15. package/dist/__tests__/doomLoop.test.d.ts +6 -0
  16. package/dist/__tests__/doomLoop.test.d.ts.map +1 -0
  17. package/dist/__tests__/doomLoop.test.js +144 -0
  18. package/dist/__tests__/doomLoop.test.js.map +1 -0
  19. package/dist/__tests__/goalLoop.test.js +111 -0
  20. package/dist/__tests__/goalLoop.test.js.map +1 -1
  21. package/dist/__tests__/hooks.test.js +4 -0
  22. package/dist/__tests__/hooks.test.js.map +1 -1
  23. package/dist/__tests__/onChainActions.parity.test.d.ts +12 -0
  24. package/dist/__tests__/onChainActions.parity.test.d.ts.map +1 -0
  25. package/dist/__tests__/onChainActions.parity.test.js +104 -0
  26. package/dist/__tests__/onChainActions.parity.test.js.map +1 -0
  27. package/dist/__tests__/presetLoader.test.js +42 -42
  28. package/dist/__tests__/sandbox.test.js +24 -24
  29. package/dist/__tests__/signing.test.d.ts +2 -0
  30. package/dist/__tests__/signing.test.d.ts.map +1 -0
  31. package/dist/__tests__/signing.test.js +260 -0
  32. package/dist/__tests__/signing.test.js.map +1 -0
  33. package/dist/actionCatalog.generated.d.ts +1 -1
  34. package/dist/actionCatalog.generated.d.ts.map +1 -1
  35. package/dist/actionCatalog.generated.js +97 -22
  36. package/dist/actionCatalog.generated.js.map +1 -1
  37. package/dist/actionCatalog.js +1 -1
  38. package/dist/actionCatalog.js.map +1 -1
  39. package/dist/autonomous.d.ts +11 -0
  40. package/dist/autonomous.d.ts.map +1 -1
  41. package/dist/autonomous.js +93 -0
  42. package/dist/autonomous.js.map +1 -1
  43. package/dist/conversation/modelLimits.js +17 -17
  44. package/dist/doomLoop.d.ts +52 -0
  45. package/dist/doomLoop.d.ts.map +1 -0
  46. package/dist/doomLoop.js +173 -0
  47. package/dist/doomLoop.js.map +1 -0
  48. package/dist/goal/goalLoop.d.ts +3 -0
  49. package/dist/goal/goalLoop.d.ts.map +1 -1
  50. package/dist/goal/goalLoop.js +30 -1
  51. package/dist/goal/goalLoop.js.map +1 -1
  52. package/dist/goal/goalPrompts.js +27 -27
  53. package/dist/hooks.d.ts +10 -0
  54. package/dist/hooks.d.ts.map +1 -1
  55. package/dist/hooks.js.map +1 -1
  56. package/dist/signalActionMap.d.ts +13 -1
  57. package/dist/signalActionMap.d.ts.map +1 -1
  58. package/dist/signalActionMap.js +25 -2
  59. package/dist/signalActionMap.js.map +1 -1
  60. package/dist/signing.js +2 -2
  61. package/dist/signing.js.map +1 -1
  62. package/package.json +60 -60
  63. package/dist/__tests__/lineage.test.d.ts +0 -2
  64. package/dist/__tests__/lineage.test.d.ts.map +0 -1
  65. package/dist/__tests__/lineage.test.js +0 -131
  66. package/dist/__tests__/lineage.test.js.map +0 -1
  67. package/dist/lineage.d.ts +0 -69
  68. package/dist/lineage.d.ts.map +0 -1
  69. package/dist/lineage.js +0 -72
  70. package/dist/lineage.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autonomous.doomLoop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous.doomLoop.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/autonomous.doomLoop.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Integration tests — AutonomousAgent doom-loop detector. Mirrors the goal-loop
3
+ * detector wiring in `runtime/src/goal/goalLoop.ts`. Three identical actions
4
+ * (or A,B,A,B cycles) accumulate triggers; on the 3rd trigger the cycle
5
+ * aborts and fires `doom_loop_detected` + `action_error`.
6
+ */
7
+ import { describe, it, expect, vi, beforeEach } from "vitest";
8
+ import { createMockRuntime } from "./helpers/mockRuntime.js";
9
+ import { AutonomousAgent } from "../autonomous.js";
10
+ import { hooks as moduleHooks } from "../hooks.js";
11
+ vi.mock("../signing.js", () => ({
12
+ prepareSignRelay: vi.fn().mockResolvedValue({ txHash: "0xRELAY_TX" }),
13
+ signForwardRequest: vi.fn().mockResolvedValue("0xSIGNATURE"),
14
+ }));
15
+ let runtime;
16
+ let callbacks;
17
+ let agent;
18
+ let requestMock;
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ moduleHooks.clear();
22
+ const mock = createMockRuntime();
23
+ runtime = mock.runtime;
24
+ callbacks = mock.callbacks;
25
+ runtime.hooks = moduleHooks;
26
+ requestMock = runtime.connection.request;
27
+ requestMock.mockImplementation(async (method, path) => {
28
+ if (method === "POST" && path === "/v1/actions/execute") {
29
+ return { status: "completed", result: { success: true } };
30
+ }
31
+ return { success: true };
32
+ });
33
+ agent = new AutonomousAgent(runtime, { verbose: false });
34
+ agent.start();
35
+ });
36
+ async function dispatch(actionType, payload = {}, actionId) {
37
+ callbacks.actionCb({ agentId: "agent_1", actionType, payload, actionId });
38
+ await new Promise((r) => setTimeout(r, 25));
39
+ }
40
+ describe("AutonomousAgent × doom-loop detector", () => {
41
+ it("3 identical actions trigger the detector", async () => {
42
+ const events = [];
43
+ moduleHooks.register("doom_loop_detected", (p) => {
44
+ events.push({ offender: p.offender, triggers: p.triggers });
45
+ });
46
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
47
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
48
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
49
+ expect(events.length).toBeGreaterThanOrEqual(1);
50
+ expect(events[0].offender).toBe("send_dm");
51
+ expect(events[0].triggers).toBe(1);
52
+ });
53
+ it("2 identical actions do NOT trigger the detector", async () => {
54
+ const events = [];
55
+ moduleHooks.register("doom_loop_detected", (p) => { events.push(p); });
56
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
57
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
58
+ expect(events).toHaveLength(0);
59
+ });
60
+ it("A,B,A,B pattern triggers the detector", async () => {
61
+ const events = [];
62
+ moduleHooks.register("doom_loop_detected", (p) => {
63
+ events.push({ offender: p.offender, triggers: p.triggers });
64
+ });
65
+ await dispatch("send_dm", { to: "0xA" });
66
+ await dispatch("vote", { postCid: "QmA" });
67
+ await dispatch("send_dm", { to: "0xA" });
68
+ await dispatch("vote", { postCid: "QmA" });
69
+ expect(events.length).toBeGreaterThanOrEqual(1);
70
+ expect(["send_dm", "vote"]).toContain(events[0].offender);
71
+ });
72
+ it("A,B,A pattern does NOT trigger (needs 2 full reps)", async () => {
73
+ const events = [];
74
+ moduleHooks.register("doom_loop_detected", (p) => { events.push(p); });
75
+ await dispatch("send_dm", { to: "0xA" });
76
+ await dispatch("vote", { postCid: "QmA" });
77
+ await dispatch("send_dm", { to: "0xA" });
78
+ expect(events).toHaveLength(0);
79
+ });
80
+ it("3 triggers in one lifetime aborts the cycle (action_error, no action_end)", async () => {
81
+ const triggerEvents = [];
82
+ const endEvents = [];
83
+ const errorEvents = [];
84
+ moduleHooks.register("doom_loop_detected", (p) => {
85
+ triggerEvents.push({ offender: p.offender, triggers: p.triggers });
86
+ });
87
+ moduleHooks.register("action_end", (p) => { endEvents.push(p.actionType); });
88
+ moduleHooks.register("action_error", (p) => { errorEvents.push({ actionType: p.actionType }); });
89
+ // Five identical calls — first 2 don't trigger (need 3 in a row), then
90
+ // every subsequent identical call trips the detector. After the 3rd
91
+ // trigger, the cycle aborts before reaching the dispatcher.
92
+ for (let i = 0; i < 5; i++) {
93
+ await dispatch("send_dm", { to: "0xA", content: "hi" });
94
+ }
95
+ expect(triggerEvents.length).toBeGreaterThanOrEqual(3);
96
+ // The last trigger event recorded a `triggers` count of 3 — at which
97
+ // point handle aborted instead of running the dispatch.
98
+ const lastTrigger = triggerEvents[triggerEvents.length - 1];
99
+ expect(lastTrigger.triggers).toBe(3);
100
+ // At least one action_error fired with the doom-loop reason.
101
+ expect(errorEvents.length).toBeGreaterThanOrEqual(1);
102
+ });
103
+ it("rejects the delegated action when triggers reach the abort threshold", async () => {
104
+ const rejectMock = runtime.proactive.rejectDelegatedAction;
105
+ rejectMock.mockResolvedValue(undefined);
106
+ for (let i = 0; i < 5; i++) {
107
+ await dispatch("send_dm", { to: "0xA", content: "hi" }, `act_${i}`);
108
+ }
109
+ // Once triggers reach 3 the agent calls reject_delegated_action with the
110
+ // corrective prompt as the reason.
111
+ expect(rejectMock).toHaveBeenCalled();
112
+ const lastCall = rejectMock.mock.calls[rejectMock.mock.calls.length - 1];
113
+ expect(lastCall[1]).toContain("Doom loop detected on 'send_dm'");
114
+ });
115
+ it("non-repeating actions never trigger the detector", async () => {
116
+ const events = [];
117
+ moduleHooks.register("doom_loop_detected", (p) => { events.push(p); });
118
+ await dispatch("send_dm", { to: "0xA" });
119
+ await dispatch("vote", { postCid: "QmA" });
120
+ await dispatch("attest", { subject: "0xB" });
121
+ await dispatch("post", { body: "gm" });
122
+ await dispatch("follow", { target: "0xC" });
123
+ expect(events).toHaveLength(0);
124
+ });
125
+ });
126
+ //# sourceMappingURL=autonomous.doomLoop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous.doomLoop.test.js","sourceRoot":"","sources":["../../src/__tests__/autonomous.doomLoop.test.ts"],"names":[],"mappings":"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"}
@@ -190,5 +190,46 @@ describe("getAvailableActions", () => {
190
190
  expect(actions.length).toBeGreaterThanOrEqual(CORE_ACTIONS.length);
191
191
  }
192
192
  });
193
+ it("CORE_ACTIONS includes search_skills + load_skill (universal)", () => {
194
+ expect(CORE_ACTIONS).toContain("search_skills");
195
+ expect(CORE_ACTIONS).toContain("load_skill");
196
+ expect(getAvailableActions("totally_unknown_signal")).toContain("search_skills");
197
+ expect(getAvailableActions("totally_unknown_signal")).toContain("load_skill");
198
+ });
199
+ describe("progressive disclosure flag", () => {
200
+ it("flag off (default): signal-context tools present", () => {
201
+ delete process.env.NOOKPLOT_PROGRESSIVE_DISCLOSURE;
202
+ const actions = getAvailableActions("agreement_created");
203
+ const ctxActions = SIGNAL_CONTEXT_ACTIONS["agreement_created"] ?? [];
204
+ for (const a of ctxActions)
205
+ expect(actions).toContain(a);
206
+ });
207
+ it("flag on: only CORE_ACTIONS regardless of signal/loadedCategories", () => {
208
+ process.env.NOOKPLOT_PROGRESSIVE_DISCLOSURE = "1";
209
+ try {
210
+ const actions = getAvailableActions("agreement_created", new Set(["projects"]));
211
+ expect(new Set(actions)).toEqual(new Set(CORE_ACTIONS));
212
+ const ctxActions = SIGNAL_CONTEXT_ACTIONS["agreement_created"] ?? [];
213
+ for (const a of ctxActions) {
214
+ if (!CORE_ACTIONS.includes(a)) {
215
+ expect(actions).not.toContain(a);
216
+ }
217
+ }
218
+ }
219
+ finally {
220
+ delete process.env.NOOKPLOT_PROGRESSIVE_DISCLOSURE;
221
+ }
222
+ });
223
+ it("flag accepts 'true' as well as '1'", () => {
224
+ process.env.NOOKPLOT_PROGRESSIVE_DISCLOSURE = "true";
225
+ try {
226
+ const actions = getAvailableActions("agreement_created");
227
+ expect(new Set(actions)).toEqual(new Set(CORE_ACTIONS));
228
+ }
229
+ finally {
230
+ delete process.env.NOOKPLOT_PROGRESSIVE_DISCLOSURE;
231
+ }
232
+ });
233
+ });
193
234
  });
194
235
  //# sourceMappingURL=autonomous.getAvailableActions.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autonomous.getAvailableActions.test.js","sourceRoot":"","sources":["../../src/__tests__/autonomous.getAvailableActions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autonomous.getAvailableActions.test.js","sourceRoot":"","sources":["../../src/__tests__/autonomous.getAvailableActions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autonomous.loadedSkillRefs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous.loadedSkillRefs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/autonomous.loadedSkillRefs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * SRA Phase 4b — loadedSkillRefs capture + flush.
3
+ *
4
+ * The runtime SDK records every nookplot_load_skill call's canonical_ref +
5
+ * kind, then flushes the buffer into the payload of the next
6
+ * submit_reasoning_trace / submit_subtask_trace call. This is the producer
7
+ * side that lets the gateway's intersection logic write trace_id onto the
8
+ * agent's recent skill_utility_signals rows. Without this, the utility
9
+ * prior reads zero rows and every candidate gets the cold-start prior 0.4.
10
+ */
11
+ import { describe, it, expect, vi, beforeEach } from "vitest";
12
+ import { createMockRuntime } from "./helpers/mockRuntime.js";
13
+ import { AutonomousAgent } from "../autonomous.js";
14
+ vi.mock("../signing.js", () => ({
15
+ prepareSignRelay: vi.fn().mockResolvedValue({ txHash: "0xRELAY_TX" }),
16
+ signForwardRequest: vi.fn().mockResolvedValue("0xSIGNATURE"),
17
+ }));
18
+ let runtime;
19
+ let callbacks;
20
+ let agent;
21
+ let requestMock;
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ const mock = createMockRuntime();
25
+ runtime = mock.runtime;
26
+ callbacks = mock.callbacks;
27
+ requestMock = runtime.connection.request;
28
+ requestMock.mockImplementation(async (method, path, body) => {
29
+ if (method === "POST" && path === "/v1/actions/execute") {
30
+ const { toolName } = (body ?? {});
31
+ if (toolName === "nookplot_load_skill") {
32
+ // Echo a load result with canonical_ref — payload's `kind` arg drives kind.
33
+ return {
34
+ status: "completed",
35
+ result: {
36
+ kind: "community",
37
+ canonical_ref: "abc-123-uuid",
38
+ content: "skill content",
39
+ },
40
+ };
41
+ }
42
+ return { status: "completed", result: { id: "submission_xyz" } };
43
+ }
44
+ return { success: true };
45
+ });
46
+ agent = new AutonomousAgent(runtime, { verbose: false });
47
+ agent.start();
48
+ });
49
+ async function dispatchAction(actionType, payload) {
50
+ callbacks.actionCb({ agentId: "agent_1", actionType, payload });
51
+ await new Promise((r) => setTimeout(r, 20));
52
+ }
53
+ function getDispatchedPayload(callIndex) {
54
+ const call = requestMock.mock.calls[callIndex];
55
+ return (call[2].payload) ?? {};
56
+ }
57
+ describe("SRA loadedSkillRefs capture + flush", () => {
58
+ it("captures canonical_ref from load_skill result and flushes on submit_reasoning_trace", async () => {
59
+ await dispatchAction("load_skill", { name: "mining", kind: "community" });
60
+ await dispatchAction("submit_reasoning_trace", {
61
+ challengeId: "ch_1",
62
+ traceCid: "Qm...",
63
+ traceHash: "abc",
64
+ });
65
+ const submitPayload = getDispatchedPayload(1);
66
+ expect(submitPayload.loadedSkillRefs).toEqual(["community:abc-123-uuid"]);
67
+ });
68
+ it("flushes multiple loaded skills as `${kind}:${ref}` array", async () => {
69
+ // First load — community kind, ref X.
70
+ requestMock.mockImplementationOnce(async () => ({
71
+ status: "completed",
72
+ result: { kind: "community", canonical_ref: "uuid-A" },
73
+ }));
74
+ await dispatchAction("load_skill", { name: "mining", kind: "community" });
75
+ // Second load — mcp_tool kind, ref Y.
76
+ requestMock.mockImplementationOnce(async () => ({
77
+ status: "completed",
78
+ result: { kind: "mcp_tool", canonical_ref: "nookplot_create_post" },
79
+ }));
80
+ await dispatchAction("load_skill", { name: "nookplot_create_post", kind: "mcp_tool" });
81
+ await dispatchAction("submit_reasoning_trace", { challengeId: "ch_1" });
82
+ const submitPayload = getDispatchedPayload(2);
83
+ expect(submitPayload.loadedSkillRefs).toEqual([
84
+ "community:uuid-A",
85
+ "mcp_tool:nookplot_create_post",
86
+ ]);
87
+ });
88
+ it("flushes on submit_subtask_trace too", async () => {
89
+ await dispatchAction("load_skill", { name: "mining", kind: "community" });
90
+ await dispatchAction("submit_subtask_trace", {
91
+ challengeId: "ch_1",
92
+ subtaskOrdinal: 1,
93
+ guildId: 5,
94
+ });
95
+ const submitPayload = getDispatchedPayload(1);
96
+ expect(submitPayload.loadedSkillRefs).toEqual(["community:abc-123-uuid"]);
97
+ });
98
+ it("does not inject loadedSkillRefs when buffer is empty", async () => {
99
+ await dispatchAction("submit_reasoning_trace", { challengeId: "ch_1" });
100
+ const submitPayload = getDispatchedPayload(0);
101
+ expect(submitPayload.loadedSkillRefs).toBeUndefined();
102
+ });
103
+ it("respects caller-provided loadedSkillRefs (does not overwrite)", async () => {
104
+ await dispatchAction("load_skill", { name: "mining", kind: "community" });
105
+ await dispatchAction("submit_reasoning_trace", {
106
+ challengeId: "ch_1",
107
+ loadedSkillRefs: ["protocol_skill:custom-ref"],
108
+ });
109
+ const submitPayload = getDispatchedPayload(1);
110
+ expect(submitPayload.loadedSkillRefs).toEqual(["protocol_skill:custom-ref"]);
111
+ });
112
+ it("does not capture from non-load_skill results", async () => {
113
+ // search_skills returns candidates but is not a load — should not buffer.
114
+ requestMock.mockImplementationOnce(async () => ({
115
+ status: "completed",
116
+ result: { candidates: [{ name: "x", canonical_ref: "uuid-search" }] },
117
+ }));
118
+ await dispatchAction("search_skills", { query: "test" });
119
+ await dispatchAction("submit_reasoning_trace", { challengeId: "ch_1" });
120
+ const submitPayload = getDispatchedPayload(1);
121
+ expect(submitPayload.loadedSkillRefs).toBeUndefined();
122
+ });
123
+ it("caps buffer at 64 entries (drops oldest)", async () => {
124
+ for (let i = 0; i < 70; i++) {
125
+ requestMock.mockImplementationOnce(async () => ({
126
+ status: "completed",
127
+ result: { kind: "community", canonical_ref: `uuid-${i}` },
128
+ }));
129
+ await dispatchAction("load_skill", { name: `skill-${i}`, kind: "community" });
130
+ }
131
+ await dispatchAction("submit_reasoning_trace", { challengeId: "ch_1" });
132
+ const submitPayload = getDispatchedPayload(70);
133
+ const refs = submitPayload.loadedSkillRefs;
134
+ expect(refs).toHaveLength(64);
135
+ // Oldest dropped: first kept ref is the 7th (index 6) = uuid-6.
136
+ expect(refs[0]).toBe("community:uuid-6");
137
+ expect(refs[63]).toBe("community:uuid-69");
138
+ });
139
+ it("ignores load_skill responses without canonical_ref", async () => {
140
+ requestMock.mockImplementationOnce(async () => ({
141
+ status: "completed",
142
+ result: { kind: "community" }, // missing canonical_ref
143
+ }));
144
+ await dispatchAction("load_skill", { name: "broken", kind: "community" });
145
+ await dispatchAction("submit_reasoning_trace", { challengeId: "ch_1" });
146
+ const submitPayload = getDispatchedPayload(1);
147
+ expect(submitPayload.loadedSkillRefs).toBeUndefined();
148
+ });
149
+ });
150
+ //# sourceMappingURL=autonomous.loadedSkillRefs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autonomous.loadedSkillRefs.test.js","sourceRoot":"","sources":["../../src/__tests__/autonomous.loadedSkillRefs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Codegen drift detector — guards against the three derived action catalogs
3
+ * falling out of sync.
4
+ *
5
+ * Single source of truth: MCP tool definitions in `mcp-server/src/tools/*.ts`.
6
+ * `mcp-server/scripts/generate-catalog.mjs` reads those tools and writes:
7
+ * 1. `cli/src/tool-manifest.json` (JSON manifest)
8
+ * 2. `runtime/src/actionCatalog.generated.ts` (TS catalog)
9
+ * 3. `runtime-py/.../action_catalog_generated.py` (Python catalog)
10
+ *
11
+ * If any of these is hand-edited, or the codegen is run in only one repo
12
+ * branch, agents start hallucinating endpoints / params / categories.
13
+ *
14
+ * This test parses all three artifacts and asserts:
15
+ * - Identical key sets (same action names everywhere)
16
+ * - Identical descriptions per key
17
+ * - Identical params per key (presence + value)
18
+ * - Identical category per key
19
+ * - The "(N tools)" comment in the TS file matches the actual entry count
20
+ * - tool-manifest entries follow the `nookplot_<actionName>` naming rule
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=codegen-drift.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-drift.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codegen-drift.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Codegen drift detector — guards against the three derived action catalogs
3
+ * falling out of sync.
4
+ *
5
+ * Single source of truth: MCP tool definitions in `mcp-server/src/tools/*.ts`.
6
+ * `mcp-server/scripts/generate-catalog.mjs` reads those tools and writes:
7
+ * 1. `cli/src/tool-manifest.json` (JSON manifest)
8
+ * 2. `runtime/src/actionCatalog.generated.ts` (TS catalog)
9
+ * 3. `runtime-py/.../action_catalog_generated.py` (Python catalog)
10
+ *
11
+ * If any of these is hand-edited, or the codegen is run in only one repo
12
+ * branch, agents start hallucinating endpoints / params / categories.
13
+ *
14
+ * This test parses all three artifacts and asserts:
15
+ * - Identical key sets (same action names everywhere)
16
+ * - Identical descriptions per key
17
+ * - Identical params per key (presence + value)
18
+ * - Identical category per key
19
+ * - The "(N tools)" comment in the TS file matches the actual entry count
20
+ * - tool-manifest entries follow the `nookplot_<actionName>` naming rule
21
+ */
22
+ import { describe, it, expect } from "vitest";
23
+ import { readFileSync } from "node:fs";
24
+ import { fileURLToPath } from "node:url";
25
+ import { dirname, join } from "node:path";
26
+ import { GENERATED_CATALOG } from "../actionCatalog.generated.js";
27
+ const __dirname = dirname(fileURLToPath(import.meta.url));
28
+ const REPO_ROOT = join(__dirname, "..", "..", "..");
29
+ // ---------------------------------------------------------------------------
30
+ // Loaders
31
+ // ---------------------------------------------------------------------------
32
+ function loadTsCatalog() {
33
+ // Imported directly — TypeScript is the single source we can trust without
34
+ // re-parsing. Coerce because the TS type allows `params?: string`.
35
+ return GENERATED_CATALOG;
36
+ }
37
+ function loadJsonManifest() {
38
+ const path = join(REPO_ROOT, "cli", "src", "tool-manifest.json");
39
+ const raw = readFileSync(path, "utf-8");
40
+ const arr = JSON.parse(raw);
41
+ const map = new Map();
42
+ for (const t of arr) {
43
+ map.set(t.actionName, {
44
+ description: t.description,
45
+ // The codegen omits `params` from TS/Py when it's empty; tool-manifest
46
+ // always sets it (empty string when no params). Normalize for compare.
47
+ ...(t.params ? { params: t.params } : {}),
48
+ category: t.category,
49
+ });
50
+ }
51
+ return map;
52
+ }
53
+ /**
54
+ * Parse the Python action_catalog_generated.py — lightweight regex parse of
55
+ * the uniform `"<name>": { ... },` blocks. Avoids importing a Python parser.
56
+ */
57
+ function loadPyCatalog() {
58
+ const path = join(REPO_ROOT, "runtime-py", "nookplot_runtime", "action_catalog_generated.py");
59
+ const raw = readFileSync(path, "utf-8");
60
+ const map = new Map();
61
+ // Match each top-level entry: "key": { ... },
62
+ // Handles escaped quotes (\") inside string values.
63
+ // The codegen emits exactly this shape, so a permissive regex is fine.
64
+ const entryRe = /^ {4}"([^"]+)": \{\n((?: {8}"[^"]+": "(?:\\.|[^"\\])*",\n)+) {4}\},?$/gm;
65
+ let match;
66
+ while ((match = entryRe.exec(raw)) !== null) {
67
+ const key = match[1];
68
+ const body = match[2];
69
+ const fieldRe = / {8}"([^"]+)": "((?:\\.|[^"\\])*)",\n/g;
70
+ let fm;
71
+ const fields = {};
72
+ while ((fm = fieldRe.exec(body)) !== null) {
73
+ // Single-pass unescape: each `\X` is processed exactly once. The
74
+ // codegen escapes in order \\ → \" → \n, so the source can contain
75
+ // literal `\n` (encoded as `\\n` = 3 chars). A naive sequential
76
+ // replace would corrupt those by partially unescaping the inner `\n`.
77
+ fields[fm[1]] = fm[2].replace(/\\(.)/g, (_full, c) => {
78
+ if (c === "n")
79
+ return "\n";
80
+ if (c === "t")
81
+ return "\t";
82
+ return c; // covers \\ → \, \" → ", \r → r (not escaped by codegen anyway)
83
+ });
84
+ }
85
+ if (!fields.description || !fields.category)
86
+ continue;
87
+ map.set(key, {
88
+ description: fields.description,
89
+ ...(fields.params ? { params: fields.params } : {}),
90
+ category: fields.category,
91
+ });
92
+ }
93
+ return map;
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Tests
97
+ // ---------------------------------------------------------------------------
98
+ describe("Codegen drift — TS ↔ Python ↔ tool-manifest", () => {
99
+ const ts = loadTsCatalog();
100
+ const json = loadJsonManifest();
101
+ const py = loadPyCatalog();
102
+ const tsKeys = new Set(Object.keys(ts));
103
+ const jsonKeys = new Set(json.keys());
104
+ const pyKeys = new Set(py.keys());
105
+ it("all three catalogs hold the same number of entries", () => {
106
+ expect(tsKeys.size).toBe(jsonKeys.size);
107
+ expect(tsKeys.size).toBe(pyKeys.size);
108
+ expect(tsKeys.size).toBeGreaterThan(0);
109
+ });
110
+ it("tool-manifest.json has every action that the TS catalog has", () => {
111
+ const missing = [...tsKeys].filter((k) => !jsonKeys.has(k));
112
+ expect(missing).toEqual([]);
113
+ });
114
+ it("TS catalog has every action that tool-manifest.json has", () => {
115
+ const missing = [...jsonKeys].filter((k) => !tsKeys.has(k));
116
+ expect(missing).toEqual([]);
117
+ });
118
+ it("Python catalog has every action that the TS catalog has", () => {
119
+ const missing = [...tsKeys].filter((k) => !pyKeys.has(k));
120
+ expect(missing).toEqual([]);
121
+ });
122
+ it("TS catalog has every action that the Python catalog has", () => {
123
+ const missing = [...pyKeys].filter((k) => !tsKeys.has(k));
124
+ expect(missing).toEqual([]);
125
+ });
126
+ describe("per-action field parity", () => {
127
+ const allKeys = [...new Set([...tsKeys, ...jsonKeys, ...pyKeys])].sort();
128
+ for (const key of allKeys) {
129
+ it(`${key} has identical description / params / category in all three catalogs`, () => {
130
+ const tsEntry = ts[key];
131
+ const jsonEntry = json.get(key);
132
+ const pyEntry = py.get(key);
133
+ expect(tsEntry, `${key} missing from TS catalog`).toBeDefined();
134
+ expect(jsonEntry, `${key} missing from tool-manifest.json`).toBeDefined();
135
+ expect(pyEntry, `${key} missing from Python catalog`).toBeDefined();
136
+ // Description must be byte-for-byte identical.
137
+ expect(jsonEntry.description).toBe(tsEntry.description);
138
+ expect(pyEntry.description).toBe(tsEntry.description);
139
+ // Category must match.
140
+ expect(jsonEntry.category).toBe(tsEntry.category);
141
+ expect(pyEntry.category).toBe(tsEntry.category);
142
+ // Params: must agree on presence AND value.
143
+ expect(jsonEntry.params ?? null).toBe(tsEntry.params ?? null);
144
+ expect(pyEntry.params ?? null).toBe(tsEntry.params ?? null);
145
+ });
146
+ }
147
+ });
148
+ });
149
+ describe("Codegen self-consistency", () => {
150
+ it("the (N tools) comment in actionCatalog.generated.ts matches the entry count", () => {
151
+ const path = join(REPO_ROOT, "runtime", "src", "actionCatalog.generated.ts");
152
+ const raw = readFileSync(path, "utf-8");
153
+ const headerMatch = raw.match(/\((\d+)\s+tools\)/);
154
+ expect(headerMatch, "header comment '(N tools)' missing").not.toBeNull();
155
+ const declared = Number(headerMatch[1]);
156
+ const actual = Object.keys(GENERATED_CATALOG).length;
157
+ expect(declared).toBe(actual);
158
+ });
159
+ it("every tool-manifest entry's `name` is `nookplot_<actionName>`", () => {
160
+ const path = join(REPO_ROOT, "cli", "src", "tool-manifest.json");
161
+ const arr = JSON.parse(readFileSync(path, "utf-8"));
162
+ const violations = arr
163
+ .filter((t) => t.name !== `nookplot_${t.actionName}`)
164
+ .map((t) => `${t.name} ↛ ${t.actionName}`);
165
+ expect(violations).toEqual([]);
166
+ });
167
+ it("every tool-manifest `required` field is a subset of its declared params", () => {
168
+ const path = join(REPO_ROOT, "cli", "src", "tool-manifest.json");
169
+ const arr = JSON.parse(readFileSync(path, "utf-8"));
170
+ const violations = [];
171
+ for (const t of arr) {
172
+ // Extract param names from the params string: "name (type), name2 (type)"
173
+ const declared = new Set((t.params ?? "")
174
+ .split(",")
175
+ .map((s) => s.trim().split(/\s/)[0])
176
+ .filter(Boolean));
177
+ for (const r of t.required ?? []) {
178
+ if (!declared.has(r))
179
+ violations.push(`${t.name}: required '${r}' not in params`);
180
+ }
181
+ }
182
+ expect(violations).toEqual([]);
183
+ });
184
+ });
185
+ //# sourceMappingURL=codegen-drift.test.js.map