@rubytech/create-maxy-code 0.1.470 → 0.1.471

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 (423) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/config/brand.json +1 -1
  3. package/payload/platform/docs/superpowers/plans/2026-07-18-graph-native-ledger.md +807 -0
  4. package/payload/platform/docs/superpowers/specs/2026-07-18-graph-native-ledger-design.md +241 -0
  5. package/payload/platform/lib/ledger-core/dist/ageing.d.ts +14 -0
  6. package/payload/platform/lib/ledger-core/dist/ageing.d.ts.map +1 -0
  7. package/payload/platform/lib/ledger-core/dist/ageing.js +38 -0
  8. package/payload/platform/lib/ledger-core/dist/ageing.js.map +1 -0
  9. package/payload/platform/lib/ledger-core/dist/balance.d.ts +25 -0
  10. package/payload/platform/lib/ledger-core/dist/balance.d.ts.map +1 -0
  11. package/payload/platform/lib/ledger-core/dist/balance.js +38 -0
  12. package/payload/platform/lib/ledger-core/dist/balance.js.map +1 -0
  13. package/payload/platform/lib/ledger-core/dist/index.d.ts +5 -0
  14. package/payload/platform/lib/ledger-core/dist/index.d.ts.map +1 -0
  15. package/payload/platform/lib/ledger-core/dist/index.js +5 -0
  16. package/payload/platform/lib/ledger-core/dist/index.js.map +1 -0
  17. package/payload/platform/lib/ledger-core/dist/money.d.ts +12 -0
  18. package/payload/platform/lib/ledger-core/dist/money.d.ts.map +1 -0
  19. package/payload/platform/lib/ledger-core/dist/money.js +16 -0
  20. package/payload/platform/lib/ledger-core/dist/money.js.map +1 -0
  21. package/payload/platform/lib/ledger-core/dist/reconcile.d.ts +51 -0
  22. package/payload/platform/lib/ledger-core/dist/reconcile.d.ts.map +1 -0
  23. package/payload/platform/lib/ledger-core/dist/reconcile.js +77 -0
  24. package/payload/platform/lib/ledger-core/dist/reconcile.js.map +1 -0
  25. package/payload/platform/lib/ledger-core/package.json +16 -0
  26. package/payload/platform/lib/ledger-core/src/__tests__/ageing.test.ts +42 -0
  27. package/payload/platform/lib/ledger-core/src/__tests__/balance.test.ts +48 -0
  28. package/payload/platform/lib/ledger-core/src/__tests__/reconcile.test.ts +87 -0
  29. package/payload/platform/lib/ledger-core/src/ageing.ts +51 -0
  30. package/payload/platform/lib/ledger-core/src/balance.ts +52 -0
  31. package/payload/platform/lib/ledger-core/src/index.ts +4 -0
  32. package/payload/platform/lib/ledger-core/src/money.ts +17 -0
  33. package/payload/platform/lib/ledger-core/src/reconcile.ts +109 -0
  34. package/payload/platform/lib/ledger-core/tsconfig.json +6 -0
  35. package/payload/platform/neo4j/schema.cypher +16 -0
  36. package/payload/platform/package.json +2 -2
  37. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  38. package/payload/platform/plugins/admin/hooks/lib/maxy-mcp-plugins.txt +1 -0
  39. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +98 -2
  40. package/payload/platform/plugins/cloudflare/bin/__tests__/portal-brand-css.test.sh +139 -0
  41. package/payload/platform/plugins/cloudflare/bin/portal-brand-css.mjs +128 -0
  42. package/payload/platform/plugins/cloudflare/mcp/__tests__/portal-enrol.test.ts +1 -1
  43. package/payload/platform/plugins/cloudflare/mcp/__tests__/skill-contract.test.ts +25 -0
  44. package/payload/platform/plugins/cloudflare/mcp/__tests__/template-config.test.ts +55 -3
  45. package/payload/platform/plugins/cloudflare/skills/data-portal/SKILL.md +38 -3
  46. package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/portal.css → portal.css} +13 -2
  47. package/payload/platform/plugins/cloudflare/skills/data-portal/template/wrangler.toml +1 -1
  48. package/payload/platform/plugins/docs/references/admin-ui.md +48 -0
  49. package/payload/platform/plugins/docs/references/internals.md +1 -1
  50. package/payload/platform/plugins/docs/references/ledger.md +43 -0
  51. package/payload/platform/plugins/email/PLUGIN.md +4 -0
  52. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.d.ts +2 -0
  53. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.d.ts.map +1 -0
  54. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.js +196 -0
  55. package/payload/platform/plugins/email/mcp/dist/__tests__/display-truncation.test.js.map +1 -0
  56. package/payload/platform/plugins/email/mcp/dist/__tests__/source-fetch-efficiency.test.js +10 -8
  57. package/payload/platform/plugins/email/mcp/dist/__tests__/source-fetch-efficiency.test.js.map +1 -1
  58. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.d.ts +2 -0
  59. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.d.ts.map +1 -0
  60. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.js +110 -0
  61. package/payload/platform/plugins/email/mcp/dist/__tests__/truncation-tool-output.test.js.map +1 -0
  62. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +22 -0
  63. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  64. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +90 -36
  65. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  66. package/payload/platform/plugins/email/mcp/dist/tools/email-read.d.ts.map +1 -1
  67. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js +6 -2
  68. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js.map +1 -1
  69. package/payload/platform/plugins/email/mcp/dist/tools/email-search.d.ts.map +1 -1
  70. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js +6 -2
  71. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js.map +1 -1
  72. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +4 -0
  73. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.d.ts +2 -0
  74. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js +60 -0
  76. package/payload/platform/plugins/google/mcp/dist/__tests__/account-register.test.js.map +1 -0
  77. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.d.ts +2 -0
  78. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.d.ts.map +1 -0
  79. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.js +48 -0
  80. package/payload/platform/plugins/google/mcp/dist/__tests__/calendar-tools.test.js.map +1 -0
  81. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.d.ts +2 -0
  82. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.d.ts.map +1 -0
  83. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js +25 -0
  84. package/payload/platform/plugins/google/mcp/dist/__tests__/google-client.test.js.map +1 -0
  85. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.d.ts +2 -0
  86. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.d.ts.map +1 -0
  87. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js +40 -0
  88. package/payload/platform/plugins/google/mcp/dist/__tests__/index-registration.test.js.map +1 -0
  89. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.d.ts +2 -0
  90. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.d.ts.map +1 -0
  91. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.js +35 -0
  92. package/payload/platform/plugins/google/mcp/dist/__tests__/pending-store.test.js.map +1 -0
  93. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.d.ts +2 -0
  94. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.d.ts.map +1 -0
  95. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.js +85 -0
  96. package/payload/platform/plugins/google/mcp/dist/__tests__/token-store.test.js.map +1 -0
  97. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts +25 -0
  98. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.d.ts.map +1 -0
  99. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.js +87 -0
  100. package/payload/platform/plugins/google/mcp/dist/auth/pending-store.js.map +1 -0
  101. package/payload/platform/plugins/google/mcp/dist/auth/token-store.d.ts +46 -0
  102. package/payload/platform/plugins/google/mcp/dist/auth/token-store.d.ts.map +1 -0
  103. package/payload/platform/plugins/google/mcp/dist/auth/token-store.js +138 -0
  104. package/payload/platform/plugins/google/mcp/dist/auth/token-store.js.map +1 -0
  105. package/payload/platform/plugins/google/mcp/dist/index.d.ts +25 -0
  106. package/payload/platform/plugins/google/mcp/dist/index.d.ts.map +1 -0
  107. package/payload/platform/plugins/google/mcp/dist/index.js +300 -0
  108. package/payload/platform/plugins/google/mcp/dist/index.js.map +1 -0
  109. package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts +28 -0
  110. package/payload/platform/plugins/google/mcp/dist/lib/google-client.d.ts.map +1 -0
  111. package/payload/platform/plugins/google/mcp/dist/lib/google-client.js +102 -0
  112. package/payload/platform/plugins/google/mcp/dist/lib/google-client.js.map +1 -0
  113. package/payload/platform/plugins/google/mcp/dist/lib/log.d.ts +3 -0
  114. package/payload/platform/plugins/google/mcp/dist/lib/log.d.ts.map +1 -0
  115. package/payload/platform/plugins/google/mcp/dist/lib/log.js +16 -0
  116. package/payload/platform/plugins/google/mcp/dist/lib/log.js.map +1 -0
  117. package/payload/platform/plugins/google/mcp/dist/tools/account-info.d.ts +12 -0
  118. package/payload/platform/plugins/google/mcp/dist/tools/account-info.d.ts.map +1 -0
  119. package/payload/platform/plugins/google/mcp/dist/tools/account-info.js +23 -0
  120. package/payload/platform/plugins/google/mcp/dist/tools/account-info.js.map +1 -0
  121. package/payload/platform/plugins/google/mcp/dist/tools/account-list.d.ts +12 -0
  122. package/payload/platform/plugins/google/mcp/dist/tools/account-list.d.ts.map +1 -0
  123. package/payload/platform/plugins/google/mcp/dist/tools/account-list.js +9 -0
  124. package/payload/platform/plugins/google/mcp/dist/tools/account-list.js.map +1 -0
  125. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts +42 -0
  126. package/payload/platform/plugins/google/mcp/dist/tools/account-register.d.ts.map +1 -0
  127. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js +102 -0
  128. package/payload/platform/plugins/google/mcp/dist/tools/account-register.js.map +1 -0
  129. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.d.ts +10 -0
  130. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.d.ts.map +1 -0
  131. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.js +9 -0
  132. package/payload/platform/plugins/google/mcp/dist/tools/calendar-cancel.js.map +1 -0
  133. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.d.ts +20 -0
  134. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.d.ts.map +1 -0
  135. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.js +25 -0
  136. package/payload/platform/plugins/google/mcp/dist/tools/calendar-create.js.map +1 -0
  137. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.d.ts +6 -0
  138. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.d.ts.map +1 -0
  139. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.js +7 -0
  140. package/payload/platform/plugins/google/mcp/dist/tools/calendar-event.js.map +1 -0
  141. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.d.ts +14 -0
  142. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.d.ts.map +1 -0
  143. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.js +16 -0
  144. package/payload/platform/plugins/google/mcp/dist/tools/calendar-freebusy.js.map +1 -0
  145. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.d.ts +44 -0
  146. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.d.ts.map +1 -0
  147. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.js +36 -0
  148. package/payload/platform/plugins/google/mcp/dist/tools/calendar-list.js.map +1 -0
  149. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.d.ts +16 -0
  150. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.d.ts.map +1 -0
  151. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.js +29 -0
  152. package/payload/platform/plugins/google/mcp/dist/tools/calendar-respond.js.map +1 -0
  153. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.d.ts +16 -0
  154. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.d.ts.map +1 -0
  155. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.js +32 -0
  156. package/payload/platform/plugins/google/mcp/dist/tools/calendar-update.js.map +1 -0
  157. package/payload/platform/plugins/google/references/auth.md +35 -0
  158. package/payload/platform/plugins/ledger/.claude-plugin/plugin.json +21 -0
  159. package/payload/platform/plugins/ledger/PLUGIN.md +82 -0
  160. package/payload/platform/plugins/ledger/lib/mcp-spawn-tee/index.js +193 -0
  161. package/payload/platform/plugins/ledger/lib/mcp-spawn-tee/package.json +3 -0
  162. package/payload/platform/plugins/ledger/mcp/dist/index.d.ts +2 -0
  163. package/payload/platform/plugins/ledger/mcp/dist/index.d.ts.map +1 -0
  164. package/payload/platform/plugins/ledger/mcp/dist/index.js +168 -0
  165. package/payload/platform/plugins/ledger/mcp/dist/index.js.map +1 -0
  166. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.d.ts +4 -0
  167. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.d.ts.map +1 -0
  168. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.js +0 -0
  169. package/payload/platform/plugins/ledger/mcp/dist/lib/ids.js.map +1 -0
  170. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.d.ts +5 -0
  171. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.d.ts.map +1 -0
  172. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.js +40 -0
  173. package/payload/platform/plugins/ledger/mcp/dist/lib/neo4j.js.map +1 -0
  174. package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts +29 -0
  175. package/payload/platform/plugins/ledger/mcp/dist/lib/read.d.ts.map +1 -0
  176. package/payload/platform/plugins/ledger/mcp/dist/lib/read.js +138 -0
  177. package/payload/platform/plugins/ledger/mcp/dist/lib/read.js.map +1 -0
  178. package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts +47 -0
  179. package/payload/platform/plugins/ledger/mcp/dist/lib/types.d.ts.map +1 -0
  180. package/payload/platform/plugins/ledger/mcp/dist/lib/types.js +14 -0
  181. package/payload/platform/plugins/ledger/mcp/dist/lib/types.js.map +1 -0
  182. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.d.ts +18 -0
  183. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.d.ts.map +1 -0
  184. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.js +23 -0
  185. package/payload/platform/plugins/ledger/mcp/dist/tools/balance.js.map +1 -0
  186. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts +26 -0
  187. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.d.ts.map +1 -0
  188. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js +33 -0
  189. package/payload/platform/plugins/ledger/mcp/dist/tools/cash-record.js.map +1 -0
  190. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts +27 -0
  191. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.d.ts.map +1 -0
  192. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js +40 -0
  193. package/payload/platform/plugins/ledger/mcp/dist/tools/invoice-record.js.map +1 -0
  194. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts +46 -0
  195. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.d.ts.map +1 -0
  196. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js +68 -0
  197. package/payload/platform/plugins/ledger/mcp/dist/tools/payment-record.js.map +1 -0
  198. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts +20 -0
  199. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.d.ts.map +1 -0
  200. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js +30 -0
  201. package/payload/platform/plugins/ledger/mcp/dist/tools/reconcile.js.map +1 -0
  202. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.d.ts +26 -0
  203. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.d.ts.map +1 -0
  204. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.js +35 -0
  205. package/payload/platform/plugins/ledger/mcp/dist/tools/statement.js.map +1 -0
  206. package/payload/platform/plugins/ledger/mcp/package.json +21 -0
  207. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.d.ts +2 -0
  208. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.d.ts.map +1 -0
  209. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.js +81 -0
  210. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/ledger-vertical-coverage.test.js.map +1 -0
  211. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts +9 -7
  212. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.d.ts.map +1 -1
  213. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js +10 -8
  214. package/payload/platform/plugins/memory/mcp/dist/lib/schema-loader.js.map +1 -1
  215. package/payload/platform/plugins/memory/references/schema-base.md +22 -0
  216. package/payload/platform/plugins/memory/references/schema-construction.md +0 -18
  217. package/payload/platform/plugins/scheduling/PLUGIN.md +20 -0
  218. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.d.ts.map +1 -1
  219. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js +11 -2
  220. package/payload/platform/plugins/scheduling/mcp/dist/lib/meeting-write.js.map +1 -1
  221. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +1 -1
  222. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  223. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +3 -3
  224. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
  225. package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts +138 -0
  226. package/payload/platform/services/claude-session-manager/dist/activity-rows.d.ts.map +1 -0
  227. package/payload/platform/services/claude-session-manager/dist/activity-rows.js +268 -0
  228. package/payload/platform/services/claude-session-manager/dist/activity-rows.js.map +1 -0
  229. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  230. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
  231. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  232. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +6 -0
  233. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  234. package/payload/platform/services/claude-session-manager/dist/http-server.js +42 -0
  235. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  236. package/payload/platform/services/claude-session-manager/dist/index.js +10 -1
  237. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  238. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +80 -6
  239. package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
  240. package/payload/platform/services/claude-session-manager/dist/pty-census.js +96 -20
  241. package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
  242. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
  243. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +5 -1
  244. package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
  245. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  246. package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
  247. package/payload/server/{chunk-JRIBGO45.js → chunk-BSTIQX52.js} +44 -0
  248. package/payload/server/maxy-edge.js +1 -1
  249. package/payload/server/public/activity.html +17 -0
  250. package/payload/server/public/assets/AdminLoginScreens-Rf94VD9w.js +1 -0
  251. package/payload/server/public/assets/AdminShell-CyGKg7MG.js +2 -0
  252. package/payload/server/public/assets/Checkbox-B0jmI2y2.js +1 -0
  253. package/payload/server/public/assets/HeaderMenu-BnTYGNaB.js +9 -0
  254. package/payload/server/public/assets/{useSubAccountSwitcher-pu0jjLCz.css → HeaderMenu-DtIEBHOU.css} +1 -1
  255. package/payload/server/public/assets/activity-BOBTWFr-.js +1 -0
  256. package/payload/server/public/assets/admin-HDLzwbLl.js +1 -0
  257. package/payload/server/public/assets/{arc-qKfXIt8v.js → arc-CFMJyMm-.js} +1 -1
  258. package/payload/server/public/assets/architecture-YZFGNWBL-Cypt5qHL.js +1 -0
  259. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DkVrGn7G.js → architectureDiagram-Q4EWVU46-CmOpXLsH.js} +1 -1
  260. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DqavswGH.js → blockDiagram-DXYQGD6D-CmS8f9YF.js} +1 -1
  261. package/payload/server/public/assets/browser-D4_XLSSm.js +1 -0
  262. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-B7fyKiXe.js → c4Diagram-AHTNJAMY-BXIjMl6A.js} +1 -1
  263. package/payload/server/public/assets/calendar-s5V_gbI7.js +1 -0
  264. package/payload/server/public/assets/channel-DhrFAm7m.js +1 -0
  265. package/payload/server/public/assets/chat-40WyKzGb.js +1 -0
  266. package/payload/server/public/assets/chevron-left-C35qGP5f.js +1 -0
  267. package/payload/server/public/assets/{chunk-2KRD3SAO-DsgMtGkv.js → chunk-2KRD3SAO-D4fktAwW.js} +1 -1
  268. package/payload/server/public/assets/{chunk-336JU56O-CkdISfNt.js → chunk-336JU56O-C2MKnRTj.js} +2 -2
  269. package/payload/server/public/assets/chunk-426QAEUC-BhU7-TyS.js +1 -0
  270. package/payload/server/public/assets/{chunk-4BX2VUAB-CYpiF2bl.js → chunk-4BX2VUAB-C13Wz3zS.js} +1 -1
  271. package/payload/server/public/assets/{chunk-4TB4RGXK-CWyc_F7v.js → chunk-4TB4RGXK-CalYahTR.js} +1 -1
  272. package/payload/server/public/assets/{chunk-55IACEB6-BbzKMw2Z.js → chunk-55IACEB6-TmOKdy8a.js} +1 -1
  273. package/payload/server/public/assets/{chunk-5FUZZQ4R-u19Nai9e.js → chunk-5FUZZQ4R-C-i0BVag.js} +1 -1
  274. package/payload/server/public/assets/{chunk-5PVQY5BW-Ba8by6Uy.js → chunk-5PVQY5BW-D6bJMLnf.js} +1 -1
  275. package/payload/server/public/assets/{chunk-67CJDMHE-BwUuxtyb.js → chunk-67CJDMHE-Cif9Uu5C.js} +1 -1
  276. package/payload/server/public/assets/{chunk-7N4EOEYR-BRH9iM9L.js → chunk-7N4EOEYR-WjTHCXnd.js} +1 -1
  277. package/payload/server/public/assets/{chunk-AA7GKIK3-BGoztgLL.js → chunk-AA7GKIK3-CwCfdQmb.js} +1 -1
  278. package/payload/server/public/assets/{chunk-BSJP7CBP-C5GDAZTl.js → chunk-BSJP7CBP-9A67yXwT.js} +1 -1
  279. package/payload/server/public/assets/{chunk-CIAEETIT-ChY32VPS.js → chunk-CIAEETIT-DPMiWSBi.js} +1 -1
  280. package/payload/server/public/assets/{chunk-EDXVE4YY-CPSD3p6p.js → chunk-EDXVE4YY-B9PBdwiT.js} +1 -1
  281. package/payload/server/public/assets/{chunk-ENJZ2VHE-D1oL-iUr.js → chunk-ENJZ2VHE-CM5OqcQ5.js} +1 -1
  282. package/payload/server/public/assets/{chunk-FMBD7UC4-CPvYEr54.js → chunk-FMBD7UC4-Bmt_ZRlV.js} +1 -1
  283. package/payload/server/public/assets/{chunk-FOC6F5B3-9Yyj7Vbz.js → chunk-FOC6F5B3-DfGJGxpX.js} +1 -1
  284. package/payload/server/public/assets/{chunk-ICPOFSXX-BaYgh8FR.js → chunk-ICPOFSXX-D6M89DA0.js} +2 -2
  285. package/payload/server/public/assets/{chunk-K5T4RW27-5ucpeRvm.js → chunk-K5T4RW27-DMpoaqw2.js} +1 -1
  286. package/payload/server/public/assets/{chunk-KGLVRYIC-DW-FHk7T.js → chunk-KGLVRYIC-DYUFgri2.js} +1 -1
  287. package/payload/server/public/assets/{chunk-LIHQZDEY-CGGVfAyG.js → chunk-LIHQZDEY-x3LmeKmx.js} +1 -1
  288. package/payload/server/public/assets/{chunk-ORNJ4GCN-Bv8EUa5d.js → chunk-ORNJ4GCN-BeuNAWkW.js} +1 -1
  289. package/payload/server/public/assets/{chunk-OYMX7WX6-C1mXJnyw.js → chunk-OYMX7WX6-Bv6gisQ6.js} +1 -1
  290. package/payload/server/public/assets/chunk-QZHKN3VN-7_kS3RBy.js +1 -0
  291. package/payload/server/public/assets/{chunk-U2HBQHQK-PwSQz6EP.js → chunk-U2HBQHQK-C2iT9Av2.js} +1 -1
  292. package/payload/server/public/assets/{chunk-X2U36JSP--NPHTBlU.js → chunk-X2U36JSP-Bd6bv87A.js} +1 -1
  293. package/payload/server/public/assets/{chunk-XPW4576I-Bbc7Da32.js → chunk-XPW4576I-ByFnN4JO.js} +1 -1
  294. package/payload/server/public/assets/{chunk-YZCP3GAM-D-9v8e--.js → chunk-YZCP3GAM-Bt8I6ZDb.js} +1 -1
  295. package/payload/server/public/assets/{chunk-ZZ45TVLE-CMPg670Q.js → chunk-ZZ45TVLE-DBMPgZ_A.js} +1 -1
  296. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BrWqm88p.js +1 -0
  297. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D0wzG5Fd.js +1 -0
  298. package/payload/server/public/assets/clone-DQA-nNrl.js +1 -0
  299. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-NVSb1Bhy.js → cose-bilkent-S5V4N54A-DgLEaApT.js} +1 -1
  300. package/payload/server/public/assets/{dagre-KV5264BT-V2Ai1DFl.js → dagre-KV5264BT-kWVPgmmL.js} +1 -1
  301. package/payload/server/public/assets/{dagre-QfLcO-1j.js → dagre-mSazqXgG.js} +1 -1
  302. package/payload/server/public/assets/data-Bq0vU3qJ.js +1 -0
  303. package/payload/server/public/assets/{diagram-5BDNPKRD-Caw21693.js → diagram-5BDNPKRD-BHe_omJD.js} +1 -1
  304. package/payload/server/public/assets/{diagram-G4DWMVQ6-CgwVkT2q.js → diagram-G4DWMVQ6-fUFsmM3x.js} +1 -1
  305. package/payload/server/public/assets/{diagram-MMDJMWI5-DFUrLZhs.js → diagram-MMDJMWI5-DmujPLlM.js} +1 -1
  306. package/payload/server/public/assets/{diagram-TYMM5635-CEEiEuZJ.js → diagram-TYMM5635-B7Aoas89.js} +1 -1
  307. package/payload/server/public/assets/{dist-Cvgxm7qv.js → dist-C9D_xz81.js} +1 -1
  308. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CG10NrT3.js → erDiagram-SMLLAGMA-6hS1rGiO.js} +1 -1
  309. package/payload/server/public/assets/{flatten-DAO0sfCM.js → flatten-BXzaHgtL.js} +1 -1
  310. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BqkV9Okv.js → flowDiagram-DWJPFMVM-Bqhr_r5b.js} +1 -1
  311. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DRiCDQF6.js → ganttDiagram-T4ZO3ILL-B8kjyN4o.js} +1 -1
  312. package/payload/server/public/assets/gitGraph-7Q5UKJZL-C_-XjxLd.js +1 -0
  313. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BZV2voyy.js → gitGraphDiagram-UUTBAWPF--TTRq4ir.js} +1 -1
  314. package/payload/server/public/assets/{graph-BZiudUGr.js → graph-C252ZHjp.js} +3 -3
  315. package/payload/server/public/assets/graph-labels-DzPbbhLc.js +1 -0
  316. package/payload/server/public/assets/{graphlib-DGPThX8M.js → graphlib-CWkjawc5.js} +1 -1
  317. package/payload/server/public/assets/info-OMHHGYJF-BH8yDCfL.js +1 -0
  318. package/payload/server/public/assets/infoDiagram-42DDH7IO-D8U4M0pK.js +2 -0
  319. package/payload/server/public/assets/{isEmpty-Cb_U81C6.js → isEmpty-uB1dEu_Z.js} +1 -1
  320. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKsAxSvp.js → ishikawaDiagram-UXIWVN3A-CR8B7VzM.js} +1 -1
  321. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CmliuOd-.js → journeyDiagram-VCZTEJTY-45lWAvtq.js} +1 -1
  322. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DAlElMb-.js → kanban-definition-6JOO6SKY-DkrPXLVb.js} +1 -1
  323. package/payload/server/public/assets/{line-DKZqLKAC.js → line-Db0H446a.js} +1 -1
  324. package/payload/server/public/assets/{linear-CbSGdh1x.js → linear-X3O7lwK3.js} +1 -1
  325. package/payload/server/public/assets/maximize-2-CEbXFpQT.js +1 -0
  326. package/payload/server/public/assets/{mermaid-parser.core-DFvbao9C.js → mermaid-parser.core-CixBHOya.js} +2 -2
  327. package/payload/server/public/assets/{mermaid.core-C0vEBxDm.js → mermaid.core-BGQq98L7.js} +3 -3
  328. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CShASUKd.js → mindmap-definition-QFDTVHPH-v9cJl1mj.js} +1 -1
  329. package/payload/server/public/assets/operator-zKk4HMdX.js +1 -0
  330. package/payload/server/public/assets/{ordinal-H0tVmBDP.js → ordinal-CZY9laxg.js} +1 -1
  331. package/payload/server/public/assets/packet-4T2RLAQJ-Bajcns4r.js +1 -0
  332. package/payload/server/public/assets/page-BrmN_vzV.js +1 -0
  333. package/payload/server/public/assets/page-Cts-ESBe.js +32 -0
  334. package/payload/server/public/assets/{pdf-render-jAQU0nXt.js → pdf-render-7HZBTZ0_.js} +1 -1
  335. package/payload/server/public/assets/pie-ZZUOXDRM-D7hjM5w1.js +1 -0
  336. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CBZHpDAJ.js → pieDiagram-DEJITSTG-DQ0b6edX.js} +1 -1
  337. package/payload/server/public/assets/public-BItzHBc0.js +1 -0
  338. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-n3bB3K91.js → quadrantDiagram-34T5L4WZ-B64mj7Ei.js} +1 -1
  339. package/payload/server/public/assets/radar-PYXPWWZC-B46d5x7a.js +1 -0
  340. package/payload/server/public/assets/{reduce-DAvwat-a.js → reduce-BGQzAenn.js} +1 -1
  341. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DiDvQK3c.js → requirementDiagram-MS252O5E-CE2JIEWo.js} +1 -1
  342. package/payload/server/public/assets/rotate-ccw-B0EYGhGx.js +1 -0
  343. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DWDQQZmd.js → sankeyDiagram-XADWPNL6-Cmt5cfCz.js} +1 -1
  344. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DmAqRlBT.js → sequenceDiagram-FGHM5R23-B5vVn_sw.js} +1 -1
  345. package/payload/server/public/assets/{src-DV4LKv2E.js → src-BTKk8KAG.js} +1 -1
  346. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-D4R-n6bZ.js → stateDiagram-FHFEXIEX-DiUEJ-RZ.js} +1 -1
  347. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DIm3XuAD.js +1 -0
  348. package/payload/server/public/assets/tasks-ClE8-be8.js +1 -0
  349. package/payload/server/public/assets/time-entry-format-BwjGLnXu.js +1 -0
  350. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CjiHGP4l.js → timeline-definition-GMOUNBTQ-C9jprDVw.js} +1 -1
  351. package/payload/server/public/assets/treeView-SZITEDCU-3XQh5xQ1.js +1 -0
  352. package/payload/server/public/assets/treemap-W4RFUUIX-DwR-_l5z.js +1 -0
  353. package/payload/server/public/assets/triangle-alert-DejWYn1x.js +1 -0
  354. package/payload/server/public/assets/useCopyFeedback-CpSgOavK.js +1 -0
  355. package/payload/server/public/assets/useSelectionMode-ZQZQUgze.js +1 -0
  356. package/payload/server/public/assets/useSubAccountSwitcher-DuRLvCfO.js +1 -0
  357. package/payload/server/public/assets/useVoiceRecorder-BTYYeUJW.js +2 -0
  358. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CBdDQ7c-.js → vennDiagram-DHZGUBPP-DWqQJ9X0.js} +1 -1
  359. package/payload/server/public/assets/wardley-RL74JXVD-DZp9oCGv.js +1 -0
  360. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BlIQPKLb.js → wardleyDiagram-NUSXRM2D-Dg6c2Voh.js} +1 -1
  361. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CslKgh9B.js → xychartDiagram-5P7HB3ND-EhN-zeDj.js} +1 -1
  362. package/payload/server/public/browser.html +7 -6
  363. package/payload/server/public/calendar.html +8 -7
  364. package/payload/server/public/chat.html +15 -14
  365. package/payload/server/public/data.html +14 -12
  366. package/payload/server/public/graph.html +13 -12
  367. package/payload/server/public/index.html +17 -15
  368. package/payload/server/public/operator.html +17 -16
  369. package/payload/server/public/public.html +15 -14
  370. package/payload/server/public/tasks.html +7 -6
  371. package/payload/server/server.js +525 -244
  372. package/payload/server/public/assets/AdminLoginScreens-Bed8SDxY.js +0 -1
  373. package/payload/server/public/assets/AdminShell-BLh9O6dn.js +0 -2
  374. package/payload/server/public/assets/Checkbox-BC_KSbpS.js +0 -1
  375. package/payload/server/public/assets/admin-DfWgJVI3.js +0 -1
  376. package/payload/server/public/assets/architecture-YZFGNWBL-FPHT7s-C.js +0 -1
  377. package/payload/server/public/assets/browser-C0vkv-hH.js +0 -1
  378. package/payload/server/public/assets/calendar-_pfHw0Hp.js +0 -1
  379. package/payload/server/public/assets/channel-j70eMvcL.js +0 -1
  380. package/payload/server/public/assets/chat-DYT5H81o.js +0 -1
  381. package/payload/server/public/assets/chevron-left-BnpVBu51.js +0 -1
  382. package/payload/server/public/assets/chunk-426QAEUC-D-NcAlTW.js +0 -1
  383. package/payload/server/public/assets/chunk-QZHKN3VN-CAwbQBtf.js +0 -1
  384. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ct6Rn0vt.js +0 -1
  385. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B_2XCIFv.js +0 -1
  386. package/payload/server/public/assets/clone-DjPWA_NH.js +0 -1
  387. package/payload/server/public/assets/data-CR-fbPWr.js +0 -1
  388. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B8Hx7f-D.js +0 -1
  389. package/payload/server/public/assets/graph-labels-BzmmJwCR.js +0 -1
  390. package/payload/server/public/assets/info-OMHHGYJF-BicCJTqU.js +0 -1
  391. package/payload/server/public/assets/infoDiagram-42DDH7IO-tf-8rOez.js +0 -2
  392. package/payload/server/public/assets/maximize-2-Bhdsv0U-.js +0 -1
  393. package/payload/server/public/assets/operator-gm2eP4r6.js +0 -1
  394. package/payload/server/public/assets/packet-4T2RLAQJ-Ckn_5hq0.js +0 -1
  395. package/payload/server/public/assets/page-8AB3jUa_.js +0 -1
  396. package/payload/server/public/assets/page-BoPorLg-.js +0 -32
  397. package/payload/server/public/assets/pie-ZZUOXDRM-DzlGQW3J.js +0 -1
  398. package/payload/server/public/assets/public-DqJk6qgW.js +0 -1
  399. package/payload/server/public/assets/radar-PYXPWWZC-BHo2YD8b.js +0 -1
  400. package/payload/server/public/assets/rotate-ccw-D_5cETGt.js +0 -1
  401. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BcFRbGRu.js +0 -1
  402. package/payload/server/public/assets/tasks-EyKLXINi.js +0 -1
  403. package/payload/server/public/assets/time-entry-format-DAwmmR3i.js +0 -1
  404. package/payload/server/public/assets/treeView-SZITEDCU-BtRr5vXp.js +0 -1
  405. package/payload/server/public/assets/treemap-W4RFUUIX-D8p0sbyo.js +0 -1
  406. package/payload/server/public/assets/useCopyFeedback-rOWd_lzl.js +0 -1
  407. package/payload/server/public/assets/useSelectionMode-DDmLmPph.js +0 -1
  408. package/payload/server/public/assets/useSubAccountSwitcher-CU-lOxTd.js +0 -9
  409. package/payload/server/public/assets/useVoiceRecorder-azG8zSUI.js +0 -2
  410. package/payload/server/public/assets/wardley-RL74JXVD-DgMn-9ZJ.js +0 -1
  411. /package/payload/platform/plugins/cloudflare/skills/data-portal/{template/schema.sql → schema.sql} +0 -0
  412. /package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/index.html → index.html} +0 -0
  413. /package/payload/platform/plugins/cloudflare/skills/data-portal/template/{public/portal.js → portal.js} +0 -0
  414. /package/payload/server/public/assets/{_baseFor-D3BqAOBr.js → _baseFor-CMWvz0uA.js} +0 -0
  415. /package/payload/server/public/assets/{array-iYP9fzJp.js → array-Cny_NT6T.js} +0 -0
  416. /package/payload/server/public/assets/{chunk-Ck5AOu5v.js → chunk-TPjIAO9U.js} +0 -0
  417. /package/payload/server/public/assets/{cytoscape.esm-BQSBzPsB.js → cytoscape.esm-De0CCmB2.js} +0 -0
  418. /package/payload/server/public/assets/{defaultLocale-BrdA1gDi.js → defaultLocale-BahRht8U.js} +0 -0
  419. /package/payload/server/public/assets/{init-Bx0S6pkp.js → init-DoIvjoJ_.js} +0 -0
  420. /package/payload/server/public/assets/{katex-BsiH_a6d.js → katex-Bfn1OZEl.js} +0 -0
  421. /package/payload/server/public/assets/{path-BLSgTy3w.js → path-CTezU8L5.js} +0 -0
  422. /package/payload/server/public/assets/{preload-helper-ClBMtM1g.js → preload-helper-CT1Z6Pdu.js} +0 -0
  423. /package/payload/server/public/assets/{rough.esm-BMOtDaaS.js → rough.esm-BJo4pvXu.js} +0 -0
