genaicode 2.6.0 → 2.8.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 (42) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +26 -2
  3. package/dist/agents/drivers/claude.js +9 -1
  4. package/dist/agents/drivers/claude.js.map +1 -1
  5. package/dist/agents/drivers/codex.js +4 -1
  6. package/dist/agents/drivers/codex.js.map +1 -1
  7. package/dist/agents/drivers/copilot.js +4 -0
  8. package/dist/agents/drivers/copilot.js.map +1 -1
  9. package/dist/agents/drivers/cursor.js +4 -1
  10. package/dist/agents/drivers/cursor.js.map +1 -1
  11. package/dist/agents/drivers/opencode.js +10 -1
  12. package/dist/agents/drivers/opencode.js.map +1 -1
  13. package/dist/agents/prepare.js +4 -0
  14. package/dist/agents/prepare.js.map +1 -1
  15. package/dist/agents/session.d.ts +108 -0
  16. package/dist/agents/session.js +329 -0
  17. package/dist/agents/session.js.map +1 -0
  18. package/dist/agents/types.d.ts +7 -0
  19. package/dist/agents.d.ts +2 -0
  20. package/dist/agents.js +1 -0
  21. package/dist/agents.js.map +1 -1
  22. package/dist/cli/args.d.ts +11 -0
  23. package/dist/cli/args.js +32 -0
  24. package/dist/cli/args.js.map +1 -1
  25. package/dist/cli/main.d.ts +32 -1
  26. package/dist/cli/main.js +56 -0
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/cli.js +1 -0
  29. package/dist/cli.js.map +1 -1
  30. package/dist/providers/anthropic-converter.d.ts +17 -0
  31. package/dist/providers/anthropic-converter.js +84 -12
  32. package/dist/providers/anthropic-converter.js.map +1 -1
  33. package/dist/providers.d.ts +2 -2
  34. package/dist/providers.js +1 -1
  35. package/dist/providers.js.map +1 -1
  36. package/dist/ui/index.js +210 -0
  37. package/dist/ui/index.js.LEGAL.txt +56 -0
  38. package/dist/ui/web-client.js +14 -0
  39. package/dist/ui/web-client.js.LEGAL.txt +56 -0
  40. package/docs/agents.md +40 -0
  41. package/docs/pivot.md +4 -3
  42. package/package.json +10 -3
