@poping/yome 0.0.2 → 0.0.3

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 (185) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +11 -0
  3. package/README.md +308 -27
  4. package/README.zh-CN.md +335 -0
  5. package/dist/agent.d.ts +24 -2
  6. package/dist/agent.js +34 -2
  7. package/dist/agent.js.map +1 -1
  8. package/dist/context.d.ts +2 -0
  9. package/dist/context.js +116 -11
  10. package/dist/context.js.map +1 -1
  11. package/dist/index.js +147 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/llm.js +45 -2
  14. package/dist/llm.js.map +1 -1
  15. package/dist/loops/chain.js +8 -0
  16. package/dist/loops/chain.js.map +1 -1
  17. package/dist/loops/evaluator.js +8 -0
  18. package/dist/loops/evaluator.js.map +1 -1
  19. package/dist/loops/orchestrator.js +8 -0
  20. package/dist/loops/orchestrator.js.map +1 -1
  21. package/dist/loops/parallel.js.map +1 -1
  22. package/dist/loops/route.js +8 -0
  23. package/dist/loops/route.js.map +1 -1
  24. package/dist/loops/simple.js +15 -0
  25. package/dist/loops/simple.js.map +1 -1
  26. package/dist/permissions/index.d.ts +1 -1
  27. package/dist/permissions/index.js +1 -1
  28. package/dist/permissions/index.js.map +1 -1
  29. package/dist/permissions/loader.d.ts +20 -1
  30. package/dist/permissions/loader.js +51 -0
  31. package/dist/permissions/loader.js.map +1 -1
  32. package/dist/redact.d.ts +56 -0
  33. package/dist/redact.js +191 -0
  34. package/dist/redact.js.map +1 -0
  35. package/dist/skills/runner/applescript.d.ts +49 -0
  36. package/dist/skills/runner/applescript.js +100 -0
  37. package/dist/skills/runner/applescript.js.map +1 -0
  38. package/dist/skills/runner/dispatcher.d.ts +57 -0
  39. package/dist/skills/runner/dispatcher.js +407 -0
  40. package/dist/skills/runner/dispatcher.js.map +1 -0
  41. package/dist/skills/runner/kernel.d.ts +8 -0
  42. package/dist/skills/runner/kernel.js +732 -0
  43. package/dist/skills/runner/kernel.js.map +1 -0
  44. package/dist/skills/runner/tokenizer.d.ts +36 -0
  45. package/dist/skills/runner/tokenizer.js +177 -0
  46. package/dist/skills/runner/tokenizer.js.map +1 -0
  47. package/dist/threadCli.d.ts +11 -0
  48. package/dist/threadCli.js +177 -0
  49. package/dist/threadCli.js.map +1 -0
  50. package/dist/threadShare.d.ts +21 -0
  51. package/dist/threadShare.js +121 -0
  52. package/dist/threadShare.js.map +1 -0
  53. package/dist/threadSubmit.d.ts +32 -0
  54. package/dist/threadSubmit.js +199 -0
  55. package/dist/threadSubmit.js.map +1 -0
  56. package/dist/tools/bash.js +68 -13
  57. package/dist/tools/bash.js.map +1 -1
  58. package/dist/tools/index.d.ts +22 -2
  59. package/dist/tools/index.js +41 -5
  60. package/dist/tools/index.js.map +1 -1
  61. package/dist/tools/skillCall.d.ts +2 -0
  62. package/dist/tools/skillCall.js +77 -0
  63. package/dist/tools/skillCall.js.map +1 -0
  64. package/dist/ui/AgentPicker.js +3 -3
  65. package/dist/ui/AgentPicker.js.map +1 -1
  66. package/dist/ui/App.js +214 -61
  67. package/dist/ui/App.js.map +1 -1
  68. package/dist/ui/Banner.d.ts +2 -1
  69. package/dist/ui/Banner.js +23 -4
  70. package/dist/ui/Banner.js.map +1 -1
  71. package/dist/ui/InputBar.js +6 -3
  72. package/dist/ui/InputBar.js.map +1 -1
  73. package/dist/ui/Markdown.d.ts +2 -2
  74. package/dist/ui/Markdown.js +22 -7
  75. package/dist/ui/Markdown.js.map +1 -1
  76. package/dist/ui/MarketplacePicker.d.ts +7 -0
  77. package/dist/ui/MarketplacePicker.js +122 -0
  78. package/dist/ui/MarketplacePicker.js.map +1 -0
  79. package/dist/ui/MessageList.d.ts +4 -1
  80. package/dist/ui/MessageList.js +72 -7
  81. package/dist/ui/MessageList.js.map +1 -1
  82. package/dist/ui/ModelPicker.js +4 -4
  83. package/dist/ui/ModelPicker.js.map +1 -1
  84. package/dist/ui/PermissionPrompt.d.ts +16 -4
  85. package/dist/ui/PermissionPrompt.js +60 -15
  86. package/dist/ui/PermissionPrompt.js.map +1 -1
  87. package/dist/ui/SessionPicker.js +2 -2
  88. package/dist/ui/SessionPicker.js.map +1 -1
  89. package/dist/ui/ShimmerText.d.ts +8 -0
  90. package/dist/ui/ShimmerText.js +40 -0
  91. package/dist/ui/ShimmerText.js.map +1 -0
  92. package/dist/ui/Spinner.js +3 -9
  93. package/dist/ui/Spinner.js.map +1 -1
  94. package/dist/ui/TogglePicker.js +4 -4
  95. package/dist/ui/TogglePicker.js.map +1 -1
  96. package/dist/ui/ToolResult.js +6 -0
  97. package/dist/ui/ToolResult.js.map +1 -1
  98. package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
  99. package/dist/ui/UnifiedSkillsPicker.js +63 -0
  100. package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
  101. package/dist/ui/animation.d.ts +3 -0
  102. package/dist/ui/animation.js +48 -0
  103. package/dist/ui/animation.js.map +1 -0
  104. package/dist/ui/useThrottledStream.d.ts +7 -0
  105. package/dist/ui/useThrottledStream.js +63 -0
  106. package/dist/ui/useThrottledStream.js.map +1 -0
  107. package/dist/yomeSkills/auth.d.ts +20 -0
  108. package/dist/yomeSkills/auth.js +70 -0
  109. package/dist/yomeSkills/auth.js.map +1 -0
  110. package/dist/yomeSkills/blacklist.d.ts +33 -0
  111. package/dist/yomeSkills/blacklist.js +101 -0
  112. package/dist/yomeSkills/blacklist.js.map +1 -0
  113. package/dist/yomeSkills/capabilities.d.ts +54 -0
  114. package/dist/yomeSkills/capabilities.js +175 -0
  115. package/dist/yomeSkills/capabilities.js.map +1 -0
  116. package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
  117. package/dist/yomeSkills/capabilityGuard.js +113 -0
  118. package/dist/yomeSkills/capabilityGuard.js.map +1 -0
  119. package/dist/yomeSkills/cli.d.ts +17 -0
  120. package/dist/yomeSkills/cli.js +477 -0
  121. package/dist/yomeSkills/cli.js.map +1 -0
  122. package/dist/yomeSkills/devLink.d.ts +17 -0
  123. package/dist/yomeSkills/devLink.js +91 -0
  124. package/dist/yomeSkills/devLink.js.map +1 -0
  125. package/dist/yomeSkills/doctor.d.ts +13 -0
  126. package/dist/yomeSkills/doctor.js +152 -0
  127. package/dist/yomeSkills/doctor.js.map +1 -0
  128. package/dist/yomeSkills/enable.d.ts +8 -0
  129. package/dist/yomeSkills/enable.js +67 -0
  130. package/dist/yomeSkills/enable.js.map +1 -0
  131. package/dist/yomeSkills/hubPing.d.ts +1 -0
  132. package/dist/yomeSkills/hubPing.js +41 -0
  133. package/dist/yomeSkills/hubPing.js.map +1 -0
  134. package/dist/yomeSkills/install.d.ts +18 -0
  135. package/dist/yomeSkills/install.js +143 -0
  136. package/dist/yomeSkills/install.js.map +1 -0
  137. package/dist/yomeSkills/installGithub.d.ts +26 -0
  138. package/dist/yomeSkills/installGithub.js +192 -0
  139. package/dist/yomeSkills/installGithub.js.map +1 -0
  140. package/dist/yomeSkills/installMeta.d.ts +8 -0
  141. package/dist/yomeSkills/installMeta.js +76 -0
  142. package/dist/yomeSkills/installMeta.js.map +1 -0
  143. package/dist/yomeSkills/integrity.d.ts +26 -0
  144. package/dist/yomeSkills/integrity.js +107 -0
  145. package/dist/yomeSkills/integrity.js.map +1 -0
  146. package/dist/yomeSkills/invoke.d.ts +29 -0
  147. package/dist/yomeSkills/invoke.js +103 -0
  148. package/dist/yomeSkills/invoke.js.map +1 -0
  149. package/dist/yomeSkills/list.d.ts +11 -0
  150. package/dist/yomeSkills/list.js +55 -0
  151. package/dist/yomeSkills/list.js.map +1 -0
  152. package/dist/yomeSkills/login.d.ts +41 -0
  153. package/dist/yomeSkills/login.js +221 -0
  154. package/dist/yomeSkills/login.js.map +1 -0
  155. package/dist/yomeSkills/manifest.d.ts +60 -0
  156. package/dist/yomeSkills/manifest.js +47 -0
  157. package/dist/yomeSkills/manifest.js.map +1 -0
  158. package/dist/yomeSkills/paths.d.ts +13 -0
  159. package/dist/yomeSkills/paths.js +33 -0
  160. package/dist/yomeSkills/paths.js.map +1 -0
  161. package/dist/yomeSkills/publish.d.ts +16 -0
  162. package/dist/yomeSkills/publish.js +109 -0
  163. package/dist/yomeSkills/publish.js.map +1 -0
  164. package/dist/yomeSkills/rollback.d.ts +10 -0
  165. package/dist/yomeSkills/rollback.js +83 -0
  166. package/dist/yomeSkills/rollback.js.map +1 -0
  167. package/dist/yomeSkills/search.d.ts +21 -0
  168. package/dist/yomeSkills/search.js +31 -0
  169. package/dist/yomeSkills/search.js.map +1 -0
  170. package/dist/yomeSkills/skillsIndex.d.ts +36 -0
  171. package/dist/yomeSkills/skillsIndex.js +111 -0
  172. package/dist/yomeSkills/skillsIndex.js.map +1 -0
  173. package/dist/yomeSkills/unified.d.ts +53 -0
  174. package/dist/yomeSkills/unified.js +187 -0
  175. package/dist/yomeSkills/unified.js.map +1 -0
  176. package/dist/yomeSkills/uninstall.d.ts +7 -0
  177. package/dist/yomeSkills/uninstall.js +22 -0
  178. package/dist/yomeSkills/uninstall.js.map +1 -0
  179. package/dist/yomeSkills/update.d.ts +18 -0
  180. package/dist/yomeSkills/update.js +75 -0
  181. package/dist/yomeSkills/update.js.map +1 -0
  182. package/dist/yomeSkills/validate.d.ts +11 -0
  183. package/dist/yomeSkills/validate.js +99 -0
  184. package/dist/yomeSkills/validate.js.map +1 -0
  185. package/package.json +14 -5
