@rubytech/create-maxy-code 0.1.158 → 0.1.161

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 (359) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/admin-conversation-purge/dist/index.d.ts +1 -1
  3. package/payload/platform/lib/admin-conversation-purge/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/admin-conversation-purge/dist/index.js +4 -4
  5. package/payload/platform/lib/admin-conversation-purge/dist/index.js.map +1 -1
  6. package/payload/platform/lib/admin-conversation-purge/src/index.ts +5 -5
  7. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +48 -17
  8. package/payload/platform/lib/graph-style/dist/index.js +2 -2
  9. package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
  10. package/payload/platform/lib/graph-style/src/__tests__/parity.test.ts +1 -1
  11. package/payload/platform/lib/graph-style/src/index.ts +2 -2
  12. package/payload/platform/lib/graph-trash/dist/index.js +1 -1
  13. package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
  14. package/payload/platform/lib/graph-trash/src/index.ts +1 -1
  15. package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js +1 -1
  16. package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js.map +1 -1
  17. package/payload/platform/lib/graph-write/dist/conversation-provenance.d.ts +3 -3
  18. package/payload/platform/lib/graph-write/dist/conversation-provenance.js +5 -5
  19. package/payload/platform/lib/graph-write/dist/conversation-provenance.js.map +1 -1
  20. package/payload/platform/lib/graph-write/dist/index.js +1 -1
  21. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  22. package/payload/platform/lib/graph-write/src/__tests__/action-provenance-gate.test.ts +1 -1
  23. package/payload/platform/lib/graph-write/src/conversation-provenance.ts +8 -8
  24. package/payload/platform/lib/graph-write/src/index.ts +1 -1
  25. package/payload/platform/neo4j/schema.cypher +86 -46
  26. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  27. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  28. package/payload/platform/plugins/admin/PLUGIN.md +8 -4
  29. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +1 -1
  30. package/payload/platform/plugins/admin/hooks/__tests__/per-turn-graph-pass-gate.test.sh +361 -0
  31. package/payload/platform/plugins/admin/hooks/__tests__/pre-turn-graph-pass.test.sh +13 -13
  32. package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +1 -1
  33. package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +2 -2
  34. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +102 -0
  35. package/payload/platform/plugins/admin/hooks/per-turn-graph-pass-gate.sh +106 -0
  36. package/payload/platform/plugins/admin/hooks/pre-turn-graph-pass.sh +15 -8
  37. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +4 -4
  38. package/payload/platform/plugins/admin/mcp/dist/index.js +65 -24
  39. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  40. package/payload/platform/plugins/admin/skills/business-profile/SKILL.md +1 -1
  41. package/payload/platform/plugins/admin/skills/session-management/SKILL.md +2 -2
  42. package/payload/platform/plugins/admin/skills/stream-log-review/SKILL.md +5 -5
  43. package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +6 -6
  44. package/payload/platform/plugins/business-assistant/references/profiling.md +1 -1
  45. package/payload/platform/plugins/contacts/PLUGIN.md +1 -1
  46. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +2 -2
  47. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
  48. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-erase.js +3 -3
  49. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.d.ts +1 -1
  50. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.js +2 -2
  51. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts +1 -1
  52. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts.map +1 -1
  53. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js +4 -4
  54. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js.map +1 -1
  55. package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js +10 -10
  56. package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js.map +1 -1
  57. package/payload/platform/plugins/docs/references/admin-session.md +6 -6
  58. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  59. package/payload/platform/plugins/docs/references/internals.md +5 -5
  60. package/payload/platform/plugins/docs/references/plugins-guide.md +6 -5
  61. package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
  62. package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
  63. package/payload/platform/plugins/email/PLUGIN.md +19 -2
  64. package/payload/platform/plugins/email/mcp/dist/index.js +78 -0
  65. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  66. package/payload/platform/plugins/email/mcp/dist/lib/conversation-archive-dispatch.d.ts +8 -0
  67. package/payload/platform/plugins/email/mcp/dist/lib/conversation-archive-dispatch.d.ts.map +1 -0
  68. package/payload/platform/plugins/email/mcp/dist/lib/conversation-archive-dispatch.js +177 -0
  69. package/payload/platform/plugins/email/mcp/dist/lib/conversation-archive-dispatch.js.map +1 -0
  70. package/payload/platform/plugins/email/mcp/dist/lib/embedding.js +2 -2
  71. package/payload/platform/plugins/email/mcp/dist/lib/embedding.js.map +1 -1
  72. package/payload/platform/plugins/email/mcp/dist/lib/graph.d.ts +6 -54
  73. package/payload/platform/plugins/email/mcp/dist/lib/graph.d.ts.map +1 -1
  74. package/payload/platform/plugins/email/mcp/dist/lib/graph.js +12 -300
  75. package/payload/platform/plugins/email/mcp/dist/lib/graph.js.map +1 -1
  76. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +1 -1
  77. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +23 -0
  78. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -0
  79. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js +15 -0
  80. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -0
  81. package/payload/platform/plugins/email/mcp/dist/tools/email-classify.d.ts +6 -0
  82. package/payload/platform/plugins/email/mcp/dist/tools/email-classify.d.ts.map +1 -0
  83. package/payload/platform/plugins/email/mcp/dist/tools/email-classify.js +89 -0
  84. package/payload/platform/plugins/email/mcp/dist/tools/email-classify.js.map +1 -0
  85. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts +15 -0
  86. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts.map +1 -0
  87. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +49 -0
  88. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -0
  89. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts +20 -0
  90. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts.map +1 -0
  91. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js +91 -0
  92. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js.map +1 -0
  93. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
  94. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +32 -52
  95. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  96. package/payload/platform/plugins/email/references/email-reference.md +19 -83
  97. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +87 -0
  98. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +10 -37
  99. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/connections.md +1 -0
  100. package/payload/platform/plugins/memory/.claude-plugin/plugin.json +1 -1
  101. package/payload/platform/plugins/memory/PLUGIN.md +11 -2
  102. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.mjs +139 -439
  103. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.sh +15 -47
  104. package/payload/platform/plugins/memory/mcp/dist/index.js +197 -58
  105. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  106. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js +43 -27
  107. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/compiled-truth-revision.test.js.map +1 -1
  108. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-delete-gate.test.d.ts +2 -0
  109. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-delete-gate.test.d.ts.map +1 -0
  110. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-delete-gate.test.js +62 -0
  111. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/label-delete-gate.test.js.map +1 -0
  112. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js +5 -0
  113. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-cypher-drift.test.js.map +1 -1
  114. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js +1 -1
  115. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/typed-edge-schema.test.js.map +1 -1
  116. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.d.ts +42 -25
  117. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.d.ts.map +1 -1
  118. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.js +23 -17
  119. package/payload/platform/plugins/memory/mcp/dist/lib/compiled-truth-revision.js.map +1 -1
  120. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/email.d.ts +3 -0
  121. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/email.d.ts.map +1 -0
  122. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/email.js +61 -0
  123. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/email.js.map +1 -0
  124. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.d.ts +1 -0
  125. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.d.ts.map +1 -1
  126. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.js +3 -0
  127. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.js.map +1 -1
  128. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.d.ts +1 -1
  129. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.d.ts.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.js +1 -0
  131. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.js.map +1 -1
  132. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js +2 -2
  133. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js.map +1 -1
  134. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.d.ts +2 -0
  135. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.d.ts.map +1 -1
  136. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.js +9 -3
  137. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.js.map +1 -1
  138. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +3 -3
  139. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
  140. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +6 -6
  141. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
  142. package/payload/platform/plugins/memory/mcp/dist/lib/kd-classify-gate.d.ts +41 -0
  143. package/payload/platform/plugins/memory/mcp/dist/lib/kd-classify-gate.d.ts.map +1 -0
  144. package/payload/platform/plugins/memory/mcp/dist/lib/kd-classify-gate.js +71 -0
  145. package/payload/platform/plugins/memory/mcp/dist/lib/kd-classify-gate.js.map +1 -0
  146. package/payload/platform/plugins/memory/mcp/dist/lib/label-delete-gate.d.ts +18 -0
  147. package/payload/platform/plugins/memory/mcp/dist/lib/label-delete-gate.d.ts.map +1 -0
  148. package/payload/platform/plugins/memory/mcp/dist/lib/label-delete-gate.js +31 -0
  149. package/payload/platform/plugins/memory/mcp/dist/lib/label-delete-gate.js.map +1 -0
  150. package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js +1 -1
  151. package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js.map +1 -1
  152. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts +2 -2
  153. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +2 -2
  154. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts +1 -1
  155. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts.map +1 -1
  156. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.d.ts +5 -0
  157. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.d.ts.map +1 -1
  158. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.js +162 -78
  159. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-derive-insights.test.js.map +1 -1
  160. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection.test.js +1 -1
  161. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-enrich-rejection.test.js.map +1 -1
  162. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js +3 -3
  163. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js.map +1 -1
  164. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.js +2 -0
  165. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.js.map +1 -1
  166. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js +2 -2
  167. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js.map +1 -1
  168. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-compiled-truth-history.test.js +2 -0
  169. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-compiled-truth-history.test.js.map +1 -1
  170. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.js +6 -0
  171. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-emit.test.js.map +1 -1
  172. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-reserved-label.test.d.ts +2 -0
  173. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-reserved-label.test.d.ts.map +1 -0
  174. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-reserved-label.test.js +141 -0
  175. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-delete-reserved-label.test.js.map +1 -0
  176. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js +8 -8
  177. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js.map +1 -1
  178. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-reserved-label.test.d.ts +2 -0
  179. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-reserved-label.test.d.ts.map +1 -0
  180. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-reserved-label.test.js +86 -0
  181. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-reserved-label.test.js.map +1 -0
  182. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js +2 -2
  183. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js.map +1 -1
  184. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts +33 -34
  185. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
  186. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +94 -273
  187. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
  188. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-list-chunks.d.ts +43 -0
  189. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-list-chunks.d.ts.map +1 -0
  190. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-list-chunks.js +96 -0
  191. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-list-chunks.js.map +1 -0
  192. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts +1 -1
  193. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts.map +1 -1
  194. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js +2 -2
  195. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js.map +1 -1
  196. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts +6 -0
  197. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts.map +1 -0
  198. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js +73 -0
  199. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js.map +1 -0
  200. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  201. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +0 -1
  202. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  203. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts +2 -2
  204. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts.map +1 -1
  205. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js +4 -4
  206. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js.map +1 -1
  207. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts +6 -0
  208. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts.map +1 -1
  209. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js +2 -0
  210. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js.map +1 -1
  211. package/payload/platform/plugins/memory/mcp/dist/tools/memory-delete.d.ts +8 -0
  212. package/payload/platform/plugins/memory/mcp/dist/tools/memory-delete.d.ts.map +1 -1
  213. package/payload/platform/plugins/memory/mcp/dist/tools/memory-delete.js +40 -5
  214. package/payload/platform/plugins/memory/mcp/dist/tools/memory-delete.js.map +1 -1
  215. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.d.ts +8 -1
  216. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.d.ts.map +1 -1
  217. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js +25 -9
  218. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js.map +1 -1
  219. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts +1 -1
  220. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts.map +1 -1
  221. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js +2 -2
  222. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js.map +1 -1
  223. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js +11 -0
  224. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js.map +1 -1
  225. package/payload/platform/plugins/memory/mcp/dist/tools/memory-node-exists.d.ts +28 -0
  226. package/payload/platform/plugins/memory/mcp/dist/tools/memory-node-exists.d.ts.map +1 -0
  227. package/payload/platform/plugins/memory/mcp/dist/tools/memory-node-exists.js +46 -0
  228. package/payload/platform/plugins/memory/mcp/dist/tools/memory-node-exists.js.map +1 -0
  229. package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.d.ts +1 -1
  230. package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.js +1 -1
  231. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +1 -1
  232. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts.map +1 -1
  233. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +2 -2
  234. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js.map +1 -1
  235. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.d.ts.map +1 -1
  236. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js +26 -0
  237. package/payload/platform/plugins/memory/mcp/dist/tools/memory-update.js.map +1 -1
  238. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +2 -2
  239. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  240. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts +1 -1
  241. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
  242. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +11 -11
  243. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  244. package/payload/platform/plugins/memory/mcp/scripts/backfill-typed-edges.ts +1 -1
  245. package/payload/platform/plugins/memory/mcp/scripts/graph/fixture.cypher +1 -1
  246. package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -4
  247. package/payload/platform/plugins/memory/references/graph-primitives.md +1 -1
  248. package/payload/platform/plugins/memory/references/schema-base.md +8 -10
  249. package/payload/platform/plugins/memory/skills/conversation-archive/SKILL.md +100 -116
  250. package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +74 -24
  251. package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +1 -1
  252. package/payload/platform/plugins/notion-import/skills/notion-import/SKILL.md +1 -1
  253. package/payload/platform/plugins/obsidian-import/skills/obsidian-import/SKILL.md +1 -1
  254. package/payload/platform/plugins/substack-import/.claude-plugin/plugin.json +8 -0
  255. package/payload/platform/plugins/substack-import/PLUGIN.md +34 -0
  256. package/payload/platform/plugins/substack-import/skills/substack-import/SKILL.md +182 -0
  257. package/payload/platform/plugins/substack-import/skills/substack-import/references/archive-shape.md +68 -0
  258. package/payload/platform/plugins/substack-import/skills/substack-import/references/attachments.md +72 -0
  259. package/payload/platform/plugins/substack-import/skills/substack-import/references/engagement.md +61 -0
  260. package/payload/platform/plugins/substack-import/skills/substack-import/references/posts.md +80 -0
  261. package/payload/platform/plugins/substack-import/skills/substack-import/references/subscribers.md +74 -0
  262. package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -1
  263. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +2 -2
  264. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  265. package/payload/platform/plugins/work/mcp/dist/index.js +2 -2
  266. package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -1
  267. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js +6 -6
  268. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js.map +1 -1
  269. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts +1 -1
  270. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts.map +1 -1
  271. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js +1 -1
  272. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js.map +1 -1
  273. package/payload/platform/plugins/x-import/references/archive-shape.md +2 -2
  274. package/payload/platform/plugins/x-import/skills/x-import/SKILL.md +4 -4
  275. package/payload/platform/scripts/admin-persist-audit.ts +18 -18
  276. package/payload/platform/scripts/identity-forbidden-token-check.mjs +2 -0
  277. package/payload/platform/scripts/seed-neo4j.sh +1 -0
  278. package/payload/platform/services/claude-session-manager/dist/http-server.js +3 -3
  279. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  280. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +3 -3
  281. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +4 -4
  282. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  283. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  284. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +2 -0
  285. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  286. package/payload/platform/templates/specialists/agents/archive-ingest-operator.md +45 -0
  287. package/payload/platform/templates/specialists/agents/database-operator.md +5 -17
  288. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  289. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  290. package/payload/server/{chunk-AXOL2PPG.js → chunk-3TRIXQSJ.js} +101 -101
  291. package/payload/server/maxy-edge.js +1 -1
  292. package/payload/server/public/assets/{admin-3fLFD5h_.js → admin-Dal5FWaD.js} +2 -2
  293. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Breg9-99.js → architectureDiagram-Q4EWVU46-Do2zYONG.js} +1 -1
  294. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DXf1_673.js → blockDiagram-DXYQGD6D-DpIX_bRu.js} +1 -1
  295. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CSZ36W4-.js → c4Diagram-AHTNJAMY-Cz335ZSY.js} +1 -1
  296. package/payload/server/public/assets/channel-PC4_IjI1.js +1 -0
  297. package/payload/server/public/assets/{chunk-336JU56O-DsrLk2eK.js → chunk-336JU56O-Dmknn3Wo.js} +2 -2
  298. package/payload/server/public/assets/{chunk-426QAEUC-JpNfNf81.js → chunk-426QAEUC-ClfGjizN.js} +1 -1
  299. package/payload/server/public/assets/{chunk-4TB4RGXK-DmClEAD0.js → chunk-4TB4RGXK-BPKctJ5c.js} +1 -1
  300. package/payload/server/public/assets/{chunk-5FUZZQ4R-BI9blW3N.js → chunk-5FUZZQ4R-BWDCO9zw.js} +1 -1
  301. package/payload/server/public/assets/{chunk-5PVQY5BW-BbgttEFO.js → chunk-5PVQY5BW-BE34_Db0.js} +1 -1
  302. package/payload/server/public/assets/{chunk-EDXVE4YY-BX_LCFOx.js → chunk-EDXVE4YY-BysA-_6v.js} +1 -1
  303. package/payload/server/public/assets/{chunk-ENJZ2VHE-Bb7EoD0w.js → chunk-ENJZ2VHE-BMVyMsqA.js} +1 -1
  304. package/payload/server/public/assets/{chunk-ICPOFSXX-DH8uQk-s.js → chunk-ICPOFSXX-C5KRdLV4.js} +1 -1
  305. package/payload/server/public/assets/{chunk-OYMX7WX6-FH5kgXsw.js → chunk-OYMX7WX6-DVZD-AVc.js} +1 -1
  306. package/payload/server/public/assets/{chunk-U2HBQHQK-D_ljlkHr.js → chunk-U2HBQHQK-DYmQdx8x.js} +1 -1
  307. package/payload/server/public/assets/{chunk-X2U36JSP-BX3EmZvm.js → chunk-X2U36JSP-DrZenIl3.js} +1 -1
  308. package/payload/server/public/assets/{chunk-YZCP3GAM-Vu7-E93h.js → chunk-YZCP3GAM-CDuGbvMq.js} +1 -1
  309. package/payload/server/public/assets/{chunk-ZZ45TVLE-CwjhNPX5.js → chunk-ZZ45TVLE-COztbiu5.js} +1 -1
  310. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B_pMa-SX.js +1 -0
  311. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BdBAgF20.js +1 -0
  312. package/payload/server/public/assets/clone-CkNt9L9r.js +1 -0
  313. package/payload/server/public/assets/{dagre-Ce6gsj0C.js → dagre-Cv9Ib2OM.js} +1 -1
  314. package/payload/server/public/assets/{dagre-KV5264BT-BaMGpsoy.js → dagre-KV5264BT-CoEd61KZ.js} +1 -1
  315. package/payload/server/public/assets/{data-BHASh0_Y.js → data-DbSORCl4.js} +1 -1
  316. package/payload/server/public/assets/{diagram-5BDNPKRD-CHEE9rjq.js → diagram-5BDNPKRD-WXNzw3uW.js} +1 -1
  317. package/payload/server/public/assets/{diagram-G4DWMVQ6-C98sZLW1.js → diagram-G4DWMVQ6-C6IuQ2VV.js} +1 -1
  318. package/payload/server/public/assets/{diagram-MMDJMWI5-DNvMGsTZ.js → diagram-MMDJMWI5-CdJdir5A.js} +1 -1
  319. package/payload/server/public/assets/{diagram-TYMM5635-Cdte4IBa.js → diagram-TYMM5635-DxWKQH5T.js} +1 -1
  320. package/payload/server/public/assets/{erDiagram-SMLLAGMA-C9VZsWXK.js → erDiagram-SMLLAGMA-C9fvs33K.js} +1 -1
  321. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-tuP5fzzR.js → flowDiagram-DWJPFMVM-BO7Yrbqv.js} +1 -1
  322. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-SJgRPUwx.js → ganttDiagram-T4ZO3ILL-CQJyWBZq.js} +1 -1
  323. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DU_cI_50.js → gitGraphDiagram-UUTBAWPF-DZfQHrYw.js} +1 -1
  324. package/payload/server/public/assets/{graph-labels-DXlmm1og.js → graph-labels-BBB5jsZk.js} +1 -1
  325. package/payload/server/public/assets/{graph-BhEI09tF.js → graph-ys_joP2o.js} +1 -1
  326. package/payload/server/public/assets/{graphlib-D_nAsvmx.js → graphlib-C40H-Q5E.js} +1 -1
  327. package/payload/server/public/assets/{infoDiagram-42DDH7IO-Cj2Y19m6.js → infoDiagram-42DDH7IO-CakfV5f9.js} +1 -1
  328. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DMc1xq1y.js → ishikawaDiagram-UXIWVN3A-CPuBPyfa.js} +1 -1
  329. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-C4CRAQma.js → journeyDiagram-VCZTEJTY-zpZm2Mmo.js} +1 -1
  330. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CTr4AldU.js → kanban-definition-6JOO6SKY-DfJduQCo.js} +1 -1
  331. package/payload/server/public/assets/{line-Btlm_IAl.js → line-BpYQqO5R.js} +1 -1
  332. package/payload/server/public/assets/{mermaid-parser.core-DXFdj_y1.js → mermaid-parser.core-C5Mwi14D.js} +1 -1
  333. package/payload/server/public/assets/{mermaid.core-DFBhoCr5.js → mermaid.core-D8qBtvvT.js} +3 -3
  334. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-r9gVQybo.js → mindmap-definition-QFDTVHPH-Bli9JhIN.js} +1 -1
  335. package/payload/server/public/assets/{page-CDWu1Aft.js → page--bl5Y7ZI.js} +2 -2
  336. package/payload/server/public/assets/page-CwmZ76U7.js +1 -0
  337. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CHKZjSaH.js → pieDiagram-DEJITSTG-MsLXTSLg.js} +1 -1
  338. package/payload/server/public/assets/{public-DyGWgfaZ.js → public-DltgEfA9.js} +2 -2
  339. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CSGR1HJr.js → quadrantDiagram-34T5L4WZ-De1sh2K0.js} +1 -1
  340. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DZ6hX9D6.js → requirementDiagram-MS252O5E-D5Sfg1t_.js} +1 -1
  341. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DbZBKh0m.js → sankeyDiagram-XADWPNL6-DHA3LIbv.js} +1 -1
  342. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BHHpb8dt.js → sequenceDiagram-FGHM5R23-BE_QlG1B.js} +1 -1
  343. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DQ1jiLB4.js → stateDiagram-FHFEXIEX-NIwp3F4u.js} +1 -1
  344. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-pfk2F6st.js +1 -0
  345. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BlGiEU7p.js → timeline-definition-GMOUNBTQ-CPE9jyDF.js} +1 -1
  346. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DmEH-hsB.js → vennDiagram-DHZGUBPP-CKfoyYmH.js} +1 -1
  347. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-C7KJJ40d.js → wardleyDiagram-NUSXRM2D-B9yJek-o.js} +1 -1
  348. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-JDnusCaa.js → xychartDiagram-5P7HB3ND-DuCcSLqX.js} +1 -1
  349. package/payload/server/public/data.html +3 -3
  350. package/payload/server/public/graph.html +3 -3
  351. package/payload/server/public/index.html +4 -4
  352. package/payload/server/public/public.html +1 -1
  353. package/payload/server/server.js +133 -133
  354. package/payload/server/public/assets/channel-BmZnt3PP.js +0 -1
  355. package/payload/server/public/assets/classDiagram-6PBFFD2Q-kmMLFUpV.js +0 -1
  356. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BV7Ae8ct.js +0 -1
  357. package/payload/server/public/assets/clone-B5eqoN9I.js +0 -1
  358. package/payload/server/public/assets/page-cyvshX4Z.js +0 -1
  359. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CByT2RzF.js +0 -1
