genaicode 2.18.2 → 2.18.4
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/README.md +22 -6
- package/dist/cli/embed.d.ts +1 -1
- package/dist/cli/embed.js +2 -2
- package/dist/cli/embed.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +1 -1
- package/dist/overlay/client.d.ts +25 -0
- package/dist/{vite/overlay.js → overlay/client.js} +72 -4
- package/dist/overlay/client.js.map +1 -0
- package/dist/overlay/server.d.ts +89 -0
- package/dist/overlay/server.js +197 -0
- package/dist/overlay/server.js.map +1 -0
- package/dist/react/agent-chat.d.ts +2 -0
- package/dist/react/agent-chat.js +2 -2
- package/dist/react/agent-chat.js.map +1 -1
- package/dist/ui/index.js +70 -68
- package/dist/ui/web-client.js +6 -6
- package/dist/ui.d.ts +31 -0
- package/dist/ui.js +21 -0
- package/dist/ui.js.map +1 -1
- package/dist/vite/plugin.d.ts +3 -16
- package/dist/vite/plugin.js +26 -131
- package/dist/vite/plugin.js.map +1 -1
- package/docs/CHANGELOG.md +16 -1
- package/{skills → docs/skills}/genaicode-embed/SKILL.md +83 -142
- package/package.json +1 -2
- package/dist/vite/overlay.d.ts +0 -19
- package/dist/vite/overlay.js.map +0 -1
|
@@ -18,10 +18,10 @@ the project has HTML pages a browser can open.
|
|
|
18
18
|
in `vite dev` the page gets a wolf button that opens a chat with the agent working in
|
|
19
19
|
the project root, and the page's errors can be sent to the agent with one click.
|
|
20
20
|
Builds are untouched, nothing reaches production.
|
|
21
|
-
2. **Dev
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
2. **Dev overlay without Vite** (`createDevOverlay` from `genaicode/ui`): the same overlay
|
|
22
|
+
(the wolf, the error badge, "Fix N errors") for apps on webpack, Next.js, Express,
|
|
23
|
+
Fastify, Koa or any other Node dev server. The dev server mounts its routes, the page
|
|
24
|
+
loads one script in development. A few more lines than the plugin, same result.
|
|
25
25
|
3. **In-app agent** (`genaicode/app-agent` on the server, `<AppAgentChat>` from
|
|
26
26
|
`genaicode/react` on the page): for a local app with its own Node server (an admin
|
|
27
27
|
console, an internal tool, an editor) whose users want the agent to act on the app's
|
|
@@ -31,9 +31,9 @@ the project has HTML pages a browser can open.
|
|
|
31
31
|
4. **A dev server of your own**: the project has pages but nothing serves them in
|
|
32
32
|
development (static HTML, files opened from `file://`, a build script that writes
|
|
33
33
|
`index.html`, a game jam entry with a size budget...). Write a small Node script that
|
|
34
|
-
serves those files on localhost
|
|
35
|
-
npm script to start it. The files on disk and the build output stay
|
|
36
|
-
budgets and release builds are not affected.
|
|
34
|
+
serves those files on localhost with the overlay from option 2 injected into the HTML
|
|
35
|
+
it serves, and an npm script to start it. The files on disk and the build output stay
|
|
36
|
+
untouched, so size budgets and release builds are not affected.
|
|
37
37
|
5. **Last resort**: no Node at all in the project and no HTML to serve (a Rails, Django or
|
|
38
38
|
Go app whose server you cannot change safely): tell the user to run `npx genaicode ui`
|
|
39
39
|
(browser) or `npx genaicode` (terminal) next to their dev server, and say why.
|
|
@@ -78,8 +78,13 @@ allow, batch what must run into few commands, and do not run the dev server just
|
|
|
78
78
|
production build. For options 1, 2 and 4 the production output must not contain
|
|
79
79
|
genaicode. Fix what you broke; do not "fix" unrelated failures. Remove build output
|
|
80
80
|
you created that the project does not track.
|
|
81
|
-
6. **Report
|
|
82
|
-
to
|
|
81
|
+
6. **Report**, starting with how to see it, before anything else: one line with the exact
|
|
82
|
+
command to run and what happens next, e.g. "Run `npm run agent`: the game opens in your
|
|
83
|
+
browser with the genaicode wolf in the bottom-right corner. You can also type
|
|
84
|
+
`!npm run agent` right here." The developer may not know
|
|
85
|
+
the project's scripts or that a new one exists, so never leave this for the end of a
|
|
86
|
+
long summary. Then what you changed, file by file, briefly. Say that the agent uses its
|
|
87
|
+
own CLI login and billing.
|
|
83
88
|
|
|
84
89
|
## Recipe: Vite overlay
|
|
85
90
|
|
|
@@ -109,109 +114,63 @@ export default defineConfig({
|
|
|
109
114
|
- The chat runs on its own 127.0.0.1 port, only the app's own pages can frame it, and it
|
|
110
115
|
takes requests only from the same machine. No env vars or secrets are needed.
|
|
111
116
|
|
|
112
|
-
## Recipe: dev
|
|
117
|
+
## Recipe: dev overlay without Vite
|
|
118
|
+
|
|
119
|
+
`createDevOverlay()` from `genaicode/ui` is the Vite plugin's overlay for any Node dev
|
|
120
|
+
server: the genaicode wolf in the page's bottom-right corner opens the chat, its badge
|
|
121
|
+
counts the page's errors, and "Fix N errors" sends them to the agent. Do not write your own
|
|
122
|
+
button, panel or session route: use this.
|
|
113
123
|
|
|
114
124
|
Server side, in the Node process that serves the app in development, and only there:
|
|
115
125
|
|
|
116
126
|
```ts
|
|
117
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
118
|
-
|
|
119
127
|
// Development only: production never imports genaicode.
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
panel ??= import('genaicode/ui').then(({ startEmbeddedWeb }) =>
|
|
125
|
-
startEmbeddedWeb({ cwd: process.cwd(), frameAncestors: () => [...origins] }),
|
|
126
|
-
);
|
|
127
|
-
return panel;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// GET /__genaicode/session -> { url }. The url carries the chat's access token: hand it only
|
|
131
|
-
// to the app's own pages on this machine.
|
|
132
|
-
export async function genaicodeSession(req: IncomingMessage, res: ServerResponse) {
|
|
133
|
-
const address = req.socket.remoteAddress ?? '';
|
|
134
|
-
const local = address === '::1' || address.startsWith('127.') || address.startsWith('::ffff:127.');
|
|
135
|
-
const host = req.headers.host ?? '';
|
|
136
|
-
const loopbackHost = /^(localhost|127\.0\.0\.1|\[::1\])(:\d+)?$/.test(host);
|
|
137
|
-
if (!local || !loopbackHost || req.headers['sec-fetch-site'] !== 'same-origin') {
|
|
138
|
-
res.writeHead(403).end();
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
origins.add(`http://${host}`); // localhost and 127.0.0.1 can both frame it, without a restart
|
|
142
|
-
const { url } = await genaicodePanel();
|
|
143
|
-
res.writeHead(200, { 'content-type': 'application/json', 'cache-control': 'no-store' });
|
|
144
|
-
res.end(JSON.stringify({ url }));
|
|
128
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
129
|
+
const { createDevOverlay } = await import('genaicode/ui');
|
|
130
|
+
const overlay = createDevOverlay(); // the agent works in process.cwd(); `cwd` to change
|
|
131
|
+
app.use(overlay.middleware); // before the app's own routes
|
|
145
132
|
}
|
|
146
133
|
```
|
|
147
134
|
|
|
148
|
-
- `
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
135
|
+
- `overlay.handle(req, res)` answers everything under `/__genaicode/` and resolves to
|
|
136
|
+
`false` for other URLs; `overlay.middleware` is the same for Express / Connect. Options:
|
|
137
|
+
`cwd`, `agent`, `model`, `effort`, `approveAll` (only if asked), `port`,
|
|
138
|
+
`captureErrors: false`, like the Vite plugin.
|
|
139
|
+
- The chat starts in the background on 127.0.0.1. Its token goes only to the app's own
|
|
140
|
+
pages, on this machine, opened at `localhost`, `*.localhost`, `127.0.0.1` or `[::1]`.
|
|
141
|
+
Without an agent CLI it logs why and the app runs on.
|
|
154
142
|
- Start it once per process. Dev servers that reload server code (Next.js, nodemon...)
|
|
155
|
-
re-run modules: keep the
|
|
156
|
-
- Where to hook
|
|
157
|
-
- Express / Connect
|
|
158
|
-
|
|
159
|
-
- webpack-dev-server: `
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
`
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
`
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<>
|
|
187
|
-
<button onClick={() => setOpen(!open)} style={{ position: 'fixed', right: 16, bottom: 16, zIndex: 2147483647 }}>
|
|
188
|
-
Agent
|
|
189
|
-
</button>
|
|
190
|
-
{open && (
|
|
191
|
-
<iframe
|
|
192
|
-
src={url}
|
|
193
|
-
title="genaicode"
|
|
194
|
-
style={{
|
|
195
|
-
position: 'fixed',
|
|
196
|
-
right: 16,
|
|
197
|
-
bottom: 64,
|
|
198
|
-
width: 420,
|
|
199
|
-
height: '70vh',
|
|
200
|
-
zIndex: 2147483647,
|
|
201
|
-
border: 0,
|
|
202
|
-
borderRadius: 12,
|
|
203
|
-
boxShadow: '0 8px 32px #0004',
|
|
204
|
-
}}
|
|
205
|
-
/>
|
|
206
|
-
)}
|
|
207
|
-
</>
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Not React? The same in the app's own framework or plain DOM: fetch the session, then a
|
|
213
|
-
fixed button that toggles a fixed iframe. Keep the token URL out of logs, `localStorage`
|
|
214
|
-
and anything the page sends elsewhere.
|
|
143
|
+
re-run modules: keep the overlay on `globalThis` so a reload does not start a second chat.
|
|
144
|
+
- Where to hook it:
|
|
145
|
+
- Express / Connect: `app.use(overlay.middleware)` before the routes.
|
|
146
|
+
- node:http: `if (await overlay.handle(req, res)) return;` at the top of the handler.
|
|
147
|
+
- webpack-dev-server: `setupMiddlewares: (middlewares) => [{ name: 'genaicode', middleware: overlay.middleware }, ...middlewares]`.
|
|
148
|
+
- Fastify: an `onRequest` hook that, for URLs under `/__genaicode/`, calls
|
|
149
|
+
`reply.hijack()` and `overlay.handle(request.raw, reply.raw)`. Koa: a middleware that
|
|
150
|
+
sets `ctx.respond = false` when `await overlay.handle(ctx.req, ctx.res)` is true.
|
|
151
|
+
- Next.js: a rewrite in `next.config` from `/__genaicode/:path*` to
|
|
152
|
+
`/api/genaicode/:path*` (development only), and a pages-router route
|
|
153
|
+
`pages/api/genaicode/[...path].ts` with `export const config = { api: { bodyParser: false } }`
|
|
154
|
+
that returns 404 outside development, sets
|
|
155
|
+
`req.url = '/__genaicode/' + [req.query.path].flat().join('/')` and calls
|
|
156
|
+
`overlay.handle(req, res)`.
|
|
157
|
+
|
|
158
|
+
Page side, the overlay script in development only:
|
|
159
|
+
|
|
160
|
+
- Where the server renders or serves the HTML: `overlay.injectHtml(html)`, or
|
|
161
|
+
`overlay.script` (an inline error collector plus
|
|
162
|
+
`<script type="module" src="/__genaicode/overlay.js"></script>`) at the top of the dev
|
|
163
|
+
template's `<head>`.
|
|
164
|
+
- Otherwise, in the app's entry, behind the bundler's dev flag so production drops it:
|
|
165
|
+
|
|
166
|
+
```js
|
|
167
|
+
if (process.env.NODE_ENV === 'development') {
|
|
168
|
+
const script = document.createElement('script');
|
|
169
|
+
script.type = 'module';
|
|
170
|
+
script.src = '/__genaicode/overlay.js';
|
|
171
|
+
document.head.append(script);
|
|
172
|
+
}
|
|
173
|
+
```
|
|
215
174
|
|
|
216
175
|
## Recipe: a dev server of your own
|
|
217
176
|
|
|
@@ -220,17 +179,17 @@ project's folder for scripts), plus `"agent": "node tools/agent-dev.mjs"` (or a
|
|
|
220
179
|
fits next to the existing scripts) in `package.json`:
|
|
221
180
|
|
|
222
181
|
```js
|
|
223
|
-
// Development only: serves <dir> on 127.0.0.1 with the genaicode
|
|
182
|
+
// Development only: serves <dir> on 127.0.0.1 with the genaicode overlay injected into HTML.
|
|
224
183
|
// The files on disk are not changed.
|
|
184
|
+
import { spawn } from 'node:child_process';
|
|
225
185
|
import { createServer } from 'node:http';
|
|
226
186
|
import { readFile, stat } from 'node:fs/promises';
|
|
227
187
|
import { extname, join, normalize, resolve, sep } from 'node:path';
|
|
228
|
-
import {
|
|
188
|
+
import { createDevOverlay } from 'genaicode/ui';
|
|
229
189
|
|
|
230
190
|
const root = resolve(process.argv[2] ?? 'build');
|
|
231
191
|
const port = Number(process.env.PORT ?? 5173);
|
|
232
|
-
const
|
|
233
|
-
const chat = await startEmbeddedWeb({ cwd: process.cwd(), frameAncestors: () => [...origins] });
|
|
192
|
+
const overlay = createDevOverlay();
|
|
234
193
|
const TYPES = {
|
|
235
194
|
'.html': 'text/html',
|
|
236
195
|
'.js': 'text/javascript',
|
|
@@ -241,26 +200,12 @@ const TYPES = {
|
|
|
241
200
|
'.svg': 'image/svg+xml',
|
|
242
201
|
'.wasm': 'application/wasm',
|
|
243
202
|
};
|
|
244
|
-
const PANEL = `<script type="module" src="/__genaicode/panel.js"></script>`;
|
|
245
203
|
|
|
246
204
|
createServer(async (req, res) => {
|
|
247
|
-
|
|
248
|
-
if (url.pathname === '/__genaicode/session') {
|
|
249
|
-
// The token: only this machine (a loopback Host, which stops DNS rebinding), only the
|
|
250
|
-
// app's own pages.
|
|
251
|
-
if (!origins.has(`http://${req.headers.host}`) || req.headers['sec-fetch-site'] !== 'same-origin') {
|
|
252
|
-
return res.writeHead(403).end();
|
|
253
|
-
}
|
|
254
|
-
res.writeHead(200, { 'content-type': 'application/json', 'cache-control': 'no-store' });
|
|
255
|
-
return res.end(JSON.stringify({ url: chat.url }));
|
|
256
|
-
}
|
|
257
|
-
if (url.pathname === '/__genaicode/panel.js') {
|
|
258
|
-
res.writeHead(200, { 'content-type': 'text/javascript' });
|
|
259
|
-
return res.end(PANEL_SCRIPT);
|
|
260
|
-
}
|
|
205
|
+
if (await overlay.handle(req, res)) return;
|
|
261
206
|
let file;
|
|
262
207
|
try {
|
|
263
|
-
file = normalize(join(root, decodeURIComponent(url.pathname)));
|
|
208
|
+
file = normalize(join(root, decodeURIComponent(new URL(req.url ?? '/', 'http://x').pathname)));
|
|
264
209
|
} catch {
|
|
265
210
|
return res.writeHead(400).end();
|
|
266
211
|
}
|
|
@@ -270,30 +215,26 @@ createServer(async (req, res) => {
|
|
|
270
215
|
if (!body) return res.writeHead(404).end('not found');
|
|
271
216
|
const type = TYPES[extname(file)] ?? 'application/octet-stream';
|
|
272
217
|
res.writeHead(200, { 'content-type': type, 'cache-control': 'no-store' });
|
|
273
|
-
res.end(type === 'text/html' ?
|
|
274
|
-
}).listen(port, '127.0.0.1', () =>
|
|
275
|
-
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
218
|
+
res.end(type === 'text/html' ? overlay.injectHtml(body.toString()) : body);
|
|
219
|
+
}).listen(port, '127.0.0.1', () => {
|
|
220
|
+
const page = `http://localhost:${port}/`;
|
|
221
|
+
console.log(`${page} (genaicode: the wolf in the bottom-right corner)`);
|
|
222
|
+
// Open it like `vite --open` does; NO_OPEN=1 to skip.
|
|
223
|
+
if (!process.env.NO_OPEN && !process.env.CI) {
|
|
224
|
+
const opener = { darwin: 'open', win32: 'explorer' }[process.platform] ?? 'xdg-open';
|
|
225
|
+
spawn(opener, [page], { stdio: 'ignore', detached: true })
|
|
226
|
+
.on('error', () => {})
|
|
227
|
+
.unref();
|
|
228
|
+
}
|
|
229
|
+
});
|
|
281
230
|
```
|
|
282
231
|
|
|
283
|
-
|
|
284
|
-
recipe above: fetch `/__genaicode/session`, then a fixed button in a corner that toggles a
|
|
285
|
-
fixed iframe with `src` set to the session `url`. Keep it out of the app's own code.
|
|
286
|
-
|
|
287
|
-
- Listen on `127.0.0.1` only, and hand out the token only for a loopback `Host` and
|
|
288
|
-
`Sec-Fetch-Site: same-origin`. Together they keep the token on this machine and away from
|
|
289
|
-
other sites, including DNS-rebinding pages.
|
|
232
|
+
- Listen on `127.0.0.1` only.
|
|
290
233
|
- Serve what the developer actually opens: the build output folder if the project builds
|
|
291
234
|
one (start or chain its build or watch script when it has one, e.g. with `--watch` or a
|
|
292
235
|
second process), otherwise the source folder with the HTML.
|
|
293
|
-
-
|
|
294
|
-
|
|
295
|
-
`/__genaicode/fix` route (same checks as the session route) which calls
|
|
296
|
-
`chat.controller.submit('Fix these errors in the page …' + details)`.
|
|
236
|
+
- Open the browser on start (as above), at the page the developer works on when there is
|
|
237
|
+
one obvious page (e.g. `/fireball/`), not a folder listing.
|
|
297
238
|
- A page that reloads itself on change (a watch build) is the developer's own; do not
|
|
298
239
|
add a live-reload system for this.
|
|
299
240
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genaicode",
|
|
3
|
-
"version": "2.18.
|
|
3
|
+
"version": "2.18.4",
|
|
4
4
|
"description": "Drive the coding-agent CLIs you already have (Claude Code, Codex, Copilot, Cursor, Gemini, opencode...) behind one API and one CLI, plus a thin provider-neutral LLM layer.",
|
|
5
5
|
"author": "Grzegorz Tańczyk",
|
|
6
6
|
"repository": {
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"docs",
|
|
36
36
|
"!docs/examples",
|
|
37
37
|
"!docs/media",
|
|
38
|
-
"skills",
|
|
39
38
|
"README.md",
|
|
40
39
|
"LICENSE"
|
|
41
40
|
],
|
package/dist/vite/overlay.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/** What the plugin tells the overlay. */
|
|
2
|
-
export interface OverlayConfig {
|
|
3
|
-
/** Path of the plugin's endpoints on the dev server, e.g. `/__genaicode`. */
|
|
4
|
-
api: string;
|
|
5
|
-
/** Collect errors from the page and offer to send them to the agent. */
|
|
6
|
-
captureErrors: boolean;
|
|
7
|
-
}
|
|
8
|
-
/** The part of Vite's `import.meta.hot` the overlay listens to. */
|
|
9
|
-
export interface OverlayHot {
|
|
10
|
-
on(event: string, callback: (payload: unknown) => void): void;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* The dev-server overlay: a wolf in the corner of the app that opens the genaicode UI in a
|
|
14
|
-
* panel, and collects the page's errors so one click sends them to the agent.
|
|
15
|
-
*
|
|
16
|
-
* The plugin serves this function's source (`mountOverlay.toString()`) as a module, so it must
|
|
17
|
-
* not use anything from outside its own body.
|
|
18
|
-
*/
|
|
19
|
-
export declare function mountOverlay(config: OverlayConfig, hot: OverlayHot | undefined): void;
|
package/dist/vite/overlay.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/vite/overlay.ts"],"names":[],"mappings":"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"}
|