@rubytech/create-maxy-code 0.1.313 → 0.1.315

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 (121) hide show
  1. package/dist/__tests__/plugin-install.test.js +23 -1
  2. package/dist/index.js +47 -2
  3. package/dist/lib/plugin-install.js +16 -0
  4. package/package.json +1 -1
  5. package/payload/platform/lib/graph-search/dist/index.d.ts +18 -31
  6. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  7. package/payload/platform/lib/graph-search/dist/index.js +20 -36
  8. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  9. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +55 -64
  10. package/payload/platform/lib/graph-search/src/index.ts +19 -37
  11. package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -1
  12. package/payload/platform/lib/graph-style/dist/index.js +5 -3
  13. package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
  14. package/payload/platform/lib/graph-style/src/index.ts +5 -3
  15. package/payload/platform/neo4j/schema.cypher +21 -57
  16. package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +1 -1
  17. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +12 -13
  18. package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +1 -1
  19. package/payload/platform/plugins/docs/references/admin-session.md +2 -0
  20. package/payload/platform/plugins/docs/references/admin-ui.md +2 -2
  21. package/payload/platform/plugins/docs/references/internals.md +9 -10
  22. package/payload/platform/plugins/docs/references/memory-guide.md +1 -1
  23. package/payload/platform/plugins/graph-viewer/mcp/dist/index.js +1 -1
  24. package/payload/platform/plugins/graph-viewer/mcp/dist/index.js.map +1 -1
  25. package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.d.ts.map +1 -1
  26. package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js +8 -7
  27. package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js.map +1 -1
  28. package/payload/platform/plugins/graph-viewer/skills/render-graph/SKILL.md +8 -5
  29. package/payload/platform/plugins/memory/mcp/dist/index.js +14 -15
  30. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  31. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.d.ts +2 -0
  32. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.d.ts.map +1 -0
  33. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.js +146 -0
  34. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/relationship-patterns.test.js.map +1 -0
  35. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js +4 -0
  36. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js.map +1 -1
  37. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js +1 -0
  38. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js.map +1 -1
  39. package/payload/platform/plugins/memory/mcp/dist/lib/relationship-patterns.d.ts +66 -0
  40. package/payload/platform/plugins/memory/mcp/dist/lib/relationship-patterns.d.ts.map +1 -0
  41. package/payload/platform/plugins/memory/mcp/dist/lib/relationship-patterns.js +102 -0
  42. package/payload/platform/plugins/memory/mcp/dist/lib/relationship-patterns.js.map +1 -0
  43. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts +9 -0
  44. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts.map +1 -1
  45. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js +6 -1
  46. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js.map +1 -1
  47. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-open.test.js +1 -0
  48. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-personfields-open.test.js.map +1 -1
  49. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.d.ts +9 -0
  50. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.d.ts.map +1 -1
  51. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.js +25 -1
  52. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.js.map +1 -1
  53. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  54. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +21 -0
  55. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  56. package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
  57. package/payload/platform/plugins/memory/references/schema-construction.md +37 -15
  58. package/payload/platform/scripts/check-no-esm-require.mjs +4 -0
  59. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  60. package/payload/platform/services/claude-session-manager/dist/http-server.js +53 -4
  61. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  62. package/payload/platform/services/claude-session-manager/dist/index.js +1 -0
  63. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  64. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +15 -11
  65. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  66. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +102 -47
  67. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  68. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +5 -6
  69. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  70. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +6 -6
  71. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  72. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +10 -0
  73. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  74. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +15 -0
  75. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  76. package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
  77. package/payload/platform/services/webchat-channel/dist/instructions.js +8 -1
  78. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  79. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  80. package/payload/platform/services/whatsapp-channel/dist/notification.js +8 -1
  81. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  82. package/payload/platform/templates/specialists/agents/content-producer.md +1 -1
  83. package/payload/platform/templates/specialists/agents/public-session-reviewer.md +2 -2
  84. package/payload/server/public/assets/AccessGate-B0sCa0QJ.js +1 -0
  85. package/payload/server/public/assets/{AdminLoginScreens-DgwQi3HN.js → AdminLoginScreens-C7Oaqpr6.js} +1 -1
  86. package/payload/server/public/assets/AdminShell-DgK7TWCI.js +1 -0
  87. package/payload/server/public/assets/{Checkbox-C54JSreC.js → Checkbox-C4m1jfdP.js} +1 -1
  88. package/payload/server/public/assets/OperatorConversations-z2mSY_eQ.js +1 -0
  89. package/payload/server/public/assets/{admin-B25rkI9Q.js → admin-DxYk1Ghu.js} +1 -1
  90. package/payload/server/public/assets/audio-attachment-mime-BXj3DB3Y.js +30 -0
  91. package/payload/server/public/assets/{brand-TWflEl22.css → brand-BwWvCHLs.css} +1 -1
  92. package/payload/server/public/assets/{brand-CYjs10m-.js → brand-DOgCGEoD.js} +1 -1
  93. package/payload/server/public/assets/{browser-C9Z5dLlN.js → browser-NzxOujfD.js} +1 -1
  94. package/payload/server/public/assets/chat-CEQTEN5z.js +1 -0
  95. package/payload/server/public/assets/{data-DCQDh0-Y.js → data-CTROHvif.js} +1 -1
  96. package/payload/server/public/assets/graph-Dx2a6vGB.js +51 -0
  97. package/payload/server/public/assets/graph-labels-Dxqq08v6.js +1 -0
  98. package/payload/server/public/assets/operator-BTHMTwNI.js +1 -0
  99. package/payload/server/public/assets/page-B9fQp1g9.js +1 -0
  100. package/payload/server/public/assets/{public-Cs5N4-Az.js → public-cuggl7du.js} +3 -3
  101. package/payload/server/public/assets/public-next-apqAebbA.js +1 -0
  102. package/payload/server/public/assets/{useSelectionMode-Cs-vtuKI.js → useSelectionMode-DlgEcMtA.js} +1 -1
  103. package/payload/server/public/browser.html +6 -6
  104. package/payload/server/public/chat.html +8 -8
  105. package/payload/server/public/data.html +5 -5
  106. package/payload/server/public/graph.html +8 -8
  107. package/payload/server/public/index.html +9 -9
  108. package/payload/server/public/operator.html +10 -10
  109. package/payload/server/public/public-next.html +9 -9
  110. package/payload/server/public/public.html +7 -7
  111. package/payload/server/server.js +968 -521
  112. package/payload/server/public/assets/AccessGate-Byskkf47.js +0 -1
  113. package/payload/server/public/assets/AdminShell-DQfL2c_L.js +0 -1
  114. package/payload/server/public/assets/OperatorConversations-DulQyF8c.js +0 -1
  115. package/payload/server/public/assets/audio-attachment-mime-BlwrgPQa.js +0 -30
  116. package/payload/server/public/assets/chat-CGNWDmid.js +0 -1
  117. package/payload/server/public/assets/graph-labels-BBtL--_M.js +0 -1
  118. package/payload/server/public/assets/graph-sMzOI71g.js +0 -51
  119. package/payload/server/public/assets/operator-hI6kJi0I.js +0 -1
  120. package/payload/server/public/assets/page-DbsqlpuX.js +0 -1
  121. package/payload/server/public/assets/public-next-DoGPYX6T.js +0 -1
