@rubytech/create-maxy-code 0.1.254 → 0.1.256

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 (357) hide show
  1. package/dist/__tests__/plugin-install.test.js +58 -40
  2. package/dist/index.js +77 -26
  3. package/dist/lib/plugin-install.js +31 -29
  4. package/package.json +1 -1
  5. package/payload/platform/.docs/search-surface-contract.md +58 -0
  6. package/payload/platform/config/brand-registry.json +8 -0
  7. package/payload/platform/config/brand.json +3 -3
  8. package/payload/platform/lib/embed-client/dist/index.d.ts +4 -0
  9. package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -0
  10. package/payload/platform/lib/embed-client/dist/index.js +53 -0
  11. package/payload/platform/lib/embed-client/dist/index.js.map +1 -0
  12. package/payload/platform/lib/embed-client/src/index.ts +53 -0
  13. package/payload/platform/lib/embed-client/tsconfig.json +8 -0
  14. package/payload/platform/lib/graph-search/dist/index.d.ts +27 -6
  15. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  16. package/payload/platform/lib/graph-search/dist/index.js +19 -1
  17. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  18. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +12 -0
  19. package/payload/platform/lib/graph-search/src/index.ts +28 -6
  20. package/payload/platform/lib/graph-write/dist/index.d.ts +25 -0
  21. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  22. package/payload/platform/lib/graph-write/dist/index.js +80 -2
  23. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  24. package/payload/platform/lib/graph-write/src/index.ts +98 -1
  25. package/payload/platform/neo4j/schema.cypher +126 -0
  26. package/payload/platform/package.json +2 -2
  27. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  28. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  29. package/payload/platform/plugins/admin/PLUGIN.md +3 -6
  30. package/payload/platform/plugins/admin/mcp/dist/index.js +14 -60
  31. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  32. package/payload/platform/plugins/admin/skills/insight/SKILL.md +24 -0
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +84 -31
  34. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  35. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  36. package/payload/platform/plugins/docs/references/deployment.md +18 -5
  37. package/payload/platform/plugins/docs/references/graph.md +2 -0
  38. package/payload/platform/plugins/docs/references/internals.md +12 -1
  39. package/payload/platform/plugins/docs/references/memory-guide.md +4 -0
  40. package/payload/platform/plugins/docs/references/neo4j.md +2 -2
  41. package/payload/platform/plugins/docs/references/platform.md +1 -1
  42. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  43. package/payload/platform/plugins/docs/references/session-retrospective.md +5 -18
  44. package/payload/platform/plugins/docs/references/slides.md +31 -0
  45. package/payload/platform/plugins/docs/references/voice-mirror-guide.md +1 -1
  46. package/payload/platform/plugins/email/PLUGIN.md +2 -2
  47. package/payload/platform/plugins/email/mcp/dist/index.js +8 -0
  48. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  49. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +19 -0
  50. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -0
  51. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +64 -0
  52. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -0
  53. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +4 -0
  54. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  55. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +1 -0
  56. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts +1 -0
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  59. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +6 -1
  60. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  61. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts +1 -0
  62. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  63. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +7 -1
  64. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  65. package/payload/platform/plugins/email/references/email-reference.md +4 -0
  66. package/payload/platform/plugins/memory/PLUGIN.md +1 -2
  67. package/payload/platform/plugins/memory/mcp/dist/index.js +6 -44
  68. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts +2 -0
  70. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js +41 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js.map +1 -0
  73. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts +2 -0
  74. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js +90 -0
  76. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map +1 -0
  77. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts +2 -0
  78. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts.map +1 -0
  79. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js +27 -0
  80. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js.map +1 -0
  81. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts +10 -0
  82. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts.map +1 -0
  83. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js +47 -0
  84. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js.map +1 -0
  85. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +1 -2
  86. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -1
  87. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +5 -28
  88. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts +2 -0
  90. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts.map +1 -0
  91. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js +20 -0
  92. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js.map +1 -0
  93. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts +2 -0
  94. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts.map +1 -0
  95. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js +67 -0
  96. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js.map +1 -0
  97. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts +2 -0
  98. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts.map +1 -0
  99. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +34 -0
  100. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -0
  101. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts +2 -0
  102. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts.map +1 -0
  103. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js +61 -0
  104. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js.map +1 -0
  105. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +23 -1
  106. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
  107. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts +2 -0
  108. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js +87 -0
  110. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js.map +1 -0
  111. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +3 -0
  112. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
  113. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts +2 -0
  114. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts.map +1 -0
  115. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js +34 -0
  116. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js.map +1 -0
  117. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
  118. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +19 -4
  119. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
  120. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -6
  121. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  122. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +280 -10
  123. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -1
  125. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +76 -37
  126. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -1
  127. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
  128. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +11 -2
  129. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +4 -4
  131. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +3 -3
  132. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  133. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +20 -2
  134. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  135. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +6 -3
  136. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  137. package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
  138. package/payload/platform/plugins/memory/references/schema-base.md +1 -1
  139. package/payload/platform/plugins/memory/references/schema-construction.md +72 -0
  140. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.d.ts.map +1 -1
  141. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js +15 -0
  142. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js.map +1 -1
  143. package/payload/platform/plugins/slides/.claude-plugin/plugin.json +8 -0
  144. package/payload/platform/plugins/slides/LICENSE +21 -0
  145. package/payload/platform/plugins/slides/PLUGIN.md +18 -0
  146. package/payload/platform/plugins/slides/PROVENANCE.md +40 -0
  147. package/payload/platform/plugins/slides/commands/add-slide.md +29 -0
  148. package/payload/platform/plugins/slides/commands/slides-claus.md +39 -0
  149. package/payload/platform/plugins/slides/commands/slides-new-component.md +39 -0
  150. package/payload/platform/plugins/slides/commands/slides-outline.md +43 -0
  151. package/payload/platform/plugins/slides/commands/slides-review.md +52 -0
  152. package/payload/platform/plugins/slides/commands/slides-theme.md +64 -0
  153. package/payload/platform/plugins/slides/commands/slides.md +59 -0
  154. package/payload/platform/plugins/slides/skills/deck-system/REFERENCE.md +581 -0
  155. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +607 -0
  156. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-board.md +426 -0
  157. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-claus.md +185 -0
  158. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-mbb.md +450 -0
  159. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-product-launch.md +579 -0
  160. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sales.md +464 -0
  161. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sequoia.md +489 -0
  162. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING.md +273 -0
  163. package/payload/platform/plugins/slides/skills/deck-system/deck-craft.html +1371 -0
  164. package/payload/platform/plugins/slides/skills/deck-system/deck-solid.html +1667 -0
  165. package/payload/platform/plugins/slides/skills/deck-system/deck.html +1359 -0
  166. package/payload/platform/plugins/url-get/.claude-plugin/plugin.json +1 -1
  167. package/payload/platform/plugins/url-get/PLUGIN.md +26 -21
  168. package/payload/platform/plugins/url-get/mcp/dist/index.js +3 -3
  169. package/payload/platform/plugins/url-get/mcp/dist/index.js.map +1 -1
  170. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts +1 -2
  171. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts.map +1 -1
  172. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +20 -40
  173. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  174. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +4 -0
  175. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  176. package/payload/platform/scripts/identity-forbidden-token-check.mjs +0 -1
  177. package/payload/platform/scripts/setup-account.sh +0 -15
  178. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +23 -0
  179. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -0
  180. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +29 -0
  181. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -0
  182. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  183. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -2
  184. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  185. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  186. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  187. package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -2
  188. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  189. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  190. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +8 -1
  191. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  192. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts +13 -1
  193. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  194. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +26 -2
  195. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  196. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -2
  197. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  198. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +12 -3
  199. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  200. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +3 -2
  201. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  202. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -2
  203. package/payload/platform/templates/specialists/agents/database-operator.md +3 -7
  204. package/payload/platform/templates/specialists/agents/typed-edge-classifier.md +1 -1
  205. package/payload/premium-plugins/writer-craft/PLUGIN.md +2 -2
  206. package/payload/premium-plugins/writer-craft/mcp/dist/index.js +5 -5
  207. package/payload/premium-plugins/writer-craft/mcp/dist/index.js.map +1 -1
  208. package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.d.ts +1 -1
  209. package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.js +1 -1
  210. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.d.ts +4 -8
  211. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.d.ts.map +1 -1
  212. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.js +30 -98
  213. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.js.map +1 -1
  214. package/payload/premium-plugins/writer-craft/mcp/scripts/smoke.mjs +37 -114
  215. package/payload/premium-plugins/writer-craft/mcp/src/index.ts +5 -5
  216. package/payload/premium-plugins/writer-craft/mcp/src/lib/voice-corpus.ts +1 -1
  217. package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-ingest-session-text.ts +29 -106
  218. package/payload/premium-plugins/writer-craft/skills/voice-mirror/SKILL.md +15 -17
  219. package/payload/server/{chunk-M6A6EZD4.js → chunk-76HRO7NX.js} +16 -2
  220. package/payload/server/maxy-edge.js +1 -1
  221. package/payload/server/public/assets/AdminShell-T-YknnBn.js +1 -0
  222. package/payload/server/public/assets/Checkbox-DmDxpqVv.js +1 -0
  223. package/payload/server/public/assets/admin-COUV-jgt.js +1 -0
  224. package/payload/server/public/assets/{arc-aUiRP9AS.js → arc-B2CweJq3.js} +1 -1
  225. package/payload/server/public/assets/architecture-YZFGNWBL-Dnn6Hc65.js +1 -0
  226. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-c09loTER.js → architectureDiagram-Q4EWVU46-DP2o-MFV.js} +1 -1
  227. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cjdeyoq1.js → blockDiagram-DXYQGD6D-DO4mcYDJ.js} +1 -1
  228. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-NY6Wlzo2.js → c4Diagram-AHTNJAMY-Sy1giHbj.js} +1 -1
  229. package/payload/server/public/assets/channel-CEpR_0rE.js +1 -0
  230. package/payload/server/public/assets/{chunk-2KRD3SAO-BK3470lx.js → chunk-2KRD3SAO-CKsCYCsN.js} +1 -1
  231. package/payload/server/public/assets/chunk-336JU56O-C0-P-aUF.js +2 -0
  232. package/payload/server/public/assets/chunk-426QAEUC-DFjEt3Zb.js +1 -0
  233. package/payload/server/public/assets/{chunk-4BX2VUAB-BOvVdJLf.js → chunk-4BX2VUAB-B8bqAmBa.js} +1 -1
  234. package/payload/server/public/assets/{chunk-4TB4RGXK-BXpto3yW.js → chunk-4TB4RGXK-D1k0VSlW.js} +1 -1
  235. package/payload/server/public/assets/{chunk-55IACEB6-BwZyF7vR.js → chunk-55IACEB6-B-p_QNqz.js} +1 -1
  236. package/payload/server/public/assets/{chunk-5FUZZQ4R-C403gCUk.js → chunk-5FUZZQ4R-D6U6tV_j.js} +1 -1
  237. package/payload/server/public/assets/{chunk-5PVQY5BW-CjVzXQEp.js → chunk-5PVQY5BW-CYK76xfs.js} +1 -1
  238. package/payload/server/public/assets/{chunk-67CJDMHE-D5bhMrtY.js → chunk-67CJDMHE-BC9js-lf.js} +1 -1
  239. package/payload/server/public/assets/{chunk-7N4EOEYR-Si7Lgrwc.js → chunk-7N4EOEYR-4j2OqKkv.js} +1 -1
  240. package/payload/server/public/assets/{chunk-AA7GKIK3-DMuHtDqO.js → chunk-AA7GKIK3-Coen-fXN.js} +1 -1
  241. package/payload/server/public/assets/{chunk-BSJP7CBP-L79XKVcb.js → chunk-BSJP7CBP-CAiOBvec.js} +1 -1
  242. package/payload/server/public/assets/{chunk-CIAEETIT-C0O7Upmg.js → chunk-CIAEETIT-AJzzpZVb.js} +1 -1
  243. package/payload/server/public/assets/{chunk-EDXVE4YY-DJcJAsAg.js → chunk-EDXVE4YY-BL4BKozX.js} +1 -1
  244. package/payload/server/public/assets/{chunk-ENJZ2VHE-CFDNvYu1.js → chunk-ENJZ2VHE-mhAFG8UD.js} +1 -1
  245. package/payload/server/public/assets/{chunk-FMBD7UC4-C_E43NFJ.js → chunk-FMBD7UC4-H231gZA_.js} +1 -1
  246. package/payload/server/public/assets/{chunk-FOC6F5B3-D9lWWHAu.js → chunk-FOC6F5B3-Cl3ZZjYG.js} +1 -1
  247. package/payload/server/public/assets/{chunk-ICPOFSXX-ecLOxGhL.js → chunk-ICPOFSXX-DOEzvzJa.js} +2 -2
  248. package/payload/server/public/assets/{chunk-K5T4RW27-DuhsNH4c.js → chunk-K5T4RW27-C_ipbUDD.js} +1 -1
  249. package/payload/server/public/assets/{chunk-KGLVRYIC-B4-A1Abi.js → chunk-KGLVRYIC-CTsDNSCU.js} +1 -1
  250. package/payload/server/public/assets/{chunk-LIHQZDEY-BxqgHRgT.js → chunk-LIHQZDEY-DvSXhkGf.js} +1 -1
  251. package/payload/server/public/assets/{chunk-ORNJ4GCN-DEYQ5WaJ.js → chunk-ORNJ4GCN-p574NOI7.js} +1 -1
  252. package/payload/server/public/assets/{chunk-OYMX7WX6-B7MW66KB.js → chunk-OYMX7WX6-BlEgFM6U.js} +1 -1
  253. package/payload/server/public/assets/chunk-QZHKN3VN-DpF06ZZQ.js +1 -0
  254. package/payload/server/public/assets/{chunk-U2HBQHQK-BMawmsyk.js → chunk-U2HBQHQK-B2bDK0jv.js} +1 -1
  255. package/payload/server/public/assets/{chunk-X2U36JSP-CT6g7pno.js → chunk-X2U36JSP-D69BxKFw.js} +1 -1
  256. package/payload/server/public/assets/{chunk-XPW4576I-CBfZXZDB.js → chunk-XPW4576I-Dm-PcyUi.js} +1 -1
  257. package/payload/server/public/assets/{chunk-YZCP3GAM-xeAluiAH.js → chunk-YZCP3GAM-Be8RnXgx.js} +1 -1
  258. package/payload/server/public/assets/{chunk-ZZ45TVLE-BRN9qUC5.js → chunk-ZZ45TVLE-Ck8PCTa4.js} +1 -1
  259. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CYbXvKLI.js +1 -0
  260. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DEyHzRhq.js +1 -0
  261. package/payload/server/public/assets/clone-y8gexbBy.js +1 -0
  262. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Br2gjtEO.js → cose-bilkent-S5V4N54A-CmkW2Eaj.js} +1 -1
  263. package/payload/server/public/assets/{dagre-DTjePoco.js → dagre-Dqp-ns8F.js} +1 -1
  264. package/payload/server/public/assets/{dagre-KV5264BT-DHBkRke4.js → dagre-KV5264BT-ZgWWXPLc.js} +1 -1
  265. package/payload/server/public/assets/data-gy6QH9c1.js +1 -0
  266. package/payload/server/public/assets/{diagram-5BDNPKRD-BIq1-idL.js → diagram-5BDNPKRD-CTX5-ScM.js} +1 -1
  267. package/payload/server/public/assets/{diagram-G4DWMVQ6-BsIUDzV6.js → diagram-G4DWMVQ6-BovIsO6H.js} +1 -1
  268. package/payload/server/public/assets/{diagram-MMDJMWI5-CgHSri2i.js → diagram-MMDJMWI5-DcETsQy-.js} +1 -1
  269. package/payload/server/public/assets/{diagram-TYMM5635-Ce2Wh9ZX.js → diagram-TYMM5635-yyq6peoZ.js} +1 -1
  270. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BU0Kh6OQ.js → erDiagram-SMLLAGMA-CiNToftB.js} +1 -1
  271. package/payload/server/public/assets/{flatten-Bo6YRmWl.js → flatten-BtFI066E.js} +1 -1
  272. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-B0N06MF7.js → flowDiagram-DWJPFMVM-Xnl3SpIM.js} +1 -1
  273. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BVbx4ARZ.js → ganttDiagram-T4ZO3ILL-C1iyWe0f.js} +1 -1
  274. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CNs-LD5i.js +1 -0
  275. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C-xRJ94t.js → gitGraphDiagram-UUTBAWPF-D97pbMQb.js} +1 -1
  276. package/payload/server/public/assets/graph-labels-cZu4pK16.js +1 -0
  277. package/payload/server/public/assets/{graph-g48ZcA5M.js → graph-qz5tFKqU.js} +3 -3
  278. package/payload/server/public/assets/{graphlib-YmNcoMjY.js → graphlib-Lq8ijgON.js} +1 -1
  279. package/payload/server/public/assets/info-OMHHGYJF-DsTNigSS.js +1 -0
  280. package/payload/server/public/assets/infoDiagram-42DDH7IO-C_OarRTA.js +2 -0
  281. package/payload/server/public/assets/{isEmpty-D6Kr-M1M.js → isEmpty-D6QovjYR.js} +1 -1
  282. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DTrq54yC.js → ishikawaDiagram-UXIWVN3A-B8XBdjJn.js} +1 -1
  283. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-OZZZMrFX.js → journeyDiagram-VCZTEJTY-CZYbiOaQ.js} +1 -1
  284. package/payload/server/public/assets/{kanban-definition-6JOO6SKY--w-IP9pN.js → kanban-definition-6JOO6SKY-B1PybFoh.js} +1 -1
  285. package/payload/server/public/assets/{line-Ckeulv5T.js → line-D-tw3hHp.js} +1 -1
  286. package/payload/server/public/assets/{linear-DOh_6k2k.js → linear-BHhXD3cd.js} +1 -1
  287. package/payload/server/public/assets/{mermaid-parser.core-CVRAxYRD.js → mermaid-parser.core-C9RAnysF.js} +2 -2
  288. package/payload/server/public/assets/{mermaid.core-B-mE18I1.js → mermaid.core-B532LT1r.js} +3 -3
  289. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Bm8mDicL.js → mindmap-definition-QFDTVHPH-DGlgeeTV.js} +1 -1
  290. package/payload/server/public/assets/{ordinal-BDi6f4xk.js → ordinal-Bl-aM5b9.js} +1 -1
  291. package/payload/server/public/assets/packet-4T2RLAQJ-DGES22b-.js +1 -0
  292. package/payload/server/public/assets/pie-ZZUOXDRM-ChKeDbzt.js +1 -0
  293. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BCmRLgGO.js → pieDiagram-DEJITSTG-DV9FIWko.js} +1 -1
  294. package/payload/server/public/assets/{public-DknO-g9S.js → public-Bu2_Xi0a.js} +5 -5
  295. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CniTIUTm.js → quadrantDiagram-34T5L4WZ-Betwya4l.js} +1 -1
  296. package/payload/server/public/assets/radar-PYXPWWZC-FGG5Fs7N.js +1 -0
  297. package/payload/server/public/assets/{reduce-CGi9ik8i.js → reduce-BD4xUd2c.js} +1 -1
  298. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CoxBSj9M.js → requirementDiagram-MS252O5E-Cq3vODdg.js} +1 -1
  299. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BjS-4jzq.js → sankeyDiagram-XADWPNL6-x8krXWcS.js} +1 -1
  300. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B9jVOnPR.js → sequenceDiagram-FGHM5R23-i-_uH-Yl.js} +1 -1
  301. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BvOQPzP8.js → stateDiagram-FHFEXIEX-il4KqSgI.js} +1 -1
  302. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B6zNJ6Tv.js +1 -0
  303. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CdfgWLo1.js → timeline-definition-GMOUNBTQ-DATdZkA5.js} +1 -1
  304. package/payload/server/public/assets/treeView-SZITEDCU-VAQQdbtf.js +1 -0
  305. package/payload/server/public/assets/treemap-W4RFUUIX-DKchO3zI.js +1 -0
  306. package/payload/server/public/assets/useSelectionMode-A5KItZ2T.js +13 -0
  307. package/payload/server/public/assets/{brand-D0gNihp7.css → useSelectionMode-C-Ojh7W9.css} +1 -1
  308. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-JCgpIbj-.js → vennDiagram-DHZGUBPP-BJh9tJTt.js} +1 -1
  309. package/payload/server/public/assets/wardley-RL74JXVD-CBGtx0bS.js +1 -0
  310. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dei3VqHo.js → wardleyDiagram-NUSXRM2D-EMN1Hdfg.js} +1 -1
  311. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DUtIyoIb.js → xychartDiagram-5P7HB3ND-DbUWXa7T.js} +1 -1
  312. package/payload/server/public/data.html +5 -5
  313. package/payload/server/public/graph.html +6 -6
  314. package/payload/server/public/index.html +5 -6
  315. package/payload/server/public/public.html +4 -5
  316. package/payload/server/server.js +525 -39
  317. package/payload/platform/plugins/admin/hooks/__tests__/session-end-retrospective.test.sh +0 -396
  318. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +0 -239
  319. package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +0 -214
  320. package/payload/premium-plugins/writer-craft/hooks/__tests__/voice-session-end-text.test.sh +0 -284
  321. package/payload/premium-plugins/writer-craft/hooks/voice-session-end-text.sh +0 -75
  322. package/payload/premium-plugins/writer-craft/mcp/src/cli/ingest-session-text.ts +0 -65
  323. package/payload/server/public/assets/AdminShell-892Jy_rs.js +0 -1
  324. package/payload/server/public/assets/Checkbox-Bc2QzX9b.js +0 -1
  325. package/payload/server/public/assets/admin-D3K13ndi.js +0 -1
  326. package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +0 -1
  327. package/payload/server/public/assets/brand-CcN3dELF.js +0 -9
  328. package/payload/server/public/assets/channel-B1IT7to2.js +0 -1
  329. package/payload/server/public/assets/chunk-336JU56O-CdKRCIeE.js +0 -2
  330. package/payload/server/public/assets/chunk-426QAEUC-BybuQ3Ve.js +0 -1
  331. package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +0 -1
  332. package/payload/server/public/assets/classDiagram-6PBFFD2Q-rjCize6i.js +0 -1
  333. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BORWOUt0.js +0 -1
  334. package/payload/server/public/assets/clone-Csqv5U6T.js +0 -1
  335. package/payload/server/public/assets/data-Br-pdljK.js +0 -1
  336. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +0 -1
  337. package/payload/server/public/assets/graph-labels-BYH-IPCb.js +0 -1
  338. package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +0 -1
  339. package/payload/server/public/assets/infoDiagram-42DDH7IO-Di6oPQ_-.js +0 -2
  340. package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +0 -1
  341. package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +0 -1
  342. package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +0 -1
  343. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-v4ND10uR.js +0 -1
  344. package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +0 -1
  345. package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +0 -1
  346. package/payload/server/public/assets/useSelectionMode-DwsyptOw.js +0 -5
  347. package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +0 -1
  348. /package/payload/server/public/assets/{_baseFor-Cam2PbSt.js → _baseFor-Cs8Y-rGh.js} +0 -0
  349. /package/payload/server/public/assets/{array-DYRGGQae.js → array-iHZP4KWJ.js} +0 -0
  350. /package/payload/server/public/assets/{cytoscape.esm-nWsJMTNI.js → cytoscape.esm-BR2GOQ8_.js} +0 -0
  351. /package/payload/server/public/assets/{defaultLocale-Du1XY3Dp.js → defaultLocale-B9aLeOTg.js} +0 -0
  352. /package/payload/server/public/assets/{dist-BzAsli7o.js → dist-DB-VPj_8.js} +0 -0
  353. /package/payload/server/public/assets/{init-B5BXBRcm.js → init-BNFRgqHM.js} +0 -0
  354. /package/payload/server/public/assets/{katex-HOUACuRw.js → katex-B-EfS3nw.js} +0 -0
  355. /package/payload/server/public/assets/{path-CNO468J-.js → path-DmWWdwp7.js} +0 -0
  356. /package/payload/server/public/assets/{rough.esm-DRO6hWPh.js → rough.esm-Ci7Kjt46.js} +0 -0
  357. /package/payload/server/public/assets/{src-CWiyyVfn.js → src-C1jfwBq0.js} +0 -0
