@digitalpresence/cliclaw 0.1.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 (338) hide show
  1. package/dist/__tests__/calendar.integration.test.d.ts +2 -0
  2. package/dist/__tests__/calendar.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/calendar.integration.test.js +98 -0
  4. package/dist/__tests__/calendar.integration.test.js.map +1 -0
  5. package/dist/__tests__/forms.integration.test.d.ts +2 -0
  6. package/dist/__tests__/forms.integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/forms.integration.test.js +243 -0
  8. package/dist/__tests__/forms.integration.test.js.map +1 -0
  9. package/dist/__tests__/gdrive.integration.test.d.ts +2 -0
  10. package/dist/__tests__/gdrive.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/gdrive.integration.test.js +186 -0
  12. package/dist/__tests__/gdrive.integration.test.js.map +1 -0
  13. package/dist/__tests__/gmail.integration.test.d.ts +2 -0
  14. package/dist/__tests__/gmail.integration.test.d.ts.map +1 -0
  15. package/dist/__tests__/gmail.integration.test.js +197 -0
  16. package/dist/__tests__/gmail.integration.test.js.map +1 -0
  17. package/dist/__tests__/gslides.integration.test.d.ts +2 -0
  18. package/dist/__tests__/gslides.integration.test.d.ts.map +1 -0
  19. package/dist/__tests__/gslides.integration.test.js +124 -0
  20. package/dist/__tests__/gslides.integration.test.js.map +1 -0
  21. package/dist/__tests__/sheets.integration.test.d.ts +2 -0
  22. package/dist/__tests__/sheets.integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/sheets.integration.test.js +150 -0
  24. package/dist/__tests__/sheets.integration.test.js.map +1 -0
  25. package/dist/agent/crud.d.ts +6 -0
  26. package/dist/agent/crud.d.ts.map +1 -0
  27. package/dist/agent/crud.js +41 -0
  28. package/dist/agent/crud.js.map +1 -0
  29. package/dist/agent/memory.d.ts +14 -0
  30. package/dist/agent/memory.d.ts.map +1 -0
  31. package/dist/agent/memory.js +66 -0
  32. package/dist/agent/memory.js.map +1 -0
  33. package/dist/agent/permissions.d.ts +4 -0
  34. package/dist/agent/permissions.d.ts.map +1 -0
  35. package/dist/agent/permissions.js +32 -0
  36. package/dist/agent/permissions.js.map +1 -0
  37. package/dist/calendar/accounts.d.ts +3 -0
  38. package/dist/calendar/accounts.d.ts.map +1 -0
  39. package/dist/calendar/accounts.js +21 -0
  40. package/dist/calendar/accounts.js.map +1 -0
  41. package/dist/calendar/auth.d.ts +3 -0
  42. package/dist/calendar/auth.d.ts.map +1 -0
  43. package/dist/calendar/auth.js +41 -0
  44. package/dist/calendar/auth.js.map +1 -0
  45. package/dist/calendar/calendars.d.ts +3 -0
  46. package/dist/calendar/calendars.d.ts.map +1 -0
  47. package/dist/calendar/calendars.js +28 -0
  48. package/dist/calendar/calendars.js.map +1 -0
  49. package/dist/calendar/create.d.ts +3 -0
  50. package/dist/calendar/create.d.ts.map +1 -0
  51. package/dist/calendar/create.js +31 -0
  52. package/dist/calendar/create.js.map +1 -0
  53. package/dist/calendar/delete.d.ts +3 -0
  54. package/dist/calendar/delete.d.ts.map +1 -0
  55. package/dist/calendar/delete.js +21 -0
  56. package/dist/calendar/delete.js.map +1 -0
  57. package/dist/calendar/events.d.ts +3 -0
  58. package/dist/calendar/events.d.ts.map +1 -0
  59. package/dist/calendar/events.js +37 -0
  60. package/dist/calendar/events.js.map +1 -0
  61. package/dist/calendar/get.d.ts +3 -0
  62. package/dist/calendar/get.d.ts.map +1 -0
  63. package/dist/calendar/get.js +21 -0
  64. package/dist/calendar/get.js.map +1 -0
  65. package/dist/calendar/update.d.ts +3 -0
  66. package/dist/calendar/update.d.ts.map +1 -0
  67. package/dist/calendar/update.js +31 -0
  68. package/dist/calendar/update.js.map +1 -0
  69. package/dist/cli.d.ts +3 -0
  70. package/dist/cli.d.ts.map +1 -0
  71. package/dist/cli.js +37 -0
  72. package/dist/cli.js.map +1 -0
  73. package/dist/commands/agent.d.ts +6 -0
  74. package/dist/commands/agent.d.ts.map +1 -0
  75. package/dist/commands/agent.js +107 -0
  76. package/dist/commands/agent.js.map +1 -0
  77. package/dist/commands/calendar.d.ts +9 -0
  78. package/dist/commands/calendar.d.ts.map +1 -0
  79. package/dist/commands/calendar.js +104 -0
  80. package/dist/commands/calendar.js.map +1 -0
  81. package/dist/commands/cron.d.ts +6 -0
  82. package/dist/commands/cron.d.ts.map +1 -0
  83. package/dist/commands/cron.js +103 -0
  84. package/dist/commands/cron.js.map +1 -0
  85. package/dist/commands/forms.d.ts +9 -0
  86. package/dist/commands/forms.d.ts.map +1 -0
  87. package/dist/commands/forms.js +139 -0
  88. package/dist/commands/forms.js.map +1 -0
  89. package/dist/commands/gdrive.d.ts +9 -0
  90. package/dist/commands/gdrive.d.ts.map +1 -0
  91. package/dist/commands/gdrive.js +198 -0
  92. package/dist/commands/gdrive.js.map +1 -0
  93. package/dist/commands/gmail.d.ts +9 -0
  94. package/dist/commands/gmail.d.ts.map +1 -0
  95. package/dist/commands/gmail.js +231 -0
  96. package/dist/commands/gmail.js.map +1 -0
  97. package/dist/commands/gslides.d.ts +9 -0
  98. package/dist/commands/gslides.d.ts.map +1 -0
  99. package/dist/commands/gslides.js +167 -0
  100. package/dist/commands/gslides.js.map +1 -0
  101. package/dist/commands/sheets.d.ts +9 -0
  102. package/dist/commands/sheets.d.ts.map +1 -0
  103. package/dist/commands/sheets.js +174 -0
  104. package/dist/commands/sheets.js.map +1 -0
  105. package/dist/cron/daemon.d.ts +3 -0
  106. package/dist/cron/daemon.d.ts.map +1 -0
  107. package/dist/cron/daemon.js +127 -0
  108. package/dist/cron/daemon.js.map +1 -0
  109. package/dist/cron/handlers.d.ts +6 -0
  110. package/dist/cron/handlers.d.ts.map +1 -0
  111. package/dist/cron/handlers.js +58 -0
  112. package/dist/cron/handlers.js.map +1 -0
  113. package/dist/cron/logger.d.ts +4 -0
  114. package/dist/cron/logger.d.ts.map +1 -0
  115. package/dist/cron/logger.js +11 -0
  116. package/dist/cron/logger.js.map +1 -0
  117. package/dist/cron/progress.d.ts +25 -0
  118. package/dist/cron/progress.d.ts.map +1 -0
  119. package/dist/cron/progress.js +71 -0
  120. package/dist/cron/progress.js.map +1 -0
  121. package/dist/cron/ralph-wiggum.d.ts +18 -0
  122. package/dist/cron/ralph-wiggum.d.ts.map +1 -0
  123. package/dist/cron/ralph-wiggum.js +143 -0
  124. package/dist/cron/ralph-wiggum.js.map +1 -0
  125. package/dist/forms/accounts.d.ts +3 -0
  126. package/dist/forms/accounts.d.ts.map +1 -0
  127. package/dist/forms/accounts.js +20 -0
  128. package/dist/forms/accounts.js.map +1 -0
  129. package/dist/forms/auth.d.ts +3 -0
  130. package/dist/forms/auth.d.ts.map +1 -0
  131. package/dist/forms/auth.js +41 -0
  132. package/dist/forms/auth.js.map +1 -0
  133. package/dist/forms/create.d.ts +3 -0
  134. package/dist/forms/create.d.ts.map +1 -0
  135. package/dist/forms/create.js +28 -0
  136. package/dist/forms/create.js.map +1 -0
  137. package/dist/forms/get.d.ts +3 -0
  138. package/dist/forms/get.d.ts.map +1 -0
  139. package/dist/forms/get.js +21 -0
  140. package/dist/forms/get.js.map +1 -0
  141. package/dist/forms/list.d.ts +3 -0
  142. package/dist/forms/list.d.ts.map +1 -0
  143. package/dist/forms/list.js +33 -0
  144. package/dist/forms/list.js.map +1 -0
  145. package/dist/forms/questions.d.ts +6 -0
  146. package/dist/forms/questions.d.ts.map +1 -0
  147. package/dist/forms/questions.js +179 -0
  148. package/dist/forms/questions.js.map +1 -0
  149. package/dist/forms/responses.d.ts +4 -0
  150. package/dist/forms/responses.d.ts.map +1 -0
  151. package/dist/forms/responses.js +40 -0
  152. package/dist/forms/responses.js.map +1 -0
  153. package/dist/forms/update.d.ts +3 -0
  154. package/dist/forms/update.d.ts.map +1 -0
  155. package/dist/forms/update.js +44 -0
  156. package/dist/forms/update.js.map +1 -0
  157. package/dist/gdrive/about.d.ts +3 -0
  158. package/dist/gdrive/about.d.ts.map +1 -0
  159. package/dist/gdrive/about.js +31 -0
  160. package/dist/gdrive/about.js.map +1 -0
  161. package/dist/gdrive/accounts.d.ts +3 -0
  162. package/dist/gdrive/accounts.d.ts.map +1 -0
  163. package/dist/gdrive/accounts.js +20 -0
  164. package/dist/gdrive/accounts.js.map +1 -0
  165. package/dist/gdrive/auth.d.ts +3 -0
  166. package/dist/gdrive/auth.d.ts.map +1 -0
  167. package/dist/gdrive/auth.js +51 -0
  168. package/dist/gdrive/auth.js.map +1 -0
  169. package/dist/gdrive/files.d.ts +12 -0
  170. package/dist/gdrive/files.d.ts.map +1 -0
  171. package/dist/gdrive/files.js +174 -0
  172. package/dist/gdrive/files.js.map +1 -0
  173. package/dist/gdrive/folders.d.ts +4 -0
  174. package/dist/gdrive/folders.d.ts.map +1 -0
  175. package/dist/gdrive/folders.js +46 -0
  176. package/dist/gdrive/folders.js.map +1 -0
  177. package/dist/gdrive/search.d.ts +3 -0
  178. package/dist/gdrive/search.d.ts.map +1 -0
  179. package/dist/gdrive/search.js +23 -0
  180. package/dist/gdrive/search.js.map +1 -0
  181. package/dist/gdrive/sharing.d.ts +5 -0
  182. package/dist/gdrive/sharing.d.ts.map +1 -0
  183. package/dist/gdrive/sharing.js +54 -0
  184. package/dist/gdrive/sharing.js.map +1 -0
  185. package/dist/gmail/accounts.d.ts +3 -0
  186. package/dist/gmail/accounts.d.ts.map +1 -0
  187. package/dist/gmail/accounts.js +18 -0
  188. package/dist/gmail/accounts.js.map +1 -0
  189. package/dist/gmail/auth.d.ts +3 -0
  190. package/dist/gmail/auth.d.ts.map +1 -0
  191. package/dist/gmail/auth.js +50 -0
  192. package/dist/gmail/auth.js.map +1 -0
  193. package/dist/gmail/drafts.d.ts +7 -0
  194. package/dist/gmail/drafts.d.ts.map +1 -0
  195. package/dist/gmail/drafts.js +103 -0
  196. package/dist/gmail/drafts.js.map +1 -0
  197. package/dist/gmail/get.d.ts +4 -0
  198. package/dist/gmail/get.d.ts.map +1 -0
  199. package/dist/gmail/get.js +140 -0
  200. package/dist/gmail/get.js.map +1 -0
  201. package/dist/gmail/inbox.d.ts +4 -0
  202. package/dist/gmail/inbox.d.ts.map +1 -0
  203. package/dist/gmail/inbox.js +45 -0
  204. package/dist/gmail/inbox.js.map +1 -0
  205. package/dist/gmail/labels.d.ts +5 -0
  206. package/dist/gmail/labels.d.ts.map +1 -0
  207. package/dist/gmail/labels.js +45 -0
  208. package/dist/gmail/labels.js.map +1 -0
  209. package/dist/gmail/modify.d.ts +5 -0
  210. package/dist/gmail/modify.d.ts.map +1 -0
  211. package/dist/gmail/modify.js +68 -0
  212. package/dist/gmail/modify.js.map +1 -0
  213. package/dist/gmail/send.d.ts +5 -0
  214. package/dist/gmail/send.d.ts.map +1 -0
  215. package/dist/gmail/send.js +310 -0
  216. package/dist/gmail/send.js.map +1 -0
  217. package/dist/gmail/threads.d.ts +4 -0
  218. package/dist/gmail/threads.d.ts.map +1 -0
  219. package/dist/gmail/threads.js +47 -0
  220. package/dist/gmail/threads.js.map +1 -0
  221. package/dist/gslides/accounts.d.ts +3 -0
  222. package/dist/gslides/accounts.d.ts.map +1 -0
  223. package/dist/gslides/accounts.js +20 -0
  224. package/dist/gslides/accounts.js.map +1 -0
  225. package/dist/gslides/auth.d.ts +3 -0
  226. package/dist/gslides/auth.d.ts.map +1 -0
  227. package/dist/gslides/auth.js +50 -0
  228. package/dist/gslides/auth.js.map +1 -0
  229. package/dist/gslides/presentations.d.ts +29 -0
  230. package/dist/gslides/presentations.d.ts.map +1 -0
  231. package/dist/gslides/presentations.js +320 -0
  232. package/dist/gslides/presentations.js.map +1 -0
  233. package/dist/lib/config.d.ts +6 -0
  234. package/dist/lib/config.d.ts.map +1 -0
  235. package/dist/lib/config.js +12 -0
  236. package/dist/lib/config.js.map +1 -0
  237. package/dist/lib/media-utils.d.ts +5 -0
  238. package/dist/lib/media-utils.d.ts.map +1 -0
  239. package/dist/lib/media-utils.js +79 -0
  240. package/dist/lib/media-utils.js.map +1 -0
  241. package/dist/lib/output.d.ts +4 -0
  242. package/dist/lib/output.d.ts.map +1 -0
  243. package/dist/lib/output.js +12 -0
  244. package/dist/lib/output.js.map +1 -0
  245. package/dist/sheets/accounts.d.ts +3 -0
  246. package/dist/sheets/accounts.d.ts.map +1 -0
  247. package/dist/sheets/accounts.js +20 -0
  248. package/dist/sheets/accounts.js.map +1 -0
  249. package/dist/sheets/auth.d.ts +3 -0
  250. package/dist/sheets/auth.d.ts.map +1 -0
  251. package/dist/sheets/auth.js +56 -0
  252. package/dist/sheets/auth.js.map +1 -0
  253. package/dist/sheets/cells.d.ts +6 -0
  254. package/dist/sheets/cells.d.ts.map +1 -0
  255. package/dist/sheets/cells.js +89 -0
  256. package/dist/sheets/cells.js.map +1 -0
  257. package/dist/sheets/format.d.ts +8 -0
  258. package/dist/sheets/format.d.ts.map +1 -0
  259. package/dist/sheets/format.js +97 -0
  260. package/dist/sheets/format.js.map +1 -0
  261. package/dist/sheets/sheets-tab.d.ts +6 -0
  262. package/dist/sheets/sheets-tab.d.ts.map +1 -0
  263. package/dist/sheets/sheets-tab.js +88 -0
  264. package/dist/sheets/sheets-tab.js.map +1 -0
  265. package/dist/sheets/spreadsheets.d.ts +6 -0
  266. package/dist/sheets/spreadsheets.d.ts.map +1 -0
  267. package/dist/sheets/spreadsheets.js +88 -0
  268. package/dist/sheets/spreadsheets.js.map +1 -0
  269. package/package.json +33 -0
  270. package/src/__tests__/calendar.integration.test.ts +152 -0
  271. package/src/__tests__/forms.integration.test.ts +403 -0
  272. package/src/__tests__/gdrive.integration.test.ts +253 -0
  273. package/src/__tests__/gmail.integration.test.ts +294 -0
  274. package/src/__tests__/gslides.integration.test.ts +195 -0
  275. package/src/__tests__/sheets.integration.test.ts +234 -0
  276. package/src/agent/crud.ts +54 -0
  277. package/src/agent/memory.ts +95 -0
  278. package/src/agent/permissions.ts +54 -0
  279. package/src/calendar/accounts.ts +25 -0
  280. package/src/calendar/auth.ts +45 -0
  281. package/src/calendar/calendars.ts +32 -0
  282. package/src/calendar/create.ts +44 -0
  283. package/src/calendar/delete.ts +27 -0
  284. package/src/calendar/events.ts +45 -0
  285. package/src/calendar/get.ts +27 -0
  286. package/src/calendar/update.ts +44 -0
  287. package/src/cli.ts +41 -0
  288. package/src/commands/agent.ts +128 -0
  289. package/src/commands/calendar.ts +127 -0
  290. package/src/commands/cron.ts +126 -0
  291. package/src/commands/forms.ts +158 -0
  292. package/src/commands/gdrive.ts +225 -0
  293. package/src/commands/gmail.ts +290 -0
  294. package/src/commands/gslides.ts +188 -0
  295. package/src/commands/sheets.ts +193 -0
  296. package/src/cron/daemon.ts +143 -0
  297. package/src/cron/handlers.ts +78 -0
  298. package/src/cron/logger.ts +20 -0
  299. package/src/cron/progress.ts +90 -0
  300. package/src/cron/ralph-wiggum.ts +172 -0
  301. package/src/forms/accounts.ts +24 -0
  302. package/src/forms/auth.ts +45 -0
  303. package/src/forms/create.ts +34 -0
  304. package/src/forms/get.ts +26 -0
  305. package/src/forms/list.ts +38 -0
  306. package/src/forms/questions.ts +209 -0
  307. package/src/forms/responses.ts +50 -0
  308. package/src/forms/update.ts +57 -0
  309. package/src/gdrive/about.ts +36 -0
  310. package/src/gdrive/accounts.ts +24 -0
  311. package/src/gdrive/auth.ts +55 -0
  312. package/src/gdrive/files.ts +237 -0
  313. package/src/gdrive/folders.ts +58 -0
  314. package/src/gdrive/search.ts +30 -0
  315. package/src/gdrive/sharing.ts +72 -0
  316. package/src/gmail/accounts.ts +22 -0
  317. package/src/gmail/auth.ts +53 -0
  318. package/src/gmail/drafts.ts +166 -0
  319. package/src/gmail/get.ts +195 -0
  320. package/src/gmail/inbox.ts +78 -0
  321. package/src/gmail/labels.ts +69 -0
  322. package/src/gmail/modify.ts +89 -0
  323. package/src/gmail/send.ts +424 -0
  324. package/src/gmail/threads.ts +68 -0
  325. package/src/gslides/accounts.ts +24 -0
  326. package/src/gslides/auth.ts +54 -0
  327. package/src/gslides/presentations.ts +384 -0
  328. package/src/lib/config.ts +14 -0
  329. package/src/lib/media-utils.ts +82 -0
  330. package/src/lib/output.ts +13 -0
  331. package/src/sheets/accounts.ts +24 -0
  332. package/src/sheets/auth.ts +60 -0
  333. package/src/sheets/cells.ts +112 -0
  334. package/src/sheets/format.ts +114 -0
  335. package/src/sheets/sheets-tab.ts +109 -0
  336. package/src/sheets/spreadsheets.ts +106 -0
  337. package/tsconfig.json +8 -0
  338. package/vitest.config.ts +7 -0
