@rubytech/create-maxy-code 0.1.230 → 0.1.233

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 (106) hide show
  1. package/dist/__tests__/rss-sampler-installer.test.js +27 -0
  2. package/dist/index.js +61 -0
  3. package/package.json +1 -1
  4. package/payload/platform/neo4j/schema.cypher +20 -0
  5. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +39 -1
  6. package/payload/platform/plugins/docs/references/graph.md +12 -0
  7. package/payload/platform/plugins/docs/references/memory-guide.md +26 -0
  8. package/payload/platform/plugins/docs/superpowers/plans/2026-06-01-memory-edge.md +589 -0
  9. package/payload/platform/plugins/memory/.claude-plugin/plugin.json +1 -1
  10. package/payload/platform/plugins/memory/PLUGIN.md +12 -2
  11. package/payload/platform/plugins/memory/mcp/dist/index.js +64 -7
  12. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  13. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js +16 -0
  14. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js.map +1 -1
  15. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-backlinks.test.d.ts +2 -0
  16. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-backlinks.test.d.ts.map +1 -0
  17. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-backlinks.test.js +24 -0
  18. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-backlinks.test.js.map +1 -0
  19. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-tag-normalisation.test.d.ts +2 -0
  20. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-tag-normalisation.test.d.ts.map +1 -0
  21. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-tag-normalisation.test.js +51 -0
  22. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-tag-normalisation.test.js.map +1 -0
  23. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.d.ts +31 -0
  24. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.d.ts.map +1 -1
  25. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.js.map +1 -1
  26. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.d.ts +7 -7
  27. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.js +7 -7
  28. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-backlinks.d.ts +15 -0
  29. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-backlinks.d.ts.map +1 -0
  30. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-backlinks.js +37 -0
  31. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-backlinks.js.map +1 -0
  32. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-tag-normalisation.d.ts +25 -0
  33. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-tag-normalisation.d.ts.map +1 -0
  34. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-tag-normalisation.js +90 -0
  35. package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-tag-normalisation.js.map +1 -0
  36. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.js +117 -0
  37. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.js.map +1 -1
  38. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-compiled-truth-history.test.js +72 -26
  39. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-compiled-truth-history.test.js.map +1 -1
  40. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edge.test.d.ts +2 -0
  41. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edge.test.d.ts.map +1 -0
  42. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edge.test.js +164 -0
  43. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-edge.test.js.map +1 -0
  44. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-inline-rewrite.test.d.ts +2 -0
  45. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-inline-rewrite.test.d.ts.map +1 -0
  46. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-inline-rewrite.test.js +66 -0
  47. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest-inline-rewrite.test.js.map +1 -0
  48. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-timeline-learned-at.test.d.ts +2 -0
  49. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-timeline-learned-at.test.d.ts.map +1 -0
  50. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-timeline-learned-at.test.js +30 -0
  51. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-timeline-learned-at.test.js.map +1 -0
  52. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts +25 -0
  53. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
  54. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +26 -0
  55. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
  56. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts +17 -1
  57. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts.map +1 -1
  58. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js +33 -13
  59. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js.map +1 -1
  60. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts +6 -3
  61. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts.map +1 -1
  62. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js +32 -5
  63. package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js.map +1 -1
  64. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.d.ts +21 -0
  65. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.d.ts.map +1 -0
  66. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.js +51 -0
  67. package/payload/platform/plugins/memory/mcp/dist/tools/memory-edge.js.map +1 -0
  68. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts +37 -0
  69. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts.map +1 -1
  70. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js +72 -0
  71. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js.map +1 -1
  72. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  73. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +1 -0
  74. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  75. package/payload/platform/plugins/memory/skills/challenge/SKILL.md +52 -0
  76. package/payload/platform/plugins/memory/skills/connect/SKILL.md +56 -0
  77. package/payload/platform/plugins/memory/skills/emerge/SKILL.md +87 -0
  78. package/payload/platform/plugins/scheduling/mcp/dist/index.js +1 -1
  79. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  80. package/payload/platform/scripts/rss-sampler.sh +58 -0
  81. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  82. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  83. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  84. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +4 -0
  85. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  86. package/payload/platform/services/claude-session-manager/dist/http-server.js +30 -4
  87. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  88. package/payload/platform/services/claude-session-manager/dist/index.js +23 -0
  89. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  90. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +14 -2
  91. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +27 -0
  93. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  94. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +6 -0
  95. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  96. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -0
  97. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  98. package/payload/platform/templates/specialists/agents/archive-ingest-operator.md +1 -1
  99. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  100. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  101. package/payload/server/{chunk-EXIPYITB.js → chunk-63M3ILJ6.js} +1 -0
  102. package/payload/server/maxy-edge.js +1 -1
  103. package/payload/server/public/assets/admin-DfeXRW1m.js +1 -0
  104. package/payload/server/public/index.html +1 -1
  105. package/payload/server/server.js +1 -1
  106. package/payload/server/public/assets/admin-BKawc0eQ.js +0 -1
