@ours.network/fleet 1.2.0-nightly.74 → 1.2.0-nightly.75

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.
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "1.2.0-nightly.74",
3
- "buildId": "a3cb6f23464e",
4
- "commit": "0ada452c41fd1d4d9237f0f86caa11b2dcba6b69",
2
+ "version": "1.2.0-nightly.75",
3
+ "buildId": "adbb39fb78cd",
4
+ "commit": "3a4e46ab47afdcfe370c827809357d8c67f69783",
5
5
  "dirty": true,
6
- "builtAt": "2026-10-18T16:29:31.599Z",
6
+ "builtAt": "2026-10-18T20:22:00.847Z",
7
7
  "capabilities": [
8
8
  "service.refresh-v1",
9
9
  "managed-cli.codex-reasoning-effort-v1",
@@ -56,8 +56,9 @@ export async function buildWebServer(services, boundary, options = {}) {
56
56
  if (auth.appOrigin && request.headers.origin === auth.appOrigin && request.url.startsWith('/api/')) {
57
57
  reply.header('Access-Control-Allow-Origin', auth.appOrigin).header('Vary', 'Origin');
58
58
  reply.header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS');
59
- reply.header('Access-Control-Expose-Headers', 'X-Ours-Workspace-Auth, X-Ours-Request-Id');
60
- reply.header('Access-Control-Allow-Headers', 'Authorization,Content-Type,X-CSRF-Token,Idempotency-Key');
59
+ // The App binds resource reads by these headers; it must be able to send and read them cross-origin.
60
+ reply.header('Access-Control-Expose-Headers', 'X-Ours-Workspace-Auth, X-Ours-Request-Id, X-Resource-Producer, X-Resource-Revision, X-Resource-Source-Generation, X-Resource-Source-Position, X-Resource-Connection, X-Resource-View, X-Resource-Epoch, X-Resource-Baseline');
61
+ reply.header('Access-Control-Allow-Headers', 'Authorization,Content-Type,X-CSRF-Token,Idempotency-Key,X-Ours-Messenger-CSRF,X-Resource-Connection,X-Resource-View,X-Resource-Epoch,X-Resource-Baseline');
61
62
  if (request.method === 'OPTIONS') {
62
63
  auth.validateBoundary(request, false);
63
64
  return reply.code(204).send();
@@ -428,6 +429,10 @@ export async function buildWebServer(services, boundary, options = {}) {
428
429
  app.get('/api/v1/resource-events', async (request, reply) => {
429
430
  const browser = auth.authenticate(request);
430
431
  reply.hijack();
432
+ // A hijacked reply bypasses Fastify headers: keep the exact-origin CORS and security headers.
433
+ for (const [name, value] of Object.entries(reply.getHeaders()))
434
+ if (value !== undefined)
435
+ reply.raw.setHeader(name, Array.isArray(value) ? value : String(value));
431
436
  reply.raw.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-transform', Connection: 'keep-alive', 'X-Accel-Buffering': 'no' });
432
437
  reply.raw.flushHeaders();
433
438
  const opened = resources.open(reply.raw, browser.id, () => auth.sessionValid(browser));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/fleet",
3
- "version": "1.2.0-nightly.74",
3
+ "version": "1.2.0-nightly.75",
4
4
  "description": "Harness-agnostic fleet of persistent, identity-bound AI agents. Declarative fleet.yaml, managed native/ACP sessions, supervision, and ours.network messaging.",
5
5
  "type": "module",
6
6
  "license": "FSL-1.1-Apache-2.0",