@rubytech/create-realagent-code 0.1.254 → 0.1.256
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/plugin-install.test.js +58 -40
- package/dist/index.js +77 -26
- package/dist/lib/plugin-install.js +31 -29
- package/package.json +1 -1
- package/payload/platform/.docs/search-surface-contract.md +58 -0
- package/payload/platform/config/brand-registry.json +8 -0
- package/payload/platform/config/brand.json +2 -2
- package/payload/platform/lib/embed-client/dist/index.d.ts +4 -0
- package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/embed-client/dist/index.js +53 -0
- package/payload/platform/lib/embed-client/dist/index.js.map +1 -0
- package/payload/platform/lib/embed-client/src/index.ts +53 -0
- package/payload/platform/lib/embed-client/tsconfig.json +8 -0
- package/payload/platform/lib/graph-search/dist/index.d.ts +27 -6
- package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-search/dist/index.js +19 -1
- package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +12 -0
- package/payload/platform/lib/graph-search/src/index.ts +28 -6
- package/payload/platform/lib/graph-write/dist/index.d.ts +25 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +80 -2
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/index.ts +98 -1
- package/payload/platform/neo4j/schema.cypher +126 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +3 -6
- package/payload/platform/plugins/admin/mcp/dist/index.js +14 -60
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/insight/SKILL.md +24 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +84 -31
- package/payload/platform/plugins/docs/PLUGIN.md +1 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +18 -5
- package/payload/platform/plugins/docs/references/graph.md +2 -0
- package/payload/platform/plugins/docs/references/internals.md +12 -1
- package/payload/platform/plugins/docs/references/memory-guide.md +4 -0
- package/payload/platform/plugins/docs/references/neo4j.md +2 -2
- package/payload/platform/plugins/docs/references/platform.md +1 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/platform/plugins/docs/references/session-retrospective.md +5 -18
- package/payload/platform/plugins/docs/references/slides.md +31 -0
- package/payload/platform/plugins/docs/references/voice-mirror-guide.md +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +2 -2
- package/payload/platform/plugins/email/mcp/dist/index.js +8 -0
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +19 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +64 -0
- package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +4 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +6 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +7 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
- package/payload/platform/plugins/email/references/email-reference.md +4 -0
- package/payload/platform/plugins/memory/PLUGIN.md +1 -2
- package/payload/platform/plugins/memory/mcp/dist/index.js +6 -44
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js +41 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js +90 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js +27 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts +10 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js +47 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +1 -2
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +5 -28
- package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js +20 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js +67 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +34 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js +61 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +23 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js +87 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +3 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js +34 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +19 -4
- package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -6
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +280 -10
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +76 -37
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +11 -2
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +4 -4
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +3 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +20 -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.js +6 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
- package/payload/platform/plugins/memory/references/schema-base.md +1 -1
- package/payload/platform/plugins/memory/references/schema-construction.md +72 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js +15 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js.map +1 -1
- package/payload/platform/plugins/slides/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/slides/LICENSE +21 -0
- package/payload/platform/plugins/slides/PLUGIN.md +18 -0
- package/payload/platform/plugins/slides/PROVENANCE.md +40 -0
- package/payload/platform/plugins/slides/commands/add-slide.md +29 -0
- package/payload/platform/plugins/slides/commands/slides-claus.md +39 -0
- package/payload/platform/plugins/slides/commands/slides-new-component.md +39 -0
- package/payload/platform/plugins/slides/commands/slides-outline.md +43 -0
- package/payload/platform/plugins/slides/commands/slides-review.md +52 -0
- package/payload/platform/plugins/slides/commands/slides-theme.md +64 -0
- package/payload/platform/plugins/slides/commands/slides.md +59 -0
- package/payload/platform/plugins/slides/skills/deck-system/REFERENCE.md +581 -0
- package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +607 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-board.md +426 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-claus.md +185 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-mbb.md +450 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-product-launch.md +579 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sales.md +464 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sequoia.md +489 -0
- package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING.md +273 -0
- package/payload/platform/plugins/slides/skills/deck-system/deck-craft.html +1371 -0
- package/payload/platform/plugins/slides/skills/deck-system/deck-solid.html +1667 -0
- package/payload/platform/plugins/slides/skills/deck-system/deck.html +1359 -0
- package/payload/platform/plugins/url-get/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/url-get/PLUGIN.md +26 -21
- package/payload/platform/plugins/url-get/mcp/dist/index.js +3 -3
- package/payload/platform/plugins/url-get/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts +1 -2
- package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts.map +1 -1
- package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +20 -40
- package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +4 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
- package/payload/platform/scripts/identity-forbidden-token-check.mjs +0 -1
- package/payload/platform/scripts/setup-account.sh +0 -15
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +23 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +29 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -2
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -2
- 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.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +8 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts +13 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +26 -2
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -2
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +12 -3
- 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 +3 -2
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -2
- package/payload/platform/templates/specialists/agents/database-operator.md +3 -7
- package/payload/platform/templates/specialists/agents/typed-edge-classifier.md +1 -1
- package/payload/server/{chunk-M6A6EZD4.js → chunk-76HRO7NX.js} +16 -2
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/AdminShell-T-YknnBn.js +1 -0
- package/payload/server/public/assets/Checkbox-DmDxpqVv.js +1 -0
- package/payload/server/public/assets/admin-COUV-jgt.js +1 -0
- package/payload/server/public/assets/{arc-aUiRP9AS.js → arc-B2CweJq3.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Dnn6Hc65.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-c09loTER.js → architectureDiagram-Q4EWVU46-DP2o-MFV.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cjdeyoq1.js → blockDiagram-DXYQGD6D-DO4mcYDJ.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-NY6Wlzo2.js → c4Diagram-AHTNJAMY-Sy1giHbj.js} +1 -1
- package/payload/server/public/assets/channel-CEpR_0rE.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-BK3470lx.js → chunk-2KRD3SAO-CKsCYCsN.js} +1 -1
- package/payload/server/public/assets/chunk-336JU56O-C0-P-aUF.js +2 -0
- package/payload/server/public/assets/chunk-426QAEUC-DFjEt3Zb.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-BOvVdJLf.js → chunk-4BX2VUAB-B8bqAmBa.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-BXpto3yW.js → chunk-4TB4RGXK-D1k0VSlW.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-BwZyF7vR.js → chunk-55IACEB6-B-p_QNqz.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-C403gCUk.js → chunk-5FUZZQ4R-D6U6tV_j.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CjVzXQEp.js → chunk-5PVQY5BW-CYK76xfs.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-D5bhMrtY.js → chunk-67CJDMHE-BC9js-lf.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-Si7Lgrwc.js → chunk-7N4EOEYR-4j2OqKkv.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-DMuHtDqO.js → chunk-AA7GKIK3-Coen-fXN.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-L79XKVcb.js → chunk-BSJP7CBP-CAiOBvec.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-C0O7Upmg.js → chunk-CIAEETIT-AJzzpZVb.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-DJcJAsAg.js → chunk-EDXVE4YY-BL4BKozX.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CFDNvYu1.js → chunk-ENJZ2VHE-mhAFG8UD.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-C_E43NFJ.js → chunk-FMBD7UC4-H231gZA_.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-D9lWWHAu.js → chunk-FOC6F5B3-Cl3ZZjYG.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-ecLOxGhL.js → chunk-ICPOFSXX-DOEzvzJa.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-DuhsNH4c.js → chunk-K5T4RW27-C_ipbUDD.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-B4-A1Abi.js → chunk-KGLVRYIC-CTsDNSCU.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-BxqgHRgT.js → chunk-LIHQZDEY-DvSXhkGf.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-DEYQ5WaJ.js → chunk-ORNJ4GCN-p574NOI7.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-B7MW66KB.js → chunk-OYMX7WX6-BlEgFM6U.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-DpF06ZZQ.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-BMawmsyk.js → chunk-U2HBQHQK-B2bDK0jv.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-CT6g7pno.js → chunk-X2U36JSP-D69BxKFw.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-CBfZXZDB.js → chunk-XPW4576I-Dm-PcyUi.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-xeAluiAH.js → chunk-YZCP3GAM-Be8RnXgx.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-BRN9qUC5.js → chunk-ZZ45TVLE-Ck8PCTa4.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-CYbXvKLI.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DEyHzRhq.js +1 -0
- package/payload/server/public/assets/clone-y8gexbBy.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Br2gjtEO.js → cose-bilkent-S5V4N54A-CmkW2Eaj.js} +1 -1
- package/payload/server/public/assets/{dagre-DTjePoco.js → dagre-Dqp-ns8F.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-DHBkRke4.js → dagre-KV5264BT-ZgWWXPLc.js} +1 -1
- package/payload/server/public/assets/data-gy6QH9c1.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BIq1-idL.js → diagram-5BDNPKRD-CTX5-ScM.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-BsIUDzV6.js → diagram-G4DWMVQ6-BovIsO6H.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-CgHSri2i.js → diagram-MMDJMWI5-DcETsQy-.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-Ce2Wh9ZX.js → diagram-TYMM5635-yyq6peoZ.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BU0Kh6OQ.js → erDiagram-SMLLAGMA-CiNToftB.js} +1 -1
- package/payload/server/public/assets/{flatten-Bo6YRmWl.js → flatten-BtFI066E.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-B0N06MF7.js → flowDiagram-DWJPFMVM-Xnl3SpIM.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BVbx4ARZ.js → ganttDiagram-T4ZO3ILL-C1iyWe0f.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-CNs-LD5i.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C-xRJ94t.js → gitGraphDiagram-UUTBAWPF-D97pbMQb.js} +1 -1
- package/payload/server/public/assets/graph-labels-cZu4pK16.js +1 -0
- package/payload/server/public/assets/{graph-g48ZcA5M.js → graph-qz5tFKqU.js} +3 -3
- package/payload/server/public/assets/{graphlib-YmNcoMjY.js → graphlib-Lq8ijgON.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-DsTNigSS.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-C_OarRTA.js +2 -0
- package/payload/server/public/assets/{isEmpty-D6Kr-M1M.js → isEmpty-D6QovjYR.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DTrq54yC.js → ishikawaDiagram-UXIWVN3A-B8XBdjJn.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-OZZZMrFX.js → journeyDiagram-VCZTEJTY-CZYbiOaQ.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY--w-IP9pN.js → kanban-definition-6JOO6SKY-B1PybFoh.js} +1 -1
- package/payload/server/public/assets/{line-Ckeulv5T.js → line-D-tw3hHp.js} +1 -1
- package/payload/server/public/assets/{linear-DOh_6k2k.js → linear-BHhXD3cd.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-CVRAxYRD.js → mermaid-parser.core-C9RAnysF.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-B-mE18I1.js → mermaid.core-B532LT1r.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Bm8mDicL.js → mindmap-definition-QFDTVHPH-DGlgeeTV.js} +1 -1
- package/payload/server/public/assets/{ordinal-BDi6f4xk.js → ordinal-Bl-aM5b9.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DGES22b-.js +1 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-ChKeDbzt.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BCmRLgGO.js → pieDiagram-DEJITSTG-DV9FIWko.js} +1 -1
- package/payload/server/public/assets/{public-DknO-g9S.js → public-Bu2_Xi0a.js} +5 -5
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CniTIUTm.js → quadrantDiagram-34T5L4WZ-Betwya4l.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-FGG5Fs7N.js +1 -0
- package/payload/server/public/assets/{reduce-CGi9ik8i.js → reduce-BD4xUd2c.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-CoxBSj9M.js → requirementDiagram-MS252O5E-Cq3vODdg.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BjS-4jzq.js → sankeyDiagram-XADWPNL6-x8krXWcS.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B9jVOnPR.js → sequenceDiagram-FGHM5R23-i-_uH-Yl.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BvOQPzP8.js → stateDiagram-FHFEXIEX-il4KqSgI.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B6zNJ6Tv.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CdfgWLo1.js → timeline-definition-GMOUNBTQ-DATdZkA5.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-VAQQdbtf.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-DKchO3zI.js +1 -0
- package/payload/server/public/assets/useSelectionMode-A5KItZ2T.js +13 -0
- package/payload/server/public/assets/{brand-D0gNihp7.css → useSelectionMode-C-Ojh7W9.css} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-JCgpIbj-.js → vennDiagram-DHZGUBPP-BJh9tJTt.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-CBGtx0bS.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dei3VqHo.js → wardleyDiagram-NUSXRM2D-EMN1Hdfg.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DUtIyoIb.js → xychartDiagram-5P7HB3ND-DbUWXa7T.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +5 -6
- package/payload/server/public/public.html +4 -5
- package/payload/server/server.js +525 -39
- package/payload/platform/plugins/admin/hooks/__tests__/session-end-retrospective.test.sh +0 -396
- package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +0 -239
- package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +0 -214
- package/payload/server/public/assets/AdminShell-892Jy_rs.js +0 -1
- package/payload/server/public/assets/Checkbox-Bc2QzX9b.js +0 -1
- package/payload/server/public/assets/admin-D3K13ndi.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +0 -1
- package/payload/server/public/assets/brand-CcN3dELF.js +0 -9
- package/payload/server/public/assets/channel-B1IT7to2.js +0 -1
- package/payload/server/public/assets/chunk-336JU56O-CdKRCIeE.js +0 -2
- package/payload/server/public/assets/chunk-426QAEUC-BybuQ3Ve.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-rjCize6i.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BORWOUt0.js +0 -1
- package/payload/server/public/assets/clone-Csqv5U6T.js +0 -1
- package/payload/server/public/assets/data-Br-pdljK.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +0 -1
- package/payload/server/public/assets/graph-labels-BYH-IPCb.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-Di6oPQ_-.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-v4ND10uR.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +0 -1
- package/payload/server/public/assets/useSelectionMode-DwsyptOw.js +0 -5
- package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +0 -1
- /package/payload/server/public/assets/{_baseFor-Cam2PbSt.js → _baseFor-Cs8Y-rGh.js} +0 -0
- /package/payload/server/public/assets/{array-DYRGGQae.js → array-iHZP4KWJ.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-nWsJMTNI.js → cytoscape.esm-BR2GOQ8_.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-Du1XY3Dp.js → defaultLocale-B9aLeOTg.js} +0 -0
- /package/payload/server/public/assets/{dist-BzAsli7o.js → dist-DB-VPj_8.js} +0 -0
- /package/payload/server/public/assets/{init-B5BXBRcm.js → init-BNFRgqHM.js} +0 -0
- /package/payload/server/public/assets/{katex-HOUACuRw.js → katex-B-EfS3nw.js} +0 -0
- /package/payload/server/public/assets/{path-CNO468J-.js → path-DmWWdwp7.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-DRO6hWPh.js → rough.esm-Ci7Kjt46.js} +0 -0
- /package/payload/server/public/assets/{src-CWiyyVfn.js → src-C1jfwBq0.js} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -93,7 +93,7 @@ import {
|
|
|
93
93
|
vncLog,
|
|
94
94
|
walkPremiumBundles,
|
|
95
95
|
writeAdminUserAndPerson
|
|
96
|
-
} from "./chunk-
|
|
96
|
+
} from "./chunk-76HRO7NX.js";
|
|
97
97
|
import {
|
|
98
98
|
__commonJS,
|
|
99
99
|
__require,
|
|
@@ -5211,6 +5211,379 @@ var require_dist3 = __commonJS({
|
|
|
5211
5211
|
}
|
|
5212
5212
|
});
|
|
5213
5213
|
|
|
5214
|
+
// ../lib/graph-write/dist/audit.js
|
|
5215
|
+
var require_audit = __commonJS({
|
|
5216
|
+
"../lib/graph-write/dist/audit.js"(exports) {
|
|
5217
|
+
"use strict";
|
|
5218
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5219
|
+
exports.auditCypherWrite = auditCypherWrite;
|
|
5220
|
+
exports.formatAuditLine = formatAuditLine;
|
|
5221
|
+
var EDGE_PATTERN = /\[[^\]]*?:([A-Z_][A-Za-z0-9_]*(?:\|[A-Z_][A-Za-z0-9_]*)*)[^\]]*?\]/g;
|
|
5222
|
+
var CREATE_OR_MERGE_NODE = /\b(?:CREATE|MERGE)\s*\(\s*[A-Za-z_][A-Za-z0-9_]*\s*:\s*[A-Z]/g;
|
|
5223
|
+
var PROVENANCE_TOKEN = /\bcreatedBy(?:Agent|Tool|Session|Source)\b/g;
|
|
5224
|
+
function stripStringLiterals(cypher) {
|
|
5225
|
+
return cypher.replace(/'[^']*'|"[^"]*"/g, '""');
|
|
5226
|
+
}
|
|
5227
|
+
function extractEdgeTypes(cleaned) {
|
|
5228
|
+
const out = /* @__PURE__ */ new Set();
|
|
5229
|
+
for (const m of cleaned.matchAll(EDGE_PATTERN)) {
|
|
5230
|
+
for (const t of m[1].split("|")) {
|
|
5231
|
+
const clean = t.trim();
|
|
5232
|
+
if (clean)
|
|
5233
|
+
out.add(clean);
|
|
5234
|
+
}
|
|
5235
|
+
}
|
|
5236
|
+
return out;
|
|
5237
|
+
}
|
|
5238
|
+
function countCreateOrMergeNodes(cleaned) {
|
|
5239
|
+
const matches = cleaned.match(CREATE_OR_MERGE_NODE);
|
|
5240
|
+
return matches ? matches.length : 0;
|
|
5241
|
+
}
|
|
5242
|
+
function countProvenanceStamps(cleaned) {
|
|
5243
|
+
const matches = cleaned.match(PROVENANCE_TOKEN);
|
|
5244
|
+
return matches ? matches.length : 0;
|
|
5245
|
+
}
|
|
5246
|
+
function auditCypherWrite(input) {
|
|
5247
|
+
const warnings = [];
|
|
5248
|
+
const cleaned = stripStringLiterals(input.cypher);
|
|
5249
|
+
const referencedTypes = extractEdgeTypes(cleaned);
|
|
5250
|
+
for (const t of referencedTypes) {
|
|
5251
|
+
if (!input.schema.relationshipTypes.has(t)) {
|
|
5252
|
+
warnings.push({ kind: "unknown-type-warning", type: t });
|
|
5253
|
+
}
|
|
5254
|
+
}
|
|
5255
|
+
if (input.nodesCreated > 0) {
|
|
5256
|
+
const createOrMergeNodes = countCreateOrMergeNodes(cleaned);
|
|
5257
|
+
if (createOrMergeNodes > 0) {
|
|
5258
|
+
const stamps = countProvenanceStamps(cleaned);
|
|
5259
|
+
if (stamps < createOrMergeNodes) {
|
|
5260
|
+
warnings.push({
|
|
5261
|
+
kind: "missing-provenance-warning",
|
|
5262
|
+
created: createOrMergeNodes,
|
|
5263
|
+
stamped: stamps
|
|
5264
|
+
});
|
|
5265
|
+
}
|
|
5266
|
+
}
|
|
5267
|
+
}
|
|
5268
|
+
if (input.orphanIds.length > 0) {
|
|
5269
|
+
warnings.push({ kind: "orphan-warning", orphanIds: input.orphanIds });
|
|
5270
|
+
}
|
|
5271
|
+
return warnings;
|
|
5272
|
+
}
|
|
5273
|
+
function formatAuditLine(line) {
|
|
5274
|
+
const prefixField = `query="${line.cypherPrefix.replace(/"/g, "'")}"`;
|
|
5275
|
+
switch (line.kind) {
|
|
5276
|
+
case "accepted":
|
|
5277
|
+
return `[graph-cypher-write] accepted ${prefixField} nodesCreated=${line.nodesCreated} relsCreated=${line.relsCreated} agentName=${line.agentName} sessionId=${line.sessionId}`;
|
|
5278
|
+
case "orphan-warning":
|
|
5279
|
+
return `[graph-cypher-write] orphan-warning ${prefixField} orphanIds=${line.orphanIds.join(",")}`;
|
|
5280
|
+
case "unknown-type-warning":
|
|
5281
|
+
return `[graph-cypher-write] unknown-type-warning ${prefixField} type=${line.type}`;
|
|
5282
|
+
case "missing-provenance-warning":
|
|
5283
|
+
return `[graph-cypher-write] missing-provenance-warning ${prefixField} created=${line.created} stamped=${line.stamped}`;
|
|
5284
|
+
}
|
|
5285
|
+
}
|
|
5286
|
+
}
|
|
5287
|
+
});
|
|
5288
|
+
|
|
5289
|
+
// ../lib/graph-write/dist/conversation-provenance.js
|
|
5290
|
+
var require_conversation_provenance = __commonJS({
|
|
5291
|
+
"../lib/graph-write/dist/conversation-provenance.js"(exports) {
|
|
5292
|
+
"use strict";
|
|
5293
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5294
|
+
exports.injectConversationProvenance = injectConversationProvenance;
|
|
5295
|
+
var index_js_1 = require_dist4();
|
|
5296
|
+
async function injectConversationProvenance(params) {
|
|
5297
|
+
const { session, relationships, accountId, writeLabels, conversationNodeId, logNamespace, tool } = params;
|
|
5298
|
+
const original = [...relationships];
|
|
5299
|
+
if (!writeLabels.some((l) => index_js_1.ACTION_PROVENANCE_LABELS.has(l)))
|
|
5300
|
+
return original;
|
|
5301
|
+
if (!conversationNodeId)
|
|
5302
|
+
return original;
|
|
5303
|
+
if (hasInboundProducedEdge(original))
|
|
5304
|
+
return original;
|
|
5305
|
+
let lookup;
|
|
5306
|
+
try {
|
|
5307
|
+
lookup = await session.run(`MATCH (c:Conversation {sessionId: $cid, accountId: $accountId})
|
|
5308
|
+
RETURN elementId(c) AS elementId, labels(c) AS labels LIMIT 1`, { cid: conversationNodeId, accountId });
|
|
5309
|
+
} catch (err) {
|
|
5310
|
+
process.stderr.write(`[${logNamespace}] [provenance-missing] tool=${tool} reason=driver-error message=${err instanceof Error ? err.message : String(err)} conversationNodeId=${conversationNodeId}
|
|
5311
|
+
`);
|
|
5312
|
+
return original;
|
|
5313
|
+
}
|
|
5314
|
+
if (lookup.records.length === 0) {
|
|
5315
|
+
process.stderr.write(`[${logNamespace}] [provenance-missing] tool=${tool} reason=node-not-found conversationNodeId=${conversationNodeId}
|
|
5316
|
+
`);
|
|
5317
|
+
return original;
|
|
5318
|
+
}
|
|
5319
|
+
const elementId = lookup.records[0].get("elementId");
|
|
5320
|
+
const labels = lookup.records[0].get("labels");
|
|
5321
|
+
const sourceLabel = labels.find((l) => index_js_1.PROVENANCE_SOURCE_LABELS.has(l));
|
|
5322
|
+
if (!sourceLabel) {
|
|
5323
|
+
process.stderr.write(`[${logNamespace}] [provenance-missing] tool=${tool} reason=wrong-source-label labels=${labels.join(",")} conversationNodeId=${conversationNodeId}
|
|
5324
|
+
`);
|
|
5325
|
+
return original;
|
|
5326
|
+
}
|
|
5327
|
+
process.stderr.write(`[${logNamespace}] [provenance-inject] tool=${tool} from=${sourceLabel}:${conversationNodeId}
|
|
5328
|
+
`);
|
|
5329
|
+
return [
|
|
5330
|
+
{
|
|
5331
|
+
type: "PRODUCED",
|
|
5332
|
+
direction: "incoming",
|
|
5333
|
+
targetNodeId: elementId
|
|
5334
|
+
},
|
|
5335
|
+
...original
|
|
5336
|
+
];
|
|
5337
|
+
}
|
|
5338
|
+
function hasInboundProducedEdge(relationships) {
|
|
5339
|
+
return relationships.some((r) => r.type === "PRODUCED" && r.direction === "incoming");
|
|
5340
|
+
}
|
|
5341
|
+
}
|
|
5342
|
+
});
|
|
5343
|
+
|
|
5344
|
+
// ../lib/graph-write/dist/index.js
|
|
5345
|
+
var require_dist4 = __commonJS({
|
|
5346
|
+
"../lib/graph-write/dist/index.js"(exports) {
|
|
5347
|
+
"use strict";
|
|
5348
|
+
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
5349
|
+
if (k2 === void 0) k2 = k;
|
|
5350
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5351
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5352
|
+
desc = { enumerable: true, get: function() {
|
|
5353
|
+
return m[k];
|
|
5354
|
+
} };
|
|
5355
|
+
}
|
|
5356
|
+
Object.defineProperty(o, k2, desc);
|
|
5357
|
+
}) : (function(o, m, k, k2) {
|
|
5358
|
+
if (k2 === void 0) k2 = k;
|
|
5359
|
+
o[k2] = m[k];
|
|
5360
|
+
}));
|
|
5361
|
+
var __exportStar = exports && exports.__exportStar || function(m, exports2) {
|
|
5362
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p);
|
|
5363
|
+
};
|
|
5364
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5365
|
+
exports.DOCUMENT_ARCHIVE_LABELS = exports.VECTOR_INDEXED_LABELS = exports.PROVENANCE_SOURCE_LABELS = exports.ACTION_PROVENANCE_LABELS = void 0;
|
|
5366
|
+
exports.stampCreatedBy = stampCreatedBy;
|
|
5367
|
+
exports.writeNodeWithEdges = writeNodeWithEdges;
|
|
5368
|
+
__exportStar(require_audit(), exports);
|
|
5369
|
+
__exportStar(require_conversation_provenance(), exports);
|
|
5370
|
+
exports.ACTION_PROVENANCE_LABELS = /* @__PURE__ */ new Set([
|
|
5371
|
+
"Person",
|
|
5372
|
+
"UserProfile",
|
|
5373
|
+
"AdminUser",
|
|
5374
|
+
"Organization",
|
|
5375
|
+
"LocalBusiness",
|
|
5376
|
+
"CloudflareTunnel",
|
|
5377
|
+
"CloudflareHostname"
|
|
5378
|
+
]);
|
|
5379
|
+
exports.PROVENANCE_SOURCE_LABELS = /* @__PURE__ */ new Set([
|
|
5380
|
+
"Task",
|
|
5381
|
+
"Conversation",
|
|
5382
|
+
"Message"
|
|
5383
|
+
]);
|
|
5384
|
+
function requiresActionProvenance(labels) {
|
|
5385
|
+
for (const label of labels) {
|
|
5386
|
+
if (exports.ACTION_PROVENANCE_LABELS.has(label))
|
|
5387
|
+
return true;
|
|
5388
|
+
}
|
|
5389
|
+
return false;
|
|
5390
|
+
}
|
|
5391
|
+
exports.VECTOR_INDEXED_LABELS = /* @__PURE__ */ new Set([
|
|
5392
|
+
"Question",
|
|
5393
|
+
"DefinedTerm",
|
|
5394
|
+
"Review",
|
|
5395
|
+
"Service",
|
|
5396
|
+
"Person",
|
|
5397
|
+
"LocalBusiness",
|
|
5398
|
+
"Organization",
|
|
5399
|
+
"PriceSpecification",
|
|
5400
|
+
"Task",
|
|
5401
|
+
"CreativeWork",
|
|
5402
|
+
"DigitalDocument",
|
|
5403
|
+
"KnowledgeDocument",
|
|
5404
|
+
"ConversationArchive",
|
|
5405
|
+
"Section",
|
|
5406
|
+
"Chunk",
|
|
5407
|
+
"Project",
|
|
5408
|
+
"Position",
|
|
5409
|
+
"Conversation",
|
|
5410
|
+
"Message",
|
|
5411
|
+
"Event",
|
|
5412
|
+
"Workflow",
|
|
5413
|
+
"Preference",
|
|
5414
|
+
"Listing",
|
|
5415
|
+
"Idea",
|
|
5416
|
+
"TimelineEvent",
|
|
5417
|
+
"Report",
|
|
5418
|
+
"FileArtifact",
|
|
5419
|
+
// Construction vertical (Task 652) — the four text-bearing labels.
|
|
5420
|
+
"Job",
|
|
5421
|
+
"LineItem",
|
|
5422
|
+
"QuoteDocument",
|
|
5423
|
+
"VariationNote"
|
|
5424
|
+
]);
|
|
5425
|
+
exports.DOCUMENT_ARCHIVE_LABELS = /* @__PURE__ */ new Set([
|
|
5426
|
+
"KnowledgeDocument",
|
|
5427
|
+
"DigitalDocument",
|
|
5428
|
+
"ConversationArchive"
|
|
5429
|
+
]);
|
|
5430
|
+
function labelsAreIndexed(labels) {
|
|
5431
|
+
for (const l of labels)
|
|
5432
|
+
if (exports.VECTOR_INDEXED_LABELS.has(l))
|
|
5433
|
+
return true;
|
|
5434
|
+
return false;
|
|
5435
|
+
}
|
|
5436
|
+
function boundedEmbedText(labels, props) {
|
|
5437
|
+
const PER_VALUE = 2e3;
|
|
5438
|
+
const TOTAL = 8e3;
|
|
5439
|
+
const docPreferred = labels.some((l) => exports.DOCUMENT_ARCHIVE_LABELS.has(l));
|
|
5440
|
+
const parts = [`[${labels.join(", ")}]`];
|
|
5441
|
+
for (const [k, v] of Object.entries(props)) {
|
|
5442
|
+
if (v === null || v === void 0 || k === "embedding")
|
|
5443
|
+
continue;
|
|
5444
|
+
if (docPreferred && (k === "body" || k === "text"))
|
|
5445
|
+
continue;
|
|
5446
|
+
const s = String(v);
|
|
5447
|
+
parts.push(`${k}: ${s.length > PER_VALUE ? s.slice(0, PER_VALUE) : s}`);
|
|
5448
|
+
}
|
|
5449
|
+
const joined = parts.join(" | ");
|
|
5450
|
+
return joined.length > TOTAL ? joined.slice(0, TOTAL) : joined;
|
|
5451
|
+
}
|
|
5452
|
+
function findProvenanceCandidates(relationships) {
|
|
5453
|
+
return relationships.filter((r) => r.type === "PRODUCED" && r.direction === "incoming");
|
|
5454
|
+
}
|
|
5455
|
+
function stampCreatedBy(props, createdBy) {
|
|
5456
|
+
return {
|
|
5457
|
+
...props,
|
|
5458
|
+
createdByAgent: createdBy.agent ?? "unknown",
|
|
5459
|
+
createdBySession: createdBy.session ?? "unknown",
|
|
5460
|
+
createdByTool: createdBy.tool ?? null,
|
|
5461
|
+
createdBySource: createdBy.source ?? null
|
|
5462
|
+
};
|
|
5463
|
+
}
|
|
5464
|
+
async function writeNodeWithEdges(params) {
|
|
5465
|
+
const { session, labels, props, relationships, createdBy } = params;
|
|
5466
|
+
const agentLabel = createdBy.agent ?? createdBy.source ?? "unknown";
|
|
5467
|
+
const labelCsv = labels.join(",");
|
|
5468
|
+
const isSystemBootstrap = (createdBy.agent ?? "") === "system";
|
|
5469
|
+
if (!isSystemBootstrap) {
|
|
5470
|
+
const accountId = props.accountId;
|
|
5471
|
+
const expectedAccountId = params.expectedAccountId ?? process.env.ACCOUNT_ID;
|
|
5472
|
+
if (typeof accountId !== "string" || !expectedAccountId || accountId !== expectedAccountId) {
|
|
5473
|
+
const slice = typeof accountId === "string" ? accountId.slice(0, 8) : "missing";
|
|
5474
|
+
process.stderr.write(`[graph-write] reject reason=invalid-account-id accountId=${slice} writer=${agentLabel}
|
|
5475
|
+
`);
|
|
5476
|
+
throw new Error(`Write doctrine violated: invalid-account-id (${slice}) \u2014 accountId must equal ACCOUNT_ID set by the spawning process. See .docs/neo4j.md "Account isolation invariant".`);
|
|
5477
|
+
}
|
|
5478
|
+
}
|
|
5479
|
+
const reviewDigestActionTool = typeof props.actionTool === "string" && props.actionTool === "review-digest-compose";
|
|
5480
|
+
if (labels.includes("ReviewAlert") || reviewDigestActionTool) {
|
|
5481
|
+
const actionToolField = reviewDigestActionTool ? "review-digest-compose" : "n/a";
|
|
5482
|
+
process.stderr.write(`[graph-write] reject reason=removed-feature labels=${labelCsv} actionTool=${actionToolField} agent=${agentLabel}
|
|
5483
|
+
`);
|
|
5484
|
+
throw new Error("Write doctrine violated: review-detector feature removed \u2014 `:ReviewAlert` and `:Event {actionTool:'review-digest-compose'}` writes are not allowed.");
|
|
5485
|
+
}
|
|
5486
|
+
if (!relationships || relationships.length < 1) {
|
|
5487
|
+
process.stderr.write(`[graph-write] reject reason=zero-relationships labels=${labelCsv} agent=${agentLabel}
|
|
5488
|
+
`);
|
|
5489
|
+
throw new Error("Write doctrine violated: a node must be created with at least one relationship. See .docs/neo4j.md (Write doctrine).");
|
|
5490
|
+
}
|
|
5491
|
+
const indexed = labelsAreIndexed(labels);
|
|
5492
|
+
let embedded = Array.isArray(props.embedding) && props.embedding.length > 0;
|
|
5493
|
+
const workingProps = { ...props };
|
|
5494
|
+
if (indexed && !embedded && typeof params.embed === "function") {
|
|
5495
|
+
try {
|
|
5496
|
+
const vec = await params.embed(boundedEmbedText(labels, props));
|
|
5497
|
+
if (Array.isArray(vec) && vec.length > 0) {
|
|
5498
|
+
workingProps.embedding = vec;
|
|
5499
|
+
embedded = true;
|
|
5500
|
+
}
|
|
5501
|
+
} catch (err) {
|
|
5502
|
+
process.stderr.write(`[graph-write] warn reason=embed-failed labels=${labelCsv} agent=${agentLabel} detail=${err instanceof Error ? err.message : String(err)}
|
|
5503
|
+
`);
|
|
5504
|
+
}
|
|
5505
|
+
}
|
|
5506
|
+
const labelStr = labels.map((l) => `\`${l.replace(/`/g, "")}\``).join(":");
|
|
5507
|
+
const nodeProps = stampCreatedBy(workingProps, createdBy);
|
|
5508
|
+
return await session.executeWrite(async (tx) => {
|
|
5509
|
+
const targetIds = relationships.map((r) => r.targetNodeId);
|
|
5510
|
+
const check = await tx.run(`UNWIND $ids AS id MATCH (t) WHERE elementId(t) = id RETURN elementId(t) AS id, labels(t) AS labels`, { ids: targetIds });
|
|
5511
|
+
const labelsByTarget = /* @__PURE__ */ new Map();
|
|
5512
|
+
for (const rec of check.records) {
|
|
5513
|
+
labelsByTarget.set(rec.get("id"), rec.get("labels"));
|
|
5514
|
+
}
|
|
5515
|
+
const found = labelsByTarget.size;
|
|
5516
|
+
const uniqueRequested = new Set(targetIds).size;
|
|
5517
|
+
if (found !== uniqueRequested) {
|
|
5518
|
+
process.stderr.write(`[graph-write] reject reason=unresolved-target labels=${labelCsv} agent=${agentLabel} requested=${uniqueRequested} found=${found}
|
|
5519
|
+
`);
|
|
5520
|
+
throw new Error(`Write doctrine violated: ${uniqueRequested - found} of ${uniqueRequested} relationship target(s) did not resolve (elementId mismatch). No node created.`);
|
|
5521
|
+
}
|
|
5522
|
+
let provenanceSourceId = null;
|
|
5523
|
+
let provenanceSourceLabel = null;
|
|
5524
|
+
if (requiresActionProvenance(labels) && (createdBy.agent ?? "") !== "system") {
|
|
5525
|
+
const candidates = findProvenanceCandidates(relationships);
|
|
5526
|
+
const matched = candidates.map((r) => {
|
|
5527
|
+
const lbls = labelsByTarget.get(r.targetNodeId);
|
|
5528
|
+
if (!Array.isArray(lbls))
|
|
5529
|
+
return null;
|
|
5530
|
+
const sourceLabel = lbls.find((l) => exports.PROVENANCE_SOURCE_LABELS.has(l));
|
|
5531
|
+
return sourceLabel ? { rel: r, sourceLabel } : null;
|
|
5532
|
+
}).filter((m) => m !== null);
|
|
5533
|
+
if (matched.length === 0) {
|
|
5534
|
+
process.stderr.write(`[graph-write] warn reason=missing-provenance labels=${labelCsv} agent=${agentLabel}
|
|
5535
|
+
`);
|
|
5536
|
+
} else {
|
|
5537
|
+
provenanceSourceId = matched[0].rel.targetNodeId;
|
|
5538
|
+
provenanceSourceLabel = matched[0].sourceLabel;
|
|
5539
|
+
}
|
|
5540
|
+
}
|
|
5541
|
+
let nodeRes;
|
|
5542
|
+
try {
|
|
5543
|
+
nodeRes = await tx.run(`CREATE (n:${labelStr} $props) RETURN elementId(n) AS nodeId, labels(n) AS nodeLabels`, { props: nodeProps });
|
|
5544
|
+
} catch (err) {
|
|
5545
|
+
const code = err?.code ?? "";
|
|
5546
|
+
if (code === "Neo.ClientError.Schema.ConstraintValidationFailed" && labels.includes("UserProfile")) {
|
|
5547
|
+
const accountIdProp = nodeProps.accountId;
|
|
5548
|
+
const userIdProp = nodeProps.userId;
|
|
5549
|
+
const acctSlice2 = typeof accountIdProp === "string" ? accountIdProp.slice(0, 8) : "unknown";
|
|
5550
|
+
const userSlice = typeof userIdProp === "string" ? userIdProp.slice(0, 8) : "unknown";
|
|
5551
|
+
process.stderr.write(`[graph-write] reject reason=user-profile-uniqueness-violation accountId=${acctSlice2} userId=${userSlice} writer=${agentLabel}
|
|
5552
|
+
`);
|
|
5553
|
+
}
|
|
5554
|
+
throw err;
|
|
5555
|
+
}
|
|
5556
|
+
const nodeId = nodeRes.records[0].get("nodeId");
|
|
5557
|
+
const nodeLabels = nodeRes.records[0].get("nodeLabels");
|
|
5558
|
+
let edgesCreated = 0;
|
|
5559
|
+
for (const rel of relationships) {
|
|
5560
|
+
const type = rel.type.replace(/`/g, "");
|
|
5561
|
+
const q = rel.direction === "outgoing" ? `MATCH (a), (b) WHERE elementId(a) = $from AND elementId(b) = $to CREATE (a)-[:\`${type}\`]->(b)` : `MATCH (a), (b) WHERE elementId(a) = $from AND elementId(b) = $to CREATE (b)-[:\`${type}\`]->(a)`;
|
|
5562
|
+
const r = await tx.run(q, { from: nodeId, to: rel.targetNodeId });
|
|
5563
|
+
const created = r.summary.counters.updates().relationshipsCreated;
|
|
5564
|
+
if (created === 0) {
|
|
5565
|
+
process.stderr.write(`[graph-write] reject reason=unresolved-target-on-create labels=${labelCsv} agent=${agentLabel} relType=${rel.type} targetId=${rel.targetNodeId}
|
|
5566
|
+
`);
|
|
5567
|
+
throw new Error(`Write doctrine violated: relationship CREATE to target ${rel.targetNodeId} produced 0 edges (target likely deleted concurrently after pre-check). Transaction rolled back.`);
|
|
5568
|
+
}
|
|
5569
|
+
edgesCreated += created;
|
|
5570
|
+
}
|
|
5571
|
+
if (edgesCreated !== relationships.length) {
|
|
5572
|
+
process.stderr.write(`[graph-write] reject reason=edge-count-mismatch labels=${labelCsv} agent=${agentLabel} requested=${relationships.length} created=${edgesCreated}
|
|
5573
|
+
`);
|
|
5574
|
+
throw new Error(`Write doctrine violated: expected ${relationships.length} edges, created ${edgesCreated}. Transaction rolled back.`);
|
|
5575
|
+
}
|
|
5576
|
+
process.stderr.write(`[graph-write] accepted labels=${labelCsv} edges=${edgesCreated} createdByAgent=${createdBy.agent ?? "unknown"} createdByTool=${createdBy.tool ?? createdBy.source ?? "unknown"} producedBy=${provenanceSourceLabel ?? "none"}:${provenanceSourceId ?? "none"}
|
|
5577
|
+
`);
|
|
5578
|
+
const acctSlice = typeof props.accountId === "string" ? props.accountId.slice(0, 8) : "none";
|
|
5579
|
+
process.stderr.write(`[graph-write] op=node-written label=${labelCsv} accountId=${acctSlice} embedded=${embedded} indexed=${indexed}
|
|
5580
|
+
`);
|
|
5581
|
+
return { nodeId, labels: nodeLabels, edgesCreated };
|
|
5582
|
+
});
|
|
5583
|
+
}
|
|
5584
|
+
}
|
|
5585
|
+
});
|
|
5586
|
+
|
|
5214
5587
|
// node_modules/hono/dist/utils/mime.js
|
|
5215
5588
|
var getMimeType = (filename, mimes = baseMimes) => {
|
|
5216
5589
|
const regexp = /\.([a-zA-Z0-9]+?)$/;
|
|
@@ -5479,6 +5852,7 @@ if (!CLAUDE_CREDENTIALS_FILE.startsWith(MAXY_DIR + sep)) {
|
|
|
5479
5852
|
var TOKEN_ENDPOINT = "https://platform.claude.com/v1/oauth/token";
|
|
5480
5853
|
var CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
5481
5854
|
var EXPIRING_THRESHOLD_MS = 5 * 60 * 1e3;
|
|
5855
|
+
var REFRESH_NOT_FIRING_THRESHOLD = 2;
|
|
5482
5856
|
function readCredentials() {
|
|
5483
5857
|
let raw;
|
|
5484
5858
|
try {
|
|
@@ -5663,15 +6037,52 @@ async function doRefreshLocked() {
|
|
|
5663
6037
|
return { status: "ok", expiresAt: newExpiresAt ?? Date.now() + 3600 * 1e3 };
|
|
5664
6038
|
}
|
|
5665
6039
|
function startAuthHealthHeartbeat(intervalMs = 5 * 60 * 1e3) {
|
|
5666
|
-
|
|
5667
|
-
|
|
5668
|
-
|
|
5669
|
-
|
|
5670
|
-
|
|
5671
|
-
|
|
6040
|
+
let ticksSinceRefresh = 0;
|
|
6041
|
+
let ticking = false;
|
|
6042
|
+
const tick = async () => {
|
|
6043
|
+
if (ticking) return;
|
|
6044
|
+
ticking = true;
|
|
6045
|
+
try {
|
|
6046
|
+
const h = computeAuthHealth();
|
|
6047
|
+
const expiresIn = h.expiresAt != null ? Math.round((h.expiresAt - Date.now()) / 1e3) : null;
|
|
6048
|
+
console.log(
|
|
6049
|
+
`[auth-health] brand=${BRAND_NAME} status=${h.status} expiresIn=${expiresIn != null ? expiresIn + "s" : "n/a"}`
|
|
6050
|
+
);
|
|
6051
|
+
if (h.status === "dead") {
|
|
6052
|
+
console.log(`[auth-health] op=reauth-required status=dead`);
|
|
6053
|
+
ticksSinceRefresh = 0;
|
|
6054
|
+
return;
|
|
6055
|
+
}
|
|
6056
|
+
if (h.status === "expiring" || h.status === "expired") {
|
|
6057
|
+
const result = await ensureAuth();
|
|
6058
|
+
if (result.status === "ok") {
|
|
6059
|
+
ticksSinceRefresh = 0;
|
|
6060
|
+
} else if (result.status === "dead") {
|
|
6061
|
+
console.log(`[auth-health] op=reauth-required status=dead`);
|
|
6062
|
+
ticksSinceRefresh = 0;
|
|
6063
|
+
} else {
|
|
6064
|
+
ticksSinceRefresh += 1;
|
|
6065
|
+
if (ticksSinceRefresh >= REFRESH_NOT_FIRING_THRESHOLD) {
|
|
6066
|
+
console.log(
|
|
6067
|
+
`[auth-health] op=refresh-not-firing status=${result.status} ticksSinceRefresh=${ticksSinceRefresh}`
|
|
6068
|
+
);
|
|
6069
|
+
}
|
|
6070
|
+
}
|
|
6071
|
+
return;
|
|
6072
|
+
}
|
|
6073
|
+
ticksSinceRefresh = 0;
|
|
6074
|
+
} catch (err) {
|
|
6075
|
+
console.error(
|
|
6076
|
+
`[auth-health] tick error: ${err instanceof Error ? err.message : String(err)}`
|
|
6077
|
+
);
|
|
6078
|
+
} finally {
|
|
6079
|
+
ticking = false;
|
|
6080
|
+
}
|
|
5672
6081
|
};
|
|
5673
|
-
tick();
|
|
5674
|
-
const handle = setInterval(
|
|
6082
|
+
void tick();
|
|
6083
|
+
const handle = setInterval(() => {
|
|
6084
|
+
void tick();
|
|
6085
|
+
}, intervalMs);
|
|
5675
6086
|
if (typeof handle.unref === "function") handle.unref();
|
|
5676
6087
|
return () => clearInterval(handle);
|
|
5677
6088
|
}
|
|
@@ -9192,12 +9603,25 @@ import { resolve as resolve4, basename } from "path";
|
|
|
9192
9603
|
var TAG15 = "[whatsapp:outbound]";
|
|
9193
9604
|
var WHATSAPP_DOCUMENT_MAX_BYTES = 100 * 1024 * 1024;
|
|
9194
9605
|
var lastDocumentOutboundAt = /* @__PURE__ */ new Map();
|
|
9606
|
+
var lastRouteDocumentOutboundAt = /* @__PURE__ */ new Map();
|
|
9195
9607
|
function normalizeJid(to) {
|
|
9196
9608
|
return to.includes("@") ? to : toWhatsappJid(to);
|
|
9197
9609
|
}
|
|
9610
|
+
function routeKey(to, filePath) {
|
|
9611
|
+
return `${normalizeJid(to)}\0${filePath}`;
|
|
9612
|
+
}
|
|
9198
9613
|
function documentOutboundAt(to) {
|
|
9199
9614
|
return lastDocumentOutboundAt.get(normalizeJid(to));
|
|
9200
9615
|
}
|
|
9616
|
+
function recordDocumentOutbound(to) {
|
|
9617
|
+
lastDocumentOutboundAt.set(normalizeJid(to), Date.now());
|
|
9618
|
+
}
|
|
9619
|
+
function recordRouteDocumentOutbound(to, filePath) {
|
|
9620
|
+
lastRouteDocumentOutboundAt.set(routeKey(to, filePath), Date.now());
|
|
9621
|
+
}
|
|
9622
|
+
function routeDocumentOutboundAt(to, filePath) {
|
|
9623
|
+
return lastRouteDocumentOutboundAt.get(routeKey(to, filePath));
|
|
9624
|
+
}
|
|
9201
9625
|
async function sendWhatsAppDocument(input) {
|
|
9202
9626
|
const { to, filePath, caption, accountId, maxyAccountId, platformRoot: platformRoot2 } = input;
|
|
9203
9627
|
if (!to || !filePath) {
|
|
@@ -9252,7 +9676,7 @@ async function sendWhatsAppDocument(input) {
|
|
|
9252
9676
|
`${TAG15} sent document to=${jid} file=${filename} bytes=${fileStat.size} ok=${result.success}` + (result.messageId ? ` id=${result.messageId}` : "")
|
|
9253
9677
|
);
|
|
9254
9678
|
if (result.success) {
|
|
9255
|
-
|
|
9679
|
+
recordDocumentOutbound(to);
|
|
9256
9680
|
return { ok: true, messageId: result.messageId };
|
|
9257
9681
|
}
|
|
9258
9682
|
return { ok: false, status: 500, error: result.error ?? "send failed" };
|
|
@@ -9269,12 +9693,21 @@ function makeWhatsAppFileDelivery(entry) {
|
|
|
9269
9693
|
let turnStartedAt = null;
|
|
9270
9694
|
let failedFiles = [];
|
|
9271
9695
|
let sendUserFileAttempts = 0;
|
|
9696
|
+
let routeCalls = [];
|
|
9272
9697
|
return {
|
|
9273
9698
|
isFileDeliveryTool(toolName) {
|
|
9274
9699
|
return toolName === SEND_USER_FILE || toolName === WHATSAPP_SEND_DOCUMENT;
|
|
9275
9700
|
},
|
|
9276
9701
|
async onFileToolUse(use) {
|
|
9277
9702
|
if (turnStartedAt === null) turnStartedAt = Date.now();
|
|
9703
|
+
if (use.toolName === WHATSAPP_SEND_DOCUMENT) {
|
|
9704
|
+
const input2 = use.input ?? {};
|
|
9705
|
+
routeCalls.push({
|
|
9706
|
+
to: typeof input2.to === "string" ? input2.to : void 0,
|
|
9707
|
+
filePath: typeof input2.filePath === "string" ? input2.filePath : void 0
|
|
9708
|
+
});
|
|
9709
|
+
return;
|
|
9710
|
+
}
|
|
9278
9711
|
if (use.toolName !== SEND_USER_FILE) return;
|
|
9279
9712
|
const input = use.input ?? {};
|
|
9280
9713
|
const files = Array.isArray(input.files) ? input.files.filter((f) => typeof f === "string") : [];
|
|
@@ -9311,9 +9744,11 @@ function makeWhatsAppFileDelivery(entry) {
|
|
|
9311
9744
|
const startedAt = turnStartedAt ?? 0;
|
|
9312
9745
|
const failed = failedFiles;
|
|
9313
9746
|
const attempts = sendUserFileAttempts;
|
|
9747
|
+
const routes = routeCalls;
|
|
9314
9748
|
turnStartedAt = null;
|
|
9315
9749
|
failedFiles = [];
|
|
9316
9750
|
sendUserFileAttempts = 0;
|
|
9751
|
+
routeCalls = [];
|
|
9317
9752
|
const sid = entry.sessionId.slice(0, 8);
|
|
9318
9753
|
for (const file of failed) {
|
|
9319
9754
|
console.error(
|
|
@@ -9322,10 +9757,15 @@ function makeWhatsAppFileDelivery(entry) {
|
|
|
9322
9757
|
}
|
|
9323
9758
|
const okAt = documentOutboundAt(entry.senderId);
|
|
9324
9759
|
const documentWentOut = okAt !== void 0 && okAt >= startedAt;
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
|
|
9328
|
-
)
|
|
9760
|
+
for (const call of routes) {
|
|
9761
|
+
const routeAt = call.to !== void 0 && call.filePath !== void 0 ? routeDocumentOutboundAt(call.to, call.filePath) : void 0;
|
|
9762
|
+
const delivered = routeAt !== void 0 && routeAt >= startedAt;
|
|
9763
|
+
if (!delivered) {
|
|
9764
|
+
const fileField = call.filePath !== void 0 ? ` file=${call.filePath}` : "";
|
|
9765
|
+
console.error(
|
|
9766
|
+
`${TAG16} file-delivery-unreconciled sender=${entry.senderId} sessionId=${sid} tool=${WHATSAPP_SEND_DOCUMENT}${fileField}`
|
|
9767
|
+
);
|
|
9768
|
+
}
|
|
9329
9769
|
}
|
|
9330
9770
|
if (firedTools.includes(SEND_USER_FILE) && attempts === 0 && !documentWentOut) {
|
|
9331
9771
|
console.error(
|
|
@@ -10813,6 +11253,7 @@ app3.post("/send-document", async (c) => {
|
|
|
10813
11253
|
platformRoot: PLATFORM_ROOT4
|
|
10814
11254
|
});
|
|
10815
11255
|
if (!result.ok) return c.json({ error: result.error }, result.status);
|
|
11256
|
+
recordRouteDocumentOutbound(to, filePath);
|
|
10816
11257
|
return c.json({ success: true, messageId: result.messageId });
|
|
10817
11258
|
} catch (err) {
|
|
10818
11259
|
console.error(`${TAG19} send-document error: ${String(err)}`);
|
|
@@ -14718,6 +15159,7 @@ function buildScopeAndSliceClause(allowedScopes, sliceToken, alias = "node") {
|
|
|
14718
15159
|
params: { allowedScopes }
|
|
14719
15160
|
};
|
|
14720
15161
|
}
|
|
15162
|
+
var DEFAULT_VECTOR_THRESHOLD = 0.82;
|
|
14721
15163
|
function escapeLucene(query) {
|
|
14722
15164
|
return query.replace(/[+\-&|!(){}[\]^"~*?:\\/]/g, "\\$&");
|
|
14723
15165
|
}
|
|
@@ -15272,7 +15714,6 @@ function plainProperties(properties) {
|
|
|
15272
15714
|
// server/routes/admin/graph-search.ts
|
|
15273
15715
|
var DEFAULT_LIMIT = 20;
|
|
15274
15716
|
var MAX_LIMIT = 2e3;
|
|
15275
|
-
var DEFAULT_VECTOR_THRESHOLD = 0.82;
|
|
15276
15717
|
var MESSAGE_FAMILY_LABELS = ["Message", "UserMessage", "AssistantMessage", "WhatsAppMessage"];
|
|
15277
15718
|
var CONVERSATION_PARENT_LABELS = /* @__PURE__ */ new Set(["AdminConversation", "PublicConversation"]);
|
|
15278
15719
|
var app16 = new Hono();
|
|
@@ -15290,8 +15731,10 @@ app16.get("/", requireAdminSession, async (c) => {
|
|
|
15290
15731
|
if (!q) return c.json({ error: "q (search query) required" }, 400);
|
|
15291
15732
|
const labels = rawLabels ? rawLabels.split(",").map((s) => s.trim()).filter((s) => s.length > 0) : [];
|
|
15292
15733
|
const wildcard = labels.includes("*");
|
|
15293
|
-
|
|
15294
|
-
|
|
15734
|
+
const noChips = labels.length === 0;
|
|
15735
|
+
const allLabels = wildcard || noChips;
|
|
15736
|
+
if (noChips && !wildcard) {
|
|
15737
|
+
console.error(`[graph-search] op=labels-default applied=all query="${q}"`);
|
|
15295
15738
|
}
|
|
15296
15739
|
const parsedLimit = rawLimit ? parseInt(rawLimit, 10) : DEFAULT_LIMIT;
|
|
15297
15740
|
const limit = Number.isFinite(parsedLimit) && parsedLimit > 0 ? Math.min(parsedLimit, MAX_LIMIT) : DEFAULT_LIMIT;
|
|
@@ -15302,8 +15745,8 @@ app16.get("/", requireAdminSession, async (c) => {
|
|
|
15302
15745
|
vectorThreshold = parsed;
|
|
15303
15746
|
}
|
|
15304
15747
|
}
|
|
15305
|
-
const wantsBodyFulltext = !
|
|
15306
|
-
const forwardedLabels =
|
|
15748
|
+
const wantsBodyFulltext = !allLabels && labels.some((l) => CONVERSATION_PARENT_LABELS.has(l));
|
|
15749
|
+
const forwardedLabels = allLabels ? void 0 : wantsBodyFulltext ? Array.from(/* @__PURE__ */ new Set([...labels, ...MESSAGE_FAMILY_LABELS])) : labels;
|
|
15307
15750
|
if (labels.includes("FileArtifact")) {
|
|
15308
15751
|
await reconcileFileIndexDebounced(accountId);
|
|
15309
15752
|
}
|
|
@@ -15378,7 +15821,7 @@ app16.get("/", requireAdminSession, async (c) => {
|
|
|
15378
15821
|
`[graph-search] body-fulltext query="${q}" hits=${bodyFulltextCount} ms=${total}`
|
|
15379
15822
|
);
|
|
15380
15823
|
}
|
|
15381
|
-
const labelsToken = wildcard ? "*" : labels.join(",");
|
|
15824
|
+
const labelsToken = wildcard ? "*" : noChips ? "all" : labels.join(",");
|
|
15382
15825
|
const expandedFlag = !wildcard && wantsBodyFulltext ? 1 : 0;
|
|
15383
15826
|
console.error(
|
|
15384
15827
|
`[graph-search] query="${q}" labels=${labelsToken} expanded=${expandedFlag} limit=${limit} mode=${res.mode} raw-results=${res.results.length} resolved-results=${resolvedResults.length} expand-ms=${res.expandMs} total-ms=${total}`
|
|
@@ -16692,7 +17135,6 @@ import { readdirSync as readdirSync8, readFileSync as readFileSync14, statSync a
|
|
|
16692
17135
|
import { join as join13, resolve as resolve17 } from "path";
|
|
16693
17136
|
var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl$/i;
|
|
16694
17137
|
var PID_FILE_RE = /^([0-9]+)\.json$/;
|
|
16695
|
-
var TITLE_MAX = 80;
|
|
16696
17138
|
var CLI_MARKER_PREFIXES = ["<local-command-", "<command-name>", "<command-message>"];
|
|
16697
17139
|
var app23 = new Hono();
|
|
16698
17140
|
function claudeConfigDir() {
|
|
@@ -16824,8 +17266,7 @@ function startsWithCliMarker(s) {
|
|
|
16824
17266
|
return false;
|
|
16825
17267
|
}
|
|
16826
17268
|
function trimToTitle(raw) {
|
|
16827
|
-
|
|
16828
|
-
return trimmed.length > TITLE_MAX ? trimmed.slice(0, TITLE_MAX - 1) + "\u2026" : trimmed;
|
|
17269
|
+
return raw.trim().replace(/\s+/g, " ");
|
|
16829
17270
|
}
|
|
16830
17271
|
function resolveTitle(body, sessionId, userTitles) {
|
|
16831
17272
|
const userTitle = userTitles.get(sessionId);
|
|
@@ -19248,7 +19689,15 @@ app42.post("/", async (c) => {
|
|
|
19248
19689
|
var session_default2 = app42;
|
|
19249
19690
|
|
|
19250
19691
|
// app/lib/graph-health.ts
|
|
19692
|
+
var import_dist5 = __toESM(require_dist4(), 1);
|
|
19251
19693
|
var HOUR_MS = 60 * 60 * 1e3;
|
|
19694
|
+
function renderLabelTop(rows) {
|
|
19695
|
+
return rows.map((b) => {
|
|
19696
|
+
const labels = b.labels.join("+") || "(none)";
|
|
19697
|
+
const c = typeof b.count === "number" ? b.count : b.count.toNumber?.() ?? 0;
|
|
19698
|
+
return `${labels}:${c}`;
|
|
19699
|
+
}).join(",");
|
|
19700
|
+
}
|
|
19252
19701
|
var timer = null;
|
|
19253
19702
|
async function runGraphHealthTick() {
|
|
19254
19703
|
const session = getSession();
|
|
@@ -19285,6 +19734,34 @@ async function runGraphHealthTick() {
|
|
|
19285
19734
|
console.error(
|
|
19286
19735
|
`[graph-health] userprofile-multi accounts=${upAccounts} top=${upTop.length > 0 ? upTop.join(",") : "none"}`
|
|
19287
19736
|
);
|
|
19737
|
+
const indexed = [...import_dist5.VECTOR_INDEXED_LABELS];
|
|
19738
|
+
const embCount = await session.run(
|
|
19739
|
+
`MATCH (n) WHERE n.embedding IS NULL AND any(l IN labels(n) WHERE l IN $indexed)
|
|
19740
|
+
RETURN count(n) AS total`,
|
|
19741
|
+
{ indexed }
|
|
19742
|
+
);
|
|
19743
|
+
const embTotal = embCount.records[0]?.get("total")?.toNumber?.() ?? 0;
|
|
19744
|
+
const embTopRes = await session.run(
|
|
19745
|
+
`MATCH (n) WHERE n.embedding IS NULL AND any(l IN labels(n) WHERE l IN $indexed)
|
|
19746
|
+
WITH labels(n) AS lbls, count(*) AS c
|
|
19747
|
+
ORDER BY c DESC LIMIT 5
|
|
19748
|
+
RETURN collect({labels: lbls, count: c}) AS top`,
|
|
19749
|
+
{ indexed }
|
|
19750
|
+
);
|
|
19751
|
+
const embTop = embTopRes.records[0]?.get("top") ?? [];
|
|
19752
|
+
console.error(`[embed-audit] null-embedding labels=${renderLabelTop(embTop) || "none"} count=${embTotal}`);
|
|
19753
|
+
const acctCount = await session.run(
|
|
19754
|
+
`MATCH (n) WHERE n.accountId IS NULL RETURN count(n) AS total`
|
|
19755
|
+
);
|
|
19756
|
+
const acctTotal = acctCount.records[0]?.get("total")?.toNumber?.() ?? 0;
|
|
19757
|
+
const acctTopRes = await session.run(
|
|
19758
|
+
`MATCH (n) WHERE n.accountId IS NULL
|
|
19759
|
+
WITH labels(n) AS lbls, count(*) AS c
|
|
19760
|
+
ORDER BY c DESC LIMIT 5
|
|
19761
|
+
RETURN collect({labels: lbls, count: c}) AS top`
|
|
19762
|
+
);
|
|
19763
|
+
const acctTop = acctTopRes.records[0]?.get("top") ?? [];
|
|
19764
|
+
console.error(`[account-audit] null-account labels=${renderLabelTop(acctTop) || "none"} count=${acctTotal}`);
|
|
19288
19765
|
} catch (err) {
|
|
19289
19766
|
console.error(
|
|
19290
19767
|
`[graph-health] query failed: ${err instanceof Error ? err.message : String(err)}`
|
|
@@ -19436,15 +19913,29 @@ var TAG30 = "[whatsapp-adaptor]";
|
|
|
19436
19913
|
function whatsappTurnTimeoutMs() {
|
|
19437
19914
|
return Number(process.env.WHATSAPP_PTY_TURN_TIMEOUT_MS ?? String(5 * 6e4));
|
|
19438
19915
|
}
|
|
19916
|
+
function composeTurn(input) {
|
|
19917
|
+
const caption = input.text.trim();
|
|
19918
|
+
const hasFileMedia = !!input.mediaPath && input.mediaType !== "audio";
|
|
19919
|
+
if (!hasFileMedia) return caption;
|
|
19920
|
+
const type = input.mediaType ?? "file";
|
|
19921
|
+
const note = input.role === "admin" ? `[Inbound WhatsApp ${type}: ${input.mediaPath}${input.mediaMimetype ? ` (${input.mediaMimetype})` : ""}. Read this file to see what the sender shared.]` : `[The sender shared a ${type}. You cannot open shared files in this session \u2014 ask them to describe or paste the relevant content.]`;
|
|
19922
|
+
return caption ? `${caption}
|
|
19923
|
+
|
|
19924
|
+
${note}` : note;
|
|
19925
|
+
}
|
|
19439
19926
|
async function dispatchToClaude(input) {
|
|
19440
|
-
|
|
19927
|
+
const hasFileMedia = !!input.mediaPath && input.mediaType !== "audio";
|
|
19928
|
+
const mediaField = hasFileMedia ? `media=${input.mediaType} mediaPath=${input.mediaPath}` : input.mediaType === "audio" ? "media=audio mediaPath=transcribed" : "media=none";
|
|
19929
|
+
console.error(`${TAG30} inbound-media ${mediaField} role=${input.role} senderId=${input.senderId}`);
|
|
19930
|
+
const text = composeTurn(input);
|
|
19931
|
+
if (!text.trim()) return;
|
|
19441
19932
|
const result = await dispatchOnce({
|
|
19442
19933
|
accountId: input.accountId,
|
|
19443
19934
|
senderId: input.senderId,
|
|
19444
19935
|
role: input.role,
|
|
19445
19936
|
channel: "whatsapp",
|
|
19446
19937
|
agentSlug: input.agentSlug,
|
|
19447
|
-
text
|
|
19938
|
+
text,
|
|
19448
19939
|
timeoutMs: whatsappTurnTimeoutMs()
|
|
19449
19940
|
});
|
|
19450
19941
|
if ("error" in result) {
|
|
@@ -20237,10 +20728,7 @@ var brandedHtmlCache = /* @__PURE__ */ new Map();
|
|
|
20237
20728
|
function loadBrandingCache(agentSlug) {
|
|
20238
20729
|
const configDir2 = join17(homedir2(), BRAND.configDir);
|
|
20239
20730
|
try {
|
|
20240
|
-
const
|
|
20241
|
-
if (!existsSync23(accountJsonPath)) return null;
|
|
20242
|
-
const account = JSON.parse(readFileSync22(accountJsonPath, "utf-8"));
|
|
20243
|
-
const accountId = account.accountId;
|
|
20731
|
+
const accountId = getDefaultAccountId();
|
|
20244
20732
|
if (!accountId) return null;
|
|
20245
20733
|
const cachePath = join17(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
|
|
20246
20734
|
if (!existsSync23(cachePath)) return null;
|
|
@@ -20250,15 +20738,9 @@ function loadBrandingCache(agentSlug) {
|
|
|
20250
20738
|
}
|
|
20251
20739
|
}
|
|
20252
20740
|
function resolveDefaultSlug() {
|
|
20253
|
-
|
|
20254
|
-
|
|
20255
|
-
|
|
20256
|
-
if (!existsSync23(accountJsonPath)) return null;
|
|
20257
|
-
const account = JSON.parse(readFileSync22(accountJsonPath, "utf-8"));
|
|
20258
|
-
return account.defaultAgent || null;
|
|
20259
|
-
} catch {
|
|
20260
|
-
return null;
|
|
20261
|
-
}
|
|
20741
|
+
const account = resolveAccount();
|
|
20742
|
+
if (!account) return null;
|
|
20743
|
+
return resolveDefaultAgentSlug(account.accountDir);
|
|
20262
20744
|
}
|
|
20263
20745
|
function brandedPublicHtml(agentSlug) {
|
|
20264
20746
|
const baseHtml = cachedHtml("public.html");
|
|
@@ -20304,6 +20786,7 @@ app43.get("/", (c) => {
|
|
|
20304
20786
|
503
|
|
20305
20787
|
);
|
|
20306
20788
|
}
|
|
20789
|
+
console.error(`[public-root] op=serve-default slug=${defaultSlug}`);
|
|
20307
20790
|
return c.html(brandedPublicHtml(defaultSlug));
|
|
20308
20791
|
}
|
|
20309
20792
|
return c.html(cachedHtml("index.html"));
|
|
@@ -20584,7 +21067,7 @@ init({
|
|
|
20584
21067
|
platformRoot: resolve26(process.env.MAXY_PLATFORM_ROOT ?? join17(__dirname, "..")),
|
|
20585
21068
|
accountConfig: bootAccountConfig,
|
|
20586
21069
|
onMessage: async (msg) => {
|
|
20587
|
-
if (msg.text && !msg.isOwnerMirror) {
|
|
21070
|
+
if ((msg.text || msg.mediaPath) && !msg.isOwnerMirror) {
|
|
20588
21071
|
try {
|
|
20589
21072
|
void msg.composing().catch(() => {
|
|
20590
21073
|
});
|
|
@@ -20606,6 +21089,9 @@ init({
|
|
|
20606
21089
|
role: msg.agentType,
|
|
20607
21090
|
agentSlug: agentSlugForBridge,
|
|
20608
21091
|
text: msg.text,
|
|
21092
|
+
mediaPath: msg.mediaPath,
|
|
21093
|
+
mediaType: msg.mediaType,
|
|
21094
|
+
mediaMimetype: msg.mediaMimetype,
|
|
20609
21095
|
reply: msg.reply
|
|
20610
21096
|
});
|
|
20611
21097
|
} catch (err) {
|