@@ -0,0 +1,407 @@
1
+ // cli/src/skills/runner/dispatcher.ts
2
+ //
3
+ // Generic backend dispatcher for installed yome skills. Reads a skill's
4
+ // `backends/macos/manifest.json` (declarative — no JS code in the skill
5
+ // bundle) and translates an action invocation into an osascript run.
6
+ //
7
+ // A skill author publishes:
8
+ //
9
+ // ~/.yome/skills/@owner/foo/
10
+ // backends/macos/
11
+ // manifest.json
12
+ // new.applescript
13
+ // open.applescript
14
+ // open.poll.applescript
15
+ // slides.applescript
16
+ // ...
17
+ //
18
+ // `manifest.json` shape (this file is the contract):
19
+ //
20
+ // {
21
+ // "appBundleId": "com.microsoft.Powerpoint",
22
+ // "appName": "Microsoft PowerPoint",
23
+ // "actions": {
24
+ // "<action>": {
25
+ // "script": "new.applescript", // template file (required)
26
+ // "args": [ { "name", "from", "type?", "default?", "required?" } ],
27
+ // "openViaLaunchServices": false, // for `open` style
28
+ // "pollScript": "open.poll.applescript", // when openViaLaunchServices
29
+ // "uses": [ "applescript", "fs:write" ] // capabilities required
30
+ // }
31
+ // }
32
+ // }
33
+ //
34
+ // `args[].from` is one of:
35
+ // - "positional" → call.positionals[0]
36
+ // - "positional|--X" → positional, fall back to --X flag
37
+ // - "--X" → call.flags["X"]
38
+ //
39
+ // The .applescript file is rendered with mustache-ish placeholders:
40
+ // {{name}} → raw substitution (caller must escape)
41
+ // {{name|json}} → JSON-stringify (safe for AppleScript string literal)
42
+ // {{name|posix}} → wrap in `POSIX file "..."`
43
+ // {{name|bool}} → `true` / `false` AppleScript literal
44
+ import { readFileSync, existsSync } from 'node:fs';
45
+ import { join } from 'node:path';
46
+ import { runOsascript, openViaLaunchServices, } from './applescript.js';
47
+ // ──────────────────────────────────────────────────────────────────────
48
+ // Argument resolution
49
+ // ──────────────────────────────────────────────────────────────────────
50
+ function resolveArg(spec, call) {
51
+ const sources = spec.from.split('|').map((s) => s.trim());
52
+ for (const src of sources) {
53
+ if (src === 'positional') {
54
+ const v = call.positionals[0];
55
+ if (v !== undefined && v !== '')
56
+ return v;
57
+ }
58
+ else if (src.startsWith('--')) {
59
+ const key = src.slice(2);
60
+ const v = call.flags[key];
61
+ if (v !== undefined && v !== '')
62
+ return v;
63
+ }
64
+ }
65
+ if (spec.default !== undefined)
66
+ return spec.default;
67
+ if (spec.required)
68
+ return null;
69
+ return spec.type === 'bool' ? false : '';
70
+ }
71
+ // ──────────────────────────────────────────────────────────────────────
72
+ // Template rendering
73
+ // ──────────────────────────────────────────────────────────────────────
74
+ function isTruthy(v) {
75
+ if (v === true || v === 1)
76
+ return true;
77
+ if (typeof v === 'string')
78
+ return v !== '' && v !== 'false' && v !== '0';
79
+ if (typeof v === 'number')
80
+ return v !== 0;
81
+ return false;
82
+ }
83
+ // Named CSS-ish colors that map to PowerPoint-friendly RGB triples.
84
+ // Mirror of the Swift PowerPointBridge.colorToRGB lookup so cli + macos app
85
+ // behave the same when a user types `--color=red`.
86
+ const NAMED_COLORS = {
87
+ black: [0, 0, 0],
88
+ white: [255, 255, 255],
89
+ red: [255, 0, 0],
90
+ green: [0, 128, 0],
91
+ blue: [0, 0, 255],
92
+ navy: [0, 51, 102],
93
+ darkblue: [0, 51, 102],
94
+ yellow: [255, 255, 0],
95
+ orange: [255, 165, 0],
96
+ purple: [128, 0, 128],
97
+ pink: [255, 192, 203],
98
+ cyan: [0, 255, 255],
99
+ gray: [128, 128, 128],
100
+ grey: [128, 128, 128],
101
+ };
102
+ /**
103
+ * Parse `red` | `#003366` | `003366` | `0, 51, 102` into an AppleScript
104
+ * RGB literal `{r, g, b}`. Returns null if the input doesn't match any of
105
+ * those three forms — callers should treat null as "user gave a bad color".
106
+ */
107
+ export function parseColorToAppleScriptRGB(input) {
108
+ const s = input.trim();
109
+ if (!s)
110
+ return null;
111
+ // R,G,B
112
+ const csv = s.split(',').map((p) => p.trim());
113
+ if (csv.length === 3) {
114
+ const [r, g, b] = csv.map(Number);
115
+ if ([r, g, b].every((n) => Number.isInteger(n) && n >= 0 && n <= 255)) {
116
+ return `{${r}, ${g}, ${b}}`;
117
+ }
118
+ }
119
+ // #RRGGBB or RRGGBB
120
+ let hex = s.toLowerCase();
121
+ if (hex.startsWith('#'))
122
+ hex = hex.slice(1);
123
+ if (/^[0-9a-f]{6}$/.test(hex)) {
124
+ const v = parseInt(hex, 16);
125
+ return `{${(v >> 16) & 0xff}, ${(v >> 8) & 0xff}, ${v & 0xff}}`;
126
+ }
127
+ // named
128
+ const named = NAMED_COLORS[s.toLowerCase()];
129
+ if (named)
130
+ return `{${named[0]}, ${named[1]}, ${named[2]}}`;
131
+ return null;
132
+ }
133
+ /**
134
+ * `--align` parser → AppleScript `paragraph align ...` enum.
135
+ * Defaults silently to `paragraph align left` for unknown values; that
136
+ * matches the Swift bridge behaviour and avoids breaking the script render.
137
+ */
138
+ export function parseAlignToAppleScript(input) {
139
+ switch (input.trim().toLowerCase()) {
140
+ case 'right': return 'paragraph align right';
141
+ case 'center': return 'paragraph align center';
142
+ case 'left':
143
+ default: return 'paragraph align left';
144
+ }
145
+ }
146
+ function renderTemplate(tpl, ctx) {
147
+ // {{#if name}}...{{/if}} — block emitted only when ctx[name] is truthy.
148
+ // Greedy: not nestable. Sufficient for our skill templates.
149
+ let out = tpl.replace(/\{\{#if\s+([\w-]+)\s*\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, name, body) => {
150
+ return isTruthy(ctx[name]) ? body : '';
151
+ });
152
+ // {{name}} / {{name|filter}} substitution.
153
+ out = out.replace(/\{\{\s*([\w-]+)(?:\s*\|\s*(\w+))?\s*\}\}/g, (_, name, filter) => {
154
+ const raw = ctx[name];
155
+ if (raw === null || raw === undefined)
156
+ return '';
157
+ if (filter === 'json' || filter === 'string') {
158
+ return '"' + String(raw).replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
159
+ }
160
+ if (filter === 'posix') {
161
+ const s = String(raw).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
162
+ return `POSIX file "${s}"`;
163
+ }
164
+ if (filter === 'bool') {
165
+ return isTruthy(raw) ? 'true' : 'false';
166
+ }
167
+ if (filter === 'as_int') {
168
+ const n = parseInt(String(raw), 10);
169
+ return Number.isFinite(n) ? String(n) : '0';
170
+ }
171
+ if (filter === 'rgb') {
172
+ // Empty / unparseable color → empty literal so the surrounding
173
+ // {{#if name}} block degrades to "do nothing" instead of injecting
174
+ // syntactically broken AppleScript.
175
+ const lit = parseColorToAppleScriptRGB(String(raw));
176
+ return lit ?? '';
177
+ }
178
+ if (filter === 'align') {
179
+ return parseAlignToAppleScript(String(raw));
180
+ }
181
+ return String(raw);
182
+ });
183
+ return out;
184
+ }
185
+ // ──────────────────────────────────────────────────────────────────────
186
+ // Dispatcher
187
+ // ──────────────────────────────────────────────────────────────────────
188
+ export function loadMacosBackend(skillDir) {
189
+ const f = join(skillDir, 'backends', 'macos', 'manifest.json');
190
+ if (!existsSync(f))
191
+ return null;
192
+ try {
193
+ const obj = JSON.parse(readFileSync(f, 'utf-8'));
194
+ if (!obj || typeof obj !== 'object' || !obj.actions)
195
+ return null;
196
+ return obj;
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ }
202
+ /**
203
+ * Run an action on a macOS-backed skill. Returns the osascript outcome
204
+ * verbatim (caller decides how to render).
205
+ */
206
+ export function dispatchMacos(skillDir, action, call) {
207
+ const backend = loadMacosBackend(skillDir);
208
+ if (!backend) {
209
+ return { ok: false, stdout: '', stderr: 'no macos backend installed for this skill', exitCode: 2 };
210
+ }
211
+ const actionSpec = backend.actions[action];
212
+ if (!actionSpec) {
213
+ return { ok: false, stdout: '', stderr: `unknown action: ${action}`, exitCode: 2 };
214
+ }
215
+ // Resolve named args.
216
+ const ctx = {};
217
+ for (const arg of actionSpec.args ?? []) {
218
+ const v = resolveArg(arg, call);
219
+ if (v === null) {
220
+ return {
221
+ ok: false, stdout: '',
222
+ stderr: `missing required argument: ${arg.name} (from ${arg.from})`,
223
+ exitCode: 2,
224
+ };
225
+ }
226
+ ctx[arg.name] = v;
227
+ }
228
+ // Read + render the AppleScript template.
229
+ const scriptPath = join(skillDir, 'backends', 'macos', actionSpec.script);
230
+ if (!existsSync(scriptPath)) {
231
+ return { ok: false, stdout: '', stderr: `script not found: ${scriptPath}`, exitCode: 2 };
232
+ }
233
+ let tpl = '';
234
+ try {
235
+ tpl = readFileSync(scriptPath, 'utf-8');
236
+ }
237
+ catch (e) {
238
+ return { ok: false, stdout: '', stderr: `read script failed: ${e.message}`, exitCode: 2 };
239
+ }
240
+ const source = renderTemplate(tpl, ctx);
241
+ if (process.env.YOME_DEBUG_SKILL === '1') {
242
+ process.stderr.write(`── rendered ${actionSpec.script} ──\n${source}\n── end ──\n`);
243
+ }
244
+ // Two execution modes:
245
+ // 1) openViaLaunchServices — for actions that open a file in an app
246
+ // and then need to wait until the app reports it loaded.
247
+ // 2) plain osascript -e — everything else.
248
+ if (actionSpec.openViaLaunchServices) {
249
+ const filePath = String(ctx.path ?? ctx.positional ?? '');
250
+ const appName = backend.appName ?? '';
251
+ if (!filePath || !appName) {
252
+ return { ok: false, stdout: '', stderr: 'openViaLaunchServices requires {{path}} arg and backend.appName', exitCode: 2 };
253
+ }
254
+ let pollSrc = '';
255
+ if (actionSpec.pollScript) {
256
+ const p = join(skillDir, 'backends', 'macos', actionSpec.pollScript);
257
+ if (existsSync(p)) {
258
+ pollSrc = renderTemplate(readFileSync(p, 'utf-8'), ctx);
259
+ }
260
+ }
261
+ if (!pollSrc)
262
+ pollSrc = source; // fallback: poll with the main script
263
+ const r = openViaLaunchServices({
264
+ filePath,
265
+ appName,
266
+ pollScript: pollSrc,
267
+ });
268
+ return { ok: r.ok, stdout: r.stdout, stderr: r.stderr, exitCode: r.ok ? 0 : 1 };
269
+ }
270
+ return adapt(runOsascript(source, { timeoutMs: actionSpec.timeoutMs }));
271
+ }
272
+ function adapt(r) {
273
+ return { ok: r.ok, stdout: r.stdout, stderr: r.stderr, exitCode: r.exitCode };
274
+ }
275
+ export async function dispatchMacosBatchMerged(skillDir, entries, opts) {
276
+ const backend = loadMacosBackend(skillDir);
277
+ if (!backend) {
278
+ return { ok: false, stdout: '', stderr: 'no macos backend installed for this skill', exitCode: 2 };
279
+ }
280
+ // Render every entry. We fail fast on render errors (missing arg / unknown
281
+ // action) — those are user-facing bugs in the batch body, not runtime.
282
+ const blocks = [];
283
+ for (let i = 0; i < entries.length; i++) {
284
+ const e = entries[i];
285
+ const spec = backend.actions[e.action];
286
+ if (!spec) {
287
+ return {
288
+ ok: false, stdout: '',
289
+ stderr: `merge: unknown action '${e.action}' (line ${i + 1})`,
290
+ exitCode: 2,
291
+ };
292
+ }
293
+ if (spec.openViaLaunchServices) {
294
+ return {
295
+ ok: false, stdout: '',
296
+ stderr: `merge: action '${e.action}' uses Launch Services and cannot be merged ` +
297
+ `(line ${i + 1}). Re-run without --merge, or move it to its own batch.`,
298
+ exitCode: 2,
299
+ };
300
+ }
301
+ // Resolve args.
302
+ const ctx = {};
303
+ for (const arg of spec.args ?? []) {
304
+ const v = resolveArg(arg, e.call);
305
+ if (v === null) {
306
+ return {
307
+ ok: false, stdout: '',
308
+ stderr: `merge: line ${i + 1} (${e.action}): missing required arg ${arg.name}`,
309
+ exitCode: 2,
310
+ };
311
+ }
312
+ ctx[arg.name] = v;
313
+ }
314
+ const scriptPath = join(skillDir, 'backends', 'macos', spec.script);
315
+ if (!existsSync(scriptPath)) {
316
+ return {
317
+ ok: false, stdout: '',
318
+ stderr: `merge: script not found for ${e.action}: ${scriptPath}`,
319
+ exitCode: 2,
320
+ };
321
+ }
322
+ const tpl = readFileSync(scriptPath, 'utf-8');
323
+ const rendered = renderTemplate(tpl, ctx);
324
+ // Wrap each rendered block in a try so a single failure doesn't kill
325
+ // the whole script. We capture per-step result into a list so the
326
+ // outer return can report the full status TSV.
327
+ blocks.push(buildMergedBlock(i, e.action, rendered, opts.keepGoing));
328
+ }
329
+ const finalSource = `
330
+ -- yome-merged-batch (${entries.length} steps)
331
+ set results to {}
332
+ ${blocks.join('\n')}
333
+ set AppleScript's text item delimiters to linefeed
334
+ return results as string
335
+ `;
336
+ if (process.env.YOME_DEBUG_SKILL === '1') {
337
+ process.stderr.write(`── merged batch (${entries.length} steps) ──\n${finalSource}\n── end ──\n`);
338
+ }
339
+ const r = runOsascript(finalSource);
340
+ if (!r.ok && !r.stdout) {
341
+ return { ok: false, stdout: '', stderr: r.stderr, exitCode: r.exitCode };
342
+ }
343
+ // Parse per-step lines from osascript stdout. Each line:
344
+ // "<status>\t<idx>\t<action>\t<msg>"
345
+ const lines = r.stdout.split(/\n/).filter(Boolean);
346
+ let okCount = 0, failCount = 0;
347
+ const summary = [];
348
+ for (const line of lines) {
349
+ const parts = line.split('\t');
350
+ const status = parts[0];
351
+ const idx = parts[1] ?? '?';
352
+ const action = parts[2] ?? '?';
353
+ const msg = parts.slice(3).join('\t');
354
+ if (status === 'OK') {
355
+ okCount++;
356
+ summary.push(`✓ [${idx}] ${action}${msg ? ': ' + msg : ''}`);
357
+ }
358
+ else {
359
+ failCount++;
360
+ summary.push(`✗ [${idx}] ${action}: ${msg}`);
361
+ }
362
+ }
363
+ const tail = failCount === 0
364
+ ? `\n— merged batch ok (${entries.length} commands, single osascript)`
365
+ : `\n— merged batch: ${okCount}/${entries.length} ok, ${failCount} failed`;
366
+ return {
367
+ ok: failCount === 0,
368
+ stdout: summary.join('\n') + tail,
369
+ stderr: failCount === 0 ? '' : `${failCount} step(s) failed (see stdout for details)`,
370
+ exitCode: failCount === 0 ? 0 : 1,
371
+ };
372
+ }
373
+ /**
374
+ * Wrap a rendered .applescript snippet so:
375
+ * - Its return value (if any) is captured into the outer `results` list
376
+ * prefixed with status + idx + action so the TS side can demux.
377
+ * - Errors are caught and recorded as "FAIL".
378
+ * - When keepGoing is false the first failure throws to abort the rest.
379
+ *
380
+ * The trick: the rendered snippets are top-level AppleScript with their
381
+ * own `tell` blocks; we can't directly assign their `return` to a var.
382
+ * We wrap them in `run script` of a freshly-built handler instead — that
383
+ * lets us catch errors AND collect the result.
384
+ */
385
+ function buildMergedBlock(idx, action, source, keepGoing) {
386
+ // Escape source for embedding inside an AppleScript string literal.
387
+ const escaped = source.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
388
+ const tag = `[${idx + 1}] ${action}`;
389
+ const onError = keepGoing
390
+ ? '' // swallow + continue
391
+ : 'error errMsg'; // re-throw to abort the rest of the batch
392
+ return `
393
+ try
394
+ set stepSrc to "${escaped}"
395
+ set stepResult to (run script stepSrc)
396
+ if stepResult is missing value then
397
+ set end of results to "OK\t${idx + 1}\t${action}\t"
398
+ else
399
+ set end of results to "OK\t${idx + 1}\t${action}\t" & (stepResult as string)
400
+ end if
401
+ on error errMsg
402
+ set end of results to "FAIL\t${idx + 1}\t${action}\t" & errMsg
403
+ ${onError}
404
+ end try
405
+ `;
406
+ }
407
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../src/skills/runner/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface KernelResult {
2
+ /** false → caller (Bash tool) should run the line via /bin/sh as usual. */
3
+ handled: boolean;
4
+ stdout: string;
5
+ stderr: string;
6
+ exitCode: number;
7
+ }
8
+ export declare function tryKernel(commandLine: string): Promise<KernelResult>;