@@ -1,43 +1,60 @@
1
1
  /**
2
- * Task 391 compiled-truth revision history.
2
+ * Compiled-truth revision history (Task 391, restored under Task 436).
3
3
  *
4
- * Single shared primitive that writes a new `:CompiledTruthRevision`
5
- * row and the `:HAS_REVISION` edge in the same transaction as the
6
- * caller's `compiledTruth` SET. Callers compose this Cypher block
7
- * into their own write statement so the SET and the revision MERGE
8
- * commit atomically — if either fails, neither lands.
4
+ * Single shared primitive that writes `:CompiledTruthRevision` rows
5
+ * and `:HAS_REVISION` edges in the same transaction as the caller's
6
+ * `compiledTruth` / `compiledTruthPublic` SET. Callers concatenate
7
+ * this fragment into their own write statement so the SET and the
8
+ * revision CREATEs commit atomically — if either fails, neither
9
+ * lands.
9
10
  *
10
- * Two source values are sanctioned: 'rewriter' (rewriter library
11
- * wrote it) and 'operator' (sanctioned operator-edit route — not yet
12
- * implemented; see follow-up Task 393).
11
+ * `twin` discriminates which property the row is the revision of —
12
+ * `"compiledTruth"` (private/admin twin) or `"compiledTruthPublic"`
13
+ * (public twin). Task 391 only had the private twin; Task 424 moved
14
+ * compiled-truth writes into a specialist that handles both twins,
15
+ * so the row needs a discriminator for history queries.
13
16
  *
14
- * Pruning is the dream-cycle's job (phase 5). This file never
15
- * deletes.
17
+ * `source` enum: `'rewriter'` (rewriter library wrote the truth) and
18
+ * `'operator'` (sanctioned operator-edit route — passed by the
19
+ * specialist when the operator supplied a hint).
20
+ *
21
+ * UNWIND-on-empty is a Cypher no-op, but production callers gate on
22
+ * `revisions.length > 0` anyway so the standard (non-rewriter)
23
+ * update path emits no extra clauses.
24
+ *
25
+ * Pruning is the dream-cycle's job (phase 5). This file never deletes.
16
26
  */
