@orion-agents/orion-code 0.2.0 → 0.3.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 (170) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +73 -14
  3. package/README.zh-CN.md +63 -13
  4. package/bin/orion +15 -4
  5. package/dist/cli.js +51 -172
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/model-command-handlers.d.ts +2 -2
  8. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  9. package/dist/commands/model-command-handlers.js +113 -32
  10. package/dist/commands/model-command-handlers.js.map +1 -1
  11. package/dist/commands/session-command-handlers.d.ts +1 -1
  12. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  13. package/dist/commands/session-command-handlers.js +121 -16
  14. package/dist/commands/session-command-handlers.js.map +1 -1
  15. package/dist/commands/types.d.ts +14 -2
  16. package/dist/commands/types.d.ts.map +1 -1
  17. package/dist/commands/types.js +1 -1
  18. package/dist/commands/types.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/runtime/agent-loop.d.ts +2 -0
  22. package/dist/runtime/agent-loop.d.ts.map +1 -1
  23. package/dist/runtime/agent-loop.js +4 -3
  24. package/dist/runtime/agent-loop.js.map +1 -1
  25. package/dist/runtime/agent-runtime-controller.d.ts +32 -1
  26. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  27. package/dist/runtime/agent-runtime-controller.js +250 -31
  28. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  29. package/dist/runtime/agent-runtime-runner.d.ts +3 -0
  30. package/dist/runtime/agent-runtime-runner.d.ts.map +1 -1
  31. package/dist/runtime/goal-runtime-coordinator.d.ts +6 -0
  32. package/dist/runtime/goal-runtime-coordinator.d.ts.map +1 -1
  33. package/dist/runtime/goal-runtime-coordinator.js +5 -0
  34. package/dist/runtime/goal-runtime-coordinator.js.map +1 -1
  35. package/dist/runtime/legacy-thread-materializer.d.ts +18 -0
  36. package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -1
  37. package/dist/runtime/legacy-thread-materializer.js +27 -12
  38. package/dist/runtime/legacy-thread-materializer.js.map +1 -1
  39. package/dist/runtime/orion-runtime-v1.d.ts +3 -0
  40. package/dist/runtime/orion-runtime-v1.d.ts.map +1 -1
  41. package/dist/runtime/orion-runtime-v1.js +8 -1
  42. package/dist/runtime/orion-runtime-v1.js.map +1 -1
  43. package/dist/runtime/orion-session-runner.d.ts +7 -1
  44. package/dist/runtime/orion-session-runner.d.ts.map +1 -1
  45. package/dist/runtime/orion-session-runner.js +35 -3
  46. package/dist/runtime/orion-session-runner.js.map +1 -1
  47. package/dist/runtime/product-bootstrap.d.ts +22 -0
  48. package/dist/runtime/product-bootstrap.d.ts.map +1 -0
  49. package/dist/runtime/product-bootstrap.js +374 -0
  50. package/dist/runtime/product-bootstrap.js.map +1 -0
  51. package/dist/runtime/product-orion-runtime.d.ts +2 -1
  52. package/dist/runtime/product-orion-runtime.d.ts.map +1 -1
  53. package/dist/runtime/product-orion-runtime.js +114 -16
  54. package/dist/runtime/product-orion-runtime.js.map +1 -1
  55. package/dist/runtime/protocol/runtime-protocol-v1.d.ts +1 -1
  56. package/dist/runtime/protocol/runtime-protocol-v1.js +1 -1
  57. package/dist/runtime/protocol/runtime-protocol-v1.js.map +1 -1
  58. package/dist/runtime/release-receipts.d.ts +63 -2
  59. package/dist/runtime/release-receipts.d.ts.map +1 -1
  60. package/dist/runtime/release-receipts.js +298 -7
  61. package/dist/runtime/release-receipts.js.map +1 -1
  62. package/dist/runtime/session-history-recovery.d.ts +19 -0
  63. package/dist/runtime/session-history-recovery.d.ts.map +1 -0
  64. package/dist/runtime/session-history-recovery.js +45 -0
  65. package/dist/runtime/session-history-recovery.js.map +1 -0
  66. package/dist/runtime/step-snapshot.d.ts.map +1 -1
  67. package/dist/runtime/step-snapshot.js +22 -2
  68. package/dist/runtime/step-snapshot.js.map +1 -1
  69. package/dist/runtime/subagents/runtime-integration.d.ts +1 -1
  70. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  71. package/dist/runtime/subagents/runtime-integration.js +5 -2
  72. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  73. package/dist/runtime/thread-event-store.d.ts +27 -0
  74. package/dist/runtime/thread-event-store.d.ts.map +1 -1
  75. package/dist/runtime/thread-event-store.js +119 -17
  76. package/dist/runtime/thread-event-store.js.map +1 -1
  77. package/dist/runtime/thread-projection.d.ts +10 -0
  78. package/dist/runtime/thread-projection.d.ts.map +1 -1
  79. package/dist/runtime/thread-projection.js +40 -0
  80. package/dist/runtime/thread-projection.js.map +1 -1
  81. package/dist/runtime/thread-runtime.d.ts +3 -1
  82. package/dist/runtime/thread-runtime.d.ts.map +1 -1
  83. package/dist/runtime/thread-runtime.js +6 -0
  84. package/dist/runtime/thread-runtime.js.map +1 -1
  85. package/dist/runtime/thread-session-view.d.ts +88 -0
  86. package/dist/runtime/thread-session-view.d.ts.map +1 -0
  87. package/dist/runtime/thread-session-view.js +327 -0
  88. package/dist/runtime/thread-session-view.js.map +1 -0
  89. package/dist/runtime/thread-ui-adapter.d.ts +4 -0
  90. package/dist/runtime/thread-ui-adapter.d.ts.map +1 -1
  91. package/dist/runtime/thread-ui-adapter.js +193 -5
  92. package/dist/runtime/thread-ui-adapter.js.map +1 -1
  93. package/dist/runtime/ui-events.d.ts +37 -0
  94. package/dist/runtime/ui-events.d.ts.map +1 -1
  95. package/dist/runtime/ui-events.js +1 -0
  96. package/dist/runtime/ui-events.js.map +1 -1
  97. package/dist/runtime/ui-view-model.d.ts +3 -0
  98. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  99. package/dist/runtime/ui-view-model.js +10 -3
  100. package/dist/runtime/ui-view-model.js.map +1 -1
  101. package/dist/services/file-lock.d.ts.map +1 -1
  102. package/dist/services/file-lock.js +42 -17
  103. package/dist/services/file-lock.js.map +1 -1
  104. package/dist/services/global-config.d.ts +25 -0
  105. package/dist/services/global-config.d.ts.map +1 -1
  106. package/dist/services/global-config.js +373 -5
  107. package/dist/services/global-config.js.map +1 -1
  108. package/dist/services/session-storage.d.ts +67 -0
  109. package/dist/services/session-storage.d.ts.map +1 -1
  110. package/dist/services/session-storage.js +327 -61
  111. package/dist/services/session-storage.js.map +1 -1
  112. package/dist/services/settings-coordinator.d.ts +174 -0
  113. package/dist/services/settings-coordinator.d.ts.map +1 -0
  114. package/dist/services/settings-coordinator.js +605 -0
  115. package/dist/services/settings-coordinator.js.map +1 -0
  116. package/dist/services/settings-document-repository.d.ts +138 -0
  117. package/dist/services/settings-document-repository.d.ts.map +1 -0
  118. package/dist/services/settings-document-repository.js +551 -0
  119. package/dist/services/settings-document-repository.js.map +1 -0
  120. package/dist/terminal-ui/launch.d.ts.map +1 -1
  121. package/dist/terminal-ui/launch.js +7 -0
  122. package/dist/terminal-ui/launch.js.map +1 -1
  123. package/dist/tools/web.js +1 -1
  124. package/dist/tools/web.js.map +1 -1
  125. package/dist/tui-ui/chrome-view-model.d.ts.map +1 -1
  126. package/dist/tui-ui/chrome-view-model.js +21 -7
  127. package/dist/tui-ui/chrome-view-model.js.map +1 -1
  128. package/dist/tui-ui/launch.d.ts.map +1 -1
  129. package/dist/tui-ui/launch.js +13 -0
  130. package/dist/tui-ui/launch.js.map +1 -1
  131. package/dist/tui-ui/state.d.ts.map +1 -1
  132. package/dist/tui-ui/state.js +7 -0
  133. package/dist/tui-ui/state.js.map +1 -1
  134. package/dist/web/event-hub.d.ts +39 -0
  135. package/dist/web/event-hub.d.ts.map +1 -0
  136. package/dist/web/event-hub.js +263 -0
  137. package/dist/web/event-hub.js.map +1 -0
  138. package/dist/web/index.d.ts +6 -0
  139. package/dist/web/index.d.ts.map +1 -0
  140. package/dist/web/index.js +28 -0
  141. package/dist/web/index.js.map +1 -0
  142. package/dist/web/launch.d.ts +9 -0
  143. package/dist/web/launch.d.ts.map +1 -0
  144. package/dist/web/launch.js +64 -0
  145. package/dist/web/launch.js.map +1 -0
  146. package/dist/web/protocol.d.ts +346 -0
  147. package/dist/web/protocol.d.ts.map +1 -0
  148. package/dist/web/protocol.js +348 -0
  149. package/dist/web/protocol.js.map +1 -0
  150. package/dist/web/server.d.ts +20 -0
  151. package/dist/web/server.d.ts.map +1 -0
  152. package/dist/web/server.js +498 -0
  153. package/dist/web/server.js.map +1 -0
  154. package/dist/web/workbench-controller.d.ts +63 -0
  155. package/dist/web/workbench-controller.d.ts.map +1 -0
  156. package/dist/web/workbench-controller.js +774 -0
  157. package/dist/web/workbench-controller.js.map +1 -0
  158. package/dist/web-client/assets/index-BAEO71Gp.css +1 -0
  159. package/dist/web-client/assets/index-DSkFy7gM.js +13 -0
  160. package/dist/web-client/index.html +16 -0
  161. package/docs/architecture/v0.3.0-web-api.yaml +1309 -0
  162. package/docs/migration/v0.2.2-to-v0.3.0-settings.md +114 -0
  163. package/docs/migration/v0.2.2-to-v0.3.0.md +55 -0
  164. package/docs/orion.example.json +9 -2
  165. package/docs/plan/v0.3.0-node-runtime-compatibility-plan.md +57 -0
  166. package/docs/plan/v0.3.0-settings-integration-plan.md +740 -0
  167. package/docs/plan/v0.3.0-web-workbench-plan.md +325 -0
  168. package/docs/readme.md +12 -1
  169. package/npm-shrinkwrap.json +1777 -424
  170. package/package.json +33 -9
