@poping/yome 0.0.3 → 0.0.4
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.
- package/README.md +5 -7
- package/README.zh-CN.md +5 -7
- package/bin/yome-calwatch +0 -0
- package/dist/context.js +6 -3
- package/dist/context.js.map +1 -1
- package/dist/daemon/calendarPermission.d.ts +10 -0
- package/dist/daemon/calendarPermission.js +68 -0
- package/dist/daemon/calendarPermission.js.map +1 -0
- package/dist/daemon/cronCli.d.ts +19 -0
- package/dist/daemon/cronCli.js +403 -0
- package/dist/daemon/cronCli.js.map +1 -0
- package/dist/daemon/envHint.d.ts +5 -0
- package/dist/daemon/envHint.js +139 -0
- package/dist/daemon/envHint.js.map +1 -0
- package/dist/daemon/humanCron.d.ts +1 -0
- package/dist/daemon/humanCron.js +72 -0
- package/dist/daemon/humanCron.js.map +1 -0
- package/dist/daemon/humanOnce.d.ts +1 -0
- package/dist/daemon/humanOnce.js +54 -0
- package/dist/daemon/humanOnce.js.map +1 -0
- package/dist/daemon/index.d.ts +5 -0
- package/dist/daemon/index.js +168 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/launchd.d.ts +7 -0
- package/dist/daemon/launchd.js +93 -0
- package/dist/daemon/launchd.js.map +1 -0
- package/dist/daemon/log.d.ts +17 -0
- package/dist/daemon/log.js +57 -0
- package/dist/daemon/log.js.map +1 -0
- package/dist/daemon/paths.d.ts +11 -0
- package/dist/daemon/paths.js +27 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/runTaskEntry.d.ts +1 -0
- package/dist/daemon/runTaskEntry.js +67 -0
- package/dist/daemon/runTaskEntry.js.map +1 -0
- package/dist/daemon/runner.d.ts +21 -0
- package/dist/daemon/runner.js +175 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +5 -0
- package/dist/daemon/scheduler.js +162 -0
- package/dist/daemon/scheduler.js.map +1 -0
- package/dist/daemon/taskStore.d.ts +62 -0
- package/dist/daemon/taskStore.js +88 -0
- package/dist/daemon/taskStore.js.map +1 -0
- package/dist/daemon/triggers/calendar.d.ts +8 -0
- package/dist/daemon/triggers/calendar.js +248 -0
- package/dist/daemon/triggers/calendar.js.map +1 -0
- package/dist/daemon/triggers/childRunner.d.ts +14 -0
- package/dist/daemon/triggers/childRunner.js +111 -0
- package/dist/daemon/triggers/childRunner.js.map +1 -0
- package/dist/daemon/triggers/cron.d.ts +14 -0
- package/dist/daemon/triggers/cron.js +91 -0
- package/dist/daemon/triggers/cron.js.map +1 -0
- package/dist/daemon/triggers/file.d.ts +7 -0
- package/dist/daemon/triggers/file.js +123 -0
- package/dist/daemon/triggers/file.js.map +1 -0
- package/dist/daemon/triggers/once.d.ts +10 -0
- package/dist/daemon/triggers/once.js +80 -0
- package/dist/daemon/triggers/once.js.map +1 -0
- package/dist/index.js +96 -9
- package/dist/index.js.map +1 -1
- package/dist/skills/runner/dispatcher.d.ts +74 -3
- package/dist/skills/runner/dispatcher.js +258 -48
- package/dist/skills/runner/dispatcher.js.map +1 -1
- package/dist/skills/runner/dispatcher.test.d.ts +1 -0
- package/dist/skills/runner/dispatcher.test.js +141 -0
- package/dist/skills/runner/dispatcher.test.js.map +1 -0
- package/dist/skills/runner/kernel.js +0 -1
- package/dist/skills/runner/kernel.js.map +1 -1
- package/dist/skills/runner/nodeBackend.d.ts +32 -0
- package/dist/skills/runner/nodeBackend.js +147 -0
- package/dist/skills/runner/nodeBackend.js.map +1 -0
- package/dist/state/todos.d.ts +12 -0
- package/dist/state/todos.js +32 -0
- package/dist/state/todos.js.map +1 -0
- package/dist/tools/askUser.d.ts +20 -0
- package/dist/tools/askUser.js +126 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/bash.js +13 -19
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +18 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/todoWrite.d.ts +2 -0
- package/dist/tools/todoWrite.js +141 -0
- package/dist/tools/todoWrite.js.map +1 -0
- package/dist/tools/yome.d.ts +2 -0
- package/dist/tools/yome.js +87 -0
- package/dist/tools/yome.js.map +1 -0
- package/dist/ui/App.js +52 -3
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/AskUserPrompt.d.ts +7 -0
- package/dist/ui/AskUserPrompt.js +78 -0
- package/dist/ui/AskUserPrompt.js.map +1 -0
- package/dist/ui/InputBar.js +20 -34
- package/dist/ui/InputBar.js.map +1 -1
- package/dist/ui/MessageList.d.ts +8 -0
- package/dist/ui/MessageList.js +2 -2
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/MultilineTextInput.d.ts +31 -0
- package/dist/ui/MultilineTextInput.js +393 -0
- package/dist/ui/MultilineTextInput.js.map +1 -0
- package/dist/ui/MultilineTextInput.test.d.ts +1 -0
- package/dist/ui/MultilineTextInput.test.js +30 -0
- package/dist/ui/MultilineTextInput.test.js.map +1 -0
- package/dist/ui/TodoPanel.d.ts +7 -0
- package/dist/ui/TodoPanel.js +36 -0
- package/dist/ui/TodoPanel.js.map +1 -0
- package/dist/yomeSkills/cli.d.ts +8 -0
- package/dist/yomeSkills/cli.js +155 -8
- package/dist/yomeSkills/cli.js.map +1 -1
- package/dist/yomeSkills/deprecate.d.ts +29 -0
- package/dist/yomeSkills/deprecate.js +99 -0
- package/dist/yomeSkills/deprecate.js.map +1 -0
- package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
- package/dist/yomeSkills/installFromHubTarball.js +161 -0
- package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
- package/dist/yomeSkills/installGithub.d.ts +7 -0
- package/dist/yomeSkills/installGithub.js +42 -21
- package/dist/yomeSkills/installGithub.js.map +1 -1
- package/dist/yomeSkills/invoke.js +50 -18
- package/dist/yomeSkills/invoke.js.map +1 -1
- package/dist/yomeSkills/publish.d.ts +2 -0
- package/dist/yomeSkills/publish.js +6 -1
- package/dist/yomeSkills/publish.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cronCli.js","sourceRoot":"","sources":["../../src/daemon/cronCli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Human-friendly cron parser.
|
|
2
|
+
//
|
|
3
|
+
// Accepts a small set of natural-ish phrases and converts them into a
|
|
4
|
+
// standard 5-field crontab string (compatible with node-cron):
|
|
5
|
+
//
|
|
6
|
+
// "9:00" → "0 9 * * *" (every day at 9am)
|
|
7
|
+
// "9:00 daily" → "0 9 * * *"
|
|
8
|
+
// "18:00" → "0 18 * * *"
|
|
9
|
+
// "every 5 minutes" → "* /5 * * * *" (note: 5-field cron — minute slot)
|
|
10
|
+
// "every minute" → "* * * * *"
|
|
11
|
+
// "every hour" → "0 * * * *"
|
|
12
|
+
// "hourly" → "0 * * * *"
|
|
13
|
+
// "daily 9:00" → "0 9 * * *"
|
|
14
|
+
// "weekly mon 9:00" → "0 9 * * 1"
|
|
15
|
+
//
|
|
16
|
+
// Anything we don't recognise → throws. The caller (cli.ts) catches and
|
|
17
|
+
// suggests the user pass a real crontab via --at instead.
|
|
18
|
+
const DAY_NAMES = {
|
|
19
|
+
sun: 0, sunday: 0,
|
|
20
|
+
mon: 1, monday: 1,
|
|
21
|
+
tue: 2, tuesday: 2,
|
|
22
|
+
wed: 3, wednesday: 3,
|
|
23
|
+
thu: 4, thursday: 4,
|
|
24
|
+
fri: 5, friday: 5,
|
|
25
|
+
sat: 6, saturday: 6,
|
|
26
|
+
};
|
|
27
|
+
export function humanToCron(input) {
|
|
28
|
+
const s = input.trim().toLowerCase();
|
|
29
|
+
if (!s)
|
|
30
|
+
throw new Error('empty schedule');
|
|
31
|
+
if (s === 'every minute' || s === 'minutely')
|
|
32
|
+
return '* * * * *';
|
|
33
|
+
if (s === 'every hour' || s === 'hourly')
|
|
34
|
+
return '0 * * * *';
|
|
35
|
+
if (s === 'daily' || s === 'every day')
|
|
36
|
+
return '0 9 * * *';
|
|
37
|
+
// every N minutes / hours
|
|
38
|
+
const everyN = s.match(/^every\s+(\d+)\s+(minute|minutes|min|hour|hours)$/);
|
|
39
|
+
if (everyN) {
|
|
40
|
+
const n = Number.parseInt(everyN[1], 10);
|
|
41
|
+
const unit = everyN[2];
|
|
42
|
+
if (n < 1 || n > 59)
|
|
43
|
+
throw new Error(`interval out of range: ${n}`);
|
|
44
|
+
if (unit.startsWith('hour'))
|
|
45
|
+
return `0 */${n} * * *`;
|
|
46
|
+
return `*/${n} * * * *`;
|
|
47
|
+
}
|
|
48
|
+
// HH:MM with optional 'daily' / weekday
|
|
49
|
+
// Examples: "9:00", "9:00 daily", "9:00 mon", "weekly mon 9:00"
|
|
50
|
+
const timeRe = /(\d{1,2}):(\d{2})/;
|
|
51
|
+
const time = s.match(timeRe);
|
|
52
|
+
if (time) {
|
|
53
|
+
const hour = Number.parseInt(time[1], 10);
|
|
54
|
+
const minute = Number.parseInt(time[2], 10);
|
|
55
|
+
if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
|
|
56
|
+
throw new Error(`invalid time: ${time[0]}`);
|
|
57
|
+
}
|
|
58
|
+
// Look for an explicit weekday token
|
|
59
|
+
const tokens = s.split(/\s+/).filter(Boolean);
|
|
60
|
+
let dow = '*';
|
|
61
|
+
for (const t of tokens) {
|
|
62
|
+
if (t in DAY_NAMES) {
|
|
63
|
+
dow = String(DAY_NAMES[t]);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return `${minute} ${hour} * * ${dow}`;
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`unrecognised schedule: '${input}'. ` +
|
|
70
|
+
`Try '9:00', 'every 5 minutes', 'every hour', 'mon 9:00', or pass a crontab via --at "0 9 * * *".`);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=humanCron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"humanCron.js","sourceRoot":"","sources":["../../src/daemon/humanCron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function humanToOnceMs(input: string, now?: () => number): number;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Parse a human-friendly one-shot time spec into a wall-clock epoch ms.
|
|
2
|
+
//
|
|
3
|
+
// Accepted shapes:
|
|
4
|
+
// "in 5 minutes" / "in 1 hour" / "in 30s"
|
|
5
|
+
// "tomorrow 9:00" / "tomorrow 09:00"
|
|
6
|
+
// "today 18:00"
|
|
7
|
+
// "2026-04-30 18:00"
|
|
8
|
+
// "2026-04-30T18:00:00+08:00"
|
|
9
|
+
// "1777340834798" (raw epoch ms)
|
|
10
|
+
//
|
|
11
|
+
// Anything else → throws. Returns ms since epoch (UTC).
|
|
12
|
+
export function humanToOnceMs(input, now = Date.now) {
|
|
13
|
+
const s = input.trim();
|
|
14
|
+
if (!s)
|
|
15
|
+
throw new Error('empty time spec');
|
|
16
|
+
// Raw epoch ms (>= 13 digits).
|
|
17
|
+
if (/^\d{13,}$/.test(s)) {
|
|
18
|
+
return Number.parseInt(s, 10);
|
|
19
|
+
}
|
|
20
|
+
// ISO 8601 / Date-parseable. Try this first for unambiguous inputs
|
|
21
|
+
// like "2026-04-30T18:00:00+08:00".
|
|
22
|
+
const isoTry = Date.parse(s);
|
|
23
|
+
if (!Number.isNaN(isoTry) && /\d{4}-\d{2}-\d{2}/.test(s)) {
|
|
24
|
+
return isoTry;
|
|
25
|
+
}
|
|
26
|
+
const lower = s.toLowerCase();
|
|
27
|
+
// "in N <unit>"
|
|
28
|
+
const inMatch = lower.match(/^in\s+(\d+)\s*(s|sec|secs|second|seconds|m|min|mins|minute|minutes|h|hr|hour|hours|d|day|days)$/);
|
|
29
|
+
if (inMatch) {
|
|
30
|
+
const n = Number.parseInt(inMatch[1], 10);
|
|
31
|
+
const unit = inMatch[2];
|
|
32
|
+
const mult = unit.startsWith('s') ? 1_000 :
|
|
33
|
+
unit.startsWith('m') ? 60_000 :
|
|
34
|
+
unit.startsWith('h') ? 3_600_000 :
|
|
35
|
+
86_400_000;
|
|
36
|
+
return now() + n * mult;
|
|
37
|
+
}
|
|
38
|
+
// "today HH:MM" / "tomorrow HH:MM"
|
|
39
|
+
const dayMatch = lower.match(/^(today|tomorrow)\s+(\d{1,2}):(\d{2})$/);
|
|
40
|
+
if (dayMatch) {
|
|
41
|
+
const offset = dayMatch[1] === 'tomorrow' ? 1 : 0;
|
|
42
|
+
const hour = Number.parseInt(dayMatch[2], 10);
|
|
43
|
+
const minute = Number.parseInt(dayMatch[3], 10);
|
|
44
|
+
if (hour > 23 || minute > 59)
|
|
45
|
+
throw new Error(`invalid time: ${dayMatch[2]}:${dayMatch[3]}`);
|
|
46
|
+
const d = new Date(now());
|
|
47
|
+
d.setDate(d.getDate() + offset);
|
|
48
|
+
d.setHours(hour, minute, 0, 0);
|
|
49
|
+
return d.getTime();
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`unrecognised once-time: '${input}'. ` +
|
|
52
|
+
`Try 'in 5 minutes', 'tomorrow 9:00', '2026-04-30 18:00', or an ISO 8601 string.`);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=humanOnce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"humanOnce.js","sourceRoot":"","sources":["../../src/daemon/humanOnce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// Top-level CLI entry for `yome daemon ...`.
|
|
2
|
+
//
|
|
3
|
+
// Subcommands:
|
|
4
|
+
// install write LaunchAgent plist + launchctl load
|
|
5
|
+
// uninstall launchctl unload + delete plist
|
|
6
|
+
// start run the scheduler in the foreground (--foreground) or
|
|
7
|
+
// background (& and detach)
|
|
8
|
+
// stop send SIGTERM to the running daemon
|
|
9
|
+
// status print pid + active task count
|
|
10
|
+
// logs [-f] tail the daemon's stdout/stderr log
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { readFileSync, existsSync, openSync } from 'fs';
|
|
13
|
+
import { spawn } from 'child_process';
|
|
14
|
+
import { startDaemon, readPidIfRunning } from './scheduler.js';
|
|
15
|
+
import { installLaunchAgent, uninstallLaunchAgent } from './launchd.js';
|
|
16
|
+
import { listTasks } from './taskStore.js';
|
|
17
|
+
import { resolveYomeBinPath } from './triggers/cron.js';
|
|
18
|
+
import { PID_FILE, STDOUT_LOG, STDERR_LOG, ensureDirs } from './paths.js';
|
|
19
|
+
export async function runDaemonSubcommand(args, flags) {
|
|
20
|
+
const sub = args[0];
|
|
21
|
+
switch (sub) {
|
|
22
|
+
case 'install': return doInstall();
|
|
23
|
+
case 'uninstall': return doUninstall();
|
|
24
|
+
case 'start': return doStart(flags);
|
|
25
|
+
case 'stop': return doStop();
|
|
26
|
+
case 'status': return doStatus();
|
|
27
|
+
case 'logs': return doLogs(flags);
|
|
28
|
+
case undefined:
|
|
29
|
+
case 'help':
|
|
30
|
+
case '--help':
|
|
31
|
+
printHelp();
|
|
32
|
+
return 0;
|
|
33
|
+
default:
|
|
34
|
+
console.error(`Unknown subcommand: yome daemon ${sub}`);
|
|
35
|
+
printHelp();
|
|
36
|
+
return 2;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function printHelp() {
|
|
40
|
+
console.log(`Usage: yome daemon <subcommand>
|
|
41
|
+
|
|
42
|
+
install Install the macOS LaunchAgent (auto-starts on login)
|
|
43
|
+
uninstall Remove the LaunchAgent
|
|
44
|
+
start Start the daemon in the foreground (use --foreground via launchd)
|
|
45
|
+
stop Stop the running daemon (SIGTERM)
|
|
46
|
+
status Show daemon pid + active task summary
|
|
47
|
+
logs [-f] Print daemon stdout/stderr (use -f / --follow to tail)
|
|
48
|
+
|
|
49
|
+
Daemon files:
|
|
50
|
+
~/.yome/daemon/daemon.pid pid of the running daemon
|
|
51
|
+
~/.yome/daemon/stdout.log scheduler stdout
|
|
52
|
+
~/.yome/daemon/stderr.log scheduler stderr
|
|
53
|
+
~/.yome/cron/tasks.json task definitions
|
|
54
|
+
~/.yome/cron/logs/<id>/... per-run audit logs (jsonl)
|
|
55
|
+
|
|
56
|
+
See also: yome cron --help`);
|
|
57
|
+
}
|
|
58
|
+
function doInstall() {
|
|
59
|
+
const r = installLaunchAgent(resolveYomeBinPath());
|
|
60
|
+
if (r.ok) {
|
|
61
|
+
console.log(`✓ ${r.message}`);
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
console.error(`✗ ${r.message}`);
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
function doUninstall() {
|
|
68
|
+
const r = uninstallLaunchAgent();
|
|
69
|
+
if (r.ok) {
|
|
70
|
+
console.log(`✓ ${r.message}`);
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
console.error(`✗ ${r.message}`);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
function doStart(flags) {
|
|
77
|
+
const existing = readPidIfRunning();
|
|
78
|
+
if (existing) {
|
|
79
|
+
console.error(`✗ daemon already running (pid=${existing})`);
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
ensureDirs();
|
|
83
|
+
if (flags.foreground) {
|
|
84
|
+
// Block here; this is the path launchd uses.
|
|
85
|
+
startDaemon();
|
|
86
|
+
// startDaemon installs signal handlers and the cron jobs keep the
|
|
87
|
+
// event loop alive — we just await forever.
|
|
88
|
+
return new Promise(() => { });
|
|
89
|
+
}
|
|
90
|
+
// Non-foreground: spawn ourselves as a detached background process so
|
|
91
|
+
// the user gets their shell back. Redirect stdio to the log files
|
|
92
|
+
// shown by `daemon status` and `daemon logs -f` so debug output (e.g.
|
|
93
|
+
// helper child stderr) is recoverable instead of being silently dropped.
|
|
94
|
+
ensureDirs();
|
|
95
|
+
const out = openSync(STDOUT_LOG, 'a');
|
|
96
|
+
const err = openSync(STDERR_LOG, 'a');
|
|
97
|
+
const child = spawn(process.execPath, [resolveYomeBinPath(), 'daemon', 'start', '--foreground'], {
|
|
98
|
+
detached: true,
|
|
99
|
+
stdio: ['ignore', out, err],
|
|
100
|
+
});
|
|
101
|
+
child.unref();
|
|
102
|
+
console.log(`✓ daemon launched in background (pid will be written to ${PID_FILE})`);
|
|
103
|
+
console.log(` logs: ${STDOUT_LOG}`);
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
function doStop() {
|
|
107
|
+
const pid = readPidIfRunning();
|
|
108
|
+
if (!pid) {
|
|
109
|
+
console.log('(daemon was not running)');
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
process.kill(pid, 'SIGTERM');
|
|
114
|
+
console.log(`✓ sent SIGTERM to pid=${pid}`);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
console.error(`✗ failed to stop daemon: ${e?.message ?? e}`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function doStatus() {
|
|
123
|
+
const pid = readPidIfRunning();
|
|
124
|
+
const tasks = listTasks();
|
|
125
|
+
const enabled = tasks.filter((t) => t.enabled).length;
|
|
126
|
+
if (!pid) {
|
|
127
|
+
console.log('Status: not running');
|
|
128
|
+
console.log(`Tasks: ${tasks.length} total, ${enabled} enabled (daemon must be running to fire them)`);
|
|
129
|
+
console.log(`PID file: ${PID_FILE}`);
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
console.log(`Status: running (pid=${pid})`);
|
|
133
|
+
console.log(`Tasks: ${tasks.length} total, ${enabled} enabled`);
|
|
134
|
+
console.log(`PID file: ${PID_FILE}`);
|
|
135
|
+
console.log(`Logs: ${STDOUT_LOG}`);
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
function doLogs(flags) {
|
|
139
|
+
if (!existsSync(STDOUT_LOG) && !existsSync(STDERR_LOG)) {
|
|
140
|
+
console.log('(no daemon logs yet — start the daemon first)');
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
if (flags.follow) {
|
|
144
|
+
// Use tail -F so log rotation / atomic-replace is handled for free.
|
|
145
|
+
try {
|
|
146
|
+
execSync(`tail -F "${STDOUT_LOG}" "${STDERR_LOG}"`, { stdio: 'inherit' });
|
|
147
|
+
}
|
|
148
|
+
catch { /* tail terminated by user */ }
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
// One-shot: print the last 100 lines of each.
|
|
152
|
+
const tail = (file) => {
|
|
153
|
+
if (!existsSync(file))
|
|
154
|
+
return;
|
|
155
|
+
try {
|
|
156
|
+
const buf = readFileSync(file, 'utf-8');
|
|
157
|
+
const lines = buf.split('\n');
|
|
158
|
+
const last = lines.slice(-100).join('\n');
|
|
159
|
+
console.log(`── ${file} ──`);
|
|
160
|
+
console.log(last);
|
|
161
|
+
}
|
|
162
|
+
catch { /* noop */ }
|
|
163
|
+
};
|
|
164
|
+
tail(STDOUT_LOG);
|
|
165
|
+
tail(STDERR_LOG);
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// launchd integration — `yome daemon install` writes a plist to
|
|
2
|
+
// ~/Library/LaunchAgents/work.yome.daemon.plist and loads it via
|
|
3
|
+
// launchctl, so the daemon survives reboots / logouts.
|
|
4
|
+
//
|
|
5
|
+
// We deliberately use a USER LaunchAgent (not a system LaunchDaemon) so
|
|
6
|
+
// no sudo is required and the daemon inherits the user's environment
|
|
7
|
+
// (Keychain access, ~/.yome/, etc.).
|
|
8
|
+
import { writeFileSync, existsSync, unlinkSync, mkdirSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { PLIST_LABEL, STDOUT_LOG, STDERR_LOG, DAEMON_ROOT } from './paths.js';
|
|
13
|
+
const LAUNCH_AGENTS_DIR = join(homedir(), 'Library', 'LaunchAgents');
|
|
14
|
+
const PLIST_PATH = join(LAUNCH_AGENTS_DIR, `${PLIST_LABEL}.plist`);
|
|
15
|
+
function buildPlist(yomeBinPath) {
|
|
16
|
+
// ProgramArguments uses absolute paths because launchd doesn't honour
|
|
17
|
+
// the user's interactive PATH. We prepend a wide PATH for the agent's
|
|
18
|
+
// own subprocess spawns (Bash tool / skill OTA backends).
|
|
19
|
+
const homebrewBin = '/opt/homebrew/bin';
|
|
20
|
+
const localBin = '/usr/local/bin';
|
|
21
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
22
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
23
|
+
<plist version="1.0">
|
|
24
|
+
<dict>
|
|
25
|
+
<key>Label</key><string>${PLIST_LABEL}</string>
|
|
26
|
+
<key>ProgramArguments</key>
|
|
27
|
+
<array>
|
|
28
|
+
<string>${process.execPath}</string>
|
|
29
|
+
<string>${yomeBinPath}</string>
|
|
30
|
+
<string>daemon</string>
|
|
31
|
+
<string>start</string>
|
|
32
|
+
<string>--foreground</string>
|
|
33
|
+
</array>
|
|
34
|
+
<key>RunAtLoad</key><true/>
|
|
35
|
+
<key>KeepAlive</key>
|
|
36
|
+
<dict>
|
|
37
|
+
<key>SuccessfulExit</key><false/>
|
|
38
|
+
<key>Crashed</key><true/>
|
|
39
|
+
</dict>
|
|
40
|
+
<key>StandardOutPath</key><string>${STDOUT_LOG}</string>
|
|
41
|
+
<key>StandardErrorPath</key><string>${STDERR_LOG}</string>
|
|
42
|
+
<key>WorkingDirectory</key><string>${homedir()}</string>
|
|
43
|
+
<key>EnvironmentVariables</key>
|
|
44
|
+
<dict>
|
|
45
|
+
<key>PATH</key><string>${homebrewBin}:${localBin}:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
46
|
+
<key>HOME</key><string>${homedir()}</string>
|
|
47
|
+
</dict>
|
|
48
|
+
<key>ProcessType</key><string>Background</string>
|
|
49
|
+
</dict>
|
|
50
|
+
</plist>
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export function installLaunchAgent(yomeBinPath) {
|
|
54
|
+
if (process.platform !== 'darwin') {
|
|
55
|
+
return { ok: false, plistPath: PLIST_PATH, message: 'launchd is macOS-only' };
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });
|
|
59
|
+
mkdirSync(DAEMON_ROOT, { recursive: true });
|
|
60
|
+
const plist = buildPlist(yomeBinPath);
|
|
61
|
+
writeFileSync(PLIST_PATH, plist, 'utf-8');
|
|
62
|
+
// unload first (ignore errors — likely just "not loaded")
|
|
63
|
+
try {
|
|
64
|
+
execSync(`launchctl unload "${PLIST_PATH}"`, { stdio: 'ignore' });
|
|
65
|
+
}
|
|
66
|
+
catch { /* noop */ }
|
|
67
|
+
execSync(`launchctl load "${PLIST_PATH}"`, { stdio: 'ignore' });
|
|
68
|
+
return { ok: true, plistPath: PLIST_PATH, message: `installed and loaded ${PLIST_PATH}` };
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
return { ok: false, plistPath: PLIST_PATH, message: `install failed: ${e?.message ?? e}` };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function uninstallLaunchAgent() {
|
|
75
|
+
if (process.platform !== 'darwin') {
|
|
76
|
+
return { ok: false, plistPath: PLIST_PATH, message: 'launchd is macOS-only' };
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
if (existsSync(PLIST_PATH)) {
|
|
80
|
+
try {
|
|
81
|
+
execSync(`launchctl unload "${PLIST_PATH}"`, { stdio: 'ignore' });
|
|
82
|
+
}
|
|
83
|
+
catch { /* noop */ }
|
|
84
|
+
unlinkSync(PLIST_PATH);
|
|
85
|
+
return { ok: true, plistPath: PLIST_PATH, message: `unloaded and removed ${PLIST_PATH}` };
|
|
86
|
+
}
|
|
87
|
+
return { ok: true, plistPath: PLIST_PATH, message: '(was not installed)' };
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
return { ok: false, plistPath: PLIST_PATH, message: `uninstall failed: ${e?.message ?? e}` };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../src/daemon/launchd.ts"],"names":[],"mappings":"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"}
|