@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.
- package/README.md +5 -7
- package/README.zh-CN.md +5 -7
- package/bin/yome-calwatch +0 -0
- package/dist/commands/mesh.d.ts +15 -0
- package/dist/commands/mesh.js +282 -0
- package/dist/commands/mesh.js.map +1 -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 +173 -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/systemd.d.ts +7 -0
- package/dist/daemon/systemd.js +87 -0
- package/dist/daemon/systemd.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 +120 -9
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +14 -2
- package/dist/llm.js +266 -201
- package/dist/llm.js.map +1 -1
- package/dist/mesh/capabilities.d.ts +6 -0
- package/dist/mesh/capabilities.js +66 -0
- package/dist/mesh/capabilities.js.map +1 -0
- package/dist/mesh/device-id.d.ts +28 -0
- package/dist/mesh/device-id.js +105 -0
- package/dist/mesh/device-id.js.map +1 -0
- package/dist/mesh/device-registrar.d.ts +33 -0
- package/dist/mesh/device-registrar.js +131 -0
- package/dist/mesh/device-registrar.js.map +1 -0
- package/dist/mesh/index.d.ts +28 -0
- package/dist/mesh/index.js +71 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/partykit-client.d.ts +43 -0
- package/dist/mesh/partykit-client.js +195 -0
- package/dist/mesh/partykit-client.js.map +1 -0
- package/dist/mesh/rpc-handler.d.ts +28 -0
- package/dist/mesh/rpc-handler.js +201 -0
- package/dist/mesh/rpc-handler.js.map +1 -0
- package/dist/mesh/thread-stream.d.ts +109 -0
- package/dist/mesh/thread-stream.js +110 -0
- package/dist/mesh/thread-stream.js.map +1 -0
- package/dist/mesh/ticket.d.ts +33 -0
- package/dist/mesh/ticket.js +127 -0
- package/dist/mesh/ticket.js.map +1 -0
- package/dist/mesh/types.d.ts +83 -0
- package/dist/mesh/types.js +9 -0
- package/dist/mesh/types.js.map +1 -0
- 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/MeshApp.d.ts +9 -0
- package/dist/ui/MeshApp.js +226 -0
- package/dist/ui/MeshApp.js.map +1 -0
- 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/withRetry.d.ts +14 -0
- package/dist/withRetry.js +106 -0
- package/dist/withRetry.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 +13 -3
package/README.md
CHANGED
|
@@ -63,10 +63,9 @@ The agent loop must not live only in the 30 seconds after you press Enter. It sh
|
|
|
63
63
|
|
|
64
64
|
| Capability | Meaning |
|
|
65
65
|
|---|---|
|
|
66
|
-
| **Daemon** |
|
|
66
|
+
| **Daemon** | Yome runs as an OS-level daemon, not a chat window. It watches your filesystem, calendar, IM signals, and long-running jobs in the background — and only surfaces when something matters. The agent loop never has to be re-spawned from scratch. |
|
|
67
67
|
| **Live compaction** | Long sessions auto-compress history; tokens never overflow, memory never lost |
|
|
68
|
-
| **
|
|
69
|
-
| **Async agent** | Long jobs run in the background and push notifications when done, instead of blocking your prompt |
|
|
68
|
+
| **Oncall** | The agent is event-driven, not prompt-driven. WeChat / Feishu / Slack / iMessage messages, calendar fires, build finishes, GPU spikes, *@you* mentions — Yome reacts to the world and pages you with a one-line summary + a draft response, instead of waiting for you to ask. |
|
|
70
69
|
|
|
71
70
|
**Available today:**
|
|
72
71
|
|
|
@@ -76,7 +75,7 @@ yome thread share <session-id> --skill=<slug> # build redacted case bundle
|
|
|
76
75
|
yome thread submit <bundle-dir> --skill=<slug> # publish as PR (needs gh CLI)
|
|
77
76
|
```
|
|
78
77
|
|
|
79
|
-
Sessions, history compaction and case bundles ship today. Daemon
|
|
78
|
+
Sessions, history compaction and case bundles ship today. Daemon and Oncall are next-up on the `next` branch.
|
|
80
79
|
|
|
81
80
|
---
|
|
82
81
|
|
|
@@ -307,9 +306,8 @@ We do not replace your tools. We **empower** them without interrupting the way y
|
|
|
307
306
|
| Capability model (sandbox grants) | **stable** |
|
|
308
307
|
| Thread history + case bundles | **stable** |
|
|
309
308
|
| Live history compaction | beta |
|
|
310
|
-
| Daemon (always-on
|
|
311
|
-
|
|
|
312
|
-
| Async agent (background long-running) | next-up |
|
|
309
|
+
| Daemon (OS-level always-on loop) | experimental, on `next` branch |
|
|
310
|
+
| Oncall (event-driven, auto-paging) | next-up |
|
|
313
311
|
|
|
314
312
|
**Daemon roadmap** *(scoped, on `next`)*
|
|
315
313
|
|
package/README.zh-CN.md
CHANGED
|
@@ -63,10 +63,9 @@ Agent loop 不能只活在用户敲下 Enter 的那 30 秒;它应当 always-on,
|
|
|
63
63
|
|
|
64
64
|
| 能力 | 含义 |
|
|
65
65
|
|---|---|
|
|
66
|
-
| **Daemon · 守护进程** | Agent
|
|
66
|
+
| **Daemon · 守护进程** | Yome 是一个跑在系统层的 daemon,而不是一个聊天窗口。它在后台一直盯着你的文件系统、日历、IM 信号、长任务进程,只有真正值得打断你的时候才出现。Agent loop 永远不需要从零冷启动。 |
|
|
67
67
|
| **Live compaction · 即时压缩** | 长会话自动压缩历史,token 永远不爆,记忆永远不丢 |
|
|
68
|
-
| **
|
|
69
|
-
| **Async agent · 异步 agent** | 后台跑长任务,完成后主动 push 通知,而不是阻塞你的 prompt |
|
|
68
|
+
| **Oncall · 主动响应** | Agent 由事件驱动,而不是 prompt 驱动。微信 / 飞书 / Slack / iMessage 来消息,日历到点,build 跑完,GPU 飙高,有人 @你 —— Yome 监听这些信号,主动把"这件事 + 一个候选回复"推给你,而不是等你想起来再问它。 |
|
|
70
69
|
|
|
71
70
|
**当前可用:**
|
|
72
71
|
|
|
@@ -76,7 +75,7 @@ yome thread share <session-id> --skill=<slug> # 构建脱敏的 case bundle
|
|
|
76
75
|
yome thread submit <bundle-dir> --skill=<slug> # 作为 PR 发布 (需要 gh CLI)
|
|
77
76
|
```
|
|
78
77
|
|
|
79
|
-
会话 / 历史压缩 / case bundle 这三件已落地。Daemon
|
|
78
|
+
会话 / 历史压缩 / case bundle 这三件已落地。Daemon 与 Oncall 在 `next` 分支推进。
|
|
80
79
|
|
|
81
80
|
---
|
|
82
81
|
|
|
@@ -307,9 +306,8 @@ yome --key sk-... --base-url https://… --model …
|
|
|
307
306
|
| Capability model (sandbox grants) | **stable** |
|
|
308
307
|
| Thread 历史 + case bundles | **stable** |
|
|
309
308
|
| Live history compaction | beta |
|
|
310
|
-
| Daemon (
|
|
311
|
-
|
|
|
312
|
-
| Async agent (后台长任务) | next-up |
|
|
309
|
+
| Daemon (系统级常驻 loop) | experimental, 在 `next` 分支 |
|
|
310
|
+
| Oncall (事件驱动 / 主动 paging) | next-up |
|
|
313
311
|
|
|
314
312
|
**Daemon roadmap** *(scoped, 在 `next` 分支)*
|
|
315
313
|
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface MeshCliFlags {
|
|
2
|
+
foreground?: boolean;
|
|
3
|
+
follow?: boolean;
|
|
4
|
+
as?: string;
|
|
5
|
+
hubBase?: string;
|
|
6
|
+
/**
|
|
7
|
+
* `yome mesh start --tui` mounts an Ink-based thin-client UI on top
|
|
8
|
+
* of the running mesh daemon. The daemon continues to serve RPCs in
|
|
9
|
+
* the background; the TUI just subscribes to the same WS as a chat
|
|
10
|
+
* surface (so iOS / macOS messages stream into the terminal in
|
|
11
|
+
* real time, and lines typed at the prompt round-trip through Cloud).
|
|
12
|
+
*/
|
|
13
|
+
tui?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function runMeshSubcommand(args: string[], flags: MeshCliFlags): Promise<number>;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// `yome mesh ...` subcommand router.
|
|
2
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync, openSync, mkdirSync, appendFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { spawn, execSync } from 'child_process';
|
|
6
|
+
import { startMeshDaemon } from '../mesh/index.js';
|
|
7
|
+
import { getOrCreateDeviceId, loadDeviceState, safeHostname, updateDeviceMeta } from '../mesh/device-id.js';
|
|
8
|
+
import { detectCapabilities } from '../mesh/capabilities.js';
|
|
9
|
+
import { readAuthState } from '../yomeSkills/auth.js';
|
|
10
|
+
const MESH_ROOT = join(homedir(), '.yome', 'mesh');
|
|
11
|
+
const MESH_PID = join(MESH_ROOT, 'mesh.pid');
|
|
12
|
+
const MESH_STDOUT = join(MESH_ROOT, 'mesh.stdout.log');
|
|
13
|
+
const MESH_STDERR = join(MESH_ROOT, 'mesh.stderr.log');
|
|
14
|
+
export async function runMeshSubcommand(args, flags) {
|
|
15
|
+
const sub = args[0];
|
|
16
|
+
switch (sub) {
|
|
17
|
+
case 'start': return doStart(args.slice(1), flags);
|
|
18
|
+
case 'stop': return doStop();
|
|
19
|
+
case 'status': return doStatus();
|
|
20
|
+
case 'logs': return doLogs(flags);
|
|
21
|
+
case 'rename': return doRename(args.slice(1));
|
|
22
|
+
case 'info': return doInfo();
|
|
23
|
+
case undefined:
|
|
24
|
+
case 'help':
|
|
25
|
+
case '--help':
|
|
26
|
+
printHelp();
|
|
27
|
+
return 0;
|
|
28
|
+
default:
|
|
29
|
+
console.error(`Unknown subcommand: yome mesh ${sub}`);
|
|
30
|
+
printHelp();
|
|
31
|
+
return 2;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function printHelp() {
|
|
35
|
+
console.log(`Usage: yome mesh <subcommand>
|
|
36
|
+
|
|
37
|
+
start [--foreground] Connect to Yome Cloud as a mesh device.
|
|
38
|
+
Without --foreground, runs detached in the background.
|
|
39
|
+
start --tui Same, but also mount a chat TUI in this terminal.
|
|
40
|
+
iOS / macOS messages stream into it live; lines you
|
|
41
|
+
type round-trip through Cloud. Forces foreground.
|
|
42
|
+
stop Stop the running mesh daemon (SIGTERM).
|
|
43
|
+
status Show daemon pid + device id + capabilities.
|
|
44
|
+
logs [-f] Print mesh daemon log (use -f / --follow to tail).
|
|
45
|
+
info Show device id, hostname, alias, detected capabilities.
|
|
46
|
+
rename <alias> [desc] Set this device's display alias + optional description.
|
|
47
|
+
|
|
48
|
+
Files:
|
|
49
|
+
~/.yome/device.json persistent device id + metadata
|
|
50
|
+
~/.yome/auth.json yome account token (set via yome login)
|
|
51
|
+
~/.yome/mesh/mesh.pid pid of the running mesh daemon
|
|
52
|
+
~/.yome/mesh/mesh.*.log mesh daemon stdout / stderr
|
|
53
|
+
|
|
54
|
+
Prereqs:
|
|
55
|
+
Run \`yome login\` once on this box before \`yome mesh start\`.
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
async function doStart(_pos, flags) {
|
|
59
|
+
if (!readAuthState()) {
|
|
60
|
+
console.error('✗ Not logged in. Run `yome login` first.');
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
// Foreground = the path systemd / launchd / `--foreground` from
|
|
64
|
+
// an admin invokes; the daemon owns this process. The TUI flag also
|
|
65
|
+
// forces foreground (Ink can only attach to a real TTY, not the
|
|
66
|
+
// background log file we redirect into).
|
|
67
|
+
if (flags.foreground || flags.tui) {
|
|
68
|
+
return runForeground(flags);
|
|
69
|
+
}
|
|
70
|
+
// Detach a background child running ourselves in foreground.
|
|
71
|
+
const existing = readPidIfRunning();
|
|
72
|
+
if (existing) {
|
|
73
|
+
console.error(`✗ yome mesh already running (pid=${existing})`);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
ensureMeshRoot();
|
|
77
|
+
const out = openSync(MESH_STDOUT, 'a');
|
|
78
|
+
const err = openSync(MESH_STDERR, 'a');
|
|
79
|
+
const child = spawn(process.execPath, [process.argv[1], 'mesh', 'start', '--foreground', ...(flags.as ? ['--as', flags.as] : [])], {
|
|
80
|
+
detached: true,
|
|
81
|
+
stdio: ['ignore', out, err],
|
|
82
|
+
});
|
|
83
|
+
child.unref();
|
|
84
|
+
console.log(`✓ yome mesh launched in background`);
|
|
85
|
+
console.log(` logs: ${MESH_STDOUT}`);
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
async function runForeground(flags) {
|
|
89
|
+
// ensureMeshRoot first so MESH_PID has a parent dir; foreground path
|
|
90
|
+
// can also be invoked directly (systemd / launchd) without the
|
|
91
|
+
// background path creating ~/.yome/mesh/ for us.
|
|
92
|
+
ensureMeshRoot();
|
|
93
|
+
writeFileSync(MESH_PID, String(process.pid));
|
|
94
|
+
let daemon = null;
|
|
95
|
+
let tuiUnmount = null;
|
|
96
|
+
const teardown = () => {
|
|
97
|
+
try {
|
|
98
|
+
tuiUnmount?.();
|
|
99
|
+
}
|
|
100
|
+
catch { /* ignore */ }
|
|
101
|
+
try {
|
|
102
|
+
daemon?.shutdown();
|
|
103
|
+
}
|
|
104
|
+
catch { /* ignore */ }
|
|
105
|
+
try {
|
|
106
|
+
if (existsSync(MESH_PID))
|
|
107
|
+
unlinkSync(MESH_PID);
|
|
108
|
+
}
|
|
109
|
+
catch { /* ignore */ }
|
|
110
|
+
process.exit(0);
|
|
111
|
+
};
|
|
112
|
+
process.on('SIGINT', teardown);
|
|
113
|
+
process.on('SIGTERM', teardown);
|
|
114
|
+
// Logger: if TUI is on, NEVER write to stdout (Ink owns the screen).
|
|
115
|
+
// Tee everything to ~/.yome/mesh/mesh.tui.log instead so the user
|
|
116
|
+
// can `tail -F` from another terminal.
|
|
117
|
+
const tuiLogPath = join(MESH_ROOT, 'mesh.tui.log');
|
|
118
|
+
const log = flags.tui
|
|
119
|
+
? (level, msg, meta) => {
|
|
120
|
+
try {
|
|
121
|
+
const line = `${new Date().toISOString()} [${level}] ${msg}${meta ? ' ' + JSON.stringify(meta) : ''}\n`;
|
|
122
|
+
appendFileSync(tuiLogPath, line);
|
|
123
|
+
}
|
|
124
|
+
catch { /* ignore */ }
|
|
125
|
+
}
|
|
126
|
+
: undefined;
|
|
127
|
+
try {
|
|
128
|
+
daemon = await startMeshDaemon({
|
|
129
|
+
hubBase: flags.hubBase,
|
|
130
|
+
asName: flags.as,
|
|
131
|
+
log,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
console.error(`✗ mesh start failed: ${err.message}`);
|
|
136
|
+
try {
|
|
137
|
+
if (existsSync(MESH_PID))
|
|
138
|
+
unlinkSync(MESH_PID);
|
|
139
|
+
}
|
|
140
|
+
catch { /* ignore */ }
|
|
141
|
+
return 1;
|
|
142
|
+
}
|
|
143
|
+
if (flags.tui) {
|
|
144
|
+
// Lazy-load Ink + MeshApp so non-TUI callers (systemd, background
|
|
145
|
+
// detached child) never pay the React render cost or pull stdin.
|
|
146
|
+
const { render } = await import('ink');
|
|
147
|
+
const { default: React } = await import('react');
|
|
148
|
+
const { MeshApp } = await import('../ui/MeshApp.js');
|
|
149
|
+
const instance = render(React.createElement(MeshApp, { daemon }));
|
|
150
|
+
tuiUnmount = () => instance.unmount();
|
|
151
|
+
// Block on Ink's own lifecycle: when the user exits the TUI
|
|
152
|
+
// (Ctrl-C in MeshApp -> useApp().exit()), waitUntilExit resolves.
|
|
153
|
+
await instance.waitUntilExit();
|
|
154
|
+
teardown();
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
// Headless: block forever; the daemon owns timers + WS.
|
|
158
|
+
return new Promise(() => { });
|
|
159
|
+
}
|
|
160
|
+
function doStop() {
|
|
161
|
+
const pid = readPidIfRunning();
|
|
162
|
+
if (!pid) {
|
|
163
|
+
console.log('(yome mesh was not running)');
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
process.kill(pid, 'SIGTERM');
|
|
168
|
+
console.log(`✓ sent SIGTERM to pid=${pid}`);
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
console.error(`✗ failed to stop yome mesh: ${e.message}`);
|
|
173
|
+
return 1;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function doStatus() {
|
|
177
|
+
const pid = readPidIfRunning();
|
|
178
|
+
const deviceId = getOrCreateDeviceId();
|
|
179
|
+
const state = loadDeviceState();
|
|
180
|
+
const caps = detectCapabilities();
|
|
181
|
+
if (!pid) {
|
|
182
|
+
console.log('Status: not running');
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.log(`Status: running (pid=${pid})`);
|
|
186
|
+
}
|
|
187
|
+
console.log(`Device id: ${deviceId}`);
|
|
188
|
+
console.log(`Hostname: ${safeHostname()}`);
|
|
189
|
+
if (state?.alias)
|
|
190
|
+
console.log(`Alias: ${state.alias}`);
|
|
191
|
+
if (state?.description)
|
|
192
|
+
console.log(`Description: ${state.description}`);
|
|
193
|
+
console.log(`Capabilities: ${caps.join(', ')}`);
|
|
194
|
+
console.log(`PID file: ${MESH_PID}`);
|
|
195
|
+
console.log(`Logs: ${MESH_STDOUT}`);
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
function doLogs(flags) {
|
|
199
|
+
if (!existsSync(MESH_STDOUT) && !existsSync(MESH_STDERR)) {
|
|
200
|
+
console.log('(no mesh logs yet — `yome mesh start` first)');
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
if (flags.follow) {
|
|
204
|
+
try {
|
|
205
|
+
execSync(`tail -F "${MESH_STDOUT}" "${MESH_STDERR}"`, { stdio: 'inherit' });
|
|
206
|
+
}
|
|
207
|
+
catch { /* user interrupted */ }
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
const tail = (file) => {
|
|
211
|
+
if (!existsSync(file))
|
|
212
|
+
return;
|
|
213
|
+
try {
|
|
214
|
+
const buf = readFileSync(file, 'utf-8');
|
|
215
|
+
const lines = buf.split('\n').slice(-100).join('\n');
|
|
216
|
+
console.log(`── ${file} ──`);
|
|
217
|
+
console.log(lines);
|
|
218
|
+
}
|
|
219
|
+
catch { /* ignore */ }
|
|
220
|
+
};
|
|
221
|
+
tail(MESH_STDOUT);
|
|
222
|
+
tail(MESH_STDERR);
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
function doInfo() {
|
|
226
|
+
const deviceId = getOrCreateDeviceId();
|
|
227
|
+
const state = loadDeviceState();
|
|
228
|
+
const caps = detectCapabilities();
|
|
229
|
+
const auth = readAuthState();
|
|
230
|
+
console.log(`Yome user: ${auth?.yome_user_id ?? '(not logged in — run `yome login`)'}`);
|
|
231
|
+
console.log(`Provider: ${auth?.provider ?? '-'} (${auth?.provider_login ?? '-'})`);
|
|
232
|
+
console.log(`Device id: ${deviceId}`);
|
|
233
|
+
console.log(`Hostname: ${safeHostname()}`);
|
|
234
|
+
console.log(`Created at: ${state?.createdAt ?? '(this run)'}`);
|
|
235
|
+
if (state?.alias)
|
|
236
|
+
console.log(`Alias: ${state.alias}`);
|
|
237
|
+
if (state?.description)
|
|
238
|
+
console.log(`Description: ${state.description}`);
|
|
239
|
+
console.log(`Capabilities: ${caps.join(', ')}`);
|
|
240
|
+
return 0;
|
|
241
|
+
}
|
|
242
|
+
function doRename(pos) {
|
|
243
|
+
const alias = pos[0];
|
|
244
|
+
const description = pos.slice(1).join(' ').trim() || undefined;
|
|
245
|
+
if (!alias) {
|
|
246
|
+
console.error('Usage: yome mesh rename <alias> [description]');
|
|
247
|
+
return 2;
|
|
248
|
+
}
|
|
249
|
+
const next = updateDeviceMeta({ alias, description });
|
|
250
|
+
console.log(`✓ alias set to "${next.alias}"`);
|
|
251
|
+
if (description)
|
|
252
|
+
console.log(` description: ${description}`);
|
|
253
|
+
console.log('(restart `yome mesh` to push the new alias to Cloud)');
|
|
254
|
+
return 0;
|
|
255
|
+
}
|
|
256
|
+
function ensureMeshRoot() {
|
|
257
|
+
try {
|
|
258
|
+
mkdirSync(MESH_ROOT, { recursive: true });
|
|
259
|
+
}
|
|
260
|
+
catch { /* ignore */ }
|
|
261
|
+
}
|
|
262
|
+
function readPidIfRunning() {
|
|
263
|
+
if (!existsSync(MESH_PID))
|
|
264
|
+
return null;
|
|
265
|
+
try {
|
|
266
|
+
const pid = Number.parseInt(readFileSync(MESH_PID, 'utf-8').trim(), 10);
|
|
267
|
+
if (!Number.isFinite(pid))
|
|
268
|
+
return null;
|
|
269
|
+
// Signal 0 = liveness check.
|
|
270
|
+
try {
|
|
271
|
+
process.kill(pid, 0);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
return pid;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh.js","sourceRoot":"","sources":["../../src/commands/mesh.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
CHANGED
|
@@ -93,11 +93,14 @@ You help with software engineering tasks: reading code, writing code, debugging,
|
|
|
93
93
|
- Never expose secrets or API keys.
|
|
94
94
|
|
|
95
95
|
## Available Tools
|
|
96
|
-
You have these tools: Read, Edit, Write, Bash, Glob, Grep, LS.
|
|
96
|
+
You have these tools: Read, Edit, Write, Bash, Yome, AskUser, TodoWrite, Glob, Grep, LS.
|
|
97
97
|
- Use Read to view file contents.
|
|
98
98
|
- Use Edit to modify existing files (find & replace with old_string/new_string).
|
|
99
99
|
- Use Write to create new files.
|
|
100
|
-
- Use Bash
|
|
100
|
+
- Use Bash for /bin/sh commands ONLY (ls, cat, git, mkdir, build/test runners, pipes…). It does NOT route to hub skills.
|
|
101
|
+
- Use Yome to invoke installed hub-skill commands (xl, ppt, cal, fs, rem, …) — pass the command line exactly as a human would type it (e.g. \`xl books\`, \`ppt new ~/Desktop/x.pptx\`).
|
|
102
|
+
- Use AskUser when requirements are ambiguous or you need the user to choose between trade-offs BEFORE doing irreversible work. Send 1–4 multiple-choice questions; do NOT include "Other" (the UI provides a custom-answer entry). Blocks until the user responds.
|
|
103
|
+
- Use TodoWrite proactively whenever you start a task with 3+ meaningful steps. Always send the FULL list. Keep exactly ONE item in_progress at a time. Flip status the moment you start / finish a step — don't batch updates. Each item needs \`content\` (imperative) + \`activeForm\` (present continuous) + \`status\`.
|
|
101
104
|
- Use Glob to find files by pattern.
|
|
102
105
|
- Use Grep to search file contents.
|
|
103
106
|
- Use LS to list directory contents.
|
|
@@ -162,7 +165,7 @@ function buildSkillsSection(skills) {
|
|
|
162
165
|
* the trigger / effects / entry triad.
|
|
163
166
|
*/
|
|
164
167
|
function buildHubSkillsSection(entries) {
|
|
165
|
-
let section = `\n## Installed Hub Skills\nUse the
|
|
168
|
+
let section = `\n## Installed Hub Skills\nUse the **Yome** tool: \`<domain> <action> [args]\` (no \`yome\` prefix, no SkillCall, NOT the Bash tool).\nThe Bash tool is for /bin/sh ops only and will NOT route to skills.\n\n`;
|
|
166
169
|
for (const e of entries) {
|
|
167
170
|
const manifest = readManifest(e.installedAt);
|
|
168
171
|
section += renderL1Block(e.domain, manifest, e.description) + '\n';
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CalendarAccessResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
status: 'granted' | 'denied' | 'restricted' | 'not-determined' | 'unknown' | 'no-helper';
|
|
4
|
+
message: string;
|
|
5
|
+
/** Hint surfaced from the Swift helper (e.g. "open System Settings → ..."). */
|
|
6
|
+
fix?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Best-effort path to bin/yome-calwatch. */
|
|
9
|
+
export declare function resolveCalwatchPath(): string;
|
|
10
|
+
export declare function checkCalendarAccess(): CalendarAccessResult;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Pre-flight EventKit permission probe for `yome cron add --on calendar:*`.
|
|
2
|
+
//
|
|
3
|
+
// We invoke the same Swift helper the daemon uses (`yome-calwatch
|
|
4
|
+
// --check-access`) — it's the only reliable way to learn the current
|
|
5
|
+
// state because TCC is per-binary, not per-user.
|
|
6
|
+
//
|
|
7
|
+
// Exit codes (mirrors the helper):
|
|
8
|
+
// 0 granted
|
|
9
|
+
// 2 denied / restricted (with a JSON line describing the fix)
|
|
10
|
+
// 3 unknown
|
|
11
|
+
// non-existent binary → returns { ok: false, message: '...' }
|
|
12
|
+
import { spawnSync } from 'child_process';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { dirname, resolve } from 'path';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
/** Best-effort path to bin/yome-calwatch. */
|
|
17
|
+
export function resolveCalwatchPath() {
|
|
18
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
// dist/daemon/calendarPermission.js → ../../bin/yome-calwatch
|
|
20
|
+
// src/daemon/calendarPermission.ts → ../../bin/yome-calwatch
|
|
21
|
+
return resolve(here, '..', '..', 'bin', 'yome-calwatch');
|
|
22
|
+
}
|
|
23
|
+
export function checkCalendarAccess() {
|
|
24
|
+
const bin = resolveCalwatchPath();
|
|
25
|
+
if (!existsSync(bin)) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
status: 'no-helper',
|
|
29
|
+
message: 'native helper yome-calwatch is missing. ' +
|
|
30
|
+
'On macOS: cd cli && npm run build:native. ' +
|
|
31
|
+
'On Linux/Windows: calendar triggers are macOS-only.',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const r = spawnSync(bin, ['--check-access'], { encoding: 'utf-8', timeout: 30_000 });
|
|
35
|
+
// Helper writes one JSON line to stdout regardless of exit code.
|
|
36
|
+
const last = (r.stdout ?? '').split('\n').reverse().find((l) => l.trim().startsWith('{'));
|
|
37
|
+
let parsed = {};
|
|
38
|
+
if (last) {
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(last);
|
|
41
|
+
}
|
|
42
|
+
catch { /* noop */ }
|
|
43
|
+
}
|
|
44
|
+
const status = String(parsed.status ?? '');
|
|
45
|
+
const fix = typeof parsed.fix === 'string' ? parsed.fix : undefined;
|
|
46
|
+
if (r.status === 0 && status === 'granted') {
|
|
47
|
+
return { ok: true, status: 'granted', message: 'calendar access granted' };
|
|
48
|
+
}
|
|
49
|
+
if (status === 'denied' || status === 'restricted') {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
status: status,
|
|
53
|
+
message: `calendar access ${status}`,
|
|
54
|
+
fix,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (status === 'not-determined') {
|
|
58
|
+
return { ok: false, status: 'not-determined', message: 'calendar access not yet determined', fix };
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
status: 'unknown',
|
|
63
|
+
message: `unable to determine calendar access (helper exit=${r.status}). ` +
|
|
64
|
+
`stdout=${(r.stdout ?? '').slice(0, 200)} stderr=${(r.stderr ?? '').slice(0, 200)}`,
|
|
65
|
+
fix,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=calendarPermission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendarPermission.js","sourceRoot":"","sources":["../../src/daemon/calendarPermission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CronCliFlags {
|
|
2
|
+
at?: string;
|
|
3
|
+
human?: string;
|
|
4
|
+
once?: string;
|
|
5
|
+
on?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
within?: string;
|
|
8
|
+
titleRegex?: string;
|
|
9
|
+
calendar?: string;
|
|
10
|
+
tz?: string;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
allow?: string | string[];
|
|
13
|
+
deny?: string | string[];
|
|
14
|
+
maxMs?: string;
|
|
15
|
+
env?: string | string[];
|
|
16
|
+
follow?: boolean;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function runCronSubcommand(args: string[], flags: CronCliFlags): Promise<number>;
|