@oharness/server 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface Icon {
2
+ bytes: Buffer;
3
+ type: string;
4
+ }
5
+ /**
6
+ * The icon for one connector: from disk if it is there, from the vendor's site
7
+ * if it is not.
8
+ */
9
+ export declare function connectorIcon(id: string, siteUrl: string): Promise<Icon | undefined>;
package/dist/icons.js ADDED
@@ -0,0 +1,197 @@
1
+ import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { userPath } from "@oharness/engine/paths.ts";
4
+ /**
5
+ * Vendor icons for the connector menu, fetched by the server and served from
6
+ * this origin.
7
+ *
8
+ * A row that says "Linear" over a generic plug is a row you have to read. The
9
+ * mark is what makes a list of twenty scannable, so it is worth having — but
10
+ * not worth putting twelve third-party image requests into a page that
11
+ * documents itself as making none. A vendor whose icon the page loaded would
12
+ * learn that this user opened the menu, before they connected anything.
13
+ *
14
+ * So the fetch happens here, once, and the bytes go on disk. The page only
15
+ * ever asks this origin, it works offline after the first look, and a vendor
16
+ * that moves its icon is picked up on the next cache miss rather than
17
+ * hard-coded into a file nobody re-checks.
18
+ *
19
+ * Failure is ordinary and cheap: the endpoint 404s and the row draws a
20
+ * monogram instead. Nothing about a connector depends on having a picture.
21
+ */
22
+ /** Big enough for a retina PNG, small enough that a stray HTML page is refused. */
23
+ const MAX_BYTES = 512 * 1024;
24
+ const FETCH_TIMEOUT_MS = 8_000;
25
+ /** How long a site that had no usable icon is left alone. */
26
+ const FAILURE_TTL_MS = 6 * 60 * 60 * 1000;
27
+ const EXTENSIONS = {
28
+ "image/x-icon": "ico",
29
+ "image/vnd.microsoft.icon": "ico",
30
+ "image/png": "png",
31
+ "image/svg+xml": "svg",
32
+ "image/jpeg": "jpg",
33
+ "image/webp": "webp",
34
+ "image/gif": "gif",
35
+ };
36
+ const TYPES = {
37
+ ico: "image/x-icon",
38
+ png: "image/png",
39
+ svg: "image/svg+xml",
40
+ jpg: "image/jpeg",
41
+ webp: "image/webp",
42
+ gif: "image/gif",
43
+ };
44
+ const inFlight = new Map();
45
+ const failedAt = new Map();
46
+ function cacheDir() {
47
+ return process.env["OHARNESS_ICON_CACHE"] ?? userPath("cache", "icons");
48
+ }
49
+ /** Ids come from the registry, but they still reach the filesystem. */
50
+ function safeId(id) {
51
+ return /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(id) && !id.includes("..") ? id : undefined;
52
+ }
53
+ /**
54
+ * The icon for one connector: from disk if it is there, from the vendor's site
55
+ * if it is not.
56
+ */
57
+ export async function connectorIcon(id, siteUrl) {
58
+ const key = safeId(id);
59
+ if (!key)
60
+ return undefined;
61
+ const cached = await readCached(key);
62
+ if (cached)
63
+ return cached;
64
+ const failed = failedAt.get(key);
65
+ if (failed && Date.now() - failed < FAILURE_TTL_MS)
66
+ return undefined;
67
+ // One fetch per connector no matter how many rows ask at once — opening the
68
+ // menu asks for every icon in the same tick.
69
+ const existing = inFlight.get(key);
70
+ if (existing)
71
+ return existing;
72
+ const attempt = fetchIcon(siteUrl)
73
+ .then(async (icon) => {
74
+ if (icon)
75
+ await writeCached(key, icon);
76
+ else
77
+ failedAt.set(key, Date.now());
78
+ return icon;
79
+ })
80
+ .catch(() => {
81
+ failedAt.set(key, Date.now());
82
+ return undefined;
83
+ })
84
+ .finally(() => inFlight.delete(key));
85
+ inFlight.set(key, attempt);
86
+ return attempt;
87
+ }
88
+ async function readCached(key) {
89
+ let names;
90
+ try {
91
+ names = await readdir(cacheDir());
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ const found = names.find((name) => name.startsWith(`${key}.`));
97
+ if (!found)
98
+ return undefined;
99
+ const extension = found.slice(key.length + 1);
100
+ const type = TYPES[extension];
101
+ if (!type)
102
+ return undefined;
103
+ try {
104
+ return { bytes: await readFile(path.join(cacheDir(), found)), type };
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ async function writeCached(key, icon) {
111
+ const extension = EXTENSIONS[icon.type] ?? "png";
112
+ const dir = cacheDir();
113
+ await mkdir(dir, { recursive: true });
114
+ await writeFile(path.join(dir, `${key}.${extension}`), icon.bytes);
115
+ }
116
+ /**
117
+ * Ask a site for its icon.
118
+ *
119
+ * The declared one first: `/favicon.ico` is a convention, not a rule, and
120
+ * several vendors serve nothing there while declaring a perfectly good icon in
121
+ * their markup. Guessing first would give a 404 for Notion, Supabase and Figma
122
+ * while the answer was written on the page.
123
+ */
124
+ async function fetchIcon(siteUrl) {
125
+ const candidates = [];
126
+ try {
127
+ candidates.push(...(await declaredIcons(siteUrl)));
128
+ }
129
+ catch {
130
+ // A site that will not serve its homepage may still serve the convention.
131
+ }
132
+ candidates.push(new URL("/favicon.ico", siteUrl).toString());
133
+ for (const candidate of candidates) {
134
+ const icon = await loadImage(candidate);
135
+ if (icon)
136
+ return icon;
137
+ }
138
+ return undefined;
139
+ }
140
+ /** `<link rel="…icon…">` from a page's head, best first. */
141
+ async function declaredIcons(siteUrl) {
142
+ const response = await fetch(siteUrl, {
143
+ headers: { accept: "text/html", "user-agent": "OHarness" },
144
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
145
+ redirect: "follow",
146
+ });
147
+ if (!response.ok)
148
+ return [];
149
+ if (!(response.headers.get("content-type") ?? "").includes("text/html"))
150
+ return [];
151
+ // The head is all that matters and some of these pages are megabytes.
152
+ const html = (await response.text()).slice(0, 200_000);
153
+ const links = html.match(/<link\b[^>]*>/gi) ?? [];
154
+ const found = [];
155
+ for (const link of links) {
156
+ const rel = /\brel\s*=\s*["']?([^"'>]+)/i.exec(link)?.[1]?.toLowerCase() ?? "";
157
+ if (!rel.includes("icon"))
158
+ continue;
159
+ const href = /\bhref\s*=\s*["']([^"']+)/i.exec(link)?.[1];
160
+ if (!href)
161
+ continue;
162
+ // Prefer something scalable, then something reasonably large: a 16px ico
163
+ // upscaled into a 20px slot is the blurry option.
164
+ const size = Number(/\bsizes\s*=\s*["']?(\d+)/i.exec(link)?.[1] ?? 0);
165
+ const scalable = /\.svg(\?|$)/i.test(href) || /image\/svg/i.test(link);
166
+ found.push({
167
+ href: new URL(href, response.url || siteUrl).toString(),
168
+ score: scalable ? 1000 : Math.min(size, 512),
169
+ });
170
+ }
171
+ return found.sort((a, b) => b.score - a.score).map((one) => one.href);
172
+ }
173
+ async function loadImage(url) {
174
+ let response;
175
+ try {
176
+ response = await fetch(url, {
177
+ headers: { accept: "image/*", "user-agent": "OHarness" },
178
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
179
+ redirect: "follow",
180
+ });
181
+ }
182
+ catch {
183
+ return undefined;
184
+ }
185
+ if (!response.ok)
186
+ return void (await response.body?.cancel().catch(() => { }));
187
+ // Checked rather than trusted: a single-page app answers /favicon.svg with
188
+ // its own HTML and a 200, and that would cache an entire website as an icon.
189
+ const type = (response.headers.get("content-type") ?? "").split(";")[0].trim().toLowerCase();
190
+ if (!EXTENSIONS[type])
191
+ return void (await response.body?.cancel().catch(() => { }));
192
+ const bytes = Buffer.from(await response.arrayBuffer());
193
+ if (!bytes.length || bytes.length > MAX_BYTES)
194
+ return undefined;
195
+ return { bytes, type };
196
+ }
197
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { Harness } from "@oharness/engine/harness.ts";
4
+ import { errorMessage } from "@oharness/engine/core/errors.ts";
5
+ import { startWebServer } from "./server.js";
6
+ import { readPrefs } from "./prefs.js";
7
+ import { startupProject } from "./projects.js";
8
+ const HELP = `oharness-web — drive the agent from a browser
9
+
10
+ Usage:
11
+ oharness-web [options]
12
+
13
+ Options:
14
+ --port <n> Port to listen on (default: 4310, or a free one if taken)
15
+ --host <addr> Interface to bind (default: 127.0.0.1)
16
+ -C, --cwd <dir> Project to open (default: the last one opened)
17
+ -m, --model <id> Model alias or provider/model
18
+ -r, --resume <id> Continue an existing session
19
+ --permission-mode <m> default | acceptEdits | plan | auto | bypassPermissions
20
+ --no-open Do not try to open a browser
21
+ -h, --help Show this help
22
+
23
+ Reaching this port means being able to make the agent write files and run
24
+ commands on this machine. It binds to loopback and requires a token that is
25
+ generated fresh each run and printed once, below. Passing --host to bind a
26
+ public interface publishes that capability to the network.`;
27
+ function parseArgs(argv) {
28
+ const args = { open: true, help: false };
29
+ for (let i = 0; i < argv.length; i++) {
30
+ switch (argv[i]) {
31
+ case "--port":
32
+ args.port = Number.parseInt(argv[++i] ?? "", 10);
33
+ break;
34
+ case "--host":
35
+ args.host = argv[++i];
36
+ break;
37
+ case "-C":
38
+ case "--cwd":
39
+ args.cwd = argv[++i];
40
+ break;
41
+ case "-m":
42
+ case "--model":
43
+ args.model = argv[++i];
44
+ break;
45
+ case "-r":
46
+ case "--resume":
47
+ args.resume = argv[++i];
48
+ break;
49
+ case "--permission-mode":
50
+ args.permissionMode = argv[++i];
51
+ break;
52
+ case "--no-open":
53
+ args.open = false;
54
+ break;
55
+ case "-h":
56
+ case "--help":
57
+ args.help = true;
58
+ break;
59
+ }
60
+ }
61
+ return args;
62
+ }
63
+ async function main() {
64
+ const args = parseArgs(process.argv.slice(2));
65
+ if (args.help) {
66
+ console.log(HELP);
67
+ return;
68
+ }
69
+ if (args.port !== undefined && Number.isNaN(args.port)) {
70
+ console.error("--port needs a number");
71
+ process.exitCode = 1;
72
+ return;
73
+ }
74
+ // The project the picker last switched to, unless this run names one. A
75
+ // directory given on the command line is an explicit choice for this run and
76
+ // is not remembered: it would overwrite a switch the user made by hand.
77
+ const cwd = args.cwd ? path.resolve(args.cwd) : await startupProject(process.cwd());
78
+ // Late binding: the prompt only exists once the server does, and the agent
79
+ // reads this closure per call.
80
+ let prompt;
81
+ const harness = await Harness.create({
82
+ cwd,
83
+ permissionPrompt: (request) => prompt
84
+ ? prompt(request)
85
+ : // Before the server is listening there is no one to ask, and a
86
+ // default of "allow" would make the startup window the weak point.
87
+ Promise.resolve(false),
88
+ });
89
+ if (args.permissionMode)
90
+ harness.config.permissionMode = args.permissionMode;
91
+ // The model the picker last chose, unless this run names one. Checked against
92
+ // the catalog first: a remembered model whose provider has since been
93
+ // disconnected should fall back to the default, not fail on the first turn.
94
+ const remembered = (await readPrefs()).model;
95
+ const model = args.model ??
96
+ (remembered && harness.listModels().some((entry) => entry.id === remembered)
97
+ ? remembered
98
+ : undefined);
99
+ const session = args.resume
100
+ ? ((await harness.resumeSession(args.resume, model)) ??
101
+ (await harness.createSession({ model })))
102
+ : await harness.createSession({ model });
103
+ const server = await startWebServer({
104
+ harness,
105
+ session,
106
+ agent: harness.agent(session),
107
+ ...(args.port !== undefined ? { port: args.port } : {}),
108
+ ...(args.host !== undefined ? { host: args.host } : {}),
109
+ });
110
+ prompt = server.permissionPrompt;
111
+ if (args.host && args.host !== "127.0.0.1" && args.host !== "localhost") {
112
+ console.error(`\n! Bound to ${args.host}, not loopback. Anyone who can reach this port\n` +
113
+ "! and holds the token can make this agent run commands on this machine.\n");
114
+ }
115
+ console.log(`\noharness web · session ${session.id}`);
116
+ // Named because it is not always this shell's directory: the last project
117
+ // opened wins, and a run that silently worked somewhere else would be a
118
+ // surprising place to find the agent's edits.
119
+ console.log(`project ${cwd}`);
120
+ console.log(`model ${session.model.id} (${session.model.provider})\n`);
121
+ console.log(` ${server.url}\n`);
122
+ console.log("The token is in that URL and changes every run. Ctrl-C to stop.\n");
123
+ if (args.open)
124
+ void openBrowser(server.url);
125
+ const stop = () => {
126
+ void server.close().then(() => harness.close()).then(() => process.exit(0));
127
+ };
128
+ process.on("SIGINT", stop);
129
+ process.on("SIGTERM", stop);
130
+ }
131
+ /** Best effort: failing to open a browser is not a reason to fail the run. */
132
+ async function openBrowser(url) {
133
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
134
+ try {
135
+ const { spawn } = await import("node:child_process");
136
+ spawn(command, [url], { stdio: "ignore", detached: true, shell: process.platform === "win32" })
137
+ .on("error", () => { })
138
+ .unref();
139
+ }
140
+ catch {
141
+ // The URL is printed above; the user can open it themselves.
142
+ }
143
+ }
144
+ main().catch((err) => {
145
+ console.error(`fatal: ${errorMessage(err)}`);
146
+ process.exitCode = 1;
147
+ });
148
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Backticks are written as placeholders and substituted here.
3
+ *
4
+ * The first version concatenated `String.raw` fragments around quoted
5
+ * backticks — which ends the raw template at the first `+`, so everything
6
+ * after it was an ordinary template literal and every `\n` in the client code
7
+ * became a real newline inside a string. The page parsed as far as that line
8
+ * and then died. One template, no concatenation, avoids the whole class.
9
+ */
10
+ export declare const CLIENT_SCRIPT: string;