@poping/yome 0.0.3 → 0.0.5

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 (168) hide show
  1. package/README.md +5 -7
  2. package/README.zh-CN.md +5 -7
  3. package/bin/yome-calwatch +0 -0
  4. package/dist/commands/mesh.d.ts +15 -0
  5. package/dist/commands/mesh.js +282 -0
  6. package/dist/commands/mesh.js.map +1 -0
  7. package/dist/context.js +6 -3
  8. package/dist/context.js.map +1 -1
  9. package/dist/daemon/calendarPermission.d.ts +10 -0
  10. package/dist/daemon/calendarPermission.js +68 -0
  11. package/dist/daemon/calendarPermission.js.map +1 -0
  12. package/dist/daemon/cronCli.d.ts +19 -0
  13. package/dist/daemon/cronCli.js +403 -0
  14. package/dist/daemon/cronCli.js.map +1 -0
  15. package/dist/daemon/envHint.d.ts +5 -0
  16. package/dist/daemon/envHint.js +139 -0
  17. package/dist/daemon/envHint.js.map +1 -0
  18. package/dist/daemon/humanCron.d.ts +1 -0
  19. package/dist/daemon/humanCron.js +72 -0
  20. package/dist/daemon/humanCron.js.map +1 -0
  21. package/dist/daemon/humanOnce.d.ts +1 -0
  22. package/dist/daemon/humanOnce.js +54 -0
  23. package/dist/daemon/humanOnce.js.map +1 -0
  24. package/dist/daemon/index.d.ts +5 -0
  25. package/dist/daemon/index.js +173 -0
  26. package/dist/daemon/index.js.map +1 -0
  27. package/dist/daemon/launchd.d.ts +7 -0
  28. package/dist/daemon/launchd.js +93 -0
  29. package/dist/daemon/launchd.js.map +1 -0
  30. package/dist/daemon/log.d.ts +17 -0
  31. package/dist/daemon/log.js +57 -0
  32. package/dist/daemon/log.js.map +1 -0
  33. package/dist/daemon/paths.d.ts +11 -0
  34. package/dist/daemon/paths.js +27 -0
  35. package/dist/daemon/paths.js.map +1 -0
  36. package/dist/daemon/runTaskEntry.d.ts +1 -0
  37. package/dist/daemon/runTaskEntry.js +67 -0
  38. package/dist/daemon/runTaskEntry.js.map +1 -0
  39. package/dist/daemon/runner.d.ts +21 -0
  40. package/dist/daemon/runner.js +175 -0
  41. package/dist/daemon/runner.js.map +1 -0
  42. package/dist/daemon/scheduler.d.ts +5 -0
  43. package/dist/daemon/scheduler.js +162 -0
  44. package/dist/daemon/scheduler.js.map +1 -0
  45. package/dist/daemon/systemd.d.ts +7 -0
  46. package/dist/daemon/systemd.js +87 -0
  47. package/dist/daemon/systemd.js.map +1 -0
  48. package/dist/daemon/taskStore.d.ts +62 -0
  49. package/dist/daemon/taskStore.js +88 -0
  50. package/dist/daemon/taskStore.js.map +1 -0
  51. package/dist/daemon/triggers/calendar.d.ts +8 -0
  52. package/dist/daemon/triggers/calendar.js +248 -0
  53. package/dist/daemon/triggers/calendar.js.map +1 -0
  54. package/dist/daemon/triggers/childRunner.d.ts +14 -0
  55. package/dist/daemon/triggers/childRunner.js +111 -0
  56. package/dist/daemon/triggers/childRunner.js.map +1 -0
  57. package/dist/daemon/triggers/cron.d.ts +14 -0
  58. package/dist/daemon/triggers/cron.js +91 -0
  59. package/dist/daemon/triggers/cron.js.map +1 -0
  60. package/dist/daemon/triggers/file.d.ts +7 -0
  61. package/dist/daemon/triggers/file.js +123 -0
  62. package/dist/daemon/triggers/file.js.map +1 -0
  63. package/dist/daemon/triggers/once.d.ts +10 -0
  64. package/dist/daemon/triggers/once.js +80 -0
  65. package/dist/daemon/triggers/once.js.map +1 -0
  66. package/dist/index.js +120 -9
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm.d.ts +14 -2
  69. package/dist/llm.js +266 -201
  70. package/dist/llm.js.map +1 -1
  71. package/dist/mesh/capabilities.d.ts +6 -0
  72. package/dist/mesh/capabilities.js +66 -0
  73. package/dist/mesh/capabilities.js.map +1 -0
  74. package/dist/mesh/device-id.d.ts +28 -0
  75. package/dist/mesh/device-id.js +105 -0
  76. package/dist/mesh/device-id.js.map +1 -0
  77. package/dist/mesh/device-registrar.d.ts +33 -0
  78. package/dist/mesh/device-registrar.js +131 -0
  79. package/dist/mesh/device-registrar.js.map +1 -0
  80. package/dist/mesh/index.d.ts +28 -0
  81. package/dist/mesh/index.js +71 -0
  82. package/dist/mesh/index.js.map +1 -0
  83. package/dist/mesh/partykit-client.d.ts +43 -0
  84. package/dist/mesh/partykit-client.js +195 -0
  85. package/dist/mesh/partykit-client.js.map +1 -0
  86. package/dist/mesh/rpc-handler.d.ts +28 -0
  87. package/dist/mesh/rpc-handler.js +201 -0
  88. package/dist/mesh/rpc-handler.js.map +1 -0
  89. package/dist/mesh/thread-stream.d.ts +109 -0
  90. package/dist/mesh/thread-stream.js +110 -0
  91. package/dist/mesh/thread-stream.js.map +1 -0
  92. package/dist/mesh/ticket.d.ts +33 -0
  93. package/dist/mesh/ticket.js +127 -0
  94. package/dist/mesh/ticket.js.map +1 -0
  95. package/dist/mesh/types.d.ts +83 -0
  96. package/dist/mesh/types.js +9 -0
  97. package/dist/mesh/types.js.map +1 -0
  98. package/dist/skills/runner/dispatcher.d.ts +74 -3
  99. package/dist/skills/runner/dispatcher.js +258 -48
  100. package/dist/skills/runner/dispatcher.js.map +1 -1
  101. package/dist/skills/runner/dispatcher.test.d.ts +1 -0
  102. package/dist/skills/runner/dispatcher.test.js +141 -0
  103. package/dist/skills/runner/dispatcher.test.js.map +1 -0
  104. package/dist/skills/runner/kernel.js +0 -1
  105. package/dist/skills/runner/kernel.js.map +1 -1
  106. package/dist/skills/runner/nodeBackend.d.ts +32 -0
  107. package/dist/skills/runner/nodeBackend.js +147 -0
  108. package/dist/skills/runner/nodeBackend.js.map +1 -0
  109. package/dist/state/todos.d.ts +12 -0
  110. package/dist/state/todos.js +32 -0
  111. package/dist/state/todos.js.map +1 -0
  112. package/dist/tools/askUser.d.ts +20 -0
  113. package/dist/tools/askUser.js +126 -0
  114. package/dist/tools/askUser.js.map +1 -0
  115. package/dist/tools/bash.js +13 -19
  116. package/dist/tools/bash.js.map +1 -1
  117. package/dist/tools/index.d.ts +2 -0
  118. package/dist/tools/index.js +18 -5
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tools/todoWrite.d.ts +2 -0
  121. package/dist/tools/todoWrite.js +141 -0
  122. package/dist/tools/todoWrite.js.map +1 -0
  123. package/dist/tools/yome.d.ts +2 -0
  124. package/dist/tools/yome.js +87 -0
  125. package/dist/tools/yome.js.map +1 -0
  126. package/dist/ui/App.js +52 -3
  127. package/dist/ui/App.js.map +1 -1
  128. package/dist/ui/AskUserPrompt.d.ts +7 -0
  129. package/dist/ui/AskUserPrompt.js +78 -0
  130. package/dist/ui/AskUserPrompt.js.map +1 -0
  131. package/dist/ui/InputBar.js +20 -34
  132. package/dist/ui/InputBar.js.map +1 -1
  133. package/dist/ui/MeshApp.d.ts +9 -0
  134. package/dist/ui/MeshApp.js +226 -0
  135. package/dist/ui/MeshApp.js.map +1 -0
  136. package/dist/ui/MessageList.d.ts +8 -0
  137. package/dist/ui/MessageList.js +2 -2
  138. package/dist/ui/MessageList.js.map +1 -1
  139. package/dist/ui/MultilineTextInput.d.ts +31 -0
  140. package/dist/ui/MultilineTextInput.js +393 -0
  141. package/dist/ui/MultilineTextInput.js.map +1 -0
  142. package/dist/ui/MultilineTextInput.test.d.ts +1 -0
  143. package/dist/ui/MultilineTextInput.test.js +30 -0
  144. package/dist/ui/MultilineTextInput.test.js.map +1 -0
  145. package/dist/ui/TodoPanel.d.ts +7 -0
  146. package/dist/ui/TodoPanel.js +36 -0
  147. package/dist/ui/TodoPanel.js.map +1 -0
  148. package/dist/withRetry.d.ts +14 -0
  149. package/dist/withRetry.js +106 -0
  150. package/dist/withRetry.js.map +1 -0
  151. package/dist/yomeSkills/cli.d.ts +8 -0
  152. package/dist/yomeSkills/cli.js +155 -8
  153. package/dist/yomeSkills/cli.js.map +1 -1
  154. package/dist/yomeSkills/deprecate.d.ts +29 -0
  155. package/dist/yomeSkills/deprecate.js +99 -0
  156. package/dist/yomeSkills/deprecate.js.map +1 -0
  157. package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
  158. package/dist/yomeSkills/installFromHubTarball.js +161 -0
  159. package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
  160. package/dist/yomeSkills/installGithub.d.ts +7 -0
  161. package/dist/yomeSkills/installGithub.js +42 -21
  162. package/dist/yomeSkills/installGithub.js.map +1 -1
  163. package/dist/yomeSkills/invoke.js +50 -18
  164. package/dist/yomeSkills/invoke.js.map +1 -1
  165. package/dist/yomeSkills/publish.d.ts +2 -0
  166. package/dist/yomeSkills/publish.js +6 -1
  167. package/dist/yomeSkills/publish.js.map +1 -1
  168. package/package.json +13 -3