@@ -15,11 +15,27 @@ export interface CompiledTruthRevisionRow {
15
15
  writtenAt: string;
16
16
  source: "rewriter" | "operator";
17
17
  }
18
+ /** Task 597: one row per :TimelineEvent linked to the entity. */
19
+ export interface TimelineEventRow {
20
+ timelineEventId: string;
21
+ /** Valid-time: when the fact was true in the world (t.occurredAt). */
22
+ eventDate: string;
23
+ /**
24
+ * Transaction-time: when the store ingested this event (t.learnedAt).
25
+ * Null for nodes written before Task 597 that missed the backfill migration.
26
+ */
27
+ learnedAt: string | null;
28
+ kind: string;
29
+ summary: string;
30
+ }
18
31
  export interface CompiledTruthHistoryResult {
19
32
  entityNodeId: string;
20
33
  revisions: CompiledTruthRevisionRow[];
34
+ /** Task 597: timeline events sorted by eventDate DESC. */
35
+ timelineEvents: TimelineEventRow[];
21
36
  }
22
37
  declare const MAX_REVISIONS_RETURNED = 20;
38
+ declare const MAX_TIMELINE_EVENTS_RETURNED = 50;
23
39
  export declare function memoryCompiledTruthHistory(params: CompiledTruthHistoryParams): Promise<CompiledTruthHistoryResult>;
24
- export { MAX_REVISIONS_RETURNED };
40
+ export { MAX_REVISIONS_RETURNED, MAX_TIMELINE_EVENTS_RETURNED };
25
41
  //# sourceMappingURL=memory-compiled-truth-history.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-compiled-truth-history.d.ts","sourceRoot":"","sources":["../../src/tools/memory-compiled-truth-history.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,wBAAwB,EAAE,CAAC;CACvC;AAED,QAAA,MAAM,sBAAsB,KAAK,CAAC;AAElC,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CA2CrC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"memory-compiled-truth-history.d.ts","sourceRoot":"","sources":["../../src/tools/memory-compiled-truth-history.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACjC;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,0DAA0D;IAC1D,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,QAAA,MAAM,sBAAsB,KAAK,CAAC;AAClC,QAAA,MAAM,4BAA4B,KAAK,CAAC;AAExC,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CAiErC;AAED,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,CAAC"}