17
27
  import type { Session } from "neo4j-driver";
18
28
  export type CompiledTruthRevisionSource = "rewriter" | "operator";
29
+ export type CompiledTruthRevisionTwin = "compiledTruth" | "compiledTruthPublic";
30
+ export interface CompiledTruthRevisionRow {
31
+ truth: string;
32
+ twin: CompiledTruthRevisionTwin;
33
+ source: CompiledTruthRevisionSource;
34
+ }
19
35
  /**
20
- * Cypher fragment that creates one `:CompiledTruthRevision` row and
21
- * links it from the entity bound as `n` in the caller's MATCH. The
22
- * caller is responsible for binding `n` (the entity) and providing
23
- * `$accountId`, `$truth`, and `$source` parameters.
36
+ * Cypher fragment that UNWINDs the caller's `$revisions` array and
37
+ * creates one `:CompiledTruthRevision` row per element, linked from
38
+ * the entity bound as `n` in the caller's MATCH. The caller is
39
+ * responsible for binding `n` (the entity) and providing
40
+ * `$accountId` and `$revisions` parameters.
24
41
  *
25
- * Designed to be concatenated after a `compiledTruth` SET so both
26
- * mutations sit in the same `session.run` call (single TX).
42
+ * Designed to be concatenated after a `compiledTruth` /
43
+ * `compiledTruthPublic` SET so both mutations sit in the same
44
+ * `session.run` call (single TX).
27
45
  */
