@runcore-sh/runcore 0.4.0 → 0.5.0

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 (351) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/activity/log.js +2 -2
  3. package/dist/activity/log.js.map +1 -1
  4. package/dist/agents/governed-spawn.d.ts.map +1 -1
  5. package/dist/cli.js +101 -11
  6. package/dist/cli.js.map +1 -1
  7. package/dist/extensions/cache.d.ts +57 -0
  8. package/dist/extensions/cache.d.ts.map +1 -0
  9. package/dist/extensions/cache.js +173 -0
  10. package/dist/extensions/cache.js.map +1 -0
  11. package/dist/extensions/client.d.ts +55 -0
  12. package/dist/extensions/client.d.ts.map +1 -0
  13. package/dist/extensions/client.js +120 -0
  14. package/dist/extensions/client.js.map +1 -0
  15. package/dist/extensions/index.d.ts +13 -0
  16. package/dist/extensions/index.d.ts.map +1 -0
  17. package/dist/extensions/index.js +12 -0
  18. package/dist/extensions/index.js.map +1 -0
  19. package/dist/extensions/loader.d.ts +50 -0
  20. package/dist/extensions/loader.d.ts.map +1 -0
  21. package/dist/extensions/loader.js +166 -0
  22. package/dist/extensions/loader.js.map +1 -0
  23. package/dist/extensions/manifest.d.ts +38 -0
  24. package/dist/extensions/manifest.d.ts.map +1 -0
  25. package/dist/extensions/manifest.js +17 -0
  26. package/dist/extensions/manifest.js.map +1 -0
  27. package/dist/extensions/stubs.d.ts +27 -0
  28. package/dist/extensions/stubs.d.ts.map +1 -0
  29. package/dist/extensions/stubs.js +45 -0
  30. package/dist/extensions/stubs.js.map +1 -0
  31. package/dist/lib/audit.js +2 -2
  32. package/dist/lib/audit.js.map +1 -1
  33. package/dist/lib/brain-migrate.d.ts +21 -0
  34. package/dist/lib/brain-migrate.d.ts.map +1 -0
  35. package/dist/lib/brain-migrate.js +137 -0
  36. package/dist/lib/brain-migrate.js.map +1 -0
  37. package/dist/lib/paths.d.ts +27 -0
  38. package/dist/lib/paths.d.ts.map +1 -1
  39. package/dist/lib/paths.js +65 -0
  40. package/dist/lib/paths.js.map +1 -1
  41. package/dist/llm/call-log.d.ts +40 -0
  42. package/dist/llm/call-log.d.ts.map +1 -0
  43. package/dist/llm/call-log.js +35 -0
  44. package/dist/llm/call-log.js.map +1 -0
  45. package/dist/llm/complete.d.ts +6 -0
  46. package/dist/llm/complete.d.ts.map +1 -1
  47. package/dist/llm/complete.js +27 -0
  48. package/dist/llm/complete.js.map +1 -1
  49. package/dist/mcp-server.js +118 -2
  50. package/dist/mcp-server.js.map +1 -1
  51. package/dist/memory/file-backed.d.ts +4 -0
  52. package/dist/memory/file-backed.d.ts.map +1 -1
  53. package/dist/memory/file-backed.js +4 -0
  54. package/dist/memory/file-backed.js.map +1 -1
  55. package/dist/memory/vector-index.d.ts +4 -12
  56. package/dist/memory/vector-index.d.ts.map +1 -1
  57. package/dist/memory/vector-index.js +11 -93
  58. package/dist/memory/vector-index.js.map +1 -1
  59. package/dist/search/brain-docs.d.ts +17 -7
  60. package/dist/search/brain-docs.d.ts.map +1 -1
  61. package/dist/search/brain-docs.js +170 -52
  62. package/dist/search/brain-docs.js.map +1 -1
  63. package/dist/search/brain-rag.d.ts +45 -0
  64. package/dist/search/brain-rag.d.ts.map +1 -0
  65. package/dist/search/brain-rag.js +275 -0
  66. package/dist/search/brain-rag.js.map +1 -0
  67. package/dist/search/chunker.d.ts +24 -0
  68. package/dist/search/chunker.d.ts.map +1 -0
  69. package/dist/search/chunker.js +95 -0
  70. package/dist/search/chunker.js.map +1 -0
  71. package/dist/search/embedder.d.ts +16 -0
  72. package/dist/search/embedder.d.ts.map +1 -0
  73. package/dist/search/embedder.js +108 -0
  74. package/dist/search/embedder.js.map +1 -0
  75. package/dist/search/file-watcher.d.ts +11 -0
  76. package/dist/search/file-watcher.d.ts.map +1 -0
  77. package/dist/search/file-watcher.js +86 -0
  78. package/dist/search/file-watcher.js.map +1 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +168 -20
  81. package/dist/server.js.map +1 -1
  82. package/dist/sessions/store.d.ts +9 -0
  83. package/dist/sessions/store.d.ts.map +1 -1
  84. package/dist/sessions/store.js.map +1 -1
  85. package/dist/settings.d.ts +26 -0
  86. package/dist/settings.d.ts.map +1 -1
  87. package/dist/settings.js +78 -2
  88. package/dist/settings.js.map +1 -1
  89. package/dist/tracing/init.d.ts +1 -1
  90. package/dist/tracing/init.d.ts.map +1 -1
  91. package/dist/utils/logger.js +2 -2
  92. package/dist/utils/logger.js.map +1 -1
  93. package/module-tiers.json +164 -0
  94. package/package.json +9 -13
  95. package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
  96. package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
  97. package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
  98. package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
  99. package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
  100. package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
  101. package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
  102. package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
  103. package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
  104. package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
  105. package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
  106. package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
  107. package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
  108. package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
  109. package/public/index.html +379 -59
  110. package/dist/agents/autonomous.js +0 -749
  111. package/dist/agents/autonomous.js.map +0 -1
  112. package/dist/agents/commit.js +0 -113
  113. package/dist/agents/commit.js.map +0 -1
  114. package/dist/agents/continue.js +0 -158
  115. package/dist/agents/continue.js.map +0 -1
  116. package/dist/agents/cooldown.js +0 -397
  117. package/dist/agents/cooldown.js.map +0 -1
  118. package/dist/agents/dedup-guard.js +0 -131
  119. package/dist/agents/dedup-guard.js.map +0 -1
  120. package/dist/agents/feed.js +0 -176
  121. package/dist/agents/feed.js.map +0 -1
  122. package/dist/agents/governance.js +0 -292
  123. package/dist/agents/governance.js.map +0 -1
  124. package/dist/agents/governed-spawn.js +0 -192
  125. package/dist/agents/governed-spawn.js.map +0 -1
  126. package/dist/agents/heartbeat.js +0 -324
  127. package/dist/agents/heartbeat.js.map +0 -1
  128. package/dist/agents/instance-manager.js +0 -850
  129. package/dist/agents/instance-manager.js.map +0 -1
  130. package/dist/agents/issue-reporter.js +0 -123
  131. package/dist/agents/issue-reporter.js.map +0 -1
  132. package/dist/agents/issues.js +0 -141
  133. package/dist/agents/issues.js.map +0 -1
  134. package/dist/agents/locks.js +0 -234
  135. package/dist/agents/locks.js.map +0 -1
  136. package/dist/agents/memory.js +0 -93
  137. package/dist/agents/memory.js.map +0 -1
  138. package/dist/agents/monitor.js +0 -235
  139. package/dist/agents/monitor.js.map +0 -1
  140. package/dist/agents/orchestration.js +0 -715
  141. package/dist/agents/orchestration.js.map +0 -1
  142. package/dist/agents/recover.js +0 -166
  143. package/dist/agents/recover.js.map +0 -1
  144. package/dist/agents/reflection.js +0 -199
  145. package/dist/agents/reflection.js.map +0 -1
  146. package/dist/agents/runtime/bus.js +0 -174
  147. package/dist/agents/runtime/bus.js.map +0 -1
  148. package/dist/agents/runtime/config.js +0 -101
  149. package/dist/agents/runtime/config.js.map +0 -1
  150. package/dist/agents/runtime/driver.js +0 -214
  151. package/dist/agents/runtime/driver.js.map +0 -1
  152. package/dist/agents/runtime/errors.js +0 -40
  153. package/dist/agents/runtime/errors.js.map +0 -1
  154. package/dist/agents/runtime/index.js +0 -54
  155. package/dist/agents/runtime/index.js.map +0 -1
  156. package/dist/agents/runtime/lifecycle.js +0 -116
  157. package/dist/agents/runtime/lifecycle.js.map +0 -1
  158. package/dist/agents/runtime/manager.js +0 -948
  159. package/dist/agents/runtime/manager.js.map +0 -1
  160. package/dist/agents/runtime/registry.js +0 -195
  161. package/dist/agents/runtime/registry.js.map +0 -1
  162. package/dist/agents/runtime/resources.js +0 -146
  163. package/dist/agents/runtime/resources.js.map +0 -1
  164. package/dist/agents/runtime/types.js +0 -24
  165. package/dist/agents/runtime/types.js.map +0 -1
  166. package/dist/agents/spawn-policy.js +0 -202
  167. package/dist/agents/spawn-policy.js.map +0 -1
  168. package/dist/agents/spawn.js +0 -970
  169. package/dist/agents/spawn.js.map +0 -1
  170. package/dist/agents/triage.js +0 -81
  171. package/dist/agents/triage.js.map +0 -1
  172. package/dist/agents/workflow.js +0 -543
  173. package/dist/agents/workflow.js.map +0 -1
  174. package/dist/avatar/client.js +0 -172
  175. package/dist/avatar/client.js.map +0 -1
  176. package/dist/avatar/sidecar.js +0 -125
  177. package/dist/avatar/sidecar.js.map +0 -1
  178. package/dist/browser/sessions.js +0 -122
  179. package/dist/browser/sessions.js.map +0 -1
  180. package/dist/capabilities/definitions/browser.js +0 -242
  181. package/dist/capabilities/definitions/browser.js.map +0 -1
  182. package/dist/channels/whatsapp.js +0 -200
  183. package/dist/channels/whatsapp.js.map +0 -1
  184. package/dist/credentials/store.js +0 -189
  185. package/dist/credentials/store.js.map +0 -1
  186. package/dist/files/deep-index.js +0 -337
  187. package/dist/files/deep-index.js.map +0 -1
  188. package/dist/files/extract.js +0 -33
  189. package/dist/files/extract.js.map +0 -1
  190. package/dist/files/gdrive.js +0 -246
  191. package/dist/files/gdrive.js.map +0 -1
  192. package/dist/github/client.js +0 -408
  193. package/dist/github/client.js.map +0 -1
  194. package/dist/github/commit-analysis.js +0 -276
  195. package/dist/github/commit-analysis.js.map +0 -1
  196. package/dist/github/contributor-stats.js +0 -119
  197. package/dist/github/contributor-stats.js.map +0 -1
  198. package/dist/github/issue-sla.js +0 -220
  199. package/dist/github/issue-sla.js.map +0 -1
  200. package/dist/github/issue-triage.js +0 -286
  201. package/dist/github/issue-triage.js.map +0 -1
  202. package/dist/github/pr-readiness.js +0 -197
  203. package/dist/github/pr-readiness.js.map +0 -1
  204. package/dist/github/pr-review.js +0 -410
  205. package/dist/github/pr-review.js.map +0 -1
  206. package/dist/github/release-notes.js +0 -227
  207. package/dist/github/release-notes.js.map +0 -1
  208. package/dist/github/repo-health.js +0 -303
  209. package/dist/github/repo-health.js.map +0 -1
  210. package/dist/github/retry.js +0 -117
  211. package/dist/github/retry.js.map +0 -1
  212. package/dist/github/types.js +0 -8
  213. package/dist/github/types.js.map +0 -1
  214. package/dist/github/webhooks.js +0 -153
  215. package/dist/github/webhooks.js.map +0 -1
  216. package/dist/google/auth.js +0 -325
  217. package/dist/google/auth.js.map +0 -1
  218. package/dist/google/calendar-timer.js +0 -91
  219. package/dist/google/calendar-timer.js.map +0 -1
  220. package/dist/google/calendar.js +0 -270
  221. package/dist/google/calendar.js.map +0 -1
  222. package/dist/google/docs.js +0 -309
  223. package/dist/google/docs.js.map +0 -1
  224. package/dist/google/gmail-send.js +0 -219
  225. package/dist/google/gmail-send.js.map +0 -1
  226. package/dist/google/gmail-timer.js +0 -223
  227. package/dist/google/gmail-timer.js.map +0 -1
  228. package/dist/google/gmail.js +0 -470
  229. package/dist/google/gmail.js.map +0 -1
  230. package/dist/google/plugin.js +0 -169
  231. package/dist/google/plugin.js.map +0 -1
  232. package/dist/google/tasks-timer.js +0 -107
  233. package/dist/google/tasks-timer.js.map +0 -1
  234. package/dist/google/tasks.js +0 -331
  235. package/dist/google/tasks.js.map +0 -1
  236. package/dist/google/temporal.js +0 -176
  237. package/dist/google/temporal.js.map +0 -1
  238. package/dist/integrations/gate.js +0 -100
  239. package/dist/integrations/gate.js.map +0 -1
  240. package/dist/integrations/github.js +0 -331
  241. package/dist/integrations/github.js.map +0 -1
  242. package/dist/integrations/google-tasks.js +0 -432
  243. package/dist/integrations/google-tasks.js.map +0 -1
  244. package/dist/mdns.js +0 -110
  245. package/dist/mdns.js.map +0 -1
  246. package/dist/notifications/channel.js +0 -83
  247. package/dist/notifications/channel.js.map +0 -1
  248. package/dist/notifications/channels/adapter.js +0 -55
  249. package/dist/notifications/channels/adapter.js.map +0 -1
  250. package/dist/notifications/channels/index.js +0 -6
  251. package/dist/notifications/channels/index.js.map +0 -1
  252. package/dist/notifications/channels/log.js +0 -29
  253. package/dist/notifications/channels/log.js.map +0 -1
  254. package/dist/notifications/email.js +0 -72
  255. package/dist/notifications/email.js.map +0 -1
  256. package/dist/notifications/engine.js +0 -198
  257. package/dist/notifications/engine.js.map +0 -1
  258. package/dist/notifications/index.js +0 -24
  259. package/dist/notifications/index.js.map +0 -1
  260. package/dist/notifications/phone.js +0 -48
  261. package/dist/notifications/phone.js.map +0 -1
  262. package/dist/notifications/sms.js +0 -65
  263. package/dist/notifications/sms.js.map +0 -1
  264. package/dist/notifications/types.js +0 -14
  265. package/dist/notifications/types.js.map +0 -1
  266. package/dist/notifications/webhook.js +0 -65
  267. package/dist/notifications/webhook.js.map +0 -1
  268. package/dist/resend/inbox.js +0 -199
  269. package/dist/resend/inbox.js.map +0 -1
  270. package/dist/resend/webhooks.js +0 -244
  271. package/dist/resend/webhooks.js.map +0 -1
  272. package/dist/search/browse.js +0 -225
  273. package/dist/search/browse.js.map +0 -1
  274. package/dist/search/perplexity.js +0 -41
  275. package/dist/search/perplexity.js.map +0 -1
  276. package/dist/slack/channels.js +0 -277
  277. package/dist/slack/channels.js.map +0 -1
  278. package/dist/slack/client.js +0 -468
  279. package/dist/slack/client.js.map +0 -1
  280. package/dist/slack/retry.js +0 -100
  281. package/dist/slack/retry.js.map +0 -1
  282. package/dist/slack/types.js +0 -52
  283. package/dist/slack/types.js.map +0 -1
  284. package/dist/slack/webhooks.js +0 -285
  285. package/dist/slack/webhooks.js.map +0 -1
  286. package/dist/stt/client.js +0 -66
  287. package/dist/stt/client.js.map +0 -1
  288. package/dist/stt/sidecar.js +0 -115
  289. package/dist/stt/sidecar.js.map +0 -1
  290. package/dist/tracing/bridge.js +0 -70
  291. package/dist/tracing/bridge.js.map +0 -1
  292. package/dist/tracing/correlation.js +0 -49
  293. package/dist/tracing/correlation.js.map +0 -1
  294. package/dist/tracing/index.js +0 -18
  295. package/dist/tracing/index.js.map +0 -1
  296. package/dist/tracing/init.js +0 -81
  297. package/dist/tracing/init.js.map +0 -1
  298. package/dist/tracing/instrument.js +0 -145
  299. package/dist/tracing/instrument.js.map +0 -1
  300. package/dist/tracing/middleware.js +0 -69
  301. package/dist/tracing/middleware.js.map +0 -1
  302. package/dist/tracing/tracer.js +0 -327
  303. package/dist/tracing/tracer.js.map +0 -1
  304. package/dist/tts/client.js +0 -48
  305. package/dist/tts/client.js.map +0 -1
  306. package/dist/tts/sidecar.js +0 -148
  307. package/dist/tts/sidecar.js.map +0 -1
  308. package/dist/twilio/call.js +0 -79
  309. package/dist/twilio/call.js.map +0 -1
  310. package/dist/vault/matcher.js +0 -197
  311. package/dist/vault/matcher.js.map +0 -1
  312. package/dist/vault/personal.js +0 -163
  313. package/dist/vault/personal.js.map +0 -1
  314. package/dist/vault/policy.js +0 -159
  315. package/dist/vault/policy.js.map +0 -1
  316. package/dist/vault/store.js +0 -122
  317. package/dist/vault/store.js.map +0 -1
  318. package/dist/vault/transfer.js +0 -188
  319. package/dist/vault/transfer.js.map +0 -1
  320. package/dist/volumes/index.js +0 -2
  321. package/dist/volumes/index.js.map +0 -1
  322. package/dist/volumes/manager.js +0 -462
  323. package/dist/volumes/manager.js.map +0 -1
  324. package/dist/volumes/types.js +0 -8
  325. package/dist/volumes/types.js.map +0 -1
  326. package/dist/webhooks/config.js +0 -214
  327. package/dist/webhooks/config.js.map +0 -1
  328. package/dist/webhooks/event-log.js +0 -132
  329. package/dist/webhooks/event-log.js.map +0 -1
  330. package/dist/webhooks/handler.js +0 -103
  331. package/dist/webhooks/handler.js.map +0 -1
  332. package/dist/webhooks/handlers.js +0 -231
  333. package/dist/webhooks/handlers.js.map +0 -1
  334. package/dist/webhooks/index.js +0 -33
  335. package/dist/webhooks/index.js.map +0 -1
  336. package/dist/webhooks/mount.js +0 -400
  337. package/dist/webhooks/mount.js.map +0 -1
  338. package/dist/webhooks/registry.js +0 -143
  339. package/dist/webhooks/registry.js.map +0 -1
  340. package/dist/webhooks/relay.js +0 -53
  341. package/dist/webhooks/relay.js.map +0 -1
  342. package/dist/webhooks/retry.js +0 -270
  343. package/dist/webhooks/retry.js.map +0 -1
  344. package/dist/webhooks/router.js +0 -290
  345. package/dist/webhooks/router.js.map +0 -1
  346. package/dist/webhooks/twilio.js +0 -129
  347. package/dist/webhooks/twilio.js.map +0 -1
  348. package/dist/webhooks/types.js +0 -8
  349. package/dist/webhooks/types.js.map +0 -1
  350. package/dist/webhooks/verify.js +0 -154
  351. package/dist/webhooks/verify.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/google/plugin.ts"],"names":[],"mappings":"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"}
