antechamber 1.0.40 → 2.0.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +88 -141
  3. package/bin/opencode-antechamber +14 -4
  4. package/dist/approvals.d.ts +9 -1
  5. package/dist/approvals.js +10 -2
  6. package/dist/catalog.d.ts +13 -2
  7. package/dist/catalog.js +88 -52
  8. package/dist/cli.d.ts +1 -1
  9. package/dist/cli.js +1 -1
  10. package/dist/commands/context.d.ts +5 -2
  11. package/dist/commands/context.js +8 -4
  12. package/dist/commands/doctor.js +4 -3
  13. package/dist/commands/setup.js +9 -28
  14. package/dist/config.d.ts +6 -2
  15. package/dist/config.js +18 -4
  16. package/dist/file-watch.d.ts +35 -0
  17. package/dist/file-watch.js +163 -0
  18. package/dist/latency.d.ts +10 -0
  19. package/dist/latency.js +115 -0
  20. package/dist/misc-routes.js +14 -12
  21. package/dist/pi-event-translation.js +44 -2
  22. package/dist/route-services.d.ts +8 -3
  23. package/dist/routes-v1.d.ts +1 -1
  24. package/dist/routes-v1.js +29 -418
  25. package/dist/routes-v2.js +252 -34
  26. package/dist/self-update.d.ts +2 -1
  27. package/dist/self-update.js +5 -1
  28. package/dist/server.d.ts +17 -3
  29. package/dist/server.js +191 -18
  30. package/dist/session-commands.d.ts +3 -1
  31. package/dist/session-commands.js +13 -7
  32. package/dist/session-history.js +3 -0
  33. package/dist/session-store.d.ts +19 -10
  34. package/dist/session-store.js +266 -128
  35. package/dist/session-tree.d.ts +15 -1
  36. package/dist/session-tree.js +2 -2
  37. package/dist/sessions.d.ts +85 -1
  38. package/dist/sessions.js +238 -10
  39. package/dist/sse.d.ts +0 -2
  40. package/dist/sse.js +13 -46
  41. package/dist/text-generation.d.ts +20 -0
  42. package/dist/text-generation.js +93 -0
  43. package/dist/tool-map.js +1 -3
  44. package/dist/types.d.ts +60 -0
  45. package/dist/v2.d.ts +8 -1
  46. package/dist/v2.js +24 -4
  47. package/dist/work-status.js +1 -1
  48. package/extensions/antechamber/README.md +100 -0
  49. package/extensions/antechamber/bin/opencode-antechamber +42 -0
  50. package/extensions/{omo-dag/docs/DESIGN.md → antechamber/docs/GRAPH.md} +5 -5
  51. package/extensions/{omo-work/docs/DESIGN.md → antechamber/docs/WORK.md} +3 -3
  52. package/extensions/antechamber/package.json +60 -0
  53. package/extensions/{omo-dag → antechamber}/panel/index.html +8 -1
  54. package/extensions/antechamber/panel/main.js +261 -0
  55. package/extensions/antechamber/runtime/launcher.js +201 -0
  56. package/extensions/antechamber/service/main.js +884 -0
  57. package/package.json +75 -26
  58. package/extensions/omo-compat/README.md +0 -48
  59. package/extensions/omo-compat/icon.svg +0 -1
  60. package/extensions/omo-compat/package.json +0 -43
  61. package/extensions/omo-dag/README.md +0 -167
  62. package/extensions/omo-dag/package.json +0 -33
  63. package/extensions/omo-dag/panel/main.js +0 -176
  64. package/extensions/omo-dag/service/main.js +0 -457
  65. package/extensions/omo-work/README.md +0 -88
  66. package/extensions/omo-work/package.json +0 -30
  67. package/extensions/omo-work/service/main.js +0 -149
  68. /package/extensions/{omo-dag → antechamber}/icon.svg +0 -0
  69. /package/extensions/{omo-work → antechamber}/status/index.html +0 -0
  70. /package/extensions/{omo-work → antechamber}/status/main.js +0 -0
