@rubytech/create-maxy-code 0.1.157 → 0.1.159

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 (236) 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-style/dist/index.js +2 -2
  8. package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
  9. package/payload/platform/lib/graph-style/src/__tests__/parity.test.ts +1 -1
  10. package/payload/platform/lib/graph-style/src/index.ts +2 -2
  11. package/payload/platform/lib/graph-trash/dist/index.js +1 -1
  12. package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
  13. package/payload/platform/lib/graph-trash/src/index.ts +1 -1
  14. package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js +1 -1
  15. package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js.map +1 -1
  16. package/payload/platform/lib/graph-write/dist/conversation-provenance.d.ts +3 -3
  17. package/payload/platform/lib/graph-write/dist/conversation-provenance.js +5 -5
  18. package/payload/platform/lib/graph-write/dist/conversation-provenance.js.map +1 -1
  19. package/payload/platform/lib/graph-write/dist/index.js +1 -1
  20. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  21. package/payload/platform/lib/graph-write/src/__tests__/action-provenance-gate.test.ts +1 -1
  22. package/payload/platform/lib/graph-write/src/conversation-provenance.ts +8 -8
  23. package/payload/platform/lib/graph-write/src/index.ts +1 -1
  24. package/payload/platform/neo4j/schema.cypher +33 -15
  25. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  26. package/payload/platform/plugins/admin/PLUGIN.md +8 -4
  27. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +1 -1
  28. package/payload/platform/plugins/admin/hooks/__tests__/per-turn-graph-pass-gate.test.sh +361 -0
  29. package/payload/platform/plugins/admin/hooks/__tests__/pre-turn-graph-pass.test.sh +13 -13
  30. package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +1 -1
  31. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +242 -0
  32. package/payload/platform/plugins/admin/hooks/per-turn-graph-pass-gate.sh +106 -0
  33. package/payload/platform/plugins/admin/hooks/pre-turn-graph-pass.sh +47 -91
  34. package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +32 -91
  35. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +4 -4
  36. package/payload/platform/plugins/admin/mcp/dist/index.js +65 -24
  37. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  38. package/payload/platform/plugins/admin/skills/session-management/SKILL.md +2 -2
  39. package/payload/platform/plugins/admin/skills/stream-log-review/SKILL.md +5 -5
  40. package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +6 -6
  41. package/payload/platform/plugins/business-assistant/references/profiling.md +1 -1
  42. package/payload/platform/plugins/contacts/PLUGIN.md +1 -1
  43. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +2 -2
  44. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
  45. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-erase.js +3 -3
  46. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.d.ts +1 -1
  47. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.js +2 -2
  48. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts +1 -1
  49. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts.map +1 -1
  50. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js +4 -4
  51. package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js.map +1 -1
  52. package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js +10 -10
  53. package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js.map +1 -1
  54. package/payload/platform/plugins/docs/references/admin-session.md +6 -6
  55. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  56. package/payload/platform/plugins/docs/references/deployment.md +3 -1
  57. package/payload/platform/plugins/docs/references/internals.md +5 -5
  58. package/payload/platform/plugins/docs/references/plugins-guide.md +3 -3
  59. package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
  60. package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
  61. package/payload/platform/plugins/email/PLUGIN.md +15 -2
  62. package/payload/platform/plugins/email/mcp/dist/index.js +53 -0
  63. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  64. package/payload/platform/plugins/email/mcp/dist/lib/embedding.js +2 -2
  65. package/payload/platform/plugins/email/mcp/dist/lib/embedding.js.map +1 -1
  66. package/payload/platform/plugins/email/mcp/dist/lib/graph.js +1 -1
  67. package/payload/platform/plugins/email/mcp/dist/lib/graph.js.map +1 -1
  68. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +1 -1
  69. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +23 -0
  70. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -0
  71. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js +15 -0
  72. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -0
  73. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts +15 -0
  74. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts.map +1 -0
  75. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +49 -0
  76. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -0
  77. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts +20 -0
  78. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts.map +1 -0
  79. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js +86 -0
  80. package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js.map +1 -0
  81. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
  82. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +32 -52
  83. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  84. package/payload/platform/plugins/email/references/email-reference.md +19 -83
  85. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +87 -0
  86. package/payload/platform/plugins/memory/PLUGIN.md +4 -4
  87. package/payload/platform/plugins/memory/mcp/dist/index.js +40 -41
  88. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  89. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js +2 -2
  90. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js.map +1 -1
  91. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +3 -3
  92. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
  93. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +6 -6
  94. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
  95. package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js +1 -1
  96. package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js.map +1 -1
  97. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts +2 -2
  98. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +2 -2
  99. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts +1 -1
  100. package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts.map +1 -1
  101. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js +3 -3
  102. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js.map +1 -1
  103. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js +2 -2
  104. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js.map +1 -1
  105. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js +8 -8
  106. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js.map +1 -1
  107. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js +2 -2
  108. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js.map +1 -1
  109. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts +1 -1
  110. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts.map +1 -1
  111. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js +2 -2
  112. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js.map +1 -1
  113. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts +35 -0
  114. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts.map +1 -0
  115. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js +80 -0
  116. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js.map +1 -0
  117. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.d.ts +1 -1
  118. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js +8 -8
  119. package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js.map +1 -1
  120. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts +1 -1
  121. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts.map +1 -1
  122. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js +2 -2
  123. package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.d.ts +1 -1
  125. package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.js +1 -1
  126. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +1 -1
  127. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts.map +1 -1
  128. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +2 -2
  129. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +2 -2
  131. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  132. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts +1 -1
  133. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
  134. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +11 -11
  135. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  136. package/payload/platform/plugins/memory/mcp/scripts/backfill-typed-edges.ts +1 -1
  137. package/payload/platform/plugins/memory/mcp/scripts/graph/fixture.cypher +1 -1
  138. package/payload/platform/plugins/memory/references/graph-primitives.md +1 -1
  139. package/payload/platform/plugins/memory/references/schema-base.md +4 -4
  140. package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +1 -1
  141. package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -1
  142. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +2 -2
  143. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  144. package/payload/platform/plugins/work/mcp/dist/index.js +2 -2
  145. package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -1
  146. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js +6 -6
  147. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js.map +1 -1
  148. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts +1 -1
  149. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts.map +1 -1
  150. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js +1 -1
  151. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js.map +1 -1
  152. package/payload/platform/plugins/x-import/references/archive-shape.md +2 -2
  153. package/payload/platform/plugins/x-import/skills/x-import/SKILL.md +3 -3
  154. package/payload/platform/scripts/admin-persist-audit.ts +18 -18
  155. package/payload/platform/scripts/identity-forbidden-token-check.mjs +2 -0
  156. package/payload/platform/scripts/seed-neo4j.sh +1 -0
  157. package/payload/platform/scripts/smoke-boot-services.sh +191 -41
  158. package/payload/platform/services/claude-session-manager/dist/http-server.js +3 -3
  159. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  160. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +3 -3
  161. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +4 -4
  162. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  163. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  164. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +2 -0
  165. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  166. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  167. package/payload/server/{chunk-AXOL2PPG.js → chunk-3TRIXQSJ.js} +101 -101
  168. package/payload/server/maxy-edge.js +1 -1
  169. package/payload/server/public/assets/{admin-DJW5VnQ1.js → admin-Dal5FWaD.js} +24 -24
  170. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Breg9-99.js → architectureDiagram-Q4EWVU46-Do2zYONG.js} +1 -1
  171. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DXf1_673.js → blockDiagram-DXYQGD6D-DpIX_bRu.js} +1 -1
  172. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CSZ36W4-.js → c4Diagram-AHTNJAMY-Cz335ZSY.js} +1 -1
  173. package/payload/server/public/assets/channel-PC4_IjI1.js +1 -0
  174. package/payload/server/public/assets/{chunk-336JU56O-DsrLk2eK.js → chunk-336JU56O-Dmknn3Wo.js} +2 -2
  175. package/payload/server/public/assets/{chunk-426QAEUC-JpNfNf81.js → chunk-426QAEUC-ClfGjizN.js} +1 -1
  176. package/payload/server/public/assets/{chunk-4TB4RGXK-DmClEAD0.js → chunk-4TB4RGXK-BPKctJ5c.js} +1 -1
  177. package/payload/server/public/assets/{chunk-5FUZZQ4R-BI9blW3N.js → chunk-5FUZZQ4R-BWDCO9zw.js} +1 -1
  178. package/payload/server/public/assets/{chunk-5PVQY5BW-BbgttEFO.js → chunk-5PVQY5BW-BE34_Db0.js} +1 -1
  179. package/payload/server/public/assets/{chunk-EDXVE4YY-BX_LCFOx.js → chunk-EDXVE4YY-BysA-_6v.js} +1 -1
  180. package/payload/server/public/assets/{chunk-ENJZ2VHE-Bb7EoD0w.js → chunk-ENJZ2VHE-BMVyMsqA.js} +1 -1
  181. package/payload/server/public/assets/{chunk-ICPOFSXX-DH8uQk-s.js → chunk-ICPOFSXX-C5KRdLV4.js} +1 -1
  182. package/payload/server/public/assets/{chunk-OYMX7WX6-FH5kgXsw.js → chunk-OYMX7WX6-DVZD-AVc.js} +1 -1
  183. package/payload/server/public/assets/{chunk-U2HBQHQK-D_ljlkHr.js → chunk-U2HBQHQK-DYmQdx8x.js} +1 -1
  184. package/payload/server/public/assets/{chunk-X2U36JSP-BX3EmZvm.js → chunk-X2U36JSP-DrZenIl3.js} +1 -1
  185. package/payload/server/public/assets/{chunk-YZCP3GAM-Vu7-E93h.js → chunk-YZCP3GAM-CDuGbvMq.js} +1 -1
  186. package/payload/server/public/assets/{chunk-ZZ45TVLE-CwjhNPX5.js → chunk-ZZ45TVLE-COztbiu5.js} +1 -1
  187. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B_pMa-SX.js +1 -0
  188. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BdBAgF20.js +1 -0
  189. package/payload/server/public/assets/clone-CkNt9L9r.js +1 -0
  190. package/payload/server/public/assets/{dagre-Ce6gsj0C.js → dagre-Cv9Ib2OM.js} +1 -1
  191. package/payload/server/public/assets/{dagre-KV5264BT-BaMGpsoy.js → dagre-KV5264BT-CoEd61KZ.js} +1 -1
  192. package/payload/server/public/assets/{data-BHASh0_Y.js → data-DbSORCl4.js} +1 -1
  193. package/payload/server/public/assets/{diagram-5BDNPKRD-CHEE9rjq.js → diagram-5BDNPKRD-WXNzw3uW.js} +1 -1
  194. package/payload/server/public/assets/{diagram-G4DWMVQ6-C98sZLW1.js → diagram-G4DWMVQ6-C6IuQ2VV.js} +1 -1
  195. package/payload/server/public/assets/{diagram-MMDJMWI5-DNvMGsTZ.js → diagram-MMDJMWI5-CdJdir5A.js} +1 -1
  196. package/payload/server/public/assets/{diagram-TYMM5635-Cdte4IBa.js → diagram-TYMM5635-DxWKQH5T.js} +1 -1
  197. package/payload/server/public/assets/{erDiagram-SMLLAGMA-C9VZsWXK.js → erDiagram-SMLLAGMA-C9fvs33K.js} +1 -1
  198. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-tuP5fzzR.js → flowDiagram-DWJPFMVM-BO7Yrbqv.js} +1 -1
  199. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-SJgRPUwx.js → ganttDiagram-T4ZO3ILL-CQJyWBZq.js} +1 -1
  200. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DU_cI_50.js → gitGraphDiagram-UUTBAWPF-DZfQHrYw.js} +1 -1
  201. package/payload/server/public/assets/{graph-labels-DXlmm1og.js → graph-labels-BBB5jsZk.js} +1 -1
  202. package/payload/server/public/assets/{graph-BhEI09tF.js → graph-ys_joP2o.js} +1 -1
  203. package/payload/server/public/assets/{graphlib-D_nAsvmx.js → graphlib-C40H-Q5E.js} +1 -1
  204. package/payload/server/public/assets/{infoDiagram-42DDH7IO-Cj2Y19m6.js → infoDiagram-42DDH7IO-CakfV5f9.js} +1 -1
  205. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DMc1xq1y.js → ishikawaDiagram-UXIWVN3A-CPuBPyfa.js} +1 -1
  206. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-C4CRAQma.js → journeyDiagram-VCZTEJTY-zpZm2Mmo.js} +1 -1
  207. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CTr4AldU.js → kanban-definition-6JOO6SKY-DfJduQCo.js} +1 -1
  208. package/payload/server/public/assets/{line-Btlm_IAl.js → line-BpYQqO5R.js} +1 -1
  209. package/payload/server/public/assets/{mermaid-parser.core-DXFdj_y1.js → mermaid-parser.core-C5Mwi14D.js} +1 -1
  210. package/payload/server/public/assets/{mermaid.core-DFBhoCr5.js → mermaid.core-D8qBtvvT.js} +3 -3
  211. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-r9gVQybo.js → mindmap-definition-QFDTVHPH-Bli9JhIN.js} +1 -1
  212. package/payload/server/public/assets/{page-CDWu1Aft.js → page--bl5Y7ZI.js} +2 -2
  213. package/payload/server/public/assets/page-CwmZ76U7.js +1 -0
  214. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CHKZjSaH.js → pieDiagram-DEJITSTG-MsLXTSLg.js} +1 -1
  215. package/payload/server/public/assets/{public-DyGWgfaZ.js → public-DltgEfA9.js} +2 -2
  216. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CSGR1HJr.js → quadrantDiagram-34T5L4WZ-De1sh2K0.js} +1 -1
  217. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DZ6hX9D6.js → requirementDiagram-MS252O5E-D5Sfg1t_.js} +1 -1
  218. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DbZBKh0m.js → sankeyDiagram-XADWPNL6-DHA3LIbv.js} +1 -1
  219. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BHHpb8dt.js → sequenceDiagram-FGHM5R23-BE_QlG1B.js} +1 -1
  220. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DQ1jiLB4.js → stateDiagram-FHFEXIEX-NIwp3F4u.js} +1 -1
  221. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-pfk2F6st.js +1 -0
  222. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BlGiEU7p.js → timeline-definition-GMOUNBTQ-CPE9jyDF.js} +1 -1
  223. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DmEH-hsB.js → vennDiagram-DHZGUBPP-CKfoyYmH.js} +1 -1
  224. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-C7KJJ40d.js → wardleyDiagram-NUSXRM2D-B9yJek-o.js} +1 -1
  225. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-JDnusCaa.js → xychartDiagram-5P7HB3ND-DuCcSLqX.js} +1 -1
  226. package/payload/server/public/data.html +3 -3
  227. package/payload/server/public/graph.html +3 -3
  228. package/payload/server/public/index.html +4 -4
  229. package/payload/server/public/public.html +1 -1
  230. package/payload/server/server.js +133 -133
  231. package/payload/server/public/assets/channel-BmZnt3PP.js +0 -1
  232. package/payload/server/public/assets/classDiagram-6PBFFD2Q-kmMLFUpV.js +0 -1
  233. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BV7Ae8ct.js +0 -1
  234. package/payload/server/public/assets/clone-B5eqoN9I.js +0 -1
  235. package/payload/server/public/assets/page-cyvshX4Z.js +0 -1
  236. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CByT2RzF.js +0 -1
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
  # Stop hook — gates session termination until the admin agent has performed