28
- export declare const REVISION_CYPHER_FRAGMENT = "\nWITH n\nCREATE (r:CompiledTruthRevision {\n revisionId: randomUUID(),\n accountId: $accountId,\n truth: $truth,\n writtenAt: datetime(),\n source: $source\n})\nCREATE (n)-[:HAS_REVISION]->(r)\n";
46
+ export declare const REVISION_CYPHER_FRAGMENT_UNWIND = "\nUNWIND $revisions AS rev\nCREATE (r:CompiledTruthRevision {\n revisionId: randomUUID(),\n accountId: $accountId,\n truth: rev.truth,\n twin: rev.twin,\n writtenAt: datetime(),\n source: rev.source\n})\nCREATE (n)-[:HAS_REVISION]->(r)\n";
29
47
  /**
30
48
  * Convenience runner for tests and ad-hoc callers that want to write
31
- * a revision in isolation (no concurrent `compiledTruth` SET).
32
- * Production writers compose `REVISION_CYPHER_FRAGMENT` into their
33
- * own statement; this helper exists so test code does not have to
34
- * duplicate the fragment.
49
+ * revisions in isolation (no concurrent `compiledTruth` SET).
50
+ * Production writers compose `REVISION_CYPHER_FRAGMENT_UNWIND` into
51
+ * their own statement; this helper exists so test code does not have
52
+ * to duplicate the fragment.
35
53
  */