@@ -1,18 +1,21 @@
1
1
  /**
2
- * memory-compiled-truth-history — Task 391.
2
+ * memory-compiled-truth-history — Task 391 / Task 597.
3
3
  *
4
- * Returns the `:CompiledTruthRevision` chain for one entity, newest
5
- * first, capped at `MAX_REVISIONS_RETURNED`. Account-scoped at both
6
- * the entity and the revision (defence in depth accountId mismatch
7
- * on either side returns an empty list).
4
+ * Returns the :CompiledTruthRevision chain for one entity (newest first,
5
+ * capped at MAX_REVISIONS_RETURNED) and the entity's :TimelineEvent rows
6
+ * (newest valid-time first, capped at MAX_TIMELINE_EVENTS_RETURNED).
8
7
  *
9
- * Read-only. The agent renders revision diffs in chat from the
10
- * returned rows there is no server-side diff helper because the
11
- * surface is PTY stdout and the LLM composes the comparison.
8
+ * Task 597 adds bi-temporal distinction: each TimelineEventRow carries
9
+ * `eventDate` (valid-time: when the fact was true) and `learnedAt`
10
+ * (transaction-time: when the store first ingested it).
11
+ *
12
+ * Read-only. Account-scoped at both the entity and child nodes (defence
13
+ * in depth — accountId mismatch on either side returns an empty list).
12
14
  */
13
15
  import { int } from "neo4j-driver";
14
16
  import { getSession } from "../lib/neo4j.js";
15
17
  const MAX_REVISIONS_RETURNED = 20;