@@ -1,149 +0,0 @@
1
- // extensions/omo-work/src/service.ts
2
- import { timingSafeEqual } from "node:crypto";
3
- import http from "node:http";
4
- import { resolve } from "node:path";
5
-
6
- // extensions/omo-work/src/discovery.ts
7
- import { readdirSync, readFileSync } from "node:fs";
8
- import { homedir } from "node:os";
9
- import { join } from "node:path";
10
- function expandHome(path) {
11
- if (path === "~") return homedir();
12
- return path.startsWith("~/") ? join(homedir(), path.slice(2)) : path;
13
- }
14
- function defaultStateDirs(home = homedir()) {
15
- return [join(home, ".config", "antechamber"), join(home, ".config", "openchamber-pi-connector")];
16
- }
17
- function alive(pid) {
18
- try {
19
- process.kill(pid, 0);
20
- return true;
21
- } catch (error) {
22
- return error instanceof Error && "code" in error && error.code === "EPERM";
23
- }
24
- }
25
- function loopbackUrl(url) {
26
- return url.replace("://0.0.0.0:", "://127.0.0.1:").replace("://[::]:", "://[::1]:");
27
- }
28
- function discoverServers(stateDirs, isAlive = alive) {
29
- const servers = /* @__PURE__ */ new Map();
30
- for (const dir of stateDirs) {
31
- let names;
32
- try {
33
- names = readdirSync(join(dir, "run"));
34
- } catch {
35
- continue;
36
- }
37
- for (const name of names) {
38
- if (!/^\d+\.json$/.test(name)) continue;
39
- try {
40
- const record = JSON.parse(readFileSync(join(dir, "run", name), "utf8"));
41
- if (record === null || typeof record !== "object") continue;
42
- const { pid, url, token: token2, started } = record;
43
- if (typeof pid !== "number" || typeof url !== "string" || typeof token2 !== "string") continue;
44
- if (typeof started !== "string" || servers.has(pid) || !isAlive(pid)) continue;
45
- servers.set(pid, { pid, url: loopbackUrl(url), token: token2, started });
46
- } catch {
47
- }
48
- }
49
- }
50
- return [...servers.values()].sort((a, b) => b.started.localeCompare(a.started));
51
- }
52
-
53
- // extensions/omo-work/src/service.ts
54
- var SESSION_ID = /^ses_[0-9A-Za-z]+$/;
55
- var STATUS_TIMEOUT_MS = 5e3;
56
- var ACTION_TIMEOUT_MS = 15e3;
57
- async function call(server, method, path, timeoutMs) {
58
- const response = await fetch(`${server.url}/antechamber/work-status/${path}`, {
59
- method,
60
- headers: { Authorization: `Bearer ${server.token}` },
61
- signal: AbortSignal.timeout(timeoutMs)
62
- });
63
- return { status: response.status, body: await response.text() };
64
- }
65
- function createServer(options) {
66
- const discover = options.discover ?? ((dirs) => discoverServers(dirs));
67
- const defaultDirs = options.defaultDirs ?? (() => defaultStateDirs());
68
- const owners = /* @__PURE__ */ new Map();
69
- const send = (res, status, body) => {
70
- res.writeHead(status, { "Content-Type": "application/json", "Cache-Control": "no-store" });
71
- res.end(body);
72
- };
73
- const fail = (res, status, error, detail) => send(res, status, JSON.stringify({ error, ...detail !== void 0 ? { detail } : {} }));
74
- const ordered = (session, stateDirs) => {
75
- const servers = discover(stateDirs);
76
- const owner = owners.get(session);
77
- return owner === void 0 ? servers : [...servers].sort((a, b) => Number(b.pid === owner) - Number(a.pid === owner));
78
- };
79
- const relayStatus = async (res, session, stateDirs) => {
80
- const servers = ordered(session, stateDirs);
81
- if (servers.length === 0)
82
- return fail(
83
- res,
84
- 503,
85
- "no-server",
86
- `No running antechamber server with a work-status token in ${stateDirs.join(", ")}`
87
- );
88
- let fallback;
89
- let lastError;
90
- for (const server of servers) {
91
- try {
92
- const upstream = await call(server, "GET", encodeURIComponent(session), STATUS_TIMEOUT_MS);
93
- if (upstream.status !== 200) {
94
- lastError = `${server.url} answered HTTP ${upstream.status}`;
95
- continue;
96
- }
97
- if (JSON.parse(upstream.body).live === true) {
98
- owners.set(session, server.pid);
99
- return send(res, 200, upstream.body);
100
- }
101
- fallback ??= { server, upstream };
102
- } catch (error) {
103
- lastError = `${server.url}: ${error instanceof Error ? error.message : String(error)}`;
104
- }
105
- }
106
- if (fallback) {
107
- owners.set(session, fallback.server.pid);
108
- return send(res, 200, fallback.upstream.body);
109
- }
110
- return fail(res, 502, "unreachable", lastError);
111
- };
112
- const relayAction = async (res, session, stateDirs, method, path) => {
113
- const server = ordered(session, stateDirs)[0];
114
- if (server === void 0) return fail(res, 503, "no-server");
115
- try {
116
- const upstream = await call(server, method, `${encodeURIComponent(session)}/${path}`, ACTION_TIMEOUT_MS);
117
- return send(res, upstream.status, upstream.body || "{}");
118
- } catch (error) {
119
- return fail(res, 502, "unreachable", error instanceof Error ? error.message : String(error));
120
- }
121
- };
122
- const expected = Buffer.from(`Bearer ${options.token}`);
123
- return http.createServer((req, res) => {
124
- const supplied = Buffer.from(req.headers.authorization ?? "");
125
- if (supplied.length !== expected.length || !timingSafeEqual(supplied, expected))
126
- return fail(res, 401, "unauthorized");
127
- const url = new URL(req.url ?? "/", "http://127.0.0.1");
128
- if (url.pathname === "/health") return send(res, 200, '{"ok":true}');
129
- const session = url.searchParams.get("session") ?? "";
130
- if (!SESSION_ID.test(session)) return fail(res, 400, "session query must be an OpenChamber session id");
131
- const custom = url.searchParams.get("stateDir")?.trim();
132
- const stateDirs = custom ? [resolve(expandHome(custom))] : defaultDirs();
133
- const method = req.method ?? "GET";
134
- req.resume();
135
- if (url.pathname === "/status" && method === "GET") return void relayStatus(res, session, stateDirs);
136
- if (url.pathname === "/goal/fire" && method === "POST")
137
- return void relayAction(res, session, stateDirs, "POST", "goal/fire");
138
- return fail(res, 404, "not-found");
139
- });
140
- }
141
-
142
- // extensions/omo-work/src/service-main.ts
143
- var port = Number(process.env.OPENCHAMBER_SERVICE_PORT);
144
- var token = process.env.OPENCHAMBER_SERVICE_TOKEN ?? "";
145
- if (!port || !token) {
146
- console.error("OPENCHAMBER_SERVICE_PORT and OPENCHAMBER_SERVICE_TOKEN are required");
147
- process.exit(1);
148
- }
149
- createServer({ token }).listen(port, "127.0.0.1");
File without changes