@@ -0,0 +1,329 @@
1
+ export function createAgentSession(options) {
2
+ const maxToolOutput = options.maxToolOutput ?? 4_000;
3
+ const maxTurns = options.maxTurns ?? 200;
4
+ let agent = options.agent;
5
+ let state = {
6
+ agent: agent.name,
7
+ cwd: options.cwd,
8
+ model: options.model,
9
+ effort: options.effort,
10
+ sessionId: options.resume,
11
+ status: 'idle',
12
+ turns: [],
13
+ queued: [],
14
+ approvals: [],
15
+ usage: {},
16
+ canSteer: false,
17
+ };
18
+ const listeners = new Set();
19
+ const waiting = new Map();
20
+ const idleWaiters = [];
21
+ let run;
22
+ let controller;
23
+ let nextTurnId = 1;
24
+ let closed = false;
25
+ // `options.resume` applies to the first turn as given, so an agent that cannot resume refuses it.
26
+ let explicitResume = options.resume;
27
+ // `reset()` during a turn: forget the session that turn reports when it ends.
28
+ let forgetAfterTurn = false;
29
+ // Usage of finished turns; the running turn's latest report is added on top.
30
+ let pastUsage = {};
31
+ let pastCost;
32
+ const set = (patch) => {
33
+ state = { ...state, ...patch };
34
+ for (const listener of [...listeners]) {
35
+ try {
36
+ listener(state);
37
+ }
38
+ catch {
39
+ // A failing subscriber must not break the session or other subscribers.
40
+ }
41
+ }
42
+ };
43
+ const updateTurn = (id, change) => {
44
+ set({ turns: state.turns.map((turn) => (turn.id === id ? change(turn) : turn)) });
45
+ };
46
+ const addEntry = (id, entry) => updateTurn(id, (turn) => ({ ...turn, entries: [...closeStreaming(turn.entries), entry] }));
47
+ const clip = (text) => text === undefined || text.length <= maxToolOutput ? text : `${text.slice(0, maxToolOutput)}\n… (truncated)`;
48
+ const onEvent = (turnId, event) => {
49
+ switch (event.type) {
50
+ case 'session':
51
+ if (!forgetAfterTurn)
52
+ set({ sessionId: event.sessionId });
53
+ return;
54
+ case 'text-delta':
55
+ updateTurn(turnId, (turn) => {
56
+ const last = turn.entries.at(-1);
57
+ if (last?.kind === 'text' && last.streaming) {
58
+ return { ...turn, entries: [...turn.entries.slice(0, -1), { ...last, text: last.text + event.text }] };
59
+ }
60
+ return { ...turn, entries: [...turn.entries, { kind: 'text', text: event.text, streaming: true }] };
61
+ });
62
+ return;
63
+ case 'message':
64
+ updateTurn(turnId, (turn) => {
65
+ const last = turn.entries.at(-1);
66
+ const entry = { kind: 'text', text: event.text, streaming: false };
67
+ if (last?.kind === 'text' && last.streaming)
68
+ return { ...turn, entries: [...turn.entries.slice(0, -1), entry] };
69
+ return { ...turn, entries: [...turn.entries, entry] };
70
+ });
71
+ return;
72
+ case 'tool-start':
73
+ addEntry(turnId, { kind: 'tool', id: event.id, name: event.name, input: event.input, done: false });
74
+ return;
75
+ case 'tool-end':
76
+ updateTurn(turnId, (turn) => {
77
+ const at = findOpenTool(turn.entries, event.id, event.name);
78
+ const ended = { output: clip(event.output), isError: event.isError, done: true };
79
+ if (at < 0) {
80
+ const entry = { kind: 'tool', id: event.id, name: event.name ?? 'tool', ...ended };
81
+ return { ...turn, entries: [...closeStreaming(turn.entries), entry] };
82
+ }
83
+ const entries = [...turn.entries];
84
+ entries[at] = { ...entries[at], ...ended };
85
+ return { ...turn, entries };
86
+ });
87
+ return;
88
+ case 'file-change':
89
+ addEntry(turnId, { kind: 'files', paths: event.paths });
90
+ return;
91
+ case 'approval-request':
92
+ // The entry is added by `onApproval`, which also holds the pending decision.
93
+ return;
94
+ case 'approval-resolved':
95
+ updateTurn(turnId, (turn) => ({
96
+ ...turn,
97
+ entries: turn.entries.map((entry) => entry.kind === 'approval' && entry.request.id === event.id ? { ...entry, decision: event.decision } : entry),
98
+ }));
99
+ return;
100
+ case 'usage': {
101
+ updateTurn(turnId, (turn) => ({
102
+ ...turn,
103
+ usage: event.usage,
104
+ costUsd: event.costUsd ?? turn.costUsd,
105
+ }));
106
+ const turn = state.turns.find((candidate) => candidate.id === turnId);
107
+ set({
108
+ usage: addUsage(pastUsage, turn?.usage ?? {}),
109
+ costUsd: turn?.costUsd === undefined ? pastCost : (pastCost ?? 0) + turn.costUsd,
110
+ });
111
+ return;
112
+ }
113
+ case 'error':
114
+ addEntry(turnId, { kind: 'error', message: event.message });
115
+ return;
116
+ case 'stderr':
117
+ case 'raw':
118
+ case 'done':
119
+ return;
120
+ }
121
+ };
122
+ const onApproval = (turnId, request) => {
123
+ addEntry(turnId, { kind: 'approval', request });
124
+ const automatic = options.autoApprove?.(request);
125
+ if (automatic)
126
+ return Promise.resolve(automatic);
127
+ return new Promise((resolve) => {
128
+ waiting.set(request.id, resolve);
129
+ set({ approvals: [...state.approvals, request] });
130
+ });
131
+ };
132
+ const denyPending = () => {
133
+ for (const resolve of waiting.values())
134
+ resolve('deny');
135
+ waiting.clear();
136
+ if (state.approvals.length)
137
+ set({ approvals: [] });
138
+ };
139
+ const settleIdle = () => {
140
+ if (state.status !== 'idle' || state.queued.length)
141
+ return;
142
+ for (const resolve of idleWaiters.splice(0))
143
+ resolve();
144
+ };
145
+ const startTurn = (prompt) => {
146
+ const turnId = nextTurnId++;
147
+ const turn = { id: turnId, agent: agent.name, prompt, entries: [], startedAt: Date.now() };
148
+ const resume = explicitResume !== undefined
149
+ ? explicitResume
150
+ : state.sessionId && agent.capabilities.resume
151
+ ? state.sessionId
152
+ : undefined;
153
+ explicitResume = undefined;
154
+ const turnController = new AbortController();
155
+ controller = turnController;
156
+ set({
157
+ status: 'running',
158
+ turns: [...state.turns, turn].slice(-maxTurns),
159
+ canSteer: false,
160
+ });
161
+ const current = agent.run({
162
+ ...options.task,
163
+ prompt,
164
+ cwd: state.cwd,
165
+ model: state.model,
166
+ effort: state.effort,
167
+ resume,
168
+ signal: turnController.signal,
169
+ onApproval: (request) => onApproval(turnId, request),
170
+ });
171
+ run = current;
172
+ if (current.steer && agent.capabilities.steer)
173
+ set({ canSteer: true });
174
+ void (async () => {
175
+ try {
176
+ for await (const event of current)
177
+ onEvent(turnId, event);
178
+ }
179
+ catch (error) {
180
+ addEntry(turnId, { kind: 'error', message: error instanceof Error ? error.message : String(error) });
181
+ }
182
+ const result = await current.result;
183
+ denyPending();
184
+ run = undefined;
185
+ controller = undefined;
186
+ updateTurn(turnId, (done) => ({
187
+ ...done,
188
+ entries: closeStreaming(done.entries),
189
+ result,
190
+ endedAt: Date.now(),
191
+ }));
192
+ const finished = state.turns.find((candidate) => candidate.id === turnId);
193
+ if (finished?.usage)
194
+ pastUsage = addUsage(pastUsage, finished.usage);
195
+ if (finished?.costUsd !== undefined)
196
+ pastCost = (pastCost ?? 0) + finished.costUsd;
197
+ set({ usage: pastUsage, costUsd: pastCost });
198
+ if (forgetAfterTurn) {
199
+ forgetAfterTurn = false;
200
+ set({ sessionId: undefined });
201
+ }
202
+ else if (result.sessionId)
203
+ set({ sessionId: result.sessionId });
204
+ const [next, ...rest] = state.queued;
205
+ if (next !== undefined && !closed) {
206
+ set({ queued: rest });
207
+ startTurn(next);
208
+ }
209
+ else {
210
+ set({ status: 'idle', canSteer: false });
211
+ settleIdle();
212
+ }
213
+ })();
214
+ };
215
+ return {
216
+ get: () => state,
217
+ subscribe(listener) {
218
+ listeners.add(listener);
219
+ return () => listeners.delete(listener);
220
+ },
221
+ send(text) {
222
+ const prompt = text.trim();
223
+ if (!prompt || closed)
224
+ return;
225
+ if (state.status === 'idle')
226
+ return startTurn(prompt);
227
+ const current = run;
228
+ const turnId = state.turns.at(-1)?.id;
229
+ const turnController = controller;
230
+ if (current?.steer && state.canSteer && turnId !== undefined) {
231
+ addEntry(turnId, { kind: 'input', text: prompt });
232
+ current.steer(prompt).catch(() => {
233
+ // The turn ended before the agent took the input: run it as the next turn instead,
234
+ // unless the user stopped that turn.
235
+ if (closed || turnController?.signal.aborted)
236
+ return;
237
+ set({ queued: [...state.queued, prompt] });
238
+ if (state.status === 'idle') {
239
+ const [next, ...rest] = state.queued;
240
+ set({ queued: rest });
241
+ if (next !== undefined)
242
+ startTurn(next);
243
+ }
244
+ });
245
+ return;
246
+ }
247
+ set({ queued: [...state.queued, prompt] });
248
+ },
249
+ stop() {
250
+ if (state.queued.length)
251
+ set({ queued: [] });
252
+ denyPending();
253
+ controller?.abort();
254
+ run?.abort();
255
+ settleIdle();
256
+ },
257
+ approve(id, decision) {
258
+ const resolve = waiting.get(id);
259
+ if (!resolve)
260
+ return false;
261
+ waiting.delete(id);
262
+ set({ approvals: state.approvals.filter((request) => request.id !== id) });
263
+ resolve(decision);
264
+ return true;
265
+ },
266
+ setAgent(next) {
267
+ if (next === agent)
268
+ return;
269
+ agent = next;
270
+ explicitResume = undefined;
271
+ if (state.status === 'running')
272
+ forgetAfterTurn = true;
273
+ set({ agent: next.name, sessionId: undefined });
274
+ },
275
+ setModel(model) {
276
+ set({ model });
277
+ },
278
+ reset() {
279
+ explicitResume = undefined;
280
+ if (state.status === 'running')
281
+ forgetAfterTurn = true;
282
+ set({ sessionId: undefined });
283
+ },
284
+ idle() {
285
+ if (state.status === 'idle' && !state.queued.length)
286
+ return Promise.resolve();
287
+ return new Promise((resolve) => idleWaiters.push(resolve));
288
+ },
289
+ close() {
290
+ closed = true;
291
+ this.stop();
292
+ listeners.clear();
293
+ },
294
+ };
295
+ }
296
+ function closeStreaming(entries) {
297
+ const last = entries.at(-1);
298
+ if (last?.kind !== 'text' || !last.streaming)
299
+ return entries;
300
+ return [...entries.slice(0, -1), { ...last, streaming: false }];
301
+ }
302
+ function findOpenTool(entries, id, name) {
303
+ for (let i = entries.length - 1; i >= 0; i -= 1) {
304
+ const entry = entries[i];
305
+ if (entry.kind !== 'tool' || entry.done)
306
+ continue;
307
+ if (id !== undefined ? entry.id === id : name === undefined || entry.name === name)
308
+ return i;
309
+ }
310
+ return -1;
311
+ }
312
+ function addUsage(total, usage) {
313
+ const sum = (a, b) => (a === undefined && b === undefined ? undefined : (a ?? 0) + (b ?? 0));
314
+ const next = {};
315
+ const inputTokens = sum(total.inputTokens, usage.inputTokens);
316
+ const outputTokens = sum(total.outputTokens, usage.outputTokens);
317
+ const cachedInputTokens = sum(total.cachedInputTokens, usage.cachedInputTokens);
318
+ const totalTokens = sum(total.totalTokens, usage.totalTokens);
319
+ if (inputTokens !== undefined)
320
+ next.inputTokens = inputTokens;
321
+ if (outputTokens !== undefined)
322
+ next.outputTokens = outputTokens;
323
+ if (cachedInputTokens !== undefined)
324
+ next.cachedInputTokens = cachedInputTokens;
325
+ if (totalTokens !== undefined)
326
+ next.totalTokens = totalTokens;
327
+ return next;
328
+ }
329
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agents/session.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@ export interface AgentTask {
20
20
  /** Kill the agent after this many milliseconds. No timeout by default. */
21
21
  timeoutMs?: number;
22
22
  signal?: AbortSignal;
23
+ /**
24
+ * Continue an earlier agent session instead of starting a new one: the `sessionId` of a
25
+ * previous result (`capabilities.resume`). The agent keeps its own history of that session.
26
+ */
27
+ resume?: string;
23
28
  /** Extra CLI arguments, inserted before the prompt. */
24
29
  extraArgs?: readonly string[];
25
30
  /** MCP servers to attach for this task (`capabilities.mcp`). */
@@ -133,6 +138,8 @@ export interface AgentCapabilities {
133
138
  approvals?: boolean;
134
139
  /** Honors `AgentTask.mcpServers`. */
135
140
  mcp?: boolean;
141
+ /** Honors `AgentTask.resume`. */
142
+ resume?: boolean;
136
143
  }
137
144
  /**
138
145
  * A started task. Iterate it for events (once), or await `result` alone.
package/dist/agents.d.ts CHANGED
@@ -38,3 +38,5 @@ export { createVibeParser, vibe, vibeArgs } from './agents/drivers/vibe.js';
38
38
  export type { VibeAgentOptions } from './agents/drivers/vibe.js';
39
39
  export { antigravity, antigravityArgs, createAntigravityParser } from './agents/drivers/antigravity.js';
40
40
  export type { AntigravityAgentOptions } from './agents/drivers/antigravity.js';
41
+ export { createAgentSession } from './agents/session.js';
42
+ export type { AgentSession, AgentSessionOptions, SessionEntry, SessionState, SessionTurn } from './agents/session.js';
package/dist/agents.js CHANGED
@@ -18,4 +18,5 @@ export { hostedAgent } from './agents/hosted.js';
18
18
  export { copilot, copilotArgs, copilotMcpConfig, createCopilotParser } from './agents/drivers/copilot.js';
19
19
  export { createVibeParser, vibe, vibeArgs } from './agents/drivers/vibe.js';
20
20
  export { antigravity, antigravityArgs, createAntigravityParser } from './agents/drivers/antigravity.js';
21
+ export { createAgentSession } from './agents/session.js';
21
22
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAc5E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE1G,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAc5E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE1G,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAExG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -5,6 +5,16 @@ export type CliCommand = {
5
5
  } | {
6
6
  kind: 'agents';
7
7
  json: boolean;
8
+ } | {
9
+ kind: 'chat' | 'ui';
10
+ agent?: string;
11
+ cwd?: string;
12
+ model?: string;
13
+ effort?: string;
14
+ resume?: string;
15
+ approveAll: boolean;
16
+ port?: number;
17
+ open: boolean;
8
18
  } | {
9
19
  kind: 'run';
10
20
  prompt: string | undefined;
@@ -13,6 +23,7 @@ export type CliCommand = {
13
23
  model?: string;
14
24
  effort?: string;
15
25
  maxTurns?: number;
26
+ resume?: string;
16
27
  timeoutMs?: number;
17
28
  verify?: string;
18
29
  maxRepairs: number;
package/dist/cli/args.js CHANGED
@@ -12,6 +12,36 @@ export function parseCli(argv) {
12
12
  const { values } = parse(() => parseArgs({ args: rest, options: { json: { type: 'boolean' } }, strict: true }));
13
13
  return { kind: 'agents', json: values.json === true };
14
14
  }
15
+ if (command === 'chat' || command === 'ui') {
16
+ const { values } = parse(() => parseArgs({
17
+ args: rest,
18
+ strict: true,
19
+ options: {
20
+ agent: { type: 'string', short: 'a' },
21
+ cwd: { type: 'string', short: 'C' },
22
+ model: { type: 'string', short: 'm' },
23
+ effort: { type: 'string' },
24
+ resume: { type: 'string', short: 'r' },
25
+ yes: { type: 'boolean', short: 'y' },
26
+ ...(command === 'ui' ? { port: { type: 'string' }, 'no-open': { type: 'boolean' } } : {}),
27
+ },
28
+ }));
29
+ const extra = values;
30
+ const port = optionalNumber(extra.port, '--port');
31
+ if (port !== undefined && port > 65535)
32
+ throw new UsageError(`--port expects 0-65535, got ${port}.`);
33
+ return {
34
+ kind: command,
35
+ agent: values.agent,
36
+ cwd: values.cwd,
37
+ model: values.model,
38
+ effort: values.effort,
39
+ resume: values.resume,
40
+ approveAll: values.yes === true,
41
+ port,
42
+ open: extra['no-open'] !== true,
43
+ };
44
+ }
15
45
  if (command === 'run') {
16
46
  const { values, positionals } = parse(() => parseArgs({
17
47
  args: rest,
@@ -23,6 +53,7 @@ export function parseCli(argv) {
23
53
  model: { type: 'string', short: 'm' },
24
54
  effort: { type: 'string' },
25
55
  'max-turns': { type: 'string' },
56
+ resume: { type: 'string', short: 'r' },
26
57
  timeout: { type: 'string' },
27
58
  verify: { type: 'string' },
28
59
  'max-repairs': { type: 'string' },
@@ -39,6 +70,7 @@ export function parseCli(argv) {
39
70
  model: values.model,
40
71
  effort: values.effort,
41
72
  maxTurns: optionalNumber(values['max-turns'], '--max-turns'),
73
+ resume: values.resume,
42
74
  timeoutMs: timeout === undefined ? undefined : timeout * 1000,
43
75
  verify: values.verify,
44
76
  maxRepairs: optionalNumber(values['max-repairs'], '--max-repairs') ?? 2,
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,40 @@ export interface CliEnvironment {
12
12
  signal?: AbortSignal;
13
13
  /** Agents to offer. Defaults to every headless driver. */
14
14
  agents?: readonly CodingAgent[];
15
+ /** Both stdin and stdout are terminals: `genaicode` with no arguments opens the chat. */
16
+ interactive?: boolean;
17
+ /** Terminal streams for the chat UI. */
18
+ tty?: {
19
+ stdin: NodeJS.ReadStream;
20
+ stdout: NodeJS.WriteStream;
21
+ };
22
+ /** Loads the bundled chat and web front ends. Defaults to `dist/ui/index.js`. */
23
+ loadUi?(): Promise<UiModule>;
15
24
  /** Runs the `--verify` command. Defaults to a shell in the task directory. */
16
25
  runCheck?(command: string, cwd: string, env: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<CheckResult>;
17
26
  }
27
+ /** Options the bundled front ends take (see src/ui/index.tsx). */
28
+ export interface UiLaunch {
29
+ agents: readonly CodingAgent[];
30
+ agent?: string;
31
+ cwd: string;
32
+ model?: string;
33
+ effort?: string;
34
+ resume?: string;
35
+ approveAll?: boolean;
36
+ env: NodeJS.ProcessEnv;
37
+ version: string;
38
+ stdout: NodeJS.WriteStream;
39
+ stderr: Output;
40
+ stdin: NodeJS.ReadStream;
41
+ signal?: AbortSignal;
42
+ port?: number;
43
+ open?: boolean;
44
+ }
45
+ export interface UiModule {
46
+ runChat(options: UiLaunch): Promise<number>;
47
+ runWeb(options: UiLaunch): Promise<number>;
48
+ }
18
49
  export interface CheckResult {
19
50
  exitCode: number | null;
20
51
  output: string;
@@ -23,6 +54,6 @@ export declare const EXIT_OK = 0;
23
54
  export declare const EXIT_FAILED = 1;
24
55
  export declare const EXIT_USAGE = 2;
25
56
  export declare const EXIT_ABORTED = 130;
26
- export declare const helpText = "genaicode: run the coding-agent CLIs installed on this machine behind one interface.\n\nUsage:\n genaicode agents [--json] List supported agents and whether each is installed\n genaicode run [options] <prompt...> Run one task (reads the prompt from stdin if omitted)\n\nRun options:\n -a, --agent <name> Agent to use (default: the first installed one, see \"agents\")\n -C, --cwd <dir> Directory the agent works in (default: current directory)\n -m, --model <id> Model id passed to the agent CLI\n --effort <level> Reasoning effort, in the agent's own vocabulary\n --max-turns <n> Turn limit, where the agent supports one\n --timeout <sec> Stop the agent after this many seconds\n --verify <command> Shell command that checks the work; on failure its output goes\n back to the agent for another attempt\n --max-repairs <n> Repair attempts after a failed check (default 2)\n --json Print agent events as JSON lines instead of text\n\nThe agent uses its own login, billing, and permission defaults. GenAIcode adds no agent\nloop, prompts, or sandbox of its own. Library API: https://github.com/gtanczyk/genaicode#readme\n\nLooking for the legacy 1.x coding agent?\n Run it: npx genaicode@1\n Source: https://github.com/gtanczyk/genaicode/tree/1.x\n";
57
+ export declare const helpText = "genaicode: run the coding-agent CLIs installed on this machine behind one interface.\n\nUsage:\n genaicode Chat with an agent in this terminal (same as \"chat\")\n genaicode chat [options] Chat with an agent in this terminal\n genaicode ui [options] Chat with an agent in the browser (local server)\n genaicode agents [--json] List supported agents and whether each is installed\n genaicode run [options] <prompt...> Run one task (reads the prompt from stdin if omitted)\n\nChat and UI options:\n -a, --agent <name> Agent to start with (default: the first installed one)\n -C, --cwd <dir> Directory the agent works in (default: current directory)\n -m, --model <id> Model id passed to the agent CLI\n --effort <level> Reasoning effort, in the agent's own vocabulary\n -r, --resume <id> Continue this agent session\n -y, --yes Approve every permission request the agent asks for\n --port <n> (ui) Port to listen on, on 127.0.0.1 (default: a free port)\n --no-open (ui) Print the link instead of opening a browser\n\n Each prompt after the first continues the agent's session (claude, codex, cursor,\n opencode, copilot). Prompts sent while the agent works wait in a queue. Type /help in\n the chat for commands.\n\nRun options:\n -a, --agent <name> Agent to use (default: the first installed one, see \"agents\")\n -C, --cwd <dir> Directory the agent works in (default: current directory)\n -m, --model <id> Model id passed to the agent CLI\n --effort <level> Reasoning effort, in the agent's own vocabulary\n --max-turns <n> Turn limit, where the agent supports one\n -r, --resume <id> Continue the agent session with this id (printed after each run)\n --timeout <sec> Stop the agent after this many seconds\n --verify <command> Shell command that checks the work; on failure its output goes\n back to the agent for another attempt\n --max-repairs <n> Repair attempts after a failed check (default 2)\n --json Print agent events as JSON lines instead of text\n\nThe agent uses its own login, billing, and permission defaults. GenAIcode adds no agent\nloop, prompts, or sandbox of its own. Library API: https://github.com/gtanczyk/genaicode#readme\n\nLooking for the legacy 1.x coding agent?\n Run it: npx genaicode@1\n Source: https://github.com/gtanczyk/genaicode/tree/1.x\n";
27
58
  /** Run the CLI and return its exit code. */
28
59
  export declare function main(cli: CliEnvironment): Promise<number>;
package/dist/cli/main.js CHANGED
@@ -13,15 +13,33 @@ export const EXIT_ABORTED = 130;
13
13
  export const helpText = `genaicode: run the coding-agent CLIs installed on this machine behind one interface.
14
14
 
15
15
  Usage:
16
+ genaicode Chat with an agent in this terminal (same as "chat")
17
+ genaicode chat [options] Chat with an agent in this terminal
18
+ genaicode ui [options] Chat with an agent in the browser (local server)
16
19
  genaicode agents [--json] List supported agents and whether each is installed
17
20
  genaicode run [options] <prompt...> Run one task (reads the prompt from stdin if omitted)
18
21
 
22
+ Chat and UI options:
23
+ -a, --agent <name> Agent to start with (default: the first installed one)
24
+ -C, --cwd <dir> Directory the agent works in (default: current directory)
25
+ -m, --model <id> Model id passed to the agent CLI
26
+ --effort <level> Reasoning effort, in the agent's own vocabulary
27
+ -r, --resume <id> Continue this agent session
28
+ -y, --yes Approve every permission request the agent asks for
29
+ --port <n> (ui) Port to listen on, on 127.0.0.1 (default: a free port)
30
+ --no-open (ui) Print the link instead of opening a browser
31
+
32
+ Each prompt after the first continues the agent's session (claude, codex, cursor,
33
+ opencode, copilot). Prompts sent while the agent works wait in a queue. Type /help in
34
+ the chat for commands.
35
+
19
36
  Run options:
20
37
  -a, --agent <name> Agent to use (default: the first installed one, see "agents")
21
38
  -C, --cwd <dir> Directory the agent works in (default: current directory)
22
39
  -m, --model <id> Model id passed to the agent CLI
23
40
  --effort <level> Reasoning effort, in the agent's own vocabulary
24
41
  --max-turns <n> Turn limit, where the agent supports one
42
+ -r, --resume <id> Continue the agent session with this id (printed after each run)
25
43
  --timeout <sec> Stop the agent after this many seconds
26
44
  --verify <command> Shell command that checks the work; on failure its output goes
27
45
  back to the agent for another attempt
@@ -48,6 +66,9 @@ export async function main(cli) {
48
66
  return EXIT_USAGE;
49
67
  }
50
68
  const agents = cli.agents ?? defaultAgents();
69
+ if (command.kind === 'help' && cli.argv.length === 0 && cli.interactive) {
70
+ command = { kind: 'chat', approveAll: false, open: false };
71
+ }
51
72
  switch (command.kind) {
52
73
  case 'help':
53
74
  cli.stdout.write(helpText);
@@ -59,7 +80,41 @@ export async function main(cli) {
59
80
  return listAgents(cli, agents, command.json);
60
81
  case 'run':
61
82
  return runTask(cli, agents, command);
83
+ case 'chat':
84
+ case 'ui':
85
+ return runUi(cli, agents, command);
86
+ }
87
+ }
88
+ async function runUi(cli, agents, options) {
89
+ const tty = cli.tty ?? { stdin: process.stdin, stdout: process.stdout };
90
+ if (options.kind === 'chat' && !(cli.interactive ?? (tty.stdin.isTTY && tty.stdout.isTTY))) {
91
+ cli.stderr.write('genaicode chat needs a terminal. Use "genaicode run" for scripts, or "genaicode ui".\n');
92
+ return EXIT_USAGE;
62
93
  }
94
+ const ui = await (cli.loadUi ?? loadBundledUi)();
95
+ const launch = {
96
+ agents,
97
+ agent: options.agent,
98
+ cwd: resolve(cli.cwd, options.cwd ?? '.'),
99
+ model: options.model,
100
+ effort: options.effort,
101
+ resume: options.resume,
102
+ approveAll: options.approveAll,
103
+ env: cli.env,
104
+ version: packageVersion(),
105
+ stdout: tty.stdout,
106
+ stderr: cli.stderr,
107
+ stdin: tty.stdin,
108
+ signal: cli.signal,
109
+ port: options.port,
110
+ open: options.open,
111
+ };
112
+ return options.kind === 'chat' ? ui.runChat(launch) : ui.runWeb(launch);
113
+ }
114
+ /** The front ends are bundled into dist/ui by scripts/build-ui.mjs; the path is kept opaque to tsc. */
115
+ function loadBundledUi() {
116
+ const bundle = new URL('../ui/index.js', import.meta.url).href;
117
+ return import(bundle);
63
118
  }
64
119
  function listAgents(cli, agents, json) {
65
120
  const found = detectAgents(agents, cli.env);
@@ -90,6 +145,7 @@ async function runTask(cli, agents, options) {
90
145
  model: options.model,
91
146
  effort: options.effort,
92
147
  maxTurns: options.maxTurns,
148
+ resume: options.resume,
93
149
  timeoutMs: options.timeoutMs,
94
150
  env: cli.env,
95
151
  signal: cli.signal,