@rubytech/create-realagent-code 0.1.30 → 0.1.32
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/index.js +37 -39
- package/package.json +1 -1
- package/payload/platform/lib/graph-trash/dist/index.d.ts +1 -1
- package/payload/platform/lib/graph-trash/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-trash/dist/index.js +1 -2
- package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-trash/src/index.ts +1 -2
- package/payload/platform/lib/persistent-components/dist/index.d.ts +11 -12
- package/payload/platform/lib/persistent-components/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/persistent-components/dist/index.js +11 -12
- package/payload/platform/lib/persistent-components/dist/index.js.map +1 -1
- package/payload/platform/lib/persistent-components/src/index.ts +11 -12
- package/payload/platform/neo4j/schema.cypher +10 -19
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -7
- package/payload/platform/plugins/admin/mcp/dist/index.js +15 -582
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/access-manager/references/operations.md +7 -7
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +2 -2
- package/payload/platform/plugins/anthropic/skills/get-api-key/SKILL.md +2 -4
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +0 -47
- package/payload/platform/plugins/docs/references/cloudflare.md +0 -1
- package/payload/platform/plugins/docs/references/deployment.md +9 -18
- package/payload/platform/plugins/docs/references/internals.md +4 -4
- package/payload/platform/plugins/docs/references/platform.md +5 -1
- package/payload/platform/plugins/docs/references/troubleshooting.md +11 -7
- package/payload/platform/plugins/email/references/email-reference.md +3 -7
- package/payload/platform/plugins/memory/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +2 -3
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +2 -3
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-restore.d.ts +1 -1
- package/payload/platform/plugins/memory/references/graph-primitives.md +5 -5
- package/payload/platform/plugins/teaching/PLUGIN.md +2 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -8
- package/payload/platform/plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/platform/scripts/component-knowledgedoc-backfill.ts +1 -1
- package/payload/platform/scripts/seed-neo4j.sh +9 -38
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +45 -44
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +11 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts +30 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js +175 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +4 -2
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +15 -22
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +13 -14
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +28 -13
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -25
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +3 -54
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -0
- package/payload/platform/templates/agents/public/IDENTITY.md +1 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +3 -3
- package/payload/platform/templates/specialists/agents/personal-assistant.md +2 -2
- package/payload/premium-plugins/teaching/PLUGIN.md +2 -1
- package/payload/premium-plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/server/{chunk-NL7QLVAD.js → chunk-KVGTWNKQ.js} +1 -70
- package/payload/server/{chunk-2MRZBQMH.js → chunk-RZQMYJVY.js} +1 -1
- package/payload/server/{chunk-YPZFYTYP.js → chunk-ZGJ6CUU2.js} +1 -1
- package/payload/server/{cloudflare-task-tracker-QVOGHKWV.js → cloudflare-task-tracker-4PKOLE4H.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/assets/{Checkbox-YIF0payo.js → Checkbox-C6zXApx_.js} +1 -1
- package/payload/server/public/assets/admin-Cuu1QdAA.js +216 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bz8mlxZZ.js → architectureDiagram-Q4EWVU46-BYXgFii5.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DwV8Z8-i.js → blockDiagram-DXYQGD6D-GIQ0eO13.js} +1 -1
- package/payload/server/public/assets/{brand-Bm671owU.js → brand-B-bNrpwc.js} +1 -1
- package/payload/server/public/assets/{brand-DqiRNMlu.css → brand-DdhkC994.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DiUTejMp.js → c4Diagram-AHTNJAMY-BmyWfG-l.js} +1 -1
- package/payload/server/public/assets/channel-C76knBRO.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-4mHZpBXe.js → chunk-336JU56O-DcWl0MQo.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-Cbv0vrN9.js → chunk-426QAEUC-BIW6kq6y.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-BvLhId_2.js → chunk-4TB4RGXK-CdoHpV4X.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-bBafOTkw.js → chunk-5FUZZQ4R-bn_a4sfU.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-B0NqBKVy.js → chunk-5PVQY5BW-C_Rq8j_M.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-CFd4SqI6.js → chunk-EDXVE4YY-CWQvoVKV.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-ajf2sb6c.js → chunk-ENJZ2VHE-DBHn1kSk.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-pWg6bug7.js → chunk-ICPOFSXX-SW2Qx11O.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-OjEd-17c.js → chunk-OYMX7WX6-BvIG7tVW.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-DbEFSPoh.js → chunk-U2HBQHQK-BiBUb0cF.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-COdNwrBb.js → chunk-X2U36JSP-Y0MKZCCh.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-CHMWuY9B.js → chunk-YZCP3GAM-DKPh06GH.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-B-uDLQOB.js → chunk-ZZ45TVLE-C2WNo-fK.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bohexn7P.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DVsmsAu7.js +1 -0
- package/payload/server/public/assets/clone-DUrXF4sO.js +1 -0
- package/payload/server/public/assets/{dagre-bhIG_KnW.js → dagre-CrK8E9ee.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CMEzmhIL.js → dagre-KV5264BT-_o6uXcH8.js} +1 -1
- package/payload/server/public/assets/data-j1WNhF8t.js +1 -0
- package/payload/server/public/assets/{device-url-actions-AcOyLSeF.js → device-url-actions-BcHerWqJ.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-6RIoQhIL.js → diagram-5BDNPKRD-FFP9DKhc.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-BSp36TVv.js → diagram-G4DWMVQ6-DpwD1jBP.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-D54fo52D.js → diagram-MMDJMWI5-C3K5agdK.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CWL8z-Pq.js → diagram-TYMM5635-CbeDipbC.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-AnnHBo3z.js → erDiagram-SMLLAGMA-XBIFndNy.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-laWmBl5o.js → flowDiagram-DWJPFMVM-BvEgySyn.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B94ko8ie.js → ganttDiagram-T4ZO3ILL-D7gIRKJf.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DxzL1fxZ.js → gitGraphDiagram-UUTBAWPF-vJu_hcri.js} +1 -1
- package/payload/server/public/assets/graph-C_f_9L_7.js +1 -0
- package/payload/server/public/assets/graph-labels-BSQJHlgf.js +1 -0
- package/payload/server/public/assets/{graphlib-CY-zIElM.js → graphlib-Dp0mN6JW.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-BMTajIIr.js → infoDiagram-42DDH7IO-g4Dlc5Cr.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-B_QauE5O.js → ishikawaDiagram-UXIWVN3A-D_45LXOe.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DmlqSIih.js → journeyDiagram-VCZTEJTY-CggbHl6N.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-ZGDQT7xB.js → kanban-definition-6JOO6SKY-CysAe-Ab.js} +1 -1
- package/payload/server/public/assets/{line-D13opgep.js → line-BAxq_DSY.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-C650Sual.js → mermaid-parser.core-DbFuvkjL.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-BqnQoXTp.js → mermaid.core-CehvJn5b.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BS_8y-tY.js → mindmap-definition-QFDTVHPH-DbPbBJ9h.js} +1 -1
- package/payload/server/public/assets/page-B0BPrSE3.js +1 -0
- package/payload/server/public/assets/{page-qSH972X0.js → page-Co7KCRV8.js} +2 -2
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-B5OmNvBO.js → pieDiagram-DEJITSTG-cagLL9ng.js} +1 -1
- package/payload/server/public/assets/{public-DDsYgotk.js → public-B6TEcDLx.js} +5 -5
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DTYITdNo.js → quadrantDiagram-34T5L4WZ-Keaa1jDh.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-CRZWxH06.js → requirementDiagram-MS252O5E-BcYRyn5z.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DazRENhe.js → sankeyDiagram-XADWPNL6--fKoG9NR.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BcHTxmPy.js → sequenceDiagram-FGHM5R23-lKG36-Di.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DYU7nbqg.js → stateDiagram-FHFEXIEX-BuVsrlig.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DSt88_xL.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BKGmqkST.js → timeline-definition-GMOUNBTQ-D6X6uq17.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BXvLPmX7.js → vennDiagram-DHZGUBPP-BgvcfRVf.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BCclUa3Z.js → wardleyDiagram-NUSXRM2D-Cpd1xsrt.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C-Xp-Eoc.js → xychartDiagram-5P7HB3ND-CDF5ZVFv.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +142 -278
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +0 -102
- package/payload/platform/plugins/admin/references/contextual-ui.md +0 -109
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +0 -240
- package/payload/platform/scripts/__tests__/admin-persist-audit.test.ts +0 -182
- package/payload/server/public/assets/admin-CDvF5de6.js +0 -216
- package/payload/server/public/assets/channel-PtVtoBEL.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVH_SEhY.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cm3rAb93.js +0 -1
- package/payload/server/public/assets/clone-BjY0Wzht.js +0 -1
- package/payload/server/public/assets/data-K_kS__sL.js +0 -1
- package/payload/server/public/assets/graph-DeEigyO_.js +0 -1
- package/payload/server/public/assets/graph-labels-C7I5QvNv.js +0 -1
- package/payload/server/public/assets/page-B_rpjIRr.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BgljVtlp.js +0 -1
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task 943 — admin-persist-audit.
|
|
3
|
-
*
|
|
4
|
-
* Pins Task 940 success criterion #7: the audit harness counts JSONL
|
|
5
|
-
* assistant turns + render-component blocks against Neo4j `:Message` +
|
|
6
|
-
* `:Component` rows for a `conversationId`, prints one
|
|
7
|
-
*
|
|
8
|
-
* [admin-persist-audit] convId=<conv> sdkTurnUuid=<uuid> expected=<message|component> missing reason=neo4j-row-absent
|
|
9
|
-
*
|
|
10
|
-
* line per divergence, and exits non-zero on mismatch.
|
|
11
|
-
*
|
|
12
|
-
* The test mocks the Neo4j surface (`getRecentMessages`, `getSession`) so
|
|
13
|
-
* `runAudit` is a pure function of (JSONL fixture, Neo4j seed). The
|
|
14
|
-
* harness reads the fixture with the real `replayJsonl`, so the matching
|
|
15
|
-
* key (role + content) is verified end-to-end without a graph connection.
|
|
16
|
-
*/
|
|
17
|
-
import { resolve } from "node:path";
|
|
18
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
19
|
-
|
|
20
|
-
const FIXTURE_PATH = resolve(__dirname, "../../ui/app/lib/__tests__/fixtures/task-940-session.jsonl");
|
|
21
|
-
|
|
22
|
-
// Mock the Neo4j surface. The audit harness imports `getRecentMessages`
|
|
23
|
-
// and `getSession` from `platform/ui/app/lib/neo4j-store`. We replace
|
|
24
|
-
// both with vi-managed fakes; each test reseeds them as needed.
|
|
25
|
-
const getRecentMessagesMock = vi.fn<[string, number?], Promise<Array<{
|
|
26
|
-
role: "user" | "assistant";
|
|
27
|
-
content: string;
|
|
28
|
-
messageId: string;
|
|
29
|
-
components?: Array<{ componentId: string; submitted: boolean }>;
|
|
30
|
-
}>>>();
|
|
31
|
-
|
|
32
|
-
const sessionRunMock = vi.fn<[string, Record<string, unknown>], Promise<{
|
|
33
|
-
records: Array<{ get(key: string): unknown }>;
|
|
34
|
-
}>>();
|
|
35
|
-
const sessionCloseMock = vi.fn<[], Promise<void>>();
|
|
36
|
-
|
|
37
|
-
vi.mock("../../ui/app/lib/neo4j-store", () => ({
|
|
38
|
-
getRecentMessages: (...args: Parameters<typeof getRecentMessagesMock>) => getRecentMessagesMock(...args),
|
|
39
|
-
getSession: () => ({
|
|
40
|
-
run: (cypher: string, params: Record<string, unknown>) => sessionRunMock(cypher, params),
|
|
41
|
-
close: () => sessionCloseMock(),
|
|
42
|
-
}),
|
|
43
|
-
}));
|
|
44
|
-
|
|
45
|
-
vi.mock("../../ui/app/lib/claude-agent/account", () => ({
|
|
46
|
-
ACCOUNTS_DIR: "/tmp/maxy-accounts-fixture",
|
|
47
|
-
}));
|
|
48
|
-
|
|
49
|
-
// PERSISTENT_COMPONENTS is also imported by the audit harness for the
|
|
50
|
-
// :KnowledgeDocument projection check. We mock the set so the test does
|
|
51
|
-
// not depend on the runtime persistent-component list — the fixture
|
|
52
|
-
// components (`document-editor`, `quick-chart`) are both included.
|
|
53
|
-
vi.mock("../../lib/persistent-components/src/index", () => ({
|
|
54
|
-
PERSISTENT_COMPONENTS: new Set<string>(["document-editor", "quick-chart"]),
|
|
55
|
-
isPersistentComponent: (name: string) => name === "document-editor" || name === "quick-chart",
|
|
56
|
-
}));
|
|
57
|
-
|
|
58
|
-
import { runAudit, type AuditArgs } from "../admin-persist-audit";
|
|
59
|
-
|
|
60
|
-
const CONV_ID = "11111111-aaaa-bbbb-cccc-dddddddddddd";
|
|
61
|
-
const ACCOUNT_ID = "b3b638d9-9999-8888-7777-666666666666";
|
|
62
|
-
|
|
63
|
-
const buildArgs = (): AuditArgs => ({
|
|
64
|
-
conversationId: CONV_ID,
|
|
65
|
-
accountId: ACCOUNT_ID,
|
|
66
|
-
jsonlPath: FIXTURE_PATH,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const captureConsole = () => {
|
|
70
|
-
const out: string[] = [];
|
|
71
|
-
const err: string[] = [];
|
|
72
|
-
const logSpy = vi.spyOn(console, "log").mockImplementation((...a) => { out.push(a.join(" ")); });
|
|
73
|
-
const errSpy = vi.spyOn(console, "error").mockImplementation((...a) => { err.push(a.join(" ")); });
|
|
74
|
-
return { out, err, restore: () => { logSpy.mockRestore(); errSpy.mockRestore(); } };
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
describe("Task 940 SC7 — admin-persist-audit divergence reporting", () => {
|
|
78
|
-
beforeEach(() => {
|
|
79
|
-
getRecentMessagesMock.mockReset();
|
|
80
|
-
sessionRunMock.mockReset();
|
|
81
|
-
sessionCloseMock.mockReset();
|
|
82
|
-
sessionCloseMock.mockResolvedValue(undefined);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("Neo4j seed missing the assistant turn (and its components) → exit=1, one missing-message line + one missing-component line per component", async () => {
|
|
86
|
-
// Fixture has 1 user + 1 assistant (with 2 components). Seed Neo4j
|
|
87
|
-
// with the user only — the assistant turn is the silent persist
|
|
88
|
-
// failure the audit must surface.
|
|
89
|
-
getRecentMessagesMock.mockResolvedValue([
|
|
90
|
-
{ role: "user", content: "Please render the doc and a chart.", messageId: "neo4j-user", components: [] },
|
|
91
|
-
]);
|
|
92
|
-
// No persistent-component rows in Neo4j (since the assistant turn
|
|
93
|
-
// never persisted). The :KnowledgeDocument check finds nothing → no
|
|
94
|
-
// additional kd-absent divergences.
|
|
95
|
-
sessionRunMock.mockResolvedValue({ records: [] });
|
|
96
|
-
|
|
97
|
-
const cap = captureConsole();
|
|
98
|
-
try {
|
|
99
|
-
const code = await runAudit(buildArgs());
|
|
100
|
-
expect(code).toBe(1);
|
|
101
|
-
|
|
102
|
-
// One divergence line for the assistant message itself…
|
|
103
|
-
const messageMisses = cap.out.filter((l) => /expected=message missing reason=neo4j-row-absent/.test(l));
|
|
104
|
-
expect(messageMisses).toHaveLength(1);
|
|
105
|
-
expect(messageMisses[0]).toMatch(/sdkTurnUuid=22222222/); // matches fixture uuid prefix
|
|
106
|
-
|
|
107
|
-
// …plus one divergence line per component sibling that was queued
|
|
108
|
-
// by the assistant turn's render-component blocks.
|
|
109
|
-
const componentMisses = cap.out.filter((l) => /expected=component .* missing reason=neo4j-row-absent/.test(l));
|
|
110
|
-
expect(componentMisses).toHaveLength(2);
|
|
111
|
-
expect(componentMisses[0]).toMatch(/component_name=document-editor ordinal=0/);
|
|
112
|
-
expect(componentMisses[1]).toMatch(/component_name=quick-chart ordinal=1/);
|
|
113
|
-
|
|
114
|
-
// Status summary line ends with status=mismatch.
|
|
115
|
-
expect(cap.out.some((l) => /status=mismatch/.test(l))).toBe(true);
|
|
116
|
-
} finally {
|
|
117
|
-
cap.restore();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("Neo4j seed in lockstep with JSONL → exit=0, status=ok, zero divergence lines", async () => {
|
|
122
|
-
getRecentMessagesMock.mockResolvedValue([
|
|
123
|
-
{ role: "user", content: "Please render the doc and a chart.", messageId: "neo4j-user", components: [] },
|
|
124
|
-
{
|
|
125
|
-
role: "assistant",
|
|
126
|
-
content: "Here is the doc.\n\nAnd a chart follows.",
|
|
127
|
-
messageId: "neo4j-asst",
|
|
128
|
-
components: [
|
|
129
|
-
{ componentId: "comp-doc", submitted: false },
|
|
130
|
-
{ componentId: "comp-chart", submitted: false },
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
]);
|
|
134
|
-
// Persistent-component KD projection: both rows have a sibling
|
|
135
|
-
// :KnowledgeDocument row → no kd-absent divergences.
|
|
136
|
-
sessionRunMock.mockResolvedValue({
|
|
137
|
-
records: [
|
|
138
|
-
{ get: (k: string) => ({ componentId: "comp-doc", componentName: "document-editor", accountId: ACCOUNT_ID, attachmentId: "att-doc", hasProjection: true })[k] },
|
|
139
|
-
{ get: (k: string) => ({ componentId: "comp-chart", componentName: "quick-chart", accountId: ACCOUNT_ID, attachmentId: "att-chart", hasProjection: true })[k] },
|
|
140
|
-
],
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const cap = captureConsole();
|
|
144
|
-
try {
|
|
145
|
-
const code = await runAudit(buildArgs());
|
|
146
|
-
expect(code).toBe(0);
|
|
147
|
-
expect(cap.out.some((l) => /divergences=0 status=ok/.test(l))).toBe(true);
|
|
148
|
-
expect(cap.out.some((l) => /missing reason=neo4j-row-absent/.test(l))).toBe(false);
|
|
149
|
-
} finally {
|
|
150
|
-
cap.restore();
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("Neo4j throw on getRecentMessages → exit=2 (invocation error), no divergence lines", async () => {
|
|
155
|
-
getRecentMessagesMock.mockRejectedValue(new Error("bolt://neo4j unreachable"));
|
|
156
|
-
sessionRunMock.mockResolvedValue({ records: [] });
|
|
157
|
-
|
|
158
|
-
const cap = captureConsole();
|
|
159
|
-
try {
|
|
160
|
-
const code = await runAudit(buildArgs());
|
|
161
|
-
expect(code).toBe(2);
|
|
162
|
-
expect(cap.err.some((l) => /neo4j-read-failed/.test(l) && /bolt:\/\/neo4j unreachable/.test(l))).toBe(true);
|
|
163
|
-
} finally {
|
|
164
|
-
cap.restore();
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("JSONL absent → exit=2 (invocation error)", async () => {
|
|
169
|
-
const cap = captureConsole();
|
|
170
|
-
try {
|
|
171
|
-
const code = await runAudit({
|
|
172
|
-
conversationId: CONV_ID,
|
|
173
|
-
accountId: ACCOUNT_ID,
|
|
174
|
-
jsonlPath: resolve(__dirname, "fixtures/does-not-exist.jsonl"),
|
|
175
|
-
});
|
|
176
|
-
expect(code).toBe(2);
|
|
177
|
-
expect(cap.err.some((l) => /jsonl absent path=/.test(l))).toBe(true);
|
|
178
|
-
} finally {
|
|
179
|
-
cap.restore();
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
});
|