zelari-code 1.24.0 → 1.26.0

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 (63) hide show
  1. package/README.md +6 -3
  2. package/bin/zelari-code.js +44 -12
  3. package/dist/cli/app.js +4 -3
  4. package/dist/cli/app.js.map +1 -1
  5. package/dist/cli/atMentions.js +179 -0
  6. package/dist/cli/atMentions.js.map +1 -0
  7. package/dist/cli/buildPolicy.js +1 -1
  8. package/dist/cli/buildPolicy.js.map +1 -1
  9. package/dist/cli/companion/config.js +172 -0
  10. package/dist/cli/companion/config.js.map +1 -0
  11. package/dist/cli/companion/runManager.js +250 -0
  12. package/dist/cli/companion/runManager.js.map +1 -0
  13. package/dist/cli/companion/serve.js +376 -0
  14. package/dist/cli/companion/serve.js.map +1 -0
  15. package/dist/cli/components/InputBar.js +1 -1
  16. package/dist/cli/components/InputBar.js.map +1 -1
  17. package/dist/cli/components/StatusBar.js +7 -2
  18. package/dist/cli/components/StatusBar.js.map +1 -1
  19. package/dist/cli/generateSkillFromUrl.js +236 -0
  20. package/dist/cli/generateSkillFromUrl.js.map +1 -0
  21. package/dist/cli/headless.js +3 -3
  22. package/dist/cli/headless.js.map +1 -1
  23. package/dist/cli/hooks/useChatTurn.js +16 -12
  24. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  25. package/dist/cli/hooks/useSlashDispatch.js +27 -7
  26. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  27. package/dist/cli/main.bundled.js +3347 -1038
  28. package/dist/cli/main.bundled.js.map +4 -4
  29. package/dist/cli/main.js +156 -1
  30. package/dist/cli/main.js.map +1 -1
  31. package/dist/cli/missionSlice.js +7 -6
  32. package/dist/cli/missionSlice.js.map +1 -1
  33. package/dist/cli/mode.js +21 -7
  34. package/dist/cli/mode.js.map +1 -1
  35. package/dist/cli/phase.js +1 -1
  36. package/dist/cli/provider/openai-compatible.js +164 -41
  37. package/dist/cli/provider/openai-compatible.js.map +1 -1
  38. package/dist/cli/runHeadless.js +24 -6
  39. package/dist/cli/runHeadless.js.map +1 -1
  40. package/dist/cli/skillCategories.js +15 -0
  41. package/dist/cli/skillCategories.js.map +1 -0
  42. package/dist/cli/skillConfigIo.js +285 -0
  43. package/dist/cli/skillConfigIo.js.map +1 -0
  44. package/dist/cli/slashCommands.js +31 -11
  45. package/dist/cli/slashCommands.js.map +1 -1
  46. package/dist/cli/slashHandlers/skills.js +30 -0
  47. package/dist/cli/slashHandlers/skills.js.map +1 -1
  48. package/dist/cli/toolRegistry.js +9 -4
  49. package/dist/cli/toolRegistry.js.map +1 -1
  50. package/dist/cli/tools/krakenLive.js +107 -0
  51. package/dist/cli/tools/krakenLive.js.map +1 -0
  52. package/dist/cli/tools/krakenModel.js +115 -0
  53. package/dist/cli/tools/krakenModel.js.map +1 -0
  54. package/dist/cli/tools/krakenRadio.js +95 -0
  55. package/dist/cli/tools/krakenRadio.js.map +1 -0
  56. package/dist/cli/tools/krakenWorktree.js +245 -0
  57. package/dist/cli/tools/krakenWorktree.js.map +1 -0
  58. package/dist/cli/tools/taskTool.js +206 -14
  59. package/dist/cli/tools/taskTool.js.map +1 -1
  60. package/dist/cli/workspace/composeContext.js +2 -2
  61. package/dist/cli/workspace/composeContext.js.map +1 -1
  62. package/package.json +4 -3
  63. package/scripts/start-companion-serve.ps1 +43 -0
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Spawn headless CLI runs and multiplex NDJSON events for companion clients.
3
+ * Single-flight (one active run), matching Desktop v0.1.
4
+ */
5
+ import { spawn } from 'node:child_process';
6
+ import { createInterface } from 'node:readline';
7
+ import { randomUUID } from 'node:crypto';
8
+ import { writeFileSync, unlinkSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { tmpdir } from 'node:os';
11
+ export class RunManager {
12
+ active = null;
13
+ recent = [];
14
+ getActive() {
15
+ return this.active?.run ?? null;
16
+ }
17
+ getRun(id) {
18
+ if (this.active?.run.id === id)
19
+ return this.active.run;
20
+ return this.recent.find((r) => r.id === id) ?? null;
21
+ }
22
+ listRecent(limit = 20) {
23
+ const cur = this.active ? [this.active.run] : [];
24
+ return [...cur, ...this.recent].slice(0, limit);
25
+ }
26
+ subscribe(runId, fn) {
27
+ if (this.active?.run.id === runId) {
28
+ // Replay buffered events then live
29
+ for (const ev of this.active.run.events) {
30
+ try {
31
+ fn(ev);
32
+ }
33
+ catch {
34
+ /* ignore */
35
+ }
36
+ }
37
+ this.active.listeners.add(fn);
38
+ return () => {
39
+ this.active?.listeners.delete(fn);
40
+ };
41
+ }
42
+ const past = this.recent.find((r) => r.id === runId);
43
+ if (past) {
44
+ for (const ev of past.events) {
45
+ try {
46
+ fn(ev);
47
+ }
48
+ catch {
49
+ /* ignore */
50
+ }
51
+ }
52
+ }
53
+ return () => { };
54
+ }
55
+ emit(ev) {
56
+ if (!this.active)
57
+ return;
58
+ this.active.run.events.push(ev);
59
+ // Cap memory
60
+ if (this.active.run.events.length > 5_000) {
61
+ this.active.run.events.splice(0, this.active.run.events.length - 4_000);
62
+ }
63
+ for (const fn of this.active.listeners) {
64
+ try {
65
+ fn(ev);
66
+ }
67
+ catch {
68
+ /* ignore */
69
+ }
70
+ }
71
+ }
72
+ start(args) {
73
+ if (this.active) {
74
+ return {
75
+ ok: false,
76
+ error: `A run is already active (${this.active.run.id}). Cancel it first.`,
77
+ };
78
+ }
79
+ const prompt = args.prompt?.trim();
80
+ if (!prompt)
81
+ return { ok: false, error: 'prompt is required' };
82
+ const id = randomUUID();
83
+ const mode = (args.mode || 'kraken').toLowerCase();
84
+ const phase = (args.phase || 'build').toLowerCase();
85
+ const run = {
86
+ id,
87
+ status: 'running',
88
+ prompt,
89
+ mode,
90
+ phase,
91
+ cwd: args.cwd,
92
+ createdAt: Date.now(),
93
+ events: [],
94
+ };
95
+ const cliEntry = process.argv[1];
96
+ if (!cliEntry) {
97
+ return { ok: false, error: 'Cannot resolve CLI entry (process.argv[1])' };
98
+ }
99
+ const argv = [
100
+ cliEntry,
101
+ '--headless',
102
+ '--task',
103
+ prompt,
104
+ '--output',
105
+ 'json',
106
+ '--mode',
107
+ mode === 'council' || mode === 'zelari' ? mode : 'kraken',
108
+ '--phase',
109
+ phase === 'plan' ? 'plan' : 'build',
110
+ ];
111
+ if (args.provider?.trim()) {
112
+ argv.push('--provider', args.provider.trim());
113
+ }
114
+ if (args.model?.trim()) {
115
+ argv.push('--model', args.model.trim());
116
+ }
117
+ let historyFile;
118
+ if (args.history && Array.isArray(args.history) && args.history.length > 0) {
119
+ historyFile = join(tmpdir(), `zelari-companion-hist-${id}.json`);
120
+ try {
121
+ writeFileSync(historyFile, JSON.stringify(args.history), 'utf8');
122
+ argv.push('--history-file', historyFile);
123
+ }
124
+ catch {
125
+ historyFile = undefined;
126
+ }
127
+ }
128
+ const child = spawn(process.execPath, argv, {
129
+ cwd: args.cwd,
130
+ env: {
131
+ ...process.env,
132
+ ZELARI_SKIP_PREFLIGHT: '1',
133
+ ANATHEMA_DEV: '1',
134
+ FORCE_COLOR: '0',
135
+ },
136
+ stdio: ['ignore', 'pipe', 'pipe'],
137
+ windowsHide: true,
138
+ });
139
+ this.active = { run, child, listeners: new Set(), historyFile };
140
+ this.emit({
141
+ type: 'log',
142
+ message: `[companion] run ${id} started mode=${mode} phase=${phase} cwd=${args.cwd}`,
143
+ });
144
+ if (child.stdout) {
145
+ const rl = createInterface({ input: child.stdout });
146
+ rl.on('line', (line) => {
147
+ const t = line.trim();
148
+ if (!t)
149
+ return;
150
+ try {
151
+ const ev = JSON.parse(t);
152
+ this.emit(ev);
153
+ }
154
+ catch {
155
+ this.emit({ type: 'log', message: t });
156
+ }
157
+ });
158
+ }
159
+ child.stderr?.on('data', (buf) => {
160
+ const text = buf.toString('utf8').trim();
161
+ if (!text)
162
+ return;
163
+ for (const line of text.split(/\r?\n/)) {
164
+ if (line.trim()) {
165
+ this.emit({ type: 'log', message: line.trim() });
166
+ }
167
+ }
168
+ });
169
+ child.on('error', (err) => {
170
+ run.status = 'error';
171
+ run.error = err.message;
172
+ run.finishedAt = Date.now();
173
+ this.emit({
174
+ type: 'error',
175
+ severity: 'fatal',
176
+ message: err.message,
177
+ code: 'spawn',
178
+ });
179
+ this.finishActive();
180
+ });
181
+ child.on('close', (code) => {
182
+ if (run.status === 'running') {
183
+ run.status = code === 0 ? 'completed' : 'error';
184
+ run.exitCode = code;
185
+ run.finishedAt = Date.now();
186
+ if (code !== 0 && !run.error) {
187
+ run.error = `exit ${code}`;
188
+ }
189
+ }
190
+ this.emit({
191
+ type: 'run_finished',
192
+ runId: id,
193
+ status: run.status,
194
+ exitCode: code,
195
+ });
196
+ this.finishActive();
197
+ });
198
+ return { ok: true, run };
199
+ }
200
+ cancel(runId) {
201
+ if (!this.active) {
202
+ return { ok: false, error: 'No active run' };
203
+ }
204
+ if (runId && this.active.run.id !== runId) {
205
+ return { ok: false, error: `Run ${runId} is not active` };
206
+ }
207
+ const { run, child } = this.active;
208
+ run.status = 'cancelled';
209
+ run.finishedAt = Date.now();
210
+ this.emit({
211
+ type: 'log',
212
+ message: `[companion] cancelling run ${run.id}`,
213
+ });
214
+ try {
215
+ child.kill('SIGTERM');
216
+ }
217
+ catch {
218
+ /* ignore */
219
+ }
220
+ // Windows: ensure tree dies
221
+ setTimeout(() => {
222
+ try {
223
+ if (!child.killed)
224
+ child.kill('SIGKILL');
225
+ }
226
+ catch {
227
+ /* ignore */
228
+ }
229
+ }, 1500);
230
+ return { ok: true };
231
+ }
232
+ finishActive() {
233
+ if (!this.active)
234
+ return;
235
+ const { run, historyFile } = this.active;
236
+ if (historyFile) {
237
+ try {
238
+ unlinkSync(historyFile);
239
+ }
240
+ catch {
241
+ /* ignore */
242
+ }
243
+ }
244
+ this.recent.unshift(run);
245
+ if (this.recent.length > 30)
246
+ this.recent.length = 30;
247
+ this.active = null;
248
+ }
249
+ }
250
+ //# sourceMappingURL=runManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runManager.js","sourceRoot":"","sources":["../../../src/cli/companion/runManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,376 @@
1
+ /**
2
+ * zelari-code serve — opt-in companion host for remote clients (Android / web)
3
+ * over Tailscale or LAN.
4
+ *
5
+ * Security defaults:
6
+ * - bind 127.0.0.1 (override with --bind 100.x for Tailscale only)
7
+ * - Bearer token (~/.zelari-code/companion.token)
8
+ * - project cwd allowlist only
9
+ */
10
+ import { createServer } from 'node:http';
11
+ import { existsSync } from 'node:fs';
12
+ import { resolve } from 'node:path';
13
+ import { getCurrentVersion } from '../updater.js';
14
+ import { buildDesktopConfigSnapshot } from '../desktopConfig.js';
15
+ import { DEFAULT_COMPANION_BIND, DEFAULT_COMPANION_PORT, loadCompanionConfig, loadOrCreateToken, mergeProjects, resolveProjectPath, saveCompanionConfig, tokenMatches, } from './config.js';
16
+ import { RunManager } from './runManager.js';
17
+ function readBody(req, max = 2_000_000) {
18
+ return new Promise((resolveBody, reject) => {
19
+ const chunks = [];
20
+ let size = 0;
21
+ req.on('data', (c) => {
22
+ size += c.length;
23
+ if (size > max) {
24
+ reject(new Error('body too large'));
25
+ req.destroy();
26
+ return;
27
+ }
28
+ chunks.push(c);
29
+ });
30
+ req.on('end', () => resolveBody(Buffer.concat(chunks).toString('utf8')));
31
+ req.on('error', reject);
32
+ });
33
+ }
34
+ function sendJson(res, status, body, extraHeaders) {
35
+ const data = JSON.stringify(body);
36
+ res.writeHead(status, {
37
+ 'content-type': 'application/json; charset=utf-8',
38
+ 'content-length': Buffer.byteLength(data),
39
+ 'access-control-allow-origin': '*',
40
+ 'access-control-allow-headers': 'authorization, content-type',
41
+ 'access-control-allow-methods': 'GET, POST, OPTIONS',
42
+ ...extraHeaders,
43
+ });
44
+ res.end(data);
45
+ }
46
+ function getBearer(req) {
47
+ const h = req.headers.authorization;
48
+ if (!h)
49
+ return null;
50
+ const m = /^Bearer\s+(.+)$/i.exec(h.trim());
51
+ return m?.[1]?.trim() || null;
52
+ }
53
+ function parseUrl(req) {
54
+ return new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
55
+ }
56
+ export async function runCompanionServe(opts = {}) {
57
+ const fileCfg = loadCompanionConfig();
58
+ const bind = (opts.bind || fileCfg.bind || DEFAULT_COMPANION_BIND).trim();
59
+ const port = opts.port ?? fileCfg.port ?? DEFAULT_COMPANION_PORT;
60
+ const { token, created } = loadOrCreateToken(opts.token);
61
+ let projects = mergeProjects(fileCfg, opts.projects ?? []);
62
+ // Drop missing paths with warning
63
+ projects = projects.filter((p) => {
64
+ const abs = resolve(p.path);
65
+ if (!existsSync(abs)) {
66
+ process.stderr.write(`[zelari-code serve] skip missing project path: ${p.path}\n`);
67
+ return false;
68
+ }
69
+ p.path = abs;
70
+ return true;
71
+ });
72
+ if (opts.persistProjects && projects.length > 0) {
73
+ saveCompanionConfig({
74
+ ...fileCfg,
75
+ bind,
76
+ port,
77
+ projects,
78
+ });
79
+ }
80
+ if (projects.length === 0) {
81
+ // Default: cwd if it looks like a project
82
+ const cwd = resolve(process.cwd());
83
+ projects = [
84
+ {
85
+ id: 'default',
86
+ name: 'default',
87
+ path: cwd,
88
+ },
89
+ ];
90
+ process.stderr.write(`[zelari-code serve] no projects configured — using cwd as default: ${cwd}\n` +
91
+ ` Add more: zelari-code serve --project <path>\n` +
92
+ ` Or edit ~/.zelari-code/companion.json\n`);
93
+ }
94
+ const runs = new RunManager();
95
+ const server = createServer(async (req, res) => {
96
+ // CORS preflight (browser companion / PWA)
97
+ if (req.method === 'OPTIONS') {
98
+ res.writeHead(204, {
99
+ 'access-control-allow-origin': '*',
100
+ 'access-control-allow-headers': 'authorization, content-type',
101
+ 'access-control-allow-methods': 'GET, POST, OPTIONS',
102
+ });
103
+ res.end();
104
+ return;
105
+ }
106
+ const url = parseUrl(req);
107
+ const path = url.pathname.replace(/\/+$/, '') || '/';
108
+ try {
109
+ if (req.method === 'GET' && (path === '/health' || path === '/v1/health')) {
110
+ sendJson(res, 200, {
111
+ ok: true,
112
+ service: 'zelari-companion',
113
+ version: getCurrentVersion(),
114
+ bind,
115
+ port,
116
+ projects: projects.length,
117
+ activeRun: runs.getActive()?.id ?? null,
118
+ });
119
+ return;
120
+ }
121
+ // All other /v1/* require auth
122
+ if (path.startsWith('/v1')) {
123
+ if (!tokenMatches(token, getBearer(req))) {
124
+ sendJson(res, 401, { ok: false, error: 'unauthorized' });
125
+ return;
126
+ }
127
+ }
128
+ if (req.method === 'GET' && path === '/v1/config') {
129
+ const snap = buildDesktopConfigSnapshot();
130
+ sendJson(res, 200, { ok: true, ...snap });
131
+ return;
132
+ }
133
+ if (req.method === 'GET' && path === '/v1/projects') {
134
+ sendJson(res, 200, {
135
+ ok: true,
136
+ projects: projects.map((p) => ({
137
+ id: p.id,
138
+ name: p.name,
139
+ path: p.path,
140
+ })),
141
+ });
142
+ return;
143
+ }
144
+ if (req.method === 'GET' && path === '/v1/runs') {
145
+ sendJson(res, 200, {
146
+ ok: true,
147
+ active: runs.getActive(),
148
+ recent: runs.listRecent().map((r) => ({
149
+ id: r.id,
150
+ status: r.status,
151
+ mode: r.mode,
152
+ phase: r.phase,
153
+ cwd: r.cwd,
154
+ createdAt: r.createdAt,
155
+ finishedAt: r.finishedAt,
156
+ exitCode: r.exitCode,
157
+ promptPreview: r.prompt.slice(0, 120),
158
+ })),
159
+ });
160
+ return;
161
+ }
162
+ if (req.method === 'POST' && path === '/v1/runs') {
163
+ const raw = await readBody(req);
164
+ let body = {};
165
+ try {
166
+ body = raw ? JSON.parse(raw) : {};
167
+ }
168
+ catch {
169
+ sendJson(res, 400, { ok: false, error: 'invalid JSON body' });
170
+ return;
171
+ }
172
+ const prompt = String(body.prompt ?? body.task ?? '').trim();
173
+ const mode = String(body.mode ?? 'kraken');
174
+ const phase = String(body.phase ?? 'build');
175
+ const cwdArg = body.cwd != null ? String(body.cwd) : body.projectId != null ? String(body.projectId) : null;
176
+ const resolved = resolveProjectPath(projects, cwdArg);
177
+ if (!resolved.ok) {
178
+ sendJson(res, 400, { ok: false, error: resolved.error });
179
+ return;
180
+ }
181
+ const history = Array.isArray(body.history) ? body.history : undefined;
182
+ const result = runs.start({
183
+ prompt,
184
+ mode,
185
+ phase,
186
+ cwd: resolved.project.path,
187
+ provider: body.provider != null ? String(body.provider) : undefined,
188
+ model: body.model != null ? String(body.model) : undefined,
189
+ history,
190
+ });
191
+ if (!result.ok) {
192
+ sendJson(res, 409, { ok: false, error: result.error });
193
+ return;
194
+ }
195
+ sendJson(res, 201, {
196
+ ok: true,
197
+ run: {
198
+ id: result.run.id,
199
+ status: result.run.status,
200
+ mode: result.run.mode,
201
+ phase: result.run.phase,
202
+ cwd: result.run.cwd,
203
+ createdAt: result.run.createdAt,
204
+ },
205
+ eventsUrl: `/v1/runs/${result.run.id}/events`,
206
+ cancelUrl: `/v1/runs/${result.run.id}/cancel`,
207
+ });
208
+ return;
209
+ }
210
+ const eventsMatch = /^\/v1\/runs\/([^/]+)\/events$/.exec(path);
211
+ if (req.method === 'GET' && eventsMatch) {
212
+ const runId = eventsMatch[1];
213
+ const run = runs.getRun(runId);
214
+ if (!run) {
215
+ sendJson(res, 404, { ok: false, error: 'run not found' });
216
+ return;
217
+ }
218
+ res.writeHead(200, {
219
+ 'content-type': 'text/event-stream; charset=utf-8',
220
+ 'cache-control': 'no-cache, no-transform',
221
+ connection: 'keep-alive',
222
+ 'access-control-allow-origin': '*',
223
+ 'access-control-allow-headers': 'authorization, content-type',
224
+ });
225
+ res.write(`: connected run=${runId}\n\n`);
226
+ const writeEv = (ev) => {
227
+ try {
228
+ res.write(`data: ${JSON.stringify(ev)}\n\n`);
229
+ }
230
+ catch {
231
+ /* client gone */
232
+ }
233
+ };
234
+ const unsub = runs.subscribe(runId, writeEv);
235
+ // If already finished, close after replay
236
+ if (run.status !== 'running' && run.status !== 'queued') {
237
+ writeEv({
238
+ type: 'run_finished',
239
+ runId,
240
+ status: run.status,
241
+ exitCode: run.exitCode ?? null,
242
+ });
243
+ unsub();
244
+ res.end();
245
+ return;
246
+ }
247
+ const heartbeat = setInterval(() => {
248
+ try {
249
+ res.write(`: ping\n\n`);
250
+ }
251
+ catch {
252
+ /* ignore */
253
+ }
254
+ }, 15_000);
255
+ const onClose = () => {
256
+ clearInterval(heartbeat);
257
+ unsub();
258
+ };
259
+ req.on('close', onClose);
260
+ // Poll finish for SSE close when run ends after subscribe
261
+ const check = setInterval(() => {
262
+ const r = runs.getRun(runId);
263
+ if (!r || (r.status !== 'running' && r.status !== 'queued')) {
264
+ clearInterval(check);
265
+ clearInterval(heartbeat);
266
+ unsub();
267
+ try {
268
+ res.end();
269
+ }
270
+ catch {
271
+ /* ignore */
272
+ }
273
+ }
274
+ }, 500);
275
+ return;
276
+ }
277
+ const cancelMatch = /^\/v1\/runs\/([^/]+)\/cancel$/.exec(path);
278
+ if (req.method === 'POST' && cancelMatch) {
279
+ const runId = cancelMatch[1];
280
+ const result = runs.cancel(runId);
281
+ if (!result.ok) {
282
+ sendJson(res, 404, { ok: false, error: result.error });
283
+ return;
284
+ }
285
+ sendJson(res, 200, { ok: true, cancelled: runId });
286
+ return;
287
+ }
288
+ sendJson(res, 404, { ok: false, error: 'not found' });
289
+ }
290
+ catch (err) {
291
+ sendJson(res, 500, {
292
+ ok: false,
293
+ error: err instanceof Error ? err.message : String(err),
294
+ });
295
+ }
296
+ });
297
+ await new Promise((resolveListen, reject) => {
298
+ server.once('error', reject);
299
+ server.listen(port, bind, () => resolveListen());
300
+ });
301
+ // Keep the process alive even if stdin is a closed pipe (Windows Start-Process).
302
+ server.ref();
303
+ try {
304
+ process.stdin?.resume?.();
305
+ }
306
+ catch {
307
+ /* ignore */
308
+ }
309
+ const tokenHint = created
310
+ ? `NEW token saved to ~/.zelari-code/companion.token`
311
+ : `token: ~/.zelari-code/companion.token`;
312
+ const displayHost = bind === '0.0.0.0' || bind === '::'
313
+ ? '127.0.0.1 (and LAN/Tailscale interfaces)'
314
+ : bind;
315
+ process.stderr.write(`\n[zelari-code serve] companion host listening\n` +
316
+ ` URL http://${displayHost === '127.0.0.1 (and LAN/Tailscale interfaces)' ? '127.0.0.1' : bind}:${port}\n` +
317
+ ` Bind ${bind}\n` +
318
+ ` Health GET /health\n` +
319
+ ` Auth Authorization: Bearer <token>\n` +
320
+ ` ${tokenHint}\n` +
321
+ ` Projects (${projects.length}): ${projects.map((p) => p.id).join(', ')}\n` +
322
+ ` Phone use http://<PC-LAN-or-Tailscale-IP>:${port} (not 127.0.0.1 on the phone)\n` +
323
+ ` Stop Ctrl+C (keep this window open)\n\n`);
324
+ if (created) {
325
+ process.stderr.write(` Token (copy now): ${token}\n\n`);
326
+ }
327
+ // Stay up until signal. Do not resolve on stdin EOF.
328
+ await new Promise((resolveStop) => {
329
+ let stopped = false;
330
+ const stop = (sig) => {
331
+ if (stopped)
332
+ return;
333
+ stopped = true;
334
+ process.stderr.write(`[zelari-code serve] shutting down (${sig})…\n`);
335
+ try {
336
+ runs.cancel();
337
+ }
338
+ catch {
339
+ /* ignore */
340
+ }
341
+ server.close(() => resolveStop());
342
+ // Force exit if close hangs
343
+ setTimeout(() => resolveStop(), 3000).unref();
344
+ };
345
+ process.once('SIGINT', () => stop('SIGINT'));
346
+ process.once('SIGTERM', () => stop('SIGTERM'));
347
+ process.once('SIGHUP', () => stop('SIGHUP'));
348
+ });
349
+ }
350
+ /** Parse serve flags from argv. */
351
+ export function parseServeFlags(argv) {
352
+ if (!argv.includes('serve') && !argv.includes('--serve')) {
353
+ return null;
354
+ }
355
+ const get = (flag) => {
356
+ const i = argv.indexOf(flag);
357
+ return i >= 0 && argv[i + 1] ? argv[i + 1] : undefined;
358
+ };
359
+ const projects = [];
360
+ for (let i = 0; i < argv.length; i++) {
361
+ if (argv[i] === '--project' && argv[i + 1]) {
362
+ projects.push(argv[i + 1]);
363
+ i++;
364
+ }
365
+ }
366
+ const portRaw = get('--port');
367
+ const port = portRaw ? Number.parseInt(portRaw, 10) : undefined;
368
+ return {
369
+ bind: get('--bind'),
370
+ port: Number.isFinite(port) ? port : undefined,
371
+ token: get('--token'),
372
+ projects,
373
+ persistProjects: argv.includes('--save-projects'),
374
+ };
375
+ }
376
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/companion/serve.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ function InputBarImpl({ value, onChange, onSubmit, disabled }) {
28
28
  const stableChange = React.useCallback((v) => onChangeRef.current(v), []);
29
29
  return (React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1 },
30
30
  React.createElement(Text, { color: "cyan", bold: true }, "\u276F "),
31
- React.createElement(TextInput, { value: value, onChange: stableChange, onSubmit: stableSubmit, placeholder: disabled ? '...' : 'Type a prompt or /skill <name>' })));
31
+ React.createElement(TextInput, { value: value, onChange: stableChange, onSubmit: stableSubmit, placeholder: disabled ? '...' : 'Prompt, /skills, or @path' })));
32
32
  }
33
33
  export const InputBar = React.memo(InputBarImpl, (prev, next) => {
34
34
  return (prev.value === next.value &&