@@ -1,214 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Stop hook — gates session termination until the admin agent has performed
3
- # a four-pass retrospective (technical learnings, operator-relationship
4
- # updates, graph-completeness sweep, typed-edge auto-extraction) and called
5
- # the deterministic `session-retrospective-mark-complete` MCP sentinel
6
- # tool. Task 282; converged onto the Task 439 shared helper.
7
- #
8
- # Trigger detection. End-intent is the operator's most recent real-user
9
- # message matching one of the literal token strings:
10
- # /end | /archive | end session | archive this session
11
- # "Real user" follows the same shape used by
12
- # askuserquestion-investigate-gate.sh — `type=user, message.role=user,
13
- # content` is a string OR a list with at least one non-`tool_result` block.
14
- # `tool_result`-only user records are tool replies, not turn starts, and
15
- # never count as the latest user message.
16
- #
17
- # The Sidebar Archive button POSTs `/:sessionId/archive` which kills the
18
- # PTY directly — no Stop fires after that, so clicking Archive is the
19
- # operator's de-facto skip path. The spec lists opt-out as a deferred
20
- # follow-up; archive-click is its current shape and acceptable behaviour.
21
- #
22
- # Sentinel detection. Completion is recognised by greping the operator's
23
- # own JSONL (transcript_path on the Stop envelope) for a `tool_use` block
24
- # whose `name` is exactly `mcp__admin__session-retrospective-mark-complete`
25
- # — that is the prefixed form Claude Code writes for MCP tools in the
26
- # JSONL; the unprefixed name only appears in the operator-facing
27
- # instruction text below. The sentinel-grep doubles as the re-entry guard:
28
- # every Stop that fires after the agent's sentinel call sees the sentinel
29
- # and exits 0 with `gate-released`, so the agent's wrap-up turn never
30
- # re-blocks.
31
- # [[feedback_no_stdout_parsing_for_control_flow]],
32
- # [[feedback_doctrine_paragraph_is_not_a_gate]] — the LLM is removed from
33
- # the per-decision path entirely.
34
- #
35
- # Gating (common guards live in `lib/admin-graph-pass-common.sh`; this
36
- # hook adds the end-intent gating layered on top):
37
- # - role-not-admin / is-specialist / empty-stdin / missing-transcript:
38
- # handled by the shared helper, emit `trigger-skipped` and exit 0.
39
- # - no-intent-match: latest real-user message has no end-intent token,
40
- # emit `trigger-skipped` and exit 0.
41
- #
42
- # Releases:
43
- # - gate-released sessionId=<id> (when sentinel present in transcript)
44
- #
45
- # Blocks:
46
- # - gate-blocked sessionId=<id> reason=sentinel-absent
47
- # (exit 2; stderr carries the four-pass retrospective instruction —
48
- # stderr is the Stop-hook contract for handing instructions back to
49
- # the agent).
50
- #
51
- # Input: Claude Code's Stop hook stdin shape
52
- # { "session_id": "<intrinsic>", "transcript_path": "<jsonl path>", ... }
53
-
54
- set -uo pipefail
55
-
56
- AGP_LOG_TAG="session-retrospective"
57
- AGP_LIB="$(dirname "$0")/lib/admin-graph-pass-common.sh"
58
- if [ ! -f "$AGP_LIB" ]; then
59
- echo "[${AGP_LOG_TAG}] trigger-skipped sessionId=unknown reason=missing-helper path=${AGP_LIB}" >&2
60
- exit 0
61
- fi
62
- # shellcheck source=lib/admin-graph-pass-common.sh
63
- source "$AGP_LIB"
64
-
65
- agp_setup_logging
66
- agp_read_stdin
67
- agp_parse_stdin
68
- agp_guard_role_specialist
69
- agp_guard_transcript require-stdin
70
-
71
- # Single Python pass walks the transcript and reports two facts:
72
- # 1. The latest end-intent token in the most recent real-user message,
73
- # or empty if no real user message matches.
74
- # 2. Whether any `tool_use` block in the transcript names the sentinel
75
- # tool `mcp__admin__session-retrospective-mark-complete`.
76
- # Output one line: <intent-token-or-empty>\t<sentinel-present-yes|no>
77
- INSPECTION=$(TRANSCRIPT_PATH="$TRANSCRIPT_PATH" python3 - <<'PY'
78
- import os, json
79
-
80
- SENTINEL_TOOL = "mcp__admin__session-retrospective-mark-complete"
81
- INTENT_TOKENS = ("/end", "/archive", "end session", "archive this session")
82
-
83
- def is_real_user(rec):
84
- if not isinstance(rec, dict) or rec.get("type") != "user":
85
- return False
86
- msg = rec.get("message")
87
- if not isinstance(msg, dict) or msg.get("role") != "user":
88
- return False
89
- content = msg.get("content")
90
- if isinstance(content, str):
91
- return True
92
- if isinstance(content, list):
93
- for b in content:
94
- if isinstance(b, dict) and b.get("type") != "tool_result":
95
- return True
96
- return False
97
- return True
98
-
99
- def extract_user_text(rec):
100
- msg = rec.get("message", {}) or {}
101
- content = msg.get("content")
102
- if isinstance(content, str):
103
- return content
104
- if isinstance(content, list):
105
- out = []
106
- for b in content:
107
- if not isinstance(b, dict):
108
- continue
109
- if b.get("type") == "text":
110
- t = b.get("text")
111
- if isinstance(t, str):
112
- out.append(t)
113
- return "".join(out)
114
- return ""
115
-
116
- def assistant_tool_use_names(rec):
117
- if not isinstance(rec, dict) or rec.get("type") != "assistant":
118
- return []
119
- msg = rec.get("message", {}) or {}
120
- if msg.get("role") != "assistant":
121
- return []
122
- content = msg.get("content")
123
- if not isinstance(content, list):
124
- return []
125
- names = []
126
- for b in content:
127
- if isinstance(b, dict) and b.get("type") == "tool_use":
128
- n = b.get("name")
129
- if isinstance(n, str):
130
- names.append(n)
131
- return names
132
-
133
- path = os.environ["TRANSCRIPT_PATH"]
134
- records = []
135
- try:
136
- with open(path, "r", encoding="utf-8") as f:
137
- for raw in f:
138
- raw = raw.strip()
139
- if not raw:
140
- continue
141
- try:
142
- records.append(json.loads(raw))
143
- except Exception:
144
- continue
145
- except Exception:
146
- print("\tno")
147
- raise SystemExit(0)
148
-
149
- # Sentinel presence — any assistant tool_use of the sentinel tool anywhere
150
- # in this session's JSONL.
151
- sentinel_present = False
152
- for r in records:
153
- if SENTINEL_TOOL in assistant_tool_use_names(r):
154
- sentinel_present = True
155
- break
156
-
157
- # Latest real-user message text.
158
- latest_user_text = ""
159
- for r in reversed(records):
160
- if is_real_user(r):
161
- latest_user_text = extract_user_text(r).strip()
162
- break
163
-
164
- matched = ""
165
- if latest_user_text:
166
- # Case-insensitive whole-message match against the token set. A token
167
- # must appear as the entire user message (after .strip()), or as a
168
- # standalone line within it — not embedded inside a paragraph. Keeps
169
- # the gate from false-positiving on "I'll end session by 5pm" prose.
170
- haystacks = {latest_user_text.lower()}
171
- for line in latest_user_text.splitlines():
172
- s = line.strip().lower()
173
- if s:
174
- haystacks.add(s)
175
- for tok in INTENT_TOKENS:
176
- if tok.lower() in haystacks:
177
- matched = tok
178
- break
179
-
180
- print(f"{matched}\t{'yes' if sentinel_present else 'no'}")
181
- PY
182
- )
183
- INTENT_TOKEN="${INSPECTION%% *}"
184
- SENTINEL_PRESENT="${INSPECTION#* }"
185
-
186
- if [ -z "$INTENT_TOKEN" ]; then
187
- agp_emit_log "trigger-skipped sessionId=${SESSION_ID} reason=no-intent-match"
188
- exit 0
189
- fi
190
-
191
- agp_emit_log "trigger sessionId=${SESSION_ID} token=${INTENT_TOKEN}"
192
-
193
- if [ "$SENTINEL_PRESENT" = "yes" ]; then
194
- agp_emit_log "gate-released sessionId=${SESSION_ID}"
195
- exit 0
196
- fi
197
-
198
- agp_emit_log "gate-blocked sessionId=${SESSION_ID} reason=sentinel-absent"
199
-
200
- cat >&2 <<'INSTRUCTION'
201
- The operator signalled session end. Before this session can close, run the four-pass retrospective inside this same admin session — do not spawn a new session, do not background anything. Use the tools you already have.
202
-
203
- Pass 1 — Technical learnings. Walk this session for operator corrections and self-detected mistakes. For each one, delegate one graph write to `database-operator` via the Task tool, persisting a Learning or Correction node per the schema. Count what you write.
204
-
205
- Pass 2 — Operator-relationship updates. Walk this session for tonal signals, rejected phrasings, and working-style preferences. For each one worth carrying forward, Write the observation into `SOUL.md` at the account-scoped path. Count what you write.
206
-
207
- Pass 3 — Graph completeness sweep. Walk this session for any node, edge, or commitment that was discussed but not written to the graph in-flight. For each missing write, delegate to `database-operator` via the Task tool. Count what you write.
208
-
209
- Pass 4 — Typed-edge auto-extraction. Delegate to `database-operator` via the Task tool with a prompt naming the typed-edge pass and the session-start timestamp. The specialist calls `memory-typed-edge-pass` with that timestamp and returns the counters. Capture `nodesProcessed` and the accepted count from its reply.
210
-
211
- Then call `session-retrospective-mark-complete` with all five counts (learningsCount, preferencesCount, graphWriteCount, typedEdgesCount, nodesProcessed) and reply with one short paragraph in your house voice summarising what you wrote.
212
- INSTRUCTION
213
-
214
- exit 2
@@ -1,284 +0,0 @@
1
- #!/usr/bin/env bash
2
- # voice-session-end-text.sh hook test suite.
3
- #
4
- # Pattern: a local Python HTTP server stands in for /api/admin/log-ingest
5
- # and records every POST so the assertions can inspect every log line the
6
- # hook emitted. The CLI is stubbed with a mock node script so tests run
7
- # without a live Neo4j connection.
8
- #
9
- # Contract under test:
10
- # - Hook skips with reason=role-not-admin when MAXY_SESSION_ROLE != admin.
11
- # - Hook skips with reason=is-specialist when MAXY_SPECIALIST is set.
12
- # - Hook skips with reason=empty-stdin when no stdin is piped.
13
- # - Hook skips with reason=missing-transcript when the JSONL path in the
14
- # stdin envelope does not exist.
15
- # - Hook skips with reason=cli-not-found when the compiled CLI is absent.
16
- # - Happy path: hook emits trigger + result=ok when all guards pass and the
17
- # stub CLI exits 0.
18
- # - Dedupe path: stub CLI returns turns=0 skipped=3 → result=ok with those
19
- # counts (verifying the hook forwards the CLI stdout to the log-ingest).
20
-
21
- set -u
22
-
23
- HOOK="$(cd "$(dirname "$0")/.." && pwd)/voice-session-end-text.sh"
24
- if [[ ! -f "$HOOK" ]]; then
25
- echo "FAIL: hook not found at $HOOK" >&2
26
- exit 1
27
- fi
28
-
29
- PASS=0
30
- FAIL=0
31
- TMPFILES=()
32
- LISTENER_PIDS=()
33
-
34
- cleanup() {
35
- for pid in "${LISTENER_PIDS[@]:-}"; do
36
- [[ -n "$pid" ]] && { kill "$pid" 2>/dev/null || true; wait "$pid" 2>/dev/null || true; }
37
- done
38
- for f in "${TMPFILES[@]:-}"; do
39
- [[ -n "$f" ]] && rm -f "$f" 2>/dev/null || true
40
- done
41
- }
42
- trap cleanup EXIT
43
-
44
- # ---- helpers ---------------------------------------------------------------
45
-
46
- make_tmp_file() {
47
- local tmp
48
- tmp=$(mktemp)
49
- TMPFILES+=("$tmp")
50
- echo "$tmp"
51
- }
52
-
53
- # Start a listener on a random port; capture every POST body.
54
- # Sets LISTENER_PORT and LISTENER_LOG globals.
55
- start_listener() {
56
- LISTENER_LOG=$(make_tmp_file)
57
- LISTENER_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("",0)); print(s.getsockname()[1]); s.close()')
58
- python3 - "$LISTENER_PORT" "$LISTENER_LOG" <<'PY' &
59
- import sys, http.server, json
60
-
61
- port = int(sys.argv[1])
62
- log = sys.argv[2]
63
-
64
- class H(http.server.BaseHTTPRequestHandler):
65
- def do_POST(self):
66
- n = int(self.headers.get("Content-Length", 0))
67
- body = self.rfile.read(n).decode()
68
- with open(log, "a") as f:
69
- f.write(body + "\n")
70
- self.send_response(200)
71
- self.end_headers()
72
- def log_message(self, *a): pass
73
-
74
- http.server.HTTPServer(("127.0.0.1", port), H).serve_forever()
75
- PY
76
- local pid=$!
77
- LISTENER_PIDS+=("$pid")
78
- sleep 0.3 # let the server start
79
- }
80
-
81
- # Run the hook with given env overrides and optional stdin.
82
- # Returns: HOOK_EXIT, LISTENER_LINES (array of log-ingest line bodies).
83
- run_hook() {
84
- local env_args=("$@")
85
- local stdin_data="${HOOK_STDIN:-}"
86
- local hook_exit=0
87
- if [[ -n "$stdin_data" ]]; then
88
- printf '%s' "$stdin_data" | env \
89
- MAXY_UI_INTERNAL_PORT="$LISTENER_PORT" \
90
- MAXY_SESSION_ROLE="${MAXY_SESSION_ROLE:-admin}" \
91
- MAXY_SPECIALIST="${MAXY_SPECIALIST:-}" \
92
- PLATFORM_ROOT="${FAKE_PLATFORM_ROOT:-}" \
93
- ACCOUNT_ID="${ACCOUNT_ID:-acct-test}" \
94
- USER_ID="${USER_ID:-user-test}" \
95
- SESSION_ID="" \
96
- NEO4J_URI="bolt://localhost:7688" \
97
- NEO4J_USER="neo4j" \
98
- NEO4J_PASSWORD="test" \
99
- ${env_args[@]+"${env_args[@]}"} \
100
- bash "$HOOK" >/dev/null 2>/dev/null || hook_exit=$?
101
- else
102
- env \
103
- MAXY_UI_INTERNAL_PORT="$LISTENER_PORT" \
104
- MAXY_SESSION_ROLE="${MAXY_SESSION_ROLE:-admin}" \
105
- MAXY_SPECIALIST="${MAXY_SPECIALIST:-}" \
106
- PLATFORM_ROOT="${FAKE_PLATFORM_ROOT:-}" \
107
- ACCOUNT_ID="${ACCOUNT_ID:-acct-test}" \
108
- USER_ID="${USER_ID:-user-test}" \
109
- SESSION_ID="" \
110
- NEO4J_URI="bolt://localhost:7688" \
111
- NEO4J_USER="neo4j" \
112
- NEO4J_PASSWORD="test" \
113
- ${env_args[@]+"${env_args[@]}"} \
114
- bash "$HOOK" </dev/null >/dev/null 2>/dev/null || hook_exit=$?
115
- fi
116
- HOOK_EXIT=$hook_exit
117
- # Read all log-ingest POSTs.
118
- LISTENER_LINES=()
119
- while IFS= read -r raw; do
120
- [[ -z "$raw" ]] && continue
121
- LISTENER_LINES+=("$raw")
122
- done < "$LISTENER_LOG"
123
- # Reset log for next run.
124
- > "$LISTENER_LOG"
125
- }
126
-
127
- assert_contains_line() {
128
- local test_name="$1"
129
- local fragment="$2"
130
- for line in "${LISTENER_LINES[@]:-}"; do
131
- if [[ "$line" == *"$fragment"* ]]; then
132
- echo " PASS: $test_name"
133
- PASS=$((PASS + 1))
134
- return 0
135
- fi
136
- done
137
- echo " FAIL: $test_name (expected fragment: '$fragment' not found in log lines)"
138
- printf ' lines:\n'
139
- for line in "${LISTENER_LINES[@]:-}"; do printf ' %s\n' "$line"; done
140
- FAIL=$((FAIL + 1))
141
- }
142
-
143
- assert_exit() {
144
- local test_name="$1"
145
- local expected="$2"
146
- if [[ "$HOOK_EXIT" -eq "$expected" ]]; then
147
- echo " PASS: $test_name (exit $expected)"
148
- PASS=$((PASS + 1))
149
- else
150
- echo " FAIL: $test_name (expected exit $expected, got $HOOK_EXIT)"
151
- FAIL=$((FAIL + 1))
152
- fi
153
- }
154
-
155
- # ---- setup -----------------------------------------------------------------
156
-
157
- start_listener
158
-
159
- # Create a fake platform root structure so the lib source works.
160
- FAKE_PLATFORM_ROOT=$(mktemp -d)
161
- TMPFILES+=("$FAKE_PLATFORM_ROOT")
162
- mkdir -p "$FAKE_PLATFORM_ROOT/plugins/admin/hooks/lib"
163
- # Copy the real lib so guards work correctly.
164
- REAL_LIB="$(cd "$(dirname "$0")/../../../../platform/plugins/admin/hooks/lib" && pwd)/admin-graph-pass-common.sh"
165
- if [[ ! -f "$REAL_LIB" ]]; then
166
- echo "FAIL: admin-graph-pass-common.sh not found at $REAL_LIB" >&2
167
- exit 1
168
- fi
169
- cp "$REAL_LIB" "$FAKE_PLATFORM_ROOT/plugins/admin/hooks/lib/admin-graph-pass-common.sh"
170
-
171
- # Create a minimal fake JSONL transcript.
172
- FAKE_TRANSCRIPT=$(make_tmp_file)
173
- printf '{"type":"user","message":{"role":"user","content":"Hello world"}}\n' > "$FAKE_TRANSCRIPT"
174
-
175
- # Create a stub CLI that exits 0 with a canned result.
176
- FAKE_CLI_DIR=$(mktemp -d)
177
- TMPFILES+=("$FAKE_CLI_DIR")
178
- STUB_CLI="$FAKE_CLI_DIR/ingest-session-text.js"
179
- cat > "$STUB_CLI" <<'STUB'
180
- process.stdout.write("turns=3 skipped=0 sessionId=test-session\n");
181
- process.exit(0);
182
- STUB
183
-
184
- # Stub CLI for dedupe scenario (turns=0).
185
- STUB_CLI_DEDUP="$FAKE_CLI_DIR/ingest-dedup.js"
186
- cat > "$STUB_CLI_DEDUP" <<'STUB'
187
- process.stdout.write("turns=0 skipped=3 sessionId=test-session\n");
188
- process.exit(0);
189
- STUB
190
-
191
- # Stub CLI that exits 1 (error).
192
- STUB_CLI_ERR="$FAKE_CLI_DIR/ingest-error.js"
193
- cat > "$STUB_CLI_ERR" <<'STUB'
194
- process.stderr.write("simulated error\n");
195
- process.exit(1);
196
- STUB
197
-
198
- # Valid stdin envelope for the SessionEnd hook.
199
- valid_envelope() {
200
- local transcript="${1:-$FAKE_TRANSCRIPT}"
201
- printf '{"session_id":"test-session","transcript_path":"%s","hook_event_name":"SessionEnd"}' "$transcript"
202
- }
203
-
204
- # Override CLI path by symlinking ingest-session-text.js inside a fake platform layout.
205
- make_platform_with_cli() {
206
- local stub="$1"
207
- local proot
208
- proot=$(mktemp -d)
209
- TMPFILES+=("$proot")
210
- cp "$FAKE_PLATFORM_ROOT/plugins/admin/hooks/lib/admin-graph-pass-common.sh" \
211
- "$proot/plugins/admin/hooks/lib/" 2>/dev/null || \
212
- { mkdir -p "$proot/plugins/admin/hooks/lib"; cp "$REAL_LIB" "$proot/plugins/admin/hooks/lib/admin-graph-pass-common.sh"; }
213
- mkdir -p "$proot/../premium-plugins/writer-craft/mcp/dist/cli" 2>/dev/null || \
214
- mkdir -p "$(dirname "$proot")/../premium-plugins/writer-craft/mcp/dist/cli" 2>/dev/null || true
215
- # Simpler: build the expected path from $PLATFORM_ROOT/../premium-plugins/...
216
- # The hook computes: ${PLATFORM_ROOT}/../premium-plugins/writer-craft/mcp/dist/cli/ingest-session-text.js
217
- # So parent of $proot + /premium-plugins/writer-craft/mcp/dist/cli/
218
- local parent
219
- parent=$(dirname "$proot")
220
- mkdir -p "$parent/premium-plugins/writer-craft/mcp/dist/cli"
221
- cp "$stub" "$parent/premium-plugins/writer-craft/mcp/dist/cli/ingest-session-text.js"
222
- echo "$proot"
223
- }
224
-
225
- # ---- tests -----------------------------------------------------------------
226
- echo "[voice-session-end-text.test] starting"
227
-
228
- # T1: non-admin role → skip
229
- MAXY_SESSION_ROLE="public" HOOK_STDIN=$(valid_envelope) run_hook
230
- assert_exit "T1: non-admin exits 0" 0
231
- assert_contains_line "T1: non-admin emits trigger-skipped" "trigger-skipped"
232
-
233
- # T2: specialist → skip
234
- unset MAXY_SESSION_ROLE 2>/dev/null || true
235
- MAXY_SESSION_ROLE="admin" MAXY_SPECIALIST="database-operator" HOOK_STDIN=$(valid_envelope) run_hook
236
- assert_exit "T2: specialist exits 0" 0
237
- assert_contains_line "T2: specialist emits trigger-skipped" "trigger-skipped"
238
-
239
- # T3: empty stdin → skip
240
- MAXY_SPECIALIST="" MAXY_SESSION_ROLE="admin"
241
- HOOK_STDIN="" run_hook # no stdin piped
242
- assert_exit "T3: empty-stdin exits 0" 0
243
- assert_contains_line "T3: empty-stdin emits trigger-skipped" "trigger-skipped"
244
-
245
- # T4: missing transcript → skip
246
- FAKE_MISSING=$(make_tmp_file)
247
- rm -f "$FAKE_MISSING"
248
- HOOK_STDIN=$(valid_envelope "$FAKE_MISSING") run_hook
249
- assert_exit "T4: missing-transcript exits 0" 0
250
- assert_contains_line "T4: missing-transcript emits trigger-skipped" "trigger-skipped"
251
-
252
- # T5: CLI not found → skip
253
- FAKE_PLATFORM_ROOT="$FAKE_PLATFORM_ROOT" HOOK_STDIN=$(valid_envelope) run_hook
254
- assert_exit "T5: cli-not-found exits 0" 0
255
- assert_contains_line "T5: cli-not-found emits trigger-skipped" "cli-not-found"
256
-
257
- # T6: happy path — stub CLI exits 0
258
- HAPPY_PROOT=$(make_platform_with_cli "$STUB_CLI")
259
- FAKE_PLATFORM_ROOT="$HAPPY_PROOT" HOOK_STDIN=$(valid_envelope) run_hook
260
- assert_exit "T6: happy path exits 0" 0
261
- assert_contains_line "T6: happy path emits trigger" "trigger"
262
- assert_contains_line "T6: happy path emits result=ok" "result=ok"
263
-
264
- # T7: dedupe — stub returns turns=0 skipped=3
265
- DEDUP_PROOT=$(make_platform_with_cli "$STUB_CLI_DEDUP")
266
- FAKE_PLATFORM_ROOT="$DEDUP_PROOT" HOOK_STDIN=$(valid_envelope) run_hook
267
- assert_exit "T7: dedupe exits 0" 0
268
- assert_contains_line "T7: dedupe emits result=ok" "result=ok"
269
-
270
- # T8: CLI error — stub exits 1
271
- ERR_PROOT=$(make_platform_with_cli "$STUB_CLI_ERR")
272
- FAKE_PLATFORM_ROOT="$ERR_PROOT" HOOK_STDIN=$(valid_envelope) run_hook
273
- assert_exit "T8: cli-error exits 0" 0
274
- assert_contains_line "T8: cli-error emits result=err" "result=err"
275
-
276
- # ---- summary ---------------------------------------------------------------
277
- echo ""
278
- if [[ "$FAIL" -eq 0 ]]; then
279
- echo "[voice-session-end-text.test] all $PASS tests passed"
280
- exit 0
281
- else
282
- echo "[voice-session-end-text.test] FAILED — $FAIL/$((PASS + FAIL)) tests failed"
283
- exit 1
284
- fi
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SessionEnd hook — auto-ingests operator PTY turns as :Message {format:'text'}
3
- # corpus nodes in the writer-craft voice corpus.
4
- #
5
- # Fired by Claude Code after each PTY session terminates. Receives the full
6
- # session envelope from stdin:
7
- # { "session_id": "...", "transcript_path": "...", "hook_event_name": "SessionEnd", ... }
8
- #
9
- # Guards (shared logic via admin-graph-pass-common.sh):
10
- # - role != admin → exit 0 (trigger-skipped reason=role-not-admin)
11
- # - MAXY_SPECIALIST set → exit 0 (trigger-skipped reason=is-specialist)
12
- # - empty stdin → exit 0 (trigger-skipped reason=empty-stdin)
13
- # - missing transcript → exit 0 (trigger-skipped reason=missing-transcript)
14
- #
15
- # Additional guard:
16
- # - CLI not found → exit 0 (trigger-skipped reason=cli-not-found)
17
- # Graceful: accounts without writer-craft installed skip silently.
18
- #
19
- # Environment (inherited from PTY spawn — set by session manager systemd unit):
20
- # PLATFORM_ROOT — used to locate the admin hooks lib and the CLI
21
- # ACCOUNT_ID — operator's account identifier
22
- # USER_ID — operator's userId
23
- # SESSION_ID — parsed from stdin envelope by agp_parse_stdin
24
- # NEO4J_URI — bolt URI (propagated from systemd unit env)
25
- # NEO4J_USER — neo4j username
26
- # NEO4J_PASSWORD — neo4j password
27
- #
28
- # Observability:
29
- # [voice-session-end-hook] trigger-skipped sessionId=<id> reason=<reason>
30
- # [voice-session-end-hook] trigger sessionId=<id>
31
- # [voice-session-end-hook] result=ok sessionId=<id> turns=<n> skipped=<m>
32
- # [voice-session-end-hook] result=err sessionId=<id> reason=<detail>
33
-
34
- set -uo pipefail
35
-
36
- AGP_LOG_TAG="voice-session-end-hook"
37
-
38
- # Locate the shared plumbing library via PLATFORM_ROOT (set at PTY spawn).
39
- # This is more robust than a relative path from the hook's own directory.
40
- AGP_LIB="${PLATFORM_ROOT:-}/plugins/admin/hooks/lib/admin-graph-pass-common.sh"
41
- if [ ! -f "$AGP_LIB" ]; then
42
- echo "[${AGP_LOG_TAG}] trigger-skipped sessionId=unknown reason=missing-helper path=${AGP_LIB}" >&2
43
- exit 0
44
- fi
45
- # shellcheck source=../../../platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh
46
- source "$AGP_LIB"
47
-
48
- agp_setup_logging
49
- agp_read_stdin
50
- agp_parse_stdin
51
- agp_guard_role_specialist
52
- agp_guard_transcript require-stdin
53
-
54
- # Locate the ingest CLI. Built alongside the MCP server — lives in dist/cli/.
55
- CLI_PATH="${PLATFORM_ROOT:-}/../premium-plugins/writer-craft/mcp/dist/cli/ingest-session-text.js"
56
- if [ ! -f "$CLI_PATH" ]; then
57
- agp_emit_log "trigger-skipped sessionId=${SESSION_ID_REPORTED} reason=cli-not-found path=${CLI_PATH}"
58
- exit 0
59
- fi
60
-
61
- agp_emit_log "trigger sessionId=${SESSION_ID_REPORTED}"
62
-
63
- # Invoke the CLI. All required context is in the inherited env:
64
- # ACCOUNT_ID, USER_ID, NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD
65
- # SESSION_ID is passed explicitly since agp_parse_stdin sets it from stdin.
66
- result=$(SESSION_ID="${SESSION_ID}" node "$CLI_PATH" "$TRANSCRIPT_PATH" 2>&1)
67
- exit_code=$?
68
-
69
- if [ "$exit_code" -eq 0 ]; then
70
- agp_emit_log "result=ok sessionId=${SESSION_ID_REPORTED} ${result}"
71
- else
72
- agp_emit_log "result=err sessionId=${SESSION_ID_REPORTED} reason=${result}"
73
- fi
74
-
75
- exit 0
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * CLI wrapper for voice-ingest-session-text.
4
- *
5
- * Invoked by the SessionEnd hook after each admin PTY session:
6
- * node dist/cli/ingest-session-text.js <transcript_path>
7
- *
8
- * All other parameters are read from environment variables inherited from
9
- * the PTY session (which inherits from the session manager's systemd unit):
10
- *
11
- * ACCOUNT_ID — operator's account identifier
12
- * USER_ID — operator's userId (= adminUserId)
13
- * SESSION_ID — session identifier (parsed by hook from stdin)
14
- * NEO4J_URI — neo4j bolt URI
15
- * NEO4J_USER — neo4j username
16
- * NEO4J_PASSWORD — neo4j password
17
- *
18
- * Exit codes:
19
- * 0 — success (includes no-new-turns case)
20
- * 1 — error (missing required env, JSONL not found, DB error)
21
- *
22
- * stdout: one-line result summary ("turns=N skipped=M") for the hook to
23
- * capture and forward to the log-ingest endpoint.
24
- * stderr: detailed diagnostics (tool log lines).
25
- */
26
- import { voiceIngestSessionText } from "../tools/voice-ingest-session-text.js";
27
- import { closeDriver } from "../lib/neo4j.js";
28
-
29
- const transcriptPath = process.argv[2];
30
- if (!transcriptPath) {
31
- process.stderr.write("[ingest-session-text] error: transcript path required as argv[2]\n");
32
- process.exit(1);
33
- }
34
-
35
- const accountId = process.env.ACCOUNT_ID ?? "";
36
- const userId = process.env.USER_ID ?? "";
37
- const sessionId = process.env.SESSION_ID ?? undefined;
38
-
39
- if (!accountId || !userId) {
40
- process.stderr.write(
41
- `[ingest-session-text] error: ACCOUNT_ID and USER_ID must be set in env (accountId=${accountId || "empty"} userId=${userId || "empty"})\n`,
42
- );
43
- process.exit(1);
44
- }
45
-
46
- try {
47
- const result = await voiceIngestSessionText({
48
- sessionJsonlPath: transcriptPath,
49
- accountId,
50
- userId,
51
- sessionId,
52
- });
53
- // Emit one-line summary to stdout for the hook to capture.
54
- process.stdout.write(
55
- `turns=${result.ingestedCount} skipped=${result.skippedCount} sessionId=${result.sessionId ?? "unknown"}\n`,
56
- );
57
- process.exit(0);
58
- } catch (err) {
59
- process.stderr.write(
60
- `[ingest-session-text] error: ${err instanceof Error ? err.message : String(err)}\n`,
61
- );
62
- process.exit(1);
63
- } finally {
64
- await closeDriver();
65
- }