3
- # a three-pass retrospective (technical learnings, operator-relationship
4
- # updates, graph-completeness sweep) and called the deterministic
5
- # `session-retrospective-mark-complete` MCP sentinel tool. Task 282.
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.
6
7
  #
7
8
  # Trigger detection. End-intent is the operator's most recent real-user
8
9
  # message matching one of the literal token strings:
@@ -23,109 +24,49 @@
23
24
  # whose `name` is exactly `mcp__admin__session-retrospective-mark-complete`
24
25
  # — that is the prefixed form Claude Code writes for MCP tools in the
25
26
  # JSONL; the unprefixed name only appears in the operator-facing
26
- # instruction text below. The
27
- # sentinel-grep doubles as the re-entry guard: every Stop that fires after
28
- # the agent's sentinel call sees the sentinel and exits 0 with
29
- # `gate-released`, so the agent's wrap-up turn never re-blocks.
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.
30
31
  # [[feedback_no_stdout_parsing_for_control_flow]],
31
32
  # [[feedback_doctrine_paragraph_is_not_a_gate]] — the LLM is removed from
32
33
  # the per-decision path entirely.
33
34
  #
34
- # Gating (emits via `/api/admin/log-ingest`; hook stderr stays silent on
35
- # every skip path; the gate-blocked path is the only stderr emitter, by
36
- # Stop-hook contract — exit 2 + stderr is how the agent receives the
37
- # retrospective instruction block):
38
- # - MAXY_SESSION_ROLE must equal "admin" → reason=role-not-admin
39
- # - MAXY_SPECIALIST must NOT equal → reason=is-specialist
40
- # "database-operator" (and any other (recursion guard — a
41
- # specialist value) specialist subagent stop
42
- # must not re-enter this gate)
43
- # - Stop-hook stdin must be non-empty → reason=empty-stdin
44
- # - transcript_path must exist on disk → reason=missing-transcript
45
- # - latest real-user message must match an → reason=no-intent-match
46
- # end-intent token
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.
47
41
  #