18
+ const MAX_TIMELINE_EVENTS_RETURNED = 50;
16
19
  export async function memoryCompiledTruthHistory(params) {
17
20
  const { accountId, nodeId } = params;
18
21
  if (!accountId) {
@@ -24,7 +27,7 @@ export async function memoryCompiledTruthHistory(params) {
24
27
  const session = getSession();
25
28
  const t0 = Date.now();
26
29
  try {
27
- const res = await session.run(`MATCH (e) WHERE elementId(e) = $nodeId AND e.accountId = $accountId
30
+ const revRes = await session.run(`MATCH (e) WHERE elementId(e) = $nodeId AND e.accountId = $accountId
28
31
  MATCH (e)-[:HAS_REVISION]->(r:CompiledTruthRevision)
29
32
  WHERE r.accountId = $accountId
30
33
  RETURN r.revisionId AS revisionId,
@@ -34,20 +37,37 @@ export async function memoryCompiledTruthHistory(params) {
34
37
  r.source AS source
35
38
  ORDER BY r.writtenAt DESC
36
39
  LIMIT $limit`, { nodeId, accountId, limit: int(MAX_REVISIONS_RETURNED) });
37
- const revisions = res.records.map((rec) => ({
40
+ const revisions = revRes.records.map((rec) => ({
38
41
  revisionId: String(rec.get("revisionId")),
39
42
  truth: String(rec.get("truth") ?? ""),
40
43
  twin: rec.get("twin"),
41
44
  writtenAt: String(rec.get("writtenAt")),
42
45
  source: rec.get("source"),
43
46
  }));
47
+ const teRes = await session.run(`MATCH (e) WHERE elementId(e) = $nodeId AND e.accountId = $accountId
48
+ MATCH (e)-[:HAS_TIMELINE_EVENT]->(t:TimelineEvent)
49
+ WHERE t.accountId = $accountId
50
+ RETURN t.timelineEventId AS timelineEventId,
51
+ toString(t.occurredAt) AS eventDate,
52
+ toString(t.learnedAt) AS learnedAt,
53
+ t.kind AS kind,
54
+ t.summary AS summary
55
+ ORDER BY t.occurredAt DESC
56
+ LIMIT $limit`, { nodeId, accountId, limit: int(MAX_TIMELINE_EVENTS_RETURNED) });
57
+ const timelineEvents = teRes.records.map((rec) => ({
58
+ timelineEventId: String(rec.get("timelineEventId")),
59
+ eventDate: String(rec.get("eventDate") ?? ""),
60
+ learnedAt: rec.get("learnedAt") != null ? String(rec.get("learnedAt")) : null,
61
+ kind: String(rec.get("kind") ?? ""),
62
+ summary: String(rec.get("summary") ?? ""),
63
+ }));
44
64
  const ms = Date.now() - t0;
45
- process.stderr.write(`[compiled-truth-history] nodeId=${nodeId.slice(0, 12)} ms=${ms} revisions=${revisions.length}\n`);
46
- return { entityNodeId: nodeId, revisions };
65
+ process.stderr.write(`[compiled-truth-history] nodeId=${nodeId.slice(0, 12)} ms=${ms} revisions=${revisions.length} timelineEvents=${timelineEvents.length}\n`);
66
+ return { entityNodeId: nodeId, revisions, timelineEvents };
47
67
  }
48
68
  finally {
49
69
  await session.close();
50
70
  }
51
71
  }
52
- export { MAX_REVISIONS_RETURNED };
72
+ export { MAX_REVISIONS_RETURNED, MAX_TIMELINE_EVENTS_RETURNED };
53
73
  //# sourceMappingURL=memory-compiled-truth-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-compiled-truth-history.js","sourceRoot":"","sources":["../../src/tools/memory-compiled-truth-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA0B7C,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAkC;IAElC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B;;;;;;;;;oBASc,EACd,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAC1D,CAAC;QAEF,MAAM,SAAS,GAA+B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACzC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAA4C;YAChE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAA4B;SACrD,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAmC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,SAAS,CAAC,MAAM,IAAI,CAClG,CAAC;QAEF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"memory-compiled-truth-history.js","sourceRoot":"","sources":["../../src/tools/memory-compiled-truth-history.ts"],"names":[],"mappings":"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"}
@@ -19,9 +19,12 @@
19
19
  * than running unbounded LLM calls on every invocation.
20
20
  *
21
21
  * Phase 5 (Task 391) prunes `:CompiledTruthRevision` rows down to the
22
- * newest 20 per entity. Phase 6 (backlinks) and phase 7 (tag consistency)
23
- * remain deferred. The `phases` schema accepts 1..5 only; values outside
24
- * that range are rejected by zod at the MCP boundary.
22
+ * newest 20 per entity. Phase 6 (Task 596) materialises persistent
23
+ * `:BACKLINKS` edges from `:MENTIONS`/`:REFERENCES`. Phase 7 (Task 596)
24
+ * normalises `tags[]` arrays on `:KnowledgeDocument` nodes and merges
25
+ * `:DefinedTerm {category:'obsidian-tag'}` variants. The `phases` schema
26
+ * accepts 1..7; values outside that range are rejected by zod at the MCP
27
+ * boundary.
25
28
  */
26
29
  import type { PhaseResult, PhaseError } from "../lib/dream-cycle/index.js";
27
30
  export interface MemoryDreamRunParams {
@@ -1 +1 @@
1
- {"version":3,"file":"memory-dream-run.d.ts","sourceRoot":"","sources":["../../src/tools/memory-dream-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,OAAO,KAAK,EAAgB,WAAW,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAgBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAgH/B"}
1
+ {"version":3,"file":"memory-dream-run.d.ts","sourceRoot":"","sources":["../../src/tools/memory-dream-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAUH,OAAO,KAAK,EAAgB,WAAW,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAkBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAoH/B"}
@@ -19,9 +19,12 @@
19
19
  * than running unbounded LLM calls on every invocation.
20
20
  *
21
21
  * Phase 5 (Task 391) prunes `:CompiledTruthRevision` rows down to the
22
- * newest 20 per entity. Phase 6 (backlinks) and phase 7 (tag consistency)
23
- * remain deferred. The `phases` schema accepts 1..5 only; values outside
24
- * that range are rejected by zod at the MCP boundary.
22
+ * newest 20 per entity. Phase 6 (Task 596) materialises persistent
23
+ * `:BACKLINKS` edges from `:MENTIONS`/`:REFERENCES`. Phase 7 (Task 596)
24
+ * normalises `tags[]` arrays on `:KnowledgeDocument` nodes and merges
25
+ * `:DefinedTerm {category:'obsidian-tag'}` variants. The `phases` schema
26
+ * accepts 1..7; values outside that range are rejected by zod at the MCP
27
+ * boundary.
25
28
  */
26
29
  import { getSession } from "../lib/neo4j.js";
27
30
  import { phaseOrphans } from "../lib/dream-cycle/phase-orphans.js";
@@ -29,14 +32,18 @@ import { phaseStaleTruth } from "../lib/dream-cycle/phase-stale-truth.js";
29
32
  import { phaseDeadEdges } from "../lib/dream-cycle/phase-dead-edges.js";
30
33
  import { phaseCitationAudit } from "../lib/dream-cycle/phase-citation-audit.js";
31
34
  import { phasePruneRevisions } from "../lib/dream-cycle/phase-prune-revisions.js";
35
+ import { phaseBacklinks } from "../lib/dream-cycle/phase-backlinks.js";
36
+ import { phaseTagNormalisation } from "../lib/dream-cycle/phase-tag-normalisation.js";
32
37
  import { memoryReportWrite } from "./memory-report-write.js";
33
- const ALL_PHASES = [1, 2, 3, 4, 5];
38
+ const ALL_PHASES = [1, 2, 3, 4, 5, 6, 7];
34
39
  const PHASE_DISPATCH = {
35
40
  1: { name: "orphans", run: phaseOrphans },
36
41
  2: { name: "stale-truth", run: phaseStaleTruth },
37
42
  3: { name: "dead-edges", run: phaseDeadEdges },
38
43
  4: { name: "citation-audit", run: phaseCitationAudit },
39
44
  5: { name: "prune-revisions", run: phasePruneRevisions },
45
+ 6: { name: "backlinks", run: phaseBacklinks },
46
+ 7: { name: "tag-normalisation", run: phaseTagNormalisation },
40
47
  };
41
48
  export async function memoryDreamRun(params) {
42
49
  const start = Date.now();
@@ -118,13 +125,17 @@ export async function memoryDreamRun(params) {
118
125
  SET r.lastEventCursor = $cursor,
119
126
  r.partial = $partial,
120
127
  r.operatorId = $operatorId,
121
- r.phasesRun = $phasesRun`, {
128
+ r.phasesRun = $phasesRun,
129
+ r.phase6Count = $phase6Count,
130
+ r.phase7Count = $phase7Count`, {
122
131
  reportId,
123
132
  accountId,
124
133
  cursor: newCursor,
125
134
  partial,
126
135
  operatorId: operatorId ?? null,
127
136
  phasesRun,
137
+ phase6Count: phaseResults.find((r) => r.phase === 6)?.applied ?? null,
138
+ phase7Count: phaseResults.find((r) => r.phase === 7)?.applied ?? null,
128
139
  });
129
140
  }
130
141
  finally {
@@ -165,6 +176,22 @@ function buildReportBody(input) {
165
176
  lines.push(`- Resume cursor stored on this report; next run continues after this point.`);
166
177
  }
167
178
  }
179
+ if (input.phasesRun.includes(6)) {
180
+ const phase6 = input.phaseResults.find((r) => r.phase === 6);
181
+ lines.push(``);
182
+ lines.push(`## Backlinks (phase 6)`);
183
+ lines.push(phase6
184
+ ? `- proposed=${phase6.proposed} applied=${phase6.applied}`
185
+ : `- not run`);
186
+ }
187
+ if (input.phasesRun.includes(7)) {
188
+ const phase7 = input.phaseResults.find((r) => r.phase === 7);
189
+ lines.push(``);
190
+ lines.push(`## Tag normalisation (phase 7)`);
191
+ lines.push(phase7
192
+ ? `- merged=${phase7.applied}`
193
+ : `- not run`);
194
+ }
168
195
  return lines.join("\n");
169
196
  }
170
197
  //# sourceMappingURL=memory-dream-run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-dream-run.js","sourceRoot":"","sources":["../../src/tools/memory-dream-run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-dream-run.js","sourceRoot":"","sources":["../../src/tools/memory-dream-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface MemoryEdgeParams {
2
+ action: "create" | "delete";
3
+ fromId: string;
4
+ toId: string;
5
+ relationshipType: string;
6
+ properties?: Record<string, unknown>;
7
+ accountId: string;
8
+ }
9
+ export type MemoryEdgeResult = {
10
+ created: boolean;
11
+ } | {
12
+ deleted: boolean;
13
+ } | {
14
+ error: "foreign-node";
15
+ elementId: string;
16
+ } | {
17
+ error: "reserved-type";
18
+ type: string;
19
+ };
20
+ export declare function memoryEdge(params: MemoryEdgeParams): Promise<MemoryEdgeResult>;
21
+ //# sourceMappingURL=memory-edge.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,51 @@
1
+ import { getSession } from "../lib/neo4j.js";
2
+ export async function memoryEdge(params) {
3
+ const { action, fromId, toId, accountId } = params;
4
+ const rawType = params.relationshipType.toUpperCase().replace(/[`\n\r]/g, "");
5
+ if (rawType.startsWith("_")) {
6
+ 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=reserved-type\n`);
7
+ return { error: "reserved-type", type: rawType };
8
+ }
9
+ const session = getSession();
10
+ 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 });
12
+ if (fromCheck.records.length === 0) {
13
+ 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
+ return { error: "foreign-node", elementId: fromId };
15
+ }
16
+ const toCheck = await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId RETURN elementId(n) AS id`, { nodeId: toId, accountId });
17
+ if (toCheck.records.length === 0) {
18
+ 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
+ return { error: "foreign-node", elementId: toId };
20
+ }
21
+ if (action === "create") {
22
+ const props = params.properties ?? {};
23
+ const q = `
24
+ MATCH (a) WHERE elementId(a) = $fromId
25
+ MATCH (b) WHERE elementId(b) = $toId
26
+ MERGE (a)-[r:\`${rawType}\`]->(b)
27
+ ON CREATE SET r += $props, r.createdAt = datetime()
28
+ RETURN r
29
+ `;
30
+ const result = await session.run(q, { fromId, toId, props });
31
+ const created = result.summary.counters.updates().relationshipsCreated > 0;
32
+ process.stderr.write(`[memory-edge] action=create from=${fromId.slice(0, 8)} to=${toId.slice(0, 8)} type=${rawType} accountId=${accountId?.slice(0, 8) ?? "none"} result=${created ? "created" : "idempotent"}\n`);
33
+ return { created };
34
+ }
35
+ else {
36
+ const q = `
37
+ MATCH (a)-[r:\`${rawType}\`]->(b)
38
+ WHERE elementId(a) = $fromId AND elementId(b) = $toId
39
+ DELETE r
40
+ `;
41
+ const result = await session.run(q, { fromId, toId });
42
+ const deleted = result.summary.counters.updates().relationshipsDeleted > 0;
43
+ process.stderr.write(`[memory-edge] action=delete from=${fromId.slice(0, 8)} to=${toId.slice(0, 8)} type=${rawType} accountId=${accountId?.slice(0, 8) ?? "none"} result=${deleted ? "deleted" : "absent"}\n`);
44
+ return { deleted };
45
+ }
46
+ }
47
+ finally {
48
+ await session.close();
49
+ }
50
+ }
51
+ //# sourceMappingURL=memory-edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-edge.js","sourceRoot":"","sources":["../../src/tools/memory-edge.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ClassifiedSection, ClassifierOutput, OrphanCandidate } from "../lib/section-types.js";
2
2
  import { type ConversationSource } from "../lib/conversation-normalisers/types.js";
3
+ import type { InlineRewriteCandidate, InlineRewriteDeferred } from "../lib/compiled-truth-revision.js";
3
4
  export declare function deriveSectionBodies(sections: ReadonlyArray<Pick<ClassifiedSection, "sourceStart" | "sourceEnd" | "body">>, cachedText: string, sourceKey?: string): string[];
4
5
  export declare const RESERVED_SECTION_PROPERTY_KEYS: ReadonlySet<string>;
5
6
  /**
@@ -119,6 +120,27 @@ export interface IngestParams {
119
120
  * counter strings that used to lock `summary` to "Session 1/N: …" are
120
121
  * gone. Ignored on the document path. */
121
122
  archiveTitle?: string;
123
+ /**
124
+ * When true, after writing sections and edges, run the inline
125
+ * compiled-truth reconciliation gate: count MENTIONS/REFERENCES edges
126
+ * from the new document (KD and its sections) to existing entities
127
+ * that have `compiledTruth`. Entities above `inlineRewriteThreshold`
128
+ * and outside the 7-day cooldown are returned as `inlineRewriteCandidates`
129
+ * in the result. Disabled by default.
130
+ */
131
+ inlineRewrite?: boolean;
132
+ /**
133
+ * When `inlineRewrite` is true, bypass the 7-day per-entity cooldown on
134
+ * `compiledTruthUpdatedAt`. All entities above threshold are returned as
135
+ * candidates regardless of when their truth was last rewritten.
136
+ */
137
+ forceRewrite?: boolean;
138
+ /**
139
+ * Minimum count of MENTIONS or REFERENCES edges from the new source
140
+ * (KnowledgeDocument + its sections) to an existing entity for that
141
+ * entity to qualify as an inline-rewrite candidate. Default: 2.
142
+ */
143
+ inlineRewriteThreshold?: number;
122
144
  }