@@ -0,0 +1,403 @@
1
+ // `yome cron <subcommand>` — task management UI on top of taskStore.
2
+ //
3
+ // add create a new task
4
+ // list list tasks
5
+ // rm delete a task
6
+ // enable / disable
7
+ // run manually fire a task right now (out-of-process, like the scheduler does)
8
+ // logs show audit logs for a task
9
+ //
10
+ // All of these are pure CLI side-effects. The actual scheduling lives in
11
+ // the daemon process; tasks.json is the shared state and the daemon
12
+ // watches it for changes (see scheduler.ts).
13
+ import cron from 'node-cron';
14
+ import { addTask, listTasks, removeTask, getTask, setEnabled } from './taskStore.js';
15
+ import { humanToCron } from './humanCron.js';
16
+ import { humanToOnceMs } from './humanOnce.js';
17
+ import { fireTask, resolveYomeBinPath } from './triggers/cron.js';
18
+ import { listRunsForTask, readRunLog } from './log.js';
19
+ import { readPidIfRunning } from './scheduler.js';
20
+ import { execSync } from 'child_process';
21
+ import { checkCalendarAccess } from './calendarPermission.js';
22
+ export async function runCronSubcommand(args, flags) {
23
+ const sub = args[0];
24
+ switch (sub) {
25
+ case 'add': return doAdd(args.slice(1), flags);
26
+ case 'list':
27
+ case 'ls': return doList(flags);
28
+ case 'rm':
29
+ case 'remove': return doRm(args.slice(1));
30
+ case 'enable': return doToggle(args.slice(1), true);
31
+ case 'disable': return doToggle(args.slice(1), false);
32
+ case 'run': return doRun(args.slice(1));
33
+ case 'logs': return doLogs(args.slice(1), flags);
34
+ case undefined:
35
+ case 'help':
36
+ case '--help':
37
+ printHelp();
38
+ return 0;
39
+ default:
40
+ console.error(`Unknown subcommand: yome cron ${sub}`);
41
+ printHelp();
42
+ return 2;
43
+ }
44
+ }
45
+ function printHelp() {
46
+ console.log(`Usage: yome cron <subcommand>
47
+
48
+ add "<prompt>" Add a task. Pick exactly one trigger:
49
+ --at "<crontab>" cron schedule, e.g. "0 18 * * *"
50
+ --human "<phrase>" friendly: "9:00", "every 5 min", "mon 9:00"
51
+ --once "<time>" one-shot: "in 5 minutes",
52
+ "tomorrow 9:00", "2026-04-30 18:00", ISO 8601
53
+ --on file:<event> --path "<glob>"
54
+ fire on file events. <event> ∈
55
+ change (add+change, default),
56
+ any (add+change+unlink),
57
+ add, unlink
58
+ Glob: "~/Desktop/test/**/*.xlsx"
59
+ --on calendar:<event> fire on macOS Calendar events. <event> ∈
60
+ event-start (default), event-end, event-added
61
+ Filters (calendar only):
62
+ --within "10m" lead time before start
63
+ --title-regex "^Standup" case-insensitive title match
64
+ --calendar "Work" calendar display name (substring)
65
+ Optional:
66
+ --tz <iana> timezone (default: system local; cron only)
67
+ --cwd <dir> working dir for the task
68
+ --allow <rules> comma-separated allowlist, e.g. "Read,Write,Yome(@yome/fs:*)"
69
+ --deny <rules> comma-separated denylist
70
+ --max-ms <ms> wall-time cap (default 300000)
71
+ list / ls List tasks
72
+ rm <id> Remove a task
73
+ enable <id> Re-enable a paused task
74
+ disable <id> Pause a task without deleting it
75
+ run <id> Fire a task immediately (out-of-process)
76
+ logs <id> [-f] Show audit logs for a task
77
+ -f / --follow follow the latest run
78
+
79
+ Tip: edits to tasks.json take effect immediately — the daemon watches
80
+ the file. You don't need to restart the daemon after add/rm/enable.`);
81
+ }
82
+ function doAdd(args, flags) {
83
+ const prompt = args[0];
84
+ if (!prompt) {
85
+ console.error('Usage: yome cron add "<prompt>" <--at|--human|--once|--on ...>');
86
+ return 2;
87
+ }
88
+ // Exactly one trigger type must be specified.
89
+ const triggerSpecified = [flags.at, flags.human, flags.once, flags.on].filter(Boolean).length;
90
+ if (triggerSpecified === 0) {
91
+ console.error('Must specify a trigger: --at, --human, --once, or --on');
92
+ return 2;
93
+ }
94
+ if (triggerSpecified > 1) {
95
+ console.error('Specify exactly ONE trigger (--at / --human / --once / --on)');
96
+ return 2;
97
+ }
98
+ let trigger;
99
+ let summary;
100
+ try {
101
+ if (flags.at || flags.human) {
102
+ let schedule;
103
+ if (flags.at) {
104
+ if (!cron.validate(flags.at))
105
+ throw new Error(`Invalid crontab: '${flags.at}'`);
106
+ schedule = flags.at;
107
+ }
108
+ else {
109
+ schedule = humanToCron(flags.human);
110
+ }
111
+ trigger = { kind: 'cron', schedule, ...(flags.tz ? { tz: flags.tz } : {}) };
112
+ summary = `cron "${schedule}"${flags.tz ? ` tz=${flags.tz}` : ''}`;
113
+ }
114
+ else if (flags.once) {
115
+ const atMs = humanToOnceMs(flags.once);
116
+ trigger = { kind: 'once', atMs };
117
+ summary = `once @ ${new Date(atMs).toISOString()}`;
118
+ }
119
+ else if (flags.on) {
120
+ // file:change → add+change (any mutation that creates/updates content)
121
+ // file:any → add+change+unlink
122
+ // file:add → just creates
123
+ // file:unlink → just deletions
124
+ // calendar:event-start | event-end | event-added (each via Swift helper)
125
+ const [domain, event] = flags.on.split(':');
126
+ if (domain === 'file') {
127
+ if (!flags.path)
128
+ throw new Error('--on file:* requires --path "<glob>"');
129
+ const events = mapFileEvent(event ?? 'change');
130
+ trigger = { kind: 'file', path: flags.path, events };
131
+ summary = `file ${event ?? 'change'} on ${flags.path}`;
132
+ }
133
+ else if (domain === 'calendar') {
134
+ const ev = (event ?? 'event-start');
135
+ if (ev !== 'event-start' && ev !== 'event-end' && ev !== 'event-added') {
136
+ throw new Error(`unknown calendar event: ${ev} (use event-start | event-end | event-added)`);
137
+ }
138
+ // Pre-flight permission probe so the user gets immediate feedback
139
+ // instead of "task added but never fires". Mirrors option C in the
140
+ // PR4 plan (helper also re-checks at watcher startup).
141
+ const access = checkCalendarAccess();
142
+ if (!access.ok) {
143
+ let msg = `cannot add calendar trigger: ${access.message}`;
144
+ if (access.fix)
145
+ msg += `\n → ${access.fix}`;
146
+ throw new Error(msg);
147
+ }
148
+ const leadMs = flags.within ? parseDurationMs(flags.within) : 0;
149
+ trigger = {
150
+ kind: 'calendar',
151
+ events: [ev],
152
+ ...(leadMs ? { leadMs } : {}),
153
+ ...(flags.titleRegex ? { titleRegex: flags.titleRegex } : {}),
154
+ ...(flags.calendar ? { calendar: flags.calendar } : {}),
155
+ };
156
+ const filterDesc = [
157
+ flags.titleRegex ? `title=/${flags.titleRegex}/i` : '',
158
+ flags.calendar ? `cal="${flags.calendar}"` : '',
159
+ leadMs ? `lead=${flags.within}` : '',
160
+ ].filter(Boolean).join(' ');
161
+ summary = `calendar ${ev}${filterDesc ? ` ${filterDesc}` : ''}`;
162
+ }
163
+ else {
164
+ throw new Error(`unknown --on event: ${flags.on}`);
165
+ }
166
+ }
167
+ else {
168
+ throw new Error('unreachable');
169
+ }
170
+ }
171
+ catch (e) {
172
+ console.error(`✗ ${e?.message ?? e}`);
173
+ return 2;
174
+ }
175
+ const t = addTask({
176
+ trigger,
177
+ prompt,
178
+ cwd: flags.cwd,
179
+ autoAllow: parseRuleList(flags.allow),
180
+ autoDeny: parseRuleList(flags.deny),
181
+ maxDurationMs: flags.maxMs ? Number.parseInt(flags.maxMs, 10) : undefined,
182
+ env: parseEnvList(flags.env),
183
+ });
184
+ console.log(`✓ added ${t.id}`);
185
+ console.log(` trigger: ${summary}`);
186
+ console.log(` prompt: ${prompt.length > 80 ? prompt.slice(0, 80) + '…' : prompt}`);
187
+ if (t.autoAllow?.length)
188
+ console.log(` autoAllow: ${t.autoAllow.join(', ')}`);
189
+ if (t.autoDeny?.length)
190
+ console.log(` autoDeny: ${t.autoDeny.join(', ')}`);
191
+ if (!readPidIfRunning()) {
192
+ console.log('');
193
+ console.log('⚠️ Daemon is not running. Start it with: yome daemon start');
194
+ }
195
+ return 0;
196
+ }
197
+ function parseRuleList(s) {
198
+ if (!s)
199
+ return undefined;
200
+ // meow with isMultiple gives us an array; the manual case (single
201
+ // --allow "a,b,c") gives us a string. Normalise both into a flat
202
+ // array of comma-trimmed rule names.
203
+ const parts = Array.isArray(s) ? s : [s];
204
+ const out = parts.flatMap((p) => p.split(',').map((x) => x.trim()).filter(Boolean));
205
+ return out.length === 0 ? undefined : out;
206
+ }
207
+ /**
208
+ * Parse repeated --env KEY=VAL flags (or a single comma-separated string)
209
+ * into a flat { KEY: VAL } record. Quoted values aren't unescaped — pass
210
+ * them via shell quoting at the call site.
211
+ */
212
+ function parseEnvList(s) {
213
+ if (!s)
214
+ return undefined;
215
+ const parts = Array.isArray(s) ? s : [s];
216
+ const out = {};
217
+ for (const p of parts) {
218
+ for (const kv of p.split(',')) {
219
+ const eq = kv.indexOf('=');
220
+ if (eq <= 0)
221
+ continue;
222
+ const k = kv.slice(0, eq).trim();
223
+ const v = kv.slice(eq + 1).trim();
224
+ if (k)
225
+ out[k] = v;
226
+ }
227
+ }
228
+ return Object.keys(out).length === 0 ? undefined : out;
229
+ }
230
+ /**
231
+ * Parse a friendly duration string into milliseconds.
232
+ * "30s" → 30000 "10m" → 600000 "2h" → 7200000 "500ms" → 500
233
+ * bare number → milliseconds.
234
+ */
235
+ function parseDurationMs(s) {
236
+ const m = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/i.exec(s.trim());
237
+ if (!m)
238
+ throw new Error(`invalid duration: ${JSON.stringify(s)} (use e.g. "30s", "10m", "2h")`);
239
+ const n = Number(m[1]);
240
+ const unit = (m[2] ?? 'ms').toLowerCase();
241
+ switch (unit) {
242
+ case 'ms': return Math.round(n);
243
+ case 's': return Math.round(n * 1000);
244
+ case 'm': return Math.round(n * 60_000);
245
+ case 'h': return Math.round(n * 3_600_000);
246
+ default: return Math.round(n);
247
+ }
248
+ }
249
+ /**
250
+ * Map a user-friendly file event token into chokidar event names.
251
+ *
252
+ * Most users typing `--on file:change` mean "any time these files are
253
+ * created, edited, or deleted" rather than chokidar's strict "change =
254
+ * existing file content modified, distinct from add/unlink". We pick a
255
+ * sensible default and let power users be explicit.
256
+ */
257
+ function mapFileEvent(token) {
258
+ switch (token.toLowerCase()) {
259
+ case 'change': return ['add', 'change'];
260
+ case 'any':
261
+ case '*': return ['add', 'change', 'unlink'];
262
+ case 'add': return ['add'];
263
+ case 'unlink':
264
+ case 'delete': return ['unlink'];
265
+ default:
266
+ throw new Error(`unknown file event: '${token}' (try change | add | unlink | any)`);
267
+ }
268
+ }
269
+ function doList(flags) {
270
+ const tasks = listTasks();
271
+ if (flags.json) {
272
+ process.stdout.write(JSON.stringify(tasks, null, 2) + '\n');
273
+ return 0;
274
+ }
275
+ if (tasks.length === 0) {
276
+ console.log('(no tasks defined — use `yome cron add ...`)');
277
+ return 0;
278
+ }
279
+ const idW = Math.max(2, ...tasks.map((t) => t.id.length));
280
+ const schedW = Math.max(8, ...tasks.map((t) => trigSummary(t.trigger).length));
281
+ const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
282
+ console.log(` ${pad('ID', idW)} ${pad('SCHEDULE', schedW)} STATE LAST-RUN PROMPT`);
283
+ for (const t of tasks) {
284
+ const state = t.enabled ? 'on ' : 'off';
285
+ const last = t.lastRun
286
+ ? new Date(t.lastRun.ts).toISOString().replace('T', ' ').slice(0, 19) + (t.lastRun.ok ? ' ok' : ' err')
287
+ : '—';
288
+ const prompt = t.prompt.length > 60 ? t.prompt.slice(0, 60) + '…' : t.prompt;
289
+ console.log(` ${pad(t.id, idW)} ${pad(trigSummary(t.trigger), schedW)} ${state} ${pad(last, 22)} ${prompt}`);
290
+ }
291
+ if (!readPidIfRunning() && tasks.some((t) => t.enabled)) {
292
+ console.log('');
293
+ console.log('⚠️ Daemon is not running — enabled tasks will not fire. Start with: yome daemon start');
294
+ }
295
+ return 0;
296
+ }
297
+ function trigSummary(trig) {
298
+ if (trig?.kind === 'cron')
299
+ return trig.schedule;
300
+ if (trig?.kind === 'once')
301
+ return `once @ ${new Date(trig.atMs).toISOString().slice(0, 16)}`;
302
+ if (trig?.kind === 'file')
303
+ return `file:${trig.path}`;
304
+ if (trig?.kind === 'calendar') {
305
+ const ev = (trig.events ?? ['event-start']).join(',');
306
+ const bits = [`cal:${ev}`];
307
+ if (trig.leadMs)
308
+ bits.push(`-${Math.round(trig.leadMs / 1000)}s`);
309
+ if (trig.titleRegex)
310
+ bits.push(`/${trig.titleRegex}/`);
311
+ if (trig.calendar)
312
+ bits.push(`@${trig.calendar}`);
313
+ return bits.join(' ');
314
+ }
315
+ return '?';
316
+ }
317
+ function doRm(args) {
318
+ const id = args[0];
319
+ if (!id) {
320
+ console.error('Usage: yome cron rm <id>');
321
+ return 2;
322
+ }
323
+ if (!removeTask(id)) {
324
+ console.error(`✗ no such task: ${id}`);
325
+ return 1;
326
+ }
327
+ console.log(`✓ removed ${id}`);
328
+ return 0;
329
+ }
330
+ function doToggle(args, enabled) {
331
+ const id = args[0];
332
+ if (!id) {
333
+ console.error(`Usage: yome cron ${enabled ? 'enable' : 'disable'} <id>`);
334
+ return 2;
335
+ }
336
+ if (!setEnabled(id, enabled)) {
337
+ console.error(`✗ no such task: ${id}`);
338
+ return 1;
339
+ }
340
+ console.log(`✓ ${enabled ? 'enabled' : 'disabled'} ${id}`);
341
+ return 0;
342
+ }
343
+ function doRun(args) {
344
+ const id = args[0];
345
+ if (!id) {
346
+ console.error('Usage: yome cron run <id>');
347
+ return 2;
348
+ }
349
+ const t = getTask(id);
350
+ if (!t) {
351
+ console.error(`✗ no such task: ${id}`);
352
+ return 1;
353
+ }
354
+ // Spawn out-of-process via the same path the scheduler uses, so behaviour
355
+ // (stdout capture, kill timer, jsonl logging) matches a scheduled fire.
356
+ console.log(`→ firing ${id} now (out-of-process)…`);
357
+ fireTask(id, resolveYomeBinPath(), t);
358
+ console.log(`✓ task spawned. Watch logs with: yome cron logs ${id} -f`);
359
+ return 0;
360
+ }
361
+ function doLogs(args, flags) {
362
+ const id = args[0];
363
+ if (!id) {
364
+ console.error('Usage: yome cron logs <id> [-f]');
365
+ return 2;
366
+ }
367
+ const runs = listRunsForTask(id);
368
+ if (runs.length === 0) {
369
+ console.log(`(no runs recorded for ${id} yet)`);
370
+ return 0;
371
+ }
372
+ const latest = runs[0];
373
+ if (flags.follow) {
374
+ try {
375
+ execSync(`tail -F "${latest.file}"`, { stdio: 'inherit' });
376
+ }
377
+ catch { /* user terminated tail */ }
378
+ return 0;
379
+ }
380
+ console.log(`── latest run: ${new Date(latest.runTs).toISOString()} (${latest.file}) ──`);
381
+ for (const e of readRunLog(latest.file)) {
382
+ const t = new Date(e.ts).toISOString().slice(11, 19);
383
+ if (e.type === 'tool_use') {
384
+ console.log(`[${t}] tool ${e.name} ${JSON.stringify(e.input).slice(0, 120)}`);
385
+ }
386
+ else if (e.type === 'tool_result') {
387
+ const r = String(e.result ?? '').replace(/\n/g, ' ').slice(0, 120);
388
+ console.log(`[${t}] └─ ${r}`);
389
+ }
390
+ else if (e.type === 'run_start' || e.type === 'run_end') {
391
+ console.log(`[${t}] ${e.type} ${JSON.stringify({ ok: e.ok, durationMs: e.durationMs, error: e.error }).slice(0, 200)}`);
392
+ }
393
+ else {
394
+ console.log(`[${t}] ${e.type} ${JSON.stringify(e).slice(0, 200)}`);
395
+ }
396
+ }
397
+ if (runs.length > 1) {
398
+ console.log('');
399
+ console.log(`(${runs.length - 1} earlier run(s) in ${latest.file.replace(/\/[^/]+$/, '')})`);
400
+ }
401
+ return 0;
402
+ }
403
+ //# sourceMappingURL=cronCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cronCli.js","sourceRoot":"","sources":["../../src/daemon/cronCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Build the env-hint string. Returns '' if no notable tools are
3
+ * detected so we don't waste tokens on a useless empty block.
4
+ */
5
+ export declare function buildEnvHint(): string;
@@ -0,0 +1,139 @@
1
+ // cli/src/daemon/envHint.ts
2
+ //
3
+ // Build a lightweight "environment hint" block that gets prepended to
4
+ // every daemon-task prompt. The goal is to compensate for two things
5
+ // the LLM cannot easily learn at runtime in an unattended session:
6
+ //
7
+ // 1. Which non-default tools are installed on THIS machine
8
+ // (lark-cli, gh, jq, osascript, ...). Without this hint the
9
+ // Agent often spends 30s of its budget exploring with `which`.
10
+ // 2. Per-tool gotchas that come up in real tasks (lark-cli's
11
+ // "+method" subcommand naming, macOS `date -v` vs GNU `date -d`,
12
+ // etc.). One sentence here saves several wasted tool calls later.
13
+ //
14
+ // We deliberately do NOT touch the Agent's system prompt: this hint is
15
+ // daemon-only. Interactive `yome` runs in front of a human who already
16
+ // knows their own machine.
17
+ //
18
+ // The hint is appended in user-prompt position (not system) so it shows
19
+ // up in audit logs (`run_start.prompt`) and is trivially debuggable.
20
+ import { spawnSync } from 'child_process';
21
+ /** Cheap PATH lookup: spawn `/usr/bin/which` and check exit code. */
22
+ function which(name) {
23
+ // We deliberately avoid `shell: true` here: name comes from a static
24
+ // constant table below but Node 22+ warns on shell:true regardless,
25
+ // and `which` (BSD + GNU) supports the same calling convention.
26
+ const r = spawnSync('/usr/bin/which', [name], { encoding: 'utf-8', timeout: 2_000 });
27
+ return r.status === 0 && (r.stdout ?? '').trim().length > 0;
28
+ }
29
+ const TOOLS = [
30
+ {
31
+ bin: 'lark-cli',
32
+ label: 'lark-cli (飞书 CLI)',
33
+ cheatsheet: [
34
+ '【lark-cli 速查】',
35
+ '- 子命令是连字符串带 +:lark-cli im +chat-messages-list',
36
+ ' 错误写法(会报 unknown command):lark-cli im chat-messages list',
37
+ '- 列群:lark-cli im chats list --params \'{"page_size":50}\' --page-all',
38
+ '- 拉某群最近消息:lark-cli im +chat-messages-list --chat-id <id> --page-size 20 --format json',
39
+ '- 自己的 open_id:lark-cli auth status | jq -r .openId (不是 .open_id)',
40
+ '',
41
+ '**重要:lark-cli JSON 顶层结构(两种 envelope,会混淆)**',
42
+ '- 直接子命令(im chats list, im chats get):{ code, data, msg } ← 飞书 API 原生',
43
+ '- 加号子命令(im +chat-messages-list 等):{ ok, identity, data } ← lark-cli envelope',
44
+ '- **不要**用 .ok 判断成功(直接子命令没这字段);用 .data 是否存在更鲁棒',
45
+ '- 各自的数据路径:',
46
+ ' .data.items[] → chats list 的群条目(含 chat_id, name)',
47
+ ' .data.messages[] → +chat-messages-list 的消息条目',
48
+ ' .data.items[] → +messages-search 的消息条目(也是 items)',
49
+ '- 计数: .data.items | length / .data.messages | length',
50
+ '',
51
+ '【lark-cli 输出陷阱】',
52
+ '- --page-all 在 **stderr** 输出 "[page N] fetching..." 进度行;用 2>/dev/null 抑制',
53
+ '- 不带 --page-all 输出纯 JSON 到 stdout,更安全',
54
+ '- jq 输出**多行 JSON 对象**会被 while-read 拆碎;用 jq -c (compact) 或 jq -r ... | @tsv',
55
+ '- 全部模块:im / calendar / sheets / base / drive / docs / mail / contact / vc / wiki / minutes / task',
56
+ '',
57
+ '**重要:messages-list 的字段格式(实测过)**',
58
+ '- create_time 是字符串 "YYYY-MM-DD HH:MM"(本地时区,不是 epoch)',
59
+ ' 时间过滤直接字符串比较即可:select(.create_time >= "2026-04-28 00:00")',
60
+ '- sender.id_type 决定 sender.id 的含义:',
61
+ ' "open_id" → 真人 (ou_xxx)',
62
+ ' "app_id" → 机器人 (cli_xxx)',
63
+ ' "user_id" → 企业 user_id (罕见)',
64
+ '- **content 字段在顶层 (.content),不是 .body.content**!',
65
+ ' msg_type=text → content 是纯文本字符串 "请问下..."(**不是** JSON)',
66
+ ' msg_type=interactive → content 是带 <card> XML 的字符串(直接展示即可)',
67
+ ' msg_type=post → content 是带 <p>/<a> 的字符串(直接展示即可)',
68
+ ' 千万别 .body.content 也别 (.content | fromjson);fromjson 用不上',
69
+ ].join('\n'),
70
+ },
71
+ {
72
+ bin: 'gh',
73
+ label: 'gh (GitHub CLI)',
74
+ cheatsheet: [
75
+ '【gh 速查】',
76
+ '- 当前用户:gh api user --jq .login',
77
+ '- 列 PR:gh pr list --state open --json number,title,author',
78
+ '- 触发 workflow:gh workflow run <file> -f key=val',
79
+ ].join('\n'),
80
+ },
81
+ {
82
+ bin: 'jq',
83
+ label: 'jq (JSON 处理)',
84
+ cheatsheet: '【jq】可用,不用退回 grep/awk 切 JSON。',
85
+ },
86
+ {
87
+ bin: 'osascript',
88
+ label: 'osascript (macOS 自动化)',
89
+ cheatsheet: [
90
+ '【osascript】可用。读日历、提醒、Notes、Music、Mail 等。',
91
+ '示例:osascript -e \'tell application "Calendar" to get name of calendars\'',
92
+ ].join('\n'),
93
+ },
94
+ ];
95
+ /**
96
+ * Build the env-hint string. Returns '' if no notable tools are
97
+ * detected so we don't waste tokens on a useless empty block.
98
+ */
99
+ export function buildEnvHint() {
100
+ const present = TOOLS.filter((t) => which(t.bin));
101
+ if (present.length === 0)
102
+ return '';
103
+ const platform = process.platform;
104
+ const lines = [];
105
+ lines.push('[环境提示] (daemon 任务自动注入)');
106
+ lines.push(`平台: ${platform === 'darwin' ? 'macOS' : platform}`);
107
+ lines.push(`已检测到的本地命令: ${present.map((t) => t.label).join(', ')}`);
108
+ lines.push('');
109
+ // Per-tool cheatsheets.
110
+ for (const t of present) {
111
+ lines.push(t.cheatsheet);
112
+ lines.push('');
113
+ }
114
+ // Platform-specific gotchas. Most agent failures we've seen are
115
+ // GNU-vs-BSD coreutils mismatches.
116
+ if (platform === 'darwin') {
117
+ lines.push('【macOS 注意】');
118
+ lines.push('- date 是 BSD 版:减时间用 -v,不用 -d。');
119
+ lines.push(' 减 3 小时: date -v-3H "+%Y-%m-%d %H:%M"');
120
+ lines.push(' 减 7 天: date -v-7d "+%Y-%m-%d"');
121
+ lines.push('- sed 也是 BSD 版:-i 后必须跟一个备份后缀(用 \'\' 表示无备份):sed -i \'\' \'s/a/b/\' file');
122
+ lines.push('');
123
+ lines.push('【shell 脚本陷阱(macOS)】');
124
+ lines.push('- shebang 优先 #!/bin/bash 而不是 #!/bin/sh —— /bin/sh 是 dash-ish,不支持 $\'\\t\' 之类 ANSI-C 转义');
125
+ lines.push('- 用制表符做 IFS 必须用 ANSI-C 引用:IFS=$\'\\t\'(bash),不要 IFS=\'\\t\'(那是字面 \\ + t 两个字符)');
126
+ lines.push(' POSIX-only 写法:IFS="$(printf \'\\t\')"');
127
+ lines.push('- jq 多字段输出优先 @tsv(自动转义):jq -r \'.[] | [.a, .b] | @tsv\',再 while IFS=$\'\\t\' read 拆');
128
+ lines.push('- 写脚本/MD 文件时不要带 BOM;echo/printf/cat <<EOF 都安全,避免编辑器自动加 BOM');
129
+ lines.push('- **管道 + while 是 subshell!**变量赋值传不回父 shell:');
130
+ lines.push(' WRONG: cmd | while read x; do BUF="$BUF$x"; done; echo "$BUF" # BUF 是空的');
131
+ lines.push(' FIX (1) 用临时文件累计: cmd | while read x; do echo "$x" >> $TMP; done');
132
+ lines.push(' FIX (2) 用 process substitution: while read x; do BUF="$BUF$x"; done < <(cmd)');
133
+ lines.push(' FIX (3) 直接 printf >> 文件 (推荐): cmd | while read x; do printf ... >> /tmp/out.md; done');
134
+ lines.push('- 类似坑:在 while loop 里改 HAS_MESSAGES=true,loop 退出后还是 false');
135
+ lines.push('');
136
+ }
137
+ return lines.join('\n').trimEnd();
138
+ }
139
+ //# sourceMappingURL=envHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envHint.js","sourceRoot":"","sources":["../../src/daemon/envHint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function humanToCron(input: string): string;