48
42
  # Releases:
49
43
  # - gate-released sessionId=<id> (when sentinel present in transcript)
50
44
  #
51
45
  # Blocks:
52
46
  # - gate-blocked sessionId=<id> reason=sentinel-absent
53
- # (exit 2; stderr carries the three-pass retrospective instruction)
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).
54
50
  #
55
51
  # Input: Claude Code's Stop hook stdin shape
56
52
  # { "session_id": "<intrinsic>", "transcript_path": "<jsonl path>", ... }
57
53
 
58
54
  set -uo pipefail
59
55
 
60
- UI_PORT="${MAXY_UI_INTERNAL_PORT:-}"
61
- if [ -z "$UI_PORT" ]; then
62
- # No log-ingest reachable; emit to stderr instead of silently swallowing.
63
- # Skip the gate rather than block — fail-open on infra absence so the
64
- # operator is never bricked by a missing port.
65
- echo "[session-retrospective] trigger-skipped sessionId=unknown reason=missing-env env=MAXY_UI_INTERNAL_PORT" >&2
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
66
60
  exit 0
67
61
  fi
68
- UI_BASE="http://127.0.0.1:${UI_PORT}"
69
- LOG_INGEST_URL="${UI_BASE}/api/admin/log-ingest"
62
+ # shellcheck source=lib/admin-graph-pass-common.sh
63
+ source "$AGP_LIB"
70
64
 