36
- export declare function writeRevisionStandalone(args: {
54
+ export declare function writeRevisionsStandalone(args: {
37
55
  session: Session;
38
56
  nodeId: string;
39
57
  accountId: string;
40
- truth: string;
41
- source: CompiledTruthRevisionSource;
58
+ revisions: CompiledTruthRevisionRow[];
42
59
  }): Promise<void>;
43
60
  //# sourceMappingURL=compiled-truth-revision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiled-truth-revision.d.ts","sourceRoot":"","sources":["../../src/lib/compiled-truth-revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,UAAU,CAAC;AAElE;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,6MAUpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,2BAA2B,CAAC;CACrC,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
1
+ {"version":3,"file":"compiled-truth-revision.d.ts","sourceRoot":"","sources":["../../src/lib/compiled-truth-revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,UAAU,CAAC;AAClE,MAAM,MAAM,yBAAyB,GAAG,eAAe,GAAG,qBAAqB,CAAC;AAEhF,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,yBAAyB,CAAC;IAChC,MAAM,EAAE,2BAA2B,CAAC;CACrC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,wPAW3C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,wBAAwB,EAAE,CAAC;CACvC,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB"}
@@ -1,33 +1,39 @@
1
1
  /**
2
- * Cypher fragment that creates one `:CompiledTruthRevision` row and
3
- * links it from the entity bound as `n` in the caller's MATCH. The
4
- * caller is responsible for binding `n` (the entity) and providing
5
- * `$accountId`, `$truth`, and `$source` parameters.
2
+ * Cypher fragment that UNWINDs the caller's `$revisions` array and
3
+ * creates one `:CompiledTruthRevision` row per element, linked from
4
+ * the entity bound as `n` in the caller's MATCH. The caller is
5
+ * responsible for binding `n` (the entity) and providing
6
+ * `$accountId` and `$revisions` parameters.
6
7
  *
7
- * Designed to be concatenated after a `compiledTruth` SET so both
8
- * mutations sit in the same `session.run` call (single TX).
8
+ * Designed to be concatenated after a `compiledTruth` /
9
+ * `compiledTruthPublic` SET so both mutations sit in the same
10
+ * `session.run` call (single TX).
9
11
  */
10
- export const REVISION_CYPHER_FRAGMENT = `
11
- WITH n
12
+ export const REVISION_CYPHER_FRAGMENT_UNWIND = `
13
+ UNWIND $revisions AS rev
12
14
  CREATE (r:CompiledTruthRevision {
13
15
  revisionId: randomUUID(),
14
16
  accountId: $accountId,
15
- truth: $truth,
17
+ truth: rev.truth,
18
+ twin: rev.twin,
16
19
  writtenAt: datetime(),
17
- source: $source
20
+ source: rev.source
18
21
  })
19
22
  CREATE (n)-[:HAS_REVISION]->(r)
20
23
  `;
21
24
  /**
22
25
  * Convenience runner for tests and ad-hoc callers that want to write
23
- * a revision in isolation (no concurrent `compiledTruth` SET).
24
- * Production writers compose `REVISION_CYPHER_FRAGMENT` into their
25
- * own statement; this helper exists so test code does not have to
26
- * duplicate the fragment.
26
+ * revisions in isolation (no concurrent `compiledTruth` SET).
27
+ * Production writers compose `REVISION_CYPHER_FRAGMENT_UNWIND` into
28
+ * their own statement; this helper exists so test code does not have
29
+ * to duplicate the fragment.
27
30
  */
28
- export async function writeRevisionStandalone(args) {
29
- const { session, nodeId, accountId, truth, source } = args;
31
+ export async function writeRevisionsStandalone(args) {
32
+ const { session, nodeId, accountId, revisions } = args;
33
+ if (revisions.length === 0)
34
+ return;
30
35
  await session.run(`MATCH (n) WHERE elementId(n) = $nodeId AND n.accountId = $accountId
31
- ${REVISION_CYPHER_FRAGMENT}`, { nodeId, accountId, truth, source });
36
+ WITH n
37
+ ${REVISION_CYPHER_FRAGMENT_UNWIND}`, { nodeId, accountId, revisions });
32
38
  }
33
39
  //# sourceMappingURL=compiled-truth-revision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiled-truth-revision.js","sourceRoot":"","sources":["../../src/lib/compiled-truth-revision.ts"],"names":[],"mappings":"AAoBA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;CAUvC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAM7C;IACC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3D,MAAM,OAAO,CAAC,GAAG,CACf;OACG,wBAAwB,EAAE,EAC7B,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CACrC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"compiled-truth-revision.js","sourceRoot":"","sources":["../../src/lib/compiled-truth-revision.ts"],"names":[],"mappings":"AAqCA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;CAW9C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAK9C;IACC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,OAAO,CAAC,GAAG,CACf;;OAEG,+BAA+B,EAAE,EACpC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NormaliserInput, NormaliserResult } from "./types.js";
2
+ export declare function emailNormaliser(input: NormaliserInput): NormaliserResult;
3
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/email.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAc,MAAM,YAAY,CAAC;AAgChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAwDxE"}
@@ -0,0 +1,61 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { basename } from "node:path";
4
+ export function emailNormaliser(input) {
5
+ const { filePath, accountId } = input;
6
+ if (!accountId || !accountId.trim()) {
7
+ throw new Error("email: accountId is required.");
8
+ }
9
+ const rawBytes = readFileSync(filePath);
10
+ const archiveSha256 = createHash("sha256").update(rawBytes).digest("hex");
11
+ let raw;
12
+ try {
13
+ raw = JSON.parse(rawBytes.toString("utf-8"));
14
+ }
15
+ catch (err) {
16
+ throw new Error(`email: JSON parse failed — ${err instanceof Error ? err.message : String(err)}. file=${filePath}`);
17
+ }
18
+ if (!Array.isArray(raw)) {
19
+ throw new Error(`email: expected top-level JSON array of message envelopes. file=${filePath}`);
20
+ }
21
+ let parseErrors = 0;
22
+ const records = [];
23
+ for (const m of raw) {
24
+ const iso = parseDateHeader(m?.date);
25
+ const email = m?.from?.email?.trim();
26
+ const name = m?.from?.name?.trim() || email || "";
27
+ const bodyText = m?.bodyText ?? "";
28
+ if (!iso || !email) {
29
+ parseErrors += 1;
30
+ continue;
31
+ }
32
+ const senderPrefix = `From: ${name} <${email}>`;
33
+ records.push({ iso, body: `${senderPrefix}\n${bodyText}` });
34
+ }
35
+ records.sort((a, b) => (a.iso < b.iso ? -1 : a.iso > b.iso ? 1 : 0));
36
+ const parsedLines = records.map((r, i) => ({
37
+ dateSent: r.iso,
38
+ body: r.body,
39
+ sequenceIndex: i,
40
+ }));
41
+ return {
42
+ parsedLines,
43
+ archiveSha256,
44
+ archiveSourceFile: basename(filePath),
45
+ counters: {
46
+ parsed: parsedLines.length,
47
+ systemSkipped: 0,
48
+ mediaSkipped: 0,
49
+ parseErrors,
50
+ },
51
+ };
52
+ }
53
+ function parseDateHeader(value) {
54
+ if (!value || !value.trim())
55
+ return null;
56
+ const ms = Date.parse(value);
57
+ if (!Number.isFinite(ms))
58
+ return null;
59
+ return new Date(ms).toISOString();
60
+ }
61
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAiCrC,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1E,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,QAAQ,EAAE,CACnG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,mEAAmE,QAAQ,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,GAAwB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,WAAW,IAAI,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,SAAS,IAAI,KAAK,KAAK,GAAG,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,KAAK,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,WAAW,GAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,QAAQ,EAAE,CAAC,CAAC,GAAG;QACf,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,aAAa,EAAE,CAAC;KACjB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW;QACX,aAAa;QACb,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC;QACrC,QAAQ,EAAE;YACR,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,WAAW;SACZ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAgC;IACvD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -2,5 +2,6 @@ import type { ConversationNormaliser, ConversationSource } from "./types.js";
2
2
  export * from "./types.js";
3
3
  export { whatsappTextNormaliser } from "./whatsapp-text.js";
4
4
  export { xDmNormaliser } from "./x-dm.js";
5
+ export { emailNormaliser } from "./email.js";
5
6
  export declare function getNormaliser(source: ConversationSource): ConversationNormaliser;
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAI7E,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAe1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,sBAAsB,CAShF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK7E,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgB7C,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,sBAAsB,CAShF"}
@@ -7,9 +7,11 @@
7
7
  // in `types.ts`. No new skill, no new MCP tool, no new plugin.
8
8
  import { whatsappTextNormaliser } from "./whatsapp-text.js";
9
9
  import { xDmNormaliser } from "./x-dm.js";
10
+ import { emailNormaliser } from "./email.js";
10
11
  export * from "./types.js";
11
12
  export { whatsappTextNormaliser } from "./whatsapp-text.js";
12
13
  export { xDmNormaliser } from "./x-dm.js";
14
+ export { emailNormaliser } from "./email.js";
13
15
  /**
14
16
  * Closed registry from source enum → normaliser. Phase 0 ships only
15
17
  * `whatsapp`; future sources land here as they are implemented.
@@ -21,6 +23,7 @@ export { xDmNormaliser } from "./x-dm.js";
21
23
  const NORMALISERS_BY_SOURCE = {
22
24
  whatsapp: whatsappTextNormaliser,
23
25
  "x-dm": xDmNormaliser,
26
+ email: emailNormaliser,
24
27
  };
25
28
  export function getNormaliser(source) {
26
29
  const normaliser = NORMALISERS_BY_SOURCE[source];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,+DAA+D;AAG/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAAgE;IACzF,QAAQ,EAAE,sBAAsB;IAChC,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAA0B;IACtD,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,+DAA+D,MAAM,mBAAmB,WAAW,6FAA6F,CACjM,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,+DAA+D;AAG/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAAgE;IACzF,QAAQ,EAAE,sBAAsB;IAChC,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,eAAe;CACvB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAA0B;IACtD,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,+DAA+D,MAAM,mBAAmB,WAAW,6FAA6F,CACjM,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -1,4 +1,4 @@
1
- export declare const CONVERSATION_SOURCES: readonly ["whatsapp", "telegram", "signal", "linkedin-messages", "zoom-transcript", "meeting-minutes", "imessage", "slack", "x-dm", "other"];
1
+ export declare const CONVERSATION_SOURCES: readonly ["whatsapp", "telegram", "signal", "linkedin-messages", "zoom-transcript", "meeting-minutes", "imessage", "slack", "x-dm", "email", "other"];
2
2
  export type ConversationSource = (typeof CONVERSATION_SOURCES)[number];
3
3
  export declare function isConversationSource(s: unknown): s is ConversationSource;
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/types.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,8IAWvB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAExE;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;qDACiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,KAAK,EAAE,eAAe,KACnB,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/types.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,uJAYvB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAExE;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;qDACiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,KAAK,EAAE,eAAe,KACnB,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC"}
@@ -29,6 +29,7 @@ export const CONVERSATION_SOURCES = [
29
29
  "imessage",
30
30
  "slack",
31
31
  "x-dm",
32
+ "email",
32
33
  "other",
33
34
  ];
34
35
  export function isConversationSource(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/types.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,sEAAsE;AACtE,wEAAwE;AACxE,0EAA0E;AAC1E,oBAAoB;AACpB,EAAE;AACF,yDAAyD;AACzD,uEAAuE;AACvE,wEAAwE;AACxE,0EAA0E;AAC1E,qEAAqE;AACrE,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,aAAa;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU;IACV,UAAU;IACV,QAAQ;IACR,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;CACC,CAAC;AAIX,MAAM,UAAU,oBAAoB,CAAC,CAAU;IAC7C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,oBAA0C,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/types.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,sEAAsE;AACtE,wEAAwE;AACxE,0EAA0E;AAC1E,oBAAoB;AACpB,EAAE;AACF,yDAAyD;AACzD,uEAAuE;AACvE,wEAAwE;AACxE,0EAA0E;AAC1E,qEAAqE;AACrE,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,aAAa;AAEb,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU;IACV,UAAU;IACV,QAAQ;IACR,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;CACC,CAAC;AAIX,MAAM,UAAU,oBAAoB,CAAC,CAAU;IAC7C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,oBAA0C,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC"}
@@ -9,12 +9,12 @@ import { basename } from "node:path";
9
9
  // wrapper:
10
10
  //
11
11
  // window.YTD.direct_messages.part0 = [
12
- // { dmConversation: { conversationId, messages: [ { messageCreate: …} ] } },
12
+ // { dmConversation: { sessionId, messages: [ { messageCreate: …} ] } },
13
13
  // ...
14
14
  // ]
15
15
  //
16
16
  // Multi-conversation files are split by the x-import skill before invocation,
17
- // one slice per conversationId — each slice is a per-conversation archive in
17
+ // one slice per sessionId — each slice is a per-conversation archive in
18
18
  // the conversation-archive sense (one conversation-document `:KnowledgeDocument` per participant
19
19
  // set). The skill writes each slice as either a wrapper-preserving `.js` shim
20
20
  // containing a single-element array, or a wrapper-stripped JSON array; this
@@ -1 +1 @@
1
- {"version":3,"file":"x-dm.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/x-dm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"x-dm.js","sourceRoot":"","sources":["../../../src/lib/conversation-normalisers/x-dm.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ export interface DeriveConversationIdentityInput {
4
4
  /** Element IDs of every confirmed participant (owner + others). Order is
5
5
  * not significant; the function sorts internally. */
6
6
  participantElementIds: readonly string[];
7
+ /** ConversationSource enum value (whatsapp, email, telegram, …). */
8
+ source: string;
7
9
  }