@@ -1,107 +0,0 @@
1
- /**
2
- * Background tasks polling timer.
3
- * Checks for tasks due soon every 15 minutes.
4
- * When a task is due within 60 min, pushes a notification.
5
- * When a task is overdue, pushes a notification.
6
- * Follows calendar-timer.ts pattern: module-level state, idempotent start/stop.
7
- */
8
- import { listTasks, isTasksAvailable } from "./tasks.js";
9
- import { pushNotification } from "../goals/notifications.js";
10
- import { logActivity } from "../activity/log.js";
11
- import { createLogger } from "../utils/logger.js";
12
- const log = createLogger("tasks");
13
- const DEFAULT_INTERVAL_MS = 15 * 60 * 1000; // 15 minutes
14
- const DUE_SOON_THRESHOLD_MS = 60 * 60 * 1000; // 60 minutes
15
- let timer = null;
16
- const notifiedTaskIds = new Set(); // Avoid duplicate notifications
17
- /**
18
- * Start the tasks polling timer. Idempotent.
19
- */
20
- export function startTasksTimer(intervalMs) {
21
- if (timer)
22
- return;
23
- const interval = intervalMs ?? DEFAULT_INTERVAL_MS;
24
- timer = setInterval(async () => {
25
- if (!isTasksAvailable())
26
- return;
27
- try {
28
- // Fetch incomplete tasks due within the next 24 hours
29
- const now = new Date();
30
- const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
31
- const result = await listTasks("@default", {
32
- showCompleted: false,
33
- dueMax: tomorrow.toISOString(),
34
- });
35
- if (!result.ok || !result.data)
36
- return;
37
- for (const task of result.data) {
38
- if (notifiedTaskIds.has(task.id))
39
- continue;
40
- if (!task.due)
41
- continue;
42
- // Parse the due date safely (extract YYYY-MM-DD to avoid UTC shift)
43
- const match = task.due.match(/^(\d{4})-(\d{2})-(\d{2})/);
44
- if (!match)
45
- continue;
46
- // Due date is date-only (no time), so treat as end-of-day local
47
- const dueDate = new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]), 23, 59, 59);
48
- const msUntilDue = dueDate.getTime() - now.getTime();
49
- if (msUntilDue < 0) {
50
- // Overdue
51
- notifiedTaskIds.add(task.id);
52
- const msg = `Overdue task: ${task.title}`;
53
- pushNotification({
54
- timestamp: new Date().toISOString(),
55
- source: "tasks",
56
- message: msg,
57
- });
58
- logActivity({ source: "tasks", summary: msg });
59
- }
60
- else if (msUntilDue <= DUE_SOON_THRESHOLD_MS) {
61
- // Due soon
62
- notifiedTaskIds.add(task.id);
63
- const minsAway = Math.round(msUntilDue / 60_000);
64
- const msg = minsAway > 0
65
- ? `Task due in ${minsAway} min: ${task.title}`
66
- : `Task due now: ${task.title}`;
67
- pushNotification({
68
- timestamp: new Date().toISOString(),
69
- source: "tasks",
70
- message: msg,
71
- });
72
- logActivity({ source: "tasks", summary: msg });
73
- }
74
- }
75
- // Prune old notification IDs (keep max 200)
76
- if (notifiedTaskIds.size > 200) {
77
- const arr = [...notifiedTaskIds];
78
- const toRemove = arr.slice(0, arr.length - 200);
79
- for (const id of toRemove)
80
- notifiedTaskIds.delete(id);
81
- }
82
- }
83
- catch (err) {
84
- const msg = err instanceof Error ? err.message : String(err);
85
- logActivity({ source: "tasks", summary: `Poll error: ${msg}` });
86
- }
87
- }, interval);
88
- const mins = Math.round(interval / 60_000);
89
- log.info(`Tasks poll: every ${mins} min`);
90
- }
91
- /**
92
- * Stop the tasks polling timer.
93
- */
94
- export function stopTasksTimer() {
95
- if (timer) {
96
- clearInterval(timer);
97
- timer = null;
98
- }
99
- notifiedTaskIds.clear();
100
- }
101
- /**
102
- * Check if the tasks timer is running.
103
- */
104
- export function isTasksTimerRunning() {
105
- return timer !== null;
106
- }
107
- //# sourceMappingURL=tasks-timer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-timer.js","sourceRoot":"","sources":["../../src/google/tasks-timer.ts"],"names":[],"mappings":"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"}
@@ -1,331 +0,0 @@
1
- /**
2
- * Google Tasks API client.
3
- * Raw fetch via googleGet/googlePost/googlePatch/googleDelete — no SDK.
4
- * All functions return { ok, data?, message } — never throw.
5
- */
6
- import { googleGet, googlePost, googlePatch, googleDelete, isGoogleAuthenticated } from "./auth.js";
7
- import { createLogger } from "../utils/logger.js";
8
- const log = createLogger("google.tasks");
9
- const TASKS_API = "https://tasks.googleapis.com/tasks/v1";
10
- // --- Helpers ---
11
- function parseTaskList(tl) {
12
- return {
13
- id: tl.id,
14
- title: tl.title ?? "(untitled)",
15
- updated: tl.updated ?? "",
16
- };
17
- }
18
- function parseTask(t) {
19
- return {
20
- id: t.id,
21
- title: t.title ?? "(untitled)",
22
- notes: t.notes,
23
- status: t.status === "completed" ? "completed" : "needsAction",
24
- due: t.due,
25
- completed: t.completed,
26
- parent: t.parent,
27
- position: t.position ?? "0",
28
- updated: t.updated ?? "",
29
- };
30
- }
31
- /**
32
- * Convert a Date or ISO string to Google Tasks due date format.
33
- * Google Tasks expects RFC 3339 with time set to 00:00:00.000Z.
34
- *
35
- * Uses string extraction for ISO strings to avoid the UTC-midnight-to-local-time
36
- * shift bug: new Date('2026-03-04') parses as UTC midnight, but getDate() returns
37
- * local time, which can shift the date backward in timezones behind UTC.
38
- * Fix for ts_temporal_mismatch_01.
39
- */
40
- function toDueDate(date) {
41
- if (typeof date === "string") {
42
- // Extract YYYY-MM-DD directly from the string to avoid timezone shift
43
- const match = date.match(/^(\d{4})-(\d{2})-(\d{2})/);
44
- if (match) {
45
- return `${match[1]}-${match[2]}-${match[3]}T00:00:00.000Z`;
46
- }
47
- }
48
- // For Date objects or non-ISO strings, use local-time getters
49
- // (Date objects were constructed with local intent)
50
- const d = typeof date === "string" ? new Date(date) : date;
51
- const yyyy = d.getFullYear();
52
- const mm = String(d.getMonth() + 1).padStart(2, "0");
53
- const dd = String(d.getDate()).padStart(2, "0");
54
- return `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
55
- }
56
- // --- Public API ---
57
- /**
58
- * Check if Tasks is ready (Google authenticated).
59
- */
60
- export function isTasksAvailable() {
61
- return isGoogleAuthenticated();
62
- }
63
- // ==================== Task Lists ====================
64
- /**
65
- * List all task lists for the authenticated user.
66
- */
67
- export async function listTaskLists() {
68
- log.debug("Listing task lists");
69
- const result = await googleGet(`${TASKS_API}/users/@me/lists`, { maxResults: "100" });
70
- if (!result.ok) {
71
- log.error("Failed to list task lists", { error: result.message });
72
- return { ok: false, message: result.message };
73
- }
74
- const lists = (result.data?.items ?? []).map(parseTaskList);
75
- log.debug("Task lists fetched", { count: lists.length });
76
- return { ok: true, data: lists, message: `${lists.length} task lists` };
77
- }
78
- /**
79
- * Create a new task list.
80
- */
81
- export async function createTaskList(title) {
82
- if (!title)
83
- return { ok: false, message: "Title is required" };
84
- log.debug("Creating task list", { title });
85
- const result = await googlePost(`${TASKS_API}/users/@me/lists`, { title });
86
- if (!result.ok || !result.data) {
87
- log.error("Failed to create task list", { title, error: result.message });
88
- return { ok: false, message: result.message };
89
- }
90
- log.info("Task list created", { title, taskListId: result.data.id });
91
- return {
92
- ok: true,
93
- data: parseTaskList(result.data),
94
- message: `Task list created: ${title}`,
95
- };
96
- }
97
- /**
98
- * Update a task list's title.
99
- */
100
- export async function updateTaskList(taskListId, title) {
101
- log.debug("Updating task list", { taskListId, title });
102
- const result = await googlePatch(`${TASKS_API}/users/@me/lists/${taskListId}`, { title });
103
- if (!result.ok || !result.data) {
104
- log.error("Failed to update task list", { taskListId, error: result.message });
105
- return { ok: false, message: result.message };
106
- }
107
- log.info("Task list updated", { taskListId, title });
108
- return {
109
- ok: true,
110
- data: parseTaskList(result.data),
111
- message: `Task list updated: ${title}`,
112
- };
113
- }
114
- /**
115
- * Delete a task list.
116
- */
117
- export async function deleteTaskList(taskListId) {
118
- log.debug("Deleting task list", { taskListId });
119
- const result = await googleDelete(`${TASKS_API}/users/@me/lists/${taskListId}`);
120
- if (!result.ok) {
121
- log.error("Failed to delete task list", { taskListId, error: result.message });
122
- }
123
- else {
124
- log.info("Task list deleted", { taskListId });
125
- }
126
- return result;
127
- }
128
- // ==================== Tasks ====================
129
- /**
130
- * List tasks in a task list.
131
- * @param taskListId - Task list ID (default: "@default" for the user's default list)
132
- * @param showCompleted - Include completed tasks (default: false)
133
- * @param showHidden - Include hidden/deleted tasks (default: false)
134
- * @param dueMin - Only tasks due after this date (ISO string)
135
- * @param dueMax - Only tasks due before this date (ISO string)
136
- */
137
- export async function listTasks(taskListId = "@default", opts) {
138
- const params = {
139
- maxResults: String(opts?.maxResults ?? 100),
140
- showCompleted: String(opts?.showCompleted ?? false),
141
- showHidden: String(opts?.showHidden ?? false),
142
- };
143
- if (opts?.dueMin)
144
- params.dueMin = toDueDate(opts.dueMin);
145
- if (opts?.dueMax)
146
- params.dueMax = toDueDate(opts.dueMax);
147
- log.debug("Listing tasks", { taskListId, showCompleted: opts?.showCompleted });
148
- const result = await googleGet(`${TASKS_API}/lists/${taskListId}/tasks`, params);
149
- if (!result.ok) {
150
- log.error("Failed to list tasks", { taskListId, error: result.message });
151
- return { ok: false, message: result.message };
152
- }
153
- const tasks = (result.data?.items ?? []).map(parseTask);
154
- log.debug("Tasks listed", { taskListId, count: tasks.length });
155
- return { ok: true, data: tasks, message: `${tasks.length} tasks` };
156
- }
157
- /**
158
- * Get a single task by ID.
159
- */
160
- export async function getTask(taskListId, taskId) {
161
- const result = await googleGet(`${TASKS_API}/lists/${taskListId}/tasks/${taskId}`);
162
- if (!result.ok || !result.data)
163
- return { ok: false, message: result.message };
164
- return { ok: true, data: parseTask(result.data), message: "OK" };
165
- }
166
- /**
167
- * Create a new task.
168
- */
169
- export async function createTask(taskListId, task) {
170
- if (!task.title)
171
- return { ok: false, message: "Title is required" };
172
- const body = { title: task.title };
173
- if (task.notes)
174
- body.notes = task.notes;
175
- if (task.due)
176
- body.due = toDueDate(task.due);
177
- let url = `${TASKS_API}/lists/${taskListId}/tasks`;
178
- if (task.parent)
179
- url += `?parent=${task.parent}`;
180
- const result = await googlePost(url, body);
181
- if (!result.ok || !result.data)
182
- return { ok: false, message: result.message };
183
- return {
184
- ok: true,
185
- data: parseTask(result.data),
186
- message: `Task created: ${task.title}`,
187
- };
188
- }
189
- /**
190
- * Update an existing task.
191
- */
192
- export async function updateTask(taskListId, taskId, changes) {
193
- const body = {};
194
- if (changes.title !== undefined)
195
- body.title = changes.title;
196
- if (changes.notes !== undefined)
197
- body.notes = changes.notes;
198
- if (changes.due !== undefined)
199
- body.due = toDueDate(changes.due);
200
- if (changes.status !== undefined) {
201
- body.status = changes.status;
202
- if (changes.status === "completed") {
203
- body.completed = new Date().toISOString();
204
- }
205
- else {
206
- // Clearing completed resets the task to needsAction
207
- body.completed = null;
208
- }
209
- }
210
- const result = await googlePatch(`${TASKS_API}/lists/${taskListId}/tasks/${taskId}`, body);
211
- if (!result.ok || !result.data)
212
- return { ok: false, message: result.message };
213
- return {
214
- ok: true,
215
- data: parseTask(result.data),
216
- message: `Task updated: ${taskId}`,
217
- };
218
- }
219
- /**
220
- * Mark a task as completed.
221
- */
222
- export async function completeTask(taskListId, taskId) {
223
- return updateTask(taskListId, taskId, { status: "completed" });
224
- }
225
- /**
226
- * Mark a task as incomplete (reopen).
227
- */
228
- export async function uncompleteTask(taskListId, taskId) {
229
- return updateTask(taskListId, taskId, { status: "needsAction" });
230
- }
231
- /**
232
- * Delete a task.
233
- */
234
- export async function deleteTask(taskListId, taskId) {
235
- return googleDelete(`${TASKS_API}/lists/${taskListId}/tasks/${taskId}`);
236
- }
237
- /**
238
- * Create recurring weekly tasks by generating individual tasks with due dates
239
- * for the next N weeks. Google Tasks API doesn't support native recurrence,
240
- * so we create concrete future tasks.
241
- *
242
- * Example: createRecurringWeeklyTasks({
243
- * title: "Status Report",
244
- * dayOfWeek: 5, // Friday
245
- * hour: 16, // 4 PM
246
- * weeksAhead: 4,
247
- * })
248
- */
249
- export async function createRecurringWeeklyTasks(config) {
250
- const { title, notes, taskListId = "@default", dayOfWeek, hour, minute = 0, weeksAhead = 4, } = config;
251
- if (dayOfWeek < 0 || dayOfWeek > 6) {
252
- return { ok: false, message: "dayOfWeek must be 0 (Sunday) through 6 (Saturday)" };
253
- }
254
- // Find the next occurrence of the given day of week
255
- const now = new Date();
256
- const currentDay = now.getDay();
257
- let daysUntilNext = dayOfWeek - currentDay;
258
- if (daysUntilNext < 0)
259
- daysUntilNext += 7;
260
- if (daysUntilNext === 0) {
261
- // If today is the target day, check if the time has passed
262
- const targetToday = new Date(now);
263
- targetToday.setHours(hour, minute, 0, 0);
264
- if (now > targetToday)
265
- daysUntilNext = 7;
266
- }
267
- const dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
268
- const dayName = dayNames[dayOfWeek];
269
- const timeStr = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
270
- const created = [];
271
- const errors = [];
272
- for (let week = 0; week < weeksAhead; week++) {
273
- const dueDate = new Date(now);
274
- dueDate.setDate(now.getDate() + daysUntilNext + week * 7);
275
- dueDate.setHours(hour, minute, 0, 0);
276
- const dateLabel = dueDate.toLocaleDateString("en-US", {
277
- month: "short",
278
- day: "numeric",
279
- });
280
- const taskTitle = `${title} — ${dayName} ${dateLabel} ${timeStr}`;
281
- const taskNotes = notes
282
- ? `${notes}\n\nRecurring: every ${dayName} at ${timeStr}`
283
- : `Recurring: every ${dayName} at ${timeStr}`;
284
- const result = await createTask(taskListId, {
285
- title: taskTitle,
286
- notes: taskNotes,
287
- due: dueDate.toISOString(),
288
- });
289
- if (result.ok && result.data) {
290
- created.push(result.data);
291
- }
292
- else {
293
- errors.push(`Week ${week + 1}: ${result.message}`);
294
- }
295
- }
296
- if (created.length === 0) {
297
- return { ok: false, message: `Failed to create any tasks: ${errors.join("; ")}` };
298
- }
299
- const msg = errors.length > 0
300
- ? `Created ${created.length}/${weeksAhead} tasks (${errors.length} failed)`
301
- : `Created ${created.length} recurring tasks: ${title} every ${dayName} at ${timeStr}`;
302
- return { ok: true, data: created, message: msg };
303
- }
304
- // ==================== Context formatting ====================
305
- /**
306
- * Format tasks as a readable text block for LLM context injection.
307
- */
308
- export function formatTasksForContext(tasks) {
309
- if (tasks.length === 0)
310
- return "No tasks.";
311
- return tasks
312
- .map((t) => {
313
- const check = t.status === "completed" ? "[x]" : "[ ]";
314
- let dueStr = "";
315
- if (t.due) {
316
- // Extract YYYY-MM-DD directly to avoid UTC-midnight-to-local shift (ts_temporal_mismatch_01)
317
- const m = t.due.match(/^(\d{4})-(\d{2})-(\d{2})/);
318
- if (m) {
319
- const d = new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));
320
- dueStr = ` (due: ${d.toLocaleDateString("en-US", { month: "short", day: "numeric" })})`;
321
- }
322
- else {
323
- dueStr = ` (due: ${new Date(t.due).toLocaleDateString("en-US", { month: "short", day: "numeric" })})`;
324
- }
325
- }
326
- const notesStr = t.notes ? ` — ${t.notes.split("\n")[0]}` : "";
327
- return `- ${check} ${t.title}${dueStr}${notesStr}`;
328
- })
329
- .join("\n");
330
- }
331
- //# sourceMappingURL=tasks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/google/tasks.ts"],"names":[],"mappings":"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"}
@@ -1,176 +0,0 @@
1
- /**
2
- * Temporal validation layer.
3
- * Catches day-of-week mismatches before calendar entries are created.
4
- * Fixes ts_temporal_mismatch_01: March 4, 2026 is Wednesday, not Tuesday.
5
- *
6
- * Root cause: new Date('2026-03-04') parses as UTC midnight.
7
- * getDay() returns local-timezone day, which can shift backward by 1
8
- * in timezones behind UTC. All date math must use UTC methods on
9
- * UTC-parsed strings, or local methods on locally-constructed dates.
10
- */
11
- import { createLogger } from "../utils/logger.js";
12
- const log = createLogger("google.temporal");
13
- const DAY_NAMES = [
14
- "sunday", "monday", "tuesday", "wednesday",
15
- "thursday", "friday", "saturday",
16
- ];
17
- /**
18
- * Parse a date string into year/month/day without timezone ambiguity.
19
- * Extracts the date portion and constructs using local-time constructor
20
- * to avoid the UTC-midnight-shifts-to-previous-day bug.
21
- */
22
- export function parseDateSafe(dateStr) {
23
- // Extract YYYY-MM-DD from any ISO string or date-only string
24
- const match = dateStr.match(/^(\d{4})-(\d{2})-(\d{2})/);
25
- if (!match) {
26
- throw new Error(`Cannot parse date from: ${dateStr}`);
27
- }
28
- const [, year, month, day] = match;
29
- // Use the (year, monthIndex, day) constructor — this uses LOCAL time,
30
- // so getDay() will match the calendar date the user intended.
31
- return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
32
- }
33
- /**
34
- * Get the day-of-week name for a date string, correctly.
35
- * Uses parseDateSafe to avoid UTC/local timezone mismatch.
36
- */
37
- export function getDayOfWeek(dateStr) {
38
- const d = parseDateSafe(dateStr);
39
- return DAY_NAMES[d.getDay()];
40
- }
41
- /**
42
- * Get the day-of-week index (0=Sunday, 6=Saturday) for a date string.
43
- */
44
- export function getDayOfWeekIndex(dateStr) {
45
- return parseDateSafe(dateStr).getDay();
46
- }
47
- /**
48
- * Normalize a day name to lowercase for comparison.
49
- * Accepts full names ("Wednesday") and abbreviations ("Wed").
50
- */
51
- function normalizeDayName(name) {
52
- const lower = name.toLowerCase().trim();
53
- // Exact match
54
- const exact = DAY_NAMES.find((d) => d === lower);
55
- if (exact)
56
- return exact;
57
- // Prefix match (at least 3 chars: "mon", "tue", "wed", etc.)
58
- if (lower.length >= 3) {
59
- const prefix = DAY_NAMES.find((d) => d.startsWith(lower));
60
- if (prefix)
61
- return prefix;
62
- }
63
- return null;
64
- }
65
- /**
66
- * Validate that a date string falls on the expected day-of-week.
67
- *
68
- * @param dateStr - ISO date or datetime string (e.g., "2026-03-04" or "2026-03-04T11:00:00")
69
- * @param expectedDay - Expected day name (e.g., "Tuesday", "Wed")
70
- * @returns Validation result with actual vs expected day
71
- *
72
- * @example
73
- * validateDayOfWeek("2026-03-04", "Tuesday")
74
- * // { valid: false, actualDay: "wednesday", expectedDay: "tuesday", date: "2026-03-04",
75
- * // mismatch: "2026-03-04 is wednesday, not tuesday" }
76
- *
77
- * validateDayOfWeek("2026-03-04", "Wednesday")
78
- * // { valid: true, actualDay: "wednesday", expectedDay: "wednesday", date: "2026-03-04" }
79
- */
80
- export function validateDayOfWeek(dateStr, expectedDay) {
81
- const match = dateStr.match(/^(\d{4}-\d{2}-\d{2})/);
82
- if (!match) {
83
- return {
84
- valid: false,
85
- actualDay: "unknown",
86
- expectedDay: expectedDay.toLowerCase(),
87
- date: dateStr,
88
- mismatch: `Cannot parse date from: ${dateStr}`,
89
- };
90
- }
91
- const dateOnly = match[1];
92
- const actualDay = getDayOfWeek(dateStr);
93
- const normalizedExpected = normalizeDayName(expectedDay);
94
- if (!normalizedExpected) {
95
- return {
96
- valid: false,
97
- actualDay,
98
- expectedDay: expectedDay.toLowerCase(),
99
- date: dateOnly,
100
- mismatch: `Unrecognized day name: ${expectedDay}`,
101
- };
102
- }
103
- const valid = actualDay === normalizedExpected;
104
- return {
105
- valid,
106
- actualDay,
107
- expectedDay: normalizedExpected,
108
- date: dateOnly,
109
- ...(valid ? {} : {
110
- mismatch: `${dateOnly} is ${actualDay}, not ${normalizedExpected}`,
111
- }),
112
- };
113
- }
114
- /**
115
- * Validate a calendar event's start date before creation.
116
- * If expectedDayOfWeek is provided (from user input or LLM parsing),
117
- * cross-checks it against the actual calendar date.
118
- *
119
- * Returns { ok: true } if valid, or { ok: false, message, suggestion } if mismatched.
120
- */
121
- export function validateCalendarEntry(startDateStr, expectedDayOfWeek) {
122
- if (!expectedDayOfWeek)
123
- return { ok: true };
124
- const result = validateDayOfWeek(startDateStr, expectedDayOfWeek);
125
- if (result.valid)
126
- return { ok: true };
127
- // Find the correct date for the expected day within ±3 days
128
- const suggestion = findCorrectDate(startDateStr, expectedDayOfWeek);
129
- return {
130
- ok: false,
131
- message: `Temporal mismatch: ${result.mismatch}`,
132
- suggestion,
133
- };
134
- }
135
- /**
136
- * Given a date and the intended day-of-week, find the nearest date
137
- * that actually falls on that day (within ±3 days).
138
- */
139
- function findCorrectDate(dateStr, intendedDay) {
140
- const target = normalizeDayName(intendedDay);
141
- if (!target)
142
- return `Could not resolve day name: ${intendedDay}`;
143
- const targetIndex = DAY_NAMES.indexOf(target);
144
- const base = parseDateSafe(dateStr);
145
- for (let offset = -3; offset <= 3; offset++) {
146
- const candidate = new Date(base);
147
- candidate.setDate(base.getDate() + offset);
148
- if (candidate.getDay() === targetIndex) {
149
- const yyyy = candidate.getFullYear();
150
- const mm = String(candidate.getMonth() + 1).padStart(2, "0");
151
- const dd = String(candidate.getDate()).padStart(2, "0");
152
- return `Did you mean ${target} ${yyyy}-${mm}-${dd}?`;
153
- }
154
- }
155
- return `No ${target} found within ±3 days of ${dateStr}`;
156
- }
157
- /**
158
- * Safe conversion to Google Tasks due date format.
159
- * Extracts YYYY-MM-DD from the string directly, avoiding the
160
- * UTC-midnight-to-local-time shift bug in toDueDate.
161
- */
162
- export function toSafeDueDate(date) {
163
- if (typeof date === "string") {
164
- const match = date.match(/^(\d{4})-(\d{2})-(\d{2})/);
165
- if (match) {
166
- return `${match[1]}-${match[2]}-${match[3]}T00:00:00.000Z`;
167
- }
168
- }
169
- // For Date objects or non-ISO strings, use local-time getters
170
- const d = typeof date === "string" ? new Date(date) : date;
171
- const yyyy = d.getFullYear();
172
- const mm = String(d.getMonth() + 1).padStart(2, "0");
173
- const dd = String(d.getDate()).padStart(2, "0");
174
- return `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
175
- }
176
- //# sourceMappingURL=temporal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../src/google/temporal.ts"],"names":[],"mappings":"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"}