71
- emit_log() {
72
- local line="$1"
73
- curl -sS -o /dev/null -X POST \
74
- -H 'Content-Type: application/json' \
75
- --max-time 2 \
76
- --data "$(python3 -c '
77
- import sys, json
78
- print(json.dumps({"tag": "session-retrospective", "level": "info", "line": sys.argv[1]}))
79
- ' "$line")" \
80
- "$LOG_INGEST_URL" 2>/dev/null || true
81
- }
82
-
83
- INPUT=""
84
- if [ -t 0 ]; then
85
- INPUT=""
86
- else
87
- INPUT=$(cat)
88
- fi
89
-
90
- PARSED=$(printf '%s' "$INPUT" | python3 -c '
91
- import sys, json
92
- try:
93
- d = json.load(sys.stdin)
94
- sid = d.get("session_id", "") or ""
95
- tpath = d.get("transcript_path", "") or ""
96
- print(f"{sid}\t{tpath}")
97
- except Exception:
98
- print("\t")
99
- ' 2>/dev/null)
100
- SESSION_ID="${PARSED%% *}"
101
- TRANSCRIPT_PATH="${PARSED#* }"
102
- SESSION_ID_REPORTED="${SESSION_ID:-unknown}"
103
-
104
- if [ "${MAXY_SESSION_ROLE:-}" != "admin" ]; then
105
- emit_log "trigger-skipped sessionId=${SESSION_ID_REPORTED} reason=role-not-admin"
106
- exit 0
107
- fi
108
- # Recursion guard. A specialist subagent dispatched via the Task tool
109
- # (e.g. database-operator running the operator's graph writes) carries
110
- # `MAXY_SPECIALIST=<name>` on the PTY env. Skip — the gate only enforces
111
- # end-of-session for the operator's own admin session.
112
- #
113
- # Invariant the PTY spawner is expected to honour: `MAXY_SPECIALIST` is
114
- # either set to a non-empty specialist name OR absent. An explicit empty
115
- # string from a wrapper would slip the recursion guard here (`-n ""` is
116
- # false) — that would be a defect at the spawn site, not here.
117
- if [ -n "${MAXY_SPECIALIST:-}" ]; then
118
- emit_log "trigger-skipped sessionId=${SESSION_ID_REPORTED} reason=is-specialist specialist=${MAXY_SPECIALIST}"
119
- exit 0
120
- fi
121
- if [ -z "$INPUT" ]; then
122
- emit_log "trigger-skipped sessionId=${SESSION_ID_REPORTED} reason=empty-stdin"
123
- exit 0
124
- fi
125
- if [ -z "$SESSION_ID" ] || [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
126
- emit_log "trigger-skipped sessionId=${SESSION_ID_REPORTED} reason=missing-transcript"
127
- exit 0
128
- fi
65
+ agp_setup_logging
66
+ agp_read_stdin
67
+ agp_parse_stdin
68
+ agp_guard_role_specialist
69
+ agp_guard_transcript require-stdin
129
70
 
130
71
  # Single Python pass walks the transcript and reports two facts:
131
72
  # 1. The latest end-intent token in the most recent real-user message,
@@ -243,18 +184,18 @@ INTENT_TOKEN="${INSPECTION%% *}"
243
184
  SENTINEL_PRESENT="${INSPECTION#* }"
244
185
 
245
186
  if [ -z "$INTENT_TOKEN" ]; then
246
- emit_log "trigger-skipped sessionId=${SESSION_ID} reason=no-intent-match"
187
+ agp_emit_log "trigger-skipped sessionId=${SESSION_ID} reason=no-intent-match"
247
188
  exit 0
248
189
  fi
249
190
 
250
- emit_log "trigger sessionId=${SESSION_ID} token=${INTENT_TOKEN}"
191
+ agp_emit_log "trigger sessionId=${SESSION_ID} token=${INTENT_TOKEN}"
251
192
 
252
193
  if [ "$SENTINEL_PRESENT" = "yes" ]; then
253
- emit_log "gate-released sessionId=${SESSION_ID}"
194
+ agp_emit_log "gate-released sessionId=${SESSION_ID}"
254
195
  exit 0
255
196
  fi
256
197
 
257
- emit_log "gate-blocked sessionId=${SESSION_ID} reason=sentinel-absent"
198
+ agp_emit_log "gate-blocked sessionId=${SESSION_ID} reason=sentinel-absent"
258
199
 
259
200
  cat >&2 <<'INSTRUCTION'
260
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.
@@ -17,7 +17,7 @@
17
17
  # body. No recorder-only carving on the manager side.
18
18
  #
19
19
  # Task 177 — `initialMessage` is a JSON object stringified to a string.
20
- # Top-level keys EXACTLY: turns, conversationId, accountId, occurredAt.
20
+ # Top-level keys EXACTLY: turns, sessionId, accountId, occurredAt.
21
21
  # `turns` is the chronologically-ordered conversation window — every
22
22
  # user / assistant message in the operator's JSONL, oldest first, no
23
23
  # windowing or truncation. Each entry:
@@ -109,7 +109,7 @@ fi
109
109
  # "toolCalls"?: [{ "tool": "...", "input": {...}, "output": ... }] },
110
110
  # ...
111
111
  # ],
112
- # "conversationId": "<session_id>",
112
+ # "sessionId": "<session_id>",
113
113
  # "accountId": "<ACCOUNT_ID env>",
114
114
  # "occurredAt": "<hook fire time, ISO-8601 UTC, .000Z>"
115
115
  # }
@@ -136,7 +136,7 @@ def concat_text(content):
136
136
  out.append(t)
137
137
  return "".join(out)
138
138
 
139
- path, conversation_id, account_id, occurred_at = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]
139
+ path, session_id, account_id, occurred_at = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]
140
140
 
