@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 @@
1
+ {"version":3,"file":"memory-typed-edge-pass.d.ts","sourceRoot":"","sources":["../../src/tools/memory-typed-edge-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MCP tool wrapper for the typed-edge pass.
3
+ *
4
+ * Called by `database-operator` (Task-spawned by admin at the session-end
5
+ * retrospective). Admin does not call this tool directly — it is not in
6
+ * `ADMIN_CORE_TOOLS`. Backfill invokes the underlying `runTypedEdgePass`
7
+ * via the CLI script, bypassing this tool.
8
+ *
9
+ * Returns the pass counters so database-operator can hand them back to
10
+ * admin for the `session-retrospective-mark-complete` call.
11
+ */
12
+ import { runTypedEdgePass } from "../lib/typed-edge-pass.js";
13
+ export async function memoryTypedEdgePass(args, session, accountId) {
14
+ const conversationId = args.conversationId ?? process.env.CONVERSATION_ID ?? null;
15
+ return runTypedEdgePass({
16
+ session,
17
+ accountId,
18
+ sinceIso: args.sinceIso,
19
+ conversationId,
20
+ });
21
+ }
22
+ //# sourceMappingURL=memory-typed-edge-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-typed-edge-pass.js","sourceRoot":"","sources":["../../src/tools/memory-typed-edge-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAiBvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA6B,EAC7B,OAAgB,EAChB,SAAiB;IAEjB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;IAClF,OAAO,gBAAgB,CAAC;QACtB,OAAO;QACP,SAAS;QACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc;KACf,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { COMPILED_TRUTH_MAX_CHARS } from "../lib/graph-write-gate.js";
1
2
  import type { CreatedBy } from "../../../../../lib/graph-write/dist/index.js";
2
3
  interface UpdateParams {
3
4
  nodeId: string;
@@ -5,12 +6,41 @@ interface UpdateParams {
5
6
  accountId: string;
6
7
  /** Provenance stamp — sourced from the MCP server env vars (agent/session). */
7
8
  createdBy: CreatedBy;
9
+ /**
10
+ * Task 306: when true, the rewriter is invoked against the node's most
11
+ * recent :TimelineEvent rows to recompute `compiledTruth`. Direct writes
12
+ * to `compiledTruth` / `compiledTruthUpdatedAt` / `compiledTruthSource`
13
+ * are rejected loudly — this flag is the only path.
14
+ */
15
+ rewriteCompiledTruth?: boolean;
16
+ /**
17
+ * Task 306: bypass the 7-day operator-edit cooldown. The cooldown exists
18
+ * so an automatic rewriter pass does not overwrite an operator-authored
19
+ * summary within a week of the edit. Only set this when the operator
20
+ * explicitly asks for a refresh.
21
+ */
22
+ forceRewrite?: boolean;
8
23
  }
9
24
  interface UpdateResult {
10
25
  nodeId: string;
11
26
  labels: string[];
12
27
  updated: boolean;
28
+ rewriter?: {
29
+ kind: "ok";
30
+ charsBefore: number;
31
+ charsAfter: number;
32
+ } | {
33
+ kind: "refused";
34
+ reason: "no-events" | "operator-edit-cooldown";
35
+ daysRemaining?: number;
36
+ } | {
37
+ kind: "too-long";
38
+ attemptedLen: number;
39
+ } | {
40
+ kind: "llm-failure";
41
+ cause: string;
42
+ };
13
43
  }
14
44
  export declare function memoryUpdate(params: UpdateParams): Promise<UpdateResult>;
15
- export {};
45
+ export { COMPILED_TRUTH_MAX_CHARS };
16
46
  //# sourceMappingURL=memory-update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-update.d.ts","sourceRoot":"","sources":["../../src/tools/memory-update.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AAE9E,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9E"}
1
+ {"version":3,"file":"memory-update.d.ts","sourceRoot":"","sources":["../../src/tools/memory-update.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8CAA8C,CAAC;AAE9E,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,SAAS,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EACL;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACvD;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,WAAW,GAAG,wBAAwB,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3F;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAC1C;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAgBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAO9E;AA2PD,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -1,44 +1,72 @@
1
1
  import { getSession } from "../lib/neo4j.js";
2
2
  import { embed } from "../lib/embeddings.js";
3
3
  import { buildTextRepresentation } from "./memory-write.js";
4
- import { checkGraphWriteGate } from "../lib/graph-write-gate.js";
4
+ import { checkGraphWriteGate, checkPropertyWriteGate, COMPILED_TRUTH_MAX_CHARS, } from "../lib/graph-write-gate.js";
5
5
  import { checkLabelOriginGate } from "../lib/label-origin-gate.js";
6
6
  import { withWriteEvent, pickName } from "../lib/log-ingest.js";
7
+ import { rewriteCompiledTruth, } from "../lib/compiled-truth-rewriter.js";
8
+ /** Stripped silently — operator can't update these via the agent. */
9
+ const RESTRICTED_KEYS = new Set(["embedding", "accountId", "createdAt", "createdOn"]);
10
+ /** Loud-fail keys — write attempts throw rather than silently strip (Task 306). */
11
+ const SYSTEM_MANAGED_KEYS = new Set([
12
+ "compiledTruth",
13
+ "compiledTruthUpdatedAt",
14
+ "compiledTruthSource",
15
+ ]);
16
+ const OPERATOR_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;
17
+ const REWRITER_EVENT_LIMIT = 10;
18
+ const TIMELINE_SUBJECT_LABELS = new Set(["Person", "Organization", "Concept"]);
7
19
  export async function memoryUpdate(params) {
8
20
  const nameHint = pickName(params.properties);
9
21
  return withWriteEvent({ tool: "memory-update", accountId: params.accountId, name: nameHint }, () => memoryUpdateImpl(params), (r) => ({ elementId: r.nodeId, labels: r.labels, name: nameHint }));
10
22
  }
11
23
  async function memoryUpdateImpl(params) {
12
- const { nodeId, properties, accountId, createdBy } = params;
13
- if (Object.keys(properties).length === 0) {
14
- throw new Error("No properties to update provide at least one property.");
24
+ const { nodeId, properties, accountId, createdBy, rewriteCompiledTruth: doRewrite, forceRewrite } = params;
25
+ // Loud-fail on system-managed keys (Task 306). Silent strip is a known
26
+ // failure class the caller thinks the update landed, agents lose track
27
+ // of writer identity, compiledTruth integrity breaks.
28
+ for (const key of Object.keys(properties)) {
29
+ if (SYSTEM_MANAGED_KEYS.has(key)) {
30
+ throw new Error(`Update blocked (system-managed-key): '${key}' cannot be set directly. ` +
31
+ `Use memory-update with rewriteCompiledTruth:true to recompute compiledTruth.`);
32
+ }
33
+ }
34
+ if (Object.keys(properties).length === 0 && !doRewrite) {
35
+ throw new Error("No properties to update — provide at least one property or rewriteCompiledTruth:true.");
36
+ }
37
+ // Property-level cap. compiledTruth direct-write is blocked above; this
38
+ // covers the case where a future property carries the same cap doctrine.
39
+ const propGate = checkPropertyWriteGate({ properties });
40
+ if (!propGate.ok) {
41
+ throw new Error(`Update blocked (${propGate.reason}): ${propGate.message}`);
15
42
  }
16
- // Filter out restricted keys that should not be overwritten by the caller
17
- const restricted = new Set(["embedding", "accountId", "createdAt", "createdOn"]);
43
+ // Filter restricted keys (silently operator can't update these).
18
44
  const safeProps = {};
19
45
  for (const [key, value] of Object.entries(properties)) {
20
- if (!restricted.has(key)) {
46
+ if (!RESTRICTED_KEYS.has(key))
21
47
  safeProps[key] = value;
22
- }
23
48
  }
24
- if (Object.keys(safeProps).length === 0) {
49
+ if (Object.keys(safeProps).length === 0 && !doRewrite) {
25
50
  throw new Error("All provided properties are restricted and cannot be updated.");
26
51
  }
27
52
  const session = getSession();
28
53
  try {
29
- // fetch the target node's labels first so the gate can
30
- // respect the exempt set (Person, LocalBusiness, AdminUser). Labels
31
- // don't mutate on existing nodes in this codebase, so two queries is
32
- // safe and simpler than encoding the exemption inside the update cypher.
54
+ // fetch the target node's labels + compiled-truth state up front. Labels
55
+ // don't mutate on existing nodes; the compiled-truth state is read so the
56
+ // rewriter (if invoked) can enforce the operator cooldown.
33
57
  const labelResult = await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId
34
- RETURN labels(n) AS nodeLabels`, { nodeId, accountId });
58
+ RETURN labels(n) AS nodeLabels,
59
+ n.compiledTruth AS compiledTruth,
60
+ n.compiledTruthSource AS compiledTruthSource,
61
+ n.compiledTruthUpdatedAt AS compiledTruthUpdatedAt,
62
+ n.name AS name`, { nodeId, accountId });
35
63
  if (labelResult.records.length === 0) {
36
64
  throw new Error(`Node not found or not owned by this account (ID: ${nodeId}).`);
37
65
  }
38
- const targetLabels = labelResult.records[0].get("nodeLabels");
39
- // Task 350: refuse agent-origin property mutations against the
40
- // per-account root :LocalBusiness. Same rule as memory-write only
41
- // installer (createdBy.agent === 'system') may touch the root.
66
+ const labelRecord = labelResult.records[0];
67
+ const targetLabels = labelRecord.get("nodeLabels");
68
+ // Task 350 + Task 306: refuse agent-origin property mutations against the
69
+ // per-account root :LocalBusiness.
42
70
  const origin = checkLabelOriginGate({ labels: targetLabels, createdBy, accountId, tool: "memory-update" });
43
71
  if (!origin.ok) {
44
72
  throw new Error(`Update blocked (${origin.reason}): ${origin.message}`);
@@ -47,44 +75,148 @@ async function memoryUpdateImpl(params) {
47
75
  if (!gate.ok) {
48
76
  throw new Error(`Update blocked (${gate.reason}): ${gate.message}`);
49
77
  }
50
- // Match by element ID AND accountId to prevent cross-account edits
51
- const updateQuery = `
52
- MATCH (n)
53
- WHERE elementId(n) = $nodeId AND n.accountId = $accountId
54
- SET n += $props, n.updatedAt = $updatedAt
55
- RETURN elementId(n) AS nodeId, labels(n) AS nodeLabels, properties(n) AS allProps
56
- `;
57
- const result = await session.run(updateQuery, {
58
- nodeId,
59
- accountId,
60
- updatedAt: new Date().toISOString(),
61
- props: safeProps,
62
- });
63
- if (result.records.length === 0) {
64
- throw new Error(`Node not found or not owned by this account (ID: ${nodeId}).`);
78
+ let rewriterOutcome;
79
+ // ----- Property update branch -----
80
+ let updatedNodeId = nodeId;
81
+ let nodeLabels = targetLabels;
82
+ let allProps = {};
83
+ if (Object.keys(safeProps).length > 0) {
84
+ const updateQuery = `
85
+ MATCH (n)
86
+ WHERE elementId(n) = $nodeId AND n.accountId = $accountId
87
+ SET n += $props, n.updatedAt = $updatedAt
88
+ RETURN elementId(n) AS nodeId, labels(n) AS nodeLabels, properties(n) AS allProps
89
+ `;
90
+ const result = await session.run(updateQuery, {
91
+ nodeId,
92
+ accountId,
93
+ updatedAt: new Date().toISOString(),
94
+ props: safeProps,
95
+ });
96
+ if (result.records.length === 0) {
97
+ throw new Error(`Node not found or not owned by this account (ID: ${nodeId}).`);
98
+ }
99
+ const record = result.records[0];
100
+ updatedNodeId = record.get("nodeId");
101
+ nodeLabels = record.get("nodeLabels");
102
+ allProps = record.get("allProps");
103
+ // Re-embed from updated properties
104
+ const propsForEmbed = { ...allProps };
105
+ delete propsForEmbed.embedding;
106
+ delete propsForEmbed.accountId;
107
+ try {
108
+ const textForEmbedding = buildTextRepresentation(nodeLabels, propsForEmbed);
109
+ const embedding = await embed(textForEmbedding);
110
+ await session.run(`MATCH (n) WHERE elementId(n) = $nodeId SET n.embedding = $embedding`, { nodeId: updatedNodeId, embedding });
111
+ }
112
+ catch {
113
+ // Properties were updated successfully — embedding re-computation failed.
114
+ // Stale embedding is acceptable; the node remains searchable with the old vector.
115
+ }
65
116
  }
66
- const record = result.records[0];
67
- const updatedNodeId = record.get("nodeId");
68
- const nodeLabels = record.get("nodeLabels");
69
- const allProps = record.get("allProps");
70
- // Re-embed from updated properties
71
- const propsForEmbed = { ...allProps };
72
- delete propsForEmbed.embedding;
73
- delete propsForEmbed.accountId;
74
- try {
75
- const textForEmbedding = buildTextRepresentation(nodeLabels, propsForEmbed);
76
- const embedding = await embed(textForEmbedding);
77
- await session.run(`MATCH (n) WHERE elementId(n) = $nodeId SET n.embedding = $embedding`, { nodeId: updatedNodeId, embedding });
117
+ else {
118
+ // No property update; still need allProps for the rewriter context.
119
+ const probe = await session.run(`MATCH (n) WHERE elementId(n) = $nodeId RETURN properties(n) AS allProps`, { nodeId });
120
+ allProps = probe.records[0].get("allProps");
78
121
  }
79
- catch {
80
- // Properties were updated successfully — embedding re-computation failed.
81
- // Stale embedding is acceptable; the node remains searchable with the old vector.
82
- // memory-reindex can fix this later.
122
+ // ----- Rewriter branch (Task 306) -----
123
+ if (doRewrite) {
124
+ const isSubject = targetLabels.some((l) => TIMELINE_SUBJECT_LABELS.has(l));
125
+ if (!isSubject) {
126
+ throw new Error(`rewriteCompiledTruth is only valid on :Person / :Organization / :Concept. ` +
127
+ `Got labels: [${targetLabels.join(", ")}]`);
128
+ }
129
+ // Operator cooldown: if compiledTruthSource = 'operator' and the last
130
+ // update is within 7 days, refuse unless forceRewrite is set. The
131
+ // cooldown protects an operator-authored summary from being overwritten
132
+ // by the next backfill / dream-cycle pass.
133
+ const currentSource = labelRecord.get("compiledTruthSource");
134
+ const currentUpdated = labelRecord.get("compiledTruthUpdatedAt");
135
+ if (currentSource === "operator" &&
136
+ currentUpdated &&
137
+ !forceRewrite) {
138
+ const updatedMs = new Date(String(currentUpdated)).getTime();
139
+ const elapsed = Date.now() - updatedMs;
140
+ if (!Number.isNaN(updatedMs) && elapsed < OPERATOR_COOLDOWN_MS) {
141
+ const daysRemaining = Math.ceil((OPERATOR_COOLDOWN_MS - elapsed) / (24 * 60 * 60 * 1000));
142
+ console.log(`[compiled-truth-rewriter] refused nodeId=${nodeId.slice(0, 12)} ` +
143
+ `reason=operator-edit-cooldown daysRemaining=${daysRemaining}`);
144
+ return {
145
+ nodeId: updatedNodeId,
146
+ labels: nodeLabels,
147
+ updated: Object.keys(safeProps).length > 0,
148
+ rewriter: {
149
+ kind: "refused",
150
+ reason: "operator-edit-cooldown",
151
+ daysRemaining,
152
+ },
153
+ };
154
+ }
155
+ }
156
+ // Fetch the most recent N :TimelineEvent rows.
157
+ const eventsResult = await session.run(`MATCH (e) WHERE elementId(e) = $nodeId
158
+ MATCH (e)-[:HAS_TIMELINE_EVENT]->(t:TimelineEvent)
159
+ RETURN toString(t.occurredAt) AS occurredAt, t.kind AS kind, t.summary AS summary
160
+ ORDER BY t.occurredAt DESC
161
+ LIMIT $limit`, { nodeId, limit: REWRITER_EVENT_LIMIT });
162
+ const events = eventsResult.records.map((r) => ({
163
+ occurredAt: r.get("occurredAt"),
164
+ kind: r.get("kind"),
165
+ summary: r.get("summary"),
166
+ }));
167
+ const subjectLabel = targetLabels.find((l) => TIMELINE_SUBJECT_LABELS.has(l));
168
+ const subjectName = typeof allProps.name === "string"
169
+ ? allProps.name
170
+ : typeof allProps.title === "string"
171
+ ? allProps.title
172
+ : "(unnamed)";
173
+ const currentTruth = labelRecord.get("compiledTruth") ?? "";
174
+ const rewrite = await rewriteCompiledTruth({
175
+ subjectLabel,
176
+ subjectName,
177
+ currentTruth,
178
+ events,
179
+ });
180
+ if (rewrite.kind === "ok") {
181
+ // Validate the rewriter output against the cap before writing.
182
+ const writeCheck = checkPropertyWriteGate({
183
+ properties: { compiledTruth: rewrite.compiledTruth },
184
+ });
185
+ if (!writeCheck.ok) {
186
+ // Should not happen — the rewriter enforces this internally — but
187
+ // defend the gate anyway.
188
+ throw new Error(`Rewriter output failed graph-write-gate: ${writeCheck.message}`);
189
+ }
190
+ await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId
191
+ SET n.compiledTruth = $truth,
192
+ n.compiledTruthUpdatedAt = datetime(),
193
+ n.compiledTruthSource = 'rewriter'`, { nodeId, accountId, truth: rewrite.compiledTruth });
194
+ rewriterOutcome = {
195
+ kind: "ok",
196
+ charsBefore: currentTruth.length,
197
+ charsAfter: rewrite.compiledTruth.length,
198
+ };
199
+ }
200
+ else if (rewrite.kind === "refused") {
201
+ rewriterOutcome = { kind: "refused", reason: "no-events" };
202
+ }
203
+ else if (rewrite.kind === "too-long") {
204
+ rewriterOutcome = { kind: "too-long", attemptedLen: rewrite.attemptedLen };
205
+ }
206
+ else {
207
+ rewriterOutcome = { kind: "llm-failure", cause: rewrite.fallback.cause };
208
+ }
83
209
  }
84
- return { nodeId: updatedNodeId, labels: nodeLabels, updated: true };
210
+ return {
211
+ nodeId: updatedNodeId,
212
+ labels: nodeLabels,
213
+ updated: Object.keys(safeProps).length > 0,
214
+ rewriter: rewriterOutcome,
215
+ };
85
216
  }
86
217
  finally {
87
218
  await session.close();
88
219
  }
89
220
  }
221
+ export { COMPILED_TRUTH_MAX_CHARS };
90
222
  //# sourceMappingURL=memory-update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-update.js","sourceRoot":"","sources":["../../src/tools/memory-update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-update.js","sourceRoot":"","sources":["../../src/tools/memory-update.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;AAK9E,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;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAS3E;AAwMD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKhD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAUR"}
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;AAO9E,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;AAOD,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAS3E;AAsRD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKhD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EAAE,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAUR"}
@@ -2,10 +2,16 @@ 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 { checkGraphWriteGate } from "../lib/graph-write-gate.js";
5
+ import { checkGraphWriteGate, checkPropertyWriteGate } from "../lib/graph-write-gate.js";
6
+ import { extractDatedStatements } from "../lib/timeline-extractor.js";
7
+ import { randomUUID } from "node:crypto";
6
8
  import { checkLabelOriginGate } from "../lib/label-origin-gate.js";
7
9
  import { withWriteEvent, pickName } from "../lib/log-ingest.js";
8
10
  import { writeNodeWithEdges, injectConversationProvenance, } from "../../../../../lib/graph-write/dist/index.js";
11
+ /** Subject labels that carry the compiled-truth + timeline doctrine (Task 306). */
12
+ const TIMELINE_SUBJECT_LABELS = ["Person", "Organization", "Concept"];
13
+ /** Default `compiledTruthUpdatedAt` on first write — epoch makes stale-detection trivial. */
14
+ const COMPILED_TRUTH_EPOCH = "1970-01-01T00:00:00Z";
9
15
  export async function memoryWrite(params) {
10
16
  const { labels, properties, accountId, scope, relationships, createdBy, validator, producedByTaskId } = params;
11
17
  const nameHint = pickName(properties);
@@ -57,6 +63,13 @@ async function memoryWriteImpl(params) {
57
63
  throw new Error(`Write blocked (${gate.reason}): ${gate.message}`);
58
64
  }
59
65
  }
66
+ // Property-level gate (Task 306). Refuse a write whose
67
+ // `compiledTruth` exceeds COMPILED_TRUTH_MAX_CHARS — this protects against
68
+ // operators / agents pasting in long bodies as compiled truth.
69
+ const propGate = checkPropertyWriteGate({ properties });
70
+ if (!propGate.ok) {
71
+ throw new Error(`Write blocked (${propGate.reason}): ${propGate.message}`);
72
+ }
60
73
  const textForEmbedding = buildTextRepresentation(labels, properties);
61
74
  const embedding = await embed(textForEmbedding);
62
75
  const nodeProps = {
@@ -69,6 +82,21 @@ async function memoryWriteImpl(params) {
69
82
  if (!properties.createdOn && !properties.createdAt) {
70
83
  nodeProps.createdAt = new Date().toISOString();
71
84
  }
85
+ // Task 306: stamp compiled-truth defaults on the three subject labels
86
+ // that carry the compiled-truth + timeline doctrine. New nodes start with
87
+ // an empty compiledTruth and an epoch updatedAt so stale-detection
88
+ // queries treat them as eligible for the next rewriter pass.
89
+ // `compiledTruthSource = "rewriter"` is the default writer; the operator
90
+ // override is set only when the graph UI edits the property directly.
91
+ const isCompiledTruthSubject = TIMELINE_SUBJECT_LABELS.some((l) => labels.includes(l));
92
+ if (isCompiledTruthSubject) {
93
+ if (nodeProps.compiledTruth === undefined)
94
+ nodeProps.compiledTruth = "";
95
+ if (nodeProps.compiledTruthUpdatedAt === undefined)
96
+ nodeProps.compiledTruthUpdatedAt = COMPILED_TRUTH_EPOCH;
97
+ if (nodeProps.compiledTruthSource === undefined)
98
+ nodeProps.compiledTruthSource = "rewriter";
99
+ }
72
100
  // compose the inbound `:PRODUCED` edge from the active
73
101
  // Task before delegating to the gate. We resolve the Task here (not
74
102
  // in the gate) so we can verify accountId parity and emit a clear
@@ -117,6 +145,53 @@ async function memoryWriteImpl(params) {
117
145
  relationships: resolvedRelationships,
118
146
  createdBy,
119
147
  });
148
+ // Task 306: extract dated statements from the body of compiled-truth
149
+ // subjects and path-anchor-MERGE :TimelineEvent rows. Strictly deterministic
150
+ // here; the 305 typed-edge hook upgrades `kind` from "mentioned" to a
151
+ // more specific value asynchronously. Failures here MUST NOT roll back
152
+ // the entity write — the node persisting with an empty timeline is the
153
+ // right degradation mode; a rewriter call on demand still works.
154
+ if (isCompiledTruthSubject && typeof properties.body === "string" && accountId) {
155
+ try {
156
+ const statements = extractDatedStatements(properties.body);
157
+ if (statements.length > 0) {
158
+ for (const s of statements) {
159
+ await session.run(`MATCH (e) WHERE elementId(e) = $entityId AND e.accountId = $accountId
160
+ MERGE (e)-[:HAS_TIMELINE_EVENT]->(t:TimelineEvent {timelineEventId: $id})
161
+ ON CREATE SET t.accountId = $accountId,
162
+ t.occurredAt = datetime($occurredAt),
163
+ t.kind = $kind,
164
+ t.summary = $summary,
165
+ t.source = $source,
166
+ t.matched = $matched,
167
+ t.createdAt = datetime(),
168
+ t.scope = $scope
169
+ RETURN elementId(t) AS timelineEventNodeId`, {
170
+ entityId: result.nodeId,
171
+ accountId,
172
+ id: randomUUID(),
173
+ occurredAt: s.occurredAt,
174
+ kind: "mentioned",
175
+ summary: s.summary,
176
+ source: typeof properties.sourceMessageId === "string"
177
+ ? properties.sourceMessageId
178
+ : "memory-write",
179
+ matched: s.matched,
180
+ scope,
181
+ });
182
+ }
183
+ }
184
+ console.log(`[timeline-extract] nodeId=${result.nodeId.slice(0, 12)} ` +
185
+ `subject="${properties.name ?? "?"}" dates=${statements.length} kinds=[mentioned×${statements.length}]`);
186
+ }
187
+ catch (err) {
188
+ const msg = err instanceof Error ? err.message : String(err);
189
+ const bodyLen = properties.body.length;
190
+ console.error(`[timeline-extract] error nodeId=${result.nodeId.slice(0, 12)} ` +
191
+ `body-len=${bodyLen} error="${msg}"`);
192
+ // intentional swallow — entity write succeeded; timeline is opportunistic.
193
+ }
194
+ }
120
195
  return { nodeId: result.nodeId, labels: result.labels, created: true };
121
196
  }
122
197
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"memory-write.js","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-write.js","sourceRoot":"","sources":["../../src/tools/memory-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Session-retrospective skip-rate visibility tool.
3
+ *
4
+ * Called by the admin agent at session start. Returns the ratio of recent
5
+ * sessions that closed without calling `session-retrospective-mark-complete`
6
+ * — sessions where the typed-edge pass, learnings pass, and SOUL.md pass
7
+ * never ran. The admin agent surfaces the result to the operator if the
8
+ * rate is non-zero so closing via Sidebar Archive / tab-close becomes a
9
+ * visible cost rather than a silent one.
10
+ *
11
+ * Mechanism: count `:Conversation` nodes for this account in the recent
12
+ * window; count those whose corresponding session log contains the
13
+ * sentinel tool-use of `session-retrospective-mark-complete`. The ratio
14
+ * is the skip rate. Pending nodes (prose with `updatedAt` later than the
15
+ * most-recent completed retrospective) carry the deferred typed-edge work
16
+ * that will land at the next /end.
17
+ */
18
+ import type { Session } from "neo4j-driver";
19
+ export interface SessionSkipRateArgs {
20
+ /** Window size — number of most-recent sessions to inspect. Default 10. */
21
+ windowSize?: number;
22
+ }
23
+ export interface SessionSkipRateResult {
24
+ windowSessions: number;
25
+ completedRetrospectives: number;
26
+ skipRate: number;
27
+ oldestPendingSinceIso: string | null;
28
+ }
29
+ export declare function sessionRetrospectiveSkipRate(args: SessionSkipRateArgs, session: Session, accountId: string): Promise<SessionSkipRateResult>;
30
+ //# sourceMappingURL=session-retrospective-skip-rate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-retrospective-skip-rate.d.ts","sourceRoot":"","sources":["../../src/tools/session-retrospective-skip-rate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAuHhC"}