@@ -53,6 +53,7 @@ function buildValidator() {
53
53
  documentedCanonicals: [],
54
54
  sourceFiles: ["schema-base.md"],
55
55
  brandVertical: null,
56
+ relationshipPatterns: [],
56
57
  };
57
58
  const liveSource = {
58
59
  recognisedLabels: () => new Set(["Person", "AdminUser"]),
@@ -1 +1 @@
1
- {"version":3,"file":"profile-update-personfields-open.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/profile-update-personfields-open.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profile-update-personfields-open.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/profile-update-personfields-open.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type RelationshipPattern } from "../lib/relationship-patterns.js";
1
2
  export interface MemoryEdgeParams {
2
3
  action: "create" | "delete";
3
4
  fromId: string;
@@ -5,6 +6,14 @@ export interface MemoryEdgeParams {
5
6
  relationshipType: string;
6
7
  properties?: Record<string, unknown>;
7
8
  accountId: string;
9
+ /**
10
+ * Active-vertical + base relationship patterns for the warn-only
11
+ * off-allowlist check (Phase 2). Omit to skip the check (the write still
12
+ * proceeds — the check never blocks).
13
+ */
14
+ relationshipPatterns?: RelationshipPattern[];
15
+ /** Brand-default vertical, used to resolve the account's active vertical. */
16
+ brandVertical?: string | null;
8
17
  }
9
18
  export type MemoryEdgeResult = {
10
19
  created: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"memory-edge.d.ts","sourceRoot":"","sources":["../../src/tools/memory-edge.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACpB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmEpF"}
1
+ {"version":3,"file":"memory-edge.d.ts","sourceRoot":"","sources":["../../src/tools/memory-edge.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACpB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqGpF"}
@@ -1,4 +1,6 @@
1
1
  import { getSession } from "../lib/neo4j.js";
2
+ import { resolveActiveVertical } from "../lib/resolve-active-vertical.js";
3
+ import { checkEdgeAgainstPatterns, selectPatternsForVertical, } from "../lib/relationship-patterns.js";
2
4
  export async function memoryEdge(params) {
3
5
  const { action, fromId, toId, accountId } = params;
4
6
  const rawType = params.relationshipType.toUpperCase().replace(/[`\n\r]/g, "");
@@ -8,7 +10,7 @@ export async function memoryEdge(params) {
8
10
  }
9
11
  const session = getSession();
10
12
  try {
11
- const fromCheck = await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId RETURN elementId(n) AS id`, { nodeId: fromId, accountId });
13
+ const fromCheck = await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId RETURN elementId(n) AS id, labels(n) AS labels`, { nodeId: fromId, accountId });
12
14
  if (fromCheck.records.length === 0) {
13
15
  process.stderr.write(`[memory-edge] action=${action} from=${fromId.slice(0, 8)} to=${toId.slice(0, 8)} type=${rawType} accountId=${accountId?.slice(0, 8) ?? "none"} result=rejected reason=foreign-node elementId=${fromId}\n`);
14
16
  return { error: "foreign-node", elementId: fromId };
@@ -18,6 +20,28 @@ export async function memoryEdge(params) {
18
20
  process.stderr.write(`[memory-edge] action=${action} from=${fromId.slice(0, 8)} to=${toId.slice(0, 8)} type=${rawType} accountId=${accountId?.slice(0, 8) ?? "none"} result=rejected reason=foreign-node elementId=${toId}\n`);
19
21
  return { error: "foreign-node", elementId: toId };
20
22
  }
23
+ // Warn-only canonical-edge check (Phase 2). On edge creation, log when the
24
+ // (fromLabel, edgeType) is off the active vertical's canonical set for a
25
+ // schema-governed source label — the JOB_FOR / VALUATION_FOR drift surfaces
26
+ // here without blocking the write. Never throws.
27
+ if (action === "create" && params.relationshipPatterns) {
28
+ try {
29
+ const fromLabels = fromCheck.records[0].get("labels") ?? [];
30
+ const vertical = await resolveActiveVertical({
31
+ session,
32
+ accountId,
33
+ brandVertical: params.brandVertical ?? null,
34
+ });
35
+ const patterns = selectPatternsForVertical(params.relationshipPatterns, vertical.resolvedVertical);
36
+ const { governed, allowed } = checkEdgeAgainstPatterns(fromLabels, rawType, patterns);
37
+ if (governed && !allowed) {
38
+ process.stderr.write(`[memory-edge] op=edge-off-allowlist sourceLabels=${fromLabels.join(",")} edgeType=${rawType} vertical=${vertical.resolvedVertical ?? "base"} accountId=${accountId?.slice(0, 8) ?? "none"}\n`);
39
+ }
40
+ }
41
+ catch (err) {
42
+ process.stderr.write(`[memory-edge] op=edge-check-error error=${err instanceof Error ? err.message : String(err)}\n`);
43
+ }
44
+ }
21
45
  if (action === "create") {
22
46
  const props = params.properties ?? {};
23
47
  const q = `
@@ -1 +1 @@
1
- {"version":3,"file":"memory-edge.js","sourceRoot":"","sources":["../../src/tools/memory-edge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-edge.js","sourceRoot":"","sources":["../../src/tools/memory-edge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory-write.d.ts","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAW9E,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;AAEtD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6HAA6H;IAC7H,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,+EAA+E;IAC/E,SAAS,EAAE,SAAS,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,EAAE,YAAY,CAAC;IACxB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AA+CD,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAS3E;AAyVD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKhD;AASD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAYR"}
1
+ {"version":3,"file":"memory-write.d.ts","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe9E,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAC;AAEtD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6HAA6H;IAC7H,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,+EAA+E;IAC/E,SAAS,EAAE,SAAS,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,EAAE,YAAY,CAAC;IACxB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AA+CD,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAS3E;AAuXD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKhD;AASD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAYR"}
@@ -2,6 +2,7 @@ import { getSession } from "../lib/neo4j.js";
2
2
  import { embed } from "../lib/embeddings.js";
3
3
  import { validateWrite } from "../lib/schema-validator.js";
4
4
  import { resolveActiveVertical } from "../lib/resolve-active-vertical.js";
5
+ import { checkEdgeAgainstPatterns, selectPatternsForVertical, } from "../lib/relationship-patterns.js";
5
6
  import { checkGraphWriteGate, checkLabelWriteGate, checkPropertyWriteGate, } from "../lib/graph-write-gate.js";
6
7
  import { extractDatedStatements } from "../lib/timeline-extractor.js";
7
8
  import { randomUUID } from "node:crypto";
@@ -223,6 +224,26 @@ async function memoryWriteImpl(params) {
223
224
  tool: "memory-write",
224
225
  });
225
226
  }
227
+ // Warn-only canonical-edge check (Phase 2). Project the active vertical's
228
+ // markdown Relationship Patterns and log any outgoing edge whose
229
+ // (sourceLabel, edgeType) is off the canonical set for a schema-governed
230
+ // source label — the JOB_FOR / VALUATION_FOR drift surfaces here without
231
+ // blocking the write. Incoming edges (e.g. PRODUCED) have an unknown source
232
+ // label here and are not checked. Never throws.
233
+ try {
234
+ const verticalPatterns = selectPatternsForVertical(validator.schema.relationshipPatterns, verticalContext.resolvedVertical);
235
+ for (const rel of resolvedRelationships) {
236
+ if (rel.direction !== "outgoing")
237
+ continue;
238
+ const { governed, allowed } = checkEdgeAgainstPatterns(labels, rel.type, verticalPatterns);
239
+ if (governed && !allowed) {
240
+ process.stderr.write(`[memory-write] op=edge-off-allowlist sourceLabels=${labels.join(",")} edgeType=${rel.type} vertical=${verticalContext.resolvedVertical ?? "base"} accountId=${accountId?.slice(0, 8) ?? "none"}\n`);
241
+ }
242
+ }
243
+ }
244
+ catch (err) {
245
+ process.stderr.write(`[memory-write] op=edge-check-error error=${err instanceof Error ? err.message : String(err)}\n`);
246
+ }
226
247
  const result = await writeNodeWithEdges({
227
248
  session,
228
249
  labels,
@@ -1 +1 @@
1
- {"version":3,"file":"memory-write.js","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAqB,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,kBAAkB,EAClB,4BAA4B,GAG7B,MAAM,8CAA8C,CAAC;AAwCtD,yGAAyG;AACzG,MAAM,uBAAuB,GAAG;IAC9B,QAAQ;IACR,cAAc;IACd,SAAS;IACT,SAAS;IACT,eAAe;CACP,CAAC;AACX,sEAAsE;AACtE,4EAA4E;AAC5E,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,+EAA+E;AAC/E,2DAA2D;AAC3D,gGAAgG;AAChG,MAAM,kBAAkB,GAAG;IACzB,cAAc;IACd,SAAS;IACT,SAAS;IACT,eAAe;CACP,CAAC;AACX,6FAA6F;AAC7F,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,kCAAkC,GAAG;IACzC,eAAe;IACf,wBAAwB;IACxB,qBAAqB;IACrB,qBAAqB;IACrB,8BAA8B;IAC9B,2BAA2B;CACnB,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB;IACnD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAC/G,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO,cAAc,CACnB,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAC3D,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,EACtH,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAmB;IAChD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAE/G,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;IAED,wEAAwE;IACxE,yEAAyE;IACzE,0EAA0E;IAC1E,KAAK,MAAM,GAAG,IAAI,kCAAkC,EAAE,CAAC;QACrD,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,0CAA0C;gBACnF,mHAAmH,CACtH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,uEAAuE;QACvE,6DAA6D;QAC7D,qEAAqE;QACrE,mEAAmE;QACnE,qBAAqB;QACrB,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC;YAClD,OAAO;YACP,SAAS;YACT,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,aAAa;SAC9C,CAAC,CAAC;QAEH,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,gDAAgD;QAChD,IAAI,CAAC;YACH,aAAa,CACX,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EACjC,SAAS,EACT,EAAE,eAAe,EAAE,CACpB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,6CAA6C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,IAAI,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5J,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sEAAsE;QACtE,sEAAsE;QACtE,oEAAoE;QACpE,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,6DAA6D;QAC7D,wEAAwE;QACxE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,2EAA2E;QAC3E,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,iEAAiE;QACjE,kEAAkE;QAClE,+CAA+C;QAC/C,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,SAAS,GAA4B;YACzC,GAAG,UAAU;YACb,SAAS;YACT,KAAK;YACL,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACnD,SAAS,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,CAAC;QAED,wEAAwE;QACxE,oEAAoE;QACpE,iEAAiE;QACjE,kEAAkE;QAClE,qEAAqE;QACrE,0DAA0D;QAC1D,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,QAAQ;YACpD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAClC,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,kBAAkB,EAAE,CAAC;YACvB,SAAS,CAAC,UAAU,GAAG,kBAAkB,CAAC;YAC1C,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG;YAC1F,cAAc,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CACtE,CAAC;QAEF,uEAAuE;QACvE,sEAAsE;QACtE,8DAA8D;QAC9D,uEAAuE;QACvE,sEAAsE;QACtE,4CAA4C;QAC5C,EAAE;QACF,oEAAoE;QACpE,mEAAmE;QACnE,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,sBAAsB,EAAE,CAAC;YAC3B,IAAI,SAAS,CAAC,aAAa,KAAK,SAAS;gBAAE,SAAS,CAAC,aAAa,GAAG,EAAE,CAAC;YACxE,IAAI,SAAS,CAAC,sBAAsB,KAAK,SAAS;gBAChD,SAAS,CAAC,sBAAsB,GAAG,oBAAoB,CAAC;YAC1D,IAAI,SAAS,CAAC,mBAAmB,KAAK,SAAS;gBAC7C,SAAS,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC/C,CAAC;QACD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,mBAAmB,KAAK,SAAS;gBAAE,SAAS,CAAC,mBAAmB,GAAG,EAAE,CAAC;YACpF,IAAI,SAAS,CAAC,4BAA4B,KAAK,SAAS;gBACtD,SAAS,CAAC,4BAA4B,GAAG,oBAAoB,CAAC;YAChE,IAAI,SAAS,CAAC,yBAAyB,KAAK,SAAS;gBACnD,SAAS,CAAC,yBAAyB,GAAG,UAAU,CAAC;QACrD,CAAC;QAED,uDAAuD;QACvD,oEAAoE;QACpE,kEAAkE;QAClE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,qBAAqB,GAAwB,aAAa,CAAC;QAC/D,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,qFAAqF,EACrF,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAC7B,CAAC;YACF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,mCAAmC,gBAAgB,mCAAmC,CACvF,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;YACpE,IAAI,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CACb,kDAAkD,aAAa,qCAAqC,SAAS,iCAAiC,CAC/I,CAAC;YACJ,CAAC;YACD,qBAAqB,GAAG;gBACtB,GAAG,aAAa;gBAChB;oBACE,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,UAAU;oBACrB,YAAY,EAAE,gBAAgB;iBAC/B;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,kEAAkE;YAClE,2DAA2D;YAC3D,kEAAkE;YAClE,mEAAmE;YACnE,oCAAoC;YACpC,qBAAqB,GAAG,MAAM,4BAA4B,CAAC;gBACzD,OAAO;gBACP,aAAa;gBACb,SAAS,EAAE,SAAS,IAAI,EAAE;gBAC1B,WAAW,EAAE,MAAM;gBACnB,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;gBAC/C,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,OAAO;YACP,MAAM;YACN,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,qBAAqB;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,qEAAqE;QACrE,6EAA6E;QAC7E,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,iEAAiE;QACjE,IAAI,sBAAsB,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/E,IAAI,CAAC;gBACH,4DAA4D;gBAC5D,0DAA0D;gBAC1D,0DAA0D;gBAC1D,yDAAyD;gBACzD,MAAM,MAAM,GACV,CAAC,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC;oBAClE,CAAC,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC;oBAClE,CAAC,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC;oBAChE,SAAS,CAAC;gBACZ,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,sBAAsB,CACvC,UAAU,CAAC,IAAI,EACf,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAC3D,CAAC;gBACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;wBAC3B,MAAM,OAAO,CAAC,GAAG,CACf;;;;;;;;;;;0DAW4C,EAC5C;4BACE,QAAQ,EAAE,MAAM,CAAC,MAAM;4BACvB,SAAS;4BACT,EAAE,EAAE,UAAU,EAAE;4BAChB,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,CAAC,CAAC,OAAO;4BAClB,MAAM,EAAE,OAAO,UAAU,CAAC,eAAe,KAAK,QAAQ;gCACpD,CAAC,CAAC,UAAU,CAAC,eAAe;gCAC5B,CAAC,CAAC,cAAc;4BAClB,OAAO,EAAE,CAAC,CAAC,OAAO;4BAClB,KAAK;yBACN,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,GAAG,CACT,6BAA6B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;oBACxD,YAAY,UAAU,CAAC,IAAI,IAAI,GAAG,WAAW,UAAU,CAAC,MAAM,qBAAqB,UAAU,CAAC,MAAM,GAAG,CAC1G,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAI,UAAU,CAAC,IAAe,CAAC,MAAM,CAAC;gBACnD,OAAO,CAAC,KAAK,CACX,mCAAmC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;oBAC9D,YAAY,OAAO,WAAW,GAAG,GAAG,CACvC,CAAC;gBACF,2EAA2E;YAC7E,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,4EAA4E;QAC5E,6EAA6E;QAC7E,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA0B,CAAC,IAAI;gBAC9B,mDAAmD,EACrD,CAAC;YACD,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,KAAK,CACX,yCAAyC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACzD,CAAC,MAAM;oBACL,CAAC,CAAC,gBAAgB,MAAM,CAAC,QAAQ,QAAQ,MAAM,CAAC,SAAS,GAAG;oBAC5D,CAAC,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAC5D,CAAC;YAEF,IAAI,CAAC;gBACH,IAAI,WAAmB,CAAC;gBACxB,IAAI,YAAqC,CAAC;gBAE1C,IAAI,MAAM,EAAE,CAAC;oBACX,0EAA0E;oBAC1E,WAAW,GAAG;uBACD,QAAQ;qDACsB,MAAM,CAAC,QAAQ;;WAEzD,CAAC;oBACF,YAAY,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG;uBACD,QAAQ;;;;WAIpB,CAAC;oBACF,YAAY,GAAG,EAAE,SAAS,EAAE,CAAC;gBAC/B,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;gBAClE,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAW,CAAC;oBACvE,MAAM,MAAM,GAAG,MAAM;wBACnB,CAAC,CAAC,gBAAgB,MAAM,CAAC,QAAQ,QAAQ,MAAM,CAAC,SAAS,cAAc;wBACvE,CAAC,CAAC,8BAA8B,CAAC;oBACnC,OAAO,CAAC,KAAK,CACX,6CAA6C,UAAU,EAAE,CAC1D,CAAC;oBACF,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,IAAI,MAAM,mDAAmD,CAC3G,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,oEAAoE;gBACpE,IACE,WAAW,YAAY,KAAK;oBAC5B,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,EACrD,CAAC;oBACD,MAAM,WAAW,CAAC;gBACpB,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,WAAW,CAAC,CAAC;gBAChF,0EAA0E;YAC5E,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,uBAAuB,CACrC,OAAe;IAEf,mFAAmF;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,oFAAoF;AACpF,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,MAAM,UAAU,uBAAuB,CACrC,MAAgB,EAChB,UAAmC;IAEnC,MAAM,KAAK,GAAa,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACjE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"memory-write.js","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ export default defineConfig({
45
45
  // Task 436 — revision-stamping restored under the specialist gate
46
46
  // (single-TX SET + revision CREATE).
47
47
  "src/lib/__tests__/compiled-truth-revision.test.ts",
48
+ // Vertical relationship-pattern projector + warn-only edge check.
49
+ "src/lib/__tests__/relationship-patterns.test.ts",
48
50
  ],
49
51
  testTimeout: 10_000,
50
52
  },
@@ -19,18 +19,21 @@ When loading this reference, confirm: "Using schema-base + schema-construction".
19
19
  | QuoteDocument | `QuoteDocument` | `schema:DigitalDocument` | `accountId`, `jobId`, `ref`, `totalPaymentDue`, `date`, `status` (draft/sent/accepted) |
20
20
  | VariationNote | `VariationNote` | `schema:DigitalDocument` | `accountId`, `jobId`, `variationNumber`, `description`, `totalPaymentDue`, `status` |
21
21
  | InboundInvoice | `InboundInvoice` | `schema:Invoice` | `accountId`, `supplier`, `confirmationNumber`, `totalPaymentDue`, `status` (pending/approved/processed) |
22
- | SubContractor | `SubContractor` | `schema:Person` (extended) | `accountId`, `name`, `whatsappNumber`, `dayRate` |
23
- | TimeLog | `TimeLog` | `schema:Action` | `accountId`, `subContractorId`, `jobId`, `date`, `days` |
24
- | SubInvoice | `SubInvoice` | `schema:Invoice` | `accountId`, `subContractorId`, `jobId`, `period`, `days`, `totalPaymentDue`, `status` |
22
+ | Worker | `Worker` (label on `Person`) | `schema:Person` (config) | `accountId`, `personId`, `name`, `engagement` (employee/cis), `dayRatePence`, `showCisDeduction`, `invoiceEmail` |
23
+ | CheckIn | `CheckIn` | `schema:Action` | `accountId`, `personId`, `source`, `date`, `site`, `description`, `dayHundredths` |
25
24
  | WhatsAppGroup | `WhatsAppGroup` | `cdm:Channel` | `accountId`, `groupId`, `jobId`, `clientName` |
26
25
 
27
26
  `awardedDate` on `Job` is expected once `status` is `active` or `complete` — a job still `quoting` has no award date. Never write a sentinel value (`"pending"`, `""`) to stand in for an unknown date; omit the property until the real date is known.
28
27
 
29
- These entities model a general builder job folder: a `Job` carries many `LineItem` rows organised by trade stage, a generated client `QuoteDocument`, supplier and sub-contractor invoices, and per-trade structure. A residential building job's line items typically span stages such as groundworks, sub-structure, superstructure, roof, structural alterations & envelope, first fix, drylining & plastering, floor screed, second fixing, knock-throughs, windows & doors, completion items and preliminaries, plus sub-contractor trades (scaffolding, roofing, electrical, plumbing, plastering, tiling, decorations). The schema carries no client, job, or pricing data of its own — those are per-account runtime values.
28
+ These entities model a general builder job folder: a `Job` has a generated client `QuoteDocument` that carries many `LineItem` rows organised by trade stage, supplier and sub-contractor invoices, and per-trade structure. A residential building job's line items typically span stages such as groundworks, sub-structure, superstructure, roof, structural alterations & envelope, first fix, drylining & plastering, floor screed, second fixing, knock-throughs, windows & doors, completion items and preliminaries, plus sub-contractor trades (scaffolding, roofing, electrical, plumbing, plastering, tiling, decorations). The schema carries no client, job, or pricing data of its own — those are per-account runtime values.
30
29
 
31
30
  ### Distinctions from schema-trades
32
31
 
33
- `QuoteDocument` is the generated client quote artefact (the `Q-XXXX` document), distinct from schema-trades' `Quote` (a pre-acceptance Order estimate). `InboundInvoice` and `SubInvoice` are received/payable invoices with job + trade assignment, distinct from the base `Invoice`. `SubContractor` extends base `Person` with `dayRate` and `whatsappNumber`; use it as an additional label on a `Person` node where the subcontractor is also a known person, or standalone where only the WhatsApp identity is known.
32
+ `QuoteDocument` is the generated client quote artefact (the `Q-XXXX` document), distinct from schema-trades' `Quote` (a pre-acceptance Order estimate). `InboundInvoice` is a received/payable invoice with job + trade assignment, distinct from the base `Invoice`. A subcontractor company's received invoices use the same `InboundInvoice` model as any other supplier.
33
+
34
+ ### Field-worker time and pay
35
+
36
+ A field worker's time and pay is the `:Worker`/`:CheckIn` model. `:Worker` is an operator-config label on the worker's `:Person` (engagement, day rate, whether the CIS deduction shows, the office invoice address); `:CheckIn` is one record per working day, linked to the worker by `(:Worker)-[:LOGGED]->(:CheckIn)` and unified for roll-up by the shared `personId`. The timesheet skill rolls the check-ins for a period into a per-worker timesheet, and for a CIS worker an invoice that is rendered and emailed, not stored as a node.
34
37
 
35
38
  ---
36
39
 
@@ -43,32 +46,51 @@ MERGE keys per label:
43
46
  - `:QuoteDocument` — `(accountId, ref)`
44
47
  - `:VariationNote` — `(accountId, jobId, variationNumber)`
45
48
  - `:InboundInvoice` — `(accountId, supplier, confirmationNumber)`
46
- - `:SubContractor` — `(accountId, whatsappNumber)`
47
- - `:SubInvoice` — `(accountId, subContractorId, period)`
48
49
  - `:WhatsAppGroup` — `(accountId, groupId)`
49
- - `:LineItem` — `(accountId, jobId, trade, description)` — child of `:Job`, write-time MERGE only
50
+ - `:LineItem` — `(accountId, jobId, trade, description)` — child of the `:QuoteDocument`, write-time MERGE only
50
51
  - `:Milestone` — `(accountId, jobId, name)` — child of `:Job`, write-time MERGE only
51
- - `:TimeLog` — `(accountId, subContractorId, jobId, date)` — write-time MERGE only
52
+ - `:Worker` — `(accountId, personId)` — an additional label on the worker's `:Person`, set via `memory-update`
53
+ - `:CheckIn` — `(accountId, personId, date)` — child of the worker's `:Person`, write-time MERGE only
52
54
 
53
55
  ---
54
56
 
55
57
  ## Relationship Patterns
56
58
 
57
59
  ```
58
- (:Job)-[:HAS_LINE_ITEM]->(:LineItem)
59
60
  (:Job)-[:HAS_VALUATION]->(:Valuation)
60
61
  (:Job)-[:HAS_MILESTONE]->(:Milestone)
61
62
  (:Job)-[:HAS_QUOTE]->(:QuoteDocument)
63
+ (:QuoteDocument)-[:HAS_LINE_ITEM]->(:LineItem)
64
+ (:Valuation)-[:VALUES]->(:LineItem)
62
65
  (:Job)-[:HAS_VARIATION]->(:VariationNote)
63
66
  (:Job)-[:FOR_CLIENT]->(:Person)
64
67
  (:Job)-[:AT_ADDRESS]->(:PostalAddress)
65
68
  (:InboundInvoice)-[:ASSIGNED_TO]->(:Job)
66
69
  (:InboundInvoice)-[:FROM_SUPPLIER]->(:Organization)
67
- (:SubContractor)-[:LOGGED]->(:TimeLog)
68
- (:TimeLog)-[:ON_JOB]->(:Job)
69
- (:SubInvoice)-[:FOR_SUBCONTRACTOR]->(:SubContractor)
70
- (:SubInvoice)-[:ON_JOB]->(:Job)
70
+ (:Worker)-[:LOGGED]->(:CheckIn)
71
71
  (:WhatsAppGroup)-[:MAPPED_TO]->(:Job)
72
72
  ```
73
73
 
74
- Every `:Job` is the parent node for its line items, valuations, milestones, quotes, and variations, satisfying the ≥1-adjacency write-gate doctrine. A `:Job` links to its client (`:Person`) and site (`:PostalAddress`); inbound supplier invoices link to the `:Job` they are assigned to and the `:Organization` that issued them.
74
+ Every `:Job` is the parent node for its valuations, milestones, quotes, and variations, satisfying the ≥1-adjacency write-gate doctrine. Line items are **not** a direct child of the `:Job`: a `:LineItem` is one row of the priced contract schedule, owned by the `:QuoteDocument` that priced it, and reached from the job through the quote — `(:Job)-[:HAS_QUOTE]->(:QuoteDocument)-[:HAS_LINE_ITEM]->(:LineItem)`. Each valuation links the lines it measures with `(:Valuation)-[:VALUES]->(:LineItem)`; the per-line percent-complete a valuation records is carried valuation state, not a property of the edge or the line. A `:Job` links to its client (`:Person`) and site (`:PostalAddress`); inbound supplier invoices link to the `:Job` they are assigned to and the `:Organization` that issued them.
75
+
76
+ ---
77
+
78
+ ## Filesystem ↔ graph (base template)
79
+
80
+ The graph is a disciplined projection of the operator's job folder: every node corresponds to a filesystem artefact, and the edges follow the folder containment. This mapping is the **base template** — the default a standard building-contractor job folder projects into. It is shipped-generic; the folder names, sheet names and trade list below are the common default, not any operator's data.
81
+
82
+ A standard job folder, `{jobId} - {name}, {address} ({client})/`, projects as:
83
+
84
+ | Folder / artefact | Node | Edge from the job |
85
+ |---|---|---|
86
+ | the job folder itself | `:Job` | — (the hub); `(:Job)-[:FOR_CLIENT]->(:Person)`, `(:Job)-[:AT_ADDRESS]->(:PostalAddress)` |
87
+ | `Quotations/` — the client quote (`Q {jobId}`) and its priced schedule | `:QuoteDocument`; its priced rows → `:LineItem` | `(:Job)-[:HAS_QUOTE]->(:QuoteDocument)-[:HAS_LINE_ITEM]->(:LineItem)` |
88
+ | `Finances/Valuations/` — one interim valuation per cycle | `:Valuation`; each measures the priced lines | `(:Job)-[:HAS_VALUATION]->(:Valuation)-[:VALUES]->(:LineItem)` |
89
+ | the variations register | `:VariationNote` | `(:Job)-[:HAS_VARIATION]->(:VariationNote)` |
90
+ | `Contractors/<Trade>/{Enquiries,Quotes,Invoices,Superseded}` | `:Organization`; invoices → `:InboundInvoice` | `(:InboundInvoice)-[:ASSIGNED_TO]->(:Job)`, `(:InboundInvoice)-[:FROM_SUPPLIER]->(:Organization)` |
91
+ | `Suppliers/<Supplier>/{Enquiries,Quotes,Invoices,Superseded}` | `:Organization`; invoices → `:InboundInvoice` | `(:InboundInvoice)-[:ASSIGNED_TO]->(:Job)`, `(:InboundInvoice)-[:FROM_SUPPLIER]->(:Organization)` |
92
+ | `Drawings/`, `Health & Safety/`, `Emails/`, `Snagging/`, `Meetings/`, `Programs/`, `Materials/`, `Admin/` | ingested documents (`:KnowledgeDocument` + `:Section`) | linked to the `:Job` |
93
+
94
+ A contractor who keeps the whole job in one master workbook holds the same model in sheets rather than folders: a cover/calculation sheet is the priced schedule (`:QuoteDocument` + `:LineItem`s), one sheet per valuation cycle is a `:Valuation` measuring those lines, a variations sheet is the `:VariationNote` register, and per-trade sheets are the sub-contractor packages. Folder and workbook are two views of one job; both project into this same graph.
95
+
96
+ Operators vary this template — they rename folders, add trades, restructure their workbook. This template is the shipped-generic default the agent projects against; the graph follows this one canonical ontology, not a per-operator schema. Where a real folder does not fit the default, the agent maps it to the nearest canonical node rather than inventing a node or edge type absent from this reference.
@@ -63,6 +63,10 @@ const ALLOWLIST = new Set([
63
63
  // tree and sets MAXY_PLATFORM_ROOT before the route module (and its
64
64
  // data-path/attachments deps) read the env at import.
65
65
  'platform/ui/server/routes/admin/__tests__/files-write.test.ts',
66
+ // Same vi.hoisted pattern: the public-reader test builds a tmp DATA_ROOT
67
+ // before the `data-path` mock fires, so the serve endpoint reads real
68
+ // sidecar fixtures written under it.
69
+ 'platform/ui/server/routes/__tests__/public-reader.test.ts',
66
70
  ])
67
71
 
68
72
  const REQUIRE_CALL_RE = /\brequire\s*\(/
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAY3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAsBzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAwGD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAQD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAgqEpD"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAY3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAsBzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAwGD,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpG;AAiBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAER;AAkCD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe5F;AAwJD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CA4sEpD"}
@@ -191,6 +191,14 @@ const AUTO_ARCHIVE_SPECIALIST = 'database-operator';
191
191
  export function forkArgvSegment(fromSessionId, newSessionId, model) {
192
192
  return ['--resume', fromSessionId, '--fork-session', '--session-id', newSessionId, '--model', model];
193
193
  }
194
+ // Task 928 — the re-seat fork carries an optional permission mode (pushed as the
195
+ // `--permission-mode` argv flag) and an optional effort (merged into the
196
+ // per-spawn inline `--settings` as `effortLevel`). Both are validated here as a
197
+ // shape defence-in-depth: the UI route is the authoritative allowlist gate, but
198
+ // a malformed value must never reach the child argv. Mirrors the canonical sets
199
+ // in webchat.ts / rc-daemon. `dontAsk` and `max` are excluded (not fork-writable).
200
+ const FORK_PERMISSION_MODES = new Set(['default', 'acceptEdits', 'plan', 'auto', 'bypassPermissions']);
201
+ const FORK_EFFORT_LEVELS = new Set(['low', 'medium', 'high', 'xhigh']);
194
202
  // Task 879 — the re-seated fork inherits the source's history, including the
195
203
  // source's earlier self-identification on the OLD model. The rc-spawn path does
196
204
  // not compose --append-system-prompt (only fresh spawnSession does), so the
@@ -762,6 +770,11 @@ export function buildHttpApp(deps) {
762
770
  const personId = typeof body.personId === 'string' && body.personId.length > 0 && body.personId.length <= 128
763
771
  ? body.personId
764
772
  : undefined;
773
+ // Task 884 — open-mode visitor anchor (the maxy_visitor cookie). Validated
774
+ // as a UUID, the same shape /api/session mints; absent on gated spawns.
775
+ const visitorId = typeof body.visitorId === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(body.visitorId)
776
+ ? body.visitorId
777
+ : undefined;
765
778
  // Task 756 — the per-conversation webchat native channel for a public
766
779
  // spawn. Shape-validated here (all three fields are non-empty strings, the
767
780
  // gateway is loopback http) before it reaches the spawn, which composes it
@@ -849,6 +862,7 @@ export function buildHttpApp(deps) {
849
862
  conversationNodeId,
850
863
  sliceToken,
851
864
  personId,
865
+ visitorId,
852
866
  webchatChannel,
853
867
  });
854
868
  if (!result.ok) {
@@ -1768,6 +1782,11 @@ export function buildHttpApp(deps) {
1768
1782
  // path to import the models lib, so it guards on shape, not the exact list).
1769
1783
  const forkFromSessionId = typeof body.forkFromSessionId === 'string' && UUID_PATTERN.test(body.forkFromSessionId) ? body.forkFromSessionId : null;
1770
1784
  const reseatModel = typeof body.model === 'string' && /^claude-[a-z0-9.-]+(\[1m\])?$/i.test(body.model) ? body.model : null;
1785
+ // Task 928 — fork-carried levers. `null` when the field is present but not in
1786
+ // the allowlist (rejected below, on the fork path only); `undefined` when
1787
+ // absent (the fork keeps the settings-resolved mode / the harness default effort).
1788
+ const reseatPermissionMode = typeof body.permissionMode === 'string' ? (FORK_PERMISSION_MODES.has(body.permissionMode) ? body.permissionMode : null) : undefined;
1789
+ const reseatEffort = typeof body.effort === 'string' ? (FORK_EFFORT_LEVELS.has(body.effort) ? body.effort : null) : undefined;
1771
1790
  // Task 626 — per-visitor slice ringfence for the public session-end review
1772
1791
  // rc session. Shape-gated identically to /public-spawn so a body-controlled
1773
1792
  // value cannot reach the child env. Absent on channel-admin / LinkedIn.
@@ -1864,6 +1883,17 @@ export function buildHttpApp(deps) {
1864
1883
  timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
1865
1884
  return c.json({ error: 're-seat target id already exists' }, 400);
1866
1885
  }
1886
+ // Task 928 — a present-but-disallowed mode/effort is a hard reject (no
1887
+ // spawn), not a silent drop, so a UI bug cannot land a fork on an
1888
+ // unintended lever.
1889
+ if (reseatPermissionMode === null) {
1890
+ timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
1891
+ return c.json({ error: 're-seat permissionMode is not allowed' }, 400);
1892
+ }
1893
+ if (reseatEffort === null) {
1894
+ timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
1895
+ return c.json({ error: 're-seat effort is not allowed' }, 400);
1896
+ }
1867
1897
  }
1868
1898
  // Task 896 — a plain resume (NOT a fork spawn) of a re-seated source id must
1869
1899
  // not start a second live process beside the fork. Resolve the marker chain
@@ -1936,6 +1966,11 @@ export function buildHttpApp(deps) {
1936
1966
  // ordinary fresh/resume single-id push is replaced by the fork segment.
1937
1967
  if (forkFromSessionId !== null && reseatModel !== null && sessionId) {
1938
1968
  argv.push(...forkArgvSegment(forkFromSessionId, sessionId, reseatModel));
1969
+ // Task 928 — the picked permission mode rides the fork as the canonical CLI
1970
+ // flag (the same flag the daemon spawn uses). Absent => the fork keeps the
1971
+ // settings-resolved mode, unchanged from a model-only re-seat.
1972
+ if (reseatPermissionMode)
1973
+ argv.push('--permission-mode', reseatPermissionMode);
1939
1974
  // Task 879 — authoritative current-model signal for the fork only.
1940
1975
  appendSegments.push(reseatIdentityPrompt(reseatModel));
1941
1976
  }
@@ -1949,7 +1984,14 @@ export function buildHttpApp(deps) {
1949
1984
  // waived so the disclaimer is suppressed whatever mode the session resolves
1950
1985
  // to. Per Task 574 doctrine the waiver is per-spawn (never written into
1951
1986
  // settings.json / .claude.json, which would permanently waive it).
1952
- argv.push('--settings', JSON.stringify({ skipDangerousModePermissionPrompt: true, skipAutoPermissionPrompt: true }));
1987
+ // Task 928 the picked effort rides the fork in the SAME per-spawn inline
1988
+ // settings (never the shared settings.json — that would change every later
1989
+ // spawn's effort fleet-wide). effortLevel only when this is a fork with a
1990
+ // valid effort; a model-only or mode-only re-seat leaves it unset.
1991
+ const inlineSettings = { skipDangerousModePermissionPrompt: true, skipAutoPermissionPrompt: true };
1992
+ if (forkFromSessionId !== null && reseatEffort)
1993
+ inlineSettings.effortLevel = reseatEffort;
1994
+ argv.push('--settings', JSON.stringify(inlineSettings));
1953
1995
  // Task 677 P2 — admin WhatsApp native channel. When the caller supplies
1954
1996
  // waChannel, register the per-sender channel server in its own --mcp-config
1955
1997
  // (additive; rc-spawn carries no --strict-mcp-config) and activate it as a
@@ -2091,7 +2133,6 @@ export function buildHttpApp(deps) {
2091
2133
  brandedNeo4jUri: process.env.NEO4J_URI ?? '',
2092
2134
  brandedNeo4jPassword: process.env.NEO4J_PASSWORD ?? '',
2093
2135
  sliceToken,
2094
- personId,
2095
2136
  });
2096
2137
  // Task 606 — standing startup signal: confirms per-spawn whether the
2097
2138
  // child env carries a session id. `mode=new` when none was requested
@@ -2117,12 +2158,15 @@ export function buildHttpApp(deps) {
2117
2158
  // settings.json permissions.defaultMode (else 'default'); mirror that
2118
2159
  // resolution for the classification sidecar and the lifeline.
2119
2160
  const settingsPermissionMode = resolveSettingsPermissionMode(deps.claudeConfigDir);
2161
+ // Task 928 — when the fork carries a picked mode, the argv flag governs (not
2162
+ // settings.json), so the lifeline and the sidecar must report the picked mode.
2163
+ const effectiveRcPermissionMode = forkFromSessionId !== null && reseatPermissionMode ? reseatPermissionMode : settingsPermissionMode;
2120
2164
  // Step 2 — the exact claude argv (the inner command). The systemd-run
2121
2165
  // wrap is composed by the spawnPty adapter; logging the inner argv
2122
2166
  // here is enough for an operator to reproduce by hand. The wrapped
2123
2167
  // argv is fully reconstructible from this line + the spawn adapter
2124
2168
  // source (Task 250 / 556).
2125
- deps.logger(`[rc-spawn] op=argv unitToken=${unitToken} cwd=${deps.spawnCwd} permissionMode=${settingsPermissionMode} argv=${JSON.stringify([deps.claudeBin, ...argv])}`);
2169
+ deps.logger(`[rc-spawn] op=argv unitToken=${unitToken} cwd=${deps.spawnCwd} permissionMode=${effectiveRcPermissionMode} argv=${JSON.stringify([deps.claudeBin, ...argv])}`);
2126
2170
  emitRcLife(deps.logger, 'argv', 'rc-spawn', 'node-pty', rcLifeMode, unitToken, {
2127
2171
  cwd: deps.spawnCwd,
2128
2172
  argv: JSON.stringify([deps.claudeBin, ...argv]),
@@ -2222,7 +2266,7 @@ export function buildHttpApp(deps) {
2222
2266
  // choice); the /chat chip renders this. effectivePermissionMode
2223
2267
  // stays null: the Task 278 tail is auto-only and rc-spawn
2224
2268
  // passes no --debug=auto-mode.
2225
- permissionMode: settingsPermissionMode,
2269
+ permissionMode: effectiveRcPermissionMode,
2226
2270
  effectivePermissionMode: null,
2227
2271
  model: null,
2228
2272
  hidden: false,
@@ -2235,6 +2279,11 @@ export function buildHttpApp(deps) {
2235
2279
  // Task 865 — admin-webchat author identity from the rc-spawn body;
2236
2280
  // null for public and one-shot sessions, which carry none.
2237
2281
  adminUserId: adminUserId ?? null,
2282
+ // Task 884 — open-mode anchor + per-agent scope are stamped only on
2283
+ // the /public-spawn path; the rc-spawn write carries neither, so
2284
+ // both are null here.
2285
+ visitorId: null,
2286
+ agentSlug: null,
2238
2287
  }, deps.logger);
2239
2288
  deps.watcher.refreshSidecar?.(sessionId);
2240
2289
  }