genaicode 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +59 -11
- package/dist/agents/cli-agent.d.ts +28 -0
- package/dist/agents/cli-agent.js +57 -0
- package/dist/agents/cli-agent.js.map +1 -0
- package/dist/agents/discovery.d.ts +10 -0
- package/dist/agents/discovery.js +31 -0
- package/dist/agents/discovery.js.map +1 -0
- package/dist/agents/drivers/claude.d.ts +25 -0
- package/dist/agents/drivers/claude.js +184 -0
- package/dist/agents/drivers/claude.js.map +1 -0
- package/dist/agents/drivers/codex-live.d.ts +17 -0
- package/dist/agents/drivers/codex-live.js +182 -0
- package/dist/agents/drivers/codex-live.js.map +1 -0
- package/dist/agents/drivers/codex.d.ts +27 -0
- package/dist/agents/drivers/codex.js +176 -0
- package/dist/agents/drivers/codex.js.map +1 -0
- package/dist/agents/drivers/copilot.d.ts +27 -0
- package/dist/agents/drivers/copilot.js +199 -0
- package/dist/agents/drivers/copilot.js.map +1 -0
- package/dist/agents/drivers/cursor.d.ts +23 -0
- package/dist/agents/drivers/cursor.js +174 -0
- package/dist/agents/drivers/cursor.js.map +1 -0
- package/dist/agents/drivers/gemini.d.ts +18 -0
- package/dist/agents/drivers/gemini.js +118 -0
- package/dist/agents/drivers/gemini.js.map +1 -0
- package/dist/agents/drivers/json.d.ts +6 -0
- package/dist/agents/drivers/json.js +20 -0
- package/dist/agents/drivers/json.js.map +1 -0
- package/dist/agents/drivers/muse-live.d.ts +17 -0
- package/dist/agents/drivers/muse-live.js +112 -0
- package/dist/agents/drivers/muse-live.js.map +1 -0
- package/dist/agents/drivers/muse.d.ts +12 -0
- package/dist/agents/drivers/muse.js +87 -0
- package/dist/agents/drivers/muse.js.map +1 -0
- package/dist/agents/drivers/opencode.d.ts +17 -0
- package/dist/agents/drivers/opencode.js +103 -0
- package/dist/agents/drivers/opencode.js.map +1 -0
- package/dist/agents/env.d.ts +16 -0
- package/dist/agents/env.js +46 -0
- package/dist/agents/env.js.map +1 -0
- package/dist/agents/event-queue.d.ts +44 -0
- package/dist/agents/event-queue.js +123 -0
- package/dist/agents/event-queue.js.map +1 -0
- package/dist/agents/hosted.d.ts +33 -0
- package/dist/agents/hosted.js +129 -0
- package/dist/agents/hosted.js.map +1 -0
- package/dist/agents/live-agent.d.ts +37 -0
- package/dist/agents/live-agent.js +142 -0
- package/dist/agents/live-agent.js.map +1 -0
- package/dist/agents/prepare.d.ts +33 -0
- package/dist/agents/prepare.js +52 -0
- package/dist/agents/prepare.js.map +1 -0
- package/dist/agents/process.d.ts +39 -0
- package/dist/agents/process.js +140 -0
- package/dist/agents/process.js.map +1 -0
- package/dist/agents/rpc.d.ts +29 -0
- package/dist/agents/rpc.js +101 -0
- package/dist/agents/rpc.js.map +1 -0
- package/dist/agents/runtime.d.ts +26 -0
- package/dist/agents/runtime.js +97 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/agents/types.d.ts +158 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/verify.d.ts +36 -0
- package/dist/agents/verify.js +43 -0
- package/dist/agents/verify.js.map +1 -0
- package/dist/agents.d.ts +36 -0
- package/dist/agents.js +19 -0
- package/dist/agents.js.map +1 -0
- package/dist/providers/google-converter.js +30 -14
- package/dist/providers/google-converter.js.map +1 -1
- package/dist/providers/google.d.ts +8 -0
- package/dist/providers/google.js.map +1 -1
- package/docs/agents.md +269 -0
- package/docs/pivot.md +4 -0
- package/docs/releasing.md +26 -0
- package/docs/semver.md +5 -0
- package/package.json +5 -1
package/docs/agents.md
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Coding agents (`genaicode/agents`)
|
|
2
|
+
|
|
3
|
+
> Status: experimental in 2.x. The API may change in a minor release until it is marked
|
|
4
|
+
> stable in [semver.md](./semver.md).
|
|
5
|
+
|
|
6
|
+
`genaicode/agents` runs coding-agent CLIs (Claude Code, Codex, Muse) as child processes
|
|
7
|
+
behind one interface. It is the agent-side counterpart of `ModelProvider`. A driver
|
|
8
|
+
translates at the edge and does not own application policy.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
In scope:
|
|
13
|
+
|
|
14
|
+
- starting an installed agent CLI headlessly on a task (a prompt and a working directory),
|
|
15
|
+
- decoding each vendor's JSON event stream into one `AgentEvent` IR,
|
|
16
|
+
- a final `AgentResult` (status, final message, session id, usage),
|
|
17
|
+
- abort, timeout, and killing the whole process group,
|
|
18
|
+
- finding which agent CLIs are on `PATH`.
|
|
19
|
+
|
|
20
|
+
Out of scope, and left to application code:
|
|
21
|
+
|
|
22
|
+
- sandboxing, credentials, and billing, which belong to the agent itself,
|
|
23
|
+
- choosing an agent or model, retries, and verify-and-repair loops,
|
|
24
|
+
- prompts and repository tools. GenAIcode adds no agent loop of its own.
|
|
25
|
+
|
|
26
|
+
## Running a task
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { claude } from 'genaicode/agents';
|
|
30
|
+
|
|
31
|
+
const run = claude().run({
|
|
32
|
+
prompt: 'Rename getUser to fetchUser across src/',
|
|
33
|
+
cwd: '/work/repo',
|
|
34
|
+
model: 'claude-sonnet-5', // optional; omit for the CLI default
|
|
35
|
+
effort: 'high', // optional; see agent.capabilities.effort
|
|
36
|
+
maxTurns: 40, // where capabilities.maxTurns is true
|
|
37
|
+
timeoutMs: 30 * 60_000,
|
|
38
|
+
signal: abortController.signal,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
for await (const event of run) console.log(event);
|
|
42
|
+
const result = await run.result;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`run()` starts the process right away. You can iterate the run for events once, or just
|
|
46
|
+
await `result`. `abort()` or the task's `signal` stops the agent, and `result` then
|
|
47
|
+
settles with `status: 'aborted'`. `result` never rejects: spawn failures, a missing `cwd`,
|
|
48
|
+
timeouts, and agent-reported failures all come back as `status` with an `error` string.
|
|
49
|
+
|
|
50
|
+
Buffered events are bounded. Before you iterate, a run keeps only its newest events (about
|
|
51
|
+
8 MiB, at most 1,000). While you iterate, nothing is dropped: if you fall more than about
|
|
52
|
+
8 MiB behind, the agent's output stops being read until you catch up, so the agent waits for
|
|
53
|
+
you. So awaiting `result` inside the loop while far behind waits until you `abort()`.
|
|
54
|
+
Stopping iteration early discards the rest; `result` still settles.
|
|
55
|
+
|
|
56
|
+
`result.ok` is true only when the process exited 0 and the agent did not report a
|
|
57
|
+
failure of its own. A zero exit alone is not treated as success.
|
|
58
|
+
|
|
59
|
+
## Events
|
|
60
|
+
|
|
61
|
+
| Event | Meaning |
|
|
62
|
+
| ------------------------- | -------------------------------------------------------------------- |
|
|
63
|
+
| `session` | Agent session or thread id (use it to resume in the agent's own CLI) |
|
|
64
|
+
| `text-delta` | Streamed assistant text |
|
|
65
|
+
| `message` | A complete assistant message. The last one becomes `result.text` |
|
|
66
|
+
| `tool-start` / `tool-end` | Tool use (`shell`, `Edit`, `server/tool` for MCP, ...) |
|
|
67
|
+
| `file-change` | Paths the agent reported editing |
|
|
68
|
+
| `approval-request` | The agent is waiting for a permission decision |
|
|
69
|
+
| `usage` | Token usage, plus `costUsd` when the agent reports it |
|
|
70
|
+
| `error` | An error the agent reported |
|
|
71
|
+
| `stderr` | Raw stderr chunk |
|
|
72
|
+
| `raw` | A stdout line that was not JSON |
|
|
73
|
+
| `done` | Always last; carries the `AgentResult` |
|
|
74
|
+
|
|
75
|
+
Vendor events that have no mapping are dropped.
|
|
76
|
+
|
|
77
|
+
## Drivers
|
|
78
|
+
|
|
79
|
+
| Driver | Command | Mode | Notes |
|
|
80
|
+
| --------------------- | -------------- | ---------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
81
|
+
| `claude(options?)` | `claude` | `-p --output-format stream-json` | `permissionMode` defaults to `acceptEdits`; `allowedTools` / `disallowedTools` |
|
|
82
|
+
| `codex(options?)` | `codex` | `exec --json` | `sandbox` defaults to `workspace-write`; effort via `model_reasoning_effort` |
|
|
83
|
+
| `muse(options?)` | `muse` | `exec --json --trust-workspace` | `maxTurns` maps to `--max-model-steps` |
|
|
84
|
+
| `codexLive(options?)` | `codex` | `app-server` (JSON-RPC) | `steer()`, approvals, MCP. See [Live sessions](#live-sessions-steering-and-approvals) |
|
|
85
|
+
| `museLive(options?)` | `muse` | `serve` (JSON-RPC) | `steer()`. Approval requests are reported, then denied |
|
|
86
|
+
| `gemini(options?)` | `gemini` | `--output-format stream-json --prompt=…` | `approvalMode` defaults to `auto_edit`; `--skip-trust` unless `trustWorkspace: false` |
|
|
87
|
+
| `cursor(options?)` | `cursor-agent` | `-p --output-format stream-json` | `--force --approve-mcps` by default (`--trust` if `force: false`); `partialOutput` |
|
|
88
|
+
| `opencode(options?)` | `opencode` | `run --format json` | `model` is `provider/model`; `effort` maps to `--variant`; `autoApprove` adds `--auto` |
|
|
89
|
+
| `copilot(options?)` | `copilot` | `--output-format json --prompt=…` | `--allow-all-tools --no-ask-user` by default; `allowTools` / `denyTools` patterns |
|
|
90
|
+
|
|
91
|
+
Every driver accepts `command` to point at a specific executable. `task.extraArgs` is
|
|
92
|
+
inserted before the prompt for flags that have no portable field.
|
|
93
|
+
|
|
94
|
+
The agent uses whatever login it already has. For example, Claude Code bills an API key if
|
|
95
|
+
`ANTHROPIC_API_KEY` is set in `task.env`. Pass an explicit `env` when that matters.
|
|
96
|
+
|
|
97
|
+
## Live sessions: steering and approvals
|
|
98
|
+
|
|
99
|
+
`codexLive()` and `museLive()` talk JSON-RPC to the agent's own server (`codex app-server`,
|
|
100
|
+
`muse serve`) instead of running one headless command. The process stays up for the whole
|
|
101
|
+
task, so you can add input while it works:
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
import { codexLive } from 'genaicode/agents';
|
|
105
|
+
|
|
106
|
+
const run = codexLive().run({
|
|
107
|
+
prompt: 'Migrate the date helpers to Temporal',
|
|
108
|
+
cwd: '/work/repo',
|
|
109
|
+
onApproval: (request) => (request.kind === 'file-change' ? 'approve' : 'deny'),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
setTimeout(() => run.steer?.('Keep the old exports as deprecated aliases.'), 60_000);
|
|
113
|
+
const result = await run.result;
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- `steer(text)` resolves once the agent acknowledges the input. It rejects after the task has
|
|
117
|
+
ended, and when no acknowledgement arrives (the input may or may not have reached the agent).
|
|
118
|
+
- `onApproval` is asked for each permission request. It gets a `command`, `file-change` or
|
|
119
|
+
`other` request and returns `'approve'` or `'deny'`. If `onApproval` is missing or throws, the
|
|
120
|
+
request is denied. Codex runs with approval policy `never` when no `onApproval` is set.
|
|
121
|
+
- `museLive()` reports approval requests as events but always denies them
|
|
122
|
+
(`capabilities.approvals` is false).
|
|
123
|
+
- The task ends when the agent reports its turn complete. The server is then stopped. An exit
|
|
124
|
+
before that point is a failure, even with exit code 0.
|
|
125
|
+
|
|
126
|
+
For other JSON-RPC agents, `liveAgent({ name, command, args, drive })` provides the process,
|
|
127
|
+
an `RpcPeer`, event emission, the approval flow, and `setSteer()`. `drive(session)` runs the
|
|
128
|
+
protocol and resolves with `{ ok, error? }` when the turn ends.
|
|
129
|
+
|
|
130
|
+
## MCP servers
|
|
131
|
+
|
|
132
|
+
`task.mcpServers` attaches MCP servers for one task on drivers with `capabilities.mcp`
|
|
133
|
+
(`claude`, `codex`, `codexLive`, `copilot`):
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
await claude().run({
|
|
137
|
+
prompt: 'Summarize open incidents',
|
|
138
|
+
cwd,
|
|
139
|
+
mcpServers: [
|
|
140
|
+
{ name: 'tickets', url: 'https://mcp.example.com/tickets', headers: { Authorization: `Bearer ${token}` } },
|
|
141
|
+
{ name: 'fs', command: 'mcp-fs', args: ['--root', cwd] },
|
|
142
|
+
],
|
|
143
|
+
}).result;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
- Claude Code gets a temporary `--mcp-config` file (mode 0600, removed after the run). The
|
|
147
|
+
servers' tools are pre-allowed with `--allowedTools mcp__<name>`, because a headless run
|
|
148
|
+
cannot ask. Pass `allowMcpTools: false` to turn that off, or `strictMcpConfig: true` to
|
|
149
|
+
ignore the user's own MCP config.
|
|
150
|
+
- Codex gets `-c mcp_servers.<name>.*` overrides. HTTP header values go through environment
|
|
151
|
+
variables (`env_http_headers`), so they never appear in argv. A stdio server's `env` is set
|
|
152
|
+
on Codex's own environment and forwarded by name (`env_vars`); two servers cannot use
|
|
153
|
+
different values for the same variable.
|
|
154
|
+
- Copilot CLI gets a temporary `--additional-mcp-config @<file>` (mode 0600, removed after
|
|
155
|
+
the run), added to the user's own MCP config. `--allow-all-tools` already covers the
|
|
156
|
+
servers' tools; with `allowAllTools: false` each server is pre-allowed with
|
|
157
|
+
`--allow-tool=<name>` unless `allowMcpTools: false`.
|
|
158
|
+
- A driver without MCP support fails the task before spawning anything, instead of silently
|
|
159
|
+
dropping the servers. Server names must match `/^[A-Za-z0-9_-]+$/`.
|
|
160
|
+
|
|
161
|
+
## Environment
|
|
162
|
+
|
|
163
|
+
The child inherits `task.env ?? process.env`. If your process holds model-provider keys that
|
|
164
|
+
the agent should not bill, pass a scrubbed copy:
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { scrubEnv, withoutProviderCredentials } from 'genaicode/agents';
|
|
168
|
+
|
|
169
|
+
claude().run({ prompt, cwd, env: withoutProviderCredentials() }); // agent uses its own login
|
|
170
|
+
scrubEnv(process.env, { names: [/^MYAPP_/], values: [/^sk_live_/] });
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Verify and repair
|
|
174
|
+
|
|
175
|
+
`runWithVerify` is an opt-in loop. It runs the task, then your check. If the check fails,
|
|
176
|
+
it runs the agent again with the failure report, up to `maxRepairs` times (default 2):
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import { runWithVerify } from 'genaicode/agents';
|
|
180
|
+
|
|
181
|
+
const outcome = await runWithVerify(
|
|
182
|
+
codex(),
|
|
183
|
+
{ prompt, cwd },
|
|
184
|
+
{
|
|
185
|
+
verify: async () => {
|
|
186
|
+
const { code, output } = await runTests(cwd); // your own check
|
|
187
|
+
return { ok: code === 0, detail: output.slice(-4000) };
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
);
|
|
191
|
+
// outcome: { ok, attempts: [{ prompt, result, report }], error? }
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Every attempt is a fresh `run()` on the same working tree. The default repair prompt marks
|
|
195
|
+
the report as tool output. Pass `repairPrompt` to write your own.
|
|
196
|
+
|
|
197
|
+
## Discovery
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
import { claude, codex, muse, detectAgents } from 'genaicode/agents';
|
|
201
|
+
|
|
202
|
+
detectAgents([claude(), codex(), muse()]);
|
|
203
|
+
// [{ agent, path: '/usr/local/bin/claude' }, { agent, path: null }, ...]
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Discovery checks only that the executable is present. Whether the agent is logged in, or
|
|
207
|
+
supports a given flag, shows up when the run fails.
|
|
208
|
+
|
|
209
|
+
## Hosted agents
|
|
210
|
+
|
|
211
|
+
Tasks can also run on a vendor's machines instead of a local process. Implement
|
|
212
|
+
`HostedAgentProvider` (`start`, `poll`, `cancel`, and optionally `send`) and wrap it with
|
|
213
|
+
`hostedAgent()` to get the same `CodingAgent` API:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
import { hostedAgent, type HostedAgentProvider } from 'genaicode/agents';
|
|
217
|
+
|
|
218
|
+
const provider: HostedAgentProvider = {
|
|
219
|
+
name: 'my-cloud-agent',
|
|
220
|
+
start: (task, signal) => api.createTask({ repo: task.cwd, prompt: task.prompt }, { signal }),
|
|
221
|
+
poll: (id, cursor, signal) => api.getTask(id, { after: cursor, signal }), // { state, events?, cursor?, error? }
|
|
222
|
+
send: (id, text) => api.message(id, text),
|
|
223
|
+
cancel: (id) => api.cancel(id),
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const run = hostedAgent(provider, { pollIntervalMs: 10_000 }).run({ prompt, cwd: 'org/repo' });
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`cwd` is passed to the provider as its workspace reference, such as a repository or branch.
|
|
230
|
+
`env`, `signal`, `timeoutMs` and `onApproval` stay local. Abort and timeout call `cancel`.
|
|
231
|
+
`send` backs `steer()`.
|
|
232
|
+
|
|
233
|
+
## Writing a driver
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
import { cliAgent } from 'genaicode/agents';
|
|
237
|
+
|
|
238
|
+
export const myAgent = cliAgent({
|
|
239
|
+
name: 'my-agent',
|
|
240
|
+
command: 'my-agent',
|
|
241
|
+
capabilities: { effort: ['low', 'high'] },
|
|
242
|
+
args: (task) => ['run', '--json', ...(task.model ? ['--model', task.model] : []), task.prompt],
|
|
243
|
+
createParser() {
|
|
244
|
+
let ok: boolean | undefined;
|
|
245
|
+
return {
|
|
246
|
+
event(value) {
|
|
247
|
+
// Called with each JSON stdout line; return zero or more AgentEvents.
|
|
248
|
+
const event = value as { kind?: string; text?: string };
|
|
249
|
+
if (event.kind === 'say' && event.text) return [{ type: 'message', text: event.text }];
|
|
250
|
+
if (event.kind === 'end') ok = true;
|
|
251
|
+
return [];
|
|
252
|
+
},
|
|
253
|
+
outcome: () => (ok === undefined ? undefined : { ok }),
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
`createParser()` is called once per run, so a parser can keep state such as tool-id-to-name
|
|
260
|
+
maps. Parsers are pure, so you can unit test them by feeding recorded JSON lines, the same
|
|
261
|
+
way the built-in drivers are tested.
|
|
262
|
+
|
|
263
|
+
## Roadmap
|
|
264
|
+
|
|
265
|
+
1. Headless drivers for claude, codex, and muse, the event IR, and discovery. Done.
|
|
266
|
+
2. Live sessions (`codex app-server`, `muse serve`): `steer()` mid-task, approval replies. Done.
|
|
267
|
+
3. MCP server injection per driver, an env scrub helper, and an opt-in verify/repair helper. Done.
|
|
268
|
+
4. More CLIs (gemini, cursor, opencode) and a hosted coding-agent seam (`hostedAgent`). Done.
|
|
269
|
+
5. A Copilot CLI driver (`copilot`). Done.
|
package/docs/pivot.md
CHANGED
|
@@ -41,6 +41,10 @@ The following 1.x capabilities are intentionally removed:
|
|
|
41
41
|
- agent-oriented plugin and action systems;
|
|
42
42
|
- image-editing operations and coding evaluations.
|
|
43
43
|
|
|
44
|
+
The 2.x `genaicode/agents` subpath does not restore these. It drives _external_
|
|
45
|
+
coding-agent CLIs behind one task/event interface, the same way providers wrap model APIs,
|
|
46
|
+
and it adds no agent loop, prompts, or repository tools of its own. See [agents.md](./agents.md).
|
|
47
|
+
|
|
44
48
|
This is a major-version break. The old implementation remains available in git history
|
|
45
49
|
and in the 1.x npm line.
|
|
46
50
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Releasing
|
|
2
|
+
|
|
3
|
+
Pushing a version tag publishes that version to npm from GitHub Actions
|
|
4
|
+
([`.github/workflows/publish.yaml`](../.github/workflows/publish.yaml)).
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
npm version patch # or minor / major: bumps package.json, commits, tags vX.Y.Z
|
|
8
|
+
git push --follow-tags
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The workflow refuses a tag that does not match `package.json`, runs `npm run check`
|
|
12
|
+
through `prepublishOnly`, and publishes with provenance.
|
|
13
|
+
|
|
14
|
+
## One-time setup
|
|
15
|
+
|
|
16
|
+
The workflow authenticates with npm trusted publishing (OIDC), so no npm token is stored.
|
|
17
|
+
On npmjs.com, open the `genaicode` package, then Settings → Trusted publishing, and add a
|
|
18
|
+
GitHub Actions publisher:
|
|
19
|
+
|
|
20
|
+
- Organization or user: `gtanczyk`
|
|
21
|
+
- Repository: `genaicode`
|
|
22
|
+
- Workflow filename: `publish.yaml`
|
|
23
|
+
- Environment: `npm`
|
|
24
|
+
|
|
25
|
+
The `npm` environment also exists in the repository's Settings → Environments, where it can
|
|
26
|
+
require a reviewer or restrict which tags may deploy.
|
package/docs/semver.md
CHANGED
|
@@ -17,6 +17,11 @@ These are covered by minor/patch compatibility within 2.x:
|
|
|
17
17
|
- Error helpers (`classifyError`, `isRetryable`, `withRetry`)
|
|
18
18
|
- Provider factories and converter functions exported from `genaicode/providers`
|
|
19
19
|
|
|
20
|
+
## Experimental
|
|
21
|
+
|
|
22
|
+
- `genaicode/agents` (coding-agent drivers, `AgentEvent`, `CodingAgent`) may change in a
|
|
23
|
+
minor release until this section lists it as stable. See [agents.md](./agents.md).
|
|
24
|
+
|
|
20
25
|
## Additive changes (minor)
|
|
21
26
|
|
|
22
27
|
Safe in a minor release:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genaicode",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "A small, provider-neutral TypeScript toolkit for calling LLMs from backend code.",
|
|
5
5
|
"author": "Grzegorz Tańczyk",
|
|
6
6
|
"repository": {
|
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
"./providers": {
|
|
40
40
|
"types": "./dist/providers.d.ts",
|
|
41
41
|
"import": "./dist/providers.js"
|
|
42
|
+
},
|
|
43
|
+
"./agents": {
|
|
44
|
+
"types": "./dist/agents.d.ts",
|
|
45
|
+
"import": "./dist/agents.js"
|
|
42
46
|
}
|
|
43
47
|
},
|
|
44
48
|
"scripts": {
|