@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,16 @@
1
+ /** One structured stderr line. Never throws; logging must not break a tool. */
2
+ export function log(fields) {
3
+ try {
4
+ const parts = [];
5
+ for (const [k, v] of Object.entries(fields)) {
6
+ if (v === undefined)
7
+ continue;
8
+ parts.push(`${k}=${v === null ? "null" : String(v)}`);
9
+ }
10
+ process.stderr.write(`${parts.join(" ")}\n`);
11
+ }
12
+ catch {
13
+ /* logging must never throw */
14
+ }
15
+ }
16
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,UAAU,GAAG,CAAC,MAAoE;IACtF,IAAI,CAAC;QACH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Auth state for one connected Google account, read from local stores only. */
2
+ export declare function runAccountInfo(args: {
3
+ accountId: string;
4
+ accountsDir: string;
5
+ email: string;
6
+ }): {
7
+ email: string;
8
+ connected: boolean;
9
+ expiring: boolean;
10
+ scopes: string[];
11
+ };
12
+ //# sourceMappingURL=account-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-info.d.ts","sourceRoot":"","sources":["../../src/tools/account-info.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB7E"}
@@ -0,0 +1,23 @@
1
+ import { TokenStore } from "../auth/token-store.js";
2
+ import { isExpiring } from "../lib/google-client.js";
3
+ /** Auth state for one connected Google account, read from local stores only. */
4
+ export function runAccountInfo(args) {
5
+ let blob = null;
6
+ try {
7
+ blob = new TokenStore(args.accountId, args.accountsDir, args.email).read();
8
+ }
9
+ catch {
10
+ // An unreadable blob is reported as not-connected rather than thrown, so a
11
+ // corrupt store is diagnosable through this tool instead of crashing it.
12
+ return { email: args.email, connected: false, expiring: false, scopes: [] };
13
+ }
14
+ if (!blob)
15
+ return { email: args.email, connected: false, expiring: false, scopes: [] };
16
+ return {
17
+ email: blob.email ?? args.email,
18
+ connected: true,
19
+ expiring: isExpiring(blob),
20
+ scopes: blob.scopes,
21
+ };
22
+ }
23
+ //# sourceMappingURL=account-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-info.js","sourceRoot":"","sources":["../../src/tools/account-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,IAI9B;IACC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,yEAAyE;QACzE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;QAC/B,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type ConnectedAccount } from "./account-register.js";
2
+ /** Every connected Google account on this account, from local stores only — no
3
+ * network. `count` alone is not "connected": each entry carries its own status
4
+ * so an unreadable blob is distinguishable from a healthy one. */
5
+ export declare function runAccountList(args: {
6
+ accountId: string;
7
+ accountsDir: string;
8
+ }): {
9
+ count: number;
10
+ accounts: ConnectedAccount[];
11
+ };
12
+ //# sourceMappingURL=account-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-list.d.ts","sourceRoot":"","sources":["../../src/tools/account-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE7E;;mEAEmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CAGA"}
@@ -0,0 +1,9 @@
1
+ import { listConnected } from "./account-register.js";
2
+ /** Every connected Google account on this account, from local stores only — no
3
+ * network. `count` alone is not "connected": each entry carries its own status
4
+ * so an unreadable blob is distinguishable from a healthy one. */
5
+ export function runAccountList(args) {
6
+ const accounts = listConnected(args.accountId, args.accountsDir);
7
+ return { count: accounts.length, accounts };
8
+ }
9
+ //# sourceMappingURL=account-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-list.js","sourceRoot":"","sources":["../../src/tools/account-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,uBAAuB,CAAC;AAE7E;;mEAEmE;AACnE,MAAM,UAAU,cAAc,CAAC,IAAgD;IAI7E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,59 @@
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
+ /** The `state` value carries BOTH the account id and the nonce, as
10
+ * `<accountId>.<nonce>`.
11
+ *
12
+ * It cannot ride on the redirect_uri: Google requires redirect_uri to match a
13
+ * registered value EXACTLY, so a per-request query parameter makes every
14
+ * authorization request fail with redirect_uri_mismatch. Google's own guidance
15
+ * names `state` as the mechanism for per-request application state.
16
+ *
17
+ * Putting the account id in an attacker-visible field is safe because it is
18
+ * routing information, not authorisation: the callback still requires the
19
+ * nonce half to equal the one stored in that account's pending entry, and an
20
+ * attacker cannot produce a valid nonce for an account they do not control. */
21
+ export declare function encodeState(accountId: string, nonce: string): string;
22
+ export declare function decodeState(state: string): {
23
+ accountId: string;
24
+ nonce: string;
25
+ } | null;
26
+ export declare function buildConsentUrl(args: {
27
+ clientId: string;
28
+ redirectUri: string;
29
+ state: string;
30
+ challenge: string;
31
+ accountId: string;
32
+ }): string;
33
+ export interface ConnectedAccount {
34
+ email: string;
35
+ status: "ok" | "unreadable";
36
+ }
37
+ /** Enumerate connected Google accounts from local stores only — no network.
38
+ * A count alone is not "connected": each entry carries its own status so an
39
+ * unreadable blob is distinguishable from a healthy one. */
40
+ export declare function listConnected(accountId: string, accountsDir: string): ConnectedAccount[];
41
+ export declare function runAccountRegisterStart(args: {
42
+ accountId: string;
43
+ accountsDir: string;
44
+ clientId: string;
45
+ publicBase: string;
46
+ }): Promise<{
47
+ status: "pending" | "in-progress";
48
+ consentUrl?: string;
49
+ ageSec?: number;
50
+ }>;
51
+ export declare function runAccountRegisterPoll(args: {
52
+ accountId: string;
53
+ accountsDir: string;
54
+ }): Promise<{
55
+ status: "registered" | "pending" | "expired" | "none";
56
+ accounts: ConnectedAccount[];
57
+ ageSec?: number;
58
+ }>;
59
+ //# 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;;;;;;;;;;;gFAWgF;AAChF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAItF;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,CAeT;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,CAgCvF;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,126 @@
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
+ /** The `state` value carries BOTH the account id and the nonce, as
26
+ * `<accountId>.<nonce>`.
27
+ *
28
+ * It cannot ride on the redirect_uri: Google requires redirect_uri to match a
29
+ * registered value EXACTLY, so a per-request query parameter makes every
30
+ * authorization request fail with redirect_uri_mismatch. Google's own guidance
31
+ * names `state` as the mechanism for per-request application state.
32
+ *
33
+ * Putting the account id in an attacker-visible field is safe because it is
34
+ * routing information, not authorisation: the callback still requires the
35
+ * nonce half to equal the one stored in that account's pending entry, and an
36
+ * attacker cannot produce a valid nonce for an account they do not control. */
37
+ export function encodeState(accountId, nonce) {
38
+ return `${accountId}.${nonce}`;
39
+ }
40
+ export function decodeState(state) {
41
+ const idx = state.lastIndexOf(".");
42
+ if (idx <= 0 || idx === state.length - 1)
43
+ return null;
44
+ return { accountId: state.slice(0, idx), nonce: state.slice(idx + 1) };
45
+ }
46
+ export function buildConsentUrl(args) {
47
+ // redirect_uri is sent VERBATIM — no query string. See encodeState above.
48
+ const redirect = args.redirectUri;
49
+ const q = new URLSearchParams({
50
+ client_id: args.clientId,
51
+ redirect_uri: redirect,
52
+ response_type: "code",
53
+ scope: CALENDAR_SCOPE,
54
+ access_type: "offline",
55
+ prompt: "consent",
56
+ state: args.state,
57
+ code_challenge: args.challenge,
58
+ code_challenge_method: "S256",
59
+ });
60
+ return `${AUTH_URL}?${q.toString()}`;
61
+ }
62
+ /** Enumerate connected Google accounts from local stores only — no network.
63
+ * A count alone is not "connected": each entry carries its own status so an
64
+ * unreadable blob is distinguishable from a healthy one. */
65
+ export function listConnected(accountId, accountsDir) {
66
+ const dir = join(accountsDir, accountId, "secrets", "google", "accounts");
67
+ if (!existsSync(dir))
68
+ return [];
69
+ const out = [];
70
+ for (const key of readdirSync(dir)) {
71
+ try {
72
+ const blob = new TokenStore(accountId, accountsDir, key).read();
73
+ out.push(blob ? { email: blob.email ?? key, status: "ok" } : { email: key, status: "unreadable" });
74
+ }
75
+ catch {
76
+ out.push({ email: key, status: "unreadable" });
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+ export async function runAccountRegisterStart(args) {
82
+ const pending = new PendingStore(args.accountId, args.accountsDir);
83
+ const age = pending.ageSec();
84
+ if (age !== null && age < PENDING_LIFETIME_SEC) {
85
+ log({
86
+ tag: "[google-oauth]",
87
+ op: "register-refused",
88
+ account: args.accountId,
89
+ reason: "in-progress",
90
+ ageSec: age,
91
+ });
92
+ return { status: "in-progress", ageSec: age };
93
+ }
94
+ const nonce = randomBytes(16).toString("hex");
95
+ const state = encodeState(args.accountId, nonce);
96
+ const { verifier, challenge } = newPkce();
97
+ log({ tag: "[google-oauth]", op: "register", account: args.accountId, reg: nonce });
98
+ // The pending entry stores the NONCE, not the composed state: the account is
99
+ // already implied by which account's store this is, and comparing the nonce
100
+ // alone keeps the check independent of the encoding.
101
+ pending.write({ state: nonce, verifier, createdAt: Date.now() });
102
+ log({ tag: "[google-oauth]", op: "pending-write", reg: nonce, account: args.accountId });
103
+ const redirectUri = `${args.publicBase}/api/google/oauth/callback`;
104
+ const consentUrl = buildConsentUrl({
105
+ clientId: args.clientId,
106
+ redirectUri,
107
+ state,
108
+ challenge,
109
+ accountId: args.accountId,
110
+ });
111
+ log({ tag: "[google-oauth]", op: "consent-url", reg: nonce, scopes: CALENDAR_SCOPE, redirect: redirectUri });
112
+ return { status: "pending", consentUrl };
113
+ }
114
+ export async function runAccountRegisterPoll(args) {
115
+ const pending = new PendingStore(args.accountId, args.accountsDir);
116
+ const age = pending.ageSec();
117
+ const accounts = listConnected(args.accountId, args.accountsDir);
118
+ if (age === null)
119
+ return { status: accounts.length ? "registered" : "none", accounts };
120
+ if (age >= PENDING_LIFETIME_SEC) {
121
+ log({ tag: "[google-oauth]", op: "pending-stranded", account: args.accountId, ageSec: age });
122
+ return { status: "expired", accounts, ageSec: age };
123
+ }
124
+ return { status: "pending", accounts, ageSec: age };
125
+ }
126
+ //# 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