@rubytech/create-maxy-code 0.1.132 → 0.1.138

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 (128) hide show
  1. package/dist/__tests__/installer-specialist-registration.test.js +5 -40
  2. package/dist/index.js +24 -28
  3. package/dist/specialist-registration.js +0 -15
  4. package/package.json +1 -1
  5. package/payload/platform/lib/graph-search/dist/boosts.d.ts +39 -0
  6. package/payload/platform/lib/graph-search/dist/boosts.d.ts.map +1 -0
  7. package/payload/platform/lib/graph-search/dist/boosts.js +57 -0
  8. package/payload/platform/lib/graph-search/dist/boosts.js.map +1 -0
  9. package/payload/platform/lib/graph-search/dist/dedup.d.ts +29 -0
  10. package/payload/platform/lib/graph-search/dist/dedup.d.ts.map +1 -0
  11. package/payload/platform/lib/graph-search/dist/dedup.js +97 -0
  12. package/payload/platform/lib/graph-search/dist/dedup.js.map +1 -0
  13. package/payload/platform/lib/graph-search/dist/index.d.ts +70 -8
  14. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  15. package/payload/platform/lib/graph-search/dist/index.js +323 -62
  16. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  17. package/payload/platform/lib/graph-search/dist/query-expansion.d.ts +37 -0
  18. package/payload/platform/lib/graph-search/dist/query-expansion.d.ts.map +1 -0
  19. package/payload/platform/lib/graph-search/dist/query-expansion.js +101 -0
  20. package/payload/platform/lib/graph-search/dist/query-expansion.js.map +1 -0
  21. package/payload/platform/lib/graph-search/dist/route.d.ts +29 -0
  22. package/payload/platform/lib/graph-search/dist/route.d.ts.map +1 -0
  23. package/payload/platform/lib/graph-search/dist/route.js +53 -0
  24. package/payload/platform/lib/graph-search/dist/route.js.map +1 -0
  25. package/payload/platform/lib/graph-search/dist/rrf-fusion.d.ts +31 -0
  26. package/payload/platform/lib/graph-search/dist/rrf-fusion.d.ts.map +1 -0
  27. package/payload/platform/lib/graph-search/dist/rrf-fusion.js +57 -0
  28. package/payload/platform/lib/graph-search/dist/rrf-fusion.js.map +1 -0
  29. package/payload/platform/lib/graph-search/src/__tests__/boosts.test.ts +59 -0
  30. package/payload/platform/lib/graph-search/src/__tests__/dedup.test.ts +83 -0
  31. package/payload/platform/lib/graph-search/src/__tests__/query-expansion.test.ts +96 -0
  32. package/payload/platform/lib/graph-search/src/__tests__/route.test.ts +62 -0
  33. package/payload/platform/lib/graph-search/src/__tests__/rrf-fusion.test.ts +39 -0
  34. package/payload/platform/lib/graph-search/src/boosts.ts +61 -0
  35. package/payload/platform/lib/graph-search/src/dedup.ts +108 -0
  36. package/payload/platform/lib/graph-search/src/index.ts +407 -65
  37. package/payload/platform/lib/graph-search/src/query-expansion.ts +129 -0
  38. package/payload/platform/lib/graph-search/src/route.ts +70 -0
  39. package/payload/platform/lib/graph-search/src/rrf-fusion.ts +62 -0
  40. package/payload/platform/neo4j/schema.cypher +80 -1
  41. package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +4 -2
  42. package/payload/platform/plugins/admin/mcp/dist/index.js +6 -4
  43. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  44. package/payload/platform/plugins/docs/references/internals.md +36 -10
  45. package/payload/platform/plugins/docs/references/neo4j.md +63 -0
  46. package/payload/platform/plugins/docs/references/session-retrospective.md +11 -4
  47. package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js +2 -2
  48. package/payload/platform/plugins/graph-viewer/mcp/dist/tools/graph-render.js.map +1 -1
  49. package/payload/platform/plugins/memory/mcp/dist/index.js +114 -5
  50. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  51. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-gate-property.test.d.ts +2 -0
  52. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-gate-property.test.d.ts.map +1 -0
  53. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-gate-property.test.js +25 -0
  54. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-gate-property.test.js.map +1 -0
  55. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/timeline-extractor.test.d.ts +2 -0
  56. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/timeline-extractor.test.d.ts.map +1 -0
  57. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/timeline-extractor.test.js +70 -0
  58. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/timeline-extractor.test.js.map +1 -0
  59. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.d.ts +2 -0
  60. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.d.ts.map +1 -0
  61. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js +50 -0
  62. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js.map +1 -0
  63. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.d.ts +33 -0
  64. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.d.ts.map +1 -0
  65. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.js +99 -0
  66. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-rewriter.js.map +1 -0
  67. package/payload/platform/plugins/memory/mcp/dist/lib/graph-write-gate.d.ts +21 -0
  68. package/payload/platform/plugins/memory/mcp/dist/lib/graph-write-gate.d.ts.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/graph-write-gate.js +24 -0
  70. package/payload/platform/plugins/memory/mcp/dist/lib/graph-write-gate.js.map +1 -1
  71. package/payload/platform/plugins/memory/mcp/dist/lib/timeline-extractor.d.ts +13 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/timeline-extractor.d.ts.map +1 -0
  73. package/payload/platform/plugins/memory/mcp/dist/lib/timeline-extractor.js +151 -0
  74. package/payload/platform/plugins/memory/mcp/dist/lib/timeline-extractor.js.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts +55 -0
  76. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts.map +1 -0
  77. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.js +290 -0
  78. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.js.map +1 -0
  79. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.d.ts +19 -0
  80. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.d.ts.map +1 -0
  81. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.js +102 -0
  82. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-schema.js.map +1 -0
  83. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +18 -1
  84. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
  85. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.js +5 -0
  86. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-update-emit.test.js.map +1 -1
  87. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.js +2 -0
  88. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-emit.test.js.map +1 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
  90. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +14 -0
  91. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
  92. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +29 -0
  93. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts.map +1 -0
  94. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +22 -0
  95. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js.map +1 -0
  96. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.d.ts +31 -1
  97. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.d.ts.map +1 -1
  98. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js +182 -50
  99. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js.map +1 -1
  100. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  101. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +76 -1
  102. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  103. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts +30 -0
  104. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts.map +1 -0
  105. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js +129 -0
  106. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js.map +1 -0
  107. package/payload/platform/plugins/memory/mcp/scripts/backfill-typed-edges.ts +72 -0
  108. package/payload/platform/plugins/memory/mcp/scripts/generate-edge-docs.ts +75 -0
  109. package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
  110. package/payload/platform/plugins/memory/references/schema-base.md +44 -0
  111. package/payload/platform/scripts/seed-neo4j.sh +49 -0
  112. package/payload/platform/templates/agents/admin/IDENTITY.md +4 -3
  113. package/payload/platform/templates/specialists/agents/database-operator.md +9 -1
  114. package/payload/server/{adminuser-self-heal-QAWOZ3JV.js → adminuser-self-heal-YC47O34W.js} +2 -1
  115. package/payload/server/{chunk-JSBRDJBE.js → chunk-HYQNUVGO.js} +9 -1
  116. package/payload/server/{chunk-HCYM5FLU.js → chunk-T3DJD5QR.js} +3 -1
  117. package/payload/server/maxy-edge.js +3 -2
  118. package/payload/server/public/assets/{admin-FcRHAL-3.js → admin-BM9aXUUh.js} +1 -1
  119. package/payload/server/public/assets/{data-Ds37mflX.js → data-Ds2ECtfP.js} +1 -1
  120. package/payload/server/public/assets/{graph-CmWRhaiS.js → graph-BzxObKMM.js} +1 -1
  121. package/payload/server/public/assets/{graph-labels-Ch2r00Gt.js → graph-labels-Dwgep_nr.js} +1 -1
  122. package/payload/server/public/assets/{page-BcHhJXUt.js → page-BlkBsjP2.js} +1 -1
  123. package/payload/server/public/assets/page-h_SA5SVQ.js +51 -0
  124. package/payload/server/public/data.html +3 -3
  125. package/payload/server/public/graph.html +3 -3
  126. package/payload/server/public/index.html +4 -4
  127. package/payload/server/server.js +803 -76
  128. package/payload/server/public/assets/page-BOtNny_4.js +0 -51
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Score boosts (Task 308).
3
+ *
4
+ * Two post-fetch score adjustments that re-rank hybrid hits using
5
+ * properties that the typed-edge hook (Task 305) and compiled-truth
6
+ * migration (Task 306) populate. Both are no-ops on the current corpus
7
+ * until those tasks land — the boost reads a missing property as zero
8
+ * and adds nothing.
9
+ *
10
+ * Boosts are pure functions over the scored hit array. They never query
11
+ * Neo4j; the data they read is already on each hit's `properties` map.
12
+ */
13
+
14
+ export interface ScoredHit {
15
+ nodeId: string;
16
+ properties: Record<string, unknown>;
17
+ score: number;
18
+ }
19
+
20
+ /**
21
+ * Add a flat fractional bump to any hit whose node carries a non-null
22
+ * `compiledTruth` property. Authoritative summaries beat noisy timeline
23
+ * fragments — this puts compiled rows ahead when the score is close.
24
+ *
25
+ * Default weight 0.15 (+15%); the brief reserves room to tune.
26
+ */
27
+ export function applyCompiledTruthBoost<T extends ScoredHit>(
28
+ hits: T[],
29
+ weight = 0.15,
30
+ ): T[] {
31
+ if (weight < 0 || weight > 1) {
32
+ throw new Error(`applyCompiledTruthBoost: weight must be in [0,1], got ${weight}`);
33
+ }
34
+ return hits.map((hit) => {
35
+ const compiled = hit.properties["compiledTruth"];
36
+ if (compiled === null || compiled === undefined || compiled === "") return hit;
37
+ return { ...hit, score: hit.score * (1 + weight) };
38
+ });
39
+ }
40
+
41
+ /**
42
+ * Log-weighted boost scaled by inbound MENTIONS edge count.
43
+ *
44
+ * Formula: `bump = clamp(0.05 + 0.05 * log10(count), 0.05, 0.25)` when
45
+ * count > 0; zero otherwise. So 1 backlink → +5%, 10 → +10%, 100 → +15%,
46
+ * 1000 → +20%, 10000+ → capped at +25%. Backlink-rich nodes (the
47
+ * graph's natural authorities) surface higher.
48
+ *
49
+ * Reads from `hit.properties.backlinkCount` — a property Task 305's
50
+ * post-write hook maintains. Until 305 lands the count is absent and
51
+ * the boost is identity.
52
+ */
53
+ export function applyBacklinkBoost<T extends ScoredHit>(hits: T[]): T[] {
54
+ return hits.map((hit) => {
55
+ const raw = hit.properties["backlinkCount"];
56
+ const count = typeof raw === "number" ? raw : Number(raw);
57
+ if (!Number.isFinite(count) || count <= 0) return hit;
58
+ const bump = Math.max(0.05, Math.min(0.25, 0.05 + 0.05 * Math.log10(count)));
59
+ return { ...hit, score: hit.score * (1 + bump) };
60
+ });
61
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * 4-layer dedup (Task 308).
3
+ *
4
+ * Strict superset of the previous nodeId-only dedup. Catches duplicate
5
+ * representations the typed-edge hook (Task 305) and document-ingest
6
+ * pipeline will inevitably create: slug variants, canonical-name
7
+ * variants, and content-hash duplicates.
8
+ *
9
+ * Order: hits are sorted by descending score FIRST, then walked. The
10
+ * highest-score representative wins on every layer; later entries with
11
+ * the same key on any active layer are dropped. Missing values on a
12
+ * layer (no `slug`, no `canonicalName`, no derivable hash) are not
13
+ * collisions — they simply skip that layer for that row.
14
+ */
15
+
16
+ import { createHash } from "node:crypto";
17
+
18
+ export type DedupLayer = "nodeId" | "slug" | "canonicalName" | "contentHash";
19
+
20
+ export const DEFAULT_LAYERS: DedupLayer[] = [
21
+ "nodeId",
22
+ "slug",
23
+ "canonicalName",
24
+ "contentHash",
25
+ ];
26
+
27
+ interface DedupHit {
28
+ nodeId: string;
29
+ properties: Record<string, unknown>;
30
+ score: number;
31
+ }
32
+
33
+ function readSlug(props: Record<string, unknown>): string | null {
34
+ const slug = props["slug"];
35
+ return typeof slug === "string" && slug.length > 0 ? slug : null;
36
+ }
37
+
38
+ function readCanonicalName(props: Record<string, unknown>): string | null {
39
+ const canonical = props["canonicalName"];
40
+ if (typeof canonical === "string" && canonical.length > 0) {
41
+ return canonical.toLowerCase();
42
+ }
43
+ const name = props["name"];
44
+ if (typeof name === "string" && name.length > 0) {
45
+ return name.toLowerCase();
46
+ }
47
+ return null;
48
+ }
49
+
50
+ function readContentHash(props: Record<string, unknown>): string | null {
51
+ const compiled = props["compiledTruth"];
52
+ const content = props["content"];
53
+ const source = (typeof compiled === "string" && compiled.length > 0)
54
+ ? compiled
55
+ : (typeof content === "string" && content.length > 0 ? content : null);
56
+ if (source === null) return null;
57
+ return createHash("sha256").update(source).digest("hex").slice(0, 16);
58
+ }
59
+
60
+ /**
61
+ * Dedup `hits` across the requested layers. Returns a new array with the
62
+ * highest-scoring representative per collision class, in original
63
+ * descending-score order.
64
+ */
65
+ export function dedup<T extends DedupHit>(
66
+ hits: T[],
67
+ layers: DedupLayer[] = DEFAULT_LAYERS,
68
+ ): T[] {
69
+ const sorted = [...hits].sort((a, b) => b.score - a.score);
70
+ const seen = new Map<DedupLayer, Set<string>>();
71
+ for (const layer of layers) seen.set(layer, new Set());
72
+ const out: T[] = [];
73
+
74
+ for (const hit of sorted) {
75
+ let collision = false;
76
+ const keys: Array<[DedupLayer, string]> = [];
77
+
78
+ for (const layer of layers) {
79
+ let key: string | null;
80
+ switch (layer) {
81
+ case "nodeId":
82
+ key = hit.nodeId;
83
+ break;
84
+ case "slug":
85
+ key = readSlug(hit.properties);
86
+ break;
87
+ case "canonicalName":
88
+ key = readCanonicalName(hit.properties);
89
+ break;
90
+ case "contentHash":
91
+ key = readContentHash(hit.properties);
92
+ break;
93
+ }
94
+ if (key === null) continue;
95
+ if (seen.get(layer)!.has(key)) {
96
+ collision = true;
97
+ break;
98
+ }
99
+ keys.push([layer, key]);
100
+ }
101
+
102
+ if (collision) continue;
103
+ for (const [layer, key] of keys) seen.get(layer)!.add(key);
104
+ out.push(hit);
105
+ }
106
+
107
+ return out;
108
+ }