123
145
  /** Per-kind count breakdown the writer returns to the skill. */
124
146
  export interface KindBreakdown {
@@ -152,6 +174,21 @@ export interface IngestResult {
152
174
  * heartbeat WARN line so a destructive `--rebuild` is operator-visible
153
175
  * (defence-in-depth — `--rebuild` is the only legitimate trigger). */
154
176
  cleanedPriorChunks?: number;
177
+ /**
178
+ * Entities above the MENTIONS/REFERENCES threshold that qualify for
179
+ * inline compiled-truth rewrite. Populated only when `inlineRewrite=true`.
180
+ * Dispatch the `compiled-truth-rewriter` specialist for each entity
181
+ * before the calling skill returns — pass `nodeId` and optionally
182
+ * an `operatorHint` if the document suggests a correction.
183
+ */
184
+ inlineRewriteCandidates?: InlineRewriteCandidate[];
185
+ /**
186
+ * Entities above threshold that were skipped because their
187
+ * `compiledTruthUpdatedAt` is within the 7-day cooldown and
188
+ * `forceRewrite` was not set. These remain candidates for the next
189
+ * dream-cycle run.
190
+ */
191
+ inlineRewriteDeferred?: InlineRewriteDeferred[];
155
192
  }
156
193
  export declare function memoryIngest(params: IngestParams): Promise<IngestResult>;
157
194
  //# sourceMappingURL=memory-ingest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-ingest.d.ts","sourceRoot":"","sources":["../../src/tools/memory-ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-ingest.d.ts","sourceRoot":"","sources":["../../src/tools/memory-ingest.ts"],"names":[],"mappings":"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"}
@@ -588,6 +588,53 @@ async function memoryIngestImpl(params) {
588
588
  for (const orphan of orphanCandidates) {
589
589
  console.error(`[document-ingest] orphan-candidate node=${orphan.kind} label=${JSON.stringify(orphan.label)} reason=${JSON.stringify(orphan.reason)}`);
590
590
  }
591
+ // Inline compiled-truth reconciliation gate (opt-in — Task 595).
592
+ // Only runs on the document path; conversation-archive path has no
593
+ // MENTIONS edges at ingest time (those come from the enrich phase).
594
+ let inlineRewriteCandidates;
595
+ let inlineRewriteDeferred;
596
+ if (params.inlineRewrite) {
597
+ const threshold = params.inlineRewriteThreshold ?? 2;
598
+ const rows = await queryInlineRewriteCandidates(dbSession, documentNodeId, accountId, threshold);
599
+ inlineRewriteCandidates = [];
600
+ inlineRewriteDeferred = [];
601
+ const cooldownMs = 7 * 24 * 60 * 60 * 1000;
602
+ const cutoffIso = new Date(Date.now() - cooldownMs).toISOString();
603
+ for (const row of rows) {
604
+ const inCooldown = !params.forceRewrite &&
605
+ row.compiledTruthUpdatedAt !== null &&
606
+ row.compiledTruthUpdatedAt > cutoffIso;
607
+ if (inCooldown) {
608
+ inlineRewriteDeferred.push({
609
+ elementId: row.elementId,
610
+ label: row.label,
611
+ name: row.name,
612
+ edgeCount: row.edgeCount,
613
+ reason: "cooldown",
614
+ compiledTruthUpdatedAt: row.compiledTruthUpdatedAt,
615
+ });
616
+ }
617
+ else {
618
+ inlineRewriteCandidates.push({
619
+ elementId: row.elementId,
620
+ label: row.label,
621
+ name: row.name,
622
+ edgeCount: row.edgeCount,
623
+ });
624
+ }
625
+ }
626
+ const logReason = rows.length === 0
627
+ ? "threshold-not-met"
628
+ : inlineRewriteCandidates.length === 0
629
+ ? "cooldown"
630
+ : params.forceRewrite
631
+ ? "force"
632
+ : "";
633
+ console.error(`[memory-ingest] op=compiled-truth-inline accountId=${accountId} kdId=${documentNodeId} ` +
634
+ `entitiesChecked=${rows.length} entitiesRecompiled=${inlineRewriteCandidates.length} ` +
635
+ `entitiesDeferred=${inlineRewriteDeferred.length}` +
636
+ (logReason ? ` reason=${logReason}` : ""));
637
+ }
591
638
  return {
592
639
  documentNodeId,
593
640
  sectionCount: sections.length,
@@ -598,6 +645,8 @@ async function memoryIngestImpl(params) {
598
645
  orphanCandidates,
599
646
  documentSummary,
600
647
  keywords,
648
+ ...(inlineRewriteCandidates !== undefined ? { inlineRewriteCandidates } : {}),
649
+ ...(inlineRewriteDeferred !== undefined ? { inlineRewriteDeferred } : {}),
601
650
  };
602
651
  }
603
652
  finally {
@@ -831,6 +880,29 @@ async function writeRelatedNode(opts) {
831
880
  });
832
881
  return result.records[0].get("nodeId");
833
882
  }
883
+ async function queryInlineRewriteCandidates(session, docNodeId, accountId, threshold) {
884
+ const result = await session.run(`MATCH (doc) WHERE elementId(doc) = $docId
885
+ MATCH (doc)-[:HAS_SECTION*0..1]->(intermediary)
886
+ MATCH (intermediary)-[r:MENTIONS|REFERENCES]->(target)
887
+ WHERE target.accountId = $accountId
888
+ AND NOT target:Trashed
889
+ AND target.compiledTruth IS NOT NULL
890
+ WITH elementId(target) AS eid, target, count(r) AS edgeCount
891
+ WHERE edgeCount >= $threshold
892
+ RETURN eid AS elementId,
893
+ [l IN labels(target) WHERE l IN ['Person', 'Organization', 'Concept', 'Project', 'LocalBusiness']][0] AS label,
894
+ coalesce(target.name, target.title, '<unnamed>') AS name,
895
+ toString(target.compiledTruthUpdatedAt) AS compiledTruthUpdatedAt,
896
+ edgeCount
897
+ ORDER BY edgeCount DESC`, { docId: docNodeId, accountId, threshold });
898
+ return result.records.map((rec) => ({
899
+ elementId: String(rec.get("elementId")),
900
+ label: String(rec.get("label") ?? "Unknown"),
901
+ name: String(rec.get("name")),
902
+ compiledTruthUpdatedAt: rec.get("compiledTruthUpdatedAt"),
903
+ edgeCount: Number(rec.get("edgeCount")),
904
+ }));
905
+ }
834
906
  // ---------------------------------------------------------------------------
835
907
  // Conversation-archive ingest — chat-mode branch (Task 397).
836
908
  //