@@ -0,0 +1,42 @@
1
+ export declare const CALENDAR_SCOPE = "https://www.googleapis.com/auth/calendar";
2
+ /** Google refuses an authorization code older than roughly ten minutes; a
3
+ * pending entry past that is stranded, not live. */
4
+ export declare const PENDING_LIFETIME_SEC = 600;
5
+ export declare function newPkce(): {
6
+ verifier: string;
7
+ challenge: string;
8
+ };
9
+ export declare function buildConsentUrl(args: {
10
+ clientId: string;
11
+ redirectUri: string;
12
+ state: string;
13
+ challenge: string;
14
+ accountId: string;
15
+ }): string;
16
+ export interface ConnectedAccount {
17
+ email: string;
18
+ status: "ok" | "unreadable";
19
+ }
20
+ /** Enumerate connected Google accounts from local stores only — no network.
21
+ * A count alone is not "connected": each entry carries its own status so an
22
+ * unreadable blob is distinguishable from a healthy one. */
23
+ export declare function listConnected(accountId: string, accountsDir: string): ConnectedAccount[];
24
+ export declare function runAccountRegisterStart(args: {
25
+ accountId: string;
26
+ accountsDir: string;
27
+ clientId: string;
28
+ publicBase: string;
29
+ }): Promise<{
30
+ status: "pending" | "in-progress";
31
+ consentUrl?: string;
32
+ ageSec?: number;
33
+ }>;
34
+ export declare function runAccountRegisterPoll(args: {
35
+ accountId: string;
36
+ accountsDir: string;
37
+ }): Promise<{
38
+ status: "registered" | "pending" | "expired" | "none";
39
+ accounts: ConnectedAccount[];
40
+ ageSec?: number;
41
+ }>;
42
+ //# sourceMappingURL=account-register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-register.d.ts","sourceRoot":"","sources":["../../src/tools/account-register.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,cAAc,6CAA6C,CAAC;AAGzE;qDACqD;AACrD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,wBAAgB,OAAO,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAgBT;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,IAAI,GAAG,YAAY,CAAC;CAC7B;AAED;;6DAE6D;AAC7D,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAaxF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BvF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC;IACV,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAUD"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Register flow: authorization-code + PKCE.
3
+ *
4
+ * `runAccountRegisterStart` mints the PKCE pair and `state`, persists them, and
5
+ * returns a consent URL the operator opens on any device. Google redirects to
6
+ * platform/ui's /api/google/oauth/callback, which holds the client secret,
7
+ * exchanges the code, and writes tokens. `runAccountRegisterPoll` then reports
8
+ * the outcome from local state only — no network.
9
+ */
10
+ import { createHash, randomBytes } from "node:crypto";
11
+ import { existsSync, readdirSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import { PendingStore } from "../auth/pending-store.js";
14
+ import { TokenStore } from "../auth/token-store.js";
15
+ import { log } from "../lib/log.js";
16
+ export const CALENDAR_SCOPE = "https://www.googleapis.com/auth/calendar";
17
+ const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
18
+ /** Google refuses an authorization code older than roughly ten minutes; a
19
+ * pending entry past that is stranded, not live. */
20
+ export const PENDING_LIFETIME_SEC = 600;
21
+ export function newPkce() {
22
+ const verifier = randomBytes(48).toString("base64url");
23
+ return { verifier, challenge: createHash("sha256").update(verifier).digest("base64url") };
24
+ }
25
+ export function buildConsentUrl(args) {
26
+ // `account` rides on the redirect_uri query so the callback knows which
27
+ // account to write to without trusting `state` to carry it.
28
+ const redirect = `${args.redirectUri}?account=${encodeURIComponent(args.accountId)}`;
29
+ const q = new URLSearchParams({
30
+ client_id: args.clientId,
31
+ redirect_uri: redirect,
32
+ response_type: "code",
33
+ scope: CALENDAR_SCOPE,
34
+ access_type: "offline",
35
+ prompt: "consent",
36
+ state: args.state,
37
+ code_challenge: args.challenge,
38
+ code_challenge_method: "S256",
39
+ });
40
+ return `${AUTH_URL}?${q.toString()}`;
41
+ }
42
+ /** Enumerate connected Google accounts from local stores only — no network.
43
+ * A count alone is not "connected": each entry carries its own status so an
44
+ * unreadable blob is distinguishable from a healthy one. */
45
+ export function listConnected(accountId, accountsDir) {
46
+ const dir = join(accountsDir, accountId, "secrets", "google", "accounts");
47
+ if (!existsSync(dir))
48
+ return [];
49
+ const out = [];
50
+ for (const key of readdirSync(dir)) {
51
+ try {
52
+ const blob = new TokenStore(accountId, accountsDir, key).read();
53
+ out.push(blob ? { email: blob.email ?? key, status: "ok" } : { email: key, status: "unreadable" });
54
+ }
55
+ catch {
56
+ out.push({ email: key, status: "unreadable" });
57
+ }
58
+ }
59
+ return out;
60
+ }
61
+ export async function runAccountRegisterStart(args) {
62
+ const pending = new PendingStore(args.accountId, args.accountsDir);
63
+ const age = pending.ageSec();
64
+ if (age !== null && age < PENDING_LIFETIME_SEC) {
65
+ log({
66
+ tag: "[google-oauth]",
67
+ op: "register-refused",
68
+ account: args.accountId,
69
+ reason: "in-progress",
70
+ ageSec: age,
71
+ });
72
+ return { status: "in-progress", ageSec: age };
73
+ }
74
+ const state = randomBytes(16).toString("hex");
75
+ const { verifier, challenge } = newPkce();
76
+ log({ tag: "[google-oauth]", op: "register", account: args.accountId, reg: state });
77
+ pending.write({ state, verifier, createdAt: Date.now() });
78
+ log({ tag: "[google-oauth]", op: "pending-write", reg: state, account: args.accountId });
79
+ const redirectUri = `${args.publicBase}/api/google/oauth/callback`;
80
+ const consentUrl = buildConsentUrl({
81
+ clientId: args.clientId,
82
+ redirectUri,
83
+ state,
84
+ challenge,
85
+ accountId: args.accountId,
86
+ });
87
+ log({ tag: "[google-oauth]", op: "consent-url", reg: state, scopes: CALENDAR_SCOPE, redirect: redirectUri });
88
+ return { status: "pending", consentUrl };
89
+ }
90
+ export async function runAccountRegisterPoll(args) {
91
+ const pending = new PendingStore(args.accountId, args.accountsDir);
92
+ const age = pending.ageSec();
93
+ const accounts = listConnected(args.accountId, args.accountsDir);
94
+ if (age === null)
95
+ return { status: accounts.length ? "registered" : "none", accounts };
96
+ if (age >= PENDING_LIFETIME_SEC) {
97
+ log({ tag: "[google-oauth]", op: "pending-stranded", account: args.accountId, ageSec: age });
98
+ return { status: "expired", accounts, ageSec: age };
99
+ }
100
+ return { status: "pending", accounts, ageSec: age };
101
+ }
102
+ //# sourceMappingURL=account-register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-register.js","sourceRoot":"","sources":["../../src/tools/account-register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ /** Google has no separate cancel verb: DELETE removes the event and, with
3
+ * sendUpdates=all, notifies attendees. That is the same user-visible outcome
4
+ * as Outlook's cancel. */
5
+ export declare function runCalendarCancel(config: GoogleConfig, args: {
6
+ eventId: string;
7
+ }): Promise<{
8
+ cancelled: string;
9
+ }>;
10
+ //# sourceMappingURL=calendar-cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-cancel.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE1E;;2BAE2B;AAC3B,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAOhC"}
@@ -0,0 +1,9 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ /** Google has no separate cancel verb: DELETE removes the event and, with
3
+ * sendUpdates=all, notifies attendees. That is the same user-visible outcome
4
+ * as Outlook's cancel. */
5
+ export async function runCalendarCancel(config, args) {
6
+ await callCalendar(config, `/calendars/primary/events/${encodeURIComponent(args.eventId)}`, { method: "DELETE", query: { sendUpdates: "all" } });
7
+ return { cancelled: args.eventId };
8
+ }
9
+ //# sourceMappingURL=calendar-cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-cancel.js","sourceRoot":"","sources":["../../src/tools/calendar-cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAE1E;;2BAE2B;AAC3B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,IAAyB;IAEzB,MAAM,YAAY,CAChB,MAAM,EACN,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAC/D,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CACpD,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ import { type CalendarEventItem } from "./calendar-list.js";
3
+ export interface CreateArgs {
4
+ summary: string;
5
+ start: string;
6
+ end: string;
7
+ location?: string;
8
+ description?: string;
9
+ attendees?: string[];
10
+ allDay?: boolean;
11
+ }
12
+ /** Google's event start/end is `date` for all-day and `dateTime` otherwise.
13
+ * Shared with calendar-update so both build the same shape. */
14
+ export declare function toTimePoint(value: string, allDay: boolean): {
15
+ date: string;
16
+ } | {
17
+ dateTime: string;
18
+ };
19
+ export declare function runCalendarCreate(config: GoogleConfig, args: CreateArgs): Promise<CalendarEventItem>;
20
+ //# sourceMappingURL=calendar-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-create.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAkB,KAAK,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAEjG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;gEACgE;AAChE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAEnG;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
@@ -0,0 +1,25 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ import { normaliseEvent } from "./calendar-list.js";
3
+ /** Google's event start/end is `date` for all-day and `dateTime` otherwise.
4
+ * Shared with calendar-update so both build the same shape. */
5
+ export function toTimePoint(value, allDay) {
6
+ return allDay ? { date: value } : { dateTime: value };
7
+ }
8
+ export async function runCalendarCreate(config, args) {
9
+ const allDay = args.allDay ?? false;
10
+ const body = {
11
+ summary: args.summary,
12
+ location: args.location,
13
+ description: args.description,
14
+ start: toTimePoint(args.start, allDay),
15
+ end: toTimePoint(args.end, allDay),
16
+ attendees: args.attendees?.map((email) => ({ email })),
17
+ };
18
+ const raw = await callCalendar(config, "/calendars/primary/events", {
19
+ method: "POST",
20
+ body,
21
+ query: { sendUpdates: "all" },
22
+ });
23
+ return normaliseEvent(raw);
24
+ }
25
+ //# sourceMappingURL=calendar-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-create.js","sourceRoot":"","sources":["../../src/tools/calendar-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAA+C,MAAM,oBAAoB,CAAC;AAYjG;gEACgE;AAChE,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAe;IACxD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,IAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QACtC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAClC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAiB,MAAM,EAAE,2BAA2B,EAAE;QAClF,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;KAC9B,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ import { type CalendarEventItem } from "./calendar-list.js";
3
+ export declare function runCalendarEvent(config: GoogleConfig, args: {
4
+ eventId: string;
5
+ }): Promise<CalendarEventItem>;
6
+ //# sourceMappingURL=calendar-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-event.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAkB,KAAK,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAEjG,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAM5B"}
@@ -0,0 +1,7 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ import { normaliseEvent } from "./calendar-list.js";
3
+ export async function runCalendarEvent(config, args) {
4
+ const raw = await callCalendar(config, `/calendars/primary/events/${encodeURIComponent(args.eventId)}`);
5
+ return normaliseEvent(raw);
6
+ }
7
+ //# sourceMappingURL=calendar-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-event.js","sourceRoot":"","sources":["../../src/tools/calendar-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAA+C,MAAM,oBAAoB,CAAC;AAEjG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAoB,EACpB,IAAyB;IAEzB,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,MAAM,EACN,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAChE,CAAC;IACF,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ export interface BusySlot {
3
+ start: string;
4
+ end: string;
5
+ }
6
+ /** Free/busy for one or more calendars. Defaults to the account's own primary
7
+ * calendar when none is named. Returns busy blocks only — free time is the
8
+ * complement, which the caller computes. */
9
+ export declare function runCalendarFreebusy(config: GoogleConfig, args: {
10
+ start: string;
11
+ end: string;
12
+ calendars?: string[];
13
+ }): Promise<Record<string, BusySlot[]>>;
14
+ //# sourceMappingURL=calendar-freebusy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-freebusy.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-freebusy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;6CAE6C;AAC7C,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAarC"}
@@ -0,0 +1,16 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ /** Free/busy for one or more calendars. Defaults to the account's own primary
3
+ * calendar when none is named. Returns busy blocks only — free time is the
4
+ * complement, which the caller computes. */
5
+ export async function runCalendarFreebusy(config, args) {
6
+ const ids = args.calendars?.length ? args.calendars : ["primary"];
7
+ const res = await callCalendar(config, "/freeBusy", {
8
+ method: "POST",
9
+ body: { timeMin: args.start, timeMax: args.end, items: ids.map((id) => ({ id })) },
10
+ });
11
+ const out = {};
12
+ for (const [id, v] of Object.entries(res.calendars ?? {}))
13
+ out[id] = v.busy ?? [];
14
+ return out;
15
+ }
16
+ //# sourceMappingURL=calendar-freebusy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-freebusy.js","sourceRoot":"","sources":["../../src/tools/calendar-freebusy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAO1E;;6CAE6C;AAC7C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,IAA0D;IAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,MAAM,EACN,WAAW,EACX;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;KACnF,CACF,CAAC;IACF,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAClF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ export interface RawGoogleEvent {
3
+ id: string;
4
+ summary?: string | null;
5
+ htmlLink?: string | null;
6
+ location?: string | null;
7
+ start: {
8
+ dateTime?: string;
9
+ date?: string;
10
+ };
11
+ end: {
12
+ dateTime?: string;
13
+ date?: string;
14
+ };
15
+ organizer?: {
16
+ email?: string;
17
+ };
18
+ attendees?: Array<{
19
+ email: string;
20
+ responseStatus?: string;
21
+ }>;
22
+ }
23
+ export interface CalendarEventItem {
24
+ id: string;
25
+ summary: string | null;
26
+ start: string;
27
+ end: string;
28
+ location: string | null;
29
+ attendees: Array<{
30
+ email: string;
31
+ responseStatus: string;
32
+ }>;
33
+ allDay: boolean;
34
+ organizer: string | null;
35
+ htmlLink: string | null;
36
+ }
37
+ /** Google distinguishes all-day events by carrying `date` instead of
38
+ * `dateTime`; that absence is the only signal, so it is the test used. */
39
+ export declare function normaliseEvent(raw: RawGoogleEvent): CalendarEventItem;
40
+ export declare function runCalendarList(config: GoogleConfig, args: {
41
+ rangeDays?: number;
42
+ maxResults?: number;
43
+ }): Promise<CalendarEventItem[]>;
44
+ //# sourceMappingURL=calendar-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-list.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,GAAG,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;2EAC2E;AAC3E,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,iBAAiB,CAerE;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAe9B"}
@@ -0,0 +1,36 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ /** Google distinguishes all-day events by carrying `date` instead of
3
+ * `dateTime`; that absence is the only signal, so it is the test used. */
4
+ export function normaliseEvent(raw) {
5
+ return {
6
+ id: raw.id,
7
+ summary: raw.summary ?? null,
8
+ start: raw.start.dateTime ?? raw.start.date ?? "",
9
+ end: raw.end.dateTime ?? raw.end.date ?? "",
10
+ location: raw.location ?? null,
11
+ attendees: (raw.attendees ?? []).map((a) => ({
12
+ email: a.email,
13
+ responseStatus: a.responseStatus ?? "needsAction",
14
+ })),
15
+ allDay: raw.start.dateTime === undefined,
16
+ organizer: raw.organizer?.email ?? null,
17
+ htmlLink: raw.htmlLink ?? null,
18
+ };
19
+ }
20
+ export async function runCalendarList(config, args) {
21
+ const rangeDays = Math.min(Math.max(args.rangeDays ?? 7, 1), 365);
22
+ const maxResults = Math.min(Math.max(args.maxResults ?? 100, 1), 250);
23
+ const res = await callCalendar(config, "/calendars/primary/events", {
24
+ query: {
25
+ timeMin: new Date().toISOString(),
26
+ timeMax: new Date(Date.now() + rangeDays * 86400000).toISOString(),
27
+ // Expand recurring series into instances so a range read returns what the
28
+ // user actually sees; whole-series editing stays out of scope.
29
+ singleEvents: "true",
30
+ orderBy: "startTime",
31
+ maxResults,
32
+ },
33
+ });
34
+ return (res.items ?? []).map(normaliseEvent);
35
+ }
36
+ //# sourceMappingURL=calendar-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-list.js","sourceRoot":"","sources":["../../src/tools/calendar-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAyB1E;2EAC2E;AAC3E,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;QACjD,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;QAC9B,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,aAAa;SAClD,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;QACxC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI;QACvC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,IAAiD;IAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,MAAM,YAAY,CAA+B,MAAM,EAAE,2BAA2B,EAAE;QAChG,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;YAClE,0EAA0E;YAC1E,+DAA+D;YAC/D,YAAY,EAAE,MAAM;YACpB,OAAO,EAAE,WAAW;YACpB,UAAU;SACX;KACF,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ import { type CalendarEventItem } from "./calendar-list.js";
3
+ export type AttendeeResponse = "accepted" | "declined" | "tentative";
4
+ /**
5
+ * Set this account's own attendee responseStatus.
6
+ *
7
+ * Google has no dedicated respond endpoint. The attendee array is read, the
8
+ * entry whose email matches the connected account is replaced, and the array
9
+ * is patched back. Every other attendee's status is preserved verbatim, so
10
+ * responding never silently rewrites someone else's answer.
11
+ */
12
+ export declare function runCalendarRespond(config: GoogleConfig, args: {
13
+ eventId: string;
14
+ response: AttendeeResponse;
15
+ }): Promise<CalendarEventItem>;
16
+ //# sourceMappingURL=calendar-respond.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-respond.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-respond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAkB,KAAK,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAEjG,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,GACpD,OAAO,CAAC,iBAAiB,CAAC,CAmB5B"}
@@ -0,0 +1,29 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ import { normaliseEvent } from "./calendar-list.js";
3
+ /**
4
+ * Set this account's own attendee responseStatus.
5
+ *
6
+ * Google has no dedicated respond endpoint. The attendee array is read, the
7
+ * entry whose email matches the connected account is replaced, and the array
8
+ * is patched back. Every other attendee's status is preserved verbatim, so
9
+ * responding never silently rewrites someone else's answer.
10
+ */
11
+ export async function runCalendarRespond(config, args) {
12
+ const self = config.store.read()?.email;
13
+ if (!self) {
14
+ throw new Error("connected account email unknown; run google-account-register");
15
+ }
16
+ const path = `/calendars/primary/events/${encodeURIComponent(args.eventId)}`;
17
+ const current = await callCalendar(config, path);
18
+ const attendees = (current.attendees ?? []).map((a) => a.email.toLowerCase() === self.toLowerCase() ? { ...a, responseStatus: args.response } : a);
19
+ if (!attendees.some((a) => a.email.toLowerCase() === self.toLowerCase())) {
20
+ throw new Error(`${self} is not an attendee of event ${args.eventId}, so there is nothing to respond to`);
21
+ }
22
+ const raw = await callCalendar(config, path, {
23
+ method: "PATCH",
24
+ body: { attendees },
25
+ query: { sendUpdates: "all" },
26
+ });
27
+ return normaliseEvent(raw);
28
+ }
29
+ //# sourceMappingURL=calendar-respond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-respond.js","sourceRoot":"","sources":["../../src/tools/calendar-respond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAA+C,MAAM,oBAAoB,CAAC;AAIjG;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAoB,EACpB,IAAqD;IAErD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,IAAI,GAAG,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAiB,MAAM,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAC3F,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,gCAAgC,IAAI,CAAC,OAAO,qCAAqC,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAiB,MAAM,EAAE,IAAI,EAAE;QAC3D,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,EAAE,SAAS,EAAE;QACnB,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;KAC9B,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type GoogleConfig } from "../lib/google-client.js";
2
+ import { type CalendarEventItem } from "./calendar-list.js";
3
+ export interface UpdateArgs {
4
+ eventId: string;
5
+ summary?: string;
6
+ start?: string;
7
+ end?: string;
8
+ location?: string;
9
+ description?: string;
10
+ attendees?: string[];
11
+ allDay?: boolean;
12
+ }
13
+ /** PATCH, not PUT: only the fields the caller named are sent, so an update
14
+ * never blanks a field it was not asked to change. */
15
+ export declare function runCalendarUpdate(config: GoogleConfig, args: UpdateArgs): Promise<CalendarEventItem>;
16
+ //# sourceMappingURL=calendar-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-update.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAkB,KAAK,iBAAiB,EAAuB,MAAM,oBAAoB,CAAC;AAGjG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;uDACuD;AACvD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,iBAAiB,CAAC,CA0B5B"}
@@ -0,0 +1,32 @@
1
+ import { callCalendar } from "../lib/google-client.js";
2
+ import { normaliseEvent } from "./calendar-list.js";
3
+ import { toTimePoint } from "./calendar-create.js";
4
+ /** PATCH, not PUT: only the fields the caller named are sent, so an update
5
+ * never blanks a field it was not asked to change. */
6
+ export async function runCalendarUpdate(config, args) {
7
+ // allDay is INFERRED from the stored event when the caller omits it. Assuming
8
+ // false would send {dateTime: "2026-07-20"} for an all-day event whose start
9
+ // was being moved, which Google rejects with a 400.
10
+ let allDay = args.allDay;
11
+ if (allDay === undefined && (args.start !== undefined || args.end !== undefined)) {
12
+ const current = await callCalendar(config, `/calendars/primary/events/${encodeURIComponent(args.eventId)}`);
13
+ allDay = current.start.dateTime === undefined;
14
+ }
15
+ allDay = allDay ?? false;
16
+ const body = {};
17
+ if (args.summary !== undefined)
18
+ body.summary = args.summary;
19
+ if (args.location !== undefined)
20
+ body.location = args.location;
21
+ if (args.description !== undefined)
22
+ body.description = args.description;
23
+ if (args.start !== undefined)
24
+ body.start = toTimePoint(args.start, allDay);
25
+ if (args.end !== undefined)
26
+ body.end = toTimePoint(args.end, allDay);
27
+ if (args.attendees !== undefined)
28
+ body.attendees = args.attendees.map((email) => ({ email }));
29
+ const raw = await callCalendar(config, `/calendars/primary/events/${encodeURIComponent(args.eventId)}`, { method: "PATCH", body, query: { sendUpdates: "all" } });
30
+ return normaliseEvent(raw);
31
+ }
32
+ //# sourceMappingURL=calendar-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-update.js","sourceRoot":"","sources":["../../src/tools/calendar-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAA+C,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAanD;uDACuD;AACvD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,IAAgB;IAEhB,8EAA8E;IAC9E,6EAA6E;IAC7E,oDAAoD;IACpD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,YAAY,CAChC,MAAM,EACN,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAChE,CAAC;QACF,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;IAChD,CAAC;IACD,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;IACzB,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/D,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACxE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QAAE,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,MAAM,EACN,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAC/D,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CACzD,CAAC;IACF,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -208,6 +208,41 @@ Divergence from Outlook: the recommended Web-application flow (Option B) also ne
208
208
  actionable signal (`clientIdConfigured=false`), register refuses, and no operator action