@@ -0,0 +1,167 @@
1
+ import { handleAuth } from "../gslides/auth.js";
2
+ import { handleAccounts } from "../gslides/accounts.js";
3
+ import { handleList, handleGet, handleCreate, handleDelete, handleGetSlide, handleAddSlide, handleDeleteSlide, handleAddText, handleAddImage, handleAddShape, handleDuplicateSlide, } from "../gslides/presentations.js";
4
+ export function registerGSlidesCommands(program, getClient) {
5
+ let cached = null;
6
+ function resolve() {
7
+ if (!cached)
8
+ cached = getClient();
9
+ return cached;
10
+ }
11
+ const gslides = program.command("gslides").description("Google Slides commands");
12
+ gslides
13
+ .command("auth")
14
+ .description("Authenticate with Google Slides via Google OAuth2")
15
+ .option("--account <name>", "Account name", "default")
16
+ .action(async (opts) => {
17
+ const { clientManager, port } = resolve();
18
+ await handleAuth(clientManager, port, opts.account);
19
+ });
20
+ gslides
21
+ .command("accounts")
22
+ .description("List authenticated Google Slides accounts")
23
+ .action(async () => {
24
+ const { clientManager } = resolve();
25
+ await handleAccounts(clientManager);
26
+ });
27
+ gslides
28
+ .command("list")
29
+ .description("List presentations in Google Drive")
30
+ .option("--max-results <n>", "Maximum presentations to return", "20")
31
+ .option("--account <name>", "Account name", "default")
32
+ .action(async (opts) => {
33
+ const { clientManager } = resolve();
34
+ await handleList(clientManager, opts.account, parseInt(opts.maxResults));
35
+ });
36
+ gslides
37
+ .command("get")
38
+ .description("Get presentation details")
39
+ .requiredOption("--id <id>", "Presentation ID")
40
+ .option("--account <name>", "Account name", "default")
41
+ .action(async (opts) => {
42
+ const { clientManager } = resolve();
43
+ await handleGet(clientManager, opts.account, opts.id);
44
+ });
45
+ gslides
46
+ .command("create")
47
+ .description("Create a new presentation")
48
+ .requiredOption("--title <title>", "Presentation title")
49
+ .option("--account <name>", "Account name", "default")
50
+ .action(async (opts) => {
51
+ const { clientManager } = resolve();
52
+ await handleCreate(clientManager, opts.account, opts.title);
53
+ });
54
+ gslides
55
+ .command("delete")
56
+ .description("Permanently delete a presentation")
57
+ .requiredOption("--id <id>", "Presentation ID")
58
+ .option("--account <name>", "Account name", "default")
59
+ .action(async (opts) => {
60
+ const { clientManager } = resolve();
61
+ await handleDelete(clientManager, opts.account, opts.id);
62
+ });
63
+ gslides
64
+ .command("get-slide")
65
+ .description("Get details of a specific slide by index")
66
+ .requiredOption("--id <id>", "Presentation ID")
67
+ .requiredOption("--index <n>", "Slide index (0-based)")
68
+ .option("--account <name>", "Account name", "default")
69
+ .action(async (opts) => {
70
+ const { clientManager } = resolve();
71
+ await handleGetSlide(clientManager, opts.account, opts.id, parseInt(opts.index));
72
+ });
73
+ gslides
74
+ .command("add-slide")
75
+ .description("Add a new slide to a presentation")
76
+ .requiredOption("--id <id>", "Presentation ID")
77
+ .option("--layout <layout>", "Predefined layout (e.g. BLANK, TITLE, TITLE_AND_BODY)")
78
+ .option("--at <n>", "Insertion index (0-based)")
79
+ .option("--account <name>", "Account name", "default")
80
+ .action(async (opts) => {
81
+ const { clientManager } = resolve();
82
+ await handleAddSlide(clientManager, opts.account, opts.id, opts.layout, opts.at !== undefined ? parseInt(opts.at) : undefined);
83
+ });
84
+ gslides
85
+ .command("delete-slide")
86
+ .description("Delete a slide from a presentation")
87
+ .requiredOption("--id <id>", "Presentation ID")
88
+ .requiredOption("--slide-id <slideId>", "Slide object ID")
89
+ .option("--account <name>", "Account name", "default")
90
+ .action(async (opts) => {
91
+ const { clientManager } = resolve();
92
+ await handleDeleteSlide(clientManager, opts.account, opts.id, opts.slideId);
93
+ });
94
+ gslides
95
+ .command("add-text")
96
+ .description("Add a text box to a slide")
97
+ .requiredOption("--id <id>", "Presentation ID")
98
+ .requiredOption("--slide-id <slideId>", "Slide object ID")
99
+ .requiredOption("--text <text>", "Text content")
100
+ .option("--x <n>", "X position in points", "100")
101
+ .option("--y <n>", "Y position in points", "100")
102
+ .option("--width <n>", "Width in points", "400")
103
+ .option("--height <n>", "Height in points", "50")
104
+ .option("--font-size <n>", "Font size in points")
105
+ .option("--account <name>", "Account name", "default")
106
+ .action(async (opts) => {
107
+ const { clientManager } = resolve();
108
+ await handleAddText(clientManager, opts.account, opts.id, opts.slideId, opts.text, {
109
+ x: parseFloat(opts.x),
110
+ y: parseFloat(opts.y),
111
+ width: parseFloat(opts.width),
112
+ height: parseFloat(opts.height),
113
+ fontSize: opts.fontSize ? parseFloat(opts.fontSize) : undefined,
114
+ });
115
+ });
116
+ gslides
117
+ .command("add-image")
118
+ .description("Add an image to a slide from a URL")
119
+ .requiredOption("--id <id>", "Presentation ID")
120
+ .requiredOption("--slide-id <slideId>", "Slide object ID")
121
+ .requiredOption("--url <url>", "Image URL")
122
+ .option("--x <n>", "X position in points", "100")
123
+ .option("--y <n>", "Y position in points", "100")
124
+ .option("--width <n>", "Width in points", "300")
125
+ .option("--height <n>", "Height in points", "200")
126
+ .option("--account <name>", "Account name", "default")
127
+ .action(async (opts) => {
128
+ const { clientManager } = resolve();
129
+ await handleAddImage(clientManager, opts.account, opts.id, opts.slideId, opts.url, {
130
+ x: parseFloat(opts.x),
131
+ y: parseFloat(opts.y),
132
+ width: parseFloat(opts.width),
133
+ height: parseFloat(opts.height),
134
+ });
135
+ });
136
+ gslides
137
+ .command("add-shape")
138
+ .description("Add a shape to a slide")
139
+ .requiredOption("--id <id>", "Presentation ID")
140
+ .requiredOption("--slide-id <slideId>", "Slide object ID")
141
+ .requiredOption("--shape <type>", "Shape type (e.g. RECTANGLE, ELLIPSE, STAR_5)")
142
+ .option("--x <n>", "X position in points", "100")
143
+ .option("--y <n>", "Y position in points", "100")
144
+ .option("--width <n>", "Width in points", "200")
145
+ .option("--height <n>", "Height in points", "200")
146
+ .option("--account <name>", "Account name", "default")
147
+ .action(async (opts) => {
148
+ const { clientManager } = resolve();
149
+ await handleAddShape(clientManager, opts.account, opts.id, opts.slideId, opts.shape, {
150
+ x: parseFloat(opts.x),
151
+ y: parseFloat(opts.y),
152
+ width: parseFloat(opts.width),
153
+ height: parseFloat(opts.height),
154
+ });
155
+ });
156
+ gslides
157
+ .command("duplicate-slide")
158
+ .description("Duplicate a slide")
159
+ .requiredOption("--id <id>", "Presentation ID")
160
+ .requiredOption("--slide-id <slideId>", "Slide object ID to duplicate")
161
+ .option("--account <name>", "Account name", "default")
162
+ .action(async (opts) => {
163
+ const { clientManager } = resolve();
164
+ await handleDuplicateSlide(clientManager, opts.account, opts.id, opts.slideId);
165
+ });
166
+ }
167
+ //# sourceMappingURL=gslides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gslides.js","sourceRoot":"","sources":["../../src/commands/gslides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ import type { OAuthClientManager } from "@digitalpresence/cliclaw-auth";
3
+ type ClientFactory = () => {
4
+ clientManager: OAuthClientManager;
5
+ port: number;
6
+ };
7
+ export declare function registerSheetsCommands(program: Command, getClient: ClientFactory): void;
8
+ export {};
9
+ //# sourceMappingURL=sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../src/commands/sheets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQxE,KAAK,aAAa,GAAG,MAAM;IAAE,aAAa,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAqLvF"}
@@ -0,0 +1,174 @@
1
+ import { handleAuth } from "../sheets/auth.js";
2
+ import { handleAccounts } from "../sheets/accounts.js";
3
+ import { handleList, handleCreate, handleGet, handleDelete } from "../sheets/spreadsheets.js";
4
+ import { handleListSheets, handleAddSheet, handleDeleteSheet, handleRenameSheet } from "../sheets/sheets-tab.js";
5
+ import { handleRead, handleWrite, handleAppend, handleClear } from "../sheets/cells.js";
6
+ import { handleFormat } from "../sheets/format.js";
7
+ export function registerSheetsCommands(program, getClient) {
8
+ let cached = null;
9
+ function resolve() {
10
+ if (!cached)
11
+ cached = getClient();
12
+ return cached;
13
+ }
14
+ const sheets = program.command("sheets").description("Google Sheets commands");
15
+ sheets
16
+ .command("auth")
17
+ .description("Authenticate with Google Sheets via Google OAuth2")
18
+ .option("--account <name>", "Account name", "default")
19
+ .action(async (opts) => {
20
+ const { clientManager, port } = resolve();
21
+ await handleAuth(clientManager, port, opts.account);
22
+ });
23
+ sheets
24
+ .command("accounts")
25
+ .description("List authenticated Google Sheets accounts")
26
+ .action(async () => {
27
+ const { clientManager } = resolve();
28
+ await handleAccounts(clientManager);
29
+ });
30
+ // Spreadsheet-level commands
31
+ sheets
32
+ .command("list")
33
+ .description("List spreadsheets in Google Drive")
34
+ .option("--max-results <n>", "Maximum spreadsheets to return", "20")
35
+ .option("--account <name>", "Account name", "default")
36
+ .action(async (opts) => {
37
+ const { clientManager } = resolve();
38
+ await handleList(clientManager, opts.account, parseInt(opts.maxResults));
39
+ });
40
+ sheets
41
+ .command("create")
42
+ .description("Create a new spreadsheet")
43
+ .requiredOption("--title <title>", "Spreadsheet title")
44
+ .option("--account <name>", "Account name", "default")
45
+ .action(async (opts) => {
46
+ const { clientManager } = resolve();
47
+ await handleCreate(clientManager, opts.account, opts.title);
48
+ });
49
+ sheets
50
+ .command("get")
51
+ .description("Get spreadsheet metadata")
52
+ .requiredOption("--id <id>", "Spreadsheet ID")
53
+ .option("--account <name>", "Account name", "default")
54
+ .action(async (opts) => {
55
+ const { clientManager } = resolve();
56
+ await handleGet(clientManager, opts.account, opts.id);
57
+ });
58
+ sheets
59
+ .command("delete")
60
+ .description("Permanently delete a spreadsheet")
61
+ .requiredOption("--id <id>", "Spreadsheet ID")
62
+ .option("--account <name>", "Account name", "default")
63
+ .action(async (opts) => {
64
+ const { clientManager } = resolve();
65
+ await handleDelete(clientManager, opts.account, opts.id);
66
+ });
67
+ // Sheet/tab-level commands
68
+ sheets
69
+ .command("list-sheets")
70
+ .description("List sheets/tabs in a spreadsheet")
71
+ .requiredOption("--id <id>", "Spreadsheet ID")
72
+ .option("--account <name>", "Account name", "default")
73
+ .action(async (opts) => {
74
+ const { clientManager } = resolve();
75
+ await handleListSheets(clientManager, opts.account, opts.id);
76
+ });
77
+ sheets
78
+ .command("add-sheet")
79
+ .description("Add a new sheet/tab to a spreadsheet")
80
+ .requiredOption("--id <id>", "Spreadsheet ID")
81
+ .requiredOption("--title <title>", "Sheet title")
82
+ .option("--account <name>", "Account name", "default")
83
+ .action(async (opts) => {
84
+ const { clientManager } = resolve();
85
+ await handleAddSheet(clientManager, opts.account, opts.id, opts.title);
86
+ });
87
+ sheets
88
+ .command("delete-sheet")
89
+ .description("Delete a sheet/tab from a spreadsheet")
90
+ .requiredOption("--id <id>", "Spreadsheet ID")
91
+ .requiredOption("--sheet-id <sheetId>", "Sheet ID (numeric)")
92
+ .option("--account <name>", "Account name", "default")
93
+ .action(async (opts) => {
94
+ const { clientManager } = resolve();
95
+ await handleDeleteSheet(clientManager, opts.account, opts.id, parseInt(opts.sheetId));
96
+ });
97
+ sheets
98
+ .command("rename-sheet")
99
+ .description("Rename a sheet/tab in a spreadsheet")
100
+ .requiredOption("--id <id>", "Spreadsheet ID")
101
+ .requiredOption("--sheet-id <sheetId>", "Sheet ID (numeric)")
102
+ .requiredOption("--title <title>", "New sheet title")
103
+ .option("--account <name>", "Account name", "default")
104
+ .action(async (opts) => {
105
+ const { clientManager } = resolve();
106
+ await handleRenameSheet(clientManager, opts.account, opts.id, parseInt(opts.sheetId), opts.title);
107
+ });
108
+ // Cell/range-level commands
109
+ sheets
110
+ .command("read")
111
+ .description("Read cell values from a range")
112
+ .requiredOption("--id <id>", "Spreadsheet ID")
113
+ .requiredOption("--range <range>", "Cell range (e.g. Sheet1!A1:D10)")
114
+ .option("--account <name>", "Account name", "default")
115
+ .action(async (opts) => {
116
+ const { clientManager } = resolve();
117
+ await handleRead(clientManager, opts.account, opts.id, opts.range);
118
+ });
119
+ sheets
120
+ .command("write")
121
+ .description("Write values to a range")
122
+ .requiredOption("--id <id>", "Spreadsheet ID")
123
+ .requiredOption("--range <range>", "Cell range (e.g. Sheet1!A1:D10)")
124
+ .requiredOption("--values <json>", "JSON array of arrays (e.g. '[[\"a\",\"b\"],[\"c\",\"d\"]]')")
125
+ .option("--account <name>", "Account name", "default")
126
+ .action(async (opts) => {
127
+ const { clientManager } = resolve();
128
+ const values = JSON.parse(opts.values);
129
+ await handleWrite(clientManager, opts.account, opts.id, opts.range, values);
130
+ });
131
+ sheets
132
+ .command("append")
133
+ .description("Append rows after existing data")
134
+ .requiredOption("--id <id>", "Spreadsheet ID")
135
+ .requiredOption("--range <range>", "Cell range to append after")
136
+ .requiredOption("--values <json>", "JSON array of arrays")
137
+ .option("--account <name>", "Account name", "default")
138
+ .action(async (opts) => {
139
+ const { clientManager } = resolve();
140
+ const values = JSON.parse(opts.values);
141
+ await handleAppend(clientManager, opts.account, opts.id, opts.range, values);
142
+ });
143
+ sheets
144
+ .command("clear")
145
+ .description("Clear values in a range")
146
+ .requiredOption("--id <id>", "Spreadsheet ID")
147
+ .requiredOption("--range <range>", "Cell range to clear")
148
+ .option("--account <name>", "Account name", "default")
149
+ .action(async (opts) => {
150
+ const { clientManager } = resolve();
151
+ await handleClear(clientManager, opts.account, opts.id, opts.range);
152
+ });
153
+ // Formatting
154
+ sheets
155
+ .command("format")
156
+ .description("Apply formatting to a range")
157
+ .requiredOption("--id <id>", "Spreadsheet ID")
158
+ .requiredOption("--range <range>", "Cell range (e.g. A1:D10)")
159
+ .option("--bold", "Apply bold formatting")
160
+ .option("--bg-color <hex>", "Background color (hex, e.g. #ff0000)")
161
+ .option("--text-color <hex>", "Text color (hex, e.g. #ffffff)")
162
+ .option("--sheet-id <sheetId>", "Sheet ID (numeric, defaults to 0)")
163
+ .option("--account <name>", "Account name", "default")
164
+ .action(async (opts) => {
165
+ const { clientManager } = resolve();
166
+ await handleFormat(clientManager, opts.account, opts.id, opts.range, {
167
+ bold: opts.bold,
168
+ bgColor: opts.bgColor,
169
+ textColor: opts.textColor,
170
+ sheetId: opts.sheetId ? parseInt(opts.sheetId) : undefined,
171
+ });
172
+ });
173
+ }
174
+ //# sourceMappingURL=sheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../src/commands/sheets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentStore } from "@digitalpresence/cliclaw-auth";
2
+ export declare function startDaemon(store: AgentStore): Promise<void>;
3
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cron/daemon.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,+BAA+B,CAAC;AAe/E,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HlE"}
@@ -0,0 +1,127 @@
1
+ import cron from "node-cron";
2
+ import { existsSync, writeFileSync, readFileSync, unlinkSync } from "fs";
3
+ import { join } from "path";
4
+ import { getAgentsDir } from "@digitalpresence/cliclaw-auth";
5
+ import { executeRalphWiggumLoop } from "./ralph-wiggum.js";
6
+ import { writeRunLog } from "./progress.js";
7
+ import { cronLog } from "./logger.js";
8
+ const PID_FILE = join(getAgentsDir(), "..", "cron.pid");
9
+ const SYNC_INTERVAL_MS = 30_000;
10
+ function scheduleKey(agent, jobId) {
11
+ return `${agent}:${jobId}`;
12
+ }
13
+ export async function startDaemon(store) {
14
+ // Prevent duplicate daemons
15
+ if (existsSync(PID_FILE)) {
16
+ const existingPid = readFileSync(PID_FILE, "utf-8").trim();
17
+ try {
18
+ process.kill(parseInt(existingPid, 10), 0);
19
+ cronLog("error", `Daemon already running (PID ${existingPid})`);
20
+ process.exit(1);
21
+ }
22
+ catch {
23
+ // PID file stale, continue
24
+ }
25
+ }
26
+ writeFileSync(PID_FILE, String(process.pid), "utf-8");
27
+ cronLog("info", `Cron daemon started (PID ${process.pid})`);
28
+ const schedules = new Map();
29
+ const running = new Set();
30
+ function scheduleJob(agentName, job) {
31
+ const key = scheduleKey(agentName, job.id);
32
+ if (schedules.has(key))
33
+ return;
34
+ if (!cron.validate(job.schedule)) {
35
+ cronLog("error", `Invalid cron expression: ${job.schedule}`, agentName, job.id);
36
+ return;
37
+ }
38
+ const task = cron.schedule(job.schedule, async () => {
39
+ if (running.has(key)) {
40
+ cronLog("warn", "Skipping: previous run still active", agentName, job.id);
41
+ return;
42
+ }
43
+ running.add(key);
44
+ cronLog("info", `Executing: ${job.task}`, agentName, job.id);
45
+ const startedAt = new Date().toISOString();
46
+ try {
47
+ const result = await executeRalphWiggumLoop(store, agentName, job, startedAt);
48
+ const log = {
49
+ jobId: job.id,
50
+ agentName,
51
+ startedAt,
52
+ finishedAt: new Date().toISOString(),
53
+ iterations: result.iterations,
54
+ completed: result.completed,
55
+ totalCostUsd: result.totalCostUsd,
56
+ transcript: result.transcript,
57
+ };
58
+ writeRunLog(agentName, job.id, log);
59
+ cronLog("info", `Finished: ${result.completed ? "completed" : "incomplete"} in ${result.iterations} iterations`, agentName, job.id);
60
+ }
61
+ catch (err) {
62
+ const log = {
63
+ jobId: job.id,
64
+ agentName,
65
+ startedAt,
66
+ finishedAt: new Date().toISOString(),
67
+ iterations: 0,
68
+ completed: false,
69
+ totalCostUsd: 0,
70
+ error: err instanceof Error ? err.message : String(err),
71
+ };
72
+ writeRunLog(agentName, job.id, log);
73
+ cronLog("error", `Failed: ${log.error}`, agentName, job.id);
74
+ }
75
+ finally {
76
+ running.delete(key);
77
+ }
78
+ });
79
+ schedules.set(key, task);
80
+ cronLog("info", `Scheduled: "${job.task}" at ${job.schedule}`, agentName, job.id);
81
+ }
82
+ function syncSchedules() {
83
+ const agents = store.list();
84
+ const activeKeys = new Set();
85
+ for (const agent of agents) {
86
+ for (const job of agent.cronJobs) {
87
+ const key = scheduleKey(agent.name, job.id);
88
+ if (job.enabled) {
89
+ activeKeys.add(key);
90
+ scheduleJob(agent.name, job);
91
+ }
92
+ }
93
+ }
94
+ // Remove schedules for deleted/disabled jobs
95
+ for (const [key, task] of schedules) {
96
+ if (!activeKeys.has(key)) {
97
+ task.stop();
98
+ schedules.delete(key);
99
+ cronLog("info", `Unscheduled: ${key}`);
100
+ }
101
+ }
102
+ }
103
+ // Initial sync
104
+ syncSchedules();
105
+ // Periodic sync
106
+ const syncTimer = setInterval(syncSchedules, SYNC_INTERVAL_MS);
107
+ // Graceful shutdown
108
+ function cleanup() {
109
+ cronLog("info", "Shutting down cron daemon");
110
+ clearInterval(syncTimer);
111
+ for (const [, task] of schedules) {
112
+ task.stop();
113
+ }
114
+ schedules.clear();
115
+ try {
116
+ unlinkSync(PID_FILE);
117
+ }
118
+ catch {
119
+ // ignore
120
+ }
121
+ process.exit(0);
122
+ }
123
+ process.on("SIGTERM", cleanup);
124
+ process.on("SIGINT", cleanup);
125
+ cronLog("info", `Daemon running. ${schedules.size} job(s) scheduled. Syncing every ${SYNC_INTERVAL_MS / 1000}s.`);
126
+ }
127
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cron/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AgentStore } from "@digitalpresence/cliclaw-auth";
2
+ export declare function handleCronAdd(store: AgentStore, agentName: string, schedule: string, task: string, maxIterations: number, completionPromise: string): Promise<void>;
3
+ export declare function handleCronRemove(store: AgentStore, agentName: string, jobId: string): Promise<void>;
4
+ export declare function handleCronList(store: AgentStore, agentName?: string): Promise<void>;
5
+ export declare function handleCronToggle(store: AgentStore, agentName: string, jobId: string, enabled: boolean): Promise<void>;
6
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/cron/handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,+BAA+B,CAAC;AAG/E,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,58 @@
1
+ import { randomBytes } from "crypto";
2
+ import { outputJson, outputError } from "../lib/output.js";
3
+ export async function handleCronAdd(store, agentName, schedule, task, maxIterations, completionPromise) {
4
+ const agent = store.get(agentName);
5
+ if (!agent)
6
+ outputError("agent_not_found", `Agent "${agentName}" not found`);
7
+ const job = {
8
+ id: randomBytes(6).toString("hex"),
9
+ schedule,
10
+ task,
11
+ maxIterations,
12
+ completionPromise,
13
+ enabled: true,
14
+ createdAt: new Date().toISOString(),
15
+ };
16
+ store.addCronJob(agentName, job);
17
+ outputJson({ status: "added", jobId: job.id, schedule, task });
18
+ }
19
+ export async function handleCronRemove(store, agentName, jobId) {
20
+ try {
21
+ store.removeCronJob(agentName, jobId);
22
+ outputJson({ status: "removed", jobId });
23
+ }
24
+ catch (err) {
25
+ outputError("cron_error", err instanceof Error ? err.message : String(err));
26
+ }
27
+ }
28
+ export async function handleCronList(store, agentName) {
29
+ if (agentName) {
30
+ try {
31
+ const jobs = store.listCronJobs(agentName);
32
+ outputJson(jobs);
33
+ }
34
+ catch (err) {
35
+ outputError("cron_error", err instanceof Error ? err.message : String(err));
36
+ }
37
+ }
38
+ else {
39
+ const agents = store.list();
40
+ const result = agents
41
+ .filter((a) => a.cronJobs.length > 0)
42
+ .map((a) => ({
43
+ agent: a.name,
44
+ jobs: a.cronJobs,
45
+ }));
46
+ outputJson(result);
47
+ }
48
+ }
49
+ export async function handleCronToggle(store, agentName, jobId, enabled) {
50
+ try {
51
+ store.toggleCronJob(agentName, jobId, enabled);
52
+ outputJson({ status: enabled ? "enabled" : "disabled", jobId });
53
+ }
54
+ catch (err) {
55
+ outputError("cron_error", err instanceof Error ? err.message : String(err));
56
+ }
57
+ }
58
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/cron/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ type LogLevel = "info" | "warn" | "error" | "debug";
2
+ export declare function cronLog(level: LogLevel, message: string, agent?: string, job?: string): void;
3
+ export {};
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/cron/logger.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAUpD,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAS5F"}
@@ -0,0 +1,11 @@
1
+ export function cronLog(level, message, agent, job) {
2
+ const entry = {
3
+ timestamp: new Date().toISOString(),
4
+ level,
5
+ ...(agent ? { agent } : {}),
6
+ ...(job ? { job } : {}),
7
+ message,
8
+ };
9
+ process.stderr.write(JSON.stringify(entry) + "\n");
10
+ }
11
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/cron/logger.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,OAAe,EAAE,KAAc,EAAE,GAAY;IACpF,MAAM,KAAK,GAAa;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO;KACR,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC"}