@rubytech/create-maxy-code 0.1.470 → 0.1.472

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 (412) hide show
  1. package/dist/__tests__/google-client-id-env.test.js +68 -0
  2. package/dist/index.js +26 -18
  3. package/dist/port-resolution.js +7 -1
  4. package/package.json +1 -1
  5. package/payload/platform/config/brand.json +1 -1
  6. package/payload/platform/docs/superpowers/plans/2026-07-18-graph-native-ledger.md +807 -0
  7. package/payload/platform/docs/superpowers/specs/2026-07-18-graph-native-ledger-design.md +241 -0
  8. package/payload/platform/lib/ledger-core/dist/ageing.d.ts +14 -0
  9. package/payload/platform/lib/ledger-core/dist/ageing.d.ts.map +1 -0
  10. package/payload/platform/lib/ledger-core/dist/ageing.js +38 -0
  11. package/payload/platform/lib/ledger-core/dist/ageing.js.map +1 -0
  12. package/payload/platform/lib/ledger-core/dist/balance.d.ts +25 -0
  13. package/payload/platform/lib/ledger-core/dist/balance.d.ts.map +1 -0
  14. package/payload/platform/lib/ledger-core/dist/balance.js +38 -0
  15. package/payload/platform/lib/ledger-core/dist/balance.js.map +1 -0
  16. package/payload/platform/lib/ledger-core/dist/index.d.ts +5 -0
  17. package/payload/platform/lib/ledger-core/dist/index.d.ts.map +1 -0
  18. package/payload/platform/lib/ledger-core/dist/index.js +5 -0
  19. package/payload/platform/lib/ledger-core/dist/index.js.map +1 -0
  20. package/payload/platform/lib/ledger-core/dist/money.d.ts +12 -0
  21. package/payload/platform/lib/ledger-core/dist/money.d.ts.map +1 -0
  22. package/payload/platform/lib/ledger-core/dist/money.js +16 -0
  23. package/payload/platform/lib/ledger-core/dist/money.js.map +1 -0
  24. package/payload/platform/lib/ledger-core/dist/reconcile.d.ts +51 -0
  25. package/payload/platform/lib/ledger-core/dist/reconcile.d.ts.map +1 -0
  26. package/payload/platform/lib/ledger-core/dist/reconcile.js +77 -0
  27. package/payload/platform/lib/ledger-core/dist/reconcile.js.map +1 -0
  28. package/payload/platform/lib/ledger-core/package.json +16 -0
  29. package/payload/platform/lib/ledger-core/src/__tests__/ageing.test.ts +42 -0
  30. package/payload/platform/lib/ledger-core/src/__tests__/balance.test.ts +48 -0
  31. package/payload/platform/lib/ledger-core/src/__tests__/reconcile.test.ts +87 -0
  32. package/payload/platform/lib/ledger-core/src/ageing.ts +51 -0
  33. package/payload/platform/lib/ledger-core/src/balance.ts +52 -0
  34. package/payload/platform/lib/ledger-core/src/index.ts +4 -0
  35. package/payload/platform/lib/ledger-core/src/money.ts +17 -0
  36. package/payload/platform/lib/ledger-core/src/reconcile.ts +109 -0
  37. package/payload/platform/lib/ledger-core/tsconfig.json +6 -0
  38. package/payload/platform/neo4j/schema.cypher +16 -0
  39. package/payload/platform/package.json +2 -2
  40. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  41. package/payload/platform/plugins/admin/hooks/lib/maxy-mcp-plugins.txt +1 -0
  42. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +98 -2
  43. package/payload/platform/plugins/cloudflare/bin/__tests__/portal-brand-css.test.sh +139 -0
  44. package/payload/platform/plugins/cloudflare/bin/portal-brand-css.mjs +128 -0
  45. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-enrol.test.ts +1 -1
  46. package/payload/platform/plugins/cloudflare/mcp/__tests__/skill-contract.test.ts +25 -0
  47. package/payload/platform/plugins/cloudflare/mcp/__tests__/template-config.test.ts +55 -3
  48. package/payload/platform/plugins/cloudflare/skills/data-portal/SKILL.md +38 -3
  49. package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/portal.css → portal.css} +13 -2
  50. package/payload/platform/plugins/cloudflare/skills/data-portal/template/wrangler.toml +1 -1
  51. package/payload/platform/plugins/docs/references/admin-ui.md +48 -0
  52. package/payload/platform/plugins/docs/references/internals.md +1 -1
  53. package/payload/platform/plugins/docs/references/ledger.md +43 -0
  54. package/payload/platform/plugins/email/PLUGIN.md +4 -0
  55. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.d.ts +2 -0
  56. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.d.ts.map +1 -0
  57. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.js +196 -0
  58. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.js.map +1 -0
  59. package/payload/platform/plugins/email/mcp/dist/__tests__/source-fetch-efficiency.test.js +10 -8
  60. package/payload/platform/plugins/email/mcp/dist/__tests__/source-fetch-efficiency.test.js.map +1 -1
  61. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.d.ts +2 -0
  62. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.js +110 -0
  64. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.js.map +1 -0
  65. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +22 -0
  66. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  67. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +90 -36
  68. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  69. package/payload/platform/plugins/email/mcp/dist/tools/email-read.d.ts.map +1 -1
  70. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js +6 -2
  71. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js.map +1 -1
  72. package/payload/platform/plugins/email/mcp/dist/tools/email-search.d.ts.map +1 -1
  73. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js +6 -2
  74. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js.map +1 -1
  75. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +4 -0
  76. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.d.ts +2 -0
  77. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.d.ts.map +1 -0
  78. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +99 -0
  79. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -0
  80. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.d.ts +2 -0
  81. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.d.ts.map +1 -0
  82. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.js +48 -0
  83. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.js.map +1 -0
  84. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.d.ts +2 -0
  85. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js +25 -0
  87. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js.map +1 -0
  88. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.d.ts +2 -0
  89. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.d.ts.map +1 -0
  90. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js +40 -0
  91. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js.map +1 -0
  92. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.d.ts +2 -0
  93. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.d.ts.map +1 -0
  94. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.js +35 -0
  95. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.js.map +1 -0
  96. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.d.ts +2 -0
  97. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.d.ts.map +1 -0
  98. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.js +85 -0
  99. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.js.map +1 -0
  100. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts +25 -0
  101. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts.map +1 -0
  102. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.js +87 -0
  103. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.js.map +1 -0
  104. package/payload/platform/plugins/google/mcp/dist/auth/token-store.d.ts +46 -0
  105. package/payload/platform/plugins/google/mcp/dist/auth/token-store.d.ts.map +1 -0
  106. package/payload/platform/plugins/google/mcp/dist/auth/token-store.js +138 -0
  107. package/payload/platform/plugins/google/mcp/dist/auth/token-store.js.map +1 -0
  108. package/payload/platform/plugins/google/mcp/dist/index.d.ts +25 -0
  109. package/payload/platform/plugins/google/mcp/dist/index.d.ts.map +1 -0
  110. package/payload/platform/plugins/google/mcp/dist/index.js +300 -0
  111. package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -0
  112. package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts +28 -0
  113. package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts.map +1 -0
  114. package/payload/platform/plugins/google/mcp/dist/lib/google-client.js +102 -0
  115. package/payload/platform/plugins/google/mcp/dist/lib/google-client.js.map +1 -0
  116. package/payload/platform/plugins/google/mcp/dist/lib/log.d.ts +3 -0
  117. package/payload/platform/plugins/google/mcp/dist/lib/log.d.ts.map +1 -0
  118. package/payload/platform/plugins/google/mcp/dist/lib/log.js +16 -0
  119. package/payload/platform/plugins/google/mcp/dist/lib/log.js.map +1 -0
  120. package/payload/platform/plugins/google/mcp/dist/tools/account-info.d.ts +12 -0
  121. package/payload/platform/plugins/google/mcp/dist/tools/account-info.d.ts.map +1 -0
  122. package/payload/platform/plugins/google/mcp/dist/tools/account-info.js +23 -0
  123. package/payload/platform/plugins/google/mcp/dist/tools/account-info.js.map +1 -0
  124. package/payload/platform/plugins/google/mcp/dist/tools/account-list.d.ts +12 -0
  125. package/payload/platform/plugins/google/mcp/dist/tools/account-list.d.ts.map +1 -0
  126. package/payload/platform/plugins/google/mcp/dist/tools/account-list.js +9 -0
  127. package/payload/platform/plugins/google/mcp/dist/tools/account-list.js.map +1 -0
  128. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +59 -0
  129. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -0
  130. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +126 -0
  131. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -0
  132. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.d.ts +10 -0
  133. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.d.ts.map +1 -0
  134. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.js +9 -0
  135. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.js.map +1 -0
  136. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.d.ts +20 -0
  137. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.d.ts.map +1 -0
  138. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.js +25 -0
  139. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.js.map +1 -0
  140. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.d.ts +6 -0
  141. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.d.ts.map +1 -0
  142. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.js +7 -0
  143. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.js.map +1 -0
  144. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.d.ts +14 -0
  145. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.d.ts.map +1 -0
  146. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.js +16 -0
  147. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.js.map +1 -0
  148. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.d.ts +44 -0
  149. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.d.ts.map +1 -0
  150. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.js +36 -0
  151. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.js.map +1 -0
  152. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.d.ts +16 -0
  153. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.d.ts.map +1 -0
  154. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.js +29 -0
  155. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.js.map +1 -0
  156. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.d.ts +16 -0
  157. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.d.ts.map +1 -0
  158. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.js +32 -0
  159. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.js.map +1 -0
  160. package/payload/platform/plugins/google/references/auth.md +35 -0
  161. package/payload/platform/plugins/ledger/.claude-plugin/plugin.json +21 -0
  162. package/payload/platform/plugins/ledger/PLUGIN.md +82 -0
  163. package/payload/platform/plugins/ledger/lib/mcp-spawn-tee/index.js +193 -0
  164. package/payload/platform/plugins/ledger/lib/mcp-spawn-tee/package.json +3 -0
  165. package/payload/platform/plugins/ledger/mcp/dist/index.d.ts +2 -0
  166. package/payload/platform/plugins/ledger/mcp/dist/index.d.ts.map +1 -0
  167. package/payload/platform/plugins/ledger/mcp/dist/index.js +168 -0
  168. package/payload/platform/plugins/ledger/mcp/dist/index.js.map +1 -0
  169. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.d.ts +4 -0
  170. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.d.ts.map +1 -0
  171. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.js +0 -0
  172. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.js.map +1 -0
  173. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.d.ts +5 -0
  174. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.d.ts.map +1 -0
  175. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.js +40 -0
  176. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.js.map +1 -0
  177. package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts +29 -0
  178. package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts.map +1 -0
  179. package/payload/platform/plugins/ledger/mcp/dist/lib/read.js +138 -0
  180. package/payload/platform/plugins/ledger/mcp/dist/lib/read.js.map +1 -0
  181. package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts +47 -0
  182. package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts.map +1 -0
  183. package/payload/platform/plugins/ledger/mcp/dist/lib/types.js +14 -0
  184. package/payload/platform/plugins/ledger/mcp/dist/lib/types.js.map +1 -0
  185. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.d.ts +18 -0
  186. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.d.ts.map +1 -0
  187. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.js +23 -0
  188. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.js.map +1 -0
  189. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts +26 -0
  190. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts.map +1 -0
  191. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js +33 -0
  192. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js.map +1 -0
  193. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts +27 -0
  194. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts.map +1 -0
  195. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js +40 -0
  196. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js.map +1 -0
  197. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts +46 -0
  198. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts.map +1 -0
  199. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js +68 -0
  200. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js.map +1 -0
  201. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts +20 -0
  202. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts.map +1 -0
  203. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js +30 -0
  204. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js.map +1 -0
  205. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.d.ts +26 -0
  206. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.d.ts.map +1 -0
  207. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.js +35 -0
  208. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.js.map +1 -0
  209. package/payload/platform/plugins/ledger/mcp/package.json +21 -0
  210. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.d.ts +2 -0
  211. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.d.ts.map +1 -0
  212. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.js +81 -0
  213. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.js.map +1 -0
  214. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts +9 -7
  215. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts.map +1 -1
  216. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js +10 -8
  217. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js.map +1 -1
  218. package/payload/platform/plugins/memory/references/schema-base.md +22 -0
  219. package/payload/platform/plugins/memory/references/schema-construction.md +0 -18
  220. package/payload/platform/plugins/scheduling/PLUGIN.md +20 -0
  221. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.d.ts.map +1 -1
  222. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js +11 -2
  223. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js.map +1 -1
  224. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +1 -1
  225. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  226. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +3 -3
  227. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
  228. package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts +138 -0
  229. package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts.map +1 -0
  230. package/payload/platform/services/claude-session-manager/dist/activity-rows.js +268 -0
  231. package/payload/platform/services/claude-session-manager/dist/activity-rows.js.map +1 -0
  232. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  233. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  234. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  235. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +6 -0
  236. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  237. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -0
  238. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  239. package/payload/platform/services/claude-session-manager/dist/index.js +10 -1
  240. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  241. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +80 -6
  242. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
  243. package/payload/platform/services/claude-session-manager/dist/pty-census.js +96 -20
  244. package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
  245. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
  246. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +5 -1
  247. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
  248. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  249. package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
  250. package/payload/server/{chunk-JRIBGO45.js → chunk-BSTIQX52.js} +44 -0
  251. package/payload/server/maxy-edge.js +1 -1
  252. package/payload/server/public/activity.html +19 -0
  253. package/payload/server/public/assets/{AdminLoginScreens-Bed8SDxY.js → AdminLoginScreens-BfamGqS7.js} +1 -1
  254. package/payload/server/public/assets/AdminShell-5nHOAzXO.js +2 -0
  255. package/payload/server/public/assets/{Checkbox-BC_KSbpS.js → Checkbox-CD6aHwac.js} +1 -1
  256. package/payload/server/public/assets/activity-Dj2nJzPw.js +1 -0
  257. package/payload/server/public/assets/{admin-DfWgJVI3.js → admin-Cpcw_YE-.js} +1 -1
  258. package/payload/server/public/assets/{arc-qKfXIt8v.js → arc-BrHWN2Kr.js} +1 -1
  259. package/payload/server/public/assets/architecture-YZFGNWBL-CZQzGRSM.js +1 -0
  260. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DkVrGn7G.js → architectureDiagram-Q4EWVU46-Clt9NOr0.js} +1 -1
  261. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DqavswGH.js → blockDiagram-DXYQGD6D-BOe_jmXi.js} +1 -1
  262. package/payload/server/public/assets/{browser-C0vkv-hH.js → browser-0znOwk1W.js} +1 -1
  263. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-B7fyKiXe.js → c4Diagram-AHTNJAMY-B64FaKMV.js} +1 -1
  264. package/payload/server/public/assets/calendar-CykigHdg.js +1 -0
  265. package/payload/server/public/assets/channel-zDUAN9Ks.js +1 -0
  266. package/payload/server/public/assets/chat-DIOJZ411.js +1 -0
  267. package/payload/server/public/assets/chevron-left-Cq7UvOI0.js +1 -0
  268. package/payload/server/public/assets/{chunk-2KRD3SAO-DsgMtGkv.js → chunk-2KRD3SAO-BGAUfWvM.js} +1 -1
  269. package/payload/server/public/assets/{chunk-336JU56O-CkdISfNt.js → chunk-336JU56O-PFi6uQZ0.js} +2 -2
  270. package/payload/server/public/assets/chunk-426QAEUC-iJnqNRug.js +1 -0
  271. package/payload/server/public/assets/{chunk-4BX2VUAB-CYpiF2bl.js → chunk-4BX2VUAB-CkxXXCiF.js} +1 -1
  272. package/payload/server/public/assets/{chunk-4TB4RGXK-CWyc_F7v.js → chunk-4TB4RGXK-B-7tN4IA.js} +1 -1
  273. package/payload/server/public/assets/{chunk-55IACEB6-BbzKMw2Z.js → chunk-55IACEB6-CBkNmqrt.js} +1 -1
  274. package/payload/server/public/assets/{chunk-5FUZZQ4R-u19Nai9e.js → chunk-5FUZZQ4R-wa9ujn7i.js} +1 -1
  275. package/payload/server/public/assets/{chunk-5PVQY5BW-Ba8by6Uy.js → chunk-5PVQY5BW-DIk-xBaE.js} +1 -1
  276. package/payload/server/public/assets/{chunk-67CJDMHE-BwUuxtyb.js → chunk-67CJDMHE-BbMV1lgW.js} +1 -1
  277. package/payload/server/public/assets/{chunk-7N4EOEYR-BRH9iM9L.js → chunk-7N4EOEYR-C49Mv-nQ.js} +1 -1
  278. package/payload/server/public/assets/{chunk-AA7GKIK3-BGoztgLL.js → chunk-AA7GKIK3-Dy_pJOp_.js} +1 -1
  279. package/payload/server/public/assets/{chunk-BSJP7CBP-C5GDAZTl.js → chunk-BSJP7CBP-Ce-OmPqn.js} +1 -1
  280. package/payload/server/public/assets/{chunk-CIAEETIT-ChY32VPS.js → chunk-CIAEETIT-tnjq-APC.js} +1 -1
  281. package/payload/server/public/assets/{chunk-EDXVE4YY-CPSD3p6p.js → chunk-EDXVE4YY-Bvv_deZ2.js} +1 -1
  282. package/payload/server/public/assets/{chunk-ENJZ2VHE-D1oL-iUr.js → chunk-ENJZ2VHE-CmxCPKyU.js} +1 -1
  283. package/payload/server/public/assets/{chunk-FMBD7UC4-CPvYEr54.js → chunk-FMBD7UC4-Top6y08S.js} +1 -1
  284. package/payload/server/public/assets/{chunk-FOC6F5B3-9Yyj7Vbz.js → chunk-FOC6F5B3-B9LPNCUS.js} +1 -1
  285. package/payload/server/public/assets/{chunk-ICPOFSXX-BaYgh8FR.js → chunk-ICPOFSXX-Bi-_c351.js} +2 -2
  286. package/payload/server/public/assets/{chunk-K5T4RW27-5ucpeRvm.js → chunk-K5T4RW27-DAnRM04h.js} +1 -1
  287. package/payload/server/public/assets/{chunk-KGLVRYIC-DW-FHk7T.js → chunk-KGLVRYIC-C0QYcbLe.js} +1 -1
  288. package/payload/server/public/assets/{chunk-LIHQZDEY-CGGVfAyG.js → chunk-LIHQZDEY-BjvA5ykt.js} +1 -1
  289. package/payload/server/public/assets/{chunk-ORNJ4GCN-Bv8EUa5d.js → chunk-ORNJ4GCN-Cs46Gj7z.js} +1 -1
  290. package/payload/server/public/assets/{chunk-OYMX7WX6-C1mXJnyw.js → chunk-OYMX7WX6-BBpimab5.js} +1 -1
  291. package/payload/server/public/assets/chunk-QZHKN3VN-Qlc2PFAj.js +1 -0
  292. package/payload/server/public/assets/{chunk-U2HBQHQK-PwSQz6EP.js → chunk-U2HBQHQK-CQUSBHoK.js} +1 -1
  293. package/payload/server/public/assets/{chunk-X2U36JSP--NPHTBlU.js → chunk-X2U36JSP-Dm8TevG0.js} +1 -1
  294. package/payload/server/public/assets/{chunk-XPW4576I-Bbc7Da32.js → chunk-XPW4576I-B10QuxYb.js} +1 -1
  295. package/payload/server/public/assets/{chunk-YZCP3GAM-D-9v8e--.js → chunk-YZCP3GAM-vaGsu4Wk.js} +1 -1
  296. package/payload/server/public/assets/{chunk-ZZ45TVLE-CMPg670Q.js → chunk-ZZ45TVLE-D1Qi22bL.js} +1 -1
  297. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CFsKL52p.js +1 -0
  298. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BWBUUCiO.js +1 -0
  299. package/payload/server/public/assets/clone-h5XhkDUL.js +1 -0
  300. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-NVSb1Bhy.js → cose-bilkent-S5V4N54A-CRDvLRXs.js} +1 -1
  301. package/payload/server/public/assets/{dagre-QfLcO-1j.js → dagre-CEmqJTt3.js} +1 -1
  302. package/payload/server/public/assets/{dagre-KV5264BT-V2Ai1DFl.js → dagre-KV5264BT-LXMTo7Fp.js} +1 -1
  303. package/payload/server/public/assets/data-lHgqlhmu.js +1 -0
  304. package/payload/server/public/assets/{diagram-5BDNPKRD-Caw21693.js → diagram-5BDNPKRD-zyis6nPt.js} +1 -1
  305. package/payload/server/public/assets/{diagram-G4DWMVQ6-CgwVkT2q.js → diagram-G4DWMVQ6-BiU0XAAD.js} +1 -1
  306. package/payload/server/public/assets/{diagram-MMDJMWI5-DFUrLZhs.js → diagram-MMDJMWI5-rGFiz1SX.js} +1 -1
  307. package/payload/server/public/assets/{diagram-TYMM5635-CEEiEuZJ.js → diagram-TYMM5635-B0wak1ZJ.js} +1 -1
  308. package/payload/server/public/assets/{dist-Cvgxm7qv.js → dist-B2N0v8hZ.js} +1 -1
  309. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CG10NrT3.js → erDiagram-SMLLAGMA-D8AUxLyX.js} +1 -1
  310. package/payload/server/public/assets/{flatten-DAO0sfCM.js → flatten-naJ5PJ4f.js} +1 -1
  311. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BqkV9Okv.js → flowDiagram-DWJPFMVM-BtdUf68b.js} +1 -1
  312. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DRiCDQF6.js → ganttDiagram-T4ZO3ILL-C-lkzDmf.js} +1 -1
  313. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CBZPQJLj.js +1 -0
  314. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BZV2voyy.js → gitGraphDiagram-UUTBAWPF-DRUKumq2.js} +1 -1
  315. package/payload/server/public/assets/{graph-BZiudUGr.js → graph-JV5_xF3V.js} +3 -3
  316. package/payload/server/public/assets/{graph-labels-BzmmJwCR.js → graph-labels-DPYORjBH.js} +1 -1
  317. package/payload/server/public/assets/{graphlib-DGPThX8M.js → graphlib-zRsaoFEC.js} +1 -1
  318. package/payload/server/public/assets/info-OMHHGYJF-1vIoX-kP.js +1 -0
  319. package/payload/server/public/assets/infoDiagram-42DDH7IO-KHcXRaan.js +2 -0
  320. package/payload/server/public/assets/{isEmpty-Cb_U81C6.js → isEmpty-Bnpg7b8f.js} +1 -1
  321. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKsAxSvp.js → ishikawaDiagram-UXIWVN3A-BguMgoR8.js} +1 -1
  322. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CmliuOd-.js → journeyDiagram-VCZTEJTY-CXhyK1n-.js} +1 -1
  323. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DAlElMb-.js → kanban-definition-6JOO6SKY-C0UCWVx-.js} +1 -1
  324. package/payload/server/public/assets/{line-DKZqLKAC.js → line--uhS9YDE.js} +1 -1
  325. package/payload/server/public/assets/{linear-CbSGdh1x.js → linear-CAOWPodQ.js} +1 -1
  326. package/payload/server/public/assets/{maximize-2-Bhdsv0U-.js → maximize-2-8vKr3h21.js} +1 -1
  327. package/payload/server/public/assets/{mermaid-parser.core-DFvbao9C.js → mermaid-parser.core-D6kPx7vc.js} +2 -2
  328. package/payload/server/public/assets/{mermaid.core-C0vEBxDm.js → mermaid.core-CTd4DS6O.js} +3 -3
  329. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CShASUKd.js → mindmap-definition-QFDTVHPH-_AyvyG8C.js} +1 -1
  330. package/payload/server/public/assets/operator-Liul1QEq.js +1 -0
  331. package/payload/server/public/assets/{ordinal-H0tVmBDP.js → ordinal-Wx4m9zHk.js} +1 -1
  332. package/payload/server/public/assets/packet-4T2RLAQJ-CTU0gCGb.js +1 -0
  333. package/payload/server/public/assets/page-CYRA87CB.js +1 -0
  334. package/payload/server/public/assets/{page-BoPorLg-.js → page-Cg7B1RQx.js} +4 -4
  335. package/payload/server/public/assets/{pdf-render-jAQU0nXt.js → pdf-render-CeX6d2v7.js} +1 -1
  336. package/payload/server/public/assets/pie-ZZUOXDRM-D-EEHxhC.js +1 -0
  337. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CBZHpDAJ.js → pieDiagram-DEJITSTG-6TsUDkkQ.js} +1 -1
  338. package/payload/server/public/assets/{public-DqJk6qgW.js → public-B4HMtpjt.js} +1 -1
  339. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-n3bB3K91.js → quadrantDiagram-34T5L4WZ-CWw9gOI4.js} +1 -1
  340. package/payload/server/public/assets/radar-PYXPWWZC-DHXATZGB.js +1 -0
  341. package/payload/server/public/assets/{reduce-DAvwat-a.js → reduce-BUmc8RDR.js} +1 -1
  342. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DiDvQK3c.js → requirementDiagram-MS252O5E-DCOlxNvx.js} +1 -1
  343. package/payload/server/public/assets/{rotate-ccw-D_5cETGt.js → rotate-ccw-sz5IQSnr.js} +1 -1
  344. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DWDQQZmd.js → sankeyDiagram-XADWPNL6-CW4Xbir3.js} +1 -1
  345. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DmAqRlBT.js → sequenceDiagram-FGHM5R23-vhb_pBLG.js} +1 -1
  346. package/payload/server/public/assets/{src-DV4LKv2E.js → src-DHSQDYx-.js} +1 -1
  347. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-D4R-n6bZ.js → stateDiagram-FHFEXIEX-Cb1WExEX.js} +1 -1
  348. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CxOIKvXh.js +1 -0
  349. package/payload/server/public/assets/tasks-D9oYgEzs.js +1 -0
  350. package/payload/server/public/assets/{time-entry-format-DAwmmR3i.js → time-entry-format-CSuCexpM.js} +1 -1
  351. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CjiHGP4l.js → timeline-definition-GMOUNBTQ-BAHTf_AF.js} +1 -1
  352. package/payload/server/public/assets/treeView-SZITEDCU-CC7ouMFd.js +1 -0
  353. package/payload/server/public/assets/treemap-W4RFUUIX-CaCg27im.js +1 -0
  354. package/payload/server/public/assets/triangle-alert-ClS81-CU.js +1 -0
  355. package/payload/server/public/assets/{useCopyFeedback-rOWd_lzl.js → useCopyFeedback-Cn6YgeNx.js} +1 -1
  356. package/payload/server/public/assets/{useSelectionMode-DDmLmPph.js → useSelectionMode-BaD-ZZRk.js} +1 -1
  357. package/payload/server/public/assets/{useSubAccountSwitcher-pu0jjLCz.css → useSubAccountSwitcher-CNZL3PKn.css} +1 -1
  358. package/payload/server/public/assets/useSubAccountSwitcher-CvjWJSGv.js +9 -0
  359. package/payload/server/public/assets/{useVoiceRecorder-azG8zSUI.js → useVoiceRecorder-BOzHrDAU.js} +2 -2
  360. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CBdDQ7c-.js → vennDiagram-DHZGUBPP-DtEttvW4.js} +1 -1
  361. package/payload/server/public/assets/wardley-RL74JXVD-bMPsqQZ7.js +1 -0
  362. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BlIQPKLb.js → wardleyDiagram-NUSXRM2D-K06y6CVJ.js} +1 -1
  363. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CslKgh9B.js → xychartDiagram-5P7HB3ND-D66c40lp.js} +1 -1
  364. package/payload/server/public/browser.html +6 -6
  365. package/payload/server/public/calendar.html +7 -7
  366. package/payload/server/public/chat.html +14 -14
  367. package/payload/server/public/data.html +13 -12
  368. package/payload/server/public/graph.html +12 -12
  369. package/payload/server/public/index.html +16 -15
  370. package/payload/server/public/operator.html +16 -16
  371. package/payload/server/public/public.html +14 -14
  372. package/payload/server/public/tasks.html +6 -6
  373. package/payload/server/server.js +558 -260
  374. package/payload/server/public/assets/AdminShell-BLh9O6dn.js +0 -2
  375. package/payload/server/public/assets/architecture-YZFGNWBL-FPHT7s-C.js +0 -1
  376. package/payload/server/public/assets/calendar-_pfHw0Hp.js +0 -1
  377. package/payload/server/public/assets/channel-j70eMvcL.js +0 -1
  378. package/payload/server/public/assets/chat-DYT5H81o.js +0 -1
  379. package/payload/server/public/assets/chevron-left-BnpVBu51.js +0 -1
  380. package/payload/server/public/assets/chunk-426QAEUC-D-NcAlTW.js +0 -1
  381. package/payload/server/public/assets/chunk-QZHKN3VN-CAwbQBtf.js +0 -1
  382. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ct6Rn0vt.js +0 -1
  383. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B_2XCIFv.js +0 -1
  384. package/payload/server/public/assets/clone-DjPWA_NH.js +0 -1
  385. package/payload/server/public/assets/data-CR-fbPWr.js +0 -1
  386. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B8Hx7f-D.js +0 -1
  387. package/payload/server/public/assets/info-OMHHGYJF-BicCJTqU.js +0 -1
  388. package/payload/server/public/assets/infoDiagram-42DDH7IO-tf-8rOez.js +0 -2
  389. package/payload/server/public/assets/operator-gm2eP4r6.js +0 -1
  390. package/payload/server/public/assets/packet-4T2RLAQJ-Ckn_5hq0.js +0 -1
  391. package/payload/server/public/assets/page-8AB3jUa_.js +0 -1
  392. package/payload/server/public/assets/pie-ZZUOXDRM-DzlGQW3J.js +0 -1
  393. package/payload/server/public/assets/radar-PYXPWWZC-BHo2YD8b.js +0 -1
  394. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BcFRbGRu.js +0 -1
  395. package/payload/server/public/assets/tasks-EyKLXINi.js +0 -1
  396. package/payload/server/public/assets/treeView-SZITEDCU-BtRr5vXp.js +0 -1
  397. package/payload/server/public/assets/treemap-W4RFUUIX-D8p0sbyo.js +0 -1
  398. package/payload/server/public/assets/useSubAccountSwitcher-CU-lOxTd.js +0 -9
  399. package/payload/server/public/assets/wardley-RL74JXVD-DgMn-9ZJ.js +0 -1
  400. /package/payload/platform/plugins/cloudflare/skills/data-portal/{template/schema.sql → schema.sql} +0 -0
  401. /package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/index.html → index.html} +0 -0
  402. /package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/portal.js → portal.js} +0 -0
  403. /package/payload/server/public/assets/{_baseFor-D3BqAOBr.js → _baseFor-k8hYPe-U.js} +0 -0
  404. /package/payload/server/public/assets/{array-iYP9fzJp.js → array-BFDiaBgf.js} +0 -0
  405. /package/payload/server/public/assets/{chunk-Ck5AOu5v.js → chunk-TPjIAO9U.js} +0 -0
  406. /package/payload/server/public/assets/{cytoscape.esm-BQSBzPsB.js → cytoscape.esm-Ch0xptA4.js} +0 -0
  407. /package/payload/server/public/assets/{defaultLocale-BrdA1gDi.js → defaultLocale-ZeknFqNe.js} +0 -0
  408. /package/payload/server/public/assets/{init-Bx0S6pkp.js → init-0VJVrkRJ.js} +0 -0
  409. /package/payload/server/public/assets/{katex-BsiH_a6d.js → katex-Br7bH10N.js} +0 -0
  410. /package/payload/server/public/assets/{path-BLSgTy3w.js → path-INs8XTPH.js} +0 -0
  411. /package/payload/server/public/assets/{preload-helper-ClBMtM1g.js → preload-helper-D_sPnjeL.js} +0 -0
  412. /package/payload/server/public/assets/{rough.esm-BMOtDaaS.js → rough.esm-DU9bZLvZ.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neo4j.js","sourceRoot":"","sources":["../../src/lib/neo4j.ts"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAElE,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EACxE,wBAAwB,CACzB,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,yCAAyC,YAAY,gCAAgC,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,6DAA6D;QAC7D,oEAAoE;QACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Task 1771 — every graph read the ledger tools make.
3
+ *
4
+ * Kept in one module so the Cypher that defines "the payments on this invoice"
5
+ * exists once. If the payment read and the census read could disagree about
6
+ * what counts as a payment, the census would be reconciling against a
7
+ * different ledger than the one the tools write.
8
+ */
9
+ import type { Session } from "neo4j-driver";
10
+ import type { InvoiceRead } from "../tools/payment-record.js";
11
+ import type { StatementRows } from "../tools/statement.js";
12
+ import type { LedgerCensusRows } from "../../../../../lib/ledger-core/dist/index.js";
13
+ export declare function readInvoice(session: Session, accountId: string, ref: string): Promise<InvoiceRead | null>;
14
+ /** The op=verify re-read. Deliberately goes back to the graph rather than
15
+ * trusting the figure the write path just computed. */
16
+ export declare function verifyOutstanding(session: Session, accountId: string, ref: string): Promise<number>;
17
+ /** Re-stamps paymentStatus on the parent invoice. schema-base.md requires the
18
+ * property, so the only way to stop it lying is to keep it a projection of the
19
+ * computed outstanding. */
20
+ export declare function setPaymentStatus(session: Session, accountId: string, ref: string, status: "open" | "part-paid" | "paid"): Promise<void>;
21
+ export declare function readStatement(session: Session, accountId: string): Promise<StatementRows>;
22
+ /**
23
+ * The census rows. Each field answers one no-event failure mode: a payment
24
+ * that never got its parent edge, a balance property that has reappeared on an
25
+ * invoice, payments that look like accidental duplicates, and ledger indexes
26
+ * that are declared in schema.cypher but absent from this database.
27
+ */
28
+ export declare function readCensus(session: Session, accountId: string): Promise<LedgerCensusRows>;
29
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/lib/read.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAerF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgC7B;AAED;wDACwD;AACxD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;4BAE4B;AAC5B,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GACpC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA6CxB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAqD3B"}
@@ -0,0 +1,138 @@
1
+ import { LEDGER_INDEX_NAMES, computeOutstanding, } from "../../../../../lib/ledger-core/dist/index.js";
2
+ /** neo4j-driver returns Integer objects for counts; numbers pass through. */
3
+ function toNum(v) {
4
+ if (typeof v === "number")
5
+ return v;
6
+ if (v && typeof v === "object" && "toNumber" in v) {
7
+ return v.toNumber();
8
+ }
9
+ return 0;
10
+ }
11
+ export async function readInvoice(session, accountId, ref) {
12
+ // Staged WITH: payments collapse to one row before the credit match expands
13
+ // again, so the two OPTIONAL MATCHes never form a cartesian product that
14
+ // would double-count both sums.
15
+ const res = await session.run(`MATCH (i:Invoice|InboundInvoice {accountId: $accountId, confirmationNumber: $ref})
16
+ OPTIONAL MATCH (i)-[:HAS_PAYMENT]->(p:InvoicePayment)
17
+ WITH i, collect(DISTINCT p) AS ps
18
+ OPTIONAL MATCH (i)-[:HAS_CREDIT]->(c:Credit)
19
+ WITH i, ps, collect(DISTINCT c) AS cs
20
+ RETURN labels(i) AS labels,
21
+ i.confirmationNumber AS invoiceId,
22
+ i.totalPaymentDue AS totalPaymentDue,
23
+ i.dueDate AS dueDate,
24
+ [x IN ps | x.amount] AS payments,
25
+ [x IN ps | x.paymentId] AS paymentIds,
26
+ [x IN cs | x.amount] AS credits`, { accountId, ref });
27
+ const rec = res.records[0];
28
+ if (rec === undefined)
29
+ return null;
30
+ const labels = rec.get("labels");
31
+ return {
32
+ label: labels.includes("InboundInvoice") ? "InboundInvoice" : "Invoice",
33
+ invoiceId: rec.get("invoiceId"),
34
+ totalPaymentDue: toNum(rec.get("totalPaymentDue")),
35
+ dueDateMs: Date.parse(rec.get("dueDate") ?? "") || 0,
36
+ payments: rec.get("payments").map(toNum),
37
+ credits: rec.get("credits").map(toNum),
38
+ paymentIds: rec.get("paymentIds").filter((x) => x !== null),
39
+ };
40
+ }
41
+ /** The op=verify re-read. Deliberately goes back to the graph rather than
42
+ * trusting the figure the write path just computed. */
43
+ export async function verifyOutstanding(session, accountId, ref) {
44
+ const invoice = await readInvoice(session, accountId, ref);
45
+ if (invoice === null)
46
+ return Number.NaN;
47
+ return computeOutstanding(invoice.totalPaymentDue, invoice.payments, invoice.credits);
48
+ }
49
+ /** Re-stamps paymentStatus on the parent invoice. schema-base.md requires the
50
+ * property, so the only way to stop it lying is to keep it a projection of the
51
+ * computed outstanding. */
52
+ export async function setPaymentStatus(session, accountId, ref, status) {
53
+ await session.run(`MATCH (i:Invoice|InboundInvoice {accountId: $accountId, confirmationNumber: $ref})
54
+ SET i.paymentStatus = $status`, { accountId, ref, status });
55
+ }
56
+ export async function readStatement(session, accountId) {
57
+ const res = await session.run(`MATCH (i:Invoice|InboundInvoice {accountId: $accountId})
58
+ OPTIONAL MATCH (i)-[:HAS_PAYMENT]->(p:InvoicePayment)
59
+ WITH i, collect(DISTINCT p) AS ps
60
+ OPTIONAL MATCH (i)-[:HAS_CREDIT]->(c:Credit)
61
+ WITH i, ps, collect(DISTINCT c) AS cs
62
+ RETURN labels(i) AS labels, i.confirmationNumber AS ref,
63
+ i.totalPaymentDue AS totalPaymentDue, i.dueDate AS dueDate,
64
+ [x IN ps | x.amount] AS payments, [x IN cs | x.amount] AS credits`, { accountId });
65
+ const receivables = [];
66
+ const payables = [];
67
+ for (const rec of res.records) {
68
+ const outstanding = computeOutstanding(toNum(rec.get("totalPaymentDue")), rec.get("payments").map(toNum), rec.get("credits").map(toNum));
69
+ // A settled invoice is not part of the open position.
70
+ if (outstanding <= 0)
71
+ continue;
72
+ const row = {
73
+ ref: rec.get("ref"),
74
+ dueDateMs: Date.parse(rec.get("dueDate") ?? "") || 0,
75
+ outstanding,
76
+ };
77
+ if (rec.get("labels").includes("InboundInvoice"))
78
+ payables.push(row);
79
+ else
80
+ receivables.push(row);
81
+ }
82
+ const cash = await session.run(`MATCH (ce:CashEntry {accountId: $accountId})
83
+ RETURN ce.direction AS direction, sum(ce.amount) AS total`, { accountId });
84
+ let cashIn = 0;
85
+ let cashOut = 0;
86
+ for (const rec of cash.records) {
87
+ if (rec.get("direction") === "in")
88
+ cashIn = toNum(rec.get("total"));
89
+ else
90
+ cashOut = toNum(rec.get("total"));
91
+ }
92
+ return { receivables, payables, cashIn, cashOut };
93
+ }
94
+ /**
95
+ * The census rows. Each field answers one no-event failure mode: a payment
96
+ * that never got its parent edge, a balance property that has reappeared on an
97
+ * invoice, payments that look like accidental duplicates, and ledger indexes
98
+ * that are declared in schema.cypher but absent from this database.
99
+ */
100
+ export async function readCensus(session, accountId) {
101
+ const counts = await session.run(
102
+ // OPTIONAL MATCH, not MATCH: with no payments a plain MATCH eliminates the
103
+ // row, so records[0] is undefined and invoices reports 0 as well. That is
104
+ // exactly the flat-counts signature the census uses to detect writes that
105
+ // never landed, so the bug would manufacture its own alarm condition.
106
+ `MATCH (i:Invoice|InboundInvoice {accountId: $accountId})
107
+ WITH count(i) AS invoices
108
+ OPTIONAL MATCH (p:InvoicePayment {accountId: $accountId})
109
+ RETURN invoices, count(p) AS payments`, { accountId });
110
+ const orphans = await session.run(`MATCH (p:InvoicePayment {accountId: $accountId})
111
+ WHERE NOT ( (:Invoice|InboundInvoice)-[:HAS_PAYMENT]->(p) )
112
+ RETURN count(p) AS orphanPayments`, { accountId });
113
+ // The forbidden-property check. schema-base.md bans these on the invoice
114
+ // labels precisely because a stored figure drifts in silence.
115
+ const stored = await session.run(`MATCH (i:Invoice|InboundInvoice {accountId: $accountId})
116
+ WHERE i.outstanding IS NOT NULL OR i.balance IS NOT NULL OR i.amountPaid IS NOT NULL
117
+ RETURN count(i) AS storedBalanceProps`, { accountId });
118
+ const keys = await session.run(`MATCH (i:Invoice|InboundInvoice {accountId: $accountId})-[:HAS_PAYMENT]->(p:InvoicePayment)
119
+ RETURN i.confirmationNumber AS invoiceId, p.paymentId AS paymentId,
120
+ p.amount AS amount, p.date AS date`, { accountId });
121
+ const indexes = await session.run(`SHOW INDEXES YIELD name RETURN collect(name) AS names`);
122
+ const live = new Set(indexes.records[0]?.get("names") ?? []);
123
+ const declaredNotLive = LEDGER_INDEX_NAMES.filter((n) => !live.has(n));
124
+ return {
125
+ invoices: toNum(counts.records[0]?.get("invoices")),
126
+ payments: toNum(counts.records[0]?.get("payments")),
127
+ orphanPayments: toNum(orphans.records[0]?.get("orphanPayments")),
128
+ storedBalanceProps: toNum(stored.records[0]?.get("storedBalanceProps")),
129
+ paymentKeys: keys.records.map((r) => ({
130
+ invoiceId: r.get("invoiceId") ?? "",
131
+ paymentId: r.get("paymentId") ?? "",
132
+ amount: toNum(r.get("amount")),
133
+ date: r.get("date") ?? "",
134
+ })),
135
+ declaredNotLive,
136
+ };
137
+ }
138
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/lib/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Task 1771 — shared shapes for the ledger tools.
3
+ *
4
+ * `write` and `read` are injected rather than imported by the tool modules so
5
+ * the unit tests can exercise the decision logic without loading the Neo4j
6
+ * driver. `index.ts` passes the real `writeNodeWithEdges` and the real reads.
7
+ */
8
+ import type { Session } from "neo4j-driver";
9
+ export interface CreatedBy {
10
+ agent: string;
11
+ session: string;
12
+ tool: string;
13
+ }
14
+ export interface GraphRelationship {
15
+ type: string;
16
+ direction: "incoming" | "outgoing";
17
+ targetLabel: string;
18
+ targetProps: Record<string, unknown>;
19
+ }
20
+ export interface WriteParams {
21
+ session: Session;
22
+ labels: string[];
23
+ props: Record<string, unknown>;
24
+ relationships: GraphRelationship[];
25
+ createdBy: CreatedBy;
26
+ }
27
+ export interface WriteResult {
28
+ nodesCreated?: number;
29
+ edgesCreated?: number;
30
+ }
31
+ export type WriteFn = (params: WriteParams) => Promise<WriteResult>;
32
+ export interface ToolResult {
33
+ content: Array<{
34
+ type: "text";
35
+ text: string;
36
+ }>;
37
+ isError?: boolean;
38
+ }
39
+ export declare function ok(text: string): ToolResult;
40
+ export declare function fail(text: string): ToolResult;
41
+ /** Money as the operator typed it, formatted for a reply. */
42
+ export declare function money(n: number): string;
43
+ /** The direction of an invoice, which selects its label. Payments derive their
44
+ * own direction from whichever of these two they hang beneath. */
45
+ export type InvoiceDirection = "receivable" | "payable";
46
+ export declare function labelFor(direction: InvoiceDirection): "Invoice" | "InboundInvoice";
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE7C;AAED,6DAA6D;AAC7D,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED;mEACmE;AACnE,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;AAExD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,CAElF"}
@@ -0,0 +1,14 @@
1
+ export function ok(text) {
2
+ return { content: [{ type: "text", text }] };
3
+ }
4
+ export function fail(text) {
5
+ return { content: [{ type: "text", text }], isError: true };
6
+ }
7
+ /** Money as the operator typed it, formatted for a reply. */
8
+ export function money(n) {
9
+ return n.toFixed(2);
10
+ }
11
+ export function labelFor(direction) {
12
+ return direction === "receivable" ? "Invoice" : "InboundInvoice";
13
+ }
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AA0CA,MAAM,UAAU,EAAE,CAAC,IAAY;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AAMD,MAAM,UAAU,QAAQ,CAAC,SAA2B;IAClD,OAAO,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACnE,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Task 1771 — what is still owed on one invoice.
3
+ *
4
+ * Every figure here is computed from the invoice's children at read time. None
5
+ * of them is stored, which is why this tool and the census can never disagree
6
+ * with each other about the same invoice.
7
+ */
8
+ import type { Session } from "neo4j-driver";
9
+ import { type ReadFn } from "./payment-record.js";
10
+ import { type ToolResult } from "../lib/types.js";
11
+ export interface BalanceParams {
12
+ session: Session;
13
+ read: ReadFn;
14
+ accountId: string;
15
+ invoiceRef: string;
16
+ }
17
+ export declare function balance(params: BalanceParams): Promise<ToolResult>;
18
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/tools/balance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CA8BxE"}
@@ -0,0 +1,23 @@
1
+ import { computeOutstanding } from "../../../../../lib/ledger-core/dist/index.js";
2
+ import { fail, money, ok } from "../lib/types.js";
3
+ export async function balance(params) {
4
+ const { session, read, accountId, invoiceRef } = params;
5
+ const invoice = await read(session, accountId, invoiceRef);
6
+ if (invoice === null) {
7
+ // Reporting zero for an unknown reference would read as "nothing owed",
8
+ // which is the opposite of "I could not find it".
9
+ return fail(`[ledger] op=reject reason=unknown-invoice ref=${invoiceRef} — no invoice or bill with that reference on this account.`);
10
+ }
11
+ const applied = invoice.payments.reduce((a, b) => a + b, 0);
12
+ const credited = invoice.credits.reduce((a, b) => a + b, 0);
13
+ const outstanding = computeOutstanding(invoice.totalPaymentDue, invoice.payments, invoice.credits);
14
+ const kind = invoice.label === "Invoice" ? "Invoice" : "Bill";
15
+ return ok([
16
+ `${kind} ${invoiceRef}`,
17
+ `Total: ${money(invoice.totalPaymentDue)}`,
18
+ `Paid: ${money(applied)} across ${invoice.payments.length} payment(s)`,
19
+ `Credits: ${money(credited)}`,
20
+ `Outstanding: ${money(outstanding)}`,
21
+ ].join("\n"));
22
+ }
23
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/tools/balance.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAElF,OAAO,EAAmB,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AASnE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAqB;IACjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAExD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,wEAAwE;QACxE,kDAAkD;QAClD,OAAO,IAAI,CACT,iDAAiD,UAAU,4DAA4D,CACxH,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,kBAAkB,CACpC,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,OAAO,CAChB,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9D,OAAO,EAAE,CACP;QACE,GAAG,IAAI,IAAI,UAAU,EAAE;QACvB,UAAU,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;QAC1C,SAAS,KAAK,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,MAAM,aAAa;QACtE,YAAY,KAAK,CAAC,QAAQ,CAAC,EAAE;QAC7B,gBAAgB,KAAK,CAAC,WAAW,CAAC,EAAE;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Task 1771 — a movement of money attached to no invoice.
3
+ *
4
+ * Bank charges, a cash sale, drawings, a refund. `:CashEntry` is the one
5
+ * ledger label that stores its own `direction`, because unlike an
6
+ * `:InvoicePayment` it has no parent invoice to derive it from.
7
+ */
8
+ import type { Session } from "neo4j-driver";
9
+ import { type CreatedBy, type ToolResult, type WriteFn } from "../lib/types.js";
10
+ export interface CashRecordParams {
11
+ session: Session;
12
+ write: WriteFn;
13
+ accountId: string;
14
+ createdBy: CreatedBy;
15
+ direction: "in" | "out";
16
+ amount: number;
17
+ date: string;
18
+ description: string;
19
+ counterparty?: string;
20
+ /** schema-base.md declares COUNTERPARTY to both :Person and :Organization.
21
+ * Defaulting everything to Organization would file a person under the
22
+ * business list and split their identity across two labels. */
23
+ counterpartyType?: "person" | "organization";
24
+ }
25
+ export declare function cashRecord(params: CashRecordParams): Promise<ToolResult>;
26
+ //# sourceMappingURL=cash-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cash-record.d.ts","sourceRoot":"","sources":["../../src/tools/cash-record.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,UAAU,EACf,KAAK,OAAO,EAIb,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;oEAEgE;IAChE,gBAAgB,CAAC,EAAE,QAAQ,GAAG,cAAc,CAAC;CAC9C;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAuD9E"}
@@ -0,0 +1,33 @@
1
+ import { cashEntryIdFor } from "../lib/ids.js";
2
+ import { fail, money, ok, } from "../lib/types.js";
3
+ export async function cashRecord(params) {
4
+ const { session, write, accountId, createdBy, direction, amount, date, description, counterparty, counterpartyType, } = params;
5
+ const text = description.trim();
6
+ if (text === "") {
7
+ return fail("[ledger] op=reject reason=blank-description — a cash entry with no description is unauditable later. Nothing was written.");
8
+ }
9
+ if (!(amount > 0)) {
10
+ return fail(`[ledger] op=reject reason=non-positive-amount amount=${amount} — direction carries the sign, so the amount is always positive. Nothing was written.`);
11
+ }
12
+ const entryId = cashEntryIdFor(accountId, direction, amount, date, text);
13
+ const relationships = counterparty === undefined || counterparty.trim() === ""
14
+ ? []
15
+ : [
16
+ {
17
+ type: "COUNTERPARTY",
18
+ direction: "outgoing",
19
+ targetLabel: counterpartyType === "person" ? "Person" : "Organization",
20
+ targetProps: { accountId, name: counterparty.trim() },
21
+ },
22
+ ];
23
+ const result = await write({
24
+ session,
25
+ labels: ["CashEntry"],
26
+ props: { accountId, entryId, direction, amount, date, description: text },
27
+ relationships,
28
+ createdBy,
29
+ });
30
+ console.error(`[ledger] op=write tool=cash-record entryId=${entryId} direction=${direction} amount=${money(amount)} nodesCreated=${result.nodesCreated ?? 0} edgesCreated=${result.edgesCreated ?? 0}`);
31
+ return ok(`Recorded ${money(amount)} ${direction === "in" ? "received" : "paid out"} on ${date}: ${text}.`);
32
+ }
33
+ //# sourceMappingURL=cash-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cash-record.js","sourceRoot":"","sources":["../../src/tools/cash-record.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAKL,IAAI,EACJ,KAAK,EACL,EAAE,GACH,MAAM,iBAAiB,CAAC;AAkBzB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwB;IACvD,MAAM,EACJ,OAAO,EACP,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,EACN,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,GAAG,MAAM,CAAC;IAEX,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CACT,2HAA2H,CAC5H,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CACT,wDAAwD,MAAM,uFAAuF,CACtJ,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEzE,MAAM,aAAa,GACjB,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;QACtD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc;gBACtE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,EAAE;aACtD;SACF,CAAC;IAER,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO;QACP,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QACzE,aAAa;QACb,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CACX,8CAA8C,OAAO,cAAc,SAAS,WAAW,KAAK,CAAC,MAAM,CAAC,iBAAiB,MAAM,CAAC,YAAY,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,CACzL,CAAC;IAEF,OAAO,EAAE,CACP,YAAY,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,IAAI,KAAK,IAAI,GAAG,CACjG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Task 1771 — raise a receivable invoice, or record a payable bill.
3
+ *
4
+ * One tool for both directions because they are the same document seen from
5
+ * two sides; the required `direction` selects `:Invoice` or `:InboundInvoice`.
6
+ * Nothing here stores what is owed: `totalPaymentDue` is the face value of the
7
+ * bill and outstanding is computed on read from the payment and credit
8
+ * children.
9
+ */
10
+ import type { Session } from "neo4j-driver";
11
+ import { type CreatedBy, type InvoiceDirection, type ToolResult, type WriteFn } from "../lib/types.js";
12
+ export interface InvoiceRecordParams {
13
+ session: Session;
14
+ write: WriteFn;
15
+ accountId: string;
16
+ createdBy: CreatedBy;
17
+ direction: InvoiceDirection;
18
+ /** The invoice or bill reference. Natural key with accountId. */
19
+ confirmationNumber: string;
20
+ /** Who owes it (receivable) or who is owed (payable). */
21
+ counterparty: string;
22
+ totalPaymentDue: number;
23
+ dueDate: string;
24
+ description?: string;
25
+ }
26
+ export declare function invoiceRecord(params: InvoiceRecordParams): Promise<ToolResult>;
27
+ //# sourceMappingURL=invoice-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-record.d.ts","sourceRoot":"","sources":["../../src/tools/invoice-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,OAAO,EAKb,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,iEAAiE;IACjE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4DpF"}
@@ -0,0 +1,40 @@
1
+ import { fail, labelFor, money, ok, } from "../lib/types.js";
2
+ export async function invoiceRecord(params) {
3
+ const { session, write, accountId, createdBy, direction, confirmationNumber, counterparty, totalPaymentDue, dueDate, description, } = params;
4
+ const ref = confirmationNumber.trim();
5
+ if (ref === "") {
6
+ return fail("[ledger] op=reject reason=blank-reference — an invoice needs a reference to be found by later.");
7
+ }
8
+ if (!(totalPaymentDue > 0)) {
9
+ return fail(`[ledger] op=reject reason=non-positive-total total=${totalPaymentDue} — an invoice for nothing is not an invoice. Nothing was written.`);
10
+ }
11
+ const label = labelFor(direction);
12
+ const isPayable = direction === "payable";
13
+ const props = {
14
+ accountId,
15
+ confirmationNumber: ref,
16
+ totalPaymentDue,
17
+ paymentStatus: "open",
18
+ dueDate,
19
+ };
20
+ // The two labels name their counterparty differently: schema-base.md requires
21
+ // `supplier` on InboundInvoice and `customer` on Invoice.
22
+ if (isPayable)
23
+ props.supplier = counterparty;
24
+ else
25
+ props.customer = counterparty;
26
+ if (description !== undefined)
27
+ props.description = description;
28
+ const relationships = [
29
+ {
30
+ type: isPayable ? "FROM_SUPPLIER" : "BILLED_TO",
31
+ direction: "outgoing",
32
+ targetLabel: "Organization",
33
+ targetProps: { accountId, name: counterparty },
34
+ },
35
+ ];
36
+ const result = await write({ session, labels: [label], props, relationships, createdBy });
37
+ console.error(`[ledger] op=write tool=invoice-record ref=${ref} label=${label} total=${money(totalPaymentDue)} nodesCreated=${result.nodesCreated ?? 0} edgesCreated=${result.edgesCreated ?? 0}`);
38
+ return ok(`Recorded ${label === "Invoice" ? "invoice" : "bill"} ${ref} for ${counterparty}, ${money(totalPaymentDue)} due ${dueDate}. Outstanding is computed from payments, not stored.`);
39
+ }
40
+ //# sourceMappingURL=invoice-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-record.js","sourceRoot":"","sources":["../../src/tools/invoice-record.ts"],"names":[],"mappings":"AAUA,OAAO,EAML,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,EAAE,GACH,MAAM,iBAAiB,CAAC;AAiBzB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2B;IAC7D,MAAM,EACJ,OAAO,EACP,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,OAAO,EACP,WAAW,GACZ,GAAG,MAAM,CAAC;IAEX,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CACT,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CACT,sDAAsD,eAAe,mEAAmE,CACzI,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC;IAE1C,MAAM,KAAK,GAA4B;QACrC,SAAS;QACT,kBAAkB,EAAE,GAAG;QACvB,eAAe;QACf,aAAa,EAAE,MAAM;QACrB,OAAO;KACR,CAAC;IACF,8EAA8E;IAC9E,0DAA0D;IAC1D,IAAI,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC;;QACxC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC;IACnC,IAAI,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAE/D,MAAM,aAAa,GAAwB;QACzC;YACE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW;YAC/C,SAAS,EAAE,UAAU;YACrB,WAAW,EAAE,cAAc;YAC3B,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;SAC/C;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1F,OAAO,CAAC,KAAK,CACX,6CAA6C,GAAG,UAAU,KAAK,UAAU,KAAK,CAAC,eAAe,CAAC,iBAAiB,MAAM,CAAC,YAAY,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,CACpL,CAAC;IAEF,OAAO,EAAE,CACP,YAAY,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,QAAQ,YAAY,KAAK,KAAK,CAAC,eAAe,CAAC,QAAQ,OAAO,sDAAsD,CAChL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Task 1771 — apply a payment or a credit to an invoice.
3
+ *
4
+ * One code path for both because a credit reduces what is owed exactly as a
5
+ * payment does; they differ in provenance, not arithmetic, and splitting them
6
+ * would mean two places to get the over-application rule wrong.
7
+ *
8
+ * The lifecycle here is the point of the task. `op=write` proves only that the
9
+ * write was issued. `op=verify` re-reads outstanding from the graph afterwards
10
+ * and compares it against what the arithmetic predicted; a mismatch is reported
11
+ * as an error rather than swallowed, because a ledger that silently disagrees
12
+ * with itself is worse than one that refuses.
13
+ */
14
+ import type { Session } from "neo4j-driver";
15
+ import { type CreatedBy, type ToolResult, type WriteFn } from "../lib/types.js";
16
+ /** What a resolved invoice looks like to this tool. */
17
+ export interface InvoiceRead {
18
+ label: "Invoice" | "InboundInvoice";
19
+ invoiceId: string;
20
+ totalPaymentDue: number;
21
+ dueDateMs: number;
22
+ payments: number[];
23
+ credits: number[];
24
+ paymentIds: string[];
25
+ }
26
+ export type ReadFn = (session: Session, accountId: string, ref: string) => Promise<InvoiceRead | null>;
27
+ /** Re-reads outstanding straight from the graph after the write. */
28
+ export type VerifyFn = (session: Session, accountId: string, ref: string) => Promise<number>;
29
+ /** Re-stamps the parent's paymentStatus from the recomputed outstanding. */
30
+ export type SetStatusFn = (session: Session, accountId: string, ref: string, status: "open" | "part-paid" | "paid") => Promise<void>;
31
+ export interface PaymentRecordParams {
32
+ session: Session;
33
+ read: ReadFn;
34
+ write: WriteFn;
35
+ verify: VerifyFn;
36
+ setStatus: SetStatusFn;
37
+ accountId: string;
38
+ createdBy: CreatedBy;
39
+ invoiceRef: string;
40
+ amount: number;
41
+ date: string;
42
+ paymentType: string;
43
+ kind: "payment" | "credit";
44
+ }
45
+ export declare function paymentRecord(params: PaymentRecordParams): Promise<ToolResult>;
46
+ //# sourceMappingURL=payment-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-record.d.ts","sourceRoot":"","sources":["../../src/tools/payment-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EAIb,MAAM,iBAAiB,CAAC;AAEzB,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,MAAM,GAAG,CACnB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAEjC,oEAAoE;AACpE,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,4EAA4E;AAC5E,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC5B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8HpF"}
@@ -0,0 +1,68 @@
1
+ import { applyPayment, computeOutstanding } from "../../../../../lib/ledger-core/dist/index.js";
2
+ import { creditIdFor, paymentIdFor } from "../lib/ids.js";
3
+ import { fail, money, ok, } from "../lib/types.js";
4
+ export async function paymentRecord(params) {
5
+ const { session, read, write, verify, setStatus, accountId, createdBy, invoiceRef, amount, date, paymentType, kind, } = params;
6
+ const started = Date.now();
7
+ const isCredit = kind === "credit";
8
+ const invoice = await read(session, accountId, invoiceRef);
9
+ if (invoice === null) {
10
+ console.error(`[ledger] op=reject tool=payment-record ref=${invoiceRef} reason=unknown-invoice`);
11
+ return fail(`[ledger] op=reject reason=unknown-invoice ref=${invoiceRef} — no invoice or bill with that reference on this account. Nothing was written.`);
12
+ }
13
+ console.error(`[ledger] op=resolve tool=payment-record ref=${invoiceRef} found=true label=${invoice.label} totalPaymentDue=${money(invoice.totalPaymentDue)}`);
14
+ // A credit reduces a receivable. An InboundInvoice is money we owe; reducing
15
+ // it is a supplier credit note, which is a different document and not in
16
+ // scope, so refuse rather than write a Credit the reader cannot interpret.
17
+ if (isCredit && invoice.label === "InboundInvoice") {
18
+ console.error(`[ledger] op=reject tool=payment-record ref=${invoiceRef} reason=credit-on-payable`);
19
+ return fail(`[ledger] op=reject reason=credit-on-payable ref=${invoiceRef} — credits apply to invoices you raised, not to bills you received. Nothing was written.`);
20
+ }
21
+ const outcome = applyPayment(invoice.totalPaymentDue, invoice.payments, invoice.credits, amount);
22
+ const outstandingBefore = computeOutstanding(invoice.totalPaymentDue, invoice.payments, invoice.credits);
23
+ if (!outcome.accepted) {
24
+ console.error(`[ledger] op=reject tool=payment-record ref=${invoiceRef} reason=over-application amount=${money(amount)} remaining=${money(outcome.remaining)}`);
25
+ return fail(`[ledger] op=reject reason=over-application ref=${invoiceRef} — ${money(amount)} exceeds the ${money(outcome.remaining)} still outstanding. Nothing was written. Record ${money(outcome.remaining)} to settle it, or raise a separate invoice for the excess.`);
26
+ }
27
+ console.error(`[ledger] op=arithmetic tool=payment-record ref=${invoiceRef} priorApplied=${money(invoice.payments.reduce((a, b) => a + b, 0))} priorCredits=${money(invoice.credits.reduce((a, b) => a + b, 0))} amount=${money(amount)} outstandingBefore=${money(outstandingBefore)} outstandingAfter=${money(outcome.outstandingAfter)}`);
28
+ const childId = isCredit
29
+ ? creditIdFor(accountId, invoice.invoiceId, amount, date)
30
+ : paymentIdFor(accountId, invoice.invoiceId, amount, date, paymentType);
31
+ // Direction is NOT stored. Which of the two parent labels this hangs from is
32
+ // what says whether the money came in or went out.
33
+ const props = isCredit
34
+ ? { accountId, creditId: childId, amount, date }
35
+ : { accountId, invoiceId: invoice.invoiceId, paymentId: childId, amount, date, paymentType };
36
+ const result = await write({
37
+ session,
38
+ labels: [isCredit ? "Credit" : "InvoicePayment"],
39
+ props,
40
+ relationships: [
41
+ {
42
+ type: isCredit ? "HAS_CREDIT" : "HAS_PAYMENT",
43
+ direction: "incoming",
44
+ targetLabel: invoice.label,
45
+ targetProps: { accountId, confirmationNumber: invoice.invoiceId },
46
+ },
47
+ ],
48
+ createdBy,
49
+ });
50
+ console.error(`[ledger] op=write tool=payment-record ref=${invoiceRef} ${isCredit ? "creditId" : "paymentId"}=${childId} nodesCreated=${result.nodesCreated ?? 0} edgesCreated=${result.edgesCreated ?? 0}`);
51
+ const reRead = await verify(session, accountId, invoiceRef);
52
+ console.error(`[ledger] op=verify tool=payment-record ref=${invoiceRef} outstandingReRead=${money(reRead)} outstandingAfter=${money(outcome.outstandingAfter)}`);
53
+ if (reRead !== outcome.outstandingAfter) {
54
+ console.error(`[ledger] op=exit tool=payment-record ref=${invoiceRef} ranMs=${Date.now() - started} outcome=error`);
55
+ return fail(`[ledger] op=verify mismatch ref=${invoiceRef} — the write was issued but re-reading the invoice gives ${money(reRead)} outstanding where the arithmetic expected ${money(outcome.outstandingAfter)}. Treat this invoice as unreliable until reconciled; do not record further payments against it.`);
56
+ }
57
+ // schema-base.md requires paymentStatus on both invoice labels, so it cannot
58
+ // simply be dropped the way a stored balance was. Left unmaintained it lies
59
+ // in exactly the same way: an invoice settled in full would read "open"
60
+ // forever. Re-stamp it from the figure just verified, so the stored status is
61
+ // always a projection of the computed one rather than a rival to it.
62
+ const status = reRead === 0 ? "paid" : "part-paid";
63
+ await setStatus(session, accountId, invoiceRef, status);
64
+ console.error(`[ledger] op=status tool=payment-record ref=${invoiceRef} paymentStatus=${status}`);
65
+ console.error(`[ledger] op=exit tool=payment-record ref=${invoiceRef} ranMs=${Date.now() - started} outcome=applied`);
66
+ return ok(`Recorded ${money(amount)} ${isCredit ? "credit" : "payment"} against ${invoiceRef}. Outstanding is now ${money(reRead)}, re-read from the graph.`);
67
+ }
68
+ //# sourceMappingURL=payment-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-record.js","sourceRoot":"","sources":["../../src/tools/payment-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Task 1771 — the on-demand form of the ledger census.
3
+ *
4
+ * This calls the same `reconcileLedger` as the standing interval in the UI
5
+ * server. The tool exists so an operator can ask "is the ledger healthy" mid
6
+ * conversation; the interval exists because a failure that emits no event
7
+ * cannot wait for someone to ask.
8
+ */
9
+ import type { Session } from "neo4j-driver";
10
+ import { type LedgerCensusRows } from "../../../../../lib/ledger-core/dist/index.js";
11
+ import { type ToolResult } from "../lib/types.js";
12
+ export type CensusReadFn = (session: Session, accountId: string) => Promise<LedgerCensusRows>;
13
+ export interface ReconcileParams {
14
+ session: Session;
15
+ read: CensusReadFn;
16
+ accountId: string;
17
+ now: number;
18
+ }
19
+ export declare function reconcile(params: ReconcileParams): Promise<ToolResult>;
20
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/tools/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,KAAK,UAAU,EAAM,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAuC5E"}