@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.
Files changed (340) hide show
  1. package/dist/__tests__/plugin-install.test.js +58 -40
  2. package/dist/index.js +77 -26
  3. package/dist/lib/plugin-install.js +31 -29
  4. package/package.json +1 -1
  5. package/payload/platform/.docs/search-surface-contract.md +58 -0
  6. package/payload/platform/config/brand-registry.json +8 -0
  7. package/payload/platform/config/brand.json +2 -2
  8. package/payload/platform/lib/embed-client/dist/index.d.ts +4 -0
  9. package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -0
  10. package/payload/platform/lib/embed-client/dist/index.js +53 -0
  11. package/payload/platform/lib/embed-client/dist/index.js.map +1 -0
  12. package/payload/platform/lib/embed-client/src/index.ts +53 -0
  13. package/payload/platform/lib/embed-client/tsconfig.json +8 -0
  14. package/payload/platform/lib/graph-search/dist/index.d.ts +27 -6
  15. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  16. package/payload/platform/lib/graph-search/dist/index.js +19 -1
  17. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  18. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +12 -0
  19. package/payload/platform/lib/graph-search/src/index.ts +28 -6
  20. package/payload/platform/lib/graph-write/dist/index.d.ts +25 -0
  21. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  22. package/payload/platform/lib/graph-write/dist/index.js +80 -2
  23. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  24. package/payload/platform/lib/graph-write/src/index.ts +98 -1
  25. package/payload/platform/neo4j/schema.cypher +126 -0
  26. package/payload/platform/package.json +2 -2
  27. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  28. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  29. package/payload/platform/plugins/admin/PLUGIN.md +3 -6
  30. package/payload/platform/plugins/admin/mcp/dist/index.js +14 -60
  31. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  32. package/payload/platform/plugins/admin/skills/insight/SKILL.md +24 -0
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +84 -31
  34. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  35. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  36. package/payload/platform/plugins/docs/references/deployment.md +18 -5
  37. package/payload/platform/plugins/docs/references/graph.md +2 -0
  38. package/payload/platform/plugins/docs/references/internals.md +12 -1
  39. package/payload/platform/plugins/docs/references/memory-guide.md +4 -0
  40. package/payload/platform/plugins/docs/references/neo4j.md +2 -2
  41. package/payload/platform/plugins/docs/references/platform.md +1 -1
  42. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  43. package/payload/platform/plugins/docs/references/session-retrospective.md +5 -18
  44. package/payload/platform/plugins/docs/references/slides.md +31 -0
  45. package/payload/platform/plugins/docs/references/voice-mirror-guide.md +1 -1
  46. package/payload/platform/plugins/email/PLUGIN.md +2 -2
  47. package/payload/platform/plugins/email/mcp/dist/index.js +8 -0
  48. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  49. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +19 -0
  50. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -0
  51. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +64 -0
  52. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -0
  53. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +4 -0
  54. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  55. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +1 -0
  56. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts +1 -0
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  59. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +6 -1
  60. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  61. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts +1 -0
  62. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  63. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +7 -1
  64. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  65. package/payload/platform/plugins/email/references/email-reference.md +4 -0
  66. package/payload/platform/plugins/memory/PLUGIN.md +1 -2
  67. package/payload/platform/plugins/memory/mcp/dist/index.js +6 -44
  68. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts +2 -0
  70. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js +41 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js.map +1 -0
  73. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts +2 -0
  74. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js +90 -0
  76. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map +1 -0
  77. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts +2 -0
  78. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts.map +1 -0
  79. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js +27 -0
  80. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js.map +1 -0
  81. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts +10 -0
  82. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts.map +1 -0
  83. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js +47 -0
  84. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js.map +1 -0
  85. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +1 -2
  86. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -1
  87. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +5 -28
  88. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts +2 -0
  90. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts.map +1 -0
  91. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js +20 -0
  92. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js.map +1 -0
  93. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts +2 -0
  94. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts.map +1 -0
  95. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js +67 -0
  96. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js.map +1 -0
  97. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts +2 -0
  98. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts.map +1 -0
  99. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +34 -0
  100. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -0
  101. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts +2 -0
  102. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts.map +1 -0
  103. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js +61 -0
  104. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js.map +1 -0
  105. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +23 -1
  106. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
  107. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts +2 -0
  108. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js +87 -0
  110. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js.map +1 -0
  111. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +3 -0
  112. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
  113. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts +2 -0
  114. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts.map +1 -0
  115. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js +34 -0
  116. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js.map +1 -0
  117. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
  118. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +19 -4
  119. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
  120. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -6
  121. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  122. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +280 -10
  123. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -1
  125. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +76 -37
  126. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -1
  127. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
  128. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +11 -2
  129. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +4 -4
  131. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +3 -3
  132. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  133. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +20 -2
  134. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  135. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +6 -3
  136. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  137. package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
  138. package/payload/platform/plugins/memory/references/schema-base.md +1 -1
  139. package/payload/platform/plugins/memory/references/schema-construction.md +72 -0
  140. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.d.ts.map +1 -1
  141. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js +15 -0
  142. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js.map +1 -1
  143. package/payload/platform/plugins/slides/.claude-plugin/plugin.json +8 -0
  144. package/payload/platform/plugins/slides/LICENSE +21 -0
  145. package/payload/platform/plugins/slides/PLUGIN.md +18 -0
  146. package/payload/platform/plugins/slides/PROVENANCE.md +40 -0
  147. package/payload/platform/plugins/slides/commands/add-slide.md +29 -0
  148. package/payload/platform/plugins/slides/commands/slides-claus.md +39 -0
  149. package/payload/platform/plugins/slides/commands/slides-new-component.md +39 -0
  150. package/payload/platform/plugins/slides/commands/slides-outline.md +43 -0
  151. package/payload/platform/plugins/slides/commands/slides-review.md +52 -0
  152. package/payload/platform/plugins/slides/commands/slides-theme.md +64 -0
  153. package/payload/platform/plugins/slides/commands/slides.md +59 -0
  154. package/payload/platform/plugins/slides/skills/deck-system/REFERENCE.md +581 -0
  155. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +607 -0
  156. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-board.md +426 -0
  157. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-claus.md +185 -0
  158. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-mbb.md +450 -0
  159. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-product-launch.md +579 -0
  160. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sales.md +464 -0
  161. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sequoia.md +489 -0
  162. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING.md +273 -0
  163. package/payload/platform/plugins/slides/skills/deck-system/deck-craft.html +1371 -0
  164. package/payload/platform/plugins/slides/skills/deck-system/deck-solid.html +1667 -0
  165. package/payload/platform/plugins/slides/skills/deck-system/deck.html +1359 -0
  166. package/payload/platform/plugins/url-get/.claude-plugin/plugin.json +1 -1
  167. package/payload/platform/plugins/url-get/PLUGIN.md +26 -21
  168. package/payload/platform/plugins/url-get/mcp/dist/index.js +3 -3
  169. package/payload/platform/plugins/url-get/mcp/dist/index.js.map +1 -1
  170. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts +1 -2
  171. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts.map +1 -1
  172. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +20 -40
  173. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  174. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +4 -0
  175. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  176. package/payload/platform/scripts/identity-forbidden-token-check.mjs +0 -1
  177. package/payload/platform/scripts/setup-account.sh +0 -15
  178. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +23 -0
  179. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -0
  180. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +29 -0
  181. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -0
  182. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  183. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -2
  184. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  185. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  186. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  187. package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -2
  188. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  189. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  190. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +8 -1
  191. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  192. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts +13 -1
  193. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  194. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +26 -2
  195. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  196. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -2
  197. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  198. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +12 -3
  199. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  200. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +3 -2
  201. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  202. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -2
  203. package/payload/platform/templates/specialists/agents/database-operator.md +3 -7
  204. package/payload/platform/templates/specialists/agents/typed-edge-classifier.md +1 -1
  205. package/payload/server/{chunk-M6A6EZD4.js → chunk-76HRO7NX.js} +16 -2
  206. package/payload/server/maxy-edge.js +1 -1
  207. package/payload/server/public/assets/AdminShell-T-YknnBn.js +1 -0
  208. package/payload/server/public/assets/Checkbox-DmDxpqVv.js +1 -0
  209. package/payload/server/public/assets/admin-COUV-jgt.js +1 -0
  210. package/payload/server/public/assets/{arc-aUiRP9AS.js → arc-B2CweJq3.js} +1 -1
  211. package/payload/server/public/assets/architecture-YZFGNWBL-Dnn6Hc65.js +1 -0
  212. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-c09loTER.js → architectureDiagram-Q4EWVU46-DP2o-MFV.js} +1 -1
  213. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cjdeyoq1.js → blockDiagram-DXYQGD6D-DO4mcYDJ.js} +1 -1
  214. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-NY6Wlzo2.js → c4Diagram-AHTNJAMY-Sy1giHbj.js} +1 -1
  215. package/payload/server/public/assets/channel-CEpR_0rE.js +1 -0
  216. package/payload/server/public/assets/{chunk-2KRD3SAO-BK3470lx.js → chunk-2KRD3SAO-CKsCYCsN.js} +1 -1
  217. package/payload/server/public/assets/chunk-336JU56O-C0-P-aUF.js +2 -0
  218. package/payload/server/public/assets/chunk-426QAEUC-DFjEt3Zb.js +1 -0
  219. package/payload/server/public/assets/{chunk-4BX2VUAB-BOvVdJLf.js → chunk-4BX2VUAB-B8bqAmBa.js} +1 -1
  220. package/payload/server/public/assets/{chunk-4TB4RGXK-BXpto3yW.js → chunk-4TB4RGXK-D1k0VSlW.js} +1 -1
  221. package/payload/server/public/assets/{chunk-55IACEB6-BwZyF7vR.js → chunk-55IACEB6-B-p_QNqz.js} +1 -1
  222. package/payload/server/public/assets/{chunk-5FUZZQ4R-C403gCUk.js → chunk-5FUZZQ4R-D6U6tV_j.js} +1 -1
  223. package/payload/server/public/assets/{chunk-5PVQY5BW-CjVzXQEp.js → chunk-5PVQY5BW-CYK76xfs.js} +1 -1
  224. package/payload/server/public/assets/{chunk-67CJDMHE-D5bhMrtY.js → chunk-67CJDMHE-BC9js-lf.js} +1 -1
  225. package/payload/server/public/assets/{chunk-7N4EOEYR-Si7Lgrwc.js → chunk-7N4EOEYR-4j2OqKkv.js} +1 -1
  226. package/payload/server/public/assets/{chunk-AA7GKIK3-DMuHtDqO.js → chunk-AA7GKIK3-Coen-fXN.js} +1 -1
  227. package/payload/server/public/assets/{chunk-BSJP7CBP-L79XKVcb.js → chunk-BSJP7CBP-CAiOBvec.js} +1 -1
  228. package/payload/server/public/assets/{chunk-CIAEETIT-C0O7Upmg.js → chunk-CIAEETIT-AJzzpZVb.js} +1 -1
  229. package/payload/server/public/assets/{chunk-EDXVE4YY-DJcJAsAg.js → chunk-EDXVE4YY-BL4BKozX.js} +1 -1
  230. package/payload/server/public/assets/{chunk-ENJZ2VHE-CFDNvYu1.js → chunk-ENJZ2VHE-mhAFG8UD.js} +1 -1
  231. package/payload/server/public/assets/{chunk-FMBD7UC4-C_E43NFJ.js → chunk-FMBD7UC4-H231gZA_.js} +1 -1
  232. package/payload/server/public/assets/{chunk-FOC6F5B3-D9lWWHAu.js → chunk-FOC6F5B3-Cl3ZZjYG.js} +1 -1
  233. package/payload/server/public/assets/{chunk-ICPOFSXX-ecLOxGhL.js → chunk-ICPOFSXX-DOEzvzJa.js} +2 -2
  234. package/payload/server/public/assets/{chunk-K5T4RW27-DuhsNH4c.js → chunk-K5T4RW27-C_ipbUDD.js} +1 -1
  235. package/payload/server/public/assets/{chunk-KGLVRYIC-B4-A1Abi.js → chunk-KGLVRYIC-CTsDNSCU.js} +1 -1
  236. package/payload/server/public/assets/{chunk-LIHQZDEY-BxqgHRgT.js → chunk-LIHQZDEY-DvSXhkGf.js} +1 -1
  237. package/payload/server/public/assets/{chunk-ORNJ4GCN-DEYQ5WaJ.js → chunk-ORNJ4GCN-p574NOI7.js} +1 -1
  238. package/payload/server/public/assets/{chunk-OYMX7WX6-B7MW66KB.js → chunk-OYMX7WX6-BlEgFM6U.js} +1 -1
  239. package/payload/server/public/assets/chunk-QZHKN3VN-DpF06ZZQ.js +1 -0
  240. package/payload/server/public/assets/{chunk-U2HBQHQK-BMawmsyk.js → chunk-U2HBQHQK-B2bDK0jv.js} +1 -1
  241. package/payload/server/public/assets/{chunk-X2U36JSP-CT6g7pno.js → chunk-X2U36JSP-D69BxKFw.js} +1 -1
  242. package/payload/server/public/assets/{chunk-XPW4576I-CBfZXZDB.js → chunk-XPW4576I-Dm-PcyUi.js} +1 -1
  243. package/payload/server/public/assets/{chunk-YZCP3GAM-xeAluiAH.js → chunk-YZCP3GAM-Be8RnXgx.js} +1 -1
  244. package/payload/server/public/assets/{chunk-ZZ45TVLE-BRN9qUC5.js → chunk-ZZ45TVLE-Ck8PCTa4.js} +1 -1
  245. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CYbXvKLI.js +1 -0
  246. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DEyHzRhq.js +1 -0
  247. package/payload/server/public/assets/clone-y8gexbBy.js +1 -0
  248. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Br2gjtEO.js → cose-bilkent-S5V4N54A-CmkW2Eaj.js} +1 -1
  249. package/payload/server/public/assets/{dagre-DTjePoco.js → dagre-Dqp-ns8F.js} +1 -1
  250. package/payload/server/public/assets/{dagre-KV5264BT-DHBkRke4.js → dagre-KV5264BT-ZgWWXPLc.js} +1 -1
  251. package/payload/server/public/assets/data-gy6QH9c1.js +1 -0
  252. package/payload/server/public/assets/{diagram-5BDNPKRD-BIq1-idL.js → diagram-5BDNPKRD-CTX5-ScM.js} +1 -1
  253. package/payload/server/public/assets/{diagram-G4DWMVQ6-BsIUDzV6.js → diagram-G4DWMVQ6-BovIsO6H.js} +1 -1
  254. package/payload/server/public/assets/{diagram-MMDJMWI5-CgHSri2i.js → diagram-MMDJMWI5-DcETsQy-.js} +1 -1
  255. package/payload/server/public/assets/{diagram-TYMM5635-Ce2Wh9ZX.js → diagram-TYMM5635-yyq6peoZ.js} +1 -1
  256. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BU0Kh6OQ.js → erDiagram-SMLLAGMA-CiNToftB.js} +1 -1
  257. package/payload/server/public/assets/{flatten-Bo6YRmWl.js → flatten-BtFI066E.js} +1 -1
  258. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-B0N06MF7.js → flowDiagram-DWJPFMVM-Xnl3SpIM.js} +1 -1
  259. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BVbx4ARZ.js → ganttDiagram-T4ZO3ILL-C1iyWe0f.js} +1 -1
  260. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CNs-LD5i.js +1 -0
  261. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C-xRJ94t.js → gitGraphDiagram-UUTBAWPF-D97pbMQb.js} +1 -1
  262. package/payload/server/public/assets/graph-labels-cZu4pK16.js +1 -0
  263. package/payload/server/public/assets/{graph-g48ZcA5M.js → graph-qz5tFKqU.js} +3 -3
  264. package/payload/server/public/assets/{graphlib-YmNcoMjY.js → graphlib-Lq8ijgON.js} +1 -1
  265. package/payload/server/public/assets/info-OMHHGYJF-DsTNigSS.js +1 -0
  266. package/payload/server/public/assets/infoDiagram-42DDH7IO-C_OarRTA.js +2 -0
  267. package/payload/server/public/assets/{isEmpty-D6Kr-M1M.js → isEmpty-D6QovjYR.js} +1 -1
  268. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DTrq54yC.js → ishikawaDiagram-UXIWVN3A-B8XBdjJn.js} +1 -1
  269. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-OZZZMrFX.js → journeyDiagram-VCZTEJTY-CZYbiOaQ.js} +1 -1
  270. package/payload/server/public/assets/{kanban-definition-6JOO6SKY--w-IP9pN.js → kanban-definition-6JOO6SKY-B1PybFoh.js} +1 -1
  271. package/payload/server/public/assets/{line-Ckeulv5T.js → line-D-tw3hHp.js} +1 -1
  272. package/payload/server/public/assets/{linear-DOh_6k2k.js → linear-BHhXD3cd.js} +1 -1
  273. package/payload/server/public/assets/{mermaid-parser.core-CVRAxYRD.js → mermaid-parser.core-C9RAnysF.js} +2 -2
  274. package/payload/server/public/assets/{mermaid.core-B-mE18I1.js → mermaid.core-B532LT1r.js} +3 -3
  275. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Bm8mDicL.js → mindmap-definition-QFDTVHPH-DGlgeeTV.js} +1 -1
  276. package/payload/server/public/assets/{ordinal-BDi6f4xk.js → ordinal-Bl-aM5b9.js} +1 -1
  277. package/payload/server/public/assets/packet-4T2RLAQJ-DGES22b-.js +1 -0
  278. package/payload/server/public/assets/pie-ZZUOXDRM-ChKeDbzt.js +1 -0
  279. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BCmRLgGO.js → pieDiagram-DEJITSTG-DV9FIWko.js} +1 -1
  280. package/payload/server/public/assets/{public-DknO-g9S.js → public-Bu2_Xi0a.js} +5 -5
  281. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CniTIUTm.js → quadrantDiagram-34T5L4WZ-Betwya4l.js} +1 -1
  282. package/payload/server/public/assets/radar-PYXPWWZC-FGG5Fs7N.js +1 -0
  283. package/payload/server/public/assets/{reduce-CGi9ik8i.js → reduce-BD4xUd2c.js} +1 -1
  284. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CoxBSj9M.js → requirementDiagram-MS252O5E-Cq3vODdg.js} +1 -1
  285. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BjS-4jzq.js → sankeyDiagram-XADWPNL6-x8krXWcS.js} +1 -1
  286. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B9jVOnPR.js → sequenceDiagram-FGHM5R23-i-_uH-Yl.js} +1 -1
  287. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BvOQPzP8.js → stateDiagram-FHFEXIEX-il4KqSgI.js} +1 -1
  288. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B6zNJ6Tv.js +1 -0
  289. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CdfgWLo1.js → timeline-definition-GMOUNBTQ-DATdZkA5.js} +1 -1
  290. package/payload/server/public/assets/treeView-SZITEDCU-VAQQdbtf.js +1 -0
  291. package/payload/server/public/assets/treemap-W4RFUUIX-DKchO3zI.js +1 -0
  292. package/payload/server/public/assets/useSelectionMode-A5KItZ2T.js +13 -0
  293. package/payload/server/public/assets/{brand-D0gNihp7.css → useSelectionMode-C-Ojh7W9.css} +1 -1
  294. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-JCgpIbj-.js → vennDiagram-DHZGUBPP-BJh9tJTt.js} +1 -1
  295. package/payload/server/public/assets/wardley-RL74JXVD-CBGtx0bS.js +1 -0
  296. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dei3VqHo.js → wardleyDiagram-NUSXRM2D-EMN1Hdfg.js} +1 -1
  297. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DUtIyoIb.js → xychartDiagram-5P7HB3ND-DbUWXa7T.js} +1 -1
  298. package/payload/server/public/data.html +5 -5
  299. package/payload/server/public/graph.html +6 -6
  300. package/payload/server/public/index.html +5 -6
  301. package/payload/server/public/public.html +4 -5
  302. package/payload/server/server.js +525 -39
  303. package/payload/platform/plugins/admin/hooks/__tests__/session-end-retrospective.test.sh +0 -396
  304. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +0 -239
  305. package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +0 -214
  306. package/payload/server/public/assets/AdminShell-892Jy_rs.js +0 -1
  307. package/payload/server/public/assets/Checkbox-Bc2QzX9b.js +0 -1
  308. package/payload/server/public/assets/admin-D3K13ndi.js +0 -1
  309. package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +0 -1
  310. package/payload/server/public/assets/brand-CcN3dELF.js +0 -9
  311. package/payload/server/public/assets/channel-B1IT7to2.js +0 -1
  312. package/payload/server/public/assets/chunk-336JU56O-CdKRCIeE.js +0 -2
  313. package/payload/server/public/assets/chunk-426QAEUC-BybuQ3Ve.js +0 -1
  314. package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +0 -1
  315. package/payload/server/public/assets/classDiagram-6PBFFD2Q-rjCize6i.js +0 -1
  316. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BORWOUt0.js +0 -1
  317. package/payload/server/public/assets/clone-Csqv5U6T.js +0 -1
  318. package/payload/server/public/assets/data-Br-pdljK.js +0 -1
  319. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +0 -1
  320. package/payload/server/public/assets/graph-labels-BYH-IPCb.js +0 -1
  321. package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +0 -1
  322. package/payload/server/public/assets/infoDiagram-42DDH7IO-Di6oPQ_-.js +0 -2
  323. package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +0 -1
  324. package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +0 -1
  325. package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +0 -1
  326. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-v4ND10uR.js +0 -1
  327. package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +0 -1
  328. package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +0 -1
  329. package/payload/server/public/assets/useSelectionMode-DwsyptOw.js +0 -5
  330. package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +0 -1
  331. /package/payload/server/public/assets/{_baseFor-Cam2PbSt.js → _baseFor-Cs8Y-rGh.js} +0 -0
  332. /package/payload/server/public/assets/{array-DYRGGQae.js → array-iHZP4KWJ.js} +0 -0
  333. /package/payload/server/public/assets/{cytoscape.esm-nWsJMTNI.js → cytoscape.esm-BR2GOQ8_.js} +0 -0
  334. /package/payload/server/public/assets/{defaultLocale-Du1XY3Dp.js → defaultLocale-B9aLeOTg.js} +0 -0
  335. /package/payload/server/public/assets/{dist-BzAsli7o.js → dist-DB-VPj_8.js} +0 -0
  336. /package/payload/server/public/assets/{init-B5BXBRcm.js → init-BNFRgqHM.js} +0 -0
  337. /package/payload/server/public/assets/{katex-HOUACuRw.js → katex-B-EfS3nw.js} +0 -0
  338. /package/payload/server/public/assets/{path-CNO468J-.js → path-DmWWdwp7.js} +0 -0
  339. /package/payload/server/public/assets/{rough.esm-DRO6hWPh.js → rough.esm-Ci7Kjt46.js} +0 -0
  340. /package/payload/server/public/assets/{src-CWiyyVfn.js → src-C1jfwBq0.js} +0 -0
