@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,32 @@
1
+ export interface SubmitOptions {
2
+ /** Path to a bundle directory produced by `yome thread share`. */
3
+ bundleDir: string;
4
+ /** Skill slug (e.g. "@yome/ppt") — used to discover repo from manifest. */
5
+ skillSlug: string;
6
+ /** Case id; will be the name of the cases/<slug>/<caseId>/ directory. */
7
+ caseId?: string;
8
+ /** Override commit/PR title. Default: "case: add <caseId> for <skillSlug>". */
9
+ title?: string;
10
+ /** Override PR body. Default: a generated summary referencing the bundle README. */
11
+ body?: string;
12
+ /**
13
+ * If true, do everything **except** `git push` and `gh pr create` —
14
+ * useful for local diagnostics.
15
+ */
16
+ dryRun?: boolean;
17
+ /** Verbose: print every shelled command + its stdout. */
18
+ verbose?: boolean;
19
+ }
20
+ export type SubmitResult = {
21
+ ok: true;
22
+ prUrl?: string;
23
+ branch: string;
24
+ caseId: string;
25
+ cloneDir: string;
26
+ upstream: string;
27
+ } | {
28
+ ok: false;
29
+ reason: string;
30
+ cloneDir?: string;
31
+ };
32
+ export declare function submitBundle(opts: SubmitOptions): SubmitResult;
@@ -0,0 +1,199 @@
1
+ // cli/src/threadSubmit.ts — push a redacted bundle as a PR to a skill's repo.
2
+ //
3
+ // Spec 9.1 step 5 (token-bound path). The "no GitHub token / hub-bot relay"
4
+ // path is deferred to Phase 3 once the hub backend exists.
5
+ //
6
+ // Pipeline (all done via the locally-installed `gh` CLI; we shell out and
7
+ // never import @octokit/rest, keeping the CLI install tiny):
8
+ //
9
+ // 1. Resolve target repo from skill manifest (slug → installed manifest →
10
+ // `repo` field, e.g. https://github.com/yome-official/yome-skill-ppt).
11
+ // 2. `gh auth status` — fail fast with a clear message if not signed in.
12
+ // 3. `gh repo fork <upstream> --clone --remote=false` into a tmp dir.
13
+ // 4. `git checkout -b case/<slug>-<caseId>`
14
+ // 5. Copy bundle/* → cases/<slugBase>/<caseId>/
15
+ // 6. `git add -A && git commit -m "<title>"` (signed-off optional)
16
+ // 7. `git push --set-upstream origin case/<slug>-<caseId>`
17
+ // 8. `gh pr create --repo <upstream> --title "..." --body "..."`
18
+ // 9. Return PR URL.
19
+ //
20
+ // We do NOT delete the tmp clone — leave it for the user to inspect / amend.
21
+ import { spawnSync } from 'node:child_process';
22
+ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, statSync, copyFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { basename, join, resolve } from 'node:path';
25
+ import { readManifest } from './yomeSkills/manifest.js';
26
+ import { installPathForSlug, parseSlug } from './yomeSkills/paths.js';
27
+ const REPO_URL_RE = /^https?:\/\/github\.com\/([^/]+\/[^/.\s]+?)(?:\.git)?\/?$/;
28
+ /**
29
+ * Look up a skill's upstream GitHub repo from `~/.yome/skills/<owner>/<name>/`.
30
+ * Falls back to the monorepo `skills/yome-skill-<domain>/` if not installed.
31
+ */
32
+ function lookupUpstream(skillSlug) {
33
+ // 1. Try installed location first
34
+ const installPath = installPathForSlug(skillSlug);
35
+ let manifest = installPath ? readManifest(installPath) : null;
36
+ // 2. Fall back to monorepo
37
+ if (!manifest) {
38
+ const parsed = parseSlug(skillSlug);
39
+ if (parsed) {
40
+ const monorepoPath = resolve(process.cwd(), 'skills', `yome-skill-${parsed.name}`);
41
+ if (existsSync(join(monorepoPath, 'yome-skill.json'))) {
42
+ manifest = readManifest(monorepoPath);
43
+ }
44
+ }
45
+ }
46
+ if (!manifest) {
47
+ return { ok: false, reason: `skill ${skillSlug} not found locally — install it first or run from monorepo root` };
48
+ }
49
+ if (!manifest.repo) {
50
+ return { ok: false, reason: `skill ${skillSlug} manifest has no "repo" field — cannot determine upstream` };
51
+ }
52
+ const m = REPO_URL_RE.exec(manifest.repo.trim());
53
+ if (!m) {
54
+ return { ok: false, reason: `skill ${skillSlug} manifest "repo" is not a github.com URL: ${manifest.repo}` };
55
+ }
56
+ return { fullName: m[1], manifest };
57
+ }
58
+ /** Run a shell command, capturing stdout/stderr. Throws nothing — caller checks status. */
59
+ function run(cmd, args, cwd, verbose) {
60
+ if (verbose) {
61
+ const inDir = cwd ? ` (in ${cwd})` : '';
62
+ // eslint-disable-next-line no-console
63
+ console.log(`$ ${cmd} ${args.join(' ')}${inDir}`);
64
+ }
65
+ const result = spawnSync(cmd, args, { cwd, encoding: 'utf-8', env: process.env });
66
+ if (verbose && result.stdout)
67
+ console.log(result.stdout.trimEnd());
68
+ if (verbose && result.stderr)
69
+ console.error(result.stderr.trimEnd());
70
+ return result;
71
+ }
72
+ function ghIsInstalled() {
73
+ const r = spawnSync('gh', ['--version'], { encoding: 'utf-8' });
74
+ return r.status === 0;
75
+ }
76
+ function ghIsAuthed(verbose) {
77
+ const r = run('gh', ['auth', 'status'], undefined, verbose);
78
+ if (r.status === 0)
79
+ return { ok: true };
80
+ return { ok: false, reason: r.stderr?.trim() || 'gh auth status failed (run: gh auth login)' };
81
+ }
82
+ function copyBundleInto(srcDir, dest) {
83
+ if (!existsSync(dest))
84
+ mkdirSync(dest, { recursive: true });
85
+ let count = 0;
86
+ for (const entry of readdirSync(srcDir)) {
87
+ if (entry === '.git' || entry === 'node_modules' || entry === '.DS_Store')
88
+ continue;
89
+ const s = join(srcDir, entry);
90
+ const d = join(dest, entry);
91
+ const st = statSync(s);
92
+ if (st.isDirectory()) {
93
+ count += copyBundleInto(s, d);
94
+ }
95
+ else if (st.isFile()) {
96
+ copyFileSync(s, d);
97
+ count++;
98
+ }
99
+ }
100
+ return count;
101
+ }
102
+ function defaultCaseId(bundleDir) {
103
+ // Bundles default to <sessionId>-<timestamp>; the basename is already unique.
104
+ return basename(bundleDir).slice(0, 60);
105
+ }
106
+ function defaultTitle(skillSlug, caseId) {
107
+ return `case: add ${caseId} for ${skillSlug}`;
108
+ }
109
+ function defaultBody(skillSlug, caseId, bundleDir) {
110
+ let bundleReadme = '';
111
+ try {
112
+ bundleReadme = readFileSync(join(bundleDir, 'README.md'), 'utf-8');
113
+ }
114
+ catch {
115
+ /* missing README is fine */
116
+ }
117
+ return `Adds a new replayable case for **${skillSlug}** under \`cases/${parseSlug(skillSlug)?.name ?? 'unknown'}/${caseId}/\`.
118
+
119
+ Submitted via \`yome thread share --submit\`. The bundle was redacted on-device using the default ThreadRedactor rules (email / phone / api-key / path / mind).
120
+
121
+ ---
122
+
123
+ ${bundleReadme}`;
124
+ }
125
+ export function submitBundle(opts) {
126
+ if (!existsSync(opts.bundleDir)) {
127
+ return { ok: false, reason: `bundle directory does not exist: ${opts.bundleDir}` };
128
+ }
129
+ if (!existsSync(join(opts.bundleDir, 'thread.json'))) {
130
+ return { ok: false, reason: `${opts.bundleDir} is not a valid bundle (missing thread.json)` };
131
+ }
132
+ if (!ghIsInstalled()) {
133
+ return { ok: false, reason: 'gh CLI is not installed (https://cli.github.com). Install it then run: gh auth login' };
134
+ }
135
+ const auth = ghIsAuthed(!!opts.verbose);
136
+ if (!auth.ok) {
137
+ return { ok: false, reason: `gh CLI not authenticated: ${auth.reason}\nRun: gh auth login\n\n(The token-less hub-bot relay path is planned for Phase 3 and not yet implemented.)` };
138
+ }
139
+ const upstreamLookup = lookupUpstream(opts.skillSlug);
140
+ if ('ok' in upstreamLookup && upstreamLookup.ok === false)
141
+ return upstreamLookup;
142
+ const { fullName: upstream, manifest } = upstreamLookup;
143
+ const caseId = opts.caseId ?? defaultCaseId(opts.bundleDir);
144
+ const branch = `case/${manifest.domain}-${caseId}`;
145
+ const title = opts.title ?? defaultTitle(opts.skillSlug, caseId);
146
+ const body = opts.body ?? defaultBody(opts.skillSlug, caseId, opts.bundleDir);
147
+ // Clone into ~/.yome/shares/.work/<random>/<repo>
148
+ const workRoot = join(homedir(), '.yome', 'shares', '.work');
149
+ if (!existsSync(workRoot))
150
+ mkdirSync(workRoot, { recursive: true });
151
+ const tmpDir = mkdtempSync(join(workRoot, 'submit-'));
152
+ const cloneDir = join(tmpDir, basename(upstream));
153
+ // 1. fork + clone. `gh repo fork ... --clone -- <git-clone-args>` lets us
154
+ // pass `--depth` and the target directory through to git clone.
155
+ const forkResult = run('gh', ['repo', 'fork', upstream, '--clone', '--', '--depth=20', cloneDir], undefined, !!opts.verbose);
156
+ if (forkResult.status !== 0) {
157
+ return { ok: false, reason: `gh repo fork failed: ${forkResult.stderr?.trim()}`, cloneDir };
158
+ }
159
+ // 2. checkout new branch
160
+ const checkout = run('git', ['checkout', '-b', branch], cloneDir, !!opts.verbose);
161
+ if (checkout.status !== 0) {
162
+ return { ok: false, reason: `git checkout -b failed: ${checkout.stderr?.trim()}`, cloneDir };
163
+ }
164
+ // 3. copy bundle into cases/<domain>/<caseId>/
165
+ const targetRel = join('cases', manifest.domain, caseId);
166
+ const targetAbs = join(cloneDir, targetRel);
167
+ if (existsSync(targetAbs)) {
168
+ return { ok: false, reason: `cases/${manifest.domain}/${caseId}/ already exists in fork — pass a different --case-id`, cloneDir };
169
+ }
170
+ const copied = copyBundleInto(opts.bundleDir, targetAbs);
171
+ if (copied === 0) {
172
+ return { ok: false, reason: 'bundle is empty (no files copied)', cloneDir };
173
+ }
174
+ // 4. commit
175
+ const add = run('git', ['add', '-A'], cloneDir, !!opts.verbose);
176
+ if (add.status !== 0) {
177
+ return { ok: false, reason: `git add failed: ${add.stderr?.trim()}`, cloneDir };
178
+ }
179
+ const commit = run('git', ['commit', '-m', title], cloneDir, !!opts.verbose);
180
+ if (commit.status !== 0) {
181
+ return { ok: false, reason: `git commit failed: ${commit.stderr?.trim()}`, cloneDir };
182
+ }
183
+ if (opts.dryRun) {
184
+ return { ok: true, branch, caseId, cloneDir, upstream };
185
+ }
186
+ // 5. push
187
+ const push = run('git', ['push', '--set-upstream', 'origin', branch], cloneDir, !!opts.verbose);
188
+ if (push.status !== 0) {
189
+ return { ok: false, reason: `git push failed: ${push.stderr?.trim()}`, cloneDir };
190
+ }
191
+ // 6. open PR
192
+ const pr = run('gh', ['pr', 'create', '--repo', upstream, '--title', title, '--body', body, '--head', branch], cloneDir, !!opts.verbose);
193
+ if (pr.status !== 0) {
194
+ return { ok: false, reason: `gh pr create failed: ${pr.stderr?.trim()}`, cloneDir };
195
+ }
196
+ const prUrl = pr.stdout?.trim().split('\n').pop() || undefined;
197
+ return { ok: true, prUrl, branch, caseId, cloneDir, upstream };
198
+ }
199
+ //# sourceMappingURL=threadSubmit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadSubmit.js","sourceRoot":"","sources":["../src/threadSubmit.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,24 @@
1
1
  import { spawn } from 'child_process';
