@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
|
@@ -3790,13 +3790,13 @@ function getUserNameForSession(cacheKey2) {
|
|
|
3790
3790
|
function getRoleForSession(cacheKey2) {
|
|
3791
3791
|
return sessionStore.get(cacheKey2)?.role;
|
|
3792
3792
|
}
|
|
3793
|
-
function
|
|
3794
|
-
return sessionStore.get(cacheKey2)?.
|
|
3793
|
+
function getSessionIdForSession(cacheKey2) {
|
|
3794
|
+
return sessionStore.get(cacheKey2)?.sessionId;
|
|
3795
3795
|
}
|
|
3796
|
-
function
|
|
3796
|
+
function setSessionIdForSession(cacheKey2, sessionId) {
|
|
3797
3797
|
const session = sessionStore.get(cacheKey2);
|
|
3798
3798
|
if (!session) return false;
|
|
3799
|
-
session.
|
|
3799
|
+
session.sessionId = sessionId;
|
|
3800
3800
|
return true;
|
|
3801
3801
|
}
|
|
3802
3802
|
function setWantsPriorConversation(cacheKey2) {
|
|
@@ -3806,7 +3806,7 @@ function setWantsPriorConversation(cacheKey2) {
|
|
|
3806
3806
|
function unregisterSession(cacheKey2) {
|
|
3807
3807
|
return sessionStore.delete(cacheKey2);
|
|
3808
3808
|
}
|
|
3809
|
-
function
|
|
3809
|
+
function getSessionKeyBySessionId(_sessionId) {
|
|
3810
3810
|
return void 0;
|
|
3811
3811
|
}
|
|
3812
3812
|
|
|
@@ -4127,35 +4127,35 @@ async function embed(text) {
|
|
|
4127
4127
|
return data.embeddings[0];
|
|
4128
4128
|
}
|
|
4129
4129
|
var sessionStoreRef = null;
|
|
4130
|
-
function
|
|
4131
|
-
return sessionStoreRef?.get(cacheKey2)?.
|
|
4130
|
+
function getCachedSessionId(cacheKey2) {
|
|
4131
|
+
return sessionStoreRef?.get(cacheKey2)?.sessionId;
|
|
4132
4132
|
}
|
|
4133
|
-
function
|
|
4133
|
+
function cacheSessionId(cacheKey2, sessionId) {
|
|
4134
4134
|
const session = sessionStoreRef?.get(cacheKey2);
|
|
4135
4135
|
if (session) {
|
|
4136
|
-
session.
|
|
4136
|
+
session.sessionId = sessionId;
|
|
4137
4137
|
}
|
|
4138
4138
|
}
|
|
4139
4139
|
var GREETING_DIRECTIVE = "[New session. Greet the visitor.]";
|
|
4140
4140
|
async function ensureConversation(accountId, agentType, cacheKey2, visitorId, agentSlug, userId, channelOverride, channelAddressOverride) {
|
|
4141
|
-
const cached =
|
|
4142
|
-
if (cached) return {
|
|
4143
|
-
const
|
|
4141
|
+
const cached = getCachedSessionId(cacheKey2);
|
|
4142
|
+
if (cached) return { sessionId: cached, created: false };
|
|
4143
|
+
const sessionId = randomUUID();
|
|
4144
4144
|
const channel = channelOverride ?? (cacheKey2.startsWith("whatsapp:") ? "whatsapp" : cacheKey2.startsWith("telegram:") ? "telegram" : "webchat");
|
|
4145
|
-
const channelAddress = channelAddressOverride ?? (cacheKey2.startsWith("whatsapp:") ? cacheKey2.slice("whatsapp:".length) : cacheKey2.startsWith("telegram:") ? cacheKey2.slice("telegram:".length) :
|
|
4145
|
+
const channelAddress = channelAddressOverride ?? (cacheKey2.startsWith("whatsapp:") ? cacheKey2.slice("whatsapp:".length) : cacheKey2.startsWith("telegram:") ? cacheKey2.slice("telegram:".length) : sessionId);
|
|
4146
4146
|
const conversationSublabel = agentType === "admin" ? "AdminConversation" : "PublicConversation";
|
|
4147
4147
|
const handlerSlug = agentSlug ?? (agentType === "admin" ? "admin" : null);
|
|
4148
4148
|
const wantsHandledByEdge = !!handlerSlug;
|
|
4149
4149
|
const handledByClause = wantsHandledByEdge ? `WITH c, created
|
|
4150
4150
|
OPTIONAL MATCH (a:Agent {accountId: $accountId, slug: $handlerSlug})
|
|
4151
4151
|
FOREACH (_ IN CASE WHEN a IS NULL THEN [] ELSE [1] END | MERGE (c)-[:HANDLED_BY]->(a))
|
|
4152
|
-
RETURN c.
|
|
4152
|
+
RETURN c.sessionId AS sessionId, created AS created, a IS NOT NULL AS handledBy` : `RETURN c.sessionId AS sessionId, created AS created, false AS handledBy`;
|
|
4153
4153
|
const session = getSession();
|
|
4154
4154
|
try {
|
|
4155
4155
|
const result = await session.run(
|
|
4156
4156
|
`OPTIONAL MATCH (prior:Conversation {accountId: $accountId, channel: $channel, channelAddress: $channelAddress})
|
|
4157
|
-
WITH prior, coalesce(prior.
|
|
4158
|
-
MERGE (c:Conversation {
|
|
4157
|
+
WITH prior, coalesce(prior.sessionId, $sessionId) AS finalConvId, prior IS NULL AS created
|
|
4158
|
+
MERGE (c:Conversation {sessionId: finalConvId})
|
|
4159
4159
|
ON CREATE SET
|
|
4160
4160
|
c:${conversationSublabel},
|
|
4161
4161
|
c.accountId = $accountId,
|
|
@@ -4171,7 +4171,7 @@ async function ensureConversation(accountId, agentType, cacheKey2, visitorId, ag
|
|
|
4171
4171
|
c.updatedAt = datetime()
|
|
4172
4172
|
${handledByClause}`,
|
|
4173
4173
|
{
|
|
4174
|
-
|
|
4174
|
+
sessionId,
|
|
4175
4175
|
accountId,
|
|
4176
4176
|
agentType,
|
|
4177
4177
|
channel,
|
|
@@ -4182,25 +4182,25 @@ async function ensureConversation(accountId, agentType, cacheKey2, visitorId, ag
|
|
|
4182
4182
|
...userId ? { userId } : {}
|
|
4183
4183
|
}
|
|
4184
4184
|
);
|
|
4185
|
-
const id = result.records[0]?.get("
|
|
4185
|
+
const id = result.records[0]?.get("sessionId");
|
|
4186
4186
|
const created = result.records[0]?.get("created") === true;
|
|
4187
4187
|
if (id) {
|
|
4188
|
-
|
|
4189
|
-
console.error(`[session] ${(/* @__PURE__ */ new Date()).toISOString()} conversation attributed:
|
|
4188
|
+
cacheSessionId(cacheKey2, id);
|
|
4189
|
+
console.error(`[session] ${(/* @__PURE__ */ new Date()).toISOString()} conversation attributed: sessionId=${id.slice(0, 8)}\u2026 userId=${userId ?? "none"} ${agentType}/${accountId.slice(0, 8)}\u2026 sublabel=${conversationSublabel}`);
|
|
4190
4190
|
if (wantsHandledByEdge) {
|
|
4191
4191
|
const handled = result.records[0]?.get("handledBy");
|
|
4192
4192
|
const id8 = id.slice(0, 8);
|
|
4193
4193
|
if (handled === true) {
|
|
4194
|
-
console.error(`[agent-graph] handled-by-write
|
|
4194
|
+
console.error(`[agent-graph] handled-by-write sessionId=${id8} slug=${handlerSlug}`);
|
|
4195
4195
|
} else {
|
|
4196
|
-
console.error(`[agent-graph] handled-by-skip reason=no-agent-node
|
|
4196
|
+
console.error(`[agent-graph] handled-by-skip reason=no-agent-node sessionId=${id8} slug=${handlerSlug}`);
|
|
4197
4197
|
}
|
|
4198
4198
|
}
|
|
4199
4199
|
}
|
|
4200
|
-
return {
|
|
4200
|
+
return { sessionId: id ?? null, created };
|
|
4201
4201
|
} catch (err) {
|
|
4202
4202
|
console.error(`[persist] ensureConversation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
4203
|
-
return {
|
|
4203
|
+
return { sessionId: null, created: false };
|
|
4204
4204
|
} finally {
|
|
4205
4205
|
await session.close();
|
|
4206
4206
|
}
|
|
@@ -4253,7 +4253,7 @@ async function fetchBranding(accountId) {
|
|
|
4253
4253
|
}
|
|
4254
4254
|
var SUMMARY_MAX_LEN = 200;
|
|
4255
4255
|
var persistMessageLocks = /* @__PURE__ */ new Map();
|
|
4256
|
-
async function persistMessage(
|
|
4256
|
+
async function persistMessage(sessionId, role, content, accountId, tokens, createdAt, sender, components, attachments) {
|
|
4257
4257
|
if (!content) return null;
|
|
4258
4258
|
const messageId = randomUUID();
|
|
4259
4259
|
const summary = role === "user" ? content.slice(0, SUMMARY_MAX_LEN).trim() : "";
|
|
@@ -4263,19 +4263,19 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4263
4263
|
} catch (err) {
|
|
4264
4264
|
console.error(`[persist] Embedding failed, storing without: ${err instanceof Error ? err.message : String(err)}`);
|
|
4265
4265
|
}
|
|
4266
|
-
const prev = persistMessageLocks.get(
|
|
4266
|
+
const prev = persistMessageLocks.get(sessionId);
|
|
4267
4267
|
const waited = prev !== void 0;
|
|
4268
4268
|
let release;
|
|
4269
4269
|
const mine = new Promise((resolve6) => {
|
|
4270
4270
|
release = resolve6;
|
|
4271
4271
|
});
|
|
4272
4272
|
const chained = (prev ?? Promise.resolve()).then(() => mine);
|
|
4273
|
-
persistMessageLocks.set(
|
|
4273
|
+
persistMessageLocks.set(sessionId, chained);
|
|
4274
4274
|
await prev;
|
|
4275
4275
|
const session = getSession();
|
|
4276
4276
|
try {
|
|
4277
4277
|
const result = await session.run(
|
|
4278
|
-
`MATCH (c:Conversation {
|
|
4278
|
+
`MATCH (c:Conversation {sessionId: $sessionId})
|
|
4279
4279
|
OPTIONAL MATCH (tail:Message)-[:PART_OF]->(c)
|
|
4280
4280
|
WHERE NOT (tail)-[:NEXT]->(:Message)
|
|
4281
4281
|
AND (tail:UserMessage OR tail:AssistantMessage)
|
|
@@ -4294,7 +4294,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4294
4294
|
WITH c, tail, (c.summary IS NULL AND $role = 'user' AND $summary <> '') AS summarySetThisWrite
|
|
4295
4295
|
CREATE (m:Message:${role === "user" ? "UserMessage" : "AssistantMessage"} {
|
|
4296
4296
|
messageId: $messageId,
|
|
4297
|
-
|
|
4297
|
+
sessionId: $sessionId,
|
|
4298
4298
|
accountId: $accountId,
|
|
4299
4299
|
role: $role,
|
|
4300
4300
|
content: $content,
|
|
@@ -4317,7 +4317,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4317
4317
|
FOREACH (comp IN $components |
|
|
4318
4318
|
CREATE (m)-[:HAS_COMPONENT]->(:Component {
|
|
4319
4319
|
componentId: comp.componentId,
|
|
4320
|
-
|
|
4320
|
+
sessionId: $sessionId,
|
|
4321
4321
|
accountId: $accountId,
|
|
4322
4322
|
messageId: $messageId,
|
|
4323
4323
|
name: comp.name,
|
|
@@ -4361,7 +4361,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4361
4361
|
FOREACH (att IN $attachments |
|
|
4362
4362
|
CREATE (m)-[:HAS_ATTACHMENT]->(:Attachment {
|
|
4363
4363
|
attachmentId: att.attachmentId,
|
|
4364
|
-
|
|
4364
|
+
sessionId: $sessionId,
|
|
4365
4365
|
accountId: $accountId,
|
|
4366
4366
|
messageId: $messageId,
|
|
4367
4367
|
filename: att.filename,
|
|
@@ -4377,7 +4377,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4377
4377
|
size([(m2:Message)-[:PART_OF]->(c) | m2]) AS chainLen`,
|
|
4378
4378
|
{
|
|
4379
4379
|
messageId,
|
|
4380
|
-
|
|
4380
|
+
sessionId,
|
|
4381
4381
|
accountId,
|
|
4382
4382
|
role,
|
|
4383
4383
|
content,
|
|
@@ -4422,7 +4422,7 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4422
4422
|
}
|
|
4423
4423
|
);
|
|
4424
4424
|
if (result.records.length === 0) {
|
|
4425
|
-
console.error(`[persist] Neo4j write skipped \u2014 conversation not found: ${
|
|
4425
|
+
console.error(`[persist] Neo4j write skipped \u2014 conversation not found: ${sessionId.slice(0, 8)}\u2026`);
|
|
4426
4426
|
return null;
|
|
4427
4427
|
}
|
|
4428
4428
|
const record = result.records[0];
|
|
@@ -4431,9 +4431,9 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4431
4431
|
const chainLenRaw = record.get("chainLen");
|
|
4432
4432
|
const chainLen = typeof chainLenRaw === "bigint" ? Number(chainLenRaw) : typeof chainLenRaw?.toNumber === "function" ? chainLenRaw.toNumber() : Number(chainLenRaw ?? 0);
|
|
4433
4433
|
const messageSublabel = role === "user" ? "UserMessage" : "AssistantMessage";
|
|
4434
|
-
console.error(`[neo4j-store] append-message
|
|
4434
|
+
console.error(`[neo4j-store] append-message sessionId=${sessionId.slice(0, 8)}\u2026 messageId=${messageId.slice(0, 8)}\u2026 prev=${prevMessageId ? prevMessageId.slice(0, 8) + "\u2026" : "null"} chainLen=${chainLen} waited=${waited} sublabel=${messageSublabel}`);
|
|
4435
4435
|
if (summarySetThisWrite) {
|
|
4436
|
-
console.error(`[neo4j-store] conversation-summary-set
|
|
4436
|
+
console.error(`[neo4j-store] conversation-summary-set sessionId=${sessionId.slice(0, 8)}\u2026 len=${summary.length}`);
|
|
4437
4437
|
}
|
|
4438
4438
|
const componentList = components ?? [];
|
|
4439
4439
|
if (componentList.length > 0) {
|
|
@@ -4441,10 +4441,10 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4441
4441
|
const expectedComponentEdges = componentList.length;
|
|
4442
4442
|
const baseEdges = relsCreated - expectedComponentEdges;
|
|
4443
4443
|
if (baseEdges < 1) {
|
|
4444
|
-
console.error(`[neo4j-store] persist-component WARN
|
|
4444
|
+
console.error(`[neo4j-store] persist-component WARN sessionId=${sessionId.slice(0, 8)}\u2026 messageId=${messageId.slice(0, 8)}\u2026 relsCreated=${relsCreated} expected\u2265${1 + expectedComponentEdges} \u2014 component edges may not have been created`);
|
|
4445
4445
|
}
|
|
4446
4446
|
for (const comp of componentList) {
|
|
4447
|
-
console.error(`[neo4j-store] persist-component
|
|
4447
|
+
console.error(`[neo4j-store] persist-component sessionId=${sessionId.slice(0, 8)}\u2026 messageId=${messageId.slice(0, 8)}\u2026 componentId=${comp.componentId.slice(0, 8)}\u2026 name=${comp.name} dataLen=${comp.data.length} ordinal=${comp.ordinal} textOffset=${comp.textOffset}`);
|
|
4448
4448
|
}
|
|
4449
4449
|
}
|
|
4450
4450
|
const attachmentList = attachments ?? [];
|
|
@@ -4454,51 +4454,51 @@ async function persistMessage(conversationId, role, content, accountId, tokens,
|
|
|
4454
4454
|
const expectedComponentEdges = (components ?? []).length;
|
|
4455
4455
|
const baseEdges = relsCreated - expectedComponentEdges - expectedAttachmentEdges;
|
|
4456
4456
|
if (baseEdges < 1) {
|
|
4457
|
-
console.error(`[neo4j-store] persist-attachment WARN
|
|
4457
|
+
console.error(`[neo4j-store] persist-attachment WARN sessionId=${sessionId.slice(0, 8)}\u2026 messageId=${messageId.slice(0, 8)}\u2026 relsCreated=${relsCreated} expected\u2265${1 + expectedComponentEdges + expectedAttachmentEdges} \u2014 attachment edges may not have been created`);
|
|
4458
4458
|
}
|
|
4459
4459
|
for (const att of attachmentList) {
|
|
4460
|
-
console.error(`[neo4j-store] persist-attachment
|
|
4460
|
+
console.error(`[neo4j-store] persist-attachment sessionId=${sessionId.slice(0, 8)}\u2026 messageId=${messageId.slice(0, 8)}\u2026 attachmentId=${att.attachmentId.slice(0, 8)}\u2026 filename=${att.filename} mimeType=${att.mimeType} sizeBytes=${att.sizeBytes} ordinal=${att.ordinal}`);
|
|
4461
4461
|
}
|
|
4462
4462
|
}
|
|
4463
|
-
console.error(`[persist] ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
4463
|
+
console.error(`[persist] ${(/* @__PURE__ */ new Date()).toISOString()} sessionId=${sessionId.slice(0, 8)}\u2026 role=${role} len=${content.length}${sender ? ` sender=${sender.displayName}` : ""}`);
|
|
4464
4464
|
return messageId;
|
|
4465
4465
|
} catch (err) {
|
|
4466
4466
|
console.error(`[persist] Neo4j write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
4467
4467
|
return null;
|
|
4468
4468
|
} finally {
|
|
4469
4469
|
release();
|
|
4470
|
-
if (persistMessageLocks.get(
|
|
4471
|
-
persistMessageLocks.delete(
|
|
4470
|
+
if (persistMessageLocks.get(sessionId) === chained) {
|
|
4471
|
+
persistMessageLocks.delete(sessionId);
|
|
4472
4472
|
}
|
|
4473
4473
|
await session.close();
|
|
4474
4474
|
}
|
|
4475
4475
|
}
|
|
4476
|
-
async function getAgentSessionIdForConversation(
|
|
4476
|
+
async function getAgentSessionIdForConversation(sessionId) {
|
|
4477
4477
|
const session = getSession();
|
|
4478
4478
|
try {
|
|
4479
4479
|
const result = await session.run(
|
|
4480
|
-
`MATCH (c:Conversation {
|
|
4480
|
+
`MATCH (c:Conversation {sessionId: $sessionId})
|
|
4481
4481
|
RETURN c.agentSessionId AS agentSessionId`,
|
|
4482
|
-
{
|
|
4482
|
+
{ sessionId }
|
|
4483
4483
|
);
|
|
4484
4484
|
const value = result.records[0]?.get("agentSessionId");
|
|
4485
4485
|
return typeof value === "string" && value.length > 0 ? value : null;
|
|
4486
4486
|
} catch (err) {
|
|
4487
|
-
console.error(`[persist] agent-session-id read failed convId=${
|
|
4487
|
+
console.error(`[persist] agent-session-id read failed convId=${sessionId.slice(0, 8)}\u2026 error=${err instanceof Error ? err.message : String(err)}`);
|
|
4488
4488
|
return null;
|
|
4489
4489
|
} finally {
|
|
4490
4490
|
await session.close();
|
|
4491
4491
|
}
|
|
4492
4492
|
}
|
|
4493
|
-
async function getRecentMessages(
|
|
4493
|
+
async function getRecentMessages(sessionId, limit = 50) {
|
|
4494
4494
|
const session = getSession();
|
|
4495
4495
|
try {
|
|
4496
4496
|
const result = await session.run(
|
|
4497
|
-
`MATCH (tail:Message {
|
|
4497
|
+
`MATCH (tail:Message {sessionId: $sessionId})
|
|
4498
4498
|
WHERE NOT (tail)-[:NEXT]->(:Message)
|
|
4499
4499
|
WITH tail ORDER BY tail.createdAt DESC LIMIT 1
|
|
4500
4500
|
MATCH path = (m:Message)-[:NEXT*0..]->(tail)
|
|
4501
|
-
WHERE m.
|
|
4501
|
+
WHERE m.sessionId = $sessionId
|
|
4502
4502
|
AND length(path) < $limit
|
|
4503
4503
|
WITH m, length(path) AS depthFromTail
|
|
4504
4504
|
OPTIONAL MATCH (m)-[:HAS_COMPONENT]->(c:Component)
|
|
@@ -4512,7 +4512,7 @@ async function getRecentMessages(conversationId, limit = 50) {
|
|
|
4512
4512
|
RETURN m.messageId AS messageId, m.role AS role, m.content AS content,
|
|
4513
4513
|
m.createdAt AS createdAt, components, attachments
|
|
4514
4514
|
ORDER BY depthFromTail DESC`,
|
|
4515
|
-
{
|
|
4515
|
+
{ sessionId, limit: neo4j.int(limit) }
|
|
4516
4516
|
);
|
|
4517
4517
|
return result.records.map((r) => {
|
|
4518
4518
|
const rawComponents = r.get("components") ?? [];
|
|
@@ -4555,13 +4555,13 @@ async function getRecentMessages(conversationId, limit = 50) {
|
|
|
4555
4555
|
await session.close();
|
|
4556
4556
|
}
|
|
4557
4557
|
}
|
|
4558
|
-
async function verifyConversationOwnership(
|
|
4558
|
+
async function verifyConversationOwnership(sessionId, accountId) {
|
|
4559
4559
|
const session = getSession();
|
|
4560
4560
|
try {
|
|
4561
4561
|
const result = await session.run(
|
|
4562
|
-
`MATCH (c:Conversation {
|
|
4563
|
-
RETURN c.
|
|
4564
|
-
{
|
|
4562
|
+
`MATCH (c:Conversation {sessionId: $sessionId, accountId: $accountId})
|
|
4563
|
+
RETURN c.sessionId AS id LIMIT 1`,
|
|
4564
|
+
{ sessionId, accountId }
|
|
4565
4565
|
);
|
|
4566
4566
|
return result.records.length > 0;
|
|
4567
4567
|
} catch (err) {
|
|
@@ -4571,13 +4571,13 @@ async function verifyConversationOwnership(conversationId, accountId) {
|
|
|
4571
4571
|
await session.close();
|
|
4572
4572
|
}
|
|
4573
4573
|
}
|
|
4574
|
-
async function getConversationOwner(
|
|
4574
|
+
async function getConversationOwner(sessionId) {
|
|
4575
4575
|
const session = getSession();
|
|
4576
4576
|
try {
|
|
4577
4577
|
const result = await session.run(
|
|
4578
|
-
`MATCH (c:Conversation {
|
|
4578
|
+
`MATCH (c:Conversation {sessionId: $sessionId})
|
|
4579
4579
|
RETURN c.accountId AS accountId, c.userId AS userId LIMIT 1`,
|
|
4580
|
-
{
|
|
4580
|
+
{ sessionId }
|
|
4581
4581
|
);
|
|
4582
4582
|
const record = result.records[0];
|
|
4583
4583
|
if (!record) return null;
|
|
@@ -4592,13 +4592,13 @@ async function getConversationOwner(conversationId) {
|
|
|
4592
4592
|
await session.close();
|
|
4593
4593
|
}
|
|
4594
4594
|
}
|
|
4595
|
-
async function verifyAndGetConversationUpdatedAt(
|
|
4595
|
+
async function verifyAndGetConversationUpdatedAt(sessionId, accountId) {
|
|
4596
4596
|
const session = getSession();
|
|
4597
4597
|
try {
|
|
4598
4598
|
const result = await session.run(
|
|
4599
|
-
`MATCH (c:Conversation {
|
|
4599
|
+
`MATCH (c:Conversation {sessionId: $sessionId, accountId: $accountId})
|
|
4600
4600
|
RETURN toString(c.updatedAt) AS updatedAt LIMIT 1`,
|
|
4601
|
-
{
|
|
4601
|
+
{ sessionId, accountId }
|
|
4602
4602
|
);
|
|
4603
4603
|
const record = result.records[0];
|
|
4604
4604
|
return record ? record.get("updatedAt") : null;
|
|
@@ -4615,7 +4615,7 @@ async function listAdminSessions(accountId, userId, limit = 20) {
|
|
|
4615
4615
|
const result = await session.run(
|
|
4616
4616
|
`MATCH (c:Conversation {accountId: $accountId, agentType: 'admin', userId: $userId})
|
|
4617
4617
|
WHERE NOT c:Trashed
|
|
4618
|
-
RETURN c.
|
|
4618
|
+
RETURN c.sessionId AS sessionId,
|
|
4619
4619
|
c.name AS name,
|
|
4620
4620
|
c.updatedAt AS updatedAt,
|
|
4621
4621
|
c.channel AS channel
|
|
@@ -4624,7 +4624,7 @@ async function listAdminSessions(accountId, userId, limit = 20) {
|
|
|
4624
4624
|
{ accountId, userId, limit: neo4j.int(limit) }
|
|
4625
4625
|
);
|
|
4626
4626
|
return result.records.map((r) => ({
|
|
4627
|
-
|
|
4627
|
+
sessionId: r.get("sessionId"),
|
|
4628
4628
|
name: r.get("name"),
|
|
4629
4629
|
updatedAt: String(r.get("updatedAt")),
|
|
4630
4630
|
channel: r.get("channel")
|
|
@@ -4636,86 +4636,86 @@ async function listAdminSessions(accountId, userId, limit = 20) {
|
|
|
4636
4636
|
await session.close();
|
|
4637
4637
|
}
|
|
4638
4638
|
}
|
|
4639
|
-
async function deleteConversation(
|
|
4639
|
+
async function deleteConversation(sessionId) {
|
|
4640
4640
|
const session = getSession();
|
|
4641
4641
|
try {
|
|
4642
4642
|
const result = await session.run(
|
|
4643
|
-
`MATCH (c:Conversation {
|
|
4643
|
+
`MATCH (c:Conversation {sessionId: $sessionId})
|
|
4644
4644
|
OPTIONAL MATCH (m:Message)-[:PART_OF]->(c)
|
|
4645
4645
|
OPTIONAL MATCH (m)-[:HAS_COMPONENT]->(comp:Component)
|
|
4646
4646
|
OPTIONAL MATCH (m)-[:HAS_ATTACHMENT]->(att:Attachment)
|
|
4647
4647
|
OPTIONAL MATCH (c)-[:HAS_TRANSCRIPT]->(t:ClaudeSession)
|
|
4648
4648
|
DETACH DELETE att, comp, m, t, c
|
|
4649
4649
|
RETURN count(c) AS deleted`,
|
|
4650
|
-
{
|
|
4650
|
+
{ sessionId }
|
|
4651
4651
|
);
|
|
4652
4652
|
const deleted = result.records[0]?.get("deleted");
|
|
4653
4653
|
const count = typeof deleted === "object" && deleted !== null ? Number(deleted) : Number(deleted ?? 0);
|
|
4654
4654
|
const found = count > 0;
|
|
4655
|
-
console.error(`[persist] deleteConversation ${
|
|
4655
|
+
console.error(`[persist] deleteConversation ${sessionId.slice(0, 8)}\u2026: ${found ? "deleted" : "not found"}`);
|
|
4656
4656
|
return { found };
|
|
4657
4657
|
} finally {
|
|
4658
4658
|
await session.close();
|
|
4659
4659
|
}
|
|
4660
4660
|
}
|
|
4661
|
-
async function linkConversationTranscript(
|
|
4662
|
-
if (!
|
|
4663
|
-
console.error(`[transcript-link] schema-violation
|
|
4661
|
+
async function linkConversationTranscript(sessionId, claudeSessionId, accountId) {
|
|
4662
|
+
if (!sessionId || !claudeSessionId || !accountId) {
|
|
4663
|
+
console.error(`[transcript-link] schema-violation sessionId=${sessionId ? "set" : "EMPTY"} claudeSessionId=${claudeSessionId ? "set" : "EMPTY"} accountId=${accountId ? "set" : "EMPTY"}`);
|
|
4664
4664
|
return { linked: false };
|
|
4665
4665
|
}
|
|
4666
4666
|
const session = getSession();
|
|
4667
4667
|
try {
|
|
4668
4668
|
const result = await session.run(
|
|
4669
|
-
`MATCH (c:Conversation {
|
|
4669
|
+
`MATCH (c:Conversation {sessionId: $sessionId, accountId: $accountId})
|
|
4670
4670
|
MERGE (c)-[:HAS_TRANSCRIPT]->(t:ClaudeSession {claudeSessionId: $claudeSessionId})
|
|
4671
4671
|
ON CREATE SET
|
|
4672
4672
|
t.accountId = $accountId,
|
|
4673
4673
|
t.createdAt = datetime()
|
|
4674
4674
|
RETURN count(t) AS linked`,
|
|
4675
|
-
{
|
|
4675
|
+
{ sessionId, claudeSessionId, accountId }
|
|
4676
4676
|
);
|
|
4677
4677
|
const linked = Number(result.records[0]?.get("linked") ?? 0) > 0;
|
|
4678
4678
|
if (!linked) {
|
|
4679
|
-
console.error(`[transcript-link] convId=${
|
|
4679
|
+
console.error(`[transcript-link] convId=${sessionId.slice(0, 8)}\u2026 claudeSessionId=${claudeSessionId.slice(0, 8)}\u2026 status=skipped reason=conversation-not-found`);
|
|
4680
4680
|
}
|
|
4681
4681
|
return { linked };
|
|
4682
4682
|
} catch (err) {
|
|
4683
|
-
console.error(`[transcript-link] convId=${
|
|
4683
|
+
console.error(`[transcript-link] convId=${sessionId.slice(0, 8)}\u2026 claudeSessionId=${claudeSessionId.slice(0, 8)}\u2026 status=failed error=${err instanceof Error ? err.message : String(err)}`);
|
|
4684
4684
|
return { linked: false };
|
|
4685
4685
|
} finally {
|
|
4686
4686
|
await session.close();
|
|
4687
4687
|
}
|
|
4688
4688
|
}
|
|
4689
|
-
async function getConversationClaudeSessionIds(
|
|
4689
|
+
async function getConversationClaudeSessionIds(sessionId, accountId) {
|
|
4690
4690
|
const session = getSession();
|
|
4691
4691
|
try {
|
|
4692
4692
|
const result = await session.run(
|
|
4693
|
-
`MATCH (c:Conversation {
|
|
4693
|
+
`MATCH (c:Conversation {sessionId: $sessionId, accountId: $accountId})-[:HAS_TRANSCRIPT]->(t:ClaudeSession)
|
|
4694
4694
|
RETURN t.claudeSessionId AS claudeSessionId
|
|
4695
4695
|
ORDER BY t.createdAt ASC`,
|
|
4696
|
-
{
|
|
4696
|
+
{ sessionId, accountId }
|
|
4697
4697
|
);
|
|
4698
4698
|
return result.records.map((r) => r.get("claudeSessionId")).filter((v) => typeof v === "string" && v.length > 0);
|
|
4699
4699
|
} finally {
|
|
4700
4700
|
await session.close();
|
|
4701
4701
|
}
|
|
4702
4702
|
}
|
|
4703
|
-
async function
|
|
4703
|
+
async function getSessionIdByClaudeSessionId(claudeSessionId, accountId) {
|
|
4704
4704
|
const session = getSession();
|
|
4705
4705
|
try {
|
|
4706
4706
|
const result = await session.run(
|
|
4707
4707
|
`MATCH (c:Conversation {accountId: $accountId})-[:HAS_TRANSCRIPT]->(t:ClaudeSession {claudeSessionId: $claudeSessionId})
|
|
4708
|
-
RETURN c.
|
|
4708
|
+
RETURN c.sessionId AS sessionId
|
|
4709
4709
|
LIMIT 1`,
|
|
4710
4710
|
{ claudeSessionId, accountId }
|
|
4711
4711
|
);
|
|
4712
|
-
const value = result.records[0]?.get("
|
|
4712
|
+
const value = result.records[0]?.get("sessionId");
|
|
4713
4713
|
return typeof value === "string" && value.length > 0 ? value : null;
|
|
4714
4714
|
} finally {
|
|
4715
4715
|
await session.close();
|
|
4716
4716
|
}
|
|
4717
4717
|
}
|
|
4718
|
-
async function renameConversation(
|
|
4718
|
+
async function renameConversation(sessionId, label) {
|
|
4719
4719
|
let embedding = null;
|
|
4720
4720
|
try {
|
|
4721
4721
|
embedding = await embed(label);
|
|
@@ -4725,12 +4725,12 @@ async function renameConversation(conversationId, label) {
|
|
|
4725
4725
|
const session = getSession();
|
|
4726
4726
|
try {
|
|
4727
4727
|
await session.run(
|
|
4728
|
-
`MATCH (c:Conversation {
|
|
4728
|
+
`MATCH (c:Conversation {sessionId: $sessionId})
|
|
4729
4729
|
SET c.name = $label, c.updatedAt = datetime()
|
|
4730
4730
|
${embedding ? ", c.embedding = $embedding" : ""}`,
|
|
4731
|
-
{
|
|
4731
|
+
{ sessionId, label, ...embedding ? { embedding } : {} }
|
|
4732
4732
|
);
|
|
4733
|
-
console.error(`[persist] manual-label: renamed ${
|
|
4733
|
+
console.error(`[persist] manual-label: renamed ${sessionId} to "${label}"${embedding ? " (embedded)" : ""}`);
|
|
4734
4734
|
} finally {
|
|
4735
4735
|
await session.close();
|
|
4736
4736
|
}
|
|
@@ -4982,9 +4982,9 @@ function loadEnabledPluginProfileKeys(accountId) {
|
|
|
4982
4982
|
return out;
|
|
4983
4983
|
}
|
|
4984
4984
|
var sparseStateLogged = /* @__PURE__ */ new Set();
|
|
4985
|
-
async function loadUserProfile(accountId, userId,
|
|
4985
|
+
async function loadUserProfile(accountId, userId, sessionId) {
|
|
4986
4986
|
console.error(
|
|
4987
|
-
`[profile] loadUserProfile entry accountId=${accountId.slice(0, 8)}\u2026 userId=${userId}
|
|
4987
|
+
`[profile] loadUserProfile entry accountId=${accountId.slice(0, 8)}\u2026 userId=${userId} sessionId=${sessionId ? `${sessionId.slice(0, 8)}\u2026` : "<none>"}`
|
|
4988
4988
|
);
|
|
4989
4989
|
const session = getSession();
|
|
4990
4990
|
try {
|
|
@@ -5108,14 +5108,14 @@ async function loadUserProfile(accountId, userId, conversationId) {
|
|
|
5108
5108
|
return typeof v !== "string" || v.trim().length === 0;
|
|
5109
5109
|
});
|
|
5110
5110
|
const sparseFired = absentCategories.length > 0 || absentFields.length > 0 || absentIdentity.length > 0;
|
|
5111
|
-
if (
|
|
5112
|
-
const dedupeKey = `${accountId}:${userId}:${
|
|
5111
|
+
if (sessionId && sparseFired) {
|
|
5112
|
+
const dedupeKey = `${accountId}:${userId}:${sessionId}`;
|
|
5113
5113
|
if (!sparseStateLogged.has(dedupeKey)) {
|
|
5114
5114
|
sparseStateLogged.add(dedupeKey);
|
|
5115
5115
|
const FIELDS_LOG_CAP = 10;
|
|
5116
5116
|
const absentFieldsTruncated = absentFields.length <= FIELDS_LOG_CAP ? absentFields.join(",") : `${absentFields.slice(0, FIELDS_LOG_CAP).join(",")}+${absentFields.length - FIELDS_LOG_CAP} more`;
|
|
5117
5117
|
console.error(
|
|
5118
|
-
`[profile] sparse-state injected accountId=${accountId.slice(0, 8)}\u2026 userId=${userId}
|
|
5118
|
+
`[profile] sparse-state injected accountId=${accountId.slice(0, 8)}\u2026 userId=${userId} sessionId=${sessionId.slice(0, 8)}\u2026 absentCategories=${absentCategories.join(",")} absentFields=${absentFieldsTruncated || "none"} absentIdentity=${absentIdentity.map((k) => k.token).join(",") || "none"}`
|
|
5119
5119
|
);
|
|
5120
5120
|
}
|
|
5121
5121
|
}
|
|
@@ -5395,10 +5395,10 @@ var requireAdminSession = async (c, next) => {
|
|
|
5395
5395
|
console.log(`[admin-auth] outcome=accept path=${c.req.path} cacheKey=${fingerprint.slice(0, 8)}\u2026`);
|
|
5396
5396
|
await next();
|
|
5397
5397
|
};
|
|
5398
|
-
async function tryCookieBridgeForConversation(c, cacheKey2,
|
|
5398
|
+
async function tryCookieBridgeForConversation(c, cacheKey2, sessionId) {
|
|
5399
5399
|
const path = c.req.path;
|
|
5400
5400
|
const sk8 = cacheKey2.slice(0, 8);
|
|
5401
|
-
const cid8 =
|
|
5401
|
+
const cid8 = sessionId.slice(0, 8);
|
|
5402
5402
|
const client = resolveClientIp(
|
|
5403
5403
|
c.env?.incoming?.socket?.remoteAddress,
|
|
5404
5404
|
c.req.header("x-forwarded-for")
|
|
@@ -5406,31 +5406,31 @@ async function tryCookieBridgeForConversation(c, cacheKey2, conversationId) {
|
|
|
5406
5406
|
if (client.kind === "external") {
|
|
5407
5407
|
const cookieToken = parseCookieValue(c.req.header("cookie"), "__remote_session");
|
|
5408
5408
|
if (!cookieToken) {
|
|
5409
|
-
console.error(`[session] cookie-bridge-rejected reason=no-cookie path=${path} cacheKey=${sk8}\u2026
|
|
5409
|
+
console.error(`[session] cookie-bridge-rejected reason=no-cookie path=${path} cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026`);
|
|
5410
5410
|
return { ok: false, reason: "no-cookie" };
|
|
5411
5411
|
}
|
|
5412
5412
|
const desc = describeRemoteSession(cookieToken);
|
|
5413
5413
|
if (!desc.present) {
|
|
5414
|
-
console.error(`[session] cookie-bridge-rejected reason=cookie-invalid path=${path} cacheKey=${sk8}\u2026
|
|
5414
|
+
console.error(`[session] cookie-bridge-rejected reason=cookie-invalid path=${path} cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026`);
|
|
5415
5415
|
return { ok: false, reason: "cookie-invalid" };
|
|
5416
5416
|
}
|
|
5417
5417
|
if (desc.expired) {
|
|
5418
|
-
console.error(`[session] cookie-bridge-rejected reason=cookie-expired path=${path} cacheKey=${sk8}\u2026
|
|
5418
|
+
console.error(`[session] cookie-bridge-rejected reason=cookie-expired path=${path} cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026`);
|
|
5419
5419
|
return { ok: false, reason: "cookie-expired" };
|
|
5420
5420
|
}
|
|
5421
5421
|
}
|
|
5422
|
-
const owner = await getConversationOwner(
|
|
5422
|
+
const owner = await getConversationOwner(sessionId);
|
|
5423
5423
|
if (!owner) {
|
|
5424
|
-
console.error(`[session] cookie-bridge-rejected reason=conversation-not-found path=${path} cacheKey=${sk8}\u2026
|
|
5424
|
+
console.error(`[session] cookie-bridge-rejected reason=conversation-not-found path=${path} cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026`);
|
|
5425
5425
|
return { ok: false, reason: "conversation-not-found" };
|
|
5426
5426
|
}
|
|
5427
5427
|
const deviceAccount = resolveAccount();
|
|
5428
5428
|
if (!deviceAccount || owner.accountId !== deviceAccount.accountId) {
|
|
5429
|
-
console.error(`[session] cookie-bridge-rejected reason=account-mismatch path=${path} cacheKey=${sk8}\u2026
|
|
5429
|
+
console.error(`[session] cookie-bridge-rejected reason=account-mismatch path=${path} cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026 conversationAccountId=${owner.accountId.slice(0, 8)}\u2026 deviceAccountId=${(deviceAccount?.accountId ?? "none").slice(0, 8)}\u2026`);
|
|
5430
5430
|
return { ok: false, reason: "account-mismatch" };
|
|
5431
5431
|
}
|
|
5432
5432
|
registerSession(cacheKey2, "admin", owner.accountId, void 0, owner.userId ?? void 0);
|
|
5433
|
-
console.log(`[session] cookie-bridge accountId=${owner.accountId.slice(0, 8)}\u2026 cacheKey=${sk8}\u2026
|
|
5433
|
+
console.log(`[session] cookie-bridge accountId=${owner.accountId.slice(0, 8)}\u2026 cacheKey=${sk8}\u2026 sessionId=${cid8}\u2026 path=${path}`);
|
|
5434
5434
|
return { ok: true };
|
|
5435
5435
|
}
|
|
5436
5436
|
function requireAdminCookie(isPublicHost) {
|
|
@@ -5514,11 +5514,11 @@ export {
|
|
|
5514
5514
|
getUserIdForSession,
|
|
5515
5515
|
getUserNameForSession,
|
|
5516
5516
|
getRoleForSession,
|
|
5517
|
-
|
|
5518
|
-
|
|
5517
|
+
getSessionIdForSession,
|
|
5518
|
+
setSessionIdForSession,
|
|
5519
5519
|
setWantsPriorConversation,
|
|
5520
5520
|
unregisterSession,
|
|
5521
|
-
|
|
5521
|
+
getSessionKeyBySessionId,
|
|
5522
5522
|
findMissingPlugins,
|
|
5523
5523
|
walkPremiumBundles,
|
|
5524
5524
|
autoDeliverPremiumPlugins,
|
|
@@ -5542,7 +5542,7 @@ export {
|
|
|
5542
5542
|
deleteConversation,
|
|
5543
5543
|
linkConversationTranscript,
|
|
5544
5544
|
getConversationClaudeSessionIds,
|
|
5545
|
-
|
|
5545
|
+
getSessionIdByClaudeSessionId,
|
|
5546
5546
|
renameConversation,
|
|
5547
5547
|
getUserTimezone,
|
|
5548
5548
|
loadAdminUserName,
|