8
10
  export declare function deriveConversationIdentity(input: DeriveConversationIdentityInput): string;
9
11
  export interface DeriveMessageContentHashInput {
@@ -1 +1 @@
1
- {"version":3,"file":"derive-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-pipeline/derive-keys.ts"],"names":[],"mappings":"AAsBA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB;0DACsD;IACtD,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,MAAM,CASR;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAER"}
1
+ {"version":3,"file":"derive-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-pipeline/derive-keys.ts"],"names":[],"mappings":"AAyBA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB;0DACsD;IACtD,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,MAAM,CAYR;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAER"}
@@ -6,11 +6,14 @@ import { createHash } from "node:crypto";
6
6
  // archive collapse to the same identity regardless of release-level drift in
7
7
  // chunk indices, hash widths, or arbitrary tiebreakers.
8
8
  //
9
- // conversationIdentity = sha256(accountId + ":" + sortedParticipantElementIds.join(","))
9
+ // conversationIdentity = sha256(accountId + ":" + sortedParticipantElementIds.join(",") + ":" + source)
10
10
  // messageContentHash = sha256(dateSent + "|" + body)
11
11
  //
12
12
  // `conversationIdentity` is stable across re-exports — same operator + same
13
- // participant set → same identity, regardless of file bytes.
13
+ // participant set + same source → same identity, regardless of file bytes.
14
+ // Source is part of the hash because a 1:1 conversation with the same person
15
+ // on WhatsApp and by email is two conversations, not one — their `:Person`
16
+ // elementIds match, so without source-scoping the parent rows collide.
14
17
  //