209
209
  makes it work until the vendor client exists — mirroring Outlook's inert behaviour.
210
210
 
211
+ ### Installing the secret on a device (operator step, once per install)
212
+
213
+ Nothing automates this and nothing can: the secret cannot ship in the npm
214
+ package, so it is placed by hand after the install exists. Until it is, the
215
+ plugin's tools load and `google-account-register` refuses with a message naming
216
+ this file — the refusal is deliberate and happens *before* the user consents,
217
+ so nobody burns a consent on a flow that cannot complete.
218
+
219
+ On the device, with the values from the brand's Google Cloud OAuth client:
220
+
221
+ ```bash
222
+ INSTALL=~/<brand>-code # e.g. ~/sitedesk-code
223
+ ( umask 077; mkdir -p "$INSTALL/platform/config" )
224
+ ( umask 077; cat > "$INSTALL/platform/config/google-house.env" <<'EOF'
225
+ GOOGLE_CLIENT_ID=<the client id>
226
+ GOOGLE_CLIENT_SECRET=<the client secret>
227
+ EOF
228
+ )
229
+ chmod 600 "$INSTALL/platform/config/google-house.env"
230
+ ```
231
+
232
+ Then restart the install's UI service so the route picks it up.
233
+
234
+ Confirm it took without printing the secret — the boot line reports presence
235
+ only:
236
+
237
+ ```bash
238
+ grep -m1 'google-mcp. boot' ~/.<brand>-code/logs/server.log
239
+ # ... houseSecretPresent=true
240
+ ```
241
+
242
+ `houseSecretPresent=false` on an install whose brand ships a `googleClientId`
243
+ is the mis-provision signature. The secret is never echoed, never logged, and
244
+ never read by the MCP process — only its presence is checked.
245
+
211
246
  ### Client-secret storage: house-only (decided 2026-07-18)
212
247
 
213
248
  An earlier draft of this file said the secret is "held in the brand's secret store, the same
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "ledger",
3
+ "description": "Cash book and AR/AP ledger. Records invoices raised, bills received, payments, credits and loose cash movements in the graph, and computes what is outstanding rather than storing it. Provides ledger-invoice-record, ledger-payment-record, ledger-credit-record, ledger-cash-record, ledger-balance, ledger-statement and ledger-reconcile.",
4
+ "version": "0.1.0",
5
+ "author": {
6
+ "name": "Rubytech LLC"
7
+ },
8
+ "mcpServers": {
9
+ "ledger": {
10
+ "type": "stdio",
11
+ "command": "node",
12
+ "args": [
13
+ "${CLAUDE_PLUGIN_ROOT}/lib/mcp-spawn-tee/index.js",
14
+ "${CLAUDE_PLUGIN_ROOT}/mcp/dist/index.js"
15
+ ],
16
+ "env": {
17
+ "MCP_SPAWN_TEE_NAME": "ledger"
18
+ }
19
+ }
20
+ }
21
+ }