2
2
  import { isContentAllowed, isContentDenied } from '../permissions/checker.js';
3
+ import { tryKernel } from '../skills/runner/kernel.js';
3
4
  const MAX_OUTPUT = 20_000;
4
- function runCommand(command, timeout) {
5
+ // Cap per-stream buffer to 4× the output limit. Without this, a runaway
6
+ // command (`cat /dev/urandom`, broken `npm run build`) accumulates an
7
+ // unbounded JS string in memory before we ever get to truncate it.
8
+ // This is the difference between "tool reports truncated" and "node
9
+ // process gets OOM-killed mid-session".
10
+ const MAX_BUFFER = MAX_OUTPUT * 4;
11
+ // ── Yome agentic kernel intercept ─────────────────────────────────
12
+ //
13
+ // Before we hand a command off to /bin/sh we ask the yome kernel whether
14
+ // it owns the line. If `tokens[0]` matches the `domain` of an installed
15
+ // hub skill, the kernel runs the action via the same dispatcher the
16
+ // macOS app uses (with capability gating, AppleScript template render,
17
+ // argv parsing, --help) and returns a synthetic stdout/stderr/exitCode.
18
+ //
19
+ // Anything the kernel doesn't claim falls through to plain shell.
20
+ // Compound shell (pipes, &&, ;, redirects, subshells) is never intercepted.
21
+ function runShell(command, timeout) {
5
22
  return new Promise((resolve) => {
6
23
  const proc = spawn('sh', ['-c', command], {
7
24
  cwd: process.cwd(),
@@ -10,15 +27,41 @@ function runCommand(command, timeout) {
10
27
  });
11
28
  let stdout = '';
12
29
  let stderr = '';
30
+ let stdoutOverflow = false;
31
+ let stderrOverflow = false;
13
32
  let killed = false;
14
33
  const timer = setTimeout(() => {
15
34
  killed = true;
16
35
  proc.kill('SIGTERM');
17
36
  }, timeout);
18
- proc.stdout.on('data', (data) => { stdout += data.toString(); });
19
- proc.stderr.on('data', (data) => { stderr += data.toString(); });
37
+ // Stream-side cap: once a buffer hits MAX_BUFFER chars we stop
38
+ // accumulating from that pipe. The child can keep running (we don't
39
+ // want to break commands that legitimately produce a lot of output —
40
+ // tests, builds, etc.) but the agent's memory stays bounded.
41
+ proc.stdout.on('data', (data) => {
42
+ if (stdoutOverflow)
43
+ return;
44
+ stdout += data.toString();
45
+ if (stdout.length > MAX_BUFFER) {
46
+ stdout = stdout.slice(0, MAX_BUFFER);
47
+ stdoutOverflow = true;
48
+ }
49
+ });
50
+ proc.stderr.on('data', (data) => {
51
+ if (stderrOverflow)
52
+ return;
53
+ stderr += data.toString();
54
+ if (stderr.length > MAX_BUFFER) {
55
+ stderr = stderr.slice(0, MAX_BUFFER);
56
+ stderrOverflow = true;
57
+ }
58
+ });
20
59
  proc.on('close', (code) => {
21
60
  clearTimeout(timer);
61
+ if (stdoutOverflow)
62
+ stdout += `\n[stdout capped at ${MAX_BUFFER} chars]`;
63
+ if (stderrOverflow)
64
+ stderr += `\n[stderr capped at ${MAX_BUFFER} chars]`;
22
65
  if (killed) {
23
66
  resolve({ stdout, stderr: `Command timed out after ${timeout / 1000}s`, exitCode: 124 });
24
67
  }
@@ -32,9 +75,23 @@ function runCommand(command, timeout) {
32
75
  });
33
76
  });
34
77
  }
78
+ function formatOutput(stdout, stderr, exitCode) {
79
+ if (exitCode === 0) {
80
+ const result = stdout.trim();
81
+ if (result.length > MAX_OUTPUT) {
82
+ return result.slice(0, MAX_OUTPUT) + `\n\n[Output truncated at ${MAX_OUTPUT} chars]`;
83
+ }
84
+ return result || '(no output)';
85
+ }
86
+ const output = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
87
+ return `Exit code: ${exitCode}\n${output}`;
88
+ }
35
89
  export const bashTool = {
36
90
  name: 'Bash',
37
- description: 'Execute a shell command and return its output. Commands run in the current working directory.',
91
+ description: 'Execute a shell command and return its output. Commands run in the current working directory. ' +
92
+ 'When the first token matches an installed hub skill domain (e.g. `ppt`), the yome agentic kernel ' +
93
+ 'intercepts the line and dispatches to the skill instead of the system shell — capability checks ' +
94
+ 'are enforced. Compound shell (pipes, &&, ;, redirects) always goes to /bin/sh.',
38
95
  inputSchema: {
39
96
  type: 'object',
40
97
  properties: {
@@ -63,16 +120,14 @@ export const bashTool = {
63
120
  async execute(input) {
64
121
  const command = input.command;
65
122
  const timeout = (input.timeout || 30) * 1000;
66
- const { stdout, stderr, exitCode } = await runCommand(command, timeout);
67
- if (exitCode === 0) {
68
- const result = stdout.trim();
69
- if (result.length > MAX_OUTPUT) {
70
- return result.slice(0, MAX_OUTPUT) + `\n\n[Output truncated at ${MAX_OUTPUT} chars]`;
71
- }
72
- return result || '(no output)';
123
+ // Try the yome kernel first.
124
+ const k = await tryKernel(command);
125
+ if (k.handled) {
126
+ return formatOutput(k.stdout, k.stderr, k.exitCode);
73
127
  }
74
- const output = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
75
- return `Exit code: ${exitCode}\n${output}`;
128
+ // Otherwise, real shell.
129
+ const { stdout, stderr, exitCode } = await runShell(command, timeout);
130
+ return formatOutput(stdout, stderr, exitCode);
76
131
  },
77
132
  };
78
133
  //# sourceMappingURL=bash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE9E,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,SAAS,UAAU,CAAC,OAAe,EAAE,OAAe;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,2BAA2B,OAAO,GAAG,IAAI,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,+FAA+F;IAC5G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACxE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;SAC7E;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,gBAAgB,CAAC,KAA8B,EAAE,GAA0B;QACzE,MAAM,OAAO,GAAI,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAC;QAChD,IAAI,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sCAAsC,OAAO,EAAE,EAAE,CAAC;QACxF,CAAC;QACD,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,OAAO,GAAG,EAAE,CAAC;IAChF,CAAC;IACD,aAAa,CAAC,KAAK;QACjB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,KAAK;QACjB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;QACxC,MAAM,OAAO,GAAG,CAAE,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QAEzD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAExE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,4BAA4B,UAAU,SAAS,CAAC;YACvF,CAAC;YACD,OAAO,MAAM,IAAI,aAAa,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,cAAc,QAAQ,KAAK,MAAM,EAAE,CAAC;IAC7C,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,31 @@ export declare function registerTool(tool: ToolDef): void;
5
5
  export declare function getToolByName(name: string): ToolDef | undefined;
6
6
  export declare function getAllTools(): ToolDef[];
7
7
  export declare function getAnthropicTools(): AnthropicTool[];
8
+ /**
9
+ * Result returned by the UI after the user resolves an approval prompt.
10
+ * - allow: proceed with this single invocation
11
+ * - deny: refuse this invocation; optional `feedback` is forwarded to the model
12
+ * and `abort` cancels the rest of the current tool_use batch
13
+ */
14
+ export type AskPermissionResult = {
15
+ decision: 'allow';
16
+ } | {
17
+ decision: 'deny';
18
+ feedback?: string;
19
+ abort?: boolean;
20
+ };
8
21
  export declare function setPermissionContext(ctx: ToolPermissionContext): void;
9
22
  export declare function getPermissionContext(): ToolPermissionContext | null;
10
23
  /**
11
24
  * Register a callback that will be called when a tool requires user approval.
12
- * Return true to allow, false to deny.
25
+ * Return an AskPermissionResult describing the user's choice.
26
+ */
27
+ export declare function setAskPermissionHandler(fn: (toolName: string, message: string, input: Record<string, unknown>) => Promise<AskPermissionResult>): void;
28
+ /**
29
+ * Sentinel substring embedded in tool_result content when the user explicitly
30
+ * rejects a tool_use. Loops detect this prefix to short-circuit the remaining
31
+ * tool_use blocks in the same model turn (mirrors claude-code's REJECT_MESSAGE
32
+ * + cancelAndAbort behavior).
13
33
  */
14
- export declare function setAskPermissionHandler(fn: (toolName: string, message: string, input: Record<string, unknown>) => Promise<boolean>): void;
34
+ export declare const REJECT_SENTINEL = "[YOME_PERMISSION_DENIED]";
15
35
  export declare function executeTool(name: string, input: Record<string, unknown>, signal?: AbortSignal): Promise<string>;
@@ -7,6 +7,11 @@ import { globTool } from './glob.js';
7
7
  import { grepTool } from './grep.js';
8
8
  import { lsTool } from './ls.js';
9
9
  const DEFAULT_MAX_RESULT_CHARS = 20_000;
10
+ // NOTE: We deliberately do NOT register a `SkillCall` tool any more.
11
+ // Hub skill invocations are handled by the agentic bash kernel — the
12
+ // model just emits `<domain> <action> ...` through the Bash tool and
13
+ // `tryKernel()` (in cli/src/skills/runner/kernel.ts) routes it to the
14
+ // same dispatcher SkillCall used to use, with capability checks intact.
10
15
  export const BASE_TOOLS = [
11
16
  readTool,
12
17
  editTool,
@@ -47,11 +52,33 @@ export function getPermissionContext() {
47
52
  }
48
53
  /**
49
54
  * Register a callback that will be called when a tool requires user approval.
50
- * Return true to allow, false to deny.
55
+ * Return an AskPermissionResult describing the user's choice.
51
56
  */
52
57
  export function setAskPermissionHandler(fn) {
53
58
  _askPermissionFn = fn;
54
59
  }
60
+ /**
61
+ * Sentinel substring embedded in tool_result content when the user explicitly
62
+ * rejects a tool_use. Loops detect this prefix to short-circuit the remaining
63
+ * tool_use blocks in the same model turn (mirrors claude-code's REJECT_MESSAGE
64
+ * + cancelAndAbort behavior).
65
+ */
66
+ export const REJECT_SENTINEL = '[YOME_PERMISSION_DENIED]';
67
+ const DENIAL_GUIDANCE = 'IMPORTANT: You may attempt the user\'s underlying goal with a different tool or approach, ' +
68
+ 'but do not try to bypass the intent of this denial. If you cannot proceed without this ' +
69
+ 'capability, stop and explain to the user what you were trying to do and why.';
70
+ function buildRejectMessage(toolName, feedback) {
71
+ const base = `${REJECT_SENTINEL} The user rejected the ${toolName} tool use. ` +
72
+ `The action was NOT performed (no files changed, no commands executed). ` +
73
+ `Stop the current plan and wait for the user's next instruction unless they provided guidance below.`;
74
+ const tail = feedback && feedback.trim()
75
+ ? `\nUser feedback: ${feedback.trim()}`
76
+ : '';
77
+ return `${base}${tail}\n${DENIAL_GUIDANCE}`;
78
+ }
79
+ function buildAutoDenyMessage(toolName, reason) {
80
+ return `${REJECT_SENTINEL} Permission to use ${toolName} was denied by a configured rule: ${reason}. ${DENIAL_GUIDANCE}`;
81
+ }
55
82
  export async function executeTool(name, input, signal) {
56
83
  const tool = toolMap.get(name);
57
84
  if (!tool)
@@ -68,13 +95,22 @@ export async function executeTool(name, input, signal) {
68
95
  const toolResult = tool.checkPermissions?.(input, _permCtx);
69
96
  const decision = checkPermission(tool.name, tool.isReadOnly(), _permCtx, toolResult ?? undefined);
70
97
  if (decision.behavior === 'deny') {
71
- return `Permission denied: ${decision.message}`;
98
+ return buildAutoDenyMessage(tool.name, decision.message);
72
99
  }
73
100
  if (decision.behavior === 'ask') {
74
101
  if (_askPermissionFn) {
75
- const allowed = await _askPermissionFn(tool.name, decision.message, input);
76
- if (!allowed) {
77
- return `Permission denied by user for ${tool.name}.`;
102
+ const result = await _askPermissionFn(tool.name, decision.message, input);
103
+ if (result.decision === 'deny') {
104
+ if (result.abort) {
105
+ // Hard abort — caller listens on its own AbortSignal but we still
106
+ // return a synthetic tool_result so the model gets a chance to see
107
+ // why we stopped before the loop short-circuits.
108
+ try {
109
+ signal?.controller?.abort?.();
110
+ }
111
+ catch { /* noop */ }
112
+ }
113
+ return buildRejectMessage(tool.name, result.feedback);
78
114
  }
79
115
  }
80
116
  // If no handler is registered, fall through and allow (default permissive)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDef } from '../types.js';
2
+ export declare const skillCallTool: ToolDef;
@@ -0,0 +1,77 @@
1
+ // cli/src/tools/skillCall.ts
2
+ //
3
+ // `SkillCall` — agent tool that invokes an action on an installed yome
4
+ // hub skill. This is the only correct way for the LLM to use hub skills;
5
+ // it must NOT try to map them to ad-hoc shell commands like
6
+ // `yome ppt new` (the model used to do that — `Bash(yome ppt new)`
7
+ // always fails since there's no such CLI subcommand).
8
+ //
9
+ // Input shape (kept minimal so the system prompt can teach it cheaply):
10
+ //
11
+ // {
12
+ // "slug": "@yome/ppt",
13
+ // "action": "new",
14
+ // "positionals": ["/Users/me/Desktop/hello.pptx"],
15
+ // "flags": { "force": true }
16
+ // }
17
+ //
18
+ // Output is the dispatcher's stdout (or stderr prefixed with "ERROR:").
19
+ import { invokeSkill } from '../yomeSkills/invoke.js';
20
+ export const skillCallTool = {
21
+ name: 'SkillCall',
22
+ description: 'Invoke an action on an installed yome hub skill. ' +
23
+ 'Use this whenever the user asks to do something that an installed skill (`yome skill list`) supports — ' +
24
+ 'for example creating/editing a PowerPoint with @yome/ppt. ' +
25
+ 'Do NOT shell out to commands like "yome ppt new" — those do not exist; only this tool dispatches skills.',
26
+ inputSchema: {
27
+ type: 'object',
28
+ properties: {
29
+ slug: {
30
+ type: 'string',
31
+ description: 'Skill slug like "@yome/ppt", or just the domain like "ppt".',
32
+ },
33
+ action: {
34
+ type: 'string',
35
+ description: 'Action name from the skill\'s command list (e.g. "new", "open", "slide.add", "title", "save", "export").',
36
+ },
37
+ positionals: {
38
+ type: 'array',
39
+ items: { type: 'string' },
40
+ description: 'Positional arguments. For ppt.new this is the .pptx path.',
41
+ },
42
+ flags: {
43
+ type: 'object',
44
+ description: 'Named flags. Values are strings, numbers, or booleans.',
45
+ },
46
+ },
47
+ required: ['slug', 'action'],
48
+ },
49
+ isReadOnly: () => false,
50
+ validateInput(input) {
51
+ if (typeof input.slug !== 'string' || input.slug.length === 0) {
52
+ return { valid: false, error: 'slug must be a non-empty string' };
53
+ }
54
+ if (typeof input.action !== 'string' || input.action.length === 0) {
55
+ return { valid: false, error: 'action must be a non-empty string' };
56
+ }
57
+ if (input.positionals !== undefined && !Array.isArray(input.positionals)) {
58
+ return { valid: false, error: 'positionals must be an array of strings' };
59
+ }
60
+ if (input.flags !== undefined && (typeof input.flags !== 'object' || Array.isArray(input.flags))) {
61
+ return { valid: false, error: 'flags must be an object' };
62
+ }
63
+ return { valid: true };
64
+ },
65
+ async execute(input) {
66
+ const slug = String(input.slug);
67
+ const action = String(input.action);
68
+ const positionals = input.positionals ?? [];
69
+ const flags = input.flags ?? {};
70
+ const r = await invokeSkill({ slugOrDomain: slug, action, positionals, flags });
71
+ if (!r.ok) {
72
+ return `ERROR (exit ${r.exitCode}): ${r.stderr || '(no stderr)'}`;
73
+ }
74
+ return r.stdout || '(no output)';
75
+ },
76
+ };
77
+ //# sourceMappingURL=skillCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCall.js","sourceRoot":"","sources":["../../src/tools/skillCall.ts"],"names":[],"mappings":"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"}
@@ -21,12 +21,12 @@ export function AgentPicker({ options, onSelect, onCancel }) {
21
21
  }
22
22
  });
23
23
  const maxNameLen = Math.max(...options.map((o) => o.name.length));
24
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Agent Loop" }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " select with ", '\u2191\u2193', ", confirm with Enter, Esc to cancel"] })] }), options.map((opt, i) => {
24
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "#E87B35", children: "Agent Loop" }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " select with ", '\u2191\u2193', ", confirm with Enter, Esc to cancel"] })] }), options.map((opt, i) => {
25
25
  const isFocused = i === cursor;
26
26
  const pointer = isFocused ? '\u276F' : ' ';
27
- const nameColor = opt.active ? 'green' : isFocused ? 'cyan' : undefined;
27
+ const nameColor = opt.active ? '#E87B35' : isFocused ? '#E87B35' : undefined;
28
28
  const padded = opt.name.padEnd(maxNameLen + 2);
29
- return (_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? 'cyan' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: nameColor, children: padded }), opt.active && _jsx(Text, { color: "green", dimColor: true, children: ' (active) ' }), !opt.active && _jsx(Text, { children: ' ' }), _jsx(Text, { dimColor: !isFocused, color: isFocused ? 'white' : undefined, children: opt.description })] }, opt.name));
29
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? '#E87B35' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: nameColor, children: padded }), opt.active && _jsx(Text, { color: "#E87B35", dimColor: true, children: ' (active) ' }), !opt.active && _jsx(Text, { children: ' ' }), _jsx(Text, { dimColor: !isFocused, children: opt.description })] }, opt.name));
30
30
  }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Enter select ", ' ', " Esc cancel"] }) })] }));
31
31
  }
32
32
  //# sourceMappingURL=AgentPicker.js.map