@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.
- package/package.json +1 -1
- package/payload/platform/lib/admin-conversation-purge/dist/index.d.ts +1 -1
- package/payload/platform/lib/admin-conversation-purge/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/admin-conversation-purge/dist/index.js +4 -4
- package/payload/platform/lib/admin-conversation-purge/dist/index.js.map +1 -1
- package/payload/platform/lib/admin-conversation-purge/src/index.ts +5 -5
- package/payload/platform/lib/graph-style/dist/index.js +2 -2
- package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-style/src/__tests__/parity.test.ts +1 -1
- package/payload/platform/lib/graph-style/src/index.ts +2 -2
- package/payload/platform/lib/graph-trash/dist/index.js +1 -1
- package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-trash/src/index.ts +1 -1
- package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js +1 -1
- package/payload/platform/lib/graph-write/dist/__tests__/action-provenance-gate.test.js.map +1 -1
- package/payload/platform/lib/graph-write/dist/conversation-provenance.d.ts +3 -3
- package/payload/platform/lib/graph-write/dist/conversation-provenance.js +5 -5
- package/payload/platform/lib/graph-write/dist/conversation-provenance.js.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +1 -1
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/__tests__/action-provenance-gate.test.ts +1 -1
- package/payload/platform/lib/graph-write/src/conversation-provenance.ts +8 -8
- package/payload/platform/lib/graph-write/src/index.ts +1 -1
- package/payload/platform/neo4j/schema.cypher +33 -15
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +8 -4
- package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +1 -1
- package/payload/platform/plugins/admin/hooks/__tests__/per-turn-graph-pass-gate.test.sh +361 -0
- package/payload/platform/plugins/admin/hooks/__tests__/pre-turn-graph-pass.test.sh +13 -13
- package/payload/platform/plugins/admin/hooks/__tests__/turn-completed-graph-write.test.sh +1 -1
- package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +242 -0
- package/payload/platform/plugins/admin/hooks/per-turn-graph-pass-gate.sh +106 -0
- package/payload/platform/plugins/admin/hooks/pre-turn-graph-pass.sh +47 -91
- package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +32 -91
- package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +4 -4
- package/payload/platform/plugins/admin/mcp/dist/index.js +65 -24
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/session-management/SKILL.md +2 -2
- package/payload/platform/plugins/admin/skills/stream-log-review/SKILL.md +5 -5
- package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +6 -6
- package/payload/platform/plugins/business-assistant/references/profiling.md +1 -1
- package/payload/platform/plugins/contacts/PLUGIN.md +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +2 -2
- package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/contact-erase.js +3 -3
- package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.d.ts +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/contact-export.js +2 -2
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.d.ts.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js +4 -4
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-create.js.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js +10 -10
- package/payload/platform/plugins/contacts/mcp/dist/tools/group-manage.js.map +1 -1
- package/payload/platform/plugins/docs/references/admin-session.md +6 -6
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +3 -1
- package/payload/platform/plugins/docs/references/internals.md +5 -5
- package/payload/platform/plugins/docs/references/plugins-guide.md +3 -3
- package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
- package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +15 -2
- package/payload/platform/plugins/email/mcp/dist/index.js +53 -0
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/embedding.js +2 -2
- package/payload/platform/plugins/email/mcp/dist/lib/embedding.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/graph.js +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/graph.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +23 -0
- package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js +15 -0
- package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts +15 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +49 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts +20 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js +86 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-ingest.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +32 -52
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
- package/payload/platform/plugins/email/references/email-reference.md +19 -83
- package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +87 -0
- package/payload/platform/plugins/memory/PLUGIN.md +4 -4
- package/payload/platform/plugins/memory/mcp/dist/index.js +40 -41
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/x-dm.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +3 -3
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +6 -6
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/log-ingest.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts +2 -2
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/typed-edge-pass.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js +3 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-memory-expunge-emit.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/log-ingest.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js +8 -8
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-empty-trash-admin-conversation.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-report-tools.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-memory-expunge.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts +35 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js +80 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js +8 -8
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-empty-trash.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-find-candidates.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-report-write.js +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +2 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +11 -11
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/scripts/backfill-typed-edges.ts +1 -1
- package/payload/platform/plugins/memory/mcp/scripts/graph/fixture.cypher +1 -1
- package/payload/platform/plugins/memory/references/graph-primitives.md +1 -1
- package/payload/platform/plugins/memory/references/schema-base.md +4 -4
- package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +1 -1
- package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +2 -2
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/index.js +2 -2
- package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/project-create.js +6 -6
- package/payload/platform/plugins/work/mcp/dist/tools/project-create.js.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/session-list.js +1 -1
- package/payload/platform/plugins/work/mcp/dist/tools/session-list.js.map +1 -1
- package/payload/platform/plugins/x-import/references/archive-shape.md +2 -2
- package/payload/platform/plugins/x-import/skills/x-import/SKILL.md +3 -3
- package/payload/platform/scripts/admin-persist-audit.ts +18 -18
- package/payload/platform/scripts/identity-forbidden-token-check.mjs +2 -0
- package/payload/platform/scripts/seed-neo4j.sh +1 -0
- package/payload/platform/scripts/smoke-boot-services.sh +191 -41
- package/payload/platform/services/claude-session-manager/dist/http-server.js +3 -3
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +3 -3
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +4 -4
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +2 -0
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{chunk-AXOL2PPG.js → chunk-3TRIXQSJ.js} +101 -101
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/{admin-DJW5VnQ1.js → admin-Dal5FWaD.js} +24 -24
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Breg9-99.js → architectureDiagram-Q4EWVU46-Do2zYONG.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DXf1_673.js → blockDiagram-DXYQGD6D-DpIX_bRu.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-CSZ36W4-.js → c4Diagram-AHTNJAMY-Cz335ZSY.js} +1 -1
- package/payload/server/public/assets/channel-PC4_IjI1.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-DsrLk2eK.js → chunk-336JU56O-Dmknn3Wo.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-JpNfNf81.js → chunk-426QAEUC-ClfGjizN.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DmClEAD0.js → chunk-4TB4RGXK-BPKctJ5c.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-BI9blW3N.js → chunk-5FUZZQ4R-BWDCO9zw.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-BbgttEFO.js → chunk-5PVQY5BW-BE34_Db0.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-BX_LCFOx.js → chunk-EDXVE4YY-BysA-_6v.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-Bb7EoD0w.js → chunk-ENJZ2VHE-BMVyMsqA.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DH8uQk-s.js → chunk-ICPOFSXX-C5KRdLV4.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-FH5kgXsw.js → chunk-OYMX7WX6-DVZD-AVc.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-D_ljlkHr.js → chunk-U2HBQHQK-DYmQdx8x.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-BX3EmZvm.js → chunk-X2U36JSP-DrZenIl3.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Vu7-E93h.js → chunk-YZCP3GAM-CDuGbvMq.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-CwjhNPX5.js → chunk-ZZ45TVLE-COztbiu5.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-B_pMa-SX.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BdBAgF20.js +1 -0
- package/payload/server/public/assets/clone-CkNt9L9r.js +1 -0
- package/payload/server/public/assets/{dagre-Ce6gsj0C.js → dagre-Cv9Ib2OM.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-BaMGpsoy.js → dagre-KV5264BT-CoEd61KZ.js} +1 -1
- package/payload/server/public/assets/{data-BHASh0_Y.js → data-DbSORCl4.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-CHEE9rjq.js → diagram-5BDNPKRD-WXNzw3uW.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-C98sZLW1.js → diagram-G4DWMVQ6-C6IuQ2VV.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DNvMGsTZ.js → diagram-MMDJMWI5-CdJdir5A.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-Cdte4IBa.js → diagram-TYMM5635-DxWKQH5T.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-C9VZsWXK.js → erDiagram-SMLLAGMA-C9fvs33K.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-tuP5fzzR.js → flowDiagram-DWJPFMVM-BO7Yrbqv.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-SJgRPUwx.js → ganttDiagram-T4ZO3ILL-CQJyWBZq.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DU_cI_50.js → gitGraphDiagram-UUTBAWPF-DZfQHrYw.js} +1 -1
- package/payload/server/public/assets/{graph-labels-DXlmm1og.js → graph-labels-BBB5jsZk.js} +1 -1
- package/payload/server/public/assets/{graph-BhEI09tF.js → graph-ys_joP2o.js} +1 -1
- package/payload/server/public/assets/{graphlib-D_nAsvmx.js → graphlib-C40H-Q5E.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-Cj2Y19m6.js → infoDiagram-42DDH7IO-CakfV5f9.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DMc1xq1y.js → ishikawaDiagram-UXIWVN3A-CPuBPyfa.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-C4CRAQma.js → journeyDiagram-VCZTEJTY-zpZm2Mmo.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CTr4AldU.js → kanban-definition-6JOO6SKY-DfJduQCo.js} +1 -1
- package/payload/server/public/assets/{line-Btlm_IAl.js → line-BpYQqO5R.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-DXFdj_y1.js → mermaid-parser.core-C5Mwi14D.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-DFBhoCr5.js → mermaid.core-D8qBtvvT.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-r9gVQybo.js → mindmap-definition-QFDTVHPH-Bli9JhIN.js} +1 -1
- package/payload/server/public/assets/{page-CDWu1Aft.js → page--bl5Y7ZI.js} +2 -2
- package/payload/server/public/assets/page-CwmZ76U7.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CHKZjSaH.js → pieDiagram-DEJITSTG-MsLXTSLg.js} +1 -1
- package/payload/server/public/assets/{public-DyGWgfaZ.js → public-DltgEfA9.js} +2 -2
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CSGR1HJr.js → quadrantDiagram-34T5L4WZ-De1sh2K0.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-DZ6hX9D6.js → requirementDiagram-MS252O5E-D5Sfg1t_.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DbZBKh0m.js → sankeyDiagram-XADWPNL6-DHA3LIbv.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BHHpb8dt.js → sequenceDiagram-FGHM5R23-BE_QlG1B.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DQ1jiLB4.js → stateDiagram-FHFEXIEX-NIwp3F4u.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-pfk2F6st.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BlGiEU7p.js → timeline-definition-GMOUNBTQ-CPE9jyDF.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DmEH-hsB.js → vennDiagram-DHZGUBPP-CKfoyYmH.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-C7KJJ40d.js → wardleyDiagram-NUSXRM2D-B9yJek-o.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-JDnusCaa.js → xychartDiagram-5P7HB3ND-DuCcSLqX.js} +1 -1
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/public/public.html +1 -1
- package/payload/server/server.js +133 -133
- package/payload/server/public/assets/channel-BmZnt3PP.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-kmMLFUpV.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BV7Ae8ct.js +0 -1
- package/payload/server/public/assets/clone-B5eqoN9I.js +0 -1
- package/payload/server/public/assets/page-cyvshX4Z.js +0 -1
- 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
|
|
4
|
-
# updates, graph-completeness sweep) and called
|
|
5
|
-
# `session-retrospective-mark-complete` MCP sentinel
|
|
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
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
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 (
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
# -
|
|
39
|
-
#
|
|
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
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
|
|
62
|
+
# shellcheck source=lib/admin-graph-pass-common.sh
|
|
63
|
+
source "$AGP_LIB"
|
|
70
64
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
187
|
+
agp_emit_log "trigger-skipped sessionId=${SESSION_ID} reason=no-intent-match"
|
|
247
188
|
exit 0
|
|
248
189
|
fi
|
|
249
190
|
|
|
250
|
-
|
|
191
|
+
agp_emit_log "trigger sessionId=${SESSION_ID} token=${INTENT_TOKEN}"
|
|
251
192
|
|
|
252
193
|
if [ "$SENTINEL_PRESENT" = "yes" ]; then
|
|
253
|
-
|
|
194
|
+
agp_emit_log "gate-released sessionId=${SESSION_ID}"
|
|
254
195
|
exit 0
|
|
255
196
|
fi
|
|
256
197
|
|
|
257
|
-
|
|
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,
|
|
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
|
-
# "
|
|
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,
|
|
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
|
-
"
|
|
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 `
|
|
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
|
-
|
|
1333
|
-
}, async ({ type, lines = 50, sessionKey,
|
|
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
|
-
// `
|
|
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 ??
|
|
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
|
|
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
|
|
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.
|
|
2735
|
-
console.error(`[approval] ToolCall skipped (no
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
2887
|
-
}, async ({ actionId,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2959
|
-
}, async ({ actionId, reason,
|
|
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
|
-
|
|
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
|
-
|
|
3003
|
-
}, async ({ actionId, editedInput,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
//
|