141
141
  turns = [] # ordered output: { role, text, ts, toolCalls? }
142
142
  msg_id_to_turn_index = {} # collapse rule for assistant message.id
@@ -236,7 +236,7 @@ except Exception:
236
236
 
237
237
  envelope = {
238
238
  "turns": turns,
239
- "conversationId": conversation_id,
239
+ "sessionId": session_id,
240
240
  "accountId": account_id,
241
241
  "occurredAt": occurred_at,
242
242
  }
@@ -1325,20 +1325,20 @@ server.tool("agent-list", "List all public (non-admin) agents with their full co
1325
1325
  };
1326
1326
  }
1327
1327
  });
1328
- eagerTool(server, "logs-read", "Read recent logs. Stream logs (type=agent-stream/error/session/public) are per-session — pass `sessionKey` (preferred) or the legacy `conversationId` alias to retrieve a single session's log from first [spawn] to final [process-exit]. type=agent-stream: per-session tool-use/tool-result archive (every `[tool-use]` and `[tool-result]` pair with full input + output JSON, plus raw Claude stream-json, agent events, and MCP server stderr via tee). USE THIS when investigating what an agent ACTUALLY did with its tools — server.log only carries `[persist] tool-call persisted` markers, not bodies. (`type=system` is a backwards-compatible alias for the same archive.) type=session: SSE events sent to client. type=error: Claude subprocess stderr (raw — NODE_DEBUG HTTP/NET/UNDICI traces land in agent-stream via the stream tee, not here). type=heartbeat: platform event dispatcher (check-due-events cron). type=public: public agent diagnostic log. type=server: platform server log. type=mcp: MCP server stderr (per-plugin raw). type=vnc: VNC browser viewer lifecycle.", {
1328
+ eagerTool(server, "logs-read", "Read recent logs. Stream logs (type=agent-stream/error/session/public) are per-session — pass `sessionKey` (preferred) or the legacy `sessionId` alias to retrieve a single session's log from first [spawn] to final [process-exit]. type=agent-stream: per-session tool-use/tool-result archive (every `[tool-use]` and `[tool-result]` pair with full input + output JSON, plus raw Claude stream-json, agent events, and MCP server stderr via tee). USE THIS when investigating what an agent ACTUALLY did with its tools — server.log only carries `[persist] tool-call persisted` markers, not bodies. (`type=system` is a backwards-compatible alias for the same archive.) type=session: SSE events sent to client. type=error: Claude subprocess stderr (raw — NODE_DEBUG HTTP/NET/UNDICI traces land in agent-stream via the stream tee, not here). type=heartbeat: platform event dispatcher (check-due-events cron). type=public: public agent diagnostic log. type=server: platform server log. type=mcp: MCP server stderr (per-plugin raw). type=vnc: VNC browser viewer lifecycle.", {
1329
1329
  type: z.enum(["agent-stream", "system", "session", "error", "heartbeat", "public", "server", "mcp", "vnc"]).optional(),
1330
1330
  lines: z.number().optional(),
1331
1331
  sessionKey: z.string().optional(),
1332
- conversationId: z.string().optional(),
1333
- }, async ({ type, lines = 50, sessionKey, conversationId }) => {
1332
+ sessionId: z.string().optional(),
1333
+ }, async ({ type, lines = 50, sessionKey, sessionId }) => {
1334
1334
  if (!ACCOUNT_ID)
1335
1335
  return refuseNoAccount("logs-read");
1336
1336
  try {
1337
1337
  const LOG_DIR = resolve(getAccountDir(), "logs");
1338
1338
  // sessionKey is the single identifier on disk.
1339
- // `conversationId` is retained as a legacy alias that maps to the
1339
+ // `sessionId` is retained as a legacy alias that maps to the
1340
1340
  // sessionKey-named file will collapse the alias in the UI.
1341
- const idForResolve = sessionKey ?? conversationId;
1341
+ const idForResolve = sessionKey ?? sessionId;
1342
1342
  if (idForResolve) {
1343
1343
  if (!existsSync(LOG_DIR)) {
1344
1344
  return { content: [{ type: "text", text: `Log directory does not exist: ${LOG_DIR}` }] };
@@ -1868,7 +1868,7 @@ eagerTool(server, "session-reset", "Reset the current session. Compacts conversa
1868
1868
  });
1869
1869
  eagerTool(server, "session-resume", "Resume a previous session. Loads the selected session's message history into the chat timeline " +
1870
1870
  "and routes new messages to that conversation. Call after the user selects a session from the " +
1871
- "session-list results. Pass the conversationId from the selected session.", { conversationId: z.string().uuid().describe("The conversationId of the session to resume") }, async () => {
1871
+ "session-list results. Pass the sessionId from the selected session.", { sessionId: z.string().uuid().describe("The sessionId of the session to resume") }, async () => {
1872
1872
  if (!ACCOUNT_ID)
1873
1873
  return refuseNoAccount("session-resume");
1874
1874
  return { content: [{ type: "text", text: "resumed" }] };
@@ -2727,12 +2727,12 @@ function cleanupPendingAction(actionId) {
2727
2727
  }
2728
2728
  async function persistApprovalToolCall(opts) {
2729
2729
  // Write doctrine: a ToolCall without its owning Conversation is
2730
- // noise — every admin tool call belongs to a chat. When conversationId is
2730
+ // noise — every admin tool call belongs to a chat. When sessionId is
2731
2731
  // missing or its Conversation cannot be matched, we log and skip the
2732
2732
  // persist rather than create an orphan ToolCall node. The legacy
2733
2733
  // OPTIONAL-MATCH + FOREACH pattern created orphans silently.
2734
- if (!opts.conversationId) {
2735
- console.error(`[approval] ToolCall skipped (no conversationId): tool=${opts.toolName} state=${opts.approvalState}`);
2734
+ if (!opts.sessionId) {
2735
+ console.error(`[approval] ToolCall skipped (no sessionId): tool=${opts.toolName} state=${opts.approvalState}`);
2736
2736
  return;
2737
2737
  }
2738
2738
  if (!ACCOUNT_ID) {
@@ -2747,7 +2747,7 @@ async function persistApprovalToolCall(opts) {
2747
2747
  const optionalFields = [
2748
2748
  opts.originalInput != null ? ", originalInput: $originalInput" : "",
2749
2749
  ].join("");
2750
- const res = await session.run(`MATCH (c:Conversation {conversationId: $conversationId})
2750
+ const res = await session.run(`MATCH (c:Conversation {sessionId: $sessionId})
2751
2751
  CREATE (c)-[:HAS_TOOL_CALL]->(tc:ToolCall {
2752
2752
  callId: $callId,
2753
2753
  toolName: $toolName,
@@ -2758,7 +2758,7 @@ async function persistApprovalToolCall(opts) {
2758
2758
  agentType: 'admin',
2759
2759
  accountId: $accountId,
2760
2760
  approvalState: $approvalState,
2761
- conversationId: $conversationId,
2761
+ sessionId: $sessionId,
2762
2762
  createdBySource: 'admin-approval',
2763
2763
  startedAt: datetime($startedAt),
2764
2764
  completedAt: datetime($completedAt)
@@ -2772,13 +2772,13 @@ async function persistApprovalToolCall(opts) {
2772
2772
  isError: opts.isError,
2773
2773
  accountId: ACCOUNT_ID,
2774
2774
  approvalState: opts.approvalState,
2775
- conversationId: opts.conversationId,
2775
+ sessionId: opts.sessionId,
2776
2776
  startedAt: new Date().toISOString(),
2777
2777
  completedAt: new Date().toISOString(),
2778
2778
  ...(opts.originalInput != null ? { originalInput: opts.originalInput.slice(0, 300) } : {}),
2779
2779
  });
2780
2780
  if (res.summary.counters.updates().nodesCreated === 0) {
2781
- console.error(`[approval] ToolCall skipped (conversation ${opts.conversationId} not found): tool=${opts.toolName}`);
2781
+ console.error(`[approval] ToolCall skipped (conversation ${opts.sessionId} not found): tool=${opts.toolName}`);
2782
2782
  return;
2783
2783
  }
2784
2784
  console.error(`[approval] ToolCall persisted: ${opts.toolName} state=${opts.approvalState}`);
@@ -2883,8 +2883,8 @@ eagerTool(server, "action-approve", "Approve a pending action and execute it imm
2883
2883
  "executed via the target plugin's MCP server. The result is returned and an audit " +
2884
2884
  "record is written to Neo4j with approvalState: approved.", {
2885
2885
  actionId: z.string().describe("The action ID to approve (from action-pending)"),
2886
- conversationId: z.string().optional().describe("Current conversation ID for audit trail linking"),
2887
- }, async ({ actionId, conversationId }) => {
2886
+ sessionId: z.string().optional().describe("Current conversation ID for audit trail linking"),
2887
+ }, async ({ actionId, sessionId }) => {
2888
2888
  if (!ACCOUNT_ID)
2889
2889
  return refuseNoAccount("action-approve");
2890
2890
  const action = readPendingAction(actionId);
@@ -2925,7 +2925,7 @@ eagerTool(server, "action-approve", "Approve a pending action and execute it imm
2925
2925
  output: result.text,
2926
2926
  isError: result.isError,
2927
2927
  approvalState: "approved",
2928
- conversationId,
2928
+ sessionId,
2929
2929
  });
2930
2930
  cleanupPendingAction(actionId);
2931
2931
  return {
@@ -2943,7 +2943,7 @@ eagerTool(server, "action-approve", "Approve a pending action and execute it imm
2943
2943
  output: errMsg,
2944
2944
  isError: true,
2945
2945
  approvalState: "approved",
2946
- conversationId,
2946
+ sessionId,
2947
2947
  });
2948
2948
  return {
2949
2949
  content: [{ type: "text", text: `Action approved but execution failed: ${errMsg}` }],
@@ -2955,8 +2955,8 @@ eagerTool(server, "action-reject", "Reject a pending action. The action is not e
2955
2955
  "to Neo4j with approvalState: rejected.", {
2956
2956
  actionId: z.string().describe("The action ID to reject (from action-pending)"),
2957
2957
  reason: z.string().optional().describe("Optional reason for rejection"),
2958
- conversationId: z.string().optional().describe("Current conversation ID for audit trail linking"),
2959
- }, async ({ actionId, reason, conversationId }) => {
2958
+ sessionId: z.string().optional().describe("Current conversation ID for audit trail linking"),
2959
+ }, async ({ actionId, reason, sessionId }) => {
2960
2960
  if (!ACCOUNT_ID)
2961
2961
  return refuseNoAccount("action-reject");
2962
2962
  const action = readPendingAction(actionId);
@@ -2987,7 +2987,7 @@ eagerTool(server, "action-reject", "Reject a pending action. The action is not e
2987
2987
  output: `Rejected by admin.${reasonSuffix}`,
2988
2988
  isError: false,
2989
2989
  approvalState: "rejected",
2990
- conversationId,
2990
+ sessionId,
2991
2991
  });
2992
2992
  cleanupPendingAction(actionId);
2993
2993
  return {
@@ -2999,8 +2999,8 @@ eagerTool(server, "action-edit", "Edit a pending action's input and then execute
2999
2999
  "action (e.g., change the email subject) before approving.", {
3000
3000
  actionId: z.string().describe("The action ID to edit (from action-pending)"),
3001
3001
  editedInput: z.string().describe("The modified tool input as a JSON string"),
3002
- conversationId: z.string().optional().describe("Current conversation ID for audit trail linking"),
3003
- }, async ({ actionId, editedInput, conversationId }) => {
3002
+ sessionId: z.string().optional().describe("Current conversation ID for audit trail linking"),
3003
+ }, async ({ actionId, editedInput, sessionId }) => {
3004
3004
  if (!ACCOUNT_ID)
3005
3005
  return refuseNoAccount("action-edit");
3006
3006
  const action = readPendingAction(actionId);
@@ -3051,7 +3051,7 @@ eagerTool(server, "action-edit", "Edit a pending action's input and then execute
3051
3051
  isError: result.isError,
3052
3052
  approvalState: "approved",
3053
3053
  originalInput: JSON.stringify(originalInput),
3054
- conversationId,
3054
+ sessionId,
3055
3055
  });
3056
3056
  cleanupPendingAction(actionId);
3057
3057
  return {
@@ -3070,7 +3070,7 @@ eagerTool(server, "action-edit", "Edit a pending action's input and then execute
3070
3070
  isError: true,
3071
3071
  approvalState: "approved",
3072
3072
  originalInput: JSON.stringify(originalInput),
3073
- conversationId,
3073
+ sessionId,
3074
3074
  });
3075
3075
  return {
3076
3076
  content: [{ type: "text", text: `Action edited and approved but execution failed: ${errMsg}` }],
@@ -3079,6 +3079,47 @@ eagerTool(server, "action-edit", "Edit a pending action's input and then execute
3079
3079
  }
3080
3080
  });
3081
3081
  // ===================================================================
3082
+ // Per-turn graph-pass skip sentinel (Task 440)
3083
+ // ===================================================================
3084
+ //
3085
+ // Deterministic decline signal for the per-turn graph-pass gate Stop hook
3086
+ // (`platform/plugins/admin/hooks/per-turn-graph-pass-gate.sh`). The hook
3087
+ // walks the operator's JSONL for any `tool_use` of THIS tool's exact name
3088
+ // since the latest real-user message and, when present, releases the Stop
3089
+ // gate with `via=skip-sentinel`. The other release path is a `Task` tool_use
3090
+ // with `input.subagent_type=database-operator` (admin dispatched writes).
3091
+ // Both paths remove the LLM from the per-turn discretion path entirely
3092
+ // ([[feedback_doctrine_paragraph_is_not_a_gate]]).
3093
+ server.tool("pre-turn-graph-pass-skip", "Marks the current operator turn as having no new graph writes to dispatch. Call this when the just-submitted operator turn is a pure acknowledgement, contains no new named entities / ideas / commitments / contacts / learnings, or is otherwise already fully covered by the prior-writes skip-list in the pre-turn graph-pass directive. The per-turn Stop gate releases on the presence of this tool_use in the transcript since the latest real-user message - calling it is the deterministic signal that you considered the turn and chose not to write. The other release path is a Task dispatch to the `database-operator` specialist; call THAT when there are writes to do, and call THIS when there are not. Do not call both.", {
3094
+ reason: z.string().min(1).describe("Short tag explaining why the turn warrants no writes. Free-form, e.g. `no-new-entities`, `turn-is-acknowledgement`, `already-covered-by-prior-writes`, `operator-asked-for-existing-data`. Recorded for audit; not used for control flow."),
3095
+ }, async ({ reason }) => {
3096
+ const sessionId = process.env.SESSION_ID || "unknown";
3097
+ const line = `skip sessionId=${sessionId} reason=${reason}`;
3098
+ if (!PLATFORM_PORT) {
3099
+ console.error(`[per-turn-graph-pass-gate] log-ingest-skipped sessionId=${sessionId} reason=missing-env env=PLATFORM_PORT line=${JSON.stringify(line)}`);
3100
+ }
3101
+ else {
3102
+ try {
3103
+ const port = parseInt(PLATFORM_PORT, 10);
3104
+ await fetch(`http://127.0.0.1:${port}/api/admin/log-ingest`, {
3105
+ method: "POST",
3106
+ headers: { "Content-Type": "application/json" },
3107
+ body: JSON.stringify({ tag: "per-turn-graph-pass-gate", level: "info", line }),
3108
+ signal: AbortSignal.timeout(2000),
3109
+ });
3110
+ }
3111
+ catch (err) {
3112
+ console.error(`[per-turn-graph-pass-gate] log-ingest-failed sessionId=${sessionId} err=${err instanceof Error ? err.message : String(err)}`);
3113
+ }
3114
+ }
3115
+ return {
3116
+ content: [{
3117
+ type: "text",
3118
+ text: `Per-turn graph pass marked skipped (reason=${reason}). The gate will release this turn.`,
3119
+ }],
3120
+ };
3121
+ });
3122
+ // ===================================================================
3082
3123
  // Session-end retrospective sentinel (Task 282)
3083
3124
  // ===================================================================
3084
3125
  //