@@ -93,7 +93,7 @@ import {
93
93
  vncLog,
94
94
  walkPremiumBundles,
95
95
  writeAdminUserAndPerson
96
- } from "./chunk-M6A6EZD4.js";
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
- const tick = () => {
5667
- const h = computeAuthHealth();
5668
- const expiresIn = h.expiresAt != null ? Math.round((h.expiresAt - Date.now()) / 1e3) : null;
5669
- console.log(
5670
- `[auth-health] brand=${BRAND_NAME} status=${h.status} expiresIn=${expiresIn != null ? expiresIn + "s" : "n/a"}`
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(tick, intervalMs);
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
- lastDocumentOutboundAt.set(jid, Date.now());
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
- if (firedTools.includes(WHATSAPP_SEND_DOCUMENT) && !documentWentOut) {
9326
- console.error(
9327
- `${TAG16} file-delivery-unreconciled sender=${entry.senderId} sessionId=${sid} tool=${WHATSAPP_SEND_DOCUMENT}`
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
- if (labels.length === 0) {
15294
- return c.json({ error: "Select at least one filter chip before searching." }, 400);
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 = !wildcard && labels.some((l) => CONVERSATION_PARENT_LABELS.has(l));
15306
- const forwardedLabels = wildcard ? void 0 : wantsBodyFulltext ? Array.from(/* @__PURE__ */ new Set([...labels, ...MESSAGE_FAMILY_LABELS])) : labels;
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
- const trimmed = raw.trim().replace(/\s+/g, " ");
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
- if (!input.text.trim()) return;
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: input.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 accountJsonPath = join17(configDir2, "account.json");
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
- try {
20254
- const configDir2 = join17(homedir2(), BRAND.configDir);
20255
- const accountJsonPath = join17(configDir2, "account.json");
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) {