@@ -0,0 +1,498 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startOrionWebServer = startOrionWebServer;
4
+ const crypto_1 = require("crypto");
5
+ const fs_1 = require("fs");
6
+ const http_1 = require("http");
7
+ const path_1 = require("path");
8
+ const version_1 = require("../product/version");
9
+ const redaction_1 = require("../services/redaction");
10
+ const protocol_1 = require("./protocol");
11
+ const workbench_controller_1 = require("./workbench-controller");
12
+ const HOST = '127.0.0.1';
13
+ const API_PREFIX = '/api/v1';
14
+ async function startOrionWebServer(options) {
15
+ const requestedPort = options.port ?? 3080;
16
+ if (!Number.isSafeInteger(requestedPort) || requestedPort < 0 || requestedPort > 65535) {
17
+ throw new Error('Web port must be an integer from 0 through 65535.');
18
+ }
19
+ const nonce = options.nonce ?? (0, crypto_1.randomBytes)(32).toString('base64url');
20
+ const workbench = options.workbench ?? (await workbench_controller_1.WebWorkbenchController.create({ cwd: options.cwd }));
21
+ const staticRoot = options.staticRoot ?? resolveDefaultStaticRoot();
22
+ let origin = '';
23
+ let closing;
24
+ const server = (0, http_1.createServer)((request, response) => {
25
+ void handleRequest({ request, response, nonce, origin, staticRoot, workbench }).catch(error => {
26
+ if (response.headersSent) {
27
+ response.destroy();
28
+ return;
29
+ }
30
+ sendProblem(response, error);
31
+ });
32
+ });
33
+ server.requestTimeout = 30000;
34
+ server.headersTimeout = 15000;
35
+ server.keepAliveTimeout = 5000;
36
+ server.maxHeadersCount = 64;
37
+ await listen(server, requestedPort);
38
+ const address = server.address();
39
+ if (!address || typeof address === 'string') {
40
+ await workbench.shutdown();
41
+ throw new Error('Web server did not expose a TCP address.');
42
+ }
43
+ const port = address.port;
44
+ origin = `http://${HOST}:${port}`;
45
+ const heartbeat = setInterval(() => workbench.eventHub.heartbeat(), 15000);
46
+ heartbeat.unref();
47
+ const close = () => {
48
+ if (closing)
49
+ return closing;
50
+ closing = (async () => {
51
+ clearInterval(heartbeat);
52
+ await workbench.shutdown();
53
+ await closeServer(server);
54
+ })();
55
+ return closing;
56
+ };
57
+ return Object.freeze({ host: HOST, port, url: origin, nonce, workbench, server, close });
58
+ }
59
+ async function handleRequest(context) {
60
+ const { request, response } = context;
61
+ applySecurityHeaders(response);
62
+ assertHost(request, context.origin);
63
+ const url = new URL(request.url ?? '/', context.origin);
64
+ if (!url.pathname.startsWith(API_PREFIX)) {
65
+ await serveStatic(request, response, url.pathname, context.staticRoot);
66
+ return;
67
+ }
68
+ const path = url.pathname.slice(API_PREFIX.length) || '/';
69
+ const method = request.method ?? 'GET';
70
+ if (method === 'GET' && path === '/health') {
71
+ sendJson(response, 200, { ok: true, version: version_1.PACKAGE_VERSION });
72
+ return;
73
+ }
74
+ if (method === 'GET' && path === '/bootstrap') {
75
+ sendJson(response, 200, context.workbench.bootstrap(context.nonce));
76
+ return;
77
+ }
78
+ if (method === 'GET' && path === '/events') {
79
+ openEventStream(request, response, url, context.workbench);
80
+ return;
81
+ }
82
+ if (method === 'GET' && path === '/workspaces') {
83
+ sendJson(response, 200, collectionPage(url, context.workbench.listWorkspaces()));
84
+ return;
85
+ }
86
+ if (method === 'POST' && path === '/workspaces/activate') {
87
+ assertMutation(request, context.nonce, context.origin);
88
+ const body = requireRecord(await readJson(request), 'Workspace request');
89
+ assertOnlyKeys(body, ['requestId', 'path']);
90
+ const requestId = requireText(body.requestId, 'requestId', 128);
91
+ const workspace = requireText(body.path, 'path', 4096);
92
+ const result = await context.workbench.executeMutation(requestId, 'workspace.activate', { path: workspace }, async () => {
93
+ await context.workbench.switchWorkspace(workspace);
94
+ return {
95
+ requestId,
96
+ active: context.workbench.workspace,
97
+ page: (0, workbench_controller_1.pageItems)(context.workbench.listWorkspaces()),
98
+ };
99
+ });
100
+ sendJson(response, 200, result);
101
+ return;
102
+ }
103
+ if (method === 'GET' && path === '/sessions') {
104
+ sendJson(response, 200, collectionPage(url, context.workbench.listSessions()));
105
+ return;
106
+ }
107
+ if (method === 'POST' && path === '/sessions') {
108
+ assertMutation(request, context.nonce, context.origin);
109
+ const body = requireRecord(await readJson(request), 'Session request');
110
+ assertOnlyKeys(body, ['requestId', 'name']);
111
+ const requestId = requireText(body.requestId, 'requestId', 128);
112
+ const name = body.name === undefined ? undefined : requireText(body.name, 'name', 120);
113
+ const result = await context.workbench.executeMutation(requestId, 'session.create', { name }, async () => ({ requestId, session: await context.workbench.createSession(name) }));
114
+ sendJson(response, 201, result);
115
+ return;
116
+ }
117
+ const activateMatch = path.match(/^\/sessions\/([^/]+)\/activate$/);
118
+ if (method === 'POST' && activateMatch) {
119
+ assertMutation(request, context.nonce, context.origin);
120
+ const body = requireRecord(await readJson(request), 'Session activation request');
121
+ assertOnlyKeys(body, ['requestId']);
122
+ const requestId = requireText(body.requestId, 'requestId', 128);
123
+ const sessionId = safeDecodePathSegment(activateMatch[1]);
124
+ const result = await context.workbench.executeMutation(requestId, 'session.activate', { sessionId }, async () => ({ ...(await context.workbench.activateSession(sessionId)), requestId }));
125
+ sendJson(response, 200, result);
126
+ return;
127
+ }
128
+ const snapshotMatch = path.match(/^\/sessions\/([^/]+)\/snapshot$/);
129
+ if (method === 'GET' && snapshotMatch) {
130
+ sendJson(response, 200, context.workbench.sessionSnapshot(safeDecodePathSegment(snapshotMatch[1]), url.searchParams.get('cursor') ?? undefined, pageSize(url), url.searchParams.get('tail') === '1'));
131
+ return;
132
+ }
133
+ const sessionMatch = path.match(/^\/sessions\/([^/]+)$/);
134
+ if (method === 'PATCH' && sessionMatch) {
135
+ assertMutation(request, context.nonce, context.origin);
136
+ const body = requireRecord(await readJson(request), 'Session update request');
137
+ assertOnlyKeys(body, ['requestId', 'name']);
138
+ const requestId = requireText(body.requestId, 'requestId', 128);
139
+ const name = typeof body.name === 'string' ? body.name : '';
140
+ const sessionId = safeDecodePathSegment(sessionMatch[1]);
141
+ const result = await context.workbench.executeMutation(requestId, 'session.rename', { sessionId, name }, () => ({ requestId, session: context.workbench.renameSession(sessionId, name) }));
142
+ sendJson(response, 200, result);
143
+ return;
144
+ }
145
+ if (method === 'POST' && path === '/commands') {
146
+ assertMutation(request, context.nonce, context.origin);
147
+ sendJson(response, 202, await context.workbench.dispatch(await readJson(request)));
148
+ return;
149
+ }
150
+ if (method === 'GET' && path === '/settings') {
151
+ sendJson(response, 200, await context.workbench.settings());
152
+ return;
153
+ }
154
+ if (method === 'PATCH' && path === '/settings') {
155
+ assertMutation(request, context.nonce, context.origin, 'settings_write_forbidden');
156
+ const body = (0, protocol_1.parseWebSettingsUpdate)(await readJson(request));
157
+ const result = await context.workbench.executeMutation(body.requestId, 'settings.update', { expectedRevision: body.expectedRevision, operations: body.operations }, async () => ({ requestId: body.requestId, ...(await context.workbench.updateSettings(body)) }));
158
+ sendJson(response, 200, result);
159
+ return;
160
+ }
161
+ if (method === 'POST' && path === '/settings/open-document') {
162
+ assertMutation(request, context.nonce, context.origin, 'settings_write_forbidden');
163
+ const { requestId } = (0, protocol_1.parseWebOpenSettingsDocument)(await readJson(request));
164
+ const result = await context.workbench.executeMutation(requestId, 'settings.open-document', {}, async () => ({ requestId, opened: await context.workbench.openSettingsDocument() }));
165
+ sendJson(response, 200, result);
166
+ return;
167
+ }
168
+ if (method === 'GET' && path === '/skills') {
169
+ sendJson(response, 200, collectionPage(url, await context.workbench.skills()));
170
+ return;
171
+ }
172
+ if (method === 'GET' && path === '/mcp') {
173
+ sendJson(response, 200, collectionPage(url, context.workbench.mcp()));
174
+ return;
175
+ }
176
+ if (method === 'GET' && path === '/tool-details') {
177
+ sendJson(response, 200, collectionPage(url, await context.workbench.listToolDetails()));
178
+ return;
179
+ }
180
+ const toolDetailMatch = path.match(/^\/tool-details\/([^/]+)$/);
181
+ if (method === 'GET' && toolDetailMatch) {
182
+ const offsetBytes = boundedInteger(url.searchParams.get('offsetBytes'), 0, 0, 2 ** 31 - 1);
183
+ const limitBytes = boundedInteger(url.searchParams.get('limitBytes'), 64 * 1024, 1, 1024 * 1024);
184
+ sendJson(response, 200, await context.workbench.readToolDetail(safeDecodePathSegment(toolDetailMatch[1]), offsetBytes, limitBytes));
185
+ return;
186
+ }
187
+ if (method === 'GET' && path === '/diagnostics') {
188
+ sendJson(response, 200, await context.workbench.diagnostics());
189
+ return;
190
+ }
191
+ throw new HttpProblem(404, 'Route not found.');
192
+ }
193
+ function openEventStream(request, response, url, workbench) {
194
+ const rawCursor = url.searchParams.get('cursor') ?? request.headers['last-event-id'] ?? '0';
195
+ const cursor = Number(rawCursor);
196
+ if (!Number.isSafeInteger(cursor) || cursor < 0) {
197
+ throw new HttpProblem(400, 'Event cursor must be a non-negative integer.');
198
+ }
199
+ response.writeHead(200, {
200
+ 'Content-Type': 'text/event-stream; charset=utf-8',
201
+ 'Cache-Control': 'no-cache, no-store, must-revalidate',
202
+ Connection: 'keep-alive',
203
+ 'X-Accel-Buffering': 'no',
204
+ });
205
+ response.flushHeaders();
206
+ response.write('retry: 1000\n\n');
207
+ const detach = workbench.eventHub.attach(response, cursor);
208
+ request.once('aborted', detach);
209
+ response.once('close', detach);
210
+ }
211
+ function assertMutation(request, nonce, origin, forbiddenCode = 'request_forbidden') {
212
+ if (request.headers.origin !== origin) {
213
+ throw new HttpProblem(403, 'Mutation requires the exact loopback Origin.', forbiddenCode);
214
+ }
215
+ const fetchSite = request.headers['sec-fetch-site'];
216
+ if (fetchSite && fetchSite !== 'same-origin' && fetchSite !== 'none') {
217
+ throw new HttpProblem(403, 'Cross-site mutation is not allowed.', forbiddenCode);
218
+ }
219
+ if (request.headers[protocol_1.WEB_NONCE_HEADER] !== nonce) {
220
+ throw new HttpProblem(403, 'Invalid Web Workbench nonce.', forbiddenCode);
221
+ }
222
+ const contentType = request.headers['content-type']?.split(';', 1)[0]?.trim().toLowerCase();
223
+ if (contentType !== 'application/json') {
224
+ throw new HttpProblem(415, 'Mutations require application/json.');
225
+ }
226
+ }
227
+ function assertHost(request, origin) {
228
+ if (!origin)
229
+ return;
230
+ const expected = new URL(origin).host;
231
+ if (request.headers.host !== expected) {
232
+ throw new HttpProblem(421, 'Request Host does not match the loopback listener.');
233
+ }
234
+ }
235
+ async function readJson(request) {
236
+ const declared = Number(request.headers['content-length'] ?? 0);
237
+ if (Number.isFinite(declared) && declared > protocol_1.WEB_MAX_BODY_BYTES) {
238
+ throw new HttpProblem(413, 'Request body is too large.');
239
+ }
240
+ const chunks = [];
241
+ let bytes = 0;
242
+ for await (const chunk of request) {
243
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
244
+ bytes += buffer.length;
245
+ if (bytes > protocol_1.WEB_MAX_BODY_BYTES)
246
+ throw new HttpProblem(413, 'Request body is too large.');
247
+ chunks.push(buffer);
248
+ }
249
+ try {
250
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
251
+ }
252
+ catch {
253
+ throw new HttpProblem(400, 'Request body is not valid JSON.');
254
+ }
255
+ }
256
+ async function serveStatic(request, response, pathname, staticRoot) {
257
+ if (request.method !== 'GET' && request.method !== 'HEAD') {
258
+ throw new HttpProblem(405, 'Static assets support only GET and HEAD.');
259
+ }
260
+ if (!(0, fs_1.existsSync)(staticRoot) || !(0, fs_1.statSync)(staticRoot).isDirectory()) {
261
+ throw new HttpProblem(503, 'Web client assets are missing; run npm run build:web.');
262
+ }
263
+ const decoded = safeDecode(pathname);
264
+ const relative = (0, path_1.normalize)(decoded.replace(/^[/\\]+/, ''));
265
+ if (relative === '..' || relative.startsWith(`..${path_1.sep}`)) {
266
+ throw new HttpProblem(403, 'Static asset path escapes the Web root.');
267
+ }
268
+ const resolvedRoot = (0, path_1.resolve)(staticRoot);
269
+ const candidate = (0, path_1.resolve)(resolvedRoot, relative || 'index.html');
270
+ const lexicalBoundary = `${resolvedRoot}${path_1.sep}`;
271
+ if (candidate !== resolvedRoot && !candidate.startsWith(lexicalBoundary)) {
272
+ throw new HttpProblem(403, 'Static asset path escapes the Web root.');
273
+ }
274
+ const selected = (0, fs_1.existsSync)(candidate) && (0, fs_1.statSync)(candidate).isFile()
275
+ ? candidate
276
+ : (0, path_1.join)(resolvedRoot, 'index.html');
277
+ if (!(0, fs_1.existsSync)(selected) || !(0, fs_1.statSync)(selected).isFile()) {
278
+ throw new HttpProblem(404, 'Asset not found.');
279
+ }
280
+ const canonicalRoot = (0, fs_1.realpathSync)(resolvedRoot);
281
+ const file = (0, fs_1.realpathSync)(selected);
282
+ const canonicalBoundary = `${canonicalRoot}${path_1.sep}`;
283
+ if (file !== canonicalRoot && !file.startsWith(canonicalBoundary)) {
284
+ throw new HttpProblem(403, 'Static asset path escapes the Web root.');
285
+ }
286
+ const headers = {
287
+ 'Content-Type': contentType(file),
288
+ 'Content-Length': (0, fs_1.statSync)(file).size,
289
+ 'Cache-Control': file.endsWith('index.html')
290
+ ? 'no-store'
291
+ : 'public, max-age=31536000, immutable',
292
+ };
293
+ response.writeHead(200, headers);
294
+ if (request.method === 'HEAD') {
295
+ response.end();
296
+ return;
297
+ }
298
+ await new Promise((resolveStream, reject) => {
299
+ const stream = (0, fs_1.createReadStream)(file);
300
+ stream.once('error', reject);
301
+ stream.once('end', resolveStream);
302
+ stream.pipe(response);
303
+ });
304
+ }
305
+ function applySecurityHeaders(response) {
306
+ response.setHeader('Content-Security-Policy', "default-src 'self'; base-uri 'none'; connect-src 'self'; font-src 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data:; object-src 'none'; script-src 'self'; style-src 'self'");
307
+ response.setHeader('X-Content-Type-Options', 'nosniff');
308
+ response.setHeader('X-Frame-Options', 'DENY');
309
+ response.setHeader('Referrer-Policy', 'no-referrer');
310
+ response.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
311
+ response.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
312
+ response.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
313
+ }
314
+ function sendJson(response, status, value) {
315
+ const body = JSON.stringify(value);
316
+ response.writeHead(status, {
317
+ 'Content-Type': 'application/json; charset=utf-8',
318
+ 'Content-Length': Buffer.byteLength(body),
319
+ 'Cache-Control': 'no-store',
320
+ });
321
+ response.end(body);
322
+ }
323
+ function sendProblem(response, error) {
324
+ const status = error instanceof HttpProblem || error instanceof workbench_controller_1.WebWorkbenchError
325
+ ? error.status
326
+ : error instanceof protocol_1.WebProtocolError
327
+ ? error.status
328
+ : 500;
329
+ const detail = status >= 500
330
+ ? 'The local Web Workbench request failed.'
331
+ : (0, redaction_1.redactTraceText)(error instanceof Error ? error.message : String(error));
332
+ const code = error instanceof HttpProblem ||
333
+ error instanceof workbench_controller_1.WebWorkbenchError ||
334
+ error instanceof protocol_1.WebProtocolError
335
+ ? error.code
336
+ : 'web_internal_error';
337
+ const body = JSON.stringify({
338
+ type: `https://orioncode.dev/problems/${code}`,
339
+ title: statusTitle(status),
340
+ status,
341
+ code,
342
+ detail,
343
+ });
344
+ response.writeHead(status, {
345
+ 'Content-Type': 'application/problem+json; charset=utf-8',
346
+ 'Content-Length': Buffer.byteLength(body),
347
+ 'Cache-Control': 'no-store',
348
+ });
349
+ response.end(body);
350
+ }
351
+ class HttpProblem extends Error {
352
+ constructor(status, message, code = defaultProblemCode(status)) {
353
+ super(message);
354
+ this.status = status;
355
+ this.code = code;
356
+ this.name = 'HttpProblem';
357
+ }
358
+ }
359
+ function defaultProblemCode(status) {
360
+ switch (status) {
361
+ case 400:
362
+ return 'invalid_request';
363
+ case 403:
364
+ return 'request_forbidden';
365
+ case 409:
366
+ return 'request_conflict';
367
+ case 413:
368
+ return 'request_too_large';
369
+ case 415:
370
+ return 'unsupported_media_type';
371
+ case 421:
372
+ return 'misdirected_request';
373
+ case 503:
374
+ return 'service_unavailable';
375
+ default:
376
+ return `web_${status}`;
377
+ }
378
+ }
379
+ function requireRecord(value, name) {
380
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
381
+ throw new HttpProblem(400, `${name} must be an object.`);
382
+ }
383
+ return value;
384
+ }
385
+ function requireText(value, name, maxLength) {
386
+ if (typeof value !== 'string' || !value.trim()) {
387
+ throw new HttpProblem(400, `${name} must be a non-empty string.`);
388
+ }
389
+ if (value.length > maxLength)
390
+ throw new HttpProblem(400, `${name} is too long.`);
391
+ return value.trim();
392
+ }
393
+ function assertOnlyKeys(value, allowedKeys) {
394
+ const allowed = new Set(allowedKeys);
395
+ const unknown = Object.keys(value).find(key => !allowed.has(key));
396
+ if (unknown)
397
+ throw new HttpProblem(400, `Unknown request field: ${unknown}.`);
398
+ }
399
+ function statusTitle(status) {
400
+ if (status === 400)
401
+ return 'Invalid request';
402
+ if (status === 403)
403
+ return 'Request rejected';
404
+ if (status === 404)
405
+ return 'Not found';
406
+ if (status === 409)
407
+ return 'State conflict';
408
+ if (status === 413)
409
+ return 'Payload too large';
410
+ if (status === 415)
411
+ return 'Unsupported media type';
412
+ if (status === 421)
413
+ return 'Misdirected request';
414
+ if (status === 503)
415
+ return 'Service unavailable';
416
+ return 'Internal server error';
417
+ }
418
+ function safeDecode(pathname) {
419
+ try {
420
+ return decodeURIComponent(pathname);
421
+ }
422
+ catch {
423
+ throw new HttpProblem(400, 'Malformed asset path.');
424
+ }
425
+ }
426
+ function safeDecodePathSegment(value) {
427
+ const decoded = safeDecode(value);
428
+ if (!decoded || decoded.includes('/') || decoded.includes('\\')) {
429
+ throw new HttpProblem(400, 'Malformed path identifier.');
430
+ }
431
+ return decoded;
432
+ }
433
+ function boundedInteger(raw, fallback, minimum, maximum) {
434
+ if (raw === null)
435
+ return fallback;
436
+ const value = Number(raw);
437
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
438
+ throw new HttpProblem(400, `Integer query value must be between ${minimum} and ${maximum}.`);
439
+ }
440
+ return value;
441
+ }
442
+ function pageSize(url) {
443
+ return boundedInteger(url.searchParams.get('pageSize'), 50, 1, 100);
444
+ }
445
+ function collectionPage(url, items) {
446
+ return (0, workbench_controller_1.pageItems)(items, url.searchParams.get('cursor') ?? undefined, pageSize(url));
447
+ }
448
+ function contentType(path) {
449
+ switch ((0, path_1.extname)(path).toLowerCase()) {
450
+ case '.html':
451
+ return 'text/html; charset=utf-8';
452
+ case '.js':
453
+ case '.mjs':
454
+ return 'text/javascript; charset=utf-8';
455
+ case '.css':
456
+ return 'text/css; charset=utf-8';
457
+ case '.json':
458
+ return 'application/json; charset=utf-8';
459
+ case '.svg':
460
+ return 'image/svg+xml';
461
+ case '.png':
462
+ return 'image/png';
463
+ case '.woff2':
464
+ return 'font/woff2';
465
+ default:
466
+ return 'application/octet-stream';
467
+ }
468
+ }
469
+ function resolveDefaultStaticRoot() {
470
+ const candidates = [
471
+ (0, path_1.resolve)(__dirname, '../../dist/web-client'),
472
+ (0, path_1.resolve)(__dirname, '../../web/dist'),
473
+ (0, path_1.resolve)(process.cwd(), 'dist/web-client'),
474
+ ];
475
+ return candidates.find(candidate => (0, fs_1.existsSync)(candidate)) ?? candidates[0];
476
+ }
477
+ function listen(server, port) {
478
+ return new Promise((resolveListen, reject) => {
479
+ const onError = (error) => {
480
+ server.off('listening', onListening);
481
+ reject(error);
482
+ };
483
+ const onListening = () => {
484
+ server.off('error', onError);
485
+ resolveListen();
486
+ };
487
+ server.once('error', onError);
488
+ server.once('listening', onListening);
489
+ server.listen(port, HOST);
490
+ });
491
+ }
492
+ function closeServer(server) {
493
+ if (!server.listening)
494
+ return Promise.resolve();
495
+ server.closeAllConnections?.();
496
+ return new Promise(resolveClose => server.close(() => resolveClose()));
497
+ }
498
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { AgentRuntimeController } from '../runtime/agent-runtime-controller';
2
+ import type { OrionCodeUiRuntime } from '../runtime/ui-events';
3
+ import { WebEventHub } from './event-hub';
4
+ import { type WebBootstrapV1, type WebCommandResultV1, type WebMcpServerSummaryV1, type WebPageV1, type WebSessionSnapshotV1, type WebSessionSummaryV1, type WebSettingsMutationResultV1, type WebSettingsSnapshotV1, type WebSettingsUpdateRequestV1, type WebSkillSummaryV1, type WebToolDetailPageV1, type WebToolDetailSummaryV1, type WebWorkspaceSummaryV1 } from './protocol';
5
+ export declare class WebWorkbenchError extends Error {
6
+ readonly status: number;
7
+ readonly code: string;
8
+ constructor(status: number, message: string, code?: string);
9
+ }
10
+ export interface WebWorkbenchControllerOptions {
11
+ readonly cwd: string;
12
+ readonly eventHub?: WebEventHub;
13
+ readonly createRuntime?: (cwd: string) => Promise<OrionCodeUiRuntime>;
14
+ }
15
+ /** Owns the sole runtime/controller pair exposed through the local Web host. */
16
+ export declare class WebWorkbenchController {
17
+ readonly eventHub: WebEventHub;
18
+ private workspaceValue;
19
+ private runtimeValue;
20
+ private controllerValue;
21
+ private activeOrionRuntime?;
22
+ private readonly createRuntime;
23
+ private readonly mutationResults;
24
+ private readonly sessionViews;
25
+ private sessionViewBytes;
26
+ private readonly toolDetails;
27
+ private latestStatus;
28
+ private transition;
29
+ private closed;
30
+ private constructor();
31
+ static create(options: WebWorkbenchControllerOptions): Promise<WebWorkbenchController>;
32
+ get workspace(): string;
33
+ get runtime(): OrionCodeUiRuntime;
34
+ get controller(): AgentRuntimeController;
35
+ bootstrap(nonce: string): WebBootstrapV1;
36
+ settings(): WebSettingsSnapshotV1;
37
+ listWorkspaces(): readonly WebWorkspaceSummaryV1[];
38
+ listSessions(): readonly WebSessionSummaryV1[];
39
+ sessionSnapshot(sessionId: string, cursor?: string, pageSize?: number, tail?: boolean): WebSessionSnapshotV1;
40
+ skills(): Promise<readonly WebSkillSummaryV1[]>;
41
+ mcp(): readonly WebMcpServerSummaryV1[];
42
+ listToolDetails(): Promise<readonly WebToolDetailSummaryV1[]>;
43
+ readToolDetail(callId: string, offsetBytes: number, limitBytes: number): Promise<WebToolDetailPageV1>;
44
+ createSession(name?: string): Promise<WebSessionSummaryV1>;
45
+ activateSession(sessionId: string): Promise<WebCommandResultV1>;
46
+ renameSession(sessionId: string, name: string): WebSessionSummaryV1;
47
+ switchWorkspace(path: string): Promise<void>;
48
+ dispatch(raw: unknown): Promise<WebCommandResultV1>;
49
+ updateSettings(input: WebSettingsUpdateRequestV1): Promise<Omit<WebSettingsMutationResultV1, 'requestId'>>;
50
+ openSettingsDocument(): Promise<true>;
51
+ executeMutation<T>(requestId: string, operation: string, payload: unknown, action: () => T | Promise<T>): Promise<T>;
52
+ diagnostics(): Promise<Record<string, unknown>>;
53
+ shutdown(): Promise<void>;
54
+ private installRuntime;
55
+ private emitState;
56
+ private observeThreadRuntime;
57
+ private loadSessionView;
58
+ private rememberSessionView;
59
+ private assertReadyForTransition;
60
+ private assertSettingsAvailable;
61
+ }
62
+ export declare function pageItems<T>(items: readonly T[], cursor?: string, pageSize?: number): WebPageV1<T>;
63
+ //# sourceMappingURL=workbench-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-controller.d.ts","sourceRoot":"","sources":["../../src/web/workbench-controller.ts"],"names":[],"mappings":"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"}