15
18
  // `messageContentHash`: hashes `dateSent + body`. Per-line
16
19
  // senderName is gone (the scanner is body-opaque); the body string still
@@ -28,8 +31,11 @@ export function deriveConversationIdentity(input) {
28
31
  if (input.participantElementIds.length === 0) {
29
32
  throw new Error("deriveConversationIdentity: participantElementIds must be non-empty");
30
33
  }
34
+ if (!input.source || !input.source.trim()) {
35
+ throw new Error("deriveConversationIdentity: source is required");
36
+ }
31
37
  const sorted = [...input.participantElementIds].sort();
32
- return sha256Hex(`${input.accountId}:${sorted.join(",")}`);
38
+ return sha256Hex(`${input.accountId}:${sorted.join(",")}:${input.source}`);
33
39
  }
34
40
  export function deriveMessageContentHash(input) {
35
41
  return sha256Hex(`${input.dateSent}|${input.body}`);
@@ -1 +1 @@
1
- {"version":3,"file":"derive-keys.js","sourceRoot":"","sources":["../../../src/lib/conversation-pipeline/derive-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,wDAAwD;AACxD,EAAE;AACF,2FAA2F;AAC3F,yDAAyD;AACzD,EAAE;AACF,4EAA4E;AAC5E,6DAA6D;AAC7D,EAAE;AACF,2DAA2D;AAC3D,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAE9E,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AASD,MAAM,UAAU,0BAA0B,CACxC,KAAsC;IAEtC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAOD,MAAM,UAAU,wBAAwB,CACtC,KAAoC;IAEpC,OAAO,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"derive-keys.js","sourceRoot":"","sources":["../../../src/lib/conversation-pipeline/derive-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,wDAAwD;AACxD,EAAE;AACF,0GAA0G;AAC1G,yDAAyD;AACzD,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,uEAAuE;AACvE,EAAE;AACF,2DAA2D;AAC3D,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAE9E,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAWD,MAAM,UAAU,0BAA0B,CACxC,KAAsC;IAEtC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7E,CAAC;AAOD,MAAM,UAAU,wBAAwB,CACtC,KAAoC;IAEpC,OAAO,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC"}
@@ -18,7 +18,7 @@
18
18
  * - `resolveConfigDir` — brand config-dir resolver, shared with other plugins.
19
19
  * - `expungeConversationMemory` — the helper behind the manual
20
20
  * `conversation-memory-expunge` tool. Agent-directed: caller passes a
21
- * conversationId + pattern, the helper nulls matching string properties on
21
+ * sessionId + pattern, the helper nulls matching string properties on
22
22
  * `:Memory` nodes linked to that conversation. No bulk logic.
23
23
  */
24
24
  import type { Driver } from "neo4j-driver";
@@ -31,11 +31,11 @@ export declare function loadDenylist(configDir: string): DenyList;
31
31
  export declare function saveDenylist(configDir: string, list: DenyList): void;
32
32
  export declare function resolveConfigDir(): string;
33
33
  export interface ExpungeResult {
34
- conversationId: string;
34
+ sessionId: string;
35
35
  pattern: string;
36
36
  nodesScanned: number;
37
37
  propertiesNulled: number;
38
38
  affectedNodeIds: number[];
39
39
  }
40
- export declare function expungeConversationMemory(driver: Driver, accountId: string, conversationId: string, pattern: string): Promise<ExpungeResult>;
40
+ export declare function expungeConversationMemory(driver: Driver, accountId: string, sessionId: string, pattern: string): Promise<ExpungeResult>;
41
41
  //# sourceMappingURL=graph-prune.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-prune.d.ts","sourceRoot":"","sources":["../../src/lib/graph-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAexD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAGpE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAczC;AAYD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAqDxB"}
1
+ {"version":3,"file":"graph-prune.d.ts","sourceRoot":"","sources":["../../src/lib/graph-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAexD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAGpE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAczC;AAYD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAqDxB"}
@@ -18,7 +18,7 @@
18
18
  * - `resolveConfigDir` — brand config-dir resolver, shared with other plugins.
19
19
  * - `expungeConversationMemory` — the helper behind the manual
20
20
  * `conversation-memory-expunge` tool. Agent-directed: caller passes a
21
- * conversationId + pattern, the helper nulls matching string properties on
21
+ * sessionId + pattern, the helper nulls matching string properties on
22
22
  * `:Memory` nodes linked to that conversation. No bulk logic.
23
23
  */
24
24
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -63,10 +63,10 @@ export function resolveConfigDir() {
63
63
  }
64
64
  return resolve(homedir(), brand.configDir);
65
65
  }
66
- export async function expungeConversationMemory(driver, accountId, conversationId, pattern) {
66
+ export async function expungeConversationMemory(driver, accountId, sessionId, pattern) {
67
67
  const session = driver.session();
68
68
  try {
69
- const matchRes = await session.run(`MATCH (m:Memory)-[:PART_OF|:ABOUT]->(c:Conversation {conversationId: $conversationId})
69
+ const matchRes = await session.run(`MATCH (m:Memory)-[:PART_OF|:ABOUT]->(c:Conversation {sessionId: $sessionId})
70
70
  WHERE m.accountId = $accountId
71
71
  WITH m, [k IN keys(m) WHERE k <> '_denylistAudit'
72
72
  AND k <> 'embedding'
@@ -75,7 +75,7 @@ export async function expungeConversationMemory(driver, accountId, conversationI
75
75
  WHEN toString(m[k]) = m[k] THEN m[k] CONTAINS $pattern
76
76
  ELSE false
77
77
  END] AS hits
78
- RETURN id(m) AS nid, hits, size(collect(m)) AS scanned`, { accountId, conversationId, pattern });
78
+ RETURN id(m) AS nid, hits, size(collect(m)) AS scanned`, { accountId, sessionId, pattern });
79
79
  let propertiesNulled = 0;
80
80
  const affectedNodeIds = [];
81
81
  let nodesScanned = 0;
@@ -91,7 +91,7 @@ export async function expungeConversationMemory(driver, accountId, conversationI
91
91
  ts: new Date().toISOString(),
92
92
  properties: hits,
93
93
  manualPattern: pattern,
94
- conversationId,
94
+ sessionId,
95
95
  });
96
96
  await session.run(`MATCH (m) WHERE id(m) = $nid
97
97
  SET ${setClauses},
@@ -99,7 +99,7 @@ export async function expungeConversationMemory(driver, accountId, conversationI
99
99
  propertiesNulled += hits.length;
100
100
  }
101
101
  return {
102
- conversationId,
102
+ sessionId,
103
103
  pattern,
104
104
  nodesScanned,
105
105
  propertiesNulled,
@@ -1 +1 @@
1
- {"version":3,"file":"graph-prune.js","sourceRoot":"","sources":["../../src/lib/graph-prune.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-prune.js","sourceRoot":"","sources":["../../src/lib/graph-prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Body-growth threshold above which a reclassify is allowed. Below this the
3
+ * gate returns "skip" because section topology is unlikely to have shifted.
4
+ * Picked to fire on roughly 2-3 new messages in a 10-message thread.
5
+ */
6
+ export declare const KD_CLASSIFY_GROWTH_THRESHOLD = 0.25;
7
+ export interface GateInputs {
8
+ bodyLen: number;
9
+ /** Body length at the previous successful classify; 0 / null means never classified. */
10
+ lastClassifiedBodyLength: number;
11
+ }
12
+ export interface GateDecision {
13
+ action: "skip" | "proceed";
14
+ growthPct: number;
15
+ /** Human-readable skip reason when action === "skip". */
16
+ reason: string | null;
17
+ }
18
+ /** Decide whether a classify call should proceed based on body-length delta. */
19
+ export declare function decideGate({ bodyLen, lastClassifiedBodyLength }: GateInputs): GateDecision;
20
+ /**
21
+ * Write the KD's body to a deterministic temp-file path so the librarian can
22
+ * feed it through memory-ingest-extract → memory-ingest unchanged. Deterministic
23
+ * path = idempotent under repeat calls; the file is overwritten if it exists.
24
+ */
25
+ export declare function writeClassifyTempFile(accountDir: string, attachmentId: string, body: string): Promise<string>;
26
+ /**
27
+ * Build the dispatch envelope the operator-visible tool returns. Admin reads
28
+ * the envelope and uses the Task tool to dispatch the librarian specialist;
29
+ * librarian runs the document-ingest skill against `tempFilePath` with the
30
+ * named `attachmentId` so the resulting :Section children land under the
31
+ * pre-existing :KnowledgeDocument (memory-ingest is keyed on attachmentId).
32
+ */
33
+ export declare function buildDispatchEnvelope(opts: {
34
+ attachmentId: string;
35
+ source: string;
36
+ tempFilePath: string;
37
+ bodyLen: number;
38
+ lastClassifiedBodyLength: number;
39
+ growthPct: number;
40
+ }): string;
41
+ //# sourceMappingURL=kd-classify-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kd-classify-gate.d.ts","sourceRoot":"","sources":["../../src/lib/kd-classify-gate.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,UAAU,GAAG,YAAY,CAe1F;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,MAAM,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAeT"}