From 142b5fc6979def4bc517b63b0c0aa0455e5ad6ca Mon Sep 17 00:00:00 2001 From: Ingwannu <186453546+Ingwannu@users.noreply.github.com> Date: Wed, 29 Jul 2026 23:13:42 +0900 Subject: [PATCH 1/7] Add OpenCodex Remote MVP handoff --- .gitignore | 1 + design-qa.md | 32 + platform/bun.lock | 352 +++ platform/docs/IMPLEMENTATION_PLAN.md | 58 + platform/docs/IMPLEMENTATION_STATUS.md | 194 ++ platform/docs/PRODUCT_PLAN_v1.md | 407 ++++ .../assets/agent-onboarding-reference.png | Bin 0 -> 1122295 bytes platform/docs/assets/instances-reference.png | Bin 0 -> 1024349 bytes platform/package.json | 35 + .../migrations/0001_remote_platform.sql | 217 ++ platform/server/src/app.ts | 234 ++ platform/server/src/auth.ts | 85 + platform/server/src/cloudflare.ts | 108 + platform/server/src/config.ts | 69 + platform/server/src/control-plane.ts | 19 + platform/server/src/db.ts | 37 + platform/server/src/gateway.ts | 239 ++ platform/server/src/security.ts | 81 + platform/server/src/store.ts | 428 ++++ platform/server/src/worker.ts | 164 ++ platform/tsconfig.json | 14 + platform/vite.config.ts | 14 + platform/web/index.html | 13 + platform/web/src/App.tsx | 206 ++ platform/web/src/api.ts | 104 + platform/web/src/auth-client.ts | 3 + platform/web/src/main.tsx | 8 + platform/web/src/styles.css | 80 + remote-agent/Cargo.lock | 2147 +++++++++++++++++ remote-agent/Cargo.toml | 31 + remote-agent/src/assertion.rs | 176 ++ remote-agent/src/config.rs | 89 + remote-agent/src/control.rs | 146 ++ remote-agent/src/main.rs | 126 + remote-agent/src/proxy.rs | 225 ++ remote-agent/src/supervisor.rs | 33 + src/config.ts | 9 + src/server/management-auth.ts | 2 + src/server/remote-assertion.ts | 131 + src/types.ts | 13 + structure/12_remote-platform.md | 52 + structure/adr/0012-remote-private-mesh.md | 30 + tests/server-management-auth.test.ts | 89 + 43 files changed, 6501 insertions(+) create mode 100644 design-qa.md create mode 100644 platform/bun.lock create mode 100644 platform/docs/IMPLEMENTATION_PLAN.md create mode 100644 platform/docs/IMPLEMENTATION_STATUS.md create mode 100644 platform/docs/PRODUCT_PLAN_v1.md create mode 100644 platform/docs/assets/agent-onboarding-reference.png create mode 100644 platform/docs/assets/instances-reference.png create mode 100644 platform/package.json create mode 100644 platform/server/migrations/0001_remote_platform.sql create mode 100644 platform/server/src/app.ts create mode 100644 platform/server/src/auth.ts create mode 100644 platform/server/src/cloudflare.ts create mode 100644 platform/server/src/config.ts create mode 100644 platform/server/src/control-plane.ts create mode 100644 platform/server/src/db.ts create mode 100644 platform/server/src/gateway.ts create mode 100644 platform/server/src/security.ts create mode 100644 platform/server/src/store.ts create mode 100644 platform/server/src/worker.ts create mode 100644 platform/tsconfig.json create mode 100644 platform/vite.config.ts create mode 100644 platform/web/index.html create mode 100644 platform/web/src/App.tsx create mode 100644 platform/web/src/api.ts create mode 100644 platform/web/src/auth-client.ts create mode 100644 platform/web/src/main.tsx create mode 100644 platform/web/src/styles.css create mode 100644 remote-agent/Cargo.lock create mode 100644 remote-agent/Cargo.toml create mode 100644 remote-agent/src/assertion.rs create mode 100644 remote-agent/src/config.rs create mode 100644 remote-agent/src/control.rs create mode 100644 remote-agent/src/main.rs create mode 100644 remote-agent/src/proxy.rs create mode 100644 remote-agent/src/supervisor.rs create mode 100644 src/server/remote-assertion.ts create mode 100644 structure/12_remote-platform.md create mode 100644 structure/adr/0012-remote-private-mesh.md diff --git a/.gitignore b/.gitignore index 37712544b..87ceca9ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +/remote-agent/target/ .env *.log .DS_Store diff --git a/design-qa.md b/design-qa.md new file mode 100644 index 000000000..df3c1c227 --- /dev/null +++ b/design-qa.md @@ -0,0 +1,32 @@ +# Design QA — OpenCodex Remote + +result: blocked + +## Sources + +- `platform/docs/assets/instances-reference.png` — approved Instances screen, 1488×1058. +- `platform/docs/assets/agent-onboarding-reference.png` — approved Agent onboarding, 1488×1058. +- Implementation: `platform/web/src/App.tsx`, `platform/web/src/styles.css`. + +## Completed checks + +- Both approved source images were opened at original resolution before implementation. +- Existing OpenCodex logo and dark design tokens were reused. +- Visible UI icons come from `@tabler/icons-react`; no custom SVG or placeholder illustration was added. +- Desktop and responsive CSS states, loading/error/empty/login/invite states, primary actions, form flow, copy actions, and destructive confirmations are implemented. +- TypeScript and production build passed after the final auth/invite handoff edits. + +## Blocker + +The environment had no browser tool and no previously selected browser. The Product Design workflow requires permission before using Playwright directly. Permission was requested, but the task changed to a branch handoff before a response was received. Therefore no same-viewport implementation screenshot exists and the mandatory side-by-side source/implementation comparison cannot honestly be marked passed. + +## Required next pass + +1. Start `VITE_REMOTE_DEMO=true bun run dev:web` in `platform/`. +2. With the user's selected browser or approved Playwright Chromium, capture 1488×1058 Instances. +3. Click New instance, reserve the demo instance, and capture 1488×1058 Install Agent. +4. Put each reference and matching implementation capture into one side-by-side image. +5. Review typography, grid, spacing, colors, icon alignment, borders, states, keyboard/focus, tablet, and mobile. +6. Fix all P0/P1/P2 findings and change only the final line below when the comparison genuinely passes. + +Final result: blocked diff --git a/platform/bun.lock b/platform/bun.lock new file mode 100644 index 000000000..53943b902 --- /dev/null +++ b/platform/bun.lock @@ -0,0 +1,352 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "@opencodex/remote-platform", + "dependencies": { + "@tabler/icons-react": "^3.34.1", + "better-auth": "^1.6.25", + "hono": "^4.9.8", + "pg": "^8.16.3", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "zod": "^4.1.11", + }, + "devDependencies": { + "@types/bun": "1.3.14", + "@types/pg": "^8.15.5", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.4", + "typescript": "5.9.3", + "vite": "^7.1.7", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + + "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + + "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + + "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q=="], + + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + + "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + + "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + + "@better-auth/core": ["@better-auth/core@1.6.25", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.39.0", "@standard-schema/spec": "^1.1.0", "zod": "^4.3.6" }, "peerDependencies": { "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@cloudflare/workers-types": ">=4", "@opentelemetry/api": "^1.9.0", "better-call": "1.3.7", "jose": "^6.1.0", "kysely": "^0.28.5 || ^0.29.0", "nanostores": "^1.0.1" }, "optionalPeers": ["@cloudflare/workers-types", "@opentelemetry/api"] }, "sha512-lMTlhtwyK4NpY9kPF+2rQCRKYpg136d3gM2xl8esxT1PjJx5Nh5YwZvxcYCIjDuO759sx6TCloJTuwcZGG6ZBw=="], + + "@better-auth/drizzle-adapter": ["@better-auth/drizzle-adapter@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2", "drizzle-orm": "^0.45.2" }, "optionalPeers": ["drizzle-orm"] }, "sha512-ru/DeKjFPQUVeKkxF/ScazmPqIY7lwfkAV5Yt4j24wmn1Y8vFwoiPRnHgXUeZqBs10+nubaRwEqLF39CP6EhRw=="], + + "@better-auth/kysely-adapter": ["@better-auth/kysely-adapter@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2", "kysely": "^0.28.17 || ^0.29.0" }, "optionalPeers": ["kysely"] }, "sha512-zxiePhtN1YClS1irKYPVwWfN6kYp+QoYlz1hdQUOj8hXyo2aE/ny4RNAb6v332b0+U6Vu88EhYITRPdmvCo6uA=="], + + "@better-auth/memory-adapter": ["@better-auth/memory-adapter@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2" } }, "sha512-GhEzTumc8yfTz+OZ6pMg06BA49xob49x1bX+1mEl/FStDJoSF+6mTfI5M2ytFxaiN89336/aUjkW8u+qRyLexw=="], + + "@better-auth/mongo-adapter": ["@better-auth/mongo-adapter@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2", "mongodb": "^6.0.0 || ^7.0.0" }, "optionalPeers": ["mongodb"] }, "sha512-ZtMmjcOdXR2Ziqx5y8ptTOaNpe0snNfALbBUPXJsgeyeRkDJDYzyLZ8MpuvNBTNllNeIFDbiXWAK5k+pEBZrUQ=="], + + "@better-auth/prisma-adapter": ["@better-auth/prisma-adapter@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@prisma/client", "prisma"] }, "sha512-ym7B6Iqcry+/4aQnYpFwqP/GBIiXvjrm/5B6+0qmx8mkTY/apHFTpHuGzUYYNf4vPTtzF3eYY2+s2GOsomKaRg=="], + + "@better-auth/telemetry": ["@better-auth/telemetry@1.6.25", "", { "peerDependencies": { "@better-auth/core": "^1.6.25", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1" } }, "sha512-2ZfC9lp7tU6Jw/q2Lz/bKfQqGMdMwc/IQDTYdBhvtGi24qInYVnhp2ZCW57hHM9j+fq1ULOtxgg6M3T1LEaihw=="], + + "@better-auth/utils": ["@better-auth/utils@0.4.2", "", { "dependencies": { "@noble/hashes": "^2.0.1" } }, "sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A=="], + + "@better-fetch/fetch": ["@better-fetch/fetch@1.3.1", "", {}, "sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@noble/ciphers": ["@noble/ciphers@2.2.0", "", {}, "sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA=="], + + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.43.0", "", {}, "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.3", "", { "os": "android", "cpu": "arm" }, "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.3", "", { "os": "android", "cpu": "arm64" }, "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.3", "", { "os": "none", "cpu": "arm64" }, "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tabler/icons": ["@tabler/icons@3.46.0", "", {}, "sha512-f2RYFl3fzPwj5WO82x6en0dmkjefxEfOm16D1ByM6cj/McNiwOkL4VaPUoP9VVIrXAD9WnTSVFr70px703b//A=="], + + "@tabler/icons-react": ["@tabler/icons-react@3.46.0", "", { "dependencies": { "@tabler/icons": "3.46.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-CCm7xJWhDT2PH4ZIFkP6AgYKtVhq0gpYkjUN+GVh1AzmIQaa77OW0bQPBPQiTE0PsXMR9oSxFqA3qBglzPyrVQ=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/node": ["@types/node@26.1.2", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg=="], + + "@types/pg": ["@types/pg@8.20.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow=="], + + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.6", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-69D/imtToCsIcAl8WBS2YaRwA4jO/j0HhU+hELqMEu9f54MoUtI6+XH5mrKU8rEFNEk/Ui1I2MK4/JkWacclGw=="], + + "better-auth": ["better-auth@1.6.25", "", { "dependencies": { "@better-auth/core": "1.6.25", "@better-auth/drizzle-adapter": "1.6.25", "@better-auth/kysely-adapter": "1.6.25", "@better-auth/memory-adapter": "1.6.25", "@better-auth/mongo-adapter": "1.6.25", "@better-auth/prisma-adapter": "1.6.25", "@better-auth/telemetry": "1.6.25", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.3.7", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.17 || ^0.29.0", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-fvoq+oCO+FF5fpP3XfU7znRyGFpHB77UG2EyxsKNy+Cak7Q5pELu+auvvDveQbWQxcoKugZ7jYQQPFQLpUTGOw=="], + + "better-call": ["better-call@1.3.7", "", { "dependencies": { "@better-auth/utils": "^0.4.0", "@better-fetch/fetch": "^1.1.21", "rou3": "^0.7.12", "set-cookie-parser": "^3.0.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-Al51/hjp2SSp6CRTa3F2ptcx4yQVS1xWKoY6jcVXqNYOap6mHFP2jUBn5EwIL4iIed1/Sq4hlQ+Umm6EflZG+w=="], + + "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], + + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.398", "", {}, "sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ=="], + + "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "hono": ["hono@4.12.32", "", {}, "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg=="], + + "jose": ["jose@6.2.4", "", {}, "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "kysely": ["kysely@0.29.4", "", {}, "sha512-y5mVgQNkMbs1eK9Xyc0pmNdabN2wHhRYY/5r4W5HrUT1rYCEPeVNSj1RUJeSDKT3U0p+mXCvLgkrFuIafYI6BA=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], + + "nanostores": ["nanostores@1.4.2", "", {}, "sha512-Wxv8Roefr2nqtiRG0bnaFlpYqpIVtOEeJZHaH+4nGgOK1/7n6OHOuHCb/bhqrNQgZM8fyd0s1PqhdrJc9Ib44g=="], + + "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + + "pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], + + "pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="], + + "pg-connection-string": ["pg-connection-string@2.14.0", "", {}, "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], + + "pg-protocol": ["pg-protocol@1.15.0", "", {}, "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + + "postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + + "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], + + "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], + + "rollup": ["rollup@4.62.3", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.3", "@rollup/rollup-android-arm64": "4.62.3", "@rollup/rollup-darwin-arm64": "4.62.3", "@rollup/rollup-darwin-x64": "4.62.3", "@rollup/rollup-freebsd-arm64": "4.62.3", "@rollup/rollup-freebsd-x64": "4.62.3", "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", "@rollup/rollup-linux-arm-musleabihf": "4.62.3", "@rollup/rollup-linux-arm64-gnu": "4.62.3", "@rollup/rollup-linux-arm64-musl": "4.62.3", "@rollup/rollup-linux-loong64-gnu": "4.62.3", "@rollup/rollup-linux-loong64-musl": "4.62.3", "@rollup/rollup-linux-ppc64-gnu": "4.62.3", "@rollup/rollup-linux-ppc64-musl": "4.62.3", "@rollup/rollup-linux-riscv64-gnu": "4.62.3", "@rollup/rollup-linux-riscv64-musl": "4.62.3", "@rollup/rollup-linux-s390x-gnu": "4.62.3", "@rollup/rollup-linux-x64-gnu": "4.62.3", "@rollup/rollup-linux-x64-musl": "4.62.3", "@rollup/rollup-openbsd-x64": "4.62.3", "@rollup/rollup-openharmony-arm64": "4.62.3", "@rollup/rollup-win32-arm64-msvc": "4.62.3", "@rollup/rollup-win32-ia32-msvc": "4.62.3", "@rollup/rollup-win32-x64-gnu": "4.62.3", "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q=="], + + "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-cookie-parser": ["set-cookie-parser@3.1.2", "", {}, "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "vite": ["vite@7.3.6", "", { "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + } +} diff --git a/platform/docs/IMPLEMENTATION_PLAN.md b/platform/docs/IMPLEMENTATION_PLAN.md new file mode 100644 index 000000000..18934f3a1 --- /dev/null +++ b/platform/docs/IMPLEMENTATION_PLAN.md @@ -0,0 +1,58 @@ +# OpenCodex Remote 비공개 MVP 확정 구현 계획 + +이 문서는 원 기획서 이후 확정된 구현 기준을 요약한다. 세부 제품 배경은 [PRODUCT_PLAN_v1.md](./PRODUCT_PLAN_v1.md), 현재 코드 상태는 [IMPLEMENTATION_STATUS.md](./IMPLEMENTATION_STATUS.md)를 따른다. + +## 목표 구조 + +```text +Browser / CLI + → Cloudflare public ingress + → VPS Auth Gateway + → Cloudflare Mesh private hostname route + → per-instance Tunnel + → Rust Agent 127.0.0.1:10101 + → OpenCodex 127.0.0.1:10100 +``` + +- 사용자 Tunnel에는 공개 hostname을 만들지 않는다. +- `*.instance-domain`은 언제나 중앙 Gateway로 향한다. +- Gateway만 DB의 추측 불가능한 private hostname을 목적지로 사용한다. +- 중앙 시스템은 Docker 없이 Ubuntu 24.04 VPS의 native systemd로 운영한다. + +## 보안 기준 + +- GitHub OAuth와 24시간 일회용 초대만 허용한다. +- 최초 관리자는 GitHub numeric ID로 부트스트랩한다. +- official domain과 instance domain은 registrable domain을 분리한다. +- 플랫폼과 인스턴스 쿠키는 `__Host-`, HttpOnly, Secure, SameSite=Lax다. +- Agent pairing code는 12자, 10분, 1회용이다. +- Agent는 Ed25519 challenge 후 5분 token을 사용한다. +- CLI token은 `ocxr_` 256-bit, 30일 기본 만료, SHA-256만 저장하며 `/v1/*`만 허용한다. +- Gateway assertion은 Ed25519, 30초이며 instance/user/method/path hash/iat/exp/jti/kid를 포함한다. +- Agent가 assertion과 replay를 검증하고 OpenCodex가 `/api/*`에서 다시 검증한다. +- Prompt, response, repository, provider credential, OpenCodex 설정 본문은 중앙 수집 대상이 아니다. + +## 상태와 lifecycle + +```text +pending → provisioning → awaiting_agent → connecting → online + └────→ degraded/offline +online/degraded/offline → suspending → suspended +any live state → deleting → deleted + └→ delete_failed → retry +``` + +- online은 90초 이내 Agent OpenCodex health, dedicated Tunnel connections, Gateway synthetic health가 모두 정상일 때만 표시한다. +- 정지는 DB 차단과 active connection abort를 먼저 수행한다. +- 삭제는 재시도 가능한 saga이며 slug는 30일 tombstone으로 보존한다. +- job claim은 PostgreSQL `FOR UPDATE SKIP LOCKED`와 idempotency key를 사용한다. + +## 실행 단계 + +1. Phase 0: 실제 Mesh/private hostname protocol, HTTP/SSE/WS/long stream/cancel/100 MiB/restart/격리 PoC. +2. Phase 1: PostgreSQL, Better Auth, invite, instance lifecycle, Gateway, tokens, suspend/delete. +3. Phase 2: Rust Agent, OpenCodex assertion 통합, signed installer와 musl artifacts. +4. Phase 3: Instances, onboarding, Activity, Security, Audit/admin UI. +5. Phase 4: live E2E, backup/restore, key rotation, abuse runbook, CI gates, 최대 50명 private beta. + +Mesh PoC가 하나라도 실패하면 보안 수준을 낮추거나 Workers VPC/자체 reverse tunnel로 자동 전환하지 않고 MVP를 중단해 transport를 다시 설계한다. diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md new file mode 100644 index 000000000..34e0d1a59 --- /dev/null +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -0,0 +1,194 @@ +# OpenCodex Remote MVP 구현 인수인계 + +마지막 갱신: 2026-07-29 + +작업 브랜치: `ingw/remote-private-mvp-handoff` + +기준 브랜치/커밋: `dev` / `cfc50fbb` + +이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. 현재 코드는 로컬 typecheck와 집중 테스트가 가능한 구현 초안이며, 실제 PostgreSQL·Cloudflare 계정·VPS를 사용한 Phase 0 및 운영 E2E는 아직 완료되지 않았다. + +## 문서와 디자인 자산 + +- 원 기획서: [PRODUCT_PLAN_v1.md](./PRODUCT_PLAN_v1.md) +- 확정 구현 범위: [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) +- Instances 승인 이미지: [instances-reference.png](./assets/instances-reference.png) +- Agent 온보딩 승인 이미지: [agent-onboarding-reference.png](./assets/agent-onboarding-reference.png) +- 아키텍처 문서: [../../structure/12_remote-platform.md](../../structure/12_remote-platform.md) +- ADR: [../../structure/adr/0012-remote-private-mesh.md](../../structure/adr/0012-remote-private-mesh.md) + +## 구현 완료된 부분 + +여기서 “완료”는 코드가 작성되고 해당 범위의 로컬 정적 검사 또는 집중 테스트를 통과했다는 뜻이다. 실제 인프라 검증 완료를 뜻하지 않는다. + +### 기존 OpenCodex 통합 + +- `OcxConfig.remoteAccess` 설정 타입과 Zod 검증 추가. +- `X-OpenCodex-Remote-Assertion` 관리 credential class 추가. +- Ed25519 JWT 형식 assertion 검증: + - `kid`, issuer, audience, instance ID, user ID + - HTTP method + - 정규화한 path/query SHA-256 + - 최대 30초 수명, clock skew + - bounded `jti` replay cache +- 기존 admin token과 로컬 GUI session 인증 흐름 유지. +- 정상·재사용·잘못된 method/path/instance·만료·수명 초과 집중 테스트 추가. + +### 중앙 플랫폼 코드 기반 + +- `platform/`을 기존 npm 배포 패키지와 분리된 private package로 추가. +- Bun + Hono Control Plane, streaming Gateway, PostgreSQL worker entrypoint 추가. +- PostgreSQL 초기 migration 추가: + - Better Auth users/sessions/accounts/verifications + - invites, instances, slug tombstones + - agents, pairing codes, access/authorization/session tokens + - provisioning jobs, Cloudflare resources, health observations + - audit logs, abuse reports +- Better Auth + GitHub provider 설정과 GitHub numeric ID 필드 추가. +- 최초 관리자 numeric ID 부트스트랩과 24시간 일회용 초대 소비 로직 추가. +- 사용자당 live instance 1개, 전체 active 사용자 50명 제한 추가. +- 인스턴스 slug 트랜잭션 예약과 provisioning job 생성 추가. +- 12자/10분/1회용 Agent pairing code 추가. +- Ed25519 challenge와 5분 Agent token, heartbeat 기록 추가. +- `ocxr_` 256-bit 데이터 토큰 발급, SHA-256 저장, 30일 만료 추가. +- 브라우저 authorization code → instance session 교환 추가. +- `FOR UPDATE SKIP LOCKED` worker와 provision/suspend/delete job 골격 추가. +- Tunnel secret AES-256-GCM envelope 저장과 audit network HMAC 추가. +- Cloudflare API adapter와 로컬 fake adapter 추가. +- Tunnel 연결 상태는 전용 `/cfd_tunnel/{id}/connections` endpoint만 사용. +- private hostname route는 `/zerotrust/routes/hostname` endpoint 사용. + +### Gateway + +- hostname → active instance → owner 상태를 요청마다 DB에서 확인. +- 인증 실패·정지·삭제·다른 사용자 접근은 모두 `404`로 은닉. +- instance session과 `ocxr_` 데이터 토큰을 분리. +- ChatGPT Direct용 Authorization을 보존할 수 있도록 `x-opencodex-remote-token` 보조 입력 지원. +- 30초 Ed25519 request assertion 생성. +- 사용자 Cookie, `Set-Cookie`, proxy/auth control header, Cloudflare 내부 header 제거. +- Fetch body/response streaming, request abort propagation, WebSocket relay 코드 추가. +- PostgreSQL `NOTIFY instance_state`를 통해 suspend/delete 시 진행 중 HTTP 연결 abort. +- Gateway synthetic `/healthz` 경로와 health observation 기록 추가. + +### Rust Agent + +- `remote-agent/` Rust 2024 package와 lockfile 추가. +- Ed25519 키 생성·pairing·challenge 응답·heartbeat 구현. +- Agent config와 Tunnel token을 `0600`으로 원자 저장. +- `127.0.0.1:10101` local ingress 구현. +- assertion signature/scope/method/path/time/replay 검증 구현. +- 사용자 control header 제거, Host·Origin loopback 정규화. +- streaming HTTP body와 WebSocket 양방향 relay 구현. +- `cloudflared tunnel --no-autoupdate run --token-file` 자식 감독과 backoff 재시작 구현. +- OpenCodex에 넣을 `remoteAccess` JSON 출력 명령 추가. + +### Web UI + +- React 19 + Vite 기반 `platform/web` 추가. +- 기존 OpenCodex logo와 dark 운영 콘솔 토큰을 재사용. +- 승인 이미지 기반 Instances 목록·상세, 상태 노드, action UI 구현. +- 3단계 instance 생성·Agent pairing·verify 화면 구현. +- Activity, Security, 로그인, 초대 소비, loading/error/empty/mobile 상태 구현. +- New instance, pairing code, open, token 발급, suspend, delete API 연결. +- 개발 demo data mode: `VITE_REMOTE_DEMO=true`. + +## 구현 중인 부분 + +- Better Auth가 실제 migration schema와 정확히 호환되는지 PostgreSQL 통합 검증. +- Control Plane에서 production web build를 제공하는 SPA fallback 검증. +- Gateway WebSocket header relay와 client disconnect의 실제 OpenCodex E2E. +- suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. +- Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. +- 네이티브 systemd 서비스와 `LoadCredential=` 배포 파일. +- UI의 실제 브라우저 시각 QA. 현재 상태는 루트 [design-qa.md](../../design-qa.md)에 기록했다. + +## 남은 부분 + +### P0 — 다음 컴퓨터에서 가장 먼저 + +1. `platform` typecheck/build와 기존 집중 테스트를 다시 실행한다. +2. 로컬 PostgreSQL 17 DB에 migration을 적용하고 Better Auth schema 호환 문제를 수정한다. +3. Control Plane·worker·Gateway를 동시에 띄운 로컬 통합 테스트를 만든다. +4. Phase 0 Cloudflare Mesh 계정 테스트를 수행한다. +5. HTTP/SSE/WebSocket, 30분 stream, cancel/reconnect, 100 MiB body, Gateway/Tunnel 재시작을 측정한다. +6. 두 사용자·두 인스턴스 교차 hostname/session/assertion 접근이 전부 `404`인지 검증한다. + +### P1 — 운영 기능 + +- native systemd unit 3개와 중앙 `cloudflared`, Linux Mesh node unit 작성. +- Agent `amd64`/`arm64` musl release workflow. +- Agent binary와 installer의 SHA-256 + Ed25519 detached signature 검증. +- suspend 시 Tunnel token rotation과 Connector 종료를 Cloudflare 현재 API 기준으로 확정. +- resume 흐름 추가. 현재 suspend worker는 연결 종료를 확실히 하기 위해 Tunnel을 삭제하며 resume은 미구현이다. +- delete saga 단계별 idempotency와 orphan resource reconciler 추가. +- Gateway rate limit, 동시 연결/본문 크기 정책, abuse report/admin UI 추가. +- audit 조회·90일 retention job, 일일 암호화 backup, 7일/4주 retention, restore drill 추가. +- gateway signing key rotation과 Agent key rotation 구현. +- 실제 인스턴스 domain과 official domain 설정 후 쿠키/OAuth callback 검증. + +### P2 — 제품 마감 + +- 승인 이미지와 같은 1488×1058 viewport에서 Instances/Onboarding 시각 비교. +- keyboard, focus, reduced motion, zoom, tablet/mobile QA. +- UI에서 실시간 health signal 세부값과 retry 상태 연결. +- 온보딩 설치 명령을 실제 서명 검증 installer URL로 교체. 현재 `install.ocx.run`은 디자인용 placeholder다. +- 사용자/인스턴스 관리자 정지 화면과 Audit Log/Activity 실제 API 연결. +- CI에 platform typecheck/test/build, Rust fmt/clippy/test와 musl build 추가. +- Cloudflare 다중 사용자 서비스 허용 범위 서면 확인. + +## 알려진 차이와 위험 + +- 원 기획서의 Workers VPC/fallback보다 이후 확정안인 Cloudflare Mesh private hostname route가 우선한다. Mesh 실패 시 자동 fallback하지 않는다. +- 실제 private hostname이 Agent 서버에서 `127.0.0.1:10101`로 resolve되도록 installer가 hosts/resolver를 구성해야 한다. 아직 자동화되지 않았다. +- Cloudflare adapter의 route create/delete 응답 shape는 live account로 검증하지 않았다. +- Gateway synthetic token은 별도 systemd credential로 설계했지만 배포 파일은 아직 없다. +- Better Auth의 OAuth account에는 GitHub access token이 저장될 수 있다. 운영 전 DB encryption/토큰 최소 보존 정책을 확정해야 한다. +- Gateway와 Agent 구현은 컴파일 수준이며 부하·backpressure·100 MiB·30분 stream 테스트 전이다. +- 실제 DNS, TLS, 두 registrable domain, Cloudflare public ingress는 구성하지 않았다. + +## 현재까지 확인된 검증 + +```text +PASS bun run typecheck (root) +PASS bun test tests/server-management-auth.test.ts + 16 tests / 56 expects +PASS cd platform && bun run typecheck +PASS cd platform && VITE_REMOTE_DEMO=true bun run build:web +PASS cd remote-agent && cargo fmt --check +PASS cd remote-agent && cargo check +PASS cd remote-agent && cargo clippy --all-targets --all-features -- -D warnings +PASS cd remote-agent && cargo test + 1 Rust unit test +``` + +아직 통과로 간주하면 안 되는 항목: + +- root 전체 `bun run test`: 120초 제한까지 다수 테스트가 통과했지만 최종 summary 전에 timeout되어 전체 green으로 간주하지 않음 +- root `bun run privacy:scan` +- platform PostgreSQL/API integration test +- 실제 Cloudflare Mesh Phase 0 +- 시각 QA와 접근성 브라우저 QA +- systemd/VPS/backup restore 검증 + +## 다른 컴퓨터에서 재개 + +```bash +git fetch origin +git switch ingw/remote-private-mvp-handoff + +bun install --frozen-lockfile +bun run typecheck +bun test tests/server-management-auth.test.ts + +cd platform +bun install --frozen-lockfile +bun run typecheck +VITE_REMOTE_DEMO=true bun run dev:web + +cd ../remote-agent +cargo fmt --check +cargo clippy --all-targets --all-features -- -D warnings +cargo test +``` + +UI demo는 `http://127.0.0.1:4173`에서 확인한다. production 실행에는 PostgreSQL URL, GitHub OAuth, Better Auth secret, Gateway Ed25519 key, AES key, audit HMAC key, synthetic health token이 필요하다. 환경 변수와 credential 이름은 `platform/server/src/config.ts`가 현재 기준이다. diff --git a/platform/docs/PRODUCT_PLAN_v1.md b/platform/docs/PRODUCT_PLAN_v1.md new file mode 100644 index 000000000..61c7e022e --- /dev/null +++ b/platform/docs/PRODUCT_PLAN_v1.md @@ -0,0 +1,407 @@ +# OpenCodex Remote Access Platform + +> Self-hosted OpenCodex 원격 접속·관리 플랫폼 기획서 + +| 항목 | 내용 | +|---|---| +| 버전 | v1.0 Final | +| 작성일 | 2026-07-29 | +| 상태 | 조건부 승인 | +| 초기 대상 | 초대 기반 비공개 베타 | + +--- + +## 1. 결론 + +이 계획은 **비공개 MVP로 실현 가능**하다. + +다만 사용자 서브도메인을 Cloudflare Tunnel에 직접 연결하지 않고, 모든 요청을 OpenCodex가 관리하는 Gateway에서 인증한 뒤 비공개 Tunnel로 전달해야 한다. + +```text +권장: +사용자 → OpenCodex Auth Gateway → Private Tunnel → 사용자 OpenCodex + +비권장: +사용자 → Public Tunnel → 사용자 OpenCodex +``` + +### 핵심 결정 + +| 항목 | 결정 | +|---|---| +| 도메인 | 공식 서비스와 사용자 인스턴스 분리 | +| 트래픽 진입점 | OpenCodex Auth Gateway | +| Tunnel | MVP에서 `1 Instance = 1 Tunnel` | +| Tunnel 공개 | 공개 hostname을 직접 연결하지 않음 | +| 접근 범위 | Private only | +| Agent 등록 | 짧은 수명의 페어링 코드 | +| Cloudflare Access | 기본안에서 제외, 서면 허가 시에만 검토 | +| Harness·범용 Shell | MVP 제외 | + +### 진행 조건 + +- Cloudflare 계정 권한은 Control Plane만 보유한다. +- 사용자 서버와 Agent가 보내는 정보는 신뢰하지 않는다. +- 공개 출시 전 Cloudflare의 상용·다중 사용자 이용 조건을 서면으로 확인한다. +- Workers VPC의 스트리밍·WebSocket 호환성을 PoC로 검증한다. + +--- + +## 2. 목표와 MVP 범위 + +### 목표 + +사용자가 자신의 서버에서 실행하는 OpenCodex를 포트포워딩, 고정 공인 IP, 직접 TLS 설정 없이 전용 주소로 접속하고 중앙 대시보드에서 관리할 수 있도록 한다. + +```text +https://. +``` + +### 포함 + +- 이메일 또는 OAuth 로그인 +- 인스턴스 생성·삭제 +- 서브도메인 자동 발급 +- Tunnel과 private route 자동 생성 +- Linux Agent 설치·페어링 +- OpenCodex Auth Gateway +- Heartbeat, Tunnel 상태, 외부 Health Check +- 인증 정보 회전·폐기 +- 관리자 정지, Audit Log, Abuse 신고 + +### 제외 + +- Public·Link Access 인스턴스 +- 범용 Tunnel·웹 호스팅 +- SSH·웹 터미널·범용 Shell +- Harness와 작업 큐 +- 팀·조직·결제·SSO +- 사용자 지정 도메인 +- Windows·macOS Agent +- 자체 Reverse Tunnel 프로토콜 + +--- + +## 3. 권장 아키텍처 + +```text +[사용자 브라우저] + │ + ▼ +[Cloudflare Edge] + │ + ▼ +[OpenCodex Auth Gateway] +- 로그인 검증 +- 인스턴스 소유권 확인 +- Rate Limit +- 요청 크기 제한 +- Audit Log + │ + ▼ +[Private Routing] +예: Cloudflare Workers VPC + │ + ▼ +[인스턴스 전용 Cloudflare Tunnel] + │ + ▼ +[사용자 서버의 cloudflared] + │ + ▼ +[127.0.0.1의 OpenCodex Server] +``` + +관리 통신은 별도로 구성한다. + +```text +OpenCodex Agent → Control Plane API +``` + +### 구성요소 + +| 구성요소 | 역할 | +|---|---| +| OpenCodex Web | 로그인, 인스턴스·상태·보안 설정 | +| Auth Gateway | 사용자 인증, 인스턴스 권한 확인, 트래픽 정책 강제 | +| Control Plane | Cloudflare API, Agent 등록, 정지·삭제·감사 로그 | +| OpenCodex Agent | Heartbeat, 로컬 상태 확인, Connector 관리 | +| Cloudflare Tunnel | 사용자 서버에서 Cloudflare로 아웃바운드 연결 | +| Private Routing | Gateway에서 해당 Tunnel로만 비공개 전달 | +| OpenCodex Server | `127.0.0.1`에 바인딩된 실제 애플리케이션 | + +### Gateway 라우팅 원칙 + +```text +.ocx.run +→ Gateway가 hostname 확인 +→ 로그인 사용자와 instance owner 비교 +→ DB에 저장된 내부 목적지 조회 +→ Private Tunnel로 전달 +``` + +사용자 입력 URL이나 IP를 내부 목적지로 직접 사용하지 않는다. Gateway는 Control Plane이 생성한 고정 매핑만 사용해야 한다. + +### Workers VPC 사용안 + +PoC에서는 하나의 Gateway Worker를 Private Network에 연결하고, 인스턴스별 private hostname 또는 VPC Service를 통해 해당 Tunnel로 라우팅한다. + +Workers VPC는 현재 Beta이므로 다음 항목이 실패하면 자체 Gateway 또는 Reverse Tunnel 구조로 전환한다. + +- SSE·HTTP 스트리밍 +- WebSocket Upgrade +- 장시간 연결 +- 요청·응답 크기 +- 다지역 지연시간 +- 장애 후 재연결 + +--- + +## 4. 도메인과 인증 + +### 도메인 분리 + +실제로 소유한 도메인이 확정되기 전까지 특정 도메인을 전제로 하지 않는다. + +```text +공식 서비스: +app. +api. +auth. + +사용자 인스턴스: +. +예: .ocx.run +``` + +사용자 콘텐츠를 `.opencodex.com`처럼 공식 서비스와 같은 상위 도메인에서 제공하지 않는다. 사용자 서버가 임의 응답을 반환할 수 있어 피싱, 쿠키, OAuth, 도메인 평판 문제가 공식 서비스까지 번질 수 있다. + +### 세션 정책 + +- 공식 대시보드 쿠키는 Host-only로 설정한다. +- 인스턴스 접속 세션은 사용자 콘텐츠 도메인용으로 분리한다. +- Gateway는 세션 사용자와 요청 hostname의 소유자를 매번 확인한다. +- 사용자 서버에는 공식 세션과 Refresh Token을 전달하지 않는다. + +### 서브도메인 정책 + +- 영문 소문자, 숫자, 하이픈만 허용한다. +- 한 단계 서브도메인만 제공한다. +- `login`, `auth`, `admin`, `billing`, `support`, `official`, `verify`, `status`, `api`, `www` 등을 예약한다. +- `login-*`, `verify-*`, `account-*`, `support-*` 등의 사칭 패턴도 차단한다. + +--- + +## 5. 인스턴스 생성과 연결 + +### 생성 흐름 + +1. 사용자 권한을 확인한다. +2. 서브도메인을 검증·예약한다. +3. `pending` 인스턴스를 생성한다. +4. 인스턴스 전용 Cloudflare Tunnel을 생성한다. +5. private hostname 또는 VPC Service를 생성한다. +6. 공개 hostname과 내부 목적지의 매핑을 저장한다. +7. 사용자에게 Agent 설치 절차를 표시한다. + +사용자 Tunnel에는 공개 DNS route를 직접 만들지 않는다. 공개 주소는 항상 Gateway로 향한다. + +### Agent 페어링 + +```text +1. 사용자가 Agent 설치 +2. Agent가 짧은 수명의 페어링 코드 생성 +3. 사용자가 대시보드에서 승인 +4. Agent가 키 쌍 생성 후 공개키 등록 +5. Control Plane이 Agent 인증 정보와 Tunnel Token 전달 +6. Agent와 cloudflared를 시스템 서비스로 등록 +``` + +장기 비밀값을 명령행 인자나 Shell history에 남기지 않는다. + +### 설치 원칙 + +- Agent는 전용 OS 사용자로 실행한다. +- 인증 파일은 관리자만 읽을 수 있도록 제한한다. +- OpenCodex는 `127.0.0.1`에 바인딩한다. +- 바이너리는 서명 또는 체크섬으로 검증한다. +- `curl | sh`는 편의 래퍼로만 제공하고 원문과 무결성 정보를 공개한다. + +### 온라인 판정 + +```text +Agent Heartbeat 정상 +AND Tunnel Connector 정상 +AND Gateway를 통한 /healthz 성공 += online +``` + +일부만 정상인 경우 `degraded`, 일정 시간 모두 확인되지 않으면 `offline`으로 표시한다. + +--- + +## 6. 보안·악용 대응 + +사용자 서버는 완전한 비신뢰 환경이다. 서버 소유자는 Agent, Connector, OpenCodex와 응답 내용을 수정할 수 있다. + +| 위험 | 대응 | +|---|---| +| 임의 콘텐츠 반환 | Private only, 모든 요청을 Gateway에서 인증 | +| 공식 서비스 사칭 | 공식·사용자 도메인 분리, 예약어 차단 | +| Cloudflare API 유출 | Control Plane의 Secret Manager에만 저장 | +| Tunnel Token 유출 | 인스턴스별 분리, 회전·폐기·연결 종료 기능 | +| Agent 위조 | 인스턴스별 키, 짧은 수명 Token, 재등록 시 기존 인증 폐기 | +| 상태 조작 | Agent 보고값과 Provider·Gateway 검증값 분리 | +| SSRF·교차 인스턴스 접근 | 고정 목적지 매핑만 사용, 사용자 입력 목적지 금지 | +| 트래픽 남용 | 요청·동시 연결·본문·응답·WebSocket·사용량 제한 | + +### 즉시 정지 절차 + +1. Gateway 라우팅 차단 +2. private route 또는 VPC Service 비활성화 +3. Tunnel Token 회전·폐기 +4. 활성 Connector 연결 종료 +5. Agent 인증 폐기 +6. 인스턴스·계정 정지 +7. 관련 Audit Log 보존 + +### 운영 정책 + +- 초대받은 사용자만 가입 +- 사용자별 인스턴스 수 제한 +- OpenCodex와 무관한 웹 호스팅 금지 +- 피싱, 악성코드, 스팸, 공개 프록시, 불법 콘텐츠 금지 +- Abuse 신고 페이지와 관리자 긴급 정지 기능 운영 + +Repository, 프롬프트, 생성 결과물은 Harness 도입 전까지 기본 수집 대상에 포함하지 않는다. + +--- + +## 7. Cloudflare 의존성과 한계 + +### 기본 한도 + +2026-07-29 기준 공식 문서의 기본 한도다. + +| 리소스 | 기본 한도 | +|---|---:| +| Cloudflare Tunnel | 계정당 1,000개 | +| Tunnel·Mesh Route | 계정당 1,000개 | +| Workers VPC Service | 계정당 1,000개 | +| Cloudflare Access Application | 계정당 500개 | + +따라서 `1 Instance = 1 Tunnel`은 초기 베타에는 적합하지만 대규모 서비스의 최종 구조는 아니다. + +### 계약상 주의 + +Cloudflare Zero Trust 약관은 서면 허가 없는 제3자 재판매를 제한한다. Cloudflare Access를 사용자별 인증 기능으로 제공하려면 사전 서면 허가가 필요하다. + +Workers VPC와 Tunnel을 SaaS 내부 연결 계층으로 사용하는 구조도 공개·유료 출시 전에 Cloudflare에 서비스 형태, 허용 범위, 필요한 플랜을 확인한다. + +### API 주의 + +Cloudflare는 **2026-10-05**부터 Tunnel list/get 응답의 `connections` 필드를 제거할 예정이다. 처음부터 다음 전용 endpoint를 사용한다. + +```text +GET /accounts/{account_id}/cfd_tunnel/{tunnel_id}/connections +``` + +--- + +## 8. 개발 단계 + +### 0단계 — 기술 PoC + +- Tunnel 생성·삭제·Token 회전 자동화 +- private route 또는 VPC Service 자동 생성·삭제 +- Gateway 인증과 인스턴스 격리 +- SSE·WebSocket·스트리밍 테스트 +- Token 유출 후 회전과 연결 종료 +- Cloudflare 상용·다중 사용자 조건 확인 + +**통과 기준:** 다른 사용자의 인스턴스와 정지된 인스턴스에 접근할 수 없고, OpenCodex의 실시간 기능이 정상 동작해야 한다. + +### 1단계 — 비공개 MVP + +- 계정·인스턴스 관리 +- Linux Agent 페어링 +- Tunnel·private route 프로비저닝 +- Gateway 인증·권한 검사 +- 상태 확인, 재연결, 정지·삭제 +- Audit Log와 Abuse 대응 + +### 2단계 — 공개 출시 준비 + +- Rate Limit과 사용량 제한 +- 약관·개인정보·Abuse 절차 +- 모니터링, 알림, 백업, 장애 대응 +- Cloudflare 계약·플랜 확정 +- Workers VPC 유지 또는 자체 Reverse Tunnel 전환 결정 + +### 3단계 — Harness·팀 기능 + +- 작업 큐, 실시간 로그, 작업 취소 +- 컨테이너 또는 별도 샌드박스 +- 실행 시간·출력·동시 작업·네트워크 제한 +- Organization, 역할 기반 권한, SSO, 결제 + +범용 Shell은 기본 제공하지 않는다. + +--- + +## 9. 출시 전 체크리스트 + +- [ ] 공식 도메인과 사용자 콘텐츠 도메인을 실제로 소유하고 있는가? +- [ ] 사용자 Tunnel에 외부 공개 route가 없는가? +- [ ] Gateway가 사용자와 인스턴스 소유자를 매 요청마다 검증하는가? +- [ ] 사용자 입력으로 내부 목적지를 지정할 수 없는가? +- [ ] Tunnel, route, Agent 인증을 한 번에 폐기할 수 있는가? +- [ ] 삭제 실패와 고아 Cloudflare 리소스를 탐지·재처리할 수 있는가? +- [ ] `online` 상태가 Agent 자체 보고에만 의존하지 않는가? +- [ ] SSE·WebSocket·스트리밍이 실제 OpenCodex에서 정상 동작하는가? +- [ ] Cloudflare의 상용·다중 사용자 이용 조건을 서면 확인했는가? +- [ ] Abuse 신고, 긴급 정지, 로그 보존 절차가 준비됐는가? +- [ ] 설치와 업데이트의 서명·체크섬 검증이 가능한가? +- [ ] Harness가 원격 접속 MVP와 분리돼 있는가? + +--- + +## 최종 권장 구조 + +```text +공식 서비스 +- app. +- api. +- auth. + +사용자 주소 +- . +- 모든 요청은 OpenCodex Auth Gateway로 전달 + +중앙 시스템 +- Auth Gateway +- Control Plane +- Cloudflare API +- 상태 검증·Audit Log·Abuse 대응 + +사용자 서버 +- OpenCodex Server: 127.0.0.1 +- OpenCodex Agent: 최소 권한 +- cloudflared: 인스턴스 전용 Token +- 공개 hostname 없음 +``` + +**최종 결론:** 초대 기반 비공개 베타는 진행할 가치가 있다. 사용자 Tunnel을 직접 공개하지 않고 OpenCodex Auth Gateway를 반드시 앞단에 둔다. Workers VPC는 빠른 PoC에 적합하지만 Beta이므로 실시간 통신과 계약 조건을 검증한 뒤 유지 여부를 결정한다. + +--- + +## 참고 자료 + +- Cloudflare Tunnel API: +- Tunnel Permissions: +- Cloudflare Workers VPC: +- Workers VPC Networks: +- Workers VPC Limits: +- Cloudflare One Account Limits: +- Cloudflare Tunnel Changelog: +- Cloudflare Zero Trust Terms: diff --git a/platform/docs/assets/agent-onboarding-reference.png b/platform/docs/assets/agent-onboarding-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..7315ab5c81278a384c92123fd8375c6b217c49e0 GIT binary patch literal 1122295 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ä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

-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�)6IXx-5p5fEm&>ai#qHlv5}QYL*x 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

@><;C7fz?ha=t#tNQXOu7t(G!LdbB|GO3pP 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�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

5t9xUePw+V({e9Zt2^n;ZTjTw#;kV%M;^9BT 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 z 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≺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

Ix!4u+H3eP@?qSi-9l0< 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�z-CTX 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%0D)Jt8wRrsQnkdTdL=RE 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

Iqo%DrKZ6b*2sG1?GVEYAJ$f5qo|&e5?BeQ` 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 z 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%0DAvr`*B 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�! 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

issXjLHGjNV=5yagjJ*FaV(GAEN`qh;^-UT>(W z?7msS8}Ih!tVjFh8(l&fkB0omPfMwjb>d9b!=yZ$#`&BeJ65{!o z6aeZ=7`X3D{`)c*Bg6#z&zijW@#9L#mqVEx^1tTXRuW>(J@1t|Xak{ZA3Pr)b?L#6 zZDo!j{B~7M%kEM(G_Y%N*jA2|37TBvzx%R|ypNw65&DKW_$tmg!a%2e2FK;7CugnP zY){&}6T?e>YO8yfC?9Yw{?80bRg3TDzfZsA(qpuoM!)f{ozk)@5wuO1+ir83!`@9@ z;RQHN-l3SH6rjYW$Jrl^4B0eEp}mnf1+|RgHk8L27@ZSP0-zYh8Mfh6D`y~!g0$1c z2_B0}r1t|mz`-+9;ouHd%l3VBAaz|0pTKLq z7TU;2CdL#@?FZ~H%f||m|CfILZ%`W33Mq}9$aKyHmNcE(hWDB#ck`n6CYyoH$xG1& zWlgvtk?;5CwILJFq1j*O(I3fy#H$kr1DpfGw*IUnZftDY98Qd91yrG1wv4@1wxYWx zYrxy_^(LyWJxi_m|!Rs}Bl=D!H^7UD`4=U|WURa4; z#VxJngh#js7xdUA!a_HeLVM5InzJsDUb@aW`>d5-BMh=W4JN;_J)PoITf=r;z+kRl zTTk>Gm9638S1<07x%-a8aDw2_Uok###4EGcA>3)1Mtll52&*Xc^4FI?{j3{|ZwjqcuV~qwb4gywq8aY{y71{0aBDrUXc3XT6yFI^zn7eRCwwH{ zPrB}1w=&nUpbs|r!@{y|im+!@v+7@LvDa0N`8$gKO#X!khq8_K7X=BKZIaxC?{&Js z3Y3&#>Dl^}_YBQFFCh6@3oj?!|21;=c8D>Se8P6|8n48S<)=ZuTC5Hx{HIm)} zL+-GStj_=VIX@}T4K!%qYKyO4tKf8~4%m;tpIDBReETk!n-5`yRsdsLNlojHuVf{- zeJy1S3=2w^XG$grj1RfGn;4wY zdfEF)FU?SetFL7!#LQjt_T|*Te%GaU5mPS(p=%x-5W-d(O-xXS+c+f1CtH9rN?X&$8g z?LWA-7cfuBfQtRk{O@`W-zeX=FpyEhvV5};LMvMr2(U=l3`PDoPErZZe__F zR3rTF{l59YKB0Wd0nRR9-dBXS7*&nj{k)Q>PIAW_0fz%3l;WI0oNe@Xbd(im`6r+) z;VFZ5W;P>M2&Nj8)ojcG7L7(5+A}}5n0HEs&Xmc(j*Yz;=w<{B&!oJtFQl;p&!nqK zO@9Gvbio^LuHVGGK>5wh%)!@L9U#CuQzlb2|e!0A6BE~0J|se6my>n+^TG&WYmxG z80u_+A=m%%*3rAe&6ee9XNQrCt+>hDaO!0d#=5R_%i?=tINrc`X4qEsqGLsF5J>Uq z(sB6WK#kCvWvK5P8o`LO0f@ zry*Qw!2`ES;iQx)I1^5U;Yq3`rg-q&Ma!_QLJ`}ht(b%nuh>%nI{-OEA!%c#;rBFD z5U%?rN->eA%m9eB1x&WlJSL6Xhi*z}(nXpV!sl{A>XExZ+9IhwKV(HvT2S~hqk{vj zsMJ7P5uqQYnyQD)`^r#PB{ahSq})IvLwia!cKhv_*eQPdfZguyZY$?JM!x;=KU>fO zN^vw}5i%osZ zJfrij>c84|#TM5lem)0*M!JWSmlmA#Eyb%XtqCTDrJy0Igm8E;VKlKIRYv7)|E{hY zgdFRfAABj|lpLGEmD2}r+p@$Q%LC2JK)u#Un!g;kOnLiqLbm?#CWd1porT-h82fgC z1IKh{Cdo$g6|;MD#{V6B>z{w3D(>Umq-sx-pk)J(@c4V9Gdil>wO<=Lf9oH(u?~Fj z9qD1aU>wP?&&c5#=pJ74thwb2@PG7 z6IAfpatm;+TDgAt>O9>klsC;0De!wCWbe z@z3X-k;`lR2$KArbQvUV7>wS-HnaS5)+Eme%{AxxZ)Zy6`Rr-g+uNHmfja+SEJ}nj zGXk9)pQF!CAxOYgV7yMkVr#ax9tk5-&W|v+kl~ZArOr8!UUwP9QC0<0Nlgv-$@V}; zzb#GV(T%j9K;rLmm3L^|q!nyjdHwqb6P4YMWF(or!lFinvYK%$nW&fg9nIY^ z$v$3EV|VzMs~Q$Qw24aCM(5MFkcq0KpYApEzHANZ*oIsQWFyXgX6Kj+@DLD^fBsw( zgf>Z-OHyUDD88anfl1`tJRjg+FTcB+1U=pZDsV$4Wi2^*%o_g0>L>1_p~Jb-Qf73$ zhcN2Zw+$m3m%snT6oVs&!|JCZMA>;Sq!0eGF(~67U-b{(e%MJoQ{b5Y4R?EDXf9@N z+U^O0qD#5NULbrTjB&E~&x5a`w{;s&5vDC`Yd`Cj)}3N~%NhN41XQT*vo=rZ*LGB4 ziLmF8x|uv2y#4&k0ii$qk=-3@qfm`T?OWGy;1gxZmj?-{$}Gnion3pF=)IdfjgftV zZ4S!w3SBpEMEqvNKVv*$xyHg%8&ul~xnHC!HmH3mi8J#_0#8@R`j?yK^B?&4sUlnK z+41j?uig}Nc#tU`_+FoX=Z3wgN~DJN4EQza%s2O5acxv*ToZt_{W`an#M1u3P}s;s zpi{d2i;4r@BDDOE$oN%(<+RLK60L8)y!e{agQdztA1eRU4tcun)C|5S<>x!*h0av& zqROrhExE~k>3YCpEf-;Wv&Qhb0U!ukolCea;YYDgJ|)ZbCy4y}^{%(*p4}PC@{=M0 z0ePQL6>E-hj$-#+U2VqQMxvZANB>q}PCy2#m-!}zFR=71SJ#)A$O}w-eG*wyd$OS*_xB7g^sSFX+f8wo)30e&-ZyjHY zna~9ur?u}zH5VTx>)cAZmDv6X0-t!ndEt_9+O_UI2~qtu@BEijeIE3e+Bd{lis!$6 zk}G{E51@T&f2{jl?zP6fXW6?uWnPwHtJ8a_N$8{WeUZKMclIY!7n>{Qo6=k2{`LsV z2A(#G{@p0|-kzkFXLh82noNoelQzc`6c7mB>~{`7=n@Gh0N3jE z@9dy$bmoPHK%CHEUa;d-;)45Bl_Ad|0O{|n*Y$Cf7{eUNPfNyi;z-JbhG&YNpl17sv&hj6*%fx;w} z&^L}nGj0sZ2(+Cv>y8`Bwy!~nJvNU1={F;*ry$7E&c10^=XEZ@T!7W(U!(PuNDXD2 zPDW!k8oXQSiDWntjxspx0MdT9b^5}YU<_=#4PP>nLn+l{P~yi;z&&^DTYWl@ft^gV zIh+mw&i-|$q`x`ppgHW&pfEVBCw0&rRlNY?U_Ht5PF?N1ou<@Cl`Q9EHfn1krLZxIe zGd+x}?VA~Wnv~t?9X<0h(&1r`Sy7}IOI6^9n7g9Fg&&I7ET3lJt0 zwwx~#OEXV@YvBGc;pb^N^V=s`Ccd0EQ48sMq?$J`JL6F`2kz7`O(X_WJ zxdK^gM<0v91WjTqSkXA!$`gl#uDUv%Xm)Z(HF95B`6hP7Ikk%o{Z8iNeKD6)X+=j? z+y@QP;~#)9Nbi7ILVQ40mUWbp$-ALV&nD}_M}_%EM-nQz!}c|B1;QI3kS#TkMKpFf z2nGjF4Hp}7DHG!5EYx-<${Udn|Kkv8SY0nndR6P#+Uvpmz~$AXI$mlFEJXI3ec50_ z<5Zd@1ZapH#1iF+v(V#}B@U5=TKB$I8K|-=l`_I~_XzVKFK$;rL5KHsMf~?-B+x!x z2_Ik}&4WdDAk~sU#Dmv6Ifj*Km9BCp`IeXIWZFDVquzD=^ApRFgei>AfWE|(`{Ajy z;eP_VUmkH@$rpgrs=;1J0trZ=iex)~MOJTlU{k(A1iae$DUK9Aw%ZqYcyQfU)}53S ziD2*xL65nr+cweQ?F~F0xkME-RoPtyPVl7o_?!^zhN(v5G8u`qj=UmtnK}dzlKJ-3 z5sE*Slk0q3#{xn26Q`S2+$-LJUs08fgQttGhWuSor|?p~xjfP(qtnB5JKE;B+iX5x zu5?~fdxu8V(n=<4PlU_BUcImSdyVA;f%M_A`bF6v?>huM*I!HD@ZE6aoBNaNkpe%% z(0dv$zWr!@^3r^x1K55`O8M32*5Uc_qIuV$xG${Swnhn}u6dY;Fx8Exy=Lzg=dynp z1fylyZ=Sh0ukfVWC%R9oK&Vo#J6X!_ev|QxKGg291?!JJ+9d5pzsd669b>7fxjqLc zZpDPM!Fm~GN&nwBr2Ou2obD262&%rx^gE~d>sl25!s@F$U761Ky`MtAR1+6h2J^nl zalX5MaG3E9ve)i0r_!bTF=yD}SWsBjd-huQ{EsVKhU{48<(1o)GC&}*_LXQJ*YiFc z4&iwzM8f^O+7_Q7_+e^fu6^;h4DD4e3Mf^%Xz9A)ePx#nhl?z?yX-qy-v}_WMAFl; zM$Z|(r>NsTck|y#%h}XwV(Vu0+$Ojc=#aicznWkAb^OT0DtSM2X)yFefuuFX@Ata= z{YvM~l@yI;x5qoF&qP;y2O106oM~2F-(FyUrfygmvVCBkJo{dD0Dh}S^D4dO=VxZA zVSDqZTnWTAtB4c2CsZVJ6rcL^CWzO({WidHM`m@RUA_4IlO=ZTZH4b^U}D5wzk}YB4&z(A)bg+?Cl>c0esZkb-sRt)NeypYz@IAO|Bq*{ba-ok!$ZnI z3FDck_ezg#=1<4@jc1u+Q%tC)DKgcZBduq6B z@Y!a{BlhWq2&}7SRz-PP}rZrk2rg2;_`!-OQ$tK(yoG#Iuoe=MD(45p+Uz z^ale*gW@s-ei#M-XkGz0O%C4IUrTb`s;Kjy4}o}B%bMW6IpqEV(O6+_L<6=h0mL=l zZAM?xF$0;BRWbBow|_6nEEXFr?{&?#?t|_~! z%BFc3kc4&qhO4?Z`R=Eis1n>JSOfTU*#Sw=_`9KeMH$@Zygb)&XQLX+is(_)oV@ak z+WO)L3>`r>%GYQ{xh5qh)x1QskDv4e43DXGv z1(Yc?Fuu%0HFx3BBS2x6qX4K~gJ;&fx2om6S`QWCe<6|3 zfMBKARK2oea>auU1M`^Ff$pQna64c`(SO$U%=H^?vPJ)BF*hzhw0@=kht@j0 zUncjl!&SZda69i(g4E#iN|w`UU;5vhI(3V%>RGgfZY}-&5T_j-{Xp`mn+Ms)-KP!| zKC(Fd^U1>rIckYFBnYB1lejGTaLqGAJY~|=5Hv)Hyw3LgcH(V)wSQL$KxU!aL{Q0P z7Xz`PO5Td13Ycm+pflFidj6f|dAV5C(`(!}+jyQ`z1HpfSfwz2^KjdZ{f>Td>N_C= z81;&^8S!tXGm?QyGq8*|b9&lph&Nb1O`8AR2D1OMQxCo&rmqrZP!2u!g4Uv&~)!SW(N{$ZH_`Ge6Pc5$F zSU_wsC+F5I(c3F{*fxVy^lIF3)P5<^ zTP3fO9zT3^lJ!F~-R8E)jSSp*Lople6b77d(Q8V{>#rhq!Q_{Fl;~&K@Q?mmTiBZ2 zy2w`a6H&in?K9De@a}0bHJ`YY4wEGVu+E-j22Y#qs}I_2I_S~iz}H#^yDskK7m|Pd z%8dSx#JyeY@2Xx36nM*zpGpLb4c&Y)HrQx;f@4*rKai%!E^6`JJr# z_r-VL81}@9IUmApH3U*mpAt0_Jaa<)jOX=DQa$T{*`TF#O! zNnbg6PmkB#!-!?%v}ZkCfTw4bF0VRJ0?@VJS;F?R^szIK)IXuBUbQ$Uwh7{@Uot6tyL)WunFT;zKSjBfOxPHxCD#_B}e=qOzj?-Vw!rw|$ zSMg1c(5S+&>q7n{W@vX;Ax8m ziC-stNK%|jVULVoTsn&+>2!YQr$I;IPxqXs&T;D3N9dZ1-tiRxqQ{b_nJV)-KH zZRS2~RH@`A&@y6{RZBK{SSAQb2bsVEPO@Cz1O!LOit{d94D&< zdzZ@@e+@Dh-Q2{(u`*Ej8rFtW{dlx6QEiXl4esO6*kN2WRo5Avsq-EDU-qGKXzxKJ zVGa~vKHDBRxC|j*dvD}yl_j5jmjzI~!S+dW!)oLMLmA}p(Ml3{YfQJvdqKe&J-=%L zo~xh3kkOzK`v&g7CP?2fIxo`MLf!x0){NGdwUBFGcyc zxAmW=1k?qoda}MBcJT;PEB|TZjo6sOFt#H(gxVo<3M^YhV%(kG1+IDWpS`}o^e1K$ zUQMUVtScA*#@bFBhLKf$kU)rs|Hj)4IN6riz7;uWliNQwHs&36Xrl`9w*Te8zp_b&G?&;oy zY|Wi&;2Zq1{QoU5vA;iYxUPr?^v^`qQ2UWh^L;|M?}RHLTUVcO2{6vq7&TG#vd+U>oI!j~!E>ul%;1-b<8C|~YEzF+Xk|&7CvU&Wwp526EXm}8M}J?e z5ZNNU$rXr_c#^2X06g>PNgA*ObG8#tBhp^pxt`1FYM%V?;;ncs)?4R`VnpM(`EHG7 zmYh5N{7IHDv0o=K-FgN#alZsOeCCQ@_^a#@L09b(<4p{KC!SA5w<+sH;JL6cHrUT2jq7c@XEf{nRfToDp6D@?LPlq^?N#!S@eb)9y7P8L#%JLpFK# zt$wKW=_C8(eeJ;}$Ue$5lbF88<-OU75Q1^`^~`5#GA6Hgsq2`A0s|A=!zM`&nx5MdTKscBg;1$cUlX4nT&v^j*r zP%kXK!Wa|)y(L1(FxT13SB1-go&(toY98HUo{m9`it}VmwdTodke8tcTT| z1qcM<6zXU-IBVlf0fg)QO33Bm5DwPqwY~V-BgdeJjh;?_7oXb|%H{f93XjSJ2S)u` z>A9eGKQKt}?`d#7k9g8?%K1*cw}tyPryuTK*a`kua0f z#G4speEBXGurtKbat`GBq&K^B*5!?w3;1kDUg6Rc>C4w5MOnli)I1B+PRNZ=8*8@h z8oSQZf5GZXdB>%fO$RSD?~4tz@T%>+*QmCMp=eX)pY|MU+9MQC$eN z96wR7zx7_BMwg@!%;aEs|1kXgRzJ&qjaYArufDHTM5TeesOru7Q!|hHe{ALVj z_D7Cb@lU-M#EXByU>YiF!8iiQHf*e7Se?9Pqu`l`QY2J)!?ys@!9j3qoBDTzV>p)B9E=2S zBk<{S-nPFSI$`L*o*(c_+*%-SuG@e2zVL8ARj)mcIUMn7+e+}xQG}wI46LGWv8;wh z_`b2?)%MlzfYw;h`v?b+ls=2g^br->#L|-4^KT_WfAOpz9i3GQMs6pz3~+N?y#4&l z#cp4t%hwzm&0|)S5>riP`|BEzNbkdPRE1?#>%l+63@PPc)POT~I1fUya^9Y<^~a}I zsV}Je^10@YN4hnJ0_slt;zGw4HHwo}wlLq7eZ%ytvmQZ=;|xtt4B{}SepqFvgFT1< zgjflJ!@K+i^D!-qnL`+eE6AGgflF=Yto_kE@Y=TfeVV}S02vmv(8kXBva)__qcm?D zzisQct__+G=_6J%7MiMTG>*{ZJm1ZYLUAWEKH%&Vvc)3cF=xzJ7$}qHK9RS zxpnH8QWHXO2dKTndgqbthB-67GRc1-ohOqYUKJDq+Baz;!48EMhRf?)fEg+X1J~8n zEqtkCpwo)^&iVqd8ZUVGNwSf(V)3}*+2ACd+aSJYxcrPny7f!e6QV^YmK#B8zT-*N zkWG;!k9Kd=Gbs3=x1xGsZ@M06GWFBfF#bB_{Cs)fS+i!7{|YGszFWCs2XUPGk!ef& z8@gdL96ocyxf&9%P|sDBm@06a4|UOkPx3^O)WCx)#FJme;#ng3imp6hz4h;m{6k&m ztcJ;4&LZnam8e8qv$rk$HMZe$S_^f4^H8;kXzjO?l5sp2H~v-DcmVO6|3>;e(joVS zsb#-ut77^c6H=H|T_r{^OU9q77wmwDh$VR53%^$4I*W37Uh#tEs<3d|k$jCZeM^qv zbBMxER@%0VytjtG|1SQRrTltY|89&ceO!Z4n*?9&=EsEKa;IMH<0Q?aq?F&R$=y-( z3}-~p`BNwFSk`1IR1wo;G;tk0Gz=6&R}J!j?fi}-p~0B3rConJ#vT{s;F15kk&xw> zi|p*VeDEbpoxb4Nr+o2VX6n1=1Gz(9m!T%e+qO;gw~5DsZ;djhL7kozE8-hFsy zXB1%UTLWoL>|A!T&?P&AvMQS#8;rM+Zd-rf#c4||8I;jn{c_{$Tib+c)$R6` z7ASZOkQt7;1(v6+#)1(3cv2NWM4R6p@K0-fQ6HX|;9Ml5w=Ghu8~5JgE&tp-Ozoj` zo%l;b7m*_buVxc2RO;|`dK6f2!k|m=bMa=JhNla)K zR=$zkcm-(wRaI#05?$fr2|T*Qav6hFrMkQltEd-^uDN$TI^<5pPBu%#sAGqyp_0M1 z*Oh&j;-#?S?}XWGAn*T}@YdGr8Cgl;1V*fy5yg*ED-Qd0?-(}*cU}B3ulCyRq0(Mx zvM8wKrS`ucg@~xZFQWPLDw&IW;J0VBQgfSb-SpNtBM_ff(W#`%hUL)iW_CuiglJa9 zF1I6!xm6yX9K2O+Pfi(V;2Fo}5TzrhlmS~Jq<^tW4sl-ydW z(PiVfZHjQmZU*1q#S+J+TG2S+`vPf6JZ#UqZ*po+oZ6Ax_6TNmIsK~jIqd>MNMHDE zUC{5mnO&@Sowtt`GvVMnpUB;NnUDPZo;bXEn&I>Cp7-7UsI}U2Nwvf>bsnCG1yvmd zX@#|=EVExP$2+OA%PoEpT+R_8KIE5CLD4O5PiI`L{*h=lKM4+O+qEkZxXToZIJQky zzG!q9Z@iKD`0OmXN$Jd439YL#Y!2?6EKOg|%gx<4(;Q*A!yw_p)z@W5gpKOeP8Zp&pUjEv)rb0-XLiN=e+ z@D7k~yAu8VIbR{*oSWpU-)DHR!sgFfnxUs^X3A8egTwV zqgyds#2LUu6Hs7v zA}EBULZRS^r6_w^lDi1xV5vGUuZOk;Is`Ji<Gq%TqY} zRC{fW&p^4HTk^Ty%L-IzD6G8E&AhB>&b83GM!^jZSJygP07`;=;1~pS5~;c(p>L3M zGCqHjS>+uDa=|UmEAQVj+LZ469pujxYyu7p-u-3Arz$<|E9r7#xq5M2d z!)x?BrR&iLOZvL*(A(&|#~rJ(u48H2`umy)GgxfQhII3&J!4Zc!oq zO;N<@#D7=xbbM9r*8(z`|Mjuf2wH&G2AQ?zP<$Lm`8GE07+Yz zFL}Gb#CZ?kIya*=qAAs8!&C65O-d ztlNFUOpWaqtDehJJWuq~8)e}PMq0L|$IpNpp|W)5OWOV~!;}?izQjM}^>9NFaseox z3X|WB>xsKI5bLDe>)#r($xMIic@pMud^sL+UJX483A-=)fnVC8j-uvXc zgK-w^dUYg7ZeA74nMhw4DH}Lq{E5F?KRhR{-dwan&MB|_8~rER{_&G1sEuaac)x(4 zG~7(Y$W~--bW6i;L!C*1wjUc~j`xW4k~=lXS)<-QQ;+$>ei-Ax60=}CpKVgAHRRGR zn`zAMcs;a6Yck#$w zTg>5tCV3zEs~HB~q&_2~{mD)^nE+d6Q!|`U0~sMRx=oLdditd2sbA+1JH;}uT0;+k z7eMZlm=vmF`w}+W%k7uCU)YKzlLm#+4%A1$Xn$$@1?vEzRa^PCfHfW#54)Mrxf(hZ zLq#ADM=*OMGWkfO^I=rEeC=+QU+~7mKpDu4TpsD5Pgou3rBh^NFlm-17|6)Lrh&+< z2j?FL<87EUE;?Q0c+H-XlA%A(i(qjRABKD$_bL z?2En(AWpa%rq7tuCi|wgNHraD4yGq3&Iy*P9OFuh|IKWmJ z_fws}aOZ+kU`pqsRNj8_;xl_$#!}ogGnAb(!fhJ;P6l)H!E_L>jw`FPMf?dY?t>n> zro%cN6d+#^Jh~hsX`yXx-H)|-nae85@z_W<)}~1}v^L9xh4rjj6rs-CL;$-cxOXy= zXt~8vHQyn+I9eonc0$JcjNyaalI$C(Wn$S4%iL3bcaVJS(I2$tp^xwVGOEj9 z-73;^vhv`o;Di_lbABIamb`r+cvAmuNwh>-l3!5|S1Ft9CrLv#I4roS;wm`$#m}0w zLN4^W_dO-i-CL;8x5TlbleHQX|LF^5unVkBWh-CJNc%D+>$QdZEoE~;BpRNI_Bbks zSdV2ddFZQhFGZ;7pJ@H5GjVYy6o05=thwLgcyli)bmH;tgP7KV$;Oe~m5!|t8h^nB zStV?ORf>|b$QV;AslD-IMMAJovhEL_%R*N4eef)PPIYR#zd>w~=dR*5f3C z2RRCSu+fD>n7FF&g!4 z9tI6iw9|;^#OTSEFBR`o9E7erzy4};Co!^;`K2gjZ(z-+<%9VRo0mcG_2?Uvj@7ui zG;+knWcB^hi`}1eWrtOf4F-+^kBWZT{WAFEb9*0`#?lq@BvOl|<)u`$W?&bUItz$` z=MtZ6euE^{&kT$uh`U$Rmz+;h^Lss!sAuTLu?5ufn=ujRKWp?-&}nP1V^f65j_@6SKpWp@^C+3l4GTbP20*NG# z0mu6S^kBQfQZYZgPw0P@2%3f_=K^*H3fT`$uP(0T-kA9WDtGxk(vUInU?>b4zI9Y< ziP*a+!t9n14qNP`{D5sA?c$I-lzjSu^KgzbtQkrES~|~2$!I^A?yV&(5V+`+D8vy( z=Gj&r9T1T$^$KbnZkTHNY$ zuh48(eRE~`Pj7E?*dYFY?NH&{_4zh7wnSREcdg=;1oX~lMReGpr|0-QguDS_j=`ku z)R1j;)Vd60*w~QfQ6$&L(T3@RT20^OHcL1a1&HKEBs3{yyTR>nSm5zdAZE|F1_rc3 zH-myOWCR%k%mUlos$Q+^Y|DId4i0hDBctNC`UgT@VA6=kA7}s_kGCTQHmgx4$?doW zm?{{80nWDnJ&1-6sT26L`Q9E^DOAfa$oK=1<3$ePkoB>`zC^@Mk4*4Ua+Kz7t*KFO zs@dE&f!OFt3zVU?;gE|VIN{*+E+}IuJO7|)W?+i|94T|&NP3S<_y*9g-9HY>&r6g5 z=(t{IP1=kIb&+F4{b+G^({1XI=lqpLsdE#OT2zi9@5zm7!%0C}{0TONYbVad>F|p; zdddkWh!ti0eQK1s-0(c^KAY%k(RsVAL~o_zZrpsEZ`XZ~*$SMr#?CHyxtQMX@}QJ5 zrkd9h6h=rMnQsQa2G`7~hu{+w)d)>;`HX*s0O3uW(sXZY+e_1=9JmA?H&`Ma@R9o< z=)u|2?XW#wFX%Eo|9G#5CW3bYZDF5HX;Mn+?Um@$>Rdfq?h;&@hask_LG(a9A0j`o zmHf=!_0j{czON$K)qIuz7G`>Rp#PPj3OB^@8c!9xMMq8IGg216nc3yL>YXAIl0PUs zZUGjHy%LlGC=1{Ws^E6;?6bL>MiQwSPqfx)jMV(&gJQ!BVD4;%o>L-X3xmS&cbn&f zR}!Wb{x>aw0c50Yc!0c#RJ`eeZ=X;Umk^>YQ3kq>!EB$79bFj=a3m?*Gh2!c@V0Bwl@vQ}1B%62f&nsc-<>?9RP)(lhWC_pj zE*}I!5Pv_T7L!sKMWWK~Zp-+vxD%0kf4}3$duD&6txDsErGAEe6Rsa%H~XuSlZrlB zC&hD>pKS2RKALrrhaoFSac|W&Ye3qolfn#uN>9u z20@w91xVQzl(oIOXEG0%xn8nb2o&&?yL_oEz>}jD6c9GRsZgmh3Uij`VtyT297|`$ zhZ4L+oS?)D{P@mIWRB*R%zlXyMYcs~@m>pz6Ec++LM}qigk@SyxjdP1vLTr1GzkSS zv)rvXO(iS!#3@pjaUAxD8sOyVcVR%%0pnf`^V+NWdM(Exr>V6e6`3ZhE;U4`>16+t zg~%R`=Yjw*Wm~RaUtce?ElRh^wye#XCOq=!g|^Xbi}yJMfYmxBvyf({2_gMLL?8PY zbICYJiMa5DAyU7yy*-<*OeP~Dh(z1l+oREVGMxg^)vc?0yL*%AbiThEns(#x5dd7w z7kj&V-z289VA*^T?vRl7((c%-`U!pOebq=Ye*PI?bg=T z-rnwXWxCj(6XDUL8`Mz*=&8GWWpbyL-D^ zo15!v>nm%kd-M6u_6`snINI-~f*xTRV-QEU(NEAY7nzm`e z>e^c0FXsD;>2%t(0U|8=Zhv=gG9I^W6DjY!kyyLWQrF=G-@#8HYhngLdJb`oCfmXviqOY6qU;zBzr)VFuHx3_nJu#1avJ6T&@Yucvo`<>mLu3Ll< zBGKw}Wo0_001;qsZ?EtB2BD8}Wwth*P6%R*w6(pJ3L668`r4tU!TrU2Z+CChj>h9r z-%}U+{oUR1Xgr#X`q*!8@5IPQ}1~9d;jp<*>l%lfBi4~tAF)JzyHqv{?@mR z+IHUeS2wQ!(4y-m?R0H*1rTD4$vf1$d465$nuO5I=kp^+4$WrM?d_e57cXDFd^Ldv z@2MqCCT<_*i}`FaJ8|;F_V)H*wgqJ2;F1U$)&Zyac*+gEU?LX|{R~ImHgn99!ZXtD z$eOIxQ4Lz`0?;^6iG#R>SORz@9$c`c9$Y}eefq_iW1(8q7vV{5adOy@jyU{hfn=LP zk*dE{a-VGaZjqvuCOJma&ng7qk!-?N2_pqw4P|Y>CIK&ZrlUjkl3Tx5a*b7!W2hF_ z!FO@O!f3Ep)@x*2bPcU>c#?-sESdj6=Sc&9U=n!jBpg+*GB;-5J79cV)vGG0#;kQH z>;Mc4p8ZmelE>+W6zlHi9GvY?}d2 z{q0yG;823K9I#F{6@=B&7+~Jo)H2bj{uWem{Td>0eUQzz#2C%Gdl<=;P7@!cjSD=o zam=VV8nw}ci+3=pfmR51&>@i>#H|eH8rMZCdW*GOVE-?HNZHa7K)`NC@U48nT?(tp zL(S4aH;EyEW?O_w-g#t3vOqlKs7S0s(9gn`(JdKH?qbEV)Dzf0*4Vg*rEX8DD^n;! zziI5|RCwa3pFqMN@I0%hN>UumlBqKqxaf7m&W`G*OdIbgWP@DH7uR2Z{o4BaefQow zGT9c_Bf-kb?C8eE+S;sXnnxZzZ?i3ha4<2N_aB|1c%=r)2Y&?O+j4Iqgdm0i2mwM9 zfS~Upq{l;Ix0o-Q5JpYgbzRIa(t}jx9Dy*sdm<7LP@qT@AV8$_{KBH^=JWZeZAYU~ zs<27Fc$;?tAQ$vCZPQbn?=J#jJ8BZqA%rj*g$BFDoFa|eaR?#(>Tb$(a5@mBMm!P( zgh(;Hg_;POwwW&$`+Iue zswsq~9kqSz=lk;jFdB^zvFmyOY}!DGi}}1;EJ737(DZ#Ipe8giMoeqt5D+lsZkjew zDzKnFsR|KTA^nOVh7dv$S|lLCfDjP6NWgExO@*w8{bCV9 zXxgUh(kor6X-g@PK1Pxkg(@m?Fon8e$mWk~<7#l($_iA{1UdpDV}ga^gyD&D;!LQs zR7lT{q#1A82J;ScFbJLRjzkm*F#VQhdc+{Vyct8tL=YwVV{-7E-brqSDE2W1#I|iy zHo^u3;-pi2Q+j3 zb9#AedOI+$mUCh&GyyR5U6+2SlKMUp0fx||xBO5D7!Z?i5izt)699S$O-M;IAV{wT z0?I*4Ooks21NL2{7zvOl1`I?o#z+VuG^u82G-?xwMWPU}XS(`wM#*Dd60XCpMi)&z$#;}s5)HC%XtpkiRs ztYjz--Wi+(+R>T>4ROvX>(N^q*YOpDf!6c3~ z)&u;GbS}Y)#d6{(Z2iz7h;ZiYnb~Z{&u0Pin!`K^t26aNxcLNtZIPDBk9THC}KIQ;lWKl^R7sLprlp;B6XGX=CwWskz7Qsyfn_#z)qM>%#o240j zRS!vQB#)VyQ2~J8D4SZ7rN_BE%SN;snNLU4*3kPkA3ph}^*otNv!F|w9&;GP+JFGA ziDrld`6(qyY%PA~8}kw=qT_nv6$8l!|c@V#dXs`p|?1T8I?8t`CTa7@=o# zrz9QBZ(>J&^(>^f55;+p0JG_oi2B&4OiKU=Aw-JVHCp5q5$Y5DJ|NF#O(;=6CD4p2 z)|jI)0-!|?0oo7#)R5F%lw1M8w!--m}KUh-r~V zFdmJGAjW>tcOhT^q?q1pg_&yviV*@rjQOYbkkaqkG>Akn-=Aa9__W{e0I><7@A??~ z>{!w=I3NJ_eHS7^UNgs>>C3OlM(RoGhVyPXMIdO}KoJ&;MM`u;qL3ekQ8*yR<80+= zMGgP}f%D?J%zz9gE;82NbSaYW&Zu3{lnrzY@F1sJ*oyPLecvHsXb=F?4}l>fK;)QA zD50zv5L4F62Ymn-*$452Az*+=gaEOJNIfF9Z9sxZy~c6qgis)$bOvI;UM;1dO!C(&JiJm zCLjPc-C~g@w~KvD?>BZa3-w(GL z$FFYfPREm!dW#*U&|yIxWL8w@#5>?NJOv|Q0YRkfc+^qrT90H7#Tyf=#?*~?ch9d3GxO;=D13HlI8=RlaH2>D>fc{unWhE(= zO*MT+%*iVb>+Zl<*E|@$4SqY-jS!tQ2>@cewz-2NXGxN>T)gL~o)b;DM95iU!Q7Te zHKW>9VU;Yxfw7k#q<&nYZ6h?7a4F|TysQ2~boCk(LsBs=38~59a~oa+5}RWl#;k03 zZ=MYB4bIrXa!8p16Cpd%ExWhMjOt+57>oT0#}Aoo1!m$WcRX5)vkPc*R)thucyr)^ z1#^gi7+fmQP{5-Xukhzgd`d}YsxWttv`}5iSN&rtNbHbI6U=e6DYmeV)5iKBE}~>mMg!HQ0lM^V zW~<66vURiN`GgVJ&*I~U;s;U>UJ@f?iywDT3^_V=Geo53fu;}3pZCiOZn@M5Ii{oR z8nYr2JN_X$QTr+nYmoevj4Wi*^^d@q8)jLKoQ%!d{a=)RFvqQBjgZ%%s#~ql*UT}? zi6H&b9so;60)X6I{z@hg%Nc-NlY;D2kfR^qa2@#v#{qRcmsTJYW1qSYL0yu%tN$x-Z&`EF} zlWWP=!}S3q;za;JezZ%pl$0by1PGC$f-6^ADZ$9Gf66AAjodtk`S;vq;zbiA-=-hZ zKDIm?Bp8}s?Z%D=mFUvySwF~}v3N%IFR*ea8AjIWyedTmN)AUmN95l^;sqHf9;8Kc z`ox=QAnFK^5?Z1H(m{UVU1V$pFvemI&Z#Imi3Wlhi~}-_L>!)xmyH=rcF*;41|XYK z=AO|?J9_b^v(fmI5EM8?HCdCa|o88)Fh!+7U`D&c5I+#3!!yLyi z7A?z>%G_xtQI~LzkfKD=cWbEib5##(a}BI`2vUT>yfEq)bOIK*ZJa!}u(6Nc2dJHU zXi7dl>%YskxPcUcNF{GEhp+H07PKsx>NBlBkv>%W$-ic=DEdRuD>HyqM73%FF{o-? ztX>Eurt)F~8{-VE<6iQ-)fK|%GB(CRJys)_^`kM%Z&UEUWB_tm##r87c)?7GF|MKZyOY@9>TV zQEPR z=~W}ny0Sw@lmrDB<TYJP#(T z0x*s!mGDr&5RnjStv3=QB7g=%gqZV@#Igg%n4pxB*T+av!6(+H2)Gi0s@GT#5%k+ zCMGLOFfAnkNC^y)ChMtjw_qve=wDnclI9*{7Y!k}cfxZ2?jUxwJVv5MM`K1)UKI6( zLTO;m-plY%^o5!uGS`XUN$s$nvu-H9m02W4UhB-2LJoo06U%%V%y(2-0r-i{B9jwkL2?s96DQbAn1oXMh=3Hb*CJW}v$zyhrFTOg5|sgj2dgY; zb|WDdqo$eFl|=-A7*R93WF%yE$h2|> z!=!t6U^JvO2!2yO5?3Q+gptin20F}BVfrKX;;IIv_n{$C3WX+7?Aljt(ZmEEw7qB% z08zK~Q8?6XJ5k2v&NcOO`vy zxmXn2NCs0hn{|TZ+|tda4wQ!txgSfe*%jwIDu`epMbzq1b|a3-3<|(2v``9WXznOI z>;VMkT|J7R-ow>n0)bN6j{Zis2MandFH98BD3Pg7)CFv&n8Ra> zAz3uaVXN87_ii`SORPs8Spfhbf^M6+;j~uC;EItrf&8?PAC;NnfdbRQLgFW@oYA_p zk>7YPMi2r9@GUsN;)AWOWgMw0ejrVF6-6 zikPd2!=DF`nkMcGj9}R?-0J_J<hff7wZ=<(XmsF-XcI1E{TbI+OT83H=;1tC zZOlf1B*6oLDy?4Uam+b8Jq5Y`&^49OWK%j+NJPQU_mVuKZ|Nuzi3leyE$n}?XKAJ- zYY1<6ranoW4#x#%s65s(_T8Y~wR%3;Rq>#{0l7b5&T7Pm{*p2;D4>c}1n9NS6_?AC zhTkF1(O*!LRFCJW&5=OWmw==?u0e84m|1k-!wXkOA!`d3yMPNh_m@lGbKwEwtff^; zajJ1G9C;7Rqtpv~;1#Ocv;062Ss!IGXz8Ta@@lbYy+y@DbqwT2Q}vdMUL}QDtZyAm zRVRni8D;~}OO#0Rdjw{>YXA`(_hG78T<{omzRysl(TtlhkqQn8M0uEX1I&nCEn?u&5 z>IrR;d^co2Dge5PEyt*!g&YftCOI=lwj0wKX-{NGgd7;z3bW*z^=V;0Q)EaWQs6w$ z@XBAaO4O9XAQ%Awqr+i-tjV7*Uhlot;xf9A%J|YA9aDVIGZAiya~k$y{`Z zNO|){VUNhn=f5$=2+=5*HD=Kh42U5=MZ`d8yQhL}A*X;{rvWUk>gh(}tHkoL{~tbb zo`oEGQmR~YSYZ<#SoB~?jbe2Xyg03O2UCcYDUQZmGhoK72UW%wQ4((Q|J+on(pehF zL>?6T3_zeWWXmH00F}^E9BADDpF<&~7$Pg8jlF8OD$iLBxXco*?Vx$tnEz$5(6V)3 zVmGK;QRkG0B7#UFZ}cW?EZ+lG3hxtiJ7mxp0aC?8e#Db>7TGzne3ER@MY_n&_FB+b z%B}SAnar{mQ^TC}h_|x}8D^|>uB~Wd2jjs*F2qA)XQBgSZ9qyScyw!)-WJ(!f^P>@ zoukS)bU?JUi8&$iLr(#GMgSlh0WwZu-sO~}m4dE`W)6x5BV}L`wujSGrO=cAaJY&r z10L9R@bUnL z&_YZDZ8=eA4td*M-7BP&yso-=2{O1gOD)O{IC^zz!3`w&it-9oi8qq-sc4eB3Q{cx z1DKHri%Vdh+@GaKCQ*T)xWVfRES>1wne+ccR3$Alt5W~~h*8;a>xO0HEInj-!I-~1 zvdDT#)~Fum0Hz1x9bFUg7vof1kfzabiD;D&-{){-K1^>ew;sC4v7XmnJRl4!0;+N+ z$7No$J;{IB9<8%C0#R^1nX4qMy)xvv(oa+BjZPp2e)&4Gmrz$RS!SA;DZ> z#OI+7*Z@}JLe#<41-m$8S$fO#Hf-+|;Mpw6aPGTW7ao)#_ti9*L3w~ef-3h3QVSEJ z>Ok(I5G?_3<=UFsgy7V?}Xe#k-z2M|f31g2tR zd7xs(=H1j4H+yZdsh9P$c;7s!=R>X|JfWiFQh@wKGu4BOB-)iDygEjbE@}twYwx zQkR5=4AYN%6yXuCpiHSq&YqVUC6aC{`Q@0-99s1u6xo54^d=2dcvQmI*@kQM~lr+!?v5>)_<0V+=O;6}l|rOADhkHZ_h zq#SvjbOR6kCWuH2*=;!BC&N7{Kk5bSclIZ_Ppg=<`592avZzXC4XmH>w|cC?>RteV z@~J1kWlGGtnZu-L=)n*Zj@l>aFj0+yh8bqX0dW0Trb300^^oOb6Fq4DwFg;c0Cp%k z08d9&O6S543dgg5AP>aijgVCxq&CP{O+ge|9pHXcT1EzX)zHY|V~Av~%5@jm*+gd} zJh`TkK&yWcV90{1E!P2OWH8UbPM!f~A8cTI&_*<7D3)GK@L=$<(9tDJPbfZm&u$-9 zQY0=^&2>DOQmR^&T{5-eg^{?YjA;3)33|&ILJ`LV?hHw+hWT!taXS~ua?7|{x;JgW z#;9DaTXUn_nj$RcDy6S{InyiFS)i^KcMpQOr5OhRkR1>DbAqT<$pWZATx{w5O8%D% z^Ozwi*l-+z0pOwz!ZafFuHLNx=u*6>)IRXgMNw52G!#dBNhl8M1I^+CXti_)1HTpvreAa@qEOKuIZv$&nz2k+5Rjz*#UN4uGWwa1RPmPpqJjKjX8Z% z%{W2<{w3tOFPO*i!YC4+A_1jq$%?|ZwSxR@%p)D_gcH%V|pT-rQWbx-isB#*ATr zG|SK5d(d$srW` z9weL&I)-wgd$5lkjy{(hq%$@oM_sztcUA)&JQ`WedAtW5ylOG6e8QvFszK{18(=ku zQjnlYUjR1+Sl0H~E6M}kcVMOi%k~G*JKO?gH*gZlIJLZ!8& zoPk|ha1z1kKj)@U0*&HQvUBb_luw%gPihtc4xyQCd+@QO?t?iTsOr6zoebI=9W+;V z{2~))yBPTFkqN-T;K2tX07UtH(g7x`&Uqy&qaV02Q4Llf)q7ip9KW6zc+U;*LbKHw zbhpV$GM!|PV9bZrt(qe#NH7yYg3)9f0C$_$SdKgZkY9?+op{0oYBU~j!6tbDNOVBV zqwWxzyG)LN{e#smmq)fAvpXB`Q$tUUq~F*k`K1QuzIZQ%zh}7>2@75w*^w+S)-j-& zVq%)y?eZD|-7`_LQ17&le2VgL`)c701%(x+fqhkW?NaQP*nvk9qi9Pm_eA8^(Rguq zp`#%|Zy?z_eUygBQZ;^hcqKcvsd6QA*XPN z7y_k8fmCE55f5-gBKEB2GVH0)HFrhL*=+K>B6IGRc^2z<*M#`lU?*L2aufI#aCFlx z!ZY_W+Zx*yF-qz_p^G(lHF->{SN^FY*=0Z(&2PJi%g|SYC1F{dbBLmcMRb1*Wu?sa zAm$Mb@1S4p2&zF@x-y9dI&8&DMIf+(IpD5cLGjiC>zF}6p|EIK+2*I?#J*VwF4!;v zbWo57t`sB%T?5PAuN3Axw@@^78VPhpDcP!Zs)s~JGvM6hJ)r3aBw}tsfBWxdP zg9u_xW}=-avkh9o5P&6GZ&IHpgC_>OW+aJWalTgX;vi&??aaL7$#z24N2Ke8$*`N^ z-CvF6T>J#;acmD_+c_thmnfZ>sPs|Vy^L7lzZp~jPgJh% zu*~2CV}%>hs;Vm1P+YEC&`Sw+wk0Zu@*)J|s?)U^-1zq`^FPF8uA(p^0~nykAY*n_ z*4ogxz3V8kuzGvu^kNB z8x&nqHCaPIt#eEa3qT$aOCg~`0gPhq%?=?X^5j=;Q~E!~giYRU4D zYStw!%Z>!ujw3S*MG474-P+~4^Csmjwi6qZ_-<_!1HDviRO1(64}nR4YqxFN5&=;}Y>0?rKQyeNs0>G33ln4~ zgfTIN_xJt{%ghaV@{G}wBOOgVZU`e|HUYr(W^~01ei@<~>hK!n8^w_-ahL65*Q2pN zM*ci7r@WH!_KzgWE$ZdmJF}BQFw9k8BG-}@BXGg9!Thw3ZI-z_X)|cs>VM?XTJsq6 z0992W5cvfUWE}>3s$s(*Kk)|>uJ`blrA|laGXlY~h3(dR481g<@nUmMkDYe=yUcUq zFf>fXVKFv$M)m_$66NPbtenaqqCQyH4Ze!B&>6@<{#pi1Dm`G|h9tlEO)CmgVE5!Y ze_!~6Y=Ktk(MZOy09NujxKbKrc}VG>B0koSRGl+)s#hxD(qc%N#Y?BGO68MY+NCOF zjs{d(0N<*oiRiECG%L>4#|Ts#-zjJKy=cCp8vl%kcVm>EbqQ6OABpWH93a<+>)Y#9 z6)>@C92{@q0OWz3bGav|VxGbIt2!~)OA^hz)+De34LsahkzYz$6otiTEYX;c)lQGq z;wQO<8iFdl*9yWSY*n?-rbA{<5M8$plRXbhqc7PMCDYF`UkeBU2GaK=Uq(d^hoX+PJo!U*M9{Hl#xvilqmBgG6Nu0yo~-$tE7L z9EY9$aLGV#d%RqYNYo9 zWDO3cKO(RjPAn=C=F(g-rWchn-r!U-1;4UUi)gVBs}JUwgP{jbEd-ZJ&iAJO)NB$h z@^%;-A?k28A3=s7R1qY^vsFy;ceu35eKo2pkDnvc!@7a?MzZQEfI=YeKw!G9lOwZ9 zu1VO+nYpv1X>QrJl0<{lgJ>Nky39@1M&zhIOJ z9gI716-`cms~{-NZB?h8x?-ddW3Q8c&b^Dolx%Pxc{+(lH4^0+^<3LWig?Uyo&sIU zUG-3uF>fmAlxiLcm&pp77!stzTx7+@Y$aAkj59#uM`>(*M-V{m`Mny z+gLfEkQjT(0TvBlFzOK)-@;`VqzhadZ5zP0AW%dQxz_^XjRNVeLD6d_K?oAE%1v@E zaPt#XVniN}Wg+Ev9t21RGN>)^W%ilT8G^dwtcv`$mD;;|4W{ypUZ__s_91V!9vwvi z99b$X_{s;>**8$u2mpn$Yxw?a;A%O=8zK^#vqpR_)z1zDKA(W??T@&Mr7dr{f3EIDGE znYv&HJEf~R@UXtn)_|8bn>`v?1QJaqA}Rs!~pUlSK8>4L?w$=0$%g_6u7a<7vurw{Ed?uF=_)lP;f z<@(wJ!R#hUck(P9x|tu)tmV3Fwu`N#hTG?1htxjHz%ef>CJ8Zv6Vi&mvTFFt{0Iwh zXrN%COZQ<{$(@2p4;kvp08hgtzrL|QOe01-G@R4vT=tbo!|c!14xNw(P1A8f0FF=I z@ic~C(uH!%AU3$qB!6>Tmo+ng3wQ0>5W|UH2^B_>TCSt__^xl=TN>_tlWIV>Z8w%)5z>52ZR+jk`E zs)J*d(!5}3kDFy+YU&yXGr#f(PIafyt7uw`P#?bDMWTGla$@N5aw4i9 z;R0|?)Jl{PKe07}5c?$aoVaD#IS3B$Fnv~P&~+!%WzQ9dA;T+xJnvR^ozb7lKm?6< zFIy|i1!DNzPn9`wv<)A=42twaoi-fkwj7ujB}?l{)Oy^qEnhkq)~kWZ>dVr@1X3A1 z$^~<7S3G=C4mdzuR(0<4TC|&}<=}>*1+1_YXxBXtw4Be_4zAq%}Mf!VKMwq>3|?Kv{Y$YgWe(_NLl=kT;AgE2-=G`CaA94S49rf&$~G z?dc`0>!w+K3{GOz;_)A>q*ypljk=bu47HDem)#z4)BwM%69SuBci`;%U=6CRxef&U z0A{h}HOD52{Fq3?fhdTL8#3A24Q1tfTb64}-gD&)Bm!9}A@33A$bgSz zdvj~CSgfwDzVaJh@rF0N@tM!Mb2gi8@9ccy;~)Qn-~YqUeCD$kFJ2tCqv^`59gT>n z>pEm1Duh};K%h~eEU(S%P^L-RCY(#92K=-!r;G@sH;sTm-+qweHQuBuGwu>Jph{h; zdk9!eshL|G6Vne~d$_~FEtyO)8n+7K?Th?Ano}t4b0=u%GO=JD-%xE6F8aW_Di;@9 zu$RFdmQ!`ZDHF&7H6eUcEQb6DbQZ!=SFUe*7Ug7~i`lJONR?l5G05OFI$h$8l z95cbYoG2D3cB{&fAhm=EIsn*GOko$xN$gm#O19OUat(~5EG0o8+4r9mFwc`>ogqIHXXb97RqxZ$tzY=3)zVpwq`${lAZT( z?ZD1jzO@^_cy$1x@-$wmt{dQ7uE{Rv)`|^AfDS0^I~hpQHoUnkqnoC@8^IVdl$aLs zrHL!lw5%~0lxQGDiuSDNKLF+@pV2fYtzq(HB*E}clXDjYh!KiXz5FTquLE5wh}bQ4 z6y>1mX7NSFAt;z-SB!RY%?@OC5M<$(VHC~SP-To#8Wxc)>pbkNiU7X}{H3yZhEgGFRv@xMY1>9hlf#|7s3dLPB zF;yEB3vujw`5Li%lc;>H3`DlQc}0M9<^GEKp>D6q;6p`l9^S;^W#1?f-4f&bst#E{ z8+GD0i|H1%4rG=$Lx}36UDi_iSADO2>sil!-Rr*jn_u@WAN%M>-t*q~fBX|4KYRA<<;#03 zE7QqjY6_6Sy!zIWYba&2W`CWXG+Oy;-doKdAlnh!)d0>XLabeKs1b8)PJjRr2rzKy zjixV7k#JbyKv;!sjc)*}m}05~VV{9A_o$0O<0I|773x=i09_?JsT3ApI90A+(7GZ8 zEu)laMZW~=lyYf4)IwxEeEWfzV>+=alpfC!Tgj|OP7oRYJiNVI7!e8T+dWNgVqC1; zqY7ZeP157AZF+xLTv7e^XWYHYnaG0VA|F_ep8YP5KBU*i#TES#mi&km>;2h<0Dvs^O+JomSVj6nB?x5x z^8_p9x}jdREHFq2Dn{ZC647R)f>7E9j*fJ08ly#`38fceYy9jp%Qi!*v>daFFY=ze(tg%CUW#go)v$sE|Q z&U6~NDSy>yUWWz4OnsGTjuc`7hfL`AFg!Ps>;P0{C9*DGz?ca^=Nf9V`2>p??Jr;F zF6|xOMtJcxV9$AUG;pZy-T<+pZ@J{V7Q9rjLiVJ0ef)@LeY-!%cUQQ3CemzSF(w+* zMEi$Z<@|Q#nZ#r8ntUm7^^>R`9;~^Q2x)V}GEK-1YH-LR8d;WUGTnp4)8TfuF{`wy zDwcCDR9;&bhDNeIEsr#FgMr&pu16zG&fP3=;Rg)A>>OVxZm%)?nw=~m#NLX=i7X!h zoSuMvi?$H3tdjDpKZ*yeh))`i%?MIy`#{W89m1z3=)ZbxTBi61b~7}Lc_66*64T^b z?etf}l!xsBl51G21D*p$9D+IL78B%E!)o)oihg*Y<(G1VOPtbLTF{FXD+6FB z*_ITehV4?AA?yM!<=20-_MYxNVxyL?R&Sx<1OgcugPyY?FnU_&Ns}9Pemli+Ch| zZ$J!f0|0&30|Eww2n5k+f<_@+8qLuil~1fmAVS2cWXTDE1b9Q*TI}ei%q-UPFQTp3 z_uiPu+-nLmWW4l`fDmz5Mxbv<$mA#7)7m_irR2E{`2;4=vuwFovhZ=lEU-RQ1~-`8 z)InqxMAni_3>Yy2@b6O+MWx(`k^^Gda^fT_*MD)Esi39Kh8m7VWvPHuO#xULcdFPW{4sN1bMmgpWOc6s?UZL7>ra_U=1bGj_Sh|yr1$SNZnMb{rxNmWh z93iNOH6<;~IYA*HjtrPh59@g&kRPjLQYBh8rTf~OX;=2>2ob&|6O4@bb#D?m7$tJ< z(8)B9lJ}J`H?!GvFw-E$WWb5vRszx%Gr#$W4rq1SY&KM8ar{GX>?e0wa;MKS4 zRz4OP4R+N~9bR|!6oN?rY70I=V57MbWg&|cL*BH`caQ-pw_nY|Qa#}MN>NU;p=*W_ zyasJ&sw0FrIm6aTroHLcZ8Vjtsk;Zpu0;2I<+QnOM=^PB>6NpNlA}(V>h>tm_d>#$ zjD)f*wUW!7AlPaw+5TrU*BZW(0YNdcXu->1gP6wYXxc$+G+RanO_SJHAO!6T*z8kq zhMq7!0$^~Pt66M?PeJ#sKD<^BcuLaI8N10$h)XDG#jX6S?-(%;=cpjj6=;#HR1r)o zI|csmfe(PKN7tV%a=Ohimb+K-wxa$H%rv-=Yt`t6h>Fm(Tc8jx?nM!@${ZI^V9%Hq zE@eYQO^E%TNJFg5MlzUSmNnm}T4Zn>3P4?)=55=I>sscpMAPQwW=B!h!FYwL7%0m| zEVyPLZO$kM>LMyGyxyw5F_FgBDm71ZkX_=7g_BR2>SU_zSpo?ttFgW=&$vEDb#x^@ z;zpn-4I4T<+?aY|^%icKnK`CH&P9D#F@;HEv21J9q$O!!=vHQW2<5X%JoPx_h9-lDvz?rI(q{nqleZTOsUW&Wb$5I+wD105@a|i+IpAD6K!0j4H3MARKFmFOlU^RsKE^dsBv(?<2tr3$g|`r zRjV>ilF;vUD4m0U>^P;|BZ>Jzj4`bxtCnUK!IJ^3DZ+amOj`TtASiIf6vS7`IlMLO z83NZ~5s=g@=V-x?qdl?jl9TFWOdkkP&oDo4Xc}Nm-4F-p&ye|4XkalS>l!+5IMlwJ zRML@ndIlwI_bCC;%xHB~N>~!Y%xXh*sU9o}lNdNf?z$Eo_|z+jTPWtd1QUW%@Or5z zwJkZ+e1{X@0h}c0IN+mvN2W)Cb5BS4lYIr#CBzjCh7UE$!aTin2*5n> zM&;f43!3|eL}q&{Zj`yzf??OBjsq&IJsRb8~511v9}2 zv^VVwG2Orj(N>&xM%4KNugG!&imP3M?jJPiP(87oOkDH6ZFhJWb z9T9K|d&}f?aP(ukT&jCnAM9Ekmpz3jw-{sl>P3zkKDu!5YdDGtAI@-DBF!5vQcWyR z@KEROa}_se_o}O2KUIX)2urNm-ckXIdvA-$(W5mJA`_;gZ;<=cUn?RaY?`j`rnAZO zp8LE9AA0oXe*R~_a@XnI-8}$UUtgOXo~9J-Y-MF-b#;Gd_tT&H^cTMHg_YU#mRoN9 zr~mY)pa0zF%~n>nw=cBqC>M#CQZc)Q2X1-@01S;p8kxdJ^dL^haT>}=bkTr z`787Jd^8&Mu}@kOAV6@1p_m_hPfr2`h*3j41OSMU5RqJND+I)p?rPi7Vlh8)^5jqa z*pGeulb?9^d)^BGTU%RA+pMmwr^h1@F`8FJ1O$Kp?is1!7{HW&a;*kt3^X~&<#v;c zOtSPOrDAskiznR7S6(-zjgCBs@c<@4*}iUC)&{0XQl9>IjZJ(-@?@1(@N;gb0%T=P z()Ais8i_G$A``iYlBOtIo6y9J#k<>+%|HfE#CP_NSC1Dj<6**|JIj?B0fnROke&n$V}(d1Aq@Aw!HGnCa7i9RMO z#Mo1RwISPadib^6tBH-ByJRu@>L0&8PtMFJKN|L=|N2 ztdF#HB}NG}xo+H9YHx@IL427vv=_+s&myiokL_2mz+GXzLElAa~fF_5AON~*h( zGnnb|k}2sZ=~1*9N@0{^NktX8tF=!l?==i-N|)m|D$N#LR>i40KS5EiW2xZYbjU#k zSgX|yD~B;Y%JrI8CiIUK)bv9_uPBe7rykx z#eR2W<46cV5xT`30TD6A7!b$P$#gb_fEONn?8{&I(!&ow+>FPIu5a2F0CPek07UEX zR3b6vhdGEaAnfh!tBL(N7Lza{EpxK-GBRUesObib2^*FNTcy6 zp;fJiaNK_OryqA0tTrck<^ zE)lyk;~FN)gNo@g6IVU#2TqO4iLTb`+S9<8MuAO6OG!#}AsdnFj0(0&50NyTV|B&7 zLBjlNKOD*%haf|mu>d3tluQO9|H`r^SI~qw=|<(Ahc%;#GpvFI;ca*~uK1xemP4il z6TrNssD^%(WD{~SUOfYQN?9%p?WRkz7GW|o*1&+Y6<6Z&8|DK5+(VE`^d91 z&>`t`dA7)YDXDSkG~Gn9Ev=X(o^c)WM@$j0SuAD66yKvxsG`)Mvdp+i;Yyo&ZXLh6 z!N*A{WksibKvJ%k;j11P>_@LT{4ZAqko1Xc%MKRR5D3hgO&V23QZLz=HPsETB8o;f z!66K2C}F!a`p)W&nN>u?Ri;TMxFWdTnl#nY)+eKi$3w43#&(RRuS|j!jHH?52B%}o z6tRvmSUL*3Y$(=XEOys7Ga+aQ@IzvCZZL}BN0-1#&`^@edt8W9RG}%4-bjYMmFq~I z7WWwBqD!^p2r&Qv^u6kPxq5%xhsp3cff?8dqv+!-kx&DZalt{x zb#Q&}!74CNC1c_ML!<)O5FnW`ucbDFp-Rc?We~nNCIqDnW6aj{Tj_oF~et?V|Rpic)53dFyt7@Wa4y$?7XThX- z3m{8JlC#2FVFhl3OItEN=8icn7XbpUuB{$kU*CisBAU;;fFU3f*Od@r*L46enM_tz zS65b7Cevvbdji4`fXiajo>N)g0wC^^2rz{CVzF4v|H60wl^^?wAOF4I|GnS-t>0Kb zyz$02zVQct@CR2{5B-B5`H_{?^+?@gk3QOWa{vGchmIbbO(*?g5ikJKh4YUs=6mVV z`r#u@+brgb?JE}m!}|K+G}zYW=3>5g_{i}{{gum?*AA_1ZEr!>x1;G7Klj(? zx%bR`zS!U0|J#4-P50b)|8M^K+W>GjneEQ^*4Ea?<8dN>YipAt%~n?05Mm@(^~dw> zrqHfGGAb76#DBcblG%5+Gw8jxi$le1-ERo`9(W3BT_oR$%dUa}ec({VcyEi3;)&SI ztb~X!8TUQ}<03LgACqBO6E92J2mk<^5QwPj7L&=u5J}8qk`#(<*=3DoO0lq9>grcA zkpq~rf0TKY)>ZIV&MJz}HG)+UImvLSp#sobVp*X9%p+RmvS27HIZLsym#?rlAR``= zeiv1Rf#Dq*AV=h7%tOv|qzUt^%f$1%k%&@r3nT`WuIj!fa-Sk)vr#RB*vS{k_}!UY zI|h8kMhBJCG`+h3CVxoCn(ihy{cb5sHhJQe$%2U)&~s(BmCOaXlMRRffTBs083Bor z*=caIE#69A!(pGAMgUj3>)}(rvbxwAFXLM_4&kPD-U^b$5i11Xde$@zg^db?i?wDz z;;otl6})pJBNy@p5t>F&@Qm!&OP$USUS#(|3bpeBD8?t)XBLNsX!x=aj zj8(XPQxV*pfbvm5iSi(pt&jI3@ULnb`}QKuo`Q)YMmO(K4HXJ1S*bOC5SO8SC%rJ$ zUPfbC4k%p7v=~%Qf+Es%g`$_qnWg8`wb-A%fJm5ZmI_kwGumEQdQ2*&T)YxoZQ+>0 znL&*_Hjex9GQ{4r*>On)GL|4)u_-SNQ)#^tp8RL}-Hqv}a-7W_h zdHV(t)UF0XXI^0sHV{p=^qRM+8BbvR4C_T@v(g8OAT_NRbJA{9mSRMPzxdPfx^7IU1e4)53{1K znJQ6xGNj~P>mAjH%KF~el>aRKM}BWdvHTb`%z|+=HUG>484BI>3~(eaXQ}U!h`PRF z`7%z6_@!KyY6OrciO@JSOSm0f1AwBD-ysuI@2PK^&_~#xFJkO-q8K0&VR|el3z`71 z@B6Onx_L)^E@H{*?Wne@-uHj` z%U`+v)X77K5AW>mQ0%|y8(;g{SAXMZ(tP<#U;eGPzkO$GcWr%be{XMhcl#S&`3cGRf zb$}eYUE@CF+UDgQ%Cvf`zZNm%1B2o+XskQ?n%YVU(!s56A>G*ePU6*U`GJmT*6W}nvBg2x3W2q=^UqHv-oIJ!|cC}9Es zQhr*nV9f1#RV175?#-=egqE`J9%(BrF#|HTW<@s>W}^>dZ8as*p-S8eW4T5615Fg; z2XPU}K|N%0tWfCyO6(&u(m17#P?~1bW2MyvXsOahoz%9#2%GFxJvT^FIS-y~cgl_- zp_LX?r++zGSYlfBLB$7g^tG!@9|vLu0^p2~!$u1Le7D)@(A5i>jtrD#J+n(F&xN-h zS7K)$?Xeng&_QNuOCI&Qen5YLJyFTOyVpI~WiJfFfIyV_ULadVB^W^pUCR_e=O|JP z82YZCjN7(tuUxsZSS<4MM8mOKqCqm@36PdKU|-xmK!ZxnV%{*}l5P}tB|Rf+nT^(K z!mn{K;3)#g<0<^FH5mIaLUJv`!HPLt@Lpid@V&(ayFx5!KcE}qGfLa{V|^`$#40{I zsYd6l1Oj9j=Er4?o56!34n{d2@eI~N9MH*dx2mgyVyG5B_E3l*NRKR;l$qJn8tyqo zi28y68BoRP1Y7jN5950JD$ke}v}qNd4EGw`V2(aWhDZLb21>g}L#j*#>Y9C|A-)SD zuQ_c?Rn%+75=8{tI~B;!pDRPjWF1g*l2`sVozG9^FQeCWT@h)wDh@b`8^5aJIM)pV zR67!2zM8n@8bg>pv9Hc3>)gFf7vx<6DjHk^a(zw}%3KxqTTXRxhELUFq5Q(dK{K5p zZQ0~V_S^;9z|obcH36V~Z;KhzD_;JJovrPio!#^2AO4wt z{?Bf@=@tSYir@3s{@R=WkN^GNyY7j7_ZMFO`d5A9YkvGkf9%5fO9Aow|IQEm$Upeu zv**stcjn*mm%i=AFM9D$|I@dOMx!79u^;>VXFl_ex4&aF8qfFlzx~_3#t-rm|deE9HB{`imY?eG8Uul{Q62|^2fmxPHTr;K)H zULu=}TgjR~gb@H`QJVHUMej*<&nS$`qMF3GnP8_2_K@&_Y!i9HIbY+7i|i zHn>0Gc4zFq&Ep9+%>y+qRzb=78N!TC*qJur#UO=DO!Oo+eHkzECigJx#$;0y!zhuTRIl4^%0i@bcCQU$e7uU(d!0cy)WSgh7P7I(TC zH>+L*00}U~<`2-pn8R%Xikf__i8R!LMT zSMxKxGVzq+feqEeIXy~0h$v-6+4ltu1kiQ;@#7mY#;wh*@puxUmt6pqC>XVW{{NCk zR)IIap{gLq3O$`zz|FjxdG_O3zSTV}Vlo~<_PE^~rq~kMxb?Xf;@H9vQBItcixS^J z0O^JPX~d;2I!iMTEYo5ljM8^=iHngiD$W}XBj86NbM=LJGKhn}R4Z=h!A5L$AW>Gg zi)(TRX;>^OCIcDjO*nu7QuPe*(o;&!$qikxSmLNCOe~FDk@&bS_@fSB5ZZnvKh3I;w<{1(N97N`)`MKm=}I zK9+Zlgd$thKA7C`hXWu62*@c_bP8n6hsyd3TYG|XF5`S>azD0rCWBO>id%6q-`(sWn}6dse?9i_Pk;KS@44s9Y}$VE;~#zXt6uf?-+cSs_k87b-~5d? z-E{L?e&#I?JowOTWus+mrEl?FaB zcf0|^_qkpD0yd1NV`40w28GaEHJT zIwfX>&yeV^IvG?^^8}Oj;dCMR_SQ&>4oNg>7?Nt$^vggqHi=lwQvqbImg=nB$Z#BM z_+L#Z2xdmCt%<$I$QU!kYm!`AOGQ7GIYeX&5R+mmvwaLiCFOTnzc@*u&H+o<7OjC5 zgA20!5EkkON9WtiYi1lOj7M%J4|cWi?MxFtrchXiru)qfGXdL3w9i8r%aY*H=3)Vm z5Cc)ZnVZKLdx}Sn9GXrh7cO1y`-lN)(OW3W;|kdFD}rQ{W%$oO!L3r%pt6vR_shj8 zog#OIMMk0%<`=(xx9Crle#2W8)K|;E!jA$Viv`Dl>jyz(k-H!m&(aLj+35jvU9+`mxpWo|?q*rhCXp<5hHe`4>TrOv z6ueiTscvd~Yx%?Sk4G>C?d9#R=vN=02Kx}79Ifar#T4Ed6(Nv#&tyzJGlHI+>dIjw z20-XzL~Pr3)P((j0g-bhl&Um{qeY4_#uzamB2rJWj}#+CiWGe|TODp%;)Vb~=>`0R z2(y*hSHAq^H^2EOzw^7k^Ny!J^*PUd?i=6uhVS{?-}^8B#m~O$5B})Rr$6Jwb;ln( zd-m&J{&myIS|r-t-u|Z7e#^i8gPU|A7y^_m}_uFRvdyyt1;oxpno*<*SQs9rv2t;VxHpV`f zw5g~;UjIw+d459JXYSKl2oQimeip*TCkjnk-zb$)@^s-qsgh zqu^j0hgiDPwe(o(D#`t^r&Zi}DaB-)z6S5ER!C%qzh+b>Dq%exI#n5Df@I31C8nWy z%?n>efb6KTEB<(ZkPDg!-2&aY==5HFs!Y@GK5?K0klakZy^wwpMh zcAPio=`t(ZjjnUmNTiRaw*R=!N!-B;R};SL$?lar2(%%nYUEUbW$ZX zEdDA-mI`AG14YJZMkZMCuxGGs&5WIhOJK;m*R4`kjQqt2%s*s*9JT^iQffv!_l z09PNJhQNS_*Vm`B>7`4TwzqbGH!@Ptlw{-}&CS%ZJ(Oar)IUKd-5CtB0}%US=1>cb zGRI;T`SC)t$>Bp`5?Kh>$W1MXNYM(*ih}^w1D^C0S}@p`o1!G*Vq)YrVTapVB{p+j zWDaaiHiN%p#5JsS_vqWqkR2&MLjszJ6XnhK7)3e|fxRndBi7#=HT%-MgOnew$y^$z zt=kW-@`Il{$|AFlNSbFwApj)eN-8lw6>QOm*JK?;^359jWF;vPcF86=pG(UT>p|33 ziOdOmQ_&^+CZkVwK)s*6M{-LJ!bIa_HAcV*B;?mjajF<}cP38}50x#^OuFa^OOF5Y z)TqY+Hw%ha)iy((ZcUZy1$|{qYDHC`;Qg>HN`kP)t(;m{zDAomkRhH#Nr_u{v#`LI z+=5)hnHPW7eduQ?5&<6CS*r=X?=;z&;^r^Rc6oW)}PiBEj& z)1Uk7@uM53PM&(nOJDlG{m>8p$PfMSCqMS_we@uj@cO^_&98p#H?FR)?(NMN-QwQU z_Z~ZW;?Vk`uiSlldw2KLsV8*QZ(q6k&fot%0622=x)53jI2w<}(@DFxH)=NN^5-A?@Z#?;Zh7*p z$3A)8bDs08Pk;8)=gyuTkH=_Yl5!>;r@&67^zp^yV)ZO+X?jcb!DcHIfrkX9Rdy0sYlp3?gg>m(@h51wkr92Rh!DwL=W!7}|=B1LgJ$MjGxod8tOh6HoIzyYPW zJTHF6ckP291hPM)G1&hBK2+AkX5)L%E~?(ECrC?%G^&tl<~&b@+x8zMO=!f8{*0Hv zfrJ*SpsWdPp6+~dKnm7JGf&`~RUwjT|6Y7fSuuLaFsK!txY zBiZLimq8Xwgt1*`ybP9#f9k=&$ygk7Y90))BDB2Kt)uZ=IHS?pHDpad6PxE4vk9Rc zjS$1;)y;0vt*@N3Tm2)TRE z#|-2JH85N`HoCXxFpD*HJTd5@oXo%eq}sFDF<=fkGDCLjRNQ^-gN!|0@1@7gQ}l^cKfQFlp)2}93`LPD+G`>z)O|Z zCi1cBTtLm_*Jx=6w)1LI01Un(me*@o(1k7Wx5B~7w!Q+tTi8J9hEnWelMSArb)*VMs6OCwXlL(PFW0ddjIV~owH z?fb6p7ON|(U-`;c?!M=qJD>T?oz2blBkLdj;D@emUYX5SBIPYFlM~6}3@E7>ey%~0 zBqLx1%5OVCwMNdXI$iJ(bCCA%w4~ljIExX0_qK>@Qdk)>E9oDz9l_|Xdpb0T;kGDV z{kM1Tn%ecYuf617fXFo@z@DAI$iqxaLPKt!um(epibtciX`1Ff^nWEyLFECf;k*>T(g9LsG#J83&SCUcq2CHB~_@b9t0pS zF1A2agjfUg=ZMl1r6PBWp>&Izj{^Ww?Dj2P2+u6OQSxvAajfP-Fgf3?6 zc;+uGE2W1`zUIS^fyG}CA6%Ivk)^pLG5@RX3jqLw1y;T8G$BB8^5R@0M2eAic6TDc z%Iaz}YWDZ%F#=*h)wamRivw^M?@RftbJaP^V1>XheYMjGZ2tq&vOw%|E2L7& z;^5nZGg|=^%nycO-dGmj&s#d80{Ld2ZBYoa^r`+^;Z`Xhc?D@4CyE2=8(>H$8mCeof|MB~Q00VaOPJ|-N zTLA{H4kv)NY3KWU0Y~5cm%r;9UiGRzb|3!8M|O91?tJE*uY3LL9(m;92OfUpi(mL+ zzdyhENjLxIZ@vuxjvc-3n_l-#*Bw9p;g5adeeeHY-}rP#{dg;CIdCwdF!e6-U)?4qn=l+j<^kaY!n$Y)s z6*U*SEwDj(YE6}vAdz^XQY{|e;iAlv9xeuSZn5~lw^IEXMVS?cy|2z(*&zoke28q@ z4b@jHW!LD+BoO5W0)l{{>*CcbS4N{z;wchs@9ZK$)3!-h*|;30h~et|4AnCT3kJd+ z!5n4~7ym1@rg_b;-9@$7gM4}DuIk9K2mw%(^c5t8r0M*@v)cax7vImExjR z8h4SGL&j}o4lzf5WgZ+nhFmhIJSCzP?DE9!i;Xksf(_9jMPA{j9kBeSI|w0Q2mpj3%;$^s z)wQNnLjG7g)Ikkb_u^u%TBue#mL3WL`2h$|n+XCkjG<|7f1{pF$rzHbW&2QlG@F`Y zpN96V6y8>gqI1J6Xm8*(L0-;*V4K+cQ__m;nW|n`U$n$zA`asa7H|I`GJGH83eA*N zVccM2FlJFXSz_f!drR_z?#(rtT&#yH=LV{o;*+)dN+YbATkv6WfgffE3)q?ha6NlM z1@HC!QnqdW9S9PjAxE%IzDry1C0+3HRY{NLr>%g%B$JKW>y`||K1y=csG(gdT8(1A zqmbu8T8b<42)wOQHqE5SG&6h^uF1-CIdYJ4iq2J8B_H}d8xd{F0I8Wfq%~s5of^n+ z1t3&49-x&UX2I&UkMhA_ocl1y1mA;L$QMv_VCaTSCZ|knOyTeGJSrzSpPw%`1%FMsKaE30eWqSF)?vB%2&2mX-Kr+J|Y+oi>nIXZ3{89N_|cWw3;_1` z_wT>|{_p&*Z~u3{_-}sYzy3d;`Rr%MaK|>Ctjepfwk{~wh$xsxY=h~|r~@AaqQ5d%b8 zbe(ugHuTga7$2=X)o@%Kb{c$&nrtNMrJ!A+hLHe9{#3U=z~c!Ac6ja3kRdA+)Ty*? zqGY#pA=Rk*$f=c{VkmmbOh_OTF3#EvsVX^eFqrd*_F-oH2~7hM|Di zdO_E*xv_krh~z)#u+kQs??Ar`FEX7KN5zu&V5eglb3int^K#8Sk8b*>qM`d%YPt2i zikGe=&a_=ZideN?;h!cEL^7f)XUz6HINt>)DRwnXTlbDY#Q-JEDBa{+GJTBNSl(e2 zu@2Cz!%j~-mMnPLGuY@DjuY~{dzB_AE*R4;)mXk*axF!6r9fuNE$~u7YHonm*_qRZ zDx<}2%Z?oBOAarwgWK2DR_1OTZpdQe7%uIfXLU^;s0n@7uTED0jdau*qhK^r+JSd6 z^t`y&J=7+xM5!hS2<45~2w*Co^QEk+r5%FV&9P)Sb3vEy5@&%bHFd&{W>yKO<@OhF z?ZU(W6v(4aj(Or&Ih5~Q)I7U=6^mFQ$`c)^=Vg&&AeVGpNu=k#SWneSvN^cDG6P+viX!z80H9zD0P+uZIf!TeSZ#TB zBovhQ#Sp2~k_rr=uqc$PWw1~oI3pJ_MVjUE50{aW8!%+_;f`~itTBy{UlS9E($f;A z0K_$}jYvKtBHERY@MZLcVzjt~{0xHp$2mDNW*c;hLy(avOGVixnKlHZ#1XMb)aDTp z?CWWk%mt_fE!Q9ukX4H(Hap+io$xDCq?7c96azvi7u5`$=P^iF&}rS09h!>o9vh7^ zm=+B5gKy2qMNb1hFdHl5XU_96Peo^KMUHZyD(BYqSy)N6^qnfIRS1ZE-;XDg(RlPL z|Ls?v^ZaN3zz_VuKl!PDa{j`FqZ>zK=({cw5fY6?Z3uY&u}5!z%2WT|5B|`Z2hRSF z-~Jz=X-1>bVlhX30W1nCB&h_0Ho{nF+R+&P@Llgd_rODc={vvU)?07F(7xyW?|;Yd z{@$Ow?~f0yukUw@fBPT)!?_0^cT|e|Y?|26QzU(D0?jrr>Z~O)jyy1=CvOn+ouK(r# z_#f}O>vU*G9raDqKK#fdZ~2*@`PfH3j!iqB&VJ?p`ISpoF5Y(Yt*5R(`RPx8dOV$; zzWeTnA9`r9xA*aneQbMcXMKG=_PQtMbY=KpIMKiY70k)&AGep8v4z0;0J|C0JyOCO za41TU@AYT`wiQ$gw&bXc#97}E%kBgS!uu{Ii^)x`cQzeR$wP`hGlrM_#t1-!A%qaX zlonx|A7m@Y;v0)1jFNrU?)37a?6^Q(os@}YxlpblUUmq&qpWK+tN<$YjBD@!{O=}- zA5DfHwcjK;{dva-IW7%Z${D}4eI@~2u;T-6PZm`Y6E|xSO2w0IlJGND5msU(vV5>o zidx_Ns(?7YwPfmFvvF7W6`lcNyCgZ!<(kG~y_!&zc%MjLA|mC;U|BHq5dhdJGqiBf zQ%F(zFp(+|$gMgb!LXWo(B%bXIcMiU@+cpR8`LXvFb1OY`9HhXCV)~m004qU`P>Sv zG{^)Qtf)r99tp^X*y_^>fMT?w19Bx;`Y)QNJ_X4(XkSQ( zIFwP)tYs+0FvJVMB!+Y%Kg^fwD}z`KI@c+XTTx#ex@;#7{Ma|D6oa#7na)(} z^wvQVT6$g9fcqc-Nm#f}Bm}gv*MXC4NYj2KcfoECCDIYWc-JhZZ+u|VRFwa6&ZXEg zE7@00)K8ZJ=dp6|s&bjl_UrHMD3d#CT zqu(s*oM5vrx1yBL<1~h2S$VUvK>%S#np=vI{McqaK6ntg-v%%xO9?Km;nkHawsyl? zmfU9DoALo5c5Lmks3^;#A~DW^DoIO>vpK9pS)Vmao}tFvrg$!2!vnu;9=Lazk@AJ& zQ5tKWPOz#r=?}X+i(cvo3aXHw4;eU?QeTc>K~XY~I&*p-+8adq9YrX)8@2ys6zZc{ z0{~cx|5_{4rB??GM7pvrRssz2^s<>D9zJr+l;4OW%&_LPJ=gs36y|ITu+*gdO(`3V zM(598c;g%2@a8xF`P*)L@>|~WGdJG& z#GicgKmOA{{*yyT4#&P@wLk>KoS_UUR;Uv8l4->dLX2_q>Sl~__0TFs+TGpl=H21L zhnqIUNb_#Kv$;7M&nDB+?)G-y$CZ`U$#e<;dwYBH#e98zJx1Ez-Wrdl>xb4N(PA;* z+T0$G+t|lN*UhH0rU`(dX~ORA?r7AG+A$zPq>lRCo$XOO9*@U>u(Q1h*sM&a5NI*) zwzsyApE&kEf9tm{T)6OqfA5DcT)MQnzS?)a7e1J;5<2j7q{-ki7o#QqcB%d|@?ktA zt0AO?aO{4JRoaOLV-iGern5iwL5RKtz#5i&Lz(MSl*}NDkmN!xW3p6GA{=|1A};LG z$S!%n#bR;l)Ty<#wfpb8uN{r6hn!PNlMbz~udc3LymYB;TaX{9cLlQt9Rn|N5}+!> ziE>^tJ?51t4p0t8bD{&UduRPs9!1AB99lf$PpGH9nt@9peU-;R4Ei`=*!dDLKx&5nG6#;+a%#~&yeB#aeIb}OKauBu1iW`iQ_$ZjU0)RS-A=hkBq)Rw@e0lZ* z56Zxt2`HaG_drm`>gDs^KHmF(VIr0R*H;N>107W6jJ{jHKadzB_Y2_|7Tx^l#?gM! zoxgZNHq0e-mzfSB%op?7bawLO$<3|J-JRXGZT)lgE_Ri)ofRdB@V$_w5k#1N?uWD$6ccl|guw_E|>q4h(N=-jz;)9I9AEPBw+ z#anm_1GW%EZ2b+@Scz&4{)I|yQw}Z=NYwY;;Uh=h^+)eIy0P&?Km7Oq<vw!xM5B%8&)(;&@qQej*YmJ1^SPS!?v<)7m6Vg6)qBXJ-LTnGFYj(c+9Fu%V-APRbNM992 z>M#r1b76$3-BTO_bH28has;v*XDhUxQV+B=o4R9-frbXqXv5j%;88y8dqBU-4}TM~ zo8~{Tq|e7aRxwcr-}Jc2NAuTHNxl^oq{>R|YhMA{v0XgqSj}3S_ondRnKXBp&cM!s zIl1h{`s(B3(Z2@3S?KZrjFYB16uyR#beD(TA6C06>6^yb?Z@baC;VDX2JbtRZTxcAI#CB*@LAsAgjI zSh*Pp%TI}?A`r3e*e{uu^&&T6zg@Mk82aMLBv7EWrhG<)N#7%IO3E07CNbk0C)MeRD0dVxNm5 z09nScn{=XK2(|loIf%-S&~QnW5rc+Vl@8dxt&q$B0&*;DU(Rjr(gwaq)|J$YNe20b zWG7Z*-Gh9sUEOE-rinK#457+Blu<{aB&;Q*6JrS>4lz|Ox*KTUfC9!Wau=!>M0{0l z@O6(un(|h{7_&wyEm10)4K|OjknI7hHys&itFa$&4DMwfU@}D#p-z|$+*0AXq@K{N zwX4JpCu^*#NqL@S!ra4iOr8za1tiv7gC!-MUcGctW?JM^#QhY)u2a2(ahgXs*(0|* z&2?6dM^Jx}q7qXPLp-Dtyx)dYOVeeddO3S!EHhGIi$qax2PpzF<`C}E&hP&A|Ge-1v$x!Q z(_i_{zx-X_{hepdJ@6Ah@sI!PPycLXbru@zyFP?KKp_Nvy9Y|o2Hutb97GWiK#YB) z*f!00vvMp>2RD#ysVd$#^sxExN90n#pwf;DZmp_1E6^uJ^pR z9gVO-;-}h({Qz<#ued{!XC^4rmh?}CFotz2Cc!jKZFq?-KdiwHY)09gA+NeZQT}LZ zADGvC7e@2Yf$iMWp9ad8%q{thd&dZod3u;l=^y~~^kurWcO8qXq2T4emIbmsz1R*Ur6VuhV-C}+K>1L1RI zvuBFDt`o!KaCXf}s`yJ*Al6-&9ZBgzt>03`ozB3Lvc z626sMu_kZ^E{3mF@KE>}1Ed*Z1+rZHYMKBd@~`D&`jf?}{pt%RbRd}$YvU0N7}h{x zmD|-Eh+a97=3Tr()JnOD+U0y67Qw2XP(r?+48CeaMvRtd05`ZfsgLm++Q3YoyTHID zxq+c&6I1KlfL;=pWX#$?PN5D1L<4~SZkF~Eix#E;id8_dLIIbbBtjut>@3X?(+e79 ziP%ZRFV8v}BX-(t&nLpID^+q0cA@rby;&YP4~+;!0YdTgTd~>%9|)oO&%{nK6OykX zpC?X5N`@r8_>(=4W>$1VJcEeLuN9A&4kj4a?5W^yX?iHX&n0P55E$|ACCkFH&1^^P zw;i?)9Fp3x*ov-!r%^u>tM@?1)-GLd8MH9tcVT;4lOouzPP7<-tSF^-x!(hYEL^k9 zC8k7H5u4303>45uVv;_#%l~AYE_N%I@n~JXFpvcUfc(3cj!IeOQqq>HT%jC|0~@ta zDjeBBS&E@&uvfWI+~U5P%uBu)y}P&YnpmUsd$P8241pD2;;IM{#E9(=XUGrzg5tLV zCQ&`M^D-Hdv_=cf1ppNy8Xd5A3b&m5Afhz4?kD>@_M%3r?G5^Ap z3qp;{58|P`0G!cT&yvYOuSvj>vrMJ6MrWA-&pq67Pnmwrml~ zM^(~qq1P?D($zY5;vB6*P~~muVV8ouimRxpQN=jPto7ozg9a;Wo&&W$HO?xdToveyTl*M*jfK8#pI3PXBoGM|;nn@&c`6P#k zGBKzjjDVlGdw}9i@(EjVG{Y{g;MchomscPLOJwZKSv<}TSpKqjR74ymE87X@Sa~jLKNxSjv zF(?zOHsh#b#i>Ga{_N6K<(-Chvo|F|Qz9NGx;YXONoM_tXk88Rxis_6rpeZ14lHLt z6wS`;<2)p3ZaV{q_UYH-Re5w;(6MRn7A0`|7vg~;soK;fBaS})C+ipH_?@XXV3=V^ zEni0_ROgaz(4-~7@i5K12?_!hQOlJWcGo(C(!HcGyh~2LRz90$nq)zE+?>b;3Ay<)zr2?9-)we?Q$rtui6<~j z)k>gH=P!}@fcZvW2JZ#T3=ji}^Tmd45uVI%ohT6}P&^YUGBo3QLza!t^5K^OTjXw8 z!Sark@7$0ie>pBlLo*hn^Ev7pa#9urbN(&Q2M!XZw~@II{M-zD96EGe$y)BkVHPn| z=)%BmqMde4H02YrPA4Zx*FkMoB+pH0t(hI&*+L%iaeMkSA;fbnX&qE>DfAs$0EtgU zc4kDG68^n$%FJi$l}RHbZ6{X5Zqc=)(b{_W)Tcjn`t(;`@{*Un?pt1e=dUDqEy0DwV%zIv1(rCJ(LI;`G%vmB_f6Z}2J| zePT`)6A(e9r2;{*Bsr6R>m?X6RR1Z0;}ct0QGrOqU8Rfbzmr@~*^^ zL?R(8Y5@w%zql@T8k7wl3mwuj@0}w_scY+@7VT~NwnHpHq;_V!>Saf zBtaS$(m5j_gM`DD$uxquW=`l}wyV;!IcZ4UfB>p?B(_A-K4Yd@42s0E31ml@osSq9 zDE z3;!bt0$PdgfS`;!#YC|iEU*K4Dm=6GBruSgSeg_r4OpSQBmb75-5^B~yAqP(WbwI$ zgK%$Fwzm~R%j75?+C#(e$dhU3xdM1%?;=10T1J$`kqwz`&cPB}Vj|LHY%RHJFs39> zdnyhpgbSdX@O+UC!Gcmg6^h(edSNixM#R;ElyxSRa!?etbM#oXHNUx|C}JsgEE!)$ zpmR?UaT52&U4g|1IaEsxG`Z9`N{`GOaq=axlvEc> z(mCoS(R4qrg$)U=S_h>Nh~{jXDeya929ayiuC*=Z6kN4Lb2e^nPCKV=H7{KjenpIh zCu(U;MD`%u7lwjvq~P5EN)UuRq`R)fNEB|81)3yqV4g?@hy=+>=R8QARy4T4<%?Uvs z$xz8Ue$5xR#ExDK$V`1Tls*Jx`v&)uM*eQcOgqsk3W^DU1s-*(TL>@l<6d$;^J9HqLVE zl{|H_^yVGv()jEj;Y~!%3P5?;DfWWNQE}Ko(JS z9nEAp@@?mX-RZJaHv)?{-I{G9opBdn*Q3aqPvK)4 zwTdCGc?2-h;|rw+LyZhFq!!wug3?Lg*7kg6;UEvqOlHMk0@P`{uZ|(phU;TMlwK^V z^oK*^XTVogEbg$FjbP;MR$^`>RszN>(=uDN-_m!|a14@}Fn5dka_gn?Mx)v-ny5n6 z*t($1G!!wPx;*dmYKjX?9%_)Jf#!^#RTW~|=t1@yT$EsZHX{q$zKTKaFt*@AXOksK zm!;l>cc_Vs&6!1}0<>5ki);zI*#^+=aoJfUohS6SqGlwmyg-O?N0Dk!v#s@BR_?O% z$DTL`0o86W)XrZG8+8Vjz%J{*vl3>c$Z7)c9-mlNlDu6o)w}~^Sh3@!vw&9AmU%<0 zfjO;qC}k*J${Iw0FJm`@gTL489D4dmH5-83`zuoaOgHk>phN{GN-#O&L0O@COcNt2 z1p`bD963|5RN>9!O4?kO%5~D&ScNA7-5+x{7eQtmK)zAK*4&ZtX?}f%pb-qoCyQ>p zR5y?>%97(+3+6pm)j5SrGcsjv_fj4)%=K zL#es9N<-}Abq#Eynmhy%Lk{wwIUAw7KxV0d2(mw#CQS26MBJIoa+(Mej=EGMiPfqm zG3x8wEybM5!ZoAEK?=hXgQ0;X9w$XfF0L_JV*}~ZI}8)y4m2OMkmOo%q`6-fZz>p> zJRlR-r?!YqHpQG`5bI!hlLyW!y^jt_bLVL1g{0KWEcrb&7p*v!S{lr=n{l)J)qwuC9#fiOHA1nuY(-H5 zl4^vmoQuQGphgGTiuq}y(xnb`r6`o>tXX!FbLA?G3bkji7#f-;*GYZg@@t~a#+JF_ zw!Eb+y<9pp4V7{~Hqi_~Y2zxpQIi@Aq8lvtgpUvq`##1<)0LI!%4}zQ`-@-r(sVkz z?z-zD!F(~dppB5W@rI6 zWKb$k0|7#ey-gD&?@1bxn9cwL?<0%U&1bh3A_8y4g?!M;p<-xhh;G|}N-BT0tKBrX zGHeLoB)zVvl|umjalFA1F#?wrp$ftL5*7;<5cn51yA5xf;gw5 zjTo!lbO$@DPG+UHx@|uzF5|U1Ffn|Q2w8mafE^5*hVJ@^Jb5j}ASe^6Zdv4+yCNfC z%Z?k@6O|>D1F>YFn0C6%ZYrwSb8qqq7=VpLa?d&=%8L05;O5NQhff@#io>(zo^P&j zPebK0a|$~BwoE%+sD&uux3)5?C<#CwNfaxT zaL%C_4`W0M0zH*ZnpB_NViw{v!iy^;be_P;a)3s`PZ?J-r3N>N2QP{cY{v@I03a{m zhfL&fQq!IyH9Ct1MhWxcDKG2|R@*>d_>%oqS+L4Tklh)Zh?yWO9G;~CY8klr5idnG zYh{|yC|31Apf7F_Br#)?mNq!^_8^U>M?w4L2kS^OPELG@Qze5iiDuBXyvtAn5rojB zQ;}k%82dg(ihWcS&3t3igwQl?Xs~Gr5hKMIBky6R5J6@@oSh8|665T?M0JDC4ns1T z<%gB0n*teTICUa56mB@Th`0CfudCaEEJE@oErO<6_zvVJ#Z(8JqFRp^$GB{4uVUm*J7|?hcKt%iCug81SORAX)3VO^?=$a zp}L(&(H4)Ue5lkDZDsPvvtj7bRT8n}2;FZIm6j-Rj1nOa`dNyAO^R`iPsmSh%U(V~ z*DVlnwlZ5?U5!MG{QJl3N6Yd=7u<*@qnA8aJaZ_ zY%B~>128UekxgKhsN#E)w+XsgC*4}a`))Ij$?@f>6bC4NlTlyE(W6)~`RS8r2CBos zmfV|Wp@W%M^GyHb7Y{W%ry~Sl02bai_oATJ@mb;|7__G$IhzaGMbWO)uL?>Yd zLOVvbZYNn;Y?~T%zEwC%>nAEWm6U-1yDE8caEilcdp-M->|pVy%N^lQVFkpOx zC=3lY1YsvHITIUM^yoS<&n%ga{YL>(OS(QZf;==MPa-nFYt-l-9LQ^2uifOV z%hf_iBvYsKych}*q8$iDFVh1q+##E0=2SBO049L2TQ$ZQGUEbUK-g+BP%+ z0EwvY`$e~y@6UI4ceZ!;2naE>O*;j%SBm( zkugqx6lZdllF>j!cfc*hHQ>2|GMF);!a+bPbG7U>s0d~$hF%VZp@b#`#IBF~`}=7X zKtSWsXfhs8#^ZK0YMLhJ5c=3hTFmG3`FwxAx3?FGsA=0#+qP{BfRSQ;|0sD{m|Bl| zoOp3|&B212b-DhnIbC*6dpBB7T(kkaK{Sv}%PZr-(Gp-Nb*zp|zbOM+;toscaHOnR z9I4c3LIX&PMYp%Nm)?KbHtlHCuCA_*$K$4H+NMcJ5&O947K_DVe}8{(Z#VXYh)vs$ zlMw;LzL!ChB#_J(2@oapWgyTzn!#H6&pJraMaiv{?$dJ4LmV`{^)1Ug6uDUf2HVJ| z(#(*Z#&T4zW3q&FgwQSe#bOa-pVG|Z@pyH0Wi%eQ&8TVe&kw}D@A`f|U(Dz8`OaRF zSUVcEZQHahBoh+JO00vzyjV+-*ClUZ0*6B8ko=uk#0Pq~bB0hNNFhQ^t^u-V%{VtC zOU=<~7;vyQB)dejvBx|n$TK(VMnMkxQKOO;tDS5TXOKSnadRk|`}GvsN2l3eLbU`Z zqQ0jH{KS-%vaF&Yhe2KjWaK_{7F1iwXA=R6WB`d1&%5%->9x%HPzpf}5m z4FnMUn?@B9@{!B1l?|`su@%)02IY#+Lfv?fc(vy$8z*b zX#$jI2CZLQb_ZF94Qf|p39z$dLBiOqMiwTUPEhi1NY&{9KSepY$iP~JPQc@2mk|&V zanW@<`@6C4CzJ7!jl)NdY#chYzPh$LolYmCanrUKF!m9MFvz}rKcCOHceXdLZeF>3 z_2Q*Vn^&*)UDuArlj$ThA#MMnlnX|Fj!3PlBCPlbxkfz2^*Get?P73ViMg~(PiuD? zXsG;(qfT`oIZ<{89->za9dZ>R$Ht_qVrqu3o)*7;2!2o(Fs zUPnmg=O=79nTTUwV9%Ei0S-oQxmdb99=(rXl-?MI+>2fqtFD2B!SDk zBE_!jcK7zSHn%Qcx_t5C#j97ZE*6V+G@48%P20qt@=x*@Tq|mH#YbDtOjPD!(adQP zm$|QIhoUIS$Z>*O3wZM#@_F1r5sWy?;V{me^aW*9{E9P#^rMWHlt`rU26CZ30p#E6 z#jfx7_xJkPPbbr(M>mcfIlO*oePy;XnNCMdlj5yp+2ZPAjD76)_V%{6wys>cdg;>T zt5>h~eK%^ypL_?{vl5zm_c4lbq!g<7uJ{Iz91dAKXHGG^ak!<>O& zgDa9mDGqX!*SuP6$!FVRakayDWkML!-ODvt>o!=Aq|~G)_Jn9Q#MOPd+kW7$Mv0jr&Vr)rPc*laJ9NLI20-xuuF&XP=(<| zk3McyG%e;7*fATN<@gy5kb_4JPpZftB+B&0l%&J;4;IoT2r^BDV|{Gcav_VC!h;$+ z$x0${gW{)>XvH7q#)aqcDvs+{c2hkTzx&m#xTo|OSq#*J)Udxa}>hTA|A-R`@l9mJRwKI9~&)5z+jMqH{eGBj` zCnZy4BgLUhcOdOO#zB1oXAkm_2||E965s2P)cxQeLp+HXLO_7|e7?UwZ`nD-BZm&( zd{avR+nZYtKk~@K4?lGA(&fJIr_*UW8Uaz?TWr^qv*>iXl? zU3X}GJv5x?9FMc-fAw5?2m&xbu4DR*DZH z7hl*|N@k>Zz+`Cvr=UU1f(xsQIU&;Xg@TzhDrGqk0%B+oVLqSl?e9;<<5QKN(wZFZywRdU0zqdD^FS@Qv1g8q4$#goKPN&n!$rC4^aKjT2ad&6uvBw^J z=;4RYpTDrTyEmDR+jbNw#<--+&IESZJlKKj6S6W-92ax7qxdbxOpTIJ{G;1|5lcGA z<_2cM<-_>{@f2a!Hkk*HmgZAl_S!_6b?}93AT!xC0RZNU`Fy?@k4L9Yox1+isg0vY zr_*VSaXz2#?(ANw+IGFgg(OZBizQB7KEchajVJh7to2TwL{ zho>%V0a!I;Id=s;fYl;V=^|Y+gELjiW>s}tS3I{Ci=`2XFX8sqT?nwJuTkEB;#4cO zC)UQA2SK`lYdVmhOH0PUod#g85h;TtKeT~_=N_kc&0_fSxfwoBu8r??K3fWWYkP{aye@4?!L1m1ptMY)${|a(vMiDY zc9jrCflV87Q|=7ik!0!7WsyZozD++cZPuH*eyYY9SpdqX$)p`F4~4St1T)hIFChxz zt9~_hut0JE55Vi8j6*IKl=VsBQY;A?2t>Wb;Hz;!1=26Ya5qrGG6Gk0=lQm4qe1S< zmX*r^Hs2zbPhu;UQFoW}OG_Fp;mc53OpzxnKNGUt(39?Y2a0YK$>$jnAzEsOw&~0g zSH&iYZ3B1$6yPV-Y~UixNj$KbO?|A$jz*k1Vxj3qeTGbq?F4CrVTRzxcc3FxP9CIW zOJiyPKYhTZ8Y$ut|1{)h001z^eI=3X13+XSl}XjooR_hC(dZfghX=yFCxv{20llj? z2eN0X;J&u@+NGnbC^Cr|)2i}deCyC*SFKJT^;bg7I-9RqR_rk8Yzhah&?v)$xG38d z=j5=Is_ELnK#kCdUbBmkL=+*>b`99^*U{;VLl-|^X$)sy1+(DYvrwv!WT#%sB!h(V zh!{ec&*yu4dn+rm+n;j#$rC5n)>isHUftS!_@Re3H#fJpxA*t=x~}Iga(XgjF27u2 zJRZ+xv$gg0jiX179ND<}mRoMU?bfSTubeq^?%dgPn^&){tgJLm8)H9^Aj_W&@X19N zYp~`yJ!KRg+Ju*$?N_5>=}jDI%Y%y>2Gl*{&a!!4R`w)S9Ask}3z}$I&mXlqJMv4K z5SkGBp0;+j+NQbbNl$v>6K_0nA`uB>isY#cjw^!V}P*WYmc-v0i>4?c9}%-IVUE{@0J$z&2EMe6h0CuM!E z@r^9cbq>5_0fv(J=IWq~-3e*6G=<_8|I6SA2tbOA+}sLCrRi{*=7{vpP^l6a3n45P zi@n{w_4T#eZoBRJQ>WI}*ZRKS+S-2j;fF6@xxBTxxwp69b&D8N(FHloOFJhR#^cd+ zGFe|gboA)P#>U1IZoKh{PkQ3j&8-I>c;MW*vs;^6)9JJwwXu)#EQch}N!+}!q<)Sa zteqzhhz>HGVdWeIeg^C8*jYn=9{*+w$GhC`@jPaZEkMPR#rmO0!89^vMX+$2+j4fFu@8r-!7^m3@$xf@g+kJNU@ABO;JO(F{>7s zH$<56e1)f>=v#X-31BByl$p(4@LgoYJv8?sLWb4qK^buc8q`AZG*lhom!)b5RpGd! zpfEk-qRDJBXWw8gP@$&kTl#dx@W48myOIb*X4=Ft3E_EjR$(KsV zJhsj{n;I!;HhW`CPqzt8MIf6x>!T}gDMA4>s$rdk+Cm}ee|41Gd3pjlYKD0 ziy>;6Yb!C)?J=T>ee?!qjpc72`LXXyuq7SN3)p60=Exu;gPU>S%MQsNI*>)2&lg9J z9qqgBvBw@;p3|cc!v1_do6Jt0Jh{ESy}P^Hw2j|}HMp-qgkZfXp2MWkoGu2wYOT|e z&dB0^S&Ai~V3Z$(%77uV#Oy4IsA-zM?{{~1S5{VTzUAf{PF>%$?UhTHA9?iA3l}eJ zZ*O%ywM}T7rfJ)Np$V8CH!5_WV&C_%kA1i3yRPdgjz^=7jg1p0PM$n*-J!$lyL)@5 z?>c?|ePXo|guE82H0g4nt1_Xe;oqYhh=}Awz?a5DGTU*`U*?IJl#~yv`k;|7a@9pgY zVAHfsgH3vrC7{H{ZXhBe>iGy5)(@{AKYrbb6W1L%d?+-{Lk~T4*IlPCUAjD*&6=i( zeUuQH4O>v3#77jUO(n3Bjo&iDsez;xypiDL!*0f+<9sv!)mAv7_@ot@p;Z2IKeZolyfH?*VCrOTHedF0Ux7tU{OZ7sU4ZJH38wrxTP z0Ry7OXT-)pM3G|bsgGUX^?lbjZF~68`tj>doVf1z`k}Q&*PXfV%zgLXx9Gar$_z2| zu}3AxRLKEL+k_^{h?=higunuDAxDyX}T2+z=2hUB2@0!wKs)`z|)2Y1=k5sn!n->%i&? zL_{&h82hg4`o51eYTLsbhff^8?!>7R>uYO$7w^6I-h1!8cYi)#SzSTElv^vdSRAX& zyu@Xh>Z~Jmbf{GE{0kW7`+Tm&l;^J+^O!1x6xf(p z2SiI1+znzB^`*Ar6r83F9`$9{+me<}n1#R2XFUT$H_G<{)OeOTz#qJEm^Q@4VsYx! zsr9wB`|i7MJQ`aR|%1X zVAR68Rkv6eAcKd5`jQaETMi&`2D^DtDVh4g7|~`tywb}FU0vG5*Z}Cs0FpN_aRXEV zpK({#goGWCwI$UOa$MLaE~+IMmJfMX>AiXe@_d=(XllUYSGF)9O;OwW=WBLGQitzfU%yC}x44^AB@*=EO# zd@D}?pK-d)0Y?20knQ{cV&?P3v11!u*FE~^W9c_g29FTJ{(OIBx^mr#>r%Fb{hFoN z3=T?aCLP^uI!P%`%ITppYn~|*?`K_8C2~YW1cZ=UV+cDtJ8cNJ-g@hePkK_@hVze{ zKXdl%#fulZz8|%t@njrAgP7imL!2}87LtKCvIZa_5K-*o{{Fn{y2)g6^2CXoZ@uaG z@#9yoY<}^JUwrtXhuXFsPsV*8T_W+CxXq>@uMR+WVaY@2-V99Ioh5Bvr|>uy^9Cg9 z=`Jk@O|}J=EuCENjMtnCq<~?uSj^}16W3jL#~n}G*x0zbb@lB1XC8j|;ho*RwrNJA z^diqZH$+4fJ$0-c`H=xY2#AT<*meE>e9<)F(E9olpY+5VZ@fN)_O8=+-+lV@e19>U z&HC5_FXPF~Ql2(48!sYpcFs^T%-LOa)48c2c`2VfsHrRQZf9UAYJ&}((|S1u0trko zuXQ<%S#{3y!x0oB?$7rD=;oVlzU7u%$K%nXk34$+nX?x!o{wE@Mx)7OoZnT2*kpMc0Jp*mcKlzUfKVU3YwEd-wF|yB~Pq!O%40$vDdI=v8r|hIdY! zhIjXpP)*eGIyavls`@WvsL(p3-VQOA?LU|8ibDfV=2irW+=bu0R^Jp50d{wHLkPFt zdh5+M-`oUz^!)jAXU<-_c(ISrjz*(V+k}v6j?&v+A_>Bjm5E5HPejB>6l0t(7K{D) zcrv=~`0<-=zUkzN6T7>6U;5IQ&OP`*6Gr37sPB4PUcl-mQdhi?{J(d8LkGDAb`#gE zNsEBW-)Y=p0gQv=akQ9wwwqF*3gG&XYzqOMJ$r7pGBdAyHbPx8x)?9<(jJd&Xl+Xo zff(MjJL_W7IkDcFQ;s5RX|m3f&Eol6Wl$c_y+@~*KavEm88{`D3=OK{T)#sS5IO}i z{5sEU7QfPK>bP8W2@zE%oyYq2yoHf&1j&HvSc8kUJr%tV|t>1Uwz2osn zQA3tAQM~GJ3l$wEC#^)9@2zC zf#p*at4L$Nb!os5GJ)Fw4%k$O2S6 zW*(&*HEuE5e9HCD_qy;_XUIl9Ztd(atF&2$w`5uRb1Sy;MJC8HynJ~eCT{E~ZQ^L* zfF*-m$OY}i5$nvL7Bi97Gd$0h;VsemGgw##bM55iDo#V%kJ?&{v zJA7#U!G|BY_wIWyUb={gZHv#homk{F;6Elp--?MzARn!P;++}qu6Lb&5;cieKz&AYpMcb&fL!3Q4f zyKX$5j@kwSrt%X_9_2-dKKKbaeXbcx9=nq#l5}#zV8mNAG+ zHfca0?^Q_&ve5V4-rgPnoIH8*DNnh5x9(nW&pZomw_RefJ1AspECWPns!ZK>t z+d_?ES0yED&p_4e42YYT`YvFwsTtBI54^C4p41SkH6#HS_T_BLp+iJ;E@xZf(AsGU z@E6?ya<)Zdr9#6C2^8QCU=fQL1<)pC3i5Oa2?A>2h<&L_p!x17Q0TE_OH`mtD1@h( zcfpY4pX}(CuiU2{!*Jw{WvG>xg21WvV)a<1f6ct27AV=Y==5w&cKZBNhn)(m8NvDSX_VV)Y|&`efQow z8jY+_6hny)9X>o;S-EVpEd_Haf4=Sjj`B~^tlbJi7F?i1Ysvb zag+wc+}g_2h8K)DH9>tPjlr3$x(ZGQ?TC%guN3vk-o+hsajk(OnZN zm5a14tTclGU#Oqlqa9Yv1q-F~uI$|B*WHt+py9{0WGGG=idcu#yp$zn(kx9_1&x^r zgI<@c9$N1y^7S(C`(q-1eQpe)Oq|;FO$B$0Zss-=8xnr5-+`hIcyZBKs6Q=WR|>Xk2l<;xF0{0N3H8Bdx9yDkDm zErURHDd~vmYGh+%v-gvj=m8AaG;QDY+uPgiXms<T%vBR6}PY)c+k#6)~3z{ztF&a%Tb8JLe!qHZs_=t3JYvT~j=Z=Y!fqL5V9L?H8^ zWcuOi24k5jy23_lAsbw%LAmn zo&7~OKYsl9Q}4Lr=+TY4Pv7(T&wXJ$8Mkc{qkWG*%JYVG%uJ@{T;(K_r`~{FjQKeW zi92e(ij3#M$FgjTji0Uh00G)9o!UcXvXO{FX!_Xi?(9D8jysU`qO^NxqFmtNjhhV@2Odot{NuZ@6k(a(`^>9J}0KnvqwX-FMc9HiX z#G#;iUJ9XEbY0(fx88iqQ=at*%k@gmLwLz zc&74KZaj2z?ov84D@3pIg=V@jh7UiIp&xQ>3!FQ9Ha$t?o&ECQDCZ5iV=`&i-qc3yJrP+Sf!aH$%gpfcS$3NJ^TGO4z!FkteDXLad~TfCZ8ia zn=aRI+Rhm_uz4M&5d25CmkVIz#pGyH*Q=$U{hS%87*K-6%wgt5t}UN@9jMl=EOU7T z+svY@-?a5m3R1|*|B1qw{tMbHWP_2T>DE&y+oS#tK;3@hpqNNp5!yv}Rx?Y?pv1ff z1^|=Oln~r8;~2@4SJkn|H$SL{dD-5{45(`{bx(HfivpO*tc5@Ij6zSDt#=gLjW*MX zNwwsGWjk1}CL_VPL>@CgjRq6CB@zT`^ zQ)fqBlMJLd9VLgHLbnGdCnol4y7WoNW#SJ%j|5;Vc!+)>bd>2K4G^OIUS#M<; z$oT}8$$%E-WDD|leVKr3Sa~wJvbK!k`9BB)mrjN}iZ0|Y>{=;i^!;lqa(i|+L4 z)8{Wl5trAriPZ56CG_F@hTm7o)NXZ;+P;ir1}#xnvHj1uEZze&xyfS^4}7xw6pm z;RySajDbWHLRie_MDb-WeaRD^aKn9P&VK%LpWolxpU$Rj)ATWR-2x!!7%`d{Nw7da z%8IsteSVuK#t1R?h`72k>$-UE+yj>{U4Hu0pZ476J!frw?Vh{uhIZVJM(K?hc|vj$ znUnVtC0fV=FhxbBXoeseh1}X;*txptpjrh>`CH|bTkDysCffREjUn?(fry}O+P%HK zrU}n|?sKod{)T(+x#zCC?piDsvz3*Am|l^S+;+k;<4;v0me6HToz<6s2>Px^#P#*n zuJ7-@`}AYyAARm~pYx)Zyzt1eBcJ*7XWIWiW8WQUS5@V`);{OleqT@T0a8dpLhmJ^ zixm|S6%ekPj=T zDQVJ+7>`tTU;paf=MY29HTF50`Xik~aUwfcNX*P)h9jY|hIh{N;-D;+@N%DQ?PXr! zvNMYRN$w}jo((P9az1p#)b4JNiAelz%`i-~5uc9zPD#f!(@PMAph+HpK>My{kL&iJ zg@wR|6}G@qK8C122h!^s$=T`Ot-3lxH2ZRrCak6CIViqVC-?HpvC0H5Of;AU0id!q1Zp}%+120 z197BeSWDq{FaOom#WL`=wjtcKk}v*@_3b5JwLXw0CUZzP(Yer_)a73rMC-?;OO5k`+iBS`ntS0Hk% zKa&_u;JFrSM}{w?l~>bITaow_QSV{~##qFoM!m6O`HGX*tvht|@Qxi%M`2hf7D$jx zOF3>(OMsJUwOMzqQ~E22bE#==0FmHCkjrI-5HG&4dt_wf9JNMjdF1z)~?MDtvB`QQbic}!Y+|-TJyZlS91V}?4UqrB?V&e)! zCWs==0NV3lvHMV!Y{&rIo$|RG8cl15XcOMQcExZ zNC*zH(vl|^Xv`WvAds?c1Z1!nLENUu59DH}@-Aq+V0^T3#dU_@Vh?+(%|}R{6Oi!% zwsq}J2tekDNQJgoV|79F}4EHNv!4;F#R zBNH`(M|1>_lrkxmCDbe6AP^<%i4<0_rZX01=(%8$L}1tU<5QJ{RTAq=Ixd~2J&+u4CAuJGL91Tt%Oxhc zA4rn83v1f_5VE{(DU7rHO9w28wS z>&%TH%A2*3BrUK2*5DWo(t|)(7F=o@;ZE8T$HZ!;fq7QO?uPsX1Ok*>LI%hfFaTik zVFn=I4&dZS$Z1{A+sYa$eU(ixrNOQMIb!Y@S?3qDUp8?NfHY-X)1t=~6G>&O$i2aI z-0UDhIT}eUOcK>TXf-UBpp&x(1Z0dU23mL!H|fom+De_(KGza}Jg*~Z{p}~(Iok1R zLldKiLq{cp_FX9^m!VC!;(#&Jj&!RA<9Gxu)zK}fx9Ul%dDHo1kPDM8ud^t<(y++(jEUc!9rh z^X5Z`59e|@&-0=vA|Z^UYC#s#)7CJ+Y2Ot37=L5+jSz(E9Ec*$vzcr*o7uH%*W+8B zm@{wA`4^lQ1b(9t2EK1hg0?L-HyoconJ~bN(#VOm5png3HDL`wljBvBX|eln8XmMz zWHi#MN2JBUnrWd2sBS|9AjU9?qA(2CtXXr~>8I^_ao3hDPar@pmy4o^3vN0zeI`65 zwAyc|y}c!vkS|s-7XSz$gdjmc6h$Es6$-iG;gQW79|3@iFIk_S zXcJ=n37JqH%{ZiZSl^Y@LhZ1U%(M1Co%}MxYIso)Li&WG&L<*d%bR8p_~OkI6!J z)QZIjAdDjUmhQcKUVdu(jyZGZoOZ@(jInyX?s=Zj=Z|PB)j}6yq#^BK9mHnb3Od%O zMRe{uwbrWY5CwFZpT5!bqyHl!`$+;gDLdH8cex`WL7vAd)k-d#Isg3gGr7WJk3M?j z@R58j=lgyXMaF>1D1tP*otBNDXlLkPMaMNFI0G~8%Fs%1kx8Ypx$Fxsytr}WBeQ1A z*s%U051HV?W6T+GVj4C$O3Fua?qtP?D6Zn}{Tc`Wi#K4k%uV9Na_Ghh#Ruu;fMTLN z?WO2UiIyB+=b|Zc!zGQ0A8<51P+gSP=L3X5u+{32+q6YBgB7Z$$}cHmWi9#VKhm zNmFCmENPbqsI#&fsy2&+BDgW{1Y{x(&3-)*W{YW+LR&7PYh#^zwCj?78SRtCpgLO7 zB34!A$hr*`W0?^fH!gGCx_gVbw09y0tr!VSaM{XaT+(z3gOWpWsR2MpgtC-Gp(1JQ znj%3!GeXsrMo@8KZMF_^7f1v#u|m`{)46mqKrlX3SL+<6fMNpL_MD~}G+AdsM)wr5 z7YWIgi58Se7Ds;wfP^f4cOPhubB&2*3>Y*2$WLXnI(-AsZlH1(JTq zw&UhE^j*RZESB+C>WC(+lISyL(@1Z=am_PAb9~u!#X(L> ze*K0cQn=;%1_{PO@ItT&iv_g|=H&5u`}qm~o-mvID%_>lB4rUzoClsq=_mcPfIiW5(1 zfMcg)?#s|h-6pk-7-O9CM%Y-hYW3Qa);{^9|M8YhVD+t#&xKL=&_fT0jrt`QUy{pZ zn(1*TaZLQy_`L`gF*%Z_l*6Vu^thDI13h#pEio9?JOp5jHNr+No4NFoOKSD%{SQ7^ zEmw;9Jn3u|IMXy~aD%DrKw?cR0kQdoCZlCkT%!YIj1dXOSg}y(>+9S4#MYjkp3_f1 z6#&C9@_k=BD@O#3F?KYXZoC*eX(3{Q*}Tl|U%v*4l|1GnPyG4PC>KAkk3BgQcZ zfCy&)0hoFRw4necECRZ6ZkW|1{JL!`AQnBu-_MPDRBDCa9lN|ir^_gA>qzG>s8wzZ zmkJyMi~S9Ct3_>My=(_X~iA3l@3xIvoc{O zU@S?qN{OaVOy~L^lWB=5wowfz5sJRMQx-mD4Z)vS& zMPQyVIMJp*q=B|333P1=X!9NCN3%Coc_4H_k2WdF{G%PNOEfd;1V!ylh>WSS5@ZgF zOBfv?fCMVN69Py8k*2-OhnT0()d!ucv3A7@i4(qnO!e5f3Ykn>pqqv_YEGak6+y|g z5Z0Pl>mX!)mW(mcNfFl+TPimh1_#GDVL2KZR=F_qp^+8kVuj3B5s{Et6B0tYK9{^q zi*7t_Wnlf6#$o^ol8f9*O%2~ogEBairOo78cs&$yT2&L&qG%G1E)zvua1KOPpU`>C z;Ym!c4UL+{YW`CT6w(1O#u(F?FeTjbwG?e_#gUQGO%HD>6pH7ab2bU$kzmLYP)@ly zBFAnbV{w=4&_n_X%`0@I4s^WYZgojqI+!tGuQk0|-r~w_C~sxjN}_Rn(zdFoM}HMF z5pt;YMq}m5m8;jRd1BiWFTU_%M|(Q~g!)h$=XP+sodE(4V_fPPt-5g|eJw!fJnB%@fDMvab@Le@L(X|79bCNO;;Bmcfd?M+(92{pVHDXp zp!p$NGuvuZ7^5vE+U>szm>GXyfPrxlj+J8!Bwr92deRoOx3`aujBa`C@s93}Q%^ma zNN_Hg$B5!vTOIAtDq@eHig6-AOzQ(2ipK}0;S_2-(G++)nRgRx#whO?95W;vfFzb! z$QiZ_hjb+xV_v=9NT*Zho_h`#V&lUbE9FYDSl~R8XS2q*Zuo6|x*4J=W>?XWT01h< z7PV=#KET=sW^P9&UlCnwD@;z7?z{K?LNR~-1?LMM5jkg;DZpT1p%Dp)Uv|7inr@cV z`gbcrppc9*dk&6M-C40iNUl9OW6|yo6O2m^FBZAD!#0B90=1aeb!ZRHv6GN+HZHDl z=oKGT91O;oYd$jnBz!eFqeJ&*_oEh<8Hu(by3eMOfTNo(kL73_kBeZQPdG%kU&&_s z724dYF~hbOePgo+cdxivB9*Ib!DlJ?N*BAhk-bu&(4jFVG!r&^9v4uzosp**% zYGe!;V<4Bz0j(D?T4ajL!30FAR#E0?bQG#Amx%~L?bju@+omgK0A68Rzs%6-7=am&j;vL;@*e^M;9LkHWWc8F6*6EF0wXZJqakKZ88XIfmcsx>GTzIM1|jBY z)ZdIT>lcjak4Zj}(3Vb!xKhM+uK=K|cwopFvj*IFJS{&=&jaK56q6gOl%+%x1V$CC z@v)Z5JYptdy_j|jmKe5uXEHI$CLKUaCvBdKHEfKg8I@*_v}4IZkghp4LsHfU68wXh ztu`?t009Ys3_aiTJmz_x@3XYe0>+r4J;S&>xI*g?QMGT8j-&%)h>QX1lcX2|LxzB= zo(1H0sG$a9p63%H2~}AyYqbzS9aSO=IdmNk2tY*iY%;?@Fq_(mkJ?2;G`)cYhq4kk z%BmcOQgzVxQ$dgpf*=TdM2iWU^Iqynkov}?;>f&bkWK|bpu`y+-I3tZK|FDy3y_-P zFU1HlnqlR85*wME(y#(E%0U}a1+N-`NWasXfqff%(!OYbDaZ!(W^pl+nv z0vLh@@Mt<|YOCdAO+D+1BBR^jj*={|V^O^mXEi%g?STbg(^$IrsFcIB^w&+A2p1A}Cz8o-!Ua(yis^VH?{s$V zX&Y_yLIg5{x-+(iyVpv5MpARI7lX z&U05uiR8;tU6NZH<}SN6_hM&c@r=QC&BL*PS3ORG3q&~gob$pcy8nR(q#cfU*dzds zVTogM7w(|4bgiS#1PP6pG3Qp94j`b2^J1|$GB&p5iET4y&0M`|RlQaRS*a{!LQDZ= zov76?vx!Vj*lh_(35*5MQs`Uc1>!-b^BXCRn1*x?Imjianzmt@LrfXqGUjm}0n$0= zoD&48&5t}R+^I!J*|VK`u4)xF<97QG~XO zcR+^N`W_}jFyq@1!1tK%dx$_nEXZd{AMaV&8T8&4vH00cpNYHFfUZd_Vx}rI zA)!m%^-e%}4+*A+kEjbZ&{ZW(M_F+rf0ySyF;=eB2L^`1S_2V;;2;EXAp|EWDl%Ov zje_7Z5mO8K$k155-bjFcFvL_&NU_{d-B^8Nu1WLCb?GW9Gsy}-L@)4ziHXVH-oB$p zdk2Sxg%FG>+oxP`le{p-kTI=rjCr2Nyy1c2p}`@B=y@IzGR6`>7|p&O?UUt1gy6MW zty-=MrLIczg^;G#U4^iIRd3sh*)TNow?arlZs@d!NJ#xsgOX0h6-!hZen+h&jfII~ z$lmIvw3YF7Tw3c(CgU(E>E?-8ezNJZ=6IT~w5cVsaldm9*$&)RwEQTrVw|_u>E=Wy z5Y+3nGtM|Ylh1D2xQT~6lS#{$VlZ^PQtOM11C$I_V3B|X+Px8|h^!np#@xLfIJ%<; zL?j|1crKqC8XkV^@hx-b&s}-q%5u5nd!F+oGfx?|X@f6;4iM;)E^vC#1a)$+4(Kr! zS>a}l{2``{u5j4TZ92<-&k&jH$7XQkFfEF7xvU+&%6~A%s+HQD*|XQJJ$cWbJuf`} zd`Ei+7hG16NP87yw+8bH>=|a+aLkc+Yx_}Ksf27fZo&liD2)hu%!{HZolYU*efK?3 zC=}M6yiSnJj4+)_LJMPb^O6oGC^d*SM%9=iA;|ZtsQ1c%G%N~rJ3<5+MmcJ(>t0}oLVflJ^0XrfhSWf5!(F}_NP8_myAs5qAb&w z0V@{f>iHOaZN-cM35+-5Rjag`VrM@ z)zeNnwX>sR%i~)rrAncY=RA_$Uaqp}gsHQ%X(mG&m$_h)6dabkbj8kKc0E($iG)y# zeqgi_1o0@$<+2l#r3W5-c;VuO%U7(Z)oKhq-H%je_r0wSW6T`2I+K>t1l??;Y3Lna zJaH^n!eW|G+QuV>&kANZ&IJ<}7)QpMS*e6q9#N>9w?Da1%Z2W(Ozoeof*IN7r+G3p-+sKDY(0!JiT&{a`P{xCg~BXG^o%KQ?e4ryfU ze3b0ZNbUdiGQ4O>1kf%s*1>ddfplcr(VE0B;7pjbV36WyQZlX9n@5#nM2Hivc_7J7 z(dCoAAra-f^OPd*c^)8E>J1=Brvm1a;E|(IZkGgzB#`;c^BHkbDwl5g(1-f_2mbcg zzwj{h0w2)}0w#z=#O0|FzV8Eo;M^?027yN^pkQ(ijF1SJ=P~dj9ujal70>hJ`Z!}K zgh1IkFirx1n9egW-}e}DK|(~1>ba6dO~jPEGzLJDdpca<=zwX-fd*iCtQcW$Grvis zq~H=T&r79Km2xGQ&%EcRcR#g#$JVV|13&Osz&z$LW^6cPjCoAPPskXMjOuKf!!crN z-G)fkgrEd?Qpy-(l7@^iLFA-mh@sDX1^}FM^NIve2?1*Z0D*Z70Z9-EPCzP0hKR^~ z-$zuD9sqcrhm1u$Vp8@QV~i0O1b|E@fDuRl^E|=15F!WyA$SyV&to7XJ?U*2lhGqX z1|YZ)%=0|Yv*5l3*J4*J38FGt%`Qw&`jtOGOc+Y@r}cLBVaGF}6(h&M##L5XD)4=; z!FeMTzUTWM3c-OuIB7v8xeUwo=&TjRQ8iGXwBB&5b5f){u|G+C*y zJg(!66(>CORPT|#QYP&ak9^-pCLa+x!KBi=%)@FW>gve6?y41gdn->oJ(A631PK=x zyR>ofs3EqdIVvO>=c~fnvTRPlX$qJ(JTkm|*$F3~c8ZVw?%lhe+x5Hj66T^gCJ})5D^HFq33x3z&QsJ$W+Md`JTr-p#m~MU;@>VxQIjo5z%8F zkcc7Xiri}pAI9n-#_UP8vxXE7WrL3XTShQthE|Qs6SuNL_ zQVWSoL#7x=Q(q+7lJ_^G?WS&;`o13IGtQ6NCVf1R+u`mp|6uzw_yxr=D`^=;-LN z{{Cz>CwK%59d~4Y#_`rP)JHQnCrhH8Pg7iI8%f@*EpY-`#3<%|*UD|Tz7&Cxka^X5 ztx(9Hy6)t`p~0Qc>?{_F1SAi4kgpz&zsxu$mq}!2#|G1U6UXH45N#L$446Droe(@^ zoJYBAwp1!Tv}xm|mtHzFICS{PQQ!A97)gRi`J2QX8lIxLRs9o#vGG+qh0>*>Cg<8b zM{9lM6HR=M-KiX#w6EwoTlHJ4AFMYTCmeVD;zf(^yZ`=(^GrG$i4Yl*Kr;zj%&O6Q z>k&gM)H|)5sHJF2HNE53KB%&mqF5{*K60ec-nM+%3FD(Dt&*-78VkH0VdsQo_Y@skH2bWeXQB+WO=Z z!z07RLNVf@>G738mzzt~=?RqwN<3?C)H2%~S~-++B^Y_c^SRvE*ys~aY`x(83xG5+`ZYiU7*$#ZZ6pBpCp(#@({z6*e(Ucg18+ z6U?$z+WDA6jK?q5{F`-A0##@$SKMWbCLIONj++}d1wg7JQ@WvVG44BNA(EG&6`E5BbjBh13qaf^ zqbo0FE~uHROC=B_{6Z5qQCy>@iCpCrgjqz8k&ntls`ZA%#AEbTXA)>?Koh4m*AfBI zG$VRezSU z1VoHswGmBBR*QjG2)yx9wGo2M;=3hgYHo-?#C%q-SBC}$rlu;jQtiF(ec!cjx&{aY zQ7V-Rqi|w;vRtZop64+i0n4RQy;cK45<+e@s#j|~XXC787)pEHEzyd$jByI#mh{%{1)*Izgxn8d`<^v#rOyBsP@7L?~ zYNaX!`JT@Jqlnk*4WIdd$dCoTA2#Z786~+)SFKee&OOhY7$2{cD?n7Q)uJ#0dBO%V zA(W+!q6iSv=?svlRLYzS=6Ti-k{0gxGHKIv;+Ftfg=Ly>h6k;iva4$9&*okz_NRtU zpnuf^)*eB)1R;-&OjR4@sKfK3dNf&y5ItGqAV9h#Au&k6yi%$0=JgA1`^37By?OBs zmoIwXYnJ}-)2Dp@^QWG%yjZDnpuj^f@EG%`5k>VdLIjTiBVYiY#{|)2sXkc_1%Lov z4>=Kw1k@r5Erfe(9;Fo&4F)e)hGmd9@HC3?l>- zT!0_|5r!cEBL?+)U6Annzz_UJqfx8XJ% zhKM9c5OJ;)5QrkqW$^_Mqw~){|JAR4)#Su@DwSf)lmFFfwJ;2WAmuY3i7{jz^O2}r zDs#?LK?)Vlmh!}anCAxoP^*+Hl?urHm4ZM3V;*r{o+=S1-%kt95kZ#Wc%BzF!g{@q zj4{sxnWr+Z-e`__tzV9TkvP;*z@D6|6*Kb#XE zdTjrYLe8f6NmqS>JUfjz7eFGLPVakp|Ni|4PCw&}!1tp@r0Wg;9#crWNc*=Qp~HNQ zm$l0?^dd5C*d&BOau|=cl0H_+neNSP!nkbGc9Tqjo<(9~l|Rq%&NoV|37Nm}aUa zhnUKwypmNh$IuCq$Cm*Kp->kUX;Bjhz=a^7Y%aI^#g|4#N7t-f6Zk>J`TAx#}YGgfMh%}(I@ulE{!gs<%CiSt&DaAP10yjUve!V zs1RC~hE=N_U7f2>I%&_|JqHgS%H?vhOkLJrF(W#Nh-QOv{3L#LM{9n`zIA3!4&Urp zF+bwmmmk`*1po*Hk8-)}f&B;e?Adef`RB;vh*Y`+!0r)snvz7e1GG%kqCsT91ao%o zT5`2OCuUB{*JycfLL}Noq7!Vm*%M!*lhi55y}N7JgkQ{#@fc>T$Di`M$}(f zV4A^+ov8b<{`VDHLjYu0i$oz8+;Yw8fBxk9fBy6ZH@|*`?}fDnsd{6>6_r;*=6R*k zRIOTDdff3HZSCVzV|{(SlarH(ER{}=jg2+xwOKP~=X3d?k>M~3!NWqnK%6*_6Y%~m`R4PRT zlM@rAQn|gO69|s=9jn#rh)j?$I&6|lO(fIa2&`ElXVxu97Hh*S_#|&4w|&?00uqtu z2jy~UYH~82Nr#QF|5*Rf@NlhG^L#%@1;fK5)lxN=El!M&k57ytV?d%_t8y+7JXw8E ztyC+On$G-bWf4F`^;*3=ITePX1mT=V7X<5)?+rk z1^=7BFtLFwDUvO#T3L`zkI>n;VbEa9UbNjTRjTJ4*Z$@AuD$KnGrxS(nv>?|N|lh4 zr*kY)c>x(P&qLp5fyaga`JeB*_RCLx_}`xX=5KZ{U)Fuwr%qeBFeq0-&-2Dhwcdex zy&}S?aA>GhtqWP|QmWR<{K z)KUS?X!En4sMZ@HdA^7Bs4+fSWs%4LO-;ezP^nTHWMM?;lLv#NjnWjhr&BD1i7751 zNCiFsj!cG8jUPWdpUVVCddsEpiGo)T1p*4iEdWPtnn0>ysgAp1ZZSzzL;wazM84Ndf?EZuYKjVFMa7Nn>KHH$J^e1!g0q}D^;VeTttFLVxU*w}a!Ma=W-)mmk$ z97P-$auQ*qUaeIpCML7#%&V__^?7HVQz=!el}a{~jd(aZGMe(!Q6uW_KPHHL-(w6L z_1fszSSFjPR?5S}L()`|P)B4T!qmk0@X)Yy*rQ{^VZ>!USfx^)9Gl4Ha*bMTbaMvb!XJ9cp2VGm^fwnC}aGiYxP+7f52xQD-`24P2Q5c?j@+p-{8PRjeZt#d> z*K~_5Sm2=W1krRdDfvLWj@<>rEwaF?h z**H(Fo+8*N8f5Jio_^XH!y_Xv@7-I-7vwHH9ecV#fk&re9ET*k%JpXRZtl zvNeGK8JQ;ll4qwQKomv3=OMt0yLYG4sTIqY)vFa`h8uCp0koD3hkCK-T95XXo>9$X zj1ALXPBn>zB-10=R$ochA)q{P?UZ$=PE1Vf-u+VGrx;@@i(zvX)3$FK1F+$zJ(bg@ zlx*GzG^gV@-K1?TMAzSdUT7rFMK+UpYWq`+v9%|iRISw*V~N5RXGGI~Ye2 ztXqizb=C*jOtKjvv>=odG#EG5ECa3vw4|`^zZvYvK|0{U}oz!BJ@zSfHnJ(xD_#y<4%--bm^L~ zW`uOhrozSXSz1I0?E}`8tKp%!Pj{ibgp*}dtu~olD+w0oSemt%p375cF(}iBk~btN zLdmY36)1E%GZQBJFE))vKcz*1NS$%mayTvQhWT2n2D)FF0%BR!FXbZ=kk8;(Z(i}b zD^Co31dm^FVb}Z_{%yBELzMGkYy2xNa&)xdbk3F$%>yGU^ zZhG%~ckh0&y{+xd*IqL@K6dAw|9j70{t`wFA;hVtoO<2c-oEsN6Glfy9=!kFKm6$r zjan20o*>a&BZ!Eg*L##1SJXAcC#Nz~-C;CQIvZ_>!FU0?7?I$9qFh;!=lPX#Y3{5! z?|Rpb$E`Si|DJvO_wP@oQl8J!>D2hx*m-B2d(CxkojY&dv7?87a{JG=ZF}m%bI-l% z)mQ!bo_lsZ^IS()=g`p5tFF9a(c;B--Szv?k&$AttsaKH&jja_6XUOW?Q0h-Sa`>; zepN1&nGfCF-LHG?>v!#Xeqf;gvdb>tzi;27g-cF5^R&L+qyPPrpBy}RIF~O3fq(t= z?>hg&a~k!=z_I>6{rM03_ZBd~)o%Ypz|t zVZ#@{{H1!e&ODFw=>+v!^+O-|aH&)|a^T>5-uvFCpWpfK-}?7kK6uOS7k6*oya|zf z#y)V%2lnjUd-tFJ^tQLXJ(W(su#m@%^hjQ7Rt7{enH1S{E zhTzt%%EN7JO|DuQK?E`jK~{dWmRY@Xgg^_IlqZx9g0vekhF+#?4Rmo)OQR8PSe5&K zA3y!XMeTqd;LNov3b+2-_7{(a8J{6=0F*ld7(?F&FYp`Wi86n1=jhH|B zj@EzroeQsj&HOL^=f2+I`m#C2H{CFI?aG#jcT@=F(E z=so!0ZZG5av=_eji{0~P7jJmu;=Q}a7S72oUDWyYAHQ$}`Mck_Xw8XT#X{FawetIW z_WbX|!{yM=GJMnec~@UCHzt zAVP7*IcFX{diW2&yX*L6$6x-cD|6ZG-|oBrp@$wK5DVtbn<|&~9XxQs`4{wb&lnpU zJ?)IsJKEYdZ{GaiLk~|(PMm%E87CZn!hH`vaIEi`@A+q)b>^J;^X|Lnuh+cw+Vd_r zcWPqtyWjiXU4QufwkNiAb#-3h$M z4h(L7bo2AOcBlM6?y@5i^+t8Ug1J{+dDZNB^BB^Wty})^r+f0bLKHUI@`W2e^pWFN zEIYXW<@^8kz$vGly7`eu1_lNi_4-@h{N`0Btwx~U!$*IA*IngG&G!RY+=8v#4H<_H z+JT{TczWSMebG7`wMH=J^jaX@n6-=tRA>N%6DKQJpp3bOV#eh*%Ycv@Zk)3ToDTFP z^l&u11OQ}Sty(>9>2aN1oqzk=-z)$plv~djYw-%t*yPZ06Amtt`9+t67H=VfM5mBY z1~i^cp->rabun(JLg$?r2{!q7Sjx*-fYSs4kj+G~# z*w@#0=-`32VtXTu6cr`lCp$(`cnRzYYvf{Ub0cb4uJ%5w3KBvCv4uk0r1DQHSsW8` z0zeQ#2DBy^Kuo98Pj26S#pRdHn?LW!k)sToHhLH$yDcd()&m6h-&$wFg5fb(eak|jMoJ$K)8cP5jSt752i8VQJm zZr4fUIo{S$%2t=|5|wcxcf>XXG@+O}D~S|sv}_Oo2#APhGnw&`v6uJmTekf8!Ty24 zq2X*U8*%R1BTX+Yjc6oV?L{Rd02Z@c`VqCK&`i*bOREaGziO@l>Pbqy6M~d##>|>Z zWH^WSX)5VAUTI5cF)a~eY-*~sV#Ug~_O`80Y^~L5xqM#m$P8Mig>9Pz0Hi`d%{*fo zTE{OW-(FAdXJ*?}+>wy`6d9shxJAS~pYz6+$G2Q^$tC*_9GIFcdA>^j%{7`QH0sp7Xz)oAi#nXQt+lxHThiU(kn?{% zQj@uGLmSZPD6_7P&C}Frh{O^|6F5){GcKn||0ml)Q;?^cjrS6JF5b2NPZBHktvhRq zkKJUQo&2#g_ZFAik*kf)2%Y9*1h)fhZrwTK*7~?4N8^JunOS#oTFO*jJ(0_EEc`Tc zYw9uiryJ3X}mZq}MZ!d4UcT=7cPv`45CEo1rFAE+`R;fB?UGB^?|o_4)WrA~ zzVOA*eEPE#iq7_qkACbUOO9LGXhfBA<*nDf_4RLf9gq0X$jH#}(BR;};K1PM=-9;M zR4SFZ?yYZm^=qyoz>$%mbI(5e<`3MQ%jb)2#p`dl{_FpI+ohLZvitd6GiT2J*1!Gx zTi<%^z_EdK>rTGywy&Rc=IM`Yd}wA**SEg;ua{qP#n{-mAEZo)H#vnymXt~aw4P|J zWtS&guv&eSfQ;t%Sk70m!@WlUVi-m#-~Zy5zI^!=m+#-VKUc`V@l9`>IdfLT#ni;) zRad^|pT72$Su?wzd-};WC$0M0m%lP^&b;yQvFmTRe#6D<0jXZA=W@9ZeDM93U4C(? zT$-4goSd4Rnwp%NnylCBrBZp>vJ*b`iI1In#;K)Bxmu~OTet4kPke0V>{h%dKK|)Xj17&x?$xjR-hX^gKr}g70z`R;vbNHA#pPH2 zW|V>4#- z3=a*y{T=VP`TaKs>2$SPW6To->UdMnp5~OOAtj7VmoD)q^D*^y;ff=8F_Qq8wt}c!bPLA|WjSNqocJ_>qT)i;GI2UAP zl`#Y+-zt?#rz3_voxz;h#f5V^=FIDS`0241Ul=}Xc~>Dt-Ffey|Ka5Kym6k-CklS$ zGw)yViFd6`Gh!TWz2)T3d}xgbt9^YFm!C8D)=#dvVna{Z2(w=J`YRTE@`ER>KEC+; z%Y)%m?PJ$2zxmzE0$zXmncmqw{y)BV^|`Ct1_mZCJ#XPRKYQxQC*;ee`o(9=y86nw zEJI8{Sc|SYfA+UOzi!n$=sSFD>Ac_@A6x$JD|#kI>MIv_e&?Ugy5==YckUVzLcHyD zi#z6L>LC&!s103-*IgxTSS*`nV17(HV>}`NApjAhFv@1q6XWB*_~|cr$WK^y-0D>) zU48W%x9@oRz=4CAbXqO6A%>0Uq6;s&>Amk;xMcD8_{8}atpD5>{@?4be&bZR;`_n7 z-+kk%6Hgo)8GGlu-*xS^*G^1ME?>UyLQIRS^dZQUw(OCJqkI6`FtK2-gwhZuYdjP_UwLv1i$&_ zo8SDVHy!IeHnVHyhd=t!wI`jl`-PWIUbps^4}Kts# zhKC0Gjt#v1t#99O@rH@9@nXLCr7wT^taH!WvwLq_N5_Xh_R$Z2>?4IjZgO(!rgz`? zu6Mt4e02Qik)s!1cF8RtzQy;wFp5-s*tNUNm zrM|%!u2JK1UjD59)0r03Jf|k8lvoWaH?R@ZUfO&w3z{vpjnNZtZT9M$I%xH#(dxJ@9RHu6?e0enWJhALG2AfreC&)@g3OuH#HNz#n+jUAf66V zQljwY5GLL>LO zRwS0Clk%Wed-eV!ea3hyojP#f;M7!k`O1}ogdoKov@OSmp#nDjRuuQA7QSf}%&|a* znysnrqRp0{w`g1&#%cLS#27ZhMkbqCxnjkkLkIf@`_t)+;5?BQY0)+)X6aBV9=^o% zLjH|bx?^{Oty$HgXcZ<#9{Z;t9;AX}$NCQ+J#zY~r*W?LrYTvGKuizCT{9!l?{NmL zDlIP!()533o-J>D<%=lEHcEP@zt=)5Jye2c{3aSLa_))C2O{{!AnLTLY{Di9jB|`H zNZ4LYBq}W>3NYDgout=;cAT>O5)I{bVTILky_93rtqFhIWW2G>DtoSTXiZcyHeBwU zL_{za-U7>nPLu9~z+~0kVSqs&Dia!O&HP3BMA-ks;-G5S%+HdMVvVbOENcBQJF&?b zr#6)66p0uuXc{VLYCBK5=F-3pQ;LA`?wT5u5~ZJtf2Wh2PNvyT8Ej%wdAo#})$T*S z{@s3Qo`I(IljJ}PG3Ibp`8;N?5QCjVrg>fxTQH;ym@kG0goai@wa>LeQe7U>(-sr)zvvVJb2lqm+pRP&!7Kv&&(O!mGab~ zqenjdsZZ{BYR3u7R{r|ezk2`8H{bq~+m|d_vS!WdPkrK3-}vS?x_f%wdhK;1Bcs_& zCW@kFOGAz#Sb-pN1lq2IkV9`_)Y3khFyFEJg%u9~pS#8?HY0{0nY* z|INSs-ETTOx?c6_t4><8CW^u!mHNkj{M_>|K6~T!H)`>1)OspaRykamjCppKVR{xD>rPo z=udyVoB6?+XP&wL<$b^Z{qL78J8^Ju=>Gfe`{EbB#CiDmqmO>;-@d(m!$o)h@t$k0 zy=KRbCqMTOp96p=wmiP-#MQZcp%I3@9{_;oVXa=vX0va9+x3x%-g3<~NBfSfShn&9 zKmO0peD>4#-uu_(E0%raBe#6>Ti^WRKYl5lPF?Y;%Wr(oO&uK_4{zFd%LhMn%SS)* ziO+oMrkmdV%U}KCBOm)%E>mEhFE|HM8-);Xd~EFSp+n#M!S^40;QpzpayFeA7#J*9 z%IGly>a!Of8LkE;yd23cHX*9yiZ+K#`jEiR-{?D(h zz4a83+_}#$=H7Gl(tkc>Mx!C*p$dWsWj&A}hK%%C197)a z`s`=<5+IgXMoxscAOs+gV1N(_@)*vT(E|Xly7HTNIXdNE(fA$qdB zMG)00)g4bg^^>3e_~pHOKmLhNUVGiO|M`O--hTTpmaka$oqzxK$?Mi`d~oC7z+kOf zZ8RE_lT#BD6ZhPG_aA=$`)n?E+dqGO!-n<0{KYQ^hK9$+$D@cd&ldorBcrA9^6>EJ z9l!d`aZ8V%Icw&JKlIVg&d!TBT=Kftz3$_;e(bM*y(g2--u!`^-}R0ge)aSJnKO6p z8{hcGYp;3p#!V03d;i}~J?(Vg3%IDD@a0?If*|$CBaeJ}<3mRe9|C|M{rD#v*02BL zoqxFU%BxO3^^_ZKc-M2!JUeq%&wFlu@2RJqGB!50bn)Vw-gDDezW(*!-tpT;SbKcS z|VwNK%-SQGfvSk~)GuWl6pE4TL;)O|=Jv09^1~KDT@Ko)s%r zE?Tm9&+eCqNS+NJBbNo2CWbY2x)RSeFQjU$=_*FDNX4)~J!pd$h_516-AM};EuH!`i<9IGd?!DWbqOJSh95K zukZNvOS@iJf5G|R|K5L|xN22Ld&h$hJUlTmannsVz2WMsfynoR$%(OVfBV~a{oxN! zZhi6%SHHfer@K;GaK@QuKK1ldeZ7a5op4+bq&9EbyyK}I3l=Qdx9{aY-gVclw|;!h z>NT4m*|c}xz8l~Dp1Jeq?cTlnkAM2p@Yv|Q*>f9>x&}Ky`W-l}NCOE~kw%Kl%10CX zLF&@q^Jl6pdz&Btk9oCfb=}G9UU=r&t=pdLnK1*I_r%t16XWB6aKZ`4wYBGqg~G=_ z@$t4|`{BcfGnw3~l`GQO!k_NG=c`}+;@UN9p4_@+{e}yBj~u=KzK3S^%=qw!K77(i zCyh;v6>|B*hYo%Jzkax5$J0BXdiul@PweRI=xFagdF{GK9(i=IzyJIT*AMm&ZFzKy zAEXv6Sn$NwZI5n#dQWI<)nvr~Y>T16`e6zV8!}ANb5; z9`m|8yJyUp`M1B`ceJnfxZ_Uf>+k!Ypa1eJU-{C4dGnW_xO{SA@@GH!SzAYYKA(N) zfsM~R^IWA|X>0HJ;~(x0Qt2Q3;QKGXy!R8gelnNI1%byocYR&Nd9F~{_QcjZ?)Y_k zTU%FGSG`_q)I;C*5mBB#P^~xQf>Ji0J9OaC1NYsJ=oO0XM~@s`v3z;p`Aok?(detT zfhtya&zX$>=86Cs-1^Fw$OH?8jK>Rvk652s3%QaEQ$aY?uL$RoWEKR?pm*0pob)W$~!-*8S(kYY2sGIQF3 zz5)K}_n*~P2+9++Su=BOJw2?IvnI9b9zkhPF%)DT1Y;xyQJD+)aXW;uJXmDUC;(~ctuU6~z1_1hg z>fnJxyPkW#*w&s3{G*4Cu3Wu3TWqVNmV0TgcCwKlgEOs_J zg|7QFkgC~PHD8GkX*!sIail|}F_(Qn9TY(X09=T4 zDs|$DmAhVeA&Mf;^H7!mOa}tuP1w#6ZCZwO2HzB{qu!Ch7@82>ZNZ#x=zc04mif?y z_lyyN=X;Y=6Nio-UcPMEf&KddfFUCgfGBJKn}Dthq?@)qoBW6?3-${Kx9N39Clfj? zwUQ3iow{n*85<==gz6^}0YCn@;{o8MJ$tg5ED;CLTT>8XytYzJE=ldS0reaTAs8YM z3HhcrH$Y;{VpBa^DPJlmv@OR24fTuO#R}jBUbRwvY0sYJ%a$EEbhuKhve@CA7N^AN zV#UjxlQRu$amNtbUjtH^i2&lcngpSZ&r4uat%*)HMyGhlv>McV`d!9bK`aSH>r)&&bqyciVY35T)C<+Js2@Y?C+T{cRq=@J=r*8tPzI! ze16fQMTZU@nwXqSr_#D6E_ul;Ts+kV`V*DCK!~08iVT?ZK4Wq&JtEhdIkRgPg!qRt zmSUbaIW>9c@S#4t1GCGnmk=FlLBB#!AYpn;=T4M~Nfh)#{lCn>K zCl{8mdPYhA4^GB55R-nr!_!VGZtMVLw#9zRTI4^R=BfEF3ji!Bl65hl^1yCkMVt;4 zW3#QYQHrDQB6X7^d`5XdaSvluiwl6$hwUtBhU_YdTZVzC_1&>Gu?JlNiXjXu4z8R# zb2bw(o+>_S1A!5Mnu}{<332B%76L>T7ixW=fuSVW9FVm_awO9Us{55@L=2@VS{QSv zE_DWa^P-EKBx8E+cDY)Pl2leaCVfT&4Vg99WFN%TP#rajtx%cYQTm8i+Rozq0P=0c>KH!${Fv_t0D6-%Nson*fSI#rPfk^* z%9TP#d)LhFdRP}i1b&JDJiv4itULK6&-c@r+`zGcAAJ9ZM|=A@;ot7P|K|6-d*0kR z7hZ5~Z|{*EJ9Z%RcJF@SuDbvLJkM{0^^uXW!1tbfa{CQ8ykphsRZA8x>Fn&>wsjkT z$QO!0kjrFK*=&1P=VYlA38>X-`L@FS58nIHk9_o&4}a+DYu?<|-f`1S@A<-)zP$a( zC)?TzVHg3^mPUo5&GKWkNqu294O_8@uNx#Tx8hg+1CW$etCj=+@ z6!R;) zdtKM(LS)t$(y;ipj`oRBSIx>clh5|A!P(>ToVAYGXjZNL^+0X>C9pux5c2)o1LxQ* z)Y#cv4XDYBo_A-T0yHd>fgAbHM&7s=srjHP9}upbnWa}f!0jqqxHA-bEnj~*x?A?m8Q+x-lPvu7 z;6JEIi-<`2fnZf&l_)zKI#1n}{m3wXAw|LL=$7}ovni&@iB<&x~{3Y}ED6)tabEaQVJ!eLH0_S|EOS0`f;Y)L?x3%H576LoiIIKQq z8AqyyyxEy-?TKg#b4Sh}Xr$p5ooF+Wu0H$jZskBk58#4T8n4RvVv~UCfQQ}MvfSa( zL&!tUg}~ntQZaN|#CX|}U+S@qwU{i+Mc!x@^>G}Bu5nTE0Znw+V9|U{ zdS(*ZSqlwCMGa4c>z7iM!{zm7g(B_KbCQQ*->0LG=Wfs60GssjwCzHz@gT5q7D{%& zfr7JVd?*Nx1jK8dPxM*M@4KnbF}KmNF~2*Ka36?!Em~Em_m-9-10t6xV3@1YGS_o zv$6gTFw_xMq=+pfC%abn+;#+E?0DMW26*!C@1hSH`iWUy@uL)$oJ*evv|jIx=lWK3 z3uTV|<1kHhbHm%5Aj`i}lBSLb^r%KAvR?C- znRk?mdyNR;>14<8%I7V!_4FL~Mh}k#cv)DK>9GsKV3_rmKam@tNLZ>T^r`T^u>Ebo z${&JZ0?B{%L*+`2CIw@L$#uo+G)v5>(5RCg6_%>)BH%uH*_@AfYE<&uL$Vg1@6K^` zxsSFieo>Y`^$!IH+=pMulQS_m3m5v-xzhb~;A}}}+9i7Wk!`~tm{QTiDuS8_g^scB z^)~>nYoCPMjX7Dyk(A!g6m;c<{PV7H=qt@6y%U7CX_LUJ>QPm;wO8m-MEvS#3 zj1r{fWn=6eeFtSi`7sVQ9zAD&wyY6oI;#T6jVrD7KnnLNxMPDb?W+wbcPR8?n25v@ zrsuI^S7sGn6gy7i6FvG^_d;MezHn+KrDE~5hCmJEGBTc9jVSk7nV+W_9ERj4 z0!xvYa!AiD5f-}BVje3~1BqfV8kFb)d&8_Oj4hZ9A;iWY@OoN)V{e5EuThn;{O?ov z&x~#1oFJjy^TkfH*QZ;e?9;@=FYCslSg}!;;SBpDvYT-3|5}2t<){vaxLMdJ3k~hP z9k3N?;{y@Cbg~dnSV33Yb>}l9Ke9-*D>2nw`{lHps&9>O?B{`BmQn_~sq7>u|*kT;k zT#h4TE0xLpjjd*tb*37|@I$bq1SESz>KUl^_D+j~gMIrNJy@};fsFk%^Dp@WQ_F0hcQTLLt@mHPQ zHmA>rOiKoi{Ruf<_+Eng1?O)!i>sZxaD6*?VgWUSZB}61_&{? zV_7Wq3;O&{4@!;NIkd?~(H8<-t4>yVLfH(=MrJua9*t^;2PX>;L%>GVbNg8T{^^#0 zapkIS+xyk~QS@yM=-Iix??!tOMs+_sX$9Z{Yi-`gU9ZnoKE1PjkFrdsOLaeFX|rQ` z;P)q^(gmVDjL*+-0olq`Lu#nk_;nC?>^hzt)B+1KXIWgP&VwH0?#pOj_w#n!g`0_9 zBBE2^G9WYBu>>in!!!?ND&#>6pLl+ktP0$|>FZ3OL7 zc>!@CF8odMSOI9nXzI3CTp=`q_&)4Pk6d8oj7(%bj zV7+uX1;m_xKVZZ2-;5her$%||_s6o^-zW0#svzlXW-s02zCL>uJXBTMxA{6Yt-CPi zo(F#so;;obTy>}VwWA;_c3-4*FjfkQ5GQK_l8W)RF<>w{Jh8~6RkSC*yK!=MxwY~% zk_CpD$;G!Sf@bTVCL+qBaBM;@7g7_AlNb#xP3sSmn-#>8}O>M6k6Kmj96MGa{xGgK@ zyjFCZo)#EUlGA>>ocGj!`%8jm7nCIOlqXm3)M!Xy@ex0>><(3}_=ED_?ek8L;Q*~{ z-^UT9bEO~O&7n1z9+pmH`I{W^I@DZQoKHg@$!8BXt-a6PkEiIEa^82U_M1ACcwEP# z&OYmVd(rM>Ig%dT#?2!dIwctRENvWx5ja0R4 z$MD5`Bt-V=?ta%SQo9pq^-X8l^A|P&1JRUxutI=TG(0YV55YIYlQis9MlO^_)Gr4D zUKE&y3y8ZhUCh{F%GmZmBsUOnbSMBxxBS0=-)j$&&6Ua>+Y`rf^_r(&etVC`-cz$w zB58O7m25kUAs=d99 zz)(+oG8ng_8<4lFI`1;{#=9rXXSyzeneJ|GW-OBZ{f*6XJ?~=Qu0uobNU}0$EA`q# z;BvrSw(nh;HXXG}L$|lYVnJ5C-Yb`b)*d&?B0FqSJ=qD!l_V)gF*la$dth3+nKqj3 z4d;#3rH+5m7t>buH8}6TZu-lL=hWSqe>0jp5lr9{IEE8ZK-UXbKSu6P z*EPy#O-A!3yL6Z>-tBO2e)+QG^JuP*3EPAj17fE~Bfez({_~@kAR_eRoE z{HQTX`l3wU3eS;j6@>gq^>kGH$0{j$X|`1D*|794J#B0VMzZ)0g2+#=y5?%v%dKFb z^fSCC>@mlK!O;O3+nlSw*lq+bHIx-9XiVmZ`Zl2rk6(jx+T79+P6;Z0qg0_Om4-l@ zWI5I8d~@1krvvR^NWZ=g=Gv`nNyq|6iLX2+IzEhW^LyKRllseux z1e^n;KSwf+btlzi`2B{s_Yc)->^6J+{r!i-ht+6{81OJY6RdbBiT9z8<=2#?DUM#J z4Yr^+Y70c*1F5xCrr$vxz;752R)jM1mS0kL=+yu6XE}wbT+PRCAC**%WQmQpv9^Ij zEE1Pt?QxWC!!u9z0kcG@Sg)eqywy+&D{ewf=^ycrltI`R-YSmCKR47r+GLmA=L0)L z=@hmWvQvl?ASq30QI^o#=M)w`q8TC@iq^2lAF$1RcM(nb#{=??Sha(-?>1~^Q-){a z>OfD|3+Pw_A?DqAe^2oH?UDnU=~BLyp7t`rBcpVYCxzm< z$FoJGM8I&3fcQnpSyn58c1qBAgjU|vCd$6bh2--JSy5LT@F<$dt4Fy~e!;*(bFJBk zsFC)8Go^N5EU8x*j>&RpPLu98+x;Lme4dcJ!U}YN) zrAU$o*>n_gx0#+MANk}2|Fh}*VrMm$1ZnCsgN5)fQ+$bz%1Z0)UbIu6%V6Kv0ik!< z@u=GPNv@8|qc4%TBz#NDvy+$8xo;=`${D+FjY*!zvRyeXZZp^4-_rF2a-Vxr9n(kG zRy|$#JGTQ#ynHzcya3Vp=gbjNwsotO%U;xCK#Mq&c+xO7DlxCq_^R(?Uu82;s{CJv z;6*%ewPq`0E67FJF4$dmzl>PlzdbSmuT#%`zG`2i5v=wc-#5V2a>2KL3-JZKVhCrQ zt_}|LD91%pNqgP8+Z4YcL5k=TB5Q~qBJ&&Skv*f?;yp4UVh?G}jw?LI(!xeoCx5v2ZEl>K*^@15sMU#!EQR&`mgz zp{OJt0CPOn_rw?`aM0(WkR&=b*44=cXl7R9eGTF2FtzYbU*2rC|eSP=dyB_a)On-ma^gUVVdWEd7AG)t)0)|}2ao+vOL1Mr^@Gb*wI-bM9 z%uX%FFn(=$yENI=MOWRj^|+ryM3TvU|8fneTr;b)r;lCdaM?uJS79=w)R|*W4Y+|| z5XeM2Vke-%lbMbJMIL+aAoNz61y?bK_v<4%w8_=vmUO+>4#h?z{;_XVsl&(L4vVPh z4&HF#qW^p!T5I#GZG;@<6?G;_@GMuFi+s%^%p7UTd-2B+ML{Qwbv*$q2vs^>PycG- z#>_jhx7SVid(RW=&yog!f4{>)6w^!4p%E{%^KNaxnsEH+lB z&(CICj_g0dd!G9o40%>*y#&WrblOhWPOIN^?0ysAFS~d8akeb@ax8S(e$unu{gken z>sjS`SFr`RPprYmdmDc)@Veo0ek5z^bvoB5)agi~a;G=Xc-_|NdUWd4k?82C*|J#xb9(v>@O2+dY@X^g8@QbX z1AR19?@!I`*R3yr3^hAD`Px|he!a3C`}|PZyyiWgo4e9hsb4;0u^V2BB(9XKI|PsL zEF~4fySxk#roFeq%d0$(InabUSP);@->*`ubG+{W&uK7#Z_MKJeG8FgstTPI6>J8m z5}}^4UVDzYua~~BT;f}8&3b&ioL4i`ia=!qizImbA5{Ce#8*##L5zWSt&ZeAfw^#k z3$eXfW_SvigUW|Xa>&Hb#R4d-f)d!EPZ(1chU$)(=+fQlTr5_&OBw5{vtI|8QF=cM zuw6Z_#EVH87hfb69`7wuRIyShxAgQO1i8zdt}B_zS`TG&tNmRn7coDaqB1}M;qDpy=#Ux9R^32{=Rk2<6oEwhcxrj`Jc*#N zLnmHoI8nrieNTD?Y+=(#;w3^tsG_OA{xAp-q4Srfrl!qJL&;IH4RP#zxq`%?pYRlcm<{bnu19AuT?U zWU><12dmVfE$Vyf(~5{B$7Jjyg0tcOwig;RvWV6E@Q zGn%_F-$cUn-^Im6$fSz__Q=J=0Whv#2YUfvtfJ|???mmhvLE}2kFloVdc|&KXlI7G zR1ZuiicystP%;acIMfR(<>w%^Q6Zszl5ig_8a+a&V+Ck6_C~W$;np@b&~eFjJ&#^j z+HTOcOxHegDG}$JZWEiJ2#k}HS~TK=oSaweci6xu{%EcyZ9B`Ghq5#njdyG_H(^RtaQj zAZLwTo=dd#o1^5L;qfx^ZsGaUO^LzHk ziN;IL+~5{Bt&y4oK4t%tox1-FJ^d@uvi0CL>OlHK!!=mo;Fps*>rY}{hr@+E&P(NSm_?r0*2{?^<5S4za-8itRKZmWC*;PJHz5_fOe5D~e-V`Y(@~ zu1^}-ykYkx*?@R}UgR|w*1<<2uoW)2#{xC;ZIl&E8b&H}Lpn1?h8U2)`B%~RuKxXE zar|w1zH6z3lX&@RLBJQdosBB$&E|fOWp-aBSNm+dHdl0?{FAIy8T#?QjUaSFLO8UK z{My;+`!>C5mg7Fxn@PNMIRjDqXEszIDV_tSnAulCSH!&z?tVM1#?`gcACLNsCfIu#jOo9TJ58A>%!44lKF#H4ZGiKjz!a&plE{!8YhSXO7J;dz=|llzm1 z8%hU=_wA48y1w$Q^Z2g4=yJZ-FWdTh3_^0ws;HW5yibqy>upYHO68XBJI}rDJws#f zOjXjIcpcB&_oJetkr@l(-VZ|G)0uXJ>_!*{V~8@j%qDk>z~gE2`u+Tx ztNVP<_u)lIL0-Z6*2(uB;hkeb=q86?U4WhQ1ugfDANu*W+SmEt=i;u*jOLZsR8LB( z;uxXLAiAoyE$Q=o=AE2#5`m@V_4(osN@3o_$5Wzi!OIbYml?CSd|gI>MfE&Kl|x8G zB#ZEO<6 zmR{*(b5i9c60Z_!L%(v)%7yIn=3&tPL@wrOB68#Y0V#Dq2lyejf@3Eq#NG084cy-n zWEH-`D5Xoid+(o}znhM4U_-K%7g~L{uGg2}YLDlA4)v&#sVGa)S1vDn?z-MT4(4{b?ft)q;`ZB756jKRq9s__oi~_S8|-jwWZb)aJW5rM0MAhPm1Oa`L@2tL?IJr1MsQ zKY5Xl(x$t(JK!)hm(ly$?0N0(3Crhd5fTXFWaV%bY#r@I3tj`$Gd~*f#Dg`mq?b;( zp1VFp2AlXw0vOTVn2#tvK*F!{{Po=T+|wqa2i@xh;@aKryxasR#&KWec0K=A?Yj~Q zdW9i6q^}HJTtqT;s+Foum$Jt`ATynu9iPg=9Rm8HL>9s*2_D``y{qj4;%6ZIKf5mU zhd*U}&js)Z+xk3bjxcpwO(qmQ-*vql>`C!?@~V_#W32hEd$XC2cib&Czg$)ctpa}n z4}IU2iz?SOr|D-vZ(*(la$&>6;jhnkB>Xk+jT)VM|3<12Sr6A=&-LzCpTC=Vn)QXV z2q9k74if7D?Ke__cbD<`q|ghuTW7se9__sC`YVmkbOtZ~o^9RVoo#(ROLaZ&(#=e7 zN6qQ5QIk;LriHw3VMyHGfw%;lT};^eI6+JCtcGkY73KhBbpfpm~R|=U2f^tcF#sN)i31GcP z{Fw;IZ4(>k_3A_QWIC*%#(-G2&_xZDr&wQ0kV}e4_EwQAQu!(D_C|x)yh!mVGbAOMC9SWpN&0xo@qkS8ST^%>2C z_4D>`CF2jSI|rDv@e(pB^C)7aWt-%F1HX8cE!kIV?aK_C!DMrFRTqi9n(uFi#aS*#KZ{4R1V+sC1ye_w zaeB15Sy=kL2>Cf57Pe!7^ZPizH#B{a_0Xx0oK5$X)@VYO(>xY|j42oBL}0 z#^0Tt)+SB>^N!$};+M9MRl*HtOkHNWHbzty7{@qzX#wY!z#)^oX=k^t{fll?^ykV~ zOOF-myo``Xl#0WNoWDV%fN?9FJ_&0$?LBj~w|3UsbxNTqkd0GEe76TW8J&HE%BIjS z28)f}eh(~#t!UA5W8FhHU_S6Qt^)?sdTFI#QRDCkLmOo~D%z@U_}3ZrTIA;ox~M)D zxD;j&M1|$>BADg6H>|(-du}}%RDoEr%d$Agd?uu3gf^}a^2@`%(6azcWfqivCqa^Xo!>~FJF5Pwb~D*gsnOm(z7*r`C1pL z4_FCg8I*B2O2!B1D|1orj;K7W0TLfX%Kp~MsE~DqbVexnl%k@NjucDQwsGa!;E>ekl^>_vcU+(zLEfJQkn?DuoVe``v6e);I zj0{TLQbBtJ&(mWt#){FiqWU}lnd#|7$ZHQ*==m{mxmn+7GQ=#$^X_txWW?lZC{Lxl zN~_cKHk_`!ap_FJ^RD~FfiV;9#qV*gBE7!H!`scI@47>~a)94uFWrn@x5m!S?&5Ng z81Nwx5n0b_JJ+%E*q*%rbIcy=BCdhgW@)jDOG9IBjnU&DVT1K}<7|QKS&L-%wg1{U zfXbU&kHYd|OG%CKKf=C^+T@sk$FEGCu9sX)@Y2L~2n#>knOv-1rwVUOI zdP||*1JTw`$v4uqCKhkw2Y{M5=9D%JNFa^hw+0&uO?5@zH5HJ zRnsx`ig-dreZ6mp zqhvifT^@)P@v<<`p_{Azb? zypg-wUp^3+d_fK=q{fbyE@B%sp0$u5 zPRNik!@t$mv<0Ra$pA$KxrWBZAFPWit$l^mh$^kRF<};s+IS(rk;tf-#t=)huVLs?IDLIoW4~Eay4| zJoWislbnI1nD6SvS!N9JVf7r{sdYclMGzfn4wQPwMn~;O!bN>+97*Qa`!#`0$eZ&E zN#k?N@4_R=!pYg$FF|$twl3 zf2hxh_@0%|iJ&5j)s|ket}Z|dt^qnlGk_TYuzdlu`XIkzjBrV_E)VtO&v+|tab5~3 z*c<3v7RjvnBj;FmU^mSDTv5-|aq*(%Xew|!GyPvRfF48OylL z**7!dXZonT9*O!ZNpYzVh4`phR`swU;C{TXxnzYGt zm3qzQms^9){DM4!@eq@lx(@i%UzHu4^{94~AP^LG$R@DA`!A0-mdjPGUrp{21;rXm z>Xt)=MbEn5bMtjKf(QgXbPprG(q_F3crk8g)WY4PsAJSQSd6>L!Fd$s8_!tVSinr> zLz(GwQp;e72apIYS)!ip@F&CR1v1^}t!|XtIb9P24ddh^dC6e3QC18CL%0W8+T5fs zk)4sEaL`B*yz~cADxTH@e`KB#W)6BrYjNkV% z-=w)h7R@?0Z>w`z>dn^QV7xmABl@@Mc1J=&Ljm>8;B4hlZUX^DIZjR+fK@R&*}>?nt7&L%3ZjIHN&2~^g5w;L=GJzPDgSqKaTeFvdupir<5 z;2Ga)Go+4WxvsgV8h8wMxL*Ugw59d+Zl}Y9@XPRQKGz)gr}R>%r^Wpoom!*C6CTGH zLP3Z7+;ex65#w76fy6OHXU*gkrc!bR3Y^Gtlp}aBctCRjk*V#V2OydP6_kR>A7J}o zoBDqcMY((i+4S_A6k!SX@*7oTPfGX&L55v0iJ&una%6{WhWLCU!~_Y~YJ&e1hN79( zX-$RxDj2b}L%_MViTMf^x5~D*FRT1R>arqV1{+8d4y#&hRtnGZ3*8_nzVb@~*rutU zKOLN#{)NMlB4@7lmt_0*oTLB~y*4_{xz7bTbt!Ea?zoHa z62TrixtFo?vfy*{IK>?uocuGb6SX4)BvLg-fX;Z=#3^(EtRP-Uu^4g)!}s0Ajhvj4 zNL^f9;7S1$F?p(iegFLXZj^TztEx}{te*8QC0_dzQ{;u)K$ZT8MnHM-?o z{;OQ(#_)|OW${Rq`1Z~#!J;uvapd|{WAKAC84@@Rq_F`;O#}{aqK^WqLxH5wZaG}v zJ`!M1F*c8Wr`&GdS0OG8LuN!w1MkVF;1{V7!H%1}K#X#@b4zC4U&$>~v*I3a4Ppre zL{qIaFRJEU-shQIeP3~3cif}@nf$v)ene63LqEzIptLZgR-qBvef~q>kI?D`@1I@}_j*4Ld%xX<1qHipkQ#Qf5-MO0Zx? z*Bnb08jW(4$$Nfi0A?30nf3vCj}78pq;f03l&zp)`E5XxGqZC3I4e?@5ip!VarU4i z0Ri9rXNtauK0sJ+YT`7Zx42N_?dPWqqE3|s5Z}4LsmG(Bl#xN3`Ww$jQ;lne>ZbD})<)JK0vS1U8yivkc1)8pqJF8h#d zz3lAsj?HY(yN;WF-?ooP-s^N4vRKAgpqaV3l<|F@d8T6fjcBak#-XOP3+a8KjEfu; zdh|l(lanLNEHu=Qmbc8mXUmc@tpa^XHcC$;RhyC5!q#k|0}PJ`Vf+4(3#Oxhhc58K3E8&CrsK|i6QHU4~Yz{;9{qh+XP z06it4j%Z9gq!{(&BbMN%e*E&4X*Hem<`dLRIXNmBJA7ivr1^jMKqXs&~g9heD9z6fW(b0@I8b5VUMiWEdI$?^_b`Y;5(*dnMhnF{dSvE@=TJ?xoL=A z1_hsjHMV-HF$+*PVB3iS;Y9w`|8-{8F|6?;uWbPj8m(?EE3uTg3&%uw2!?;qkg21F zzWeTWtkBx>GVU)GakAe_GNKKmJmt;i@IjJsqajFa5+HG{kUfOA{$r-Ly)oM|HM;KZ zW5wkr>)ebiQTXByjuHNuso(${4gM@LhXU=#jH1Z1 zn^aW=kRiA22|UT;2pdlcivmOTOA)3XFuJ!cHHIwVo@T=`-!z}_gRKz)g!PF1E6E$ zdLD~k_H$j=0AJKu>+_k=%57+PX{j7%FAoJn;Am(ubuaI7az+)fIc2*x*ym-a+7Yp_gB97?|uQ|*uirdh!*~|8A(vdgo^}LEyTqhCprj+O~CLG(3U3c z9U-j?JDMrrnL-i{&W0d!A|2o3b4V=TYiJMV@n9f8Lb7lBV(k? zmD@uK5#=yjq<+e z=)sXlpCq}-A2$HXE?PS=0Mv?OJ3d10P$8`w&~c_WPFNWGy7=rA(4@d@JetLl2pgoF zHe%wRH;Fhc!n>XrTYv~F!B79`>Qr9`TO!Lbla%dmNbPk79m{?p+{%MeI44OF55*GSZ>Mh^QgCOanMd6cx4$fsJoE%r7V_QoB$R z8i|{1^k9e;7M(&`7=qigtqXPpeaEs!aaFsUdX4$hl}Y}{?9VTx<*5Mu;n)pHwkT|4$E1TgnF?4kQLE(pqgu^T<${`OArW&v6pWMVrQu`Lz$N-A?%0!`8!G4?C<6ztY|J#_W>Ql$!f3|7U*IK~D# z6c&QY!G7?FtJj4CsPk!!-&oh=zF83T)9Ker0ya7l{wm#R( zQY7wHuOX3)9S1%C0hNHQ>N?Odyd5iO|1gBH=XvO~#KP>cg!+MsJyFF4A^z*)Cs8>C zdG|2D^|ElFNsF_vh+jZ?LQd&kmYxA3-!ntOvZQU9L&NR~(=tZbEMb-z41zQvVa-CR zYOzg4MfNbKj_lR7PEJlTqp&Rk=`y=d@}quPU+9(#lJrO)qCN}IX;iIry_WKwKY0sk zP;7)r2Lz!Kriq1!w$Fb*N`v+K~2&Lae>coxvwUcPI9|#nI?`9J2-D z${UKlZzKD;tGmzoagdp#*-&CPz&4`iIL1L$t>d|Kp{&JDvBQUb11})#y%ZesRPvk{ z$(A#SA3dAEo0a!fgBkMcmU!CAZnoZ!Tz6{;JdQ_^@V^?`D z>oBd=_)HtezTCNX`?~Bq0>77)nzw?|%i%%dWfkk7Sb@vFkVq~oz#HX#FJK37DC=K` zPi=ihI5aw+XxEW_ZjTLS2@GkI$qd&=%WC{{N|QiSNRl)76yZH-T&(Nz*^;lWz6yP>a3sua;eMp-|jFmoMcPi zsdX?E6&pI_P%3zA>3?3c9e8MlKFZUSsBhN?%5omY^g(O&y6u~0zdGc=hxyLI{#rQ_ z6Ug{Ay0lJs#@m1QD}foc>rY=|UJ+mVh@8`w9Xlt7cWhBRjk}#!(4*#51fkfHQ~y`% z+OXLN(`*)68HS9gbcgttxs_j6Yri7-vWsw5gR5LsK{DUA(1&(@u%Sis3^H2;#Wyrd zU*R$R#0x6XC^Kap0>urp8Nn$xsx&eZHHu>4p^IH9-G*h%oASN`FL&!bv-< z&;VFOvLKI6RN(-V-W}3NvMQy|q^zx#*&}n@xER$ew+WI!!%0}()Ns$dWTy>%yxba_ z_}@|pfkR{(nKa(g7p4iOE5`=h%2vn8!YTMM6`axoE;uS{U6iMmN8E40%m3tbq7Je? zK=J;LMuuCE`S_f!uQ#b8IdCV_s%*xIW!U-mI7aqcpSa$hf;1>vN&1x%69v>ly`w7R z{e5eV%C$m2>5w|&jkN3f`vSN+Z9uY8gjU6n)re9QBLW`7@d?UA{11;kgq#xe83tP# zB$_}I0pg~@l7K3q#qy)x3V|!B!B>T^T#TWd9kCfmkeq_1@GSmJ9iYEP1$HEp!w$xX zO)E$-Dex%*KHVV061=~{c8rRO!X_Y!24OxFR*5QfB4Zml=t(b z@G!VGSHu0cfz_U_k4J&aJY{m0oU8HIu5{)1U#L2B2(xAvGorC>ID>nTzo=2lTk}sTPavAJnEK% zQ$E1Y`1;ZXJb}+U9D$8y2Upjov!zC*&&?$jP%L@486OWu6po!j>HW@e{|#oyk4H|T zN2XQ9HV81n1i}QCs>vWSt|KltNGGNl%iUs@i_AsfTb52#!`e&~*iQ%cKzrc6$mo-OIH1OH@ZWdxa$vWfhp6Z`mq6J$)Ed<6wYA;`|oK0Q5+mZavs z7eK3!s8xlzo|80O#RmFX$Wz#YLSC zC^~{Tjm3~fOR}PtgSHAv6sT@G!W@NLUam$M*J?K3p3mP8nS6j$guWGBj_2E=Y^;vQ zyq@n$^ZR!*GoAHX<7L;AmXicoMWN#;Yd~ajU++5ieSba&{Hz3wU2b;f7ga)UEZGXO z6(d$e**RUG?5qj`g7{Rz@qlu1U^@h8m3-zuC^OlId`c_DEB-CGi5Yukk+!CGmCx>) zYmXuhWZGR%kDWHweXnI9v%rb?n|H{#-jtzfG1D?i^x@C~_lIhuP~&QQOlp>`$ZOR} zO)Wu*Gasd;O zo6MA_UNCwV^7ysv?y#}9RDHT`eq8L%q-&U*dKGhs%NDhw1l4}@IQH={1x<0hfFa(q*+e81Oy~BskDz?q{$x&hO7udtuj>_|9&XeeM%p-;7V8B`buIR1%efgD@Bbj zXGg5#_mA4-x~zoM4d>e2#iH*(I7rp%vV_xrWJAR1q+`mETgxP1u}ApYl*If$z*49l zp>lfCUWYz0S^h8`#d#h16Pu*zJv6OO$P&(Hq(&NL&r}S& zuQ2z55=Nv!x}0(MA7;aINTKYZB?YY0CsnqYbOzySo&H%exmo9IWU<$A;6%{c_T!On zzfz>mmh7Mh={u>_3PC4KxCo`lss2q$pqB93#%ti3?WoZOGvv3C?#qC&hnd)qDj4Cx z!s#DRN8m8XDNLvC6Bwk+>QX@dq(@u}qyY%v=xUF`e3~uE1Y2QpEkE)wHfMHFJaY#H z>CS=)zr=4TKA+P4lHY!H2SkW)&@heh6B+6PcCA}fhsQgL19yGA z5MH7nN`)GIGSh?XhebR_r?;uh6Ly^p=%`Pr#4Jk*vn@C&_{PZ`Z$$am7OwT&1mx+@ z*`G5RTUq(dqmF8cn&H6>TUb*E_W>uc!P}NEz*=8tY(J@! zW$N7NJa0ez?`=Bn`xaS)QN%{$OpQd1yjy?QXnIKk4Qu25vQQ$c%Cyygf7_B=g9G=As#D; zx~UOk!{q1Gwf97^J@=@gb^*N&lssN>9|+F~9X4!;JO-8+kQG<2C+@u&)k-4+VUlpz ze_f?lr-)Ua@HC=cPH$25OL|-*JkQ4QcFwA+_Ws_LBh{^jr7WD zai;R!7aW``zhytfH~bM7iL;<<5&&eF)%%y*i_KnO;S4V05Tzi4y#BEbGOScrEMn_A zA0c8zB^DE4sPoN4SMnLb1Ih{wDrb8nXV&I^??s>}6}8Gc8RILoJW&SZFJc$M!ElVr zvEgrPXNksa*1O95qdGM$;Gm=YHU2~@jxG8iNQeD_ypSCDsK%$+Ir+*^_TVONNvF2b z7euRaf$oagat#CbejKK*hG$;@y7IFwX=H!u@TM%8N6ar+c$*)YNFVTtcj9h4i*z`Ed>@vY|YS=_v|>t|8> zw6`AwuhNv@0drqz`UeBF#fn8{lrj!>zHS}Cv8}2M(y9Yr#Fz+GO`}L;;j^X(BjXBZ zuP6g=0Un=T2fi`JmmK@h#VbmIBn@!U=?9JlWl8P!wmmKkKeD{bzN8oJcYhmAD(`rZ zlJK$xOAj`#ENOWOOo%@T=jNdwo9Dn zG#EC*Y&x6EW*YUn5F!XtNF<14PS*1<59hiSqs zYBC7O3=Lvm#fEJ8m9UudGo~sz0g)Ap1wo=(uKK@e4>zDjlm6F*H(vvtpk1MR9sJUp7Bw4S;n}#_u5j z0P|QbpC29>N*=Xr?scXnftAZKN93H@GbEXYKtRAK;zIDh{^i~<3V}eLMI|_w#)kpa z8;!26&aSS`q2a+WjIb5w-I3XEWhzduGWm>!jW7(ud^RtW0Lm=HV(BCxu?a_=jI!WU zFY>BYkf!)QVXVFqn(+nY+Iq`)6MaG<}x zf7x-z=W_XatzIY;`j7SBefOU~_`zE?tY81%KmKpV+J%r6*9P;M!A}Fj5Cj237V&zi zT*?;<6wioie9?*^q)Y0Y)JRL`A=HQcfZ1rS`Vnn8lv4v zB)hSj1Hk>o-OtksCOCg2kOVoYBO8Ni4%+29Gjmnjn3yRgsDJ>j!6BE!@$u*a7G>Q` zT%f}a?bVt>KQ{)`$y758G!!#9M}Cq}IA>+Yl4aV^Kz-{hytxKIcdeT<|0EafEvxj* z-4&;}NRz(N#vhLLRu~{&BWV}sG`HOmfy;gZKuYMSI`~I>5IYmwmg_fm7o3q9d5*p}oS5Ja~A(DVvy)K(4(G1cPAOrywKkZ^VID#k#r#on( zvNdjrFO7B?Tx87}Igcl}ZiJkSt0Vw@E-IiYE;d51Te4JDe`}aw_BxyLH+C zMMXf?bWE42(onN@L_()~OaLVRb;{Oc|C&IF(=L`t zg~0f$UQ9r%2y1hOL}(4BzQ@=-bnK&{tugy3j3^7U+;1kMz6nEW0N3h)W&z*H?Wp{z zRbiF;a=bbjdL}%dtD5L43K@r~Nvma9>w#m*+?79fP10F5Z|cqdr43_TUEON+cpLhP zz1|aCXN;yYlblYZzanR>s!{#k3Id3wb3m0+xbiVZ@5J~_yk03svu zYIQgYIq9l8k9laIvNLUGFaTx;N9=~Ufz#tQBTgWTrm__R1R=EHCDWduc>4?xWL!fn zxM5I?_Fu_0Mb!2~4++UI&Qi){PTUfi(dvwi5F(S#1ioLbR#Clq-DWclrb36P$}pL% z2Z4NtFo3AnY9m9#5f5McnyW6p_~NIwZ{NCY>%RR5rY6U-*<3muc+3+ds?}N;HVTE} zn$;(6Sik;^Q%|kbD|`1H7#SX+h$CaD63>u^A?IM{qd$`=z~st8EP003SG8!{LI#6o9Rs3yrb8kFTeL^g_v^n1$YYqz zBS0eQ@Ta6&q-q|ORt#A7%+7y*=+jkv(N1A z>e|2mK($s)1%a$dMw1~mk`h~oPm+##j0+xyVJ?^ReP7ioX|aL0|23`(V;)^EWfD5& z3=Y}B*(R!-rab&7ZsWl6-&r_}4PDt`?dqCwa zNry;wD5jDD0RS1RmCH*OEm?iiniu!H^z5_G<#KreM4Y-iI}3%vo_#OZsF>Kq>(&E|7}xa)=8FYMZN&RJ*N^}oLl8x225$zjV?RvX?X;#Iu~ z)Osy~YOR*f<>N(dj%qmmjkE!C#L$Rh!p>2WYt}}&J-DBcwT@0G-V|RrD_Jc>&uO24 zp@Gb*E41^|hRAuyT4QsA7Fr*Ymz5m(s0sE=U+%3fe08EZUG!y5cj5_(dzm<^%%3`C z(1c$U>Q6N4+SnL;iD^%K8Zn64L`26@JNIb2VH|F2&N%}ytF|T{u-uR1y`*t%{zM@i zX9(m_NO$07h+@NaAzOm#*4-$3udIM-8)LVrLOE$A5=7J`4|*6H2%<|lhp{oWHhQU^ z#H44R?$R#OoLr^<)@nv-xSC`nhao2%v*vao3Dl}c6N|NoIwFL6_{um*j@x_|y2DIN zJ24TBH~}0+IW)4=i0iyIa^`8roy!k3&#j%e-^c2iz!81N(rA;Zi=z`0v2tm32PI}T z4l_1xYJte7yND=enqz;U9ki;majE7+21#N%W`$hCY8#Fbzer4SErbRD-U7tKTGAl88y-aVI*p z_JT3FkB=z==t0XL_DvwJxpe0Ox(G_uRmtYHCdTNXd)C9YQ?`=fOv73Rr+z{?BXhz- zJj%1vGn3VnY>Kwrqf?WPrl~p2dH^5>2+S#^CsT>hbeB8_L=+sdf(Xi#7*zMDVNKk-a8`$dH^>vOCJ2>s5@y}OO1Nn_qgN~O~jW4neL(>e?igmNk0R2Y$j4=UmqY(F|){i*hx?qe|Diy{&&-Vq@goU;M z2~0si>Zr77o#Ax4WN?8qB5J;)Y1rDBBy>7v{;WMG0MGM+ASjp0i0Ev?a!01v<*2f= zh^(!dF%gV0#=Kg!A_(%?9Ou!=>(*U<`Q^;>5A5H+anq*W-eZV}M9lN+wYu+n7hkgB zl8ZJx|NIM2KDiwc{Zv4Lt0gCpC(|<1v13oH!BV^5fN|ak!!QT}`C@fM6s;sn2q7IC z2{KL;W4S_o^qwK2byn60YRl64N-X@vzJi1gPN*<~1_|NEn?21YTL9DqKq!(Z zl!QhBh0+=&vr^~Hyz;1Uw|#Iob90Y4H;WsUb?>=xT$r2u-Q2^YKda*r_tenIETs5l zKQicuX4Bbl$52*Al1kYSNjH|jv(|Kc&gYC-0VXFF7IhukF9kBgaAox*DaK8-!5#?6 z7?KdDDOTI3!c}tjicr~L#mFPTB*lK6@C_9spOX%xQa(EZPzNJKVgd4wB(o+Tnpv*Q;Q|Y&4d!JaP420!HqySDT*nrI4+PbIwr^>C-}jGUq*{Br_Zo6No4`Ed%^ks>Xc^ z5>lyYWlnL!3jk$Y2v|NY^7!}{QHr*!hK&S874Viu3Q@CGe94V8A0|(3W~u79xS*L3 zbKBv2<>r-&l4J|{gW5|;N)|v6Hv>y|*_JQiU!tJ|5GVH;?NTRDB#e@f8@xoS!>PV! zTMv>ooG4`7aTr|EW*{KUYLJ_afEv^4A!q3eMIVKEF--lc^B%rPdW;2vku@V!dIgLdf&eAT=f5Z^BUJF|N#Z6F zXVd1f!X5#Py+$sneI>zi1Bt}KNHbvhS~fL5#RXz6t704^-b*hHq;#jnm_BYU8?xNg z-hPe(sgZ*koA^md^{5xdMF^srmX6}4r6j%!Sy@`2mwh?3tHrUH$5qa&am5irBs}s` z&9sAtunAWp5-+1eZpFQ!^FQ2*P)|>CY|NaLa`1EbJ-}b{F{@}@<|MJM;WBU*6 zzxUp|KX~UIz5d|IXP*AvLk~Uo{0oQQd3XQ5{j+*j7KJHIQJ^ts4ElbO;OYN&1liU( z0095663uFhh-F#Y$pni+4!mlv5g>pg=d4u=5m`Pf@Ixn}K>{0qB0xSdk*GV(6-XOq zQ51gLjyIdIbwX6r7;vsAilQ*n>5PaB8V3%*AM>fw?!Jlk`6u~z5)(OVt=|^mfQ%_t zPM!YGfAmKyE62b1#V`D;fA!D)!|(scGpE-&-7eKN7?f=)1^^5afkES+APT4Tt2al- z)ihROhUI}@vJDLpr;}+>lx11+TL?g}`mhco06DVOh9l4XK%*`qpykgkQ|SDPpsq13 zN~&Qr{<0|1Fkbe`0MXbzEoE5(!elb>FXv)?&HCp_ViZ%H0Y`135Jbo0(f$MbmX~)N zKYpU#n11XdAG!PPJKuWyo$If;`s!=0`Zxdf|9JP%yZv5oYirc$c0T&i4}b9szkc-S zk-zxMzgRhSs@LlQkU`@Z5+%gQi5E->DYY>MiKwpYq9}|%6v=pmfnisRYRM5eXKihX z2u;XrN^%ndMh;dC(JqpZFJd6=#1vNa*4+dYMBsOYlttkWoynD-Ya)Pkw$tf2qIy<) zfFE9s5NCdg7Lj_67W``*z|{2=0r%|L4MdLI6_;PWv~$O7G8v6W=bwLWZSCUX@Wz|o zzqBy4){Q4q1Xx%ac6!~buey5m%$Z#~cO$}dGF@C;z``6nc<|>x|G6B!Ah;p@p001~yq8q@Z@L4a7gJM@24yuNE zbPA(Ln4Z@@0sxe(l;Wew<0tg~sxbi6dsPr*f4jaIljX}V*=LpH(mPiaG3sk(_*?)f z#nt{gk-AU6rdiy)o}?kEm5$~mPC0^|bQiy;S>p!nO`t`X0=Ino03fd}iz~iuw71e1 zut|$|V9XWOH5+R}Sr}4OLeR5w#V7vAsT5f$CE(0gG?I{O)84F=C;BT}hB?-Qsf@MyU?QMxuiQDytiBN@L00V5{1(}5%~SiF1mDP9 z)l=K|bfqW<+5V+Gfe=Z^^|Ku?%&Ru-V8aEyA%V3eWe@`9UZ7#W;)Yznr;e};B+;wdSjTF4{XS+BPJXlHR3IbFVA z9hHE0Q)_6Ua@R4TC0%KV2YLj#x$50I@pfoSWtuS2rzAC|+6yJ*9p%~!{}$4jSAuYCL4-+tnWpMT(vJMOvX z?$3PYGk4s6$6If{ec^={?Ag2P*{7d*@S#V4@$@g(*EW`ymUisiF<2NDWoZg5%hJC- z2MnK1BkLRi6on!G`deho+%Qs0v}e!mbI&=)Imf4YxiA4Eg7Bue zbdxKm53)20c?n}6j-!FdA->=^wB+?1sVIsghmWqVu9>1}@x2^_{6V?STJ>Z{Vq~OR z)nfN*i3HA}bB?UDbzNIqJ6G4%k?r@pb#4Fb&%ZjI)&KmT|IXHU)r1$Z z^Nw$pUGO=GSQO*Y=$v!T`JLbUrzIBu`9J^RbTZn#ch5Jz`OR;A^AC!K!xGY>rQ>tFc7p?41b!5{sX*I$3V-|dm%7Vud3-r3-u)FE0Fd z&hfGL#yJy(ZL003-VcY2-6F1xI%%G%aOEKS(N$rtXS6~?KCIn$t|8E6k#teE#D z0JOHQs_N9Km6In?!cv{i@)rK zRl^AunG0_+B1-Ndq8E%ojUAGDNLi{=yc4Ym)Tdy@nBPx{3EgPS(MXD8KE%kFv^i9_ zd3K}1v*d{~JqT0TbYUjJpc%oSYbKqLG=d2Hm@!7|5abqT#L-O)ne80YXan`lqzFNi z&rFiA5qNWU(>4NBV^t6p4oSFJI(C%$HB7mN8E4{m+z*2(Y$GN>8KB^{GzyDtk%pH_ zksyjDfAU;6&La@rPC0|>n}obXI>}(;$(o{(%4Y(qM1UGj1Pifcz5bkC=~l^rZo{lORgT7`f$GV9paFEjwb`orV}DryEmd zqVk~WSK-wq+TzpB8Mdj5w+b~$MkbNFP%WcoQQ~@I)%YuBK^rc#g_po~uJl$CJ{XBk zT}8SRM2{e5nZs}Gb?52;$aEssXy4Y<+(4no2pq>)S7v=A!Jsh-A^=>_(tx+F|h&V~=?WLjCDQms_ z@*Cgy#uHCGaqF$OedzxCZn^E2mtT76zkTJ)zxc&3*EcqMz22@JJF8ALnNEqw0F^~y z{7Y!jAir(M8LcnG!|;QUH>CuhMnwJzTTb~VI+FZE06>F9QI=>!u7n(h_t2p~gq?_7 z3`F5n4UF~GCpq$&O*$15-(ch(Y|#{jpD+2pqt%P`^DS}|Cc$AygsK~{I%K;Py>*Vl z180t$18d!MR=e7gv*eru1hR|EOT&eQwbk{l(WI;@Tf4FkX$_201PYS!r+!LxM}+?2G{5{@7*mvmcfbUWoKLtUK9n014FQnH6NS0aU-Qju z`X83{&;SC0DGG$}rk*@v_yiUQ1tPL7jv!z5R^TnX3@(L1fCxolW|PUjy?cNAxBk&> zx8DBsuYPrXZLO~DbXK1{b^5hmz4^owzqt6qi>|)rn#Ugh!Rx~m z_5b*P{=q9RztZpb$-h4cBH4aHEG}HA=!O~zDo+9cPBM-zoD8qsmy>O6V2mlyn1Tv} z1`t#K6U`-^w6;AT8>5r#Fs48mp&ZtWKnTX?1rV{UDh#`Iw$nC56@S8b<6twS?f+JL zSHS@pKy#(Vefx#0Za@slS{o;qpJ0FWt=h<5MUvw#2o z(`Qbvudi38M8s)5?e_;49lXGxe@-rcORplR5quKhkydFiohU4YMobtrDpo*oH4n4*eCG|e*+UD3*=R zYKmgue9-T$Fy~DwrL;WdW!URRc16r3Sr4sr;@VNvK$b@NC4nGQW0j{M-gCl#FjNSY zv|V$M1SR>o3kAv=LNZ#Ol|og3T^8gXi48yDRj#x0y=dlp5%o4J8%=>y0CGvthL{6F zsmOD>X8M&^80O_=)v*iNxFViK#W1xDpZgu%s{DnS$TaWgMC7O^ks_rvauZZkml&70 z&@||`d%SiH@@b$Xnl>D=cGr1UJq<1m(8C6y!lHs5ar=u{U);ly@sER1YDaD8fvLi{ zK>yy>*`OgV2eK_iC1&Eb5izYe*-GWms*ZY~z8vYD9bPCB*`+jcun+}l@oC(MnyZN4 zk|$He*|9mdm}HCB^(i?uR){o)a}5xIoH|cX4487w(9kWs7R-U)9Rmc$XFF(C*N)uM z(jpNZKXKyE|NPIZs_ZWe|LW`Cc=(}*ckkM{bJq?e@H+yKFyvS;oPuNgdq5(Hivaxt7k&=!4-_ejdS=6T2uR)-I5*FS;xffW z8#F{-{fH@5=ejy@=zMbPSFgXpZN8DT(-fE9RW^VSx6Fzt9-LIN{^u@8?uIl4vEJ^EW?oU<;Z9zybMlaEv1dVb2_e z)MGLuh|D6trP{w;i?c0&1^_3MiFNMunbj}<_dkB^wO5yxme#j6*Vi{b_nA-s_HX_6 zcmD2gzw@2%?A*Bv3|Z^yS^b62eeMhY;Pc=5)^{F#^pQQg_Y%0xjjfw+y7B+|KmY5k z(Wal~IPyF2cuNmCNK88_t@`O%Xtcq<*JwHK@&PiN9#a6!jhU)f@oevBqe-^EtP^g; zlb;0o+=*cDGkSQWgniaQ=cnXyOpOn)=tkIuw!8C8S#|htbOP)p(wkay+b?Er+Lvk; zFb+b+HVKX#!*b>%>AM7|0!u}v#VQh|z&36z_kC;OY1qcmC+A55g9VqU1eNM6smof> z;5Fw;12l~jH6b#Uruaih#HVK7VUoZdBO@YBqBNhOPvW2ywIW&zWE!O65dx^-m5V7E zZz|RV(J8ObKdGf`)AI>wfqBd;=B*B(#KVq|x`C4zp9qHIj1_=D^4Lp0!nQ|N=6sG# zq;?Y*e&=`yp0ki@QHfHA9RRinWfD=ksorqB%P*}#ZG|$dkl$$?LX%54x6Q1zX0< zZi(47i==A-Ax^@_w(Gg$}8es%%~t5kV0P zUWy?A>UEiD@807|*rAwv$X2l$HZxZ!i93K?QmwOJt$`9RXlHZ)Ybu7st@R*&ebB*Ps2xu;L(7&JkVRoOH4tj@9k z+b|Z23>WH2z7-^qB<};;SdT&nNu0wlK4uuIs!9g_S0=RPI*{NJ<<@k5jO~u%-#SR? zhNy90ygq9`sogd4uz25UT;=0iq&ih&5c|@ZQ#i{dBT~La43_{1WHS~5wz*>fjdIlf zHugjTOEmc+*-VXOVp(m+DaE$72C*=Pl45aHhU;sGsT~Utfpvt0h{hN!3KN7uG^^{< z6gzk9m`{wn}TwI*aW<(DBK9&MaVZ!Mc{y>n}8>@K>`w76m#46+x{N2J7 zM6RyuxR%I_NPwEh3I%pdSAt;jQ{qA59plpqnXW4{_CHWX`lc5W@6mYbJQ_B5Vi3St z>#PkE$S_ir?HrJim|vlXxZA~s#EZ4{aB=wg&wt@lAOF;Y4?g&nFaL2}PdnYt`r4Ya z)<0zifJD&kcKd^#vtZB|Q#dyx2abpjg$*ZK`_Fmj5p{vV@NANQORjUZnP&-MI8+uT zR$N4b2VIQSSNkzJ0h}h{=Kw$Ww+$_~1%lHwI zNYEn!M1!WD)`Q{T^Pl_t-FMyj;CCPV%2)n)b8D;L>rqYL`u4YXE-&AI|GoEr`2Ib+ zcfa_;%Uk1-DavpE-QOHPcI?FQIAs>MpkBb7}R3acBaG=7L^0YzGJ#7Y{p4D|d zMJzF7#KbzhFXh$^cDkKBvdbp0Bo(Q69W_ErFW`B*xUYoP1kdJ6@KhBmcrmB6Pe=)izo!F8;183g?_7 zDr7X8$4w|sIWlXBsaf<^#5Cfv_nUdV$%U$VX%MD$QOZX&1}*1yHZdIwK3JHBDL`%S zB=Tq^x@OJ}C}-Vv?`UD+n=@Ihg_gie1UE8yQAPNYf3rjxL*h=z5q}rBqhI8obr{%v;Fc z6R1{@N1KOfKQBQ{SPHDdsyjdIaMoP5*-O#r>DA_>R_S<=K~;-w=S;~iYJB*6T$&dx zLW*D}h8x*MAZ{Ny!U#|e-^e?JqnsM6NX`9Gz)Xi|P;yFKw4_L7gDaxDn5#=z-2_ys zMWh9%L%Y^7iGnR1Qp&$zA+aEx#gza5yu#u{`@DVoiU7O?cW%qgVC+}8DF)*V_3{*j zy-wOX0%vl0GmFmOZfwb?R%}0E6b^cTAn$;J3F*CiTkLLFT{g) z^)W`bsg@=Tu)PZrpAZq5AW@9__7!rHcu$h5OSxev`e(BlAauK3T3^qcX9MU-!$C$~ zE<|AcNe_-Dj(-ib5LH!aotw?-qAdK9JG&T+`bhxjH}LZ+V8cO%q6R2=Mnvrf zPnEeXq$_6T=0%#5>A=z%3poI^)`r)_6vjGR6b11dIPA)aj++zMejA92aGqdej9+E* z?*{tNhwlIU7e4>>Z+!bd|L6Y%2)%yKT6fDWH(zk@pmWZc0+Fh+^VZvMKmWoDJ`H9N zt+mc?5Ac(32L!I^Ju!r^5MaH_^V<-5y`FQ(-{I*-3kyL&BH~JHbev`xmN%pV+<#wr*;CuuWHuQN7yRkP zi%SdF-*Da9#`@uR-|cpL zOC;IoY#b4^rlBoyJ8fZ+ou2A0DpImOrRbM7=Ufq_NZSHS)0K8T$4lJ}uRC(mP*9yf zQYDBO8X{N(1&g*S@1^)^u-{;s0^CxO{vo$`B$y7;-mjFUOK&F)9)f4QXpM;74 zA^4*-c=)K1`QMo8Yo|9bKsUo^hqQ3>SBIk_F;U?dWzxNzDplAZN427@!}ptb(bh4% z$4hMjkGrLmK)1i*vKCuD8(Jdhi2VFt(PV;fv=JqJCWALcF_}*4+ID+Ae=sTwTt)E) zH-d=B5g_=LSpozc4Ez0F-&s4FjLWJjtI`+sn?Vd>S(Rw~jtm0C!W3v=I-6{)Z|vT+ zd&kn!Xf*MMlMn%spSXq?rVWihrJ)tk524rV&8E}3o>iU7PaRcKtT7r{PH*w%00`h3 zH8_c&(yIg-S0<*`WS`PkwqgoTop5C1vYvi}P}lWnJnr>+Wm#HlO<`R0NYWoqO@aNC zS3W~v8@h*pQ1~N1pZLWSfAVKvscW~qV`)4YS5@bpd+zzf$38w8kI0cj==Zwc`u2C8 ze&*S-C?zjI;J`1-BlE~_a7hCah?`1o(r`GiwRO(=Q&RFMpk&~{DX^>&LgLgT<1o49 zli3iCMop?AB0o;TExIrOC$1$3Em!-hAurw{N}WrUxJV?mLGLEiWzCb$#aa8C%!8cI*Vg>10+IQ%~x0 zq1v%yd2?&Da&m=$>RCM=kFUJ^eOFv|`P0und*Z~&PPgZ*XRiYn1s8*t+V7Kaln4!W z``zheEG&yAHo-HF= z3i%_CvRO(C$&6Wnbt4%p39b2H5y&^2w?*B!p-PbP*)QGrHPe6 zW&8-ABr+(-iJ+ea%_U7OpHwQl?MmmT3f2UN7QCNgvvNavKOu!LNyAypgqRWBPFB=H z&9+4ES|DKC(31Qg@25x_A|{(RFc3v8!pQry8bkyv3m3`wcn^3~H~nP`t-QksCG-Wt z)%zXA!c>rq4W#o2rCb#FB^&I7j!ZfPYEtRB(qMDmZPJvUu5Rn?+qdKZH1vg=0+zYt zL>gt%2(1W?N!zUL#6SgfNJ8Dq6@xzeG$~v6ys@Qo#pI7%Ra(X%>e)am??Kzy(fX=M z!aD;W?U%3~lY0;a6xHXwq;H^A2U49vp?Z7LT6|=}9}WuG9{+Sv49{`q%C8JQi($Zm z^t~iFP4i6omIOh>=Tboe)^|az~qYWg{6e|*+Vxf4TtK@o?P}TULNeel6z1*N$PK8VSQ~u?J z1i6OH3A8S#&Y_%JN`t;4A3;6iCM*=-ooGXL`G7bcPe!BhU^pZqKI$|*VK&1mMBwM5 z4jd8!*}5*va${rdop;`P{|z_(_HY08-~8?0y!qxKMCkT9RZ*G3l*SZgWlZ5!r7(!5 zsAsduXi{~mYp%KKQ=jyZu-5t$R8>5Tn>5>)7Rni8`h&q}G`6)3 z>`pkT90X@{8p+p$MX6j6L@(kRvbVb?qoXzxQ<4#{_jtymNu+DfYI2B$v$VCfwR`vO zZnwL(w$`aCh{(+wuzu7rbcM$FN38%I0wVh7z0fCO3RBW-`n?AqdhF51Cgag?*qcly z290y>!S6lv@{2D6f}PbC$QV3w_-IuXe!A?O^UFofkw4S}`QawbOMwz`YM?R>!-a*( zbYd;ZgJVh3keTJkp_XEJ8Br8UNM^)zaqu>r7LRq4$P8W^k~C02gCXORdo*R!kv>1m zx0W_HHW!8qk{%V@E!*$s7=0*a3YdwpvCN1!-IUF)q&l0ODK(__UdS7w%h5Jooa1m#n$01 zOFD<_yF%c=6%4}wP@E(idgiiAFIiq*o{mPHVIL;2XV0Gf2M!!QeB{)rm43gsxwW~lxbTsWeXQH* zJ^I+=b!~fntgYo&v^r?G+awSJyB!F*(tdBSx_U$ahWrFlxS1PEbzNe30uba^3zAX* zI)Nq%!)u4eglM;?QBT?sWQ{ifT6X0DeoiR_@J|wX_~mudr?eHyj*Jj5(!`N5OHLqi z$a>;psP0pSAarcy-lbx~T8!Un<%~h40h2fsC3I{5oA*w!(Z*6xhM6QC5Qm29tHizP z@wYabCT`?IQkb_ZNPCe9iEcLnxOd-bx-5B&5VKkIsmc)`KY30v))v&ID2(c&$d3g{ zdsqOO_=+vZk{r{d6FM#bH$o|AI{9^;!tViH8+^8@)X!vFJ}NgkAy*Na=C6HbIGmHFyb4il(b(#RtrFX6bIP$Sa*r zK{+ZQHd&@@FxfOU##TSsAak2?EFW6kB1N1TofV zZ!s91YKNf%cpRi-ccR5j8|06OMP1vqwbiBNWd!gq$3XBK7Ld|98cF*+MR-H9wViIY zwz2U?fB4@%|GCxs@4xT;?|=V;4?XmgpZw(5(WBP7e!pK-WmS|wfQV&T0pMt~g@_kl ze92uOyz4{v-Me$=u7@9c|~u&UHGSe!qYE%<1rj z%Xr^%ZEwD56yuaTYbpk-WYPFo({xtAmXhyJ=k_HsH?$&{lfjLR4MZFa2B%M-_QvMO zN$=qEZoDr|X^Z>?#+bsGvM7tPD6puyr6s$$x#h@pyB$Yl43=d9h%dkV%5%>?Ta;yZ z6*R$c(C_tn&QVbqYpv0#5l5VB3E)z8-6vY994ew&URqvVUj-s#3S&%s+Y)hzQ~)%E zVKE*woS^og#Gnr2M&m{ul7bCW$pBBAV1jhWxwW;`bIv)pFs7{(LU_DCI3{tAI$2DP zilQva^7NTia^%9)kPx6KiphA=?e{+Y$xnR#v%mJ&-~Q&0fA-VxE^xnTr}3bn0y^w! z)q}3mt8>n)hjR`Hpg`+vx7#g?Vq;??uz_EXF4Z&O7`9JlPBQoPIP6or}9v#rtAU^pm?%2`{Pf-<CXp?15=m_E;zVj=Z+uz=ttwx zxF}7x*Zs9$`?WjoyyM|V9)0?mX9k15v$mZn5Cj&LK6%CzowMCer{C|bt*!Z2vL~n{ zTgB9w1=2i}V5%7(V^NAa^T~!JyfSQwZIKHkq)M7Bj=W)$bK-5xK;YamT#~6pD7iRA zomJyhu964PXge}p=oo_&&$K~^ZUrVJ?7-wk1XGPm**Om@y)S=;8CG~l4+4?q zhnkwo{}FDYA}Z0~(D?S-S|UMl{0(7irvub(2w9ZMK4asn$Q)$_a!(P%UwNPClRc>< zwjCJ753vtXY>MASKqVU?n0OToMO+xW0JRNF2R9yx2J7k8;#Ro?!XoXQhEv|M^_urx z2!^bKXIofpf)RBgpGCdhl?XEvw-kwY8q~DN)rXSpyJo$ZqZ#ph28@E|=Y>>$1o@B< z$!LmoQuJAgD@Y>}woFgM7py26rzKYe+&SLJAAZb%m0(>+b^Y&iX+2G`Y%&aijPJeS zWVs`8G15+RCwU8bY`Lvx{%Fn30%|yIhr={LH0G>9wc#*KD6N*h<@a~BmG5${G2<_}qX0^ScJDUkqJQfkt`s0Nr)?5mQL%*RB!bo8RK zCkJre+CsGBHoqWR3J^VKrgl0n41pV3v2{q&p9s~kQC)#sn9r!yJenXRe|+ZcJ=hRK zCM8hL0{QM_M~H+WZ`^(NosT{C_>;eU^2CXgqtV1VG6uoXcxzOcV$a?^AGq!I zk9_1K7hZJXn{U1OCx80q-~ayOo12@xe&0Gv@=jEyM$#tvyf>w_+wJ!Iz1QD3%}+&v zO!@gah=jd{!kj!YAkm$~e)4ozf^4!Z2?EHmLE0Ix(q#tgwVqNR5v|NYQJ9VOH6mJC zUV8hTcSvOsx7lfE0Kji+0R%*23WHFX!qskTYpc`kjHhEHKvS%*Zxm&Lgk`5dG~G_s z>n?g$8)JZw$Zc+Jx|)j8AVR0pan2P*k(#9*fHD(6bpstyuh(5#S~_(25D^t+kx$st zM-_8#qxUPN&?tK2STUPGt8)5EHsNDPhNe9A%*-$b@q*UsnbpfLzr5S+y6`IW7~~lz zvO9&Ccku2pfQzCyv${H-P7WSCSl2TI?Djf-i_>U4DNFO|2R`+sfAFPeo`3#(4?R4a z*1j+D$u4oelw@!iwR`B&a;_Kv_-$44Hg4HjUATsgk^*N%o}!pg#}>0ARSV zP?qJ|nN?#7NH;k$>B5o5=ro7{fc!b?;GcOwx>88ZLbEavbG5m& z#+?QUQK(HEg%afBfg3D_1QInWa!H;%L0*ZO->j=CSD`iuGNAdOXXxA{whuObWVQuJ zARe;0eHJ53&UbIL9Z8delSX6BCq~LVnM8;w|otMuH1yp-6R`OI#JolSz8B z8@IxAGS!gG**vrTx{`8aDj))=xg5k+5=!S@bBTvI!WOrids%2|gYx*QbX>`3SW2Vc z)=QaQL;THlnllzF0hfplzo&Tgd)T*3$C`^Gx5{tB$ z#V7-j^TM9qXaTuHXdQCnzE|7iEGcaWjin^eg@AD}Fw z&mjd6oG+HUY#rkh;`C||3cpak;+%_YTGk#O^I@tlk;qk5b^OGM>#x6lI2@cgy;hVQ z=aus1Y9xCY0SJ+^8nk2A@@!T={Mh%OdH#j_@4N3~AO7%f{iA<)_uY5?_(wl}_>spt zy^bXd2z&SLx$V|lKlG80Tyyo+$4?&n<3IhgM<03kowpD5`h($cVK$qEo|Cg_dt4i~!J-s#h4I-L%QvNsxu*&^gPfUTyPST1O!Ls7GMQ5PU8q5he`H)5G& zfePYAO3Z+q1FFhuV{>yho$XlOfdtOFtcmuB><2&u{@qW;jK`DNbb7_*mtTGLl|bN( zv$gX^YzzVbn(!YYhI3FQZA9eA9z6g2OD=ui@aI9 zxs70qSzB8}W0rU9IC=79)#->rNa`F}%D|B@t^ol!=Q>sA`0*1@{qmO|y!)QVAARHp zKlssjGA;^ZYrD9(@aa!K@Ec$J;xo@b{~vz;_Yc2wxIY*WQAkQgk|2vU$uLy>1y&eD zF@m0|KZ^I=l{iDeeLB}UjF5iPhE4>6&D;l|K*oox%&3oue|cg=U#aJ=#e8g-gNz! zzWBvE@BF~C&p!Ky|Mko7zI~`a7}U1bJDz|D&=55opCFewII_;}SYEDY^~T1QTFp|A z1xJ3hBW>*(W!G}X%zW|^$w?aAZWmbN%0wz-Qkzh7N+8qn)+_5(UiN{Z}TB-TexL8Nj+CBw+&1gwCC;k1eRO{*N8(SKLYPPGW*w|Aq z<(ulcUF%F(h}Q8gLUOuT(q{Y|Vtt@5#@0CUl zB$5Ps?h9JE(@I0c)bk4Q5E_9mZRzi!6Yo*3kw`V7EG!aGn$61F*8JB=&urm1cEz_` zV|gSQAI0Cm6h4W057uB+AZlEX1 z9%XCkRQr9@@|ojhD3efnJEXC4|LDjSWx29)y0&)D?%iirP7~#?%iPY(7-IkkLHEAA zst_13b!|Ikxo7vTt*y{@o)FJ^acmuOONoJ9m+@v+0ajl`>`1qHz!paS3xd003tU?%cVb-Sm}oPOl7M}Pg-zVQG0fBvr2$CZ z_Pq!O4WdC4A|fXain7?Vd)Lw9$N%>4zFT#=#+U&9NRXMtaKlepdw_`K01X(#>9jtu zfB$$q-rCwU>Of57U93^0+QH|LKt9X7KFL8V;0f&TTDX;T!b1qKxnWR>uX2Jj0-!Nw zb2QrA+&pk#|Iwqzx?QyK6i7v?G$m{E6#n`5Ls?h<)nEMORaac~zx*%%_w&v_|AiM` z1fX3zcHDm3ZTH;$!RMZT{y+V}A09q@bTH^Ua^R1bp@hg37bIR2mBwbA@P`E(W2UpZ z>Q+lTc5IGDo1@Wi&~F+|hLq={U5YBm-DCx&1x#cYC6z>mzXu48<%!7an02lyJ1Z+I z&e8Jnj>CtKIOh-z5NVn+EFn~Q7lH@~=o}eiI-Tn0zj$h6@%pF`yG*7S)=ZS)6)2ar^0e&G2>9EjZGk^(; z(tZeXdh|y4W@{4nNYq?o-+W|^xx+jK)Ao_{rpKkm7ueBQlTsUG8nxJVAkYmm=i=mg z(_Z4U*%>cVEm5fqr7$^3#Dz0<#Ja3ZlvK|?&s`Tq$b}hnmMu#ahz6k5dQM17CUR{> z{0vzs1J51-K>3Hj=Oh^pai?*lOTJHbMW6zIZMr6|Eh9VhtTZDCNv)m7*)glA#3`9D z@h*MYM3G)?W}TR7cql2W#k!%Rg?6?riK)g~&|EBn$+yA)#BFQEe$uwmBz3boilm!2 zAx6Z&3^jjgPzcGO6|>p1Gj&08k${L_rJOi-zl}am`f%jTnhhsW#g{hlO(5WB8Bx@o zhvc;>%K>nFWsYZ#s>PP)?aT_T=`fvT{Zb3fTz9l3h|JL}B4F>wPTiXlCiR&K7`=M1 z$1r%*!j!1UI|o^x z6P-vpMh@zY@vGC<9{G%udrU4TSwZNen?0R-+P+^8Kve4VQ&Dt7k`#969g&gRj5w z1~|W%OP)ErjYg84sm}?&eL?^XfOC$V?e}`!UhnX+Bme!6|KtZh`pNzG-gEOUH|^QI z$2q$F_76-alkflVM-M;p@N>^TS5NK2;;<-+x}G^}!5``hqH9_q8sRtIFb1i%(5X6m z_U<`-=CrMCu~1lBBbsF6qEsbHTRHnou5BM*@=`X5`ziuPzH|4n6;_atlZcsCRx#xW z3DFp1PMtb+;GBKCckg-U(4lUxXKj2ABC$UXrzu2%vQy1w)4%!KzZs3TuDkXc0`xD> zmgpNa4H3f*euDsL{3rjpc;UqtAAIn^H(r0UKNwhR4H_ipG;)w^wHO)!`J@w}bql3+b18xn5y_&6_}6SF5r-Aceig4`dyPp!a;0kqQdM^7L@S7$ zqpj>)n&TcAlv`|z<4l2bVYu!DO)tPn0HacK-*m0a+@FVN*A<}q}Q-Fsgbu}{w1(8_{EekN?&6V zH7m2zcItUATbns~8wwCkt|mUFs7tY{NCJ;j+Z*Fx05u!;%n1smym8QeQNzsPrI&bK z5jcCk$gz}xoLp$M*XsS!x*k|#qkL%0qZ3lPo0xZEz4C`5M2Aj(5ES(MsqK;^1gbex zvXQ|{jnp402{Nt_g#DrzKO>T~((32a?wBeCFWa4b+CmP$6tRilN(zX{s4*qllNL^s z;K`uG;Yy#u;iRV_v`rV&&X{TK0-O5~mWF~7Z_0@Qfgs>L@!r6aGZb#=08kxtItg?(pMJv>L zmio}>6|hCn8Lyff^l~j|1hAISr0G#=JjZuO+#b@2!hH>8l~2l|bP}Ka=Sb1nL!EeY z_PD@M1t8tloGWN+d_)hX+Tc?(swUE4@v=PU_L6Zn8%KNwKhq-d%976ummCb?$Ln{% z2ukygNMcz^a6IguvgM(0+*#Zj)`+##sjAmsfBl2^-rMgFw>Gzmu-xn2bu3PT)$~}H z_PD+UV68O<7ly-GZQpqPjW>Sv`a=&t^1!D)b;T7|y!6T|Kl;%RUw--J@p!y2To?`) zY+X;MQxD6cvrW>bz&0Gz!;m5HlXHK7B^fkS*Gr2_`}XYp*)M+H?RSkqB7=bbrMxkM zrJQpO^O6$8+B<(!Ry5K^cxvJ*-$kHw@y&03=R4ntSb{iX$Qd>kI3fVbJA()SsIKdx>uhirE!*l)f}sj34#3Q&)1}3QrRAlUUVhQqx-1KsQ3g#??FieHOKXC*rc`1}VKXTs ze+c79>nceZ&@(Uzmr?H%Q}@fd3`7pUd-&puE*TDovKMb@j}vuf6*0v(HW^)4^b1sU}ATF=RyvLc-3!v)bv12I7M= zB}TW4L2+WTz5VvvRj1P*_9wFm5urZ` z1^@_L*zZOlUOW@8scyINz(^y0BmYDY#4BB;kthHgLe5-649*1l+!o6Df~l%$;6}-C zI1DRB`ymL3Y*kDSn$ZZ=KqBNx%|o+=2qrxH)&rt_~1MaDwzocgUypl^SV@DUoHt$akT_yKYuMQUj~$1-8WJAW%X+-_E^$L$tcslk$*UAvI@dFpNUxtm33%`Zt4Kz@`@0JR_uL zMQSwx&FA?GeFz$7>a2jyxBxSqe3^Dk0;##3^((QSbl72EIwr%8RpKtnI4tp5S%+SQ zTWE^;eijL^+M{T{4}&~@3ezcRV!m;R`s8O4H3}lM>^O-#c|bytCVRUEK@TSDYp!gX z!-h1yo$&g-PbV0p$0koHMh{lofo_(DLHdR|NMoUvNFsiG<#(SZtB z7(LVUPtM1$oDhiwm$|q7Y-xhnIPN#G9*zxIja_+eYe)Zbxewb`k zYUoW14gNEH0c_%k=p4DaMgvPr3)9)`l~-R|`SMrx?c00g=#ka6)y0K{9m_k2XgZnr z-oopi8A)(k8kCC;1h*>P8DoH`EQ)i^Jz$FB=;0&%ejfk~8bSgxVGA|M0qCk#!3^m~ z=3N_;nU~4lg21DQ9w5u}g=A4&kQ8GOev5A>wL1+Fkie1abh;ZG8>_2p`}XY}4hPfe ztg6beFNP)EB->NVuLve^RF&0^rK+~pS_iT%D}Wu&08)@F+j97XXu92gQ5LnW5!ejV zAw_qSrZxN`%Ve^3^;Or5##^UOu5hv}@QxvGwuH(VU$q9GbDKxnBCLiObtuR%p4x^O z1mpW|dE`<}=73Se>C>yD@%ZA4E_(La=gMLLU@7K~^oT^=sO>K8+_m%6%F18<SmI+97PCI=a(>3*S*jK|px8bIk zqH1J~8=w52&9zc!Wb(uPtUF$1Q8*{U8wEpJF1B3Mx|R%zXEVwF$>s@QElRU4kTL{7 zah38iqQJqI1;E)n5lX6g;SrOdlN}KRfJ~bpKHd?h&ngDRK{w|%`LL32;%+aW^oiNf z)b(qQX`io>VaX$bE&Y+q$nu?cq+D>Tjy5jeagw=FirnTCRW>E1UEl{$u;TX4nKSB+ zX_@sZNSgX_$Kfq;=n*i)kkZT%Kf*MmJ942kebf*i8%&!%iS{qs_jI=IXgw7Qy} zjgp@vaXUqos=VsOkpq5U5CJLR(O692o*Inq*^?hq1JO?N9uZ^}DLii!-!|e{1e#r% z+B}h(^$(D%3{p%7B`(4zNKr9dZB=&0F1%f)~~((+9j7<`sN#N5s?wNg$5jB zVjWYtyTtk=w7Osyj>yht#+co^cW#ZgUU}`cUbnMz$1ZR*n@%B|rV?@i1pEf-lxra( z88%kMF=Ta`PU~K`cksds-hKCwoz`W4Fso;*6&wWFZhclkY(02pVO11Qi`F!{mwfF4jj1ff`c!;{BpOu!`eFR;fN%rqmIrk zj2p-yf-%OJLcW%yi`wJ@v0cILh>o0_Ib_u6Ux>q5XI@)YN*4XQF#u$pyW+CT-#qlz zWIQgzYf}<#Qgk(8G-?wVLT*p_#mlVGVKxuZ%Cci~YzpJ-lK?;u4S*ca&cSof7&Dzt z-hAVY%ied{bI(0b&H{q?Ti$!3s8o3ZA#B`eudKxv$$Sp8q*sOnT3E2obfKD>9&-nWKtZEkM)S36~SoFv%t z|H5qt032C~z*&n3iwg@hT$oO$Cr+GnN1cBT%NSFX#q#p9F~(Xuo6UUEk_f_F83I~p z>b6JP1cb)uYztZ2?e)$*=iJA>|Clj_e+#@9gw}kObqKJ9XU+h!UzL#zg2um;@=&4K zIr*=krK}^2siL|oN5aaPuB~WUGXdl{Tq?fANE9Q0)^G@$O_T*-OUjc)*|P2tdc;Vx z{3H1`rAj%>Ft3d}A}DS%N!o+3nTbcj6W+#hFs0og3V-Jei+~SEh!LB)go+Skzn&l) zl6eXrPe=k(C@fhA86yz?i(UBV@KHG`HFP04g;z<)32Y!0izr${1O77mLSz?BLcRh* z!;s}egm6@Ao9K1B>K6xVQ2cLD&ZZExGjyRKg(6ZyLufPl$dpSlLPUm%WLZ_cEO>m$ zDD+%Xn^|z|t)tEOK&+muK3PG{6S?MXLllMy^YRpdQie=3TIh>oXg6bZL1bo{gh*B5=n(cgg{6ETE@qBTGMmH z?p2L2+Lw$Q2*5YS&rBzl!b*WL&@gSv=L?{f%R1Zd_l_MqcKY<`3opF5DobZ;V@!&G z6e&bR<;A&RT2z+qRuo8>bW~R1TLfX|1bk=bW$L9FZe%nO(=o!2&}6 zhNHrmt*y~jS6{WfYw4Z04mn3ypc8!pmM(j-z@-@bG6hTI!aBYkE@OX~_#Z7$U_*)4 zp5$FIKn@+{)n$x%>&>^yqCD@s^Tv}&cu-P8U+2^cI-P29abbCRX~)hT%gf6P3&U=wLqv656FHR>Na$As&Ie$?BzjLc zv-Ne?T{9YQojh@}EKAk^X1pd`@uhu2MFG@CmxSRz1`VPw2}=`n3M$k!z@&2OUOCfm z8Gz<&&n1ECgD4~qiFhUuk$>zOeS%3TmA_+@QOMjuVFvHrgqx`^j(Vuc_Thw?2Oyb< zSd-zCn3jfG{M&(Zv1MZbF}xWok`ugTDw{ZZuI>;V0T8hxRh~BCZ?soTfL6?1$FwB? z8UUl-h4)9(PBlh3533}6rqvVKyshLUhZ#uXbzh~$S;GR1cKir!>_TUR&O3@0)Vtl005_+R|*a^E8mj83H0+^Pq|GD8q6{U zAfS95G$+s?7=wrg&_Lk5j+boyJ;w1k+k~ueGGP(nvtYA6jKsVkX_D`a=ju3+3$dxH2~J2# z5w_@htEe%AbS8;due@GIGm_8~L?jB8pw&ii$m9UZ_rAH{G9(gspBCYc4$#!RVmGN@ zYOy=a?y5uAQfdj3oT(lW^N5iRwKU6P^to7hQcFw|!#K~XM#;6^ghIDn&~^F$~tZu&@m-eV=e(G9{%o*iP^%`B$^>x6&1B6Eg9t18y{iFIKUj6RBs{ zRbrkjwCIT3oEIX`i>Ro;QJ^kGb$TJdT2~h3*5=k5Z@zxz)mH(6bq*tq!7Upm6E(`= zjwpuV1`B+L0a_SSBDx z3h(E>P&|YQ;E#l{i0C&YG4%nBt95%4C&4KJ5YN#-gDfco1SpEa)^_Lej)fhIhYlYa zZEjVa4geTq5RE~jlX$)ZuRR9CcTvr`vs9K|F(c!6+X5vbW-6U$nL=bKrj&>mKNxx5 zA$CiNn*#tuYi+mJTUj}M^5n_$&p*H4@6Tp68Y2WW(^UX+yc6Gc4hR_eL_!ECW+t7r zww4`9008M@WvWHwU7T4qJF*aiS48LBpf|Yql8aw@!s8261gmeIEF(L>d zekJ_H?3M->lrYsd5`9OLh9;>*+Ep^5$g0g9lu}5Ui1>k}N!<5vCBm3Pfhc*z^lg2R za+}09LaGZ^l1QV-TzAK}#X^8XQEC_pm&!v;u_-U)Y<|ccYi?`ii}Mgf-IPlldZZU1 zl^|y0Ovnz(7-JRhaHB9>h5;?RNqD0lMo-CBC%%CL8HF(6yso%0_$&U_|ESr;6f5ZVtHA%$)cbSD-jE*7@UqVB@aMyVa@QXMi)hL3{9w>|Y>5HbJi;)XzS_qO>wShM;)sS|2DDGJNPN0pMn#`c* zMJ1IkLQF#g#v!!_&;GFg{PWK*FD;#W?)la_aui1piAg$(x5V61eqfm48bo6Vi~yvt zpWV-^!n{=1j$ul*eING3%viTs@~(D+LI2RZhfke8efgDFR8=*b z)xbxp$rKyZ;1YomuOlU?JB8x3F>+!8P243!jY@eG@UuoRXwabXsSZCr>)c>CeBrql zp8Cbpgw7OVLXmqdASiLL3KcTk(XcPAp4mtY=omJVQ(Bdfw4II z3oG!1fPM!X5tL;`4xfGcxz}HNeYh}izH`_VMR>SO4>8eKYW!qo z$LTUV-gr0~veQYBf&wRP4B)S_Z&Mi6Zfo;qd95Xt@gqWf=su!~Mz%s{xkyPXjMQ(w z1I}=Q0ppF&sB=C@7{xlC5e91F&DJN|8)b-rsSZ=w3unXwhb1o3J!?m)Q528MAfVx- zqX7eG3>l;M#YFql^ED7~$2;vOMidi;Dgr5|C8JUzA@!@_Y{;t|tAf~8 zqTNZLWFdvTf_TcDw-k0;=(R+{7vxvdLp6-5v4Gp++4Cz99wwpLls}vRr4lGIJkkK9 zWj-1xW`{`_rvM;Y%Pd!e6mK6Nbq3Kl&-@hRxyVBXDlHbLyGZ}=ag((SR9rku3-fwN zJJ6br@?$=EAi)O6Ir6)4xGn!%9HDyRGhCd?l}=&^3s>01Mg)3~4;xdAS_u~-ux9N{ z7n;~C!!W~S!2pD%^n?U4M4>*Lj)uOpu>{WV1S)<*J}Ap~Jfo6@ zRA0q}S9R#jUm!M^2?izSoOuhfilIS08mmkOh+=Q? zqYF#iKu)&pDf*)ym3F)_@)ppL$EiA%1^31qZ>_Iw7M;qH<+QD^w#8XV^yPCHDF0gV zQCTYr)REE1$q76{!g*nluriehtf^Mw~*xcTN=`1m3SnjAWFF7C@#-aYIk5*6ni?SA4Hw{3{f zxO+KBPRKV(c*Gtbm^A@|@J?OM<#ak#ZD%VdPR%B>vMd1r{d^!i$N<{61|9I*;eij> zNL|_-bBeAs22Wuh6K?pSMU4W|C@lOiL`bAJ-lZ(kJ9~%#!MeKF>z-OU_10T&U3AGs z%S%hs@k9<73^^C)0DSU=60&(`LNl&~4#@dD4f!LD@{-<$jAD>P2B+Ms2am~16a8MM zqADhn$*+F(hIPSKLt-l|D7Y+ZMdaOfs^rSRbuqs5YmGwu z5kE;1IAdv)zhX+H5FqSbWpSX6t^#YAbq$gjI;iwmL{gdtDXYogJb1i~NhRG523O8` zkv82y1~95MjW4ob7R;ULPtutn{yrf|{FiT~$q>+vT)b%1(~JXct%P@IOXmuy@c`q* znZMLSo&zPD%o2>nB9|BeAPzjjB#!iHGeJZ27&$76b4nT1B#!{(+@)|BQUqDRtt+q* zN1Lb+Bg8!N5=qu1@tzvMgdiHMFqN0847xwfhLBU4=hTvpxelh^%8bwV;`5+q5oB}z z)1XafuY=p-gjMtfQg?3FmKtNAbg(+Cr$F2jA$LUIDC87WJJBdmYH?nLQ$9*6NkR#{ z5BJASaT1)DgU&jiPsU0_YF?)A17if?ftvPuuXVPLgxTIX#DVgtSRyK@YMYFe3dyV;eBEETADa`tR`Xla5Z%}bCXHo*cAMVxe_ zfe`@4qn${`#XQypN3=lDCCQe!+WfHt(og>j@h9Qy3DhOr+ zZ850aOC*g)GDHx<#6))*jml5t$DUhChx13pJmcmrOtm3cDsu$X5R-|V`oQVl1`_~m zZ3lzF3(vhco6Ro2;_|w-&XK%Kfpb97M*$$Ht%LbkNf@KU4f0PCVj6LefPzUd>|@?W z2MAzHRh4B~8e@o%YF8G<7$hK5mZm5iID(LcQ1q)uEqEmUM#C#J+*J8{&P7U-;ZZkf z5fv{Guz9LqQ`aP&=I1voO^ut9%Q-h342~W?^444LyzjEh78e&rqj7QvRsFT7&w`nqec8;wRLJEJpt zzZkhfIw>*L@PFb`wDvT@LQ0Ej4|$naX!p}{LIf;KSz>_zuC_>2Ri!D4vM4*9jwy=J zK-g3htR^NCW1@%I(YR!8nCf8~!-VAYQg){p00LX|;S7)^?U5htR&r)V18{zu)eA3L zM;BjusUxaui{Z^^Y~PGEcmS-6`M%4X{{%psiJ;6ZL_bjgU0PFCSvX_kzyYE$g~0+H zxtVpdxuI-`h*#J>>mULUoDs^WQ0Z78KYhPL8hF_;|T zoY73`X6V8n`4I-9{GDK6)bkMEse%q5W%CQczs5+ZQ0SLbRdt`*ZhA=O&ti*!5_zL3 zNfHK?2xFdz$b=mlLG`xN9uJyXLBj!zDnA=sllGRv^n`-!HAUjr*!u{&j4)l(MZqnG zMSU;!us#h0{5nlUWWN$b<`iX0li5XOW7l3n#rfctk)q%ToIvBKJ>r11^n=N%VK&V? z%m9%<-ZB$u@)dO$7RQz_6%vMrW&vdKL&k(Q^rmD?%rZWKl5s*t?oCtY!lMLb{w%R7 z6pFm=fbfu1aE!A@StDA|LrVfO3fj2zX+Lx8OcVJDE^lzf$W)@%>;f`BF)%|>A8i<7(k>Jcx;!%V zwNme(wK3ESd5%OIlg&terl}lkQd+3yswuAmolI$vyf%Wwfh1R(LQ*a=YEj(K9KYra z_?^hgkn_Y)t^jdy#sur|TN}g^Q*PQS?ngFcugU=N5mEn@-g+Mr^^$UahTDD`A+n2I z>WvUWjPEIIx@~Julq`MaP-w$H^b)I4^lNIM$cRKqgNRxzEACs!T;u#p1!AR0n#hn0 zQ79tqme{7q@0Ask(zYed$N3&)LlB^)2@?b7H>RUndeEra6!_Dh{p6z``N)Z5$B!O8 zR&}eefEixV>^nz3umkz*4dqIN3<<>kr&0N8(zY*L77qjza!&qDE`farfc{9_qA-Z{ zbT+GJL{L^8QyNRwPN!s@b5xX7Q5BAyb2j*M2Y|jY&m2B`GUQC6gNoi+bSN@5GBg;N z|H>t(nU}ac5Td3AVdjJ*v}CslK?mZQOdJ!)5f-MX%9mexY4_e;H{5W;kACpus;m&f z1q>%sYj7kHmfeeJG!Y=W5F$gO2W8VUJ5Y}kNzvfnBnA-YDGb}xh#(B#08Xdl*|a8v zqFZ2T9Dtk7XyzP1S(R0%0|+*p$jTWm@T;MixQ~!cj;fE$F$5rfzm06cXdo6n;qaON zhDT*_`$khkZOxJ;LCIr6V~V<-{_N*Z+9E%(OZyQu|m2&U?GsN!f)m!0DnMv@KBBj!4zn~x$$`9(M?g6rYwM*olR@&h^VTns?%}gTs&wfGBX}u zq$9S^A+zbn=&HvVb(3PCjs_y4^P7SY5DdQrabCoX)zkT7j@DWLfNCR@(P1$Vr}QWU zM(;*S-L%fVh2KhC;{I68lCem9m+EP8MJB2uL_8^LvSu#2NLHqj8qvU8Qk20hwPXew zJqqedfl@SY%4_Kx*z%EGK-@MbE5M= z#_I~mM)Qw7d6JX55%iO4oecz78ZlNN<^b1!<7|J>J8|s9D=)ut>+QEa{Ln*No1>yM zs+&M9g=qM4uXAGme0w5DKngG$DDNJGOdOVvAmKXM2ba2Ok zojcCmRSvu0V7$7ydi>0ZH;=EpeSBkWv)AhwG_{)rPNt7O>i}i|99uBoCeF@9E^}N7 z5dl@6L>n{$C`_4Oi2)>$2Z$vWIhK?Pm$kOr>uzptzVO@&H{E>G6<1#N@=LESEG{^7 z!M1}zMJKPVS+yJEpSX?q06KAW6@$sf8TWO@z!}WdVPTB5_10|E+c7-n(u;OpxO-v$ za@j3`aJo9$IKF=BtrMr-KEAcK+3$4AqMU(slEQL|BZ2A44MvVjzey$xT0N8EzXAz) z+o}Oj?kHzn95XL!vd>2cuG8%tId<&TS6{vJt~v6(*?I8hd22i3}kiP9~$8+~WRSdoJ0(N2$KZM956wh_CLWLbh|#{iy?!seE{#W`=iki3NQ!4UMhY?Zs)tBQ06}AN z8Oar1TZQ0HXP<739k}KFJN90F-txYk3wxJ}UIz#!XEx6qJ#*ys!>8XlzOk_}94r_E zjx4VzaOZP*6Za<&2YEnFr81cIqKuiYb`~q$j?D+u#4)zLE?dvG;Z?O5f}0NC(GsNd zys=V%X}U7esGt`NgVqSBVHdOMnD1ZyHMTRtxaaNo@v= z0#X#J_t^zTg+BsL>c@wn7r0w4u}ClDp?@~3PXUf3ZfASiRK3_NL08%TIPtv zfWvAt51fx~i2lNn1M!)X-!KMbv4L0zMZcO^55G|oK`l3j&e}aELfqq^n!#vT^Mhvlp2j#yB_0IH zH?s3Dc$#3wJZpw%LrgX=lCaN+Mi+HA@RwKaDb8FV88>GXRA6Qvs4<1cBUZ`!!PwBe zYu=WZxL1ou)V9Mym4{^QO%#r@F2WXfB@T+iLVmuSlwwCF@MqG4B^BMJb5x&_%?QX@ zD#{B-#Zu6lWL~Y7%QShS;c;dg^3UXum){b{?K_P=os!Wc6e!o0i7Cm#aeZy%VhxxY zOw8^@`%$@r=!b%}X>>w~S`iROh=^TMha$4VNE}b)nsboEm5I+$Gn)`vWphhRF@coO zDOFiOjTspERyJ3xZRj;bu6wn~KfIiZ2@U7MGnH~go2zKjv^+j450iLA&<;VlXXjHTeEOA|UL^wdKO8t9bmV$f=h#X0f@rQY4s!v)EC(dN|?~0F3vXGVnOBBOr%ZprNhN zsJm<7iaW2p^vNr3iO6lly7Mf3MU@P~#(V8&Qe2u6D32_=)riwR zP|74E0S5ULUk9>yKM@Jy@{ZklIX#zHT=3<{&vc8k7MR$`wkVn-Op-=aS=ODo*%sE) zB+MwXwCf6H5KK#Ij)l$1mc-P8ejEptBmpe0`9W7;{2f z)B|L_RY^7NmSqpLglhKW860a0OT|__fLKPV2>f8G;sAoL<+h3QKy1h?9**7#mt)8Y z5@ETEx915?oQ(=9$lyQ61lb6!vV+na&StZ74jdRREWG*Vo1IQacB)1?2nb<$X}Q-Q zoH=v4DobJ~(1fdOM{$q0KkguJ#%7((S$WsVucv)VFs?%;+eL0#h_%24cC;FiI$L#{k_!Hy?Ygi{EuxS z*C75&@@je}QO|o5mLiHF1PsNbi;v7wsp7j7vzbv6_96>-^oS)Eli8%&HN5$=cVG93TNe&2 z&!)54=FHA!&N=`v1r?pL>=mYhGl$MR^{t;i_06BU)oHg|)y|pl*a4zqjZ7P2$J&U3 za^$ujLVFA3U<}iM1Tq_*8&(=$WbRaJApsS}I19D4H{X2Y{(bu%eeALIwe`WEU)vfY z@YSBzBRe9631q&i3Fbj2L{VI(3H4%LD5T9CAsWD1x~ciiylI~Ffmo=)rO z#?(y-92r1kOxeY1p~9|Nd*}4CfA{2*U;h!T&Z@FVGwBuFhnAxFij9AqNnswAKy063zmDktN~a5%j8-n&noJoVF`{;V)XS(UYQ-rBSm zRpf`3*)!#8Bz{1R1ay_)g2VQ7LSEiia~B-XCOa?Ld;1sex%h+El#9LD$W13xH>-VZ zQ<>DobStl&dg3p?|NMhb^|6BmI&f;}ygH(D^xk^ox(ACb%7GzG<{Wa~Mm^Lr zB4GvpAHoNT7mL40f;eCPkENw0=jh#c5A}Mz@Pa7uz&yKT$tM-HT!NnL*s({crGhgY ztfgznFVr7o`HW<3UjnB9snh^MTt{g@HJ$3Z>Le?ZPI}|49~yaDH4de>z#1Q$=2#N5 z30W^m-NuD7Qo)woZfG_il~+5ji!4j-mejDs-vhhy#0_fPBO04gp1#CO(U4?LcoZo{ z6hlW=+{gt=+RCQfpn0j@?-hPh>e%8obZ?h6kpKiw3nBbd%gadGiRz!DPfQ4QRQu+ghLaQF}sM3%iGg9s{ z7bF0PL(yDiXB{;&jqT#9nDrdWRDB86}4T9WCHXpP=h5*0}|5gmxW#V#fH z3$0NwDWFX-wt$H1 zPNr-8&748SKpcr>E5y8D(-kWH6hY`WEI=+|0M(90I6`--r(6(HStiMkSOhdHWL&a4 zE?tF)GS_Tq)$D|)AWJ|P&!C7U8hH)vftn3BuU26tzM?hT!oe&?!Q?~ZYGzwdXXaE# z+GM8(}?rz$~O7ks?QHx6funeuoaP^wc2 zb1?r!D)u32gqJcQZdXgb;ONd{W_2YsBs$hII`G%I|d#~3r4 z&HCNm-u?TU*%l3uM42JG=1dUdXN+6-TH`+d9r1PO3Zz#cfU2yvwzhWe-0|^`f9&;N zz4r58JY@_PRq31!A-}~pMj{vuCefB53JhE8;?{^=# z>i!$IX4A>qw8X-cAqoHhfwRulv${5Qf4N_o;+b##{QH0ScV^vns%qw}f3-?Tx9~QU zOk1N9%iLLX1i6E5`sYOV1V=Uoo)lIQy1`jUnxlY`in5wbXK3KAyYB4w2M<5=&}2I6 z5Bj#AHNtQErEDoq(s?|r$mvk@MMVCG{{Vyq8tWYO;m+T>|N76|QFmdyJ}U?dV~jxr zV-WoQ4r}dvT&i??qyDMzM0mRSh{B?oMD(i$9O-j4?DB zS9H0c9970;vx;+3FUh<;I&_=CC7o?Fk zEL;6R4h2f}F<7EOj{w;)2>=Zin;Yx9uRL)7?>(^Z{TH2C-Ym6>y+i@#%TY6eRth;$J=kc^@}H;DyyohO6x3ykd@~H5|cFu@3j}MZ;tKQ7GS^-BB4Q1QmUOZ^}>#Y zVoHzx;dg)e)gKLu9vHt7EAd=>8cZ|WqElT&?7p*HMy}q;LJdHK)xs00nIHyXyIe38^oY94S}Eu2S3QHpAMU z>i2#Hb2^*42HCYom9ugZ04dS#;BsXjI{GD2Wp_#$avM;XP?roaAq`LMUbrEKkH?4=j4=8(xlX`b;>3Sc5L9FZP!f?29 z>hxoeJ$}ihm)vs8jQ~{FwSS3B+C@TL5K3ACgP{DD_B?8+&n#&)UPI9M7YKtvGo4J$ zV)w4!{K&N*z2(%(+GKT7l|@kk8E4VX(9Y1-=&T{^8dH^9XQmrl)9W6%<&J;y;c;on zf{CxjmFavkkQjpFqDPE99DdZ~2vl>ab0TTXb40IMYZ-VT<8u~m-iK+8)QDXo8e7-h zPU)=s*-xLaw!ZKF`+A+uXltu1tGp55z#laT;|Sw}ul#^5ATvYs9#nPq4ICJylp~th z>CK=0z;&OyeWRXku1*lKD1i!cg>!|q#yR82P+6I(sAg-kjg9g9KXL2r|L7h&z}cim zG|YUUC=ey5z!eot)4;+8#uUzRkeqi*=KQE;Svp81daFzr10;#eVN(L@Y`@n(cKqb` zzyG6~Z@%f8tF9c6$3S3=kzO#CpYzsm9l*UZs;FVWTSwC)p*S1iN@0qv&CSJwJMa6w zPwu<%;*%%O*a>wzrYsB;0EQeoXRI^M6xi)lhKkh_TfN1_d;jrAF8k1Ro6}KIl*YuD zQR@Yp$Pb9fG(&$rEypT`Y;*0>2^}b&HXV4J10;boZ6jt^g;oLdWB_M%JzN|dJ$meC zKl}N?3op3w#`nA0&Zc!y6d2-z_PS}ys%MH#XCpvk(Bv64ltE!Ie1ixEO@YQaJ3MFk zWB>AV2X46d%&9G$VYe#F3QR#zfHRJab;eOaSec^eY_3kGg!lcEk6-!G_ixU|5E3#< zt23rBb^#TWc?9x1g6jUU zn?S{@)Gqzqn7P)2@Qv`KhFEFlF|6fw+y;s=REZ*ibt!bx?L;&blrhf3WAn*K8{`<( z0s@4P%BsjzQre0LC${UH^K4Ywlg6oVIJO^B@B{J7xYn0$Xp(7@19@~fo4!iC&4x;1 z+zC(A#ZUc4gA;~ktt)Nfk;_^y5zC9>@?v6cjILW^7(xVkamegF004c4d9Dq5(wn-C za$lQx6e;@+=|?U61_zCSI)ro$A>T!jg%`TMUfutHm3j{v%SIlt~}>R;02e zDKSD;CdPhcWYJqI909r%HM zU3cD5Rpl?9{N-#qtGX5W4LRXx35BXKcT&ml<#B8E1fsAA<&8z*jmrjr3;-b*Q&3G7 z-F5ffcv>npw9onOyV9n~%S7?1iuYe8+I9 z#@d@Wq5=H`L&WV89NB+rx%pxH15FdJlENiGg8Yd)lrJ(SWs*(V5-#UBG==hx8=YEP zbvj#HqaXeF$M@dz!TayO_xs=f;l}1>f6yl&=Ug}pE<*FzJvJe)va8gdMDKa35|WVN zKmXoZgSfdhdf&ZQ-SqhnZcJvjwnbqG!Z8?z{2H_Op~lv(GzNRU@w8rFpWO24JC46~ z{N-;x*_$C25sCt2<(8xFsc@GuKD+=(Nt-ztY%jrTfPhJ} z*3O2#-WzYe)$Mj}yY<$xtX_EWMFc3TD(pffNX#&tfWyb<1XmFUBPHcE@rJ`=!;i&B z$N|7$F_}zpvG~B3?mPGT_nlf6ES-Z_E~!7Vh}X`_3Fa zbLQE@gN0!|odJM;5tm#Fxx|2$GSg2R2^h5Ny_wk+pLdg3!@@&GDKhZ3onaUOg#v_m zA;h|_hr_|4L+_XZZn^oEsw#i^)Kk;ZwA<^r;OxK{6B=M*1L_o^q#A;mj-vP*aVnyB zWO!O)(2ynS;GJK%_xzjRw{mi|-{~Sc2bSGEg7I$|1xFSM%5F)vm`yD8%)P(+@#AkD zS%2kZr>X#zNwiKjLCpi%;8WK`I*pvgy|~OssztSvB|=c-wqpNrmAs(#&_l^%bcu=hsp#Vyho)vR$c-q`l+gbXno% z)uKZFa}bj@`38Cu<~C_=SN8PA9Ig=n$)+KR8zKe-0)pf26QNh(*gwC(P2T;4ZKj?0* zZ#?qwqcdyoz3+qj_U+x;8j*v-6p$(juRjwi7L{?Ob;YfpyLa*6?&)|cKqx4f z^4*eROx#+ss2jMPCD!$oyM<_ungQEh$yr3|?U3v+IMkzc_2R~uj&-cHdpO(lp}wrReeX~9629s3AQ#iFT3-aOYXXMYcewq zD`OC_Fhzld0ptIbWY9rjOs}d+f(lKq>dhv&O$wZMXLO-L0)H z1T4Z{q=siB`4QAqzRrAMNWUF`6rx|2oqYNkRFmGk@nl!1dstv2sT8q zqgQ>Eu=68VDGj+KL;94IurT31g)|~?^GFcc z2vKN=NzzVUMxAO0k0)bH6cYMFB=RZs@+=oJ353xpc>PK^qK>82LrZ!PNr@JD7B(qSLsLe#VPwozEX9_mn@x+t7=tV@6+cBo4W|5;ofIf0 z4B}jLJW=v9#t?z2@ZgP??7s4xt@UxI>=4)pKplVsB!dpYxk0DzPS!vElgD5E!HfN> zM~Ja6rQMNHI8b}q7{%tj>r*+ z!Yg5UB&;+8{ggq60q>;!`=;vJcDvopt+tSFA%BI>uzmK4qS5HMYmoBJwuKR#+O|-OrGPv;P42%mE{TRQe2S- z7}W=W3+#v@hP?CeMMSWYErZr|34?WAFD?vUdF8do9(#QMf&F*far^FFyGEmtwYD$@ z#6=Pi35ZKC#PBSN_<9ak-a$DBoLh0^)J4wO8i>ZDQFlk@f?F=f9lgA zxu812WO%v3Q z?!N21^UfQMMzh(hCX5YU*d&B=wgU$Nt&{k5&hr5t8V ziq5Nf@||X~iZO}vg82GfKiP;k!$vFFo|vqYwTe2CXVSU4(-L&ONKrlpC*ZY4pp95T+<=@P3M(w$H7tt8QAqY5lw5h7|yl;u54$7ehrV4-X|M*Odz*j z{D_UNuQs=+D1my0!849I=FtGXF?_cXf@!H{vG8nHgoBy63tXE=r_`r(%{CWT>nK#A zIj#C%jmRZm=A=ntXB(qrI17w`xGjpVPZ_5UbR-x?B7A@(#EFi1g7Z0q06Ef^=FDS2 zW^QdI!l*HXQlWG^*x1r$W()webG?3# z0Dka;AHVX-tJhw0^)0vDyu7?L+S-~;W*9PG#Do*XBx3liprQT{odU~@Ef@hH9D5tQ ze`zlLz}2%385b;)$l1E~4`U#KK{KoCZl~+k+{0h~?t_2$?K6i?o6-c2B6zDCy3(lQ{MuGdaS~aheXCbIw^u;E0?h z3j|x6Te~hguzbcYu%63|{S+Ke+432iq8hD-@~OwbDDfxfjZ)JZYn<5hCIuJ(3&vSjJL`-oN-zbM1y&`%a&O_t^M@b&Pv3d! z+dmzxZdq`aY;9dR=w5K`6}79$GFvfoOToFbph$pQQiLC^kcp8zI>ftLFeVBiCMC6G z)sjOZN%r$7kNjsbvSnEy5wM_#s5Pyw)bqN`?qQ@-4jK@$Vl`-iTlrInQk?%Mp|Tmo zxn0tK0!1&E1b+(a=3!d{G8`pQDJdxah;p*oTZcJrG7xPmF&D3+SYx3RR7bioKA=P` zI)+L)cFSBRvn+K7!FTH?c3DYOQuEU-#Bs-JbUheebm)K}C8(ZVur-_*2ON8V1spj$Q zIK0k;Uts4yq#{p(Uqce{wu-xnfyMAGQe{i>9BJrtD>7*4D#dQ&9cc-(vf=B7+X&+Z z(SsK6kXdFhsMd2>kyQr~l1F#RW#COI7%Huiais%K21#?C?+rUa@~@~xffTbELsWsU zDRJeUg+AXNpNELz<>IU?L=p+EO2@PlXzZ!bL{e%yEUJVwksUAP00_{8gmSH(zU4;3 zCC>1Pf6Pk`ibqm@KX#&Lr%`sY;3O8H#@ZfWNnk-@Zt0btbikpB16gR+Db(R1K$b9M zTp&S@d{B~{3+8%|fOWZ*M2ObHkzs7jGP4k~<&h;UZFBItD;*|;?TW}mmNCDf67n25 zRhO)@8dWruOF**T5~Umqa!YyK7ehh*tjCl7XdSzZRcU`LqGwYL_r+x-uNMp{*$99f zI+={^lU_1Bg^>8GI74V^JFjqtlP%hY8iqHQ9}zCHA8Q$M!;gx(M-$Zt_#w{fy4UMY zXS0VNdidIFuetWxYYrUP_u@-0A3AhsYirc$bjq?sMEydvX4(ifg+v6-$81MVS21YN zpsj69v#QfE08{G*3xlQoyKPN|3>q*9%Y%iYC^k1XEn$I0?doBFI6E_W=)XVo+z)?w z-{(GZ$7k=^nvTn&AaX#s@4P+3ojdANqoORu1|1)+k_Z(8lftqs$JLk$q+G`|O4pIU zO-~|J;ug4B{zgnS4a~|Vc)j8k4w00t>rQ2gqVx1K&zv}M^2QtAf7=Icd*|)9-+b%s z&5g~XD5`E{5P2^`v_pf2)KNg$E=-b6nR4HAfnbS7(@9yC6&BXH-r`{Qh5M1PawQrf zaQ&*&?{=q?*|fG$6jNIdI$a#$gMaj`pMCd7cYXT9_kZc*b%Abd3scQTcJD>!F6>!8 zb7Bh-Q3(g4cR+D#S>8}v)HZpRZI-$aFg{D2wjR_Oqp+HJ+XO?3l`~m&T`vrW8(UkC zJp9--*IjejWtZ*Wzwgyoe|7xWu~|Lsb~>ggfPfPi6oa0(NkE8`uFSAhxKVSn>2&6t z>r@p1)pfn&+B`lO^|Gw&)K-Je?sIpWsT9mvf6o5bUj5bKBZoJ)wmMZ+mL(uKGD*%> zAs+!n470rr8$~7onBeaX&89PQR8=K8H?wx<@?v+#;$$)_pl}FaV0pL*)^3f)Xi9^| zIlItbc<0%-zy2S;xwUfUGynWc=U#Qurk#-AW>n)jmtOdEWt?>(51y!tIIrllC{oMW z50+9$9yWXw#K(wGT$74)4a9=V9kQtaN_$!;nK0X+luFIXcMWF{FT;X~w=mN~B|rH( zwxRVc{M}GsOunMVI9ji>EVUA6fAv`)>RawEHAVebyPY+FY5JWcb;6$%|7Eo?{++r@ zX-WR3Jn0uOhaz9Ph*qiT6~4ByKOa#me#$ON`NqFg@_oL5)W}l``2#h|qpB4mJ%3hK z#+`3JfXLexp7O`DD`8vCMV9H(Fr%%ZWxcQ&Rg+DMdip*;05_VT?fz69&7Cu20`0i} z?9hjKy<_q@a{z5*H2ae8qA9$$(YI}uNIHHGMv(O1{9_&x3bPi)C04n5!NE0`zwEasLs$;2n!|;`o)hI|l^BS41 zH&-I*(r0QT>A>IHOo6Wk(P9 zj{L|Z5lyGlt*uQgaA9EqA&p!x7RJ4DWNc?=v0-N z(CJ?tEjOuGbjP+XI~^S1cmL>{Kl+=;Z~MeuAN!xb0DC%fh(1q=0OY3A$=2p(RTYbi3kJ~D7SME; z`emm=2WX5bOs}k_r`ETQobH(pnPLWRxUlrji*JAZ5B_{(ef?Aa{2yHY(Hqw77NS7| zWGx`|m-r-qG2Z_%@<6R;T#91ik-#5`X^bpFEbx%B<(b+AR^9c+wF9Q!{JLW zz5M7SkBmp7>#x7|w%c#J@S+RL!i-1b$z($0}ccrFm6fY$_uV18A?qsIGKagEtQ{G&h)ZP~5PF2E%1nK4DRDb(nLs~Mfe}*>Y zD}Dx*nhKxz8ttd%C^d%eNgDQr#iB4B0cCY#`+UeWvRjFRkctEWoy5LDl}24L4#VSQ z9zE}K(1?aGE+DjAD$j!IP8?5Y7?bh|n^0GbDXK)J(&k#WA+TkHm>dQ{NpTS^cMQ^` zdUgRRQ>jph!j}m#GFMUzPZ^l99k~`k!n^l66%ZCAvkFCQ#MVMC7V;6a*F#{wt*9S$<8e}|Y$+yvK zLR;uv4YVl$2y6Gj!n2fF%b4d+>6&8V(-a$o2BlA$iUXY6!#19vQB+e!d`Or8xA0Jd z7qzTGw(wY)uu|@*9i*KP^8UCuqR5ndy*pWS(dX#D=L=Cc5y|xwHdR%BGCu{1QV@Q9+1} z#K;|vj7b@wl;Qq9BC3)q`jBdEj*h2aq;W@X&h_YdL<8{=B#{atu!)7!6_4mn#1z^B zBJtuJL0BNmrnNj+fTm4nvZlB?8XY4h%YV($<^zols+?vz^#~D~U2cOeR?KMcpg<-m zq~~2KCN+Hm0U9~brVaonmZb5F8q#8>z-k1n>)Igh*s)_{bL-)U9yxgM{Hw3N>c$&y zJhOV{(4luvoH((*vF;aCi?ZN3vce~fvK=@?L*XnDXOXP6)>BoQZXwr;$ z3ROuBKG!D7B6Uh_w1i+6QK@l`5beUka8}n(KKaYH-gxV(tFOBJ^7oy8@Vujkj~+R8 zY<+EQJQ`zR3R4tiX%NF2ICmU%MihdGfULFkY-X(m#7?KPbLYte`}LHProX|L804e)Hdb<@%d%xakY`E$tlIwfdp|^4CB9&SQ6f`a>W27oQn- z>#ft{${0fO2TGtRih`G-4U&udY%HcytPM$iowYfz|g(-@v zD6#M-G5WTQrhy4@jsS?r)^$Cb&8&3>q1)>nIB?FDS6#lgw)(=eF9Lxn034LIFldNe zuT#0r`ul(J=<1tCKlIz5+kNB3P!vaAJoL@q|MT_ZE1&%rzj4KVH>{jFsoabl zfF%Mngh-^{r53y=J8lK;=B=EO#DW&wEAbAL7;;0?$4~?dRW_S-muxlNHX=vDOY4iJL(H0;G@IMYH8*(k2v9z8b0fT!+i@SdjP) z&`qAVTKmH|IF9w8_ML@ql4%&WvNpMNELK!OTSe7cq_EM&yxO4`%>EYiN^-&ivd+(A zJE@a-L_JhMQ0;5&q2~7rr(t?C3w;=Sim5kk#bL!F2en}al9*b?n>h^ACdQz&l^d!Z z^oT1P;khUbgD%*6){YNT2Vv*y`CCiU&gXMTt?Ckd7n%b9O@4R%JEiOTSbhF&$$ zKC7)&Ob{1^S*r-Y;c{d22l=FOEb&x>#FMD7m}f2&%YqA=Pj4KnR{ln+rP)!6ITN%H zoXlL4JFC~pD4eG+&{T!^O;U}G~-SQ+N^ z*4AhwPS+3twuV+!!QVC6H<|*Eb0b#swYFJ1<~C&cYJQRJhTZanV7G7NBrQ4xpY+?R4gotm45L>0m047Q1*0p*5H9^jE^8fF8V&}8@WvZ&y?f};!3!?D_~MJMy86nk zt?`-DE2mGNUR_%ojVGh&*tg-2NiB>40RN^EmJC@(8u5xVR5dWOx?_uSWv2@nyVS~R_-4J|Aypod+-d{wYg>hI$$Pl zH>OLP4w5nxjL41JTLus?U(aT}ey>01A3l8S-FJ_if8P0*UV6#<-uJ$P=O0`-bNbY& zQ){bhTcgo*GIP!$hFwX3VN;f5Yr`^1;N26x%}$nnb(n5|{bckR`x-8X_)RAgF~sjQOe>jPtM>D-nPP+Z zL506WjJ~sIV4#~v1vUr)OAXBgJYWLnG|6JjOmvG=fHqzx8Xa>#vGe8%PReZp;M7&R z_@x;U!#ky@P6vLCa@5S9U!a~4ps+ATn4SJ;EPJW(`YD)nlw#5d^L$xO>E}31CxVz- zgp3dQ)$YlKNh(<$zw@hf;)pa@O85T69r|oOAuJ`GBw7?yLiTV-j8EKKgGDLu)m+Rh zRqA+Q5kQ)&(AuTcsD0b4CLsNkj<21~S(DUqqC(zlSPq2wvy?_fuYY0xLVU8C#A)c| zJkPDLV3LiDgo0G1v=1X_;UEGhS@KhfwgKZRdI1HGnJuGbI8Rp=3v6{!Db5HC$rp!{ zjSES6?W6cPpLhy`THweBs5LnCj?^aXtY3g^AR?%27Og;)j5db?O>c~tWVM@@EDNcA zwkNq2De8!)JL3q5*wk&sxY%jx-38WQg8}I%RE|I`>uJrTq_AY!8q|Uou-AN!=^>}s z@{Bh3-r`WaJqEud=AyKG?$SmWIwUH{@hA<05&dak;rrQcyK{^^t+-N(DaIo5w3oYX zvG=x=P3x8!A!AO&iagK_`%M&Sk9kZK2_iszzfUe8mN>MT$u_dduQ|pQa7#-g%Jt^w z0_X%*3%ug~l1Ar15Yk!{eoKO~m0;}$Ky*Hy20wTAe01zhYV;;eSr5q7CQIG6SQ6VU z0RmcEBjD1)0s*{p=-qb@AKtNZ=fQ*L?b*9~&z?Qg>2zyrYkh5Fb8BNX8c!zEx}I5U z{fr&Z6lGZyWm#68PSx-A2L0i}(r`HFS5;>=ovp2{J^#WBM-Cq)=lcDgwH6Vkqw(gM zjopr{wY4*o+4#I$F8&UwpA68jnVs zTN`WZ8{_eKI+@mWUDwu;BO(MUOH&qwDT=bHdYw+M*YEfG!^J_>>5zr>jrBL)c;m?7 zBcsV^Fc=h2fWgURx_NqI`GURR2#uLd>*0BepZ|aSBTSwcWE&N@?7qf?t(XEywFm&lRC$JS)AAmBNdS6Fdb8Pd=gL5J@& z;gb0}{-M19%Qd^C2rslLEkdZR-#xKNM6bX8#@lbdy?giW^Uptj@4kKe_V1g{W}~gq z`o`L5G#*bT^=w+#);VXb^RvvD3O-=s*E=?TTLU!QcGI;;zN-{MWC3>-Ybx!p_Md~Y>Sg?9~3q%KkGV&H?Qeboh%v?HnIt}z>!jrDX zZNp{A&s65S$n*9FeoUHGtEEK2Y|;3$s1_E60Cf1s;lqdD-L-r7dFP(Hd++W&d-lv` z^=LHO+}POM+!#&9)5*+Q>s;-KfWR12l;P@hI^9lZFc|dvgW6O!OzWL_i z!$*Lq)9pIz0CBQ49&e0sXXyy*+HBC|>QCHIER^5){XhA$fAgoEs{7_^uYcmVKXt<= zZaK5MhJa;hY9a)5fCR47>8zhR9f^5@G@1eLZ9#VWd6&(LzdQ>BY0lk1u_FUelu(zW z2yRU?9$N`XC7JoD;1N@Fm%o_97sqDiN9f8qj`6DoY3*0rOyR8jj74SK^J_5u>1-m~ zuGFSY7|+nF(T{6g~$Yno8oGW1@I_pp2I*Iyc(bj~) z0Sty6eWZwMb3>%W4cV96K*JNvF};>=wZocQJRgmkV}~}ju_8)ziA67Qx{WZ&!-OHm zrw&EC(`O(=lYs#(pd@-Szks=)P%WQ@6Bvb`w+htiN?6Uk3z*OAmW>td6r7d9_5wj$~Y zXZxn}S}j0g`}nGwOiHt3Y|beY=bT0Nd3v8#ls~X3 z+-9n!#knV<*~Z*5JeXY=5@Cp5Q*d5cj29$Bjz-4bC@hdLDoQs><*{#$L(Mrr0PRzf z_j0L>3jiQkX8~|waY#g~t7lG~I$4$F?p?cg@7=SsxUhTAo;|pi$T=cst#i)S7Qmq? zs;VlB!W0G&4S=;Yo{oC-Exx3)&6F#Ue7FvYB{i-JsHMyEGVzJBzg4_t1k zE?nUpojSd;bis}<{NMi3H~#%spZd|0H{5Z<$Nt4<-Hd;h(^`>9DECYzJ8z;Gh01tOZcdZ{}+{_fkOl?_9@F0aCL zlR*I6!|}+Fwr}Smp6y(Hwg*7zKzmUHRj6gL!1^avmKKTV)TvX)jvnh&)vn#U_UzfS zW5@Ej=bVeigqPJg=d5+SNLCa@S(u_M!Jt8$&Ftpp*74&fPMtcnva&KBjmxs^_Xnmh z2}votWMT87j`X=N4A1;I-ae<`t={b$wK|DKl~b6_~<|W)b*eK!1{R0ZcVFB zXkqS^5W!&?n2bwnj&f96fpR)albJn;RojV6WRnG`6k{7HDAW%*N{BmA!k; zU%9fX$m6nuS+k$AX2aB9(nB$)QDw) zNCp7X%viz?#Pn|fJ+Bmg&apCHT-y$oqWNRK5tGQZ|J^9G_K>b)&AP*A`HipY= z#)Qgr6)|=y8v}U%NuCwsQ&~V(a%9P&IXdL~;oVp1{4SQq(4eqFH>|^{?Az33C&s7` zzM@!9OcP^uWFlbBs`;ENZcWVGZT`GmYQ@rB;-3<8kgcNHna@KTso#khKC|=2u7-K} zyVea9Oy!&hS1{n2bl4nb_$z&U8pLgi03qR`pOpw6Hlt2Wf7ma@bFQ|PoMdc>31Z0H z%GYeto3_;U0xvyoju28Tral@I=w_L?7?%!6<*`*)^M*U`3vBvmVR*K^Cut`Ogn~3Y z91aXkT^XHCC{dXZfFq>RFy$Czz%BO4-c?q9;-&-bwHhcWkHQU(=f#!ywlCWt&qoU$ z5wV6~9JsoO0Yr>0^Yv}M!`jZ3F`81q%x7HKO6s~s#9prlfU|mb;?$|bM~)z3RaL!y ze>fZr2K}nrEz7b9kE*!IWLnqtbTS={N2Af!*4Ah;osc7gMOBqcOG^acsIHv_1nXR3 zirL22p{HNF`eQeigK{#S7G>cauC8q^9N78E-~H^{FTHWuO_vvYdaGyFyWOsJH5ddi zB^hT3N-P21dioWbxT0S;OOB(jh`)73g(z%$g^1$;uqC%OAD<_BEzSgzdk{T$s+k&3 zx0a9J$f}P(sCc#oB7k)c2s@p!+wYL2@nrI=U%hUv?R2Vszdu|U4*LCGuUD3pG5)Mo zBqD3;$#gcIjJLuy^2ZEURcE-kU=XcywY9zrLaL~E?H4ax|M6R0S&?%HWQua@%xHPX z;%ENZuU&ED73W`dDK2(rqgjat9FYMcFd+z2Wz0KIzcN0()hSBrETQwWMK#it&wrmF z9NTHs7MI(q2#IqNLB&7$#e6Ao$>V47Q+n1M1;KeE>i7FNfZ41*aq{Hh!$*uUy~(v7*GHn*32Kf814@UJ$k(!P7TK0h7{t+~YpeW8Vhc2-kP*-XvD}xg zge;j@+q(g49U}C5J?LXy*DEV4$BrFCf^NUp@AZen!Jt3r_BusT7KI5%;cie}&!&^f zXguE9+}zsQ8jmNnb;g)ZSu8FN5wW(8$N`1}t!7)3H-Gu^!CNm{+gPuR0Rrpr^y#%r zZ@uCH_u29K*46jius+)&OO+{QUr+(YB6X^Aw6gy8v#%L2#uP+00;M=UiWn@35NCT( zwdK<8C>Lo8zcY^s`Jc%NT5ZKBnMkzhPawvZ(oaW~AP|<ku6o@Mkc1nBkcR;}jYB&`WlZlyZCF%QrJ1nyD#n0up*^iIo);#saFlIc`S3#D1V zt(0?18APLe7mwy}lw(-P)znc#z;VGddFo>B02!!C*Nx*4xP=C!Xg^_B!D%(*M!(r# zDEbmn1#i0X6w0g`z&}MiuU&E7t@@zuZKL8SgOfGI`GrH3xogGHw2tORq{h;U4kVyB zq0BZpNr@@V6zhsjx0`Sk{C%1&i2F&71%4UKBhC1w$sM$!{0Q|3{ z+*uRop;lTc+Kh@PjT{aFIDqhuUUIH>j)?sHu-EN6aD5ZI!Hlf+)l&@aGu- zpfP1p_?bz+*Ehxh5IJzXopGIRdHU^BFFgKCuj+ZjmJC+dh@Q;iSa_7)P)yNh zt(@(m407pe(G=4Bsn-xSgN>Wz2>3mk4Y7%ALOU_8aX@z9kic0)>~uPvPS=rh){RD6 z8yg$e+Spux6(Rj^&=`YdS$4bKey>k{!xA}5E<8>^KtR^kovJ$W(%Wx6^V(&1ynkzJ z)0hItb<5t?>ZrS;fBR?dS|4qV$J3GwAyGjHXaEhEnVl^ThNs^;`Nk8kxUt1S<(vZ( zM@Eq@gBVZt@h$618iaD(An%A`Ms=KbZ zE34}!H<|;k35-YTnS@a38WvQxnyuN{*?VukW1piA?u>Tk zW@q!P(QGt(3;iPRAAIuR1(cJs^Zjm_H?ltUnYUR%Mc!=WW%j^t@7;X=hLt0u{j#Wj zGTf14wpqOK(gxNfIHb5A<8rWkt6$2Inb|0u>5DCEG047WVA0$QIaroZLRmp#r|qz= z-!Go_hhpy%d;%Y^LD4*LB_hWbUh(DooisD$RGISoku+P>BH;C zx(i*v91%;(w$D!OecXOI;{4)b(WO?Nmrw#`K#*fzV%CT5%F(f3{qVZ&k8Ek=O~?Q# zEBS3a?>~Devf}Dj9r5!(b%G3_h+j#rhM&nBH#v^nsuU^zB=Xi0ZYpt8Y(d=^%x@B5 zWOrTrQF9ns=WwTswO&Pn!{kwMJ*}ERzLP;n$H`GiF&>DVCR_#TTqmxg` z;5L-otAkx$ltlRym71ntN&VmS3eIon`2ngr7kWoFwPmDHu=CjsT&QE1KO_0s^1M>;%q5S3!D^c~j9Ul3Qfh=dq;* zx@tCS{b$b(4m2uWg_byZ)rPZ$CjjJL&>|jeI)XsNc`XVZP!55%FjKWcM5se1ft9nE z=4OtZu4&=$E`yjl7iy8C;t2p$uB7)f%_w9r136~;vW8nQrIIHC($O-V9GFrH(~oBq zn^e=aUPCNrO>XriVHTYSqxuFF7Y%yQ;*qc*iIao5Iq+^xmAKmiQ zBc3|8YIJIPw$W}95$4(S{M__BHL@(v8$?Bsn9)IKHeEE zioS4;$gCNxFNI3xqw`!MCD%;mY#_T<^v4$|UMlv*8qMIqq&S&im9f62@rZOMyzk&Q zv;YXGC<=)Rwp#7_ts^mwB@mQU7GvlY}snu#w_3{JfesXFV0-rpNk^H99 z<4}eSpno+uVS`c}K>d+N>KSjPLTRPZ3*DW+$#5B*u8UY56jEK)ksmRosIDq_OH{?b z>;RE{7KDO|(ay*Nzr5=Y2mR*h=bgN;*j?;)8_gUM`$e&Ja;l^fvnxSpN_4$+CUcV?YL(HKpvmH~@2++v092*4{lo6DeXGnnkvNt@|+5Es0 zH-G1btcO{SC6q#sBg9!GBaNh88+NX==|jeP!yO$-s#wJZR1HgQa)&!caayCI7pAe z>EVhfk`atqF(XOjGA~Maf=iSKqtfA5J#*?~CAuO9k$31n_y8I%!PsO2U_?T*Fg=^m z?5LhG5`{q8o+R_p8&HQp9`Q~rN;%2B%bK=57A7xZd8WrVHe1!>^lqN{u4XmQ?b#v!3z<=Bm^Iljz)-5!@`4A z7@gSeZjdolCe(uL`5B~heGoBop4?@-^A6uKcgQ^*8d`Mg6m}x*S8)@mp0Faqa$%c2 z8nQC%?mS#TP53!YY%HlMSdEEXnJoUSj==6axfvDGwpJ#1#&hJA!WM zd5mmCFh@#KFOhbpxcdBGuV3{0MbRtE>KBTP zv%-y{%dJHuqIRRb`R>QA`oi~$*~O93k%FjSlx10FS)-9R^Sl9Bm2r_FFNf_2p4*`}W?Zx-nsU?Q)W&=) z`tB#6`~7}Vy^12OY5&c|^r$F`EN{Sk`HOE|edmq0j*pM#twy)k?-wNzAZA&XAwty< z5JHJXQ5OATbbNGf$Mg-~ylTfi8%9Qki=tpzawgHch-m{E2yjB41C=;p?w}-s2|Fo${Jd8&#rpt4C}@ORubM|e1*%J;4%SASw{OX zk7^!ylZcp5<9<+(=P45DErue*%DOp%3#5y@v*1BV2y{V!xWs2qbk+BG%w^nVl6B!y=%}1znnjL|5Wd8g)EYUm~m8`<7?+ zgj}yv&TXsl4y#Q_myRJZ=4#F5t2?S9rf}zaxvcO(xi{6QFb~yc1|S2_vP}l|!a|uy`Xh+HKI^+@<&T0%`UGR4$U;yHIB^rq-n@wqZ^d zky(+ro3v;+z%&|)H3SCMn&%P;{5h>2CcS}H`N=U$yL^4+2A^HyeRwwAe1U`z7 zx*CdEa*X3*XH88QdXl(|_4nPRoAzw-MYJDl%PPuh;n{!1%2SIgG9DmsDmsHv4$Tk8f!Y4?XkZ)5lkg&MqvL{jw}Y zT@esU03>L%u`}H1FZO>xjEWq|!rPYSSED@=$nq3?1h zsd|Z$zOnG+EQ7Rmb3$be_?toF!dolB4$o{}W%_bj=;T}-n?+_u5i%-iyfb>|kAKr> zHc$McXHV?BYIbI>ztE$CFz0GiWfl=;*coc)1>JGYZ*KhJPqUe#*>09pYRfK81CnNd z8HpjmKJs^2uK*;jDOm0m%ovPRrjnUUH7^w9H+k+Uc+)VN2(kG*2S!)XG=s60?@WTn zXQ#i8c_jfL^?Ti+R%iN=?LYeG|6S}Y?swwh-J-EDv(W7qgp>i42mn+9Pyv9@YBxrP zhvv3SUial6-*feC6Qg7Oq68`xC;bS)Wo9S}jboFzh&Sc5hv{ouUm^*fq3uj6nlN9n zg^Syl%L3VPN@(3JUZNY*$iK1ST+<~@lgJ%-X>k8{QJ1XMg{%MT2hC<{zY`DcHp-c~ zg`z0Sk`SN(0w@u&C=n4`t*qT?&TN^y{tG{O@Wwkv8pB0dsLX}fQ#7A+SkN*cxuJ^Q zJS3Rqhh-{|4!D@Qj$vMKZ3BESK}SvEWk@Ul1ko1Pxj_K^IdB_8_sdQ&#bp9{Ps(H} z4=>SDeXFW1(jyNk^F9y1^&p|kWjRoCm7(?UEr?#3HfzlrDCQ5`4T_;$)Xiw0>1ALv zJlvIxUna6@kZ#Jm3>e?#4}mseJb`{8Qj2c^UFy5`N7yaXk)|5DDV~?8qo7JctwMSR zH))!yETt1lKmXQLXd;qgZ$UU3gL!wW=E5q*<8?u?M%n6k1QBi3SuVuiWsMPTb_dZA zr;HJ2T{=(VM{o=))YI4*M*ztig36?$9h^zg3Ez%Xu@*amkU`R0e4m2Jw9&bm;_{{1 zvPL-~DC)`Cp^y&ZmSQ^dZqT8m zpiL={;FX1z8A3rJQ^7Oc@81l#Fq|O441K!>+QJ*lhTf&GYHE}S3=pHVo#nhmOIwId z-s~sV#*7)UN`?^)VsoZ{ktQ0Ehl2PSaWjG@Y(SG{Avq)IS1J5he0 zPO>ubsVY+pJ$1}9RIY$q5vl_;0nmAI)xc3gO#wV1AeCj=YPGP}zvWxk%}>o7^MVs5 z_E?jzZ1u{5$`Xk9{EEDZS<&xpedvi>fAZ_w{`aQFJhj^GUcV=OrhG!;ht;1_OOs(Y z5s%EDcpAtCuYGM?Ch0dQu4@D~{zhV-!_1SMc`nvsh&DMEfbL>%xHB^S;MOZY{k1KRZan1FBZt>blsWc${h}zc zDt9f*u#x4M(d^=*zrFug|9ky?*WW(g83rJt64fRdXtN&^nexqyUndbI3p5@;dH9l2 zBqb9ol-gAmdO{i&}uXmr@KG? z=kH8z-g>|(hmWiqrAF58^@^e(Dl^0^%kyTVS!Uh2xd(4~@K@jd`9n9|HQpX7%EIL* zB}LP`q2dM-5}=1WG?!u-<<#EO;9sTjNsL}9XiEio#-7hXQvBIN0qb+tonc2%T< zYO>kuOGdrDZLS=JAk=CUISI7ndm-~s$)2gA2=M-(<}ae+h2XVP9K|UPXPf;))s`tK z<`^6!DlV{Qg~AnYQF-~GfHbGq)ptJ&s7#LxS+j)X#1nBIWZORKG%_HGc(-p!gRrMn zZYhgzKcKdjAk>2lmMus5K<}>X{zc!1S^yfh8~Gm81E{j zwwGfslEl>VREemYsnyLytD_*OB4N;qRe{goT^{7Z2}4~q9qe6)7q_fTmuw09?OY7X zM`ot>(hi?CgO0l3KBPgJ^)8e=RxWg()F{kmxXzeSJ$L+KekFr^s}> zAFT?u*+bt*Z`a3Hn0P1R0j_HllvG<=;L>C&-qp*1*z5@OBrPM#_<>3#5%{cz$XEb` z1M&eu6%^yRhnqmw^J+k93MgLNfpo06WI)4350U(tLu}@FTTv0|3<9gLoN;UfL6ps> z%V>un-l3AnF+;nUvfACOAbJ8RPu@jYQk#3}wkjl%Tsrg*IhV@48tLac3AOen3N6B% zswef`iMy}2Wb%F}IDE^hk>9JZ_<%~BKs^_;7mbT8azIyP#?(660FH75>}IssM6L3P z(N^42&((s8YwKoB^_ZR98_CcD`vVXNO0Y^v!GLD~7uM`I6;c^qt~&b%3i(6xrkQ07 zlNi2e9zzY`$*1aXS(eRaBQNtie{jp@yB^*Dl*4vAV(+o_E88nZvR2-Jyj&<2=I1wV z-16uh58r+D?>FB5&`7hBHyho4S7HkKEGSKzqFFerpw2yVu;wg-d+UlB%>x&6NvdUU zz``kWTu9k|DWA?wvnF!TMe6^mc@chqV2vA)!KrvwZxs;x7LhVQf;A&69=Z0et@m!) z@07!ya@5`{c3IsSAI3(GfV5aF%+JkjnSA1|hwr}j_9yOmcsOh4?RKx|GrA+6tK+FB z?n9hwaAA5(4A0QXj*8H&?hjyKoV_TnjzU3i2<#1CqOSeeO;RGG;;Z0=LAS^D(#(md zBn9Ow-6QDr7DtCi7Pih^|4&yubkkk?o^r@e`|mckc12^j19^@mm5aUk+4=2{ZF%tK zyYIgG_j4O2Cq_m9%6?I18CnC58l3e|&9D?3b(|#xD`9V)@eQz|`V-BcTmMO?BqHwR z$OOuL@W`jF=&cXz^^E=3 z?Z4~Ds_}fd4Oxyr#bS4EX2;ftH$HgleGgpshq;YY6C)!UA4 z)45yzKtUOp!9p*D=GArLdjY2y%B?eKr6gp8vY3J8N{vm?7PbdCv0}ANhyXpDcx}ba zgm|dBm(y-S131t}*Q9C9_9S@U#B$GBOy$6kUpt04BBW`O6>-i(4El-uRUwI?#<<;n z>?kD0oJ8+3ay*OmpcXMfTV?hc(kiH7klh*xN(!F>8MAB)WY#~l&Ndjk0J=vC-zg?L z1HKWmu*tKbfsa(gzyzWI z9qOms=ZGv7ZSleo+C4L(gx4bDj+L?cDsUD&rFgPps$gIlPl*FYT?Snwh}^~ue|NM| zP+W-+8g^UJ3u8Xs3v>;$UWV6l#yI#&Bv3?6QB0zgiK((KXWV}BPTaE}yH!JPe8s1jK;k{)*hBI1hk`-EMc) zs#Qf%Y}v9IKnEE07zi`$F7}6pJL}i2pPrgtTwKiaJPtm37sm%A0<&HRv33L$)2xt5 zy8tO&2F>fZaq#g4B>!S@NPy{AVG&zgGt9by07*oW2(m0|G#c}>^W9!=Y~8BWyRRSL zc~xt;g_teQF3fD5-1^AIsVBDOC5(;?6-52Aa8W|^bb4$KjXa4$C8Z-jV;lH?Yrr&v`d{bsT%OZM?BQR21`*bJJUPYA(9awaMU8@leixcua~ZTYjfiNcjLZ|KwSgC6 z@JNLV&3Xqxth4||;tBm^j!kKEzb*aU0Yu0kD5m{G#&!a5etiFgW{N? z$QM#aRFfMm&%L0_@-J(xNCj`rnl_?XH^Ajx3wA^ZAaLnIh=gFLHv%v-sVp%D*0Cy} zvthYwUI8F$1Nt>aiaCy}@fkN&n+T9VGL(<15p8=B>-r1Lp~_+i2DU2Z3@0~e0Ye8cR;w()d89M6rM!<64XOJ+ zXoCD3KMaNenholxZnn_tXf;9y#!)~*8YA^o^qkR=@AZ>Kk`1Dfd;*HjuHcG3=S%fk zyBs3>J`UewJK^{f`^kE;mh~#WHl%L!C^0G?A37_O(hRj4_jc7#qY%kexd%VrLBq=>FJ@MaYF{N2?FrVByT(?~I;T~^D_)mnfvSH6>Ou6P59bLVOh9342 zaBO^x`sK`qty}JYyri|QHE z6c*{BD%J&dC)m|vjZE`ddpY&LOJY=wy-gvHls5)cA%Z{x1B5*#SH|V1*3Qxr=ZT2b zpUU1wh)A<#eEW{@Br60jeIsZ;AXLY0 z`(NnsBQw*l{*pI&wt4rxjBqC$Xe2+TJ*LBi8d>~6T&FtxjC;0U$Y!MwFJqO5Y3Eq; zfz?9RpDb3y@np3Xza&LVU5Za?vCXsOXKNX1u#`D8+r<%cspdY~#SaMbimBG%D07I>KaX8C&Lg4+Ha8d!QfQ$Nqe2Na~GuC1yOR!p)=F=ybH)4X- zu!D_vpIMjUOngdCmSwUYW)tt9#?hIiXX3XwxT;;8E``uRw-xgv&V-1q41 z$}3WR2gKMt1=p(gl0(wd9RTr4GJP_R^qsZ|68j-;wnkhB!zg>G6e+yg_F>7*;P@z0f z*I#~8`TH_<6oOI)N|{%QKo2EgtJZj{5SyPP-c=2BHmiL5YO;GpH^aO=+U`K7DpZ|6 zQczizMYkvz)_4Ky7ui-O6h<*rN=}DtnJ&1hTc-h9C1iMLV|X#Y*=Ae&{~PC#rh z@5XhD5MF2YDuo0TyJxY}1zZSR$UQMmNlhY2htW1 zCoiWe5s8FSmkj3P7NL!i6^w>Cs!~+%rdC+>HTC%Q9UmrRCa1G0 zf*hX|vxENq9+920AkIR5W}y-=cSjC|ux3l>@(ZMh5ENFi8Li`tavH41X>iJAhRDhn zLldv@EaEi^@>l=!FC%QaS259TiqCgQFqB3S%t{j|iw&6tebr zwupkc7acc~3;u+UAREPvGZTVl?gB9 z+7L@?%2SXAD3l{VO(tMh(eJa{-5#$tmSV7os9*Gm(5oQ}ErQ-DHq+p>Ju)BzvWK`G zN0F}qYU(QhMa_%|=`hhR58QlTD$o|T;>=MX5%P1aqHc@|KH8!n-jkw46+G%CthegT z3Lp2SF+BcF@`|Sv3XUnGzbdenUbQY&=;+bc#N*Ud8;4-Y zZMWrIvJkHt4arNgQ<$@a07plC$WO-Ekh-x?HR6(lPVu8F{NmkAL~)`3^bUpgXsqop z2eMdXZ~&GRDGdl%_^CaV<%Ig+Gj^}%$IRj;a3&s z_Ov{?i=!yZExvR&%6ALnF9{)!8*&q7En94bY~UtnS&(1x+sT49+8hy6VKUtVAfg}x zAIAkyxsjynRIy#nN-=(eFh{x!`0uD6z~w+MOq3kOiUcoT#Fr4Oy9#^N(EwGz<$zRA zD4aF46|4I$Ukue0m~Q;?)c~aqRJjdE?t;Zi_z{>m-wWxVrvi|eriW%^j@PAiX{M8d zP((}`P(2+`Qt94ABa((?kFf&ia7H1-2LxfM6cXOr{(W0DSq8x|4wac(B9+F&p>N3e zW+Vb<>C6xS)o+vOoKGH__&sikrb<*Vz?0s@_NK}W67(!s$%?lkOpy1x1#lT3ke)J^(lE3jrDs%;!xuN6CVVZK_Z7>u&ie2puNv&n5Ss~5Ng!_G8POawC7!2u&J{D+O8dXd zx|UZmsg{}^4d~$M(9qB8x1gwQUt~n-3791cfIt-kKZ)3ALFd-2*zg`=)u1s(KF0^@ zxZ>@!GM1JZB9ztmtRsM)4{meEyy6jtchm-g?*x5o7n*q!> z0Vq~Yy9JuGjrOJ?*VH5b(d|H>9$DBTFqaeoD(5A%TPVs9O^-tNUX+~?TGG3c%-RYA1gPuP+<-k)SV`lkD z%r{G5H7Ock5d*x97*gr7&kfXxT0s>VN3gTxqw}#WXhij&ygURhOVzJ`lb%r~Qgfa% zFAkwD5y{x3gwjJtlARkfRy7jxQy_6U5(fD;I6Q=GR8o5pH63w(OI1OilURERNRUS$ zNh%6#zp`pVkji+p1lD%yH70@z&BCyX-&UvyRwrR;JkZ=wg(3b3s+Lj$H_V82;v)vF z*iA%l1&l>7vP0^FN}(d*v2KtbS(eBliLCTWumC{CThwdEo*fYfu;$Dja@HxDObp>T z9Gf<~h$xc;U^Sid?Cd-kVgk=!Avqr|hP={bwUf^3W{oLG1{wvRIBG8l7#a}*n-Yl0 zk9KGkLE=xE)m(+*KD5UL5dB$BO6UyXHAnvv8c}PNz=po2Pj#Cg@mx9r2%&_ zL{c}+X!#v(O&wT<%VYhk!ZjD~H-Lo{-Kv%Z+d2ScAXX^Zx|T%^bEct4DlxM(NB%AV z0F|X!RBHxpKQUE-^|90kL9}>-P8RdAbb9Y97~mi|o5Y85$20Jao7_+NY@*VES8%I{TG0I5=?9ueS|oOqA8{w7WAAy!m(jhXXJM za8RZ%m}!S{c5e;8t>c#@b9Dfg3275p{R_8C(GBebTMueSy%s997t5>-xI7#mu}&z z)66+qDdtyNN3frGl%VefizhY_yyPY+;#D=h02Wh5{%<5Ec1^8yAUXEhr}3^nH>PH_@e52skAzVd|Z2H*7dR$-i{6~0Vvj0bBsy=-JYQN&0e%au2nick*Z+u7K9=%EzYQw+s+8F zRk533%y}jW*<9)Zq^8ct_D%Dk*OsAeG^R+!=G7yk#O$mD=FyKW)IkqY%xc9*2R&{t z*DH+{Rh=Z|Esy9SN-LHQAs|#%z5nWG02mI{Sp5eFXlxD`GhF-#sR|A843n@K9gzB+ z1r5oHEZ)jt`u!59%7+DQI6Z@SB&?^)enmxWs<|UpjXw<7Ot8&CF!3Cb*P2)xpYXgP z)>P0hkm`2%U(|Ko2h9|U??YI{Cm`?*9h)MplI$9I0b_FgAK+mqWMdar95bvo;>ES~ zN69jXd-e5llpaoW?18TpU!)yP$Hv+h;*2oZE_|YjUFo6U@k8E&MFbMu;z0$(tL!?I z9}xpa!~mIqcVaaAfs;YN1!#3BO}qw~Th8txfnC>u>(mGmTN>_28%JYt5#d<9J8aTx5?c_fXfnm*zZ&>A6fi6ig^#pZQd|&^#nO}r zgUbGAbbLdc$zssjCrGgFqra`Y1YUeg?tpntx+99Kk~4D^<55j0h{f}JxUNmF=8jD+ z?I~Cr`>_hND5a=6LH160Z`tI6riaYP!~<4}wxn<`L;6FsR@-MGClzTbTfydbXgjQ< zFoUir0_Wl#zVDz3v3x!?(SV}~r786i=w)jaZp~;Lt5wSPEGtg%A#WlDO|Dfpx8A-> z%8wa>C&nBnB>L`Y32p?jE!$Y#Wz4sNE@#bCMwT;_)QeFr1X8q6EzYq`A&qdqCS@jFhRTG&9h1A%5T8hVu z3K;~X4D_2NmmyFMM1(zfYDSnK#>gacLjwU_(gWgwnfGU-YK{_bG^}w-P)qSpG-3k8 zi)0eq7H!JHI0%tP!k{k<`||FC=~sQ>+!KkC)lGe7!zGoZk|*4cvjk@W)JPBlhs2+Y z!``dsMHM;qpdCP52FiMYss+`gkn5b;FXPl|qm+~k`CQOVMm5X4W-z=|%&uGv@=uV| zyEX*cGU+aSW06RvqbpND&3x8t;@w4H8>-^h^rYK_GBt+SV?G=!VxMixfZtM_)tr!(&TS%r;3dPF0<9(gW`xE@P-;a`Rs2OLUlG5u z?gpU*OGqZ|#6;s$c3xnxYD^Y;-qytp8CjX<~g^+79ay>(7nh> zN%_svAey5bq2#8hr1v?d7(W95Bu}&&n8ezZPvE41+o&p+{zo$vQ+TnVR#^$QK$cbW z<>pi&W(Z{vYmeg+B3MyL&$rx-*JBDCM5fG=+d_wzTxIpc^qb7FfwIi(Y5GP2d=3|x zJ_zDp2oct*xs&A|6IG3r%#4`VEUehbZNHWgYwH^8GUyGhG zkMxWogvx@6MQObmvnAsMCGrnqYS35mpQLUq7W#>W5m4Le-d}T=V$W>>-fW2!$IP7* zLifS~Lv$3Z(9s07>_a!T;4st~BpI!a{95#niLpjBeFpHzNb9eN>^i% zua=~`4M6eI>O{{}K~6moM(}9juG9Li5Z@p=n<0MZ4p}6GDY|(r2Z~+3Ecv<;1YwKA zkv3Ggq=T!f5s$upk3tOw11<+cRw9oTR;L`hU~oz}eK!W7^m89@iTh+T>m*tD?woDE z)YrQK(M4YW6r{!rBqd0RCaOQ0$>PzN1xbiv$+jxGk;4k^0eWB4TV;;2CV#d9>_Ea2 zu>k8G^_oUlY<=vBWg~9KElYSa$~36QtK6N~fC-Yg*Bi)1ng)S?;$#LRG;tT?`w&L?`gkw+41Y_gsW7|EU-fRbgRaJ1TQ2$LQZ z=d0n7TD2+iw4)icncx_sJ;S?SmO4*Th)r-!(iW^`S`P&UlJUn zK?X$3KlzHPS(Q|%=x~q(Nanpm;NG3ekzb|6=*Z0y&l-9rlUt2S>qIUbioCJJ%3gi( zb^?iGqt^dXUaDGuXlR!$OS=HK1k0=}oj6qMR(UuOni8N?O=4pG5*rA9AjnO+qOg^9 z$yv%25LV5QN}x*8?}rfxt=a>?U{q=YDDIJ&fa2FyZPo^J#9lI=*wY{Yo&T=r@Gbel zJG7T5rVy`|4itQF!YHNvYm3GN23>Q|O7JkT-%dPrJoj!7mSh~Fh6IFa8c}vbHNP~L zfvW+)d9=W&Tb1?HNOFiUSax$TUBdyheY4@8qe2FO1}ueCtx2%h*BT>Ge`%okCM5%)G4dC-_PgzGZOGYJ7%93QQ8APWvplOL7*cC%s`YN5xF{V8HttR3UjZ=9Q@j*(&= zr8Rhqx+rTfBcS&uBAVh$*~q~DMOqWtv?_`(kAjdKIXyD%WIXlE23O2WxEEDNNh(ek zl4Qefo)a$qT(x9!K@dzf7MjY+94K%>sPez;U&Q<`XI7=Pn^S>CW# z%H+Y#(3|Kmw0hifl}2alNI!C0;hNkry6FCROCo_8qbNMBk^BfvMoE`-Y2ddFdL*xi zv1yjzCOzyZMEO8a$Yho1 z5ua&VL39X+F(zkvwtZ>EUUkzuHsQvF6J>v!!-xc+goKL&RK_ka6UbF{fUly)hZDSP zgv(WfsN}E^0LoIBLH@Iee0gnhAN(F8OG|w+TkUoZ0A^XT9%g_li$O;&RC%5mEgr;v zmesp(4@(h&u9n*8k)Q_8wX>{@;V#3d1P-JJO_P~3;wcH75iflbu0-~AWU4DkL%%K( zad87Aa*=nRAb>8%nS3RFMF1=55r`MzsskNjes-dxs zsCo+4;O28IAl!LF)wD<+6c%9jhMIkd0MtS=$hL+ND>=2yYf|KxN7ZUdha|vzlR8Kg z)s8RnGn*ncL7|QEg!gq7Rgwk8z=5G(cgIE^{LP9PsWE9D33yjeI5>xIu6 zH!?F-tST``lp&&o?6sycx4FT(eTV@j&7p(lBgHHUzOc^u9N&0nPC`J+H%iGr0Vwbk z7sncssxbRN@^z_efGrP8vVHdZV}Z)DB?y>o{A0g&5tNZnVrtyC@RCkbvuV&JLX;X1 z#OR*7qZE!2A_RPAJ$TcZH}WVLL%d@tU62tR+d7+Ehykf$l(GWkIZUBBPx8ur5ED>$ zS-?y@4`f0<>x?LFBId4Y$9W3w|Jvs_C@M%z(loiT5b!(vC?VyTtC~6S7EUyLenpdq zskY(G)-su~ir*INwc(Qc;PFdXg`i^;p!^YO)+7d6)2by~CnQJ2_;pl5IlYPHe-+z6 z>3zsGuZ`%ooSy{RD6#=$#L}+3$`np*eGe+phN0QSVvRfHL*~H3NN&{`+iXO(a+(?u zcVjsQ7#c2^EP}|^%nu=~Oos9rO$EQ7Yb}M3WmLPVx+C%@9U!+8bnmUa1W&m&H8%lC z2KU5x3__ydcSD@Q^Fl#tt2KJHWG7T8%jhUJ#5h3AMV|n`WOJ;FNp~PcqWeB4i|@pV zrDhi=G?2BhMt5|m@Bv+k*zyjPEN%@_a2*$gAoIm&lax!h69;)Q zY6L_`W#%dm7cua_Os)>s^pq)?a5|up>nj{ABRZY6V>JN&>gkk_mmP^x6(NJ?Tv<90 zdmC^jVbT1XP+HUwt*CkfVYLk8rp{s&u$K%eo-E{1CkX>H1l5=4oE^I_Q&F#yZJZc` z8j@azX>*biqY4W6AxANM5@Myb=2vk49f>y zsAh_-IdKk8QjP=Eac^)^wYGBvdlv^qVJf;B(wIklu{P4C_n6TQQelwH2(e;#3j-eL zQR_dC5k2FeYLp3|xi83;uzito7l!7pfA9-zOK=8R~M4KhnIn!JJS zXF;H(E;y$VN6e|vK+_{z%48zodja5&+ng?!~CGomyjA;EyXql|$_;8i7Rk}A6d zBm_MwBn*Vzgy5>oLZ8s=R|(;mLMX+MD(fV$vYR@V(51ZuGqI%QyQZ#kZKaA8dlc3T zis^#4vVH_X(v4pB*Wri_4OEEAHe>ly3Lw%S_eH@hd-k(H`vLeC%&T0=T+3+;)h0>J zz??jVW?Ox%j3fs*ZB-Tg7nuj^;z)~BmPRHc@pRiw0clEFk`NY-M|m4E-+o>zYiQ-g zH&0R?t*;(m%CD*X0T;X^Ee+&e0>PAnr-X@p$JC}GNe>_aN5;M^Gv`ur1jsmN&f;Vl z+LojJZ4GrUWQTs190&x>DrRVof*`KX%L+lqj1dzz)$rB&+w`L($yD*4)4)((qHaWo z8E81vSs23J|MZeCKyE2V-tZMsQF64tr6=A3fqf<`+ko63)r;Tb! zq*ReX6P?yu=0spF{Tu(MHUy>`v%F6H6O9r|07L>Zzc&OX1whS@9Xq7wg@O;B3GSXYY$3bs zP>{E})pJsxl78zu8 zl|3uLM^A{h(5};p5+;a&oJgK>Vy9Oa&1ckdYQEVaXj>tuMgAi|#LMcQ`$aoOK!+Xv zs~(N?okc1d&?@swVKD?T92iWuozUuY(#2GotHc5MjhEQEM{SU^!ByF`o|wxhEpODC zmem*kQ3FnWqc9qwyp}qh;#*$71UAzF|S04WDOLf99>CN008?M zVMwd}YVSE5LHmg3oE(YOD8=e=gx%@nZy8$b5Fu3CmDds`vB_HT znnscXjB9{G)L1qAyvQT=gwV3fUiLj^QVsa*SdGYHy_G9fNth0R3z7%((05#%r%n$gO&erQB-z02JYs zg60x0Y5i(}X=6w+!%VqVA=gDjeM$;%`BW}TIDOuUAlsJOUNTRsH6m+YO(@(GTKNVB zWa>VvN`4C|-~r#HaNsg*Com{1P;begA9AEU76B~gFkq6O1TD47tpNZeAHYo7UcnEo zAKpL$09B!R7YHz>M68KVl`-R}q@Mo}c@I?~hi)pt64p~h_cKPwJeMp%p$y&Ydn5^g z-hfrnKx2sIi5Gl909`^*i=QdkC$QtEKoOi0SC{%tA_U;`(G}mS2)cxKN#P&*EKTqb zr(HNOmxX_XU3z~0wyddxNU)yyQa*U&u?D7#UtNdZlz)N9rs1 ztz8?TPcMl>+?Kz{iW3TwZAX%Xgs)*Q+I)C1(*{}c(1g{*2t=j@kWew_CsYj~DK0pZ zz~K+ypd(o8Xf-G;7a*k)l)6W1YSfgQ&LA+}5@bO%Z#=n8T z*o9N*hRk!uhqi=HpX$q+A#jcwal`1HU2i-vInPU6vh|4wz^4+R0%eaG0ZFzQ|3{)> zEX*P%ewccatbrDo4g{W`YSA>bRIC$h_fDb@!*kNBiW`PhRg{%JnjxOH6A%(d#&2Zv z>0AWl*VhCNb!D%IJsN{DG5*zl`0z3JE6uZcRAFBB)a%fqQu6A&w8}s z!;>va%FeeIV)Ac?L}L_L=J$2dV^`81F^Isl%{>X2_;O0{tdSBOji$jV3IY&jo&tX5 zLX(QoC-x4MToLmgbzw!Yujma*&2B`^9s5!7FRG8I!>e}5GAthEjM_6sKNOv zejcR<4jM3A5L8)e)#NyfgzDuP50Y|~#4$jvZn}iRV*PuRA`ZxmAks$%IqgvVVVL(i z6-0iowu*F z##1nf;GIK5Knn6gvGvmuF4j}f7hOjByjzEXri2@oHrdV6gk~J6pa$^UcA61^aMWLQ z9Ef}I3KCuwtdp4q4nEdi;WP4T3np9(97MFSL_1&0?WpqAC{!jbDz$S_cM0XL6|yaA zN!3cBxkIVm6XVcvHmH}wkUZ&+)XQ4wVFW{RUxoFFY1JrW$@@QE1lBFUFa&4GFdnTE z#~`Z5kA1l~s6wE>)qYG-!JCb8NQVm!03cg0CkE(u2-pj##KxeAs$X$eUUCKj5;U#V z2(8N7wi*!!_-e!|&G|%d(CiWUFqkW@x{E&qO{u*FE{4eQPb$b>q`qfy8v3&=rR_)(O~JakIrt*K#53Nj;$u{0JW zy7u_VUFcER&kpD~?OTaYVif+npPaf}3g~eD2sibV6G8*;BncA{SKs@N~e4PA!$B%%RH7y0fF?MP(0nWSCH0MyI|1{D)35nWBIVHX3&5ypc>t*V%q)CcrXeY` zDt;p|HEgBQpwzE2$SnNM88gVseme0>uI{Juc<0+I7=pa{BOTT)8NI$2g!}*j002ou zK~zd9he-Y6hGMzrN9+uRqZ@D;KBq3CdO=bJf=5_i5s~$emJX$%3#gOwgFcu>=|++!k7jYxo-XXMi%AY_=rjA(;}X;NTU zxeJmX;j_&!V1KA$!9}v}5QebAqSq!{hdC?ioHEl10V7@jYcT)=tNdtAXz4|s6eU!>HB9JlN6hA>pBl6&#QTBzx&5GjADIyu7)3oe%3JfMx~NBhOdL&7 z%Xo#eo={l<23?8ofkGDt+0bELXegAB#4@0MPbeTG=4pg;5PnDIjTLcHS&F*(r2329 zsZ&_jRhD__P>!On#jShr4g^3*9t1^d=;RfH08oB?%L_gqekB@H->8d6ARB7p)m-R) zc)eip1C~PKX4p2lMhVp9l~t@2t6A{;i3hB*U21G`oRkN;JW(~I^vqVfAtiE#JTmXp z$;W)&q$N^0VA5^0hv`Z}Y-58kE|FMyDusERf0wA`gNUr$){rKc#?N9{w$rM-DXGT} zsxMpT_vqE7U?8vkRqH%BJ9B)Zi9)=py5XPGMmKc!M4@sGG+)IUS^)H>jHjHR>X{Wh ztOiR2CbvjD3MKxEFUeRy5c>4Ps+5zQu<`*Af?UA zh44-$_!Y=%G%6kmhzg*YKc)JT0h>VtM1E0RSs8NeMTs9W3dM>vCM!lKL$X0(0?CB( z4LZ>o6uJ^B_ygHHDWW0d5+=B74k9rKr-H{(04OAr4;&yx8yjddsvn*l~!UpLRBV~07`!3Z-JFJY+)>xD2*n_DyPO91U(VyzWq(7j}$ReH)y)@ z6r{zJ_%b@2q{DE|H06iR#%_>6t41T0&|i=fSb~Wo?!#LZ_gY{`7eAHq5=IBNokL8l zawCvmPLLLq-Lkn)o*(+lQgEP0SqW-rd)nSyQGTP zB^1ISVo1+qwV9C)7|Sb?Ze^<*(oZJ&tp-|RJIjGAhcyrg*+xF4?YxAV$+MX zw5Ep1tMXbFQ~?`hj7%5;y!@i60&+L;6TgEw&KAgdnzFNO2dd{!*Cjhg32aFtl5bsO zhQ7Suhyl_#RMkaiI3jAf>zaNe3LUx<$;#E+i3D~Vhs3!eX45vIiQ<(KlvKjNOG3;5 zq30mI%WK&KFRd*6UEbw4Z=iv>BZN3Ss8R)_F|cztsB8bxh)X=(=q#%95cs#=Jb6kd zg+BM6ADnLyt!nth0t0MOy}E&r?OD`VnM7W|xc05&8=&w*;XxQx7uZRYg$hHAM(P!B za2ZWCuY<=Tl-AkE#dHhE3Q=pi^(E8eP*g>)>PMYdQsMn2NK75iiJxQE5)eBGumWF=%JtYB?9$&&YBa zSWYi^4*zrlgj#@G6%x4)-1C$h(9i|^vPrA}V=)?{RdSET1*biXAVkuvE{y@Jd}L0M z=&h){74EDI+I5E_%g?y>N_BVM5UG0UZkBEI~ zNUvcMV$W7Q){CV6#^R)lDKSA!xp}PBsN$S|xk!!=Q_a_5wbMPZG8zUV&bV*JEDDhZ z8||pQ7VxfLu%9G+TatC$rEJJsHfk7)OojB~U%I!;=zvLxgRE6R5Rjxep?h~x@{dud zar*0JEi%f&Oydl2KA_w&6J=~JDF2)PFsxM=V&=RQN3SX%&Kl3DH;-b#L9t3nD;ba` zaA^Z(R6H&*!`gcxmTDot7MG-s1vKS})u^qYu<>(z88>f1KvqnXOaXenX{A?H?ZwtV zgb44C_}yvJ)g+hANmFd;)##Ev2YLTQ&hwSXOd1eQ07AH>hJ%}?C0{hO8OQs?J z(lmO)0#i(?{TlhGhDdB=D)5RM(U*(GCUd$$Et5!fneUf2NnfLmvwP0mh7G2l74F*)x~0U=_f@X zdihU_t(XUp4-T`@n`u=>VG2t7309KWY}JT+EG7j&>An~{fNBTP;xE}?Y`~_9Cn&V2 zeLfvB3eTpJ*0fbK%~}MG>RIzN_$LgR9No0;O9NGEt(9(cdC4}?l+(OGYoqlo`FT~! zx1`_=E)WqKxGm<BEdD(1cd3;z7}736q$LOT&JbmwjVdHh29QB5CM65vsJjH%M#5hB|m#+GD#cKGiTnO@$?2{;;6m--X z8{JtTx2OV<;4{Snofane|CC^+bRi|I(fu$rwz`SDa`cOzxLuY^^b}QVB8@-F(RaZ^ zliLym%VK^bnnjx)rr+NqQZE&zGz&uo;#eK%8B+%;p)IBMY!W7_s^%q5CAL)*yC!{p z3$l%_ZaK2UC_@N?q;DD&(~Afd3*hELMJ8}R1?7inJ-tMEvb}SJxFX*T(zu#-EWWKJ z7PPKZw9Bk}uO`^oNM#eO+lt8|^0*QVNq(oeh#ig&PLY13Hdt(Wh9#2twQP|CLsh+t z6X7ueZ%T^u>4tB*4UPfN!27Zm2oO!{V0HtneKA0Wy+ftR zlT*I@y+9+K4(bxNeQ8-ZZ?@bevp~5fY1xSVKt+WmtzwqA7z&A4*Rg7Fc}KGNo$RGA zW9CpfuTVEGS1WalkUWm0JxD36Q+$SUJ%3dNw5_CjH4TE9d>4*nTdC*N1;j;U$u`9e zk~K*-a3fxj)-s+@68ny_2aar|d~`*&qZM+8xn&8`P;<{a2Wbp7e4(lwRkF&O;RC z-8QBYQ6#&_A||4;0Hp8-A#&W^o0z27iFU+dyTf7g@9w%z^=OsF5BQS`=OvIZflxja z6}m9WPmjdRbm6gDKeK2b+td0hLOEN3yiKzE9)gmw-KX#i8_O)}lDzB$P56{e>BylK z+G%B-sU4-~Y${=^~aiohg;lc59sglS>5fdes6Ka8!2}yMorFC&1 zAjXT|+mbyH4xcOGOW7A0%~F?_-@$si%tlf~)Lo$}Mhz_Y((8HKg9DTx-M|*{02F&s zHS{=H4mlH;J=L1sq16pJZL!QqcS-?;!ZOLJMvZjI*2K9B4CAAsMbK<+$bj<)qlRjdI3&9ahwt7D#)e|oPp?)j2=LQ zEEAJP%nyum2aLv|^BQX;lVT2uk>Dl7xW0~~ZE-3E>&sZa~M z1aik>Lge82A*LnI8kRwLYXCg9Q2Yg`W-v@g%@J`43MG^s!Hpt4;Uj=Jk|6w9K60xo zh+KQRWRW4zXv}WHRY~@r^6$7c<1rB-p!$h)_OL@|92|y53S!pun!E~17*O;XF9u{{ zOCf}$M~H|z=h@CxVm`#~I*wM#t1QoeIjp>0_aDh;M>dh_o=hzd|4yew;GTr1T6Gt= zUKA%#heG7<3<}LHMT$IYL=7e6k7T7KD(YjwAstDV4r;(Ocp5?!QP(*BuXtZziEgzW~9@oQ~NguuSzsBIZWOtWEe^y8{l zoa}H2Vca|Fy1F@yUIY@8mZLwkdKwQS#1?xc!lpqkmwRa8SYfgQsv5bsTPAw2x;a;p z!+8`wV?sO-BpOhiXk#sJw~OM~S=RNcKf#_`72!5xsD#jb_pgxK!Rd54vj(E-=h0*Y zD6|=_gevA+Qxv2BCTT+me0s}LSFraYA9P&9?KOp{ggh@I?v4V1UdW+IOndjWU=W4R;q-+e}u$piU^8tQ&DT!-wLRw_Nf=M$L8Y-#65DWpln}pVD zNLdgwSUo7VmE0MR$B$7ISy4KO&sN9NS3DQVq@Lt-glSz;1`!lQSb9WEqjO$7nLKc@ z(dsraE+&VRlqLHV6Pa_WYP?aL>ZdZ*5bhJ#751E|{*j$_H#~$$8kci*rUfvU`;=lM!n0c#;KO?U{e*qPgyLn$bjrUcQqg0 zr}R`1P|&!*T8NV|0z(QqNXwwpJZ=rGx0hPix|xurnJ3xGC--FtBtLX5!%jFz^?+#V zD~Qt6s8l|_=YQBo(=9NjCy|@B%p9Df1}Z0nB1qQpKK2cwq4*gmk#qOjiPb!>9nl-& zWKYb(NSjDSA50nF0eO~M^+Ev15I~ka7__6^9^E@=(KZU@Q6UZ8PGzFm1kdnT$5R<7 zHqpo*3S~MAbXj2EL=XTNS@rfQn}1&H`rac}x%otpym>S$954DzyrRWO2eS5POqZNQ zJ+5eYB8ACIi>}ui@n#Y=^m4$niy|}v%Sm6|5v3?hljeJKqy|VJ-_&ij9*Wm`WOxMt zkS)1Hl1{^xmU&_DcW^7jL~@AFU~(NQ`EhDt*SHH1Be^RtK{hF)RvT%t!GTYM@kp#G z)j&{o8EuADwR7W!nfkfw;C;@Zz(BaKEmY^{7(2`z*CQC+lvzs+ZONpT8XAI*2geXRK(pacD8ww%M$U%JxsibsReY>H zR{@vsz_jnpw?N&B@vc@;jqer~Tw3-lelA^H?}RKPJf~|7F0Z1@?y6IMU&X1dQJm!r zB~gYQ8LWIA-pZls_ZZZF0lS=Yr3ux3xc%k#RY;UVF>yr#N)qV>vyNwCug(s|#&%7wYTMk_4XF~PCIv&*0U!tk z)X*=-y`%09dA35Is2*#gp=zT+Ttwk{FcyCbx)z``y!mFrBc3_N9oA4RW|@-F4Pckv z?}XIwV}Y(?QL;Nt&tSJUTwO-b0U(ZpXuDJO&l^~ZhaLo|@@3s-1QVQc$dtX%m4u8T~PdPMt zbE&SQnoI%JeM&F}rLL$JYqqBnd%57}UG=gIT_XhKQ`#z73TZ=#VjE;X@Q)J6=2A$A zCy=*ykt)k-Wx%Tkg+S`dh-qUNDyW@IPJudRrmxzP)lO!d)neAMLEkA4t2U|_=6reN z@^GPcR_g|3QL?J6eIUzqUuB11^9x21r4C&Eojb!Kf<{1-$-Dz`CB2#9W6X+XT zqI^oa07Qu8M<6Ty@UO&~7bt916DmOaETA44go7Zg^8B=0#mL9~8vsxvwP=utpOmVS zbjvo+TYs`36DM&HlK;KGU}(HIpaU){WhZe(Gwp9OTWuOuiv2;J6@a&BI^SezZ^4s_ zfsn-Nrfd_|#l^ki?cl)c&CwYAuqxjsU>re((>0 zy4T>dNWRqYc-JC1YAto#n;A{)4AfoeY#sF>*uzLVibN$;k!gSCPU)dZn62PKwcv;~ zcjDPmCW99kwn6@&#w~EnS^ea#52^o~s)%Y7KCr8(LpEs)#rz$!45+mFWF2NuD^xj~ ztZIe{@R>x_kP``4>M!?Ua|%o}Q8=NpO0}LCpHs6fbw$o0$Z*Z#nFl}s&`_4Z-7`2Q z++n`OU}sAL)aovGgmt=Q8Dei3uOqB2K(Z{wa*ML41s&@`XJt`WNw%ZE)~{R!Rjj{I z1WoA!hDFRL3O#oKC5^BQ9>vThNVEyy4-$?ZL`L(;Tx3{H?Ur2&&6F7!)?BiN!Fj zU}UE{`;6g+7vfTs>VVSM=gNZ=fghVP37!U$mX;86XPL|LZ6> zLubrE)^}S+WncrO#5?9JfdpbW;j6VI3_-B<#2mjMm$6Xog979T|3`3qF<&W*Z`0jq|nhcAvO6Y z;xU2;JuWYQ0RjE5Z;~@ymG$AE2@sT$PF*!qkx*9us8nlW9m)Vo)>h`p~W9aE!tof1-1l~qZz9)>+3Pz#Z;M;wy+5X4+pyj+&OGkP#5zHygaE5C*a4R?1w3 zr-YG9IRVifthp~WYW?<5n$gR=k7ZH#>*cDJTTJmgMX?$wnj7FY3=(G0_2x5m8tHAj! zzBSD&Wnp7phL`AHt#KgLhb#-wS5T+*B`jfVgr#SXX&|2}lEqKZ!zNQ(!I_zZ?alzIpfCj`{q=uKX$YVv&dSE?}C1b{5hh^QzEf@-mYMNw40aU!R}R3UT@ zrK1ufQM?inWq;Sd4CH+j;NTB7vYdd5vH*Y#GXkKpRLKL#zne#8Nqn9GxhO1^yb()f zS@3o*TVAHY57MzsJT4vtiTxzaMwT=MUwVExoD_p6V2r@7u|#w((h=(|0C?J%r8>N3 z)QyLL;Und6R|f?Vl>~r|EC-q1%)^ZP*H1QRCsxYvGLN;G+yaKh8#BZ#%Zjq7V=VoZ?9PtwT5It;`t%Q7m9 z(jjHYVNIh*lWQWPjja|aYc3X-<=;!J3?0z0P=&71{hMJ{dI^_)9jqCS5>-K%k^rFe zzqeayUReMkWGL_Ei-=XzzQlAUSHhKDMh5DES8B&4aBaYfhgckaM}E%R5N^LP6M?A;FMHO{Er>=RBQGg+NcyJf>dd0 z(;iW6M|PU4+41sS*AdDzq4pfvNlG}ls!bM*I!fdF-ZlpXl)={h15-p$KMG5;?^u}INlb32Y$dpU8OL7LJyV4`&sbwERp({_BzO~#-N4o0^ zpF#(dUR!mMGWOH6pG z&q`=Roei516YhJJB5H~2g0#`F>{ok)}TFg7M zPv&BGE~=^8PJ==XS@nagVbn773lfFr$+Ct3+?hw&?A**^w~K&~WkhAW)#-HFSd@id#yFq?PzkXFL_{SJP?lxgey_W@ zIMf+xG;<}fzMOArz(H;c zo*@)P*DvvbyboLv|`0XqtU2LV&+Vv+qy@0f)kV_$v6;!s1kQVL^<0~^@l186sp*1-`o7ZdnxVb{jA&%Tn!!xXd4+4UqF{IByU+##_ZV zI11^(7~Okh5s(m+PW~%z#Z~kH5SErK!+yUvKff?CGMwjf_K0wk%>xSIR05U6fJY9( zIRS(g=jQwUa&&yGk{isttwIRhZcy_xP%x^ZJRxSd+5=Z6e%XEr#tOxf>PH8mcrn3T zn%uc9DCnp=5NXu1C`LEvzA{d3{zDdc{}NSmyatx1$c+cq+0z!|c*qxi5*rL*S&Dd1 zRT#9hjYlr2e4*%r?m3=Xt;@(wQB=}UrSO_;8D}hw1&x~_3MZM_AU;W>pxU#V_yUnmIfB@Ba@jRCeR+C8Ydm_R=@VN!i0oTTJUlNu&CXuJj^ zKH>lp^LmL@3K^^kiVB6qZnW&?iDPF_W?o8tk+ zgY}(+0_3R*gC^0`D%^1z5s!#F(ZgS+3sRMl5xEwGSh*_RxL{yeU zWyzq8m}QL&0gy^6sjL=I9<=p)IA%`4t^wW;I>Z+eS`sm{$ z!y^Qc<&8$30YX{2gn2~FGAxRsQll&b$f4TzCWkx72yC1p#kz1_%*553!Wi{^8#Na@ zC>lz|IM$-KpH{!-UQ67``-WnnCCeWm1S8{ znITd}Wm!}-WOi! zKb!yn%5JaM?-zNV7rlPB*Zt+qH_y$@7N04j<4{XPI7 zx=A5`Jj=5z0~btjJ`4h2qft3sWm#r+^os%!vn)r1vM8zuOQlB{U|FyZx+qQt z88-4f%QC2fVFX1{?7jEiM;>wbHP>D{H8s;{HmIyrwZc^-s%Qf$spuC)SrQRY$?@&1 zVtb|C{eJ)XFMJ^)UiH(f=I7^HtyZ4rh!rJHCwRT&=8ICksGl|GRJfddQ2Jz7%H)j| zfbwC8R|HEfF05EoVxX6k`gO}#kN{n@g&0ybKvV_X7cKPz@F%nnY2&dpe!0$+2V$!Z zY$3rhlK%&X@FRx9S$@Rp|4@bFhD)c$)V5IdY;efkF;tP5&Y4tL;e0?`vlKQ;Fl^O_yB8Dj- zuWyk{7~j2?FiU?kU1|TB??8B0$$j?+NAS*tVNMjH(*ZwVl z3$WzT_Iuv-j*DJ$(e1zg!^)Mb7JJ=pw>#VG=6PdyXee*w{i0l4==O{L z$nY>`Kt$bccd@(JZnhyqDyy?Ig{5u@ND@Doq`^kts{fFJ(oC$D+UYXA^2FUk`0j7plHohkc8v(;%d8}swC z0N84^%90RaVScXHEAqV2>9m{8X7wh^+}vEV*~}Y_`MKGmq;|92Xy!z)W56(3#2iZgOarj2B#IGax-4-%}^7A3V> z7=X+1vIV2(Y|f<+QI_X3)6-Acb+@{9UqIX^!?HZpSE^*4Oz!yo?rZNJO& zp)7BdR4mNR7DbUY8pA`wtyU8OAK&=c8(#OieGfR`(og>FL6A z+3XB;ilX0L>=#A9)oL}Gjj}8WV7@!o@ApTBM|dPzhM4C$0WK^q_WQjC=AGf8EQ9&E z`BP6i`2!z%|C`?YrmueG>m#G11o=>>lR;53aLq5w_q#m;?6lhm;NmR^RF>WDVinFC z9_j#PWw-ai4}M_%nzhG1Qc*WEcxV)r=dDfXtr?$BYxSv=8B3 zUtYK5gS{DLMbK*ycwJ%8ke@y= zDKMsr(j(t>$_J3b0T`;;6s(oPLZxX;Pc#!_OisLR@!lzSA&RetgWRhuX@cI>(aowm z_sF}j3C<%LzUdL^?SCgS+=yNSN<>)GW1I3z%+$7UZ1Typ#)%EF#aF$sIf=#155XEN zzUl5S!*fq>RE88S-AG-@gyU%+db43L#SN`)?T`is9|`j-9_3&;P*TOiX-dWSLkX9` z`ut;Nyz?4(Lo6mTv2IVen5gOZkqa|?&2ayibb&-#VmMS?J+YiHqlk1#mkA`B7{sGq z1rd@H>x_9&k9TQ=Wvq&U-U%gK*849hwu|Rrwc7TKb@#PY1h|?SR7huhKkkKZ`er4t zB8cj|=}1*%=8Wu+|2I&CSRR0Vx@b(sHu<~a@eh^XBB-Grr=EJs#V>o=PP^>#rZ>K2e!kmk zH)p4(J42oEl@r~C-t6p5BX6`@&7vq57w5Z+-PNmB_sjB$*^N_E(>r!-?-ymW-72V@ zo}B8m+N)NqTtJNxsa=yDT)b4bPaSo>QLOQ+v^UGj6D6A zr}z8C)a2x0haG&-!3Y2L*S}r0YE{|o7DcfzKi_V(8||U_x%tIzcXW8TfPx4x%Vwq~ zo6Xk5*ouP6h3;HI<;ciLSr+Y12Z*L8C&yPzG~VGs zzoD@@`Qc7G%kr`;XJ=+JfYFiBZm%~tH#t6G@fBekL{^;coKJd`U@W}M^%=p;&=;&y-*PEW5#vG|A*Q{D|@k=j$>b_6? z_BSuz`1s=`0ufA2PPUrub!*nm&CgFx@8}G5hT82;tBrYHomK`JOsrTz1@@uW%<~e8 zk>Qa>v)wPdGgH$UX6x3j&k-l5rxq6HJMH$!$Z(cti@k1H5(1QEIXpZ(JTx*pJ5%;c zM94GD^1LX@h55Nor!%p7b-&x4nx1VBwHtW@0T&k+=4NLRXx;jCQ&Th3(=(%^!&Mg3 z^xRCV(HdJhzPPYBIkThHY_;-6nPFM_ zIXN{sJ~B2sJ~lTuR}=-GuXEa(8EmwGH6zUfq%<+?TX z{*Q7XYiG2+vWnl8e&Qf#jS|Vge%4j|C~RLhVuiErEdUSbgRW5IVw|tNc(UBayNlvW z=b={Bsg-Ujv}D@*8P87yZ_~nqPXh)q|Ej8A-w7=BYuObd zQ|HN-=T@!dhF|j~jC73?rW63fhN-5`U?G2UOKG8Q316|kQPfcx|3Q>@Kp1y$7b$fP z6q5-CP^@>u@f#{pcxXV#5A2ktX+%hzo}DT@IMXWeCUj(&K!F44%4VVy;BLlcpU26G zm6eR&GXn|JL}RUTRqA@LrX9U&2dw=zpjOqFBhitKV>m~KCSGZ~R(X$}I5NzVP!i_Z z!ra{1&wbJH#~=I8|NL+7eAhcO%mItbFTZ@_#wXtXwm*6Ci!c1xNB`!Wv(GvA{Bytd z<*y!o_+igH@x=N0+5h>U|GDDIE1Qks#qPqoHS7N9;)_pv)@iNw(C=>j%@@A( zNM;Bjw?z!hJbQk~UzrHv;JdAlxIU!Qf?;ZE_V=uVy1qU8-@b)d+e)QuX zfA9NOmSy>}mtFLY$VsSmF&PoF7(boTtrSFdYN0<+lY`?f3BDsMDrW@mTXb+opTzKIHtJbc*`RBj9>StHK^r9Evd;dM3`|RgB!=r~B zeCW$x@$&ul-*3c_zPeB z^4Q4myZ-F$M;&wI?Cji!KKvIy`tc7w|8M_ZjYs^qfg3Qf_FD%oa?wG>J%Y#=Gee(& z?lulN|1@aWGhODh(j2OBqMVl->AA|032P8hquIRwzK4E)+wD{qRF;2p>0fW(zWobd z{1Q=t*w}mTJwJKrCx7&lA6@bNE3&*XF){J>x4->?hadR#r!KqjMK3z&u!FDr*)?aM zcg|Dy-~aym?)&dA{LdY?-?4S;mRG;>)oXWJ_nTkde99@O9(?dY4?OhX*DwF(AMUub z(P%8p%^h>pk>{O%{@(lTJ2yT1)1UnK>Z`Br_KM-Lkxr+RH*(CddjF^_GbO_nBm8Wo zw=?5KU5nhJ{96S5cfI4C zd+)tZ(eGaRsZV|P```bsFMQz-xBuap&p7tAuY2A82OYTK@eM!v!Ij_o&bR01=HB$i zH|@9o{{Ql?|N84&es$u>C%yKP*FN&dBcK0|e}7`b#)A$z;F4Fqdc%e%{^k=OKj?r% zUi{J*AN};B$44e^`|WQ&b=jxyyZ`>Tyzw?@QN!}u9#?d+V6SKdsdIH zeEXli4G8mQBg-;^5~w)i)Kktr|Gd5S-DmseEth}mTR-~YPs=QW95Bxy%l`V~e|_{b zo^jvZcYWjXZ{6_o8;3i?vvYGt9DdYGFM7$Id+#|rHS?pN{P0U({u&|Vc{V@aecoAT zJ@Y2&^V{FP{kGqiWl4zhi(LYknVLND#8ck>wzu6Jop(4KZ5PH7Aqfd0 zh=?8}h#I|Y^b}E|M@#hHds&1;CwdElghcP1C3;<=TdViAR$sQ*Z{F{3*JWmB=6TLJ z_x(HP30{E{j;QkYo}bC&il_a`igj?Q|M=Tb;f2viIREE=oj4PwH{XQ3CWM9-lkyAL ziqFUOdiFcry31Cd_#0c$p%oh4j)C`YGPMv6gh2ORCw`RLTCF~O(Cn?*u`@Cn+ z-zPQjCtt?G@+d^i!{^_8JWw=e|6rp$LjByh-S5Y56J@$U9(%P(f00?Pa@c$QKR&8~ zV;6-hDsQGzE~uQ0w2aL^y0OVJvA%l_OS}@TlTb3;3VtTF>s0rzl?mUG&Nhe7>}_i<;X&e&;8GQK`qc4eTmi6X05Kf zXDQV(u7jK4_K^x2F2j%1`5)=5ZX5mO`|(<{KA~;TQu-CXXmy%)UEv;aa3ymxiL+26 z%y?b$uF~XwR8qd_RQNl~EarOwbd?_Z` zC07Czzp=A?Su7ERm04kCWVwok;L1`oBo8aw4wqYlVW;E%%QXYc*x9BIKU8w#tmqzSKdq|ur&CWfkG$swEfeHyt4i!-`x<*-p4wMDmLreW zB;XJ$*B1o?EJHa9&v`kB3@L=n z2aX%rR+`kD1QM_iXz)ed%6Wn>ZZ(EaLbmgd+;ru*&&-`Ss>xQRcQ<3_d+n;il-?$# zx4yC?npTen|DrF|e`EPsJ^anM(2daA2qh}1&50f=JPs0k&1a5XWHk+%ybYDTJ|$dS z)td7Q@IQ9nOv*65*z>7#AIJ^yTlTjFq1rvEWOhSGAl_Hgn+f6fqz+I5*fR}BgJn;s z9AdU20Nu87K3#HnI*x9)wXnkV3AV1bdqVx!YX)q0Yz@@Qaj{gvZZ0;5{Rmgd-HC9P zK-_Vz?}rsTTf}S?3LR4(=ARzTz7?TfC3U+w)%6X8?1`WOLb!x?@u$b>?D@?&9*OT- zv(Fojx$Z^hNqOysv3ot)DIVtJk69kBnLKyYC$S<;RS*{!X&qP&6t8VxK_T0x1a@+L zFJ_%{z;1o$Kf6siNQTbcn@w;Zn0d&-M%zK{NSWDr>FKzX?MV7_7*9!l@T?I}zSloT zKuqE5#O7M&yB}OZL9RVLiQ~^l(bz5fl6;@hsRZz;@rnn`xrxPdv?hc=l~M7Km2h4G zfjc+lf-WW@xPzVREj;VxM^&S;1(KhXG&FVl-yZUW>ULAx=6qxH9F#(oh1UE4=jhT0 zTvvxlSG_AGa~^O*#aT7M0{cZ19K}BnFs}LeIk^jtiE>yj=jG~SSI~8IzIn*T=mGzE zYzkEJl=b?!F4of%z3jWPtO>_fX=2NkEl{Pb1S=aKAD2%8(33Iarn`v=-a8Bz%fQ?n zJbVRJ4?c&wVzxSg$lH{U+nkSyhTwaD1tM$aR0La&S{(>%pWN@UP}xDN}9xuB$oMWPoCAp47sl?yeN9_QI&ne1uPC^QuKSAzIW9$SW;!#4DF3G;b< z-MBO&7KwE)mvvM(rg1F}rB&w+B+G z^LfGuiTIztnRV|M_N{RK+jl6Xb$5yi{PU>3lf%&B@1zo4UB#zbW=rW^ddiaV+umO+ z>q!Q+z)9*cT&;B{8ZWv0RPCE|h(CoOFp_GgyHjOrHL*!W!dR?NZ&(6MrNRyJ@P$ZOv_Z;Q|-@5PGl$k%bVvnCs;H5-dj zzx~?dc`J>!Mk6{rp}cHgCjDMq1dq`p40V8X^D%KV=h(i`9c4YgjDM*{CnxVW?SI9D z4QWwC=aYtV_YcR#g#B%Z9j7&Rxb0l&b;w8>V@=Q7wf$;gwAJQJmNJth*rX8aVp~;d z(Z^Mm{>WUpd{F;Qkk!U-E}mbgx1lZShSQ1c3W-|&q+l@3?Mrg{X+3O?Uz10Nxh2#p7GHnicN$2W9-pysHq|1GGF&|5xf;BLy8m6mwm`epQeSQc-O zy3vQRp*Jg^-``LW)c4U$tefSsHtGb!TbX45wa8WoYO`%yTvEIUsPku|o14>@^L|AO zi>=;(K)rMq1X;r|v>$!n$;Bqe3V_d&)Z|Z+5&==D4k&1D3QF$$1J+fYhTK&PR34F5 z6*MLvhzbVQPPo)kAOUYkZ+<<@knedR1w@Q;!QkUEp1iYB&U-SF(7MT*XmXYSJD*ST zj+;6&Dk9E7=gMMtn@GkLE4LX2w3m%y}wNe92q{ABcCoRo>7 z+xX$JymI{%WyVaizKvO{{^nQ}K|?1-&_0BrsbHj{d_W;S2zpet51bh29;=>gN;<>9sAvz$-c56)}(m zy6Xm&gp3jjH`RoKpv(k2S3m0jw+(Cumng!uxuE~?7q!O$N27m7X*Hdmwo;(*t5}V| z*(@Ob^a0N=5a}r3e^xUvF0=DR!o*kU>t$_5C+Am*6SaYaoo%c+)}J^WCQGlPDuIO=X!4|lCJG>i6Y-E;+FM2$*L zz4!N6UUG)pewK|s$kK&{tLMf|^^uVQD*mfrEM)gDL&xgPohIq{p}irSW!a<98-m!g zm3;8x-T*5)?i3372oxX!e%&o_FiMkf<_tVSd;(I&?79{N-f$H3$JGpg-1k=g+k;!6 z;BgA`OB}7H?A8G2ddPVB2-AUH+{jsJZQspkle3iF$PQ5SXe%O zX~%0(X+{XuLAXAJ26h`k<*~I;+*GMpS%S<(Gmu_(AS*&@5ts%+@Z=ZUT=(r`sN^;9 zm9Z|P4}A|?23R(o?r8`A-BmwTzOyJUj7wo`;fu@yU%ntdtZTz-0+tUkuECcEpbc~ zd)5O4X(8>_;2-tD4k&#}PrUN9UYCla7eCu?c|SUKdpepfW=)L%YSR69vssX4bCUKC zyI8R#1!^R+ zze#6k4tpOK&T!gyKDnhxwA#Zq4SF_QH1bZ;Q_1M>X56fL{j~SL-N;RuM}D=>{HlqK zdU=C|IpROKjcRd-+L5@um($|jr1a@{q4au?>8bdT%$~4^a59=+A$Ol!YiOg?#qV^R zda=ho*RGh~cb7Q@Ld78!{z>abI}VYeWkIWE5l~Kl8v0qt#wo_}9 z(xi{ShGQ3g-#UOKOTu7yrmQ@1tV!LRy*f)s=Vkdi$$Rbh={uxa4^*@t#J4NFR55x0 zH%tFS_L9rmUtCreHH@eSl19 zSZ-LZ;1AJ9|8T#R$BjoSL&)B>7tJoP8eZgy8oc91d zMuYUR_3l zu5q4F=cb$@PRjw%Msv$T%Z?oC`;-QVS!gAMaN|T4bezQ_do*F-19Q$mRJLM<`M~u% zhk>#+{yjxhAaQZwul`>%k@eu_MIT1}!vb`?v&zh%?hZsM#@7QtAQ3quz4~T)V-A z&`1Hs$V%|zuGv!#{(@=F_Xk2Bdiv)HaqjIuryXcd=b$OsNoQYEF7$|_*m@{`Kl!0w zHt8fT6h2unp0j-U)i%$|!nRpdME0bBD)=(i9QO}In6lxa&kfJFkX5XbLDrrB0sSkW>Iq)zTNXO^{DDp8dO(0Zg zqX=DCY0jbnxsB$+6__Jb4szOoGWFj|tHNz$?TdtOd7ki zWDU>xNLSQM)|9aNjy5u=b3m>c(|QWNEBXFXUF7+X-XA*nB4xz(&&KIDoMVzT zLVsoC)W)6P6$t$a2~&|c_C<0ntkesCAvuO$1a&TkVSUc|i3<32-tyqf;^SJqS)sV&*WZJM7RX+l5f z2j-G16kfqoEXTDnw3_gkVFymL`R2K4&HGd=q*jdGf@Hn#n>Gg)GUtX?uSx(d!r% z+OKvmU1_LOY3t-IwXfT{hYk6Sk};jJUgPsm-5;lhCgZ!ju6%S46_M(QEu)C5lRCjh z`{1j0O%NyssJuAGBGg`gc-El*r5H^ zGdjIlDT8XXIo~H|1vj_NJKH$3WoH^LFfxzlj7`?m4DDqBHhI75qcQ!jS2SwOov1Ku z)rW=vn}GdvbNETy%F2Sn3#LqT0DcBB>jZ1Gyzg!m^a6Sc*4B9EoRgEY;Ex}#kj>A{ zHEQutF`|bxBIl9M+E{`|Yd~$7Qq{7oElDvsnHMkGJ^D(Ah8PE{S5Q=U?>50IYWYWM zADY*AZ0$G9+bN!V+<8AcI8qz557zAXxT(UYU%Brkt)nB;dA2182k&(7aqBxRwx6dP zg98tM`1PO8v~JMk^;Jein~mgSG5Fh{3LMw|n^BpPx#LL>Ev?;lk0^-CnS*YzNJ}tb z21956%KdFLWnc%m4la$^Eix$2w)4*Z&tejmm!D*OHq#q@ z31out=O_~ru-b>SuU?nr%1TSiON&U0%6X58&Ba2xKZPb5GVXZ_lU6G~0NABY#A`9x-vx8+Yp zq*PSI$;k=$u1dKD`gPG!Qi_}-0r=(1-pk!VJEI4jmK#x5>wnkx8xSY$EdlWCoxH&1 ziKC-^y|PAESkU+EFt5b`Pgy5H?dcfLnaNd3u*G3( zV&YZVOu%J&Rk2^tD~ZrcXQrB%vj4h%XVARq(Va7+zIUd= zHC$x%>(-A1f4x*;k9%g};a8I^xtlnRwnjUvl498s?;L7}|jJ)^*;uhq~C-q)whjujJ0#7z4Ml`+vQV z=#ZDlzr6}!&3HSSLE|SliRBC14=OBNeu$#7wDm&hSFJ+B=p6bDq{!hwP>5-#fB)zCLvgoDBttQnMl0S8IceT>WyIOE0unGP4zh!`I zQ}L30;H%^@NUbY%G7C&>dKtJbF2RtxzV@`4VuLxkGrCo$Q333;^o&E`*&E5#g{0zn zW0Lhnj=WUTMAA(E+n?gNMPi6{hnu|w%;+An$AP}GQLDWzdSd$=S(Dt1ZfswxR9?PK z;U+Hv;ZzKbVpMf~5a>S9#`@1&Y~^PNJKrMty}ILis1gz5I<&HNf9W(Yu=@)G_@GL@ z)fwB!ue6UgJ6osV)>mKhnt}%6N&Z7O^vY&k0OPEioOP+j*`vwSXZ$oMzy~ufLpb`( z(6ti0UmJ3TgH!<7(4htTHz!rTxgo&1yNaLi_n1{RRST^kdstD)c*X~$S~?hYOnksun*pCbx_Pxj>@#YIygAEyu3Vy%6@WpKbC-WZcPrb z{6~jR%3|!*m;-hT)R^5j0k;G_zmdosF#oCTp#GHA1w#91j8;Roa>gZ{>$!ke6LNl$ zk)?CDFvEGJ#&RY`@8wp3+G8Jd2fD(%t&yKX(J(W|cvJ@drO&L&;Mc3Ozz&)}eNk~!nh@=WxF0ogvB$4aB*V3Cv#rgi}%ZEX2cOKbe zdLlSA!e_h~5&bsA#6Vln)7V<`Grqrd{DLv^90&E_xn)J)9$Kc0dCMwUXdoA{MU^=< z4IRJ%6nzfBv!rp^7^T}{UCNK)UStAYG>UxufRZ03nW)|B&%6{f;{ z!+I~jVJG^u#H3b~oJhs!9@SlQU-(^DKfI$Lc&`sc*b&I3cE{PQ&5y&DtcXYpGNQ$AV^r(#bp`5pkAk_STOgV36>u@uT% z7ENtJAoKhD0zR?H*<%;DzlxIxK>xu5sI*Vrj6p!RcKb@4SogkMed$MZKiEB8fvy4~OxT&x$`_}q* zsLGEIex9#{&BzLH*0*mzo_g6*-*dATld$>5_eodxbu_7U8aT&^?)GD`xK))5Zo#NC z?!q3*XURDarF*Vv|L|7IDVN`Krcg3qyOs#F3H^&%y@Q%|1SVNM7qASz`_8Z{5G_pS z*7)ub+2T>u*`VK`Pi^H*&$sTJQIDbstoO?Y#i_U5H3Stu-$^GzT*AVh?g+ZvJ-=+& zL!XvW7`Qt^Te}NK*eOw&DHsVGs{`9W&#aF!2JU7hJFTY(@1lTYZ7J;n3*Dla1TvA+ z?YRW|Y%&wg&abG&n1=Y9yLKObc)qpi4o$mT=Ya`%_=IAh_SBBZFX>m&$9t|$olScx zF?(CDn_qG~_iwGf;~a4*&jzyY61O#cD@!tRm)V00i_rE~%=>`4+DP?obLV`D;$tMH zzps*n=%M{g&}i3{oJ#2**HqE{eQ=-gU6h?^xzO5Oo-SS@J-PypbQUJPdUn@aw%RM2 zd%5fr+TUt#eO+_czr*YJk?l8&meRhi@!Loz|A70&oDMWZq0^IXz>p|2Wyil|_juGV zU&q|9Rx5ESYc>`M?9-+J1|?gW%4tgZc6^_&@mXlDNGJ~Rhob5_KSk>e9udA6jw_ZwuMD+5#AYuk_WfixNL zwdNz`&${9HwJ<@K);}|h(i`96RO;#^O<6^jV5# z;I%&#g31eI4L+!e&k>iq-nA6;TcdDkKHdpw-k@RtEaJNHpxMpM3%xS^<%^t^mH$h% zp5xv?99UVpfSLNj@j$j`2ha9)1q{*wHC51cO``bX!dn5qt1>h1AplX&t_s?Uoip=9 z0xLbX@Y_{J?(;ejt6geuYx&IGREg|YsPu@*s+S85yL09aC~T35AQ zPIsW?_abbU0VzW;cwvOq|7_BxXcBp`a)g;9Y=EwNz6f?6L08Z_gzJ35u>>o2L^EhV z#T;-67JLc8fEaw!+K7^>p@he_^CYdR6CI4gW8VtmBSYGqn&ohx89G;+Hxh%l%FM}c zjoEnmS^WfH_n1QSRHdGtOj~@dc`E+uKe*EWINuThw{TlDo#xG{w;j&XDNe5e50v>n7BA$S`U(fNsf5@bP?z^ z+8ljAWJN>{+=Y>?Ji0K}Y|+$Y@U(p4(Q=J577#ACMy{`?T!RrzsP>KVvZ~I2u|+X! z?d?oQ6lqkmHJsjsq@~-+)Zz)q>c-V|=}DC&DzRNfxj*u8{y9T?f?Fr+r|- zf%3^g>D-G_@3N8-o66?(n76lD{$4b?1WDA(ycR}1pUl4IG#y;?OX+#3+Ex!Gk+?i% z7yWGJdMs#)Q9@LNSjTuveZu(8AY`#PP{|k3H}1 zmX^CFHj-T3p_``qQt;|?>|$)qH)5{$i_hs4O!6#p+RNKhC;If2VP-#5Yi7aA5o@0; zLd|CW=+QM-J05(9Ktx)pes!(mre=G_{ys9@s~3dL_e|HED_$``tx z-|Zodq7u<6^L}PqoHs9HJ9^RjGl5Di(n&1*pQ+sv`fS#8QI&^I;{wJw9!2;@^jO&Y zgj=k(m@7bIWKKLm+2b>*x_*SC-F@E$zpcaS$^=?=mvkzw`APgNAGxJnOraX$mNf^<29X}nsTD1kv0I@c|Hu#@&J^|qOt+7iY9y?V1i#Xb>I^TmvmJja7W^gJ}wu4AGrQ2AJ?{*B~^Gr zn_-5Ta|Ad@0Hr<8XtzPOHsmxpwH(ytFSL3a7iHmR04xVc^TMFu?b-_C#xVf_9H4E1 ztmkqK;;QEBy+?plP>D5&KrVm$N7H$s)fy<0a`SVsqktH+%bD1L)Lagl7R|dTpaNeS zKyWjoqi0#R-!F#V3d-R(bz0%zx}?au&o0Z%`M8l2jiUFhWpZ3LwRLa%*TP@@9D%3V@U?IKc70s!0sSwU$+Z z5ys2!&qns?9!@yYH%_f0DF=6s?rV}6JytzOY8;V`Y!`u>So}Pzw&v9 zuk}DJK2yaNcY%1Ls+|fLwh^KJz)as9T{2 zpO}$Ky34CnO&6&^cGp_kZ@8{Dyx>oWccgbEKt8Fh!hoQ-%DPGnd7mO+jT5 z<#E+dN6eRTBj|Q?Fz^ZS1;7cHXhOhT+sg45L9qR&PuB&Jtnli!+o9z^t6m=ApfsP^ zXOJBg3~igMGA6811#McgViEs!6AEHSLG`fb5kbJ$iUOUZ6J6)4ErQnb+74Sb#%1P^ z_16h9*Ftilr}JM2svyUhI>0l=IJ!2YmazuqhQ}$agw6kqYMzjb3koxjwfXtozf0@s z6|fVVx&fYKCzEC~IaiJ(p_pyoGE^zq*a)vs%rFufdr2HOBqQ~(Mf z==vo(!RNy>zDxcCE4VS9+mHO0mzwQq({;}%27e!TOSmp5;tSy}_#P101}J>}R)B>a zW6L}u$&I=Ck8Ez99UTEZL3EyJ(ISVx-!p>r4iaE>20?ekHLWF& z3kni1tX|yh4<|x(1!%u(HC#T=G^|-vYTr})nf{{VzH?Idh(-N)-8&2u@h5lFhWQ8k z2gRMPlE_Vj;AgAHd5O|7;RN+G=+>#+;^%}(Vn#dGl4t6dy){Bt0;!KxGSEF*ixW)U z{i$~hblklyWQp56vwRYC95=ZH%!H!pr3$?S&4@my#j*DQ--`rs=!5QVTB4T+=K(UP z`l;Rdc_k{@2`BM1$G`CVG+n*Dy%Q4?7f4u6Ja?5kI}@r-Uk_8+O<|0K_o z@Xg`f{n6!phh8rIA7(M`XZHB0gz?X9u4ZCZojDxEn6H(`P#fhPSf*dK zkB)tA+(@Kr_JZ@zomMOVS>prmuhNcl6}eeiMuvuNw#Kh4SrUJRFh&QgDv~}6Sm>?O z_DVB-@_jgYShYx4OjJ&|alMyT184yV7V7zrgIFx9%FD_#YOpyk0;-#R0|-VA1s>q4 z0-wjwl>z>1^i-YB3LpTZS`pVXd~I`F>3Yx0AT`GQD*gp3Dj?W6g@%XH@)gDOM!ze7C8MwpA%U)ICU z4FF}lF|1!{xPU_2ZWsG5TkinN))!b~K?iGUA%LyE6pRWkGblei5A>v{(*$j2){RSg z!V;KQuq&=NCIA8+H#28e_vzGz{}0?=9y_}8*kiXKM?%gWXclPSYHB)YopRyH^ZPq^ zIp0J;pJ)Vn70A>9@=TulKI0008O;I|CrOjqymyXZX5&=KMHI{7Rg*`L5=WJ5pMjro zKV^FA(m^eNR(v`7V^JKm52#sgt6?DQ!c3wp#;tAUkO5!&RH&x}gwM?NUDzrut6Z#g zCa2p18qHc85Uy>=rbt%z`Gz?Yd^8XlXfuL+<^cDz#&YUv=esZN_JHO)4Y(V;K>`3c zDVcH$F0?ge9I&&_O*l+C2U*2u|mQA@Q&?*v1dkmxBUTD|?y7eq0nou5jb8=^dZi71br z@XH+kOtG~s4mlpl$%%hl*Zvd>@9U%0l(q-NKX|+QMqZf^j`S(Q zD*;anjENl|kBd*p^V#3S0?iZ$xP$mPb97lw2;A<4FD!TtK#05%v(M+uLzFn74NW@9 zj}w`G2iVD-g`-UIjq)w-*R z8&oF2=g@5%hW-JbsE-~2SVq7(2Ux6}@7b6+D1J(w`~YIH74u(VF_7@=^ZEn;P#k9Q zEC-_DbEdvMjm$884Ru+>sA#@V?^M9ndc&MqFx(rI|1js_z8An3YDytDEfb`+Lm>EE z7^=Br!47CiQW$s~e5PlBKLEOCvLEKocUq1dwxPh+R}AGQV(uGv=T<^cH^`X-{;Q#U zpmOMQ`c_)LfzFc|LDrxN_A0-bGQjO=&7G~NDl}yzvAM-KE;xGEchNTY{JW`7;4miu z44eWjNRyEgaS8E8mzeWxX7Sp550WUU0{xAIjB7Pd&kA%X=U5>5g<}{gMA9796A8mI_*`4 zIoRK~MnXm+c>fs>3iuf-SBJihE(@~`4I{Ob{0_r)6CB!{yka@d0h9C^wWS)b^hn); zg4&<>ofSmNa4KEzRHhbes?(PHVof&$7D-l{1Px*MHm=V@{H7)*=k_6mPxgNMKh#co zLYJmnG~vvP(kHvo-bqrU)2hTS>TSNQMaFO`D?PEnw@9OMCbBTz@$%a{E|$(80dVPF zo!C#S{gr$Ch7_V*s>ZsEsgP3Qs{sijm+sd#{muq?Pb#;T4j&kka2Dh@3r->wOJme6 z7SE`gd%#`L2c_qEyl=m)vMN^1!Td{d)do~qgI2q3>i$SmUsDsmi_@fxr*s97vIRTk zTZcGCE97lX?k-aIX0y7-i-LjdtFuaWENJRf0==;(9F|M0zE+=^eVPh|@ml^;dAJm7P7QewV6b zSp5P|M>=qyYm@}azm_{^@Tbo?+`@K{mHXfM$V5DFG-La-Lp}uc-B-|NjxIGl<$eWk zo}zVqt|EybXP!odY|C4>1L)TF=I*Ct_#V?K;UxW^j6NlD({^-C@E3m)8UOcc^^1P{ z&9HgIxqg)y9EEOjTA=*Kekvx!V3cB`o~!!0t?(ocj6(7r)D19Q9(SAKJXHw_0mF=`j^wNPyIt&eStt%itY>ycOV+ObZ*A1$!c{nc&*usqaM1MyQmd-XeFXwwFUX@JRJ@;V% zpxSAK5AnyKtRjN9 zX+;~FAj~eLG3euFAZQo}H672cYFg zrxTFISUfQFq{^tSamqe}ORjV6*sKZy+=MLjcf{R9P-C+Y1PB$4+0RcNt1=LD7wUg6 z@rS9q@%9s@hF-m0aH*}jKO#_@FdH8qPdf>OE7=#ax{Is~zG-Lwo<9>`E#%`~wD``{ z;6--z^ZPHNu!e;%)p5jbZOykLS?hmLq(C)q55D=T@^~N|OfvSbO`||tyXxY$Eu|_G zR}&tStVk#ES6vxl{nj*@*5Dmy!V}GA9+}OrW<2D&H!a_7^CSAT7$4iqt~Ofe8j9>f zG1u#4PsK?>-^nZb??ngwqJF91*-dKFYn`zyw-p6w0Xw-qER4*-yWQkPOZ2w+w?0|~ zwTp_>2E)XeoE3c1w|X@ivT4w!9oe6M7vH2K-y+K~B;O2|#dSr0C{%wjX4CmkrmMA{ z<_`RhaSnzzFMHy^UnDhS7f(g5|N2BPc;i#42A7hV@$nO`?IdQ~&#LFW7N#*1gWm6i zvVL*=j@2H2sQoHW(EiuWqV`O}hL5$Mk+6nr)f(B|(yZ#I(WPLzTQwhtnF3#vO!G%_ zlqtD5{UfYMrMvBQtqa=SzT?>y@ndV^+kR|~3@`PQoCrpF&F%M(l|p$D%)PYl-{^!H zdC68vM7?K^)*f#9rWm!~;<#L;>9r%gKtwElbNOr5pDksh1G>#8rR0xv3LkLmOcd2L ziue2dayW18m?<+rk6fpZ@h+0+Kl*GpGCGR;8zkzQY%CdBJa_MIm$joHyI81$MlM%#iDiT3MhqyW7NE74*Fy+z{$k{%B>q93yXs7V1IhJe@(-rkg*c-6Wuj2thG zUN*I9J-}0*@=^n(qH%=}rxM97o$dqEoe*0ifE;3yN}WcW$JP#>v_t0kupK09BX#YQ zPdIpEYJZry<`HF&`4lAy0&{Y7Exsc4+kn<&0fBU7V5nT?m-`k{sy4BlPkSjVYM9r& z-0YNnsoDO8@;TQ%bW9=HTO6yNa%uWd0Zjb>S5ai@jnHvC+NTuz5RU{<&e~HA!pTC2 z^wBqJf)dZ6TRbZti@^ET`#mg2Y4;KPMqJE2aEh6=+%)J;GfDvYY zoFrhOK=^s3oN3uM?3<+=Ukz6!XUJN2Pe%$xM@o9^F`HTiO<^2Xqc zAk@`WofDJ?S|?{2c#u@b#b=nxAFccGfhXy$muwsg5wSTyCFqL|2+^%DoWVXm>frW+ zF2iT^_^xM5^=3MpixKwHuguHn{U|LsIfyhCZJdL1$+DqnWwv)y9UV>Q&hamW)Jsx^tQM(yf_#@XvWxBMV^x|=?)3=es&h{*c(fd}-n+#; zHDo33_~>UCrW2KJx*}*hwSejGf7#>FLP{MwY^V@ULmJ+ZgNr!(+9EhrG5Pr86L{&D z5xfT-5!=Ji?BcBP*+X)k;-hM4L5xD9X{ zExX&N9pGJ_lszx!yEIIN;2&ES_g;LQBI&Xccjigi3TiPCAo?hsRi9#0W9TzdN&JJX zxNgBpg!9pF9;a#r*}&_Aa{zMkC0wioT)_pg{Sqkr0_3U=fQIsMR^c?qvQ zl3!k9SW;UwbX+q?Vv+KQh+^^IT#JtnXi%BxE|J@B%>GF~ldi7gCsw7bX;!hCpRCbj zSU%C>@a5?mZ|=n29~hB*IwB^2@OCO`7CF}*QI~3POUBi-AwBGA$9u>$>HMU5^5!We z%rN;aV}?}!dkgWQe{X;D#A*3~iA@%0VSK+uo*9crNKU4`4h^|``|=*#q+cT^ocga@ zy4ojc>&@iL5oMT{;TxHq6?<#bv!2^g?$3iWN}OQt8=DtBB=wBH8;S}mE2|~47_H1p zpC0VJUV@Qeem^g^b&j&EyYq^&ThQ_CV09J+Pk(FNE&pUB<+~Y@C-4P$Lh?g$`@kwQ zYuw>CE;dNKnXo{iVRExrpE9+m%U!b_$$KgVA6&HQZz^3THGLH6yuT?@AnaR>m-!|+ zSoujt+SjDAzO9yRQ%>p==jg73`kz9Y!t(494v$Nr*2R=KtvqcXGbiF<8uM??^?ahY zAT6&Bt3w8)y;OeRr+)W<_#2*8td$=;H2bV!a51Ll6+d3*#bxEDj*L|y-_xOb=AW#a zgfDm+J}1NX>9sFfveii8(Bxi2U1Leb%wY-3@Mi8?8Cf?PZenkc3fyTiN^!z9L3XxN z#7>7k`{hMTUme88e9_Y*-3rU^<1|XSs8XrQyuF*9;UxCF;TgDKCY>jr#LmNnj>zhB zPO*^yy(5ANn3!>Vaq$HXhwpjq->4_snhw!m{Y9Hh$!Gc`=A|=nVi((|>ipEn;R~i- zG8&kVNIuFGC}@2S8yCubvT45|JtuOCrlB zpD}Ne-Xgx0UHtm{i+I^Ul6kh1M5}5_9fs5yaZ2TBTADeUf9k?CuZ3<=dd!g34CSC{ zX>8c1htz^@J*g!RaTgZgvm4#AT(a`sN-&9v{plu_*0yRyJ@nO#$*eD1cukOt_vbsa za1B8P=a06wzS6nvSMjbb*BHmh0z&TqVYLj7m7ULv2&h&)ptlNNvd#P%ra<3lpG zM`ZW&Q$J?&-EoFlVc@O4qc0wM*6M{XtSeHwJM9Q$)qD=Tw~)I1^>b_kqt0Z3b9fr1 zlD0l@gvpB>do~M?Osl4+Rc0KIzT&j|yEZ@Y>sX=Kj-5FQf6~0kwq}8osdFek>7}Qx z(-E8ac;k;}0z5`W^%mbnBO6cH>e|dE35Q#5Mft>stfz&!)|*XyuY5(a-SPv8N!2AO z_as&d?4M*QjvoCT?7gDjU&>B)Vsg6m5-B+7l+>KO8!;|7%Vr>1*oFPP$CAffD8Ig!E&m{ANSqw6DrrkRz0q$PP=1@&JR7lF2HwggQ8j1}P zq%uk-y&w9u_4NlIxc^IE_`=a6$JW z6z#P`2Rq2=iJvzHiqPK2&QA8_a=9Ba?Ie+LxhMiO00T7He6|i9na_9s-M|00%jJC1 z%#NNocKqn^0fwGm-;g_FvrKbMPO&m~O@n|)Fz9oJc`SW?*m2Ho<&0L0$gdq4%R);M zNU2U*dXO}ril!$5A-TDCU^#QPEnw7^=*2v#tWr7{MpXd@uWiZ(y@luC+8I zXiRcR97+B$xT!QH=#(X3gtQ&eJZ&?I%X0SL1OlrjE?iR0&Pvgap5PjfjtdC)m05^BS zS#o5uwJMWXeynsNO_+%wu>u$?vT<9*!I%pibuk zxd}|%o~^}Hnv0RD<9i#B#R@N(OqYd5&?x9kg|fkWvnc?Xt1KlYz>t}H%24FmV*qA( z5wjSMlryEYU!5ciuZ-I$49ZGZ5E22uwAZNA7yvt~0gEsq=(glMd-PHmb8qg9oQLZR zcvs)(X|jw3oT=PsM=v_msAwOXAEyF%!QJCIruv-3$?T1sjfaAiGest*IxEhq%a~%^ z2E;Z%bXk~33@c!>hA;$bu{94^R z)A2BjMTSsk(e4cRjQQB;0AUbw8C8N|X5iV#8KvY(q1F}AF#*^3%QWXu)p04;wCsAeoRVXYCMB9l&8G!(PvVc83t zFwcl;RzaY9r1kkOc1e;bnCQ@O42U=k!{Nh6j~zR{TrT^*H=^UfL%I%@06a}^b7)gZ zY5`7gBoK_61pu%65I|4VAi#i>-r0#5gFZ?8&@D2CNr7}fCRRTr)iAM;H0$tG6OSm+mq;4=#oBCk&2`rTV3VF- z=sN;xu+f4YA>aU9swYNenUAsUpw+8L-AE7(HCaCLI5^mwM=-;mtV3bV-%SF7YKR&w zLL)%{4-1A)^ez43=t@8mvm+=17;tLF-W`(!li8cn5HCwY+RI^F-TtvNLmrTFm69FH z4rpY?5mKo&J-K|u`jmH8F$Pw&&T~f6Dn_=n9RrLXa-JcG=pKSV?bzIsOMGN94>V1L zBh7ZqUspkrs6>tqq2Jdx8|;bJ*4D1O_FBYd+4tRY0j5_{hvM&GN@xZIGPH_c*+>zC zTL_AxapFs|7;D@!4eNh`L(;KA*ZfU)!tn3IfZIbFUE9*+WeW9&WJjIdWe#kjW7%%dXQI>Sc#Pn#|k0dsgv!Q$d5&Yx5Cb>ts%UDDh zD3)eS{~F`@q#M}hQ585IVFdMy7S*^1v~Mab?$t-;C0i1=bO}3Ej&yVCdE`lu=HQj+mc(Iue z+9N(*E&KtP{j%eSta(=@;G9%#Y$Ozl!ST{mTIhGMett^z$v(+x#A~5808ufyvQ&AMnW(NK=39v|hhf&nVBlg){a_!_qO4WSYAKtvFm9=^ z9~@XJu(|0N0``5^bwg$(Pw1TRhav6g8A}k@3z#e^lbQKVnWoSXa6E>7Ju?ZZ|Y!>^z?{<~~N=?&Z+Ni=kaW#pQYsw#D#Fye)L9&pIy6u=FhuDY@bS2}`6-153 zsfx54br~%ln;30OFZ66iRy6RwgH#}{6b=+Xa#|2q;=)b@w~D5&T;@($6gf%pNe-w~ zW15N1$t2FIb=o%k$1a4}^PZk$NxqU9_(f|FUTa0o#U`O52;_Vw&Vn=;n0c|22s4?d zoW{YdZ#!o3o#7ZGhdd1u$B{a@ zyb*2UhHws!y1BzRTcpLue6M}!ORoxv$YQe7dyxR2bS_u+%*~LukfHXGbNejU@nno| zsZLA_z9O}{tG)Ewyw$PjEWYmC@TK&tLjtfKNeL(kG%hV@G4MNg%`rl29M9 z<5hL%g}|4h^2DprYCJU2$L%P$mb*eros}i`NAhI=Z@sQ|YOYt0>|6RZv-1ex3- zUDjMYlMCqR&z(?S>W#T?V52f=ua$KKi0m9H;z{TjN=q_dGcsisDXCi(&ss;6G|Zrw z%svce2M3B}B|C-j#5jlmP8&@%8J#7A8b%k04mqOSxOQxCD0r9&uxGng?`|3J3FPwN(Q;;=!MnJ=n z3?%;R#>6Z;HhA;El?DZ=o!UfAMCM z65hCI$t60DJVG~`KAd>snz`rVC!I#yfb@~y*UYS|xq)epdjkt70JEnL6 zn#EO5mG8uSwq9pk2&`3@226zf@x0U+Q7Q_~5VWSFJ}lNFQO5-AK#4uVy~SXuD-9Qp z&axl=68G-_seyuqXZY~QnYEftO7y1d;_uQ2Ty20?IiP*_BV z%3&ICZ4YfC?n+w5?7(k0&JiI3u?eDDEkMS0hdep2$V8h5`n+K#6_X$^|EVjBSrCg* z7|D-xuE=Aa>!BqK$uP=tw;8o5+#?==aBrsXz|5gJwuC&54xKE8#jCofyt~8Mg9nwv74l_<(F4t zI$*jTGb%TwG9TG1WKy9$uPR|!Mv_&VphdAG@sfx>ac_>-nPbUZ$yq+t<`#iSTe9Un zlA+CL7b&)I0WNz&F?;o0xqw|6u1Wz^vYLFlm~LfQl7tZ|8=-8eC2oW;-C8Fj&c00S z78-b16YuiTNU4AT8VCo+XoOWl)0oMBY{Dj=Vvaxw^Ep*Vc3g?bP;?SiVFQqDCB=E( zjIS5W9Tq~2q_yzmS%RMLIkHtue;JX@Qq)Mx!+Fw~)NK9exY zI-`If=Ok5}t`rVf4oVukwyYirzex=gdlM2gD2EM8Mh-5QFz1c92x9ZJNM>Xgm z{%X15tC*iKnM`B>De)76A;t_Mp5pL9^Aj{2Q*~7N8Id^~Gl%g6e$1#GDUdue13*}H7eKCp zI@mW@N+N22iCmy;-)5Pn9+TB|B-sFvs(*w*NaEvF>KHg&EWoIBFTq;X!!cK6A5}&y z0Uk5~pa_jcParYQccLRyx~?8ErB!elW6)faj3Av%UxbFxc!VhOpE(Q#z6vAcokTX+ zxu@eD!F*5Zt0EPHas++}%2(F18f}7M3T@fHRXU+XF>H={V#}UG7hnqm$}l2k2ZECl zB}_7mby3R&!B;be0~TAj90vtVGjLtEF+*E@l-0ESe0Qx=d$X)gvhpjjQ;b?`Dya`M zNftvhj3bJ`>?nMT{4rK0VJP2cqZ?mJ7p#B_m*-aCFYroHX+K^AXa!>iQ5e%3%X~A2 za#M8|@&shf!p;HErN|!QRzdI@;=BAU01!)stOg1})ZY`yZb1i>1ap*o3J|CIn#K%cfZm((Q1527YicC~H+I59Q6 zJG*h?>h<)0B7-a#1?Y;W#m*^41E&P?p*>L_Yxfp0GaVxnDm#<_LMnU_YQY82*Jhc3 z@|BBa47EGhErk%ig~!Nit|v?Jt``ePHSZYX+UX)h@M2(T#Tham0~cH>TR{;KwG3zc zasX3fKvg}NlNoFcKwJ9~kB*=b^-P{HKZ&&~2exmLL98PMneePG`*PB;hQ*B7ATgS! zL-}WCjq*6`DSqgb*-b(GTDvKU734`alNLw>%(bQ4&;V2srhQD%NyQqbs*aj&8IeU~@!k7B&VNd*P|D-YT36Z1E+xmdchOJ}ja% z5Bu^U>~xalhd>4L;(G9ihs6ix9umkyq5jmJ4F~(^qMY8lt3q)Mg%R}qaC!EfZsIti z%#-|5a-dm#+R)rK&4+Ls_^_urNp0SY&62iN?8$( zZGE{;3BOi~3_FOGTYx?y}@W#?KIW^}6UV9u*JJP|EYw>~xM2-fU#qmYFi; zB@Rx08DY$$=|%`jht(2}IeNl419B7_LYNyvO#2~g~rb>BzZiQI&>W-^MK5ovUbou}|N27JUjluDx10~AgX+{P6f zn$6tW0ctWWJ)s|Deb%8Ur>ll*jmHKgb1)#?hN>B;F&|MP$v@I9UnnkVccwE$ekuac zTQhg)vL!E1yBKdr1~;HW0Dln*wMqLi1y!_2>Zh zZf#}rEQCh)PwDdj6)+9GBF9k8Z_=g}YwQd{YD5ls9lKyW#+A1yP@%sgZRcjLh5czp zJBI08NLHBwKXMi@KXu8B53-wxv`5KUNtsXp5zRCF%Y;O9hkV7EkljJXr!?LQLR*ySKx~_2P=)(LRGLLYKv0PKipgFm?&VgnoktBkO8@UZ&B6+@!fKePcS$W zu$2LYd~Ql$3l0PzeDacd>Mv5yQ-7EANk=3k3NE0v2QE{XHey3Q-_juzf=8nZ4-iCW z)WN~uaH21#Cs|DJer%>#WGL6^x#pGzNjzOjchbz@HefNw9?{c9;lZ(F04~{L{@IccApJlc_k+I2%Af|jtZZ!I#n4mi830?77(Eax@Q5|D zid_k;0Fkw?I^=TF7Q3~e9pawFJLFekqM@WBh=Z^kDa)p1BNo+J_QVGs^U$gj^96|~ zqc+kLkc=L>wE{r^j8CiBaY5RmJnNBu0~C>5DMI;O8512EIWZe-1A$-wDJzuZmBXNy zwz1(RA%v;8s7Q@8kv(;cU>N@@=Zt_8TG=_j{0rF#rJTh*WRznh$jBC$UFF>sn!FKb zEs?8>Wq`88AeRQhf@sP^NcXT2rg=DK11B*5Ay2268lSN+%Sjtz=4flKsqn^wf!FeL zK9bZCu`twHpA>^A*oXx}Q)nZT{&Bp}AI&?Oe@C z(C@hbdo8Sa5|a>6^+?8cGim$85*xf$G+5bW6_I@J$g`1VNz7f(_<@jreK)#B0yM`d zke&_Hn>{&X7-j)i6Ns^ATxEEFx#keI?`mf?co|oD+M^R(a-2p_L=m*WaDiwp`h8pq zgkv1=C-Gc=rNAE@-h4-jEit=~IbD;LQqABlCY=!^Rqie#CY!A55b}t&RVDM6ITUC5v78b_=$qP!eTiL~VODhJ*p1D{yGSs;$dJ zqc1^}a_x;H7y8Sg)RKr2HJO=DU?0HKZ0AVKlEg{|3bfj>!uM783KD?Wmm_~=0!ld( zB-uE{BIDj1vL>14Xr9koi`?(n&pXHNDe<3*53vsd<4VNf%|THo1WEc5sWmog0YLBL za4vdBb{urVsx829m?QqlUXgDO2#V#IylA zgQr6yqNyn=r$GQl)beAdXrW0>+_F-juCWJo!-RV@u*TUJ(i9yqs>X4cfz4Oh0k{T~C+Ml>5x@MO*ee?M{4}+x6%iu z!W)?L=FyBuh02T22@eruPf^yl*?y3)2gPcPrVSe_6D-?R`h+StcCPA2o2aR$N=5 zT<%~WRT$Gk!;ft!RG6*||BfP;3<$QDsGDiaO7cV6{T<@OQpUAS$z=BkK(ZYh*)@sE zD2}P=NMch2*H!tC#2`m@jUAWO7q?`?LiGEU+&r7i|MR`<2YlJa9Kr0IKluF9L@&pN zMM(QVrjr8ST$l}FMtPfs5JxqYh>EF>OUAFb_-fcnZFm;$iU|P5NX>%1#Z<#N-(tmV zM8m%%DwxBl3;tIl%pPpc*imjV$ph+ROfEMoR}Wl99a#r^skF{wG28HEmEdQ3Oq1lq zZb0;s1y;AA(i9yGBY`R#+AC`&7&YK8E6k(s0QK1ezKE7}v%T5$%F9&Rm8!;zF(zPn z)|Z50T`A=-d0r=bD^y0(q0ULnSECe-<_w@^-i#HKFqEqXJ!CQ*aaGRwp)u?H^o#C9 zHf)%E523PQDp7imdxk{9AoD?xepfx&JsEi#T_84=1d5OEG3iK5K_&CavuKO4=CWb3 zB3H@MFz;B*QXb?8{^FU_dQ+oEPXy#zwgD5W{lUQRxXI=gv zL#%pOM{lfcW^w*Nf!R@#nMgOO3P7#+ZVG)$RC*7C`(2?G;v(mQn7g;2g~$u-85Z{w zJ#nw(z@pZ!Mh(RTqtZ+|FZ!SWb>+eG8?_^2(gdqb008nMB=UR&*F{j4CwM1|C7Ree z&F?>rNd6<uLRy7n2bmH_c!^7tnl)!V*d+@--&hf+qpIzHsoVHeX=*v11F#)& zOtk=>TNrs_5hTPeLn>e{dczgct5&d2FvaROzj7W3)Yeoe9sLcCV%r1lOB=)Y3fc+4 zZyFtGjsCLat_-Omtma|s;8~~Ht2xA2qQZ&1r&o7*X@+9(IV^X(9M5lumwB9S9Ptqv z%{k!6HO~ zxd=>Q77dVaz0Mp}J|ho=9G42W0-}&-h!Ycm0Sl{NuV@Z3j#C5=usRz~&Kq!4>^!n% zCF(DZW>IpdRI3nm!k2HtBEGvZ%Dg%6L2!{>SW}$=*^#9kFVQ8XOJb6*TESxeZtwTO z(;66pXx4H;66!JDqOx&@ZACo84NL)DFjgE z7Cl@fT;ZOjc=>GEn+>&E_V&w7D+U6wA~(8?s(Q&S3QII8w5z5lr{X_lqJ1FLpaYtr)&SHLLJm z)CjCb!Yt}eK3iw^J0N5rN3BwVh87t|;%{zQ;MN!Z1cdZfIOjG(-#`sdqi?xcJxm1F`Fu( zy60vT#AJFi?&H%XmVyLnb1vopE_bDoKm|Us4(RMo4Rb`mX(WZy^}xL5N`QE9UDIJE#bHHM9233Y89QY^m1Q z4l)pO#w3GyvW?r6Q&$;y9AWGAEvY|)nf+RAmetn25)f zrUy`6=$!1CgJ?b!!Xd{Htm?v6Cr8MTjllN43~7G;Mdc9unuIW->1lta(%K{0d%ec} zs0Z{8J53NGT!n=#bVa|#8t;L-d#i#%$oeUFk{Kh2Zo z^1SoF;?{%`b{j`XqBKJ=mNxEl#t1PsHsLw^igFT3$WJRFzW6<(eUhG$JTiQ>f!U5* zLN#B_56I%^D8{y>iP_JVPPZISN6Mq(yrMPi<1)x6tEqsqp9 zCqSOTE6v`VL>qqcUYXUa@>CY>ATXeNe7JIx|MSi?@XB=>co-7!x(zO2OI>-CI~yWd z$Ue%w+pC)Q$;lXPn0|RDrLfBl2T2JegmCI-tKTs%ATh@X9}&rQdr&>EQIcGc_E&50 z=bMals~MLMf4XOmwVnP+g#m0DY!G<65dSA1byP$%3Clu57Rvz86CdMTgB2sk8wB1g z!@&zZK~@lPV^L*tJCgJ~hrIvLBGY$kS*Qs6qqB zz5p$F$kt*)oumP7mXXIwr_uCPGg$ufO3fex zsj5oQIG$}5bW@BM+vgT&;g|_4(MrxErJP+t&Wcd=P7ho2|{gAck-B)WN3 zJJpjRu^7vVT+UIMHZVX+ShlM4aDcpgkSD`@!gMBqD`^ukzf)X4>dex{Y;{=!7&zie zfk6xEfhi4DVSm(!6YxpJ5Y%r@n-W62F<9Q?sQEmpw~RA4#y5fey=E&(?c3)$Xjx=3o;mp zE{z66LuBy6?NF$ouHGuZ0kUF|1z{2j^?BpGU=&lDw4QKhd@|{B!aVYLC7{^7rCC52 zo&a!2Qqa&!i2Sl8%5$&L@W=uYc+F)41fn6MLBrtRmdI|Y#7XfQCGgb}xKxDe(yG^I0!EC2s&*f?tTP*?3`*#9rB+@sq0ZQU{Fy&+5a)zf>=R;h z9T_onVE_$e-2HA94%LEu95Z8BaMwf!n%I^3>(AFC2Z$Q@vvUnFUskf=I^=QGu15(# zZNO13n)3*$Bk! zRIX^ythK3XN@`09@7DuZXIaHT zxp4Gcj?v^>GO&#FsqW?>SiX4!8O_DSB~h$bT~v3sdooOn;rxq2zx(krdQ^ODv?=NW z)@p$pGK^|Q)U=Q8oV}0PfJ!|hl$Q@;=m%hhMH^V*e^L@|9)Pt|6hx36aH#qvZb>4L zFkmhIjg^BPAlpSl#vvC~*Ugu6N*+Qm z-`icz=M5Kp5fGcSl`yMGicrcIS<^F&Q!f8iWaTC@?iPDO>qJnE#6k5%1AESVevaw0 z5WVjyam2dCNL6ft?iA$!V;Y$cl4-??gF}>mJwGhFfAnHlRNt{iQ`M+-YPM#()gCCDS1IC4NSZ75dcvHd1|&IyDHJ8J zz*GiGQo7vF05Q&b&a%^Ffy;36oiivIXdlocW3!}0AQaUaH2pf?2@vfwCg(tA#zSE~ zD8B8FN~yjA`Q&@5wX~?3F;le``m(H;fB|a2iKL!G~29B8D{Jc4_ApIhm7Zd+Yvv7L}^<5GvK}_>69~P*P7!a6O10g`U z(Z?(>f?Jg-r6enq8coF8YtUX@{G<_G^HoD@^`7y=?W94HEuIXZVgu@eg~w3{G)_Dt zG%Eq=D&=1svY;c17dwCi?FhQSWp-u|Po*GXD3V?n*Kx zB){&dvz6LWf&hxm3&4iE$xN!)CT{*v3TYTM?id!L{MwrxW|J<`S3U)(R27fx^Y9W{B5&|s67Ye9h?3DRi-qJHQB z=+c`mBcf*>ex~n+VbUQs>+NJYUmm*n@YUB`{M4gQZ9j2geQTrZI~oXpxKc0-gUBA0 zeFGS*C#znI+e(^-IVSiZ!jqV1>b~gKX{j3YA<(pH2+M#?(1lH@WH1Ln&<_Jm=;B+h zpa!14?>iHmwhi`u2W#ym&%b<_cW1u!OxsM-94|c&K?4mqH2nK+JhQ{09|$@c2;1TE zo3EH}@1A{P8yo0h+2914DG^OKCeMG#%}@W)xA)HXP1^tv(EvH^0ZMv;1Pb|THh9*W z1u19n91!e@oZ`vZ68}MxBoyNY*hi@t`oU4nxo;r;BZDB&u-EUw7F_6733&YAC=*;rp6DBDV0B}K^*ok}XfH>k{?)aX#rS%gr`u}4B9SNjPd2Tl}+xA(?{ zzHC;xKS0`BE)QREbnE!~vyYuwUg&4j84xUn?)dc=ZEUSS^Wc-qd5;YOHP~PSNJPWX zL$0~AZ~=jEfFV6jcJkVjTc-{`_O(a)`9L$IrbR#)0A|g}>n`u-i`^&AP1n}VTm-R6 zCDfd^B4E=rLw-1og~UiL*+7uFfJr6Q^pj`R5s_==#V>(aJXf+VEdWXWQ)cX(K!`K1 zT5Vd5mkfoulcF1YqLFdRmgQ`AY+Q0vMSGrB5$i8nNDm1daeC@+4s(V?^jJD{@WUgY zR|CcwS-?Q!ycxU?7Teh4MBrSlka2;d>Hb8UE{kSN5t>||++Es|ij(_|tu6hE3RWoh zy+$dH;GI3;D-bGbD&=lV?%t%C(t^h%slhILgRcHb!mH8P^lOqapLg4S1T9=ZHy_2R zBExj8en!Q3F+;VN%@(8p_M9Kx3|5!F@aV8rZ!(qKjk@B_? zM$1M2u%*nG8QkQ>L%?b?K(kh``f#)QeN|KKle0;+&74?df>Clt^|_qx7QVvD_T$is zcSz?y2vXWkL;C&A^42ov9AaoIK7elF8(F$Q`-g%ML-m_&N_ZC}N|hX{rraZ{uB(Ih z3+0{@if4JaIy~gsJX7z}H(tVqJWU$Qm-1G`>eJfpn|PYlxPD$?&PBNKyvn{%Xd2vE z&foBpZ-32)-@KgAV!5OSdZL|f`My8@f!DwHwS+Kq)HV|!?3P_OUm`UPHtAuL29XH* z#bUm@w_J3H&2q8m0N?Zz-}l-NzHPoU-`?4|<8608@2=;cIdgV*clV;_UGlC!^`0AV zzwz8N=NI#?@2G7i4Nm%w`mUq&n9Kk$P`_L*7Yhc}yv0aZSk1i?_JLdao1EM{s*eQ0 znrT&=j?$kKQ%F#o9i9LPnx^R%U9-OS#vlLQ*Z%NZwzqcxpl#au&V2po)_eZk`(OQm zS8Z?aBDR3-&<~5<`EqXofc!JGfY<<0H=i$dcKf~uXu7WN*V?!JsUN)K&3El=U+CNB zMQ?lQmA77fetUb_bw@5g{^7s*lUKdq+WGc;xmYgyzQGo;>AJ34E?G#}5cG@ruw1$q z-3KWmRf?{~^20t~D@EH;39CGz*oBn`537-8933I&nTXf`c0;#*)rmL#YPDpJtIlsMq z(`#P%eShHthp#$*VSA^YwA8?b?VUTm=at|8GauYMzBQjOns!PE)b-2x9(6<8w7F15 zG!PEUezCW=Tr3)Fx}l%<%Uj=Y$J_tpd$4J@x6fVk;^)8hN8WvQcYAMlckQA>@BE7& zeCZFqZf9?MF<&mbju4xsC8ECX2!WbBXP|yqCeH!@TaQeDFcQ+r?6i!A^%pH3@E{rq z;_fIW^ZJKkfFJ3B$J2?KP;h|zCy5I7`I5e(j$-Dwu0CRuVr8SA*V{EYp4X8-FZD10 zzZt|NcKWrlyvE}Ny@qgub8E<^JH5%IQ7%jKSF>cTc#C$^FK#A4zqd>#y; z5L5x*Jdv*sVF(siF*-!G6(i(InP0sJ3CJahD+J|ht4g8PFEYU^rV7^U{oV?w8j-u# zcFJy89RR>aU-IUrSxii@1RkwS>Ll46h`9zRKamg%LsdpV9AC|DHUCmvFfugLGw!*% zjYX6a!z8z_Z@DUTUEG&H#s&^a^o;-xw`0G!3MIyl@h=;9ps`MFzJ61^ovnb22Pzw95N!kY7xoPUpqo9I#+Bj1K#XmH?a7vAMef z#^o5r0*0&$P!0q|H}a}k8PB}RiacmY|HONYiZERylhiiY%oo`2E&%~1X{Q2EH*6f* zqM_;LUDHgue%W=)wav8#aBpvKLetq~ia?9yV&3gd*Qb+qvb()U-LUNYS&JPu&z?EA zy>sEj)mOaadtUSKefNL$<6prJ&Y#|X>WR}kr_T(~uN_(2-PxVbmur)0Gi?XzX&|5m zaG-%;+BDGgUDvd2P69Mpw9ytND?pp2`KVc25N6W_69OvcQNg;>S!BhoxZP4RK5en- z9aUmY>c45)B~AAB_5g7*n^J@Aq@6YsTD0@?%jL44wz#{P@6Go%);IdD-@b5uZEa&Z zn+`Pe%X!x?*AA^su-)0&ZHGyI&|$VV5C9BU+=+eH zg2hMy)j(ZesF&+fx;3uBmw8{Bx$1WM8GTVdOpa{6<jhG>}Y>^2Qe*4LKHMZYtj&DOAKkYKr7EEapy z%^5Vbv%S4Gok4?(rhnCYU%N4zed#k_?3T2(xwXB0z8ku=&9w>P?(S|&lgV_F9(vl@ z-D%d_!xtUi{?_@Yzw`8&XD{^2Ws{^5RZj4qtkC?E=Qh58`ic3X>Dq|>hwM~7 zWN#Ns(D@ttx}SzAi3*?k%bSqr5eNeSv@ls~aoV(qZG%K@gTvmix7{uKzCi-&clWm2 zNi&iqe0=hu!Nx#hKY-Tbnf ze*NG6x5>O8mOXXY?d^2Ka(Z|+^xblIj?*bN4H5N2*WzRV0>CBqFhT4)7&KMY7;Ccu zW3iAIStC5THXJhc-DaY&2)y$i&2mN&7(<$hejX~2$VNZsAy%@1zTrW?A1>)E0 zMP_Xf4OeVLsWhl31T~`teayq%9?}c9KO%fC%2wY0YM0WtDtDo`6_f5!+o;s)cy~d) zFA37MXv%JFz+v1dD?OtUq&~tO7J0GeK|aLT+E&hM-IG~vwUUE~v-MCcvzM#I8hIC$ zyDjz>4&>{c>|w>b%`sGLHT5o~#7rS&4qciqAv38+UmfdeE+#+G9UfL3N#@8)dI%M& zTz_MX>le|Nl+&L3QFCmAYzSkTK-(O2bF-twS`514kn}>b>a@b>X~mDs9nez{BLbC! zfLUz!bjF6`!+^%A)HwKF4YS50kmK&as9-0M6sO6f#FQKT4!AEJI4H7}*GE#J`X^Ah z0oXQ`?E?0MPPlC+xp(D2E=h$6^Y3I9;U{jKmwqV#U&&j{wk=1I&kP*wQ(S}nE}WNd zsky!-wtC$VU+-6SQg-myaK=9M0x0JIR03tMHxG|9;C?D19 z-Zn9_8%r|8jjPn_EXt&q<5uLPmmt^emMS9S{!qYGq)`{vkRhTl;oRi~5C^jkV%K$w z2vtA0c8&n)H#mS`XxeVTVL9|&*Y}gITMk2aVZO7oTq5FPSWGsi&%5*H=fC)tt=R#mbYtzvVzM~B{p6)LUh%pQ zd@r47x1N9Md;iS)zVu%|j_cFKkruDsy8DB#ed!xt`Q)RIeD*g!{m4C!-SMWEU3T+j zpZ(R}Kl9-E*?PNdhdbZ-y0y0bonQE`M-Lw#hMprXBDz;avnQvg;(RXUgh9nubt@y= zy0ggk`0wV(qZv){>P59-v^U_1V(Mhl3<&+a@B6-irtgO3eAz*dYmedpf$zWRHgoi?*FGe@b&+DR}3hpwY`fur^K z4U#&>k-=B&M-E#r7+DtYhVH7{UvTRy@BCMP<^OrlN4{|K$nkT#JHP%9|4qNQch~D) z@zr1Xz~+KKlYYC_Puz` z#_kec_e0ltM9DVqk_k8-dKCyVR+ge*cyWF|>)+=89 z{cpVL+G~IBS3kO(c61bmwlQyX7>^fq)dW>|sWJi{G*K)^A$|bZII&LS$EN5-jv;`7 z*tCdUKg^eXx9Iz2-}gh;cSG0pwCq}-2`*_#xOdSlm)`d3yH1@r^_>SF{?zY&;_Tz+ z53j8+hsDJ=oVw+ecU*euT`VdQpuET#Zw9I?PR7V}=ye1f%7c8g zXC}|A9Ym2=mOArz$gdk=owLc6695|>Yc9psVi^r01F=Cud7vhpPurm}?aIz`ID0~+ z?5ScQnL`X)4gfI;Cz=xbC_g4qIbx^YAb`gxBt!dc3NqZ}E>Iw#AdgaAnT#0aKY(D|HLzs4-|~# zpdy=3ea2TVn^P)S86vC+6mDV7d(<$B!?-AmiZvzCl^u5-9dy zUa-;zNcjPD7Keom;0%okH8!MF^L#fEM^1H+luo=kEpzGFwX*QgY#WsJt8gr&x>#b) z+9A~NQYWR3MC`7;C&qjzy8|K<$K#Q)Rf8yIoOP)TyL7IlI)^cA9VpLw4u{c{I|*Q3 zRe;twleO~?D1&~AITMkU_C8)gfPo0BBcX)9^7*J%a|ibe#W}|+8k0)H*hywe7WQ%K z4Dl&sA!n9h8t&2=s#uF~l(2^FD&I@_UT35#1I$keAOZG$v)0gb=v!J&`sK85*AdnS zSZfA^ZZf>$hu-k|AAQ^5OOCE>t$qKWeg9kk_&b^{JiC4FjyJvLJwN?{t8Tn%=iK(o z-}$O{{N#H!4s9&w^JZ-_-B{n+*qZO`A~fsmWarE|XqxuOti5>S);HbtygQ!%)DurU z?A>}7@)2hnHocbHNC?j-lV1S=(a^Ry+nV7NX$@dX z(9!~y(6;@sSkCZ{?|Z{*Kk&8%4JWU>_yd3K$6xgJmz+NLbi1+klJ~sv4S)RYv)NkL zFW>xQ?|kErym7bNYi85t@U-t?ePe5HXMXa;$+cm+cXnq2ElsgI)V%oZuej!xYtEfM zef`}x{lNeDK{zs5wEZ3Lf7KN)xqb=5?tJfxJ8pW-55Kz`I_kzGNhUZ6PtJf-3o1kr z^a1GZO6?@d*U@6UaKJDt-&5n9KgyI7)9Y_0c;y|pJbvFJ4}9jHE3Uk9wzYojq7#QV zj(p}9fA{mh@~PQmvYgS&f8-tC^V9FU{Q7H7UUus3Kk=UL|MMSQuG75lUi{uyzWpz} z@0Qoyfzx*5&Y_Gfh#`pi#4_|rvl@~6YThQX=A9&+?|H=oCUUIx^={-OF zzPEq)U6);ZIW)NFdPKP7ic2>SZSD^9*Zk-^-~3bGH`!W4pm+YryWah$-qRjx&t151 z!z*t6k)Qpk=iPDRL-#*&{flpU^N+l}IYf)TYukx`Ux-Lp!WHo(hahK+C`uKB#UNJJ z8c1v}l(-@V(g}~B+DTGt>9iIgs296R`ON^(571CEA#9sr0{vuw2~j)1dfQGXyUV?6 zUU}>H{Et6;?MrST9PWPCYu@*lK78oXBhNhh?5V4-{DGhT(Kr3zTaFw(`ogNwzb|<>hJ}&8G))l7L_m z@*NJP9#e829CL#2{_t}d0GXxRB$)yw!i*=9Y(I&Gic{D~m$!Oht~FO$uZnQmNcW)_ zI>~-6yLIHnpMUX`OW{oMUQ<-bd-kQUI2*Q$ut@!$ny@sCylCTi(aII+NhQ7}#yUyL z-oDK;EhD^>u!Eez2xZ2?Y$k4f+*?WR3xZpPk<}~6{^d)Qv!`P8f-5szY4;TytxKSC zw)WD1gB~Muy#oBgUBSX~yH!4=n^O>if{`^U_%NC@rGg*`M(2|_ZZ7@;#;dhT6F2pD zV-74u!~M`C)Y_;p#V|Zoc87@cO!h0?Bd}zI9(z5G#lBaIB{hLjXpsJ(HyzUdr*u(Q z=*aHg^z~%Zg;2yQAt;8<6M8OlI$DXGQ3|HAM{I-wQJQ;wf}TddLHxieR^h&&^*wi@!3YgecsqKf>A|6axj`k`wxBP zf~cKT<@c4?SODP#w^gFi{5#sHej<{;|5?S#M1L`686u4?QdJ2t{^*G7fpY>*xWtq5 zQ!yNe3Ecj;QA<+;4z8Px17%l|7F>Xu+-cM8%`blbrLX_-w{?3xBF=EuHhApnW6Li+ zush$q`86+k<=gK5uRs6qKl96Z|6}iY$A`c7vMVlo@PWtLemYxB?)}u4ANb}YKXKike)_S8fAJsw!X|EBcl3p` zIX-&tV;}qZUw`W1C!YW67yZcJ`l*+`@s9ug??3i}SKoH?D{lMpuY7U)*|WFbetqBX zeezfSVDr$C!TkhvA#`Fi6U#JvDdcGg3szh;rV)TClyxw05X`Znm%p;Ly_OL(Bj6r% zx5V+96D^l}m)&~RyZ_P;ZOqm>>TnluZL)dsu_x|(c)r}b{_fje`L5Uh=fC~)U;5~m z+FARiKmFc!{^H57Hv}^sw zgI|5%>_7R>ANpH={L8=ciFq0*^}A`~b(h_Rh-koBbNJ-R(+@s2>9OyJVdx2HeL7oSSbqAKKHB$- zOK-pKj@Q2QqyOSpKK_6G`ar`AUVX<;|AW8w(zkx|qyO$V&OLr^(og=)|NQgYPoCdf zF8|`c`kOC#!^^+)Yo9!S?i}`$`+on+-~7lIPk;NVt6zHSPyO7VzwY)MzV-D7-~Zts z+#H&J_Tis>^1-J7;HUn{Uw!k3-uZug{(rsv)*IgV!8d>8pZ?Ns|MOq(hs9fe{5^NR zwo)Y=;0;rdG&|? z+K=D%vYS8io1c5vpZNa0-Q9oilmD;nM^A5Fdi(?b^M_vW@|(K(B5_>DJoIzV|gRyyL=jV+I7n zVz~B>=XcO;Z|@wt^rAQY&^x|;|F{0dU-`NI?DE8om;Q;r`I&$Rm zANlk@{q7|BqFUo%oY|Cbt!AjCC?moY$C=tqi%M$S1Jj4ac}fl zrxJ`;b2k~KvAkVLSn1vA>LhktAP?C0!P#9YB~7{C8ZG;fR8Ni!Cw$V2uk5WBbX*#V z^0LERaItMnH=KWlq2;U1&Poj_@v&o*@4LmK3gr}RNroL6jqJ^8&elh5w(-biMSCRgO`Hb$)kn#a|I z=VkF+4z`@q++>#*0jn;_~+~Q?D430m5SLt&S_SxO$A6#^gVWm)ZxbENs{SLGiOkey#Rh_ej0SNIaFgkR&8>4A&lQRC6y@bG2p604R}u%pjZt|=BR`mD%_wJ^qHQ*L~V*|FNmvf z1h%P^tcPL#mKux*ksma*Q_3(lgrOrW00czRH*f{lFXd}*T4`}0T-%N^#A0RpC=1Bi zJ#g|fGJs>5Cl#Ipc5tig$W&04286Qqjd?3uSVmI^1VDi0a@abwb@{c|bo1p#GoAF4 z3-b$z4Yo+laNUb<*x8*QJ9Y8fKJ@Oz-m*V58K^&Y@yTX_zxUsMV|`=ewpYDueQWE6 zyKb8=7Jc7i+e{|dHcdO39Y1+uI-N{la`NQG(BanBChYVNf9a9k(~B#wx_Wt`d-B_- zkDNNbJiGnK7ryzj?|J3XOOEdCY+w80n;-e3M@~QbwzSAf|Bb4;(Qm*mCri@g#ZLnd*MDECtm;y(&08lwG#HO8Wt#6(d zhqku*bG!Hc!Pj2)&X;}S(E89GzW&Y|KmH#-+U=&-hz^_&$;+7xk0w}#!{(HkYZN#e zNi-1UHG#zlE)lY~nji%g3e6SHw^9yDNH}d9=wax4Yyh|_)-*8Nm@Rg@%Wt^u{A164 z_SgR4@S!8qwb?g6_4P0O-sf((?dIQWeiN5)`r#+L3yUi*zx?TE&OH2;hp&6VRqeEy zO(!&8KJvA1wKTc(vMc6icg~+VgDqZq?d6x;a@p5E^~Ec0y8e#WzUJ{q9zXlk_BGdE zed5xKZ+_Ja@BPDjKl{s{K6d2T`mxPV|JujD@LQj0dN_L7rR$rs#Xv_69UXR;M=n0L zv%7cV;)~z@BR?>7Jsp|=!jYp}SKNHf?C9a&{+GW!oL}DjqT9Z8|AP;F;+`8`aNVqJ zhJk9D0Zs!r12QVntXpoC1l2egME@I2V&Ix&IfY+&K~1}5GftfKC6`M#Go*yeXz9D zm<$(AT5OaA+f-XdbFBSF)kqR=4W#WG7vh%;Rwf(KH&Cn^xFFFF6QQp{mMq+aGkT}V zCmsD_A9f)X!!4uTjxgZXyT^&smkI=3YeVPA*T3#NyZ86j}Rv|`-JpNJr!4)Qw@(FFBGGS~W~Lv-A7I#%+p zQNfSzKCy>$UEiE`0lj*Rdat(d^$XxZl<#W)C8kz-rgEwiiOG{a&I|oO#QOqd3tu30 z-`xS#Yktp2Y#f-v@)P@m-?Fjqz+`4bZbQbX7$eq}4OS^(Rmv_tG1{|AgWTz?%v^7= z2Tx4%+(XkD+h&v^N0?Z5?kexX%aUi4b(@NlMglHz3+Gps82O6fI}hh*b1o+>&73}X zib)2?4_91U`KFliz!Hed{txi>nfx(yuJL9C1rTi{l*6*}*eHPOa0n277F<5Fo>wFR zsQCh61zADyR;?xS;%_U+sNj};P1SQavLBR%p%^u#jGvJ$2|+i&i#42GSXSOyrCTo*+eSPcH;a9%x<-=}^ecLtjGmk#|^rKJD4jp>Q_r2=o+iyC$ ze(3DCPj^Qeno_$q1ww3_>1^6G4ZuJX99nE9?F5_I`UHt4&}?k16Hx<2Idu8S_y3)r+}vD4 zY@nUs=GvWae%YbfiRGeew&;((_|0y&UpspAuJ^t9u9x20G#fBqc9$%7mW#>Sv|B7% zYNl(`wdr(ybG=_5aMnyFEjEaNwCuO0Ydae=0_f*m*JCrAu5E05*%cu4}?S4 zZ=btx`Sqt@)(l-YnNESA@4K!YuDbQcryhQ2ZF8evbS<@Ov&nQiTVI>)?kta-ID!DM z?AvKOnN8<=doc8Cvsv3rVHhSzQ=r3}Tc_I#i@n9xbZc#M9U44x^6)w6uYcvOFS!1C z8m2Gqy6JlJoqHecmUQ^=(KAn-YY^8q)@IY`p|!0gKu_Il(!zv>8LqF-*4L(Mn;YvV zHedLv+lE_U(#)o7xc%+3k3IP9lb2oGFZyn;TU%R0!nNtN9UACxx;E8U-eLunMie)) zH_R-ssT}2=d~)0x1fOEkBX3*NIjZ?wO&cQt1kf}%^uuIrwmh@^Pe1qX@BjTT9J}bE zp8E6WFMRKxfB(zg{_3`Eo2H#^&Yu6$7u;~|HEU~|v-R1z3uk}(S3XKGx#d;2zv`{8 zJ$3ZxFkdbPI&|s~wTP332AZu+XKU?zdkHuUGZ=<`3T@M3Gr+L7+&Z)g1hjw_rZ8y` z+H;RS{pi;oy7rbE|M0}8U+{_-e*V`#gS$g>s2QjyUcEyJF*Yg7mKl;_edB(mbmgUO zN-a(`#A!LjEBPI=DVl%Q+OzAEf&m?^3V4tTL8YfaKxSQsX8Y(I`8&LOI9 z!$AjG_<9!@@3Z}jWPIWQ3a|jOW<@9h;FnmJ^p^l(YwdE?z=90#Z%6ZcC(dA{vj})x z+3|tAOw2)w_#y;RuV+M-kJXpWe86VUc~=XN@|(`6gCrMC1Li!{a;zr8IBFuY-;F3Y zWwNU;UUc41nMSkzm}w0#p9?f;j>=X~PTK4v=7%5bm|<^%>>trVM81~V(q{;ubdoS< z8c$6st3E&uJ!83KpP3%YZjIVut8e2(jopiJbXm9qm)fSll7J_Z<$KCjq;E(J~=BEwNxzq5rP$uTr!D1+6IkV!<;MQw9=)w_E$ z4Imzy-8t_h!@Osa^6RtGLqa5EdMA~swy~h#?bTR88fIN)!DSowV(JVj&WTf7o|M|T zr{8Qv;&fr(hpj5w=~mDqXF}v8tew}7GEA1no*QNzn9a7Pi40}b6q5q-Vv+1uwNwWADiUDiVP=Rr>kb9{nVMgy}ixNL*Kdg(SP%I{@LC$dmEc;XP!NK+4WZr=N2z` z`O9Db-q(KWSAOHmANj%qU%CH=*S_QfKl8!$L(>8JW+0-W?>p#+3AEjk=8Gi`4FF*S z%jI$)q8|EY=-Od>cW*YCJ^Szz4}JOG8(wnj-r910=JYo|^VO}b&4Kz97AgQ;lsT-B zIqz_3NZ3O`oS2xXt!^$t4h0thC2kr z&_K{H`)+-GP=KXR-m z>YDzpcfbCnuYL6|{GESr;hEFNPn}#pap=M$Pq%G@>&+EcU3%u*r!*HZ_GNCWhJw_H*;P~SmA(^(5dXP-QMV(sW>e)-ov_W${%ww*5fC9bunF2C~W z$DW*Dn4h@hIL&bP^bRz`0)}gDd;a;S&OG(_6K&si+q)N@J->72{CYcEJiYr1fB%1f z`15~s>e5rsoO$Nxsf%&hUh%xPrT&u3F8bWw{QQ~odyB>9v9;OObiTKowk@U_8}H?_ zW~q{_{vNPq7-;0E>X248E{KFBl(MqK`is;?a+#DRl2uq3oYxA>=u9FK5Mnzly2G>e zQ>xcQ??ts+5?&98$f9bXFdE?D*c**Aa?EcSuZEZ3E=xrh+J4JM!$|4*~*G-Bg zX_H)0@Rz@4<2--2)10g?!6m!lfV5MTa)FJ}#*1A_TOL#dUyM18RiTY^008{k=|(&* z1xw+RF#vTuziYKF)Y00!&|PGIRtCj1B@DvxN?4N4D`S>)m9-(0D})=z6hJ1q$ZfDT-ZV^!_W*5MIBpNL@2O3zlzusDu9eT-D5evOnWN-ei| zI09Eqw<_lfY5{6iE&J%4j=f6U>=w1H{p|WY*wYjS5)OJ0MJa{H(Q7whFdV=XTp8lS z)WU&+n)bN#!3dVdebzMhq2vD-j0neQA*>iea-cFU?Q^F@#_*wRY%^R7zxko0JW)*Z zg7l6}uDKjgk@+MrzDHHrt*wICF7-omhlU1QYC*tapGB3xF{;y`&QlZ(3lH*OI@X^% zWRKX`a3!JUg9jNLE8SLxH9h8%*_fE}w2{AsoUPI&0ngs6)TRIvAKk8`IYkKeÖ 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 z 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
^FANp_WLck$2e(5eH6SS4D9B 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
4wV<97|~oh3wX1wOs9=FnFZ`L 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%0ALI2BdjzZncOw8cTIt{Gd{74;UHOm zI@=YHx;-g5A(>%|RxI+0P4f#Ghh@;PC7me1Ke;`FW)u5l*Q#+F{-Qr2gK5N;kIOMf zDhFFW89;X+TRB=KZ_#(`UpRPY>v-%O*SpOs^gjcLfCfG0n~2GU8Qu^zg$ysbVNF-E zeB2gkb|R#ielvVdl*LqgX{{YTdp)~YNcvZU|u zpy@L1aAtR)`9&ZWO?ca+bS^}d=GZJ9eB6^$eB08}<|}O%UX&Z|5vu8~qoxpikMX5B zZ_h4-2qE!;swlgy5_$NH?F4&qbju$zNc4jB>(t=|Trb*P@~uJM7R?paK;=I&{oE_5HXc(n29 zu&Fu22SkBD$U;+aI$F*ghIMK_5Ylf-lLwvH!(R1arM^kS!c7y?FQXC7<1z;aXGCT@ zBQ9%7o`&NhQ+rK^YQdyCAV6dm*J%0D#hFtC^*JtI3NVbn$qRcnOm&kJc3FgFwjq>- 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 Q_y7O^07*qoM6N<$f+5bIJpcdz literal 0 HcmV?d00001 diff --git a/platform/package.json b/platform/package.json new file mode 100644 index 000000000..fe756749a --- /dev/null +++ b/platform/package.json @@ -0,0 +1,35 @@ +{ + "name": "@opencodex/remote-platform", + "private": true, + "type": "module", + "scripts": { + "dev": "bun --watch server/src/control-plane.ts", + "dev:gateway": "bun --watch server/src/gateway.ts", + "dev:worker": "bun --watch server/src/worker.ts", + "dev:web": "vite --host 127.0.0.1", + "build:web": "vite build", + "typecheck": "bun x tsc --noEmit", + "test": "bun test server/tests web/src", + "start:control": "bun server/src/control-plane.ts", + "start:gateway": "bun server/src/gateway.ts", + "start:worker": "bun server/src/worker.ts" + }, + "dependencies": { + "@tabler/icons-react": "^3.34.1", + "better-auth": "^1.6.25", + "hono": "^4.9.8", + "pg": "^8.16.3", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "zod": "^4.1.11" + }, + "devDependencies": { + "@types/bun": "1.3.14", + "@types/pg": "^8.15.5", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.4", + "typescript": "5.9.3", + "vite": "^7.1.7" + } +} diff --git a/platform/server/migrations/0001_remote_platform.sql b/platform/server/migrations/0001_remote_platform.sql new file mode 100644 index 000000000..9761f498e --- /dev/null +++ b/platform/server/migrations/0001_remote_platform.sql @@ -0,0 +1,217 @@ +BEGIN; + +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +CREATE TYPE user_role AS ENUM ('user', 'admin'); +CREATE TYPE user_status AS ENUM ('pending_invite', 'active', 'suspended'); +CREATE TYPE instance_status AS ENUM ( + 'pending', 'provisioning', 'awaiting_agent', 'connecting', 'online', + 'degraded', 'offline', 'suspending', 'suspended', 'deleting', 'delete_failed', 'deleted' +); +CREATE TYPE job_status AS ENUM ('queued', 'running', 'retry', 'completed', 'failed'); +CREATE TYPE health_signal AS ENUM ('agent', 'tunnel', 'gateway'); + +-- Better Auth owns these four tables. Security-sensitive authorization fields +-- stay server-owned; GitHub profile mapping may write only github_numeric_id. +CREATE TABLE users ( + id text PRIMARY KEY, + name text NOT NULL, + email text NOT NULL UNIQUE, + email_verified boolean NOT NULL DEFAULT false, + image text, + github_numeric_id text UNIQUE, + role user_role NOT NULL DEFAULT 'user', + status user_status NOT NULL DEFAULT 'pending_invite', + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE TABLE sessions ( + id text PRIMARY KEY, + token text NOT NULL UNIQUE, + expires_at timestamptz NOT NULL, + ip_address text, + user_agent text, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX sessions_user_id_idx ON sessions(user_id); +CREATE TABLE accounts ( + id text PRIMARY KEY, + account_id text NOT NULL, + provider_id text NOT NULL, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + access_token text, + refresh_token text, + id_token text, + access_token_expires_at timestamptz, + refresh_token_expires_at timestamptz, + scope text, + password text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX accounts_user_id_idx ON accounts(user_id); +CREATE TABLE verifications ( + id text PRIMARY KEY, + identifier text NOT NULL, + value text NOT NULL, + expires_at timestamptz NOT NULL, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE invites ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + token_hash bytea NOT NULL UNIQUE, + created_by text NOT NULL REFERENCES users(id), + expected_github_numeric_id text, + expires_at timestamptz NOT NULL, + consumed_at timestamptz, + consumed_by text REFERENCES users(id), + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE instances ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + owner_id text NOT NULL REFERENCES users(id), + name text NOT NULL, + slug text NOT NULL, + private_hostname text NOT NULL UNIQUE, + status instance_status NOT NULL DEFAULT 'pending', + suspended_at timestamptz, + deleted_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE UNIQUE INDEX instances_live_slug_idx ON instances(slug) WHERE deleted_at IS NULL; +CREATE UNIQUE INDEX instances_one_live_per_user_idx ON instances(owner_id) WHERE deleted_at IS NULL; + +CREATE TABLE slug_tombstones ( + slug text PRIMARY KEY, + instance_id uuid NOT NULL, + expires_at timestamptz NOT NULL +); + +CREATE TABLE agents ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL UNIQUE REFERENCES instances(id) ON DELETE CASCADE, + public_key bytea NOT NULL, + status text NOT NULL DEFAULT 'paired', + challenge_hash bytea, + challenge_expires_at timestamptz, + auth_token_hash bytea, + auth_token_expires_at timestamptz, + last_heartbeat_at timestamptz, + version text, + created_at timestamptz NOT NULL DEFAULT now(), + revoked_at timestamptz +); + +CREATE TABLE pairing_codes ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + code_hash bytea NOT NULL UNIQUE, + expires_at timestamptz NOT NULL, + consumed_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE access_tokens ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name text NOT NULL, + token_hash bytea NOT NULL UNIQUE, + token_hint text NOT NULL, + expires_at timestamptz NOT NULL, + last_used_at timestamptz, + revoked_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE instance_authorization_codes ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + code_hash bytea NOT NULL UNIQUE, + expires_at timestamptz NOT NULL, + consumed_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE TABLE instance_sessions ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + token_hash bytea NOT NULL UNIQUE, + expires_at timestamptz NOT NULL, + revoked_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE provisioning_jobs ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + kind text NOT NULL, + idempotency_key text NOT NULL UNIQUE, + status job_status NOT NULL DEFAULT 'queued', + step text NOT NULL DEFAULT 'start', + attempts integer NOT NULL DEFAULT 0, + available_at timestamptz NOT NULL DEFAULT now(), + locked_at timestamptz, + locked_by text, + last_error text, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX provisioning_jobs_claim_idx ON provisioning_jobs(status, available_at); + +CREATE TABLE cloudflare_resources ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + resource_type text NOT NULL, + external_id text NOT NULL, + encrypted_secret bytea, + metadata jsonb NOT NULL DEFAULT '{}'::jsonb, + disabled_at timestamptz, + deleted_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now(), + UNIQUE(instance_id, resource_type) +); + +CREATE TABLE health_observations ( + id bigserial PRIMARY KEY, + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + signal health_signal NOT NULL, + healthy boolean NOT NULL, + observed_at timestamptz NOT NULL DEFAULT now(), + request_id uuid, + detail jsonb NOT NULL DEFAULT '{}'::jsonb +); +CREATE INDEX health_observations_latest_idx ON health_observations(instance_id, signal, observed_at DESC); + +CREATE TABLE audit_logs ( + id bigserial PRIMARY KEY, + actor_id text REFERENCES users(id), + action text NOT NULL, + instance_id uuid REFERENCES instances(id), + result text NOT NULL, + request_id uuid NOT NULL, + network_hmac text, + metadata jsonb NOT NULL DEFAULT '{}'::jsonb, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX audit_logs_retention_idx ON audit_logs(created_at); + +CREATE TABLE abuse_reports ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid REFERENCES instances(id), + reporter_contact text, + category text NOT NULL, + details text NOT NULL, + status text NOT NULL DEFAULT 'open', + created_at timestamptz NOT NULL DEFAULT now(), + resolved_at timestamptz +); + +COMMIT; diff --git a/platform/server/src/app.ts b/platform/server/src/app.ts new file mode 100644 index 000000000..1e2dad229 --- /dev/null +++ b/platform/server/src/app.ts @@ -0,0 +1,234 @@ +import { Hono, type Context } from "hono"; +import { secureHeaders } from "hono/secure-headers"; +import { serveStatic } from "hono/bun"; +import { z } from "zod"; +import type { PlatformConfig } from "./config"; +import type { PlatformAuth } from "./auth"; +import type { Actor, PlatformStore } from "./store"; +import { gatewayPublicKeyPem } from "./security"; + +interface AppVariables { + actor: Actor | null; +} + +function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : "request failed"; +} + +function bearer(req: Request): string { + return req.headers.get("authorization")?.replace(/^Bearer\s+/i, "").trim() ?? ""; +} + +async function requireActor(c: Context<{ Variables: AppVariables }>): Promise { + const actor = c.get("actor"); + if (!actor) return c.json({ error: "not found" }, 404); + if (actor.status === "suspended") return c.json({ error: "not found" }, 404); + return actor; +} + +export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth, store: PlatformStore) { + const app = new Hono<{ Variables: AppVariables }>(); + app.use("*", secureHeaders({ + crossOriginEmbedderPolicy: false, + contentSecurityPolicy: { + defaultSrc: ["'self'"], + scriptSrc: ["'self'"], + styleSrc: ["'self'", "'unsafe-inline'"], + imgSrc: ["'self'", "data:", "https://avatars.githubusercontent.com"], + connectSrc: ["'self'"], + frameAncestors: ["'none'"], + }, + })); + app.use("/api/v1/*", async (c, next) => { + let actor: Actor | null = null; + if (config.NODE_ENV !== "production" && config.PLATFORM_DEV_AUTH_GITHUB_ID) { + const result = await store.db.query<{ id: string; name: string; email: string; github_numeric_id: string }>( + "SELECT id,name,email,github_numeric_id FROM users WHERE github_numeric_id=$1", + [config.PLATFORM_DEV_AUTH_GITHUB_ID], + ); + const user = result.rows[0]; + if (user) actor = await store.authorizeUser({ id: user.id, name: user.name, email: user.email, githubNumericId: user.github_numeric_id }); + } else { + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + if (session?.user) { + const user = session.user as typeof session.user & { githubNumericId?: string | null }; + actor = await store.authorizeUser({ + id: user.id, + name: user.name, + email: user.email, + githubNumericId: user.githubNumericId, + }); + } + } + c.set("actor", actor); + await next(); + }); + + app.on(["GET", "POST"], "/api/auth/*", c => auth.handler(c.req.raw)); + app.get("/healthz", c => c.json({ ok: true, service: "control-plane" })); + + app.get("/api/v1/me", async c => { + const actor = await requireActor(c); + return actor instanceof Response ? actor : c.json({ user: actor }); + }); + + app.post("/api/v1/invites/redeem", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const body = z.object({ token: z.string().min(32).max(128) }).parse(await c.req.json()); + return await store.redeemInvite(actor, body.token) + ? c.json({ ok: true }) + : c.json({ error: "invalid or expired invite" }, 400); + }); + + app.post("/api/v1/admin/invites", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ githubNumericId: z.string().regex(/^\d+$/).optional() }).parse(await c.req.json()); + return c.json(await store.createInvite(actor, body.githubNumericId), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.get("/api/v1/instances", async c => { + const actor = await requireActor(c); + return actor instanceof Response ? actor : c.json({ instances: await store.listInstances(actor) }); + }); + + app.post("/api/v1/instances", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ name: z.string(), slug: z.string() }).parse(await c.req.json()); + return c.json({ instance: await store.createInstance(actor, body) }, 202); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.get("/api/v1/instances/:id", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const instance = await store.getOwnedInstance(actor, c.req.param("id")); + return instance ? c.json({ instance }) : c.json({ error: "not found" }, 404); + }); + + app.post("/api/v1/instances/:id/pairing-code", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + return c.json(await store.createPairingCode(actor, c.req.param("id")), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.post("/api/v1/instances/:id/tokens", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ name: z.string().max(80).default("CLI token") }).parse(await c.req.json()); + return c.json(await store.issueDataToken(actor, c.req.param("id"), body.name), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.post("/api/v1/instances/:id/authorize", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + return c.json({ url: await store.issueInstanceAuthorization(actor, c.req.param("id")) }, 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 409); + } + }); + + app.post("/api/v1/instances/:id/suspend", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + await store.suspendInstance(actor, c.req.param("id")); + return c.json({ ok: true }, 202); + } catch { + return c.json({ error: "not found" }, 404); + } + }); + + app.delete("/api/v1/instances/:id", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + await store.deleteInstance(actor, c.req.param("id")); + return c.json({ ok: true }, 202); + } catch { + return c.json({ error: "not found" }, 404); + } + }); + + app.post("/agent/pair", async c => { + try { + const body = z.object({ + code: z.string().length(12), + publicKey: z.string().min(40).max(512), + version: z.string().min(1).max(64), + }).parse(await c.req.json()); + const paired = await store.consumePairingCode({ + code: body.code, + publicKeyDer: Buffer.from(body.publicKey, "base64url"), + version: body.version, + }); + return c.json({ + ...paired, + gateway: { + issuer: config.PLATFORM_GATEWAY_ISSUER, + keys: [{ kid: config.PLATFORM_GATEWAY_KID, publicKeyPem: gatewayPublicKeyPem(config) }], + }, + }, 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.post("/agent/challenge", async c => { + try { + const body = z.object({ agentId: z.string().uuid(), clientNonce: z.string() }).parse(await c.req.json()); + return c.json({ challenge: await store.createAgentChallenge(body.agentId, body.clientNonce) }); + } catch { + return c.json({ error: "agent not found" }, 404); + } + }); + + app.post("/agent/token", async c => { + try { + const body = z.object({ agentId: z.string().uuid(), challenge: z.string(), signature: z.string() }).parse(await c.req.json()); + return c.json(await store.exchangeAgentChallenge( + body.agentId, + body.challenge, + Buffer.from(body.signature, "base64url"), + )); + } catch { + return c.json({ error: "challenge rejected" }, 401); + } + }); + + app.post("/agent/heartbeat", async c => { + try { + const body = z.object({ opencodexHealthy: z.boolean(), version: z.string().max(64) }).parse(await c.req.json()); + return c.json(await store.heartbeat(bearer(c.req.raw), body)); + } catch { + return c.json({ error: "agent authentication required" }, 401); + } + }); + + app.get("*", serveStatic({ root: "./web/dist" })); + app.get("*", serveStatic({ path: "./web/dist/index.html" })); + app.notFound(c => c.json({ error: "not found" }, 404)); + app.onError((error, c) => { + if (error instanceof z.ZodError) return c.json({ error: "invalid request", issues: error.issues }, 400); + return c.json({ error: "internal error" }, 500); + }); + return app; +} diff --git a/platform/server/src/auth.ts b/platform/server/src/auth.ts new file mode 100644 index 000000000..401ee1ac8 --- /dev/null +++ b/platform/server/src/auth.ts @@ -0,0 +1,85 @@ +import { betterAuth } from "better-auth"; +import type { Database } from "./db"; +import type { PlatformConfig } from "./config"; + +export function createPlatformAuth(config: PlatformConfig, database: Database) { + if (!config.BETTER_AUTH_SECRET || !config.GITHUB_CLIENT_ID || !config.GITHUB_CLIENT_SECRET) { + throw new Error("Better Auth and GitHub OAuth credentials are required"); + } + return betterAuth({ + appName: "OpenCodex Remote", + baseURL: config.PLATFORM_BASE_URL, + secret: config.BETTER_AUTH_SECRET, + database: database.pool, + socialProviders: { + github: { + clientId: config.GITHUB_CLIENT_ID, + clientSecret: config.GITHUB_CLIENT_SECRET, + scope: ["read:user", "user:email"], + mapProfileToUser: profile => ({ githubNumericId: String(profile.id) }), + }, + }, + account: { + modelName: "accounts", + fields: { + accountId: "account_id", + providerId: "provider_id", + userId: "user_id", + accessToken: "access_token", + refreshToken: "refresh_token", + idToken: "id_token", + accessTokenExpiresAt: "access_token_expires_at", + refreshTokenExpiresAt: "refresh_token_expires_at", + createdAt: "created_at", + updatedAt: "updated_at", + }, + accountLinking: { disableImplicitLinking: true }, + }, + user: { + modelName: "users", + fields: { + emailVerified: "email_verified", + createdAt: "created_at", + updatedAt: "updated_at", + }, + additionalFields: { + githubNumericId: { type: "string", fieldName: "github_numeric_id", required: false, input: true }, + role: { type: "string", required: false, input: false, defaultValue: "user" }, + status: { type: "string", required: false, input: false, defaultValue: "pending_invite" }, + }, + }, + session: { + modelName: "sessions", + fields: { + userId: "user_id", + expiresAt: "expires_at", + ipAddress: "ip_address", + userAgent: "user_agent", + createdAt: "created_at", + updatedAt: "updated_at", + }, + expiresIn: 7 * 24 * 60 * 60, + updateAge: 24 * 60 * 60, + }, + verification: { + modelName: "verifications", + fields: { + expiresAt: "expires_at", + createdAt: "created_at", + updatedAt: "updated_at", + }, + }, + advanced: { + cookiePrefix: "__Host-ocxr", + useSecureCookies: true, + defaultCookieAttributes: { + httpOnly: true, + secure: true, + sameSite: "lax", + path: "/", + }, + }, + }); +} + +export type PlatformAuth = ReturnType; diff --git a/platform/server/src/cloudflare.ts b/platform/server/src/cloudflare.ts new file mode 100644 index 000000000..74b5e34ac --- /dev/null +++ b/platform/server/src/cloudflare.ts @@ -0,0 +1,108 @@ +import type { PlatformConfig } from "./config"; + +export interface TunnelResource { + id: string; + token: string; +} + +export interface CloudflareProvider { + createTunnel(name: string): Promise; + createPrivateHostnameRoute(tunnelId: string, hostname: string): Promise; + listActiveConnections(tunnelId: string): Promise; + rotateTunnelToken(tunnelId: string): Promise; + disablePrivateHostnameRoute(routeId: string): Promise; + deleteTunnel(tunnelId: string): Promise; +} + +interface CloudflareEnvelope { + success: boolean; + result: T; + errors?: Array<{ code: number; message: string }>; +} + +export class CloudflareApi implements CloudflareProvider { + constructor(private readonly config: PlatformConfig) { + if (!config.cloudflareApiToken || !config.CLOUDFLARE_ACCOUNT_ID) { + throw new Error("Cloudflare API token and account id are required"); + } + } + + private async request(path: string, init: RequestInit = {}): Promise { + const response = await fetch(`${this.config.CLOUDFLARE_API_BASE_URL}${path}`, { + ...init, + headers: { + authorization: `Bearer ${this.config.cloudflareApiToken}`, + "content-type": "application/json", + ...init.headers, + }, + }); + const body = await response.json() as CloudflareEnvelope; + if (!response.ok || !body.success) { + throw new Error(`Cloudflare API ${response.status}: ${body.errors?.map(error => error.message).join(", ") || "request failed"}`); + } + return body.result; + } + + createTunnel(name: string): Promise { + return this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel`, { + method: "POST", + body: JSON.stringify({ name, config_src: "cloudflare" }), + }); + } + + async createPrivateHostnameRoute(tunnelId: string, hostname: string): Promise { + const route = await this.request<{ id: string }>( + `/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/zerotrust/routes/hostname`, + { method: "POST", body: JSON.stringify({ hostname, tunnel_id: tunnelId, comment: "OpenCodex Remote private instance" }) }, + ); + return route.id; + } + + async listActiveConnections(tunnelId: string): Promise { + const clients = await this.request }>>( + `/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}/connections`, + ); + return clients.flatMap(client => client.conns ?? []).filter(connection => !connection.is_pending_reconnect).length; + } + + rotateTunnelToken(tunnelId: string): Promise { + return this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}/token`, { method: "POST" }); + } + + async disablePrivateHostnameRoute(routeId: string): Promise { + await this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/zerotrust/routes/hostname/${routeId}`, { method: "DELETE" }); + } + + async deleteTunnel(tunnelId: string): Promise { + await this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}`, { method: "DELETE" }); + } +} + +/** Deterministic provider for unit tests and local UI development only. */ +export class FakeCloudflareProvider implements CloudflareProvider { + readonly tunnels = new Map(); + readonly routes = new Map(); + + async createTunnel(): Promise { + const id = crypto.randomUUID(); + const token = `fake.${crypto.randomUUID()}`; + this.tunnels.set(id, { token, connections: 0 }); + return { id, token }; + } + async createPrivateHostnameRoute(tunnelId: string, hostname: string): Promise { + const id = crypto.randomUUID(); + this.routes.set(id, { tunnelId, hostname }); + return id; + } + async listActiveConnections(tunnelId: string): Promise { + return this.tunnels.get(tunnelId)?.connections ?? 0; + } + async rotateTunnelToken(tunnelId: string): Promise { + const tunnel = this.tunnels.get(tunnelId); + if (!tunnel) throw new Error("tunnel not found"); + tunnel.token = `fake.${crypto.randomUUID()}`; + return tunnel.token; + } + async disablePrivateHostnameRoute(routeId: string): Promise { this.routes.delete(routeId); } + async deleteTunnel(tunnelId: string): Promise { this.tunnels.delete(tunnelId); } +} diff --git a/platform/server/src/config.ts b/platform/server/src/config.ts new file mode 100644 index 000000000..91f5655c3 --- /dev/null +++ b/platform/server/src/config.ts @@ -0,0 +1,69 @@ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { z } from "zod"; + +const envSchema = z.object({ + NODE_ENV: z.enum(["development", "test", "production"]).default("development"), + PLATFORM_DATABASE_URL: z.string().min(1), + PLATFORM_BASE_URL: z.string().url(), + PLATFORM_INSTANCE_DOMAIN: z.string().min(3), + PLATFORM_BOOTSTRAP_GITHUB_ID: z.string().regex(/^\d+$/), + PLATFORM_GATEWAY_ISSUER: z.string().default("opencodex-remote"), + PLATFORM_GATEWAY_KID: z.string().default("gateway-1"), + PLATFORM_CONTROL_PORT: z.coerce.number().int().min(1).max(65535).default(10200), + PLATFORM_GATEWAY_PORT: z.coerce.number().int().min(1).max(65535).default(10201), + PLATFORM_DEV_AUTH_GITHUB_ID: z.string().regex(/^\d+$/).optional(), + CLOUDFLARE_ACCOUNT_ID: z.string().optional(), + CLOUDFLARE_API_BASE_URL: z.string().url().default("https://api.cloudflare.com/client/v4"), + CLOUDFLARE_MESH_ENABLED: z.enum(["true", "false"]).default("false"), + BETTER_AUTH_SECRET: z.string().min(32).optional(), + GITHUB_CLIENT_ID: z.string().optional(), + GITHUB_CLIENT_SECRET: z.string().optional(), +}); + +function credential(name: string, envValue?: string): string | undefined { + if (envValue) return envValue; + const directory = process.env.CREDENTIALS_DIRECTORY; + if (!directory) return undefined; + try { + return readFileSync(join(directory, name), "utf8").trim(); + } catch { + return undefined; + } +} + +export interface PlatformConfig extends z.infer { + cloudflareApiToken?: string; + gatewayPrivateKeyPem: string; + encryptionKey: Buffer; + auditHmacKey: Buffer; + syntheticHealthToken: string; +} + +export function loadPlatformConfig(env: NodeJS.ProcessEnv = process.env): PlatformConfig { + const parsed = envSchema.parse({ + ...env, + BETTER_AUTH_SECRET: credential("better-auth-secret", env.BETTER_AUTH_SECRET), + GITHUB_CLIENT_SECRET: credential("github-client-secret", env.GITHUB_CLIENT_SECRET), + }); + const gatewayPrivateKeyPem = credential("gateway-ed25519-private-key", env.PLATFORM_GATEWAY_PRIVATE_KEY); + const encryptionKeyValue = credential("platform-encryption-key", env.PLATFORM_ENCRYPTION_KEY); + const auditHmacValue = credential("audit-hmac-key", env.PLATFORM_AUDIT_HMAC_KEY); + const syntheticHealthToken = credential("synthetic-health-token", env.PLATFORM_SYNTHETIC_HEALTH_TOKEN); + if (!gatewayPrivateKeyPem) throw new Error("gateway Ed25519 private key credential is required"); + if (!encryptionKeyValue || Buffer.from(encryptionKeyValue, "base64url").length !== 32) { + throw new Error("platform encryption key must be 32 base64url-encoded bytes"); + } + if (!auditHmacValue || Buffer.from(auditHmacValue, "base64url").length < 32) { + throw new Error("audit HMAC key must be at least 32 base64url-encoded bytes"); + } + if (!syntheticHealthToken || syntheticHealthToken.length < 32) throw new Error("synthetic health token is required"); + return { + ...parsed, + cloudflareApiToken: credential("cloudflare-api-token", env.CLOUDFLARE_API_TOKEN), + gatewayPrivateKeyPem, + encryptionKey: Buffer.from(encryptionKeyValue, "base64url"), + auditHmacKey: Buffer.from(auditHmacValue, "base64url"), + syntheticHealthToken, + }; +} diff --git a/platform/server/src/control-plane.ts b/platform/server/src/control-plane.ts new file mode 100644 index 000000000..96275149f --- /dev/null +++ b/platform/server/src/control-plane.ts @@ -0,0 +1,19 @@ +import { createPlatformAuth } from "./auth"; +import { createControlPlaneApp } from "./app"; +import { loadPlatformConfig } from "./config"; +import { Database } from "./db"; +import { PlatformStore } from "./store"; + +const config = loadPlatformConfig(); +const database = new Database(config.PLATFORM_DATABASE_URL); +const auth = createPlatformAuth(config, database); +const store = new PlatformStore(database, config); +const app = createControlPlaneApp(config, auth, store); + +Bun.serve({ + port: config.PLATFORM_CONTROL_PORT, + hostname: "127.0.0.1", + fetch: app.fetch, +}); + +console.log(`OpenCodex Remote control plane listening on 127.0.0.1:${config.PLATFORM_CONTROL_PORT}`); diff --git a/platform/server/src/db.ts b/platform/server/src/db.ts new file mode 100644 index 000000000..072052211 --- /dev/null +++ b/platform/server/src/db.ts @@ -0,0 +1,37 @@ +import { Pool, type PoolClient, type QueryResultRow } from "pg"; + +export class Database { + readonly pool: Pool; + + constructor(connectionString: string) { + this.pool = new Pool({ + connectionString, + max: 20, + idleTimeoutMillis: 30_000, + application_name: "opencodex-remote", + }); + } + + query(text: string, values: unknown[] = []) { + return this.pool.query(text, values); + } + + async transaction(callback: (client: PoolClient) => Promise): Promise { + const client = await this.pool.connect(); + try { + await client.query("BEGIN"); + const value = await callback(client); + await client.query("COMMIT"); + return value; + } catch (error) { + await client.query("ROLLBACK"); + throw error; + } finally { + client.release(); + } + } + + close(): Promise { + return this.pool.end(); + } +} diff --git a/platform/server/src/gateway.ts b/platform/server/src/gateway.ts new file mode 100644 index 000000000..974223477 --- /dev/null +++ b/platform/server/src/gateway.ts @@ -0,0 +1,239 @@ +import { timingSafeEqual } from "node:crypto"; +import { loadPlatformConfig } from "./config"; +import { Database } from "./db"; +import { GATEWAY_ASSERTION_HEADER, signGatewayAssertion } from "./security"; +import { PlatformStore, type InstanceRecord } from "./store"; + +const config = loadPlatformConfig(); +const database = new Database(config.PLATFORM_DATABASE_URL); +const store = new PlatformStore(database, config); + +const INSTANCE_COOKIE = "__Host-ocxr_instance"; +const REQUEST_HEADER_DENY = new Set([ + "connection", "cookie", "host", "proxy-authorization", "proxy-authenticate", + "x-forwarded-for", "x-forwarded-host", "x-forwarded-proto", "x-real-ip", + "x-opencodex-api-key", GATEWAY_ASSERTION_HEADER, "x-ocxr-synthetic", + "x-opencodex-remote-token", +]); +const RESPONSE_HEADER_DENY = new Set([ + "connection", "set-cookie", "set-cookie2", "proxy-authenticate", "proxy-authorization", + GATEWAY_ASSERTION_HEADER, +]); + +function cookieValue(req: Request, name: string): string | null { + for (const segment of (req.headers.get("cookie") ?? "").split(";")) { + const [key, ...value] = segment.trim().split("="); + if (key === name) return decodeURIComponent(value.join("=")); + } + return null; +} + +function safeEqual(actual: string | null, expected: string): boolean { + if (!actual) return false; + const left = Buffer.from(actual); + const right = Buffer.from(expected); + return left.length === right.length && timingSafeEqual(left, right); +} + +function remoteCredential(req: Request): string | null { + const explicit = req.headers.get("x-opencodex-remote-token")?.trim(); + if (explicit) return `Bearer ${explicit}`; + const authorization = req.headers.get("authorization"); + const token = authorization?.replace(/^Bearer\s+/i, "").trim(); + return token?.startsWith("ocxr_") ? authorization : null; +} + +function sanitizeRequestHeaders(req: Request, target: URL, assertion: string): Headers { + const headers = new Headers(); + for (const [name, value] of req.headers) { + const lower = name.toLowerCase(); + if (REQUEST_HEADER_DENY.has(lower) || lower.startsWith("cf-") || lower.startsWith("x-ocxr-")) continue; + if (lower === "authorization" && value.replace(/^Bearer\s+/i, "").startsWith("ocxr_")) continue; + headers.append(name, value); + } + headers.set("host", "127.0.0.1:10100"); + headers.set("origin", "http://127.0.0.1:10100"); + headers.set(GATEWAY_ASSERTION_HEADER, assertion); + headers.set("x-ocxr-target-path", `${target.pathname}${target.search}`); + return headers; +} + +function sanitizeResponseHeaders(response: Response, publicHost: string): Headers { + const headers = new Headers(); + for (const [name, value] of response.headers) { + const lower = name.toLowerCase(); + if (RESPONSE_HEADER_DENY.has(lower) || lower.startsWith("cf-") || lower.startsWith("x-ocxr-")) continue; + if (lower === "location") { + headers.set(name, value.replace(/^https?:\/\/(?:127\.0\.0\.1|localhost):10100/i, `https://${publicHost}`)); + } else { + headers.append(name, value); + } + } + headers.set("cache-control", headers.get("cache-control") ?? "no-store"); + headers.set("x-content-type-options", "nosniff"); + return headers; +} + +function privateUrl(instance: InstanceRecord, requestUrl: URL): URL { + return new URL(`${requestUrl.pathname}${requestUrl.search}`, `http://${instance.privateHostname}:10101`); +} + +const activeRequests = new Map>(); +function track(instanceId: string, controller: AbortController): () => void { + const set = activeRequests.get(instanceId) ?? new Set(); + set.add(controller); + activeRequests.set(instanceId, set); + return () => { + set.delete(controller); + if (!set.size) activeRequests.delete(instanceId); + }; +} + +async function listenForRevocations(): Promise { + const client = await database.pool.connect(); + client.on("notification", message => { + if (message.channel !== "instance_state" || !message.payload) return; + try { + const { instanceId } = JSON.parse(message.payload) as { instanceId: string }; + for (const controller of activeRequests.get(instanceId) ?? []) controller.abort("instance disabled"); + } catch { /* malformed NOTIFY payload is ignored */ } + }); + client.on("error", error => console.error("gateway PostgreSQL listener failed", error.message)); + await client.query("LISTEN instance_state"); +} + +interface SocketData { + instance: InstanceRecord; + userId: string; + url: URL; + headers: Headers; + queued: Array; + upstream?: WebSocket; +} + +let gatewayServer: Bun.Server; + +async function authenticate(req: Request): Promise<{ instance: InstanceRecord; userId: string } | null> { + const url = new URL(req.url); + const host = req.headers.get("host") ?? ""; + if (url.pathname === "/healthz" && safeEqual(req.headers.get("x-ocxr-synthetic"), config.syntheticHealthToken)) { + const result = await store.resolveGatewayRequest(host, null, null, "/_synthetic"); + if (result) return { ...result, userId: "synthetic-health" }; + // Synthetic health still needs to resolve an active instance, but has no + // user session. Resolve it through a constrained direct query. + const slug = host.toLowerCase().replace(/:\d+$/, "").replace(`.${config.PLATFORM_INSTANCE_DOMAIN.toLowerCase()}`, ""); + const found = await database.query<{ + id: string; owner_id: string; name: string; slug: string; private_hostname: string; + status: InstanceRecord["status"]; created_at: Date; updated_at: Date; + }>(`SELECT i.* FROM instances i JOIN users u ON u.id=i.owner_id + WHERE i.slug=$1 AND i.status IN ('connecting','online','degraded','offline') AND i.deleted_at IS NULL AND u.status='active'`, [slug]); + const row = found.rows[0]; + return row ? { userId: "synthetic-health", instance: { + id: row.id, ownerId: row.owner_id, name: row.name, slug: row.slug, + privateHostname: row.private_hostname, status: row.status, + createdAt: row.created_at.toISOString(), updatedAt: row.updated_at.toISOString(), + } } : null; + } + return store.resolveGatewayRequest( + host, + remoteCredential(req), + cookieValue(req, INSTANCE_COOKIE), + url.pathname, + ); +} + +gatewayServer = Bun.serve({ + port: config.PLATFORM_GATEWAY_PORT, + hostname: "127.0.0.1", + async fetch(req, server) { + const url = new URL(req.url); + const host = req.headers.get("host") ?? ""; + if (url.pathname === "/_ocxr/exchange" && req.method === "GET") { + const code = url.searchParams.get("code"); + const exchanged = code ? await store.exchangeInstanceAuthorization(host, code) : null; + if (!exchanged) return new Response("Not found", { status: 404 }); + return new Response(null, { + status: 302, + headers: { + location: "/", + "set-cookie": `${INSTANCE_COOKIE}=${encodeURIComponent(exchanged.token)}; Path=/; Expires=${exchanged.expiresAt.toUTCString()}; HttpOnly; Secure; SameSite=Lax`, + "cache-control": "no-store", + }, + }); + } + + const auth = await authenticate(req); + if (!auth) return new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } }); + const target = privateUrl(auth.instance, url); + const assertion = signGatewayAssertion(config, { + instanceId: auth.instance.id, + userId: auth.userId, + method: req.method, + url, + }); + const headers = sanitizeRequestHeaders(req, target, assertion); + + if (req.headers.get("upgrade")?.toLowerCase() === "websocket") { + const wsTarget = new URL(target); + wsTarget.protocol = "ws:"; + const upgraded = server.upgrade(req, { + data: { instance: auth.instance, userId: auth.userId, url: wsTarget, headers, queued: [] }, + }); + return upgraded ? undefined : new Response("WebSocket upgrade failed", { status: 502 }); + } + + const controller = new AbortController(); + const untrack = track(auth.instance.id, controller); + const abort = () => controller.abort(req.signal.reason); + req.signal.addEventListener("abort", abort, { once: true }); + try { + const response = await fetch(target, { + method: req.method, + headers, + body: req.body, + redirect: "manual", + signal: controller.signal, + // Required by Bun for streaming request bodies. + duplex: req.body ? "half" : undefined, + } as RequestInit); + if (url.pathname === "/healthz") await store.recordHealth(auth.instance.id, "gateway", response.ok); + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: sanitizeResponseHeaders(response, host), + }); + } catch { + if (url.pathname === "/healthz") await store.recordHealth(auth.instance.id, "gateway", false); + return new Response("Upstream unavailable", { status: 502 }); + } finally { + req.signal.removeEventListener("abort", abort); + untrack(); + } + }, + websocket: { + open(ws) { + const upstream = new WebSocket(ws.data.url, { headers: Object.fromEntries(ws.data.headers) } as never); + ws.data.upstream = upstream; + upstream.binaryType = "arraybuffer"; + upstream.addEventListener("open", () => { + for (const message of ws.data.queued.splice(0)) upstream.send(message); + }); + upstream.addEventListener("message", event => { + if (typeof event.data === "string") ws.send(event.data); + else if (event.data instanceof ArrayBuffer) ws.send(event.data); + }); + upstream.addEventListener("close", event => ws.close(event.code, event.reason)); + upstream.addEventListener("error", () => ws.close(1011, "upstream error")); + }, + message(ws, message) { + if (ws.data.upstream?.readyState === WebSocket.OPEN) ws.data.upstream.send(message); + else ws.data.queued.push(typeof message === "string" ? message : Buffer.from(message)); + }, + close(ws, code, reason) { + if (ws.data.upstream && ws.data.upstream.readyState < WebSocket.CLOSING) ws.data.upstream.close(code, reason); + }, + }, +}); + +void listenForRevocations(); +console.log(`OpenCodex Remote gateway listening on 127.0.0.1:${config.PLATFORM_GATEWAY_PORT}`); diff --git a/platform/server/src/security.ts b/platform/server/src/security.ts new file mode 100644 index 000000000..3cb4b433e --- /dev/null +++ b/platform/server/src/security.ts @@ -0,0 +1,81 @@ +import { + createCipheriv, + createDecipheriv, + createHash, + createHmac, + createPrivateKey, + createPublicKey, + randomBytes, + randomUUID, + sign, +} from "node:crypto"; +import type { PlatformConfig } from "./config"; + +export const GATEWAY_ASSERTION_HEADER = "x-opencodex-remote-assertion"; +export const GATEWAY_ASSERTION_AUDIENCE = "opencodex-management"; +const PAIRING_ALPHABET = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; + +export function sha256(value: string): Buffer { + return createHash("sha256").update(value).digest(); +} + +export function issueOpaqueToken(prefix: "ocxr_" | "ocxr_session_" | "ocxr_agent_"): string { + return `${prefix}${randomBytes(32).toString("base64url")}`; +} + +export function issueShortCode(length = 12): string { + const bytes = randomBytes(length); + return Array.from(bytes, byte => PAIRING_ALPHABET[byte % PAIRING_ALPHABET.length]).join(""); +} + +export function normalizedPathHash(input: URL | string): string { + const url = input instanceof URL ? new URL(input) : new URL(input, "https://instance.invalid"); + url.searchParams.sort(); + return createHash("sha256").update(`${url.pathname}${url.search}`).digest("hex"); +} + +export function encryptSecret(value: string, key: Buffer): Buffer { + const nonce = randomBytes(12); + const cipher = createCipheriv("aes-256-gcm", key, nonce); + const ciphertext = Buffer.concat([cipher.update(value, "utf8"), cipher.final()]); + return Buffer.concat([Buffer.from([1]), nonce, cipher.getAuthTag(), ciphertext]); +} + +export function decryptSecret(value: Buffer, key: Buffer): string { + if (value[0] !== 1 || value.length < 30) throw new Error("unsupported encrypted secret envelope"); + const decipher = createDecipheriv("aes-256-gcm", key, value.subarray(1, 13)); + decipher.setAuthTag(value.subarray(13, 29)); + return Buffer.concat([decipher.update(value.subarray(29)), decipher.final()]).toString("utf8"); +} + +export function networkSignalHmac(value: string, key: Buffer): string { + return createHmac("sha256", key).update(value).digest("base64url"); +} + +export function gatewayPublicKeyPem(config: PlatformConfig): string { + return createPublicKey(createPrivateKey(config.gatewayPrivateKeyPem)) + .export({ type: "spki", format: "pem" }).toString(); +} + +export function signGatewayAssertion( + config: PlatformConfig, + input: { instanceId: string; userId: string; method: string; url: URL }, + now = Date.now(), +): string { + const iat = Math.floor(now / 1000); + const header = Buffer.from(JSON.stringify({ alg: "EdDSA", typ: "JWT", kid: config.PLATFORM_GATEWAY_KID })).toString("base64url"); + const claims = Buffer.from(JSON.stringify({ + iss: config.PLATFORM_GATEWAY_ISSUER, + aud: GATEWAY_ASSERTION_AUDIENCE, + instance_id: input.instanceId, + user_id: input.userId, + method: input.method.toUpperCase(), + path_sha256: normalizedPathHash(input.url), + iat, + exp: iat + 30, + jti: randomUUID(), + })).toString("base64url"); + const signingInput = `${header}.${claims}`; + const signature = sign(null, Buffer.from(signingInput), config.gatewayPrivateKeyPem).toString("base64url"); + return `${signingInput}.${signature}`; +} diff --git a/platform/server/src/store.ts b/platform/server/src/store.ts new file mode 100644 index 000000000..d1e0827df --- /dev/null +++ b/platform/server/src/store.ts @@ -0,0 +1,428 @@ +import { createPublicKey, randomBytes, randomUUID, verify } from "node:crypto"; +import type { PoolClient } from "pg"; +import type { Database } from "./db"; +import type { PlatformConfig } from "./config"; +import { + decryptSecret, + encryptSecret, + issueOpaqueToken, + issueShortCode, + networkSignalHmac, + sha256, +} from "./security"; + +export type InstanceStatus = + | "pending" | "provisioning" | "awaiting_agent" | "connecting" | "online" + | "degraded" | "offline" | "suspending" | "suspended" | "deleting" + | "delete_failed" | "deleted"; + +export interface Actor { + id: string; + githubNumericId: string; + role: "user" | "admin"; + status: "active" | "pending_invite" | "suspended"; + name: string; + email: string; +} + +export interface InstanceRecord { + id: string; + ownerId: string; + name: string; + slug: string; + privateHostname: string; + status: InstanceStatus; + createdAt: string; + updatedAt: string; +} + +interface InstanceRow { + id: string; + owner_id: string; + name: string; + slug: string; + private_hostname: string; + status: InstanceStatus; + created_at: Date; + updated_at: Date; +} + +function instanceFromRow(row: InstanceRow): InstanceRecord { + return { + id: row.id, + ownerId: row.owner_id, + name: row.name, + slug: row.slug, + privateHostname: row.private_hostname, + status: row.status, + createdAt: row.created_at.toISOString(), + updatedAt: row.updated_at.toISOString(), + }; +} + +function duplicateConstraint(error: unknown): boolean { + return !!error && typeof error === "object" && (error as { code?: string }).code === "23505"; +} + +export class PlatformStore { + constructor(readonly db: Database, readonly config: PlatformConfig) {} + + async authorizeUser(user: { id: string; name: string; email: string; githubNumericId?: string | null }): Promise { + if (!user.githubNumericId) return null; + if (user.githubNumericId === this.config.PLATFORM_BOOTSTRAP_GITHUB_ID) { + await this.db.query( + "UPDATE users SET role='admin', status='active', updated_at=now() WHERE id=$1 AND github_numeric_id=$2", + [user.id, user.githubNumericId], + ); + } + const result = await this.db.query<{ + id: string; name: string; email: string; github_numeric_id: string; + role: "user" | "admin"; status: Actor["status"]; + }>("SELECT id,name,email,github_numeric_id,role,status FROM users WHERE id=$1", [user.id]); + const row = result.rows[0]; + return row ? { id: row.id, name: row.name, email: row.email, githubNumericId: row.github_numeric_id, role: row.role, status: row.status } : null; + } + + async redeemInvite(actor: Actor, token: string): Promise { + const result = await this.db.transaction(async client => { + const invite = await client.query<{ id: string; expected_github_numeric_id: string | null }>( + `SELECT id,expected_github_numeric_id FROM invites + WHERE token_hash=$1 AND consumed_at IS NULL AND expires_at>now() FOR UPDATE`, + [sha256(token)], + ); + const row = invite.rows[0]; + if (!row || (row.expected_github_numeric_id && row.expected_github_numeric_id !== actor.githubNumericId)) return false; + await client.query("UPDATE invites SET consumed_at=now(),consumed_by=$2 WHERE id=$1", [row.id, actor.id]); + await client.query("UPDATE users SET status='active',updated_at=now() WHERE id=$1", [actor.id]); + return true; + }); + return result; + } + + async createInvite(actor: Actor, expectedGithubNumericId?: string): Promise<{ token: string; expiresAt: string }> { + if (actor.role !== "admin" || actor.status !== "active") throw new Error("forbidden"); + const count = await this.db.query<{ count: string }>("SELECT count(*)::text AS count FROM users WHERE status='active'"); + if (Number(count.rows[0]?.count ?? "0") >= 50) throw new Error("private beta user limit reached"); + const token = randomBytes(32).toString("base64url"); + const expiresAt = new Date(Date.now() + 24 * 60 * 60_000); + await this.db.query( + "INSERT INTO invites(token_hash,created_by,expected_github_numeric_id,expires_at) VALUES($1,$2,$3,$4)", + [sha256(token), actor.id, expectedGithubNumericId ?? null, expiresAt], + ); + return { token, expiresAt: expiresAt.toISOString() }; + } + + async listInstances(actor: Actor): Promise { + const result = actor.role === "admin" + ? await this.db.query("SELECT * FROM instances WHERE deleted_at IS NULL ORDER BY created_at DESC") + : await this.db.query("SELECT * FROM instances WHERE owner_id=$1 AND deleted_at IS NULL ORDER BY created_at DESC", [actor.id]); + return result.rows.map(instanceFromRow); + } + + async getOwnedInstance(actor: Actor, id: string): Promise { + const result = await this.db.query( + `SELECT * FROM instances WHERE id=$1 AND deleted_at IS NULL AND (owner_id=$2 OR $3='admin')`, + [id, actor.id, actor.role], + ); + return result.rows[0] ? instanceFromRow(result.rows[0]) : null; + } + + async createInstance(actor: Actor, input: { name: string; slug: string }): Promise { + if (actor.status !== "active") throw new Error("invite required"); + const name = input.name.trim(); + const slug = input.slug.trim().toLowerCase(); + if (name.length < 1 || name.length > 80) throw new Error("name must be 1-80 characters"); + if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(slug)) throw new Error("invalid slug"); + const privateHostname = `${randomBytes(20).toString("hex")}.ocxr.internal`; + try { + return await this.db.transaction(async client => { + const tombstone = await client.query("SELECT 1 FROM slug_tombstones WHERE slug=$1 AND expires_at>now()", [slug]); + if (tombstone.rowCount) throw new Error("slug is temporarily reserved"); + const result = await client.query( + `INSERT INTO instances(owner_id,name,slug,private_hostname) + VALUES($1,$2,$3,$4) RETURNING *`, + [actor.id, name, slug, privateHostname], + ); + await client.query( + `INSERT INTO provisioning_jobs(instance_id,kind,idempotency_key) + VALUES($1,'provision',$2)`, + [result.rows[0].id, `provision:${result.rows[0].id}:v1`], + ); + await this.audit(client, actor.id, "instance.create", result.rows[0].id, "accepted"); + return instanceFromRow(result.rows[0]); + }); + } catch (error) { + if (duplicateConstraint(error)) throw new Error("slug is unavailable or instance limit reached"); + throw error; + } + } + + async createPairingCode(actor: Actor, instanceId: string): Promise<{ code: string; expiresAt: string }> { + const instance = await this.getOwnedInstance(actor, instanceId); + if (!instance || !["awaiting_agent", "connecting", "offline"].includes(instance.status)) throw new Error("instance is not ready for pairing"); + const code = issueShortCode(); + const expiresAt = new Date(Date.now() + 10 * 60_000); + await this.db.transaction(async client => { + await client.query("UPDATE pairing_codes SET consumed_at=now() WHERE instance_id=$1 AND consumed_at IS NULL", [instanceId]); + await client.query("INSERT INTO pairing_codes(instance_id,code_hash,expires_at) VALUES($1,$2,$3)", [instanceId, sha256(code), expiresAt]); + await this.audit(client, actor.id, "pairing_code.create", instanceId, "success"); + }); + return { code, expiresAt: expiresAt.toISOString() }; + } + + async consumePairingCode(input: { code: string; publicKeyDer: Buffer; version: string }): Promise<{ + agentId: string; instanceId: string; tunnelToken: string; + }> { + if (input.publicKeyDer.length < 32 || input.publicKeyDer.length > 256) throw new Error("invalid Ed25519 public key"); + return this.db.transaction(async client => { + const pairing = await client.query<{ id: string; instance_id: string }>( + `SELECT id,instance_id FROM pairing_codes + WHERE code_hash=$1 AND consumed_at IS NULL AND expires_at>now() FOR UPDATE`, + [sha256(input.code.trim().toUpperCase())], + ); + const row = pairing.rows[0]; + if (!row) throw new Error("invalid or expired pairing code"); + const agent = await client.query<{ id: string }>( + `INSERT INTO agents(instance_id,public_key,version) + VALUES($1,$2,$3) + ON CONFLICT(instance_id) DO UPDATE SET public_key=excluded.public_key,version=excluded.version, + status='paired',revoked_at=NULL,auth_token_hash=NULL,auth_token_expires_at=NULL + RETURNING id`, + [row.instance_id, input.publicKeyDer, input.version], + ); + const resource = await client.query<{ encrypted_secret: Buffer }>( + "SELECT encrypted_secret FROM cloudflare_resources WHERE instance_id=$1 AND resource_type='tunnel' AND deleted_at IS NULL", + [row.instance_id], + ); + if (!resource.rows[0]?.encrypted_secret) throw new Error("tunnel token is not provisioned"); + await client.query("UPDATE pairing_codes SET consumed_at=now() WHERE id=$1", [row.id]); + await client.query("UPDATE instances SET status='connecting',updated_at=now() WHERE id=$1", [row.instance_id]); + return { + agentId: agent.rows[0].id, + instanceId: row.instance_id, + tunnelToken: decryptSecret(resource.rows[0].encrypted_secret, this.config.encryptionKey), + }; + }); + } + + async createAgentChallenge(agentId: string, clientNonce: string): Promise { + if (!/^[A-Za-z0-9_-]{16,128}$/.test(clientNonce)) throw new Error("invalid client nonce"); + const challenge = `${agentId}.${clientNonce}.${randomBytes(32).toString("base64url")}`; + const result = await this.db.query( + `UPDATE agents SET challenge_hash=$2,challenge_expires_at=now()+interval '60 seconds' + WHERE id=$1 AND revoked_at IS NULL RETURNING id`, + [agentId, sha256(challenge)], + ); + if (!result.rowCount) throw new Error("agent not found"); + return challenge; + } + + async exchangeAgentChallenge(agentId: string, challenge: string, signature: Buffer): Promise<{ token: string; expiresAt: string }> { + return this.db.transaction(async client => { + const result = await client.query<{ public_key: Buffer; challenge_hash: Buffer }>( + `SELECT public_key,challenge_hash FROM agents + WHERE id=$1 AND revoked_at IS NULL AND challenge_expires_at>now() FOR UPDATE`, + [agentId], + ); + const agent = result.rows[0]; + if (!agent || !agent.challenge_hash.equals(sha256(challenge))) throw new Error("challenge expired"); + const publicKey = createPublicKey({ key: agent.public_key, format: "der", type: "spki" }); + if (!verify(null, Buffer.from(challenge), publicKey, signature)) throw new Error("invalid challenge signature"); + const token = issueOpaqueToken("ocxr_agent_"); + const expiresAt = new Date(Date.now() + 5 * 60_000); + await client.query( + `UPDATE agents SET auth_token_hash=$2,auth_token_expires_at=$3,challenge_hash=NULL,challenge_expires_at=NULL + WHERE id=$1`, + [agentId, sha256(token), expiresAt], + ); + return { token, expiresAt: expiresAt.toISOString() }; + }); + } + + async heartbeat(token: string, input: { opencodexHealthy: boolean; version: string }): Promise<{ instanceId: string }> { + const result = await this.db.query<{ instance_id: string }>( + `UPDATE agents SET last_heartbeat_at=now(),version=$2 + WHERE auth_token_hash=$1 AND auth_token_expires_at>now() AND revoked_at IS NULL + RETURNING instance_id`, + [sha256(token), input.version], + ); + const row = result.rows[0]; + if (!row) throw new Error("agent token expired"); + await this.recordHealth(row.instance_id, "agent", input.opencodexHealthy); + return { instanceId: row.instance_id }; + } + + async issueDataToken(actor: Actor, instanceId: string, name: string): Promise<{ token: string; expiresAt: string }> { + const instance = await this.getOwnedInstance(actor, instanceId); + if (!instance || ["suspended", "deleting", "deleted"].includes(instance.status)) throw new Error("instance not found"); + const token = issueOpaqueToken("ocxr_"); + const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60_000); + await this.db.query( + `INSERT INTO access_tokens(instance_id,user_id,name,token_hash,token_hint,expires_at) + VALUES($1,$2,$3,$4,$5,$6)`, + [instanceId, actor.id, name.trim().slice(0, 80) || "CLI token", sha256(token), token.slice(-6), expiresAt], + ); + return { token, expiresAt: expiresAt.toISOString() }; + } + + async issueInstanceAuthorization(actor: Actor, instanceId: string): Promise { + const instance = await this.getOwnedInstance(actor, instanceId); + if (!instance || !["online", "degraded"].includes(instance.status)) throw new Error("instance is unavailable"); + const code = randomBytes(32).toString("base64url"); + await this.db.query( + `INSERT INTO instance_authorization_codes(instance_id,user_id,code_hash,expires_at) + VALUES($1,$2,$3,now()+interval '60 seconds')`, + [instanceId, actor.id, sha256(code)], + ); + return `https://${instance.slug}.${this.config.PLATFORM_INSTANCE_DOMAIN}/_ocxr/exchange?code=${encodeURIComponent(code)}`; + } + + async exchangeInstanceAuthorization(host: string, code: string): Promise<{ token: string; expiresAt: Date } | null> { + return this.db.transaction(async client => { + const authorization = await client.query<{ id: string; instance_id: string; user_id: string }>( + `SELECT c.id,c.instance_id,c.user_id FROM instance_authorization_codes c + JOIN instances i ON i.id=c.instance_id + JOIN users u ON u.id=c.user_id + WHERE c.code_hash=$1 AND c.consumed_at IS NULL AND c.expires_at>now() + AND i.slug=$2 AND i.status IN ('online','degraded') AND u.status='active' + FOR UPDATE OF c`, + [sha256(code), this.slugFromHost(host)], + ); + const row = authorization.rows[0]; + if (!row) return null; + const token = issueOpaqueToken("ocxr_session_"); + const expiresAt = new Date(Date.now() + 12 * 60 * 60_000); + await client.query("UPDATE instance_authorization_codes SET consumed_at=now() WHERE id=$1", [row.id]); + await client.query( + "INSERT INTO instance_sessions(instance_id,user_id,token_hash,expires_at) VALUES($1,$2,$3,$4)", + [row.instance_id, row.user_id, sha256(token), expiresAt], + ); + return { token, expiresAt }; + }); + } + + async resolveGatewayRequest(host: string, authorization: string | null, sessionToken: string | null, path: string): Promise<{ + instance: InstanceRecord; userId: string; + } | null> { + const slug = this.slugFromHost(host); + if (!slug) return null; + const instanceResult = await this.db.query( + `SELECT i.* FROM instances i JOIN users u ON u.id=i.owner_id + WHERE i.slug=$1 AND i.status IN ('online','degraded') AND i.deleted_at IS NULL AND u.status='active'`, + [slug], + ); + const row = instanceResult.rows[0]; + if (!row) return null; + if (path.startsWith("/v1/")) { + const token = authorization?.replace(/^Bearer\s+/i, "").trim(); + if (token?.startsWith("ocxr_") && !token.startsWith("ocxr_session_") && !token.startsWith("ocxr_agent_")) { + const access = await this.db.query<{ user_id: string }>( + `UPDATE access_tokens SET last_used_at=now() + WHERE instance_id=$1 AND token_hash=$2 AND expires_at>now() AND revoked_at IS NULL + RETURNING user_id`, + [row.id, sha256(token)], + ); + return access.rows[0] ? { instance: instanceFromRow(row), userId: access.rows[0].user_id } : null; + } + // Browser-driven `/v1/*` calls are bound to the same instance session as + // the GUI. A separate remote token can ride in x-opencodex-remote-token + // when Authorization must be preserved for ChatGPT Direct. + if (!sessionToken) return null; + } + if (!sessionToken) return null; + const session = await this.db.query<{ user_id: string }>( + `SELECT user_id FROM instance_sessions + WHERE instance_id=$1 AND token_hash=$2 AND expires_at>now() AND revoked_at IS NULL`, + [row.id, sha256(sessionToken)], + ); + return session.rows[0] ? { instance: instanceFromRow(row), userId: session.rows[0].user_id } : null; + } + + async suspendInstance(actor: Actor, instanceId: string): Promise { + const instance = await this.getOwnedInstance(actor, instanceId); + if (!instance) throw new Error("instance not found"); + await this.db.transaction(async client => { + await client.query("UPDATE instances SET status='suspending',suspended_at=now(),updated_at=now() WHERE id=$1", [instanceId]); + await client.query("UPDATE agents SET revoked_at=now(),auth_token_hash=NULL WHERE instance_id=$1", [instanceId]); + await client.query("UPDATE access_tokens SET revoked_at=now() WHERE instance_id=$1 AND revoked_at IS NULL", [instanceId]); + await client.query("UPDATE instance_sessions SET revoked_at=now() WHERE instance_id=$1 AND revoked_at IS NULL", [instanceId]); + await client.query( + `INSERT INTO provisioning_jobs(instance_id,kind,idempotency_key) + VALUES($1,'suspend',$2) ON CONFLICT(idempotency_key) DO NOTHING`, + [instanceId, `suspend:${instanceId}:${Date.now()}`], + ); + await client.query("SELECT pg_notify('instance_state',$1)", [JSON.stringify({ instanceId, status: "suspending" })]); + await this.audit(client, actor.id, "instance.suspend", instanceId, "accepted"); + }); + } + + async deleteInstance(actor: Actor, instanceId: string): Promise { + const instance = await this.getOwnedInstance(actor, instanceId); + if (!instance) throw new Error("instance not found"); + await this.db.transaction(async client => { + await client.query("UPDATE instances SET status='deleting',updated_at=now() WHERE id=$1", [instanceId]); + await client.query("UPDATE agents SET revoked_at=now(),auth_token_hash=NULL WHERE instance_id=$1", [instanceId]); + await client.query("UPDATE access_tokens SET revoked_at=now() WHERE instance_id=$1 AND revoked_at IS NULL", [instanceId]); + await client.query("UPDATE instance_sessions SET revoked_at=now() WHERE instance_id=$1 AND revoked_at IS NULL", [instanceId]); + await client.query( + `INSERT INTO provisioning_jobs(instance_id,kind,idempotency_key) + VALUES($1,'delete',$2) ON CONFLICT(idempotency_key) DO NOTHING`, + [instanceId, `delete:${instanceId}:v1`], + ); + await client.query("SELECT pg_notify('instance_state',$1)", [JSON.stringify({ instanceId, status: "deleting" })]); + await this.audit(client, actor.id, "instance.delete", instanceId, "accepted"); + }); + } + + async recordHealth(instanceId: string, signal: "agent" | "tunnel" | "gateway", healthy: boolean): Promise { + await this.db.query( + "INSERT INTO health_observations(instance_id,signal,healthy) VALUES($1,$2,$3)", + [instanceId, signal, healthy], + ); + } + + async refreshComputedHealth(instanceId: string): Promise { + const result = await this.db.query<{ signal: string; healthy: boolean; observed_at: Date }>( + `SELECT DISTINCT ON(signal) signal,healthy,observed_at FROM health_observations + WHERE instance_id=$1 ORDER BY signal,observed_at DESC`, + [instanceId], + ); + const fresh = new Map(result.rows.filter(row => Date.now() - row.observed_at.getTime() <= 90_000).map(row => [row.signal, row.healthy])); + const values = ["agent", "tunnel", "gateway"].map(signal => fresh.get(signal)); + const status: InstanceStatus = values.every(value => value === true) ? "online" + : values.every(value => value === undefined) ? "offline" : "degraded"; + await this.db.query( + `UPDATE instances SET status=$2,updated_at=now() + WHERE id=$1 AND status NOT IN ('suspending','suspended','deleting','delete_failed','deleted')`, + [instanceId, status], + ); + return status; + } + + async saveCloudflareResource(instanceId: string, resourceType: "tunnel" | "hostname_route", externalId: string, secret?: string): Promise { + await this.db.query( + `INSERT INTO cloudflare_resources(instance_id,resource_type,external_id,encrypted_secret) + VALUES($1,$2,$3,$4) + ON CONFLICT(instance_id,resource_type) DO UPDATE SET external_id=excluded.external_id, + encrypted_secret=excluded.encrypted_secret,disabled_at=NULL,deleted_at=NULL`, + [instanceId, resourceType, externalId, secret ? encryptSecret(secret, this.config.encryptionKey) : null], + ); + } + + private slugFromHost(host: string): string | null { + const hostname = host.toLowerCase().replace(/:\d+$/, ""); + const suffix = `.${this.config.PLATFORM_INSTANCE_DOMAIN.toLowerCase()}`; + if (!hostname.endsWith(suffix)) return null; + const slug = hostname.slice(0, -suffix.length); + return /^[a-z0-9-]{1,63}$/.test(slug) ? slug : null; + } + + private audit(client: PoolClient, actorId: string | null, action: string, instanceId: string | null, result: string): Promise { + const requestId = randomUUID(); + return client.query( + `INSERT INTO audit_logs(actor_id,action,instance_id,result,request_id,network_hmac) + VALUES($1,$2,$3,$4,$5,$6)`, + [actorId, action, instanceId, result, requestId, networkSignalHmac(requestId, this.config.auditHmacKey)], + ); + } +} diff --git a/platform/server/src/worker.ts b/platform/server/src/worker.ts new file mode 100644 index 000000000..5d0265260 --- /dev/null +++ b/platform/server/src/worker.ts @@ -0,0 +1,164 @@ +import { hostname } from "node:os"; +import type { PoolClient } from "pg"; +import { CloudflareApi, FakeCloudflareProvider, type CloudflareProvider } from "./cloudflare"; +import { loadPlatformConfig } from "./config"; +import { Database } from "./db"; +import { PlatformStore } from "./store"; + +interface Job { + id: string; + instance_id: string; + kind: "provision" | "suspend" | "delete"; + step: string; + attempts: number; +} + +const config = loadPlatformConfig(); +const database = new Database(config.PLATFORM_DATABASE_URL); +const store = new PlatformStore(database, config); +const cloudflare: CloudflareProvider = config.CLOUDFLARE_MESH_ENABLED === "true" + ? new CloudflareApi(config) + : new FakeCloudflareProvider(); +const workerId = `${hostname()}:${process.pid}`; + +async function claimJob(): Promise { + return database.transaction(async client => { + const result = await client.query( + `SELECT id,instance_id,kind,step,attempts FROM provisioning_jobs + WHERE status IN ('queued','retry') AND available_at<=now() + ORDER BY created_at FOR UPDATE SKIP LOCKED LIMIT 1`, + ); + const job = result.rows[0]; + if (!job) return null; + await client.query( + `UPDATE provisioning_jobs SET status='running',locked_at=now(),locked_by=$2, + attempts=attempts+1,updated_at=now() WHERE id=$1`, + [job.id, workerId], + ); + job.attempts += 1; + return job; + }); +} + +async function resource(instanceId: string, type: string): Promise { + const result = await database.query<{ external_id: string }>( + "SELECT external_id FROM cloudflare_resources WHERE instance_id=$1 AND resource_type=$2 AND deleted_at IS NULL", + [instanceId, type], + ); + return result.rows[0]?.external_id ?? null; +} + +async function provision(job: Job): Promise { + await database.query("UPDATE instances SET status='provisioning',updated_at=now() WHERE id=$1", [job.instance_id]); + let tunnelId = await resource(job.instance_id, "tunnel"); + if (!tunnelId) { + const tunnel = await cloudflare.createTunnel(`ocxr-${job.instance_id}`); + await store.saveCloudflareResource(job.instance_id, "tunnel", tunnel.id, tunnel.token); + tunnelId = tunnel.id; + await database.query("UPDATE provisioning_jobs SET step='tunnel_created',updated_at=now() WHERE id=$1", [job.id]); + } + let routeId = await resource(job.instance_id, "hostname_route"); + if (!routeId) { + const instance = await database.query<{ private_hostname: string }>("SELECT private_hostname FROM instances WHERE id=$1", [job.instance_id]); + routeId = await cloudflare.createPrivateHostnameRoute(tunnelId, instance.rows[0].private_hostname); + await store.saveCloudflareResource(job.instance_id, "hostname_route", routeId); + await database.query("UPDATE provisioning_jobs SET step='route_created',updated_at=now() WHERE id=$1", [job.id]); + } + await database.query("UPDATE instances SET status='awaiting_agent',updated_at=now() WHERE id=$1", [job.instance_id]); +} + +async function deactivateCloudflare(instanceId: string): Promise { + const routeId = await resource(instanceId, "hostname_route"); + if (routeId) { + await cloudflare.disablePrivateHostnameRoute(routeId); + await database.query("UPDATE cloudflare_resources SET disabled_at=now(),deleted_at=now() WHERE instance_id=$1 AND resource_type='hostname_route'", [instanceId]); + } + const tunnelId = await resource(instanceId, "tunnel"); + if (tunnelId) { + // Deleting the tunnel is the only documented central operation that also + // guarantees every live connector is disconnected. Resume provisions a + // fresh tunnel and token rather than trusting a rotated-but-live connector. + await cloudflare.deleteTunnel(tunnelId); + await database.query("UPDATE cloudflare_resources SET deleted_at=now(),encrypted_secret=NULL WHERE instance_id=$1 AND resource_type='tunnel'", [instanceId]); + } +} + +async function suspend(job: Job): Promise { + await deactivateCloudflare(job.instance_id); + await database.query("UPDATE instances SET status='suspended',updated_at=now() WHERE id=$1", [job.instance_id]); +} + +async function remove(job: Job): Promise { + await deactivateCloudflare(job.instance_id); + await database.transaction(async (client: PoolClient) => { + const instance = await client.query<{ slug: string }>("SELECT slug FROM instances WHERE id=$1 FOR UPDATE", [job.instance_id]); + if (!instance.rows[0]) return; + await client.query( + `INSERT INTO slug_tombstones(slug,instance_id,expires_at) VALUES($1,$2,now()+interval '30 days') + ON CONFLICT(slug) DO UPDATE SET instance_id=excluded.instance_id,expires_at=excluded.expires_at`, + [instance.rows[0].slug, job.instance_id], + ); + await client.query("UPDATE instances SET status='deleted',deleted_at=now(),updated_at=now() WHERE id=$1", [job.instance_id]); + }); +} + +async function finish(job: Job): Promise { + await database.query("UPDATE provisioning_jobs SET status='completed',locked_at=NULL,locked_by=NULL,updated_at=now() WHERE id=$1", [job.id]); +} + +async function fail(job: Job, error: unknown): Promise { + const terminal = job.attempts >= 10; + const message = error instanceof Error ? error.message.slice(0, 500) : "job failed"; + await database.query( + `UPDATE provisioning_jobs SET status=$2,last_error=$3,available_at=now()+($4 || ' seconds')::interval, + locked_at=NULL,locked_by=NULL,updated_at=now() WHERE id=$1`, + [job.id, terminal ? "failed" : "retry", message, Math.min(300, 2 ** job.attempts)], + ); + if (job.kind === "delete") { + await database.query("UPDATE instances SET status='delete_failed',updated_at=now() WHERE id=$1", [job.instance_id]); + } +} + +async function refreshHealth(): Promise { + const instances = await database.query<{ id: string; slug: string }>( + "SELECT id,slug FROM instances WHERE status IN ('connecting','online','degraded','offline') AND deleted_at IS NULL", + ); + for (const instance of instances.rows) { + const tunnelId = await resource(instance.id, "tunnel"); + try { + await store.recordHealth(instance.id, "tunnel", !!tunnelId && await cloudflare.listActiveConnections(tunnelId) > 0); + } catch { await store.recordHealth(instance.id, "tunnel", false); } + try { + const response = await fetch(`https://${instance.slug}.${config.PLATFORM_INSTANCE_DOMAIN}/healthz`, { + headers: { "x-ocxr-synthetic": config.syntheticHealthToken }, + signal: AbortSignal.timeout(10_000), + }); + await store.recordHealth(instance.id, "gateway", response.ok); + } catch { await store.recordHealth(instance.id, "gateway", false); } + await store.refreshComputedHealth(instance.id); + } +} + +async function loop(): Promise { + let lastHealth = 0; + while (true) { + const job = await claimJob(); + if (job) { + try { + if (job.kind === "provision") await provision(job); + else if (job.kind === "suspend") await suspend(job); + else await remove(job); + await finish(job); + } catch (error) { await fail(job, error); } + continue; + } + if (Date.now() - lastHealth >= 30_000) { + await refreshHealth(); + lastHealth = Date.now(); + } + await Bun.sleep(500); + } +} + +console.log(`OpenCodex Remote worker started as ${workerId}`); +await loop(); diff --git a/platform/tsconfig.json b/platform/tsconfig.json new file mode 100644 index 000000000..8b3670990 --- /dev/null +++ b/platform/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "skipLibCheck": true, + "allowJs": false, + "jsx": "react-jsx", + "types": ["bun-types"], + "noEmit": true + }, + "include": ["server/src", "server/tests", "web/src", "vite.config.ts"] +} diff --git a/platform/vite.config.ts b/platform/vite.config.ts new file mode 100644 index 000000000..864d237c3 --- /dev/null +++ b/platform/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { resolve } from "node:path"; + +export default defineConfig({ + root: resolve(import.meta.dirname, "web"), + publicDir: resolve(import.meta.dirname, "../gui/public"), + plugins: [react()], + build: { outDir: "dist", emptyOutDir: true }, + server: { + port: 4173, + proxy: { "/api": "http://127.0.0.1:10200" }, + }, +}); diff --git a/platform/web/index.html b/platform/web/index.html new file mode 100644 index 000000000..745e4a39c --- /dev/null +++ b/platform/web/index.html @@ -0,0 +1,13 @@ + + + + + + + OpenCodex Remote + + +

+ + + diff --git a/platform/web/src/App.tsx b/platform/web/src/App.tsx new file mode 100644 index 000000000..0db62723a --- /dev/null +++ b/platform/web/src/App.tsx @@ -0,0 +1,206 @@ +import { useEffect, useMemo, useState } from "react"; +import { + IconActivityHeartbeat, IconArrowLeft, IconBox, IconCheck, IconChevronDown, + IconCircleCheckFilled, IconClipboard, IconCopy, IconExternalLink, + IconGlobe, IconKey, IconLink, IconLoader2, IconMenu2, IconPlayerPause, + IconPlus, IconServer2, IconShield, IconTerminal2, IconTrash, IconX, +} from "@tabler/icons-react"; +import { + createInstance, createPairingCode, deleteInstance, issueToken, listInstances, + getCurrentUser, openInstance, redeemInvite, suspendInstance, type CurrentUser, + type Instance, type InstanceStatus, +} from "./api"; +import { authClient } from "./auth-client"; + +type View = "instances" | "activity" | "security" | "new"; + +const statusCopy: Record = { + pending: "Pending", provisioning: "Provisioning", awaiting_agent: "Awaiting agent", + connecting: "Connecting", online: "Online", degraded: "Degraded", offline: "Offline", + suspending: "Suspending", suspended: "Suspended", deleting: "Deleting", + delete_failed: "Delete failed", deleted: "Deleted", +}; + +function relativeTime(value: string): string { + const seconds = Math.max(0, Math.round((Date.now() - new Date(value).getTime()) / 1000)); + if (seconds < 60) return `${seconds} seconds ago`; + if (seconds < 3600) return `${Math.round(seconds / 60)} minutes ago`; + return `${Math.round(seconds / 3600)} hours ago`; +} + +function Status({ value }: { value: InstanceStatus }) { + return {statusCopy[value]}; +} + +function Sidebar({ view, setView, open, close }: { view: View; setView: (view: View) => void; open: boolean; close: () => void }) { + const items = [ + { id: "instances" as const, label: "Instances", icon: IconServer2 }, + { id: "activity" as const, label: "Activity", icon: IconActivityHeartbeat }, + { id: "security" as const, label: "Security", icon: IconShield }, + ]; + return ; +} + +function HealthNode({ icon: Icon, title, value, ok = true }: { icon: typeof IconBox; title: string; value: string; ok?: boolean }) { + return
+
{ok ? : "!"}
+ {title}{value} +
; +} + +function Detail({ instance, onChanged }: { instance: Instance; onChanged: () => Promise }) { + const [notice, setNotice] = useState(null); + const hostname = `${instance.slug}.${import.meta.env.VITE_INSTANCE_DOMAIN ?? "ocx.run"}`; + const healthy = instance.status === "online"; + + async function copy(value: string, message: string) { + await navigator.clipboard.writeText(value); + setNotice(message); setTimeout(() => setNotice(null), 1800); + } + async function handleOpen() { + const url = await openInstance(instance.id); + if (url.startsWith("#")) setNotice("Demo instance is ready"); else window.location.assign(url); + } + async function rotate() { + const issued = await issueToken(instance.id); + await copy(issued.token, "New API token copied — it will not be shown again"); + } + async function suspend() { + if (!window.confirm(`Suspend ${instance.name}? Active connections will close immediately.`)) return; + await suspendInstance(instance.id); await onChanged(); + } + async function remove() { + if (!window.confirm(`Delete ${instance.name}? The hostname will be reserved for 30 days.`)) return; + await deleteInstance(instance.id); await onChanged(); + } + return
+

{hostname}

+ {notice &&
{notice}
} +
+ + + + +
+
+
Hostname
{hostname}
+
Version
2.7.41
+
Last seen
{relativeTime(instance.updatedAt)}
+
+
Actions + + + +
+
; +} + +function Instances({ instances, selected, select, refresh, newInstance }: { instances: Instance[]; selected: Instance | null; select: (id: string) => void; refresh: () => Promise; newInstance: () => void }) { + return <> +

Instances

GHoctocat
+
+
+
NameHostnameStatusLast seen
+ {instances.map(instance => )} + {!instances.length &&
No instances yetCreate a private endpoint for your Linux server.
} +
+ {selected ? :
Select an instance
} +
+ ; +} + +function Stepper({ step }: { step: number }) { + return
{["Instance", "Install Agent", "Verify"].map((label, index) =>
= index + 1 ? "current" : ""}`} key={label}>{step > index + 1 ? : index + 1}{label}
)}
; +} + +function NewInstance({ onCancel, onCreated }: { onCancel: () => void; onCreated: () => Promise }) { + const [step, setStep] = useState(1); + const [name, setName] = useState("home-server"); + const [slug, setSlug] = useState("home-server"); + const [instance, setInstance] = useState(null); + const [pairing, setPairing] = useState<{ code: string; expiresAt: string } | null>(null); + const [seconds, setSeconds] = useState(600); + const [error, setError] = useState(null); + const command = `curl -fsSL https://install.ocx.run/agent.sh | sudo sh`; + + useEffect(() => { + if (!pairing) return; + const tick = () => setSeconds(Math.max(0, Math.floor((new Date(pairing.expiresAt).getTime() - Date.now()) / 1000))); + tick(); const timer = window.setInterval(tick, 1000); return () => window.clearInterval(timer); + }, [pairing]); + + async function reserve() { + setError(null); + try { + const created = await createInstance(name, slug); + setInstance(created); + const code = await createPairingCode(created.id); + setPairing(code); setStep(2); + } catch (reason) { setError(reason instanceof Error ? reason.message : "Could not create instance"); } + } + async function verify() { setStep(3); await onCreated(); } + const time = `${String(Math.floor(seconds / 60)).padStart(2, "0")}:${String(seconds % 60).padStart(2, "0")}`; + return <> +

New instance

+
+ {step === 1 ?
+ + +

Choose a stable name for your private OpenCodex instance.

+ {error &&
{error}
} +
+
: step === 2 ? <> +

We’ve reserved this hostname for your new private instance.

+

Install the Linux Agent

Run this command on the server where OpenCodex is installed.

{command}

Pair this Agent

Enter this code when prompted by the agent.

{pairing?.code.match(/.{1,4}/g)?.join("-")}◷ Expires in {time}

The code can be used once and does not contain a long-lived credential.

+

Verify

We’ll check the connection once the agent is paired.

{[[IconBox,"OpenCodex detected"],[IconTerminal2,"Agent authenticated"],[IconLink,"Tunnel connected"],[IconGlobe,"Gateway health check"]].map(([Icon,label]) =>
{label as string}●  Waiting
)}
+
+ :

Instance verification started

Health becomes Online when OpenCodex, the Agent, Tunnel, and Gateway checks are all fresh.

} +
+ ; +} + +function SecondaryPage({ view, instances }: { view: "activity" | "security"; instances: Instance[] }) { + return <>

{view === "activity" ? "Activity" : "Security"}

+ {view === "activity" ? <>

Recent instance activity

{instances.map(item =>
{item.name}
)} : <>

Access is instance-scoped

Browser sessions stay on one hostname. CLI tokens can call only /v1/*, expire after 30 days, and are stored as SHA-256 hashes.

Gateway assertions expire after 30 seconds and are verified again by the local Agent and OpenCodex management API.
} +
; +} + +export function App() { + const [view, setView] = useState("instances"); + const [instances, setInstances] = useState([]); + const [selectedId, setSelectedId] = useState(null); + const [loading, setLoading] = useState(true); + const [menu, setMenu] = useState(false); + const [error, setError] = useState(null); + const [user, setUser] = useState(null); + const [invite, setInvite] = useState(""); + async function refresh() { + try { + const currentUser = await getCurrentUser(); + setUser(currentUser); + const data = currentUser.status === "active" ? await listInstances() : []; + setInstances(data); setSelectedId(current => current && data.some(item => item.id === current) ? current : data[0]?.id ?? null); setError(null); + } catch (reason) { setError(reason instanceof Error ? reason.message : "Could not load instances"); } + finally { setLoading(false); } + } + useEffect(() => { void refresh(); }, []); + const selected = useMemo(() => instances.find(item => item.id === selectedId) ?? null, [instances, selectedId]); + async function signIn() { await authClient.signIn.social({ provider: "github", callbackURL: "/" }); } + async function acceptInvite() { + try { await redeemInvite(invite); await refresh(); } + catch (reason) { setError(reason instanceof Error ? reason.message : "Invite rejected"); } + } + return
setMenu(false)} />
+ {loading ?
Loading instances
: error === "not found" ?

Private access

Sign in with the GitHub account that received an invitation.

: user?.status === "pending_invite" ?

Redeem your invite

Paste the one-time invitation token. It expires 24 hours after it was created.

setInvite(event.target.value)} placeholder="Invitation token" />{error && {error}}
: error ?
{error}
: view === "instances" ? setView("new")} /> : view === "new" ? setView("instances")} onCreated={refresh} /> : } +
; +} diff --git a/platform/web/src/api.ts b/platform/web/src/api.ts new file mode 100644 index 000000000..c40f6471e --- /dev/null +++ b/platform/web/src/api.ts @@ -0,0 +1,104 @@ +export type InstanceStatus = "pending" | "provisioning" | "awaiting_agent" | "connecting" | "online" | "degraded" | "offline" | "suspending" | "suspended" | "deleting" | "delete_failed" | "deleted"; + +export interface Instance { + id: string; + ownerId: string; + name: string; + slug: string; + privateHostname: string; + status: InstanceStatus; + createdAt: string; + updatedAt: string; +} + +const demoInstances: Instance[] = [ + { + id: "a1d31b31-197c-49a8-b3b0-17f0f8cab001", + ownerId: "demo-user", + name: "home-server", + slug: "home-server", + privateHostname: "a3f9d7c1e2b4.ocxr.internal", + status: "online", + createdAt: new Date(Date.now() - 86_400_000).toISOString(), + updatedAt: new Date(Date.now() - 12_000).toISOString(), + }, + { + id: "a1d31b31-197c-49a8-b3b0-17f0f8cab002", + ownerId: "demo-user", + name: "dev-vps", + slug: "dev-vps", + privateHostname: "7c12e6f4a5b8.ocxr.internal", + status: "degraded", + createdAt: new Date(Date.now() - 172_800_000).toISOString(), + updatedAt: new Date(Date.now() - 180_000).toISOString(), + }, +]; + +const demo = import.meta.env.VITE_REMOTE_DEMO === "true"; + +export interface CurrentUser { + id: string; name: string; email: string; role: "user" | "admin"; + status: "active" | "pending_invite" | "suspended"; +} + +async function request(path: string, init?: RequestInit): Promise { + const response = await fetch(path, { + ...init, + credentials: "same-origin", + headers: { "content-type": "application/json", ...init?.headers }, + }); + const body = await response.json().catch(() => ({})); + if (!response.ok) throw new Error(body.error ?? `Request failed (${response.status})`); + return body as T; +} + +export async function listInstances(): Promise { + if (demo) return structuredClone(demoInstances); + return (await request<{ instances: Instance[] }>("/api/v1/instances")).instances; +} + +export async function getCurrentUser(): Promise { + if (demo) return { id: "demo-user", name: "Octo Cat", email: "octocat@example.test", role: "admin", status: "active" }; + return (await request<{ user: CurrentUser }>("/api/v1/me")).user; +} + +export async function redeemInvite(token: string): Promise { + if (demo) return; + await request("/api/v1/invites/redeem", { method: "POST", body: JSON.stringify({ token }) }); +} + +export async function createInstance(name: string, slug: string): Promise { + if (demo) { + return { + id: crypto.randomUUID(), ownerId: "demo-user", name, slug, + privateHostname: `${crypto.randomUUID().replaceAll("-", "")}.ocxr.internal`, + status: "awaiting_agent", createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), + }; + } + return (await request<{ instance: Instance }>("/api/v1/instances", { method: "POST", body: JSON.stringify({ name, slug }) })).instance; +} + +export async function createPairingCode(instanceId: string): Promise<{ code: string; expiresAt: string }> { + if (demo) return { code: "7K4M2P9Q6RXC", expiresAt: new Date(Date.now() + 10 * 60_000).toISOString() }; + return request(`/api/v1/instances/${instanceId}/pairing-code`, { method: "POST", body: "{}" }); +} + +export async function openInstance(instanceId: string): Promise { + if (demo) return "#demo-instance"; + return (await request<{ url: string }>(`/api/v1/instances/${instanceId}/authorize`, { method: "POST", body: "{}" })).url; +} + +export async function issueToken(instanceId: string): Promise<{ token: string; expiresAt: string }> { + if (demo) return { token: `ocxr_${"demo".repeat(11)}`, expiresAt: new Date(Date.now() + 30 * 86_400_000).toISOString() }; + return request(`/api/v1/instances/${instanceId}/tokens`, { method: "POST", body: JSON.stringify({ name: "Dashboard token" }) }); +} + +export async function suspendInstance(instanceId: string): Promise { + if (demo) return; + await request(`/api/v1/instances/${instanceId}/suspend`, { method: "POST", body: "{}" }); +} + +export async function deleteInstance(instanceId: string): Promise { + if (demo) return; + await request(`/api/v1/instances/${instanceId}`, { method: "DELETE" }); +} diff --git a/platform/web/src/auth-client.ts b/platform/web/src/auth-client.ts new file mode 100644 index 000000000..e5a31f8be --- /dev/null +++ b/platform/web/src/auth-client.ts @@ -0,0 +1,3 @@ +import { createAuthClient } from "better-auth/react"; + +export const authClient = createAuthClient({ baseURL: window.location.origin }); diff --git a/platform/web/src/main.tsx b/platform/web/src/main.tsx new file mode 100644 index 000000000..7dbff5a72 --- /dev/null +++ b/platform/web/src/main.tsx @@ -0,0 +1,8 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { App } from "./App"; +import "./styles.css"; + +createRoot(document.getElementById("root")!).render( + , +); diff --git a/platform/web/src/styles.css b/platform/web/src/styles.css new file mode 100644 index 000000000..0390194ae --- /dev/null +++ b/platform/web/src/styles.css @@ -0,0 +1,80 @@ +:root { + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + color: #f4f4f5; + background: #101113; + font-synthesis: none; + --bg: #101113; + --sidebar: #111214; + --panel: #1a1b1e; + --panel-soft: #1f2023; + --border: #34363b; + --border-soft: #2a2c31; + --muted: #b2b3b8; + --green: #79d49d; + --yellow: #f3c84b; + --red: #ff4c4c; +} +* { box-sizing: border-box; } +body { margin: 0; min-width: 320px; min-height: 100vh; background: var(--bg); } +button, input { font: inherit; } +button { color: inherit; } +.app-shell { min-height: 100vh; display: grid; grid-template-columns: 258px 1fr; } +.sidebar { position: fixed; inset: 0 auto 0 0; width: 258px; padding: 27px 13px 23px; border-right: 1px solid #2b2d31; background: var(--sidebar); display: flex; flex-direction: column; z-index: 20; } +.brand { display: flex; align-items: center; gap: 12px; padding: 0 13px 27px; } +.brand img { width: 31px; height: 31px; object-fit: contain; } +.brand div { display: grid; line-height: 1.15; } +.brand strong { font-size: 19px; letter-spacing: -.3px; } +.brand span { color: #a5a6aa; font-size: 14px; margin-top: 3px; } +nav { display: grid; gap: 7px; } +nav button, .collapse { border: 0; background: transparent; min-height: 53px; padding: 0 15px; border-radius: 10px; display: flex; align-items: center; gap: 17px; cursor: pointer; text-align: left; font-weight: 560; } +nav button svg { width: 23px; color: #c8c9cc; } +nav button.active { background: #323438; box-shadow: inset 0 0 0 1px rgba(255,255,255,.025); } +.collapse { margin-top: auto; color: #b8b9bd; font-weight: 450; } +.collapse svg { width: 24px; border: 1px solid #9a9ba0; border-radius: 50%; padding: 3px; } +.mobile-close, .mobile-menu { display: none; } +main { grid-column: 2; min-width: 0; padding: 26px 24px 31px 27px; } +.page-header { min-height: 72px; display: flex; align-items: flex-start; justify-content: space-between; padding: 8px 12px 15px 5px; } +h1 { margin: 0; font-size: 28px; letter-spacing: -.65px; } +h2 { margin: 0; font-size: 22px; letter-spacing: -.35px; } +.account { display: flex; align-items: center; gap: 13px; margin-top: -1px; } +.account .divider { height: 63px; width: 1px; background: #303237; margin: -9px 7px -5px 8px; } +.avatar { width: 31px; height: 31px; border-radius: 50%; background: #f5f5f5; color: #17181a; display: grid; place-items: center; font-size: 10px; font-weight: 800; } +.primary { min-height: 46px; border: 0; border-radius: 8px; padding: 0 18px; background: #f5f5f5; color: #141517; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; } +.primary svg { width: 18px; } +.instance-layout { display: grid; grid-template-columns: minmax(450px, .94fr) minmax(530px, 1fr); gap: 13px; height: calc(100vh - 116px); min-height: 650px; } +.instance-list, .detail-card, .onboarding-card, .secondary-card { border: 1px solid var(--border); background: var(--panel); border-radius: 12px; overflow: hidden; } +.table-head, .instance-row { display: grid; grid-template-columns: 1.05fr 1.55fr .95fr 1.05fr; align-items: center; min-height: 64px; padding: 0 22px; column-gap: 11px; } +.table-head { color: #c5c6ca; font-size: 14px; } +.instance-row { width: 100%; border: 0; border-top: 1px solid var(--border-soft); color: #e7e7e9; background: transparent; text-align: left; cursor: pointer; } +.instance-row.selected { background: #292a2d; border: 1px solid #414348; border-radius: 9px; } +.instance-name { display: flex; align-items: center; gap: 9px; } +.tiny-dot, .status-dot { width: 7px; height: 7px; border-radius: 50%; background: #7b7d82; display: inline-block; } +.tiny-dot.status-online, .status-online .status-dot { background: var(--green); } +.tiny-dot.status-degraded, .status-degraded .status-dot, .tiny-dot.status-awaiting_agent { background: var(--yellow); } +.status { display: inline-flex; align-items: center; gap: 9px; color: #c9cacf; white-space: nowrap; } +.status-online { color: var(--green); }.status-degraded, .status-awaiting_agent, .status-connecting { color: var(--yellow); }.status-delete_failed { color: var(--red); } +.detail-card { padding: 31px 34px 28px; overflow-y: auto; position: relative; } +.detail-heading { display: flex; justify-content: space-between; gap: 24px; align-items: flex-start; } +.detail-heading h2 { font-size: 24px; margin-bottom: 9px; } +.health-row { margin-top: 45px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 17px; border-bottom: 1px solid var(--border); padding: 0 2px 46px; } +.health-node { min-width: 0; text-align: center; display: grid; justify-items: center; gap: 9px; } +.health-icon { width: 72px; height: 72px; border-radius: 50%; border: 1px solid #5a5c61; display: grid; place-items: center; position: relative; margin-bottom: 9px; } +.health-icon > svg { color: #b9bbc0; width: 27px; } +.health-icon .check, .health-icon .warn { position: absolute; right: -1px; bottom: -1px; width: 22px; height: 22px; border-radius: 50%; background: var(--green); color: #17221b; display: grid; place-items: center; font-size: 12px; font-weight: 800; } +.health-icon .warn { background: var(--yellow); }.health-icon .check svg { width: 14px; } +.health-node strong { font-size: 15px; }.health-node .healthy { color: var(--green); }.health-node .warning { color: var(--yellow); } +.facts { margin: 19px 0 0; }.facts div { min-height: 60px; display: flex; align-items: center; justify-content: space-between; }.facts dt { color: #d0d1d3; }.facts dd { margin: 0; display: flex; align-items: center; gap: 10px; } +.icon-button { background: none; border: 0; padding: 4px; cursor: pointer; }.icon-button svg { width: 18px; color: #c4c5c8; } +.actions { margin-top: 19px; padding-top: 35px; border-top: 1px solid var(--border); display: grid; gap: 15px; }.actions > span { margin-bottom: 2px; color: #c9cace; } +.actions button { height: 50px; border: 1px solid #3a3c41; border-radius: 8px; background: transparent; text-align: left; display: flex; align-items: center; gap: 14px; padding: 0 18px; cursor: pointer; font-weight: 550; }.actions button svg { width: 22px; }.actions .danger { color: var(--red); border-color: #922d2d; margin-top: 1px; } +.toast { position: absolute; top: 88px; right: 34px; background: #292b2e; border: 1px solid #4b4d52; padding: 10px 14px; border-radius: 8px; font-size: 13px; } +.empty, .empty-detail, .loading, .load-error { height: 70%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 13px; color: var(--muted); }.empty svg { width: 38px; }.empty .primary { margin-top: 9px; }.loading svg { animation: spin 1s linear infinite; }.load-error button { border: 1px solid var(--border); background: var(--panel); border-radius: 7px; padding: 8px 15px; cursor: pointer; } +.stepper { margin: 20px auto 28px; max-width: 860px; display: grid; grid-template-columns: repeat(3, 1fr); }.step { display: grid; justify-items: center; gap: 13px; color: #e9e9eb; position: relative; }.step:not(:last-child)::after { content: ""; position: absolute; height: 1px; background: #5b5d62; width: calc(100% - 75px); left: calc(50% + 39px); top: 19px; }.step span { width: 40px; height: 40px; border: 1px solid #5c5e63; border-radius: 50%; display: grid; place-items: center; z-index: 1; background: var(--bg); }.step span svg { width: 19px; }.step.current span { border-color: #f5f5f5; box-shadow: inset 0 0 0 1px #f5f5f5; } +.onboarding-card { min-height: 630px; padding: 36px 32px 31px; }.instance-form, .reserved { display: grid; grid-template-columns: 1fr 1fr; gap: 25px 38px; }.instance-form label, .reserved label { display: grid; gap: 12px; color: #d0d1d4; }.instance-form input, .reserved input, .address-input { height: 48px; width: 100%; border: 1px solid #44464b; border-radius: 7px; background: #1b1c1f; color: #f2f2f3; padding: 0 17px; outline: none; }.instance-form input:focus { border-color: #85878d; }.address-input { padding: 0; display: flex; align-items: center; overflow: hidden; }.address-input input { border: 0; flex: 1; }.address-input span { color: #a9aaae; padding-right: 16px; }.instance-form p, .reserved p { grid-column: 1/-1; color: var(--muted); margin: -8px 0 3px; }.form-error { grid-column: 1/-1; color: #ff8e8e; } +.reserved { padding-bottom: 31px; border-bottom: 1px solid var(--border); }.install-grid { display: grid; grid-template-columns: 1fr 1fr; margin-top: 32px; }.install-column { padding-right: 35px; }.verify-column { border-left: 1px solid var(--border); padding-left: 35px; }.install-grid h2 { font-size: 20px; }.install-grid p { color: var(--muted); margin: 8px 0 20px; }.install-grid pre { margin: 0; min-height: 63px; border: 1px solid #4a4c51; border-radius: 8px; padding: 21px; overflow-x: auto; color: #f0f0f1; }.copy-command { float: right; margin-top: 12px; border: 1px solid #686a70; border-radius: 7px; background: transparent; min-height: 39px; padding: 0 14px; display: flex; align-items: center; gap: 8px; cursor: pointer; }.copy-command svg { width: 19px; }.install-column hr { clear: both; border: 0; border-top: 1px solid var(--border); margin: 80px 0 35px; }.pairing-code { border: 1px solid #494b50; border-radius: 8px; min-height: 66px; padding: 0 17px; display: flex; align-items: center; justify-content: space-between; }.pairing-code strong { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 21px; letter-spacing: 1px; }.pairing-code span { color: #b7b8bc; font-size: 13px; } +.verify-row { min-height: 82px; border-bottom: 1px solid var(--border); display: grid; grid-template-columns: 56px 1fr auto; align-items: center; gap: 17px; }.verify-row > span { width: 56px; height: 56px; border: 1px solid #4b4d52; border-radius: 50%; display: grid; place-items: center; }.verify-row svg { width: 24px; color: #bfc0c4; }.verify-row em { color: var(--yellow); font-style: normal; font-size: 14px; }.footer-actions { grid-column: 1/-1; border-top: 1px solid var(--border); margin-top: 35px; padding-top: 28px; display: flex; justify-content: flex-end; gap: 16px; }.footer-actions > button:not(.primary) { border: 1px solid #45474c; border-radius: 7px; background: transparent; padding: 0 22px; min-height: 48px; cursor: pointer; }.success-state { min-height: 520px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 15px; }.success-state > svg { width: 58px; height: 58px; color: var(--green); }.success-state p { color: var(--muted); max-width: 510px; } +.secondary-card { min-height: 500px; padding: 40px; }.secondary-card > svg { width: 35px; height: 35px; margin-bottom: 20px; }.secondary-card h2 { margin-bottom: 18px; }.secondary-card > p { color: var(--muted); line-height: 1.7; max-width: 700px; }.activity-row { min-height: 66px; display: grid; grid-template-columns: 150px 1fr auto; align-items: center; border-top: 1px solid var(--border); }.activity-row time { color: var(--muted); }.security-note { margin-top: 30px; border: 1px solid var(--border); border-radius: 8px; padding: 19px; display: flex; align-items: center; gap: 13px; }.security-note svg { width: 22px; color: var(--green); } +.access-card { min-height: calc(100vh - 60px); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; gap: 16px; }.access-card > svg { width: 44px; height: 44px; }.access-card p { max-width: 430px; color: var(--muted); }.access-card input { width: min(440px, 90vw); height: 48px; border: 1px solid #44464b; border-radius: 7px; background: var(--panel); color: #f4f4f5; padding: 0 15px; } +@keyframes spin { to { transform: rotate(360deg); } } +@media (max-width: 1120px) { .instance-layout { grid-template-columns: 1fr; height: auto; }.instance-list { min-height: 350px; }.detail-card { min-height: 720px; }.health-row { gap: 8px; }.table-head, .instance-row { grid-template-columns: 1fr 1.4fr 1fr; }.table-head span:last-child, .instance-row > span:last-child { display: none; } } +@media (max-width: 760px) { .app-shell { display: block; }.sidebar { transform: translateX(-100%); transition: transform .18s ease; box-shadow: 10px 0 30px #0008; }.sidebar-open { transform: translateX(0); }.mobile-close { display: grid; position: absolute; right: 10px; top: 10px; border: 0; background: transparent; }.mobile-menu { display: grid; place-items: center; position: absolute; left: 15px; top: 18px; z-index: 3; border: 1px solid var(--border); background: var(--panel); border-radius: 7px; width: 38px; height: 38px; }.mobile-menu svg { width: 20px; }.account > span, .account > svg { display: none; } main { padding: 18px 12px 24px; }.page-header { padding-left: 52px; align-items: center; }.page-header h1 { font-size: 24px; }.account .primary { padding: 0 13px; }.instance-layout { display: block; }.instance-list { margin-bottom: 12px; }.table-head, .instance-row { grid-template-columns: 1fr 1fr; }.table-head span:nth-child(2), .instance-row > span:nth-child(2) { display: none; }.detail-card { padding: 24px 18px; min-height: 0; }.detail-heading { flex-direction: column; }.health-row { grid-template-columns: 1fr 1fr; }.instance-form, .reserved, .install-grid { grid-template-columns: 1fr; }.onboarding-card { padding: 25px 18px; }.verify-column { border-left: 0; border-top: 1px solid var(--border); padding: 28px 0 0; }.install-column { padding-right: 0; }.stepper { margin-top: 14px; }.step strong { font-size: 12px; }.pairing-code { align-items: flex-start; flex-direction: column; padding: 14px; gap: 8px; }.activity-row { grid-template-columns: 120px 1fr; }.activity-row time { display: none; } } diff --git a/remote-agent/Cargo.lock b/remote-agent/Cargo.lock new file mode 100644 index 000000000..d7acab20e --- /dev/null +++ b/remote-agent/Cargo.lock @@ -0,0 +1,2147 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite 0.29.0", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.9", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opencodex-remote-agent" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "base64", + "clap", + "ed25519-dalek", + "futures-util", + "http-body-util", + "rand 0.9.5", + "reqwest", + "serde", + "serde_json", + "sha2", + "tokio", + "tokio-tungstenite 0.28.0", + "tokio-util", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.9", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.23.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite 0.28.0", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.29.0", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.5", + "sha1", + "thiserror", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.9", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/remote-agent/Cargo.toml b/remote-agent/Cargo.toml new file mode 100644 index 000000000..7f1eedb61 --- /dev/null +++ b/remote-agent/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "opencodex-remote-agent" +version = "0.1.0" +edition = "2024" +license = "MIT" + +[dependencies] +anyhow = "1.0" +axum = { version = "0.8", features = ["ws"] } +base64 = "0.22" +clap = { version = "4.5", features = ["derive"] } +ed25519-dalek = { version = "2.2", features = ["pem", "pkcs8"] } +futures-util = "0.3" +http-body-util = "0.1" +rand = "0.9" +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "stream"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" +tokio = { version = "1", features = ["full"] } +tokio-tungstenite = { version = "0.28", features = ["rustls-tls-webpki-roots"] } +tokio-util = "0.7" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } +url = "2.5" + +[profile.release] +lto = true +codegen-units = 1 +panic = "abort" +strip = true diff --git a/remote-agent/src/assertion.rs b/remote-agent/src/assertion.rs new file mode 100644 index 000000000..9d3368460 --- /dev/null +++ b/remote-agent/src/assertion.rs @@ -0,0 +1,176 @@ +use std::{ + collections::HashMap, + sync::Arc, + time::{SystemTime, UNIX_EPOCH}, +}; + +use anyhow::{Context, Result, bail}; +use axum::http::{HeaderMap, Method, Uri}; +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use ed25519_dalek::{Signature, Verifier, VerifyingKey, pkcs8::DecodePublicKey}; +use serde::Deserialize; +use sha2::{Digest, Sha256}; +use tokio::sync::Mutex; +use url::Url; + +use crate::config::AgentConfig; + +pub const ASSERTION_HEADER: &str = "x-opencodex-remote-assertion"; +const AUDIENCE: &str = "opencodex-management"; +const MAX_ASSERTION_BYTES: usize = 8 * 1024; + +#[derive(Deserialize)] +struct Header { + alg: String, + typ: String, + kid: String, +} + +#[derive(Deserialize)] +struct Claims { + iss: String, + aud: String, + instance_id: String, + user_id: String, + method: String, + path_sha256: String, + iat: i64, + exp: i64, + jti: String, +} + +#[derive(Clone)] +pub struct AssertionVerifier { + instance_id: String, + issuer: String, + keys: Arc>, + replay: Arc>>, +} + +impl AssertionVerifier { + pub fn new(config: &AgentConfig) -> Result { + let mut keys = HashMap::new(); + for key in &config.gateway.keys { + keys.insert( + key.kid.clone(), + VerifyingKey::from_public_key_pem(&key.public_key_pem) + .context("decode gateway public key")?, + ); + } + if keys.is_empty() { + bail!("at least one gateway public key is required"); + } + Ok(Self { + instance_id: config.instance_id.clone(), + issuer: config.gateway.issuer.clone(), + keys: Arc::new(keys), + replay: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub async fn verify(&self, method: &Method, uri: &Uri, headers: &HeaderMap) -> Result { + let token = headers + .get(ASSERTION_HEADER) + .and_then(|value| value.to_str().ok()) + .context("remote assertion required")?; + if token.len() > MAX_ASSERTION_BYTES { + bail!("remote assertion is too large"); + } + let segments: Vec<_> = token.split('.').collect(); + if segments.len() != 3 { + bail!("invalid remote assertion"); + } + let header: Header = serde_json::from_slice(&URL_SAFE_NO_PAD.decode(segments[0])?)?; + let claims: Claims = serde_json::from_slice(&URL_SAFE_NO_PAD.decode(segments[1])?)?; + if header.alg != "EdDSA" || header.typ != "JWT" { + bail!("unsupported assertion algorithm"); + } + if claims.iss != self.issuer + || claims.aud != AUDIENCE + || claims.instance_id != self.instance_id + { + bail!("assertion scope mismatch"); + } + if claims.user_id.is_empty() + || claims.user_id.len() > 128 + || claims.jti.is_empty() + || claims.jti.len() > 128 + { + bail!("invalid assertion identity"); + } + if claims.method != method.as_str() || claims.path_sha256 != normalized_path_hash(uri)? { + bail!("assertion request binding mismatch"); + } + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64; + if claims.iat > now + 5 + || claims.exp < now - 5 + || claims.exp <= claims.iat + || claims.exp - claims.iat > 30 + { + bail!("assertion expired"); + } + let key = self + .keys + .get(&header.kid) + .context("unknown assertion key")?; + let signature = Signature::from_slice(&URL_SAFE_NO_PAD.decode(segments[2])?)?; + key.verify( + format!("{}.{}", segments[0], segments[1]).as_bytes(), + &signature, + ) + .context("invalid assertion signature")?; + let mut replay = self.replay.lock().await; + replay.retain(|_, expiry| *expiry + 5 >= now); + if replay.contains_key(&claims.jti) { + bail!("assertion replayed"); + } + if replay.len() >= 4096 + && let Some(oldest) = replay + .iter() + .min_by_key(|(_, expiry)| *expiry) + .map(|(jti, _)| jti.clone()) + { + replay.remove(&oldest); + } + replay.insert(claims.jti, claims.exp); + Ok(claims.user_id) + } +} + +pub fn normalized_path_hash(uri: &Uri) -> Result { + let parsed = Url::parse(&format!( + "http://opencodex.invalid{}", + uri.path_and_query() + .map(|value| value.as_str()) + .unwrap_or("/") + ))?; + let mut pairs: Vec<(String, String)> = parsed + .query_pairs() + .map(|(key, value)| (key.into_owned(), value.into_owned())) + .collect(); + pairs.sort_by(|left, right| left.0.cmp(&right.0)); + let mut canonical = parsed.path().to_string(); + if !pairs.is_empty() { + let query: String = url::form_urlencoded::Serializer::new(String::new()) + .extend_pairs(pairs) + .finish(); + canonical.push('?'); + canonical.push_str(&query); + } + Ok(format!("{:x}", Sha256::digest(canonical.as_bytes()))) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn canonical_query_order_is_stable() { + let first: Uri = "/api/config?z=2&a=hello+world".parse().unwrap(); + let second: Uri = "/api/config?a=hello%20world&z=2".parse().unwrap(); + assert_eq!( + normalized_path_hash(&first).unwrap(), + normalized_path_hash(&second).unwrap() + ); + } +} diff --git a/remote-agent/src/config.rs b/remote-agent/src/config.rs new file mode 100644 index 000000000..3eb68b654 --- /dev/null +++ b/remote-agent/src/config.rs @@ -0,0 +1,89 @@ +use std::{ + fs, + os::unix::fs::PermissionsExt, + path::{Path, PathBuf}, +}; + +use anyhow::{Context, Result}; +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use ed25519_dalek::SigningKey; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GatewayKey { + pub kid: String, + pub public_key_pem: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct GatewayConfig { + pub issuer: String, + pub keys: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AgentConfig { + pub control_plane_url: String, + pub agent_id: String, + pub instance_id: String, + pub signing_key: String, + pub tunnel_token_file: PathBuf, + pub gateway: GatewayConfig, + #[serde(default = "default_opencodex_url")] + pub opencodex_url: String, + #[serde(default = "default_ingress")] + pub ingress: String, +} + +fn default_opencodex_url() -> String { + "http://127.0.0.1:10100".into() +} +fn default_ingress() -> String { + "127.0.0.1:10101".into() +} + +impl AgentConfig { + pub fn load(path: &Path) -> Result { + let bytes = fs::read(path).with_context(|| format!("read {}", path.display()))?; + let config: Self = serde_json::from_slice(&bytes).context("parse agent config")?; + config.signing_key()?; + Ok(config) + } + + pub fn save(&self, path: &Path) -> Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + let temporary = path.with_extension("tmp"); + fs::write(&temporary, serde_json::to_vec_pretty(self)?)?; + fs::set_permissions(&temporary, fs::Permissions::from_mode(0o600))?; + fs::rename(&temporary, path)?; + fs::set_permissions(path, fs::Permissions::from_mode(0o600))?; + Ok(()) + } + + pub fn signing_key(&self) -> Result { + let bytes = URL_SAFE_NO_PAD + .decode(&self.signing_key) + .context("decode signing key")?; + let seed: [u8; 32] = bytes + .try_into() + .map_err(|_| anyhow::anyhow!("signing key must contain 32 bytes"))?; + Ok(SigningKey::from_bytes(&seed)) + } +} + +pub fn save_secret(path: &Path, value: &str) -> Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + let temporary = path.with_extension("tmp"); + fs::write(&temporary, format!("{value}\n"))?; + fs::set_permissions(&temporary, fs::Permissions::from_mode(0o600))?; + fs::rename(&temporary, path)?; + fs::set_permissions(path, fs::Permissions::from_mode(0o600))?; + Ok(()) +} diff --git a/remote-agent/src/control.rs b/remote-agent/src/control.rs new file mode 100644 index 000000000..965f20e1c --- /dev/null +++ b/remote-agent/src/control.rs @@ -0,0 +1,146 @@ +use std::time::Duration; + +use anyhow::{Context, Result}; +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use ed25519_dalek::{Signer, SigningKey}; +use rand::Rng; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use tokio_util::sync::CancellationToken; + +use crate::config::{AgentConfig, GatewayConfig}; + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct PairRequest<'a> { + code: &'a str, + public_key: String, + version: &'a str, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PairResponse { + pub agent_id: String, + pub instance_id: String, + pub tunnel_token: String, + pub gateway: GatewayConfig, +} + +#[derive(Deserialize)] +struct ChallengeResponse { + challenge: String, +} + +#[derive(Deserialize)] +struct TokenResponse { + token: String, +} + +pub fn public_key_der(signing_key: &SigningKey) -> Vec { + const ED25519_SPKI_PREFIX: [u8; 12] = [ + 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00, + ]; + [ + ED25519_SPKI_PREFIX.as_slice(), + signing_key.verifying_key().as_bytes(), + ] + .concat() +} + +pub async fn pair( + control_plane_url: &str, + code: &str, + signing_key: &SigningKey, +) -> Result { + let response = Client::new() + .post(format!( + "{}/agent/pair", + control_plane_url.trim_end_matches('/') + )) + .json(&PairRequest { + code, + public_key: URL_SAFE_NO_PAD.encode(public_key_der(signing_key)), + version: env!("CARGO_PKG_VERSION"), + }) + .send() + .await + .context("pairing request failed")?; + if !response.status().is_success() { + anyhow::bail!( + "pairing rejected: {}", + response.text().await.unwrap_or_default() + ); + } + response.json().await.context("parse pairing response") +} + +async fn agent_token(client: &Client, config: &AgentConfig, key: &SigningKey) -> Result { + let client_nonce = URL_SAFE_NO_PAD.encode(rand::random::<[u8; 24]>()); + let challenge: ChallengeResponse = client + .post(format!( + "{}/agent/challenge", + config.control_plane_url.trim_end_matches('/') + )) + .json(&serde_json::json!({ "agentId": config.agent_id, "clientNonce": client_nonce })) + .send() + .await? + .error_for_status()? + .json() + .await?; + let signature = key.sign(challenge.challenge.as_bytes()); + let token: TokenResponse = client + .post(format!( + "{}/agent/token", + config.control_plane_url.trim_end_matches('/') + )) + .json(&serde_json::json!({ + "agentId": config.agent_id, + "challenge": challenge.challenge, + "signature": URL_SAFE_NO_PAD.encode(signature.to_bytes()), + })) + .send() + .await? + .error_for_status()? + .json() + .await?; + Ok(token.token) +} + +pub async fn heartbeat_loop(config: AgentConfig, shutdown: CancellationToken) -> Result<()> { + let client = Client::builder().timeout(Duration::from_secs(15)).build()?; + let key = config.signing_key()?; + loop { + if shutdown.is_cancelled() { + return Ok(()); + } + let healthy = client + .get(format!( + "{}/healthz", + config.opencodex_url.trim_end_matches('/') + )) + .timeout(Duration::from_secs(5)) + .send() + .await + .map(|response| response.status().is_success()) + .unwrap_or(false); + match agent_token(&client, &config, &key).await { + Ok(token) => { + let result = client + .post(format!("{}/agent/heartbeat", config.control_plane_url.trim_end_matches('/'))) + .bearer_auth(token) + .json(&serde_json::json!({ "opencodexHealthy": healthy, "version": env!("CARGO_PKG_VERSION") })) + .send().await; + if let Err(error) = result { + tracing::warn!(%error, "heartbeat failed"); + } + } + Err(error) => tracing::warn!(%error, "agent authentication failed"), + } + let jitter = rand::rng().random_range(-5_i64..=5); + tokio::select! { + _ = shutdown.cancelled() => return Ok(()), + _ = tokio::time::sleep(Duration::from_secs((30 + jitter) as u64)) => {} + } + } +} diff --git a/remote-agent/src/main.rs b/remote-agent/src/main.rs new file mode 100644 index 000000000..fae1ab864 --- /dev/null +++ b/remote-agent/src/main.rs @@ -0,0 +1,126 @@ +mod assertion; +mod config; +mod control; +mod proxy; +mod supervisor; + +use std::path::PathBuf; + +use anyhow::{Context, Result}; +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use clap::{Parser, Subcommand}; +use ed25519_dalek::SigningKey; +use tokio_util::sync::CancellationToken; +use tracing_subscriber::EnvFilter; + +use config::{AgentConfig, save_secret}; + +#[derive(Parser)] +#[command( + name = "opencodex-remote-agent", + version, + about = "Private OpenCodex Remote tunnel agent" +)] +struct Cli { + #[command(subcommand)] + command: Command, +} + +#[derive(Subcommand)] +enum Command { + Pair { + #[arg(long)] + control_plane: String, + #[arg(long)] + code: String, + #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] + config: PathBuf, + #[arg(long, default_value = "/var/lib/opencodex-remote/tunnel-token")] + tunnel_token_file: PathBuf, + }, + Run { + #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] + config: PathBuf, + }, + PrintOpencodexConfig { + #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] + config: PathBuf, + }, +} + +fn initialize_logs() { + tracing_subscriber::fmt() + .with_env_filter( + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")), + ) + .without_time() + .with_target(false) + .init(); +} + +#[tokio::main] +async fn main() -> Result<()> { + initialize_logs(); + match Cli::parse().command { + Command::Pair { + control_plane, + code, + config, + tunnel_token_file, + } => { + let key = SigningKey::from_bytes(&rand::random::<[u8; 32]>()); + let paired = control::pair(&control_plane, &code.trim().to_uppercase(), &key).await?; + save_secret(&tunnel_token_file, &paired.tunnel_token)?; + AgentConfig { + control_plane_url: control_plane, + agent_id: paired.agent_id, + instance_id: paired.instance_id, + signing_key: URL_SAFE_NO_PAD.encode(key.to_bytes()), + tunnel_token_file, + gateway: paired.gateway, + opencodex_url: "http://127.0.0.1:10100".into(), + ingress: "127.0.0.1:10101".into(), + } + .save(&config)?; + println!( + "Paired successfully. Run `opencodex-remote-agent print-opencodex-config` and merge the displayed remoteAccess block into OpenCodex config." + ); + } + Command::PrintOpencodexConfig { config } => { + let config = AgentConfig::load(&config)?; + println!( + "{}", + serde_json::to_string_pretty(&serde_json::json!({ + "remoteAccess": { + "enabled": true, + "instanceId": config.instance_id, + "issuer": config.gateway.issuer, + "publicKeys": config.gateway.keys, + } + }))? + ); + } + Command::Run { config } => { + let config = AgentConfig::load(&config)?; + let shutdown = CancellationToken::new(); + let signal = shutdown.clone(); + tokio::spawn(async move { + let _ = tokio::signal::ctrl_c().await; + signal.cancel(); + }); + let proxy = tokio::spawn(proxy::serve(config.clone(), shutdown.clone())); + let heartbeat = tokio::spawn(control::heartbeat_loop(config.clone(), shutdown.clone())); + let tunnel = tokio::spawn(supervisor::supervise_cloudflared( + config.tunnel_token_file.clone(), + shutdown.clone(), + )); + tokio::select! { + result = proxy => result.context("proxy task failed")??, + result = heartbeat => result.context("heartbeat task failed")??, + result = tunnel => result.context("cloudflared supervisor failed")??, + } + shutdown.cancel(); + } + } + Ok(()) +} diff --git a/remote-agent/src/proxy.rs b/remote-agent/src/proxy.rs new file mode 100644 index 000000000..90e1e8d39 --- /dev/null +++ b/remote-agent/src/proxy.rs @@ -0,0 +1,225 @@ +use anyhow::Result; +use axum::{ + Router, + body::Body, + extract::{ + FromRequestParts, State, WebSocketUpgrade, + ws::{Message, WebSocket}, + }, + http::{HeaderMap, HeaderName, HeaderValue, Request, Response, StatusCode, Uri}, + response::IntoResponse, + routing::any, +}; +use futures_util::{SinkExt, StreamExt}; +use reqwest::Client; +use tokio::net::TcpListener; +use tokio_tungstenite::{connect_async, tungstenite::client::IntoClientRequest}; +use tokio_util::sync::CancellationToken; + +use crate::{ + assertion::{ASSERTION_HEADER, AssertionVerifier}, + config::AgentConfig, +}; + +const REQUEST_DENY: &[&str] = &[ + "connection", + "cookie", + "host", + "proxy-authenticate", + "proxy-authorization", + "x-forwarded-for", + "x-forwarded-host", + "x-forwarded-proto", + "x-real-ip", + "x-opencodex-api-key", + "x-opencodex-remote-token", + "x-ocxr-target-path", +]; +const RESPONSE_DENY: &[&str] = &[ + "connection", + "set-cookie", + "set-cookie2", + "proxy-authenticate", + "proxy-authorization", +]; + +#[derive(Clone)] +struct AppState { + verifier: AssertionVerifier, + client: Client, + opencodex_url: String, +} + +fn denied(name: &HeaderName, response: bool) -> bool { + let lower = name.as_str(); + lower.starts_with("cf-") + || lower.starts_with("x-ocxr-") + || (response && RESPONSE_DENY.contains(&lower)) + || (!response && (REQUEST_DENY.contains(&lower) || lower == ASSERTION_HEADER)) +} + +fn target_uri(base: &str, uri: &Uri) -> Result { + Ok(format!( + "{}{}", + base.trim_end_matches('/'), + uri.path_and_query() + .map(|value| value.as_str()) + .unwrap_or("/") + )) +} + +fn sanitized_request_headers(input: &HeaderMap) -> HeaderMap { + let mut output = HeaderMap::new(); + for (name, value) in input { + if denied(name, false) { + continue; + } + if name == axum::http::header::AUTHORIZATION + && value + .to_str() + .ok() + .and_then(|value| value.strip_prefix("Bearer ")) + .is_some_and(|token| token.starts_with("ocxr_")) + { + continue; + } + output.append(name, value.clone()); + } + output.insert( + axum::http::header::HOST, + HeaderValue::from_static("127.0.0.1:10100"), + ); + output.insert( + axum::http::header::ORIGIN, + HeaderValue::from_static("http://127.0.0.1:10100"), + ); + output +} + +async fn proxy(State(state): State, req: Request) -> impl IntoResponse { + if let Err(error) = state + .verifier + .verify(req.method(), req.uri(), req.headers()) + .await + { + tracing::warn!(reason=%error, "request assertion rejected"); + return StatusCode::NOT_FOUND.into_response(); + } + let (mut parts, body) = req.into_parts(); + if parts.headers.get(axum::http::header::UPGRADE).is_some() { + return match WebSocketUpgrade::from_request_parts(&mut parts, &state).await { + Ok(upgrade) => upgrade + .on_upgrade(move |socket| relay_websocket(socket, state, parts.uri, parts.headers)) + .into_response(), + Err(_) => StatusCode::BAD_REQUEST.into_response(), + }; + } + let target = match target_uri(&state.opencodex_url, &parts.uri) { + Ok(target) => target, + Err(_) => return StatusCode::BAD_REQUEST.into_response(), + }; + let headers = sanitized_request_headers(&parts.headers); + let request = state + .client + .request(parts.method, target) + .headers(headers) + .body(reqwest::Body::wrap_stream(body.into_data_stream())); + let upstream = match request.send().await { + Ok(response) => response, + Err(error) => { + tracing::warn!(%error, "OpenCodex upstream request failed"); + return StatusCode::BAD_GATEWAY.into_response(); + } + }; + let mut response = Response::builder().status(upstream.status()); + for (name, value) in upstream.headers() { + if !denied(name, true) { + response = response.header(name, value); + } + } + match response.body(Body::from_stream(upstream.bytes_stream())) { + Ok(response) => response.into_response(), + Err(_) => StatusCode::BAD_GATEWAY.into_response(), + } +} + +async fn relay_websocket( + client: WebSocket, + state: AppState, + uri: Uri, + incoming_headers: HeaderMap, +) { + let target = match target_uri(&state.opencodex_url, &uri) { + Ok(target) => target + .replacen("http://", "ws://", 1) + .replacen("https://", "wss://", 1), + Err(_) => return, + }; + let mut request = match target.into_client_request() { + Ok(request) => request, + Err(_) => return, + }; + for (name, value) in sanitized_request_headers(&incoming_headers) { + if let Some(name) = name { + request.headers_mut().append(name, value); + } + } + let (upstream, _) = match connect_async(request).await { + Ok(value) => value, + Err(error) => { + tracing::warn!(%error, "OpenCodex websocket connect failed"); + return; + } + }; + let (mut client_tx, mut client_rx) = client.split(); + let (mut upstream_tx, mut upstream_rx) = upstream.split(); + let to_upstream = async { + while let Some(Ok(message)) = client_rx.next().await { + let converted = match message { + Message::Text(value) => { + tokio_tungstenite::tungstenite::Message::Text(value.to_string().into()) + } + Message::Binary(value) => tokio_tungstenite::tungstenite::Message::Binary(value), + Message::Ping(value) => tokio_tungstenite::tungstenite::Message::Ping(value), + Message::Pong(value) => tokio_tungstenite::tungstenite::Message::Pong(value), + Message::Close(_) => tokio_tungstenite::tungstenite::Message::Close(None), + }; + if upstream_tx.send(converted).await.is_err() { + break; + } + } + }; + let to_client = async { + while let Some(Ok(message)) = upstream_rx.next().await { + let converted = match message { + tokio_tungstenite::tungstenite::Message::Text(value) => { + Message::Text(value.to_string().into()) + } + tokio_tungstenite::tungstenite::Message::Binary(value) => Message::Binary(value), + tokio_tungstenite::tungstenite::Message::Ping(value) => Message::Ping(value), + tokio_tungstenite::tungstenite::Message::Pong(value) => Message::Pong(value), + tokio_tungstenite::tungstenite::Message::Close(_) => Message::Close(None), + tokio_tungstenite::tungstenite::Message::Frame(_) => continue, + }; + if client_tx.send(converted).await.is_err() { + break; + } + } + }; + tokio::select! { _ = to_upstream => {}, _ = to_client => {} } +} + +pub async fn serve(config: AgentConfig, shutdown: CancellationToken) -> Result<()> { + let state = AppState { + verifier: AssertionVerifier::new(&config)?, + client: Client::builder().build()?, + opencodex_url: config.opencodex_url.clone(), + }; + let app = Router::new().fallback(any(proxy)).with_state(state); + let listener = TcpListener::bind(&config.ingress).await?; + tracing::info!(bind=%config.ingress, "local ingress ready"); + axum::serve(listener, app) + .with_graceful_shutdown(shutdown.cancelled_owned()) + .await?; + Ok(()) +} diff --git a/remote-agent/src/supervisor.rs b/remote-agent/src/supervisor.rs new file mode 100644 index 000000000..77ca91919 --- /dev/null +++ b/remote-agent/src/supervisor.rs @@ -0,0 +1,33 @@ +use std::{path::PathBuf, time::Duration}; + +use anyhow::{Context, Result}; +use tokio::process::Command; +use tokio_util::sync::CancellationToken; + +pub async fn supervise_cloudflared(token_file: PathBuf, shutdown: CancellationToken) -> Result<()> { + let mut failures = 0_u32; + loop { + let mut child = Command::new("cloudflared") + .args(["tunnel", "--no-autoupdate", "run", "--token-file"]) + .arg(&token_file) + .kill_on_drop(true) + .spawn() + .context("start cloudflared")?; + tokio::select! { + result = child.wait() => { + tracing::warn!(status=?result?, "cloudflared exited; restarting"); + } + _ = shutdown.cancelled() => { + let _ = child.start_kill(); + let _ = child.wait().await; + return Ok(()); + } + } + failures = failures.saturating_add(1); + let delay = Duration::from_secs(2_u64.saturating_pow(failures.min(5))); + tokio::select! { + _ = shutdown.cancelled() => return Ok(()), + _ = tokio::time::sleep(delay) => {} + } + } +} diff --git a/src/config.ts b/src/config.ts index 9127897c1..2146782b4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -696,6 +696,15 @@ const configSchema = z.object({ // parse: a hand-edited typo must never trip the backup-and-defaults repair // path below and wipe providers/pool accounts. Warning emitted in loadConfig. streamMode: z.enum(["auto", "legacy-tee", "eager-relay"]).optional().catch(undefined), + remoteAccess: z.object({ + enabled: z.boolean().optional(), + instanceId: z.string().regex(/^[A-Za-z0-9._:-]{1,128}$/), + issuer: z.string().regex(/^[A-Za-z0-9._:-]{1,128}$/), + publicKeys: z.array(z.object({ + kid: z.string().regex(/^[A-Za-z0-9._:-]{1,64}$/), + publicKeyPem: z.string().min(64).max(8192), + })).min(1).max(3), + }).optional(), }).passthrough().superRefine((config, ctx) => { const claudeCode = (config as { claudeCode?: unknown }).claudeCode; if (claudeCode !== undefined && (!claudeCode || typeof claudeCode !== "object" || Array.isArray(claudeCode))) { diff --git a/src/server/management-auth.ts b/src/server/management-auth.ts index 52fd46401..565eadb39 100644 --- a/src/server/management-auth.ts +++ b/src/server/management-auth.ts @@ -23,6 +23,7 @@ import { managementRequestOrigin, parseHttpHost, } from "./auth-cors"; +import { verifyRemoteManagementAssertion } from "./remote-assertion"; const GUI_SESSION_TTL_MS = 5 * 60_000; const GUI_SESSION_LIMIT = 128; @@ -192,6 +193,7 @@ export function requireManagementAuth( if (!state.available) { return Response.json({ error: "management API unavailable" }, { status: 503 }); } + if (config && verifyRemoteManagementAssertion(req, config)) return null; const actual = req.headers.get("x-opencodex-api-key")?.trim() || req.headers.get("authorization")?.replace(/^Bearer\s+/i, "").trim(); if (actual && equalSecret(actual, state.token)) return null; diff --git a/src/server/remote-assertion.ts b/src/server/remote-assertion.ts new file mode 100644 index 000000000..abbcf2a92 --- /dev/null +++ b/src/server/remote-assertion.ts @@ -0,0 +1,131 @@ +import { createHash, createPublicKey, verify } from "node:crypto"; +import type { OcxConfig } from "../types"; + +export const REMOTE_ASSERTION_HEADER = "x-opencodex-remote-assertion"; +export const REMOTE_ASSERTION_AUDIENCE = "opencodex-management"; + +const MAX_ASSERTION_BYTES = 8 * 1024; +const MAX_ASSERTION_LIFETIME_SECONDS = 30; +const CLOCK_SKEW_SECONDS = 5; +const REPLAY_LIMIT = 4096; + +interface RemoteAssertionHeader { + alg: "EdDSA"; + typ: "JWT"; + kid: string; +} + +interface RemoteAssertionClaims { + iss: string; + aud: string; + instance_id: string; + user_id: string; + method: string; + path_sha256: string; + iat: number; + exp: number; + jti: string; +} + +const seenAssertions = new Map(); + +function decodeJsonSegment(segment: string): T | null { + try { + const value = JSON.parse(Buffer.from(segment, "base64url").toString("utf8")); + return value && typeof value === "object" && !Array.isArray(value) ? value as T : null; + } catch { + return null; + } +} + +/** + * Canonicalize only the path/query that the gateway and local proxy are + * permitted to preserve. Sorting URLSearchParams makes equivalent query order + * produce one digest while URL parsing normalizes percent encoding. + */ +export function remoteAssertionPathHash(input: string | URL): string { + const url = input instanceof URL ? new URL(input) : new URL(input, "http://opencodex.invalid"); + url.searchParams.sort(); + const canonical = `${url.pathname}${url.search}`; + return createHash("sha256").update(canonical).digest("hex"); +} + +function isSafeIdentifier(value: unknown, maxLength = 128): value is string { + return typeof value === "string" && value.length >= 1 && value.length <= maxLength + && /^[A-Za-z0-9._:-]+$/.test(value); +} + +function isRemoteAssertionShape( + header: RemoteAssertionHeader | null, + claims: RemoteAssertionClaims | null, +): header is RemoteAssertionHeader { + return !!header && !!claims + && header.alg === "EdDSA" + && header.typ === "JWT" + && isSafeIdentifier(header.kid, 64) + && isSafeIdentifier(claims.iss) + && claims.aud === REMOTE_ASSERTION_AUDIENCE + && isSafeIdentifier(claims.instance_id) + && isSafeIdentifier(claims.user_id) + && typeof claims.method === "string" + && /^[A-Z]+$/.test(claims.method) + && typeof claims.path_sha256 === "string" + && /^[a-f0-9]{64}$/.test(claims.path_sha256) + && Number.isInteger(claims.iat) + && Number.isInteger(claims.exp) + && isSafeIdentifier(claims.jti, 128); +} + +function consumeJti(jti: string, exp: number, nowSeconds: number): boolean { + for (const [seenJti, seenExp] of seenAssertions) { + if (seenExp + CLOCK_SKEW_SECONDS < nowSeconds) seenAssertions.delete(seenJti); + } + if (seenAssertions.has(jti)) return false; + while (seenAssertions.size >= REPLAY_LIMIT) { + const oldest = seenAssertions.keys().next().value as string | undefined; + if (!oldest) break; + seenAssertions.delete(oldest); + } + seenAssertions.set(jti, exp); + return true; +} + +export function verifyRemoteManagementAssertion( + req: Request, + config: OcxConfig, + now = Date.now(), +): boolean { + const remote = config.remoteAccess; + if (!remote?.enabled) return false; + const token = req.headers.get(REMOTE_ASSERTION_HEADER)?.trim(); + if (!token || token.length > MAX_ASSERTION_BYTES) return false; + const segments = token.split("."); + if (segments.length !== 3 || segments.some(segment => !segment)) return false; + + const header = decodeJsonSegment(segments[0]); + const claims = decodeJsonSegment(segments[1]); + if (!isRemoteAssertionShape(header, claims) || !claims) return false; + if (claims.iss !== remote.issuer || claims.instance_id !== remote.instanceId) return false; + if (claims.method !== req.method.toUpperCase()) return false; + if (claims.path_sha256 !== remoteAssertionPathHash(req.url)) return false; + + const nowSeconds = Math.floor(now / 1000); + if (claims.iat > nowSeconds + CLOCK_SKEW_SECONDS || claims.exp < nowSeconds - CLOCK_SKEW_SECONDS) return false; + if (claims.exp <= claims.iat || claims.exp - claims.iat > MAX_ASSERTION_LIFETIME_SECONDS) return false; + + const configuredKey = remote.publicKeys.find(key => key.kid === header.kid); + if (!configuredKey) return false; + try { + const signingInput = Buffer.from(`${segments[0]}.${segments[1]}`, "ascii"); + const signature = Buffer.from(segments[2], "base64url"); + const valid = verify(null, signingInput, createPublicKey(configuredKey.publicKeyPem), signature); + return valid && consumeJti(claims.jti, claims.exp, nowSeconds); + } catch { + return false; + } +} + +/** Test-only reset; exported explicitly to keep replay tests deterministic. */ +export function resetRemoteAssertionReplayCacheForTest(): void { + seenAssertions.clear(); +} diff --git a/src/types.ts b/src/types.ts index 983b483dd..327b2e2fe 100644 --- a/src/types.ts +++ b/src/types.ts @@ -723,6 +723,19 @@ export interface OcxConfig { tokenGuardian?: OcxTokenGuardianConfig; /** Additional origins allowed for CORS (e.g. ["https://clisu-oracle.tail19a2d7.ts.net"]). Loopback origins are always allowed. */ corsAllowOrigins?: string[]; + /** + * Optional OpenCodex Remote management credential verifier. + * + * The local Rust agent validates the gateway assertion before proxying any + * request. Management routes verify it again here so a compromised or + * accidentally exposed local ingress cannot silently widen `/api/*` access. + */ + remoteAccess?: { + enabled?: boolean; + instanceId: string; + issuer: string; + publicKeys: Array<{ kid: string; publicKeyPem: string }>; + }; } export type OcxAccountPoolRotationStrategy = "quota" | "round-robin" | "fill-first"; diff --git a/structure/12_remote-platform.md b/structure/12_remote-platform.md new file mode 100644 index 000000000..c99d3e6cb --- /dev/null +++ b/structure/12_remote-platform.md @@ -0,0 +1,52 @@ +# OpenCodex Remote platform boundary + +OpenCodex Remote는 기존 npm 패키지에 포함되지 않는 별도 중앙 플랫폼과 Linux Agent다. + +## Repository boundary + +- `platform/server/` — Bun/Hono Control Plane, Auth Gateway, PostgreSQL worker. +- `platform/web/` — React/Vite private dashboard. +- `platform/server/migrations/` — Better Auth와 platform schema. +- `remote-agent/` — Rust local ingress, pairing, heartbeat, cloudflared supervisor. +- `src/server/remote-assertion.ts` — 기존 OpenCodex `/api/*`의 defense-in-depth verifier. + +루트 `package.json#files`에는 `platform/`과 `remote-agent/`를 추가하지 않는다. npm으로 설치되는 일반 OpenCodex 사용자는 중앙 서비스나 Agent source를 패키지 payload로 받지 않는다. + +## Trust boundaries + +1. Browser/CLI는 비신뢰 입력이다. +2. Gateway는 DB ownership과 instance 상태의 authority다. +3. Cloudflare private hostname은 DB가 만든 값만 사용한다. 사용자 slug로 내부 목적지를 계산하지 않는다. +4. Rust Agent는 Gateway assertion을 검증하고 모든 proxy/control header를 정규화한다. +5. OpenCodex management API는 Agent를 신뢰해 생략하지 않고 assertion을 다시 검증한다. +6. Control Plane만 Cloudflare account token을 보유한다. Agent는 자기 Tunnel token만 받는다. + +## Data flow + +```text +public instance hostname + → Gateway ownership/session/token check + → 30-second Ed25519 request assertion + → Mesh private hostname route + → per-instance cloudflared + → Agent assertion/replay/header validation + → loopback OpenCodex +``` + +SSE와 HTTP response body는 buffer를 만들지 않고 전달한다. WebSocket은 Gateway와 Agent 두 hop에서 양방향으로 relay한다. 각 hop은 downstream disconnect를 upstream close/abort로 전파해야 한다. + +## Credential classes + +- OpenCodex admin token: 기존 로컬 관리 자격증명. +- OpenCodex GUI session: 기존 exact-origin + CSRF session. +- Remote assertion: 중앙 Gateway가 발급하고 Agent와 OpenCodex가 검증하는 `/api/*` 관리 자격증명. +- `ocxr_` data token: instance-scoped `/v1/*` 입장 자격증명. OpenCodex origin에는 전달하지 않는다. +- Instance session: browser가 authorization code를 교환해 얻는 host-only cookie. 공식 세션은 origin에 전달하지 않는다. + +[Decision Log] +- 목적과 의도: 개인 서버의 OpenCodex 전체 GUI/API/stream을 포트 공개 없이 안전하게 원격 제공한다. +- 기존 구현 및 제약 조건: OpenCodex는 Bun-native loopback proxy이며 admin token과 GUI session 경계를 이미 가진다. +- 검토한 주요 대안: public per-user hostname Tunnel, Cloudflare Access, Workers VPC, 자체 reverse tunnel. +- 선택한 방식: 중앙 Gateway와 Cloudflare Mesh private hostname route, instance별 Tunnel, Rust local ingress. +- 다른 대안 대신 이 방식을 선택한 이유: 사용자 origin을 공개하지 않고 중앙 ownership 정책을 모든 요청에 강제하면서 OpenCodex 기존 stream/WS surface를 보존할 수 있다. +- 장점, 단점 및 영향: 중앙 인증과 즉시 정지가 가능하지만 Mesh Beta 적합성, 두 번의 proxy hop, 운영 복잡도가 생긴다. Phase 0 실패 시 구현을 중단한다. diff --git a/structure/adr/0012-remote-private-mesh.md b/structure/adr/0012-remote-private-mesh.md new file mode 100644 index 000000000..8ce3a6834 --- /dev/null +++ b/structure/adr/0012-remote-private-mesh.md @@ -0,0 +1,30 @@ +# ADR 0012: Remote access through a central Gateway and private Mesh routes + +- Status: proposed, blocked on Phase 0 +- Date: 2026-07-29 + +## Context + +OpenCodex Remote must expose a user's loopback OpenCodex GUI, management API, data API, SSE, and WebSocket without publishing the user's Tunnel hostname. User-controlled origins and Agents are untrusted. The public hostname must not reveal whether another user's instance exists. + +## Decision + +All instance wildcard DNS enters a central VPS Gateway. The Gateway resolves hostname ownership and lifecycle state from PostgreSQL, authenticates an instance session or `ocxr_` token, signs a 30-second Ed25519 assertion, and routes only to a random private hostname through a Linux Cloudflare Mesh node. Each user server runs one Cloudflare Tunnel into a Rust local ingress. The Agent and OpenCodex management API verify the assertion independently. + +Cloudflare Access Applications are not used. No public hostname is attached to a user Tunnel. Mesh failure does not authorize a weaker automatic fallback. + +## Consequences + +- Positive: one policy enforcement point, hidden instance existence, immediate DB-first suspension, no inbound user-server port. +- Positive: browser, `/api/*`, `/v1/*`, SSE, and WebSocket retain one public instance origin. +- Negative: Mesh/private hostname routing is Beta and must pass Phase 0 before MVP approval. +- Negative: Gateway and Agent must implement careful streaming, cancellation, replay, and header normalization. +- Negative: operating the service requires PostgreSQL, three Bun services, central ingress, Mesh, and instance Tunnel lifecycle reconciliation. + +[Decision Log] +- 목적과 의도: 사용자 Tunnel을 공개하지 않고 중앙 인증 정책을 강제한다. +- 기존 구현 및 제약 조건: OpenCodex GUI와 API는 동일 origin과 장시간 stream/WS를 사용한다. +- 검토한 주요 대안: 공개 Tunnel hostname, Cloudflare Access, Workers VPC, 자체 reverse tunnel. +- 선택한 방식: central Gateway + Cloudflare Mesh private hostname + per-instance Tunnel. +- 다른 대안 대신 이 방식을 선택한 이유: 확정된 private-only 경계와 전체 protocol surface를 동시에 만족하는 후보이기 때문이다. +- 장점, 단점 및 영향: 격리와 정지는 강해지지만 Beta dependency가 생긴다. PoC 불통과 시 ADR을 accepted로 바꾸지 않는다. diff --git a/tests/server-management-auth.test.ts b/tests/server-management-auth.test.ts index 1484eb2eb..38e303634 100644 --- a/tests/server-management-auth.test.ts +++ b/tests/server-management-auth.test.ts @@ -2,6 +2,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; +import { generateKeyPairSync, randomUUID, sign } from "node:crypto"; import { saveConfig } from "../src/config"; import { startServer } from "../src/server"; import type { OcxConfig } from "../src/types"; @@ -12,6 +13,11 @@ import { issueGuiSession, requireManagementAuth, } from "../src/server/management-auth"; +import { + REMOTE_ASSERTION_AUDIENCE, + remoteAssertionPathHash, + resetRemoteAssertionReplayCacheForTest, +} from "../src/server/remote-assertion"; import { resetHardenedStateForTests, setIcaclsRunnerForTests, @@ -62,12 +68,95 @@ function websocketHandshakeOpens(url: URL, token: string): Promise { } beforeEach(() => { + resetRemoteAssertionReplayCacheForTest(); testHome = mkdtempSync(join(tmpdir(), "ocx-management-auth-")); process.env.OPENCODEX_HOME = testHome; process.env.OPENCODEX_API_AUTH_TOKEN = "data-secret"; process.env.OPENCODEX_ADMIN_AUTH_TOKEN = "admin-secret"; }); +function remoteAssertionRequest(options: { + url?: string; + method?: string; + instanceId?: string; + issuer?: string; + expiresIn?: number; + issuedOffset?: number; + jti?: string; +} = {}): { request: Request; config: OcxConfig; assertion: string } { + const { publicKey, privateKey } = generateKeyPairSync("ed25519"); + const url = options.url ?? "http://127.0.0.1:10100/api/config?view=remote&z=2&a=1"; + const method = options.method ?? "GET"; + const now = Math.floor(Date.now() / 1000); + const iat = now + (options.issuedOffset ?? 0); + const header = Buffer.from(JSON.stringify({ alg: "EdDSA", typ: "JWT", kid: "gateway-1" })).toString("base64url"); + const payload = Buffer.from(JSON.stringify({ + iss: options.issuer ?? "opencodex-remote", + aud: REMOTE_ASSERTION_AUDIENCE, + instance_id: options.instanceId ?? "instance-1", + user_id: "user-1", + method, + path_sha256: remoteAssertionPathHash(url), + iat, + exp: iat + (options.expiresIn ?? 30), + jti: options.jti ?? randomUUID(), + })).toString("base64url"); + const signingInput = `${header}.${payload}`; + const assertion = `${signingInput}.${sign(null, Buffer.from(signingInput), privateKey).toString("base64url")}`; + const config: OcxConfig = { + ...remoteConfig(), + remoteAccess: { + enabled: true, + instanceId: "instance-1", + issuer: "opencodex-remote", + publicKeys: [{ + kid: "gateway-1", + publicKeyPem: publicKey.export({ type: "spki", format: "pem" }).toString(), + }], + }, + }; + return { + request: new Request(url, { method, headers: { "X-OpenCodex-Remote-Assertion": assertion } }), + config, + assertion, + }; +} + +describe("remote management assertions", () => { + test("accepts a valid Ed25519 assertion and rejects replay", () => { + const { request, config } = remoteAssertionRequest(); + const state = initializeManagementAuthState(config); + expect(requireManagementAuth(request, state, config)).toBeNull(); + expect(requireManagementAuth(request, state, config)?.status).toBe(401); + }); + + test("binds the assertion to instance, method, and normalized path", () => { + const valid = remoteAssertionRequest(); + const state = initializeManagementAuthState(valid.config); + const wrongMethod = new Request(valid.request.url, { + method: "POST", + headers: valid.request.headers, + }); + expect(requireManagementAuth(wrongMethod, state, valid.config)?.status).toBe(401); + + const wrongPath = new Request("http://127.0.0.1:10100/api/config?view=other", { + headers: valid.request.headers, + }); + expect(requireManagementAuth(wrongPath, state, valid.config)?.status).toBe(401); + + const wrongInstance = { ...valid.config, remoteAccess: { ...valid.config.remoteAccess!, instanceId: "instance-2" } }; + expect(requireManagementAuth(valid.request, state, wrongInstance)?.status).toBe(401); + }); + + test("rejects expired and overlong assertions", () => { + for (const options of [{ issuedOffset: -60, expiresIn: 30 }, { expiresIn: 31 }]) { + const { request, config } = remoteAssertionRequest(options); + const state = initializeManagementAuthState(config); + expect(requireManagementAuth(request, state, config)?.status).toBe(401); + } + }); +}); + afterEach(() => { setIcaclsRunnerForTests(null); setPlatformForTests(null); From 6bde1f6b6fd7aef87680c194ea3445d8bf28bcdf Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Wed, 29 Jul 2026 15:24:24 +0000 Subject: [PATCH 2/7] Harden remote streaming lifecycle --- platform/docs/IMPLEMENTATION_STATUS.md | 57 +- platform/server/src/app.ts | 4 + platform/server/src/gateway.ts | 83 ++- .../server/tests/postgres-integration.test.ts | 517 ++++++++++++++++++ remote-agent/src/proxy.rs | 28 + structure/12_remote-platform.md | 12 + 6 files changed, 679 insertions(+), 22 deletions(-) create mode 100644 platform/server/tests/postgres-integration.test.ts diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index 34e0d1a59..1f11038c0 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -6,7 +6,7 @@ 기준 브랜치/커밋: `dev` / `cfc50fbb` -이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. 현재 코드는 로컬 typecheck와 집중 테스트가 가능한 구현 초안이며, 실제 PostgreSQL·Cloudflare 계정·VPS를 사용한 Phase 0 및 운영 E2E는 아직 완료되지 않았다. +이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증은 완료됐다. 실제 Cloudflare 계정·VPS·Rust Agent를 모두 연결한 Phase 0 및 운영 E2E는 아직 완료되지 않았다. ## 문서와 디자인 자산 @@ -68,6 +68,7 @@ - 사용자 Cookie, `Set-Cookie`, proxy/auth control header, Cloudflare 내부 header 제거. - Fetch body/response streaming, request abort propagation, WebSocket relay 코드 추가. - PostgreSQL `NOTIFY instance_state`를 통해 suspend/delete 시 진행 중 HTTP 연결 abort. +- response body가 끝나거나 취소될 때까지 HTTP 요청을 추적하고, suspend/delete 시 활성 WebSocket도 함께 종료하도록 lifecycle 보강. - Gateway synthetic `/healthz` 경로와 health observation 기록 추가. ### Rust Agent @@ -81,6 +82,7 @@ - streaming HTTP body와 WebSocket 양방향 relay 구현. - `cloudflared tunnel --no-autoupdate run --token-file` 자식 감독과 backoff 재시작 구현. - OpenCodex에 넣을 `remoteAccess` JSON 출력 명령 추가. +- WebSocket handshake key/version/upgrade header를 hop마다 새로 생성하도록 중복 전달 차단. ### Web UI @@ -91,12 +93,21 @@ - Activity, Security, 로그인, 초대 소비, loading/error/empty/mobile 상태 구현. - New instance, pairing code, open, token 발급, suspend, delete API 연결. - 개발 demo data mode: `VITE_REMOTE_DEMO=true`. +- production SPA fallback과 미등록 `/api/*`, `/agent/*` JSON 404 경계 검증. + +### PostgreSQL 17 로컬 통합 검증 + +- migration 17개 테이블 생성과 Better Auth users/sessions/accounts/verifications CRUD 확인. +- 실제 Control Plane·worker·Gateway 자식 프로세스와 fake Cloudflare provider 동시 실행. +- 두 사용자·두 인스턴스 provision, token/session/hostname 격리, Agent assertion scope 오류가 전부 `404`인지 확인. +- HTTP/SSE, WebSocket 양방향 relay, 100 MiB upload/download streaming 확인. +- Gateway 재시작 후 재연결과 suspend `NOTIFY`에 의한 진행 중 stream 취소 확인. +- 중첩 SPA 경로는 production HTML, 미등록 API 경로는 JSON `404`인지 확인. ## 구현 중인 부분 -- Better Auth가 실제 migration schema와 정확히 호환되는지 PostgreSQL 통합 검증. -- Control Plane에서 production web build를 제공하는 SPA fallback 검증. -- Gateway WebSocket header relay와 client disconnect의 실제 OpenCodex E2E. +- 실제 Rust Agent와 OpenCodex를 포함한 Gateway WebSocket/client disconnect E2E. +- 실제 Cloudflare Mesh에서 30분 stream, reconnect, Tunnel/Gateway 재시작 측정. - suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. - Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. - 네이티브 systemd 서비스와 `LoadCredential=` 배포 파일. @@ -106,12 +117,12 @@ ### P0 — 다음 컴퓨터에서 가장 먼저 -1. `platform` typecheck/build와 기존 집중 테스트를 다시 실행한다. -2. 로컬 PostgreSQL 17 DB에 migration을 적용하고 Better Auth schema 호환 문제를 수정한다. -3. Control Plane·worker·Gateway를 동시에 띄운 로컬 통합 테스트를 만든다. -4. Phase 0 Cloudflare Mesh 계정 테스트를 수행한다. -5. HTTP/SSE/WebSocket, 30분 stream, cancel/reconnect, 100 MiB body, Gateway/Tunnel 재시작을 측정한다. -6. 두 사용자·두 인스턴스 교차 hostname/session/assertion 접근이 전부 `404`인지 검증한다. +- [x] `platform` typecheck/build, root 전체 테스트, Rust fmt/clippy/test 재실행. +- [x] PostgreSQL 17 migration과 Better Auth schema/CRUD 호환 검증. +- [x] 실제 Control Plane·worker·Gateway를 동시에 띄우는 로컬 통합 테스트. +- [ ] 실제 Cloudflare Mesh 계정 Phase 0. 현재 작업 환경에는 Account ID/API token이 없다. +- [ ] 실제 Mesh/Rust Agent에서 30분 stream과 Tunnel 재시작 측정. 로컬 Gateway 기준 HTTP/SSE/WS, cancel/reconnect, 100 MiB body, Gateway 재시작은 통과했다. +- [x] 두 사용자·두 인스턴스 교차 hostname/token/session/assertion 접근 `404` 검증. ### P1 — 운영 기능 @@ -143,7 +154,7 @@ - Cloudflare adapter의 route create/delete 응답 shape는 live account로 검증하지 않았다. - Gateway synthetic token은 별도 systemd credential로 설계했지만 배포 파일은 아직 없다. - Better Auth의 OAuth account에는 GitHub access token이 저장될 수 있다. 운영 전 DB encryption/토큰 최소 보존 정책을 확정해야 한다. -- Gateway와 Agent 구현은 컴파일 수준이며 부하·backpressure·100 MiB·30분 stream 테스트 전이다. +- Gateway는 로컬 100 MiB 양방향 streaming과 취소를 통과했지만, Rust Agent를 포함한 부하·backpressure·30분 stream은 아직 측정하지 않았다. - 실제 DNS, TLS, 두 registrable domain, Cloudflare public ingress는 구성하지 않았다. ## 현재까지 확인된 검증 @@ -152,21 +163,25 @@ PASS bun run typecheck (root) PASS bun test tests/server-management-auth.test.ts 16 tests / 56 expects +PASS bun test --isolate tests + 5961 pass / 1 skip / 0 fail / 30318 expects +PASS bun run privacy:scan PASS cd platform && bun run typecheck PASS cd platform && VITE_REMOTE_DEMO=true bun run build:web +PASS cd platform && PLATFORM_TEST_DATABASE_URL=postgres://postgres@127.0.0.1:55432/postgres \ + bun test server/tests/postgres-integration.test.ts + 1 test / 56 expects, PostgreSQL 17.10 PASS cd remote-agent && cargo fmt --check PASS cd remote-agent && cargo check PASS cd remote-agent && cargo clippy --all-targets --all-features -- -D warnings PASS cd remote-agent && cargo test - 1 Rust unit test + 2 Rust unit tests ``` 아직 통과로 간주하면 안 되는 항목: -- root 전체 `bun run test`: 120초 제한까지 다수 테스트가 통과했지만 최종 summary 전에 timeout되어 전체 green으로 간주하지 않음 -- root `bun run privacy:scan` -- platform PostgreSQL/API integration test - 실제 Cloudflare Mesh Phase 0 +- 실제 Rust Agent/OpenCodex를 포함한 HTTP/SSE/WebSocket E2E와 30분 stream/Tunnel 재시작 - 시각 QA와 접근성 브라우저 QA - systemd/VPS/backup restore 검증 @@ -180,10 +195,20 @@ bun install --frozen-lockfile bun run typecheck bun test tests/server-management-auth.test.ts +cd gui +bun install --frozen-lockfile +cd .. +bun test --isolate tests + cd platform bun install --frozen-lockfile bun run typecheck -VITE_REMOTE_DEMO=true bun run dev:web +VITE_REMOTE_DEMO=true bun run build:web + +docker run --name ocx-remote-pg17 -e POSTGRES_HOST_AUTH_METHOD=trust \ + -p 127.0.0.1:55432:5432 -d postgres:17-alpine +PLATFORM_TEST_DATABASE_URL=postgres://postgres@127.0.0.1:55432/postgres \ + bun test server/tests/postgres-integration.test.ts cd ../remote-agent cargo fmt --check diff --git a/platform/server/src/app.ts b/platform/server/src/app.ts index 1e2dad229..0881cc94e 100644 --- a/platform/server/src/app.ts +++ b/platform/server/src/app.ts @@ -223,6 +223,10 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth } }); + // Keep missing machine endpoints JSON-shaped. The SPA fallback below is for + // browser routes only and must never turn an API typo into a successful HTML response. + app.all("/api/*", c => c.json({ error: "not found" }, 404)); + app.all("/agent/*", c => c.json({ error: "not found" }, 404)); app.get("*", serveStatic({ root: "./web/dist" })); app.get("*", serveStatic({ path: "./web/dist/index.html" })); app.notFound(c => c.json({ error: "not found" }, 404)); diff --git a/platform/server/src/gateway.ts b/platform/server/src/gateway.ts index 974223477..f52f22bf7 100644 --- a/platform/server/src/gateway.ts +++ b/platform/server/src/gateway.ts @@ -11,6 +11,7 @@ const store = new PlatformStore(database, config); const INSTANCE_COOKIE = "__Host-ocxr_instance"; const REQUEST_HEADER_DENY = new Set([ "connection", "cookie", "host", "proxy-authorization", "proxy-authenticate", + "upgrade", "x-forwarded-for", "x-forwarded-host", "x-forwarded-proto", "x-real-ip", "x-opencodex-api-key", GATEWAY_ASSERTION_HEADER, "x-ocxr-synthetic", "x-opencodex-remote-token", @@ -47,7 +48,12 @@ function sanitizeRequestHeaders(req: Request, target: URL, assertion: string): H const headers = new Headers(); for (const [name, value] of req.headers) { const lower = name.toLowerCase(); - if (REQUEST_HEADER_DENY.has(lower) || lower.startsWith("cf-") || lower.startsWith("x-ocxr-")) continue; + if ( + REQUEST_HEADER_DENY.has(lower) + || lower.startsWith("cf-") + || lower.startsWith("sec-websocket-") + || lower.startsWith("x-ocxr-") + ) continue; if (lower === "authorization" && value.replace(/^Bearer\s+/i, "").startsWith("ocxr_")) continue; headers.append(name, value); } @@ -79,6 +85,7 @@ function privateUrl(instance: InstanceRecord, requestUrl: URL): URL { } const activeRequests = new Map>(); +const activeSockets = new Map>>(); function track(instanceId: string, controller: AbortController): () => void { const set = activeRequests.get(instanceId) ?? new Set(); set.add(controller); @@ -89,6 +96,58 @@ function track(instanceId: string, controller: AbortController): () => void { }; } +function trackSocket(socket: Bun.ServerWebSocket): void { + const instanceId = socket.data.instance.id; + const sockets = activeSockets.get(instanceId) ?? new Set>(); + sockets.add(socket); + activeSockets.set(instanceId, sockets); +} + +function untrackSocket(socket: Bun.ServerWebSocket): void { + const instanceId = socket.data.instance.id; + const sockets = activeSockets.get(instanceId); + sockets?.delete(socket); + if (!sockets?.size) activeSockets.delete(instanceId); +} + +function streamWithLifecycle( + body: ReadableStream, + controller: AbortController, + cleanup: () => void, +): ReadableStream { + const reader = body.getReader(); + let settled = false; + const finish = () => { + if (settled) return; + settled = true; + cleanup(); + }; + return new ReadableStream({ + async pull(output) { + try { + const chunk = await reader.read(); + if (chunk.done) { + finish(); + output.close(); + } else { + output.enqueue(chunk.value); + } + } catch (error) { + finish(); + output.error(error); + } + }, + async cancel(reason) { + controller.abort(reason); + try { + await reader.cancel(reason); + } finally { + finish(); + } + }, + }); +} + async function listenForRevocations(): Promise { const client = await database.pool.connect(); client.on("notification", message => { @@ -96,6 +155,9 @@ async function listenForRevocations(): Promise { try { const { instanceId } = JSON.parse(message.payload) as { instanceId: string }; for (const controller of activeRequests.get(instanceId) ?? []) controller.abort("instance disabled"); + for (const socket of activeSockets.get(instanceId) ?? []) socket.close(1008, "instance disabled"); + activeRequests.delete(instanceId); + activeSockets.delete(instanceId); } catch { /* malformed NOTIFY payload is ignored */ } }); client.on("error", error => console.error("gateway PostgreSQL listener failed", error.message)); @@ -185,7 +247,12 @@ gatewayServer = Bun.serve({ const controller = new AbortController(); const untrack = track(auth.instance.id, controller); const abort = () => controller.abort(req.signal.reason); - req.signal.addEventListener("abort", abort, { once: true }); + const cleanup = () => { + req.signal.removeEventListener("abort", abort); + untrack(); + }; + if (req.signal.aborted) abort(); + else req.signal.addEventListener("abort", abort, { once: true }); try { const response = await fetch(target, { method: req.method, @@ -197,21 +264,24 @@ gatewayServer = Bun.serve({ duplex: req.body ? "half" : undefined, } as RequestInit); if (url.pathname === "/healthz") await store.recordHealth(auth.instance.id, "gateway", response.ok); - return new Response(response.body, { + const body = response.body + ? streamWithLifecycle(response.body, controller, cleanup) + : null; + if (!body) cleanup(); + return new Response(body, { status: response.status, statusText: response.statusText, headers: sanitizeResponseHeaders(response, host), }); } catch { + cleanup(); if (url.pathname === "/healthz") await store.recordHealth(auth.instance.id, "gateway", false); return new Response("Upstream unavailable", { status: 502 }); - } finally { - req.signal.removeEventListener("abort", abort); - untrack(); } }, websocket: { open(ws) { + trackSocket(ws); const upstream = new WebSocket(ws.data.url, { headers: Object.fromEntries(ws.data.headers) } as never); ws.data.upstream = upstream; upstream.binaryType = "arraybuffer"; @@ -230,6 +300,7 @@ gatewayServer = Bun.serve({ else ws.data.queued.push(typeof message === "string" ? message : Buffer.from(message)); }, close(ws, code, reason) { + untrackSocket(ws); if (ws.data.upstream && ws.data.upstream.readyState < WebSocket.CLOSING) ws.data.upstream.close(code, reason); }, }, diff --git a/platform/server/tests/postgres-integration.test.ts b/platform/server/tests/postgres-integration.test.ts new file mode 100644 index 000000000..0c32f47c0 --- /dev/null +++ b/platform/server/tests/postgres-integration.test.ts @@ -0,0 +1,517 @@ +import { expect, test } from "bun:test"; +import { generateKeyPairSync, randomBytes } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { Pool } from "pg"; +import { verifyRemoteManagementAssertion } from "../../../src/server/remote-assertion"; +import { createPlatformAuth } from "../src/auth"; +import { loadPlatformConfig } from "../src/config"; +import { Database } from "../src/db"; +import { PlatformStore } from "../src/store"; + +const adminDatabaseUrl = process.env.PLATFORM_TEST_DATABASE_URL; +const postgresTest = adminDatabaseUrl ? test : test.skip; + +async function reservePort(): Promise { + const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch: () => new Response("reserved"), + }); + const port = server.port; + await server.stop(true); + if (port === undefined) throw new Error("Bun did not allocate a test port"); + return port; +} + +async function waitFor(probe: () => Promise, timeoutMs = 15_000): Promise { + const deadline = Date.now() + timeoutMs; + let lastError: unknown; + while (Date.now() < deadline) { + try { + const value = await probe(); + if (value !== null) return value; + } catch (error) { + lastError = error; + } + await Bun.sleep(100); + } + throw new Error(`integration wait timed out${lastError instanceof Error ? `: ${lastError.message}` : ""}`); +} + +async function stopProcess(process: ReturnType): Promise { + if (process.exitCode !== null) return; + process.kill(); + await Promise.race([process.exited, Bun.sleep(2_000)]); + if (process.exitCode === null) process.kill(9); +} + +function fixedSizeBody(size: number): ReadableStream { + const chunkSize = 1024 * 1024; + let remaining = size; + return new ReadableStream({ + pull(controller) { + if (remaining === 0) { + controller.close(); + return; + } + const length = Math.min(chunkSize, remaining); + remaining -= length; + controller.enqueue(new Uint8Array(length).fill(0x61)); + }, + }); +} + +async function readSize(body: ReadableStream | null): Promise { + if (!body) return 0; + const reader = body.getReader(); + let size = 0; + while (true) { + const chunk = await reader.read(); + if (chunk.done) return size; + size += chunk.value.byteLength; + } +} + +postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compatible", async () => { + const databaseName = `ocxr_test_${process.pid}_${randomBytes(4).toString("hex")}`; + const quotedDatabaseName = `"${databaseName}"`; + const adminPool = new Pool({ connectionString: adminDatabaseUrl, max: 1 }); + const databaseUrl = new URL(adminDatabaseUrl!); + databaseUrl.pathname = `/${databaseName}`; + + const processes: Array> = []; + let database: Database | null = null; + let fakeAgent: ReturnType | null = null; + + try { + await adminPool.query(`CREATE DATABASE ${quotedDatabaseName}`); + const migration = readFileSync(join(import.meta.dir, "..", "migrations", "0001_remote_platform.sql"), "utf8"); + const migrationPool = new Pool({ connectionString: databaseUrl.toString(), max: 1 }); + try { + await migrationPool.query(migration); + } finally { + await migrationPool.end(); + } + + const controlPort = await reservePort(); + const gatewayPort = await reservePort(); + const { privateKey, publicKey } = generateKeyPairSync("ed25519"); + const privateKeyPem = privateKey.export({ type: "pkcs8", format: "pem" }).toString(); + const publicKeyPem = publicKey.export({ type: "spki", format: "pem" }).toString(); + const environment = { + ...process.env, + NODE_ENV: "test", + PLATFORM_DATABASE_URL: databaseUrl.toString(), + PLATFORM_BASE_URL: `http://127.0.0.1:${controlPort}`, + PLATFORM_INSTANCE_DOMAIN: "instances.example.test", + PLATFORM_BOOTSTRAP_GITHUB_ID: "999999", + PLATFORM_DEV_AUTH_GITHUB_ID: "111111", + PLATFORM_GATEWAY_ISSUER: "ocxr-integration", + PLATFORM_GATEWAY_KID: "integration-key", + PLATFORM_GATEWAY_PRIVATE_KEY: privateKeyPem, + PLATFORM_ENCRYPTION_KEY: randomBytes(32).toString("base64url"), + PLATFORM_AUDIT_HMAC_KEY: randomBytes(32).toString("base64url"), + PLATFORM_SYNTHETIC_HEALTH_TOKEN: randomBytes(32).toString("base64url"), + PLATFORM_CONTROL_PORT: String(controlPort), + PLATFORM_GATEWAY_PORT: String(gatewayPort), + CLOUDFLARE_MESH_ENABLED: "false", + BETTER_AUTH_SECRET: randomBytes(32).toString("hex"), + GITHUB_CLIENT_ID: "integration-client", + GITHUB_CLIENT_SECRET: "integration-secret", + } satisfies NodeJS.ProcessEnv; + const config = loadPlatformConfig(environment); + database = new Database(databaseUrl.toString()); + const auth = createPlatformAuth(config, database); + const adapter = (await auth.$context).internalAdapter; + + const firstUserInput = { + name: "First User", + email: "FIRST@EXAMPLE.TEST", + emailVerified: true, + image: null, + githubNumericId: "111111", + } as Parameters[0] & { githubNumericId: string }; + const secondUserInput = { + name: "Second User", + email: "second@example.test", + emailVerified: true, + image: null, + githubNumericId: "222222", + } as Parameters[0] & { githubNumericId: string }; + const first = await adapter.createOAuthUser( + firstUserInput, + { + accountId: "111111", + providerId: "github", + accessToken: "fake-first-access-token", + scope: "read:user user:email", + }, + ); + const second = await adapter.createOAuthUser( + secondUserInput, + { + accountId: "222222", + providerId: "github", + accessToken: "fake-second-access-token", + scope: "read:user user:email", + }, + ); + expect(first.user.email).toBe("first@example.test"); + const persistedFirstUser = await database.query<{ + githubNumericId: string; + role: string; + status: string; + }>( + "SELECT github_numeric_id AS \"githubNumericId\",role::text,status::text FROM users WHERE id=$1", + [first.user.id], + ); + expect(persistedFirstUser.rows[0]).toEqual({ + githubNumericId: "111111", + role: "user", + status: "pending_invite", + }); + + const session = await adapter.createSession(first.user.id, false, { + ipAddress: "127.0.0.1", + userAgent: "ocxr-postgres-integration", + }); + expect((await adapter.findSession(session.token))?.user.id).toBe(first.user.id); + await adapter.createVerificationValue({ + identifier: "postgres-integration", + value: "opaque-verification-value", + expiresAt: new Date(Date.now() + 60_000), + }); + expect((await adapter.findVerificationValue("postgres-integration"))?.value).toBe("opaque-verification-value"); + expect((await adapter.findAccountByProviderId("111111", "github"))?.userId).toBe(first.user.id); + + await database.query("UPDATE users SET status='active' WHERE id IN ($1,$2)", [first.user.id, second.user.id]); + const store = new PlatformStore(database, config); + const secondActor = await store.authorizeUser({ + id: second.user.id, + name: second.user.name, + email: second.user.email, + githubNumericId: "222222", + }); + if (!secondActor) throw new Error("second actor was not authorized"); + + let firstInstanceId: string | null = null; + let upstreamStreamCancelled = false; + fakeAgent = Bun.serve({ + hostname: "127.0.0.1", + port: 10101, + async fetch(request, server) { + const assertionValid = firstInstanceId !== null && verifyRemoteManagementAssertion( + new Request(request.url, { method: request.method, headers: request.headers }), + { + remoteAccess: { + enabled: true, + instanceId: firstInstanceId, + issuer: environment.PLATFORM_GATEWAY_ISSUER, + publicKeys: [{ kid: environment.PLATFORM_GATEWAY_KID, publicKeyPem }], + }, + } as never, + ); + const url = new URL(request.url); + if (!assertionValid) return new Response("Not found", { status: 404 }); + if (url.pathname === "/v1/socket" && request.headers.get("upgrade")?.toLowerCase() === "websocket") { + const upgraded = server.upgrade(request, { + data: { + assertionValid, + authorization: request.headers.get("authorization"), + cookie: request.headers.get("cookie"), + forwardedFor: request.headers.get("x-forwarded-for"), + host: request.headers.get("host"), + origin: request.headers.get("origin"), + }, + }); + return upgraded ? undefined : new Response("upgrade failed", { status: 502 }); + } + if (url.pathname === "/v1/sse") { + const encoder = new TextEncoder(); + return new Response(new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode("data: first\n\n")); + setTimeout(() => { + controller.enqueue(encoder.encode("data: second\n\n")); + controller.close(); + }, 30); + }, + }), { headers: { "content-type": "text/event-stream" } }); + } + if (url.pathname === "/v1/stream-until-abort") { + const encoder = new TextEncoder(); + return new Response(new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode("ready\n")); + }, + cancel() { + upstreamStreamCancelled = true; + }, + }), { headers: { "content-type": "application/octet-stream" } }); + } + if (url.pathname === "/v1/echo-bytes") { + return Response.json({ bytes: await readSize(request.body) }); + } + if (url.pathname === "/v1/large-response") { + return new Response(fixedSizeBody(100 * 1024 * 1024), { + headers: { "content-type": "application/octet-stream" }, + }); + } + return Response.json({ + assertionValid, + authorization: request.headers.get("authorization"), + cookie: request.headers.get("cookie"), + forwardedFor: request.headers.get("x-forwarded-for"), + host: request.headers.get("host"), + origin: request.headers.get("origin"), + targetPath: request.headers.get("x-ocxr-target-path"), + }, { + headers: { + "cf-ray": "must-not-leak", + location: "http://127.0.0.1:10100/redirect", + "set-cookie": "upstream=must-not-leak", + "x-ocxr-private": "must-not-leak", + }, + }); + }, + websocket: { + open(socket) { + socket.send(JSON.stringify(socket.data)); + }, + message(socket, message) { + socket.send(message); + }, + }, + }); + + const platformRoot = join(import.meta.dir, "..", ".."); + const spawnService = (entrypoint: string) => { + const child = Bun.spawn([process.execPath, entrypoint], { + cwd: platformRoot, + env: environment, + stdout: "pipe", + stderr: "pipe", + }); + processes.push(child); + return child; + }; + const control = spawnService("server/src/control-plane.ts"); + let gateway = spawnService("server/src/gateway.ts"); + const worker = spawnService("server/src/worker.ts"); + + await waitFor(async () => { + if (control.exitCode !== null || gateway.exitCode !== null || worker.exitCode !== null) { + throw new Error("a platform process exited during startup"); + } + const response = await fetch(`http://127.0.0.1:${controlPort}/healthz`); + return response.ok ? true : null; + }); + const spa = await fetch(`http://127.0.0.1:${controlPort}/instances/first`); + expect(spa.status).toBe(200); + expect(spa.headers.get("content-type")).toContain("text/html"); + expect(await spa.text()).toContain("OpenCodex Remote"); + const missingApi = await fetch(`http://127.0.0.1:${controlPort}/api/v1/not-a-route`); + expect(missingApi.status).toBe(404); + expect(missingApi.headers.get("content-type")).toContain("application/json"); + + const createResponse = await fetch(`http://127.0.0.1:${controlPort}/api/v1/instances`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ name: "First Instance", slug: "first" }), + }); + expect(createResponse.status).toBe(202); + const createdFirst = await createResponse.json() as { instance: { id: string } }; + firstInstanceId = createdFirst.instance.id; + const createdSecond = await store.createInstance(secondActor, { name: "Second Instance", slug: "second" }); + + await waitFor(async () => { + const state = await database!.query<{ id: string; status: string }>( + "SELECT id,status::text FROM instances WHERE id IN ($1,$2) ORDER BY id", + [firstInstanceId, createdSecond.id], + ); + const resources = await database!.query<{ count: number }>( + "SELECT count(*)::int AS count FROM cloudflare_resources WHERE instance_id IN ($1,$2)", + [firstInstanceId, createdSecond.id], + ); + return state.rows.length === 2 + && state.rows.every(row => row.status === "awaiting_agent") + && resources.rows[0]?.count === 4 + ? true + : null; + }); + await stopProcess(worker); + + const invisible = await fetch(`http://127.0.0.1:${controlPort}/api/v1/instances/${createdSecond.id}`); + expect(invisible.status).toBe(404); + + const tokenResponse = await fetch( + `http://127.0.0.1:${controlPort}/api/v1/instances/${firstInstanceId}/tokens`, + { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ name: "integration" }), + }, + ); + expect(tokenResponse.status).toBe(201); + const firstToken = (await tokenResponse.json() as { token: string }).token; + const secondToken = (await store.issueDataToken(secondActor, createdSecond.id, "integration")).token; + await database.query( + `UPDATE instances SET private_hostname=CASE id WHEN $1 THEN '127.0.0.1' ELSE 'localhost' END, + status='online',updated_at=now() WHERE id IN ($1,$2)`, + [firstInstanceId, createdSecond.id], + ); + + const gatewayRequest = (host: string, token?: string) => fetch( + `http://127.0.0.1:${gatewayPort}/v1/models?z=2&a=1`, + { + headers: { + host, + ...(token ? { authorization: `Bearer ${token}` } : {}), + cookie: "official-session=must-not-leak", + "x-forwarded-for": "203.0.113.10", + "x-opencodex-api-key": "must-not-leak", + }, + redirect: "manual", + }, + ); + const allowed = await gatewayRequest("first.instances.example.test", firstToken); + expect(allowed.status).toBe(200); + const upstream = await allowed.json() as Record; + expect(upstream.assertionValid).toBe(true); + expect(upstream.authorization).toBeNull(); + expect(upstream.cookie).toBeNull(); + expect(upstream.forwardedFor).toBeNull(); + expect(upstream.host).toBe("127.0.0.1:10100"); + expect(upstream.origin).toBe("http://127.0.0.1:10100"); + expect(upstream.targetPath).toBe("/v1/models?z=2&a=1"); + expect(allowed.headers.get("set-cookie")).toBeNull(); + expect(allowed.headers.get("cf-ray")).toBeNull(); + expect(allowed.headers.get("x-ocxr-private")).toBeNull(); + expect(allowed.headers.get("location")).toBe("https://first.instances.example.test/redirect"); + + expect((await gatewayRequest("first.instances.example.test", secondToken)).status).toBe(404); + expect((await gatewayRequest("second.instances.example.test", firstToken)).status).toBe(404); + expect((await gatewayRequest("first.instances.example.test")).status).toBe(404); + expect((await gatewayRequest("second.instances.example.test", secondToken)).status).toBe(404); + + const firstAuthorization = await fetch( + `http://127.0.0.1:${controlPort}/api/v1/instances/${firstInstanceId}/authorize`, + { method: "POST" }, + ); + expect(firstAuthorization.status).toBe(201); + const firstAuthorizationUrl = new URL((await firstAuthorization.json() as { url: string }).url); + const firstExchange = await fetch( + `http://127.0.0.1:${gatewayPort}${firstAuthorizationUrl.pathname}${firstAuthorizationUrl.search}`, + { headers: { host: "first.instances.example.test" }, redirect: "manual" }, + ); + expect(firstExchange.status).toBe(302); + const firstSessionCookie = firstExchange.headers.get("set-cookie")?.split(";", 1)[0]; + expect(firstSessionCookie).toStartWith("__Host-ocxr_instance="); + const secondAuthorizationUrl = new URL(await store.issueInstanceAuthorization(secondActor, createdSecond.id)); + const secondExchange = await fetch( + `http://127.0.0.1:${gatewayPort}${secondAuthorizationUrl.pathname}${secondAuthorizationUrl.search}`, + { headers: { host: "second.instances.example.test" }, redirect: "manual" }, + ); + expect(secondExchange.status).toBe(302); + const secondSessionCookie = secondExchange.headers.get("set-cookie")?.split(";", 1)[0]; + expect(secondSessionCookie).toStartWith("__Host-ocxr_instance="); + const browserRequest = (host: string, cookie: string | undefined) => fetch( + `http://127.0.0.1:${gatewayPort}/api/config`, + { headers: { host, ...(cookie ? { cookie } : {}) } }, + ); + expect((await browserRequest("first.instances.example.test", firstSessionCookie)).status).toBe(200); + expect((await browserRequest("second.instances.example.test", firstSessionCookie)).status).toBe(404); + expect((await browserRequest("first.instances.example.test", secondSessionCookie)).status).toBe(404); + + const sse = await fetch(`http://127.0.0.1:${gatewayPort}/v1/sse`, { + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + }); + expect(sse.status).toBe(200); + expect(sse.headers.get("content-type")).toContain("text/event-stream"); + expect(await sse.text()).toBe("data: first\n\ndata: second\n\n"); + + const hundredMiB = 100 * 1024 * 1024; + const upload = await fetch(`http://127.0.0.1:${gatewayPort}/v1/echo-bytes`, { + method: "POST", + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + body: fixedSizeBody(hundredMiB), + duplex: "half", + } as RequestInit); + expect(upload.status).toBe(200); + expect((await upload.json() as { bytes: number }).bytes).toBe(hundredMiB); + const download = await fetch(`http://127.0.0.1:${gatewayPort}/v1/large-response`, { + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + }); + expect(download.status).toBe(200); + expect(await readSize(download.body)).toBe(hundredMiB); + + const socket = new WebSocket(`ws://127.0.0.1:${gatewayPort}/v1/socket`, { + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + } as never); + const socketMessages: string[] = []; + socket.addEventListener("message", event => socketMessages.push(String(event.data))); + await waitFor(async () => socketMessages.length ? true : null); + const socketHeaders = JSON.parse(socketMessages[0]) as Record; + expect(socketHeaders.assertionValid).toBe(true); + expect(socketHeaders.authorization).toBeNull(); + expect(socketHeaders.cookie).toBeNull(); + expect(socketHeaders.forwardedFor).toBeNull(); + expect(socketHeaders.host).toBe("127.0.0.1:10100"); + expect(socketHeaders.origin).toBe("http://127.0.0.1:10100"); + socket.send("socket-round-trip"); + await waitFor(async () => socketMessages.includes("socket-round-trip") ? true : null); + socket.close(); + + await stopProcess(gateway); + gateway = spawnService("server/src/gateway.ts"); + await waitFor(async () => { + if (gateway.exitCode !== null) throw new Error("gateway exited during restart"); + const response = await gatewayRequest("first.instances.example.test", firstToken); + return response.status === 200 ? true : null; + }); + + const revokedSocket = new WebSocket(`ws://127.0.0.1:${gatewayPort}/v1/socket`, { + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + } as never); + let revokedSocketOpened = false; + let revokedSocketClose: { code: number; reason: string } | null = null; + revokedSocket.addEventListener("message", () => { revokedSocketOpened = true; }); + revokedSocket.addEventListener("close", event => { + revokedSocketClose = { code: event.code, reason: event.reason }; + }); + await waitFor(async () => revokedSocketOpened ? true : null); + + const longStream = await fetch(`http://127.0.0.1:${gatewayPort}/v1/stream-until-abort`, { + headers: { host: "first.instances.example.test", authorization: `Bearer ${firstToken}` }, + }); + expect(longStream.status).toBe(200); + const longReader = longStream.body!.getReader(); + expect(new TextDecoder().decode((await longReader.read()).value)).toBe("ready\n"); + + const suspend = await fetch( + `http://127.0.0.1:${controlPort}/api/v1/instances/${firstInstanceId}/suspend`, + { method: "POST" }, + ); + expect(suspend.status).toBe(202); + const streamClosed = await Promise.race([ + longReader.read().then(result => result.done).catch(() => true), + Bun.sleep(5_000).then(() => false), + ]); + expect(streamClosed).toBe(true); + await waitFor(async () => upstreamStreamCancelled ? true : null, 5_000); + await waitFor(async () => revokedSocketClose ? true : null, 5_000); + const observedSocketClose = revokedSocketClose as unknown as { code: number; reason: string }; + expect(observedSocketClose).toEqual({ code: 1008, reason: "instance disabled" }); + expect((await gatewayRequest("first.instances.example.test", firstToken)).status).toBe(404); + + await adapter.deleteVerificationByIdentifier("postgres-integration"); + } finally { + await Promise.all(processes.map(stopProcess)); + if (fakeAgent) await fakeAgent.stop(true); + if (database) await database.close(); + await adminPool.query("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=$1", [databaseName]); + await adminPool.query(`DROP DATABASE IF EXISTS ${quotedDatabaseName}`); + await adminPool.end(); + } +}, 60_000); diff --git a/remote-agent/src/proxy.rs b/remote-agent/src/proxy.rs index 90e1e8d39..2687a48d2 100644 --- a/remote-agent/src/proxy.rs +++ b/remote-agent/src/proxy.rs @@ -27,6 +27,7 @@ const REQUEST_DENY: &[&str] = &[ "host", "proxy-authenticate", "proxy-authorization", + "upgrade", "x-forwarded-for", "x-forwarded-host", "x-forwarded-proto", @@ -54,6 +55,10 @@ fn denied(name: &HeaderName, response: bool) -> bool { let lower = name.as_str(); lower.starts_with("cf-") || lower.starts_with("x-ocxr-") + // Each relay hop owns its WebSocket handshake. Forwarding the client's + // generated key/version headers would duplicate those generated by the + // upstream WebSocket client and can make an otherwise valid upgrade fail. + || (!response && lower.starts_with("sec-websocket-")) || (response && RESPONSE_DENY.contains(&lower)) || (!response && (REQUEST_DENY.contains(&lower) || lower == ASSERTION_HEADER)) } @@ -223,3 +228,26 @@ pub async fn serve(config: AgentConfig, shutdown: CancellationToken) -> Result<( .await?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn websocket_handshake_headers_are_regenerated_per_hop() { + let mut input = HeaderMap::new(); + input.insert("upgrade", HeaderValue::from_static("websocket")); + input.insert("sec-websocket-key", HeaderValue::from_static("client-key")); + input.insert("sec-websocket-version", HeaderValue::from_static("13")); + input.insert("x-client-feature", HeaderValue::from_static("preserved")); + + let output = sanitized_request_headers(&input); + assert!(!output.contains_key("upgrade")); + assert!(!output.contains_key("sec-websocket-key")); + assert!(!output.contains_key("sec-websocket-version")); + assert_eq!( + output.get("x-client-feature"), + Some(&HeaderValue::from_static("preserved")) + ); + } +} diff --git a/structure/12_remote-platform.md b/structure/12_remote-platform.md index c99d3e6cb..12b66bce4 100644 --- a/structure/12_remote-platform.md +++ b/structure/12_remote-platform.md @@ -35,6 +35,18 @@ public instance hostname SSE와 HTTP response body는 buffer를 만들지 않고 전달한다. WebSocket은 Gateway와 Agent 두 hop에서 양방향으로 relay한다. 각 hop은 downstream disconnect를 upstream close/abort로 전파해야 한다. +### Streaming lifecycle invariant + +Gateway의 HTTP 요청 추적 수명은 upstream `fetch()`가 헤더를 반환한 시점이 아니라 response body가 종료·오류·취소된 시점까지다. suspend/delete의 PostgreSQL 알림은 활성 HTTP controller를 abort하고 활성 WebSocket을 policy close한다. WebSocket의 key/version/upgrade header는 각 relay hop이 직접 생성하며 이전 hop의 handshake header를 재사용하지 않는다. + +[Decision Log] +- 목적과 의도: suspend/delete 및 downstream disconnect가 이미 헤더를 받은 장기 SSE/HTTP/WS 연결도 즉시 종료하게 한다. +- 기존 구현 및 제약 조건: response body는 buffering 없이 전달해야 하고, `fetch()` 완료 직후 cleanup하면 실제 stream 수명보다 추적이 먼저 끝난다. +- 검토한 주요 대안: 응답 전체 buffering, 고정 timeout, fetch 완료 시 추적 해제, response stream lifecycle wrapper. +- 선택한 방식: backpressure를 유지하는 `ReadableStream` wrapper에서 종료·취소 시 cleanup하고, WebSocket은 instance별 활성 registry로 추적한다. +- 다른 대안 대신 이 방식을 선택한 이유: 본문 크기와 연결 시간에 무관하게 기존 streaming 성질을 유지하면서 취소와 중앙 정지를 정확히 전파한다. +- 장점, 단점 및 영향: 100 MiB와 장기 stream도 상수 크기 buffering으로 중계하고 즉시 폐기할 수 있다. 대신 모든 body 종료 경로와 socket close 경로가 반드시 idempotent cleanup을 호출해야 한다. + ## Credential classes - OpenCodex admin token: 기존 로컬 관리 자격증명. From 17bf7758d00c71129b84cef16ded9f71bcbc30c9 Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Thu, 30 Jul 2026 03:18:48 +0000 Subject: [PATCH 3/7] Validate private Mesh provisioning --- platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md | 64 +++++++++++++ platform/docs/IMPLEMENTATION_PLAN.md | 12 ++- platform/docs/IMPLEMENTATION_STATUS.md | 58 +++++++---- platform/scripts/phase0-origin.ts | 71 ++++++++++++++ .../migrations/0001_remote_platform.sql | 1 + platform/server/src/cloudflare.ts | 96 +++++++++++++++++-- platform/server/src/config.ts | 5 + platform/server/src/store.ts | 30 ++++-- platform/server/src/worker.ts | 63 ++++++++++-- platform/server/tests/cloudflare-live.test.ts | 54 +++++++++++ platform/server/tests/cloudflare.test.ts | 92 ++++++++++++++++++ .../server/tests/postgres-integration.test.ts | 2 +- remote-agent/src/config.rs | 56 +++++++++++ remote-agent/src/control.rs | 1 + remote-agent/src/main.rs | 29 +++++- structure/12_remote-platform.md | 16 +++- structure/adr/0012-remote-private-mesh.md | 12 ++- 17 files changed, 614 insertions(+), 48 deletions(-) create mode 100644 platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md create mode 100644 platform/scripts/phase0-origin.ts create mode 100644 platform/server/tests/cloudflare-live.test.ts create mode 100644 platform/server/tests/cloudflare.test.ts diff --git a/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md b/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md new file mode 100644 index 000000000..198bd9b46 --- /dev/null +++ b/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md @@ -0,0 +1,64 @@ +# Cloudflare Mesh private-hostname Phase 0 — 2026-07-30 + +## 결론 + +실제 Cloudflare account와 `opencodexpages.me` zone에서 Linux Cloudflare Mesh node → private hostname route → dedicated Cloudflare Tunnel → RFC1918 origin 경로가 통과했다. 일반 WARP client만이 아니라 central Gateway 역할의 headless Mesh node에서도 확인했다. + +Phase 0에서 확정된 private instance domain은 `*.private.remote.opencodexpages.me`다. 사용자 공개 instance domain은 `.remote.opencodexpages.me`로 예약하지만 중앙 public ingress 배포 전에는 wildcard DNS를 만들지 않는다. + +## 필수 구성 + +1. Gateway TCP/UDP proxy를 켠다. +2. Mesh와 client profile에서 synthetic `100.80.0.0/16`을 WARP로 보낸다. Exclude mode에서는 기본 `100.64.0.0/10` 제외를 제거한다. +3. private hostname TLD를 Local Domain Fallback에 넣지 않는다. +4. private hostname의 DNS-only A record를 먼저 만들고 고유 RFC1918 `/32`를 반환하게 한다. +5. 같은 `/32` CIDR route와 hostname route를 dedicated Tunnel에 연결한다. +6. privileged `opencodex-remote-agent prepare-network`가 `/32`를 loopback에 할당하고 비특권 Agent runtime이 `:10101`에 bind한다. + +Hostname route만 만들었을 때 DNS 합성은 가능했지만 TCP가 `No route to host`로 실패했다. 좁은 CIDR route가 추가되자 Tunnel remote config의 `warp-routing.enabled`가 `true`로 바뀌고 TCP가 통과했다. `cloudflared --max-active-flows` 수동 override는 필요하지 않았다. + +## 실측 결과 + +| 항목 | 결과 | +|---|---:| +| Mesh client | Linux `warp-cli 2026.6.880.0` | +| cloudflared | `2026.3.0`, QUIC, 4 connections | +| DNS | private hostname → synthetic `100.80.0.0/16` | +| 기본 HTTP | 200, 10회 19.37–23.68 ms | +| 100 MiB download | 104,857,600 bytes / 1.500 s | +| 100 MiB upload | 104,857,600 bytes accepted | +| SSE | 5-event smoke pass | +| WebSocket | bidirectional echo pass | +| Rust Agent assertion E2E | authorized 200, unauthorized concealed as 404 | +| Rust Agent 100 MiB download | 104,857,600 bytes / 1.707 s | +| Rust Agent 100 MiB upload | 104,857,600 bytes accepted | +| Rust Agent SSE / WebSocket | 5-event SSE and bidirectional echo pass | +| Tunnel restart | active SSE closed with curl rc 18; new HTTP recovered in 39.632 s | +| 30-minute transport SSE | pass: rc 0, 1,801 s, 1,800 events | +| 30-minute Rust Agent SSE | pass: rc 0, 1,800 s, 1,800 events | + +Restart 결과 때문에 health computation은 connector connection 수가 돌아온 직후 online으로 바꾸면 안 된다. hostname data plane의 synthetic route가 회복될 시간을 포함해 Gateway synthetic health를 authoritative signal로 유지하고 최소 60초 grace를 둔다. + +## 실패에서 확인한 사항 + +- `.internal`은 기본 Local Domain Fallback에 포함돼 Gateway DNS를 우회했다. +- DNS record보다 먼저 private hostname을 질의하면 Gateway가 zone SOA의 negative TTL 동안 NXDOMAIN을 캐시했다. +- `cloudflared` virtual DNS는 컨테이너 `/etc/hosts`의 `127.0.0.1` 매핑을 origin 주소로 사용하지 않았다. +- public DNS의 `127.0.0.1` 답은 synthetic IP로 바뀌지 않고 그대로 반환됐다. +- RFC1918 origin과 `/32` CIDR activation route를 함께 사용했을 때 Mesh/Tunnel L4가 통과했다. + +## 운영 경계 + +- DNS record는 proxied public application route가 아니며 RFC1918 주소만 반환한다. +- private hostname label은 160-bit random 값이고 사용자 slug에서 유도하지 않는다. +- Cloudflare account credential은 Control Plane만 보유한다. +- 활성 Agent가 재연결 중인 suspend에서도 hostname route, CIDR route, DNS record를 먼저 제거하고 공식 connector-cleanup API를 호출한 뒤 Tunnel을 삭제했다. Gateway는 즉시 404로 닫혔고 Cloudflare 리소스 네 개가 모두 제거됐다. +- Phase 0의 service token, WARP enrollment app/policy/registrations, Mesh node, Tunnel, DNS/route는 측정 종료 후 모두 삭제했다. 테스트를 위해 변경한 Gateway TCP/UDP, virtual IP, split-exclude 기본값도 사전 백업과 동일하게 복원했고 활성 `ocxr-` Cloudflare 리소스가 0개임을 다시 확인했다. + +[Decision Log] +- 목적과 의도: 문서상 가정이 아니라 실제 Cloudflare account에서 transport 적합성을 확정한다. +- 기존 구현 및 제약 조건: 기존 계획은 Agent의 hosts file이 private hostname을 `127.0.0.1`로 해석한다고 가정했다. +- 검토한 주요 대안: hosts loopback, public DNS loopback, custom DNS, RFC1918 loopback alias와 CIDR activation route. +- 선택한 방식: DNS-backed 고유 RFC1918 `/32`, Tunnel CIDR route, Tunnel hostname route, Agent loopback bind. +- 다른 대안 대신 이 방식을 선택한 이유: 현재 공식 API와 Linux Mesh/Tunnel 버전에서 유일하게 DNS 합성 및 TCP 종단이 함께 실측 통과했다. +- 장점, 단점 및 영향: private-only 경계는 유지되지만 네 Cloudflare 리소스의 idempotent lifecycle, connector cleanup, 60초 restart grace가 필요하다. diff --git a/platform/docs/IMPLEMENTATION_PLAN.md b/platform/docs/IMPLEMENTATION_PLAN.md index 18934f3a1..e13ea420c 100644 --- a/platform/docs/IMPLEMENTATION_PLAN.md +++ b/platform/docs/IMPLEMENTATION_PLAN.md @@ -10,7 +10,7 @@ Browser / CLI → VPS Auth Gateway → Cloudflare Mesh private hostname route → per-instance Tunnel - → Rust Agent 127.0.0.1:10101 + → Rust Agent assigned RFC1918 loopback:10101 → OpenCodex 127.0.0.1:10100 ``` @@ -18,6 +18,16 @@ Browser / CLI - `*.instance-domain`은 언제나 중앙 Gateway로 향한다. - Gateway만 DB의 추측 불가능한 private hostname을 목적지로 사용한다. - 중앙 시스템은 Docker 없이 Ubuntu 24.04 VPS의 native systemd로 운영한다. +- private hostname은 `*.private.remote.opencodexpages.me` DNS-only A record로 인스턴스별 `10.192.0.0/10` `/32`를 가리킨다. +- 같은 `/32` CIDR activation route와 hostname route를 dedicated Tunnel에 연결하며, Agent는 그 주소를 `lo`에만 할당한다. + +[Decision Log] +- 목적과 의도: live Cloudflare Mesh에서 검증된 hostname routing 전제조건을 프로비저닝과 Agent에 고정한다. +- 기존 구현 및 제약 조건: `127.0.0.1` hosts 해석과 hostname route 단독 구성은 실제 account에서 TCP data plane을 열지 못했다. +- 검토한 주요 대안: public Tunnel route, LAN listener, custom resolver, 고유 RFC1918 loopback alias. +- 선택한 방식: DNS record 생성 후 `/32` activation route와 hostname route를 만들고 Agent가 alias를 loopback에 bind한다. +- 다른 대안 대신 이 방식을 선택한 이유: public service exposure 없이 Mesh synthetic IP와 Tunnel origin resolution이 모두 통과했다. +- 장점, 단점 및 영향: provisioning/deletion saga가 네 Cloudflare 리소스를 다룬다. 별도 `prepare-network` 단계만 root 또는 `CAP_NET_ADMIN`이 필요하고 장시간 Agent runtime은 비특권으로 실행한다. ## 보안 기준 diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index 1f11038c0..7de31a522 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -1,12 +1,12 @@ # OpenCodex Remote MVP 구현 인수인계 -마지막 갱신: 2026-07-29 +마지막 갱신: 2026-07-30 작업 브랜치: `ingw/remote-private-mvp-handoff` -기준 브랜치/커밋: `dev` / `cfc50fbb` +기준 브랜치/커밋: `dev` / `67c731e6` -이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증은 완료됐다. 실제 Cloudflare 계정·VPS·Rust Agent를 모두 연결한 Phase 0 및 운영 E2E는 아직 완료되지 않았다. +이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증은 완료됐다. 실제 Cloudflare account의 Linux Mesh/private-hostname transport와 Rust Agent 포함 30분 stream은 통과했고, 실제 OpenCodex process 및 public ingress를 포함한 운영 E2E는 아직 완료되지 않았다. ## 문서와 디자인 자산 @@ -55,8 +55,12 @@ - `FOR UPDATE SKIP LOCKED` worker와 provision/suspend/delete job 골격 추가. - Tunnel secret AES-256-GCM envelope 저장과 audit network HMAC 추가. - Cloudflare API adapter와 로컬 fake adapter 추가. +- API token과 Global API Key(`X-Auth-Email` + `X-Auth-Key`) 인증을 모두 지원. - Tunnel 연결 상태는 전용 `/cfd_tunnel/{id}/connections` endpoint만 사용. - private hostname route는 `/zerotrust/routes/hostname` endpoint 사용. +- Tunnel token 조회는 현재 API의 `GET /cfd_tunnel/{id}/token`을 사용. +- `*.private.remote.opencodexpages.me` DNS-only A record, 고유 RFC1918 `/32`, narrow CIDR activation route를 hostname route보다 먼저 생성. +- suspend/delete 시 hostname route → CIDR route → DNS record → Tunnel 순서로 제거. ### Gateway @@ -76,7 +80,7 @@ - `remote-agent/` Rust 2024 package와 lockfile 추가. - Ed25519 키 생성·pairing·challenge 응답·heartbeat 구현. - Agent config와 Tunnel token을 `0600`으로 원자 저장. -- `127.0.0.1:10101` local ingress 구현. +- Control Plane이 배정한 `10.192.0.0/10` `/32`만 허용. privileged `prepare-network`가 `ip address replace ... dev lo`를 수행하고 비특권 `run`은 `:10101` local ingress를 실행. - assertion signature/scope/method/path/time/replay 검증 구현. - 사용자 control header 제거, Host·Origin loopback 정규화. - streaming HTTP body와 WebSocket 양방향 relay 구현. @@ -104,10 +108,25 @@ - Gateway 재시작 후 재연결과 suspend `NOTIFY`에 의한 진행 중 stream 취소 확인. - 중첩 SPA 경로는 production HTML, 미등록 API 경로는 JSON `404`인지 확인. +### 실제 Cloudflare Phase 0 transport + +- `opencodexpages.me` active zone과 실제 Zero Trust account API shape 검증. +- DNS-only RFC1918 A record → `/32` CIDR activation route → hostname route → dedicated Tunnel 순서 검증. +- Linux Cloudflare Mesh node `warp-cli 2026.6.880.0`에서 private hostname이 `100.80.0.0/16` synthetic IP로 해석되고 Tunnel origin까지 HTTP 200 확인. +- `cloudflared 2026.3.0`, QUIC 4 connections, 수동 `max-active-flows` override 없이 통과. +- 10회 HTTP 19.37–23.68 ms, 100 MiB download 1.500초, 100 MiB upload 정확한 byte count, SSE smoke, WebSocket echo 통과. +- Tunnel restart 시 active SSE는 약 17.05초에 종료됐고 신규 HTTP data plane은 39.632초에 복구. 최소 60초 health grace 필요. +- 실제 Control Plane/worker가 live Cloudflare 리소스 4개를 만들고 Rust Agent pair, 전용 `/32` loopback bind, 4 Tunnel connections, heartbeat를 확인. +- 실제 Mesh Gateway의 `ocxr_` 요청이 Rust Agent assertion 검증을 거쳐 origin 200을 반환했고 무자격 요청은 404로 은닉. +- Rust Agent 포함 100 MiB download 1.707초, upload 정확한 byte count, SSE smoke, WebSocket echo 통과. +- transport-only 30분 SSE는 rc 0, 1,801초, 정확히 1,800 events로 통과. +- 실제 Rust Agent 포함 30분 SSE도 rc 0, 1,800초, 정확히 1,800 events로 통과. +- 재현 절차와 실패 원인은 [CLOUDFLARE_PHASE0_2026-07-30.md](./CLOUDFLARE_PHASE0_2026-07-30.md)에 기록. + ## 구현 중인 부분 - 실제 Rust Agent와 OpenCodex를 포함한 Gateway WebSocket/client disconnect E2E. -- 실제 Cloudflare Mesh에서 30분 stream, reconnect, Tunnel/Gateway 재시작 측정. +- 실제 OpenCodex process를 포함한 E2E와 Gateway 프로세스 재시작 측정. Mesh transport/Rust Agent 30분과 Tunnel 재시작은 완료. - suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. - Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. - 네이티브 systemd 서비스와 `LoadCredential=` 배포 파일. @@ -120,8 +139,8 @@ - [x] `platform` typecheck/build, root 전체 테스트, Rust fmt/clippy/test 재실행. - [x] PostgreSQL 17 migration과 Better Auth schema/CRUD 호환 검증. - [x] 실제 Control Plane·worker·Gateway를 동시에 띄우는 로컬 통합 테스트. -- [ ] 실제 Cloudflare Mesh 계정 Phase 0. 현재 작업 환경에는 Account ID/API token이 없다. -- [ ] 실제 Mesh/Rust Agent에서 30분 stream과 Tunnel 재시작 측정. 로컬 Gateway 기준 HTTP/SSE/WS, cancel/reconnect, 100 MiB body, Gateway 재시작은 통과했다. +- [x] 실제 Cloudflare Mesh account Phase 0 core transport. DNS, CIDR activation, hostname route, Tunnel, Linux Mesh HTTP/SSE/WS/100 MiB를 확인했다. +- [x] 실제 Mesh/Rust Agent에서 30분 stream. transport와 Agent 경로 모두 1,800 events로 통과했고 Tunnel 재시작은 신규 요청 39.632초 복구로 확인했다. - [x] 두 사용자·두 인스턴스 교차 hostname/token/session/assertion 접근 `404` 검증. ### P1 — 운영 기능 @@ -129,8 +148,8 @@ - native systemd unit 3개와 중앙 `cloudflared`, Linux Mesh node unit 작성. - Agent `amd64`/`arm64` musl release workflow. - Agent binary와 installer의 SHA-256 + Ed25519 detached signature 검증. -- suspend 시 Tunnel token rotation과 Connector 종료를 Cloudflare 현재 API 기준으로 확정. -- resume 흐름 추가. 현재 suspend worker는 연결 종료를 확실히 하기 위해 Tunnel을 삭제하며 resume은 미구현이다. +- suspend 시 hostname/CIDR/DNS를 먼저 제거하고 Cloudflare connector-cleanup API로 모든 연결을 끊은 뒤 Tunnel을 삭제하는 흐름을 실제 활성 Agent에서 확인했다. +- resume 흐름 추가. 현재 suspend worker는 연결 종료를 확실히 하기 위해 Tunnel과 token을 폐기하며 resume은 미구현이다. - delete saga 단계별 idempotency와 orphan resource reconciler 추가. - Gateway rate limit, 동시 연결/본문 크기 정책, abuse report/admin UI 추가. - audit 조회·90일 retention job, 일일 암호화 backup, 7일/4주 retention, restore drill 추가. @@ -150,12 +169,12 @@ ## 알려진 차이와 위험 - 원 기획서의 Workers VPC/fallback보다 이후 확정안인 Cloudflare Mesh private hostname route가 우선한다. Mesh 실패 시 자동 fallback하지 않는다. -- 실제 private hostname이 Agent 서버에서 `127.0.0.1:10101`로 resolve되도록 installer가 hosts/resolver를 구성해야 한다. 아직 자동화되지 않았다. -- Cloudflare adapter의 route create/delete 응답 shape는 live account로 검증하지 않았다. +- private hostname은 `127.0.0.1` hosts가 아니라 DNS-only RFC1918 A record를 사용한다. Agent `prepare-network`는 구현했지만 installer/systemd의 privileged `ExecStartPre`와 비특권 runtime unit은 아직 미구현이다. +- Cloudflare Tunnel, DNS, CIDR route, hostname route create/delete와 token GET 응답 shape를 live account로 검증했다. - Gateway synthetic token은 별도 systemd credential로 설계했지만 배포 파일은 아직 없다. - Better Auth의 OAuth account에는 GitHub access token이 저장될 수 있다. 운영 전 DB encryption/토큰 최소 보존 정책을 확정해야 한다. -- Gateway는 로컬 100 MiB 양방향 streaming과 취소를 통과했지만, Rust Agent를 포함한 부하·backpressure·30분 stream은 아직 측정하지 않았다. -- 실제 DNS, TLS, 두 registrable domain, Cloudflare public ingress는 구성하지 않았다. +- Gateway와 Rust Agent는 100 MiB 양방향 streaming, SSE/WS, 30분 stream을 통과했다. 실제 OpenCodex process와 public ingress를 포함한 부하·backpressure는 아직 측정하지 않았다. +- private `opencodexpages.me` DNS record는 Phase 0에서 검증했다. public wildcard ingress, TLS, official `opencodex.me`와 instance `opencodexpages.me` 쿠키/OAuth 분리는 아직 구성하지 않았다. ## 현재까지 확인된 검증 @@ -164,9 +183,14 @@ PASS bun run typecheck (root) PASS bun test tests/server-management-auth.test.ts 16 tests / 56 expects PASS bun test --isolate tests - 5961 pass / 1 skip / 0 fail / 30318 expects + 6030 pass / 2 skip / 0 fail / 30540 expects PASS bun run privacy:scan PASS cd platform && bun run typecheck +PASS cd platform && bun test server/tests/cloudflare.test.ts + 5 tests / 22 expects +PASS cd platform && CLOUDFLARE_LIVE_TESTS=true ... \ + bun test server/tests/cloudflare-live.test.ts + 1 test / 7 expects, live create/delete cleanup PASS cd platform && VITE_REMOTE_DEMO=true bun run build:web PASS cd platform && PLATFORM_TEST_DATABASE_URL=postgres://postgres@127.0.0.1:55432/postgres \ bun test server/tests/postgres-integration.test.ts @@ -175,13 +199,13 @@ PASS cd remote-agent && cargo fmt --check PASS cd remote-agent && cargo check PASS cd remote-agent && cargo clippy --all-targets --all-features -- -D warnings PASS cd remote-agent && cargo test - 2 Rust unit tests + 3 Rust unit tests ``` 아직 통과로 간주하면 안 되는 항목: -- 실제 Cloudflare Mesh Phase 0 -- 실제 Rust Agent/OpenCodex를 포함한 HTTP/SSE/WebSocket E2E와 30분 stream/Tunnel 재시작 +- 실제 Gateway 프로세스 재시작 측정 +- 실제 OpenCodex process와 public ingress를 포함한 HTTP/SSE/WebSocket 운영 E2E - 시각 QA와 접근성 브라우저 QA - systemd/VPS/backup restore 검증 diff --git a/platform/scripts/phase0-origin.ts b/platform/scripts/phase0-origin.ts new file mode 100644 index 000000000..7794ba568 --- /dev/null +++ b/platform/scripts/phase0-origin.ts @@ -0,0 +1,71 @@ +const port = Number(process.env.PHASE0_ORIGIN_PORT ?? "10102"); +const chunk = new Uint8Array(1024 * 1024).fill(0x61); + +function byteStream(size: number): ReadableStream { + let remaining = size; + return new ReadableStream({ + pull(controller) { + if (remaining <= 0) { + controller.close(); + return; + } + const length = Math.min(remaining, chunk.byteLength); + controller.enqueue(length === chunk.byteLength ? chunk : chunk.slice(0, length)); + remaining -= length; + }, + }); +} + +const server = Bun.serve<{ openedAt: number }>({ + hostname: "0.0.0.0", + port, + async fetch(request, server) { + const url = new URL(request.url); + const path = url.pathname.replace(/^\/v1(?=\/)/, ""); + if (path === "/healthz") return Response.json({ ok: true }); + if (path === "/download") { + const size = Math.max(0, Math.min(Number(url.searchParams.get("bytes") ?? 0), 512 * 1024 * 1024)); + return new Response(byteStream(size), { + headers: { "content-length": String(size), "content-type": "application/octet-stream" }, + }); + } + if (path === "/upload" && request.method === "POST") { + let size = 0; + if (request.body) { + for await (const part of request.body) size += part.byteLength; + } + return Response.json({ size }); + } + if (path === "/sse") { + const seconds = Math.max(1, Math.min(Number(url.searchParams.get("seconds") ?? 60), 3600)); + let elapsed = 0; + let timer: Timer | undefined; + return new Response(new ReadableStream({ + start(controller) { + const send = () => { + elapsed += 1; + controller.enqueue(new TextEncoder().encode(`data: ${elapsed}\n\n`)); + if (elapsed >= seconds) { + if (timer) clearInterval(timer); + controller.close(); + } + }; + send(); + timer = setInterval(send, 1000); + }, + cancel() { + if (timer) clearInterval(timer); + }, + }), { headers: { "cache-control": "no-store", "content-type": "text/event-stream" } }); + } + if (path === "/ws" && server.upgrade(request, { data: { openedAt: Date.now() } })) return; + return new Response("not found", { status: 404 }); + }, + websocket: { + message(socket, message) { + socket.send(message); + }, + }, +}); + +console.log(`OpenCodex Remote Phase 0 origin listening on ${server.hostname}:${server.port}`); diff --git a/platform/server/migrations/0001_remote_platform.sql b/platform/server/migrations/0001_remote_platform.sql index 9761f498e..a5f8e9ff5 100644 --- a/platform/server/migrations/0001_remote_platform.sql +++ b/platform/server/migrations/0001_remote_platform.sql @@ -78,6 +78,7 @@ CREATE TABLE instances ( name text NOT NULL, slug text NOT NULL, private_hostname text NOT NULL UNIQUE, + private_origin_ip inet NOT NULL UNIQUE, status instance_status NOT NULL DEFAULT 'pending', suspended_at timestamptz, deleted_at timestamptz, diff --git a/platform/server/src/cloudflare.ts b/platform/server/src/cloudflare.ts index 74b5e34ac..d9ee961aa 100644 --- a/platform/server/src/cloudflare.ts +++ b/platform/server/src/cloudflare.ts @@ -7,10 +7,15 @@ export interface TunnelResource { export interface CloudflareProvider { createTunnel(name: string): Promise; + createPrivateDnsRecord(hostname: string, originIp: string): Promise; + createCidrActivationRoute(tunnelId: string, originIp: string): Promise; createPrivateHostnameRoute(tunnelId: string, hostname: string): Promise; listActiveConnections(tunnelId: string): Promise; - rotateTunnelToken(tunnelId: string): Promise; + getTunnelToken(tunnelId: string): Promise; + cleanupTunnelConnections(tunnelId: string): Promise; disablePrivateHostnameRoute(routeId: string): Promise; + deleteCidrActivationRoute(routeId: string): Promise; + deletePrivateDnsRecord(recordId: string): Promise; deleteTunnel(tunnelId: string): Promise; } @@ -22,16 +27,25 @@ interface CloudflareEnvelope { export class CloudflareApi implements CloudflareProvider { constructor(private readonly config: PlatformConfig) { - if (!config.cloudflareApiToken || !config.CLOUDFLARE_ACCOUNT_ID) { - throw new Error("Cloudflare API token and account id are required"); + if (!config.cloudflareApiToken || !config.CLOUDFLARE_ACCOUNT_ID || !config.CLOUDFLARE_ZONE_ID) { + throw new Error("Cloudflare API credential, account id, and zone id are required"); } } + private authenticationHeaders(): Record { + return this.config.cloudflareAuthEmail + ? { + "x-auth-email": this.config.cloudflareAuthEmail, + "x-auth-key": this.config.cloudflareApiToken!, + } + : { authorization: `Bearer ${this.config.cloudflareApiToken}` }; + } + private async request(path: string, init: RequestInit = {}): Promise { const response = await fetch(`${this.config.CLOUDFLARE_API_BASE_URL}${path}`, { ...init, headers: { - authorization: `Bearer ${this.config.cloudflareApiToken}`, + ...this.authenticationHeaders(), "content-type": "application/json", ...init.headers, }, @@ -50,6 +64,39 @@ export class CloudflareApi implements CloudflareProvider { }); } + async createPrivateDnsRecord(hostname: string, originIp: string): Promise { + const record = await this.request<{ id: string }>( + `/zones/${this.config.CLOUDFLARE_ZONE_ID}/dns_records`, + { + method: "POST", + body: JSON.stringify({ + type: "A", + name: hostname, + content: originIp, + ttl: 60, + proxied: false, + comment: "OpenCodex Remote private origin resolver target", + }), + }, + ); + return record.id; + } + + async createCidrActivationRoute(tunnelId: string, originIp: string): Promise { + const route = await this.request<{ id: string }>( + `/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/teamnet/routes`, + { + method: "POST", + body: JSON.stringify({ + network: `${originIp}/32`, + tunnel_id: tunnelId, + comment: "OpenCodex Remote private-flow activation", + }), + }, + ); + return route.id; + } + async createPrivateHostnameRoute(tunnelId: string, hostname: string): Promise { const route = await this.request<{ id: string }>( `/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/zerotrust/routes/hostname`, @@ -65,14 +112,29 @@ export class CloudflareApi implements CloudflareProvider { return clients.flatMap(client => client.conns ?? []).filter(connection => !connection.is_pending_reconnect).length; } - rotateTunnelToken(tunnelId: string): Promise { - return this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}/token`, { method: "POST" }); + getTunnelToken(tunnelId: string): Promise { + return this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}/token`); + } + + async cleanupTunnelConnections(tunnelId: string): Promise { + await this.request( + `/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}/connections`, + { method: "DELETE" }, + ); } async disablePrivateHostnameRoute(routeId: string): Promise { await this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/zerotrust/routes/hostname/${routeId}`, { method: "DELETE" }); } + async deleteCidrActivationRoute(routeId: string): Promise { + await this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/teamnet/routes/${routeId}`, { method: "DELETE" }); + } + + async deletePrivateDnsRecord(recordId: string): Promise { + await this.request(`/zones/${this.config.CLOUDFLARE_ZONE_ID}/dns_records/${recordId}`, { method: "DELETE" }); + } + async deleteTunnel(tunnelId: string): Promise { await this.request(`/accounts/${this.config.CLOUDFLARE_ACCOUNT_ID}/cfd_tunnel/${tunnelId}`, { method: "DELETE" }); } @@ -82,6 +144,8 @@ export class CloudflareApi implements CloudflareProvider { export class FakeCloudflareProvider implements CloudflareProvider { readonly tunnels = new Map(); readonly routes = new Map(); + readonly dnsRecords = new Map(); + readonly cidrRoutes = new Map(); async createTunnel(): Promise { const id = crypto.randomUUID(); @@ -94,15 +158,31 @@ export class FakeCloudflareProvider implements CloudflareProvider { this.routes.set(id, { tunnelId, hostname }); return id; } + async createPrivateDnsRecord(hostname: string, originIp: string): Promise { + const id = crypto.randomUUID(); + this.dnsRecords.set(id, { hostname, originIp }); + return id; + } + async createCidrActivationRoute(tunnelId: string, originIp: string): Promise { + const id = crypto.randomUUID(); + this.cidrRoutes.set(id, { tunnelId, originIp }); + return id; + } async listActiveConnections(tunnelId: string): Promise { return this.tunnels.get(tunnelId)?.connections ?? 0; } - async rotateTunnelToken(tunnelId: string): Promise { + async getTunnelToken(tunnelId: string): Promise { const tunnel = this.tunnels.get(tunnelId); if (!tunnel) throw new Error("tunnel not found"); - tunnel.token = `fake.${crypto.randomUUID()}`; return tunnel.token; } + async cleanupTunnelConnections(tunnelId: string): Promise { + const tunnel = this.tunnels.get(tunnelId); + if (!tunnel) throw new Error("tunnel not found"); + tunnel.connections = 0; + } async disablePrivateHostnameRoute(routeId: string): Promise { this.routes.delete(routeId); } + async deleteCidrActivationRoute(routeId: string): Promise { this.cidrRoutes.delete(routeId); } + async deletePrivateDnsRecord(recordId: string): Promise { this.dnsRecords.delete(recordId); } async deleteTunnel(tunnelId: string): Promise { this.tunnels.delete(tunnelId); } } diff --git a/platform/server/src/config.ts b/platform/server/src/config.ts index 91f5655c3..410798fa2 100644 --- a/platform/server/src/config.ts +++ b/platform/server/src/config.ts @@ -7,6 +7,7 @@ const envSchema = z.object({ PLATFORM_DATABASE_URL: z.string().min(1), PLATFORM_BASE_URL: z.string().url(), PLATFORM_INSTANCE_DOMAIN: z.string().min(3), + PLATFORM_PRIVATE_HOSTNAME_DOMAIN: z.string().min(3).default("private.remote.opencodexpages.me"), PLATFORM_BOOTSTRAP_GITHUB_ID: z.string().regex(/^\d+$/), PLATFORM_GATEWAY_ISSUER: z.string().default("opencodex-remote"), PLATFORM_GATEWAY_KID: z.string().default("gateway-1"), @@ -14,6 +15,8 @@ const envSchema = z.object({ PLATFORM_GATEWAY_PORT: z.coerce.number().int().min(1).max(65535).default(10201), PLATFORM_DEV_AUTH_GITHUB_ID: z.string().regex(/^\d+$/).optional(), CLOUDFLARE_ACCOUNT_ID: z.string().optional(), + CLOUDFLARE_ZONE_ID: z.string().optional(), + CLOUDFLARE_AUTH_EMAIL: z.string().email().optional(), CLOUDFLARE_API_BASE_URL: z.string().url().default("https://api.cloudflare.com/client/v4"), CLOUDFLARE_MESH_ENABLED: z.enum(["true", "false"]).default("false"), BETTER_AUTH_SECRET: z.string().min(32).optional(), @@ -34,6 +37,7 @@ function credential(name: string, envValue?: string): string | undefined { export interface PlatformConfig extends z.infer { cloudflareApiToken?: string; + cloudflareAuthEmail?: string; gatewayPrivateKeyPem: string; encryptionKey: Buffer; auditHmacKey: Buffer; @@ -61,6 +65,7 @@ export function loadPlatformConfig(env: NodeJS.ProcessEnv = process.env): Platfo return { ...parsed, cloudflareApiToken: credential("cloudflare-api-token", env.CLOUDFLARE_API_TOKEN), + cloudflareAuthEmail: credential("cloudflare-auth-email", env.CLOUDFLARE_AUTH_EMAIL), gatewayPrivateKeyPem, encryptionKey: Buffer.from(encryptionKeyValue, "base64url"), auditHmacKey: Buffer.from(auditHmacValue, "base64url"), diff --git a/platform/server/src/store.ts b/platform/server/src/store.ts index d1e0827df..f784be5d6 100644 --- a/platform/server/src/store.ts +++ b/platform/server/src/store.ts @@ -42,6 +42,7 @@ interface InstanceRow { name: string; slug: string; private_hostname: string; + private_origin_ip: string; status: InstanceStatus; created_at: Date; updated_at: Date; @@ -64,6 +65,11 @@ function duplicateConstraint(error: unknown): boolean { return !!error && typeof error === "object" && (error as { code?: string }).code === "23505"; } +function issuePrivateOriginIp(): string { + const bytes = randomBytes(3); + return `10.${192 + bytes[0] % 64}.${bytes[1]}.${1 + bytes[2] % 254}`; +} + export class PlatformStore { constructor(readonly db: Database, readonly config: PlatformConfig) {} @@ -133,15 +139,16 @@ export class PlatformStore { const slug = input.slug.trim().toLowerCase(); if (name.length < 1 || name.length > 80) throw new Error("name must be 1-80 characters"); if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(slug)) throw new Error("invalid slug"); - const privateHostname = `${randomBytes(20).toString("hex")}.ocxr.internal`; + const privateHostname = `${randomBytes(20).toString("hex")}.${this.config.PLATFORM_PRIVATE_HOSTNAME_DOMAIN}`; + const privateOriginIp = issuePrivateOriginIp(); try { return await this.db.transaction(async client => { const tombstone = await client.query("SELECT 1 FROM slug_tombstones WHERE slug=$1 AND expires_at>now()", [slug]); if (tombstone.rowCount) throw new Error("slug is temporarily reserved"); const result = await client.query( - `INSERT INTO instances(owner_id,name,slug,private_hostname) - VALUES($1,$2,$3,$4) RETURNING *`, - [actor.id, name, slug, privateHostname], + `INSERT INTO instances(owner_id,name,slug,private_hostname,private_origin_ip) + VALUES($1,$2,$3,$4,$5) RETURNING *`, + [actor.id, name, slug, privateHostname, privateOriginIp], ); await client.query( `INSERT INTO provisioning_jobs(instance_id,kind,idempotency_key) @@ -171,7 +178,7 @@ export class PlatformStore { } async consumePairingCode(input: { code: string; publicKeyDer: Buffer; version: string }): Promise<{ - agentId: string; instanceId: string; tunnelToken: string; + agentId: string; instanceId: string; tunnelToken: string; privateOriginIp: string; }> { if (input.publicKeyDer.length < 32 || input.publicKeyDer.length > 256) throw new Error("invalid Ed25519 public key"); return this.db.transaction(async client => { @@ -195,12 +202,18 @@ export class PlatformStore { [row.instance_id], ); if (!resource.rows[0]?.encrypted_secret) throw new Error("tunnel token is not provisioned"); + const instance = await client.query<{ private_origin_ip: string }>( + "SELECT host(private_origin_ip) AS private_origin_ip FROM instances WHERE id=$1", + [row.instance_id], + ); + if (!instance.rows[0]?.private_origin_ip) throw new Error("private origin IP is not provisioned"); await client.query("UPDATE pairing_codes SET consumed_at=now() WHERE id=$1", [row.id]); await client.query("UPDATE instances SET status='connecting',updated_at=now() WHERE id=$1", [row.instance_id]); return { agentId: agent.rows[0].id, instanceId: row.instance_id, tunnelToken: decryptSecret(resource.rows[0].encrypted_secret, this.config.encryptionKey), + privateOriginIp: instance.rows[0].private_origin_ip, }; }); } @@ -399,7 +412,12 @@ export class PlatformStore { return status; } - async saveCloudflareResource(instanceId: string, resourceType: "tunnel" | "hostname_route", externalId: string, secret?: string): Promise { + async saveCloudflareResource( + instanceId: string, + resourceType: "tunnel" | "private_dns" | "cidr_activation_route" | "hostname_route", + externalId: string, + secret?: string, + ): Promise { await this.db.query( `INSERT INTO cloudflare_resources(instance_id,resource_type,external_id,encrypted_secret) VALUES($1,$2,$3,$4) diff --git a/platform/server/src/worker.ts b/platform/server/src/worker.ts index 5d0265260..0abe79878 100644 --- a/platform/server/src/worker.ts +++ b/platform/server/src/worker.ts @@ -48,6 +48,25 @@ async function resource(instanceId: string, type: string): Promise { + let lastError: unknown; + for (let attempt = 0; attempt < 10; attempt += 1) { + // Cloudflare rejects ordinary Tunnel deletion while a connector is live. + // Cleanup is the documented equivalent of `cloudflared tunnel delete -f`; + // retrying closes the narrow race where an old-token Agent reconnects. + await cloudflare.cleanupTunnelConnections(tunnelId); + try { + await cloudflare.deleteTunnel(tunnelId); + return; + } catch (error) { + lastError = error; + if (!(error instanceof Error) || !error.message.toLowerCase().includes("active connections")) throw error; + await Bun.sleep(500); + } + } + throw lastError ?? new Error("Tunnel deletion failed after connector cleanup"); +} + async function provision(job: Job): Promise { await database.query("UPDATE instances SET status='provisioning',updated_at=now() WHERE id=$1", [job.instance_id]); let tunnelId = await resource(job.instance_id, "tunnel"); @@ -57,10 +76,31 @@ async function provision(job: Job): Promise { tunnelId = tunnel.id; await database.query("UPDATE provisioning_jobs SET step='tunnel_created',updated_at=now() WHERE id=$1", [job.id]); } + const instance = await database.query<{ private_hostname: string; private_origin_ip: string }>( + "SELECT private_hostname,host(private_origin_ip) AS private_origin_ip FROM instances WHERE id=$1", + [job.instance_id], + ); + const destination = instance.rows[0]; + if (!destination) throw new Error("instance not found"); + let dnsRecordId = await resource(job.instance_id, "private_dns"); + if (!dnsRecordId) { + dnsRecordId = await cloudflare.createPrivateDnsRecord(destination.private_hostname, destination.private_origin_ip); + await store.saveCloudflareResource(job.instance_id, "private_dns", dnsRecordId); + await database.query("UPDATE provisioning_jobs SET step='dns_created',updated_at=now() WHERE id=$1", [job.id]); + // Live Phase 0 showed that querying before the zone edge had the new A + // record could cache NXDOMAIN for the SOA negative TTL. Human pairing is + // usually slower, but provisioning must also be safe for automated Agents. + if (config.CLOUDFLARE_MESH_ENABLED === "true") await Bun.sleep(15_000); + } + let cidrRouteId = await resource(job.instance_id, "cidr_activation_route"); + if (!cidrRouteId) { + cidrRouteId = await cloudflare.createCidrActivationRoute(tunnelId, destination.private_origin_ip); + await store.saveCloudflareResource(job.instance_id, "cidr_activation_route", cidrRouteId); + await database.query("UPDATE provisioning_jobs SET step='cidr_route_created',updated_at=now() WHERE id=$1", [job.id]); + } let routeId = await resource(job.instance_id, "hostname_route"); if (!routeId) { - const instance = await database.query<{ private_hostname: string }>("SELECT private_hostname FROM instances WHERE id=$1", [job.instance_id]); - routeId = await cloudflare.createPrivateHostnameRoute(tunnelId, instance.rows[0].private_hostname); + routeId = await cloudflare.createPrivateHostnameRoute(tunnelId, destination.private_hostname); await store.saveCloudflareResource(job.instance_id, "hostname_route", routeId); await database.query("UPDATE provisioning_jobs SET step='route_created',updated_at=now() WHERE id=$1", [job.id]); } @@ -73,12 +113,21 @@ async function deactivateCloudflare(instanceId: string): Promise { await cloudflare.disablePrivateHostnameRoute(routeId); await database.query("UPDATE cloudflare_resources SET disabled_at=now(),deleted_at=now() WHERE instance_id=$1 AND resource_type='hostname_route'", [instanceId]); } + const cidrRouteId = await resource(instanceId, "cidr_activation_route"); + if (cidrRouteId) { + await cloudflare.deleteCidrActivationRoute(cidrRouteId); + await database.query("UPDATE cloudflare_resources SET disabled_at=now(),deleted_at=now() WHERE instance_id=$1 AND resource_type='cidr_activation_route'", [instanceId]); + } + const dnsRecordId = await resource(instanceId, "private_dns"); + if (dnsRecordId) { + await cloudflare.deletePrivateDnsRecord(dnsRecordId); + await database.query("UPDATE cloudflare_resources SET disabled_at=now(),deleted_at=now() WHERE instance_id=$1 AND resource_type='private_dns'", [instanceId]); + } const tunnelId = await resource(instanceId, "tunnel"); if (tunnelId) { - // Deleting the tunnel is the only documented central operation that also - // guarantees every live connector is disconnected. Resume provisions a - // fresh tunnel and token rather than trusting a rotated-but-live connector. - await cloudflare.deleteTunnel(tunnelId); + // Resume provisions a fresh Tunnel and token. Central connector cleanup + // ensures suspend does not depend on the Agent being online or cooperative. + await deleteTunnelAndConnections(tunnelId); await database.query("UPDATE cloudflare_resources SET deleted_at=now(),encrypted_secret=NULL WHERE instance_id=$1 AND resource_type='tunnel'", [instanceId]); } } @@ -103,7 +152,7 @@ async function remove(job: Job): Promise { } async function finish(job: Job): Promise { - await database.query("UPDATE provisioning_jobs SET status='completed',locked_at=NULL,locked_by=NULL,updated_at=now() WHERE id=$1", [job.id]); + await database.query("UPDATE provisioning_jobs SET status='completed',last_error=NULL,locked_at=NULL,locked_by=NULL,updated_at=now() WHERE id=$1", [job.id]); } async function fail(job: Job, error: unknown): Promise { diff --git a/platform/server/tests/cloudflare-live.test.ts b/platform/server/tests/cloudflare-live.test.ts new file mode 100644 index 000000000..508c8c0f9 --- /dev/null +++ b/platform/server/tests/cloudflare-live.test.ts @@ -0,0 +1,54 @@ +import { expect, test } from "bun:test"; +import { CloudflareApi } from "../src/cloudflare"; +import type { PlatformConfig } from "../src/config"; + +const enabled = process.env.CLOUDFLARE_LIVE_TESTS === "true"; +const liveTest = enabled ? test : test.skip; + +liveTest("Cloudflare creates and removes an isolated Tunnel hostname route", async () => { + const accountId = process.env.CLOUDFLARE_ACCOUNT_ID; + const credential = process.env.CLOUDFLARE_API_TOKEN; + const zoneId = process.env.CLOUDFLARE_ZONE_ID; + const privateDomain = process.env.CLOUDFLARE_LIVE_TEST_DOMAIN; + if (!accountId || !credential || !zoneId || !privateDomain) { + throw new Error("Cloudflare live-test account, credential, zone, and private domain are required"); + } + + const api = new CloudflareApi({ + CLOUDFLARE_ACCOUNT_ID: accountId, + CLOUDFLARE_ZONE_ID: zoneId, + CLOUDFLARE_API_BASE_URL: "https://api.cloudflare.com/client/v4", + cloudflareApiToken: credential, + cloudflareAuthEmail: process.env.CLOUDFLARE_AUTH_EMAIL, + } as PlatformConfig); + const suffix = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`; + const tunnel = await api.createTunnel(`ocxr-phase0-api-${suffix}`); + let routeId: string | null = null; + let cidrRouteId: string | null = null; + let dnsRecordId: string | null = null; + try { + expect(tunnel.id).toMatch(/^[0-9a-f-]{36}$/); + expect(tunnel.token.length).toBeGreaterThan(32); + expect(await api.getTunnelToken(tunnel.id)).toBe(tunnel.token); + + const originIp = `10.223.${Math.floor(Math.random() * 256)}.${1 + Math.floor(Math.random() * 254)}`; + const hostname = `phase0-${suffix}.${privateDomain}`; + dnsRecordId = await api.createPrivateDnsRecord(hostname, originIp); + cidrRouteId = await api.createCidrActivationRoute(tunnel.id, originIp); + routeId = await api.createPrivateHostnameRoute(tunnel.id, hostname); + expect(dnsRecordId).toMatch(/^[0-9a-f]{32}$/); + expect(cidrRouteId).toMatch(/^[0-9a-f-]{36}$/); + expect(routeId).toMatch(/^[0-9a-f-]{36}$/); + expect(await api.listActiveConnections(tunnel.id)).toBe(0); + } finally { + const cleanup = await Promise.allSettled([ + ...(routeId ? [api.disablePrivateHostnameRoute(routeId)] : []), + ...(cidrRouteId ? [api.deleteCidrActivationRoute(cidrRouteId)] : []), + ...(dnsRecordId ? [api.deletePrivateDnsRecord(dnsRecordId)] : []), + ]); + await api.cleanupTunnelConnections(tunnel.id); + await api.deleteTunnel(tunnel.id); + const failed = cleanup.find(result => result.status === "rejected"); + if (failed?.status === "rejected") throw failed.reason; + } +}, 30_000); diff --git a/platform/server/tests/cloudflare.test.ts b/platform/server/tests/cloudflare.test.ts new file mode 100644 index 000000000..6570b419b --- /dev/null +++ b/platform/server/tests/cloudflare.test.ts @@ -0,0 +1,92 @@ +import { afterEach, beforeEach, expect, test } from "bun:test"; +import { CloudflareApi } from "../src/cloudflare"; +import type { PlatformConfig } from "../src/config"; + +const originalFetch = globalThis.fetch; +let requests: Array<{ body?: BodyInit | null; headers: Headers; method: string; url: string }>; + +function config(overrides: Partial = {}): PlatformConfig { + return { + CLOUDFLARE_ACCOUNT_ID: "account-id", + CLOUDFLARE_ZONE_ID: "zone-id", + CLOUDFLARE_API_BASE_URL: "https://api.cloudflare.test/client/v4", + cloudflareApiToken: "test-credential", + ...overrides, + } as PlatformConfig; +} + +beforeEach(() => { + requests = []; + globalThis.fetch = (async (input, init = {}) => { + const url = String(input); + const method = init.method ?? "GET"; + requests.push({ body: init.body, headers: new Headers(init.headers), method, url }); + const result = url.endsWith("/token") + ? "tunnel-token" + : { id: "resource-id", token: "created-token" }; + return Response.json({ success: true, errors: [], result }); + }) as typeof fetch; +}); + +afterEach(() => { + globalThis.fetch = originalFetch; +}); + +test("Cloudflare Global API Key uses email/key headers without a bearer token", async () => { + const api = new CloudflareApi(config({ cloudflareAuthEmail: "admin@example.test" })); + expect(await api.createTunnel("phase0")).toEqual({ id: "resource-id", token: "created-token" }); + + const request = requests[0]; + expect(request.headers.get("x-auth-email")).toBe("admin@example.test"); + expect(request.headers.get("x-auth-key")).toBe("test-credential"); + expect(request.headers.get("authorization")).toBeNull(); +}); + +test("Cloudflare scoped token keeps bearer authentication", async () => { + const api = new CloudflareApi(config()); + await api.createPrivateHostnameRoute("tunnel-id", "private.ocxr.internal"); + + const request = requests[0]; + expect(request.headers.get("authorization")).toBe("Bearer test-credential"); + expect(request.headers.get("x-auth-email")).toBeNull(); + expect(request.headers.get("x-auth-key")).toBeNull(); +}); + +test("Tunnel token retrieval uses the current GET endpoint", async () => { + const api = new CloudflareApi(config()); + expect(await api.getTunnelToken("tunnel-id")).toBe("tunnel-token"); + expect(requests[0].method).toBe("GET"); + expect(requests[0].url).toEndWith("/accounts/account-id/cfd_tunnel/tunnel-id/token"); +}); + +test("Tunnel shutdown centrally removes every live connector before deletion", async () => { + const api = new CloudflareApi(config()); + await api.cleanupTunnelConnections("tunnel-id"); + await api.deleteTunnel("tunnel-id"); + + expect(requests[0].method).toBe("DELETE"); + expect(requests[0].url).toEndWith("/accounts/account-id/cfd_tunnel/tunnel-id/connections"); + expect(requests[1].method).toBe("DELETE"); + expect(requests[1].url).toEndWith("/accounts/account-id/cfd_tunnel/tunnel-id"); +}); + +test("private hostname provisioning uses DNS-only A and narrow CIDR routes", async () => { + const api = new CloudflareApi(config()); + expect(await api.createPrivateDnsRecord("random.private.example.test", "10.200.1.9")).toBe("resource-id"); + expect(await api.createCidrActivationRoute("tunnel-id", "10.200.1.9")).toBe("resource-id"); + + expect(requests[0].url).toEndWith("/zones/zone-id/dns_records"); + expect(requests[0].method).toBe("POST"); + expect(JSON.parse(String(requests[0].body))).toMatchObject({ + type: "A", + name: "random.private.example.test", + content: "10.200.1.9", + proxied: false, + }); + expect(requests[1].url).toEndWith("/accounts/account-id/teamnet/routes"); + expect(requests[1].method).toBe("POST"); + expect(JSON.parse(String(requests[1].body))).toMatchObject({ + network: "10.200.1.9/32", + tunnel_id: "tunnel-id", + }); +}); diff --git a/platform/server/tests/postgres-integration.test.ts b/platform/server/tests/postgres-integration.test.ts index 0c32f47c0..480ff3e46 100644 --- a/platform/server/tests/postgres-integration.test.ts +++ b/platform/server/tests/postgres-integration.test.ts @@ -336,7 +336,7 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa ); return state.rows.length === 2 && state.rows.every(row => row.status === "awaiting_agent") - && resources.rows[0]?.count === 4 + && resources.rows[0]?.count === 8 ? true : null; }); diff --git a/remote-agent/src/config.rs b/remote-agent/src/config.rs index 3eb68b654..01047916a 100644 --- a/remote-agent/src/config.rs +++ b/remote-agent/src/config.rs @@ -1,5 +1,6 @@ use std::{ fs, + net::Ipv4Addr, os::unix::fs::PermissionsExt, path::{Path, PathBuf}, }; @@ -32,6 +33,7 @@ pub struct AgentConfig { pub signing_key: String, pub tunnel_token_file: PathBuf, pub gateway: GatewayConfig, + pub private_origin_ip: Ipv4Addr, #[serde(default = "default_opencodex_url")] pub opencodex_url: String, #[serde(default = "default_ingress")] @@ -50,6 +52,7 @@ impl AgentConfig { let bytes = fs::read(path).with_context(|| format!("read {}", path.display()))?; let config: Self = serde_json::from_slice(&bytes).context("parse agent config")?; config.signing_key()?; + config.validate_private_origin_ip()?; Ok(config) } @@ -74,6 +77,17 @@ impl AgentConfig { .map_err(|_| anyhow::anyhow!("signing key must contain 32 bytes"))?; Ok(SigningKey::from_bytes(&seed)) } + + pub fn validate_private_origin_ip(&self) -> Result<()> { + let octets = self.private_origin_ip.octets(); + if octets[0] != 10 || octets[1] < 192 { + anyhow::bail!("private origin IP must be in 10.192.0.0/10"); + } + if self.ingress != format!("{}:10101", self.private_origin_ip) { + anyhow::bail!("ingress must match the assigned private origin IP on port 10101"); + } + Ok(()) + } } pub fn save_secret(path: &Path, value: &str) -> Result<()> { @@ -87,3 +101,45 @@ pub fn save_secret(path: &Path, value: &str) -> Result<()> { fs::set_permissions(path, fs::Permissions::from_mode(0o600))?; Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + fn config(private_origin_ip: Ipv4Addr, ingress: &str) -> AgentConfig { + AgentConfig { + control_plane_url: "https://remote.example.test".into(), + agent_id: "agent".into(), + instance_id: "instance".into(), + signing_key: URL_SAFE_NO_PAD.encode([0_u8; 32]), + tunnel_token_file: "/tmp/tunnel-token".into(), + gateway: GatewayConfig { + issuer: "issuer".into(), + keys: vec![], + }, + private_origin_ip, + opencodex_url: default_opencodex_url(), + ingress: ingress.into(), + } + } + + #[test] + fn private_origin_ip_must_be_reserved_and_match_ingress() { + let allowed = Ipv4Addr::new(10, 223, 1, 9); + assert!( + config(allowed, "10.223.1.9:10101") + .validate_private_origin_ip() + .is_ok() + ); + assert!( + config(Ipv4Addr::new(10, 10, 1, 9), "10.10.1.9:10101") + .validate_private_origin_ip() + .is_err() + ); + assert!( + config(allowed, "127.0.0.1:10101") + .validate_private_origin_ip() + .is_err() + ); + } +} diff --git a/remote-agent/src/control.rs b/remote-agent/src/control.rs index 965f20e1c..9e44e2bdf 100644 --- a/remote-agent/src/control.rs +++ b/remote-agent/src/control.rs @@ -24,6 +24,7 @@ pub struct PairResponse { pub agent_id: String, pub instance_id: String, pub tunnel_token: String, + pub private_origin_ip: String, pub gateway: GatewayConfig, } diff --git a/remote-agent/src/main.rs b/remote-agent/src/main.rs index fae1ab864..b5ef4dd94 100644 --- a/remote-agent/src/main.rs +++ b/remote-agent/src/main.rs @@ -4,7 +4,7 @@ mod control; mod proxy; mod supervisor; -use std::path::PathBuf; +use std::{path::PathBuf, process::Command as ProcessCommand}; use anyhow::{Context, Result}; use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; @@ -42,6 +42,10 @@ enum Command { #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] config: PathBuf, }, + PrepareNetwork { + #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] + config: PathBuf, + }, PrintOpencodexConfig { #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] config: PathBuf, @@ -70,6 +74,10 @@ async fn main() -> Result<()> { } => { let key = SigningKey::from_bytes(&rand::random::<[u8; 32]>()); let paired = control::pair(&control_plane, &code.trim().to_uppercase(), &key).await?; + let private_origin_ip = paired + .private_origin_ip + .parse() + .context("parse private origin IP")?; save_secret(&tunnel_token_file, &paired.tunnel_token)?; AgentConfig { control_plane_url: control_plane, @@ -78,12 +86,13 @@ async fn main() -> Result<()> { signing_key: URL_SAFE_NO_PAD.encode(key.to_bytes()), tunnel_token_file, gateway: paired.gateway, + private_origin_ip, opencodex_url: "http://127.0.0.1:10100".into(), - ingress: "127.0.0.1:10101".into(), + ingress: format!("{private_origin_ip}:10101"), } .save(&config)?; println!( - "Paired successfully. Run `opencodex-remote-agent print-opencodex-config` and merge the displayed remoteAccess block into OpenCodex config." + "Paired successfully. Run `opencodex-remote-agent prepare-network`, then start the Agent and merge the `print-opencodex-config` remoteAccess block into OpenCodex config." ); } Command::PrintOpencodexConfig { config } => { @@ -100,6 +109,20 @@ async fn main() -> Result<()> { }))? ); } + Command::PrepareNetwork { config } => { + let config = AgentConfig::load(&config)?; + let address = format!("{}/32", config.private_origin_ip); + let status = ProcessCommand::new("ip") + .args(["address", "replace", &address, "dev", "lo"]) + .status() + .context("run ip address replace for private origin")?; + if !status.success() { + anyhow::bail!( + "failed to assign private origin IP to loopback; run prepare-network as root" + ); + } + println!("Private origin {address} is ready on loopback."); + } Command::Run { config } => { let config = AgentConfig::load(&config)?; let shutdown = CancellationToken::new(); diff --git a/structure/12_remote-platform.md b/structure/12_remote-platform.md index 12b66bce4..418842834 100644 --- a/structure/12_remote-platform.md +++ b/structure/12_remote-platform.md @@ -20,6 +20,7 @@ OpenCodex Remote는 기존 npm 패키지에 포함되지 않는 별도 중앙 4. Rust Agent는 Gateway assertion을 검증하고 모든 proxy/control header를 정규화한다. 5. OpenCodex management API는 Agent를 신뢰해 생략하지 않고 assertion을 다시 검증한다. 6. Control Plane만 Cloudflare account token을 보유한다. Agent는 자기 Tunnel token만 받는다. +7. Control Plane은 인스턴스별 `10.192.0.0/10` `/32`를 할당한다. Agent는 이 범위와 `10101`의 정확한 조합만 loopback ingress로 허용한다. ## Data flow @@ -28,11 +29,24 @@ public instance hostname → Gateway ownership/session/token check → 30-second Ed25519 request assertion → Mesh private hostname route + → DNS-only private origin A record + narrow /32 activation route → per-instance cloudflared - → Agent assertion/replay/header validation + → Agent loopback alias:10101 assertion/replay/header validation → loopback OpenCodex ``` +### Private origin addressing invariant + +`cloudflared`의 hostname-route 가상 DNS는 `/etc/hosts`의 `127.0.0.1` 매핑을 사용하지 않았고, loopback DNS 답은 Gateway synthetic IP로 변환되지 않았다. 따라서 Control Plane은 추측 불가능한 private hostname에 DNS-only RFC1918 A record를 먼저 만들고, 같은 `/32` CIDR route와 hostname route를 instance Tunnel에 연결한다. Agent는 할당된 `/32`를 `lo`에 추가해 LAN listener 없이 cloudflared가 origin을 해석하고 접속하게 한다. + +[Decision Log] +- 목적과 의도: private hostname routing을 실제 Cloudflare DNS/connector 동작과 일치시키면서 Agent ingress를 LAN에 노출하지 않는다. +- 기존 구현 및 제약 조건: `127.0.0.1` hosts 매핑은 cloudflared virtual DNS에서 NXDOMAIN이었고 hostname route만으로는 Tunnel `warp-routing`이 활성화되지 않았다. +- 검토한 주요 대안: LAN IP에 `0.0.0.0` bind, public Tunnel hostname, custom DNS resolver, RFC1918 loopback alias와 `/32` activation route. +- 선택한 방식: `10.192.0.0/10` 고유 `/32`를 privileged `prepare-network` 단계에서 Agent loopback에 bind하고 DNS record, CIDR route, hostname route를 함께 lifecycle 관리한다. +- 다른 대안 대신 이 방식을 선택한 이유: public origin이나 LAN listener 없이 현재 Cloudflare API와 Mesh data plane에서 종단 연결이 실측 통과했다. +- 장점, 단점 및 영향: origin은 로컬 전용이고 중앙 정책을 우회하지 않지만 인스턴스당 Cloudflare 리소스 네 개와 loopback 주소 관리가 추가된다. Agent runtime 자체는 `CAP_NET_ADMIN`을 보유하지 않는다. + SSE와 HTTP response body는 buffer를 만들지 않고 전달한다. WebSocket은 Gateway와 Agent 두 hop에서 양방향으로 relay한다. 각 hop은 downstream disconnect를 upstream close/abort로 전파해야 한다. ### Streaming lifecycle invariant diff --git a/structure/adr/0012-remote-private-mesh.md b/structure/adr/0012-remote-private-mesh.md index 8ce3a6834..691f23be1 100644 --- a/structure/adr/0012-remote-private-mesh.md +++ b/structure/adr/0012-remote-private-mesh.md @@ -1,7 +1,7 @@ # ADR 0012: Remote access through a central Gateway and private Mesh routes -- Status: proposed, blocked on Phase 0 -- Date: 2026-07-29 +- Status: accepted for implementation; production remains blocked on operating E2E and deployment work +- Date: 2026-07-30 ## Context @@ -11,6 +11,8 @@ OpenCodex Remote must expose a user's loopback OpenCodex GUI, management API, da All instance wildcard DNS enters a central VPS Gateway. The Gateway resolves hostname ownership and lifecycle state from PostgreSQL, authenticates an instance session or `ocxr_` token, signs a 30-second Ed25519 assertion, and routes only to a random private hostname through a Linux Cloudflare Mesh node. Each user server runs one Cloudflare Tunnel into a Rust local ingress. The Agent and OpenCodex management API verify the assertion independently. +Each private hostname has a DNS-only A record under `private.remote.opencodexpages.me` whose value is a unique address from `10.192.0.0/10`. The Agent assigns that `/32` to loopback and listens only on that address at port `10101`. The same `/32` is attached to the instance Tunnel as a narrow CIDR activation route because a hostname route alone did not enable `warp-routing` in the live Cloudflare account. The exact DNS record is not a public application route: Internet clients only receive an unroutable RFC1918 address, while enrolled Mesh traffic receives a synthetic `100.80.0.0/16` address and reaches the dedicated Tunnel. + Cloudflare Access Applications are not used. No public hostname is attached to a user Tunnel. Mesh failure does not authorize a weaker automatic fallback. ## Consequences @@ -20,11 +22,13 @@ Cloudflare Access Applications are not used. No public hostname is attached to a - Negative: Mesh/private hostname routing is Beta and must pass Phase 0 before MVP approval. - Negative: Gateway and Agent must implement careful streaming, cancellation, replay, and header normalization. - Negative: operating the service requires PostgreSQL, three Bun services, central ingress, Mesh, and instance Tunnel lifecycle reconciliation. +- Negative: provisioning and deletion now own four Cloudflare resources per instance: Tunnel, DNS record, `/32` activation route, and hostname route. +- Negative: the DNS record makes the random internal hostname observable only if guessed; its 160-bit random label and lack of a certificate keep it out of ordinary enumeration surfaces. [Decision Log] - 목적과 의도: 사용자 Tunnel을 공개하지 않고 중앙 인증 정책을 강제한다. - 기존 구현 및 제약 조건: OpenCodex GUI와 API는 동일 origin과 장시간 stream/WS를 사용한다. - 검토한 주요 대안: 공개 Tunnel hostname, Cloudflare Access, Workers VPC, 자체 reverse tunnel. -- 선택한 방식: central Gateway + Cloudflare Mesh private hostname + per-instance Tunnel. +- 선택한 방식: central Gateway + Cloudflare Mesh private hostname + DNS-backed RFC1918 loopback origin + per-instance Tunnel. - 다른 대안 대신 이 방식을 선택한 이유: 확정된 private-only 경계와 전체 protocol surface를 동시에 만족하는 후보이기 때문이다. -- 장점, 단점 및 영향: 격리와 정지는 강해지지만 Beta dependency가 생긴다. PoC 불통과 시 ADR을 accepted로 바꾸지 않는다. +- 장점, 단점 및 영향: 격리와 정지는 강해지지만 Beta dependency와 인스턴스당 네 Cloudflare 리소스의 lifecycle이 생긴다. 2026-07-30 live account에서 Mesh HTTP, SSE, WebSocket, 100 MiB 양방향 전송, 30분 stream, Rust Agent 경로와 활성 connector cleanup suspend를 통과했다. From b3f1035e15cfa670bc794adf04875ede3cfb5c1a Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Thu, 30 Jul 2026 05:22:26 +0000 Subject: [PATCH 4/7] Deploy remote central bootstrap --- platform/deploy/mesh/Dockerfile | 15 ++++ platform/deploy/mesh/entrypoint.sh | 22 +++++ .../systemd/opencodex-remote-control.service | 32 +++++++ .../systemd/opencodex-remote-gateway.service | 16 ++++ .../systemd/opencodex-remote-mesh.service | 17 ++++ .../systemd/opencodex-remote-postgres.service | 17 ++++ .../systemd/opencodex-remote-tunnel.service | 21 +++++ .../systemd/opencodex-remote-worker.service | 32 +++++++ platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md | 2 +- platform/docs/IMPLEMENTATION_PLAN.md | 10 ++- platform/docs/IMPLEMENTATION_STATUS.md | 33 +++++-- platform/docs/PRODUCTION_DEPLOYMENT.md | 86 +++++++++++++++++++ platform/server/src/config.ts | 7 +- platform/server/src/gateway.ts | 4 +- platform/web/src/App.tsx | 28 ++++-- platform/web/src/api.ts | 9 ++ 16 files changed, 332 insertions(+), 19 deletions(-) create mode 100644 platform/deploy/mesh/Dockerfile create mode 100644 platform/deploy/mesh/entrypoint.sh create mode 100644 platform/deploy/systemd/opencodex-remote-control.service create mode 100644 platform/deploy/systemd/opencodex-remote-gateway.service create mode 100644 platform/deploy/systemd/opencodex-remote-mesh.service create mode 100644 platform/deploy/systemd/opencodex-remote-postgres.service create mode 100644 platform/deploy/systemd/opencodex-remote-tunnel.service create mode 100644 platform/deploy/systemd/opencodex-remote-worker.service create mode 100644 platform/docs/PRODUCTION_DEPLOYMENT.md diff --git a/platform/deploy/mesh/Dockerfile b/platform/deploy/mesh/Dockerfile new file mode 100644 index 000000000..3d5290aad --- /dev/null +++ b/platform/deploy/mesh/Dockerfile @@ -0,0 +1,15 @@ +FROM ubuntu:24.04 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates curl dbus gnupg iproute2 procps \ + && curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg \ + | gpg --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ noble main" \ + > /etc/apt/sources.list.d/cloudflare-client.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends cloudflare-warp \ + && rm -rf /var/lib/apt/lists/* + +COPY --chmod=0755 entrypoint.sh /usr/local/bin/ocxr-mesh-entrypoint + +ENTRYPOINT ["/usr/local/bin/ocxr-mesh-entrypoint"] diff --git a/platform/deploy/mesh/entrypoint.sh b/platform/deploy/mesh/entrypoint.sh new file mode 100644 index 000000000..6682085ab --- /dev/null +++ b/platform/deploy/mesh/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/sh +set -eu + +TOKEN_FILE=${OCXR_MESH_TOKEN_FILE:-/run/secrets/mesh-token} +STATE_MARKER=/var/lib/cloudflare-warp/.ocxr-mesh-enrolled + +/bin/warp-svc >/var/log/warp-svc.log 2>&1 & +WARP_PID=$! + +for _ in $(seq 1 60); do + if warp-cli --accept-tos status >/dev/null 2>&1; then break; fi + sleep 1 +done + +if [ ! -f "$STATE_MARKER" ]; then + test -s "$TOKEN_FILE" + warp-cli --accept-tos connector new "$(tr -d '\r\n' < "$TOKEN_FILE")" + touch "$STATE_MARKER" +fi + +warp-cli --accept-tos connect +wait "$WARP_PID" diff --git a/platform/deploy/systemd/opencodex-remote-control.service b/platform/deploy/systemd/opencodex-remote-control.service new file mode 100644 index 000000000..f0cf56f7b --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-control.service @@ -0,0 +1,32 @@ +[Unit] +Description=OpenCodex Remote Control Plane +After=network-online.target opencodex-remote-postgres.service +Requires=opencodex-remote-postgres.service +Wants=network-online.target + +[Service] +Type=simple +User=ocxr +Group=ocxr +WorkingDirectory=/opt/opencodex-remote/platform +EnvironmentFile=/etc/opencodex-remote/common.env +LoadCredential=database-url:/etc/opencodex-remote/credentials/database-url-host +LoadCredential=better-auth-secret:/etc/opencodex-remote/credentials/better-auth-secret +LoadCredential=github-client-secret:/etc/opencodex-remote/credentials/github-client-secret +LoadCredential=gateway-ed25519-private-key:/etc/opencodex-remote/credentials/gateway-ed25519-private-key +LoadCredential=platform-encryption-key:/etc/opencodex-remote/credentials/platform-encryption-key +LoadCredential=audit-hmac-key:/etc/opencodex-remote/credentials/audit-hmac-key +LoadCredential=synthetic-health-token:/etc/opencodex-remote/credentials/synthetic-health-token +LoadCredential=cloudflare-api-token:/etc/opencodex-remote/credentials/cloudflare-api-token +LoadCredential=cloudflare-auth-email:/etc/opencodex-remote/credentials/cloudflare-auth-email +ExecStart=/usr/local/bin/bun server/src/control-plane.ts +Restart=always +RestartSec=3 +NoNewPrivileges=true +PrivateTmp=true +ProtectSystem=strict +ProtectHome=true +ReadWritePaths=/var/lib/opencodex-remote + +[Install] +WantedBy=multi-user.target diff --git a/platform/deploy/systemd/opencodex-remote-gateway.service b/platform/deploy/systemd/opencodex-remote-gateway.service new file mode 100644 index 000000000..be1ce93a4 --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-gateway.service @@ -0,0 +1,16 @@ +[Unit] +Description=OpenCodex Remote Streaming Gateway +After=docker.service opencodex-remote-postgres.service opencodex-remote-mesh.service +Requires=docker.service opencodex-remote-postgres.service opencodex-remote-mesh.service + +[Service] +Type=simple +ExecStartPre=-/usr/bin/docker rm ocxr-gateway +ExecStart=/usr/bin/docker run --rm --name ocxr-gateway --network container:ocxr-mesh --user 0:0 --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m --cap-drop ALL --security-opt no-new-privileges --env-file /etc/opencodex-remote/common.env -e CREDENTIALS_DIRECTORY=/run/credentials -v /opt/opencodex-remote/platform:/app:ro -v /etc/opencodex-remote/credentials:/run/credentials:ro -w /app oven/bun:1.3.14 bun server/src/gateway.ts +ExecStop=/usr/bin/docker stop -t 20 ocxr-gateway +Restart=always +RestartSec=5 +TimeoutStopSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/platform/deploy/systemd/opencodex-remote-mesh.service b/platform/deploy/systemd/opencodex-remote-mesh.service new file mode 100644 index 000000000..1271bcd31 --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-mesh.service @@ -0,0 +1,17 @@ +[Unit] +Description=OpenCodex Remote Cloudflare Mesh Node +After=docker.service network-online.target +Requires=docker.service +Wants=network-online.target + +[Service] +Type=simple +ExecStartPre=-/usr/bin/docker rm ocxr-mesh +ExecStart=/usr/bin/docker run --rm --name ocxr-mesh --network ocxr-net --ip 172.30.0.3 --cap-add NET_ADMIN --device /dev/net/tun --sysctl net.ipv4.ip_forward=1 -p 127.0.0.1:10201:10201 -v ocxr-mesh-state:/var/lib/cloudflare-warp -v /etc/opencodex-remote/credentials/mesh-token:/run/secrets/mesh-token:ro opencodex-remote-mesh:2026.07.30 +ExecStop=/usr/bin/docker stop -t 20 ocxr-mesh +Restart=always +RestartSec=5 +TimeoutStopSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/platform/deploy/systemd/opencodex-remote-postgres.service b/platform/deploy/systemd/opencodex-remote-postgres.service new file mode 100644 index 000000000..5ec68e492 --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-postgres.service @@ -0,0 +1,17 @@ +[Unit] +Description=OpenCodex Remote PostgreSQL 17 +After=docker.service network-online.target +Requires=docker.service +Wants=network-online.target + +[Service] +Type=simple +ExecStartPre=-/usr/bin/docker rm ocxr-postgres +ExecStart=/usr/bin/docker run --rm --name ocxr-postgres --network ocxr-net --ip 172.30.0.2 -p 127.0.0.1:15444:5432 -e POSTGRES_USER=ocxr -e POSTGRES_DB=ocxr -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password -v ocxr-postgres-data:/var/lib/postgresql/data -v /etc/opencodex-remote/credentials/postgres-password:/run/secrets/postgres-password:ro postgres:17-alpine +ExecStop=/usr/bin/docker stop -t 30 ocxr-postgres +Restart=always +RestartSec=5 +TimeoutStopSec=40 + +[Install] +WantedBy=multi-user.target diff --git a/platform/deploy/systemd/opencodex-remote-tunnel.service b/platform/deploy/systemd/opencodex-remote-tunnel.service new file mode 100644 index 000000000..eb0f24d60 --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-tunnel.service @@ -0,0 +1,21 @@ +[Unit] +Description=OpenCodex Remote Public Cloudflare Tunnel +After=network-online.target opencodex-remote-control.service opencodex-remote-gateway.service +Requires=opencodex-remote-control.service opencodex-remote-gateway.service +Wants=network-online.target + +[Service] +Type=simple +User=ocxr +Group=ocxr +LoadCredential=tunnel-token:/etc/opencodex-remote/credentials/central-tunnel-token +ExecStart=/usr/local/bin/cloudflared tunnel --no-autoupdate run --token-file ${CREDENTIALS_DIRECTORY}/tunnel-token +Restart=always +RestartSec=5 +NoNewPrivileges=true +PrivateTmp=true +ProtectSystem=strict +ProtectHome=true + +[Install] +WantedBy=multi-user.target diff --git a/platform/deploy/systemd/opencodex-remote-worker.service b/platform/deploy/systemd/opencodex-remote-worker.service new file mode 100644 index 000000000..7c20dbbb6 --- /dev/null +++ b/platform/deploy/systemd/opencodex-remote-worker.service @@ -0,0 +1,32 @@ +[Unit] +Description=OpenCodex Remote Provisioning Worker +After=network-online.target opencodex-remote-postgres.service +Requires=opencodex-remote-postgres.service +Wants=network-online.target + +[Service] +Type=simple +User=ocxr +Group=ocxr +WorkingDirectory=/opt/opencodex-remote/platform +EnvironmentFile=/etc/opencodex-remote/common.env +LoadCredential=database-url:/etc/opencodex-remote/credentials/database-url-host +LoadCredential=better-auth-secret:/etc/opencodex-remote/credentials/better-auth-secret +LoadCredential=github-client-secret:/etc/opencodex-remote/credentials/github-client-secret +LoadCredential=gateway-ed25519-private-key:/etc/opencodex-remote/credentials/gateway-ed25519-private-key +LoadCredential=platform-encryption-key:/etc/opencodex-remote/credentials/platform-encryption-key +LoadCredential=audit-hmac-key:/etc/opencodex-remote/credentials/audit-hmac-key +LoadCredential=synthetic-health-token:/etc/opencodex-remote/credentials/synthetic-health-token +LoadCredential=cloudflare-api-token:/etc/opencodex-remote/credentials/cloudflare-api-token +LoadCredential=cloudflare-auth-email:/etc/opencodex-remote/credentials/cloudflare-auth-email +ExecStart=/usr/local/bin/bun server/src/worker.ts +Restart=always +RestartSec=3 +NoNewPrivileges=true +PrivateTmp=true +ProtectSystem=strict +ProtectHome=true +ReadWritePaths=/var/lib/opencodex-remote + +[Install] +WantedBy=multi-user.target diff --git a/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md b/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md index 198bd9b46..1390fc622 100644 --- a/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md +++ b/platform/docs/CLOUDFLARE_PHASE0_2026-07-30.md @@ -4,7 +4,7 @@ 실제 Cloudflare account와 `opencodexpages.me` zone에서 Linux Cloudflare Mesh node → private hostname route → dedicated Cloudflare Tunnel → RFC1918 origin 경로가 통과했다. 일반 WARP client만이 아니라 central Gateway 역할의 headless Mesh node에서도 확인했다. -Phase 0에서 확정된 private instance domain은 `*.private.remote.opencodexpages.me`다. 사용자 공개 instance domain은 `.remote.opencodexpages.me`로 예약하지만 중앙 public ingress 배포 전에는 wildcard DNS를 만들지 않는다. +Phase 0에서 확정된 private instance domain은 `*.private.remote.opencodexpages.me`다. 2026-07-30 운영 ingress에서는 Cloudflare Universal SSL이 바로 지원하는 `.opencodexpages.me`를 공개 instance domain으로 확정했다. 중첩 wildcard인 `.remote.opencodexpages.me`는 별도 인증서가 필요해 사용하지 않는다. ## 필수 구성 diff --git a/platform/docs/IMPLEMENTATION_PLAN.md b/platform/docs/IMPLEMENTATION_PLAN.md index e13ea420c..f70b02013 100644 --- a/platform/docs/IMPLEMENTATION_PLAN.md +++ b/platform/docs/IMPLEMENTATION_PLAN.md @@ -17,7 +17,7 @@ Browser / CLI - 사용자 Tunnel에는 공개 hostname을 만들지 않는다. - `*.instance-domain`은 언제나 중앙 Gateway로 향한다. - Gateway만 DB의 추측 불가능한 private hostname을 목적지로 사용한다. -- 중앙 시스템은 Docker 없이 Ubuntu 24.04 VPS의 native systemd로 운영한다. +- 중앙 Control Plane과 worker는 전용 `ocxr` 사용자로 native systemd 운영한다. 공유 VPS의 host routing을 보호하기 위해 PostgreSQL, Cloudflare Mesh, Gateway는 별도 Docker network namespace에 격리하고 모두 systemd가 수명주기를 관리한다. - private hostname은 `*.private.remote.opencodexpages.me` DNS-only A record로 인스턴스별 `10.192.0.0/10` `/32`를 가리킨다. - 같은 `/32` CIDR activation route와 hostname route를 dedicated Tunnel에 연결하며, Agent는 그 주소를 `lo`에만 할당한다. @@ -29,6 +29,14 @@ Browser / CLI - 다른 대안 대신 이 방식을 선택한 이유: public service exposure 없이 Mesh synthetic IP와 Tunnel origin resolution이 모두 통과했다. - 장점, 단점 및 영향: provisioning/deletion saga가 네 Cloudflare 리소스를 다룬다. 별도 `prepare-network` 단계만 root 또는 `CAP_NET_ADMIN`이 필요하고 장시간 Agent runtime은 비특권으로 실행한다. +[Decision Log] +- 목적과 의도: 기존 TeamWicked 서비스가 함께 있는 중앙 VPS에 Mesh를 배포하되 host network namespace의 route와 DNS를 바꾸지 않는다. +- 기존 구현 및 제약 조건: 초기 문서는 중앙 구성요소 전체를 native systemd로 가정했지만 Cloudflare Mesh client는 kernel route와 resolver를 관리한다. +- 검토한 주요 대안: host-native Mesh, 별도 VPS, 모든 구성요소의 containerization, Mesh와 Gateway만 network namespace를 공유하는 hybrid 배포. +- 선택한 방식: Control Plane과 worker는 native로 유지하고 PostgreSQL·Mesh·Gateway를 고정 Docker network에 격리하며 systemd가 여섯 서비스를 관리한다. +- 다른 대안 대신 이 방식을 선택한 이유: 기존 VPS의 Cloudflare Tunnels와 management traffic을 변경하지 않으면서 Gateway만 Mesh 경로를 사용할 수 있다. +- 장점, 단점 및 영향: host 영향 범위가 작고 재시작 경계가 명확하지만 Docker가 운영 의존성에 추가되며 Gateway는 Mesh 컨테이너와 함께 재시작해야 한다. + ## 보안 기준 - GitHub OAuth와 24시간 일회용 초대만 허용한다. diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index 7de31a522..cfeea6bd6 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -6,7 +6,7 @@ 기준 브랜치/커밋: `dev` / `67c731e6` -이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증은 완료됐다. 실제 Cloudflare account의 Linux Mesh/private-hostname transport와 Rust Agent 포함 30분 stream은 통과했고, 실제 OpenCodex process 및 public ingress를 포함한 운영 E2E는 아직 완료되지 않았다. +이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증을 완료했고, 2026-07-30 기존 TeamWicked Oracle VPS에 중앙 bootstrap runtime과 `opencodexpages.me` public ingress를 배포했다. 실제 Cloudflare account의 Linux Mesh/private-hostname transport와 Rust Agent 포함 30분 stream은 통과했지만 실제 OpenCodex process를 포함한 public 운영 E2E는 아직 완료되지 않았다. ## 문서와 디자인 자산 @@ -123,13 +123,24 @@ - 실제 Rust Agent 포함 30분 SSE도 rc 0, 1,800초, 정확히 1,800 events로 통과. - 재현 절차와 실패 원인은 [CLOUDFLARE_PHASE0_2026-07-30.md](./CLOUDFLARE_PHASE0_2026-07-30.md)에 기록. +### 중앙 VPS bootstrap 배포 + +- `opencodexpages.me` → dedicated Cloudflare Tunnel → Control Plane/UI `127.0.0.1:10200` 구성. +- `*.opencodexpages.me` → 같은 Tunnel → isolated Mesh namespace의 Gateway `127.0.0.1:10201` 구성 및 Universal SSL 확인. +- `ocxr` 전용 사용자와 systemd 여섯 서비스 추가: PostgreSQL, Control Plane, worker, Mesh, Gateway, public Tunnel. +- PostgreSQL 17, Mesh, Gateway를 `ocxr-net`에 격리해 기존 VPS host routing과 DNS를 보존. +- root-only systemd credentials와 `/etc/opencodex-remote/cloudflare-state.json` 운영 state 구성. +- apex는 exact-email Cloudflare Access OTP로 닫고 내부 numeric GitHub ID bootstrap은 한 명에게만 허용. +- 실제 worker가 테스트 인스턴스의 Tunnel·DNS·CIDR·hostname route 네 리소스를 생성하고 delete saga가 모두 회수하는지 확인. +- public apex health/UI/asset, wildcard TLS와 무자격 `404`, Mesh 연결 상태를 운영 경로에서 확인. +- 실제 리소스 ID와 재시작/점검 절차는 [PRODUCTION_DEPLOYMENT.md](./PRODUCTION_DEPLOYMENT.md)에 기록. + ## 구현 중인 부분 - 실제 Rust Agent와 OpenCodex를 포함한 Gateway WebSocket/client disconnect E2E. - 실제 OpenCodex process를 포함한 E2E와 Gateway 프로세스 재시작 측정. Mesh transport/Rust Agent 30분과 Tunnel 재시작은 완료. - suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. - Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. -- 네이티브 systemd 서비스와 `LoadCredential=` 배포 파일. - UI의 실제 브라우저 시각 QA. 현재 상태는 루트 [design-qa.md](../../design-qa.md)에 기록했다. ## 남은 부분 @@ -145,7 +156,7 @@ ### P1 — 운영 기능 -- native systemd unit 3개와 중앙 `cloudflared`, Linux Mesh node unit 작성. +- [x] native/isolated hybrid systemd unit 여섯 개와 중앙 `cloudflared`, Linux Mesh node 배포. - Agent `amd64`/`arm64` musl release workflow. - Agent binary와 installer의 SHA-256 + Ed25519 detached signature 검증. - suspend 시 hostname/CIDR/DNS를 먼저 제거하고 Cloudflare connector-cleanup API로 모든 연결을 끊은 뒤 Tunnel을 삭제하는 흐름을 실제 활성 Agent에서 확인했다. @@ -154,7 +165,8 @@ - Gateway rate limit, 동시 연결/본문 크기 정책, abuse report/admin UI 추가. - audit 조회·90일 retention job, 일일 암호화 backup, 7일/4주 retention, restore drill 추가. - gateway signing key rotation과 Agent key rotation 구현. -- 실제 인스턴스 domain과 official domain 설정 후 쿠키/OAuth callback 검증. +- [x] public instance domain `*.opencodexpages.me`, apex ingress, wildcard TLS 구성. +- dedicated GitHub OAuth app 생성 후 production callback과 multi-user cookie 경계 검증. 현재는 exact-email Access OTP single-user bootstrap이다. ### P2 — 제품 마감 @@ -171,10 +183,10 @@ - 원 기획서의 Workers VPC/fallback보다 이후 확정안인 Cloudflare Mesh private hostname route가 우선한다. Mesh 실패 시 자동 fallback하지 않는다. - private hostname은 `127.0.0.1` hosts가 아니라 DNS-only RFC1918 A record를 사용한다. Agent `prepare-network`는 구현했지만 installer/systemd의 privileged `ExecStartPre`와 비특권 runtime unit은 아직 미구현이다. - Cloudflare Tunnel, DNS, CIDR route, hostname route create/delete와 token GET 응답 shape를 live account로 검증했다. -- Gateway synthetic token은 별도 systemd credential로 설계했지만 배포 파일은 아직 없다. +- Gateway synthetic token과 signing key를 포함한 credential은 root-only systemd/container credential mount로 배포했다. - Better Auth의 OAuth account에는 GitHub access token이 저장될 수 있다. 운영 전 DB encryption/토큰 최소 보존 정책을 확정해야 한다. - Gateway와 Rust Agent는 100 MiB 양방향 streaming, SSE/WS, 30분 stream을 통과했다. 실제 OpenCodex process와 public ingress를 포함한 부하·backpressure는 아직 측정하지 않았다. -- private `opencodexpages.me` DNS record는 Phase 0에서 검증했다. public wildcard ingress, TLS, official `opencodex.me`와 instance `opencodexpages.me` 쿠키/OAuth 분리는 아직 구성하지 않았다. +- private transport DNS는 Phase 0에서 검증했고 public wildcard ingress와 TLS도 운영 배포에서 확인했다. dedicated GitHub OAuth app이 없어 `opencodex.me`와 `opencodexpages.me`의 production OAuth/cookie 분리는 아직 검증하지 않았다. ## 현재까지 확인된 검증 @@ -202,12 +214,19 @@ PASS cd remote-agent && cargo test 3 Rust unit tests ``` +운영 bootstrap에서 추가로 통과한 항목: + +- systemd 여섯 서비스 enabled/active와 재시작 후 health +- public apex Access redirect, service-token 기반 health/UI/asset 200 검증 후 임시 token/policy 삭제 +- public first-level wildcard TLS와 무자격 404 +- production worker create/delete Cloudflare 리소스 회수 + 아직 통과로 간주하면 안 되는 항목: - 실제 Gateway 프로세스 재시작 측정 - 실제 OpenCodex process와 public ingress를 포함한 HTTP/SSE/WebSocket 운영 E2E - 시각 QA와 접근성 브라우저 QA -- systemd/VPS/backup restore 검증 +- PostgreSQL backup/restore drill ## 다른 컴퓨터에서 재개 diff --git a/platform/docs/PRODUCTION_DEPLOYMENT.md b/platform/docs/PRODUCTION_DEPLOYMENT.md new file mode 100644 index 000000000..f17c1ec6c --- /dev/null +++ b/platform/docs/PRODUCTION_DEPLOYMENT.md @@ -0,0 +1,86 @@ +# OpenCodex Remote central VPS deployment + +The first live deployment uses `opencodexpages.me` on the existing TeamWicked Oracle VPS. + +Deployment date: `2026-07-30` + +## Runtime map + +- `opencodexpages.me` → dedicated Cloudflare Tunnel → Control Plane and built React UI on `127.0.0.1:10200`. +- `*.opencodexpages.me` → the same public Tunnel → Gateway on `127.0.0.1:10201`. +- Control Plane and worker run as the dedicated `ocxr` system user. +- PostgreSQL 17, the isolated Cloudflare Mesh network namespace, and the Gateway run in named Docker containers managed by systemd. +- Per-instance `cloudflared` connectors remain on user servers. The central Gateway is the only component enrolled in Mesh. + +The Gateway shares the Mesh container network namespace. This keeps Cloudflare One routing away from the VPS host namespace, where other TeamWicked Tunnels and management services already run. + +Public instance hostnames use `.opencodexpages.me`. Cloudflare Universal SSL covers this first-level wildcard, while the originally reserved `.remote.opencodexpages.me` would require an additional certificate for a nested wildcard. Private transport names stay under `*.private.remote.opencodexpages.me` because they are DNS-only RFC1918 routing labels and do not terminate public TLS. + +## Bootstrap authentication + +The account does not yet have a dedicated GitHub OAuth application. The apex dashboard is therefore protected by a Cloudflare Access application allowing one exact maintainer email through One-Time PIN. Behind that edge boundary, the Control Plane runs its existing non-production numeric-ID bootstrap path for the same maintainer. + +This is deliberately single-user. Do not add another Access email while numeric-ID bootstrap mode is active because every allowed request would inherit the bootstrap administrator. Before a private beta, create the GitHub OAuth app, remove `PLATFORM_DEV_AUTH_GITHUB_ID`, set `NODE_ENV=production`, and remove or relax the apex Access application as intended. + +The wildcard instance Gateway is not placed behind the apex Access application. It continues to require an instance session or `ocxr_` token and conceals invalid access as `404`. + +## Live inventory + +- Cloudflare account: `ab4c7f382f138fea000f5374481028af` +- zone: `opencodexpages.me` (`967ca131ed9157323b367e4a57ca0c03`) +- central Tunnel: `opencodex-remote-central` (`201b093f-b7e0-4967-abce-48c728f58e15`) +- Mesh node: `opencodex-remote-central-mesh` (`25adb618-d63a-4317-ad69-0093a5d4a3bc`) +- Access app: `b2c11dab-81da-4789-abf2-9a3112ca7941` +- Access policy: `281c1b8c-f71c-47c5-85c7-6aaff0f02660` +- apex DNS record: `8f6c837918e5904eac2ebc9b192d04d7` +- wildcard DNS record: `1e56251e23703d6f1a164b334490adb2` + +The mutable inventory is also stored at `/etc/opencodex-remote/cloudflare-state.json` with mode `0600`. This file contains IDs, not API credentials. + +## Operations + +The six units are: + +```text +opencodex-remote-postgres.service +opencodex-remote-control.service +opencodex-remote-worker.service +opencodex-remote-mesh.service +opencodex-remote-gateway.service +opencodex-remote-tunnel.service +``` + +Check them together with: + +```bash +systemctl is-active opencodex-remote-{postgres,control,worker,mesh,gateway,tunnel} +curl -fsS http://127.0.0.1:10200/healthz +docker exec ocxr-mesh warp-cli --accept-tos status +``` + +Restart Mesh and Gateway as a pair because the Gateway joins the Mesh container network namespace: + +```bash +sudo systemctl restart opencodex-remote-mesh.service +sudo systemctl restart opencodex-remote-gateway.service +``` + +Only `127.0.0.1:10200`, `127.0.0.1:10201`, and `127.0.0.1:15444` are published on the host. Public traffic must enter through the central Tunnel. + +## Validation and cleanup + +The live worker created a disposable instance Tunnel, DNS-only RFC1918 record, `/32` CIDR activation route, and private hostname route. The delete saga marked the instance deleted and removed all four Cloudflare resources. A temporary Access service token used to validate public health/UI/assets was deleted after the test. No validation token or disposable `ocxr-` Tunnel remains. + +An awaiting-Agent private hostname does not synthesize through Gateway until its dedicated Tunnel connector is online. This is expected; the Agent obtains its Tunnel token through the public Control Plane and connects before private Gateway traffic is sent. + +## Secret boundary + +Secrets live under root-owned `/etc/opencodex-remote/credentials`. Native services receive individual files with systemd `LoadCredential=`. Containers receive read-only credential mounts. No credential is committed to the repository or written into the Cloudflare state documentation. + +[Decision Log] +- 목적과 의도: 기존 Oracle VPS를 중앙 서버로 사용하면서 다른 TeamWicked Tunnels와 host routing을 훼손하지 않는다. +- 기존 구현 및 제약 조건: Cloudflare Mesh는 host kernel routing을 바꾸며, 현재 VPS에는 여러 public Tunnel과 관리 서비스가 함께 실행 중이다. 전용 GitHub OAuth app도 아직 없다. +- 검토한 주요 대안: host-native WARP, 별도 VPS, 공개 development auth, isolated Mesh namespace와 apex Access bootstrap. +- 선택한 방식: Mesh와 Gateway만 전용 Docker network namespace에 두고, apex는 exact-email OTP Access로 닫은 single-user bootstrap으로 배포한다. +- 다른 대안 대신 이 방식을 선택한 이유: 현재 VPS의 management traffic을 건드리지 않으며 OAuth app 없이도 무인증 개발 모드를 공개하지 않는다. +- 장점, 단점 및 영향: 즉시 실제 도메인에서 검증할 수 있지만 OAuth 전환 전까지 한 명만 사용할 수 있고, 운영 topology가 완전한 Docker-free 초안과 달라진다. diff --git a/platform/server/src/config.ts b/platform/server/src/config.ts index 410798fa2..68072c732 100644 --- a/platform/server/src/config.ts +++ b/platform/server/src/config.ts @@ -4,7 +4,7 @@ import { z } from "zod"; const envSchema = z.object({ NODE_ENV: z.enum(["development", "test", "production"]).default("development"), - PLATFORM_DATABASE_URL: z.string().min(1), + PLATFORM_DATABASE_URL: z.string().min(1).optional(), PLATFORM_BASE_URL: z.string().url(), PLATFORM_INSTANCE_DOMAIN: z.string().min(3), PLATFORM_PRIVATE_HOSTNAME_DOMAIN: z.string().min(3).default("private.remote.opencodexpages.me"), @@ -13,6 +13,7 @@ const envSchema = z.object({ PLATFORM_GATEWAY_KID: z.string().default("gateway-1"), PLATFORM_CONTROL_PORT: z.coerce.number().int().min(1).max(65535).default(10200), PLATFORM_GATEWAY_PORT: z.coerce.number().int().min(1).max(65535).default(10201), + PLATFORM_GATEWAY_HOST: z.string().default("127.0.0.1"), PLATFORM_DEV_AUTH_GITHUB_ID: z.string().regex(/^\d+$/).optional(), CLOUDFLARE_ACCOUNT_ID: z.string().optional(), CLOUDFLARE_ZONE_ID: z.string().optional(), @@ -36,6 +37,7 @@ function credential(name: string, envValue?: string): string | undefined { } export interface PlatformConfig extends z.infer { + PLATFORM_DATABASE_URL: string; cloudflareApiToken?: string; cloudflareAuthEmail?: string; gatewayPrivateKeyPem: string; @@ -51,10 +53,12 @@ export function loadPlatformConfig(env: NodeJS.ProcessEnv = process.env): Platfo GITHUB_CLIENT_SECRET: credential("github-client-secret", env.GITHUB_CLIENT_SECRET), }); const gatewayPrivateKeyPem = credential("gateway-ed25519-private-key", env.PLATFORM_GATEWAY_PRIVATE_KEY); + const databaseUrl = credential("database-url", env.PLATFORM_DATABASE_URL); const encryptionKeyValue = credential("platform-encryption-key", env.PLATFORM_ENCRYPTION_KEY); const auditHmacValue = credential("audit-hmac-key", env.PLATFORM_AUDIT_HMAC_KEY); const syntheticHealthToken = credential("synthetic-health-token", env.PLATFORM_SYNTHETIC_HEALTH_TOKEN); if (!gatewayPrivateKeyPem) throw new Error("gateway Ed25519 private key credential is required"); + if (!databaseUrl) throw new Error("platform database URL credential is required"); if (!encryptionKeyValue || Buffer.from(encryptionKeyValue, "base64url").length !== 32) { throw new Error("platform encryption key must be 32 base64url-encoded bytes"); } @@ -64,6 +68,7 @@ export function loadPlatformConfig(env: NodeJS.ProcessEnv = process.env): Platfo if (!syntheticHealthToken || syntheticHealthToken.length < 32) throw new Error("synthetic health token is required"); return { ...parsed, + PLATFORM_DATABASE_URL: databaseUrl, cloudflareApiToken: credential("cloudflare-api-token", env.CLOUDFLARE_API_TOKEN), cloudflareAuthEmail: credential("cloudflare-auth-email", env.CLOUDFLARE_AUTH_EMAIL), gatewayPrivateKeyPem, diff --git a/platform/server/src/gateway.ts b/platform/server/src/gateway.ts index f52f22bf7..488b1f2ee 100644 --- a/platform/server/src/gateway.ts +++ b/platform/server/src/gateway.ts @@ -206,7 +206,7 @@ async function authenticate(req: Request): Promise<{ instance: InstanceRecord; u gatewayServer = Bun.serve({ port: config.PLATFORM_GATEWAY_PORT, - hostname: "127.0.0.1", + hostname: config.PLATFORM_GATEWAY_HOST, async fetch(req, server) { const url = new URL(req.url); const host = req.headers.get("host") ?? ""; @@ -307,4 +307,4 @@ gatewayServer = Bun.serve({ }); void listenForRevocations(); -console.log(`OpenCodex Remote gateway listening on 127.0.0.1:${config.PLATFORM_GATEWAY_PORT}`); +console.log(`OpenCodex Remote gateway listening on ${config.PLATFORM_GATEWAY_HOST}:${config.PLATFORM_GATEWAY_PORT}`); diff --git a/platform/web/src/App.tsx b/platform/web/src/App.tsx index 0db62723a..24897a4a9 100644 --- a/platform/web/src/App.tsx +++ b/platform/web/src/App.tsx @@ -6,13 +6,14 @@ import { IconPlus, IconServer2, IconShield, IconTerminal2, IconTrash, IconX, } from "@tabler/icons-react"; import { - createInstance, createPairingCode, deleteInstance, issueToken, listInstances, + createInstance, createPairingCode, deleteInstance, getInstance, issueToken, listInstances, getCurrentUser, openInstance, redeemInvite, suspendInstance, type CurrentUser, type Instance, type InstanceStatus, } from "./api"; import { authClient } from "./auth-client"; type View = "instances" | "activity" | "security" | "new"; +const instanceDomain = import.meta.env.VITE_INSTANCE_DOMAIN ?? "opencodexpages.me"; const statusCopy: Record = { pending: "Pending", provisioning: "Provisioning", awaiting_agent: "Awaiting agent", @@ -57,7 +58,7 @@ function HealthNode({ icon: Icon, title, value, ok = true }: { icon: typeof Icon function Detail({ instance, onChanged }: { instance: Instance; onChanged: () => Promise }) { const [notice, setNotice] = useState(null); - const hostname = `${instance.slug}.${import.meta.env.VITE_INSTANCE_DOMAIN ?? "ocx.run"}`; + const hostname = `${instance.slug}.${instanceDomain}`; const healthy = instance.status === "online"; async function copy(value: string, message: string) { @@ -110,7 +111,7 @@ function Instances({ instances, selected, select, refresh, newInstance }: { inst
NameHostnameStatusLast seen
{instances.map(instance => )} {!instances.length &&
No instances yetCreate a private endpoint for your Linux server.
} @@ -131,6 +132,7 @@ function NewInstance({ onCancel, onCreated }: { onCancel: () => void; onCreated: const [pairing, setPairing] = useState<{ code: string; expiresAt: string } | null>(null); const [seconds, setSeconds] = useState(600); const [error, setError] = useState(null); + const [reserving, setReserving] = useState(false); const command = `curl -fsSL https://install.ocx.run/agent.sh | sudo sh`; useEffect(() => { @@ -141,12 +143,24 @@ function NewInstance({ onCancel, onCreated }: { onCancel: () => void; onCreated: async function reserve() { setError(null); + setReserving(true); try { const created = await createInstance(name, slug); setInstance(created); - const code = await createPairingCode(created.id); + let ready = created; + for (let attempt = 0; attempt < 60 && ready.status !== "awaiting_agent"; attempt += 1) { + await new Promise(resolve => window.setTimeout(resolve, 1_000)); + ready = await getInstance(created.id); + if (["delete_failed", "deleted", "suspended"].includes(ready.status)) { + throw new Error(`Provisioning stopped with status ${ready.status}`); + } + } + if (ready.status !== "awaiting_agent") throw new Error("Provisioning is still running; try again shortly"); + setInstance(ready); + const code = await createPairingCode(ready.id); setPairing(code); setStep(2); } catch (reason) { setError(reason instanceof Error ? reason.message : "Could not create instance"); } + finally { setReserving(false); } } async function verify() { setStep(3); await onCreated(); } const time = `${String(Math.floor(seconds / 60)).padStart(2, "0")}:${String(seconds % 60).padStart(2, "0")}`; @@ -155,12 +169,12 @@ function NewInstance({ onCancel, onCreated }: { onCancel: () => void; onCreated:
; } -export function App() { +function DeviceConnection({ requestId }: { requestId: string }) { + const [request, setRequest] = useState(null); + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + const [approving, setApproving] = useState(false); + const [error, setError] = useState(null); + + async function load() { + setLoading(true); + try { + const next = await getDeviceAuthorizationRequest(requestId); + setRequest(next); + try { setUser(await getCurrentUser()); } catch { setUser(null); } + setError(null); + } catch (reason) { + setError(reason instanceof Error ? reason.message : "Device request unavailable"); + } finally { setLoading(false); } + } + useEffect(() => { void load(); }, [requestId]); + async function signIn() { + await authClient.signIn.social({ provider: "github", callbackURL: window.location.pathname }); + } + async function approve() { + setApproving(true); + try { setRequest(await approveDeviceAuthorizationRequest(requestId)); setError(null); } + catch (reason) { setError(reason instanceof Error ? reason.message : "Could not approve device"); } + finally { setApproving(false); } + } + if (loading) return
Loading device request
; + if (error || !request) return

Device link unavailable

{error ?? "This request does not exist or has expired."}

; + const complete = request.status === "approved" || request.status === "consumed"; + const unavailable = request.status === "expired"; + return
+
opencodexRemote device approval
+ {complete ?

Computer approved

Return to the local ocx gui window. It will finish linking automatically.

+ : unavailable ?

Request expired

Start GitHub sign-in again from ocx gui → Remote.

+ : <>
Connect this computer

{request.deviceName}

Confirm that this code matches the one shown in the local OpenCodex GUI.

+
Device code{request.userCode.match(/.{1,4}/g)?.join(" ")}
+
Platform
{request.platform}
Expires
{new Date(request.expiresAt).toLocaleTimeString()}
+ {!user ? + : <>
GH
{user.name}{user.email}
} + {error &&
{error}
} +

GitHub credentials stay on the service. The local OCX receives only a revocable OpenCodex device credential.

+ } +
; +} + +function CentralLanding() { + return
+
opencodexRemote
+

Remote starts in your local OCX

+

Open ocx gui, choose Remote, and continue with GitHub. This site handles identity and device approval; your computer runs the connector.

+
1

Run ocx gui

2

Open Remote

3

Approve this computer here

+
; +} + +function InstanceAccess({ slug }: { slug: string }) { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + const [password, setPassword] = useState(""); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + void getCurrentUser().then(setUser).catch(() => setUser(null)).finally(() => setLoading(false)); + }, []); + async function signIn() { + await authClient.signIn.social({ provider: "github", callbackURL: window.location.pathname }); + } + async function unlock() { + setBusy(true); + setError(null); + try { + window.location.assign(await accessInstance(slug, password)); + } catch (reason) { + setError(reason instanceof Error ? reason.message : "Could not open Remote"); + } finally { + setBusy(false); + } + } + return
+
opencodexRemote access
+

{slug}.{instanceDomain}

+

Sign in with the GitHub account that owns this computer, then enter its separate Remote password.

+ {loading ?
Checking GitHub session
+ : !user ? + : user.status !== "active" ?
This GitHub account cannot access this Remote instance.
+ : <>
GH
{user.name}{user.email}
+ + } + {error &&
{error}
} +

GitHub confirms account ownership. The Remote password is checked as an Argon2id hash and is never sent to the user computer.

+
; +} + +function AdminDashboard() { const [view, setView] = useState("instances"); const [instances, setInstances] = useState([]); const [selectedId, setSelectedId] = useState(null); @@ -209,7 +307,7 @@ export function App() { } useEffect(() => { void refresh(); }, []); const selected = useMemo(() => instances.find(item => item.id === selectedId) ?? null, [instances, selectedId]); - async function signIn() { await authClient.signIn.social({ provider: "github", callbackURL: "/" }); } + async function signIn() { await authClient.signIn.social({ provider: "github", callbackURL: "/admin" }); } async function acceptInvite() { try { await redeemInvite(invite); await refresh(); } catch (reason) { setError(reason instanceof Error ? reason.message : "Invite rejected"); } @@ -218,3 +316,12 @@ export function App() { {loading ?
Loading instances
: error === "not found" ?

Private access

Sign in with the GitHub account that received an invitation.

: user?.status === "pending_invite" ?

Redeem your invite

Paste the one-time invitation token. It expires 24 hours after it was created.

setInvite(event.target.value)} placeholder="Invitation token" />{error && {error}}
: error ?
{error}
: view === "instances" ? setView("new")} /> : view === "new" ? setView("instances")} onCreated={refresh} /> : } ; } + +export function App() { + const deviceMatch = window.location.pathname.match(/^\/connect\/([0-9a-f-]{36})$/i); + if (deviceMatch) return ; + const accessMatch = window.location.pathname.match(/^\/access\/([a-z0-9-]{1,63})$/i); + if (accessMatch) return ; + if (window.location.pathname !== "/admin") return ; + return ; +} diff --git a/platform/web/src/api.ts b/platform/web/src/api.ts index 753c86143..a39475913 100644 --- a/platform/web/src/api.ts +++ b/platform/web/src/api.ts @@ -41,6 +41,15 @@ export interface CurrentUser { status: "active" | "pending_invite" | "suspended"; } +export interface DeviceAuthorizationRequest { + id: string; + userCode: string; + deviceName: string; + platform: string; + expiresAt: string; + status: "pending" | "approved" | "expired" | "consumed"; +} + async function request(path: string, init?: RequestInit): Promise { const response = await fetch(path, { ...init, @@ -71,6 +80,17 @@ export async function getCurrentUser(): Promise { return (await request<{ user: CurrentUser }>("/api/v1/me")).user; } +export async function getDeviceAuthorizationRequest(id: string): Promise { + return (await request<{ request: DeviceAuthorizationRequest }>(`/api/v1/device-links/${id}`)).request; +} + +export async function approveDeviceAuthorizationRequest(id: string): Promise { + return (await request<{ request: DeviceAuthorizationRequest }>(`/api/v1/device-links/${id}/approve`, { + method: "POST", + body: "{}", + })).request; +} + export async function redeemInvite(token: string): Promise { if (demo) return; await request("/api/v1/invites/redeem", { method: "POST", body: JSON.stringify({ token }) }); @@ -92,9 +112,19 @@ export async function createPairingCode(instanceId: string): Promise<{ code: str return request(`/api/v1/instances/${instanceId}/pairing-code`, { method: "POST", body: "{}" }); } -export async function openInstance(instanceId: string): Promise { +export async function openInstance(instanceId: string, password: string): Promise { if (demo) return "#demo-instance"; - return (await request<{ url: string }>(`/api/v1/instances/${instanceId}/authorize`, { method: "POST", body: "{}" })).url; + return (await request<{ url: string }>(`/api/v1/instances/${instanceId}/authorize`, { + method: "POST", + body: JSON.stringify({ password }), + })).url; +} + +export async function accessInstance(slug: string, password: string): Promise { + return (await request<{ url: string }>(`/api/v1/remote/access/${encodeURIComponent(slug)}`, { + method: "POST", + body: JSON.stringify({ password }), + })).url; } export async function issueToken(instanceId: string): Promise<{ token: string; expiresAt: string }> { diff --git a/platform/web/src/styles.css b/platform/web/src/styles.css index 0390194ae..963c8b9f5 100644 --- a/platform/web/src/styles.css +++ b/platform/web/src/styles.css @@ -75,6 +75,25 @@ h2 { margin: 0; font-size: 22px; letter-spacing: -.35px; } .verify-row { min-height: 82px; border-bottom: 1px solid var(--border); display: grid; grid-template-columns: 56px 1fr auto; align-items: center; gap: 17px; }.verify-row > span { width: 56px; height: 56px; border: 1px solid #4b4d52; border-radius: 50%; display: grid; place-items: center; }.verify-row svg { width: 24px; color: #bfc0c4; }.verify-row em { color: var(--yellow); font-style: normal; font-size: 14px; }.footer-actions { grid-column: 1/-1; border-top: 1px solid var(--border); margin-top: 35px; padding-top: 28px; display: flex; justify-content: flex-end; gap: 16px; }.footer-actions > button:not(.primary) { border: 1px solid #45474c; border-radius: 7px; background: transparent; padding: 0 22px; min-height: 48px; cursor: pointer; }.success-state { min-height: 520px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 15px; }.success-state > svg { width: 58px; height: 58px; color: var(--green); }.success-state p { color: var(--muted); max-width: 510px; } .secondary-card { min-height: 500px; padding: 40px; }.secondary-card > svg { width: 35px; height: 35px; margin-bottom: 20px; }.secondary-card h2 { margin-bottom: 18px; }.secondary-card > p { color: var(--muted); line-height: 1.7; max-width: 700px; }.activity-row { min-height: 66px; display: grid; grid-template-columns: 150px 1fr auto; align-items: center; border-top: 1px solid var(--border); }.activity-row time { color: var(--muted); }.security-note { margin-top: 30px; border: 1px solid var(--border); border-radius: 8px; padding: 19px; display: flex; align-items: center; gap: 13px; }.security-note svg { width: 22px; color: var(--green); } .access-card { min-height: calc(100vh - 60px); display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; gap: 16px; }.access-card > svg { width: 44px; height: 44px; }.access-card p { max-width: 430px; color: var(--muted); }.access-card input { width: min(440px, 90vw); height: 48px; border: 1px solid #44464b; border-radius: 7px; background: var(--panel); color: #f4f4f5; padding: 0 15px; } +.connect-shell { min-height: 100vh; display: grid; place-items: center; padding: 28px 18px; background: radial-gradient(circle at 50% 0, #202329 0, var(--bg) 48%); } +.connect-card { width: min(100%, 520px); border: 1px solid var(--border); border-radius: 14px; padding: 30px; background: #191a1d; box-shadow: 0 24px 70px #0007; } +.connect-card > svg { width: 34px; height: 34px; color: var(--muted); } +.connect-brand { display: flex; align-items: center; gap: 11px; padding-bottom: 25px; border-bottom: 1px solid var(--border-soft); } +.connect-brand img { width: 32px; height: 32px; object-fit: contain; } +.connect-brand div { display: grid; gap: 2px; }.connect-brand strong { font-size: 18px; }.connect-brand span { color: var(--muted); font-size: 13px; } +.connect-card header { padding: 28px 0 20px; }.connect-card header > span { color: var(--green); font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; } +.connect-card h1 { margin-top: 8px; font-size: 26px; }.connect-card header p, .connect-result p, .landing-card > p { color: var(--muted); line-height: 1.65; } +.connect-card code { color: #f3f3f5; background: #25272b; border: 1px solid #383a40; border-radius: 5px; padding: 2px 6px; } +.connect-code { display: grid; gap: 7px; padding: 15px 17px; border: 1px solid #4a4d53; border-radius: 9px; background: #212327; } +.connect-code span { color: var(--muted); font-size: 12px; }.connect-code strong { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 25px; letter-spacing: .08em; } +.connect-facts { margin: 18px 0; }.connect-facts div { display: flex; justify-content: space-between; gap: 18px; padding: 11px 0; border-top: 1px solid var(--border-soft); }.connect-facts dt { color: var(--muted); }.connect-facts dd { margin: 0; text-align: right; } +.connect-action { width: 100%; }.connect-action:disabled { opacity: .6; cursor: progress; } +.connect-account { display: flex; align-items: center; gap: 12px; padding: 13px; margin-bottom: 12px; border: 1px solid var(--border-soft); border-radius: 9px; }.connect-account > div { display: grid; min-width: 0; }.connect-account span:last-child { color: var(--muted); font-size: 13px; overflow: hidden; text-overflow: ellipsis; } +.connect-security { display: flex; align-items: flex-start; gap: 8px; margin: 18px 0 0; color: var(--muted); font-size: 12px; line-height: 1.55; }.connect-security svg { width: 16px; flex: 0 0 auto; } +.connect-result { display: grid; justify-items: center; text-align: center; padding: 46px 0 24px; }.connect-result > svg { width: 52px; height: 52px; color: var(--green); }.connect-result h1 { margin-top: 18px; } +.landing-card { text-align: left; }.landing-icon { display: block; margin: 34px 0 14px; color: var(--green) !important; }.landing-card > h1 { max-width: 410px; }.landing-steps { display: grid; grid-template-columns: 28px 1fr; align-items: center; gap: 9px 12px; margin-top: 25px; }.landing-steps > span { width: 28px; height: 28px; display: grid; place-items: center; border: 1px solid #4b4e54; border-radius: 50%; color: var(--green); font-size: 12px; font-weight: 700; }.landing-steps p { margin: 0; } +.access-instance-card h1 { overflow-wrap: anywhere; }.access-inline { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 18px 0; color: var(--muted); }.access-password { display: grid; gap: 8px; margin: 18px 0 12px; text-align: left; }.access-password span { color: var(--muted); font-size: 13px; font-weight: 650; }.access-password input { width: 100%; height: 48px; border: 1px solid #44464b; border-radius: 7px; background: var(--panel-soft); color: #f4f4f5; padding: 0 15px; } +.spin { animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 1120px) { .instance-layout { grid-template-columns: 1fr; height: auto; }.instance-list { min-height: 350px; }.detail-card { min-height: 720px; }.health-row { gap: 8px; }.table-head, .instance-row { grid-template-columns: 1fr 1.4fr 1fr; }.table-head span:last-child, .instance-row > span:last-child { display: none; } } @media (max-width: 760px) { .app-shell { display: block; }.sidebar { transform: translateX(-100%); transition: transform .18s ease; box-shadow: 10px 0 30px #0008; }.sidebar-open { transform: translateX(0); }.mobile-close { display: grid; position: absolute; right: 10px; top: 10px; border: 0; background: transparent; }.mobile-menu { display: grid; place-items: center; position: absolute; left: 15px; top: 18px; z-index: 3; border: 1px solid var(--border); background: var(--panel); border-radius: 7px; width: 38px; height: 38px; }.mobile-menu svg { width: 20px; }.account > span, .account > svg { display: none; } main { padding: 18px 12px 24px; }.page-header { padding-left: 52px; align-items: center; }.page-header h1 { font-size: 24px; }.account .primary { padding: 0 13px; }.instance-layout { display: block; }.instance-list { margin-bottom: 12px; }.table-head, .instance-row { grid-template-columns: 1fr 1fr; }.table-head span:nth-child(2), .instance-row > span:nth-child(2) { display: none; }.detail-card { padding: 24px 18px; min-height: 0; }.detail-heading { flex-direction: column; }.health-row { grid-template-columns: 1fr 1fr; }.instance-form, .reserved, .install-grid { grid-template-columns: 1fr; }.onboarding-card { padding: 25px 18px; }.verify-column { border-left: 0; border-top: 1px solid var(--border); padding: 28px 0 0; }.install-column { padding-right: 0; }.stepper { margin-top: 14px; }.step strong { font-size: 12px; }.pairing-code { align-items: flex-start; flex-direction: column; padding: 14px; gap: 8px; }.activity-row { grid-template-columns: 120px 1fr; }.activity-row time { display: none; } } diff --git a/readme/README.ja.md b/readme/README.ja.md index fc8fdc020..236c96663 100644 --- a/readme/README.ja.md +++ b/readme/README.ja.md @@ -378,6 +378,14 @@ WebSocket トランスポートはデフォルトでオフです。Codex が HTT ### リモートアクセス +ダッシュボードには中央 `opencodexpages.me` MVP 用の招待制 **Remote** ページがあります。ローカル +`ocx gui` で GitHub からこの PC を承認し、別の Remote パスワードと hostname を設定して +Tunnel/Agent の provisioning 状態を確認します。GitHub OAuth トークンは保存せず PC にも送りません。 +管理者権限が必要な署名済み Linux helper installer と Windows/macOS helper はまだ提供されず、 +一般公開機能ではありません。**Super Sync も含まれません。** + +以下の LAN bind は中央 Remote サービスとは別の自己管理方式です。 + デフォルトで opencodex は `127.0.0.1`(ループバック)にバインドされ、追加の認証は不要です。 `"hostname": "0.0.0.0"` で LAN に公開する場合、opencodex は管理 API(`/api/*`)とデータプレーン (`/v1/responses`、`/v1/images/generations`、`/v1/images/edits`)の両方に bearer トークンを要求します: diff --git a/readme/README.ko.md b/readme/README.ko.md index ddb900a20..ddd7d6a07 100644 --- a/readme/README.ko.md +++ b/readme/README.ko.md @@ -392,6 +392,14 @@ WebSocket 전송은 기본적으로 꺼져 있습니다. Codex가 HTTP/SSE 대 ### 원격 접근 +대시보드에는 중앙 `opencodexpages.me` MVP용 초대형 **Remote** 페이지가 추가됐습니다. 로컬 +`ocx gui`에서 GitHub로 이 PC를 승인하고, 별도 Remote 비밀번호와 hostname을 만든 뒤 +Tunnel/Agent provisioning 상태를 확인합니다. GitHub OAuth 토큰은 저장하거나 PC로 보내지 않습니다. +관리자 권한이 필요한 서명된 Linux helper installer와 Windows/macOS helper는 아직 배포하지 않으므로 +일반 공개 기능이 아니며 **Super Sync는 포함하지 않습니다**. + +아래 LAN bind는 중앙 Remote 서비스와 별개의 자체 관리 방식입니다. + 기본적으로 opencodex는 `127.0.0.1`(루프백)에 바인딩되며 별도 인증이 필요 없습니다. `"hostname": "0.0.0.0"`으로 LAN에 노출할 경우, opencodex는 관리 API(`/api/*`)와 데이터 플레인 (`/v1/responses`, `/v1/images/generations`, `/v1/images/edits`) 모두에 bearer 토큰을 요구합니다: diff --git a/readme/README.ru.md b/readme/README.ru.md index 2f04d0634..b44153146 100644 --- a/readme/README.ru.md +++ b/readme/README.ru.md @@ -415,6 +415,15 @@ JSON обрезан или испорчен вручную), opencodex сохр ### Удалённый доступ +В дашборде появилась пригласительная страница **Remote** для центрального MVP +`opencodexpages.me`. Настройка начинается в локальном `ocx gui`: подтвердите ПК через GitHub, +задайте отдельный пароль Remote и hostname, затем отслеживайте provisioning Tunnel/Agent. +OAuth-токены GitHub не сохраняются и не передаются на ПК. Подписанный Linux helper installer с +правами администратора и помощники Windows/macOS ещё не поставляются; это не общий релиз и +**Super Sync в него не входит**. + +Приведённая ниже LAN-привязка — отдельный самостоятельно управляемый вариант без центрального Remote. + По умолчанию opencodex привязывается к `127.0.0.1` (loopback) и не требует дополнительной аутентификации. Если вы задаёте `"hostname": "0.0.0.0"`, открывая прокси в локальной сети, opencodex требует bearer-токен для защиты как управляющего API (`/api/*`), так и плоскости данных (`/v1/responses`, diff --git a/readme/README.zh-CN.md b/readme/README.zh-CN.md index b4ef7a8de..48dedabee 100644 --- a/readme/README.zh-CN.md +++ b/readme/README.zh-CN.md @@ -372,6 +372,14 @@ WebSocket 传输默认关闭。只有当你希望 Codex 使用 Responses WebSock ### 远程访问 +仪表盘新增了用于中央 `opencodexpages.me` MVP 的邀请制 **Remote** 页面。流程从本地 +`ocx gui` 开始:通过 GitHub 批准此电脑,设置独立 Remote 密码和 hostname,然后跟踪 +Tunnel/Agent 的 provisioning 状态。GitHub OAuth token 不会保存,也不会发送到电脑。 +需要管理员权限的签名 Linux helper installer 以及 Windows/macOS helper 尚未发布,因此这不是 +公开功能,且**不包含 Super Sync**。 + +下面的 LAN bind 是与中央 Remote 服务无关的自托管方式。 + 默认情况下 opencodex 绑定到 `127.0.0.1`(回环)且无需额外认证。 如果你设置 `"hostname": "0.0.0.0"` 把代理暴露到局域网,opencodex 会要求一个 bearer token 来同时保护管理 API(`/api/*`)和数据平面(`/v1/responses`、`/v1/images/generations`、`/v1/images/edits`): diff --git a/src/cli/help.ts b/src/cli/help.ts index 71850d375..fdf601e9c 100644 --- a/src/cli/help.ts +++ b/src/cli/help.ts @@ -175,6 +175,15 @@ const helpEntries: Record = { usage: "ocx system ...", summary: "Manage headless runtime settings, startup, sync, diagnostics, and updates.", }, + remote: { + usage: "ocx remote ...", + summary: "Manage the local-PC-first OpenCodex Remote onboarding flow.", + details: [ + "GitHub sign-in starts with link; status reports the same protected local state as the GUI.", + "Read the Remote password from piped stdin so it never appears in shell history or process arguments.", + "activate reserves one hostname; pairing-code prepares the separately installed signed Linux helper.", + ], + }, config: { usage: "ocx config ...", summary: "Inspect and safely modify validated OpenCodex configuration.", diff --git a/src/cli/index.ts b/src/cli/index.ts index e0e894f4e..6db665dd5 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1050,6 +1050,11 @@ switch (command) { process.exitCode = await handleSystemCommand(args.slice(1)); break; } + case "remote": { + const { handleRemoteCommand } = await import("./remote-command"); + process.exitCode = await handleRemoteCommand(args.slice(1)); + break; + } case "config": { const { handleConfigCommand } = await import("./config-command"); process.exitCode = await handleConfigCommand(args.slice(1)); diff --git a/src/cli/remote-command.ts b/src/cli/remote-command.ts new file mode 100644 index 000000000..56d0df1cc --- /dev/null +++ b/src/cli/remote-command.ts @@ -0,0 +1,103 @@ +import { + CliUsageError, + printData, + readSecretLine, + rejectArgs, + runCliAction, + runtimeRequest, + summaryLines, + takeFlag, + takeOption, + type RuntimeApiDeps, +} from "./runtime-api"; + +const USAGE = `Usage: + ocx remote [status] [--json] + ocx remote link [--json] + printf '%s\\n' '' | ocx remote password [--json] + ocx remote activate --name --slug [--json] + ocx remote pairing-code [--json] + ocx remote disconnect --yes [--json]`; + +async function readStatus(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + rejectArgs(args, USAGE); + const result = await runtimeRequest("/api/remote/status", {}, deps); + printData(result, wantsJson, summaryLines(result)); +} + +async function link(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + rejectArgs(args, USAGE); + const result = await runtimeRequest>("/api/remote/link", { method: "POST" }, deps); + printData(result, wantsJson, [ + `Device code: ${String(result.userCode ?? "-")}`, + `Approve in browser: ${String(result.authorizeUrl ?? "-")}`, + ]); +} + +async function password(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + rejectArgs(args, USAGE, { redactValues: true }); + const value = await readSecretLine(deps, "Remote password"); + if (value.length < 10 || value.length > 128) throw new CliUsageError("Remote password must be 10 to 128 characters", USAGE); + const result = await runtimeRequest("/api/remote/password", { + method: "PUT", + body: JSON.stringify({ password: value }), + }, deps); + printData(result, wantsJson, ["Remote password updated. Existing browser sessions were revoked."]); +} + +async function activate(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + const name = takeOption(args, "--name"); + const slug = takeOption(args, "--slug"); + rejectArgs(args, USAGE); + if (!name || !slug) throw new CliUsageError("activate requires --name and --slug", USAGE); + const result = await runtimeRequest("/api/remote/activate", { + method: "POST", + body: JSON.stringify({ name, slug }), + }, deps); + printData(result, wantsJson, summaryLines(result)); +} + +async function pairingCode(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + rejectArgs(args, USAGE); + const result = await runtimeRequest>("/api/remote/pairing-code", { method: "POST" }, deps); + printData(result, wantsJson, [ + `One-time pairing code: ${String(result.code ?? "-")}`, + `Expires: ${String(result.expiresAt ?? "-")}`, + ]); +} + +async function disconnect(argv: string[], deps: RuntimeApiDeps): Promise { + const args = [...argv]; + const wantsJson = takeFlag(args, "--json"); + const yes = takeFlag(args, "--yes"); + rejectArgs(args, USAGE); + if (!yes) throw new CliUsageError("disconnect requires --yes", USAGE); + const result = await runtimeRequest("/api/remote/device", { method: "DELETE" }, deps); + printData(result, wantsJson, ["This computer was disconnected from OpenCodex Remote."]); +} + +/** Headless parity for the local Remote page; every action uses the same management API. */ +export async function handleRemoteCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise { + return runCliAction(async () => { + const [sub = "status", ...rest] = argv; + if (sub === "status") await readStatus(rest, deps); + else if (sub === "link") await link(rest, deps); + else if (sub === "password") await password(rest, deps); + else if (sub === "activate") await activate(rest, deps); + else if (sub === "pairing-code" || sub === "pair") await pairingCode(rest, deps); + else if (sub === "disconnect") await disconnect(rest, deps); + else throw new CliUsageError(`unknown remote command ${sub}`, USAGE); + }); +} + +export const REMOTE_USAGE = USAGE; diff --git a/src/remote/client.ts b/src/remote/client.ts new file mode 100644 index 000000000..04336dc42 --- /dev/null +++ b/src/remote/client.ts @@ -0,0 +1,396 @@ +import { generateKeyPairSync } from "node:crypto"; +import { arch, hostname, platform } from "node:os"; +import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs"; +import { join } from "node:path"; +import { z } from "zod"; +import { + atomicWriteFile, + backupInvalidConfig, + getConfigDir, + hardenConfigDir, + hardenExistingSecret, +} from "../config"; + +const DEFAULT_CONTROL_PLANE_URL = "https://opencodexpages.me"; +const REMOTE_STATE_VERSION = 1; +const REMOTE_REQUEST_TIMEOUT_MS = 15_000; +const MAX_REMOTE_RESPONSE_BYTES = 256 * 1024; + +const remoteInstanceSchema = z.object({ + id: z.string().uuid(), + name: z.string(), + slug: z.string(), + status: z.enum([ + "pending", "provisioning", "awaiting_agent", "connecting", "online", "degraded", "offline", + "suspending", "suspended", "deleting", "delete_failed", "deleted", + ]), + publicUrl: z.string().url(), +}); + +const pendingStateSchema = z.object({ + version: z.literal(REMOTE_STATE_VERSION), + state: z.literal("pending"), + controlPlaneUrl: z.string().url(), + privateKeyPem: z.string().min(1), + linkId: z.string().uuid(), + pollSecret: z.string().startsWith("ocxr_device_"), + userCode: z.string().min(4).max(32), + authorizeUrl: z.string().url(), + expiresAt: z.string().datetime(), +}); + +const connectedStateSchema = z.object({ + version: z.literal(REMOTE_STATE_VERSION), + state: z.literal("connected"), + controlPlaneUrl: z.string().url(), + privateKeyPem: z.string().min(1), + deviceId: z.string().uuid(), + deviceToken: z.string().startsWith("ocxr_device_"), + account: z.object({ + name: z.string(), + email: z.string().email(), + githubNumericId: z.string().regex(/^\d+$/), + }), + passwordSet: z.boolean().default(false), + canActivate: z.boolean().default(false), + instance: remoteInstanceSchema.nullable().default(null), +}); + +const remoteStateSchema = z.discriminatedUnion("state", [pendingStateSchema, connectedStateSchema]); +type RemoteState = z.infer; + +export type RemoteStatus = + | { state: "signed_out"; controlPlaneUrl: string; serviceReachable: boolean; error?: string } + | { + state: "pending"; + controlPlaneUrl: string; + serviceReachable: boolean; + authorizeUrl: string; + userCode: string; + expiresAt: string; + error?: string; + } + | { + state: "connected"; + controlPlaneUrl: string; + serviceReachable: boolean; + deviceId: string; + account: { name: string; email: string; githubNumericId: string }; + passwordSet: boolean; + canActivate: boolean; + instance: z.infer | null; + error?: string; + }; + +interface RemoteClientDependencies { + fetchImpl?: typeof fetch; + controlPlaneUrl?: string; + deviceName?: string; + devicePlatform?: string; +} + +interface RemoteJsonRequest { + method?: "GET" | "POST" | "PUT" | "DELETE"; + body?: unknown; + headers?: Record; +} + +function remoteStatePath(): string { + return join(getConfigDir(), "remote.json"); +} + +function configuredControlPlaneUrl(override?: string): string { + const candidate = override ?? process.env.OPENCODEX_REMOTE_CONTROL_URL ?? DEFAULT_CONTROL_PLANE_URL; + const url = new URL(candidate); + const localDevelopment = url.protocol === "http:" && (url.hostname === "127.0.0.1" || url.hostname === "localhost"); + if (url.protocol !== "https:" && !localDevelopment) throw new Error("remote control plane must use HTTPS"); + url.pathname = ""; + url.search = ""; + url.hash = ""; + return url.toString().replace(/\/$/, ""); +} + +function readState(): RemoteState | null { + const path = remoteStatePath(); + hardenConfigDir(); + if (!existsSync(path)) return null; + try { + hardenExistingSecret(path); + return remoteStateSchema.parse(JSON.parse(readFileSync(path, "utf8"))); + } catch { + backupInvalidConfig(path); + return null; + } +} + +function writeState(state: RemoteState): void { + const directory = getConfigDir(); + if (!existsSync(directory)) mkdirSync(directory, { recursive: true, mode: 0o700 }); + hardenConfigDir(); + atomicWriteFile(remoteStatePath(), `${JSON.stringify(state, null, 2)}\n`); +} + +function clearState(): void { + try { unlinkSync(remoteStatePath()); } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } +} + +function safeError(error: unknown): string { + if (error instanceof Error && error.message) return error.message.slice(0, 240); + return "remote service unavailable"; +} + +async function remoteJson( + baseUrl: string, + path: string, + request: RemoteJsonRequest, + fetchImpl: typeof fetch, +): Promise { + const target = new URL(path, `${baseUrl}/`); + if (target.origin !== new URL(baseUrl).origin) throw new Error("remote request origin mismatch"); + const response = await fetchImpl(target, { + method: request.method ?? "GET", + redirect: "error", + signal: AbortSignal.timeout(REMOTE_REQUEST_TIMEOUT_MS), + headers: { + accept: "application/json", + ...(request.body === undefined ? {} : { "content-type": "application/json" }), + ...request.headers, + }, + body: request.body === undefined ? undefined : JSON.stringify(request.body), + }); + const declaredLength = Number(response.headers.get("content-length") ?? "0"); + if (Number.isFinite(declaredLength) && declaredLength > MAX_REMOTE_RESPONSE_BYTES) { + throw new Error("remote response is too large"); + } + const text = await response.text(); + if (text.length > MAX_REMOTE_RESPONSE_BYTES) throw new Error("remote response is too large"); + let body: unknown = {}; + try { body = text ? JSON.parse(text) : {}; } catch { throw new Error(`remote service returned HTTP ${response.status}`); } + if (!response.ok) { + const message = body && typeof body === "object" && "error" in body && typeof body.error === "string" + ? body.error + : `remote service returned HTTP ${response.status}`; + throw new Error(message); + } + return body as T; +} + +function publicStatus(state: RemoteState, serviceReachable: boolean, error?: string): RemoteStatus { + if (state.state === "pending") { + return { + state: "pending", + controlPlaneUrl: state.controlPlaneUrl, + serviceReachable, + authorizeUrl: state.authorizeUrl, + userCode: state.userCode, + expiresAt: state.expiresAt, + ...(error ? { error } : {}), + }; + } + return { + state: "connected", + controlPlaneUrl: state.controlPlaneUrl, + serviceReachable, + deviceId: state.deviceId, + account: state.account, + passwordSet: state.passwordSet, + canActivate: state.canActivate, + instance: state.instance, + ...(error ? { error } : {}), + }; +} + +/** + * [Decision Log] + * - 목적과 의도: local dashboard가 GitHub token이나 Cloudflare account credential을 받지 않고 중앙 계정에 현재 PC만 연결한다. + * - 기존 구현 및 제약 조건: OCX management API는 loopback GUI session 경계가 이미 있고 remote platform은 별도 Agent pairing만 제공했다. + * - 검토한 주요 대안: localhost OAuth callback으로 GitHub token 전달, URL fragment에 장기 token 전달, one-time polling secret을 가진 device authorization. + * - 선택한 방식: local OCX가 Ed25519 key와 polling secret을 생성·보관하고 브라우저는 중앙의 request UUID와 확인 코드만 본다. + * - 다른 대안 대신 이 방식을 선택한 이유: 중앙 OAuth와 local management credential이 섞이지 않고 브라우저 history 및 referrer에 장기 secret이 남지 않는다. + * - 장점, 단점 및 영향: `ocx gui`가 실제 onboarding 시작점이 되며 장치별 폐기가 가능하다. `remote.json`은 새 장기 secret 파일이므로 기존 config hardening과 atomic write를 반드시 유지한다. + */ +export async function startRemoteLink(deps: RemoteClientDependencies = {}): Promise { + const existing = readState(); + if (existing?.state === "connected") return publicStatus(existing, true); + const controlPlaneUrl = configuredControlPlaneUrl(deps.controlPlaneUrl); + const { privateKey, publicKey } = generateKeyPairSync("ed25519"); + const privateKeyPem = privateKey.export({ type: "pkcs8", format: "pem" }).toString(); + const publicKeyDer = publicKey.export({ type: "spki", format: "der" }); + const response = await remoteJson<{ + id: string; + pollSecret: string; + userCode: string; + authorizeUrl: string; + expiresAt: string; + }>(controlPlaneUrl, "/api/v1/device-links", { + method: "POST", + body: { + deviceName: (deps.deviceName ?? hostname()).slice(0, 80) || "OpenCodex device", + platform: deps.devicePlatform ?? `${platform()}-${arch()}`, + publicKey: Buffer.from(publicKeyDer).toString("base64url"), + }, + }, deps.fetchImpl ?? fetch); + const authorizeUrl = new URL(response.authorizeUrl); + if (authorizeUrl.origin !== new URL(controlPlaneUrl).origin) throw new Error("remote authorization origin mismatch"); + const state = pendingStateSchema.parse({ + version: REMOTE_STATE_VERSION, + state: "pending", + controlPlaneUrl, + privateKeyPem, + linkId: response.id, + pollSecret: response.pollSecret, + userCode: response.userCode, + authorizeUrl: authorizeUrl.toString(), + expiresAt: response.expiresAt, + }); + writeState(state); + return publicStatus(state, true); +} + +export async function getRemoteStatus(deps: RemoteClientDependencies = {}): Promise { + const state = readState(); + const controlPlaneUrl = state?.controlPlaneUrl ?? configuredControlPlaneUrl(deps.controlPlaneUrl); + if (!state) return { state: "signed_out", controlPlaneUrl, serviceReachable: true }; + const fetchImpl = deps.fetchImpl ?? fetch; + try { + if (state.state === "pending") { + if (new Date(state.expiresAt).getTime() <= Date.now()) { + clearState(); + return { state: "signed_out", controlPlaneUrl, serviceReachable: true, error: "device authorization expired" }; + } + const result = await remoteJson<{ + status: "pending" | "approved" | "expired" | "consumed"; + deviceId?: string; + deviceToken?: string; + user?: { name: string; email: string; githubNumericId: string }; + }>(controlPlaneUrl, `/api/v1/device-links/${state.linkId}`, { + headers: { "x-ocxr-link-secret": state.pollSecret }, + }, fetchImpl); + if (result.status === "expired" || result.status === "consumed") { + clearState(); + return { state: "signed_out", controlPlaneUrl, serviceReachable: true, error: "device authorization expired" }; + } + if (result.status === "approved") { + const connected = connectedStateSchema.parse({ + version: REMOTE_STATE_VERSION, + state: "connected", + controlPlaneUrl, + privateKeyPem: state.privateKeyPem, + deviceId: result.deviceId, + deviceToken: result.deviceToken, + account: result.user, + passwordSet: false, + canActivate: false, + instance: null, + }); + writeState(connected); + await remoteJson(controlPlaneUrl, `/api/v1/device-links/${state.linkId}/ack`, { + method: "POST", + headers: { "x-ocxr-link-secret": state.pollSecret }, + }, fetchImpl); + return getRemoteStatus(deps); + } + return publicStatus(state, true); + } + + const result = await remoteJson<{ profile: { + passwordSet: boolean; + canActivate: boolean; + instance: z.infer | null; + } }>( + controlPlaneUrl, + "/api/v1/remote/profile", + { headers: { authorization: `Bearer ${state.deviceToken}` } }, + fetchImpl, + ); + const instance = result.profile.instance ? remoteInstanceSchema.parse(result.profile.instance) : null; + if ( + state.passwordSet !== result.profile.passwordSet + || state.canActivate !== result.profile.canActivate + || JSON.stringify(state.instance) !== JSON.stringify(instance) + ) { + const refreshed = { + ...state, + passwordSet: result.profile.passwordSet, + canActivate: result.profile.canActivate, + instance, + }; + writeState(refreshed); + return publicStatus(refreshed, true); + } + return publicStatus(state, true); + } catch (error) { + return publicStatus(state, false, safeError(error)); + } +} + +export async function cancelRemoteLink(): Promise { + const state = readState(); + const controlPlaneUrl = state?.controlPlaneUrl ?? configuredControlPlaneUrl(); + if (state?.state === "pending") clearState(); + return { state: "signed_out", controlPlaneUrl, serviceReachable: true }; +} + +export async function setRemotePassword(password: string, deps: RemoteClientDependencies = {}): Promise { + if (password.length < 10 || password.length > 128) throw new Error("remote password must be 10 to 128 characters"); + const state = readState(); + if (!state || state.state !== "connected") throw new Error("remote account is not connected"); + await remoteJson(state.controlPlaneUrl, "/api/v1/remote/password", { + method: "PUT", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: { password }, + }, deps.fetchImpl ?? fetch); + const updated = { ...state, passwordSet: true }; + writeState(updated); + return publicStatus(updated, true); +} + +export async function activateRemoteInstance( + name: string, + slug: string, + deps: RemoteClientDependencies = {}, +): Promise { + const state = readState(); + if (!state || state.state !== "connected") throw new Error("remote account is not connected"); + const result = await remoteJson<{ profile: { + passwordSet: boolean; + canActivate: boolean; + instance: z.infer; + } }>(state.controlPlaneUrl, "/api/v1/remote/activate", { + method: "POST", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: { name, slug }, + }, deps.fetchImpl ?? fetch); + const updated = connectedStateSchema.parse({ ...state, ...result.profile }); + writeState(updated); + return publicStatus(updated, true); +} + +export async function createRemotePairingCode(deps: RemoteClientDependencies = {}): Promise<{ + code: string; + expiresAt: string; +}> { + const state = readState(); + if (!state || state.state !== "connected") throw new Error("remote account is not connected"); + return remoteJson(state.controlPlaneUrl, "/api/v1/remote/pairing-code", { + method: "POST", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: {}, + }, deps.fetchImpl ?? fetch); +} + +export async function disconnectRemoteDevice(deps: RemoteClientDependencies = {}): Promise { + const state = readState(); + const controlPlaneUrl = state?.controlPlaneUrl ?? configuredControlPlaneUrl(deps.controlPlaneUrl); + if (!state) return { state: "signed_out", controlPlaneUrl, serviceReachable: true }; + if (state.state === "connected") { + await remoteJson(state.controlPlaneUrl, "/api/v1/devices/current", { + method: "DELETE", + headers: { authorization: `Bearer ${state.deviceToken}` }, + }, deps.fetchImpl ?? fetch); + } + clearState(); + return { state: "signed_out", controlPlaneUrl, serviceReachable: true }; +} diff --git a/src/server/management-api.ts b/src/server/management-api.ts index ccf9e1908..eb5ee2d49 100644 --- a/src/server/management-api.ts +++ b/src/server/management-api.ts @@ -65,6 +65,7 @@ import { handleAgentSettingsRoutes } from "./management/agent-settings-routes"; import { handleOauthAccountRoutes } from "./management/oauth-account-routes"; import { handleComboRoutes } from "./management/combo-routes"; import { handleSystemRoutes } from "./management/system-routes"; +import { handleRemoteRoutes } from "./management/remote-routes"; import type { ManagementContext } from "./management/context"; export type { ManagementApiDeps } from "./management/context"; import { fetchAllModels } from "./management/shared"; @@ -130,6 +131,7 @@ export async function handleManagementAPI(req: Request, url: URL, config: OcxCon ?? (await handleAgentSettingsRoutes(ctx)) ?? (await handleOauthAccountRoutes(ctx)) ?? (await handleComboRoutes(ctx)) + ?? (await handleRemoteRoutes(ctx)) ?? (await handleSystemRoutes(ctx)); if (routed) return routed; diff --git a/src/server/management/remote-routes.ts b/src/server/management/remote-routes.ts new file mode 100644 index 000000000..4e2ee05ac --- /dev/null +++ b/src/server/management/remote-routes.ts @@ -0,0 +1,67 @@ +import { + activateRemoteInstance, + cancelRemoteLink, + createRemotePairingCode, + disconnectRemoteDevice, + getRemoteStatus, + setRemotePassword, + startRemoteLink, +} from "../../remote/client"; +import { jsonResponse } from "../auth-cors"; +import type { ManagementContext } from "./context"; + +function errorMessage(error: unknown): string { + return error instanceof Error ? error.message : "remote request failed"; +} + +export async function handleRemoteRoutes(ctx: ManagementContext): Promise { + const { req, url, config } = ctx; + if (url.pathname === "/api/remote/status" && req.method === "GET") { + return jsonResponse(await getRemoteStatus(), 200, req, config); + } + if (url.pathname === "/api/remote/link" && req.method === "POST") { + try { + return jsonResponse(await startRemoteLink(), 201, req, config); + } catch (error) { + return jsonResponse({ error: errorMessage(error) }, 400, req, config); + } + } + if (url.pathname === "/api/remote/link/cancel" && req.method === "POST") { + return jsonResponse(await cancelRemoteLink(), 200, req, config); + } + if (url.pathname === "/api/remote/password" && req.method === "PUT") { + try { + const body = await req.json() as { password?: unknown }; + if (typeof body.password !== "string") throw new Error("remote password is required"); + return jsonResponse(await setRemotePassword(body.password), 200, req, config); + } catch (error) { + return jsonResponse({ error: errorMessage(error) }, 400, req, config); + } + } + if (url.pathname === "/api/remote/activate" && req.method === "POST") { + try { + const body = await req.json() as { name?: unknown; slug?: unknown }; + if (typeof body.name !== "string" || typeof body.slug !== "string") { + throw new Error("remote name and domain are required"); + } + return jsonResponse(await activateRemoteInstance(body.name, body.slug), 202, req, config); + } catch (error) { + return jsonResponse({ error: errorMessage(error) }, 400, req, config); + } + } + if (url.pathname === "/api/remote/pairing-code" && req.method === "POST") { + try { + return jsonResponse(await createRemotePairingCode(), 201, req, config); + } catch (error) { + return jsonResponse({ error: errorMessage(error) }, 409, req, config); + } + } + if (url.pathname === "/api/remote/device" && req.method === "DELETE") { + try { + return jsonResponse(await disconnectRemoteDevice(), 200, req, config); + } catch (error) { + return jsonResponse({ error: errorMessage(error) }, 502, req, config); + } + } + return null; +} diff --git a/structure/05_gui-and-management-api.md b/structure/05_gui-and-management-api.md index 0e038fde0..02da7dcd6 100644 --- a/structure/05_gui-and-management-api.md +++ b/structure/05_gui-and-management-api.md @@ -63,6 +63,7 @@ be treated as implemented: | Providers | Create/update/delete ordinary provider configs and enrich registry metadata. The reserved `openai` card exposes Pool(default)/Direct account mode; `openai-apikey` remains the separate API route. | | Models | Fetch routed model lists, disabled model visibility, and catalog-facing ids. | | OAuth | Login/status/logout for OAuth-backed providers, plus multiauth account management: `GET /api/oauth/accounts`, `PUT /api/oauth/accounts/active`, `PUT /api/oauth/accounts/alias`, `DELETE /api/oauth/accounts` list masked accounts per provider, switch the active one, edit its display-only alias, and remove one. Login accepts `addAccount: true` to force a fresh browser identity. Device flows return a structured `deviceCode`; the GUI highlights and copies it before the user opens the verification page. | +| Remote | `GET /api/remote/status`, `POST /api/remote/link`, `PUT /api/remote/password`, `POST /api/remote/activate`, `POST /api/remote/pairing-code`, and `DELETE /api/remote/device` own the local-PC-first Remote flow. The browser DTO never includes the device polling secret, device token, or GitHub token. Central provisioning state is mirrored into protected `remote.json`; the Agent remains a separately installed privileged helper. | | Key providers | Expose API-key provider presets for setup and dashboard flows. Multi-key pool per key-auth provider: `GET /api/providers/keys`, `POST /api/providers/keys`, `PUT /api/providers/keys/active`, `PUT /api/providers/keys/alias`, `DELETE /api/providers/keys` masked list, add (upsert + activate), switch, rename, and remove keys. `provider.apiKey` always mirrors the active pool entry so routing stays single-key. | | OpenAI account mode | Report one OpenAI Codex card with Pool/Direct controls and one API-key card. Mode PATCH persists live without restart or catalog identity changes; Pool owns account/quota controls and Direct uses caller/main login only. Main-account DTOs report real credential presence and terminal `needsReauth` state instead of treating missing/invalid native auth as an unknown quota. | | Subagents | Read/write the featured `subagentModels` list capped at five ids. `GET/PUT /api/injection-model` manages the shared delegation model/effort selection, the independent OpenCodex guidance switch, and the default-off `syncCodexSubagentDefaults` opt-in for native Codex subagent defaults. When OpenCodex owns the active Codex routing, native `[agents]` defaults apply to newly created Codex tasks after sync/restart; external user-managed provider configs remain untouched. The defaults do not cause delegation and preserve existing user-owned defaults rather than overwriting them. PUT is partial-update: absent keys are unchanged, `null` clears, and non-object bodies are rejected with 400 before field validation. `syncCodexSubagentDefaults: true` requires a nonblank `model` and a supported Codex reasoning effort when effort is set; clearing `model` (null/empty) always clears effort and disables native-default sync even when the stored effort was invalid. | @@ -86,6 +87,30 @@ User aliases are display metadata only. Codex pool aliases live on `CodexAccount identity, active selection, and routing never consult these fields. The matching CLI is `ocx account alias ` (`rename` is accepted as a synonym). +## Remote onboarding boundary + +`/#remote` is the user entrypoint. The local proxy creates an Ed25519 device key and a ten-minute +polling secret, while the central browser receives only the request UUID and comparison code. After +GitHub approval, the central service returns a revocable OpenCodex device token through that polling +channel and deletes the encrypted handoff after the local ACK. GitHub OAuth access, refresh, and ID +tokens are discarded by the central auth database hooks and never enter `remote.json`. + +The separate Remote password is Argon2id-hashed by the central service. Changing it revokes existing +instance browser sessions. Five failed attempts lock verification for 15 minutes. An unauthenticated +top-level request to an active instance hostname redirects to `/access/` on the central origin; +API and WebSocket requests still fail closed without redirection. Successful GitHub ownership and +password verification creates a 60-second exchange code and then a host-only instance cookie. + +```text +[Decision Log] +- 목적과 의도: 중앙 운영 콘솔이 아니라 각 사용자 PC의 `ocx gui`에서 Remote 설정을 시작하고, 원격 접속에는 GitHub 소유권과 별도 비밀번호를 모두 요구한다. +- 기존 구현 및 제약 조건: 기존 플랫폼 dashboard는 instance 생성과 Agent code를 직접 다뤘고 일반 npm OCX와 중앙 OAuth 사이의 장치 승인 상태가 없었다. +- 검토한 주요 대안: localhost OAuth callback으로 GitHub token 전달, 장기 token을 URL fragment에 포함, polling secret이 분리된 device authorization과 중앙 password gate. +- 선택한 방식: local device authorization, 중앙 GitHub identity-only OAuth, Argon2id password, hostname별 exchange session을 결합한다. +- 다른 대안 대신 이 방식을 선택한 이유: GitHub/Cloudflare credential이 사용자 브라우저 history나 PC로 이동하지 않으며 각 PC와 instance session을 따로 폐기할 수 있다. +- 장점, 단점 및 영향: Tailscale과 유사한 local-first UX와 중앙 정책 경계가 생긴다. 다만 privileged signed Agent installer가 배포되기 전에는 Linux helper pairing이 수동 private-MVP 단계로 남는다. +``` + ## Sidebar stop button The dashboard sidebar includes a stop button that calls `POST /api/stop`. The button shows a diff --git a/structure/12_remote-platform.md b/structure/12_remote-platform.md index 418842834..4d04046ad 100644 --- a/structure/12_remote-platform.md +++ b/structure/12_remote-platform.md @@ -1,6 +1,6 @@ # OpenCodex Remote platform boundary -OpenCodex Remote는 기존 npm 패키지에 포함되지 않는 별도 중앙 플랫폼과 Linux Agent다. +OpenCodex Remote는 npm OpenCodex의 로컬 GUI/device client, 별도 중앙 플랫폼, 그리고 별도 설치하는 Linux Agent로 구성된다. ## Repository boundary @@ -8,9 +8,24 @@ OpenCodex Remote는 기존 npm 패키지에 포함되지 않는 별도 중앙 - `platform/web/` — React/Vite private dashboard. - `platform/server/migrations/` — Better Auth와 platform schema. - `remote-agent/` — Rust local ingress, pairing, heartbeat, cloudflared supervisor. +- `src/remote/` + `src/server/management/remote-routes.ts` — 보호된 local device state와 `ocx gui` Remote API. - `src/server/remote-assertion.ts` — 기존 OpenCodex `/api/*`의 defense-in-depth verifier. -루트 `package.json#files`에는 `platform/`과 `remote-agent/`를 추가하지 않는다. npm으로 설치되는 일반 OpenCodex 사용자는 중앙 서비스나 Agent source를 패키지 payload로 받지 않는다. +루트 `package.json#files`에는 `platform/`과 `remote-agent/`를 추가하지 않는다. npm으로 설치되는 일반 OpenCodex 사용자는 local Remote page/client는 받지만 중앙 서비스나 privileged Agent source를 package payload로 받지 않는다. + +## Local-first user flow + +```text +ocx gui → Remote + → local device key + one-time polling secret + → opencodexpages.me GitHub OAuth and device-code approval + → separate Remote password + → reserve .opencodexpages.me and provision four Cloudflare resources + → pair signed Linux Agent + → instance hostname → GitHub ownership + Remote password → host-only session +``` + +GitHub is identity-only. Better Auth may need the OAuth token during the callback, but account create/update hooks discard access, refresh, and ID tokens before database persistence. The local PC receives only a revocable `ocxr_device_` token. Open signup is an explicit `PLATFORM_SIGNUP_MODE=open` deployment choice; the production bootstrap remains `private` while the signed helper and abuse controls are unfinished. ## Trust boundaries @@ -68,6 +83,8 @@ Gateway의 HTTP 요청 추적 수명은 upstream `fetch()`가 헤더를 반환 - Remote assertion: 중앙 Gateway가 발급하고 Agent와 OpenCodex가 검증하는 `/api/*` 관리 자격증명. - `ocxr_` data token: instance-scoped `/v1/*` 입장 자격증명. OpenCodex origin에는 전달하지 않는다. - Instance session: browser가 authorization code를 교환해 얻는 host-only cookie. 공식 세션은 origin에 전달하지 않는다. +- Remote device token: local `remote.json`에만 저장되는 `ocxr_device_` credential. GitHub token이 아니며 현재 PC 단위로 폐기한다. +- Remote password: 중앙 Argon2id hash. GitHub session과 별개로 instance browser session 발급 전에 확인하며 5회 실패 시 15분 잠근다. [Decision Log] - 목적과 의도: 개인 서버의 OpenCodex 전체 GUI/API/stream을 포트 공개 없이 안전하게 원격 제공한다. diff --git a/structure/adr/0012-remote-private-mesh.md b/structure/adr/0012-remote-private-mesh.md index 691f23be1..b1dc06d94 100644 --- a/structure/adr/0012-remote-private-mesh.md +++ b/structure/adr/0012-remote-private-mesh.md @@ -1,6 +1,6 @@ # ADR 0012: Remote access through a central Gateway and private Mesh routes -- Status: accepted for implementation; production remains blocked on operating E2E and deployment work +- Status: accepted and central runtime deployed; public multi-user release remains blocked on signed Agent delivery and final operating E2E - Date: 2026-07-30 ## Context @@ -15,6 +15,8 @@ Each private hostname has a DNS-only A record under `private.remote.opencodexpag Cloudflare Access Applications are not used. No public hostname is attached to a user Tunnel. Mesh failure does not authorize a weaker automatic fallback. +The onboarding control surface is the local `ocx gui`, not the central instance dashboard. A ten-minute device authorization binds the PC key to a GitHub identity without returning GitHub credentials. Users set an additional Argon2id Remote password and reserve one hostname. Browser entry to that hostname redirects only top-level HTML navigation to the central access page; API and WebSocket failures remain concealed. The central page requires both the owning GitHub session and the Remote password before issuing a short-lived hostname exchange code. + ## Consequences - Positive: one policy enforcement point, hidden instance existence, immediate DB-first suspension, no inbound user-server port. diff --git a/tests/cli-headless-parity.test.ts b/tests/cli-headless-parity.test.ts index 78b030a85..77b9defec 100644 --- a/tests/cli-headless-parity.test.ts +++ b/tests/cli-headless-parity.test.ts @@ -9,6 +9,7 @@ import { handleConfigCommand } from "../src/cli/config-command"; import { handleGrokCommand } from "../src/cli/integrations"; import { handleModelsRuntimeCommand } from "../src/cli/models-runtime"; import { handleProviderRuntimeCommand } from "../src/cli/provider-runtime"; +import { handleRemoteCommand } from "../src/cli/remote-command"; type Recorded = { path: string; method: string; body: unknown }; const servers: Array> = []; @@ -60,6 +61,7 @@ describe("headless GUI parity CLI", () => { ["/api/oauth", "ocx account"], ["/api/providers/keys", "ocx account"], ["/api/providers", "ocx provider"], + ["/api/remote", "ocx remote"], ["/api/provider-", "ocx provider/models"], ["/api/selected-models", "ocx models"], ["/api/custom-models", "ocx models"], @@ -178,4 +180,16 @@ describe("headless GUI parity CLI", () => { rmSync(home, { recursive: true, force: true }); } }); + + test("remote activation and pairing reuse the local GUI management routes", async () => { + const runtime = fakeRuntime((req) => new URL(req.url).pathname === "/api/remote/pairing-code" + ? { code: "ABCD2345EFGH", expiresAt: "2030-01-01T00:00:00.000Z" } + : undefined); + expect(await handleRemoteCommand(["activate", "--name", "Home PC", "--slug", "home-pc", "--json"], runtime.deps)).toBe(0); + expect(await handleRemoteCommand(["pairing-code", "--json"], runtime.deps)).toBe(0); + expect(runtime.requests).toEqual([ + { path: "/api/remote/activate", method: "POST", body: { name: "Home PC", slug: "home-pc" } }, + { path: "/api/remote/pairing-code", method: "POST", body: null }, + ]); + }); }); diff --git a/tests/remote-client.test.ts b/tests/remote-client.test.ts new file mode 100644 index 000000000..3efa2a2df --- /dev/null +++ b/tests/remote-client.test.ts @@ -0,0 +1,141 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { mkdtempSync, readFileSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { + activateRemoteInstance, + createRemotePairingCode, + disconnectRemoteDevice, + getRemoteStatus, + setRemotePassword, + startRemoteLink, +} from "../src/remote/client"; + +const CONTROL = "http://127.0.0.1:19991"; +let temporaryHome = ""; +let previousHome: string | undefined; + +beforeEach(() => { + temporaryHome = mkdtempSync(join(tmpdir(), "ocx-remote-client-")); + previousHome = process.env.OPENCODEX_HOME; + process.env.OPENCODEX_HOME = temporaryHome; +}); + +afterEach(() => { + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + rmSync(temporaryHome, { recursive: true, force: true }); +}); + +describe("local Remote device authorization", () => { + test("links a device without exposing polling or device secrets in the management DTO", async () => { + let pollCount = 0; + let passwordUpdated = false; + let instanceActivated = false; + let deviceRevoked = false; + const deviceToken = `ocxr_device_${"d".repeat(43)}`; + const pollSecret = `ocxr_device_${"p".repeat(43)}`; + const fetchImpl: typeof fetch = async (input, init) => { + const url = new URL(String(input)); + if (url.pathname === "/api/v1/device-links" && init?.method === "POST") { + return Response.json({ + id: "11111111-1111-4111-8111-111111111111", + pollSecret, + userCode: "ABCD2345", + authorizeUrl: `${CONTROL}/connect/11111111-1111-4111-8111-111111111111`, + expiresAt: new Date(Date.now() + 600_000).toISOString(), + }, { status: 201 }); + } + if (url.pathname === "/api/v1/device-links/11111111-1111-4111-8111-111111111111" && init?.method === "GET") { + pollCount += 1; + return pollCount === 1 + ? Response.json({ status: "pending" }) + : Response.json({ + status: "approved", + deviceId: "22222222-2222-4222-8222-222222222222", + deviceToken, + user: { name: "Octo User", email: "octo@example.test", githubNumericId: "12345" }, + }); + } + if (url.pathname.endsWith("/ack") && init?.method === "POST") return Response.json({ ok: true }); + if (url.pathname === "/api/v1/remote/profile" && init?.method === "GET") { + expect(init?.headers).toMatchObject({ authorization: `Bearer ${deviceToken}` }); + return Response.json({ profile: { + passwordSet: passwordUpdated, + canActivate: true, + instance: instanceActivated ? { + id: "33333333-3333-4333-8333-333333333333", + name: "Test PC", + slug: "test-pc", + status: "awaiting_agent", + publicUrl: "https://test-pc.opencodexpages.me", + } : null, + } }); + } + if (url.pathname === "/api/v1/remote/password" && init?.method === "PUT") { + passwordUpdated = true; + return Response.json({ ok: true }); + } + if (url.pathname === "/api/v1/remote/activate" && init?.method === "POST") { + instanceActivated = true; + return Response.json({ profile: { + passwordSet: true, + canActivate: true, + instance: { + id: "33333333-3333-4333-8333-333333333333", + name: "Test PC", + slug: "test-pc", + status: "pending", + publicUrl: "https://test-pc.opencodexpages.me", + }, + } }, { status: 202 }); + } + if (url.pathname === "/api/v1/remote/pairing-code" && init?.method === "POST") { + return Response.json({ code: "ABCD2345EFGH", expiresAt: new Date(Date.now() + 600_000).toISOString() }, { status: 201 }); + } + if (url.pathname === "/api/v1/devices/current" && init?.method === "DELETE") { + deviceRevoked = true; + return Response.json({ ok: true }); + } + return Response.json({ error: "unexpected request" }, { status: 500 }); + }; + + const started = await startRemoteLink({ fetchImpl, controlPlaneUrl: CONTROL, deviceName: "Test PC", devicePlatform: "linux-x64" }); + expect(started).toMatchObject({ state: "pending", userCode: "ABCD2345", serviceReachable: true }); + expect(JSON.stringify(started)).not.toContain(pollSecret); + expect(readFileSync(join(temporaryHome, "remote.json"), "utf8")).toContain(pollSecret); + + expect(await getRemoteStatus({ fetchImpl })).toMatchObject({ state: "pending" }); + const connected = await getRemoteStatus({ fetchImpl }); + expect(connected).toMatchObject({ + state: "connected", + account: { name: "Octo User", githubNumericId: "12345" }, + passwordSet: false, + }); + expect(JSON.stringify(connected)).not.toContain(deviceToken); + + expect(await setRemotePassword("a-strong-remote-password", { fetchImpl })).toMatchObject({ + state: "connected", + passwordSet: true, + }); + expect(passwordUpdated).toBe(true); + expect(await activateRemoteInstance("Test PC", "test-pc", { fetchImpl })).toMatchObject({ + state: "connected", + instance: { slug: "test-pc", status: "pending" }, + }); + expect(await createRemotePairingCode({ fetchImpl })).toMatchObject({ code: "ABCD2345EFGH" }); + expect(await disconnectRemoteDevice({ fetchImpl })).toMatchObject({ state: "signed_out" }); + expect(deviceRevoked).toBe(true); + }); + + test("rejects an authorization URL on a different origin", async () => { + const fetchImpl: typeof fetch = async () => Response.json({ + id: "11111111-1111-4111-8111-111111111111", + pollSecret: `ocxr_device_${"p".repeat(43)}`, + userCode: "ABCD2345", + authorizeUrl: "https://attacker.example/connect/request", + expiresAt: new Date(Date.now() + 600_000).toISOString(), + }, { status: 201 }); + await expect(startRemoteLink({ fetchImpl, controlPlaneUrl: CONTROL })).rejects.toThrow("authorization origin mismatch"); + }); +}); From eca8bc4f796c43a3898ea213346a9c5e3b04f028 Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Thu, 30 Jul 2026 15:24:51 +0000 Subject: [PATCH 6/7] feat(remote): add outbound encrypted workspace relay --- bun.lock | 3 + gui/src/i18n/de.ts | 8 + gui/src/i18n/en.ts | 42 +- gui/src/i18n/ja.ts | 8 + gui/src/i18n/ko.ts | 42 +- gui/src/i18n/ru.ts | 8 + gui/src/i18n/zh.ts | 8 + gui/src/pages/Remote.tsx | 65 +- gui/src/styles.css | 11 +- package.json | 1 + platform/bun.lock | 4 + platform/docs/IMPLEMENTATION_PLAN.md | 2 + platform/docs/IMPLEMENTATION_STATUS.md | 29 +- platform/docs/PRODUCTION_DEPLOYMENT.md | 2 +- platform/package.json | 2 + .../migrations/0003_outbound_e2ee_relay.sql | 70 ++ platform/server/src/app.ts | 104 ++- platform/server/src/config.ts | 5 + platform/server/src/gateway.ts | 349 +++++++- platform/server/src/store.ts | 509 ++++++++++- .../server/tests/postgres-integration.test.ts | 209 ++++- platform/vite.config.ts | 2 + platform/web/src/App.tsx | 22 +- platform/web/src/Workspace.tsx | 239 +++++ platform/web/src/api.ts | 46 +- platform/web/src/e2ee.ts | 312 +++++++ platform/web/src/styles.css | 41 + remote-agent/Cargo.lock | 422 ++++++++- remote-agent/Cargo.toml | 6 + remote-agent/src/main.rs | 15 + remote-agent/src/relay.rs | 828 ++++++++++++++++++ src/remote/agent.ts | 187 ++++ src/remote/client.ts | 237 ++++- src/remote/e2ee.ts | 195 +++++ src/server/management/remote-routes.ts | 36 +- structure/12_remote-platform.md | 137 ++- structure/adr/0012-remote-private-mesh.md | 2 +- .../adr/0013-remote-outbound-e2ee-relay.md | 52 ++ tests/remote-client.test.ts | 24 +- tests/remote-e2ee.test.ts | 35 + 40 files changed, 4072 insertions(+), 247 deletions(-) create mode 100644 platform/server/migrations/0003_outbound_e2ee_relay.sql create mode 100644 platform/web/src/Workspace.tsx create mode 100644 platform/web/src/e2ee.ts create mode 100644 remote-agent/src/relay.rs create mode 100644 src/remote/agent.ts create mode 100644 src/remote/e2ee.ts create mode 100644 structure/adr/0013-remote-outbound-e2ee-relay.md create mode 100644 tests/remote-e2ee.test.ts diff --git a/bun.lock b/bun.lock index 7da1b7b91..3fead0905 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,7 @@ "dependencies": { "@bufbuild/protobuf": "^2.12.0", "@modelcontextprotocol/sdk": "^1", + "@noble/hashes": "2.2.0", "bun": "1.3.14", "zod": "4.4.3", }, @@ -29,6 +30,8 @@ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Omj20SuiHBOUjUBIyqtkNjSUIjOtEOJwmbix/ZyFH4BaQ6OZTaaRWIR4TjHVz0yadHgli6lLTiAh1uarnvD49A=="], "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-FFj3QdU/OhlDyZOJ8CWfN5eWLpRlT4qjZg7lMQi7jA6GuoY5ajlO1zWLP/MuHYRSbXQUvV52RejNi8DVnAp13w=="], diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 432399402..0054405d6 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -88,6 +88,14 @@ export const de: Record = { "remote.disconnect": "Trennen", "remote.disconnectConfirm": "Diesen Computer von OpenCodex Remote trennen?", "remote.disconnectFailed": "Dieses Gerät konnte nicht widerrufen werden.", + "remote.devicesTitle": "Gekoppelte Computer", + "remote.devicesBody": "Jeder Computer hält eine ausgehende verschlüsselte Relay-Verbindung. Eingehende Ports oder Routereinstellungen sind nicht erforderlich.", + "remote.changePasswordTitle": "Verschlüsselungspasswort ändern", + "remote.changePasswordBody": "Das alte Passwort ist erforderlich. Der Tresor wird lokal neu verschlüsselt, bevor der Server die neue Hülle erhält.", + "remote.currentPassword": "Aktuelles Passwort", + "remote.newPassword": "Neues Passwort", + "remote.confirmNewPassword": "Neues Passwort bestätigen", + "remote.changePassword": "Passwort ändern", "theme.label": "Design", "theme.light": "Hell", "theme.dark": "Dunkel", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index e0cd20c73..b5d2f0226 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -22,34 +22,34 @@ export const en = { "common.loading": "Loading…", "common.retry": "Retry", "remote.title": "Remote", - "remote.subtitle": "Connect this OpenCodex installation to your account, then reach its local GUI through a private Cloudflare Tunnel.", + "remote.subtitle": "Connect this OpenCodex installation to your account, then use its encrypted terminals from your Remote address.", "remote.refresh": "Refresh Remote status", "remote.progressLabel": "Remote setup progress", - "remote.stepAccount": "GitHub account", + "remote.stepAccount": "OpenCodex account", "remote.stepPassword": "Access password", - "remote.stepTunnel": "Tunnel", + "remote.stepTunnel": "Computer link", "remote.loading": "Loading Remote status…", "remote.loadFailed": "Could not load Remote status.", "remote.signedOutTitle": "Connect this computer", - "remote.signedOutBody": "Sign in through the OpenCodex service. GitHub verifies your identity; this local OCX receives only an OpenCodex device credential.", - "remote.signIn": "Continue with GitHub", + "remote.signedOutBody": "Connect this computer through OpenCodex Remote. This local OCX receives only a revocable OpenCodex device credential.", + "remote.signIn": "Connect Remote", "remote.starting": "Starting…", "remote.identityTitle": "Identity stays central", "remote.identityBody": "The service handles GitHub OAuth and never sends your GitHub token to this computer.", "remote.deviceTitle": "One credential per device", "remote.deviceBody": "This OCX creates its own device key and can be revoked without signing out your other computers.", "remote.tunnelTitle": "No inbound port", - "remote.tunnelBody": "Remote traffic will enter through Cloudflare Tunnel instead of exposing your home or office network.", + "remote.tunnelBody": "This computer opens one outbound WSS connection. No router port or inbound firewall rule is required.", "remote.startFailed": "Could not start GitHub sign-in.", "remote.cancelFailed": "Could not cancel device sign-in.", "remote.pendingTitle": "Approve this computer in your browser", - "remote.pendingBody": "Finish GitHub sign-in on opencodexpages.me and confirm that the code shown there matches this local code.", + "remote.pendingBody": "Approve this computer on opencodexpages.me and confirm that the code shown there matches this local code.", "remote.codeLabel": "Device code", "remote.openBrowser": "Open sign-in page", "remote.waiting": "Waiting for browser approval…", "remote.connectedAs": "Connected as", "remote.passwordTitle": "Create a Remote access password", - "remote.passwordBody": "This password protects remote browser access and is separate from your GitHub password.", + "remote.passwordBody": "This separate password encrypts your Remote vault locally with Argon2id and AES-GCM.", "remote.passwordLabel": "Remote password", "remote.passwordConfirm": "Confirm password", "remote.passwordLength": "Use at least 10 characters.", @@ -62,7 +62,7 @@ export const en = { "remote.privateBetaTitle": "Private beta access required", "remote.privateBetaBody": "This account is connected, but Remote activation is still invite-only on this server.", "remote.domainTitle": "Choose this computer's address", - "remote.domainBody": "OpenCodex will provision the private Tunnel and reserve one opencodexpages.me address for this PC.", + "remote.domainBody": "Reserve one account Remote address, then register this computer under a unique name.", "remote.deviceNameLabel": "Computer name", "remote.deviceNamePlaceholder": "Home PC", "remote.domainLabel": "Remote address", @@ -71,25 +71,33 @@ export const en = { "remote.activateFailed": "Could not activate Remote for this computer.", "remote.activating": "Reserving address…", "remote.activate": "Enable Remote", - "remote.provisioningTitle": "Creating the private Tunnel", - "remote.provisioningBody": "The central service is reserving the address and creating this PC's isolated Cloudflare resources.", - "remote.connectorTitle": "Connect the local helper", - "remote.connectorBody": "The address is ready. Pair the signed Linux helper that keeps the local OCX and Cloudflare Tunnel connected.", + "remote.provisioningTitle": "Creating the Remote workspace", + "remote.provisioningBody": "The central service is reserving the account address and registering this computer.", + "remote.connectorTitle": "Start the local connector", + "remote.connectorBody": "The address is ready. Start the signed, unprivileged Agent that maintains one outbound encrypted relay connection.", "remote.pairingCode": "One-time pairing code", "remote.pairingFailed": "Could not prepare connector pairing.", "remote.preparingConnector": "Preparing…", - "remote.prepareConnector": "Prepare connector", - "remote.connectorRequirement": "Current private MVP: the signed Linux helper must be installed with administrator approval. Windows and macOS helpers are not shipped yet.", + "remote.prepareConnector": "Start connector", + "remote.connectorRequirement": "The connector runs as your current user and needs no root access or port forwarding. A signed binary for this platform must be installed with OCX.", "remote.connectingTitle": "Connecting this computer", "remote.connectingBody": "The helper is paired. Waiting for the local OCX, Agent, Tunnel, and Gateway checks to pass.", "remote.readyTitle": "Remote is online", - "remote.readyBody": "This computer's local OpenCodex GUI is available through its authenticated address.", - "remote.openRemote": "Open Remote GUI", + "remote.readyBody": "This computer's shell, Codex CLI, and Claude Code are available through the end-to-end encrypted Remote workspace.", + "remote.openRemote": "Open Remote workspace", "remote.unavailableTitle": "Remote needs attention", "remote.unavailableBody": "This instance is suspended or could not be provisioned. Refresh the status or contact the operator.", "remote.disconnect": "Disconnect", "remote.disconnectConfirm": "Disconnect this computer from OpenCodex Remote?", "remote.disconnectFailed": "Could not revoke this device.", + "remote.devicesTitle": "Paired computers", + "remote.devicesBody": "Each computer keeps one outbound encrypted relay connection. No inbound port or router setting is required.", + "remote.changePasswordTitle": "Change encryption password", + "remote.changePasswordBody": "The old password is required. The vault is re-encrypted locally before the server receives the new envelope.", + "remote.currentPassword": "Current password", + "remote.newPassword": "New password", + "remote.confirmNewPassword": "Confirm new password", + "remote.changePassword": "Change password", "app.logoAria": "opencodex logo", "app.claudeOn": "Claude ON", "app.claudeOff": "Claude OFF", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 9d2ea550f..85dc0f5cb 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -90,6 +90,14 @@ export const ja: Record = { "remote.disconnect": "接続解除", "remote.disconnectConfirm": "この PC を OpenCodex Remote から切断しますか?", "remote.disconnectFailed": "このデバイスを解除できませんでした。", + "remote.devicesTitle": "ペアリング済みコンピューター", + "remote.devicesBody": "各コンピューターは暗号化されたアウトバウンド Relay 接続を1本だけ維持します。受信ポートやルーター設定は不要です。", + "remote.changePasswordTitle": "暗号化パスワードを変更", + "remote.changePasswordBody": "以前のパスワードが必要です。新しい封筒をサーバーへ送る前に、保管庫をローカルで再暗号化します。", + "remote.currentPassword": "現在のパスワード", + "remote.newPassword": "新しいパスワード", + "remote.confirmNewPassword": "新しいパスワードを確認", + "remote.changePassword": "パスワードを変更", "app.logoAria": "opencodex ロゴ", "app.claudeOn": "Claude オン", "app.claudeOff": "Claude オフ", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index faa01d7db..19e9cf702 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -20,34 +20,34 @@ export const ko: Record = { "common.loading": "불러오는 중…", "common.retry": "재시도", "remote.title": "리모트", - "remote.subtitle": "이 컴퓨터의 OpenCodex를 계정에 연결하고, 로컬 GUI를 비공개 Cloudflare Tunnel로 접속합니다.", + "remote.subtitle": "이 컴퓨터의 OpenCodex를 계정에 연결하고 리모트 주소에서 종단간 암호화 터미널을 사용합니다.", "remote.refresh": "리모트 상태 새로고침", "remote.progressLabel": "리모트 설정 진행 상태", - "remote.stepAccount": "GitHub 계정", + "remote.stepAccount": "OpenCodex 계정", "remote.stepPassword": "접속 비밀번호", - "remote.stepTunnel": "터널", + "remote.stepTunnel": "컴퓨터 연결", "remote.loading": "리모트 상태를 불러오는 중…", "remote.loadFailed": "리모트 상태를 불러오지 못했습니다.", "remote.signedOutTitle": "이 컴퓨터 연결", - "remote.signedOutBody": "OpenCodex 서비스를 통해 로그인합니다. GitHub는 신원만 확인하며, 이 로컬 OCX에는 OpenCodex 장치 자격증명만 전달됩니다.", - "remote.signIn": "GitHub로 계속", + "remote.signedOutBody": "OpenCodex Remote에 이 컴퓨터를 연결합니다. 이 로컬 OCX에는 폐기 가능한 OpenCodex 장치 자격증명만 전달됩니다.", + "remote.signIn": "Remote 연결", "remote.starting": "시작 중…", "remote.identityTitle": "신원 처리는 중앙에서", "remote.identityBody": "서버가 GitHub OAuth를 처리하며 GitHub 토큰은 이 컴퓨터로 전달하지 않습니다.", "remote.deviceTitle": "컴퓨터별 자격증명", "remote.deviceBody": "각 OCX가 자체 장치 키를 만들기 때문에 다른 컴퓨터의 로그인을 유지한 채 이 장치만 해제할 수 있습니다.", "remote.tunnelTitle": "인바운드 포트 불필요", - "remote.tunnelBody": "집이나 사무실 네트워크를 직접 노출하지 않고 Cloudflare Tunnel로 원격 트래픽을 받습니다.", + "remote.tunnelBody": "이 컴퓨터가 중앙으로 WSS 연결 하나만 엽니다. 공유기 포트포워딩이나 인바운드 방화벽 설정은 필요 없습니다.", "remote.startFailed": "GitHub 로그인을 시작하지 못했습니다.", "remote.cancelFailed": "장치 로그인을 취소하지 못했습니다.", "remote.pendingTitle": "브라우저에서 이 컴퓨터를 승인하세요", - "remote.pendingBody": "opencodexpages.me에서 GitHub 로그인을 마치고 사이트의 코드가 아래 로컬 코드와 같은지 확인하세요.", + "remote.pendingBody": "opencodexpages.me에서 이 컴퓨터를 승인하고 사이트의 코드가 아래 로컬 코드와 같은지 확인하세요.", "remote.codeLabel": "장치 코드", "remote.openBrowser": "로그인 페이지 열기", "remote.waiting": "브라우저 승인을 기다리는 중…", "remote.connectedAs": "연결된 계정", "remote.passwordTitle": "리모트 접속 비밀번호 만들기", - "remote.passwordBody": "이 비밀번호는 원격 브라우저 접속을 보호하며 GitHub 비밀번호와는 별개입니다.", + "remote.passwordBody": "GitHub 비밀번호와 별개이며 Argon2id와 AES-GCM으로 리모트 금고를 로컬에서 암호화합니다.", "remote.passwordLabel": "리모트 비밀번호", "remote.passwordConfirm": "비밀번호 확인", "remote.passwordLength": "10자 이상 입력하세요.", @@ -60,7 +60,7 @@ export const ko: Record = { "remote.privateBetaTitle": "비공개 베타 승인이 필요합니다", "remote.privateBetaBody": "계정 연결은 끝났지만 현재 서버는 초대받은 계정만 리모트를 활성화할 수 있습니다.", "remote.domainTitle": "이 컴퓨터의 주소 선택", - "remote.domainBody": "OpenCodex가 이 PC 전용 비공개 터널을 만들고 opencodexpages.me 주소 하나를 예약합니다.", + "remote.domainBody": "계정용 리모트 주소 하나를 예약하고 이 컴퓨터를 중복되지 않는 이름으로 등록합니다.", "remote.deviceNameLabel": "컴퓨터 이름", "remote.deviceNamePlaceholder": "집 PC", "remote.domainLabel": "리모트 주소", @@ -69,25 +69,33 @@ export const ko: Record = { "remote.activateFailed": "이 컴퓨터의 리모트를 활성화하지 못했습니다.", "remote.activating": "주소 예약 중…", "remote.activate": "리모트 활성화", - "remote.provisioningTitle": "비공개 터널 생성 중", - "remote.provisioningBody": "중앙 서버가 주소를 예약하고 이 PC 전용 Cloudflare 리소스를 만들고 있습니다.", - "remote.connectorTitle": "로컬 헬퍼 연결", - "remote.connectorBody": "주소 준비가 끝났습니다. 로컬 OCX와 Cloudflare Tunnel을 유지하는 서명된 Linux 헬퍼를 페어링하세요.", + "remote.provisioningTitle": "리모트 작업공간 생성 중", + "remote.provisioningBody": "중앙 서버가 계정 주소를 예약하고 이 컴퓨터를 등록하고 있습니다.", + "remote.connectorTitle": "로컬 커넥터 시작", + "remote.connectorBody": "주소 준비가 끝났습니다. 중앙으로 암호화 Relay 연결 하나를 유지하는 비특권 서명 Agent를 시작합니다.", "remote.pairingCode": "일회용 페어링 코드", "remote.pairingFailed": "커넥터 페어링을 준비하지 못했습니다.", "remote.preparingConnector": "준비 중…", - "remote.prepareConnector": "커넥터 준비", - "remote.connectorRequirement": "현재 비공개 MVP는 관리자 승인을 받아 서명된 Linux 헬퍼를 설치해야 합니다. Windows와 macOS 헬퍼는 아직 배포하지 않습니다.", + "remote.prepareConnector": "커넥터 시작", + "remote.connectorRequirement": "커넥터는 현재 사용자 권한으로 실행되며 root나 포트포워딩이 필요 없습니다. 이 플랫폼용 서명 바이너리는 OCX에 함께 설치되어야 합니다.", "remote.connectingTitle": "이 컴퓨터 연결 중", "remote.connectingBody": "헬퍼 페어링이 끝났습니다. 로컬 OCX, Agent, Tunnel, Gateway 검사를 기다리고 있습니다.", "remote.readyTitle": "리모트 온라인", - "remote.readyBody": "이 컴퓨터의 로컬 OpenCodex GUI를 인증된 주소로 접속할 수 있습니다.", - "remote.openRemote": "리모트 GUI 열기", + "remote.readyBody": "종단간 암호화 리모트 작업공간에서 이 컴퓨터의 Shell, Codex CLI, Claude Code를 사용할 수 있습니다.", + "remote.openRemote": "리모트 작업공간 열기", "remote.unavailableTitle": "리모트 확인 필요", "remote.unavailableBody": "인스턴스가 정지됐거나 프로비저닝에 실패했습니다. 상태를 새로고침하거나 운영자에게 문의하세요.", "remote.disconnect": "연결 해제", "remote.disconnectConfirm": "이 컴퓨터의 OpenCodex Remote 연결을 해제할까요?", "remote.disconnectFailed": "이 장치를 해제하지 못했습니다.", + "remote.devicesTitle": "연결된 컴퓨터", + "remote.devicesBody": "각 컴퓨터는 중앙으로 암호화 Relay 연결 하나만 유지합니다. 인바운드 포트나 공유기 설정은 필요 없습니다.", + "remote.changePasswordTitle": "암호화 비밀번호 변경", + "remote.changePasswordBody": "이전 비밀번호가 필요합니다. 서버에 새 봉투를 보내기 전에 로컬에서 금고를 다시 암호화합니다.", + "remote.currentPassword": "현재 비밀번호", + "remote.newPassword": "새 비밀번호", + "remote.confirmNewPassword": "새 비밀번호 확인", + "remote.changePassword": "비밀번호 변경", "theme.label": "테마", "theme.light": "라이트", "theme.dark": "다크", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 3440c6c93..470ac69cd 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -90,6 +90,14 @@ export const ru: Record = { "remote.disconnect": "Отключить", "remote.disconnectConfirm": "Отключить этот компьютер от OpenCodex Remote?", "remote.disconnectFailed": "Не удалось отозвать это устройство.", + "remote.devicesTitle": "Подключённые компьютеры", + "remote.devicesBody": "Каждый компьютер поддерживает одно исходящее зашифрованное Relay-соединение. Входящие порты и настройка роутера не нужны.", + "remote.changePasswordTitle": "Изменить пароль шифрования", + "remote.changePasswordBody": "Нужен старый пароль. Хранилище повторно шифруется локально до отправки нового конверта серверу.", + "remote.currentPassword": "Текущий пароль", + "remote.newPassword": "Новый пароль", + "remote.confirmNewPassword": "Подтвердите новый пароль", + "remote.changePassword": "Изменить пароль", "app.logoAria": "Логотип opencodex", "app.claudeOn": "Claude ВКЛ", "app.claudeOff": "Claude ВЫКЛ", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index bfb606ec0..4b6f1e3cc 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -88,6 +88,14 @@ export const zh: Record = { "remote.disconnect": "断开连接", "remote.disconnectConfirm": "要断开此电脑与 OpenCodex Remote 的连接吗?", "remote.disconnectFailed": "无法撤销此设备。", + "remote.devicesTitle": "已配对的计算机", + "remote.devicesBody": "每台计算机只维护一条出站加密中继连接,无需入站端口或路由器设置。", + "remote.changePasswordTitle": "更改加密密码", + "remote.changePasswordBody": "必须提供旧密码。保险库会先在本地重新加密,再把新信封发送到服务器。", + "remote.currentPassword": "当前密码", + "remote.newPassword": "新密码", + "remote.confirmNewPassword": "确认新密码", + "remote.changePassword": "更改密码", "theme.label": "主题", "theme.light": "浅色", "theme.dark": "深色", diff --git a/gui/src/pages/Remote.tsx b/gui/src/pages/Remote.tsx index 497c88a65..2d98004f3 100644 --- a/gui/src/pages/Remote.tsx +++ b/gui/src/pages/Remote.tsx @@ -23,10 +23,21 @@ type RemoteStatus = account: { name: string; email: string; githubNumericId: string }; passwordSet: boolean; canActivate: boolean; + relayReady: boolean; + devices: Array<{ + id: string; + name: string; + platform: string; + relayOnline: boolean; + lastSeenAt: string | null; + instanceId: string | null; + }>; + agent?: { supported: boolean; running: boolean; pid?: number; error?: string }; instance: { id: string; name: string; slug: string; + transportMode: "mesh-tunnel" | "outbound-relay"; status: "pending" | "provisioning" | "awaiting_agent" | "connecting" | "online" | "degraded" | "offline" | "suspending" | "suspended" | "deleting" | "delete_failed" | "deleted"; publicUrl: string; } | null; @@ -44,7 +55,7 @@ function RemoteSteps({ status }: { status: RemoteStatus }) { const t = useT(); const accountDone = status.state === "connected"; const passwordDone = accountDone && status.passwordSet; - const tunnelDone = accountDone && status.instance !== null && ["online", "degraded"].includes(status.instance.status); + const tunnelDone = accountDone && status.instance !== null && status.agent?.running === true; return
{[ { label: t("remote.stepAccount"), done: accountDone, current: !accountDone }, @@ -64,9 +75,11 @@ export default function Remote({ apiBase }: { apiBase: string }) { const [error, setError] = useState(null); const [password, setPassword] = useState(""); const [confirmation, setConfirmation] = useState(""); + const [oldPassword, setOldPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); + const [newConfirmation, setNewConfirmation] = useState(""); const [instanceName, setInstanceName] = useState(""); const [slug, setSlug] = useState(""); - const [pairing, setPairing] = useState<{ code: string; expiresAt: string } | null>(null); const refresh = useCallback(async (quiet = false) => { if (!quiet) setLoading(true); @@ -90,7 +103,8 @@ export default function Remote({ apiBase }: { apiBase: string }) { useEffect(() => { const waitingForDevice = status?.state === "pending"; const waitingForInstance = status?.state === "connected" && !!status.instance - && ["pending", "provisioning", "connecting"].includes(status.instance.status); + && (["pending", "provisioning", "connecting"].includes(status.instance.status) + || status.agent?.running !== true); if (!waitingForDevice && !waitingForInstance) return; const timer = window.setInterval(() => { void refresh(true); }, 2_000); return () => window.clearInterval(timer); @@ -162,6 +176,28 @@ export default function Remote({ apiBase }: { apiBase: string }) { } }; + const changePassword = async () => { + if (newPassword.length < 10) { setError(t("remote.passwordLength")); return; } + if (newPassword !== newConfirmation) { setError(t("remote.passwordMismatch")); return; } + setBusy(true); + setError(null); + try { + const next = await requestRemote(apiBase, "/api/remote/password", { + method: "PATCH", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ oldPassword, newPassword }), + }); + setStatus(next); + setOldPassword(""); + setNewPassword(""); + setNewConfirmation(""); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.passwordFailed")); + } finally { + setBusy(false); + } + }; + const activate = async () => { const cleanSlug = slug.trim().toLowerCase(); if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(cleanSlug)) { @@ -183,11 +219,11 @@ export default function Remote({ apiBase }: { apiBase: string }) { } }; - const prepareConnector = async () => { + const startAgent = async () => { setBusy(true); setError(null); try { - setPairing(await requestRemote<{ code: string; expiresAt: string }>(apiBase, "/api/remote/pairing-code", { + setStatus(await requestRemote(apiBase, "/api/remote/agent/start", { method: "POST", })); } catch (reason) { @@ -207,7 +243,7 @@ export default function Remote({ apiBase }: { apiBase: string }) { : status?.state === "signed_out" ? <>

{t("remote.signedOutTitle")}

{t("remote.signedOutBody")}

-
+
{t("remote.identityTitle")}{t("remote.identityBody")}
@@ -215,7 +251,7 @@ export default function Remote({ apiBase }: { apiBase: string }) {
{t("remote.tunnelTitle")}{t("remote.tunnelBody")}
: status?.state === "pending" ?
-

{t("remote.pendingTitle")}

{t("remote.pendingBody")}

+

{t("remote.pendingTitle")}

{t("remote.pendingBody")}

{t("remote.codeLabel")}{status.userCode.match(/.{1,4}/g)?.join(" ")}
{t("remote.openBrowser")}
{t("remote.waiting")}
@@ -233,12 +269,23 @@ export default function Remote({ apiBase }: { apiBase: string }) {
: ["pending", "provisioning"].includes(status.instance.status) ?

{t("remote.provisioningTitle")}

{t("remote.provisioningBody")}

{status.instance.publicUrl}
: ["awaiting_agent", "offline"].includes(status.instance.status) ?

{t("remote.connectorTitle")}

{t("remote.connectorBody")}

{status.instance.publicUrl} - {pairing ?
{t("remote.pairingCode")}{pairing.code.match(/.{1,4}/g)?.join(" ")}
: null} -
+
+ {status.agent?.error ? {status.agent.error} : null} {t("remote.connectorRequirement")}
: status.instance.status === "connecting" ?

{t("remote.connectingTitle")}

{t("remote.connectingBody")}

{status.instance.publicUrl}
: ["online", "degraded"].includes(status.instance.status) ?

{t("remote.readyTitle")}

{t("remote.readyBody")}

{t("remote.openRemote")}
:

{t("remote.unavailableTitle")}

{t("remote.unavailableBody")}

} + {status.passwordSet ? <> +

{t("remote.devicesTitle")}

{t("remote.devicesBody")}

+
{status.devices.map(device =>
{device.name}{device.platform}
{device.relayOnline ? "Online" : "Offline"}
)}
+
+

{t("remote.changePasswordTitle")}

{t("remote.changePasswordBody")}

+
+ +
+
+
+ : null} : null} ; } diff --git a/gui/src/styles.css b/gui/src/styles.css index 79c3e66b8..a02d5e555 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -927,11 +927,20 @@ dialog.modal-overlay::backdrop { .remote-account-card > div:nth-child(2) > span, .remote-account-card small { color: var(--muted); font-size: var(--text-caption); overflow: hidden; text-overflow: ellipsis; } .remote-account-card .btn { margin-left: auto; } .remote-password-panel { padding: 22px; } -.remote-password-panel .panel-head { display: flex; align-items: flex-start; gap: 12px; } +.remote-password-panel .panel-head { display: flex; align-items: flex-start; justify-content: flex-start; gap: 12px; } +.remote-password-panel .panel-head > div { min-width: 0; } .remote-password-panel .panel-head > svg { width: 20px; height: 20px; margin-top: 2px; color: var(--muted); flex: 0 0 auto; } .remote-password-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 4px 0 16px; } .remote-password-grid label { display: grid; gap: 6px; } .remote-password-grid label > span { color: var(--muted); font-size: var(--text-label); } +.remote-device-panel { margin-top: 14px; } +.remote-device-list { display: grid; gap: 8px; margin-top: 15px; } +.remote-device-row { min-height: 58px; border: 1px solid var(--border); border-radius: var(--radius-control); padding: 9px 12px; display: grid; grid-template-columns: 9px 1fr auto; align-items: center; gap: 11px; } +.remote-device-row > span { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); opacity: .5; } +.remote-device-row > span.is-online { background: var(--success); opacity: 1; box-shadow: 0 0 0 4px color-mix(in srgb, var(--success) 14%, transparent); } +.remote-device-row > div { display: grid; gap: 3px; min-width: 0; } +.remote-device-row small { color: var(--muted); overflow: hidden; text-overflow: ellipsis; } +.remote-device-row em { color: var(--muted); font-size: var(--text-label); font-style: normal; } .remote-ready { border-color: color-mix(in srgb, var(--green) 34%, var(--border)); background: color-mix(in srgb, var(--green-soft) 58%, var(--surface)); } .remote-ready .remote-hero-icon { color: var(--green); background: var(--green-soft); } .remote-loading { display: flex; align-items: center; gap: 10px; color: var(--muted); } diff --git a/package.json b/package.json index f02953c8f..7c9190d4c 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "dependencies": { "@bufbuild/protobuf": "^2.12.0", "@modelcontextprotocol/sdk": "^1", + "@noble/hashes": "2.2.0", "bun": "1.3.14", "zod": "4.4.3" }, diff --git a/platform/bun.lock b/platform/bun.lock index 53943b902..f66e8316e 100644 --- a/platform/bun.lock +++ b/platform/bun.lock @@ -5,7 +5,9 @@ "": { "name": "@opencodex/remote-platform", "dependencies": { + "@noble/hashes": "2.2.0", "@tabler/icons-react": "^3.34.1", + "@xterm/xterm": "6.0.0", "better-auth": "^1.6.25", "hono": "^4.9.8", "pg": "^8.16.3", @@ -229,6 +231,8 @@ "@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], + "@xterm/xterm": ["@xterm/xterm@6.0.0", "", {}, "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.6", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-69D/imtToCsIcAl8WBS2YaRwA4jO/j0HhU+hELqMEu9f54MoUtI6+XH5mrKU8rEFNEk/Ui1I2MK4/JkWacclGw=="], "better-auth": ["better-auth@1.6.25", "", { "dependencies": { "@better-auth/core": "1.6.25", "@better-auth/drizzle-adapter": "1.6.25", "@better-auth/kysely-adapter": "1.6.25", "@better-auth/memory-adapter": "1.6.25", "@better-auth/mongo-adapter": "1.6.25", "@better-auth/prisma-adapter": "1.6.25", "@better-auth/telemetry": "1.6.25", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.3.7", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.17 || ^0.29.0", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-fvoq+oCO+FF5fpP3XfU7znRyGFpHB77UG2EyxsKNy+Cak7Q5pELu+auvvDveQbWQxcoKugZ7jYQQPFQLpUTGOw=="], diff --git a/platform/docs/IMPLEMENTATION_PLAN.md b/platform/docs/IMPLEMENTATION_PLAN.md index f70b02013..d35ddf59c 100644 --- a/platform/docs/IMPLEMENTATION_PLAN.md +++ b/platform/docs/IMPLEMENTATION_PLAN.md @@ -1,5 +1,7 @@ # OpenCodex Remote 비공개 MVP 확정 구현 계획 +> 2026-07-30 변경: 신규 Remote workspace의 transport와 암호화 기준은 [ADR 0013](../../structure/adr/0013-remote-outbound-e2ee-relay.md)이다. 아래 Mesh 계획은 이미 배포된 private-MVP rollback 경로와 검증 기록으로만 유지한다. + 이 문서는 원 기획서 이후 확정된 구현 기준을 요약한다. 세부 제품 배경은 [PRODUCT_PLAN_v1.md](./PRODUCT_PLAN_v1.md), 현재 코드 상태는 [IMPLEMENTATION_STATUS.md](./IMPLEMENTATION_STATUS.md)를 따른다. ## 목표 구조 diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index 12c922cc9..6ece41ba0 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -8,6 +8,21 @@ 이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증을 완료했고, 2026-07-30 기존 TeamWicked Oracle VPS에 중앙 bootstrap runtime과 `opencodexpages.me` public ingress를 배포했다. 실제 Cloudflare account의 Linux Mesh/private-hostname transport와 Rust Agent 포함 30분 stream은 통과했지만 실제 OpenCodex process를 포함한 public 운영 E2E는 아직 완료되지 않았다. +## 2026-07-30 outbound E2EE relay 전환 작업 + +신규 제품 경로는 [ADR 0013](../../structure/adr/0013-remote-outbound-e2ee-relay.md)으로 변경했다. 이 변경은 현재 `ingw/remote-private-mvp-handoff` worktree에만 있고 운영 중앙 서버와 `dev`에는 배포하지 않았다. + +- 계정당 주소 하나와 여러 `remote_devices`를 workspace로 사용한다. +- `0003_outbound_e2ee_relay.sql`이 E2EE envelope, device Relay credential/presence, terminal session을 추가한다. +- local OCX는 Argon2id + separated HKDF + AES-GCM vault를 만들고 이전 비밀번호를 확인한 로컬 rewrap을 지원한다. +- Gateway는 `relay.opencodexpages.me/_ocxr/agent` outbound WSS와 wildcard workspace API/WS를 제공하며 DB-per-frame 없이 최대 64 KiB 암호문만 전달한다. +- Rust `relay` command는 현재 사용자 권한의 portable PTY, 상호 서명 ephemeral P-256 handshake, 방향별 AES-GCM counter를 구현한다. +- wildcard web workspace는 xterm.js에서 Shell/Codex/Claude profile을 열고 브라우저-Agent 사이 E2EE를 수행한다. +- 기존 Mesh instance는 새 E2EE password를 설정할 때 slug를 보존해 `outbound-relay`로 전환한다. 기존 Cloudflare resource cleanup은 자동으로 수행하지 않는다. +- 로컬 GUI는 연결 컴퓨터, Relay 상태, 이전 비밀번호가 필요한 암호화 password 변경, 사전 빌드 Agent 시작을 표시한다. + +현재 검증: root/platform typecheck, GUI/platform production build와 lint, Rust check/build와 6 unit tests, root 전체 `6035 pass / 2 skip / 0 fail`을 통과했다. PostgreSQL 17에 `0003`까지 적용한 통합 테스트는 실제 Gateway, Rust Agent, WebCrypto client, `/bin/sh` portable PTY를 연결해 암호화한 `OCXR_RELAY_OK` 왕복과 누락된 immutable asset의 404 경계까지 `1 test / 87 expects`로 3회 연속 통과했다. 로컬 GUI와 wildcard workspace는 Playwright viewport에서 수평 overflow 없이 확인했다. 아직 남은 release 차단 조건은 signed multi-platform Agent packaging, 실제 Codex/Claude CLI를 포함한 public 운영 E2E, 운영 backup/deploy/rollback이다. 이 코드는 운영 중앙 서버와 `dev`에 배포하지 않았다. + ## 문서와 디자인 자산 - 원 기획서: [PRODUCT_PLAN_v1.md](./PRODUCT_PLAN_v1.md) @@ -147,11 +162,11 @@ ## 구현 중인 부분 -- 실제 Rust Agent와 OpenCodex를 포함한 Gateway WebSocket/client disconnect E2E. -- 실제 OpenCodex process를 포함한 E2E와 Gateway 프로세스 재시작 측정. Mesh transport/Rust Agent 30분과 Tunnel 재시작은 완료. +- 실제 Codex/Claude CLI 프로세스를 포함한 outbound E2EE terminal E2E. `/bin/sh` PTY 암호화 왕복은 완료했다. +- outbound Gateway 프로세스 재시작 시 Agent/browser 재접속 측정. 기존 Mesh transport/Rust Agent 30분과 Tunnel 재시작은 완료. - suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. - Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. -- UI의 실제 브라우저 시각 QA. 현재 상태는 루트 [design-qa.md](../../design-qa.md)에 기록했다. +- UI의 keyboard/focus/reduced-motion/zoom 접근성 브라우저 QA. 기본 viewport 시각 QA와 overflow 검사는 완료했다. ## 남은 부분 @@ -205,7 +220,7 @@ PASS bun run typecheck (root) PASS bun test tests/server-management-auth.test.ts 16 tests / 56 expects PASS bun test --isolate tests - 6033 pass / 2 skip / 0 fail / 30570 expects + 6035 pass / 2 skip / 0 fail / 30582 expects PASS bun run privacy:scan PASS cd gui && bun run lint && bun test tests && bun run build && bun run doctor 385 pass / 0 fail / 1663 expects; React Doctor 0 issues @@ -218,12 +233,14 @@ PASS cd platform && CLOUDFLARE_LIVE_TESTS=true ... \ PASS cd platform && VITE_REMOTE_DEMO=true bun run build:web PASS cd platform && PLATFORM_TEST_DATABASE_URL=postgres://postgres@127.0.0.1:55432/postgres \ bun test server/tests/postgres-integration.test.ts - 1 test / 74 expects, PostgreSQL 17.10 + 1 test / 87 expects, PostgreSQL 17; real Gateway + Rust Agent + WebCrypto + PTY relay PASS cd remote-agent && cargo fmt --check PASS cd remote-agent && cargo check PASS cd remote-agent && cargo clippy --all-targets --all-features -- -D warnings PASS cd remote-agent && cargo test - 3 Rust unit tests + 6 Rust unit tests +PASS Playwright visual smoke + local Remote GUI and wildcard workspace; no horizontal overflow PASS cd docs-site && bun run build 146 pages with localized Remote GUI and CLI documentation ``` diff --git a/platform/docs/PRODUCTION_DEPLOYMENT.md b/platform/docs/PRODUCTION_DEPLOYMENT.md index 6bddac0ad..de2581a0b 100644 --- a/platform/docs/PRODUCTION_DEPLOYMENT.md +++ b/platform/docs/PRODUCTION_DEPLOYMENT.md @@ -22,7 +22,7 @@ The central service now has a dedicated GitHub OAuth application and the product The apex remains protected by a Cloudflare Access application allowing one exact maintainer email through One-Time PIN. Behind that edge boundary, the Control Plane still runs its non-production numeric-ID bootstrap path for the same maintainer while the signed Linux helper and abuse controls are unfinished. -This is deliberately single-user. Do not add another Access email while numeric-ID bootstrap mode is active because every allowed request would inherit the bootstrap administrator. Before a multi-user beta, remove `PLATFORM_DEV_AUTH_GITHUB_ID`, set `NODE_ENV=production`, explicitly choose `PLATFORM_SIGNUP_MODE=private|open`, and remove or relax the apex Access application as intended. +This is deliberately single-user. Do not add another Access email while numeric-ID bootstrap mode is active because every allowed request would inherit the bootstrap administrator. `PLATFORM_DEV_AUTO_APPROVE_DEVICE_LINKS=true` may be used only for a short, access-gated test: it makes a newly created device link inherit that bootstrap actor and approve immediately. Before a multi-user beta, remove `PLATFORM_DEV_AUTH_GITHUB_ID` and `PLATFORM_DEV_AUTO_APPROVE_DEVICE_LINKS`, set `NODE_ENV=production`, explicitly choose `PLATFORM_SIGNUP_MODE=private|open`, and remove or relax the apex Access application as intended. The wildcard instance Gateway is not placed behind the apex Access application. It continues to require an instance session or `ocxr_` token and conceals invalid access as `404`. diff --git a/platform/package.json b/platform/package.json index fe756749a..5798f344b 100644 --- a/platform/package.json +++ b/platform/package.json @@ -15,7 +15,9 @@ "start:worker": "bun server/src/worker.ts" }, "dependencies": { + "@noble/hashes": "2.2.0", "@tabler/icons-react": "^3.34.1", + "@xterm/xterm": "6.0.0", "better-auth": "^1.6.25", "hono": "^4.9.8", "pg": "^8.16.3", diff --git a/platform/server/migrations/0003_outbound_e2ee_relay.sql b/platform/server/migrations/0003_outbound_e2ee_relay.sql new file mode 100644 index 000000000..bb082d4aa --- /dev/null +++ b/platform/server/migrations/0003_outbound_e2ee_relay.sql @@ -0,0 +1,70 @@ +BEGIN; + +ALTER TABLE remote_access_profiles + ADD COLUMN auth_version text NOT NULL DEFAULT 'legacy-password-v1', + ADD COLUMN vault_salt bytea, + ADD COLUMN vault_nonce bytea, + ADD COLUMN encrypted_vault_key bytea, + ADD COLUMN vault_kdf jsonb, + ADD COLUMN root_public_key bytea; + +ALTER TABLE instances + ADD COLUMN transport_mode text NOT NULL DEFAULT 'mesh-tunnel' + CHECK (transport_mode IN ('mesh-tunnel', 'outbound-relay')); + +ALTER TABLE remote_devices + ADD COLUMN ecdh_public_key bytea, + ADD COLUMN relay_token_hash bytea UNIQUE, + ADD COLUMN relay_connected_at timestamptz, + ADD COLUMN relay_disconnected_at timestamptz, + ADD COLUMN agent_version text; + +ALTER TABLE device_authorization_requests + ADD COLUMN ecdh_public_key bytea, + ADD COLUMN encrypted_relay_token bytea; + +-- Earlier private-MVP builds allowed two device keys to reuse a display name. +-- Preserve both devices while making the name stable and unique inside one account. +WITH ranked AS ( + SELECT id,row_number() OVER (PARTITION BY user_id,lower(name) ORDER BY created_at,id) AS position + FROM remote_devices + WHERE revoked_at IS NULL +) +UPDATE remote_devices d +SET name=left(d.name,67)||'-'||left(d.id::text,8),updated_at=now() +FROM ranked r +WHERE d.id=r.id AND r.position>1; + +CREATE UNIQUE INDEX remote_devices_live_user_name_idx + ON remote_devices(user_id,lower(name)) + WHERE revoked_at IS NULL; + +CREATE TABLE terminal_sessions ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + instance_id uuid NOT NULL REFERENCES instances(id) ON DELETE CASCADE, + device_id uuid NOT NULL REFERENCES remote_devices(id) ON DELETE CASCADE, + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + browser_token_hash bytea NOT NULL UNIQUE, + command_profile text NOT NULL CHECK (command_profile IN ('shell','codex','claude')), + status text NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','connected','closed','expired')), + expires_at timestamptz NOT NULL, + connected_at timestamptz, + closed_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX terminal_sessions_device_status_idx + ON terminal_sessions(device_id,status,expires_at); +CREATE INDEX terminal_sessions_user_created_idx + ON terminal_sessions(user_id,created_at DESC); + +-- [Decision Log] +-- - 목적과 의도: 계정 도메인 하나 아래 여러 컴퓨터를 연결하고 중앙 서버가 터미널 평문이나 복호화 키를 보지 않는 outbound relay를 추가한다. +-- - 기존 구현 및 제약 조건: instance는 계정당 하나였고 Agent도 instance당 하나였으며 비밀번호는 중앙 Argon2id 검증용으로만 저장됐다. +-- - 검토한 주요 대안: 기존 agents 테이블 확장, 컴퓨터별 instance 생성, local device identity를 relay node identity로 재사용. +-- - 선택한 방식: instance를 계정 workspace로 유지하고 remote_devices를 다중 relay node로 확장하며 E2EE 봉투와 짧은 terminal session만 추가한다. +-- - 다른 대안 대신 이 방식을 선택한 이유: 기존 도메인·소유권·세션을 보존하면서 인스턴스별 Cloudflare 리소스와 DB-per-frame 처리를 제거할 수 있다. +-- - 장점, 단점 및 영향: 마이그레이션과 롤백이 작고 기존 Mesh 경로가 공존하지만 과도기 동안 instance라는 이름이 workspace 의미도 함께 가진다. + +COMMIT; diff --git a/platform/server/src/app.ts b/platform/server/src/app.ts index 80f1cbc32..02bdbcaef 100644 --- a/platform/server/src/app.ts +++ b/platform/server/src/app.ts @@ -12,6 +12,21 @@ interface AppVariables { remoteDeviceId: string | null; } +const e2eeEnvelopeSchema = z.object({ + version: z.literal("ocx-e2ee-v1"), + salt: z.string().min(20).max(32), + nonce: z.string().min(16).max(24), + ciphertext: z.string().min(24).max(6_000), + rootPublicKey: z.string().min(40).max(256), + kdf: z.object({ + algorithm: z.literal("argon2id"), + memoryKiB: z.number().int().min(32_768).max(262_144), + iterations: z.number().int().min(2).max(8), + parallelism: z.number().int().min(1).max(4), + outputLength: z.literal(32), + }), +}); + function errorMessage(error: unknown): string { return error instanceof Error ? error.message : "request failed"; } @@ -84,16 +99,48 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth deviceName: z.string().trim().min(1).max(80), platform: z.string().trim().min(1).max(40), publicKey: z.string().min(40).max(512), + ecdhPublicKey: z.string().min(80).max(512).optional(), }).parse(await c.req.json()); const networkSignal = c.req.header("cf-connecting-ip") ?? c.req.header("x-forwarded-for")?.split(",")[0]?.trim() ?? "unknown"; - return c.json(await store.createDeviceAuthorization({ + const deviceLink = await store.createDeviceAuthorization({ deviceName: body.deviceName, platform: body.platform, publicKeyDer: Buffer.from(body.publicKey, "base64url"), + ecdhPublicKeyDer: body.ecdhPublicKey ? Buffer.from(body.ecdhPublicKey, "base64url") : undefined, networkSignal, - }), 201); + }); + const requestOrigin = new URL(c.req.url); + const loopbackRequest = requestOrigin.protocol === "http:" + && ["127.0.0.1", "localhost"].includes(requestOrigin.hostname); + if ( + config.NODE_ENV !== "production" + && config.PLATFORM_DEV_AUTO_APPROVE_DEVICE_LINKS === "true" + && loopbackRequest + ) { + // The client rejects cross-origin authorization URLs. Keep a local test + // entirely on loopback while the public response continues to use the + // configured HTTPS origin. + deviceLink.authorizeUrl = `${requestOrigin.origin}/connect/${deviceLink.id}`; + } + // [Decision Log] + // - 목적과 의도: 실제 GitHub OAuth 준비 전에도 로컬 OCX Remote 연결 전체 흐름을 한 번의 클릭으로 검증한다. + // - 기존 구현 및 제약 조건: 개발 계정 우회는 API actor만 제공해서 장치 승인 버튼을 별도로 눌러야 했고, 공개 배포에서는 절대 자동 승인되면 안 된다. + // - 검토한 주요 대안: 프런트엔드에서 승인 API 호출, 모든 개발 환경에서 무조건 자동 승인, 명시적인 서버 플래그. + // - 선택한 방식: non-production, 개발 actor, 명시적 auto-approve 플래그가 모두 존재할 때만 생성 직후 승인한다. + // - 다른 대안 대신 이 방식을 선택한 이유: 비밀이나 우회 토큰을 브라우저에 추가하지 않고 production의 GitHub 소유권 경계를 그대로 보존한다. + // - 장점, 단점 및 영향: 테스트는 한 번의 클릭으로 진행되지만 이 플래그를 켠 개발 배포는 접근 가능한 사람이 bootstrap 계정으로 장치를 등록할 수 있으므로 공개 운영에는 사용할 수 없다. + const actor = c.get("actor"); + if ( + config.NODE_ENV !== "production" + && config.PLATFORM_DEV_AUTH_GITHUB_ID + && config.PLATFORM_DEV_AUTO_APPROVE_DEVICE_LINKS === "true" + && actor + ) { + await store.approveDeviceAuthorization(actor, deviceLink.id); + } + return c.json(deviceLink, 201); } catch (error) { return c.json({ error: errorMessage(error) }, 400); } @@ -144,6 +191,50 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth return c.json({ ok: true }); }); + app.put("/api/v1/remote/e2ee-profile", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ + authSecret: z.string().min(43).max(44), + envelope: e2eeEnvelopeSchema, + }).parse(await c.req.json()); + await store.setRemoteE2eeProfile(actor, body.authSecret, body.envelope); + return c.json({ profile: await store.remoteProfile(actor) }); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.post("/api/v1/remote/e2ee-profile/change", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ + oldAuthSecret: z.string().min(43).max(44), + newAuthSecret: z.string().min(43).max(44), + envelope: e2eeEnvelopeSchema, + }).parse(await c.req.json()); + await store.changeRemoteE2eeProfile(actor, body.oldAuthSecret, body.newAuthSecret, body.envelope); + return c.json({ profile: await store.remoteProfile(actor) }); + } catch (error) { + return c.json({ error: errorMessage(error) }, 401); + } + }); + + app.post("/api/v1/devices/current/relay-credentials", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const deviceId = requireRemoteDevice(c); + if (deviceId instanceof Response) return deviceId; + try { + const body = z.object({ ecdhPublicKey: z.string().min(80).max(512) }).parse(await c.req.json()); + return c.json(await store.rotateRelayCredentials(actor, deviceId, Buffer.from(body.ecdhPublicKey, "base64url")), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + app.post("/api/v1/remote/activate", async c => { const actor = await requireActor(c); if (actor instanceof Response) return actor; @@ -176,8 +267,13 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth const actor = await requireActor(c); if (actor instanceof Response) return actor; try { - const body = z.object({ password: z.string().min(10).max(128) }).parse(await c.req.json()); - return c.json({ url: await store.issueInstanceAuthorizationForSlug(actor, c.req.param("slug"), body.password) }, 201); + const body = z.object({ + authSecret: z.string().min(43).max(44).optional(), + password: z.string().min(10).max(128).optional(), + }).refine(value => !!value.authSecret || !!value.password).parse(await c.req.json()); + return c.json({ + url: await store.issueInstanceAuthorizationForSlug(actor, c.req.param("slug"), body.authSecret ?? body.password ?? ""), + }, 201); } catch (error) { return c.json({ error: errorMessage(error) }, 401); } diff --git a/platform/server/src/config.ts b/platform/server/src/config.ts index 020b9843b..010df5d56 100644 --- a/platform/server/src/config.ts +++ b/platform/server/src/config.ts @@ -15,7 +15,9 @@ const envSchema = z.object({ PLATFORM_CONTROL_PORT: z.coerce.number().int().min(1).max(65535).default(10200), PLATFORM_GATEWAY_PORT: z.coerce.number().int().min(1).max(65535).default(10201), PLATFORM_GATEWAY_HOST: z.string().default("127.0.0.1"), + PLATFORM_RELAY_URL: z.string().url().optional(), PLATFORM_DEV_AUTH_GITHUB_ID: z.string().regex(/^\d+$/).optional(), + PLATFORM_DEV_AUTO_APPROVE_DEVICE_LINKS: z.enum(["true", "false"]).default("false"), CLOUDFLARE_ACCOUNT_ID: z.string().optional(), CLOUDFLARE_ZONE_ID: z.string().optional(), CLOUDFLARE_AUTH_EMAIL: z.string().email().optional(), @@ -39,6 +41,7 @@ function credential(name: string, envValue?: string): string | undefined { export interface PlatformConfig extends z.infer { PLATFORM_DATABASE_URL: string; + PLATFORM_RELAY_URL: string; cloudflareApiToken?: string; cloudflareAuthEmail?: string; gatewayPrivateKeyPem: string; @@ -70,6 +73,8 @@ export function loadPlatformConfig(env: NodeJS.ProcessEnv = process.env): Platfo return { ...parsed, PLATFORM_DATABASE_URL: databaseUrl, + PLATFORM_RELAY_URL: parsed.PLATFORM_RELAY_URL + ?? `wss://relay.${parsed.PLATFORM_INSTANCE_DOMAIN}/_ocxr/agent`, cloudflareApiToken: credential("cloudflare-api-token", env.CLOUDFLARE_API_TOKEN), cloudflareAuthEmail: credential("cloudflare-auth-email", env.CLOUDFLARE_AUTH_EMAIL), gatewayPrivateKeyPem, diff --git a/platform/server/src/gateway.ts b/platform/server/src/gateway.ts index a6f145530..1c38b1b6f 100644 --- a/platform/server/src/gateway.ts +++ b/platform/server/src/gateway.ts @@ -1,14 +1,29 @@ import { timingSafeEqual } from "node:crypto"; +import { resolve, sep } from "node:path"; import { loadPlatformConfig } from "./config"; import { Database } from "./db"; import { GATEWAY_ASSERTION_HEADER, signGatewayAssertion } from "./security"; -import { PlatformStore, type InstanceRecord } from "./store"; +import { + PlatformStore, + type InstanceRecord, + type RelayDeviceActor, + type TerminalSessionRecord, +} from "./store"; const config = loadPlatformConfig(); const database = new Database(config.PLATFORM_DATABASE_URL); const store = new PlatformStore(database, config); const INSTANCE_COOKIE = "__Host-ocxr_instance"; +const RELAY_MAX_PAYLOAD = 64 * 1024; +const RELAY_MAX_BUFFERED = 1024 * 1024; +const RELAY_FRAME_HEADER_SIZE = 18; +const RELAY_PROTOCOL_VERSION = 1; +const RELAY_FRAME_OPEN = 1; +const RELAY_FRAME_DATA = 2; +const RELAY_FRAME_CLOSE = 3; +const RELAY_HOST = new URL(config.PLATFORM_RELAY_URL).hostname.toLowerCase(); +const WEB_ROOT = resolve(import.meta.dir, "../../web/dist"); const REQUEST_HEADER_DENY = new Set([ "connection", "cookie", "host", "proxy-authorization", "proxy-authenticate", "upgrade", @@ -44,6 +59,26 @@ function remoteCredential(req: Request): string | null { return token?.startsWith("ocxr_") ? authorization : null; } +function bearerToken(req: Request): string | null { + return req.headers.get("authorization")?.replace(/^Bearer\s+/i, "").trim() || null; +} + +function requestHostname(req: Request): string { + return (req.headers.get("host") ?? "").toLowerCase().replace(/:\d+$/, ""); +} + +function requestOriginMatches(req: Request): boolean { + const origin = req.headers.get("origin"); + if (!origin) return true; + try { + const parsed = new URL(origin); + return parsed.hostname.toLowerCase() === requestHostname(req) + && (parsed.protocol === "https:" || (parsed.protocol === "http:" && parsed.hostname === "localhost")); + } catch { + return false; + } +} + function browserAccessRedirect(req: Request): Response | null { if (req.method !== "GET" || req.headers.get("upgrade")?.toLowerCase() === "websocket") return null; const acceptsHtml = req.headers.get("sec-fetch-dest") === "document" @@ -105,6 +140,8 @@ function privateUrl(instance: InstanceRecord, requestUrl: URL): URL { const activeRequests = new Map>(); const activeSockets = new Map>>(); +const relayAgents = new Map>(); +const relayTerminals = new Map>(); function track(instanceId: string, controller: AbortController): () => void { const set = activeRequests.get(instanceId) ?? new Set(); set.add(controller); @@ -115,15 +152,19 @@ function track(instanceId: string, controller: AbortController): () => void { }; } +function socketInstanceId(socket: Bun.ServerWebSocket): string { + return socket.data.kind === "relay-agent" ? socket.data.device.instanceId : socket.data.instance.id; +} + function trackSocket(socket: Bun.ServerWebSocket): void { - const instanceId = socket.data.instance.id; + const instanceId = socketInstanceId(socket); const sockets = activeSockets.get(instanceId) ?? new Set>(); sockets.add(socket); activeSockets.set(instanceId, sockets); } function untrackSocket(socket: Bun.ServerWebSocket): void { - const instanceId = socket.data.instance.id; + const instanceId = socketInstanceId(socket); const sockets = activeSockets.get(instanceId); sockets?.delete(socket); if (!sockets?.size) activeSockets.delete(instanceId); @@ -172,7 +213,8 @@ async function listenForRevocations(): Promise { client.on("notification", message => { if (message.channel !== "instance_state" || !message.payload) return; try { - const { instanceId } = JSON.parse(message.payload) as { instanceId: string }; + const { instanceId, status } = JSON.parse(message.payload) as { instanceId: string; status?: string }; + if (!["suspending", "suspended", "deleting", "deleted"].includes(status ?? "")) return; for (const controller of activeRequests.get(instanceId) ?? []) controller.abort("instance disabled"); for (const socket of activeSockets.get(instanceId) ?? []) socket.close(1008, "instance disabled"); activeRequests.delete(instanceId); @@ -183,7 +225,8 @@ async function listenForRevocations(): Promise { await client.query("LISTEN instance_state"); } -interface SocketData { +interface ProxySocketData { + kind: "proxy"; instance: InstanceRecord; userId: string; url: URL; @@ -192,6 +235,104 @@ interface SocketData { upstream?: WebSocket; } +interface RelayAgentSocketData { + kind: "relay-agent"; + device: RelayDeviceActor & { instanceId: string }; +} + +interface RelayTerminalSocketData { + kind: "relay-terminal"; + instance: InstanceRecord; + userId: string; + session: TerminalSessionRecord; +} + +type SocketData = ProxySocketData | RelayAgentSocketData | RelayTerminalSocketData; + +function uuidBytes(value: string): Buffer { + const hex = value.replaceAll("-", ""); + if (!/^[0-9a-f]{32}$/i.test(hex)) throw new Error("invalid relay session id"); + return Buffer.from(hex, "hex"); +} + +function uuidString(value: Buffer): string { + if (value.length !== 16) throw new Error("invalid relay session bytes"); + const hex = value.toString("hex"); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; +} + +function relayFrame(kind: number, sessionId: string, payload: Buffer = Buffer.alloc(0)): Buffer { + if (![RELAY_FRAME_OPEN, RELAY_FRAME_DATA, RELAY_FRAME_CLOSE].includes(kind)) throw new Error("invalid relay frame kind"); + if (payload.length > RELAY_MAX_PAYLOAD) throw new Error("relay frame is too large"); + return Buffer.concat([Buffer.from([RELAY_PROTOCOL_VERSION, kind]), uuidBytes(sessionId), payload]); +} + +function parseRelayFrame(message: Buffer): { kind: number; sessionId: string; payload: Buffer } { + if (message.length < RELAY_FRAME_HEADER_SIZE || message.length > RELAY_FRAME_HEADER_SIZE + RELAY_MAX_PAYLOAD) { + throw new Error("invalid relay frame length"); + } + if (message[0] !== RELAY_PROTOCOL_VERSION || ![RELAY_FRAME_OPEN, RELAY_FRAME_DATA, RELAY_FRAME_CLOSE].includes(message[1])) { + throw new Error("invalid relay frame header"); + } + return { + kind: message[1], + sessionId: uuidString(message.subarray(2, RELAY_FRAME_HEADER_SIZE)), + payload: message.subarray(RELAY_FRAME_HEADER_SIZE), + }; +} + +function sendBounded(socket: Bun.ServerWebSocket, message: string | Buffer): boolean { + if (socket.getBufferedAmount() > RELAY_MAX_BUFFERED) { + socket.close(1013, "relay backpressure"); + return false; + } + socket.send(message); + return true; +} + +function jsonResponse(body: unknown, status = 200): Response { + return Response.json(body, { + status, + headers: { + "cache-control": "no-store", + "content-security-policy": "default-src 'none'; frame-ancestors 'none'", + "x-content-type-options": "nosniff", + }, + }); +} + +async function workspaceAsset(req: Request, url: URL): Promise { + if (req.method !== "GET" && req.method !== "HEAD") return new Response("Method not allowed", { status: 405 }); + const requestedPath = url.pathname === "/" ? "/index.html" : url.pathname; + const indexPath = resolve(WEB_ROOT, "index.html"); + const candidate = resolve(WEB_ROOT, `.${requestedPath}`); + if (!candidate.startsWith(`${WEB_ROOT}${sep}`)) return new Response("Not found", { status: 404 }); + + let file = Bun.file(candidate); + let fellBackToIndex = false; + if (!(await file.exists())) { + // Missing immutable assets must fail instead of returning HTML under a JS/CSS + // cache key. Only extensionless browser routes participate in SPA fallback. + if (requestedPath.startsWith("/assets/") || /\/[^/]+\.[^/]+$/.test(requestedPath)) { + return new Response("Not found", { status: 404 }); + } + file = Bun.file(indexPath); + fellBackToIndex = true; + } + if (!(await file.exists())) return new Response("Workspace UI is not built", { status: 503 }); + const response = new Response(req.method === "HEAD" ? null : file, { + headers: { + "cache-control": fellBackToIndex || requestedPath === "/index.html" ? "no-store" : "public, max-age=31536000, immutable", + "content-type": file.type, + "content-security-policy": "default-src 'self'; connect-src 'self' wss:; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'", + "referrer-policy": "no-referrer", + "x-content-type-options": "nosniff", + "x-frame-options": "DENY", + }, + }); + return response; +} + let gatewayServer: Bun.Server; async function authenticate(req: Request): Promise<{ instance: InstanceRecord; userId: string } | null> { @@ -205,13 +346,14 @@ async function authenticate(req: Request): Promise<{ instance: InstanceRecord; u const slug = host.toLowerCase().replace(/:\d+$/, "").replace(`.${config.PLATFORM_INSTANCE_DOMAIN.toLowerCase()}`, ""); const found = await database.query<{ id: string; owner_id: string; name: string; slug: string; private_hostname: string; + transport_mode: InstanceRecord["transportMode"]; status: InstanceRecord["status"]; created_at: Date; updated_at: Date; }>(`SELECT i.* FROM instances i JOIN users u ON u.id=i.owner_id WHERE i.slug=$1 AND i.status IN ('connecting','online','degraded','offline') AND i.deleted_at IS NULL AND u.status='active'`, [slug]); const row = found.rows[0]; return row ? { userId: "synthetic-health", instance: { id: row.id, ownerId: row.owner_id, name: row.name, slug: row.slug, - privateHostname: row.private_hostname, status: row.status, + privateHostname: row.private_hostname, transportMode: row.transport_mode, status: row.status, createdAt: row.created_at.toISOString(), updatedAt: row.updated_at.toISOString(), } } : null; } @@ -229,6 +371,19 @@ gatewayServer = Bun.serve({ async fetch(req, server) { const url = new URL(req.url); const host = req.headers.get("host") ?? ""; + if (url.pathname === "/_ocxr/agent") { + if ( + req.headers.get("upgrade")?.toLowerCase() !== "websocket" + || requestHostname(req) !== RELAY_HOST + ) return new Response("Not found", { status: 404 }); + const token = bearerToken(req); + const device = token ? await store.authorizeRelayToken(token) : null; + if (!device?.instanceId) return new Response("Unauthorized", { status: 401 }); + const upgraded = server.upgrade(req, { + data: { kind: "relay-agent", device: { ...device, instanceId: device.instanceId } }, + }); + return upgraded ? undefined : new Response("WebSocket upgrade failed", { status: 502 }); + } if (url.pathname === "/_ocxr/exchange" && req.method === "GET") { const code = url.searchParams.get("code"); const exchanged = code ? await store.exchangeInstanceAuthorization(host, code) : null; @@ -248,6 +403,76 @@ gatewayServer = Bun.serve({ return browserAccessRedirect(req) ?? new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } }); } + + if (auth.instance.transportMode === "outbound-relay") { + if (url.pathname === "/healthz" && req.method === "GET") { + return jsonResponse({ ok: true, relay: true }); + } + const terminalPath = url.pathname.match(/^\/_ocxr\/terminal\/([0-9a-f-]{36})$/i); + if (terminalPath && req.headers.get("upgrade")?.toLowerCase() === "websocket") { + const session = await store.resolveTerminalSession(auth.userId, auth.instance.id, terminalPath[1]); + if (!session || !relayAgents.has(session.deviceId)) { + return new Response("Remote computer unavailable", { status: 409 }); + } + const upgraded = server.upgrade(req, { + data: { kind: "relay-terminal", instance: auth.instance, userId: auth.userId, session }, + }); + return upgraded ? undefined : new Response("WebSocket upgrade failed", { status: 502 }); + } + if (url.pathname === "/api/v1/workspace" && req.method === "GET") { + const devices = (await store.listRelayDevices(auth.userId, auth.instance.id)).map(device => ({ + ...device, + relayOnline: relayAgents.has(device.id), + })); + return jsonResponse({ + instance: { + id: auth.instance.id, + name: auth.instance.name, + slug: auth.instance.slug, + status: devices.some(device => device.relayOnline) ? "online" : "offline", + }, + devices, + limits: { maxSessionsPerDevice: 4, maxFrameBytes: RELAY_MAX_PAYLOAD }, + }); + } + if (url.pathname === "/api/v1/terminal-sessions" && req.method === "POST") { + if (!requestOriginMatches(req)) return jsonResponse({ error: "origin rejected" }, 403); + if (Number(req.headers.get("content-length") ?? "0") > 4096) { + return jsonResponse({ error: "request too large" }, 413); + } + let input: { deviceId?: unknown; commandProfile?: unknown }; + try { + input = await req.json(); + } catch { + return jsonResponse({ error: "invalid request" }, 400); + } + const commandProfile = input.commandProfile; + if ( + typeof input.deviceId !== "string" + || !/^[0-9a-f-]{36}$/i.test(input.deviceId) + || !["shell", "codex", "claude"].includes(String(commandProfile)) + ) return jsonResponse({ error: "invalid request" }, 400); + if (!relayAgents.has(input.deviceId)) return jsonResponse({ error: "remote computer unavailable" }, 409); + try { + const session = await store.createTerminalSession( + auth.userId, + auth.instance.id, + input.deviceId, + commandProfile as TerminalSessionRecord["commandProfile"], + ); + return jsonResponse({ + session, + websocketPath: `/_ocxr/terminal/${session.id}`, + }, 201); + } catch (error) { + return jsonResponse({ error: error instanceof Error ? error.message : "session rejected" }, 409); + } + } + if (url.pathname.startsWith("/api/") || url.pathname.startsWith("/_ocxr/")) { + return jsonResponse({ error: "not found" }, 404); + } + return workspaceAsset(req, url); + } const target = privateUrl(auth.instance, url); const assertion = signGatewayAssertion(config, { instanceId: auth.instance.id, @@ -261,7 +486,7 @@ gatewayServer = Bun.serve({ const wsTarget = new URL(target); wsTarget.protocol = "ws:"; const upgraded = server.upgrade(req, { - data: { instance: auth.instance, userId: auth.userId, url: wsTarget, headers, queued: [] }, + data: { kind: "proxy", instance: auth.instance, userId: auth.userId, url: wsTarget, headers, queued: [] }, }); return upgraded ? undefined : new Response("WebSocket upgrade failed", { status: 502 }); } @@ -304,26 +529,106 @@ gatewayServer = Bun.serve({ websocket: { open(ws) { trackSocket(ws); - const upstream = new WebSocket(ws.data.url, { headers: Object.fromEntries(ws.data.headers) } as never); - ws.data.upstream = upstream; - upstream.binaryType = "arraybuffer"; - upstream.addEventListener("open", () => { - for (const message of ws.data.queued.splice(0)) upstream.send(message); - }); - upstream.addEventListener("message", event => { - if (typeof event.data === "string") ws.send(event.data); - else if (event.data instanceof ArrayBuffer) ws.send(event.data); - }); - upstream.addEventListener("close", event => ws.close(event.code, event.reason)); - upstream.addEventListener("error", () => ws.close(1011, "upstream error")); + if (ws.data.kind === "proxy") { + const data = ws.data; + const upstream = new WebSocket(data.url, { headers: Object.fromEntries(data.headers) } as never); + data.upstream = upstream; + upstream.binaryType = "arraybuffer"; + upstream.addEventListener("open", () => { + for (const message of data.queued.splice(0)) upstream.send(message); + }); + upstream.addEventListener("message", event => { + if (typeof event.data === "string") ws.send(event.data); + else if (event.data instanceof ArrayBuffer) ws.send(event.data); + }); + upstream.addEventListener("close", event => ws.close(event.code, event.reason)); + upstream.addEventListener("error", () => ws.close(1011, "upstream error")); + return; + } + if (ws.data.kind === "relay-agent") { + const previous = relayAgents.get(ws.data.device.deviceId); + relayAgents.set(ws.data.device.deviceId, ws); + if (previous && previous !== ws) previous.close(1012, "agent reconnected"); + return; + } + const previous = relayTerminals.get(ws.data.session.id); + relayTerminals.set(ws.data.session.id, ws); + if (previous && previous !== ws) previous.close(1008, "terminal session already connected"); + const agent = relayAgents.get(ws.data.session.deviceId); + if (!agent || agent.data.kind !== "relay-agent") { + ws.close(1013, "remote computer unavailable"); + return; + } + void store.markTerminalConnected(ws.data.session.id); + sendBounded(agent, relayFrame( + RELAY_FRAME_OPEN, + ws.data.session.id, + Buffer.from(JSON.stringify({ commandProfile: ws.data.session.commandProfile })), + )); }, message(ws, message) { - if (ws.data.upstream?.readyState === WebSocket.OPEN) ws.data.upstream.send(message); - else ws.data.queued.push(typeof message === "string" ? message : Buffer.from(message)); + if (ws.data.kind === "proxy") { + if (ws.data.upstream?.readyState === WebSocket.OPEN) ws.data.upstream.send(message); + else ws.data.queued.push(typeof message === "string" ? message : Buffer.from(message)); + return; + } + if (typeof message === "string") { + ws.close(1003, "binary relay frames required"); + return; + } + const bytes = Buffer.from(message); + if (ws.data.kind === "relay-agent") { + let frame: ReturnType; + try { + frame = parseRelayFrame(bytes); + } catch { + ws.close(1008, "invalid relay frame"); + return; + } + const terminal = relayTerminals.get(frame.sessionId); + if (!terminal || terminal.data.kind !== "relay-terminal") return; + if (terminal.data.session.deviceId !== ws.data.device.deviceId) { + ws.close(1008, "relay session ownership mismatch"); + return; + } + if (frame.kind === RELAY_FRAME_CLOSE) terminal.close(1000, "remote terminal closed"); + else sendBounded(terminal, frame.payload); + return; + } + if (bytes.length > RELAY_MAX_PAYLOAD) { + ws.close(1009, "relay frame is too large"); + return; + } + const agent = relayAgents.get(ws.data.session.deviceId); + if (!agent || agent.data.kind !== "relay-agent") { + ws.close(1013, "remote computer unavailable"); + return; + } + sendBounded(agent, relayFrame(RELAY_FRAME_DATA, ws.data.session.id, bytes)); }, close(ws, code, reason) { untrackSocket(ws); - if (ws.data.upstream && ws.data.upstream.readyState < WebSocket.CLOSING) ws.data.upstream.close(code, reason); + if (ws.data.kind === "proxy") { + if (ws.data.upstream && ws.data.upstream.readyState < WebSocket.CLOSING) ws.data.upstream.close(code, reason); + return; + } + if (ws.data.kind === "relay-terminal") { + if (relayTerminals.get(ws.data.session.id) === ws) relayTerminals.delete(ws.data.session.id); + void store.markTerminalClosed(ws.data.session.id); + const agent = relayAgents.get(ws.data.session.deviceId); + if (agent?.data.kind === "relay-agent") { + sendBounded(agent, relayFrame(RELAY_FRAME_CLOSE, ws.data.session.id)); + } + return; + } + if (relayAgents.get(ws.data.device.deviceId) !== ws) return; + relayAgents.delete(ws.data.device.deviceId); + for (const terminal of relayTerminals.values()) { + if (terminal.data.kind === "relay-terminal" && terminal.data.session.deviceId === ws.data.device.deviceId) { + terminal.close(1013, "remote computer disconnected"); + } + } + void store.markRelayDisconnected(ws.data.device.deviceId); }, }, }); diff --git a/platform/server/src/store.ts b/platform/server/src/store.ts index 953da0d9e..96cfe21c2 100644 --- a/platform/server/src/store.ts +++ b/platform/server/src/store.ts @@ -1,4 +1,4 @@ -import { createPublicKey, randomBytes, randomUUID, verify } from "node:crypto"; +import { createHash, createPublicKey, randomBytes, randomUUID, timingSafeEqual, verify } from "node:crypto"; import type { PoolClient } from "pg"; import type { Database } from "./db"; import type { PlatformConfig } from "./config"; @@ -39,12 +39,29 @@ export interface RemoteDeviceActor { deviceId: string; } +export interface RelayDeviceActor extends RemoteDeviceActor { + instanceId: string | null; + name: string; + signingPublicKey: Buffer; + ecdhPublicKey: Buffer; +} + +export interface TerminalSessionRecord { + id: string; + instanceId: string; + deviceId: string; + userId: string; + commandProfile: "shell" | "codex" | "claude"; + expiresAt: string; +} + export interface InstanceRecord { id: string; ownerId: string; name: string; slug: string; privateHostname: string; + transportMode: "mesh-tunnel" | "outbound-relay"; status: InstanceStatus; createdAt: string; updatedAt: string; @@ -54,6 +71,34 @@ export interface RemoteProfile { passwordSet: boolean; canActivate: boolean; instance: (InstanceRecord & { publicUrl: string }) | null; + e2ee: RemoteE2eeEnvelopeRecord | null; + devices: RemoteDeviceRecord[]; +} + +export interface RemoteE2eeEnvelopeRecord { + version: "ocx-e2ee-v1"; + salt: string; + nonce: string; + ciphertext: string; + rootPublicKey: string; + kdf: { + algorithm: "argon2id"; + memoryKiB: number; + iterations: number; + parallelism: number; + outputLength: 32; + }; +} + +export interface RemoteDeviceRecord { + id: string; + name: string; + platform: string; + signingPublicKey: string; + ecdhPublicKey: string | null; + relayOnline: boolean; + lastSeenAt: string | null; + instanceId: string | null; } interface InstanceRow { @@ -63,6 +108,7 @@ interface InstanceRow { slug: string; private_hostname: string; private_origin_ip: string; + transport_mode: "mesh-tunnel" | "outbound-relay"; status: InstanceStatus; created_at: Date; updated_at: Date; @@ -75,6 +121,7 @@ function instanceFromRow(row: InstanceRow): InstanceRecord { name: row.name, slug: row.slug, privateHostname: row.private_hostname, + transportMode: row.transport_mode, status: row.status, createdAt: row.created_at.toISOString(), updatedAt: row.updated_at.toISOString(), @@ -85,6 +132,74 @@ function duplicateConstraint(error: unknown): boolean { return !!error && typeof error === "object" && (error as { code?: string }).code === "23505"; } +const E2EE_AUTH_PREFIX = "ocxe2ee1$"; + +function decodeFixed(value: string, length: number, label: string): Buffer { + const decoded = Buffer.from(value, "base64url"); + if (decoded.length !== length) throw new Error(`${label} must be ${length} bytes`); + return decoded; +} + +function e2eeAuthHash(authSecret: string): string { + const decoded = decodeFixed(authSecret, 32, "auth secret"); + return `${E2EE_AUTH_PREFIX}${createHash("sha256").update(decoded).digest("base64url")}`; +} + +function safeStringEqual(left: string, right: string): boolean { + const a = Buffer.from(left); + const b = Buffer.from(right); + return a.length === b.length && timingSafeEqual(a, b); +} + +function validateE2eeEnvelope(envelope: RemoteE2eeEnvelopeRecord): { + salt: Buffer; nonce: Buffer; ciphertext: Buffer; rootPublicKey: Buffer; +} { + if (envelope.version !== "ocx-e2ee-v1" || envelope.kdf.algorithm !== "argon2id") { + throw new Error("unsupported remote vault profile"); + } + if ( + envelope.kdf.memoryKiB < 32_768 || envelope.kdf.memoryKiB > 262_144 + || envelope.kdf.iterations < 2 || envelope.kdf.iterations > 8 + || envelope.kdf.parallelism < 1 || envelope.kdf.parallelism > 4 + || envelope.kdf.outputLength !== 32 + ) throw new Error("invalid remote vault KDF parameters"); + const ciphertext = Buffer.from(envelope.ciphertext, "base64url"); + if (ciphertext.length < 17 || ciphertext.length > 4096) throw new Error("invalid encrypted remote vault"); + const rootPublicKey = Buffer.from(envelope.rootPublicKey, "base64url"); + if (rootPublicKey.length < 32 || rootPublicKey.length > 128) throw new Error("invalid remote root public key"); + const parsed = createPublicKey({ key: rootPublicKey, format: "der", type: "spki" }); + if (parsed.asymmetricKeyType !== "ed25519") throw new Error("remote root key must be Ed25519"); + return { + salt: decodeFixed(envelope.salt, 16, "vault salt"), + nonce: decodeFixed(envelope.nonce, 12, "vault nonce"), + ciphertext, + rootPublicKey, + }; +} + +function envelopeFromRow(row: { + auth_version: string; + vault_salt: Buffer | null; + vault_nonce: Buffer | null; + encrypted_vault_key: Buffer | null; + vault_kdf: RemoteE2eeEnvelopeRecord["kdf"] | null; + root_public_key: Buffer | null; +} | undefined): RemoteE2eeEnvelopeRecord | null { + if ( + !row || row.auth_version !== "ocx-e2ee-v1" + || !row.vault_salt || !row.vault_nonce || !row.encrypted_vault_key + || !row.vault_kdf || !row.root_public_key + ) return null; + return { + version: "ocx-e2ee-v1", + salt: row.vault_salt.toString("base64url"), + nonce: row.vault_nonce.toString("base64url"), + ciphertext: row.encrypted_vault_key.toString("base64url"), + rootPublicKey: row.root_public_key.toString("base64url"), + kdf: row.vault_kdf, + }; +} + const RESERVED_INSTANCE_SLUGS = new Set([ "account", "admin", "api", "auth", "billing", "login", "official", "status", "support", "verify", "www", @@ -129,9 +244,19 @@ export class PlatformStore { deviceName: string; platform: string; publicKeyDer: Buffer; + ecdhPublicKeyDer?: Buffer; networkSignal: string; }): Promise<{ id: string; pollSecret: string; userCode: string; authorizeUrl: string; expiresAt: string }> { if (input.publicKeyDer.length < 32 || input.publicKeyDer.length > 256) throw new Error("invalid device public key"); + const signingKey = createPublicKey({ key: input.publicKeyDer, type: "spki", format: "der" }); + if (signingKey.asymmetricKeyType !== "ed25519") throw new Error("device signing key must be Ed25519"); + if (input.ecdhPublicKeyDer) { + if (input.ecdhPublicKeyDer.length < 64 || input.ecdhPublicKeyDer.length > 256) throw new Error("invalid device ECDH key"); + const ecdhKey = createPublicKey({ key: input.ecdhPublicKeyDer, type: "spki", format: "der" }); + if (ecdhKey.asymmetricKeyType !== "ec" || ecdhKey.asymmetricKeyDetails?.namedCurve !== "prime256v1") { + throw new Error("device ECDH key must use P-256"); + } + } const pollSecret = issueOpaqueToken("ocxr_device_"); const userCode = issueShortCode(8); const expiresAt = new Date(Date.now() + 10 * 60_000); @@ -152,9 +277,9 @@ export class PlatformStore { } const result = await client.query<{ id: string }>( `INSERT INTO device_authorization_requests( - poll_secret_hash,user_code,device_name,platform,public_key,network_hmac,expires_at - ) VALUES($1,$2,$3,$4,$5,$6,$7) RETURNING id`, - [sha256(pollSecret), userCode, input.deviceName, input.platform, input.publicKeyDer, signal, expiresAt], + poll_secret_hash,user_code,device_name,platform,public_key,ecdh_public_key,network_hmac,expires_at + ) VALUES($1,$2,$3,$4,$5,$6,$7,$8) RETURNING id`, + [sha256(pollSecret), userCode, input.deviceName, input.platform, input.publicKeyDer, input.ecdhPublicKeyDer ?? null, signal, expiresAt], ); return result.rows[0].id; }); @@ -198,10 +323,10 @@ export class PlatformStore { async approveDeviceAuthorization(actor: Actor, id: string): Promise { const display = await this.db.transaction(async client => { const pending = await client.query<{ - device_name: string; platform: string; public_key: Buffer; expires_at: Date; + device_name: string; platform: string; public_key: Buffer; ecdh_public_key: Buffer | null; expires_at: Date; approved_by: string | null; consumed_at: Date | null; }>( - `SELECT device_name,platform,public_key,expires_at,approved_by,consumed_at + `SELECT device_name,platform,public_key,ecdh_public_key,expires_at,approved_by,consumed_at FROM device_authorization_requests WHERE id=$1 FOR UPDATE`, [id], ); @@ -212,20 +337,28 @@ export class PlatformStore { if (request.approved_by && request.approved_by !== actor.id) throw new Error("device authorization already approved"); if (!request.approved_by) { const token = issueOpaqueToken("ocxr_device_"); + const relayToken = issueOpaqueToken("ocxr_agent_"); const device = await client.query<{ id: string }>( - `INSERT INTO remote_devices(user_id,name,platform,public_key,token_hash,last_seen_at) - VALUES($1,$2,$3,$4,$5,now()) + `INSERT INTO remote_devices(user_id,name,platform,public_key,ecdh_public_key,token_hash,relay_token_hash,last_seen_at) + VALUES($1,$2,$3,$4,$5,$6,$7,now()) ON CONFLICT(user_id,public_key) DO UPDATE SET - name=excluded.name,platform=excluded.platform,token_hash=excluded.token_hash, + name=excluded.name,platform=excluded.platform,ecdh_public_key=excluded.ecdh_public_key, + token_hash=excluded.token_hash,relay_token_hash=excluded.relay_token_hash, last_seen_at=now(),revoked_at=NULL RETURNING id`, - [actor.id, request.device_name, request.platform, request.public_key, sha256(token)], + [actor.id, request.device_name, request.platform, request.public_key, request.ecdh_public_key, sha256(token), sha256(relayToken)], ); await client.query( `UPDATE device_authorization_requests SET - approved_by=$2,approved_at=now(),device_id=$3,encrypted_device_token=$4 + approved_by=$2,approved_at=now(),device_id=$3,encrypted_device_token=$4,encrypted_relay_token=$5 WHERE id=$1`, - [id, actor.id, device.rows[0].id, encryptSecret(token, this.config.encryptionKey)], + [ + id, + actor.id, + device.rows[0].id, + encryptSecret(token, this.config.encryptionKey), + encryptSecret(relayToken, this.config.encryptionKey), + ], ); await this.audit(client, actor.id, "remote_device.approve", null, "success"); } @@ -240,14 +373,16 @@ export class PlatformStore { status: DeviceAuthorizationDisplay["status"]; deviceId?: string; deviceToken?: string; + relayToken?: string; + relayUrl?: string; user?: { name: string; email: string; githubNumericId: string }; } | null> { const result = await this.db.query<{ expires_at: Date; approved_at: Date | null; consumed_at: Date | null; - device_id: string | null; encrypted_device_token: Buffer | null; + device_id: string | null; encrypted_device_token: Buffer | null; encrypted_relay_token: Buffer | null; name: string | null; email: string | null; github_numeric_id: string | null; }>( - `SELECT r.expires_at,r.approved_at,r.consumed_at,r.device_id,r.encrypted_device_token, + `SELECT r.expires_at,r.approved_at,r.consumed_at,r.device_id,r.encrypted_device_token,r.encrypted_relay_token, u.name,u.email,u.github_numeric_id FROM device_authorization_requests r LEFT JOIN users u ON u.id=r.approved_by @@ -265,13 +400,17 @@ export class PlatformStore { status: "approved", deviceId: row.device_id, deviceToken: decryptSecret(row.encrypted_device_token, this.config.encryptionKey), + ...(row.encrypted_relay_token ? { + relayToken: decryptSecret(row.encrypted_relay_token, this.config.encryptionKey), + relayUrl: this.config.PLATFORM_RELAY_URL, + } : {}), user: { name: row.name, email: row.email, githubNumericId: row.github_numeric_id }, }; } async acknowledgeDeviceAuthorization(id: string, pollSecret: string): Promise { const result = await this.db.query( - `UPDATE device_authorization_requests SET consumed_at=now(),encrypted_device_token=NULL + `UPDATE device_authorization_requests SET consumed_at=now(),encrypted_device_token=NULL,encrypted_relay_token=NULL WHERE id=$1 AND poll_secret_hash=$2 AND approved_at IS NOT NULL AND consumed_at IS NULL AND expires_at>now()`, [id, sha256(pollSecret)], @@ -306,21 +445,250 @@ export class PlatformStore { }; } + async rotateRelayCredentials(actor: Actor, deviceId: string, ecdhPublicKey: Buffer): Promise<{ + relayToken: string; + relayUrl: string; + }> { + const parsed = createPublicKey({ key: ecdhPublicKey, type: "spki", format: "der" }); + if (parsed.asymmetricKeyType !== "ec" || parsed.asymmetricKeyDetails?.namedCurve !== "prime256v1") { + throw new Error("device ECDH key must use P-256"); + } + const relayToken = issueOpaqueToken("ocxr_agent_"); + const result = await this.db.query( + `UPDATE remote_devices SET ecdh_public_key=$3,relay_token_hash=$4, + relay_connected_at=NULL,relay_disconnected_at=now(),updated_at=now() + WHERE id=$1 AND user_id=$2 AND revoked_at IS NULL`, + [deviceId, actor.id, ecdhPublicKey, sha256(relayToken)], + ); + if (!result.rowCount) throw new Error("remote device is unavailable"); + return { relayToken, relayUrl: this.config.PLATFORM_RELAY_URL }; + } + + async authorizeRelayToken(token: string): Promise { + if (!token.startsWith("ocxr_agent_")) return null; + return this.db.transaction(async client => { + const result = await client.query<{ + device_id: string; instance_id: string | null; device_name: string; + signing_public_key: Buffer; ecdh_public_key: Buffer | null; + id: string; name: string; email: string; github_numeric_id: string; + role: "admin" | "user"; status: "active"; + }>( + `UPDATE remote_devices d SET relay_connected_at=now(),relay_disconnected_at=NULL,last_seen_at=now(),updated_at=now() + FROM users u,instances i + WHERE d.relay_token_hash=$1 AND d.revoked_at IS NULL AND u.id=d.user_id AND u.status='active' + AND i.id=d.instance_id AND i.owner_id=d.user_id AND i.transport_mode='outbound-relay' + AND i.deleted_at IS NULL AND i.status NOT IN ('suspending','suspended','deleting','deleted') + RETURNING d.id AS device_id,d.instance_id,d.name AS device_name, + d.public_key AS signing_public_key,d.ecdh_public_key, + u.id,u.name,u.email,u.github_numeric_id,u.role,u.status`, + [sha256(token)], + ); + const row = result.rows[0]; + if (!row || !row.instance_id || !row.ecdh_public_key) return null; + await client.query( + `UPDATE instances SET status='online',updated_at=now() + WHERE id=$1 AND owner_id=$2 AND transport_mode='outbound-relay' AND deleted_at IS NULL`, + [row.instance_id, row.id], + ); + await client.query( + "SELECT pg_notify('instance_state',$1)", + [JSON.stringify({ instanceId: row.instance_id, status: "online" })], + ); + return { + deviceId: row.device_id, + instanceId: row.instance_id, + name: row.device_name, + signingPublicKey: row.signing_public_key, + ecdhPublicKey: row.ecdh_public_key, + actor: { + id: row.id, + name: row.name, + email: row.email, + githubNumericId: row.github_numeric_id, + role: row.role, + status: row.status, + }, + }; + }); + } + + async markRelayDisconnected(deviceId: string): Promise { + await this.db.transaction(async client => { + const disconnected = await client.query<{ instance_id: string | null }>( + `UPDATE remote_devices SET relay_disconnected_at=now(),updated_at=now() + WHERE id=$1 AND relay_disconnected_at IS NULL RETURNING instance_id`, + [deviceId], + ); + const instanceId = disconnected.rows[0]?.instance_id; + if (!instanceId) return; + const offline = await client.query( + `UPDATE instances i SET status='offline',updated_at=now() + WHERE i.id=$1 AND i.transport_mode='outbound-relay' AND i.deleted_at IS NULL + AND NOT EXISTS ( + SELECT 1 FROM remote_devices d + WHERE d.instance_id=i.id AND d.revoked_at IS NULL + AND d.relay_connected_at IS NOT NULL + AND (d.relay_disconnected_at IS NULL OR d.relay_connected_at>d.relay_disconnected_at) + )`, + [instanceId], + ); + if (offline.rowCount) { + await client.query( + "SELECT pg_notify('instance_state',$1)", + [JSON.stringify({ instanceId, status: "offline" })], + ); + } + }); + } + + async listRelayDevices(userId: string, instanceId: string): Promise { + const result = await this.db.query<{ + id: string; name: string; platform: string; public_key: Buffer; ecdh_public_key: Buffer | null; + relay_connected_at: Date | null; relay_disconnected_at: Date | null; last_seen_at: Date | null; instance_id: string | null; + }>( + `SELECT id,name,platform,public_key,ecdh_public_key,relay_connected_at,relay_disconnected_at,last_seen_at,instance_id + FROM remote_devices + WHERE user_id=$1 AND instance_id=$2 AND revoked_at IS NULL + ORDER BY lower(name),created_at`, + [userId, instanceId], + ); + return result.rows.map(device => ({ + id: device.id, + name: device.name, + platform: device.platform, + signingPublicKey: device.public_key.toString("base64url"), + ecdhPublicKey: device.ecdh_public_key?.toString("base64url") ?? null, + relayOnline: !!device.relay_connected_at + && (!device.relay_disconnected_at || device.relay_connected_at > device.relay_disconnected_at), + lastSeenAt: device.last_seen_at?.toISOString() ?? null, + instanceId: device.instance_id, + })); + } + + async createTerminalSession( + userId: string, + instanceId: string, + deviceId: string, + commandProfile: TerminalSessionRecord["commandProfile"], + ): Promise { + return this.db.transaction(async client => { + await client.query( + `UPDATE terminal_sessions SET status='expired',closed_at=now(),updated_at=now() + WHERE expires_at<=now() AND status IN ('pending','connected')`, + ); + const device = await client.query( + `SELECT 1 FROM remote_devices + WHERE id=$1 AND user_id=$2 AND instance_id=$3 AND revoked_at IS NULL AND ecdh_public_key IS NOT NULL + FOR UPDATE`, + [deviceId, userId, instanceId], + ); + if (!device.rowCount) throw new Error("remote computer is unavailable"); + const active = await client.query<{ count: string }>( + `SELECT count(*)::text AS count FROM terminal_sessions + WHERE device_id=$1 AND status IN ('pending','connected') AND expires_at>now()`, + [deviceId], + ); + if (Number(active.rows[0]?.count ?? "0") >= 4) throw new Error("remote computer session limit reached"); + const browserToken = issueOpaqueToken("ocxr_session_"); + const expiresAt = new Date(Date.now() + 12 * 60 * 60_000); + const inserted = await client.query<{ id: string }>( + `INSERT INTO terminal_sessions(instance_id,device_id,user_id,browser_token_hash,command_profile,expires_at) + VALUES($1,$2,$3,$4,$5,$6) RETURNING id`, + [instanceId, deviceId, userId, sha256(browserToken), commandProfile, expiresAt], + ); + return { + id: inserted.rows[0].id, + instanceId, + deviceId, + userId, + commandProfile, + expiresAt: expiresAt.toISOString(), + }; + }); + } + + async resolveTerminalSession( + userId: string, + instanceId: string, + terminalSessionId: string, + ): Promise { + const result = await this.db.query<{ + id: string; instance_id: string; device_id: string; user_id: string; + command_profile: TerminalSessionRecord["commandProfile"]; expires_at: Date; + }>( + `SELECT id,instance_id,device_id,user_id,command_profile,expires_at + FROM terminal_sessions + WHERE id=$1 AND user_id=$2 AND instance_id=$3 + AND status IN ('pending','connected') AND expires_at>now()`, + [terminalSessionId, userId, instanceId], + ); + const row = result.rows[0]; + return row ? { + id: row.id, + instanceId: row.instance_id, + deviceId: row.device_id, + userId: row.user_id, + commandProfile: row.command_profile, + expiresAt: row.expires_at.toISOString(), + } : null; + } + + async markTerminalConnected(sessionId: string): Promise { + await this.db.query( + `UPDATE terminal_sessions SET status='connected',connected_at=coalesce(connected_at,now()),updated_at=now() + WHERE id=$1 AND status IN ('pending','connected') AND expires_at>now()`, + [sessionId], + ); + } + + async markTerminalClosed(sessionId: string): Promise { + await this.db.query( + `UPDATE terminal_sessions SET status='closed',closed_at=now(),updated_at=now() + WHERE id=$1 AND status IN ('pending','connected')`, + [sessionId], + ); + } + async remoteProfile(actor: Actor): Promise { - const [profile, instance] = await Promise.all([ - this.db.query<{ password_set: boolean }>( - "SELECT password_hash IS NOT NULL AS password_set FROM remote_access_profiles WHERE user_id=$1", + const [profile, instance, devices] = await Promise.all([ + this.db.query<{ + password_set: boolean; auth_version: string; vault_salt: Buffer | null; vault_nonce: Buffer | null; + encrypted_vault_key: Buffer | null; vault_kdf: RemoteE2eeEnvelopeRecord["kdf"] | null; root_public_key: Buffer | null; + }>( + `SELECT (password_hash IS NOT NULL AND auth_version='ocx-e2ee-v1') AS password_set,auth_version,vault_salt,vault_nonce, + encrypted_vault_key,vault_kdf,root_public_key + FROM remote_access_profiles WHERE user_id=$1`, [actor.id], ), this.db.query( "SELECT * FROM instances WHERE owner_id=$1 AND deleted_at IS NULL ORDER BY created_at DESC LIMIT 1", [actor.id], ), + this.db.query<{ + id: string; name: string; platform: string; public_key: Buffer; ecdh_public_key: Buffer | null; + relay_connected_at: Date | null; relay_disconnected_at: Date | null; last_seen_at: Date | null; instance_id: string | null; + }>( + `SELECT id,name,platform,public_key,ecdh_public_key,relay_connected_at,relay_disconnected_at,last_seen_at,instance_id + FROM remote_devices WHERE user_id=$1 AND revoked_at IS NULL ORDER BY created_at`, + [actor.id], + ), ]); const current = instance.rows[0] ? instanceFromRow(instance.rows[0]) : null; return { passwordSet: profile.rows[0]?.password_set ?? false, canActivate: actor.status === "active", + e2ee: envelopeFromRow(profile.rows[0]), + devices: devices.rows.map(device => ({ + id: device.id, + name: device.name, + platform: device.platform, + signingPublicKey: device.public_key.toString("base64url"), + ecdhPublicKey: device.ecdh_public_key?.toString("base64url") ?? null, + relayOnline: !!device.relay_connected_at + && (!device.relay_disconnected_at || device.relay_connected_at > device.relay_disconnected_at), + lastSeenAt: device.last_seen_at?.toISOString() ?? null, + instanceId: device.instance_id, + })), instance: current ? { ...current, publicUrl: `https://${current.slug}.${this.config.PLATFORM_INSTANCE_DOMAIN}`, @@ -352,6 +720,40 @@ export class PlatformStore { }); } + async setRemoteE2eeProfile(actor: Actor, authSecret: string, envelope: RemoteE2eeEnvelopeRecord): Promise { + const material = validateE2eeEnvelope(envelope); + const passwordHash = e2eeAuthHash(authSecret); + await this.db.transaction(async client => { + await client.query( + `INSERT INTO remote_access_profiles( + user_id,password_hash,password_set_at,auth_version,vault_salt,vault_nonce, + encrypted_vault_key,vault_kdf,root_public_key + ) VALUES($1,$2,now(),'ocx-e2ee-v1',$3,$4,$5,$6,$7) + ON CONFLICT(user_id) DO UPDATE SET + password_hash=excluded.password_hash,password_set_at=now(),auth_version='ocx-e2ee-v1', + vault_salt=excluded.vault_salt,vault_nonce=excluded.vault_nonce, + encrypted_vault_key=excluded.encrypted_vault_key,vault_kdf=excluded.vault_kdf, + root_public_key=excluded.root_public_key,failed_attempts=0,locked_until=NULL,updated_at=now()`, + [actor.id, passwordHash, material.salt, material.nonce, material.ciphertext, JSON.stringify(envelope.kdf), material.rootPublicKey], + ); + await client.query( + "UPDATE instance_sessions SET revoked_at=now() WHERE user_id=$1 AND revoked_at IS NULL", + [actor.id], + ); + await this.audit(client, actor.id, "remote_e2ee_profile.set", null, "success"); + }); + } + + async changeRemoteE2eeProfile( + actor: Actor, + oldAuthSecret: string, + newAuthSecret: string, + envelope: RemoteE2eeEnvelopeRecord, + ): Promise { + await this.verifyRemotePassword(actor, oldAuthSecret); + await this.setRemoteE2eeProfile(actor, newAuthSecret, envelope); + } + async activateRemoteInstance( actor: Actor, deviceId: string, @@ -359,20 +761,34 @@ export class PlatformStore { ): Promise { if (actor.status !== "active") throw new Error("private beta access is required"); const password = await this.db.query( - "SELECT 1 FROM remote_access_profiles WHERE user_id=$1 AND password_hash IS NOT NULL", + `SELECT 1 FROM remote_access_profiles + WHERE user_id=$1 AND password_hash IS NOT NULL AND auth_version='ocx-e2ee-v1'`, [actor.id], ); - if (!password.rowCount) throw new Error("set a remote password first"); + if (!password.rowCount) throw new Error("set an end-to-end encrypted remote password first"); const existing = await this.db.query( "SELECT * FROM instances WHERE owner_id=$1 AND deleted_at IS NULL LIMIT 1", [actor.id], ); - const instance = existing.rows[0] ? instanceFromRow(existing.rows[0]) : await this.createInstance(actor, input); + let instance = existing.rows[0] ? instanceFromRow(existing.rows[0]) : await this.createRelayWorkspace(actor, input.slug); + if (instance.transportMode === "mesh-tunnel") { + if (instance.slug !== input.slug.trim().toLowerCase()) throw new Error("existing remote domain must be preserved during relay upgrade"); + const upgraded = await this.db.query( + `UPDATE instances SET transport_mode='outbound-relay',status='awaiting_agent',updated_at=now() + WHERE id=$1 AND owner_id=$2 AND deleted_at IS NULL RETURNING *`, + [instance.id, actor.id], + ); + instance = instanceFromRow(upgraded.rows[0]); + await this.db.query( + "SELECT pg_notify('instance_state',$1)", + [JSON.stringify({ instanceId: instance.id, status: "awaiting_agent" })], + ); + } const linked = await this.db.query( - `UPDATE remote_devices SET instance_id=$3,updated_at=now() + `UPDATE remote_devices SET instance_id=$3,name=$4,updated_at=now() WHERE id=$1 AND user_id=$2 AND revoked_at IS NULL`, - [deviceId, actor.id, instance.id], + [deviceId, actor.id, instance.id, input.name.trim()], ); if (!linked.rowCount) throw new Error("remote device is unavailable"); return this.remoteProfile(actor); @@ -473,6 +889,30 @@ export class PlatformStore { } } + async createRelayWorkspace(actor: Actor, requestedSlug: string): Promise { + if (actor.status !== "active") throw new Error("invite required"); + const slug = requestedSlug.trim().toLowerCase(); + if (!validInstanceSlug(slug)) throw new Error("invalid or reserved slug"); + const privateHostname = `relay-${randomBytes(20).toString("hex")}.invalid`; + const privateOriginIp = issuePrivateOriginIp(); + try { + return await this.db.transaction(async client => { + const tombstone = await client.query("SELECT 1 FROM slug_tombstones WHERE slug=$1 AND expires_at>now()", [slug]); + if (tombstone.rowCount) throw new Error("slug is temporarily reserved"); + const result = await client.query( + `INSERT INTO instances(owner_id,name,slug,private_hostname,private_origin_ip,status,transport_mode) + VALUES($1,$2,$3,$4,$5,'awaiting_agent','outbound-relay') RETURNING *`, + [actor.id, `${actor.name} Remote`, slug, privateHostname, privateOriginIp], + ); + await this.audit(client, actor.id, "relay_workspace.create", result.rows[0].id, "success"); + return instanceFromRow(result.rows[0]); + }); + } catch (error) { + if (duplicateConstraint(error)) throw new Error("domain is unavailable or workspace already exists"); + throw error; + } + } + async createPairingCode(actor: Actor, instanceId: string): Promise<{ code: string; expiresAt: string }> { const instance = await this.getOwnedInstance(actor, instanceId); if (!instance || !["awaiting_agent", "connecting", "offline"].includes(instance.status)) throw new Error("instance is not ready for pairing"); @@ -599,7 +1039,12 @@ export class PlatformStore { const row = profile.rows[0]; if (!row?.password_hash) return "invalid" as const; if (row.locked_until && row.locked_until.getTime() > Date.now()) return "locked" as const; - const valid = await Bun.password.verify(password, row.password_hash); + let valid = false; + if (row.password_hash.startsWith(E2EE_AUTH_PREFIX)) { + try { valid = safeStringEqual(row.password_hash, e2eeAuthHash(password)); } catch { valid = false; } + } else { + valid = await Bun.password.verify(password, row.password_hash); + } if (!valid) { const attempts = row.failed_attempts + 1; await client.query( @@ -628,7 +1073,11 @@ export class PlatformStore { [instanceId, actor.id], ); const instance = result.rows[0] ? instanceFromRow(result.rows[0]) : null; - if (!instance || !["online", "degraded"].includes(instance.status)) throw new Error("instance is unavailable"); + const available = instance && ( + ["online", "degraded"].includes(instance.status) + || (instance.transportMode === "outbound-relay" && ["awaiting_agent", "offline"].includes(instance.status)) + ); + if (!available) throw new Error("instance is unavailable"); await this.verifyRemotePassword(actor, password); const code = randomBytes(32).toString("base64url"); await this.db.query( @@ -656,7 +1105,10 @@ export class PlatformStore { JOIN instances i ON i.id=c.instance_id JOIN users u ON u.id=c.user_id WHERE c.code_hash=$1 AND c.consumed_at IS NULL AND c.expires_at>now() - AND i.slug=$2 AND i.status IN ('online','degraded') AND u.status='active' + AND i.slug=$2 AND ( + i.status IN ('online','degraded') + OR (i.transport_mode='outbound-relay' AND i.status IN ('awaiting_agent','offline')) + ) AND u.status='active' FOR UPDATE OF c`, [sha256(code), this.slugFromHost(host)], ); @@ -680,7 +1132,10 @@ export class PlatformStore { if (!slug) return null; const instanceResult = await this.db.query( `SELECT i.* FROM instances i JOIN users u ON u.id=i.owner_id - WHERE i.slug=$1 AND i.status IN ('online','degraded') AND i.deleted_at IS NULL AND u.status='active'`, + WHERE i.slug=$1 AND ( + i.status IN ('online','degraded') + OR (i.transport_mode='outbound-relay' AND i.status IN ('awaiting_agent','offline')) + ) AND i.deleted_at IS NULL AND u.status='active'`, [slug], ); const row = instanceResult.rows[0]; diff --git a/platform/server/tests/postgres-integration.test.ts b/platform/server/tests/postgres-integration.test.ts index b53cefaf2..23ed058c3 100644 --- a/platform/server/tests/postgres-integration.test.ts +++ b/platform/server/tests/postgres-integration.test.ts @@ -1,9 +1,11 @@ import { expect, test } from "bun:test"; import { generateKeyPairSync, randomBytes } from "node:crypto"; -import { readFileSync } from "node:fs"; +import { chmodSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; import { join } from "node:path"; import { Pool } from "pg"; import { verifyRemoteManagementAssertion } from "../../../src/server/remote-assertion"; +import { BrowserTerminalCipher, type RemoteVault } from "../../web/src/e2ee"; import { createPlatformAuth } from "../src/auth"; import { loadPlatformConfig } from "../src/config"; import { Database } from "../src/db"; @@ -83,12 +85,13 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa const processes: Array> = []; let database: Database | null = null; let fakeAgent: ReturnType | null = null; + const temporaryDirectory = mkdtempSync(join(tmpdir(), "ocxr-relay-integration-")); try { await adminPool.query(`CREATE DATABASE ${quotedDatabaseName}`); const migrationPool = new Pool({ connectionString: databaseUrl.toString(), max: 1 }); try { - for (const migrationName of ["0001_remote_platform.sql", "0002_remote_devices.sql"]) { + for (const migrationName of ["0001_remote_platform.sql", "0002_remote_devices.sql", "0003_outbound_e2ee_relay.sql"]) { const migration = readFileSync(join(import.meta.dir, "..", "migrations", migrationName), "utf8"); await migrationPool.query(migration); } @@ -117,6 +120,7 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa PLATFORM_SYNTHETIC_HEALTH_TOKEN: randomBytes(32).toString("base64url"), PLATFORM_CONTROL_PORT: String(controlPort), PLATFORM_GATEWAY_PORT: String(gatewayPort), + PLATFORM_RELAY_URL: `ws://127.0.0.1:${gatewayPort}/_ocxr/agent`, CLOUDFLARE_MESH_ENABLED: "false", BETTER_AUTH_SECRET: randomBytes(32).toString("hex"), GITHUB_CLIENT_ID: "integration-client", @@ -227,10 +231,83 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect(await store.remoteProfile(firstActor)).toMatchObject({ passwordSet: false, canActivate: true, instance: null }); await store.setRemotePassword(firstActor, "integration-password"); await store.setRemotePassword(secondActor, "second-integration-password"); - expect(await store.remoteProfile(firstActor)).toMatchObject({ passwordSet: true, canActivate: true, instance: null }); + // Legacy password hashes remain valid for the rollback Mesh path but must + // not masquerade as an end-to-end encrypted profile in the new GUI. + expect(await store.remoteProfile(firstActor)).toMatchObject({ passwordSet: false, canActivate: true, instance: null }); expect(await store.acknowledgeDeviceAuthorization(deviceLink.id, deviceLink.pollSecret)).toBe(true); expect((await store.pollDeviceAuthorization(deviceLink.id, deviceLink.pollSecret))?.status).toBe("consumed"); + const relayUser = await adapter.createOAuthUser( + { + name: "Relay User", + email: "relay@example.test", + emailVerified: true, + image: null, + githubNumericId: "333333", + } as Parameters[0] & { githubNumericId: string }, + { accountId: "333333", providerId: "github", accessToken: "discard-me" }, + ); + await database.query("UPDATE users SET status='active' WHERE id=$1", [relayUser.user.id]); + const relayActor = await store.authorizeUser({ + id: relayUser.user.id, + name: relayUser.user.name, + email: relayUser.user.email, + githubNumericId: "333333", + }); + if (!relayActor) throw new Error("relay actor was not authorized"); + const relaySigning = generateKeyPairSync("ed25519"); + const relayEcdh = generateKeyPairSync("ec", { namedCurve: "prime256v1" }); + const relayLink = await store.createDeviceAuthorization({ + deviceName: "Relay workstation", + platform: "linux-x64", + publicKeyDer: relaySigning.publicKey.export({ type: "spki", format: "der" }), + ecdhPublicKeyDer: relayEcdh.publicKey.export({ type: "spki", format: "der" }), + networkSignal: "127.0.0.1", + }); + await store.approveDeviceAuthorization(relayActor, relayLink.id); + const relayApproval = await store.pollDeviceAuthorization(relayLink.id, relayLink.pollSecret); + expect(relayApproval?.relayToken?.startsWith("ocxr_agent_")).toBe(true); + const rootKey = generateKeyPairSync("ed25519"); + const rootPublicKey = rootKey.publicKey.export({ type: "spki", format: "der" }); + const relayAuthSecret = randomBytes(32).toString("base64url"); + await store.setRemoteE2eeProfile(relayActor, relayAuthSecret, { + version: "ocx-e2ee-v1", + salt: randomBytes(16).toString("base64url"), + nonce: randomBytes(12).toString("base64url"), + ciphertext: randomBytes(48).toString("base64url"), + rootPublicKey: rootPublicKey.toString("base64url"), + kdf: { algorithm: "argon2id", memoryKiB: 65_536, iterations: 3, parallelism: 1, outputLength: 32 }, + }); + const relayWorkspace = await store.activateRemoteInstance( + relayActor, + relayApproval?.deviceId ?? "", + { name: "Relay workstation", slug: "relay-user" }, + ); + expect(relayWorkspace).toMatchObject({ + passwordSet: true, + instance: { slug: "relay-user", transportMode: "outbound-relay", status: "awaiting_agent" }, + }); + const relayConnection = await store.authorizeRelayToken(relayApproval?.relayToken ?? ""); + expect(relayConnection).toMatchObject({ actor: { id: relayActor.id }, name: "Relay workstation" }); + const terminal = await store.createTerminalSession( + relayActor.id, + relayWorkspace.instance!.id, + relayConnection!.deviceId, + "codex", + ); + expect(await store.resolveTerminalSession(relayActor.id, relayWorkspace.instance!.id, terminal.id)).toMatchObject({ + id: terminal.id, + commandProfile: "codex", + }); + await store.markTerminalConnected(terminal.id); + await store.markTerminalClosed(terminal.id); + expect(await store.resolveTerminalSession(relayActor.id, relayWorkspace.instance!.id, terminal.id)).toBeNull(); + expect(await store.issueInstanceAuthorization(relayActor, relayWorkspace.instance!.id, relayAuthSecret)).toStartWith( + "https://relay-user.instances.example.test/_ocxr/exchange?code=", + ); + await store.markRelayDisconnected(relayConnection!.deviceId); + expect((await store.remoteProfile(relayActor)).instance?.status).toBe("offline"); + let firstInstanceId: string | null = null; let upstreamStreamCancelled = false; fakeAgent = Bun.serve({ @@ -343,6 +420,110 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa const response = await fetch(`http://127.0.0.1:${controlPort}/healthz`); return response.ok ? true : null; }); + + const relayStatePath = join(temporaryDirectory, "remote.json"); + const relayVault: RemoteVault = { + version: 1, + vaultKey: randomBytes(32).toString("base64url"), + rootPrivateKeyPem: rootKey.privateKey.export({ type: "pkcs8", format: "pem" }).toString(), + }; + writeFileSync(relayStatePath, JSON.stringify({ + version: 2, + state: "connected", + relayUrl: environment.PLATFORM_RELAY_URL, + relayToken: relayApproval?.relayToken, + deviceId: relayApproval?.deviceId, + privateKeyPem: relaySigning.privateKey.export({ type: "pkcs8", format: "pem" }).toString(), + e2ee: { rootPublicKey: rootPublicKey.toString("base64url") }, + instance: { id: relayWorkspace.instance!.id }, + }), { mode: 0o600 }); + chmodSync(relayStatePath, 0o600); + const relayAgent = Bun.spawn([ + join(platformRoot, "..", "remote-agent", "target", "debug", "opencodex-remote-agent"), + "relay", + "--state", + relayStatePath, + ], { + cwd: join(platformRoot, ".."), + env: environment, + stdout: "pipe", + stderr: "pipe", + }); + processes.push(relayAgent); + const relayAuthorizationUrl = new URL(await store.issueInstanceAuthorization( + relayActor, + relayWorkspace.instance!.id, + relayAuthSecret, + )); + const relayExchange = await fetch( + `http://127.0.0.1:${gatewayPort}${relayAuthorizationUrl.pathname}${relayAuthorizationUrl.search}`, + { headers: { host: "relay-user.instances.example.test" }, redirect: "manual" }, + ); + expect(relayExchange.status).toBe(302); + const relaySessionCookie = relayExchange.headers.get("set-cookie")?.split(";", 1)[0]; + expect(relaySessionCookie).toStartWith("__Host-ocxr_instance="); + const relayWorkspaceView = await waitFor(async () => { + if (relayAgent.exitCode !== null) throw new Error("Rust relay Agent exited during startup"); + const response = await fetch(`http://127.0.0.1:${gatewayPort}/api/v1/workspace`, { + headers: { host: "relay-user.instances.example.test", cookie: relaySessionCookie! }, + }); + if (!response.ok) return null; + const body = await response.json() as { devices: Array<{ id: string; relayOnline: boolean }> }; + return body.devices.some(device => device.id === relayApproval?.deviceId && device.relayOnline) ? body : null; + }); + expect(relayWorkspaceView.devices).toHaveLength(1); + const missingWorkspaceAsset = await fetch(`http://127.0.0.1:${gatewayPort}/assets/missing-workspace.js`, { + headers: { host: "relay-user.instances.example.test", cookie: relaySessionCookie! }, + }); + expect(missingWorkspaceAsset.status).toBe(404); + expect(await missingWorkspaceAsset.text()).toBe("Not found"); + const terminalResponse = await fetch(`http://127.0.0.1:${gatewayPort}/api/v1/terminal-sessions`, { + method: "POST", + headers: { + host: "relay-user.instances.example.test", + cookie: relaySessionCookie!, + "content-type": "application/json", + }, + body: JSON.stringify({ deviceId: relayApproval?.deviceId, commandProfile: "shell" }), + }); + expect(terminalResponse.status).toBe(201); + const terminalBody = await terminalResponse.json() as { session: { id: string }; websocketPath: string }; + const terminalSocket = new WebSocket( + `ws://127.0.0.1:${gatewayPort}${terminalBody.websocketPath}`, + { headers: { host: "relay-user.instances.example.test", cookie: relaySessionCookie! } } as never, + ); + terminalSocket.binaryType = "arraybuffer"; + await new Promise((resolve, reject) => { + terminalSocket.addEventListener("open", () => resolve(), { once: true }); + terminalSocket.addEventListener("error", () => reject(new Error("terminal WebSocket failed to open")), { once: true }); + }); + const terminalCipher = await BrowserTerminalCipher.handshake( + terminalSocket, + terminalBody.session.id, + "shell", + { + id: relayApproval!.deviceId!, + signingPublicKey: relaySigning.publicKey.export({ type: "spki", format: "der" }).toString("base64url"), + }, + relayVault, + ); + let terminalOutput = ""; + let terminalReceiveQueue = Promise.resolve(); + terminalSocket.addEventListener("message", event => { + if (!(event.data instanceof ArrayBuffer)) return; + terminalReceiveQueue = terminalReceiveQueue.then(async () => { + const plaintext = await terminalCipher.decrypt(event.data); + if (plaintext[0] === 3) terminalOutput += new TextDecoder().decode(plaintext.subarray(1)); + }); + }); + const terminalCommand = new TextEncoder().encode("printf 'OCXR_RELAY_OK\\n'; exit\\n"); + const applicationInput = new Uint8Array(1 + terminalCommand.length); + applicationInput[0] = 1; + applicationInput.set(terminalCommand, 1); + terminalSocket.send(await terminalCipher.encrypt(applicationInput)); + await waitFor(async () => terminalOutput.includes("OCXR_RELAY_OK") ? true : null, 10_000); + expect(terminalOutput).toContain("OCXR_RELAY_OK"); + terminalSocket.close(); const spa = await fetch(`http://127.0.0.1:${controlPort}/instances/first`); expect(spa.status).toBe(200); expect(spa.headers.get("content-type")).toContain("text/html"); @@ -351,21 +532,12 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect(missingApi.status).toBe(404); expect(missingApi.headers.get("content-type")).toContain("application/json"); - const createResponse = await fetch(`http://127.0.0.1:${controlPort}/api/v1/remote/activate`, { - method: "POST", - headers: { - authorization: `Bearer ${approvedDevice?.deviceToken}`, - "content-type": "application/json", - }, - body: JSON.stringify({ name: "First Instance", slug: "first" }), - }); - const createBody = await createResponse.json() as { error?: string; profile?: { instance: { id: string; publicUrl: string } } }; - if (createResponse.status !== 202 || !createBody.profile) { - throw new Error(`remote activation failed (${createResponse.status}): ${createBody.error ?? "missing profile"}`); - } - const createdFirst = createBody as { profile: { instance: { id: string; publicUrl: string } } }; - firstInstanceId = createdFirst.profile.instance.id; - expect(createdFirst.profile.instance.publicUrl).toBe("https://first.instances.example.test"); + const createdFirst = await store.createInstance(firstActor, { name: "First Instance", slug: "first" }); + firstInstanceId = createdFirst.id; + await database.query( + "UPDATE remote_devices SET instance_id=$1 WHERE id=$2 AND user_id=$3", + [firstInstanceId, approvedDevice?.deviceId, firstActor.id], + ); const createdSecond = await store.createInstance(secondActor, { name: "Second Instance", slug: "second" }); await waitFor(async () => { @@ -590,5 +762,6 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa await adminPool.query("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname=$1", [databaseName]); await adminPool.query(`DROP DATABASE IF EXISTS ${quotedDatabaseName}`); await adminPool.end(); + rmSync(temporaryDirectory, { recursive: true, force: true }); } }, 60_000); diff --git a/platform/vite.config.ts b/platform/vite.config.ts index 864d237c3..866df67a5 100644 --- a/platform/vite.config.ts +++ b/platform/vite.config.ts @@ -9,6 +9,8 @@ export default defineConfig({ build: { outDir: "dist", emptyOutDir: true }, server: { port: 4173, + allowedHosts: [".opencodexpages.me"], proxy: { "/api": "http://127.0.0.1:10200" }, }, + preview: { allowedHosts: [".opencodexpages.me"] }, }); diff --git a/platform/web/src/App.tsx b/platform/web/src/App.tsx index c417cb9b2..eb5a9f81d 100644 --- a/platform/web/src/App.tsx +++ b/platform/web/src/App.tsx @@ -9,9 +9,11 @@ import { createInstance, createPairingCode, deleteInstance, getInstance, issueToken, listInstances, getCurrentUser, openInstance, redeemInvite, suspendInstance, getDeviceAuthorizationRequest, approveDeviceAuthorizationRequest, type CurrentUser, type DeviceAuthorizationRequest, - type Instance, type InstanceStatus, accessInstance, + type Instance, type InstanceStatus, accessInstance, getRemoteAccessProfile, } from "./api"; import { authClient } from "./auth-client"; +import { unlockRemoteEnvelope } from "./e2ee"; +import { vaultHandoff, WorkspaceApp } from "./Workspace"; type View = "instances" | "activity" | "security" | "new"; const instanceDomain = import.meta.env.VITE_INSTANCE_DOMAIN ?? "opencodexpages.me"; @@ -265,7 +267,12 @@ function InstanceAccess({ slug }: { slug: string }) { setBusy(true); setError(null); try { - window.location.assign(await accessInstance(slug, password)); + if (!user) throw new Error("GitHub sign-in is required"); + const profile = await getRemoteAccessProfile(); + if (!profile.e2ee) throw new Error("Set the encrypted Remote password from local ocx gui first"); + const unlocked = await unlockRemoteEnvelope(password, user.githubNumericId, profile.e2ee); + const destination = await accessInstance(slug, unlocked.authSecret); + window.location.replace(`${destination}${vaultHandoff(unlocked.vault)}`); } catch (reason) { setError(reason instanceof Error ? reason.message : "Could not open Remote"); } finally { @@ -283,7 +290,7 @@ function InstanceAccess({ slug }: { slug: string }) { } {error &&
{error}
} -

GitHub confirms account ownership. The Remote password is checked as an Argon2id hash and is never sent to the user computer.

+

Argon2id runs in this browser. The service receives a separate authentication secret, while the vault decryption key stays in this tab.

; } @@ -318,6 +325,15 @@ function AdminDashboard() { } export function App() { + const hostname = window.location.hostname.toLowerCase(); + const suffix = `.${instanceDomain.toLowerCase()}`; + if (hostname.endsWith(suffix)) { + const slug = hostname.slice(0, -suffix.length); + if (/^[a-z0-9-]{1,63}$/.test(slug)) { + const centralOrigin = import.meta.env.VITE_PLATFORM_ORIGIN ?? `https://${instanceDomain}`; + return ; + } + } const deviceMatch = window.location.pathname.match(/^\/connect\/([0-9a-f-]{36})$/i); if (deviceMatch) return ; const accessMatch = window.location.pathname.match(/^\/access\/([a-z0-9-]{1,63})$/i); diff --git a/platform/web/src/Workspace.tsx b/platform/web/src/Workspace.tsx new file mode 100644 index 000000000..aeb4440ed --- /dev/null +++ b/platform/web/src/Workspace.tsx @@ -0,0 +1,239 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import { IconDeviceDesktop, IconLoader2, IconLock, IconShield, IconTerminal2 } from "@tabler/icons-react"; +import { Terminal } from "@xterm/xterm"; +import "@xterm/xterm/css/xterm.css"; +import { createTerminalSession, getWorkspace, type Workspace, type WorkspaceDevice } from "./api"; +import { + BrowserTerminalCipher, + base64UrlDecode, + base64UrlEncode, + type CommandProfile, + type RemoteVault, +} from "./e2ee"; + +const encoder = new TextEncoder(); +const VAULT_HANDOFF_PREFIX = "#ocxr-vault="; +const VAULT_SESSION_KEY = "ocxr.remote.vault.v1"; + +function validVault(value: unknown): value is RemoteVault { + if (!value || typeof value !== "object") return false; + const vault = value as Partial; + try { + return vault.version === 1 + && typeof vault.vaultKey === "string" + && base64UrlDecode(vault.vaultKey).length === 32 + && typeof vault.rootPrivateKeyPem === "string" + && vault.rootPrivateKeyPem.includes("BEGIN PRIVATE KEY") + && vault.rootPrivateKeyPem.length <= 2048; + } catch { + return false; + } +} + +export function vaultHandoff(vault: RemoteVault): string { + return `${VAULT_HANDOFF_PREFIX}${base64UrlEncode(encoder.encode(JSON.stringify(vault)))}`; +} + +function loadVault(): RemoteVault | null { + try { + if (window.location.hash.startsWith(VAULT_HANDOFF_PREFIX)) { + const parsed = JSON.parse(new TextDecoder().decode(base64UrlDecode( + window.location.hash.slice(VAULT_HANDOFF_PREFIX.length), + ))) as unknown; + if (!validVault(parsed)) throw new Error("invalid vault handoff"); + window.sessionStorage.setItem(VAULT_SESSION_KEY, JSON.stringify(parsed)); + window.history.replaceState(null, "", `${window.location.pathname}${window.location.search}`); + return parsed; + } + const stored = window.sessionStorage.getItem(VAULT_SESSION_KEY); + if (!stored) return null; + const parsed = JSON.parse(stored) as unknown; + return validVault(parsed) ? parsed : null; + } catch { + window.sessionStorage.removeItem(VAULT_SESSION_KEY); + window.history.replaceState(null, "", `${window.location.pathname}${window.location.search}`); + return null; + } +} + +function appFrame(kind: number, body = new Uint8Array()): Uint8Array { + const frame = new Uint8Array(1 + body.length); + frame[0] = kind; + frame.set(body, 1); + return frame; +} + +function TerminalPane({ + sessionId, + websocketPath, + profile, + device, + vault, + close, +}: { + sessionId: string; + websocketPath: string; + profile: CommandProfile; + device: WorkspaceDevice; + vault: RemoteVault; + close: () => void; +}) { + const container = useRef(null); + + useEffect(() => { + if (!container.current) return; + const terminal = new Terminal({ + cursorBlink: true, + convertEol: true, + fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace", + fontSize: 14, + theme: { background: "#0c0d0f", foreground: "#ececef", cursor: "#79d49d" }, + scrollback: 5_000, + cols: 80, + rows: 24, + }); + terminal.open(container.current); + terminal.writeln(`\x1b[2mConnecting securely to ${device.name}…\x1b[0m`); + const socketUrl = new URL(websocketPath, window.location.href); + socketUrl.protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; + const socket = new WebSocket(socketUrl); + socket.binaryType = "arraybuffer"; + let cipher: BrowserTerminalCipher | null = null; + let disposed = false; + let sendQueue = Promise.resolve(); + let receiveQueue = Promise.resolve(); + + function encryptedSend(plaintext: Uint8Array) { + sendQueue = sendQueue.then(async () => { + if (!cipher || socket.readyState !== WebSocket.OPEN) return; + socket.send(await cipher.encrypt(plaintext)); + }).catch(error => terminal.writeln(`\r\n\x1b[31m${error instanceof Error ? error.message : "Secure send failed"}\x1b[0m`)); + } + + const input = terminal.onData(data => encryptedSend(appFrame(1, encoder.encode(data)))); + const resize = terminal.onResize(size => { + const dimensions = new Uint8Array(4); + const view = new DataView(dimensions.buffer); + view.setUint16(0, size.cols, false); + view.setUint16(2, size.rows, false); + encryptedSend(appFrame(2, dimensions)); + }); + const observer = new ResizeObserver(entries => { + const box = entries[0]?.contentRect; + if (!box) return; + terminal.resize( + Math.max(20, Math.min(240, Math.floor((box.width - 20) / 8.5))), + Math.max(5, Math.min(100, Math.floor((box.height - 16) / 18))), + ); + }); + observer.observe(container.current); + + socket.addEventListener("open", () => { + void BrowserTerminalCipher.handshake(socket, sessionId, profile, device, vault).then(ready => { + if (disposed) return; + cipher = ready; + terminal.clear(); + terminal.focus(); + encryptedSend(appFrame(2, Uint8Array.of( + terminal.cols >> 8, terminal.cols & 255, + terminal.rows >> 8, terminal.rows & 255, + ))); + }).catch(error => { + terminal.writeln(`\r\n\x1b[31m${error instanceof Error ? error.message : "Secure handshake failed"}\x1b[0m`); + socket.close(1008, "handshake failed"); + }); + }); + socket.addEventListener("message", event => { + if (!cipher || !(event.data instanceof ArrayBuffer)) return; + receiveQueue = receiveQueue.then(async () => { + const plaintext = await cipher!.decrypt(event.data); + const kind = plaintext[0]; + if (kind === 3) terminal.write(plaintext.subarray(1)); + else if (kind === 4 && plaintext.length === 5) { + const code = new DataView(plaintext.buffer, plaintext.byteOffset + 1, 4).getUint32(0, false); + terminal.writeln(`\r\n\x1b[2mProcess exited with code ${code}.\x1b[0m`); + } else throw new Error("Remote computer sent an invalid application frame"); + }).catch(error => { + terminal.writeln(`\r\n\x1b[31m${error instanceof Error ? error.message : "Secure receive failed"}\x1b[0m`); + socket.close(1008, "encrypted frame rejected"); + }); + }); + socket.addEventListener("close", () => { + if (!disposed) terminal.writeln("\r\n\x1b[2mRemote computer disconnected.\x1b[0m"); + }); + return () => { + disposed = true; + observer.disconnect(); + input.dispose(); + resize.dispose(); + socket.close(1000, "terminal closed"); + terminal.dispose(); + }; + }, [sessionId, websocketPath, profile, device, vault]); + + return
+
{device.name}{profile}
+
+
; +} + +export function WorkspaceApp({ slug, centralOrigin }: { slug: string; centralOrigin: string }) { + const [vault] = useState(loadVault); + const [workspace, setWorkspace] = useState(null); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(null); + const [active, setActive] = useState<{ + sessionId: string; websocketPath: string; profile: CommandProfile; device: WorkspaceDevice; + } | null>(null); + + useEffect(() => { + if (!vault) return; + void getWorkspace().then(setWorkspace).catch(reason => setError( + reason instanceof Error ? reason.message : "Could not load Remote workspace", + )); + }, [vault]); + + const online = useMemo(() => workspace?.devices.filter(device => device.relayOnline) ?? [], [workspace]); + + async function open(device: WorkspaceDevice, profile: CommandProfile) { + setBusy(`${device.id}:${profile}`); + setError(null); + try { + const created = await createTerminalSession(device.id, profile); + setActive({ sessionId: created.session.id, websocketPath: created.websocketPath, profile, device }); + } catch (reason) { + setError(reason instanceof Error ? reason.message : "Could not open terminal"); + } finally { + setBusy(null); + } + } + + function lock() { + window.sessionStorage.removeItem(VAULT_SESSION_KEY); + window.location.replace(`${centralOrigin}/access/${encodeURIComponent(slug)}`); + } + + if (!vault) return
+

Remote is locked

+

The encryption key is kept only in this browser tab. Unlock again with GitHub and your Remote password.

+ Unlock Remote +
; + return
+
opencodex{slug} Remote
+
+
End-to-end encrypted workspace

Your computers

Terminal plaintext stays between this browser and your computer. The relay sees only bounded ciphertext frames.

{online.length} of {workspace?.devices.length ?? 0} online
+ {error &&
{error}
} + {!workspace ?
Loading encrypted workspace
+ :
+ {workspace.devices.map(device =>
+
{device.name}{device.platform}
{device.relayOnline ? "Online" : "Offline"}
+
+ {(["shell", "codex", "claude"] as const).map(profile => )} +
+
)} + {!workspace.devices.length &&
No paired computersPair this OCX from the local Remote tab first.
} +
} + {active && setActive(null)} />} +
+
; +} diff --git a/platform/web/src/api.ts b/platform/web/src/api.ts index a39475913..6f56698ec 100644 --- a/platform/web/src/api.ts +++ b/platform/web/src/api.ts @@ -38,9 +38,31 @@ const demo = import.meta.env.VITE_REMOTE_DEMO === "true"; export interface CurrentUser { id: string; name: string; email: string; role: "user" | "admin"; + githubNumericId: string; status: "active" | "pending_invite" | "suspended"; } +export interface RemoteAccessProfile { + passwordSet: boolean; + e2ee: import("./e2ee").RemoteE2eeEnvelope | null; +} + +export interface WorkspaceDevice { + id: string; + name: string; + platform: string; + signingPublicKey: string; + ecdhPublicKey: string | null; + relayOnline: boolean; + lastSeenAt: string | null; +} + +export interface Workspace { + instance: { id: string; name: string; slug: string; status: "online" | "offline" }; + devices: WorkspaceDevice[]; + limits: { maxSessionsPerDevice: number; maxFrameBytes: number }; +} + export interface DeviceAuthorizationRequest { id: string; userCode: string; @@ -76,10 +98,14 @@ export async function getInstance(instanceId: string): Promise { } export async function getCurrentUser(): Promise { - if (demo) return { id: "demo-user", name: "Octo Cat", email: "octocat@example.test", role: "admin", status: "active" }; + if (demo) return { id: "demo-user", name: "Octo Cat", email: "octocat@example.test", githubNumericId: "1", role: "admin", status: "active" }; return (await request<{ user: CurrentUser }>("/api/v1/me")).user; } +export async function getRemoteAccessProfile(): Promise { + return (await request<{ profile: RemoteAccessProfile }>("/api/v1/remote/profile")).profile; +} + export async function getDeviceAuthorizationRequest(id: string): Promise { return (await request<{ request: DeviceAuthorizationRequest }>(`/api/v1/device-links/${id}`)).request; } @@ -120,13 +146,27 @@ export async function openInstance(instanceId: string, password: string): Promis })).url; } -export async function accessInstance(slug: string, password: string): Promise { +export async function accessInstance(slug: string, authSecret: string): Promise { return (await request<{ url: string }>(`/api/v1/remote/access/${encodeURIComponent(slug)}`, { method: "POST", - body: JSON.stringify({ password }), + body: JSON.stringify({ authSecret }), })).url; } +export async function getWorkspace(): Promise { + return request("/api/v1/workspace"); +} + +export async function createTerminalSession( + deviceId: string, + commandProfile: import("./e2ee").CommandProfile, +): Promise<{ session: { id: string }; websocketPath: string }> { + return request("/api/v1/terminal-sessions", { + method: "POST", + body: JSON.stringify({ deviceId, commandProfile }), + }); +} + export async function issueToken(instanceId: string): Promise<{ token: string; expiresAt: string }> { if (demo) return { token: `ocxr_${"demo".repeat(11)}`, expiresAt: new Date(Date.now() + 30 * 86_400_000).toISOString() }; return request(`/api/v1/instances/${instanceId}/tokens`, { method: "POST", body: JSON.stringify({ name: "Dashboard token" }) }); diff --git a/platform/web/src/e2ee.ts b/platform/web/src/e2ee.ts new file mode 100644 index 000000000..aa3636465 --- /dev/null +++ b/platform/web/src/e2ee.ts @@ -0,0 +1,312 @@ +import { argon2idAsync } from "@noble/hashes/argon2.js"; +import { hkdf } from "@noble/hashes/hkdf.js"; +import { sha256 } from "@noble/hashes/sha2.js"; + +export interface RemoteE2eeEnvelope { + version: "ocx-e2ee-v1"; + salt: string; + nonce: string; + ciphertext: string; + rootPublicKey: string; + kdf: { + algorithm: "argon2id"; + memoryKiB: number; + iterations: number; + parallelism: number; + outputLength: 32; + }; +} + +export interface RemoteVault { + version: 1; + vaultKey: string; + rootPrivateKeyPem: string; +} + +export interface RemoteDeviceIdentity { + id: string; + signingPublicKey: string; +} + +export type CommandProfile = "shell" | "codex" | "claude"; + +const encoder = new TextEncoder(); + +export function base64UrlDecode(value: string): Uint8Array { + if (!/^[A-Za-z0-9_-]*$/.test(value)) throw new Error("invalid base64url data"); + const padded = value.replaceAll("-", "+").replaceAll("_", "/").padEnd(Math.ceil(value.length / 4) * 4, "="); + const binary = atob(padded); + return Uint8Array.from(binary, character => character.charCodeAt(0)); +} + +export function base64UrlEncode(value: Uint8Array): string { + let binary = ""; + for (let offset = 0; offset < value.length; offset += 0x8000) { + binary += String.fromCharCode(...value.subarray(offset, offset + 0x8000)); + } + return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", ""); +} + +function concat(...values: Uint8Array[]): Uint8Array { + const result = new Uint8Array(values.reduce((total, value) => total + value.length, 0)); + let offset = 0; + for (const value of values) { + result.set(value, offset); + offset += value.length; + } + return result; +} + +function arrayBuffer(value: Uint8Array): ArrayBuffer { + return Uint8Array.from(value).buffer; +} + +function pemDer(value: string, label: string): Uint8Array { + const match = value.match(new RegExp(`-----BEGIN ${label}-----([\\s\\S]+?)-----END ${label}-----`)); + if (!match) throw new Error(`invalid ${label.toLowerCase()}`); + return Uint8Array.from(atob(match[1].replace(/\s/g, "")), character => character.charCodeAt(0)); +} + +function accountAad(githubNumericId: string): Uint8Array { + return encoder.encode(`ocx-e2ee-v1\0github:${githubNumericId}`); +} + +export async function unlockRemoteEnvelope( + password: string, + githubNumericId: string, + envelope: RemoteE2eeEnvelope, +): Promise<{ authSecret: string; vault: RemoteVault }> { + if (password.length < 10 || password.length > 128) throw new Error("Remote password must be 10 to 128 characters"); + if ( + envelope.version !== "ocx-e2ee-v1" + || envelope.kdf.algorithm !== "argon2id" + || envelope.kdf.outputLength !== 32 + || envelope.kdf.memoryKiB !== 65_536 + || envelope.kdf.iterations !== 3 + || envelope.kdf.parallelism !== 1 + ) throw new Error("Unsupported Remote encryption profile"); + const salt = base64UrlDecode(envelope.salt); + const nonce = base64UrlDecode(envelope.nonce); + const ciphertext = base64UrlDecode(envelope.ciphertext); + if (salt.length !== 16 || nonce.length !== 12 || ciphertext.length < 17 || ciphertext.length > 4096) { + throw new Error("Invalid Remote encryption envelope"); + } + const root = await argon2idAsync(encoder.encode(password), salt, { + t: envelope.kdf.iterations, + m: envelope.kdf.memoryKiB, + p: envelope.kdf.parallelism, + dkLen: 32, + maxmem: 72 * 1024 * 1024, + asyncTick: 10, + }); + try { + const authSecret = hkdf(sha256, root, salt, encoder.encode("opencodex remote auth v1"), 32); + const wrapKey = hkdf(sha256, root, salt, encoder.encode("opencodex remote vault wrap v1"), 32); + try { + const aes = await crypto.subtle.importKey("raw", arrayBuffer(wrapKey), "AES-GCM", false, ["decrypt"]); + const plaintext = new Uint8Array(await crypto.subtle.decrypt({ + name: "AES-GCM", + iv: arrayBuffer(nonce), + additionalData: arrayBuffer(accountAad(githubNumericId)), + tagLength: 128, + }, aes, arrayBuffer(ciphertext))); + try { + const vault = JSON.parse(new TextDecoder().decode(plaintext)) as Partial; + if ( + vault.version !== 1 + || typeof vault.vaultKey !== "string" + || base64UrlDecode(vault.vaultKey).length !== 32 + || typeof vault.rootPrivateKeyPem !== "string" + || vault.rootPrivateKeyPem.length > 2048 + ) throw new Error("Invalid Remote vault"); + return { authSecret: base64UrlEncode(authSecret), vault: vault as RemoteVault }; + } finally { + plaintext.fill(0); + } + } finally { + wrapKey.fill(0); + } + } catch { + throw new Error("Remote password is incorrect or the encrypted vault is damaged"); + } finally { + root.fill(0); + } +} + +function uuidBytes(value: string): Uint8Array { + const hex = value.replaceAll("-", ""); + if (!/^[0-9a-f]{32}$/i.test(hex)) throw new Error("invalid terminal session ID"); + return Uint8Array.from(hex.match(/.{2}/g)!, byte => Number.parseInt(byte, 16)); +} + +function clientTranscript( + sessionId: string, + deviceId: string, + profile: CommandProfile, + publicKey: Uint8Array, + nonce: Uint8Array, +): Uint8Array { + return concat( + encoder.encode("ocx-terminal-client-v1\0"), + uuidBytes(sessionId), + uuidBytes(deviceId), + encoder.encode(profile), + Uint8Array.of(0), + publicKey, + nonce, + ); +} + +function agentTranscript(client: Uint8Array, publicKey: Uint8Array, nonce: Uint8Array): Uint8Array { + return concat(encoder.encode("ocx-terminal-agent-v1\0"), client, publicKey, nonce); +} + +function nonce(prefix: Uint8Array, counter: bigint): Uint8Array { + const result = new Uint8Array(12); + result.set(prefix, 0); + new DataView(result.buffer).setBigUint64(4, counter, false); + return result; +} + +function aad(sessionId: string, direction: number, counter: bigint): Uint8Array { + const counterBytes = new Uint8Array(8); + new DataView(counterBytes.buffer).setBigUint64(0, counter, false); + return concat( + encoder.encode("ocx-terminal-frame-v1\0"), + uuidBytes(sessionId), + Uint8Array.of(direction), + counterBytes, + ); +} + +export class BrowserTerminalCipher { + private sendCounter = 0n; + private receiveCounter = 0n; + + private constructor( + private readonly sessionId: string, + private readonly sendKey: CryptoKey, + private readonly receiveKey: CryptoKey, + private readonly sendNoncePrefix: Uint8Array, + private readonly receiveNoncePrefix: Uint8Array, + ) {} + + static async handshake( + socket: WebSocket, + sessionId: string, + profile: CommandProfile, + device: RemoteDeviceIdentity, + vault: RemoteVault, + ): Promise { + const pair = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, false, ["deriveBits"]); + const publicKey = new Uint8Array(await crypto.subtle.exportKey("spki", pair.publicKey)); + const clientNonce = crypto.getRandomValues(new Uint8Array(32)); + const transcript = clientTranscript(sessionId, device.id, profile, publicKey, clientNonce); + const rootPrivateKey = await crypto.subtle.importKey( + "pkcs8", + arrayBuffer(pemDer(vault.rootPrivateKeyPem, "PRIVATE KEY")), + { name: "Ed25519" }, + false, + ["sign"], + ); + const signature = new Uint8Array(await crypto.subtle.sign("Ed25519", rootPrivateKey, arrayBuffer(transcript))); + const response = await new Promise((resolve, reject) => { + const timeout = globalThis.setTimeout(() => reject(new Error("Remote computer handshake timed out")), 15_000); + const onMessage = (event: MessageEvent) => { + globalThis.clearTimeout(timeout); + socket.removeEventListener("close", onClose); + if (event.data instanceof ArrayBuffer) resolve(event.data); + else reject(new Error("Remote computer sent an invalid handshake")); + }; + const onClose = () => { + globalThis.clearTimeout(timeout); + socket.removeEventListener("message", onMessage); + reject(new Error("Remote computer disconnected during handshake")); + }; + socket.addEventListener("message", onMessage, { once: true }); + socket.addEventListener("close", onClose, { once: true }); + socket.send(encoder.encode(JSON.stringify({ + commandProfile: profile, + ephemeralPublicKey: base64UrlEncode(publicKey), + clientNonce: base64UrlEncode(clientNonce), + signature: base64UrlEncode(signature), + }))); + }); + const hello = JSON.parse(new TextDecoder().decode(response)) as { + ephemeralPublicKey?: unknown; serverNonce?: unknown; signature?: unknown; + }; + if (typeof hello.ephemeralPublicKey !== "string" || typeof hello.serverNonce !== "string" || typeof hello.signature !== "string") { + throw new Error("Remote computer sent an invalid handshake"); + } + const agentPublicBytes = base64UrlDecode(hello.ephemeralPublicKey); + const serverNonce = base64UrlDecode(hello.serverNonce); + if (serverNonce.length !== 32) throw new Error("Remote computer sent an invalid nonce"); + const deviceSigningKey = await crypto.subtle.importKey( + "spki", + arrayBuffer(base64UrlDecode(device.signingPublicKey)), + { name: "Ed25519" }, + false, + ["verify"], + ); + if (!await crypto.subtle.verify( + "Ed25519", + deviceSigningKey, + arrayBuffer(base64UrlDecode(hello.signature)), + arrayBuffer(agentTranscript(transcript, agentPublicBytes, serverNonce)), + )) throw new Error("Remote computer identity verification failed"); + const agentPublicKey = await crypto.subtle.importKey( + "spki", + arrayBuffer(agentPublicBytes), + { name: "ECDH", namedCurve: "P-256" }, + false, + [], + ); + const shared = new Uint8Array(await crypto.subtle.deriveBits({ + name: "ECDH", + public: agentPublicKey, + }, pair.privateKey, 256)); + const salt = sha256(concat(clientNonce, serverNonce)); + const sendKey = hkdf(sha256, shared, salt, encoder.encode("ocx terminal browser to agent key v1"), 32); + const receiveKey = hkdf(sha256, shared, salt, encoder.encode("ocx terminal agent to browser key v1"), 32); + const sendNoncePrefix = hkdf(sha256, shared, salt, encoder.encode("ocx terminal browser to agent nonce v1"), 4); + const receiveNoncePrefix = hkdf(sha256, shared, salt, encoder.encode("ocx terminal agent to browser nonce v1"), 4); + shared.fill(0); + return new BrowserTerminalCipher( + sessionId, + await crypto.subtle.importKey("raw", arrayBuffer(sendKey), "AES-GCM", false, ["encrypt"]), + await crypto.subtle.importKey("raw", arrayBuffer(receiveKey), "AES-GCM", false, ["decrypt"]), + sendNoncePrefix, + receiveNoncePrefix, + ); + } + + async encrypt(plaintext: Uint8Array): Promise { + const counter = this.sendCounter; + const ciphertext = new Uint8Array(await crypto.subtle.encrypt({ + name: "AES-GCM", + iv: arrayBuffer(nonce(this.sendNoncePrefix, counter)), + additionalData: arrayBuffer(aad(this.sessionId, 0, counter)), + tagLength: 128, + }, this.sendKey, arrayBuffer(plaintext))); + this.sendCounter += 1n; + const result = new Uint8Array(8 + ciphertext.length); + new DataView(result.buffer).setBigUint64(0, counter, false); + result.set(ciphertext, 8); + return result.buffer; + } + + async decrypt(encrypted: ArrayBuffer): Promise { + const bytes = new Uint8Array(encrypted); + if (bytes.length < 24) throw new Error("Encrypted terminal frame is too short"); + const counter = new DataView(bytes.buffer, bytes.byteOffset, 8).getBigUint64(0, false); + if (counter !== this.receiveCounter) throw new Error("Replayed or out-of-order terminal frame"); + const plaintext = new Uint8Array(await crypto.subtle.decrypt({ + name: "AES-GCM", + iv: arrayBuffer(nonce(this.receiveNoncePrefix, counter)), + additionalData: arrayBuffer(aad(this.sessionId, 1, counter)), + tagLength: 128, + }, this.receiveKey, arrayBuffer(bytes.subarray(8)))); + this.receiveCounter += 1n; + return plaintext; + } +} diff --git a/platform/web/src/styles.css b/platform/web/src/styles.css index 963c8b9f5..45c0dee92 100644 --- a/platform/web/src/styles.css +++ b/platform/web/src/styles.css @@ -40,6 +40,7 @@ h2 { margin: 0; font-size: 22px; letter-spacing: -.35px; } .account .divider { height: 63px; width: 1px; background: #303237; margin: -9px 7px -5px 8px; } .avatar { width: 31px; height: 31px; border-radius: 50%; background: #f5f5f5; color: #17181a; display: grid; place-items: center; font-size: 10px; font-weight: 800; } .primary { min-height: 46px; border: 0; border-radius: 8px; padding: 0 18px; background: #f5f5f5; color: #141517; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; } +.primary { text-decoration: none; } .primary svg { width: 18px; } .instance-layout { display: grid; grid-template-columns: minmax(450px, .94fr) minmax(530px, 1fr); gap: 13px; height: calc(100vh - 116px); min-height: 650px; } .instance-list, .detail-card, .onboarding-card, .secondary-card { border: 1px solid var(--border); background: var(--panel); border-radius: 12px; overflow: hidden; } @@ -94,6 +95,46 @@ h2 { margin: 0; font-size: 22px; letter-spacing: -.35px; } .landing-card { text-align: left; }.landing-icon { display: block; margin: 34px 0 14px; color: var(--green) !important; }.landing-card > h1 { max-width: 410px; }.landing-steps { display: grid; grid-template-columns: 28px 1fr; align-items: center; gap: 9px 12px; margin-top: 25px; }.landing-steps > span { width: 28px; height: 28px; display: grid; place-items: center; border: 1px solid #4b4e54; border-radius: 50%; color: var(--green); font-size: 12px; font-weight: 700; }.landing-steps p { margin: 0; } .access-instance-card h1 { overflow-wrap: anywhere; }.access-inline { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 18px 0; color: var(--muted); }.access-password { display: grid; gap: 8px; margin: 18px 0 12px; text-align: left; }.access-password span { color: var(--muted); font-size: 13px; font-weight: 650; }.access-password input { width: 100%; height: 48px; border: 1px solid #44464b; border-radius: 7px; background: var(--panel-soft); color: #f4f4f5; padding: 0 15px; } .spin { animation: spin 1s linear infinite; } +.workspace-shell { min-height: 100vh; background: #0d0e10; color: #f4f4f5; } +.workspace-header { height: 76px; padding: 0 28px; border-bottom: 1px solid var(--border-soft); background: #131416; display: flex; align-items: center; justify-content: space-between; } +.workspace-header .connect-brand { border: 0; padding: 0; } +.workspace-header > button { min-height: 39px; border: 1px solid #414349; border-radius: 8px; padding: 0 14px; background: transparent; display: flex; align-items: center; gap: 8px; cursor: pointer; } +.workspace-header > button svg { width: 17px; } +.workspace-main { max-width: 1320px; margin: 0 auto; padding: 42px 28px 60px; } +.workspace-intro { display: flex; justify-content: space-between; gap: 35px; align-items: flex-end; } +.workspace-intro > div:first-child > span { color: var(--green); font-size: 13px; text-transform: uppercase; letter-spacing: .09em; font-weight: 750; } +.workspace-intro h1 { margin-top: 9px; font-size: 34px; } +.workspace-intro p { color: var(--muted); line-height: 1.6; margin: 10px 0 0; max-width: 700px; } +.workspace-security { border: 1px solid #34373c; background: #181a1d; border-radius: 10px; padding: 14px 17px; display: flex; align-items: center; gap: 11px; white-space: nowrap; } +.workspace-security svg { width: 20px; color: var(--green); } +.workspace-devices { margin-top: 28px; display: grid; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); gap: 14px; } +.workspace-device { border: 1px solid #33353a; background: #17181b; border-radius: 12px; padding: 20px; } +.workspace-device-heading { display: grid; grid-template-columns: 47px 1fr auto; align-items: center; gap: 13px; } +.workspace-device-heading > span { width: 47px; height: 47px; border: 1px solid #3b3e43; border-radius: 10px; display: grid; place-items: center; color: #92949a; } +.workspace-device-heading > span.online { color: var(--green); border-color: #315643; background: #16241c; } +.workspace-device-heading > span svg { width: 24px; } +.workspace-device-heading > div { display: grid; min-width: 0; gap: 4px; } +.workspace-device-heading > div > span { color: var(--muted); font-size: 13px; overflow: hidden; text-overflow: ellipsis; } +.workspace-device-heading em { color: #85878c; font-size: 12px; font-style: normal; } +.workspace-device-heading .online ~ div + em { color: var(--green); } +.workspace-device-actions { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 20px; } +.workspace-device-actions button { min-height: 42px; border: 1px solid #3b3d42; border-radius: 7px; background: #202225; display: flex; align-items: center; justify-content: center; gap: 7px; cursor: pointer; font-size: 13px; } +.workspace-device-actions button:hover:not(:disabled) { background: #2b2d31; border-color: #5b5e64; } +.workspace-device-actions button:disabled { opacity: .4; cursor: not-allowed; } +.workspace-device-actions svg { width: 17px; } +.workspace-empty, .workspace-loading { min-height: 180px; border: 1px dashed #3a3d42; border-radius: 12px; color: var(--muted); display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 10px; } +.workspace-empty svg { width: 32px; } +.workspace-error { margin-top: 22px; border: 1px solid #7d3131; background: #2a1718; color: #ffaaaa; padding: 12px 15px; border-radius: 8px; } +.workspace-terminal-card { margin-top: 22px; border: 1px solid #383b40; border-radius: 12px; background: #0c0d0f; overflow: hidden; box-shadow: 0 24px 70px #0008; } +.workspace-terminal-card > header { min-height: 54px; padding: 0 15px 0 19px; border-bottom: 1px solid #303238; background: #18191c; display: flex; align-items: center; justify-content: space-between; } +.workspace-terminal-card > header > div { display: flex; align-items: center; gap: 10px; } +.workspace-terminal-card > header > div > span:last-child { color: var(--muted); font-size: 12px; text-transform: uppercase; } +.workspace-terminal-card > header button { border: 1px solid #414349; border-radius: 7px; background: transparent; padding: 7px 11px; cursor: pointer; font-size: 12px; } +.workspace-online-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 4px #79d49d18; } +.workspace-terminal { height: min(560px, calc(100vh - 225px)); min-height: 360px; padding: 9px 7px; } +.workspace-terminal .xterm { height: 100%; } +.workspace-terminal .xterm-viewport { scrollbar-color: #444 transparent; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 1120px) { .instance-layout { grid-template-columns: 1fr; height: auto; }.instance-list { min-height: 350px; }.detail-card { min-height: 720px; }.health-row { gap: 8px; }.table-head, .instance-row { grid-template-columns: 1fr 1.4fr 1fr; }.table-head span:last-child, .instance-row > span:last-child { display: none; } } @media (max-width: 760px) { .app-shell { display: block; }.sidebar { transform: translateX(-100%); transition: transform .18s ease; box-shadow: 10px 0 30px #0008; }.sidebar-open { transform: translateX(0); }.mobile-close { display: grid; position: absolute; right: 10px; top: 10px; border: 0; background: transparent; }.mobile-menu { display: grid; place-items: center; position: absolute; left: 15px; top: 18px; z-index: 3; border: 1px solid var(--border); background: var(--panel); border-radius: 7px; width: 38px; height: 38px; }.mobile-menu svg { width: 20px; }.account > span, .account > svg { display: none; } main { padding: 18px 12px 24px; }.page-header { padding-left: 52px; align-items: center; }.page-header h1 { font-size: 24px; }.account .primary { padding: 0 13px; }.instance-layout { display: block; }.instance-list { margin-bottom: 12px; }.table-head, .instance-row { grid-template-columns: 1fr 1fr; }.table-head span:nth-child(2), .instance-row > span:nth-child(2) { display: none; }.detail-card { padding: 24px 18px; min-height: 0; }.detail-heading { flex-direction: column; }.health-row { grid-template-columns: 1fr 1fr; }.instance-form, .reserved, .install-grid { grid-template-columns: 1fr; }.onboarding-card { padding: 25px 18px; }.verify-column { border-left: 0; border-top: 1px solid var(--border); padding: 28px 0 0; }.install-column { padding-right: 0; }.stepper { margin-top: 14px; }.step strong { font-size: 12px; }.pairing-code { align-items: flex-start; flex-direction: column; padding: 14px; gap: 8px; }.activity-row { grid-template-columns: 120px 1fr; }.activity-row time { display: none; } } +@media (max-width: 760px) { .workspace-header { padding: 0 15px; }.workspace-main { padding: 28px 14px 40px; }.workspace-intro { display: grid; align-items: start; }.workspace-security { width: max-content; }.workspace-devices { grid-template-columns: 1fr; }.workspace-device-actions { grid-template-columns: 1fr; }.workspace-terminal { min-height: 430px; }.workspace-terminal-card > header strong { max-width: 120px; overflow: hidden; text-overflow: ellipsis; }.workspace-terminal-card > header > div > span:last-child { display: none; } } diff --git a/remote-agent/Cargo.lock b/remote-agent/Cargo.lock index d7acab20e..bedb9228e 100644 --- a/remote-agent/Cargo.lock +++ b/remote-agent/Cargo.lock @@ -2,6 +2,41 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -128,6 +163,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.22.1" @@ -140,6 +181,12 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.13.1" @@ -183,6 +230,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "cfg_aliases" version = "0.2.2" @@ -200,6 +253,16 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.6.4" @@ -270,6 +333,18 @@ dependencies = [ "libc", ] +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -277,9 +352,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -331,7 +416,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -345,6 +432,26 @@ dependencies = [ "syn 3.0.3", ] +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -369,6 +476,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "errno" version = "0.3.14" @@ -379,12 +507,33 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -468,6 +617,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -509,12 +659,51 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "1.4.2" @@ -723,6 +912,15 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -829,6 +1027,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "nix" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases 0.1.1", + "libc", +] + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -850,17 +1060,27 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "opencodex-remote-agent" version = "0.1.0" dependencies = [ + "aes-gcm", "anyhow", "axum", "base64", "clap", "ed25519-dalek", "futures-util", + "hkdf", "http-body-util", + "p256", + "portable-pty", "rand 0.9.5", "reqwest", "serde", @@ -872,6 +1092,20 @@ dependencies = [ "tracing", "tracing-subscriber", "url", + "uuid", + "zeroize", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", ] [[package]] @@ -928,6 +1162,39 @@ dependencies = [ "spki", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-pty" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "downcast-rs", + "filedescriptor", + "lazy_static", + "libc", + "log", + "nix", + "serial2", + "shared_library", + "shell-words", + "winapi", + "winreg", +] + [[package]] name = "potential_utf" version = "0.1.5" @@ -946,6 +1213,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.107" @@ -962,14 +1238,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", - "cfg_aliases", + "cfg_aliases 0.2.2", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -991,7 +1267,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -1003,7 +1279,7 @@ version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ - "cfg_aliases", + "cfg_aliases 0.2.2", "libc", "once_cell", "socket2", @@ -1102,7 +1378,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.13.1", ] [[package]] @@ -1163,6 +1439,16 @@ dependencies = [ "webpki-roots 1.0.9", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -1245,6 +1531,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "semver" version = "1.0.28" @@ -1317,6 +1617,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serial2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eb6ea5562eeaed6936b8b54e086aa0f88b9e5b1bef45beb038e2519fa1185b1" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "sha1" version = "0.10.7" @@ -1348,6 +1659,22 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + [[package]] name = "shlex" version = "2.0.1" @@ -1370,6 +1697,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ + "digest", "rand_core 0.6.4", ] @@ -1465,13 +1793,33 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -1620,7 +1968,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-util", "http", @@ -1727,7 +2075,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror", + "thiserror 2.0.19", "utf-8", ] @@ -1744,7 +2092,7 @@ dependencies = [ "log", "rand 0.9.5", "sha1", - "thiserror", + "thiserror 2.0.19", ] [[package]] @@ -1759,6 +2107,16 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -1795,6 +2153,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -1937,6 +2307,28 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" @@ -2025,6 +2417,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "wit-bindgen" version = "0.57.1" @@ -2106,6 +2507,9 @@ name = "zeroize" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "serde", +] [[package]] name = "zerotrie" diff --git a/remote-agent/Cargo.toml b/remote-agent/Cargo.toml index 7f1eedb61..03e393106 100644 --- a/remote-agent/Cargo.toml +++ b/remote-agent/Cargo.toml @@ -6,12 +6,16 @@ license = "MIT" [dependencies] anyhow = "1.0" +aes-gcm = "0.10" axum = { version = "0.8", features = ["ws"] } base64 = "0.22" clap = { version = "4.5", features = ["derive"] } ed25519-dalek = { version = "2.2", features = ["pem", "pkcs8"] } futures-util = "0.3" +hkdf = "0.12" http-body-util = "0.1" +p256 = { version = "0.13", features = ["ecdh", "pem", "pkcs8"] } +portable-pty = "0.9" rand = "0.9" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "stream"] } serde = { version = "1", features = ["derive"] } @@ -23,6 +27,8 @@ tokio-util = "0.7" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } url = "2.5" +uuid = { version = "1", features = ["serde", "v4"] } +zeroize = { version = "1", features = ["serde"] } [profile.release] lto = true diff --git a/remote-agent/src/main.rs b/remote-agent/src/main.rs index b5ef4dd94..cf46a0aa6 100644 --- a/remote-agent/src/main.rs +++ b/remote-agent/src/main.rs @@ -2,6 +2,7 @@ mod assertion; mod config; mod control; mod proxy; +mod relay; mod supervisor; use std::{path::PathBuf, process::Command as ProcessCommand}; @@ -42,6 +43,11 @@ enum Command { #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] config: PathBuf, }, + /// Run the unprivileged, outbound-only relay used by `ocx gui` Remote. + Relay { + #[arg(long, default_value_os_t = relay::default_remote_state_path())] + state: PathBuf, + }, PrepareNetwork { #[arg(long, default_value = "/var/lib/opencodex-remote/agent.json")] config: PathBuf, @@ -144,6 +150,15 @@ async fn main() -> Result<()> { } shutdown.cancel(); } + Command::Relay { state } => { + let shutdown = CancellationToken::new(); + let signal = shutdown.clone(); + tokio::spawn(async move { + let _ = tokio::signal::ctrl_c().await; + signal.cancel(); + }); + relay::run(state, shutdown).await?; + } } Ok(()) } diff --git a/remote-agent/src/relay.rs b/remote-agent/src/relay.rs new file mode 100644 index 000000000..b1d205ed3 --- /dev/null +++ b/remote-agent/src/relay.rs @@ -0,0 +1,828 @@ +use std::{ + collections::HashMap, + env, + io::{Read, Write}, + path::{Path, PathBuf}, + sync::mpsc, + thread, + time::Duration, +}; + +use aes_gcm::{ + Aes256Gcm, Nonce, + aead::{Aead, KeyInit, Payload}, +}; +use anyhow::{Context, Result, bail}; +use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD}; +use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey}; +use futures_util::{SinkExt, StreamExt}; +use hkdf::Hkdf; +use p256::{ + PublicKey, + ecdh::EphemeralSecret, + elliptic_curve::rand_core::OsRng, + pkcs8::{DecodePrivateKey, DecodePublicKey, EncodePublicKey}, +}; +use portable_pty::{CommandBuilder, PtySize, native_pty_system}; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use tokio::sync::mpsc as tokio_mpsc; +use tokio_tungstenite::{ + connect_async_with_config, + tungstenite::{ + Message, + client::IntoClientRequest, + http::{HeaderValue, header::AUTHORIZATION}, + protocol::WebSocketConfig, + }, +}; +use tokio_util::sync::CancellationToken; +use tracing::{info, warn}; +use url::Url; +use uuid::Uuid; +use zeroize::Zeroizing; + +const PROTOCOL_VERSION: u8 = 1; +const FRAME_OPEN: u8 = 1; +const FRAME_DATA: u8 = 2; +const FRAME_CLOSE: u8 = 3; +const FRAME_HEADER_SIZE: usize = 18; +const MAX_PAYLOAD: usize = 64 * 1024; +const MAX_SESSIONS: usize = 4; + +const APP_INPUT: u8 = 1; +const APP_RESIZE: u8 = 2; +const APP_OUTPUT: u8 = 3; +const APP_EXIT: u8 = 4; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct RemoteState { + version: u8, + state: String, + relay_url: String, + relay_token: Zeroizing, + device_id: Uuid, + private_key_pem: Zeroizing, + e2ee: E2eeEnvelope, + instance: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct E2eeEnvelope { + root_public_key: String, +} + +#[derive(Debug, Deserialize)] +struct RemoteInstance { + id: Uuid, +} + +impl RemoteState { + fn load(path: &Path) -> Result { + let metadata = std::fs::metadata(path) + .with_context(|| format!("read metadata for {}", path.display()))?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + if metadata.permissions().mode() & 0o077 != 0 { + bail!("{} must not be readable by other users", path.display()); + } + } + if metadata.len() > 256 * 1024 { + bail!("remote state is too large"); + } + let state: Self = serde_json::from_slice( + &std::fs::read(path).with_context(|| format!("read {}", path.display()))?, + ) + .context("parse OpenCodex remote state")?; + if state.version != 2 || state.state != "connected" || state.instance.is_none() { + bail!("Remote must be connected, encrypted, and activated before the Agent starts"); + } + let relay = Url::parse(&state.relay_url).context("parse relay URL")?; + let local_development = + relay.scheme() == "ws" && matches!(relay.host_str(), Some("127.0.0.1" | "localhost")); + if relay.scheme() != "wss" && !local_development { + bail!("relay URL must use WSS"); + } + Ok(state) + } + + fn signing_key(&self) -> Result { + SigningKey::from_pkcs8_pem(&self.private_key_pem).context("parse device signing key") + } + + fn root_verifying_key(&self) -> Result { + let der = URL_SAFE_NO_PAD + .decode(&self.e2ee.root_public_key) + .context("decode account root public key")?; + VerifyingKey::from_public_key_der(&der).context("parse account root public key") + } +} + +pub fn default_remote_state_path() -> PathBuf { + if let Some(home) = env::var_os("OPENCODEX_HOME") { + return PathBuf::from(home).join("remote.json"); + } + PathBuf::from(env::var_os("HOME").unwrap_or_else(|| ".".into())) + .join(".opencodex") + .join("remote.json") +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum FrameKind { + Open, + Data, + Close, +} + +impl FrameKind { + fn from_byte(value: u8) -> Result { + match value { + FRAME_OPEN => Ok(Self::Open), + FRAME_DATA => Ok(Self::Data), + FRAME_CLOSE => Ok(Self::Close), + _ => bail!("unknown relay frame kind"), + } + } + + fn byte(self) -> u8 { + match self { + Self::Open => FRAME_OPEN, + Self::Data => FRAME_DATA, + Self::Close => FRAME_CLOSE, + } + } +} + +#[derive(Debug)] +struct RelayFrame { + kind: FrameKind, + session_id: Uuid, + payload: Vec, +} + +impl RelayFrame { + fn decode(bytes: &[u8]) -> Result { + if bytes.len() < FRAME_HEADER_SIZE || bytes.len() > FRAME_HEADER_SIZE + MAX_PAYLOAD { + bail!("invalid relay frame length"); + } + if bytes[0] != PROTOCOL_VERSION { + bail!("unsupported relay protocol version"); + } + Ok(Self { + kind: FrameKind::from_byte(bytes[1])?, + session_id: Uuid::from_slice(&bytes[2..FRAME_HEADER_SIZE]) + .context("parse relay session ID")?, + payload: bytes[FRAME_HEADER_SIZE..].to_vec(), + }) + } + + fn encode(&self) -> Result> { + if self.payload.len() > MAX_PAYLOAD { + bail!("relay payload is too large"); + } + let mut bytes = Vec::with_capacity(FRAME_HEADER_SIZE + self.payload.len()); + bytes.extend_from_slice(&[PROTOCOL_VERSION, self.kind.byte()]); + bytes.extend_from_slice(self.session_id.as_bytes()); + bytes.extend_from_slice(&self.payload); + Ok(bytes) + } +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct OpenRequest { + command_profile: CommandProfile, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ClientHello { + command_profile: CommandProfile, + ephemeral_public_key: String, + client_nonce: String, + signature: String, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct AgentHello { + ephemeral_public_key: String, + server_nonce: String, + signature: String, +} + +#[derive(Debug, Clone, Copy, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "lowercase")] +enum CommandProfile { + Shell, + Codex, + Claude, +} + +impl CommandProfile { + fn as_str(self) -> &'static str { + match self { + Self::Shell => "shell", + Self::Codex => "codex", + Self::Claude => "claude", + } + } + + fn executable(self) -> &'static str { + match self { + Self::Shell => { + #[cfg(windows)] + { + "powershell.exe" + } + #[cfg(not(windows))] + { + "/bin/sh" + } + } + Self::Codex => "codex", + Self::Claude => "claude", + } + } +} + +struct SessionCrypto { + session_id: Uuid, + receive: Aes256Gcm, + send: Aes256Gcm, + receive_nonce_prefix: [u8; 4], + send_nonce_prefix: [u8; 4], + receive_counter: u64, + send_counter: u64, +} + +impl SessionCrypto { + fn derive( + session_id: Uuid, + shared: &[u8], + client_nonce: &[u8], + server_nonce: &[u8], + ) -> Result { + let mut salt_source = Vec::with_capacity(client_nonce.len() + server_nonce.len()); + salt_source.extend_from_slice(client_nonce); + salt_source.extend_from_slice(server_nonce); + let salt = Sha256::digest(&salt_source); + let hkdf = Hkdf::::new(Some(&salt), shared); + let mut receive_key = [0_u8; 32]; + let mut send_key = [0_u8; 32]; + let mut receive_nonce_prefix = [0_u8; 4]; + let mut send_nonce_prefix = [0_u8; 4]; + hkdf.expand(b"ocx terminal browser to agent key v1", &mut receive_key) + .map_err(|_| anyhow::anyhow!("derive browser-to-agent key"))?; + hkdf.expand(b"ocx terminal agent to browser key v1", &mut send_key) + .map_err(|_| anyhow::anyhow!("derive agent-to-browser key"))?; + hkdf.expand( + b"ocx terminal browser to agent nonce v1", + &mut receive_nonce_prefix, + ) + .map_err(|_| anyhow::anyhow!("derive browser-to-agent nonce"))?; + hkdf.expand( + b"ocx terminal agent to browser nonce v1", + &mut send_nonce_prefix, + ) + .map_err(|_| anyhow::anyhow!("derive agent-to-browser nonce"))?; + Ok(Self { + session_id, + receive: Aes256Gcm::new_from_slice(&receive_key).expect("AES-256 key length"), + send: Aes256Gcm::new_from_slice(&send_key).expect("AES-256 key length"), + receive_nonce_prefix, + send_nonce_prefix, + receive_counter: 0, + send_counter: 0, + }) + } + + fn aad(&self, direction: u8, counter: u64) -> Vec { + let mut aad = b"ocx-terminal-frame-v1\0".to_vec(); + aad.extend_from_slice(self.session_id.as_bytes()); + aad.push(direction); + aad.extend_from_slice(&counter.to_be_bytes()); + aad + } + + fn nonce(prefix: [u8; 4], counter: u64) -> [u8; 12] { + let mut nonce = [0_u8; 12]; + nonce[..4].copy_from_slice(&prefix); + nonce[4..].copy_from_slice(&counter.to_be_bytes()); + nonce + } + + fn decrypt(&mut self, bytes: &[u8]) -> Result> { + if bytes.len() < 8 + 16 { + bail!("encrypted terminal frame is too short"); + } + let counter = u64::from_be_bytes(bytes[..8].try_into().expect("counter length")); + if counter != self.receive_counter { + bail!("replayed or out-of-order terminal frame"); + } + let nonce = Self::nonce(self.receive_nonce_prefix, counter); + let plaintext = self + .receive + .decrypt( + Nonce::from_slice(&nonce), + Payload { + msg: &bytes[8..], + aad: &self.aad(0, counter), + }, + ) + .map_err(|_| anyhow::anyhow!("terminal frame authentication failed"))?; + self.receive_counter = self + .receive_counter + .checked_add(1) + .context("terminal receive counter exhausted")?; + Ok(plaintext) + } + + fn encrypt(&mut self, plaintext: &[u8]) -> Result> { + let counter = self.send_counter; + let nonce = Self::nonce(self.send_nonce_prefix, counter); + let encrypted = self + .send + .encrypt( + Nonce::from_slice(&nonce), + Payload { + msg: plaintext, + aad: &self.aad(1, counter), + }, + ) + .map_err(|_| anyhow::anyhow!("encrypt terminal frame"))?; + self.send_counter = self + .send_counter + .checked_add(1) + .context("terminal send counter exhausted")?; + let mut bytes = Vec::with_capacity(8 + encrypted.len()); + bytes.extend_from_slice(&counter.to_be_bytes()); + bytes.extend_from_slice(&encrypted); + Ok(bytes) + } +} + +enum PtyCommand { + Input(Vec), + Resize { rows: u16, cols: u16 }, + Close, +} + +enum PtyEvent { + Output { session_id: Uuid, bytes: Vec }, + Exit { session_id: Uuid, code: u32 }, +} + +struct PtySession { + commands: mpsc::Sender, +} + +impl PtySession { + fn input(&self, bytes: Vec) -> Result<()> { + self.commands + .send(PtyCommand::Input(bytes)) + .map_err(|_| anyhow::anyhow!("terminal has exited")) + } + + fn resize(&self, rows: u16, cols: u16) -> Result<()> { + if !(2..=1000).contains(&rows) || !(2..=1000).contains(&cols) { + bail!("invalid terminal dimensions"); + } + self.commands + .send(PtyCommand::Resize { rows, cols }) + .map_err(|_| anyhow::anyhow!("terminal has exited")) + } +} + +impl Drop for PtySession { + fn drop(&mut self) { + let _ = self.commands.send(PtyCommand::Close); + } +} + +fn spawn_pty( + session_id: Uuid, + profile: CommandProfile, + events: tokio_mpsc::Sender, +) -> Result { + let pair = native_pty_system() + .openpty(PtySize { + rows: 24, + cols: 80, + pixel_width: 0, + pixel_height: 0, + }) + .context("open local PTY")?; + let mut command = CommandBuilder::new(profile.executable()); + command.env("TERM", "xterm-256color"); + command.env("COLORTERM", "truecolor"); + if let Some(home) = env::var_os("HOME") { + command.cwd(home); + } + let mut child = pair + .slave + .spawn_command(command) + .with_context(|| format!("start {} terminal", profile.as_str()))?; + drop(pair.slave); + let mut reader = pair.master.try_clone_reader().context("clone PTY reader")?; + let mut writer = pair.master.take_writer().context("take PTY writer")?; + let mut killer = child.clone_killer(); + let master = pair.master; + let (commands, command_rx) = mpsc::channel(); + + let output_events = events.clone(); + thread::spawn(move || { + let mut buffer = [0_u8; 16 * 1024]; + loop { + match reader.read(&mut buffer) { + Ok(0) | Err(_) => break, + Ok(read) => { + if output_events + .blocking_send(PtyEvent::Output { + session_id, + bytes: buffer[..read].to_vec(), + }) + .is_err() + { + break; + } + } + } + } + }); + thread::spawn(move || { + while let Ok(command) = command_rx.recv() { + let result = match command { + PtyCommand::Input(bytes) => writer.write_all(&bytes).and_then(|_| writer.flush()), + PtyCommand::Resize { rows, cols } => master + .resize(PtySize { + rows, + cols, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(std::io::Error::other), + PtyCommand::Close => { + let _ = killer.kill(); + break; + } + }; + if result.is_err() { + break; + } + } + }); + thread::spawn(move || { + let code = child.wait().map(|status| status.exit_code()).unwrap_or(1); + let _ = events.blocking_send(PtyEvent::Exit { session_id, code }); + }); + Ok(PtySession { commands }) +} + +enum SessionState { + Pending { + profile: CommandProfile, + }, + Handshaken { + profile: CommandProfile, + crypto: SessionCrypto, + }, + Active { + crypto: SessionCrypto, + pty: PtySession, + }, +} + +fn client_transcript( + session_id: Uuid, + device_id: Uuid, + profile: CommandProfile, + public_key: &[u8], + nonce: &[u8], +) -> Vec { + let mut transcript = b"ocx-terminal-client-v1\0".to_vec(); + transcript.extend_from_slice(session_id.as_bytes()); + transcript.extend_from_slice(device_id.as_bytes()); + transcript.extend_from_slice(profile.as_str().as_bytes()); + transcript.push(0); + transcript.extend_from_slice(public_key); + transcript.extend_from_slice(nonce); + transcript +} + +fn agent_transcript( + client_transcript: &[u8], + agent_public_key: &[u8], + server_nonce: &[u8], +) -> Vec { + let mut transcript = b"ocx-terminal-agent-v1\0".to_vec(); + transcript.extend_from_slice(client_transcript); + transcript.extend_from_slice(agent_public_key); + transcript.extend_from_slice(server_nonce); + transcript +} + +fn accept_client_hello( + state: &RemoteState, + session_id: Uuid, + expected_profile: CommandProfile, + payload: &[u8], +) -> Result<(AgentHello, SessionCrypto)> { + let hello: ClientHello = + serde_json::from_slice(payload).context("parse client terminal hello")?; + if hello.command_profile != expected_profile { + bail!("terminal command profile was changed in transit"); + } + let client_public_der = URL_SAFE_NO_PAD + .decode(&hello.ephemeral_public_key) + .context("decode browser ephemeral key")?; + let client_public = PublicKey::from_public_key_der(&client_public_der) + .context("parse browser ephemeral key")?; + let client_nonce = URL_SAFE_NO_PAD + .decode(&hello.client_nonce) + .context("decode browser nonce")?; + if client_nonce.len() != 32 { + bail!("browser nonce must be 32 bytes"); + } + let signature = URL_SAFE_NO_PAD + .decode(&hello.signature) + .context("decode browser signature")?; + let signature = Signature::from_slice(&signature).context("parse browser signature")?; + let client_transcript = client_transcript( + session_id, + state.device_id, + expected_profile, + &client_public_der, + &client_nonce, + ); + state + .root_verifying_key()? + .verify(&client_transcript, &signature) + .context("verify account root signature")?; + + let ephemeral = EphemeralSecret::random(&mut OsRng); + let agent_public = PublicKey::from(&ephemeral); + let agent_public_der = agent_public + .to_public_key_der() + .context("encode Agent ephemeral key")?; + let shared = ephemeral.diffie_hellman(&client_public); + let server_nonce = rand::random::<[u8; 32]>(); + let signature = state.signing_key()?.sign(&agent_transcript( + &client_transcript, + agent_public_der.as_bytes(), + &server_nonce, + )); + let crypto = SessionCrypto::derive( + session_id, + shared.raw_secret_bytes(), + &client_nonce, + &server_nonce, + )?; + Ok(( + AgentHello { + ephemeral_public_key: URL_SAFE_NO_PAD.encode(agent_public_der.as_bytes()), + server_nonce: URL_SAFE_NO_PAD.encode(server_nonce), + signature: URL_SAFE_NO_PAD.encode(signature.to_bytes()), + }, + crypto, + )) +} + +fn apply_terminal_input(pty: &PtySession, plaintext: &[u8]) -> Result<()> { + let Some((&kind, body)) = plaintext.split_first() else { + bail!("empty terminal application frame"); + }; + match kind { + APP_INPUT => pty.input(body.to_vec()), + APP_RESIZE if body.len() == 4 => { + let cols = u16::from_be_bytes([body[0], body[1]]); + let rows = u16::from_be_bytes([body[2], body[3]]); + pty.resize(rows, cols) + } + _ => bail!("invalid terminal application frame"), + } +} + +pub async fn run(state_path: PathBuf, shutdown: CancellationToken) -> Result<()> { + let mut retry = Duration::from_secs(1); + loop { + if shutdown.is_cancelled() { + return Ok(()); + } + match run_connection(&state_path, shutdown.clone()).await { + Ok(()) if shutdown.is_cancelled() => return Ok(()), + Ok(()) => warn!("relay disconnected"), + Err(error) => warn!(error = %error, "relay connection failed"), + } + tokio::select! { + _ = shutdown.cancelled() => return Ok(()), + _ = tokio::time::sleep(retry) => {} + } + retry = (retry * 2).min(Duration::from_secs(30)); + } +} + +async fn run_connection(state_path: &Path, shutdown: CancellationToken) -> Result<()> { + let state = RemoteState::load(state_path)?; + let instance_id = state.instance.as_ref().expect("validated instance").id; + let mut request = state + .relay_url + .as_str() + .into_client_request() + .context("build relay request")?; + request.headers_mut().insert( + AUTHORIZATION, + HeaderValue::from_str(&format!("Bearer {}", state.relay_token.as_str())) + .context("build relay authorization")?, + ); + let websocket_config = WebSocketConfig::default() + .max_message_size(Some(FRAME_HEADER_SIZE + MAX_PAYLOAD)) + .max_frame_size(Some(FRAME_HEADER_SIZE + MAX_PAYLOAD)); + let (socket, _) = connect_async_with_config(request, Some(websocket_config), false) + .await + .context("connect outbound relay")?; + info!(%instance_id, device_id = %state.device_id, "outbound relay connected"); + let (mut sink, mut stream) = socket.split(); + let (pty_events_tx, mut pty_events_rx) = tokio_mpsc::channel::(64); + let mut sessions = HashMap::::new(); + + loop { + tokio::select! { + _ = shutdown.cancelled() => { + let _ = sink.send(Message::Close(None)).await; + return Ok(()); + } + event = pty_events_rx.recv() => { + let Some(event) = event else { continue }; + match event { + PtyEvent::Output { session_id, bytes } => { + let Some(SessionState::Active { crypto, .. }) = sessions.get_mut(&session_id) else { continue }; + let mut plaintext = Vec::with_capacity(1 + bytes.len()); + plaintext.push(APP_OUTPUT); + plaintext.extend_from_slice(&bytes); + let encrypted = crypto.encrypt(&plaintext)?; + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Data, session_id, payload: encrypted }.encode()?.into())).await?; + } + PtyEvent::Exit { session_id, code } => { + if let Some(SessionState::Active { crypto, .. }) = sessions.get_mut(&session_id) { + let mut plaintext = vec![APP_EXIT]; + plaintext.extend_from_slice(&code.to_be_bytes()); + let encrypted = crypto.encrypt(&plaintext)?; + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Data, session_id, payload: encrypted }.encode()?.into())).await?; + } + sessions.remove(&session_id); + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id, payload: vec![] }.encode()?.into())).await?; + } + } + } + message = stream.next() => { + let Some(message) = message else { return Ok(()) }; + match message.context("read relay message")? { + Message::Binary(bytes) => { + let frame = RelayFrame::decode(&bytes)?; + match frame.kind { + FrameKind::Open => { + if sessions.contains_key(&frame.session_id) || sessions.len() >= MAX_SESSIONS { + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id: frame.session_id, payload: vec![] }.encode()?.into())).await?; + continue; + } + match serde_json::from_slice::(&frame.payload) { + Ok(request) => { + sessions.insert(frame.session_id, SessionState::Pending { profile: request.command_profile }); + } + Err(error) => { + warn!(session_id = %frame.session_id, error = %error, "terminal open request rejected"); + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id: frame.session_id, payload: vec![] }.encode()?.into())).await?; + } + } + } + FrameKind::Data => { + let Some(session) = sessions.remove(&frame.session_id) else { continue }; + match session { + SessionState::Pending { profile } => { + match accept_client_hello(&state, frame.session_id, profile, &frame.payload) { + Ok((hello, crypto)) => { + // The browser cannot decrypt application output until it has + // verified this hello and installed its receive handler. Starting + // the PTY here can lose an early shell prompt (counter 0), making + // the next frame look replayed. The first authenticated browser + // frame is therefore also the explicit PTY-start signal. + sessions.insert(frame.session_id, SessionState::Handshaken { profile, crypto }); + sink.send(Message::Binary(RelayFrame { + kind: FrameKind::Open, + session_id: frame.session_id, + payload: serde_json::to_vec(&hello)?, + }.encode()?.into())).await?; + } + Err(error) => { + warn!(session_id = %frame.session_id, error = %error, "terminal handshake rejected"); + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id: frame.session_id, payload: vec![] }.encode()?.into())).await?; + } + } + } + SessionState::Handshaken { profile, mut crypto } => { + let started = crypto.decrypt(&frame.payload).and_then(|plaintext| { + let pty = spawn_pty(frame.session_id, profile, pty_events_tx.clone())?; + apply_terminal_input(&pty, &plaintext)?; + Ok(pty) + }); + match started { + Ok(pty) => { + sessions.insert(frame.session_id, SessionState::Active { crypto, pty }); + } + Err(error) => { + warn!(session_id = %frame.session_id, error = %error, "terminal process failed to start"); + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id: frame.session_id, payload: vec![] }.encode()?.into())).await?; + } + } + } + SessionState::Active { mut crypto, pty } => { + match crypto.decrypt(&frame.payload).and_then(|plaintext| apply_terminal_input(&pty, &plaintext)) { + Ok(()) => { + sessions.insert(frame.session_id, SessionState::Active { crypto, pty }); + } + Err(error) => { + warn!(session_id = %frame.session_id, error = %error, "encrypted terminal input rejected"); + sink.send(Message::Binary(RelayFrame { kind: FrameKind::Close, session_id: frame.session_id, payload: vec![] }.encode()?.into())).await?; + } + } + } + } + } + FrameKind::Close => { + sessions.remove(&frame.session_id); + } + } + } + Message::Ping(payload) => sink.send(Message::Pong(payload)).await?, + Message::Close(_) => return Ok(()), + Message::Text(_) => bail!("relay sent a text frame"), + Message::Pong(_) | Message::Frame(_) => {} + } + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn relay_frame_round_trip_and_bounds() { + let session_id = Uuid::new_v4(); + let encoded = RelayFrame { + kind: FrameKind::Data, + session_id, + payload: b"opaque".to_vec(), + } + .encode() + .unwrap(); + let decoded = RelayFrame::decode(&encoded).unwrap(); + assert_eq!(decoded.kind, FrameKind::Data); + assert_eq!(decoded.session_id, session_id); + assert_eq!(decoded.payload, b"opaque"); + assert!(RelayFrame::decode(&vec![0; FRAME_HEADER_SIZE - 1]).is_err()); + assert!( + RelayFrame { + kind: FrameKind::Data, + session_id, + payload: vec![0; MAX_PAYLOAD + 1], + } + .encode() + .is_err() + ); + } + + #[test] + fn command_profiles_never_accept_arbitrary_commands() { + assert_eq!(CommandProfile::Shell.as_str(), "shell"); + assert_eq!(CommandProfile::Codex.executable(), "codex"); + assert_eq!(CommandProfile::Claude.executable(), "claude"); + assert!(serde_json::from_str::("\"rm -rf /\"").is_err()); + } + + #[test] + fn receive_counter_rejects_replay() { + let session_id = Uuid::new_v4(); + let mut agent = SessionCrypto::derive(session_id, &[7; 32], &[8; 32], &[9; 32]).unwrap(); + let nonce = SessionCrypto::nonce(agent.receive_nonce_prefix, 0); + let ciphertext = agent + .receive + .encrypt( + Nonce::from_slice(&nonce), + Payload { + msg: b"hello", + aad: &agent.aad(0, 0), + }, + ) + .unwrap(); + let mut encrypted = 0_u64.to_be_bytes().to_vec(); + encrypted.extend_from_slice(&ciphertext); + assert_eq!(agent.decrypt(&encrypted).unwrap(), b"hello"); + assert!(agent.decrypt(&encrypted).is_err()); + } +} diff --git a/src/remote/agent.ts b/src/remote/agent.ts new file mode 100644 index 000000000..2a86339c6 --- /dev/null +++ b/src/remote/agent.ts @@ -0,0 +1,187 @@ +import { spawn } from "node:child_process"; +import { + accessSync, + closeSync, + constants, + existsSync, + openSync, + readFileSync, + readlinkSync, + realpathSync, + unlinkSync, +} from "node:fs"; +import { chmod, open } from "node:fs/promises"; +import { dirname, isAbsolute, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { getConfigDir } from "../config"; + +interface AgentPidFile { + pid: number; + binary: string; + startedAt: string; +} + +export interface RemoteRelayAgentStatus { + supported: boolean; + running: boolean; + pid?: number; + error?: string; +} + +function pidPath(): string { + return join(getConfigDir(), "remote-agent.pid.json"); +} + +function logPath(): string { + return join(getConfigDir(), "remote-agent.log"); +} + +function statePath(): string { + return join(getConfigDir(), "remote.json"); +} + +function processAlive(pid: number): boolean { + if (!Number.isInteger(pid) || pid <= 1) return false; + try { + process.kill(pid, 0); + return true; + } catch { + return false; + } +} + +function recordedProcessAlive(recorded: AgentPidFile): boolean { + if (!processAlive(recorded.pid)) return false; + if (process.platform !== "linux") return true; + try { + // A stale pidfile must never make OCX signal an unrelated process after PID + // reuse. Linux exposes the actual executable without parsing a shell command. + const runningBinary = readlinkSync(`/proc/${recorded.pid}/exe`).replace(/ \(deleted\)$/, ""); + return resolve(runningBinary) === realpathSync(recorded.binary); + } catch { + return false; + } +} + +function readPidFile(): AgentPidFile | null { + try { + const parsed = JSON.parse(readFileSync(pidPath(), "utf8")) as Partial; + if ( + !Number.isInteger(parsed.pid) + || typeof parsed.binary !== "string" + || typeof parsed.startedAt !== "string" + ) return null; + return parsed as AgentPidFile; + } catch { + return null; + } +} + +function executableName(): string { + return process.platform === "win32" ? "opencodex-remote-agent.exe" : "opencodex-remote-agent"; +} + +function packagedPlatform(): string { + const platform = process.platform === "win32" ? "windows" : process.platform === "darwin" ? "macos" : "linux"; + return `${platform}-${process.arch}`; +} + +function resolveAgentBinary(): string | null { + const override = process.env.OPENCODEX_REMOTE_AGENT_BIN?.trim(); + if (override) { + if (!isAbsolute(override)) throw new Error("OPENCODEX_REMOTE_AGENT_BIN must be an absolute path"); + return override; + } + const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); + const name = executableName(); + const candidates = [ + join(packageRoot, "bin", "remote-agent", packagedPlatform(), name), + join(packageRoot, "remote-agent", "target", "release", name), + join(packageRoot, "remote-agent", "target", "debug", name), + ]; + return candidates.find(candidate => { + try { + if (!existsSync(candidate)) return false; + // Windows does not use POSIX execute bits; existence is sufficient there. + if (process.platform !== "win32") accessSync(candidate, constants.X_OK); + return true; + } catch { + return false; + } + }) ?? null; +} + +export function remoteRelayAgentStatus(): RemoteRelayAgentStatus { + const recorded = readPidFile(); + if (recorded && recordedProcessAlive(recorded)) { + return { supported: true, running: true, pid: recorded.pid }; + } + if (recorded) { + try { unlinkSync(pidPath()); } catch { /* stale PID cleanup is best-effort */ } + } + try { + const binary = resolveAgentBinary(); + return binary + ? { supported: true, running: false } + : { supported: false, running: false, error: "Remote Agent binary is not installed for this platform" }; + } catch (error) { + return { supported: false, running: false, error: error instanceof Error ? error.message : "Remote Agent unavailable" }; + } +} + +/** + * [Decision Log] + * - 목적과 의도: 사용자가 별도 root 설치나 페어링 코드를 다루지 않고 로컬 GUI 승인 뒤 동일 사용자 권한으로 outbound Agent를 시작한다. + * - 기존 구현 및 제약 조건: 기존 Agent는 root network 준비와 cloudflared를 전제로 했으며 npm 패키지에는 Agent source/binary가 포함되지 않았다. + * - 검토한 주요 대안: root systemd 서비스, 런타임 cargo build, Bun child pipe, 사전 빌드된 사용자 권한 Rust Agent. + * - 선택한 방식: 현재 플랫폼의 사전 빌드 binary만 명시적 argv로 detached 실행하고 remote.json은 0600 파일 경로로 전달한다. + * - 다른 대안 대신 이 방식을 선택한 이유: 포트·root·shell interpolation 없이 portable-pty와 WSS를 쓸 수 있고 런타임 컴파일 부하를 만들지 않는다. + * - 장점, 단점 및 영향: GUI에서 즉시 시작되고 기존 OCX 프로세스와 분리되지만 릴리스가 플랫폼별 서명 binary를 반드시 동봉해야 한다. + */ +export async function startRemoteRelayAgent(): Promise { + const current = remoteRelayAgentStatus(); + if (current.running || !current.supported) return current; + if (!existsSync(statePath())) return { supported: true, running: false, error: "Remote is not connected on this computer" }; + const binary = resolveAgentBinary(); + if (!binary) return { supported: false, running: false, error: "Remote Agent binary is not installed for this platform" }; + + await chmod(getConfigDir(), 0o700).catch(() => undefined); + const lock = await open(pidPath(), "wx", 0o600).catch(error => { + if ((error as NodeJS.ErrnoException).code === "EEXIST") return null; + throw error; + }); + if (!lock) return remoteRelayAgentStatus(); + const logFd = openSync(logPath(), "a", 0o600); + try { + const child = spawn(binary, ["relay", "--state", statePath()], { + detached: true, + windowsHide: true, + stdio: ["ignore", logFd, logFd], + env: process.env, + }); + if (!child.pid) throw new Error("Remote Agent did not start"); + const record: AgentPidFile = { pid: child.pid, binary, startedAt: new Date().toISOString() }; + await lock.writeFile(`${JSON.stringify(record, null, 2)}\n`); + await lock.sync(); + child.unref(); + await new Promise(resolvePromise => setTimeout(resolvePromise, 150)); + return processAlive(child.pid) + ? { supported: true, running: true, pid: child.pid } + : { supported: true, running: false, error: "Remote Agent exited during startup" }; + } catch (error) { + await lock.close().catch(() => undefined); + try { unlinkSync(pidPath()); } catch { /* best effort */ } + return { supported: true, running: false, error: error instanceof Error ? error.message : "Remote Agent failed to start" }; + } finally { + closeSync(logFd); + await lock.close().catch(() => undefined); + } +} + +export function stopRemoteRelayAgent(): void { + const recorded = readPidFile(); + if (recorded && recordedProcessAlive(recorded)) { + try { process.kill(recorded.pid, "SIGTERM"); } catch { /* already exited */ } + } + try { unlinkSync(pidPath()); } catch { /* already absent */ } +} diff --git a/src/remote/client.ts b/src/remote/client.ts index 04336dc42..8728463a7 100644 --- a/src/remote/client.ts +++ b/src/remote/client.ts @@ -3,6 +3,11 @@ import { arch, hostname, platform } from "node:os"; import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs"; import { join } from "node:path"; import { z } from "zod"; +import { + createRemoteE2eeProfile, + rewrapRemoteE2eeProfile, + type RemoteE2eeEnvelope, +} from "./e2ee"; import { atomicWriteFile, backupInvalidConfig, @@ -12,7 +17,7 @@ import { } from "../config"; const DEFAULT_CONTROL_PLANE_URL = "https://opencodexpages.me"; -const REMOTE_STATE_VERSION = 1; +const REMOTE_STATE_VERSION = 2; const REMOTE_REQUEST_TIMEOUT_MS = 15_000; const MAX_REMOTE_RESPONSE_BYTES = 256 * 1024; @@ -24,14 +29,68 @@ const remoteInstanceSchema = z.object({ "pending", "provisioning", "awaiting_agent", "connecting", "online", "degraded", "offline", "suspending", "suspended", "deleting", "delete_failed", "deleted", ]), + transportMode: z.enum(["mesh-tunnel", "outbound-relay"]).default("mesh-tunnel"), publicUrl: z.string().url(), }); +const remoteAccountSchema = z.object({ + name: z.string(), + email: z.string().email(), + githubNumericId: z.string().regex(/^\d+$/), +}); + +const remoteE2eeEnvelopeSchema = z.object({ + version: z.literal("ocx-e2ee-v1"), + salt: z.string(), + nonce: z.string(), + ciphertext: z.string(), + rootPublicKey: z.string(), + kdf: z.object({ + algorithm: z.literal("argon2id"), + memoryKiB: z.number().int(), + iterations: z.number().int(), + parallelism: z.number().int(), + outputLength: z.literal(32), + }), +}); + +const remoteDeviceSchema = z.object({ + id: z.string().uuid(), + name: z.string(), + platform: z.string(), + signingPublicKey: z.string(), + ecdhPublicKey: z.string().nullable(), + relayOnline: z.boolean(), + lastSeenAt: z.string().datetime().nullable(), + instanceId: z.string().uuid().nullable(), +}); + +const remoteProfileSchema = z.object({ + passwordSet: z.boolean(), + canActivate: z.boolean(), + e2ee: remoteE2eeEnvelopeSchema.nullable().default(null), + devices: z.array(remoteDeviceSchema).default([]), + instance: remoteInstanceSchema.nullable().default(null), +}); + +const legacyPendingStateSchema = z.object({ + version: z.literal(1), + state: z.literal("pending"), + controlPlaneUrl: z.string().url(), + privateKeyPem: z.string().min(1), + linkId: z.string().uuid(), + pollSecret: z.string().startsWith("ocxr_device_"), + userCode: z.string().min(4).max(32), + authorizeUrl: z.string().url(), + expiresAt: z.string().datetime(), +}); + const pendingStateSchema = z.object({ version: z.literal(REMOTE_STATE_VERSION), state: z.literal("pending"), controlPlaneUrl: z.string().url(), privateKeyPem: z.string().min(1), + ecdhPrivateKeyPem: z.string().min(1), linkId: z.string().uuid(), pollSecret: z.string().startsWith("ocxr_device_"), userCode: z.string().min(4).max(32), @@ -39,24 +98,43 @@ const pendingStateSchema = z.object({ expiresAt: z.string().datetime(), }); +const legacyConnectedStateSchema = z.object({ + version: z.literal(1), + state: z.literal("connected"), + controlPlaneUrl: z.string().url(), + privateKeyPem: z.string().min(1), + deviceId: z.string().uuid(), + deviceToken: z.string().startsWith("ocxr_device_"), + account: remoteAccountSchema, + passwordSet: z.boolean().default(false), + canActivate: z.boolean().default(false), + instance: remoteInstanceSchema.nullable().default(null), +}); + const connectedStateSchema = z.object({ version: z.literal(REMOTE_STATE_VERSION), state: z.literal("connected"), controlPlaneUrl: z.string().url(), privateKeyPem: z.string().min(1), + ecdhPrivateKeyPem: z.string().min(1), deviceId: z.string().uuid(), deviceToken: z.string().startsWith("ocxr_device_"), - account: z.object({ - name: z.string(), - email: z.string().email(), - githubNumericId: z.string().regex(/^\d+$/), - }), + relayToken: z.string().startsWith("ocxr_agent_"), + relayUrl: z.string().url(), + account: remoteAccountSchema, passwordSet: z.boolean().default(false), canActivate: z.boolean().default(false), + e2ee: remoteE2eeEnvelopeSchema.nullable().default(null), + devices: z.array(remoteDeviceSchema).default([]), instance: remoteInstanceSchema.nullable().default(null), }); -const remoteStateSchema = z.discriminatedUnion("state", [pendingStateSchema, connectedStateSchema]); +const remoteStateSchema = z.union([ + legacyPendingStateSchema, + pendingStateSchema, + legacyConnectedStateSchema, + connectedStateSchema, +]); type RemoteState = z.infer; export type RemoteStatus = @@ -78,6 +156,9 @@ export type RemoteStatus = account: { name: string; email: string; githubNumericId: string }; passwordSet: boolean; canActivate: boolean; + relayReady: boolean; + e2ee: z.infer | null; + devices: z.infer[]; instance: z.infer | null; error?: string; }; @@ -197,6 +278,9 @@ function publicStatus(state: RemoteState, serviceReachable: boolean, error?: str account: state.account, passwordSet: state.passwordSet, canActivate: state.canActivate, + relayReady: state.version === REMOTE_STATE_VERSION, + e2ee: state.version === REMOTE_STATE_VERSION ? state.e2ee : null, + devices: state.version === REMOTE_STATE_VERSION ? state.devices : [], instance: state.instance, ...(error ? { error } : {}), }; @@ -216,8 +300,11 @@ export async function startRemoteLink(deps: RemoteClientDependencies = {}): Prom if (existing?.state === "connected") return publicStatus(existing, true); const controlPlaneUrl = configuredControlPlaneUrl(deps.controlPlaneUrl); const { privateKey, publicKey } = generateKeyPairSync("ed25519"); + const { privateKey: ecdhPrivateKey, publicKey: ecdhPublicKey } = generateKeyPairSync("ec", { namedCurve: "prime256v1" }); const privateKeyPem = privateKey.export({ type: "pkcs8", format: "pem" }).toString(); const publicKeyDer = publicKey.export({ type: "spki", format: "der" }); + const ecdhPrivateKeyPem = ecdhPrivateKey.export({ type: "pkcs8", format: "pem" }).toString(); + const ecdhPublicKeyDer = ecdhPublicKey.export({ type: "spki", format: "der" }); const response = await remoteJson<{ id: string; pollSecret: string; @@ -230,6 +317,7 @@ export async function startRemoteLink(deps: RemoteClientDependencies = {}): Prom deviceName: (deps.deviceName ?? hostname()).slice(0, 80) || "OpenCodex device", platform: deps.devicePlatform ?? `${platform()}-${arch()}`, publicKey: Buffer.from(publicKeyDer).toString("base64url"), + ecdhPublicKey: Buffer.from(ecdhPublicKeyDer).toString("base64url"), }, }, deps.fetchImpl ?? fetch); const authorizeUrl = new URL(response.authorizeUrl); @@ -239,6 +327,7 @@ export async function startRemoteLink(deps: RemoteClientDependencies = {}): Prom state: "pending", controlPlaneUrl, privateKeyPem, + ecdhPrivateKeyPem, linkId: response.id, pollSecret: response.pollSecret, userCode: response.userCode, @@ -264,6 +353,8 @@ export async function getRemoteStatus(deps: RemoteClientDependencies = {}): Prom status: "pending" | "approved" | "expired" | "consumed"; deviceId?: string; deviceToken?: string; + relayToken?: string; + relayUrl?: string; user?: { name: string; email: string; githubNumericId: string }; }>(controlPlaneUrl, `/api/v1/device-links/${state.linkId}`, { headers: { "x-ocxr-link-secret": state.pollSecret }, @@ -273,16 +364,41 @@ export async function getRemoteStatus(deps: RemoteClientDependencies = {}): Prom return { state: "signed_out", controlPlaneUrl, serviceReachable: true, error: "device authorization expired" }; } if (result.status === "approved") { + if (!result.deviceId || !result.deviceToken || !result.user) throw new Error("device approval response is incomplete"); + let relayToken = result.relayToken; + let relayUrl = result.relayUrl; + let ecdhPrivateKeyPem = state.version === REMOTE_STATE_VERSION ? state.ecdhPrivateKeyPem : ""; + if (!relayToken || !relayUrl || !ecdhPrivateKeyPem) { + const pair = generateKeyPairSync("ec", { namedCurve: "prime256v1" }); + ecdhPrivateKeyPem = pair.privateKey.export({ type: "pkcs8", format: "pem" }).toString(); + const rotated = await remoteJson<{ relayToken: string; relayUrl: string }>( + controlPlaneUrl, + "/api/v1/devices/current/relay-credentials", + { + method: "POST", + headers: { authorization: `Bearer ${result.deviceToken}` }, + body: { ecdhPublicKey: pair.publicKey.export({ type: "spki", format: "der" }).toString("base64url") }, + }, + fetchImpl, + ); + relayToken = rotated.relayToken; + relayUrl = rotated.relayUrl; + } const connected = connectedStateSchema.parse({ version: REMOTE_STATE_VERSION, state: "connected", controlPlaneUrl, privateKeyPem: state.privateKeyPem, + ecdhPrivateKeyPem, deviceId: result.deviceId, deviceToken: result.deviceToken, + relayToken, + relayUrl, account: result.user, passwordSet: false, canActivate: false, + e2ee: null, + devices: [], instance: null, }); writeState(connected); @@ -295,28 +411,40 @@ export async function getRemoteStatus(deps: RemoteClientDependencies = {}): Prom return publicStatus(state, true); } - const result = await remoteJson<{ profile: { - passwordSet: boolean; - canActivate: boolean; - instance: z.infer | null; - } }>( + if (state.version === 1) { + const pair = generateKeyPairSync("ec", { namedCurve: "prime256v1" }); + const rotated = await remoteJson<{ relayToken: string; relayUrl: string }>( + controlPlaneUrl, + "/api/v1/devices/current/relay-credentials", + { + method: "POST", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: { ecdhPublicKey: pair.publicKey.export({ type: "spki", format: "der" }).toString("base64url") }, + }, + fetchImpl, + ); + const upgraded = connectedStateSchema.parse({ + ...state, + version: REMOTE_STATE_VERSION, + ecdhPrivateKeyPem: pair.privateKey.export({ type: "pkcs8", format: "pem" }).toString(), + relayToken: rotated.relayToken, + relayUrl: rotated.relayUrl, + e2ee: null, + devices: [], + }); + writeState(upgraded); + return getRemoteStatus(deps); + } + + const result = await remoteJson<{ profile: z.input }>( controlPlaneUrl, "/api/v1/remote/profile", { headers: { authorization: `Bearer ${state.deviceToken}` } }, fetchImpl, ); - const instance = result.profile.instance ? remoteInstanceSchema.parse(result.profile.instance) : null; - if ( - state.passwordSet !== result.profile.passwordSet - || state.canActivate !== result.profile.canActivate - || JSON.stringify(state.instance) !== JSON.stringify(instance) - ) { - const refreshed = { - ...state, - passwordSet: result.profile.passwordSet, - canActivate: result.profile.canActivate, - instance, - }; + const profile = remoteProfileSchema.parse(result.profile); + const refreshed = connectedStateSchema.parse({ ...state, ...profile }); + if (JSON.stringify(state) !== JSON.stringify(refreshed)) { writeState(refreshed); return publicStatus(refreshed, true); } @@ -337,12 +465,59 @@ export async function setRemotePassword(password: string, deps: RemoteClientDepe if (password.length < 10 || password.length > 128) throw new Error("remote password must be 10 to 128 characters"); const state = readState(); if (!state || state.state !== "connected") throw new Error("remote account is not connected"); - await remoteJson(state.controlPlaneUrl, "/api/v1/remote/password", { + if (state.version !== REMOTE_STATE_VERSION) throw new Error("refresh Remote before setting the encrypted password"); + const local = await createRemoteE2eeProfile(password, `github:${state.account.githubNumericId}`); + const result = await remoteJson<{ profile: z.input }>(state.controlPlaneUrl, "/api/v1/remote/e2ee-profile", { method: "PUT", headers: { authorization: `Bearer ${state.deviceToken}` }, - body: { password }, + body: local, }, deps.fetchImpl ?? fetch); - const updated = { ...state, passwordSet: true }; + let profile = remoteProfileSchema.parse(result.profile); + if (profile.instance?.transportMode === "mesh-tunnel") { + const currentDeviceName = profile.devices.find(device => device.id === state.deviceId)?.name ?? profile.instance.name; + const activated = await remoteJson<{ profile: z.input }>( + state.controlPlaneUrl, + "/api/v1/remote/activate", + { + method: "POST", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: { name: currentDeviceName, slug: profile.instance.slug }, + }, + deps.fetchImpl ?? fetch, + ); + profile = remoteProfileSchema.parse(activated.profile); + } + const updated = connectedStateSchema.parse({ ...state, ...profile }); + writeState(updated); + return publicStatus(updated, true); +} + +export async function changeRemotePassword( + oldPassword: string, + newPassword: string, + deps: RemoteClientDependencies = {}, +): Promise { + const state = readState(); + if (!state || state.state !== "connected" || state.version !== REMOTE_STATE_VERSION || !state.e2ee) { + throw new Error("end-to-end encrypted Remote is not configured"); + } + const changed = await rewrapRemoteE2eeProfile( + oldPassword, + newPassword, + `github:${state.account.githubNumericId}`, + state.e2ee as RemoteE2eeEnvelope, + ); + const result = await remoteJson<{ profile: z.input }>( + state.controlPlaneUrl, + "/api/v1/remote/e2ee-profile/change", + { + method: "POST", + headers: { authorization: `Bearer ${state.deviceToken}` }, + body: changed, + }, + deps.fetchImpl ?? fetch, + ); + const updated = connectedStateSchema.parse({ ...state, ...remoteProfileSchema.parse(result.profile) }); writeState(updated); return publicStatus(updated, true); } @@ -354,16 +529,12 @@ export async function activateRemoteInstance( ): Promise { const state = readState(); if (!state || state.state !== "connected") throw new Error("remote account is not connected"); - const result = await remoteJson<{ profile: { - passwordSet: boolean; - canActivate: boolean; - instance: z.infer; - } }>(state.controlPlaneUrl, "/api/v1/remote/activate", { + const result = await remoteJson<{ profile: z.input }>(state.controlPlaneUrl, "/api/v1/remote/activate", { method: "POST", headers: { authorization: `Bearer ${state.deviceToken}` }, body: { name, slug }, }, deps.fetchImpl ?? fetch); - const updated = connectedStateSchema.parse({ ...state, ...result.profile }); + const updated = connectedStateSchema.parse({ ...state, ...remoteProfileSchema.parse(result.profile) }); writeState(updated); return publicStatus(updated, true); } diff --git a/src/remote/e2ee.ts b/src/remote/e2ee.ts new file mode 100644 index 000000000..f66061f8d --- /dev/null +++ b/src/remote/e2ee.ts @@ -0,0 +1,195 @@ +import { + createCipheriv, + createDecipheriv, + generateKeyPairSync, + randomBytes, +} from "node:crypto"; +import { argon2idAsync } from "@noble/hashes/argon2.js"; +import { hkdf } from "@noble/hashes/hkdf.js"; +import { sha256 } from "@noble/hashes/sha2.js"; + +export const REMOTE_E2EE_VERSION = "ocx-e2ee-v1" as const; +export const REMOTE_E2EE_KDF = Object.freeze({ + algorithm: "argon2id" as const, + memoryKiB: 65_536, + iterations: 3, + parallelism: 1, + outputLength: 32, +}); + +export interface RemoteE2eeEnvelope { + version: typeof REMOTE_E2EE_VERSION; + salt: string; + nonce: string; + ciphertext: string; + rootPublicKey: string; + kdf: typeof REMOTE_E2EE_KDF; +} + +interface RemoteVaultPayload { + version: 1; + vaultKey: string; + rootPrivateKeyPem: string; +} + +const encoder = new TextEncoder(); + +function decode(value: string): Buffer { + return Buffer.from(value, "base64url"); +} + +function encode(value: Uint8Array): string { + return Buffer.from(value).toString("base64url"); +} + +function aad(accountBinding: string): Buffer { + return Buffer.from(`${REMOTE_E2EE_VERSION}\0${accountBinding}`, "utf8"); +} + +async function derive(password: string, salt: Uint8Array): Promise<{ authSecret: Buffer; wrapKey: Buffer }> { + if (password.length < 10 || password.length > 128) throw new Error("remote password must be 10 to 128 characters"); + if (salt.length !== 16) throw new Error("remote vault salt must be 16 bytes"); + const root = Buffer.from(await argon2idAsync(encoder.encode(password), salt, { + t: REMOTE_E2EE_KDF.iterations, + m: REMOTE_E2EE_KDF.memoryKiB, + p: REMOTE_E2EE_KDF.parallelism, + dkLen: REMOTE_E2EE_KDF.outputLength, + maxmem: 72 * 1024 * 1024, + asyncTick: 10, + })); + try { + return { + authSecret: Buffer.from(hkdf(sha256, root, salt, encoder.encode("opencodex remote auth v1"), 32)), + wrapKey: Buffer.from(hkdf(sha256, root, salt, encoder.encode("opencodex remote vault wrap v1"), 32)), + }; + } finally { + root.fill(0); + } +} + +function encryptPayload(payload: RemoteVaultPayload, wrapKey: Buffer, nonce: Buffer, accountBinding: string): Buffer { + const cipher = createCipheriv("aes-256-gcm", wrapKey, nonce, { authTagLength: 16 }); + cipher.setAAD(aad(accountBinding)); + const plaintext = Buffer.from(JSON.stringify(payload), "utf8"); + try { + return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]); + } finally { + plaintext.fill(0); + } +} + +function decryptPayload(envelope: RemoteE2eeEnvelope, wrapKey: Buffer, accountBinding: string): RemoteVaultPayload { + if (envelope.version !== REMOTE_E2EE_VERSION) throw new Error("unsupported remote vault version"); + const nonce = decode(envelope.nonce); + const sealed = decode(envelope.ciphertext); + if (nonce.length !== 12 || sealed.length < 17 || sealed.length > 4096) throw new Error("invalid remote vault envelope"); + const ciphertext = sealed.subarray(0, sealed.length - 16); + const tag = sealed.subarray(sealed.length - 16); + const decipher = createDecipheriv("aes-256-gcm", wrapKey, nonce, { authTagLength: 16 }); + decipher.setAAD(aad(accountBinding)); + decipher.setAuthTag(tag); + const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]); + try { + const parsed = JSON.parse(plaintext.toString("utf8")) as Partial; + if (parsed.version !== 1 || typeof parsed.vaultKey !== "string" || typeof parsed.rootPrivateKeyPem !== "string") { + throw new Error("invalid remote vault payload"); + } + if (decode(parsed.vaultKey).length !== 32 || parsed.rootPrivateKeyPem.length > 2048) { + throw new Error("invalid remote vault key material"); + } + return parsed as RemoteVaultPayload; + } finally { + plaintext.fill(0); + } +} + +export async function createRemoteE2eeProfile(password: string, accountBinding: string): Promise<{ + authSecret: string; + envelope: RemoteE2eeEnvelope; +}> { + const salt = randomBytes(16); + const nonce = randomBytes(12); + const vaultKey = randomBytes(32); + const { privateKey, publicKey } = generateKeyPairSync("ed25519"); + const payload: RemoteVaultPayload = { + version: 1, + vaultKey: encode(vaultKey), + rootPrivateKeyPem: privateKey.export({ type: "pkcs8", format: "pem" }).toString(), + }; + const derived = await derive(password, salt); + try { + const ciphertext = encryptPayload(payload, derived.wrapKey, nonce, accountBinding); + return { + authSecret: encode(derived.authSecret), + envelope: { + version: REMOTE_E2EE_VERSION, + salt: encode(salt), + nonce: encode(nonce), + ciphertext: encode(ciphertext), + rootPublicKey: encode(publicKey.export({ type: "spki", format: "der" })), + kdf: REMOTE_E2EE_KDF, + }, + }; + } finally { + vaultKey.fill(0); + derived.authSecret.fill(0); + derived.wrapKey.fill(0); + } +} + +export async function unlockRemoteE2eeProfile(password: string, accountBinding: string, envelope: RemoteE2eeEnvelope): Promise<{ + authSecret: string; + vault: RemoteVaultPayload; +}> { + const salt = decode(envelope.salt); + const derived = await derive(password, salt); + try { + return { + authSecret: encode(derived.authSecret), + vault: decryptPayload(envelope, derived.wrapKey, accountBinding), + }; + } finally { + derived.authSecret.fill(0); + derived.wrapKey.fill(0); + } +} + +export async function rewrapRemoteE2eeProfile( + oldPassword: string, + newPassword: string, + accountBinding: string, + envelope: RemoteE2eeEnvelope, +): Promise<{ oldAuthSecret: string; newAuthSecret: string; envelope: RemoteE2eeEnvelope }> { + const unlocked = await unlockRemoteE2eeProfile(oldPassword, accountBinding, envelope); + const salt = randomBytes(16); + const nonce = randomBytes(12); + const derived = await derive(newPassword, salt); + try { + const ciphertext = encryptPayload(unlocked.vault, derived.wrapKey, nonce, accountBinding); + return { + oldAuthSecret: unlocked.authSecret, + newAuthSecret: encode(derived.authSecret), + envelope: { + version: REMOTE_E2EE_VERSION, + salt: encode(salt), + nonce: encode(nonce), + ciphertext: encode(ciphertext), + rootPublicKey: envelope.rootPublicKey, + kdf: REMOTE_E2EE_KDF, + }, + }; + } finally { + derived.authSecret.fill(0); + derived.wrapKey.fill(0); + } +} + +/** + * [Decision Log] + * - 목적과 의도: 중앙 서버가 사용자의 원문 비밀번호나 vault 복호화 키를 보지 못하게 하면서 GitHub 외 별도 지식요소를 유지한다. + * - 기존 구현 및 제약 조건: 중앙 Argon2id password hash는 인증은 제공하지만 서버가 입력 비밀번호를 직접 받고 E2EE 키 봉투가 없었다. + * - 검토한 주요 대안: 서버측 password hash만 유지, 브라우저 PBKDF2, OPAQUE PAKE, client Argon2id와 HKDF domain separation. + * - 선택한 방식: 로컬에서 Argon2id root를 만들고 인증용 secret과 AES-GCM wrapping key를 서로 다른 HKDF info로 분리한다. + * - 다른 대안 대신 이 방식을 선택한 이유: 현재 Bun/브라우저에서 상호운용 가능하고 서버가 받은 인증 secret으로 vault key를 유도할 수 없다. + * - 장점, 단점 및 영향: DB 유출의 오프라인 대입 비용과 저장 데이터 기밀성이 개선되지만 auth secret 자체는 password-equivalent이므로 TLS, rate limit, session revocation이 계속 필요하다. OPAQUE는 후속 강화 후보다. + */ diff --git a/src/server/management/remote-routes.ts b/src/server/management/remote-routes.ts index 4e2ee05ac..8e80b8e1b 100644 --- a/src/server/management/remote-routes.ts +++ b/src/server/management/remote-routes.ts @@ -1,12 +1,18 @@ import { activateRemoteInstance, cancelRemoteLink, + changeRemotePassword, createRemotePairingCode, disconnectRemoteDevice, getRemoteStatus, setRemotePassword, startRemoteLink, } from "../../remote/client"; +import { + remoteRelayAgentStatus, + startRemoteRelayAgent, + stopRemoteRelayAgent, +} from "../../remote/agent"; import { jsonResponse } from "../auth-cors"; import type { ManagementContext } from "./context"; @@ -17,7 +23,7 @@ function errorMessage(error: unknown): string { export async function handleRemoteRoutes(ctx: ManagementContext): Promise { const { req, url, config } = ctx; if (url.pathname === "/api/remote/status" && req.method === "GET") { - return jsonResponse(await getRemoteStatus(), 200, req, config); + return jsonResponse({ ...await getRemoteStatus(), agent: remoteRelayAgentStatus() }, 200, req, config); } if (url.pathname === "/api/remote/link" && req.method === "POST") { try { @@ -33,7 +39,22 @@ export async function handleRemoteRoutes(ctx: ManagementContext): Promise-/`에 동봉해야 한다. 런타임 `cargo build`는 금지한다. -## Local-first user flow +## User flow ```text -ocx gui → Remote - → local device key + one-time polling secret - → opencodexpages.me GitHub OAuth and device-code approval - → separate Remote password - → reserve .opencodexpages.me and provision four Cloudflare resources - → pair signed Linux Agent - → instance hostname → GitHub ownership + Remote password → host-only session +local ocx gui → Remote + → GitHub device approval + → first account device: local Argon2id E2EE password + encrypted vault envelope + → reserve one unique .opencodexpages.me workspace + → register this computer under a unique account-local name + → start the unprivileged prebuilt Agent + → Agent opens one outbound WSS to relay.opencodexpages.me + +another browser + → owning GitHub account + → local E2EE password derivation and vault unlock + → host-only workspace session + → choose an online computer and shell/codex/claude + → first authenticated resize/input frame starts the selected PTY + → browser ↔ Agent encrypted PTY frames through the opaque relay ``` -GitHub is identity-only. Better Auth may need the OAuth token during the callback, but account create/update hooks discard access, refresh, and ID tokens before database persistence. The local PC receives only a revocable `ocxr_device_` token. Open signup is an explicit `PLATFORM_SIGNUP_MODE=open` deployment choice; the production bootstrap remains `private` while the signed helper and abuse controls are unfinished. +기존 계정은 새 E2EE 비밀번호를 처음 설정할 때 기존 slug를 보존한 채 `mesh-tunnel`에서 `outbound-relay`로 전환한다. 기존 Cloudflare 리소스 삭제는 자동 전환과 분리된 운영 작업이다. ## Trust boundaries -1. Browser/CLI는 비신뢰 입력이다. -2. Gateway는 DB ownership과 instance 상태의 authority다. -3. Cloudflare private hostname은 DB가 만든 값만 사용한다. 사용자 slug로 내부 목적지를 계산하지 않는다. -4. Rust Agent는 Gateway assertion을 검증하고 모든 proxy/control header를 정규화한다. -5. OpenCodex management API는 Agent를 신뢰해 생략하지 않고 assertion을 다시 검증한다. -6. Control Plane만 Cloudflare account token을 보유한다. Agent는 자기 Tunnel token만 받는다. -7. Control Plane은 인스턴스별 `10.192.0.0/10` `/32`를 할당한다. Agent는 이 범위와 `10101`의 정확한 조합만 loopback ingress로 허용한다. +1. GitHub는 계정 소유권만 증명한다. OAuth access/refresh/ID token은 DB에 저장하지 않는다. +2. Remote 비밀번호와 Argon2id root, vault wrapping key는 로컬 브라우저/OCX를 떠나지 않는다. +3. 서버가 받는 32-byte authentication secret은 password-equivalent이지만 HKDF 분리 때문에 vault envelope를 복호화할 수 없다. +4. 브라우저는 account root Ed25519로 handshake를 서명하고 Agent는 device Ed25519로 응답을 서명한다. +5. 세션별 ephemeral P-256 ECDH와 방향별 AES-256-GCM counter가 기밀성, endpoint binding, replay 방지를 제공한다. +6. Gateway는 연결 경계에서만 DB를 사용하고 terminal frame을 해석·저장·로그하지 않는다. +7. Agent는 `shell`, `codex`, `claude` 고정 profile만 실행하며 현재 OS 사용자 권한을 넘지 않는다. +8. Cloudflare는 public TLS/ingress와 패킷 전달 경계다. E2EE endpoint나 plaintext authority가 아니다. -## Data flow +## Live data flow ```text -public instance hostname - → Gateway ownership/session/token check - → 30-second Ed25519 request assertion - → Mesh private hostname route - → DNS-only private origin A record + narrow /32 activation route - → per-instance cloudflared - → Agent loopback alias:10101 assertion/replay/header validation - → loopback OpenCodex +Browser xterm.js + ↕ encrypted session frames (AES-GCM, signed ephemeral ECDH) +Cloudflare wildcard ingress + ↕ WSS +Gateway in-memory bounded relay + ↕ one outbound WSS per online computer +Rust Agent + portable-pty + ↕ current-user local process +shell / codex / claude ``` -### Private origin addressing invariant +Gateway frame header는 protocol version, kind, 128-bit terminal session ID만 가진다. payload는 최대 64 KiB 암호문이다. 기기당 active session은 4개, socket buffered output은 1 MiB로 제한한다. Agent가 연결되면 workspace는 `online`, 마지막 Agent가 끊기면 `offline`이다. -`cloudflared`의 hostname-route 가상 DNS는 `/etc/hosts`의 `127.0.0.1` 매핑을 사용하지 않았고, loopback DNS 답은 Gateway synthetic IP로 변환되지 않았다. 따라서 Control Plane은 추측 불가능한 private hostname에 DNS-only RFC1918 A record를 먼저 만들고, 같은 `/32` CIDR route와 hostname route를 instance Tunnel에 연결한다. Agent는 할당된 `/32`를 `lo`에 추가해 LAN listener 없이 cloudflared가 origin을 해석하고 접속하게 한다. +## Credential and key classes -[Decision Log] -- 목적과 의도: private hostname routing을 실제 Cloudflare DNS/connector 동작과 일치시키면서 Agent ingress를 LAN에 노출하지 않는다. -- 기존 구현 및 제약 조건: `127.0.0.1` hosts 매핑은 cloudflared virtual DNS에서 NXDOMAIN이었고 hostname route만으로는 Tunnel `warp-routing`이 활성화되지 않았다. -- 검토한 주요 대안: LAN IP에 `0.0.0.0` bind, public Tunnel hostname, custom DNS resolver, RFC1918 loopback alias와 `/32` activation route. -- 선택한 방식: `10.192.0.0/10` 고유 `/32`를 privileged `prepare-network` 단계에서 Agent loopback에 bind하고 DNS record, CIDR route, hostname route를 함께 lifecycle 관리한다. -- 다른 대안 대신 이 방식을 선택한 이유: public origin이나 LAN listener 없이 현재 Cloudflare API와 Mesh data plane에서 종단 연결이 실측 통과했다. -- 장점, 단점 및 영향: origin은 로컬 전용이고 중앙 정책을 우회하지 않지만 인스턴스당 Cloudflare 리소스 네 개와 loopback 주소 관리가 추가된다. Agent runtime 자체는 `CAP_NET_ADMIN`을 보유하지 않는다. - -SSE와 HTTP response body는 buffer를 만들지 않고 전달한다. WebSocket은 Gateway와 Agent 두 hop에서 양방향으로 relay한다. 각 hop은 downstream disconnect를 upstream close/abort로 전파해야 한다. +- `ocxr_device_`: 로컬 management API용 장치별 폐기 가능 token. `remote.json` 0600에만 저장. +- `ocxr_agent_`: 해당 컴퓨터의 outbound Relay 연결 token. DB에는 SHA-256만 저장. +- Instance session: 중앙 access code를 wildcard host-only HttpOnly cookie로 교환한 12시간 browser session. +- E2EE authentication secret: Remote password의 Argon2id root에서 auth 전용 HKDF info로 만든 32 bytes. 서버는 다시 SHA-256하여 저장. +- Vault wrapping key: 동일 root에서 별도 HKDF info로 만든 AES-256 key. 서버로 전송하지 않음. +- Account root Ed25519: private key는 encrypted vault 안, public key는 서버/Agent 검증 metadata. +- Device Ed25519: private key는 해당 컴퓨터 `remote.json`, public key는 workspace metadata. +- Session ECDH/AES keys: 브라우저와 Agent memory에만 존재하고 session 종료 시 폐기. -### Streaming lifecycle invariant +## Runtime and release invariants -Gateway의 HTTP 요청 추적 수명은 upstream `fetch()`가 헤더를 반환한 시점이 아니라 response body가 종료·오류·취소된 시점까지다. suspend/delete의 PostgreSQL 알림은 활성 HTTP controller를 abort하고 활성 WebSocket을 policy close한다. WebSocket의 key/version/upgrade header는 각 relay hop이 직접 생성하며 이전 hop의 handshake header를 재사용하지 않는다. - -[Decision Log] -- 목적과 의도: suspend/delete 및 downstream disconnect가 이미 헤더를 받은 장기 SSE/HTTP/WS 연결도 즉시 종료하게 한다. -- 기존 구현 및 제약 조건: response body는 buffering 없이 전달해야 하고, `fetch()` 완료 직후 cleanup하면 실제 stream 수명보다 추적이 먼저 끝난다. -- 검토한 주요 대안: 응답 전체 buffering, 고정 timeout, fetch 완료 시 추적 해제, response stream lifecycle wrapper. -- 선택한 방식: backpressure를 유지하는 `ReadableStream` wrapper에서 종료·취소 시 cleanup하고, WebSocket은 instance별 활성 registry로 추적한다. -- 다른 대안 대신 이 방식을 선택한 이유: 본문 크기와 연결 시간에 무관하게 기존 streaming 성질을 유지하면서 취소와 중앙 정지를 정확히 전파한다. -- 장점, 단점 및 영향: 100 MiB와 장기 stream도 상수 크기 buffering으로 중계하고 즉시 폐기할 수 있다. 대신 모든 body 종료 경로와 socket close 경로가 반드시 idempotent cleanup을 호출해야 한다. - -## Credential classes - -- OpenCodex admin token: 기존 로컬 관리 자격증명. -- OpenCodex GUI session: 기존 exact-origin + CSRF session. -- Remote assertion: 중앙 Gateway가 발급하고 Agent와 OpenCodex가 검증하는 `/api/*` 관리 자격증명. -- `ocxr_` data token: instance-scoped `/v1/*` 입장 자격증명. OpenCodex origin에는 전달하지 않는다. -- Instance session: browser가 authorization code를 교환해 얻는 host-only cookie. 공식 세션은 origin에 전달하지 않는다. -- Remote device token: local `remote.json`에만 저장되는 `ocxr_device_` credential. GitHub token이 아니며 현재 PC 단위로 폐기한다. -- Remote password: 중앙 Argon2id hash. GitHub session과 별개로 instance browser session 발급 전에 확인하며 5회 실패 시 15분 잠근다. +- Agent는 root, `CAP_NET_ADMIN`, port forwarding, LAN listener를 요구하지 않는다. +- Relay token을 argv, URL query, browser storage, log에 넣지 않는다. +- 브라우저 vault handoff는 URL fragment로만 전달하고 wildcard origin 진입 즉시 `sessionStorage`로 옮긴 뒤 주소 표시줄/history에서 제거한다. +- suspend/delete PostgreSQL 알림만 active sockets를 강제 종료한다. online/offline presence 알림은 revocation으로 취급하지 않는다. +- Agent handshake 또는 frame 오류는 해당 terminal session만 닫아야 하며 다른 세션과 Agent WSS를 불필요하게 끊지 않는다. +- build/test는 운영 VPS에서 transient systemd unit의 `CPUQuota=50%`, low CPU weight, positive nice로 실행한다. Remote runtime 서비스에는 영구 CPUQuota를 두지 않는다. +- release 전 플랫폼별 signed Agent artifact, migration backup/rollback, real browser E2E, reconnect/backpressure, XSS/CSP 검증이 모두 필요하다. [Decision Log] -- 목적과 의도: 개인 서버의 OpenCodex 전체 GUI/API/stream을 포트 공개 없이 안전하게 원격 제공한다. -- 기존 구현 및 제약 조건: OpenCodex는 Bun-native loopback proxy이며 admin token과 GUI session 경계를 이미 가진다. -- 검토한 주요 대안: public per-user hostname Tunnel, Cloudflare Access, Workers VPC, 자체 reverse tunnel. -- 선택한 방식: 중앙 Gateway와 Cloudflare Mesh private hostname route, instance별 Tunnel, Rust local ingress. -- 다른 대안 대신 이 방식을 선택한 이유: 사용자 origin을 공개하지 않고 중앙 ownership 정책을 모든 요청에 강제하면서 OpenCodex 기존 stream/WS surface를 보존할 수 있다. -- 장점, 단점 및 영향: 중앙 인증과 즉시 정지가 가능하지만 Mesh Beta 적합성, 두 번의 proxy hop, 운영 복잡도가 생긴다. Phase 0 실패 시 구현을 중단한다. +- 목적과 의도: 실제 구현과 문서가 하나의 현재 구조를 설명하고 기존 Mesh 기록은 rollback 근거로 보존한다. +- 기존 구현 및 제약 조건: 기존 문서는 인스턴스당 Mesh/Tunnel과 중앙 plaintext proxy를 현재형으로 설명해 새 다중 컴퓨터 E2EE 구조와 충돌했다. +- 검토한 주요 대안: 기존 문서에 부록만 추가, 완전 삭제, 현재 구조 재작성과 이전 ADR 보존. +- 선택한 방식: 현재 구조를 이 문서의 본문으로 만들고 기존 경로는 superseded ADR과 운영 문서로 남긴다. +- 다른 대안 대신 이 방식을 선택한 이유: 신규 개발자가 잘못된 root/Cloudflare lifecycle을 계속 구현하지 않으면서 검증된 rollback 지식도 잃지 않는다. +- 장점, 단점 및 영향: 현재 data flow가 명확해지지만 운영 배포가 전환되기 전까지 코드 경로 두 개를 구분해 유지해야 한다. diff --git a/structure/adr/0012-remote-private-mesh.md b/structure/adr/0012-remote-private-mesh.md index b1dc06d94..399f9e6f5 100644 --- a/structure/adr/0012-remote-private-mesh.md +++ b/structure/adr/0012-remote-private-mesh.md @@ -1,6 +1,6 @@ # ADR 0012: Remote access through a central Gateway and private Mesh routes -- Status: accepted and central runtime deployed; public multi-user release remains blocked on signed Agent delivery and final operating E2E +- Status: superseded for new Remote workspaces by ADR 0013; retained only as the deployed private-MVP rollback path - Date: 2026-07-30 ## Context diff --git a/structure/adr/0013-remote-outbound-e2ee-relay.md b/structure/adr/0013-remote-outbound-e2ee-relay.md new file mode 100644 index 000000000..52334d7f6 --- /dev/null +++ b/structure/adr/0013-remote-outbound-e2ee-relay.md @@ -0,0 +1,52 @@ +# ADR 0013: Account workspace with outbound E2EE terminal relay + +- Status: accepted for implementation; not deployed to production +- Date: 2026-07-30 +- Supersedes: ADR 0012 for newly activated Remote workspaces + +## Context + +The Mesh private-MVP proved that a loopback OpenCodex GUI could be reached without a public user origin, but it requires four Cloudflare resources, a privileged loopback address, and a dedicated `cloudflared` connector per computer. The intended product is different: one GitHub account owns one stable Remote address, multiple named computers can attach to it, and a browser should run Shell, Codex CLI, or Claude Code on any online computer. Home users cannot be required to configure port forwarding. + +The central service must minimize CPU, database, and trust. It must not receive terminal plaintext, the user's Remote password, or a vault decryption key. + +## Decision + +An `instance` becomes an account workspace and keeps one unique `.opencodexpages.me` address. `remote_devices` are the named computers attached to that workspace. Every computer opens one outbound WSS connection to `relay.opencodexpages.me`; no inbound user port, private Mesh enrollment, per-device Tunnel, or root network preparation is required. + +The browser enters through the central GitHub page and derives two values locally from the separate Remote password with Argon2id: + +- an authentication secret sent over TLS after GitHub ownership is established; +- an independent AES-256-GCM wrapping key that never leaves the client. + +HKDF domain separation prevents the authentication secret from decrypting the vault envelope. The encrypted vault contains an account Ed25519 root private key and a random vault key. The server stores only the authentication-secret hash, KDF parameters, public root key, and encrypted envelope. + +For every terminal session, the browser creates an ephemeral P-256 key and signs the session transcript with the account root key. The Agent verifies that signature, creates its own ephemeral P-256 key, and signs the reply with the device Ed25519 key. Both sides derive directional AES-256-GCM keys and nonce prefixes with HKDF. Strict monotonically increasing counters are authenticated as AAD and reject replay or reordering. The central Gateway sees the device, session UUID, command profile, frame size, and connection timing, but relays only bounded ciphertext payloads. + +The Agent does not start the PTY while returning its signed handshake. It waits for the first authenticated browser application frame, which acts as the PTY-start signal. This ordering is required because a shell can emit a prompt before the browser has installed its encrypted-frame handler; losing counter zero would otherwise make the next legitimate frame indistinguishable from replay or reordering. + +The only command choices accepted by the Agent are fixed profiles: `shell`, `codex`, and `claude`. The browser cannot provide an arbitrary executable. Each device permits at most four active sessions. Relay payloads are limited to 64 KiB and each socket is closed when its buffered output exceeds 1 MiB. The Gateway performs database work only at authentication, session creation, and close boundaries; it does not query or persist per terminal frame. + +The Rust Agent runs as the current user with `portable-pty`, Tokio, and `tokio-tungstenite`. OCX may start only a prebuilt platform binary with explicit argv; it never compiles the Agent at runtime. Release remains blocked until signed binaries are packaged for each supported platform. + +Cloudflare remains the public TLS and wildcard ingress boundary. It is not the terminal encryption boundary and is not relied on to see or protect terminal plaintext. + +## Consequences + +- Positive: no port forwarding, root helper, private Mesh enrollment, or per-computer Cloudflare lifecycle. +- Positive: one account/domain naturally supports multiple computers and a future managed VPS as another device. +- Positive: the server can route live traffic without decrypting or storing terminal data and without database work per frame. +- Positive: ephemeral ECDH keys provide forward secrecy for terminal sessions; device and account signatures prevent an active relay from silently substituting an endpoint. +- Negative: metadata such as device identity, selected command profile, frame size, and timing remains visible to the service. +- Negative: the authentication secret is password-equivalent. TLS, attempt limits, session revocation, and GitHub ownership remain required; OPAQUE is a future hardening candidate. +- Negative: browser memory and session storage hold the unlocked vault for the current tab. CSP, same-origin delivery, dependency integrity, and immediate fragment removal are security-critical. +- Negative: signed multi-platform Agent packaging and a public operating E2E with real Codex/Claude CLI processes are still release blockers. The local PostgreSQL 17 + Gateway + Rust Agent + WebCrypto + PTY encrypted round trip is complete. +- Negative: old Mesh resources are not automatically deleted by the schema migration. Conversion preserves the existing slug and marks the workspace `outbound-relay`; resource cleanup requires a separate audited operation. + +[Decision Log] +- 목적과 의도: 서버 부하와 신뢰를 줄이면서 계정 주소 하나에서 여러 컴퓨터의 CLI 터미널을 포트포워딩 없이 제공한다. +- 기존 구현 및 제약 조건: 기존 Mesh MVP는 컴퓨터마다 Cloudflare 리소스 네 개와 root loopback 준비가 필요했고 중앙 proxy가 GUI 전체 평문을 처리했다. +- 검토한 주요 대안: 기존 Mesh 유지, 공개 user Tunnel, 중앙 PTY/VPS 실행, Tailscale형 overlay, outbound application relay와 브라우저-Agent E2EE. +- 선택한 방식: 한 컴퓨터당 outbound WSS 하나, 세션별 상호 서명 ephemeral P-256, 방향별 AES-GCM, 중앙의 bounded opaque relay를 사용한다. Agent handshake 응답 뒤 첫 인증된 browser frame을 PTY 시작 신호로 사용한다. +- 다른 대안 대신 이 방식을 선택한 이유: 일반 가정용 네트워크에서도 동작하고 서버가 터미널 평문이나 복호화 키를 보지 않으면서 계정당 여러 컴퓨터를 자연스럽게 지원한다. +- 장점, 단점 및 영향: 운영 리소스와 중앙 CPU는 줄지만 signed Agent 배포, 브라우저 crypto 상호운용, 메타데이터 노출 관리가 새 완료 조건이 된다. diff --git a/tests/remote-client.test.ts b/tests/remote-client.test.ts index 3efa2a2df..3cf693663 100644 --- a/tests/remote-client.test.ts +++ b/tests/remote-client.test.ts @@ -33,7 +33,9 @@ describe("local Remote device authorization", () => { let passwordUpdated = false; let instanceActivated = false; let deviceRevoked = false; + let e2eeEnvelope: Record | null = null; const deviceToken = `ocxr_device_${"d".repeat(43)}`; + const relayToken = `ocxr_agent_${"r".repeat(43)}`; const pollSecret = `ocxr_device_${"p".repeat(43)}`; const fetchImpl: typeof fetch = async (input, init) => { const url = new URL(String(input)); @@ -54,6 +56,8 @@ describe("local Remote device authorization", () => { status: "approved", deviceId: "22222222-2222-4222-8222-222222222222", deviceToken, + relayToken, + relayUrl: "wss://relay.opencodexpages.me/_ocxr/agent", user: { name: "Octo User", email: "octo@example.test", githubNumericId: "12345" }, }); } @@ -63,6 +67,8 @@ describe("local Remote device authorization", () => { return Response.json({ profile: { passwordSet: passwordUpdated, canActivate: true, + e2ee: e2eeEnvelope, + devices: [], instance: instanceActivated ? { id: "33333333-3333-4333-8333-333333333333", name: "Test PC", @@ -72,15 +78,27 @@ describe("local Remote device authorization", () => { } : null, } }); } - if (url.pathname === "/api/v1/remote/password" && init?.method === "PUT") { + if (url.pathname === "/api/v1/remote/e2ee-profile" && init?.method === "PUT") { + expect(init?.headers).toMatchObject({ authorization: `Bearer ${deviceToken}` }); + const body = JSON.parse(String(init.body)) as { authSecret: string; envelope: Record }; + expect(body.authSecret).toHaveLength(43); + e2eeEnvelope = body.envelope; passwordUpdated = true; - return Response.json({ ok: true }); + return Response.json({ profile: { + passwordSet: true, + canActivate: true, + e2ee: e2eeEnvelope, + devices: [], + instance: null, + } }); } if (url.pathname === "/api/v1/remote/activate" && init?.method === "POST") { instanceActivated = true; return Response.json({ profile: { passwordSet: true, canActivate: true, + e2ee: e2eeEnvelope, + devices: [], instance: { id: "33333333-3333-4333-8333-333333333333", name: "Test PC", @@ -113,12 +131,14 @@ describe("local Remote device authorization", () => { passwordSet: false, }); expect(JSON.stringify(connected)).not.toContain(deviceToken); + expect(JSON.stringify(connected)).not.toContain(relayToken); expect(await setRemotePassword("a-strong-remote-password", { fetchImpl })).toMatchObject({ state: "connected", passwordSet: true, }); expect(passwordUpdated).toBe(true); + expect(e2eeEnvelope).not.toBeNull(); expect(await activateRemoteInstance("Test PC", "test-pc", { fetchImpl })).toMatchObject({ state: "connected", instance: { slug: "test-pc", status: "pending" }, diff --git a/tests/remote-e2ee.test.ts b/tests/remote-e2ee.test.ts new file mode 100644 index 000000000..3d4871a21 --- /dev/null +++ b/tests/remote-e2ee.test.ts @@ -0,0 +1,35 @@ +import { expect, test } from "bun:test"; +import { + createRemoteE2eeProfile, + rewrapRemoteE2eeProfile, + unlockRemoteE2eeProfile, +} from "../src/remote/e2ee"; + +test("remote vault stays decryptable across a password rewrap without reusing auth material", async () => { + const initial = await createRemoteE2eeProfile("correct horse battery staple", "github:186453546"); + const unlocked = await unlockRemoteE2eeProfile("correct horse battery staple", "github:186453546", initial.envelope); + expect(Buffer.from(unlocked.vault.vaultKey, "base64url")).toHaveLength(32); + expect(unlocked.authSecret).toBe(initial.authSecret); + + const changed = await rewrapRemoteE2eeProfile( + "correct horse battery staple", + "new correct horse battery staple", + "github:186453546", + initial.envelope, + ); + expect(changed.oldAuthSecret).toBe(initial.authSecret); + expect(changed.newAuthSecret).not.toBe(initial.authSecret); + expect(changed.envelope.ciphertext).not.toBe(initial.envelope.ciphertext); + const after = await unlockRemoteE2eeProfile( + "new correct horse battery staple", + "github:186453546", + changed.envelope, + ); + expect(after.vault.vaultKey).toBe(unlocked.vault.vaultKey); +}, 60_000); + +test("remote vault rejects a wrong password and a different account binding", async () => { + const initial = await createRemoteE2eeProfile("correct horse battery staple", "github:186453546"); + await expect(unlockRemoteE2eeProfile("totally incorrect password", "github:186453546", initial.envelope)).rejects.toThrow(); + await expect(unlockRemoteE2eeProfile("correct horse battery staple", "github:999999", initial.envelope)).rejects.toThrow(); +}, 60_000); From faee6a650d53c512dc90fe688f3ed8cc28306c95 Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Fri, 31 Jul 2026 10:34:48 +0000 Subject: [PATCH 7/7] feat(remote): ship signed cross-platform agents --- .github/workflows/ci.yml | 68 +++ .github/workflows/release.yml | 124 +++++- .../src/content/docs/guides/web-dashboard.md | 18 +- .../content/docs/ja/guides/web-dashboard.md | 10 +- .../src/content/docs/ja/reference/cli.md | 4 +- .../content/docs/ko/guides/web-dashboard.md | 10 +- .../src/content/docs/ko/reference/cli.md | 2 +- docs-site/src/content/docs/reference/cli.md | 4 +- .../content/docs/ru/guides/web-dashboard.md | 10 +- .../src/content/docs/ru/reference/cli.md | 4 +- .../docs/zh-cn/guides/web-dashboard.md | 10 +- .../src/content/docs/zh-cn/reference/cli.md | 4 +- gui/src/i18n/de.ts | 18 +- gui/src/i18n/ja.ts | 18 +- gui/src/i18n/ru.ts | 18 +- gui/src/i18n/zh.ts | 18 +- platform/docs/IMPLEMENTATION_STATUS.md | 20 +- remote-agent/rust-toolchain.toml | 4 + remote-agent/src/relay.rs | 2 +- scripts/prepare-package.ts | 39 +- scripts/remote-agent-bundle.ts | 68 +++ src/remote/agent-bundle.ts | 399 ++++++++++++++++++ src/remote/agent.ts | 33 +- structure/05_gui-and-management-api.md | 6 +- structure/06_docs-and-release.md | 21 +- structure/12_remote-platform.md | 31 ++ tests/ci-workflows.test.ts | 39 +- tests/remote-agent-bundle.test.ts | 118 ++++++ 28 files changed, 1017 insertions(+), 103 deletions(-) create mode 100644 remote-agent/rust-toolchain.toml create mode 100644 scripts/remote-agent-bundle.ts create mode 100644 src/remote/agent-bundle.ts create mode 100644 tests/remote-agent-bundle.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39930f894..83b9f8401 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,8 @@ on: - "tests/**" - "scripts/**" - "gui/**" + - "platform/**" + - "remote-agent/**" - ".gitattributes" - ".npmignore" - "package.json" @@ -26,6 +28,8 @@ on: - "tests/**" - "scripts/**" - "gui/**" + - "platform/**" + - "remote-agent/**" - ".gitattributes" - ".npmignore" - "package.json" @@ -45,6 +49,70 @@ concurrency: cancel-in-progress: true jobs: + remote-agent: + name: Remote Agent ${{ matrix.package }} + runs-on: ${{ matrix.os }} + timeout-minutes: 25 + strategy: + fail-fast: false + matrix: + include: + - package: linux-x64 + os: ubuntu-24.04 + target: x86_64-unknown-linux-musl + executable: opencodex-remote-agent + - package: linux-arm64 + os: ubuntu-24.04-arm + target: aarch64-unknown-linux-musl + executable: opencodex-remote-agent + - package: macos-x64 + os: macos-15-intel + target: x86_64-apple-darwin + executable: opencodex-remote-agent + - package: macos-arm64 + os: macos-15 + target: aarch64-apple-darwin + executable: opencodex-remote-agent + - package: windows-x64 + os: windows-latest + target: x86_64-pc-windows-msvc + executable: opencodex-remote-agent.exe + - package: windows-arm64 + os: windows-11-arm + target: aarch64-pc-windows-msvc + executable: opencodex-remote-agent.exe + steps: + - name: Checkout + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + + - name: Install musl build tools + if: ${{ startsWith(matrix.package, 'linux-') }} + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends musl-tools + + - name: Install pinned Rust target + working-directory: remote-agent + run: rustup target add "${{ matrix.target }}" + + - name: Format + working-directory: remote-agent + run: cargo fmt --check + + - name: Clippy + working-directory: remote-agent + run: cargo clippy --locked --target "${{ matrix.target }}" --all-targets -- -D warnings + + - name: Test + working-directory: remote-agent + run: cargo test --locked --target "${{ matrix.target }}" + + - name: Build release binary + working-directory: remote-agent + run: cargo build --locked --release --target "${{ matrix.target }}" + + - name: Verify release binary exists + shell: bash + run: test -s "remote-agent/target/${{ matrix.target }}/release/${{ matrix.executable }}" + test: name: ${{ matrix.os }} runs-on: ${{ matrix.os }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d9767d931..966004ef5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ on: default: true expected-sha: description: "Immutable release commit this dispatch must publish (fail if the branch moved)" - required: false + required: true type: string permissions: @@ -40,9 +40,78 @@ concurrency: cancel-in-progress: false jobs: + remote-agent-build: + name: Remote Agent ${{ matrix.package }} + runs-on: ${{ matrix.os }} + timeout-minutes: 25 + permissions: + contents: read + strategy: + fail-fast: false + matrix: + include: + - package: linux-x64 + os: ubuntu-24.04 + target: x86_64-unknown-linux-musl + executable: opencodex-remote-agent + - package: linux-arm64 + os: ubuntu-24.04-arm + target: aarch64-unknown-linux-musl + executable: opencodex-remote-agent + - package: macos-x64 + os: macos-15-intel + target: x86_64-apple-darwin + executable: opencodex-remote-agent + - package: macos-arm64 + os: macos-15 + target: aarch64-apple-darwin + executable: opencodex-remote-agent + - package: windows-x64 + os: windows-latest + target: x86_64-pc-windows-msvc + executable: opencodex-remote-agent.exe + - package: windows-arm64 + os: windows-11-arm + target: aarch64-pc-windows-msvc + executable: opencodex-remote-agent.exe + steps: + - name: Checkout + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + + - name: Install musl build tools + if: ${{ startsWith(matrix.package, 'linux-') }} + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends musl-tools + + - name: Install pinned Rust target + working-directory: remote-agent + run: rustup target add "${{ matrix.target }}" + + - name: Build release binary + working-directory: remote-agent + run: cargo build --locked --release --target "${{ matrix.target }}" + + - name: Stage release binary + shell: bash + run: | + mkdir -p remote-agent-artifact + cp "remote-agent/target/${{ matrix.target }}/release/${{ matrix.executable }}" \ + "remote-agent-artifact/${{ matrix.executable }}" + test -s "remote-agent-artifact/${{ matrix.executable }}" + + - name: Upload unsigned build artifact + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: remote-agent-${{ matrix.package }} + path: remote-agent-artifact/${{ matrix.executable }} + if-no-files-found: error + retention-days: 1 + publish: + needs: remote-agent-build runs-on: ubuntu-latest timeout-minutes: 15 + environment: + name: ${{ inputs.dry-run && 'remote-agent-dry-run' || 'remote-agent-release' }} steps: - name: Checkout uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 @@ -54,7 +123,8 @@ jobs: EXPECTED_SHA: ${{ inputs.expected-sha }} run: | if [ -z "$EXPECTED_SHA" ]; then - echo "::warning::no expected-sha supplied; publishing whatever the branch currently points at" + echo "::error::expected-sha is required; refusing to release an unaudited branch tip" + exit 1 elif [ "$GITHUB_SHA" != "$EXPECTED_SHA" ]; then echo "::error::branch moved after the release audit (expected ${EXPECTED_SHA}, got ${GITHUB_SHA}) — refusing to publish an unaudited commit" exit 1 @@ -92,6 +162,12 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile + - name: Download platform Agent artifacts + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: remote-agent-* + path: remote-agent-artifacts + - name: Verify version matches package.json env: RELEASE_VERSION: ${{ inputs.version }} @@ -243,10 +319,51 @@ jobs: fi fi + - name: Assemble and sign Remote Agent bundle + shell: bash + env: + REMOTE_AGENT_SIGNING_KEY: ${{ secrets.REMOTE_AGENT_SIGNING_KEY }} + DRY_RUN: ${{ inputs.dry-run }} + run: | + set -euo pipefail + signing_key="$RUNNER_TEMP/opencodex-remote-agent-signing.pem" + public_key="$RUNNER_TEMP/opencodex-remote-agent-signing.pub.pem" + cleanup() { + if [ -f "$signing_key" ] && command -v shred >/dev/null 2>&1; then + shred -u "$signing_key" + else + rm -f "$signing_key" + fi + } + trap cleanup EXIT + umask 077 + expected_public_key="" + if [ "$DRY_RUN" = "true" ]; then + openssl genpkey -algorithm ED25519 -out "$signing_key" + openssl pkey -in "$signing_key" -pubout -out "$public_key" + expected_public_key="$public_key" + echo "OPENCODEX_REMOTE_AGENT_DRY_RUN_PUBLIC_KEY_FILE=$public_key" >> "$GITHUB_ENV" + else + if [ -z "$REMOTE_AGENT_SIGNING_KEY" ]; then + echo "::error::REMOTE_AGENT_SIGNING_KEY is not configured in the protected release environment" + exit 1 + fi + printf '%s' "$REMOTE_AGENT_SIGNING_KEY" > "$signing_key" + fi + REMOTE_AGENT_SIGNING_KEY_FILE="$signing_key" \ + REMOTE_AGENT_EXPECTED_PUBLIC_KEY_FILE="$expected_public_key" \ + GITHUB_SHA="$GITHUB_SHA" \ + bun scripts/remote-agent-bundle.ts assemble \ + remote-agent-artifacts \ + bin/remote-agent \ + .tmp/remote-agent-release + - name: Publish (or dry-run) env: DRY_RUN: ${{ inputs.dry-run }} NPM_DIST_TAG: ${{ inputs.tag }} + OPENCODEX_REQUIRE_REMOTE_AGENT_BUNDLE: "1" + OPENCODEX_RELEASE_DRY_RUN: ${{ inputs.dry-run }} run: | if [ "$DRY_RUN" = "true" ]; then echo "::notice::DRY RUN — building + packing, not publishing" @@ -452,5 +569,6 @@ jobs: git push origin "refs/tags/${release_tag}" fi - gh release create "$release_tag" --target "$GITHUB_SHA" --title "$release_tag" \ + gh release create "$release_tag" .tmp/remote-agent-release/* \ + --target "$GITHUB_SHA" --title "$release_tag" \ --notes-file "$notes_file" ${prerelease_flag:+$prerelease_flag} diff --git a/docs-site/src/content/docs/guides/web-dashboard.md b/docs-site/src/content/docs/guides/web-dashboard.md index 60e06bc21..188455bf0 100644 --- a/docs-site/src/content/docs/guides/web-dashboard.md +++ b/docs-site/src/content/docs/guides/web-dashboard.md @@ -35,14 +35,14 @@ The **Remote** page makes the local `ocx gui` the start of remote setup: 1. Continue with GitHub. `opencodexpages.me` handles OAuth and asks you to approve the device code. 2. Set a separate Remote password. GitHub OAuth tokens are not stored or sent to the local PC. -3. Choose a one-level `.opencodexpages.me` address. The central worker provisions an isolated - Cloudflare Tunnel and the page follows `pending`, `awaiting agent`, `connecting`, and `online`. -4. Pair the signed local helper. Visiting the assigned hostname later requires both the owning - GitHub account and the Remote password before the Gateway creates a host-only instance session. +3. Choose a unique one-level `.opencodexpages.me` address and a unique name for this computer. +4. Start the signed, unprivileged Agent from the page. It opens one outbound encrypted WSS connection; + no root access, port forwarding, or inbound listener is required. Visiting the assigned hostname + later requires both the owning GitHub account and the Remote password. -This is currently an invite-only Linux MVP. The privileged signed helper installer and Windows/macOS -helpers are not shipped in the npm package yet. The GUI reports that limitation instead of claiming -the Tunnel is online. **Super Sync is not part of this flow.** +This remains an invite-only beta. Release packages carry signature-verified Agent binaries for Linux, +macOS, and Windows on x64 and arm64. Unsupported OS/architecture combinations fail honestly instead of +compiling code on the user's computer. **Super Sync is not part of this flow.** ## What you can do @@ -58,7 +58,7 @@ the Tunnel is online. **Super Sync is not part of this flow.** | **Providers** | Add, edit, enable/disable, and remove providers; manage OAuth account pools and API-key pools where supported. Provider Settings can disable live model discovery for endpoints with missing, slow, or oversized `/models` catalogs. For Claude (Anthropic) OAuth pools, each logged-in account shows its own 5-hour and weekly rate-limit bars (usage is per credential); a failed probe keeps the last-known bars and marks them unavailable until the next successful refresh. | | **Add provider** | Search registry-backed presets for account login, API-key services, local servers, or a custom endpoint. | | **Codex Auth** | Add ChatGPT/Codex pool accounts, select the next-session account, refresh 5h / weekly / 30d quotas, enable or disable quota auto-switch, set its 1–100% threshold, and configure transient-failure failover. | -| **Remote** | Connect this PC to the central GitHub identity service, set a separate access password, reserve its hostname, and follow Tunnel/Agent provisioning. | +| **Remote** | Connect this PC to the central GitHub identity service, set a separate E2EE password, reserve its hostname, and start its signed outbound Agent. | | **Subagents** | Feature up to five bare native or namespaced routed models in the `spawn_agent` override list. | | **Models** | Toggle native GPT and routed models, set provider allowlists and context caps, choose v1/base/v2, and configure the v2 thread limit. Configured providers stay visible as zero-model groups when discovery is off or returns no rows. | | **Logs** | Auto-refresh recent requests with tokens, requested effort and (when available) effective outbound effort, resolved model, provider, status, request id, duration, and error details. The detail view includes the exact reasoning wire field when the adapter emits one. Filter by opaque conversation/session id (when the client sends one) to total tokens and estimated list-price cost for the currently loaded Logs ring. | @@ -138,7 +138,7 @@ The GUI is a thin client over the proxy's JSON management API. Useful endpoints | --- | --- | | `GET` / `PUT /api/settings` | Read settings or toggle Codex autostart. | | `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | Read local Remote state, start device approval, and set the separate access password without exposing device or GitHub tokens to the browser. | -| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Reserve the instance hostname, prepare one-time Agent pairing, or revoke this PC. | +| `POST /api/remote/activate` · `POST /api/remote/agent/start` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Reserve the workspace/computer names, start the packaged Agent, use the legacy pairing path, or revoke this PC. | | `GET /api/startup-health` | Read secret-free routing, service, shim, and restart-safety diagnostics. | | `POST /api/startup-action` | Install the background service or Codex launcher shim through fixed, allowlisted actions. | | `GET` / `POST /api/windows-tray` | Read or change the Windows tray installation and visible-process state. POST accepts `install`, `start`, `stop`, or `uninstall`. | diff --git a/docs-site/src/content/docs/ja/guides/web-dashboard.md b/docs-site/src/content/docs/ja/guides/web-dashboard.md index 423f426b2..2a57cf50f 100644 --- a/docs-site/src/content/docs/ja/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ja/guides/web-dashboard.md @@ -27,10 +27,10 @@ bun run dev:gui 1. GitHub で続行します。`opencodexpages.me` が OAuth を処理し、デバイスコードの承認を求めます。 2. GitHub パスワードとは別の Remote パスワードを設定します。GitHub OAuth トークンは保存せず、ローカル PC にも送りません。 -3. 1 階層の `<名前>.opencodexpages.me` を選びます。中央 worker が分離された Cloudflare Tunnel を作成し、GUI が `pending` から `online` まで追跡します。 -4. 署名済みローカルヘルパーをペアリングします。割り当て済みアドレスへアクセスする際は、所有者の GitHub アカウントと Remote パスワードを確認してから hostname 専用 session を作ります。 +3. 重複しない 1 階層の `<名前>.opencodexpages.me` と、この PC 固有の名前を選びます。 +4. ページから署名済み非特権 Agent を起動します。Agent は暗号化 outbound WSS 接続を 1 本だけ開くため、root、ポート転送、inbound listener は不要です。割り当て済みアドレスでは所有者の GitHub アカウントと Remote パスワードを確認します。 -現在は招待制 Linux MVP です。管理者権限が必要な署名済み helper installer と Windows/macOS helper は npm パッケージにまだ含まれません。GUI はこの制限を隠しません。**Super Sync はこのフローに含まれません。** +現在は招待制プライベートベータです。release package には Linux、macOS、Windows の x64・arm64 用署名検証済み Agent が含まれます。未対応 OS/architecture ではユーザー PC 上でコンパイルせず明確に停止します。**Super Sync はこのフローに含まれません。** ## できること @@ -46,7 +46,7 @@ bun run dev:gui | **プロバイダー** | プロバイダーを追加、編集、有効化/無効化、削除し、対応する OAuth アカウントプールと API キープールを管理します。Claude(Anthropic)OAuth プールでは、ログイン済みの各アカウントに独自の 5 時間・週間レート制限バーが表示され(利用量は資格情報単位)、取得失敗時は直近の値を保持して一時利用不可と表示します。 | | **プロバイダー追加** | レジストリベースのプリセットからアカウントログイン、API キーサービス、ローカルサーバー、custom エンドポイントを検索します。 | | **Codex 認証** | ChatGPT/Codex プールアカウントを追加し、次回セッションアカウントを選び、5 時間 / 週間 / 30 日クォータを更新し、クォータ自動切り替えのオン/オフと 1~100% のしきい値、一時的失敗フェイルオーバーを設定します。 | -| **Remote** | この PC を中央 GitHub ID サービスへ接続し、別のアクセスパスワードと hostname を設定して Tunnel/Agent 状態を追跡します。 | +| **Remote** | この PC を中央 GitHub ID サービスへ接続し、別の E2EE パスワードと hostname を設定して署名済み outbound Agent を起動します。 | | **サブエージェント** | `spawn_agent` オーバーライド一覧にネイティブまたはルーティングモデルを最大 5 つまで優先公開します。 | | **モデル** | ネイティブ GPT とルーティングモデルをオン/オフし、プロバイダー許可リストとコンテキスト上限、v1/base/v2、v2 スレッド数を設定します。 | | **ログ** | トークン、要求された強度と(利用可能な場合は)実際に送信された強度、実際のモデル、プロバイダー、状態、リクエスト ID、所要時間、エラー詳細を含む最近のリクエストを自動更新します。アダプターが reasoning パラメーターを送信した場合、詳細表示に正確な wire field も表示されます。 | @@ -111,7 +111,7 @@ GUI はプロキシの JSON 管理 API を使うシンクライアントです --- | --- | | `GET` / `PUT /api/settings` | 設定を読むか Codex 自動起動をオン/オフします。 | | `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | デバイス/GitHub トークンをブラウザへ公開せず、Remote 状態、デバイス承認、アクセスパスワードを管理します。 | -| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | hostname の予約、一回限りの Agent ペアリング、またはこの PC の失効を行います。 | +| `POST /api/remote/activate` · `POST /api/remote/agent/start` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | workspace/PC 名の予約、同梱 Agent の起動、従来のペアリング経路、またはこの PC の失効を行います。 | | `GET /api/startup-health` | 秘密情報を含まないルーティング、サービス、shim、再起動安全性診断を読み取ります。 | | `GET` / `POST /api/windows-tray` | Windows トレイの導入・表示状態を読み取り、`install`、`start`、`stop`、`uninstall` を実行します。 | | `POST /api/sync` | 共有モデルカタログを再構築し Codex モデルキャッシュを古い状態としてマークします。 | diff --git a/docs-site/src/content/docs/ja/reference/cli.md b/docs-site/src/content/docs/ja/reference/cli.md index c6239cab2..3d6a3d7a4 100644 --- a/docs-site/src/content/docs/ja/reference/cli.md +++ b/docs-site/src/content/docs/ja/reference/cli.md @@ -342,8 +342,8 @@ ocx login xai ### `ocx remote <サブコマンド>` ダッシュボードの **Remote** ページに対応する headless コマンドです。`status`、`link`、 -`activate --name <名前> --slug `、`pairing-code`、`disconnect --yes` を同じ local -management API で実行します。別の Remote パスワードは process argument や shell history +`activate --name <名前> --slug ` で hostname を予約して署名済み同梱 Agent を起動し、 +`pairing-code` は従来の 10 分ペアリング経路、`disconnect --yes` は解除を同じ local management API で実行します。別の Remote パスワードは process argument や shell history に残らないよう stdin から渡します。 ```bash diff --git a/docs-site/src/content/docs/ko/guides/web-dashboard.md b/docs-site/src/content/docs/ko/guides/web-dashboard.md index 1f59b55b8..43ef6e422 100644 --- a/docs-site/src/content/docs/ko/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ko/guides/web-dashboard.md @@ -27,10 +27,10 @@ bun run dev:gui 1. GitHub로 계속합니다. `opencodexpages.me`가 OAuth를 처리하고 장치 코드를 승인받습니다. 2. GitHub 비밀번호와 별개의 Remote 비밀번호를 만듭니다. GitHub OAuth 토큰은 저장하거나 로컬 PC로 보내지 않습니다. -3. 한 단계 `<이름>.opencodexpages.me` 주소를 고릅니다. 중앙 worker가 격리된 Cloudflare Tunnel을 만들고 GUI가 `pending`부터 `online`까지 상태를 추적합니다. -4. 서명된 로컬 헬퍼를 페어링합니다. 이후 주소에 접속할 때는 소유 GitHub 계정과 Remote 비밀번호를 모두 확인한 뒤 hostname 전용 세션을 만듭니다. +3. 중복되지 않는 한 단계 `<이름>.opencodexpages.me` 주소와 이 컴퓨터의 고유 이름을 고릅니다. +4. 페이지에서 서명된 비특권 Agent를 시작합니다. Agent는 암호화된 outbound WSS 연결 하나만 열기 때문에 root, 포트포워딩, inbound listener가 필요 없습니다. 이후 주소에 접속할 때는 소유 GitHub 계정과 Remote 비밀번호를 모두 확인합니다. -현재는 초대형 Linux MVP입니다. 관리자 권한이 필요한 서명된 헬퍼 installer와 Windows/macOS 헬퍼는 npm 패키지에 아직 포함되지 않습니다. GUI는 이 제한을 숨기지 않습니다. **Super Sync는 이 흐름의 범위가 아닙니다.** +현재는 초대형 비공개 베타입니다. 릴리스 패키지는 Linux, macOS, Windows의 x64·arm64용 서명 검증 Agent를 동봉합니다. 지원하지 않는 OS/아키텍처에서는 사용자 PC에서 임의 컴파일하지 않고 명확히 중단합니다. **Super Sync는 이 흐름의 범위가 아닙니다.** ## 할 수 있는 일 @@ -46,7 +46,7 @@ bun run dev:gui | **Providers** | 프로바이더를 추가, 편집, 활성화/비활성화, 제거하고, 지원되는 OAuth 계정 풀과 API key 풀을 관리합니다. Claude(Anthropic) OAuth 풀에서는 로그인한 계정마다 자체 5시간·주간 한도 막대가 표시되며(사용량은 자격 증명 단위), 조회 실패 시 마지막 값을 유지하고 일시 불가 상태로 표시합니다. | | **Add provider** | 레지스트리 기반 프리셋에서 계정 로그인, API key 서비스, 로컬 서버, custom endpoint를 검색합니다. | | **Codex Auth** | ChatGPT/Codex 풀 계정을 추가하고, 다음 세션 계정을 선택하고, 5시간 / 주간 / 30일 할당량을 갱신하며, 할당량 자동 전환을 켜거나 끄고 1~100% 임계값과 일시적 실패 failover를 설정합니다. | -| **Remote** | 이 PC를 중앙 GitHub 신원 서비스에 연결하고, 별도 접속 비밀번호와 hostname을 설정하고, Tunnel/Agent 상태를 확인합니다. | +| **Remote** | 이 PC를 중앙 GitHub 신원 서비스에 연결하고, 별도 E2EE 비밀번호와 hostname을 설정한 뒤 서명된 outbound Agent를 시작합니다. | | **Subagents** | `spawn_agent` override 목록에 네이티브 또는 라우팅 모델을 최대 5개까지 우선 노출합니다. | | **Models** | 네이티브 GPT와 라우팅 모델을 켜고 끄고, 프로바이더 allowlist와 컨텍스트 상한, v1/base/v2, v2 thread 수를 설정합니다. | | **Logs** | 토큰, 요청한 강도와 (사용 가능한 경우) 실제 전송 강도, 실제 모델, 프로바이더, 상태, 요청 id, 소요 시간, 오류 상세가 포함된 최근 요청을 자동 갱신합니다. 어댑터가 reasoning 매개변수를 전송한 경우 상세 보기에 정확한 wire field도 표시됩니다. 클라이언트가 보낸 불투명 대화/세션 id로 필터하면 현재 로드된 Logs 링의 토큰·추정 정가 합계를 볼 수 있습니다. | @@ -113,7 +113,7 @@ GUI는 프록시의 JSON 관리 API를 사용하는 얇은 클라이언트입니 | --- | --- | | `GET` / `PUT /api/settings` | 설정을 읽거나 Codex 자동 시작을 켜고 끕니다. | | `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | 브라우저에 장치/GitHub 토큰을 노출하지 않고 로컬 Remote 상태를 읽고 장치 승인과 접속 비밀번호를 설정합니다. | -| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | hostname을 예약하고 일회용 Agent 페어링을 준비하거나 이 PC 연결을 해제합니다. | +| `POST /api/remote/activate` · `POST /api/remote/agent/start` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | workspace/컴퓨터 이름을 예약하고 동봉 Agent를 시작하며, 기존 페어링 경로를 사용하거나 이 PC 연결을 해제합니다. | | `GET /api/startup-health` | 비밀값 없이 라우팅, 서비스, shim, 재부팅 안전성 진단을 읽습니다. | | `GET` / `POST /api/windows-tray` | Windows 트레이 설치 및 표시 상태를 읽거나 `install`, `start`, `stop`, `uninstall` 작업을 수행합니다. | | `POST /api/sync` | 공유 모델 카탈로그를 다시 만들고 Codex 모델 캐시를 오래된 상태로 표시합니다. | diff --git a/docs-site/src/content/docs/ko/reference/cli.md b/docs-site/src/content/docs/ko/reference/cli.md index d9d68ac2d..9e0de7826 100644 --- a/docs-site/src/content/docs/ko/reference/cli.md +++ b/docs-site/src/content/docs/ko/reference/cli.md @@ -391,7 +391,7 @@ ocx login xai 대시보드 **Remote** 페이지의 headless 대응 명령입니다. `status`는 보호된 로컬 상태를 읽고, `link`는 GitHub 장치 승인을 시작하고, `activate --name <이름> --slug `는 hostname을 -예약하고, `pairing-code`는 10분 Agent 코드를 만들며, `disconnect --yes`는 이 PC를 해제합니다. +예약한 뒤 서명된 동봉 Agent를 시작하고, `pairing-code`는 기존 10분 페어링 경로를 유지하며, `disconnect --yes`는 이 PC를 해제합니다. 별도 비밀번호는 process argument나 shell history에 남지 않도록 stdin으로 전달합니다. ```bash diff --git a/docs-site/src/content/docs/reference/cli.md b/docs-site/src/content/docs/reference/cli.md index bf260a42f..4b2df36f3 100644 --- a/docs-site/src/content/docs/reference/cli.md +++ b/docs-site/src/content/docs/reference/cli.md @@ -453,8 +453,8 @@ Remove the stored OAuth credential for a provider. ### `ocx remote ` Headless parity for the dashboard **Remote** page. `status` reads protected local state, `link` starts -GitHub device approval, `activate --name --slug ` reserves the hostname, -`pairing-code` creates a ten-minute Agent code, and `disconnect --yes` revokes this PC. Set the +GitHub device approval, `activate --name --slug ` reserves the hostname and starts the +signed packaged Agent, `pairing-code` keeps the legacy ten-minute pairing path, and `disconnect --yes` revokes this PC. Set the separate password through stdin so it never appears in process arguments or shell history: ```bash diff --git a/docs-site/src/content/docs/ru/guides/web-dashboard.md b/docs-site/src/content/docs/ru/guides/web-dashboard.md index e35a7b05e..cda901463 100644 --- a/docs-site/src/content/docs/ru/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ru/guides/web-dashboard.md @@ -27,10 +27,10 @@ bun run dev:gui 1. Продолжите через GitHub. `opencodexpages.me` обрабатывает OAuth и просит подтвердить код устройства. 2. Задайте отдельный пароль Remote. OAuth-токены GitHub не сохраняются и не передаются на локальный ПК. -3. Выберите одноуровневый адрес `<имя>.opencodexpages.me`. Центральный worker создаёт изолированный Cloudflare Tunnel, а GUI отслеживает состояния от `pending` до `online`. -4. Свяжите подписанный локальный помощник. Позже перед созданием session только для этого hostname проверяются и аккаунт-владелец GitHub, и пароль Remote. +3. Выберите уникальный одноуровневый адрес `<имя>.opencodexpages.me` и уникальное имя компьютера. +4. Запустите со страницы подписанный непривилегированный Agent. Он открывает одно исходящее зашифрованное WSS-соединение без root, перенаправления портов и входящего listener. При входе по адресу проверяются аккаунт-владелец GitHub и пароль Remote. -Сейчас это пригласительный Linux MVP. Подписанный helper installer с правами администратора и помощники для Windows/macOS ещё не входят в npm-пакет; GUI явно показывает это ограничение. **Super Sync в этот поток не входит.** +Это всё ещё закрытая бета по приглашениям. Release-пакет содержит проверяемые по подписи Agent для Linux, macOS и Windows на x64 и arm64. На неподдерживаемой ОС/архитектуре OCX останавливается явно и не компилирует код на ПК пользователя. **Super Sync в этот поток не входит.** ## Возможности @@ -46,7 +46,7 @@ bun run dev:gui | **Providers** | Добавление, редактирование, включение/отключение и удаление провайдеров; управление пулами OAuth-аккаунтов и пулами API-ключей там, где они поддерживаются. Для пулов Claude (Anthropic) OAuth у каждого вошедшего аккаунта свои полосы 5-часового и недельного лимита (использование по учётным данным); при сбое опроса сохраняются последние известные значения с пометкой недоступности. | | **Add provider** | Поиск по пресетам из реестра: вход по аккаунту, сервисы с API-ключом, локальные серверы или пользовательская конечная точка. | | **Codex Auth** | Добавление аккаунтов пула ChatGPT/Codex, выбор аккаунта для следующей сессии, обновление квот 5 ч / недельных / 30-дневных, включение или отключение автопереключения, настройка его порога 1–100% и failover при временных сбоях. | -| **Remote** | Подключение ПК к центральной идентификации GitHub, отдельный пароль доступа и hostname, а также состояния Tunnel/Agent. | +| **Remote** | Подключение ПК к центральной идентификации GitHub, отдельный E2EE-пароль и hostname, затем запуск подписанного outbound Agent. | | **Subagents** | Выделение до пяти «голых» нативных или маршрутизируемых моделей с пространством имён в списке переопределений `spawn_agent`. | | **Models** | Включение и отключение нативных GPT и маршрутизируемых моделей, настройка списков разрешённых провайдеров и лимитов контекста, выбор v1/base/v2 и настройка лимита потоков v2. | | **Logs** | Автообновляемый список недавних запросов: токены, запрошенный и, когда доступен, фактически отправленный уровень рассуждений, фактическая модель, провайдер, статус, id запроса, длительность и подробности ошибок. Если адаптер отправляет параметр рассуждений, в подробностях также отображается точное wire-поле. Можно фильтровать по непрозрачному id диалога/сессии (если клиент его передаёт) и суммировать токены и оценочную стоимость по прайс-листу в пределах загруженного кольца Logs. | @@ -117,7 +117,7 @@ GUI — это тонкий клиент поверх JSON-API управлен | --- | --- | | `GET` / `PUT /api/settings` | Чтение настроек или переключение автозапуска Codex. | | `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | Чтение состояния Remote, подтверждение устройства и настройка пароля без выдачи браузеру токенов устройства/GitHub. | -| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Резервирование hostname, одноразовое сопряжение Agent или отзыв этого ПК. | +| `POST /api/remote/activate` · `POST /api/remote/agent/start` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Резервирование workspace/имени ПК, запуск встроенного Agent, прежний путь сопряжения или отзыв этого ПК. | | `GET /api/startup-health` | Чтение безопасной диагностики маршрутизации, службы, shim и устойчивости к перезагрузке. | | `GET` / `POST /api/windows-tray` | Чтение или изменение установки и видимости трея Windows; POST поддерживает `install`, `start`, `stop`, `uninstall`. | | `POST /api/sync` | Пересборка общего каталога моделей и инвалидация кэша моделей Codex. | diff --git a/docs-site/src/content/docs/ru/reference/cli.md b/docs-site/src/content/docs/ru/reference/cli.md index c3c431a04..d3f53d3c6 100644 --- a/docs-site/src/content/docs/ru/reference/cli.md +++ b/docs-site/src/content/docs/ru/reference/cli.md @@ -384,8 +384,8 @@ ocx login xai ### `ocx remote <подкоманда>` Headless-эквивалент страницы **Remote**: `status` читает защищённое локальное состояние, `link` -запускает подтверждение GitHub, `activate --name <имя> --slug ` резервирует hostname, -`pairing-code` создаёт код Agent на 10 минут, а `disconnect --yes` отзывает этот ПК. Отдельный +запускает подтверждение GitHub, `activate --name <имя> --slug ` резервирует hostname и запускает +встроенный подписанный Agent, `pairing-code` сохраняет прежний 10-минутный путь, а `disconnect --yes` отзывает этот ПК. Отдельный пароль передаётся через stdin, чтобы не попадать в аргументы процесса и историю shell. ```bash diff --git a/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md b/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md index bd23c4c9b..d9f20effa 100644 --- a/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md +++ b/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md @@ -26,10 +26,10 @@ bun run dev:gui 1. 使用 GitHub 继续。`opencodexpages.me` 处理 OAuth 并要求确认设备码。 2. 设置独立的 Remote 密码。GitHub OAuth token 不会保存,也不会发送到本地电脑。 -3. 选择一级 `<名称>.opencodexpages.me` 地址;中央 worker 创建隔离的 Cloudflare Tunnel,GUI 跟踪从 `pending` 到 `online` 的状态。 -4. 配对已签名的本地助手。以后访问该地址时,必须同时验证所属 GitHub 账号和 Remote 密码,Gateway 才会创建仅限该 hostname 的 session。 +3. 选择不重复的一级 `<名称>.opencodexpages.me` 地址和此电脑的唯一名称。 +4. 从页面启动已签名的非特权 Agent。它只建立一条加密出站 WSS 连接,无需 root、端口转发或入站 listener。以后访问该地址时,必须同时验证所属 GitHub 账号和 Remote 密码。 -目前这是仅限邀请的 Linux MVP。需要管理员权限的签名助手 installer 及 Windows/macOS 助手尚未随 npm 包提供;GUI 会如实显示这一限制。**Super Sync 不属于此流程。** +目前仍是仅限邀请的私测。Release 包包含 Linux、macOS、Windows 的 x64 和 arm64 签名验证 Agent。对不支持的操作系统/架构,OCX 会明确停止,不在用户电脑上临时编译。**Super Sync 不属于此流程。** ## 可以完成哪些操作 @@ -45,7 +45,7 @@ bun run dev:gui | **Providers** | 添加、编辑、启用/禁用、删除 provider,并在支持时管理 OAuth 账号池和 API key 池。Claude(Anthropic)OAuth 池中,每个已登录账号显示各自的 5 小时与周限额条(用量按凭证计);探测失败时保留上次已知数值并标记为暂时不可用。 | | **Add provider** | 搜索 registry preset,选择账号登录、API key 服务、本地服务器或自定义 endpoint。 | | **Codex Auth** | 添加 ChatGPT/Codex 池账号,选择下一 session 的账号,刷新 5h / 每周 / 30d 配额,启用或停用配额自动切换,设置其 1–100% 阈值和临时故障 failover。 | -| **Remote** | 将此电脑连接到中央 GitHub 身份服务,设置独立访问密码和 hostname,并跟踪 Tunnel/Agent 状态。 | +| **Remote** | 将此电脑连接到中央 GitHub 身份服务,设置独立 E2EE 密码和 hostname,然后启动已签名的 outbound Agent。 | | **Subagents** | 在 `spawn_agent` override 列表中置顶最多五个原生或路由模型。 | | **Models** | 开关原生 GPT 与路由模型,配置 provider allowlist、上下文上限、v1/base/v2 以及 v2 thread 数量。 | | **Logs** | 自动刷新近期请求,显示 token、请求强度以及(可用时)实际发送强度、实际模型、provider、状态、request id、耗时和错误详情。适配器发送 reasoning 参数时,详情中还会显示准确的 wire field。可按不透明会话/对话 ID(客户端提供时)筛选,并对当前已加载的 Logs 环形缓冲合计 token 与估算标价成本。 | @@ -105,7 +105,7 @@ GUI 是代理 JSON 管理 API 之上的轻量客户端。常用 endpoint 包括 | --- | --- | | `GET` / `PUT /api/settings` | 读取设置或切换 Codex 自动启动。 | | `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | 在不向浏览器暴露设备/GitHub token 的情况下读取 Remote 状态、开始设备批准并设置访问密码。 | -| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | 保留 hostname、准备一次性 Agent 配对或撤销此电脑。 | +| `POST /api/remote/activate` · `POST /api/remote/agent/start` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | 保留 workspace/电脑名称、启动随包 Agent、使用旧配对路径或撤销此电脑。 | | `GET /api/startup-health` | 读取不含秘密信息的路由、服务、shim 和重启安全诊断。 | | `GET` / `POST /api/windows-tray` | 读取或更改 Windows 托盘安装和显示状态;POST 支持 `install`、`start`、`stop`、`uninstall`。 | | `POST /api/sync` | 重建共享模型目录,并把 Codex 模型缓存标记为过期。 | diff --git a/docs-site/src/content/docs/zh-cn/reference/cli.md b/docs-site/src/content/docs/zh-cn/reference/cli.md index d1543a932..210e6fdbd 100644 --- a/docs-site/src/content/docs/zh-cn/reference/cli.md +++ b/docs-site/src/content/docs/zh-cn/reference/cli.md @@ -336,8 +336,8 @@ ocx login xai ### `ocx remote <子命令>` 这是仪表盘 **Remote** 页面的 headless 对应命令。`status` 读取受保护的本地状态,`link` 开始 -GitHub 设备批准,`activate --name <名称> --slug ` 保留 hostname,`pairing-code` 创建 -10 分钟 Agent 配对码,`disconnect --yes` 撤销此电脑。独立 Remote 密码从 stdin 读取,避免 +GitHub 设备批准,`activate --name <名称> --slug ` 保留 hostname 并启动随包签名 Agent, +`pairing-code` 保留旧的 10 分钟配对路径,`disconnect --yes` 撤销此电脑。独立 Remote 密码从 stdin 读取,避免 进入进程参数或 shell 历史。 ```bash diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index b0599c883..60ed7edec 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -26,12 +26,12 @@ export const de: Record = { "common.loading": "Lädt…", "common.retry": "Wiederholen", "remote.title": "Remote", - "remote.subtitle": "Dieses OpenCodex mit deinem Konto verbinden und die lokale GUI über einen privaten Cloudflare Tunnel erreichen.", + "remote.subtitle": "Dieses OpenCodex mit deinem Konto verbinden und seine Terminals über eine verschlüsselte ausgehende Relay-Verbindung nutzen.", "remote.refresh": "Remote-Status aktualisieren", "remote.progressLabel": "Remote-Einrichtung", "remote.stepAccount": "GitHub-Konto", "remote.stepPassword": "Zugriffspasswort", - "remote.stepTunnel": "Tunnel", + "remote.stepTunnel": "Computerverbindung", "remote.loading": "Remote-Status wird geladen…", "remote.loadFailed": "Remote-Status konnte nicht geladen werden.", "remote.signedOutTitle": "Diesen Computer verbinden", @@ -43,7 +43,7 @@ export const de: Record = { "remote.deviceTitle": "Eigener Nachweis pro Gerät", "remote.deviceBody": "Dieses OCX erstellt einen eigenen Geräteschlüssel und kann einzeln widerrufen werden.", "remote.tunnelTitle": "Kein eingehender Port", - "remote.tunnelBody": "Remote-Verkehr läuft durch Cloudflare Tunnel, ohne dein Heim- oder Büronetz offenzulegen.", + "remote.tunnelBody": "Der Agent öffnet nur eine ausgehende verschlüsselte Verbindung; dein Heim- oder Büronetz bleibt verborgen.", "remote.startFailed": "GitHub-Anmeldung konnte nicht gestartet werden.", "remote.cancelFailed": "Geräteanmeldung konnte nicht abgebrochen werden.", "remote.pendingTitle": "Diesen Computer im Browser bestätigen", @@ -66,7 +66,7 @@ export const de: Record = { "remote.privateBetaTitle": "Privater Beta-Zugang erforderlich", "remote.privateBetaBody": "Das Konto ist verbunden, aber Remote kann auf diesem Server nur mit Einladung aktiviert werden.", "remote.domainTitle": "Adresse dieses Computers wählen", - "remote.domainBody": "OpenCodex erstellt den privaten Tunnel und reserviert eine opencodexpages.me-Adresse für diesen PC.", + "remote.domainBody": "OpenCodex reserviert eine eindeutige opencodexpages.me-Adresse für dein Konto und diesen Computer.", "remote.deviceNameLabel": "Computername", "remote.deviceNamePlaceholder": "Heim-PC", "remote.domainLabel": "Remote-Adresse", @@ -75,17 +75,17 @@ export const de: Record = { "remote.activateFailed": "Remote konnte für diesen Computer nicht aktiviert werden.", "remote.activating": "Adresse wird reserviert…", "remote.activate": "Remote aktivieren", - "remote.provisioningTitle": "Privater Tunnel wird erstellt", - "remote.provisioningBody": "Der zentrale Dienst reserviert die Adresse und erstellt isolierte Cloudflare-Ressourcen.", + "remote.provisioningTitle": "Sichere Adresse wird vorbereitet", + "remote.provisioningBody": "Der zentrale Dienst reserviert die Adresse und bereitet den verschlüsselten Relay-Zugang vor.", "remote.connectorTitle": "Lokalen Helfer verbinden", - "remote.connectorBody": "Die Adresse ist bereit. Jetzt den signierten Linux-Helfer koppeln.", + "remote.connectorBody": "Die Adresse ist bereit. Starte den signierten, unprivilegierten Agent mit einer ausgehenden verschlüsselten Relay-Verbindung.", "remote.pairingCode": "Einmaliger Kopplungscode", "remote.pairingFailed": "Connector-Kopplung konnte nicht vorbereitet werden.", "remote.preparingConnector": "Wird vorbereitet…", "remote.prepareConnector": "Connector vorbereiten", - "remote.connectorRequirement": "Das private MVP benötigt den signierten Linux-Helfer mit Administratorfreigabe. Windows und macOS werden noch nicht ausgeliefert.", + "remote.connectorRequirement": "Der Connector läuft als aktueller Benutzer ohne root oder Portweiterleitung. OCX muss die signierte Binärdatei für diese Plattform enthalten.", "remote.connectingTitle": "Computer wird verbunden", - "remote.connectingBody": "Der Helfer ist gekoppelt. OpenCodex-, Agent-, Tunnel- und Gateway-Prüfungen laufen.", + "remote.connectingBody": "Der Agent ist gestartet. OpenCodex-, Agent-, Relay- und Gateway-Prüfungen laufen.", "remote.readyTitle": "Remote ist online", "remote.readyBody": "Die lokale OpenCodex-GUI ist über die authentifizierte Adresse erreichbar.", "remote.openRemote": "Remote-GUI öffnen", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 1d2afc9fd..7022f0758 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -28,12 +28,12 @@ export const ja: Record = { "common.loading": "読み込み中…", "common.retry": "再試行", "remote.title": "リモート", - "remote.subtitle": "この OpenCodex をアカウントに接続し、ローカル GUI へ非公開 Cloudflare Tunnel 経由でアクセスします。", + "remote.subtitle": "この OpenCodex をアカウントに接続し、暗号化された outbound relay 経由で端末を利用します。", "remote.refresh": "リモート状態を更新", "remote.progressLabel": "リモート設定の進行状況", "remote.stepAccount": "GitHub アカウント", "remote.stepPassword": "アクセスパスワード", - "remote.stepTunnel": "トンネル", + "remote.stepTunnel": "コンピューター接続", "remote.loading": "リモート状態を読み込み中…", "remote.loadFailed": "リモート状態を読み込めませんでした。", "remote.signedOutTitle": "このコンピューターを接続", @@ -45,7 +45,7 @@ export const ja: Record = { "remote.deviceTitle": "デバイスごとの資格情報", "remote.deviceBody": "この OCX は固有のデバイスキーを作成し、他の PC に影響せず個別に解除できます。", "remote.tunnelTitle": "受信ポート不要", - "remote.tunnelBody": "自宅や社内ネットワークを公開せず、Cloudflare Tunnel でリモート通信を受けます。", + "remote.tunnelBody": "Agent は暗号化された outbound 接続を 1 本だけ開き、自宅や社内ネットワークを公開しません。", "remote.startFailed": "GitHub ログインを開始できませんでした。", "remote.cancelFailed": "デバイスログインをキャンセルできませんでした。", "remote.pendingTitle": "ブラウザーでこの PC を承認してください", @@ -68,7 +68,7 @@ export const ja: Record = { "remote.privateBetaTitle": "プライベートベータの承認が必要です", "remote.privateBetaBody": "アカウントは接続済みですが、このサーバーでは招待されたアカウントのみ Remote を有効化できます。", "remote.domainTitle": "このコンピューターのアドレスを選択", - "remote.domainBody": "OpenCodex が専用のプライベート Tunnel と opencodexpages.me アドレスを作成します。", + "remote.domainBody": "OpenCodex がアカウントとこの PC 用の一意な opencodexpages.me アドレスを予約します。", "remote.deviceNameLabel": "コンピューター名", "remote.deviceNamePlaceholder": "自宅 PC", "remote.domainLabel": "Remote アドレス", @@ -77,17 +77,17 @@ export const ja: Record = { "remote.activateFailed": "このコンピューターの Remote を有効化できませんでした。", "remote.activating": "アドレスを予約中…", "remote.activate": "Remote を有効化", - "remote.provisioningTitle": "プライベート Tunnel を作成中", - "remote.provisioningBody": "中央サービスがアドレスと専用 Cloudflare リソースを作成しています。", + "remote.provisioningTitle": "安全なアドレスを準備中", + "remote.provisioningBody": "中央サービスがアドレスを予約し、暗号化 relay アクセスを準備しています。", "remote.connectorTitle": "ローカルヘルパーを接続", - "remote.connectorBody": "アドレスの準備ができました。署名済み Linux ヘルパーをペアリングしてください。", + "remote.connectorBody": "アドレスの準備ができました。暗号化 outbound relay を維持する署名済み非特権 Agent を起動します。", "remote.pairingCode": "一回限りのペアリングコード", "remote.pairingFailed": "コネクターのペアリングを準備できませんでした。", "remote.preparingConnector": "準備中…", "remote.prepareConnector": "コネクターを準備", - "remote.connectorRequirement": "現在のプライベート MVP は管理者承認で Linux ヘルパーをインストールする必要があります。Windows/macOS 版は未提供です。", + "remote.connectorRequirement": "コネクターは現在のユーザー権限で動作し、root やポート転送は不要です。このプラットフォーム用の署名済み binary が OCX に同梱されている必要があります。", "remote.connectingTitle": "このコンピューターを接続中", - "remote.connectingBody": "ヘルパーはペアリング済みです。OCX、Agent、Tunnel、Gateway の確認を待っています。", + "remote.connectingBody": "Agent を起動しました。OCX、Agent、Relay、Gateway の確認を待っています。", "remote.readyTitle": "Remote はオンラインです", "remote.readyBody": "認証済みアドレスからローカル OpenCodex GUI にアクセスできます。", "remote.openRemote": "Remote GUI を開く", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index cbc970b3e..50bbb7b9a 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -28,12 +28,12 @@ export const ru: Record = { "common.loading": "Загрузка…", "common.retry": "Повторить", "remote.title": "Удалённый доступ", - "remote.subtitle": "Подключите этот OpenCodex к аккаунту и открывайте локальный GUI через приватный Cloudflare Tunnel.", + "remote.subtitle": "Подключите этот OpenCodex к аккаунту и работайте с терминалами через зашифрованный исходящий relay.", "remote.refresh": "Обновить состояние Remote", "remote.progressLabel": "Настройка удалённого доступа", "remote.stepAccount": "Аккаунт GitHub", "remote.stepPassword": "Пароль доступа", - "remote.stepTunnel": "Туннель", + "remote.stepTunnel": "Подключение ПК", "remote.loading": "Загрузка состояния Remote…", "remote.loadFailed": "Не удалось загрузить состояние Remote.", "remote.signedOutTitle": "Подключить этот компьютер", @@ -45,7 +45,7 @@ export const ru: Record = { "remote.deviceTitle": "Отдельные данные для устройства", "remote.deviceBody": "Этот OCX создаёт собственный ключ устройства, который можно отозвать отдельно.", "remote.tunnelTitle": "Без входящего порта", - "remote.tunnelBody": "Трафик идёт через Cloudflare Tunnel без публикации домашней или офисной сети.", + "remote.tunnelBody": "Agent открывает только одно исходящее зашифрованное соединение, не публикуя домашнюю или офисную сеть.", "remote.startFailed": "Не удалось начать вход через GitHub.", "remote.cancelFailed": "Не удалось отменить вход устройства.", "remote.pendingTitle": "Подтвердите компьютер в браузере", @@ -68,7 +68,7 @@ export const ru: Record = { "remote.privateBetaTitle": "Нужен доступ к закрытой бете", "remote.privateBetaBody": "Аккаунт подключен, но активация Remote на этом сервере доступна только по приглашению.", "remote.domainTitle": "Выберите адрес компьютера", - "remote.domainBody": "OpenCodex создаст приватный Tunnel и зарезервирует адрес opencodexpages.me для этого ПК.", + "remote.domainBody": "OpenCodex зарезервирует уникальный адрес opencodexpages.me для аккаунта и этого ПК.", "remote.deviceNameLabel": "Имя компьютера", "remote.deviceNamePlaceholder": "Домашний ПК", "remote.domainLabel": "Remote-адрес", @@ -77,17 +77,17 @@ export const ru: Record = { "remote.activateFailed": "Не удалось активировать Remote для этого компьютера.", "remote.activating": "Резервирование адреса…", "remote.activate": "Включить Remote", - "remote.provisioningTitle": "Создание приватного Tunnel", - "remote.provisioningBody": "Центральный сервис резервирует адрес и создаёт изолированные ресурсы Cloudflare.", + "remote.provisioningTitle": "Подготовка защищённого адреса", + "remote.provisioningBody": "Центральный сервис резервирует адрес и готовит доступ к зашифрованному relay.", "remote.connectorTitle": "Подключите локальный помощник", - "remote.connectorBody": "Адрес готов. Выполните сопряжение подписанного Linux-помощника.", + "remote.connectorBody": "Адрес готов. Запустите подписанный непривилегированный Agent с исходящим зашифрованным relay-соединением.", "remote.pairingCode": "Одноразовый код сопряжения", "remote.pairingFailed": "Не удалось подготовить сопряжение коннектора.", "remote.preparingConnector": "Подготовка…", "remote.prepareConnector": "Подготовить коннектор", - "remote.connectorRequirement": "Закрытый MVP требует установки подписанного Linux-помощника с правами администратора. Windows и macOS пока не поставляются.", + "remote.connectorRequirement": "Коннектор работает от текущего пользователя без root и перенаправления портов. OCX должен содержать подписанный бинарник для этой платформы.", "remote.connectingTitle": "Подключение компьютера", - "remote.connectingBody": "Помощник сопряжён. Ожидаются проверки OCX, Agent, Tunnel и Gateway.", + "remote.connectingBody": "Agent запущен. Ожидаются проверки OCX, Agent, Relay и Gateway.", "remote.readyTitle": "Remote в сети", "remote.readyBody": "Локальный OpenCodex GUI доступен через защищённый адрес.", "remote.openRemote": "Открыть Remote GUI", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 6cff8fffb..2c3d54d3a 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -26,12 +26,12 @@ export const zh: Record = { "common.loading": "加载中…", "common.retry": "重试", "remote.title": "远程", - "remote.subtitle": "将此 OpenCodex 连接到你的账户,并通过私有 Cloudflare Tunnel 访问本地 GUI。", + "remote.subtitle": "将此 OpenCodex 连接到你的账户,并通过加密的出站 relay 使用终端。", "remote.refresh": "刷新远程状态", "remote.progressLabel": "远程设置进度", "remote.stepAccount": "GitHub 账户", "remote.stepPassword": "访问密码", - "remote.stepTunnel": "隧道", + "remote.stepTunnel": "电脑连接", "remote.loading": "正在加载远程状态…", "remote.loadFailed": "无法加载远程状态。", "remote.signedOutTitle": "连接此电脑", @@ -43,7 +43,7 @@ export const zh: Record = { "remote.deviceTitle": "每台设备独立凭据", "remote.deviceBody": "此 OCX 创建独立设备密钥,可单独撤销而不影响其他电脑。", "remote.tunnelTitle": "无需开放入站端口", - "remote.tunnelBody": "远程流量通过 Cloudflare Tunnel 进入,不暴露家庭或办公网络。", + "remote.tunnelBody": "Agent 只建立一条加密出站连接,不暴露家庭或办公网络。", "remote.startFailed": "无法启动 GitHub 登录。", "remote.cancelFailed": "无法取消设备登录。", "remote.pendingTitle": "请在浏览器中批准此电脑", @@ -66,7 +66,7 @@ export const zh: Record = { "remote.privateBetaTitle": "需要私测资格", "remote.privateBetaBody": "账号已连接,但当前服务器仅允许受邀账号启用远程功能。", "remote.domainTitle": "选择这台电脑的地址", - "remote.domainBody": "OpenCodex 将创建专用私有隧道并保留一个 opencodexpages.me 地址。", + "remote.domainBody": "OpenCodex 会为账户和此电脑保留唯一的 opencodexpages.me 地址。", "remote.deviceNameLabel": "电脑名称", "remote.deviceNamePlaceholder": "家用电脑", "remote.domainLabel": "远程地址", @@ -75,17 +75,17 @@ export const zh: Record = { "remote.activateFailed": "无法为这台电脑启用远程功能。", "remote.activating": "正在保留地址…", "remote.activate": "启用远程", - "remote.provisioningTitle": "正在创建私有隧道", - "remote.provisioningBody": "中央服务正在保留地址并创建这台电脑的 Cloudflare 资源。", + "remote.provisioningTitle": "正在准备安全地址", + "remote.provisioningBody": "中央服务正在保留地址并准备加密 relay 访问。", "remote.connectorTitle": "连接本地助手", - "remote.connectorBody": "地址已就绪。请配对保持本地 OCX 和 Cloudflare Tunnel 在线的已签名 Linux 助手。", + "remote.connectorBody": "地址已就绪。启动保持加密出站 relay 连接的已签名非特权 Agent。", "remote.pairingCode": "一次性配对码", "remote.pairingFailed": "无法准备连接器配对。", "remote.preparingConnector": "准备中…", "remote.prepareConnector": "准备连接器", - "remote.connectorRequirement": "当前私测版需要管理员批准安装已签名 Linux 助手;暂未提供 Windows 和 macOS 版本。", + "remote.connectorRequirement": "连接器以当前用户权限运行,无需 root 或端口转发。OCX 必须包含此平台的已签名二进制文件。", "remote.connectingTitle": "正在连接这台电脑", - "remote.connectingBody": "助手已配对,正在等待 OCX、Agent、Tunnel 和 Gateway 检查通过。", + "remote.connectingBody": "Agent 已启动,正在等待 OCX、Agent、Relay 和 Gateway 检查通过。", "remote.readyTitle": "远程已上线", "remote.readyBody": "现在可通过认证地址访问这台电脑的本地 OpenCodex GUI。", "remote.openRemote": "打开远程 GUI", diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index 6ece41ba0..786cbd35f 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -1,10 +1,10 @@ # OpenCodex Remote MVP 구현 인수인계 -마지막 갱신: 2026-07-30 +마지막 갱신: 2026-07-31 -작업 브랜치: `ingw/remote-private-mvp-handoff` +작업 브랜치: `ingw/remote-outbound-e2ee` -기준 브랜치/커밋: `dev` / `67c731e6` +기준 브랜치/커밋: `dev` / `cd46a34d` 이 문서는 다른 컴퓨터에서 작업을 바로 이어가기 위한 현재 상태의 기준 문서다. PostgreSQL 17과 실제 Control Plane·worker·Gateway 프로세스를 사용하는 로컬 통합 검증을 완료했고, 2026-07-30 기존 TeamWicked Oracle VPS에 중앙 bootstrap runtime과 `opencodexpages.me` public ingress를 배포했다. 실제 Cloudflare account의 Linux Mesh/private-hostname transport와 Rust Agent 포함 30분 stream은 통과했지만 실제 OpenCodex process를 포함한 public 운영 E2E는 아직 완료되지 않았다. @@ -21,7 +21,7 @@ - 기존 Mesh instance는 새 E2EE password를 설정할 때 slug를 보존해 `outbound-relay`로 전환한다. 기존 Cloudflare resource cleanup은 자동으로 수행하지 않는다. - 로컬 GUI는 연결 컴퓨터, Relay 상태, 이전 비밀번호가 필요한 암호화 password 변경, 사전 빌드 Agent 시작을 표시한다. -현재 검증: root/platform typecheck, GUI/platform production build와 lint, Rust check/build와 6 unit tests, root 전체 `6035 pass / 2 skip / 0 fail`을 통과했다. PostgreSQL 17에 `0003`까지 적용한 통합 테스트는 실제 Gateway, Rust Agent, WebCrypto client, `/bin/sh` portable PTY를 연결해 암호화한 `OCXR_RELAY_OK` 왕복과 누락된 immutable asset의 404 경계까지 `1 test / 87 expects`로 3회 연속 통과했다. 로컬 GUI와 wildcard workspace는 Playwright viewport에서 수평 overflow 없이 확인했다. 아직 남은 release 차단 조건은 signed multi-platform Agent packaging, 실제 Codex/Claude CLI를 포함한 public 운영 E2E, 운영 backup/deploy/rollback이다. 이 코드는 운영 중앙 서버와 `dev`에 배포하지 않았다. +현재 검증: root/platform typecheck, GUI/platform production build와 lint, Rust check/build와 6 unit tests, root 전체 `6035 pass / 2 skip / 0 fail`을 통과했다. PostgreSQL 17에 `0003`까지 적용한 통합 테스트는 실제 Gateway, Rust Agent, WebCrypto client, `/bin/sh` portable PTY를 연결해 암호화한 `OCXR_RELAY_OK` 왕복과 누락된 immutable asset의 404 경계까지 `1 test / 87 expects`로 3회 연속 통과했다. 로컬 GUI와 wildcard workspace는 Playwright viewport에서 수평 overflow 없이 확인했다. signed multi-platform Agent packaging과 런타임 fail-closed 검증 코드는 구현했으며 정확한 PR commit의 Actions 6종 통과가 필요하다. 아직 남은 release 차단 조건은 실제 Codex/Claude CLI를 포함한 public 운영 E2E와 운영 backup/deploy/rollback이다. 이 코드는 운영 중앙 서버와 `dev`에 배포하지 않았다. ## 문서와 디자인 자산 @@ -165,7 +165,7 @@ - 실제 Codex/Claude CLI 프로세스를 포함한 outbound E2EE terminal E2E. `/bin/sh` PTY 암호화 왕복은 완료했다. - outbound Gateway 프로세스 재시작 시 Agent/browser 재접속 측정. 기존 Mesh transport/Rust Agent 30분과 Tunnel 재시작은 완료. - suspend/delete saga의 Cloudflare 부분 실패 재시도와 orphan reconciliation. -- Agent 설치·OpenCodex 설정 반영을 한 번에 수행하는 서명 검증 installer. +- 최초 서명 bundle이 실 npm dry-run/package와 각 OS에서 설치·시작되는지 확인. - UI의 keyboard/focus/reduced-motion/zoom 접근성 브라우저 QA. 기본 viewport 시각 QA와 overflow 검사는 완료했다. ## 남은 부분 @@ -182,8 +182,8 @@ ### P1 — 운영 기능 - [x] native/isolated hybrid systemd unit 여섯 개와 중앙 `cloudflared`, Linux Mesh node 배포. -- Agent `amd64`/`arm64` musl release workflow. -- Agent binary와 installer의 SHA-256 + Ed25519 detached signature 검증. +- [x] Linux/macOS/Windows x64·arm64 native Agent CI/release matrix와 pinned Rust toolchain. +- [x] Agent binary SHA-256 + Ed25519 detached signature, package version·source commit을 묶는 canonical manifest signature, npm prepare/runtime fail-closed 검증. - suspend 시 hostname/CIDR/DNS를 먼저 제거하고 Cloudflare connector-cleanup API로 모든 연결을 끊은 뒤 Tunnel을 삭제하는 흐름을 실제 활성 Agent에서 확인했다. - resume 흐름 추가. 현재 suspend worker는 연결 종료를 확실히 하기 위해 Tunnel과 token을 폐기하며 resume은 미구현이다. - delete saga 단계별 idempotency와 orphan resource reconciler 추가. @@ -198,9 +198,9 @@ - 승인 이미지와 같은 1488×1058 viewport에서 Instances/Onboarding 시각 비교. - keyboard, focus, reduced motion, zoom, tablet/mobile QA. - UI에서 실시간 health signal 세부값과 retry 상태 연결. -- 온보딩 설치 명령을 실제 서명 검증 installer URL로 교체. 현재 `install.ocx.run`은 디자인용 placeholder다. +- [x] 로컬 `ocx gui`가 별도 privileged installer 대신 npm에 동봉된 서명 Agent를 현재 사용자 권한으로 시작. - 사용자/인스턴스 관리자 정지 화면과 Audit Log/Activity 실제 API 연결. -- CI에 platform typecheck/test/build, Rust fmt/clippy/test와 musl build 추가. +- [x] CI에 Rust fmt/clippy/test와 Linux musl, macOS, Windows x64·arm64 native build 추가. platform 전체 CI 확대는 별도 운영 시간 판단이 필요하다. - Cloudflare 다중 사용자 서비스 허용 범위 서면 확인. ## 알려진 차이와 위험 @@ -263,7 +263,7 @@ PASS cd docs-site && bun run build ```bash git fetch origin -git switch ingw/remote-private-mvp-handoff +git switch ingw/remote-outbound-e2ee bun install --frozen-lockfile bun run typecheck diff --git a/remote-agent/rust-toolchain.toml b/remote-agent/rust-toolchain.toml new file mode 100644 index 000000000..010f002cf --- /dev/null +++ b/remote-agent/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.97.1" +profile = "minimal" +components = ["rustfmt", "clippy"] diff --git a/remote-agent/src/relay.rs b/remote-agent/src/relay.rs index b1d205ed3..0a880570b 100644 --- a/remote-agent/src/relay.rs +++ b/remote-agent/src/relay.rs @@ -785,7 +785,7 @@ mod tests { assert_eq!(decoded.kind, FrameKind::Data); assert_eq!(decoded.session_id, session_id); assert_eq!(decoded.payload, b"opaque"); - assert!(RelayFrame::decode(&vec![0; FRAME_HEADER_SIZE - 1]).is_err()); + assert!(RelayFrame::decode(&[0; FRAME_HEADER_SIZE - 1]).is_err()); assert!( RelayFrame { kind: FrameKind::Data, diff --git a/scripts/prepare-package.ts b/scripts/prepare-package.ts index 437e0c265..af6b4174a 100644 --- a/scripts/prepare-package.ts +++ b/scripts/prepare-package.ts @@ -1,6 +1,11 @@ -import { chmodSync, existsSync, readdirSync, statSync } from "node:fs"; +import { chmodSync, existsSync, lstatSync, readFileSync, readdirSync, statSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; +import { + REMOTE_AGENT_PUBLIC_KEY_PEM, + REMOTE_AGENT_SPECS, + verifyRemoteAgentBundle, +} from "../src/remote/agent-bundle"; const root = dirname(fileURLToPath(new URL("../package.json", import.meta.url))); @@ -20,6 +25,38 @@ function chmodTree(path: string): void { chmodIfExists(path, 0o644); } +function packageVersion(): string { + const value = JSON.parse(readFileSync(join(root, "package.json"), "utf8")) as { version?: unknown }; + if (typeof value.version !== "string" || value.version.length === 0) throw new Error("package.json version is unavailable"); + return value.version; +} + +function verificationPublicKey(): string { + const path = process.env.OPENCODEX_REMOTE_AGENT_DRY_RUN_PUBLIC_KEY_FILE?.trim(); + if (!path) return REMOTE_AGENT_PUBLIC_KEY_PEM; + if (process.env.OPENCODEX_RELEASE_DRY_RUN !== "true") { + throw new Error("Remote Agent public-key overrides are allowed only for release dry-runs"); + } + const stat = lstatSync(path); + if (!stat.isFile() || stat.isSymbolicLink() || stat.size <= 0 || stat.size > 16 * 1024) { + throw new Error("Remote Agent dry-run public key must be a bounded regular file"); + } + return readFileSync(path, "utf8"); +} + chmodIfExists(join(root, "bin", "ocx.mjs"), 0o755); chmodIfExists(join(root, "bin", "package-main.mjs"), 0o644); chmodTree(join(root, "gui", "dist")); + +const remoteAgentRoot = join(root, "bin", "remote-agent"); +if (existsSync(remoteAgentRoot)) { + verifyRemoteAgentBundle(remoteAgentRoot, verificationPublicKey(), packageVersion()); + for (const spec of REMOTE_AGENT_SPECS) { + chmodIfExists( + join(remoteAgentRoot, spec.package, spec.executable), + spec.package.startsWith("windows-") ? 0o644 : 0o755, + ); + } +} else if (process.env.OPENCODEX_REQUIRE_REMOTE_AGENT_BUNDLE === "1") { + throw new Error("A complete signed Remote Agent bundle is required for release packaging"); +} diff --git a/scripts/remote-agent-bundle.ts b/scripts/remote-agent-bundle.ts new file mode 100644 index 000000000..98f54be16 --- /dev/null +++ b/scripts/remote-agent-bundle.ts @@ -0,0 +1,68 @@ +import { lstatSync, readFileSync } from "node:fs"; +import { + REMOTE_AGENT_PUBLIC_KEY_PEM, + REMOTE_AGENT_SPECS, + assembleRemoteAgentBundle, + verifyRemoteAgentBundle, +} from "../src/remote/agent-bundle"; + +function usage(): never { + throw new Error("Usage: remote-agent-bundle.ts assemble | verify "); +} + +function readExpectedPublicKey(): string { + const path = process.env.REMOTE_AGENT_EXPECTED_PUBLIC_KEY_FILE?.trim(); + if (!path) return REMOTE_AGENT_PUBLIC_KEY_PEM; + const stat = lstatSync(path); + if (!stat.isFile() || stat.isSymbolicLink() || stat.size <= 0 || stat.size > 16 * 1024) { + throw new Error("Remote Agent expected public key must be a bounded regular file"); + } + return readFileSync(path, "utf8"); +} + +function packageVersion(): string { + const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")) as { version?: unknown }; + if (typeof pkg.version !== "string" || pkg.version.length === 0) throw new Error("package.json version is unavailable"); + return pkg.version; +} + +function readSigningKey(): string { + const path = process.env.REMOTE_AGENT_SIGNING_KEY_FILE?.trim(); + if (!path) throw new Error("REMOTE_AGENT_SIGNING_KEY_FILE is required"); + let stat; + try { + stat = lstatSync(path); + } catch { + throw new Error("Remote Agent signing key file is unavailable"); + } + if (!stat.isFile() || stat.isSymbolicLink() || stat.size <= 0 || stat.size > 64 * 1024) { + throw new Error("Remote Agent signing key must be a bounded regular file"); + } + if (process.platform !== "win32" && (stat.mode & 0o077) !== 0) { + throw new Error("Remote Agent signing key permissions must be 0600 or stricter"); + } + return readFileSync(path, "utf8"); +} + +const [command, ...args] = process.argv.slice(2); + +if (command === "assemble") { + if (args.length !== 3) usage(); + const sourceCommit = process.env.GITHUB_SHA?.trim().toLowerCase() ?? ""; + const manifest = assembleRemoteAgentBundle({ + inputRoot: args[0], + bundleRoot: args[1], + releaseAssetsRoot: args[2], + privateKeyPem: readSigningKey(), + sourceCommit, + packageVersion: packageVersion(), + expectedPublicKeyPem: readExpectedPublicKey(), + }); + console.log(`Assembled and verified ${Object.keys(manifest.artifacts).length} signed Remote Agent artifacts.`); +} else if (command === "verify") { + if (args.length !== 1) usage(); + verifyRemoteAgentBundle(args[0], readExpectedPublicKey(), packageVersion()); + console.log(`Verified ${REMOTE_AGENT_SPECS.length} signed Remote Agent artifacts.`); +} else { + usage(); +} diff --git a/src/remote/agent-bundle.ts b/src/remote/agent-bundle.ts new file mode 100644 index 000000000..da7a58c49 --- /dev/null +++ b/src/remote/agent-bundle.ts @@ -0,0 +1,399 @@ +import { + createHash, + createPrivateKey, + createPublicKey, + randomUUID, + sign, + verify, + type KeyObject, +} from "node:crypto"; +import { + chmodSync, + copyFileSync, + existsSync, + lstatSync, + mkdirSync, + readFileSync, + renameSync, + rmSync, + writeFileSync, +} from "node:fs"; +import { basename, dirname, join, resolve } from "node:path"; + +export const REMOTE_AGENT_MANIFEST_FILE = "remote-agent-manifest.json"; +export const REMOTE_AGENT_MANIFEST_SIGNATURE_FILE = `${REMOTE_AGENT_MANIFEST_FILE}.sig`; +export const REMOTE_AGENT_PUBLIC_KEY_FILE = "remote-agent-public-key.pem"; +export const REMOTE_AGENT_MAX_BYTES = 64 * 1024 * 1024; + +export const REMOTE_AGENT_PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY----- +MCowBQYDK2VwAyEABcZpftnO6RPhs2EyXahbCyNv61SF9lKGQubC+4vpXhA= +-----END PUBLIC KEY----- +`; + +export const REMOTE_AGENT_KEY_ID = "sha256:7e60478af3ab0994ca21b21fd6cd14e55e38d7ad204116d2e2cc4760e0c61446"; + +export const REMOTE_AGENT_SPECS = [ + { package: "linux-x64", executable: "opencodex-remote-agent", releaseFile: "opencodex-remote-agent-linux-x64" }, + { package: "linux-arm64", executable: "opencodex-remote-agent", releaseFile: "opencodex-remote-agent-linux-arm64" }, + { package: "macos-x64", executable: "opencodex-remote-agent", releaseFile: "opencodex-remote-agent-macos-x64" }, + { package: "macos-arm64", executable: "opencodex-remote-agent", releaseFile: "opencodex-remote-agent-macos-arm64" }, + { package: "windows-x64", executable: "opencodex-remote-agent.exe", releaseFile: "opencodex-remote-agent-windows-x64.exe" }, + { package: "windows-arm64", executable: "opencodex-remote-agent.exe", releaseFile: "opencodex-remote-agent-windows-arm64.exe" }, +] as const; + +export type RemoteAgentPackage = typeof REMOTE_AGENT_SPECS[number]["package"]; + +interface RemoteAgentManifestArtifact { + path: string; + releaseFile: string; + sha256: string; + signature: string; +} + +interface RemoteAgentUnsignedManifest { + schemaVersion: 1; + keyId: string; + sourceCommit: string; + packageVersion: string; + artifacts: Record; +} + +export interface RemoteAgentManifest extends RemoteAgentUnsignedManifest { + manifestSignature: string; +} + +interface AssembleRemoteAgentBundleOptions { + inputRoot: string; + bundleRoot: string; + releaseAssetsRoot: string; + privateKeyPem: string; + sourceCommit: string; + packageVersion: string; + expectedPublicKeyPem?: string; +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function hasExactKeys(value: Record, expected: readonly string[]): boolean { + const actual = Object.keys(value).sort(); + const wanted = [...expected].sort(); + return actual.length === wanted.length && actual.every((key, index) => key === wanted[index]); +} + +function specForPackage(packageName: string) { + return REMOTE_AGENT_SPECS.find(spec => spec.package === packageName); +} + +export function remoteAgentPackageForRuntime( + platform: NodeJS.Platform = process.platform, + arch: string = process.arch, +): RemoteAgentPackage | null { + const normalizedPlatform = platform === "win32" ? "windows" : platform === "darwin" ? "macos" : platform === "linux" ? "linux" : null; + if (!normalizedPlatform || (arch !== "x64" && arch !== "arm64")) return null; + const packageName = `${normalizedPlatform}-${arch}`; + return specForPackage(packageName) ? packageName as RemoteAgentPackage : null; +} + +function parseManifest(raw: string, expectedKeyId: string): RemoteAgentManifest { + let value: unknown; + try { + value = JSON.parse(raw); + } catch { + throw new Error("Remote Agent manifest is not valid JSON"); + } + if (!isRecord(value) || !hasExactKeys(value, [ + "schemaVersion", "keyId", "sourceCommit", "packageVersion", "artifacts", "manifestSignature", + ])) { + throw new Error("Remote Agent manifest has an unsupported structure"); + } + if (value.schemaVersion !== 1 || value.keyId !== expectedKeyId) { + throw new Error("Remote Agent manifest uses an untrusted signing key"); + } + if (typeof value.sourceCommit !== "string" || !/^[0-9a-f]{40}$/.test(value.sourceCommit)) { + throw new Error("Remote Agent manifest has an invalid source commit"); + } + if ( + typeof value.packageVersion !== "string" + || value.packageVersion.length > 128 + || !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(value.packageVersion) + ) { + throw new Error("Remote Agent manifest has an invalid package version"); + } + if (typeof value.manifestSignature !== "string" || !/^[A-Za-z0-9_-]{86}$/.test(value.manifestSignature)) { + throw new Error("Remote Agent manifest signature is invalid"); + } + if (!isRecord(value.artifacts)) throw new Error("Remote Agent manifest has no artifact map"); + const packageNames = REMOTE_AGENT_SPECS.map(spec => spec.package); + if (!hasExactKeys(value.artifacts, packageNames)) { + throw new Error("Remote Agent manifest does not contain the complete platform set"); + } + + for (const spec of REMOTE_AGENT_SPECS) { + const artifact = value.artifacts[spec.package]; + if (!isRecord(artifact) || !hasExactKeys(artifact, ["path", "releaseFile", "sha256", "signature"])) { + throw new Error(`Remote Agent manifest entry is invalid for ${spec.package}`); + } + if (artifact.path !== `${spec.package}/${spec.executable}` || artifact.releaseFile !== spec.releaseFile) { + throw new Error(`Remote Agent manifest path is invalid for ${spec.package}`); + } + if (typeof artifact.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(artifact.sha256)) { + throw new Error(`Remote Agent checksum is invalid for ${spec.package}`); + } + if (typeof artifact.signature !== "string" || !/^[A-Za-z0-9_-]{86}$/.test(artifact.signature)) { + throw new Error(`Remote Agent signature is invalid for ${spec.package}`); + } + } + return value as unknown as RemoteAgentManifest; +} + +function unsignedManifest(manifest: RemoteAgentManifest | RemoteAgentUnsignedManifest): RemoteAgentUnsignedManifest { + const artifacts = {} as Record; + for (const spec of REMOTE_AGENT_SPECS) { + const artifact = manifest.artifacts[spec.package]; + artifacts[spec.package] = { + path: artifact.path, + releaseFile: artifact.releaseFile, + sha256: artifact.sha256, + signature: artifact.signature, + }; + } + return { + schemaVersion: 1, + keyId: manifest.keyId, + sourceCommit: manifest.sourceCommit, + packageVersion: manifest.packageVersion, + artifacts, + }; +} + +function manifestSigningPayload(manifest: RemoteAgentManifest | RemoteAgentUnsignedManifest): Buffer { + return Buffer.from(`opencodex-remote-agent-manifest-v1\0${JSON.stringify(unsignedManifest(manifest))}`, "utf8"); +} + +function readBoundedRegularFile(path: string): Buffer { + let stat; + try { + stat = lstatSync(path); + } catch { + throw new Error("Remote Agent artifact is missing"); + } + if (!stat.isFile() || stat.isSymbolicLink() || stat.size <= 0 || stat.size > REMOTE_AGENT_MAX_BYTES) { + throw new Error("Remote Agent artifact is not a bounded regular file"); + } + return readFileSync(path); +} + +function publicKeyId(publicKey: KeyObject): string { + const der = publicKey.export({ type: "spki", format: "der" }); + return `sha256:${createHash("sha256").update(der).digest("hex")}`; +} + +function loadPublicKey(publicKeyPem: string): { key: KeyObject; keyId: string } { + try { + const key = createPublicKey(publicKeyPem); + if (key.asymmetricKeyType !== "ed25519") throw new Error("wrong key type"); + return { key, keyId: publicKeyId(key) }; + } catch { + throw new Error("Remote Agent public key is invalid"); + } +} + +function loadPrivateKey(privateKeyPem: string): KeyObject { + try { + const key = createPrivateKey(privateKeyPem); + if (key.asymmetricKeyType !== "ed25519") throw new Error("wrong key type"); + return key; + } catch { + throw new Error("Remote Agent signing key is invalid"); + } +} + +function verifyArtifactBytes(bytes: Buffer, artifact: RemoteAgentManifestArtifact, publicKey: KeyObject): void { + const digest = createHash("sha256").update(bytes).digest("hex"); + if (digest !== artifact.sha256) throw new Error("Remote Agent checksum verification failed"); + let signature: Buffer; + try { + signature = Buffer.from(artifact.signature, "base64url"); + } catch { + throw new Error("Remote Agent signature is malformed"); + } + if (signature.length !== 64 || !verify(null, bytes, publicKey, signature)) { + throw new Error("Remote Agent signature verification failed"); + } +} + +function verifyManifestSignature(manifest: RemoteAgentManifest, publicKey: KeyObject): void { + const signature = Buffer.from(manifest.manifestSignature, "base64url"); + if (signature.length !== 64 || !verify(null, manifestSigningPayload(manifest), publicKey, signature)) { + throw new Error("Remote Agent manifest signature verification failed"); + } +} + +function assertExpectedPackageVersion(manifest: RemoteAgentManifest, expectedPackageVersion?: string): void { + if (expectedPackageVersion !== undefined && manifest.packageVersion !== expectedPackageVersion) { + throw new Error("Remote Agent bundle does not match the installed package version"); + } +} + +export function readRemoteAgentManifest( + bundleRoot: string, + publicKeyPem: string = REMOTE_AGENT_PUBLIC_KEY_PEM, +): RemoteAgentManifest { + const { key, keyId } = loadPublicKey(publicKeyPem); + let raw: string; + try { + raw = readFileSync(join(bundleRoot, REMOTE_AGENT_MANIFEST_FILE), "utf8"); + } catch { + throw new Error("Remote Agent manifest is missing"); + } + const manifest = parseManifest(raw, keyId); + verifyManifestSignature(manifest, key); + return manifest; +} + +export function verifyRemoteAgentArtifact( + bundleRoot: string, + packageName: RemoteAgentPackage, + publicKeyPem: string = REMOTE_AGENT_PUBLIC_KEY_PEM, + expectedPackageVersion?: string, +): string { + const spec = specForPackage(packageName); + if (!spec) throw new Error("Remote Agent is not available for this platform"); + const { key, keyId } = loadPublicKey(publicKeyPem); + let raw: string; + try { + raw = readFileSync(join(bundleRoot, REMOTE_AGENT_MANIFEST_FILE), "utf8"); + } catch { + throw new Error("Remote Agent manifest is missing"); + } + const manifest = parseManifest(raw, keyId); + verifyManifestSignature(manifest, key); + assertExpectedPackageVersion(manifest, expectedPackageVersion); + const binary = join(bundleRoot, spec.package, spec.executable); + verifyArtifactBytes(readBoundedRegularFile(binary), manifest.artifacts[spec.package], key); + return binary; +} + +export function verifyRemoteAgentBundle( + bundleRoot: string, + publicKeyPem: string = REMOTE_AGENT_PUBLIC_KEY_PEM, + expectedPackageVersion?: string, +): RemoteAgentManifest { + const { key, keyId } = loadPublicKey(publicKeyPem); + let raw: string; + try { + raw = readFileSync(join(bundleRoot, REMOTE_AGENT_MANIFEST_FILE), "utf8"); + } catch { + throw new Error("Remote Agent manifest is missing"); + } + const manifest = parseManifest(raw, keyId); + verifyManifestSignature(manifest, key); + assertExpectedPackageVersion(manifest, expectedPackageVersion); + for (const spec of REMOTE_AGENT_SPECS) { + const bytes = readBoundedRegularFile(join(bundleRoot, spec.package, spec.executable)); + verifyArtifactBytes(bytes, manifest.artifacts[spec.package], key); + } + return manifest; +} + +function replaceDirectory(staged: string, destination: string): void { + const backup = `${destination}.old-${process.pid}-${randomUUID()}`; + const hadDestination = existsSync(destination); + if (hadDestination) renameSync(destination, backup); + try { + renameSync(staged, destination); + if (hadDestination) rmSync(backup, { recursive: true, force: true }); + } catch (error) { + if (hadDestination && existsSync(backup) && !existsSync(destination)) renameSync(backup, destination); + throw error; + } +} + +/** + * [Decision Log] + * - 목적과 의도: npm 설치 후 런타임 컴파일 없이 지원 플랫폼 Agent를 제공하되, 패키지나 캐시가 변조된 경우 실행을 차단한다. + * - 기존 구현 및 제약 조건: Agent source만 있었고 CI artifact, 서명 manifest, 런타임 신뢰 기준이 없었다. + * - 검토한 주요 대안: 사용자 PC cargo build, 플랫폼별 npm optional package, checksum만 사용, 단일 npm package에 서명 binary 동봉. + * - 선택한 방식: 공식 runner의 6개 native build를 release job에서 Ed25519로 서명하고, 정확한 allowlist manifest와 함께 원자적으로 조립한다. + * - 다른 대안 대신 이 방식을 선택한 이유: 설치 절차를 바꾸지 않으면서 공급망 변조를 fail-closed로 막고 build provenance를 한 release commit에 묶을 수 있다. + * - 장점, 단점 및 영향: Linux/macOS/Windows x64·arm64가 즉시 동작하지만 release secret 관리와 6개 runner 검증이 필수다. + */ +export function assembleRemoteAgentBundle(options: AssembleRemoteAgentBundleOptions): RemoteAgentManifest { + if (!/^[0-9a-f]{40}$/.test(options.sourceCommit)) throw new Error("Remote Agent source commit must be a full lowercase SHA"); + if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(options.packageVersion)) { + throw new Error("Remote Agent package version must be valid semver"); + } + const expectedPublicKeyPem = options.expectedPublicKeyPem ?? REMOTE_AGENT_PUBLIC_KEY_PEM; + const { key: expectedPublicKey, keyId } = loadPublicKey(expectedPublicKeyPem); + const privateKey = loadPrivateKey(options.privateKeyPem); + const derivedPublicKey = createPublicKey(privateKey.export({ type: "pkcs8", format: "pem" })); + if (publicKeyId(derivedPublicKey) !== keyId) throw new Error("Remote Agent signing key does not match the pinned public key"); + + const bundleRoot = resolve(options.bundleRoot); + const releaseRoot = resolve(options.releaseAssetsRoot); + const bundleStage = join(dirname(bundleRoot), `.${basename(bundleRoot)}.tmp-${process.pid}-${randomUUID()}`); + const releaseStage = join(dirname(releaseRoot), `.${basename(releaseRoot)}.tmp-${process.pid}-${randomUUID()}`); + const artifacts = {} as Record; + mkdirSync(bundleStage, { recursive: true, mode: 0o755 }); + mkdirSync(releaseStage, { recursive: true, mode: 0o755 }); + + try { + for (const spec of REMOTE_AGENT_SPECS) { + const source = join(options.inputRoot, `remote-agent-${spec.package}`, spec.executable); + const bytes = readBoundedRegularFile(source); + const signature = sign(null, bytes, privateKey); + const artifact: RemoteAgentManifestArtifact = { + path: `${spec.package}/${spec.executable}`, + releaseFile: spec.releaseFile, + sha256: createHash("sha256").update(bytes).digest("hex"), + signature: signature.toString("base64url"), + }; + artifacts[spec.package] = artifact; + + const packageDir = join(bundleStage, spec.package); + mkdirSync(packageDir, { recursive: true, mode: 0o755 }); + const packagedBinary = join(packageDir, spec.executable); + copyFileSync(source, packagedBinary); + if (!spec.package.startsWith("windows-")) chmodSync(packagedBinary, 0o755); + + const releaseBinary = join(releaseStage, spec.releaseFile); + copyFileSync(source, releaseBinary); + if (!spec.package.startsWith("windows-")) chmodSync(releaseBinary, 0o755); + writeFileSync(`${releaseBinary}.sig`, signature, { mode: 0o644 }); + } + + const unsigned: RemoteAgentUnsignedManifest = { + schemaVersion: 1, + keyId, + sourceCommit: options.sourceCommit, + packageVersion: options.packageVersion, + artifacts, + }; + const manifestSignature = sign(null, manifestSigningPayload(unsigned), privateKey); + const manifest: RemoteAgentManifest = { + ...unsigned, + manifestSignature: manifestSignature.toString("base64url"), + }; + const serialized = `${JSON.stringify(manifest, null, 2)}\n`; + writeFileSync(join(bundleStage, REMOTE_AGENT_MANIFEST_FILE), serialized, { mode: 0o644 }); + writeFileSync(join(releaseStage, REMOTE_AGENT_MANIFEST_FILE), serialized, { mode: 0o644 }); + writeFileSync(join(releaseStage, REMOTE_AGENT_MANIFEST_SIGNATURE_FILE), manifestSignature, { mode: 0o644 }); + writeFileSync(join(releaseStage, REMOTE_AGENT_PUBLIC_KEY_FILE), expectedPublicKeyPem, { mode: 0o644 }); + + verifyRemoteAgentBundle(bundleStage, expectedPublicKeyPem, options.packageVersion); + if (!verify(null, Buffer.from("bundle-key-check"), expectedPublicKey, sign(null, Buffer.from("bundle-key-check"), privateKey))) { + throw new Error("Remote Agent signing key verification failed"); + } + mkdirSync(dirname(bundleRoot), { recursive: true }); + mkdirSync(dirname(releaseRoot), { recursive: true }); + replaceDirectory(bundleStage, bundleRoot); + replaceDirectory(releaseStage, releaseRoot); + return manifest; + } catch (error) { + rmSync(bundleStage, { recursive: true, force: true }); + rmSync(releaseStage, { recursive: true, force: true }); + throw error; + } +} diff --git a/src/remote/agent.ts b/src/remote/agent.ts index 2a86339c6..8057e4c7a 100644 --- a/src/remote/agent.ts +++ b/src/remote/agent.ts @@ -14,6 +14,11 @@ import { chmod, open } from "node:fs/promises"; import { dirname, isAbsolute, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { getConfigDir } from "../config"; +import { + REMOTE_AGENT_PUBLIC_KEY_PEM, + remoteAgentPackageForRuntime, + verifyRemoteAgentArtifact, +} from "./agent-bundle"; interface AgentPidFile { pid: number; @@ -81,9 +86,14 @@ function executableName(): string { return process.platform === "win32" ? "opencodex-remote-agent.exe" : "opencodex-remote-agent"; } -function packagedPlatform(): string { - const platform = process.platform === "win32" ? "windows" : process.platform === "darwin" ? "macos" : "linux"; - return `${platform}-${process.arch}`; +function installedPackageVersion(packageRoot: string): string { + try { + const parsed = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8")) as { version?: unknown }; + if (typeof parsed.version !== "string" || parsed.version.length === 0) throw new Error("missing version"); + return parsed.version; + } catch { + throw new Error("OpenCodex package version is unavailable for Remote Agent verification"); + } } function resolveAgentBinary(): string | null { @@ -94,8 +104,23 @@ function resolveAgentBinary(): string | null { } const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../.."); const name = executableName(); + const bundleRoot = join(packageRoot, "bin", "remote-agent"); + const packageName = remoteAgentPackageForRuntime(); + if (existsSync(bundleRoot)) { + if (!packageName) throw new Error("Remote Agent is not available for this platform"); + // A present release bundle is a trust boundary. Never fall back to an + // unsigned development binary when that bundle is partial or tampered. + const binary = verifyRemoteAgentArtifact( + bundleRoot, + packageName, + REMOTE_AGENT_PUBLIC_KEY_PEM, + installedPackageVersion(packageRoot), + ); + if (process.platform !== "win32") accessSync(binary, constants.X_OK); + return binary; + } + const candidates = [ - join(packageRoot, "bin", "remote-agent", packagedPlatform(), name), join(packageRoot, "remote-agent", "target", "release", name), join(packageRoot, "remote-agent", "target", "debug", name), ]; diff --git a/structure/05_gui-and-management-api.md b/structure/05_gui-and-management-api.md index e85a91cd6..dfe70400b 100644 --- a/structure/05_gui-and-management-api.md +++ b/structure/05_gui-and-management-api.md @@ -111,7 +111,9 @@ GitHub approval, the central service returns a revocable OpenCodex device token channel and deletes the encrypted handoff after the local ACK. GitHub OAuth access, refresh, and ID tokens are discarded by the central auth database hooks and never enter `remote.json`. -The separate Remote password is Argon2id-hashed by the central service. Changing it revokes existing +The separate Remote password is derived with Argon2id locally. The central service stores only a +hash of the HKDF-separated authentication secret and cannot unwrap the encrypted account vault. +Changing the password requires the old password, rewraps the vault locally, and revokes existing instance browser sessions. Five failed attempts lock verification for 15 minutes. An unauthenticated top-level request to an active instance hostname redirects to `/access/` on the central origin; API and WebSocket requests still fail closed without redirection. Successful GitHub ownership and @@ -124,7 +126,7 @@ password verification creates a 60-second exchange code and then a host-only ins - 검토한 주요 대안: localhost OAuth callback으로 GitHub token 전달, 장기 token을 URL fragment에 포함, polling secret이 분리된 device authorization과 중앙 password gate. - 선택한 방식: local device authorization, 중앙 GitHub identity-only OAuth, Argon2id password, hostname별 exchange session을 결합한다. - 다른 대안 대신 이 방식을 선택한 이유: GitHub/Cloudflare credential이 사용자 브라우저 history나 PC로 이동하지 않으며 각 PC와 instance session을 따로 폐기할 수 있다. -- 장점, 단점 및 영향: Tailscale과 유사한 local-first UX와 중앙 정책 경계가 생긴다. 다만 privileged signed Agent installer가 배포되기 전에는 Linux helper pairing이 수동 private-MVP 단계로 남는다. +- 장점, 단점 및 영향: Tailscale과 유사한 local-first UX와 중앙 정책 경계가 생긴다. Linux/macOS/Windows x64·arm64는 npm에 동봉된 서명 Agent로 연결되며 다른 조합은 명확히 미지원 처리한다. ``` ## Sidebar stop button diff --git a/structure/06_docs-and-release.md b/structure/06_docs-and-release.md index b357bd0ef..c7069cc9a 100644 --- a/structure/06_docs-and-release.md +++ b/structure/06_docs-and-release.md @@ -40,8 +40,8 @@ bun run build | Workflow | Trigger | Purpose | | --- | --- | --- | -| `.github/workflows/ci.yml` | `pull_request` to `main`/`dev`, `push` to `main`/`preview`/`dev`, or manual dispatch when runtime/package paths change | Cross-platform runtime/package quality gate on Linux, Windows, and macOS. The `test` job (Bun) runs typecheck, `bun test --isolate tests`, the GUI suite (`cd gui && bun test tests`), the privacy scan, release-helper syntax check, GUI lint/build, and `ocx help`; `npm-global-smoke` (Node only, **no setup-bun**) builds package assets, packs the tarball, installs it globally, and runs `ocx help` to prove the bundled-Bun launcher works without a separate Bun install. | -| `.github/workflows/release.yml` | Manual dispatch only | npm publish/dry-run workflow. It requires the exact `GITHUB_SHA` to have a successful Cross-platform CI run before publish or dry-run. | +| `.github/workflows/ci.yml` | `pull_request` to `main`/`dev`, `push` to `main`/`preview`/`dev`, or manual dispatch when runtime/package paths change | Cross-platform runtime/package quality gate on Linux, Windows, and macOS. The `test` job (Bun) runs typecheck, `bun test --isolate tests`, the GUI suite (`cd gui && bun test tests`), the privacy scan, release-helper syntax check, GUI lint/build, and `ocx help`; `npm-global-smoke` proves the bundled-Bun global install; the six-entry `remote-agent` matrix runs native Rust fmt/clippy/test/release builds for Linux/macOS/Windows x64 and arm64. | +| `.github/workflows/release.yml` | Manual dispatch only | npm publish/dry-run workflow. It requires successful Cross-platform CI for the exact `GITHUB_SHA`, rebuilds all six native Remote Agents, assembles an Ed25519-signed exact manifest, requires that bundle during npm packaging, and attaches binaries/signatures to the GitHub Release. | | `.github/workflows/deploy-docs.yml` | `push` to `main` touching `docs-site/**` or the workflow, or manual dispatch | Build and publish the Astro/Starlight docs site to GitHub Pages. | | `.github/workflows/service-lifecycle.yml` | `pull_request` to `main`/`dev` and `push`, both filtered on the service path set (`src/service.ts`, `src/cli.ts`, `src/cli/index.ts`, `src/lib/bun-runtime.ts`, `package.json`, `bun.lock`, the workflow), or manual dispatch | Service-lifecycle smoke on three platforms: Linux systemd, macOS launchd, and Windows Scheduled Tasks. Each installs, verifies, stops via `ocx stop`, and uninstalls. The path list is kept in sync with the `release.yml` service-gate regex. | | `.github/workflows/enforce-pr-target.yml` | `pull_request_target` (opened, reopened, edited, ready_for_review, synchronize) | The `enforce-target` gate: rejects pull requests whose head ancestry sits on the `main` tip while far behind `dev`, and rejects empty or malformed descriptions. Stacked child PRs targeting another open PR's head skip the wrong-base gate. | @@ -141,7 +141,12 @@ Invariants: Package release is npm-focused. `package.json` exposes `opencodex` and `ocx`, `prepublishOnly` runs typecheck and GUI build, and `scripts/release.ts` now runs local typecheck, `bun test --isolate tests`, and `bun run privacy:scan` before the version bump, commit/push, Cross-platform CI wait, and GitHub -Release workflow dispatch. Docs publishing is separate from npm release publishing. +Release workflow dispatch. The release workflow rebuilds and signs the six-platform Remote Agent bundle; +the private signing key exists only as the `REMOTE_AGENT_SIGNING_KEY` secret in the protected +`remote-agent-release` environment, while dry-runs use a one-run ephemeral key and never receive the +production key. The pinned public key and key ID are source-controlled for fail-closed runtime +verification. Docs publishing is +separate from npm release publishing. ## Release metadata invariants @@ -176,8 +181,8 @@ version through `scripts/release.ts`. ## Cross-platform CI -`.github/workflows/ci.yml` is the ordinary quality gate for runtime/package changes. It runs on -Linux, Windows, and macOS with two job families: +`.github/workflows/ci.yml` is the ordinary quality gate for runtime/package changes. It runs Bun/Node +checks on Linux, Windows, and macOS plus a native Remote Agent matrix: ```bash bun install --frozen-lockfile @@ -202,6 +207,12 @@ ocx help The CI intentionally does not build docs, run coverage, or perform remote Ubuntu/RDP smoke tests. Those stay outside the default gate until a concrete regression justifies the extra runtime. +The Agent matrix pins Rust via `remote-agent/rust-toolchain.toml` and covers Linux musl, macOS, and +Windows on x64 and arm64. It does not sign pull-request artifacts. Signing happens only after a manual +release dispatch, after all six native builds complete. Dry-runs sign with an ephemeral key; only a +real release selects the protected `remote-agent-release` environment and can read the production +signing secret. Every dispatch requires the exact audited SHA. + The Release workflow remains manual and publish-focused. Before any dry-run or publish step, it checks that the exact release commit (`GITHUB_SHA`) already has a successful Cross-platform CI run. This keeps release runs short and makes release a deployment of a verified commit rather than a diff --git a/structure/12_remote-platform.md b/structure/12_remote-platform.md index 5eb97282a..0887f4f9c 100644 --- a/structure/12_remote-platform.md +++ b/structure/12_remote-platform.md @@ -13,6 +13,37 @@ OpenCodex Remote는 로컬 `ocx gui` 계정/기기 설정, 중앙 Control Plane/ 중앙 플랫폼 source는 npm package에 포함하지 않는다. 일반 OCX release에는 플랫폼별로 빌드·서명된 최소 Agent binary만 `bin/remote-agent/-/`에 동봉해야 한다. 런타임 `cargo build`는 금지한다. +## Signed multi-platform Agent bundle + +지원 bundle은 정확히 여섯 개다. + +| Package path | Rust target | GitHub runner | +| --- | --- | --- | +| `linux-x64` | `x86_64-unknown-linux-musl` | `ubuntu-24.04` | +| `linux-arm64` | `aarch64-unknown-linux-musl` | `ubuntu-24.04-arm` | +| `macos-x64` | `x86_64-apple-darwin` | `macos-15-intel` | +| `macos-arm64` | `aarch64-apple-darwin` | `macos-15` | +| `windows-x64` | `x86_64-pc-windows-msvc` | `windows-latest` | +| `windows-arm64` | `aarch64-pc-windows-msvc` | `windows-11-arm` | + +`.github/workflows/ci.yml`은 pinned Rust `1.97.1`로 각 native runner에서 fmt, clippy, test, release build를 수행한다. 수동 release workflow는 같은 matrix를 다시 build해 1일 보관 Actions artifact로 publish job에 넘긴다. 보호된 `remote-agent-release` Environment 승인을 통과한 실제 publish job만 Environment secret `REMOTE_AGENT_SIGNING_KEY`를 파일 mode `0600`으로 잠깐 materialize하고, `scripts/remote-agent-bundle.ts`가 다음을 생성한다. + +- npm payload: `bin/remote-agent//opencodex-remote-agent[.exe]` +- exact six-entry `remote-agent-manifest.json`: npm package version, source commit, release filename, SHA-256, raw-binary Ed25519 signature, canonical manifest signature +- GitHub Release assets: 각 native binary, raw detached `.sig`, 동일 manifest와 manifest `.sig`, public key PEM + +manifest signature는 domain-separated canonical payload 전체를 인증하므로 이전 binary/signature를 새 commit처럼 보이게 섞을 수 없다. package preparation과 런타임은 manifest의 package version이 독립적인 root `package.json` version과 같은지도 확인해 완전한 이전 bundle replay를 막는다. `scripts/prepare-package.ts`는 release에서 bundle 전체를 다시 검증하고 하나라도 없거나 다르면 publish 전에 실패한다. 런타임은 현재 OS/architecture artifact만 고정 public key로 검증한 직후 실행한다. bundle이 존재하지만 manifest, checksum, signature가 틀리면 unsigned development build로 fallback하지 않는다. 명시적인 absolute `OPENCODEX_REMOTE_AGENT_BIN`은 source checkout 개발용 override로만 남는다. + +실제 production private key는 `remote-agent-release` GitHub Environment secret에만 두고, 해당 environment 승인 뒤 실제 publish job에서만 읽는다. 기본 dry-run은 매번 임시 Ed25519 key를 생성해 동일한 조립·검증·packaging 경로를 시험하며 production key를 읽지 않는다. `expected-sha`는 모든 dispatch에서 필수이고 현재 `GITHUB_SHA`와 다르면 signing 전에 실패한다. + +[Decision Log] +- 목적과 의도: 설치 직후 Remote를 사용할 수 있게 하면서 사용자 PC의 컴파일과 변조 binary 실행을 모두 제거한다. +- 기존 구현 및 제약 조건: Rust Agent source와 local target fallback만 있었고 npm release에는 native artifact나 신뢰 기준이 없었다. +- 검토한 주요 대안: 런타임 cargo build, checksum-only bundle, 플랫폼별 optional npm package, 한 npm package에 서명된 6종 동봉. +- 선택한 방식: official native runner 6종 build, exact manifest, Ed25519 raw-binary signature, release-time bundle assembly를 사용한다. +- 다른 대안 대신 이 방식을 선택한 이유: 기존 `npm install -g` UX와 단일 버전을 유지하면서 cross-compilation 차이와 캐시/패키지 변조를 fail-closed로 처리한다. +- 장점, 단점 및 영향: Linux/macOS/Windows x64·arm64는 바로 실행되지만 release secret 보관과 6개 runner 성공이 새 release 필수 조건이다. + ## User flow ```text diff --git a/tests/ci-workflows.test.ts b/tests/ci-workflows.test.ts index f5b6374d6..f0ae1d93e 100644 --- a/tests/ci-workflows.test.ts +++ b/tests/ci-workflows.test.ts @@ -34,11 +34,13 @@ describe("GitHub Actions hardening", () => { // The cross-platform `test` job sits at 20 minutes: a green Windows run measured // 11.8 min against 4.6 on Linux, and the previous 12-minute ceiling left ~12s of // margin, so runner variance rather than the code decided the verdict (#717). - // `npm-global-smoke` stays at 8; it finishes in 1-2 minutes. + // `npm-global-smoke` stays at 8; the native six-platform Agent matrix is + // bounded separately at 25 because Rust release builds dominate it. expect(count(workflow, "timeout-minutes: 20")).toBe(1); expect(count(workflow, "timeout-minutes: 8")).toBe(1); - // Both jobs must stay bounded — an unbounded job can hang a queue for hours. - expect(count(workflow, "timeout-minutes:")).toBe(2); + // Every job family must stay bounded — an unbounded job can hang a queue for hours. + expect(count(workflow, "timeout-minutes: 25")).toBe(1); + expect(count(workflow, "timeout-minutes:")).toBe(3); expect(workflow).toContain("actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0"); expect(workflow).toContain("oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6"); expect(workflow).toContain("actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"); @@ -106,6 +108,8 @@ describe("GitHub Actions hardening", () => { "bun.lock", "gui/**", "package.json", + "platform/**", + "remote-agent/**", "scripts/**", "src/**", "tests/**", @@ -115,6 +119,15 @@ describe("GitHub Actions hardening", () => { // Push and pull_request have to cover the same surfaces, or a change lands // on dev having been checked on one trigger and not the other. expect([...(ci.on?.push?.paths ?? [])].sort()).toEqual(ciPaths); + + for (const packageName of [ + "linux-x64", "linux-arm64", "macos-x64", "macos-arm64", "windows-x64", "windows-arm64", + ]) { + expect(await readText(".github/workflows/ci.yml")).toContain(`package: ${packageName}`); + } + expect(await readText(".github/workflows/ci.yml")).toContain( + "- name: Install pinned Rust target\n working-directory: remote-agent", + ); }); test("cross-platform CI keeps the GUI lint and build gates", async () => { @@ -217,8 +230,28 @@ describe("GitHub Actions hardening", () => { expect(workflow).toContain("actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0"); expect(workflow).toContain("oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6"); expect(workflow).toContain("actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"); + expect(workflow).toContain("actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02"); + expect(workflow).toContain("actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093"); expect(workflow).not.toMatch(/uses:\s+\S+@(?:v\d+|main|master)\b/); + // Every supported native build must finish before the only secret-bearing + // publish job assembles an exact signed bundle. PR jobs never receive the key. + expect(workflow).toContain("needs: remote-agent-build"); + expect(workflow).toContain("name: ${{ inputs.dry-run && 'remote-agent-dry-run' || 'remote-agent-release' }}"); + expect(workflow).toContain("REMOTE_AGENT_SIGNING_KEY: ${{ secrets.REMOTE_AGENT_SIGNING_KEY }}"); + expect(workflow).toContain('OPENCODEX_REQUIRE_REMOTE_AGENT_BUNDLE: "1"'); + expect(workflow).toContain("shred -u \"$signing_key\""); + expect(workflow).toContain("openssl genpkey -algorithm ED25519"); + expect(workflow).toContain("OPENCODEX_REMOTE_AGENT_DRY_RUN_PUBLIC_KEY_FILE=$public_key"); + expect(workflow).toContain("expected-sha is required; refusing to release an unaudited branch tip"); + expect(workflow).toMatch(/expected-sha:[\s\S]*?required: true/); + expect(workflow).toContain("- name: Install pinned Rust target\n working-directory: remote-agent"); + for (const packageName of [ + "linux-x64", "linux-arm64", "macos-x64", "macos-arm64", "windows-x64", "windows-arm64", + ]) { + expect(workflow).toContain(`package: ${packageName}`); + } + // Workflow-dispatch inputs must reach shell code via env, never by direct // interpolation into run: source (script-injection hardening). const runBlocks = workflow.split(/\n {6,}- name: /).filter(block => block.includes("run: |")); diff --git a/tests/remote-agent-bundle.test.ts b/tests/remote-agent-bundle.test.ts new file mode 100644 index 000000000..c27ba7a4d --- /dev/null +++ b/tests/remote-agent-bundle.test.ts @@ -0,0 +1,118 @@ +import { afterEach, describe, expect, test } from "bun:test"; +import { generateKeyPairSync } from "node:crypto"; +import { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; +import { mkdtempSync } from "node:fs"; +import { + REMOTE_AGENT_SPECS, + assembleRemoteAgentBundle, + remoteAgentPackageForRuntime, + verifyRemoteAgentArtifact, + verifyRemoteAgentBundle, +} from "../src/remote/agent-bundle"; + +const cleanup: string[] = []; + +afterEach(() => { + for (const path of cleanup.splice(0)) rmSync(path, { recursive: true, force: true }); +}); + +function fixture() { + const root = mkdtempSync(join(tmpdir(), "ocx-agent-bundle-")); + cleanup.push(root); + const inputRoot = join(root, "input"); + const bundleRoot = join(root, "bundle"); + const releaseAssetsRoot = join(root, "release"); + for (const spec of REMOTE_AGENT_SPECS) { + const artifactRoot = join(inputRoot, `remote-agent-${spec.package}`); + mkdirSync(artifactRoot, { recursive: true }); + writeFileSync(join(artifactRoot, spec.executable), `native-agent:${spec.package}\n`, { mode: 0o755 }); + } + const pair = generateKeyPairSync("ed25519"); + const privateKeyPem = pair.privateKey.export({ type: "pkcs8", format: "pem" }).toString(); + const publicKeyPem = pair.publicKey.export({ type: "spki", format: "pem" }).toString(); + const manifest = assembleRemoteAgentBundle({ + inputRoot, + bundleRoot, + releaseAssetsRoot, + privateKeyPem, + expectedPublicKeyPem: publicKeyPem, + sourceCommit: "a".repeat(40), + packageVersion: "9.8.7", + }); + return { root, bundleRoot, releaseAssetsRoot, privateKeyPem, publicKeyPem, manifest }; +} + +describe("Remote Agent release bundle", () => { + test("assembles and verifies the complete six-platform set", () => { + const built = fixture(); + expect(Object.keys(verifyRemoteAgentBundle(built.bundleRoot, built.publicKeyPem).artifacts)).toHaveLength(6); + expect(built.manifest.sourceCommit).toBe("a".repeat(40)); + expect(built.manifest.packageVersion).toBe("9.8.7"); + for (const spec of REMOTE_AGENT_SPECS) { + expect(readFileSync(join(built.releaseAssetsRoot, `${spec.releaseFile}.sig`))).toHaveLength(64); + expect(verifyRemoteAgentArtifact(built.bundleRoot, spec.package, built.publicKeyPem)).toEndWith(spec.executable); + } + }); + + test("fails closed when a packaged binary is modified", () => { + const built = fixture(); + const linuxBinary = join(built.bundleRoot, "linux-x64", "opencodex-remote-agent"); + writeFileSync(linuxBinary, "tampered\n"); + chmodSync(linuxBinary, 0o755); + expect(() => verifyRemoteAgentArtifact(built.bundleRoot, "linux-x64", built.publicKeyPem)) + .toThrow("checksum verification failed"); + }); + + test("rejects a missing platform and manifest path substitution", () => { + const missing = fixture(); + rmSync(join(missing.bundleRoot, "windows-arm64", "opencodex-remote-agent.exe")); + expect(() => verifyRemoteAgentBundle(missing.bundleRoot, missing.publicKeyPem)).toThrow("artifact is missing"); + + const substituted = fixture(); + const manifestPath = join(substituted.bundleRoot, "remote-agent-manifest.json"); + const manifest = JSON.parse(readFileSync(manifestPath, "utf8")); + manifest.artifacts["linux-x64"].path = "../opencodex-remote-agent"; + writeFileSync(manifestPath, `${JSON.stringify(manifest)}\n`); + expect(() => verifyRemoteAgentBundle(substituted.bundleRoot, substituted.publicKeyPem)) + .toThrow("manifest path is invalid"); + }); + + test("authenticates source provenance and the installed package version", () => { + const built = fixture(); + const manifestPath = join(built.bundleRoot, "remote-agent-manifest.json"); + const manifest = JSON.parse(readFileSync(manifestPath, "utf8")); + manifest.sourceCommit = "b".repeat(40); + writeFileSync(manifestPath, `${JSON.stringify(manifest)}\n`); + expect(() => verifyRemoteAgentBundle(built.bundleRoot, built.publicKeyPem, "9.8.7")) + .toThrow("manifest signature verification failed"); + + const versionBound = fixture(); + expect(() => verifyRemoteAgentBundle(versionBound.bundleRoot, versionBound.publicKeyPem, "9.8.8")) + .toThrow("does not match the installed package version"); + }); + + test("rejects a signing key that does not match the pinned public key", () => { + const built = fixture(); + const other = generateKeyPairSync("ed25519"); + const otherPrivateKey = other.privateKey.export({ type: "pkcs8", format: "pem" }).toString(); + expect(() => assembleRemoteAgentBundle({ + inputRoot: join(built.root, "input"), + bundleRoot: join(built.root, "wrong-bundle"), + releaseAssetsRoot: join(built.root, "wrong-release"), + privateKeyPem: otherPrivateKey, + expectedPublicKeyPem: built.publicKeyPem, + sourceCommit: "b".repeat(40), + packageVersion: "9.8.7", + })).toThrow("does not match the pinned public key"); + }); + + test("maps only the supported runtime combinations", () => { + expect(remoteAgentPackageForRuntime("linux", "x64")).toBe("linux-x64"); + expect(remoteAgentPackageForRuntime("darwin", "arm64")).toBe("macos-arm64"); + expect(remoteAgentPackageForRuntime("win32", "x64")).toBe("windows-x64"); + expect(remoteAgentPackageForRuntime("freebsd", "x64")).toBeNull(); + expect(remoteAgentPackageForRuntime("linux", "riscv64")).toBeNull(); + }); +});
{step === 1 ?
- +

Choose a stable name for your private OpenCodex instance.

{error &&
{error}
} -
+
: step === 2 ? <> -

We’ve reserved this hostname for your new private instance.

+

We’ve reserved this hostname for your new private instance.

Install the Linux Agent

Run this command on the server where OpenCodex is installed.

{command}

Pair this Agent

Enter this code when prompted by the agent.

{pairing?.code.match(/.{1,4}/g)?.join("-")}◷ Expires in {time}

The code can be used once and does not contain a long-lived credential.

Verify

We’ll check the connection once the agent is paired.

{[[IconBox,"OpenCodex detected"],[IconTerminal2,"Agent authenticated"],[IconLink,"Tunnel connected"],[IconGlobe,"Gateway health check"]].map(([Icon,label]) =>
{label as string}●  Waiting
)}
diff --git a/platform/web/src/api.ts b/platform/web/src/api.ts index c40f6471e..753c86143 100644 --- a/platform/web/src/api.ts +++ b/platform/web/src/api.ts @@ -57,6 +57,15 @@ export async function listInstances(): Promise { return (await request<{ instances: Instance[] }>("/api/v1/instances")).instances; } +export async function getInstance(instanceId: string): Promise { + if (demo) { + const instance = demoInstances.find(item => item.id === instanceId); + if (!instance) throw new Error("not found"); + return structuredClone(instance); + } + return (await request<{ instance: Instance }>(`/api/v1/instances/${instanceId}`)).instance; +} + export async function getCurrentUser(): Promise { if (demo) return { id: "demo-user", name: "Octo Cat", email: "octocat@example.test", role: "admin", status: "active" }; return (await request<{ user: CurrentUser }>("/api/v1/me")).user; From e7d8663095810d7dcfaac077972ae4cfad9e0981 Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Thu, 30 Jul 2026 07:06:40 +0000 Subject: [PATCH 5/7] feat(remote): make onboarding local-first --- README.md | 8 + .../src/content/docs/guides/web-dashboard.md | 18 + .../content/docs/ja/guides/web-dashboard.md | 14 + .../src/content/docs/ja/reference/cli.md | 11 + .../content/docs/ko/guides/web-dashboard.md | 14 + .../src/content/docs/ko/reference/cli.md | 11 + docs-site/src/content/docs/reference/cli.md | 11 + .../content/docs/ru/guides/web-dashboard.md | 14 + .../src/content/docs/ru/reference/cli.md | 11 + .../docs/zh-cn/guides/web-dashboard.md | 14 + .../src/content/docs/zh-cn/reference/cli.md | 11 + gui/src/App.tsx | 4 + gui/src/app-routing.ts | 2 + gui/src/i18n/de.ts | 70 ++++ gui/src/i18n/en.ts | 70 ++++ gui/src/i18n/ja.ts | 70 ++++ gui/src/i18n/ko.ts | 70 ++++ gui/src/i18n/ru.ts | 70 ++++ gui/src/i18n/zh.ts | 70 ++++ gui/src/pages/Remote.tsx | 244 +++++++++++ gui/src/styles.css | 58 +++ gui/tests/remote-page.test.ts | 46 ++ platform/docs/IMPLEMENTATION_STATUS.md | 20 +- platform/docs/PRODUCTION_DEPLOYMENT.md | 10 +- .../server/migrations/0002_remote_devices.sql | 56 +++ platform/server/src/app.ts | 123 +++++- platform/server/src/auth.ts | 28 ++ platform/server/src/config.ts | 1 + platform/server/src/gateway.ts | 24 +- platform/server/src/security.ts | 2 +- platform/server/src/store.ts | 365 +++++++++++++++- .../server/tests/postgres-integration.test.ts | 97 ++++- platform/web/src/App.tsx | 119 +++++- platform/web/src/api.ts | 34 +- platform/web/src/styles.css | 19 + readme/README.ja.md | 8 + readme/README.ko.md | 8 + readme/README.ru.md | 9 + readme/README.zh-CN.md | 8 + src/cli/help.ts | 9 + src/cli/index.ts | 5 + src/cli/remote-command.ts | 103 +++++ src/remote/client.ts | 396 ++++++++++++++++++ src/server/management-api.ts | 2 + src/server/management/remote-routes.ts | 67 +++ structure/05_gui-and-management-api.md | 25 ++ structure/12_remote-platform.md | 21 +- structure/adr/0012-remote-private-mesh.md | 4 +- tests/cli-headless-parity.test.ts | 14 + tests/remote-client.test.ts | 141 +++++++ 50 files changed, 2596 insertions(+), 33 deletions(-) create mode 100644 gui/src/pages/Remote.tsx create mode 100644 gui/tests/remote-page.test.ts create mode 100644 platform/server/migrations/0002_remote_devices.sql create mode 100644 src/cli/remote-command.ts create mode 100644 src/remote/client.ts create mode 100644 src/server/management/remote-routes.ts create mode 100644 tests/remote-client.test.ts diff --git a/README.md b/README.md index 86b30f082..c3de09875 100644 --- a/README.md +++ b/README.md @@ -466,6 +466,14 @@ WebSocket transport is off by default. Set `"websockets": true` only if you want ### Remote access +The dashboard now has an invite-only **Remote** page for the central `opencodexpages.me` MVP. It starts +in local `ocx gui`: approve this PC with GitHub, set a separate Remote password, reserve a hostname, +and follow Tunnel/Agent provisioning. GitHub OAuth tokens are not stored or sent to the PC. The signed +privileged Linux helper installer and Windows/macOS helpers are not shipped yet, so this is not a +general release and **does not include Super Sync**. + +The LAN bind below is a separate, self-managed option and does not use the central Remote service. + By default opencodex binds to `127.0.0.1` (loopback) and requires no extra authentication. If you set `"hostname": "0.0.0.0"` to expose the proxy on the LAN, opencodex requires a bearer token to protect both the management API (`/api/*`) and the data-plane (`/v1/responses`, diff --git a/docs-site/src/content/docs/guides/web-dashboard.md b/docs-site/src/content/docs/guides/web-dashboard.md index 4e20b136b..b97dfd832 100644 --- a/docs-site/src/content/docs/guides/web-dashboard.md +++ b/docs-site/src/content/docs/guides/web-dashboard.md @@ -29,6 +29,21 @@ they expire or the proxy restarts. Only a dashboard bound to a non-loopback host the admin token (`OPENCODEX_ADMIN_AUTH_TOKEN`, or the auto-generated `~/.opencodex/admin-api-token` file). +## Remote private beta + +The **Remote** page makes the local `ocx gui` the start of remote setup: + +1. Continue with GitHub. `opencodexpages.me` handles OAuth and asks you to approve the device code. +2. Set a separate Remote password. GitHub OAuth tokens are not stored or sent to the local PC. +3. Choose a one-level `.opencodexpages.me` address. The central worker provisions an isolated + Cloudflare Tunnel and the page follows `pending`, `awaiting agent`, `connecting`, and `online`. +4. Pair the signed local helper. Visiting the assigned hostname later requires both the owning + GitHub account and the Remote password before the Gateway creates a host-only instance session. + +This is currently an invite-only Linux MVP. The privileged signed helper installer and Windows/macOS +helpers are not shipped in the npm package yet. The GUI reports that limitation instead of claiming +the Tunnel is online. **Super Sync is not part of this flow.** + ## What you can do | Area | What it does | @@ -43,6 +58,7 @@ the admin token (`OPENCODEX_ADMIN_AUTH_TOKEN`, or the auto-generated | **Providers** | Add, edit, enable/disable, and remove providers; manage OAuth account pools and API-key pools where supported. Provider Settings can disable live model discovery for endpoints with missing, slow, or oversized `/models` catalogs. For Claude (Anthropic) OAuth pools, each logged-in account shows its own 5-hour and weekly rate-limit bars (usage is per credential); a failed probe keeps the last-known bars and marks them unavailable until the next successful refresh. | | **Add provider** | Search registry-backed presets for account login, API-key services, local servers, or a custom endpoint. | | **Codex Auth** | Add ChatGPT/Codex pool accounts, select the next-session account, refresh 5h / weekly / 30d quotas, enable or disable quota auto-switch, set its 1–100% threshold, and configure transient-failure failover. | +| **Remote** | Connect this PC to the central GitHub identity service, set a separate access password, reserve its hostname, and follow Tunnel/Agent provisioning. | | **Subagents** | Feature up to five bare native or namespaced routed models in the `spawn_agent` override list. | | **Models** | Toggle native GPT and routed models, set provider allowlists and context caps, choose v1/base/v2, and configure the v2 thread limit. Configured providers stay visible as zero-model groups when discovery is off or returns no rows. | | **Logs** | Auto-refresh recent requests with tokens, requested effort and (when available) effective outbound effort, resolved model, provider, status, request id, duration, and error details. The detail view includes the exact reasoning wire field when the adapter emits one. Filter by opaque conversation/session id (when the client sends one) to total tokens and estimated list-price cost for the currently loaded Logs ring. | @@ -121,6 +137,8 @@ The GUI is a thin client over the proxy's JSON management API. Useful endpoints | Endpoint | Purpose | | --- | --- | | `GET` / `PUT /api/settings` | Read settings or toggle Codex autostart. | +| `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | Read local Remote state, start device approval, and set the separate access password without exposing device or GitHub tokens to the browser. | +| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Reserve the instance hostname, prepare one-time Agent pairing, or revoke this PC. | | `GET /api/startup-health` | Read secret-free routing, service, shim, and restart-safety diagnostics. | | `POST /api/startup-action` | Install the background service or Codex launcher shim through fixed, allowlisted actions. | | `GET` / `POST /api/windows-tray` | Read or change the Windows tray installation and visible-process state. POST accepts `install`, `start`, `stop`, or `uninstall`. | diff --git a/docs-site/src/content/docs/ja/guides/web-dashboard.md b/docs-site/src/content/docs/ja/guides/web-dashboard.md index 16a62950a..55a976b08 100644 --- a/docs-site/src/content/docs/ja/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ja/guides/web-dashboard.md @@ -21,6 +21,17 @@ ocx start bun run dev:gui ``` +## Remote プライベートベータ + +**Remote** ページでは、ローカルの `ocx gui` からリモート設定を始めます。 + +1. GitHub で続行します。`opencodexpages.me` が OAuth を処理し、デバイスコードの承認を求めます。 +2. GitHub パスワードとは別の Remote パスワードを設定します。GitHub OAuth トークンは保存せず、ローカル PC にも送りません。 +3. 1 階層の `<名前>.opencodexpages.me` を選びます。中央 worker が分離された Cloudflare Tunnel を作成し、GUI が `pending` から `online` まで追跡します。 +4. 署名済みローカルヘルパーをペアリングします。割り当て済みアドレスへアクセスする際は、所有者の GitHub アカウントと Remote パスワードを確認してから hostname 専用 session を作ります。 + +現在は招待制 Linux MVP です。管理者権限が必要な署名済み helper installer と Windows/macOS helper は npm パッケージにまだ含まれません。GUI はこの制限を隠しません。**Super Sync はこのフローに含まれません。** + ## できること | 領域 | 機能 | @@ -35,6 +46,7 @@ bun run dev:gui | **プロバイダー** | プロバイダーを追加、編集、有効化/無効化、削除し、対応する OAuth アカウントプールと API キープールを管理します。Claude(Anthropic)OAuth プールでは、ログイン済みの各アカウントに独自の 5 時間・週間レート制限バーが表示され(利用量は資格情報単位)、取得失敗時は直近の値を保持して一時利用不可と表示します。 | | **プロバイダー追加** | レジストリベースのプリセットからアカウントログイン、API キーサービス、ローカルサーバー、custom エンドポイントを検索します。 | | **Codex 認証** | ChatGPT/Codex プールアカウントを追加し、次回セッションアカウントを選び、5 時間 / 週間 / 30 日クォータを更新し、クォータ自動切り替えのオン/オフと 1~100% のしきい値、一時的失敗フェイルオーバーを設定します。 | +| **Remote** | この PC を中央 GitHub ID サービスへ接続し、別のアクセスパスワードと hostname を設定して Tunnel/Agent 状態を追跡します。 | | **サブエージェント** | `spawn_agent` オーバーライド一覧にネイティブまたはルーティングモデルを最大 5 つまで優先公開します。 | | **モデル** | ネイティブ GPT とルーティングモデルをオン/オフし、プロバイダー許可リストとコンテキスト上限、v1/base/v2、v2 スレッド数を設定します。 | | **ログ** | トークン、要求された強度と(利用可能な場合は)実際に送信された強度、実際のモデル、プロバイダー、状態、リクエスト ID、所要時間、エラー詳細を含む最近のリクエストを自動更新します。アダプターが reasoning パラメーターを送信した場合、詳細表示に正確な wire field も表示されます。 | @@ -98,6 +110,8 @@ GUI はプロキシの JSON 管理 API を使うシンクライアントです | エンドポイント | 用途 | --- | --- | | `GET` / `PUT /api/settings` | 設定を読むか Codex 自動起動をオン/オフします。 | +| `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | デバイス/GitHub トークンをブラウザへ公開せず、Remote 状態、デバイス承認、アクセスパスワードを管理します。 | +| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | hostname の予約、一回限りの Agent ペアリング、またはこの PC の失効を行います。 | | `GET /api/startup-health` | 秘密情報を含まないルーティング、サービス、shim、再起動安全性診断を読み取ります。 | | `GET` / `POST /api/windows-tray` | Windows トレイの導入・表示状態を読み取り、`install`、`start`、`stop`、`uninstall` を実行します。 | | `POST /api/sync` | 共有モデルカタログを再構築し Codex モデルキャッシュを古い状態としてマークします。 | diff --git a/docs-site/src/content/docs/ja/reference/cli.md b/docs-site/src/content/docs/ja/reference/cli.md index d54e2f63c..91ac4a0bd 100644 --- a/docs-site/src/content/docs/ja/reference/cli.md +++ b/docs-site/src/content/docs/ja/reference/cli.md @@ -329,6 +329,17 @@ ocx login xai ## ダッシュボード +### `ocx remote <サブコマンド>` + +ダッシュボードの **Remote** ページに対応する headless コマンドです。`status`、`link`、 +`activate --name <名前> --slug `、`pairing-code`、`disconnect --yes` を同じ local +management API で実行します。別の Remote パスワードは process argument や shell history +に残らないよう stdin から渡します。 + +```bash +printf '%s\n' 'long-remote-password' | ocx remote password +``` + ### `ocx gui` `http://localhost:` で [ウェブダッシュボード](/ja/guides/web-dashboard/) を開きます。 diff --git a/docs-site/src/content/docs/ko/guides/web-dashboard.md b/docs-site/src/content/docs/ko/guides/web-dashboard.md index b5ea350c9..75ee586b1 100644 --- a/docs-site/src/content/docs/ko/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ko/guides/web-dashboard.md @@ -21,6 +21,17 @@ ocx start bun run dev:gui ``` +## Remote 비공개 베타 + +**Remote** 페이지는 로컬 `ocx gui`에서 원격 설정을 시작합니다. + +1. GitHub로 계속합니다. `opencodexpages.me`가 OAuth를 처리하고 장치 코드를 승인받습니다. +2. GitHub 비밀번호와 별개의 Remote 비밀번호를 만듭니다. GitHub OAuth 토큰은 저장하거나 로컬 PC로 보내지 않습니다. +3. 한 단계 `<이름>.opencodexpages.me` 주소를 고릅니다. 중앙 worker가 격리된 Cloudflare Tunnel을 만들고 GUI가 `pending`부터 `online`까지 상태를 추적합니다. +4. 서명된 로컬 헬퍼를 페어링합니다. 이후 주소에 접속할 때는 소유 GitHub 계정과 Remote 비밀번호를 모두 확인한 뒤 hostname 전용 세션을 만듭니다. + +현재는 초대형 Linux MVP입니다. 관리자 권한이 필요한 서명된 헬퍼 installer와 Windows/macOS 헬퍼는 npm 패키지에 아직 포함되지 않습니다. GUI는 이 제한을 숨기지 않습니다. **Super Sync는 이 흐름의 범위가 아닙니다.** + ## 할 수 있는 일 | 영역 | 기능 | @@ -35,6 +46,7 @@ bun run dev:gui | **Providers** | 프로바이더를 추가, 편집, 활성화/비활성화, 제거하고, 지원되는 OAuth 계정 풀과 API key 풀을 관리합니다. Claude(Anthropic) OAuth 풀에서는 로그인한 계정마다 자체 5시간·주간 한도 막대가 표시되며(사용량은 자격 증명 단위), 조회 실패 시 마지막 값을 유지하고 일시 불가 상태로 표시합니다. | | **Add provider** | 레지스트리 기반 프리셋에서 계정 로그인, API key 서비스, 로컬 서버, custom endpoint를 검색합니다. | | **Codex Auth** | ChatGPT/Codex 풀 계정을 추가하고, 다음 세션 계정을 선택하고, 5시간 / 주간 / 30일 할당량을 갱신하며, 할당량 자동 전환을 켜거나 끄고 1~100% 임계값과 일시적 실패 failover를 설정합니다. | +| **Remote** | 이 PC를 중앙 GitHub 신원 서비스에 연결하고, 별도 접속 비밀번호와 hostname을 설정하고, Tunnel/Agent 상태를 확인합니다. | | **Subagents** | `spawn_agent` override 목록에 네이티브 또는 라우팅 모델을 최대 5개까지 우선 노출합니다. | | **Models** | 네이티브 GPT와 라우팅 모델을 켜고 끄고, 프로바이더 allowlist와 컨텍스트 상한, v1/base/v2, v2 thread 수를 설정합니다. | | **Logs** | 토큰, 요청한 강도와 (사용 가능한 경우) 실제 전송 강도, 실제 모델, 프로바이더, 상태, 요청 id, 소요 시간, 오류 상세가 포함된 최근 요청을 자동 갱신합니다. 어댑터가 reasoning 매개변수를 전송한 경우 상세 보기에 정확한 wire field도 표시됩니다. 클라이언트가 보낸 불투명 대화/세션 id로 필터하면 현재 로드된 Logs 링의 토큰·추정 정가 합계를 볼 수 있습니다. | @@ -100,6 +112,8 @@ GUI는 프록시의 JSON 관리 API를 사용하는 얇은 클라이언트입니 | 엔드포인트 | 용도 | | --- | --- | | `GET` / `PUT /api/settings` | 설정을 읽거나 Codex 자동 시작을 켜고 끕니다. | +| `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | 브라우저에 장치/GitHub 토큰을 노출하지 않고 로컬 Remote 상태를 읽고 장치 승인과 접속 비밀번호를 설정합니다. | +| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | hostname을 예약하고 일회용 Agent 페어링을 준비하거나 이 PC 연결을 해제합니다. | | `GET /api/startup-health` | 비밀값 없이 라우팅, 서비스, shim, 재부팅 안전성 진단을 읽습니다. | | `GET` / `POST /api/windows-tray` | Windows 트레이 설치 및 표시 상태를 읽거나 `install`, `start`, `stop`, `uninstall` 작업을 수행합니다. | | `POST /api/sync` | 공유 모델 카탈로그를 다시 만들고 Codex 모델 캐시를 오래된 상태로 표시합니다. | diff --git a/docs-site/src/content/docs/ko/reference/cli.md b/docs-site/src/content/docs/ko/reference/cli.md index db267493e..369b2c814 100644 --- a/docs-site/src/content/docs/ko/reference/cli.md +++ b/docs-site/src/content/docs/ko/reference/cli.md @@ -348,6 +348,17 @@ ocx login xai ## 대시보드 +### `ocx remote <하위 명령>` + +대시보드 **Remote** 페이지의 headless 대응 명령입니다. `status`는 보호된 로컬 상태를 읽고, +`link`는 GitHub 장치 승인을 시작하고, `activate --name <이름> --slug `는 hostname을 +예약하고, `pairing-code`는 10분 Agent 코드를 만들며, `disconnect --yes`는 이 PC를 해제합니다. +별도 비밀번호는 process argument나 shell history에 남지 않도록 stdin으로 전달합니다. + +```bash +printf '%s\n' '긴-리모트-비밀번호' | ocx remote password +``` + ### `ocx gui` `http://localhost:`에서 [웹 대시보드](/ko/guides/web-dashboard/)를 엽니다. diff --git a/docs-site/src/content/docs/reference/cli.md b/docs-site/src/content/docs/reference/cli.md index 1d37ba14b..9f043e316 100644 --- a/docs-site/src/content/docs/reference/cli.md +++ b/docs-site/src/content/docs/reference/cli.md @@ -409,6 +409,17 @@ Remove the stored OAuth credential for a provider. ## Dashboard +### `ocx remote ` + +Headless parity for the dashboard **Remote** page. `status` reads protected local state, `link` starts +GitHub device approval, `activate --name --slug ` reserves the hostname, +`pairing-code` creates a ten-minute Agent code, and `disconnect --yes` revokes this PC. Set the +separate password through stdin so it never appears in process arguments or shell history: + +```bash +printf '%s\n' 'a-long-remote-password' | ocx remote password +``` + ### `ocx gui` Open the [web dashboard](/guides/web-dashboard/) at `http://localhost:`, auto-starting diff --git a/docs-site/src/content/docs/ru/guides/web-dashboard.md b/docs-site/src/content/docs/ru/guides/web-dashboard.md index c9fde72ee..195bed9cc 100644 --- a/docs-site/src/content/docs/ru/guides/web-dashboard.md +++ b/docs-site/src/content/docs/ru/guides/web-dashboard.md @@ -21,6 +21,17 @@ ocx start bun run dev:gui ``` +## Закрытая бета Remote + +Настройка на странице **Remote** начинается в локальном `ocx gui`: + +1. Продолжите через GitHub. `opencodexpages.me` обрабатывает OAuth и просит подтвердить код устройства. +2. Задайте отдельный пароль Remote. OAuth-токены GitHub не сохраняются и не передаются на локальный ПК. +3. Выберите одноуровневый адрес `<имя>.opencodexpages.me`. Центральный worker создаёт изолированный Cloudflare Tunnel, а GUI отслеживает состояния от `pending` до `online`. +4. Свяжите подписанный локальный помощник. Позже перед созданием session только для этого hostname проверяются и аккаунт-владелец GitHub, и пароль Remote. + +Сейчас это пригласительный Linux MVP. Подписанный helper installer с правами администратора и помощники для Windows/macOS ещё не входят в npm-пакет; GUI явно показывает это ограничение. **Super Sync в этот поток не входит.** + ## Возможности | Раздел | Что делает | @@ -35,6 +46,7 @@ bun run dev:gui | **Providers** | Добавление, редактирование, включение/отключение и удаление провайдеров; управление пулами OAuth-аккаунтов и пулами API-ключей там, где они поддерживаются. Для пулов Claude (Anthropic) OAuth у каждого вошедшего аккаунта свои полосы 5-часового и недельного лимита (использование по учётным данным); при сбое опроса сохраняются последние известные значения с пометкой недоступности. | | **Add provider** | Поиск по пресетам из реестра: вход по аккаунту, сервисы с API-ключом, локальные серверы или пользовательская конечная точка. | | **Codex Auth** | Добавление аккаунтов пула ChatGPT/Codex, выбор аккаунта для следующей сессии, обновление квот 5 ч / недельных / 30-дневных, включение или отключение автопереключения, настройка его порога 1–100% и failover при временных сбоях. | +| **Remote** | Подключение ПК к центральной идентификации GitHub, отдельный пароль доступа и hostname, а также состояния Tunnel/Agent. | | **Subagents** | Выделение до пяти «голых» нативных или маршрутизируемых моделей с пространством имён в списке переопределений `spawn_agent`. | | **Models** | Включение и отключение нативных GPT и маршрутизируемых моделей, настройка списков разрешённых провайдеров и лимитов контекста, выбор v1/base/v2 и настройка лимита потоков v2. | | **Logs** | Автообновляемый список недавних запросов: токены, запрошенный и, когда доступен, фактически отправленный уровень рассуждений, фактическая модель, провайдер, статус, id запроса, длительность и подробности ошибок. Если адаптер отправляет параметр рассуждений, в подробностях также отображается точное wire-поле. Можно фильтровать по непрозрачному id диалога/сессии (если клиент его передаёт) и суммировать токены и оценочную стоимость по прайс-листу в пределах загруженного кольца Logs. | @@ -104,6 +116,8 @@ GUI — это тонкий клиент поверх JSON-API управлен | Эндпоинт | Назначение | | --- | --- | | `GET` / `PUT /api/settings` | Чтение настроек или переключение автозапуска Codex. | +| `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | Чтение состояния Remote, подтверждение устройства и настройка пароля без выдачи браузеру токенов устройства/GitHub. | +| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | Резервирование hostname, одноразовое сопряжение Agent или отзыв этого ПК. | | `GET /api/startup-health` | Чтение безопасной диагностики маршрутизации, службы, shim и устойчивости к перезагрузке. | | `GET` / `POST /api/windows-tray` | Чтение или изменение установки и видимости трея Windows; POST поддерживает `install`, `start`, `stop`, `uninstall`. | | `POST /api/sync` | Пересборка общего каталога моделей и инвалидация кэша моделей Codex. | diff --git a/docs-site/src/content/docs/ru/reference/cli.md b/docs-site/src/content/docs/ru/reference/cli.md index 0c1456354..c063e0e50 100644 --- a/docs-site/src/content/docs/ru/reference/cli.md +++ b/docs-site/src/content/docs/ru/reference/cli.md @@ -370,6 +370,17 @@ ocx login xai ## Дашборд +### `ocx remote <подкоманда>` + +Headless-эквивалент страницы **Remote**: `status` читает защищённое локальное состояние, `link` +запускает подтверждение GitHub, `activate --name <имя> --slug ` резервирует hostname, +`pairing-code` создаёт код Agent на 10 минут, а `disconnect --yes` отзывает этот ПК. Отдельный +пароль передаётся через stdin, чтобы не попадать в аргументы процесса и историю shell. + +```bash +printf '%s\n' 'long-remote-password' | ocx remote password +``` + ### `ocx gui` Открывает [веб-дашборд](/ru/guides/web-dashboard/) по адресу `http://localhost:`, diff --git a/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md b/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md index cac81c25c..5dbbbc6a6 100644 --- a/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md +++ b/docs-site/src/content/docs/zh-cn/guides/web-dashboard.md @@ -20,6 +20,17 @@ ocx start bun run dev:gui ``` +## Remote 私测 + +**Remote** 页面从本地 `ocx gui` 开始远程设置: + +1. 使用 GitHub 继续。`opencodexpages.me` 处理 OAuth 并要求确认设备码。 +2. 设置独立的 Remote 密码。GitHub OAuth token 不会保存,也不会发送到本地电脑。 +3. 选择一级 `<名称>.opencodexpages.me` 地址;中央 worker 创建隔离的 Cloudflare Tunnel,GUI 跟踪从 `pending` 到 `online` 的状态。 +4. 配对已签名的本地助手。以后访问该地址时,必须同时验证所属 GitHub 账号和 Remote 密码,Gateway 才会创建仅限该 hostname 的 session。 + +目前这是仅限邀请的 Linux MVP。需要管理员权限的签名助手 installer 及 Windows/macOS 助手尚未随 npm 包提供;GUI 会如实显示这一限制。**Super Sync 不属于此流程。** + ## 可以完成哪些操作 | 区域 | 作用 | @@ -34,6 +45,7 @@ bun run dev:gui | **Providers** | 添加、编辑、启用/禁用、删除 provider,并在支持时管理 OAuth 账号池和 API key 池。Claude(Anthropic)OAuth 池中,每个已登录账号显示各自的 5 小时与周限额条(用量按凭证计);探测失败时保留上次已知数值并标记为暂时不可用。 | | **Add provider** | 搜索 registry preset,选择账号登录、API key 服务、本地服务器或自定义 endpoint。 | | **Codex Auth** | 添加 ChatGPT/Codex 池账号,选择下一 session 的账号,刷新 5h / 每周 / 30d 配额,启用或停用配额自动切换,设置其 1–100% 阈值和临时故障 failover。 | +| **Remote** | 将此电脑连接到中央 GitHub 身份服务,设置独立访问密码和 hostname,并跟踪 Tunnel/Agent 状态。 | | **Subagents** | 在 `spawn_agent` override 列表中置顶最多五个原生或路由模型。 | | **Models** | 开关原生 GPT 与路由模型,配置 provider allowlist、上下文上限、v1/base/v2 以及 v2 thread 数量。 | | **Logs** | 自动刷新近期请求,显示 token、请求强度以及(可用时)实际发送强度、实际模型、provider、状态、request id、耗时和错误详情。适配器发送 reasoning 参数时,详情中还会显示准确的 wire field。可按不透明会话/对话 ID(客户端提供时)筛选,并对当前已加载的 Logs 环形缓冲合计 token 与估算标价成本。 | @@ -92,6 +104,8 @@ GUI 是代理 JSON 管理 API 之上的轻量客户端。常用 endpoint 包括 | Endpoint | 用途 | | --- | --- | | `GET` / `PUT /api/settings` | 读取设置或切换 Codex 自动启动。 | +| `GET /api/remote/status` · `POST /api/remote/link` · `PUT /api/remote/password` | 在不向浏览器暴露设备/GitHub token 的情况下读取 Remote 状态、开始设备批准并设置访问密码。 | +| `POST /api/remote/activate` · `POST /api/remote/pairing-code` · `DELETE /api/remote/device` | 保留 hostname、准备一次性 Agent 配对或撤销此电脑。 | | `GET /api/startup-health` | 读取不含秘密信息的路由、服务、shim 和重启安全诊断。 | | `GET` / `POST /api/windows-tray` | 读取或更改 Windows 托盘安装和显示状态;POST 支持 `install`、`start`、`stop`、`uninstall`。 | | `POST /api/sync` | 重建共享模型目录,并把 Codex 模型缓存标记为过期。 | diff --git a/docs-site/src/content/docs/zh-cn/reference/cli.md b/docs-site/src/content/docs/zh-cn/reference/cli.md index 4895752d3..dc7e87069 100644 --- a/docs-site/src/content/docs/zh-cn/reference/cli.md +++ b/docs-site/src/content/docs/zh-cn/reference/cli.md @@ -333,6 +333,17 @@ ocx login xai ## 仪表盘 +### `ocx remote <子命令>` + +这是仪表盘 **Remote** 页面的 headless 对应命令。`status` 读取受保护的本地状态,`link` 开始 +GitHub 设备批准,`activate --name <名称> --slug ` 保留 hostname,`pairing-code` 创建 +10 分钟 Agent 配对码,`disconnect --yes` 撤销此电脑。独立 Remote 密码从 stdin 读取,避免 +进入进程参数或 shell 历史。 + +```bash +printf '%s\n' 'long-remote-password' | ocx remote password +``` + ### `ocx gui` 在 `http://localhost:` 打开 [Web 仪表盘](/zh-cn/guides/web-dashboard/)。如果代理 diff --git a/gui/src/App.tsx b/gui/src/App.tsx index d60e839b8..52b012641 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -13,6 +13,7 @@ import ApiKeys from "./pages/ApiKeys"; import Claude from "./pages/Claude"; import Grok from "./pages/Grok"; import Startup from "./pages/Startup"; +import Remote from "./pages/Remote"; import ErrorBoundary from "./components/ErrorBoundary"; import { IconGrid, IconServer, IconBoxes, IconBot, IconList, IconActivity, IconHardDrive, IconKey, IconGithub, IconMenu, IconSun, IconMoon, IconMonitor, IconGlobe, IconPower, IconSparkle, IconX } from "./icons"; import { useI18n, useT, LOCALES, type Locale, type TKey } from "./i18n/shared"; @@ -30,6 +31,7 @@ type Theme = "light" | "dark" | "system"; const PAGE_TKEY: Record = { dashboard: "nav.dashboard", startup: "nav.startup", + remote: "nav.remote", providers: "nav.providers", models: "nav.models", combos: "nav.combos", @@ -49,6 +51,7 @@ const THEME_KEY = "ocx-theme"; const NAV: { id: Page; tkey: TKey; Icon: typeof IconGrid }[] = [ { id: "dashboard", tkey: "nav.dashboard", Icon: IconGrid }, { id: "codex-auth", tkey: "nav.codexAuth", Icon: IconKey }, + { id: "remote", tkey: "nav.remote", Icon: IconGlobe }, { id: "providers", tkey: "nav.providers", Icon: IconServer }, { id: "models", tkey: "nav.models", Icon: IconBoxes }, { id: "subagents", tkey: "nav.subagents", Icon: IconBot }, @@ -297,6 +300,7 @@ export default function App() { reloadLabel={t("errorBoundary.reload")} > {page === "dashboard" && } + {page === "remote" && } {page === "startup" && } {page === "providers" && } {page === "models" && } diff --git a/gui/src/app-routing.ts b/gui/src/app-routing.ts index bb03f96a8..e10e3e310 100644 --- a/gui/src/app-routing.ts +++ b/gui/src/app-routing.ts @@ -5,6 +5,7 @@ import { normalizeHashPath } from "./hash-routing"; export type Page = | "dashboard" | "startup" + | "remote" | "providers" | "models" | "combos" @@ -20,6 +21,7 @@ export type Page = export const VALID_PAGES = new Set([ "dashboard", "startup", + "remote", "providers", "models", "combos", diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 0bdf617d1..432399402 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -4,6 +4,7 @@ import type { TKey } from "./en"; export const de: Record = { "nav.dashboard": "Übersicht", "nav.startup": "Startsicherheit", + "nav.remote": "Remote", "nav.providers": "Anbieter", "nav.models": "Modelle", "nav.combos": "Combos", @@ -18,6 +19,75 @@ export const de: Record = { "common.remove": "Entfernen", "common.loading": "Lädt…", "common.retry": "Wiederholen", + "remote.title": "Remote", + "remote.subtitle": "Dieses OpenCodex mit deinem Konto verbinden und die lokale GUI über einen privaten Cloudflare Tunnel erreichen.", + "remote.refresh": "Remote-Status aktualisieren", + "remote.progressLabel": "Remote-Einrichtung", + "remote.stepAccount": "GitHub-Konto", + "remote.stepPassword": "Zugriffspasswort", + "remote.stepTunnel": "Tunnel", + "remote.loading": "Remote-Status wird geladen…", + "remote.loadFailed": "Remote-Status konnte nicht geladen werden.", + "remote.signedOutTitle": "Diesen Computer verbinden", + "remote.signedOutBody": "Die Anmeldung läuft über den OpenCodex-Dienst. GitHub bestätigt nur deine Identität; dieses lokale OCX erhält nur einen OpenCodex-Gerätenachweis.", + "remote.signIn": "Mit GitHub fortfahren", + "remote.starting": "Wird gestartet…", + "remote.identityTitle": "Identität bleibt zentral", + "remote.identityBody": "Der Dienst verarbeitet GitHub OAuth und sendet dein GitHub-Token nie an diesen Computer.", + "remote.deviceTitle": "Eigener Nachweis pro Gerät", + "remote.deviceBody": "Dieses OCX erstellt einen eigenen Geräteschlüssel und kann einzeln widerrufen werden.", + "remote.tunnelTitle": "Kein eingehender Port", + "remote.tunnelBody": "Remote-Verkehr läuft durch Cloudflare Tunnel, ohne dein Heim- oder Büronetz offenzulegen.", + "remote.startFailed": "GitHub-Anmeldung konnte nicht gestartet werden.", + "remote.cancelFailed": "Geräteanmeldung konnte nicht abgebrochen werden.", + "remote.pendingTitle": "Diesen Computer im Browser bestätigen", + "remote.pendingBody": "Schließe die GitHub-Anmeldung auf opencodexpages.me ab und vergleiche den angezeigten Code.", + "remote.codeLabel": "Gerätecode", + "remote.openBrowser": "Anmeldeseite öffnen", + "remote.waiting": "Warten auf Browser-Bestätigung…", + "remote.connectedAs": "Verbunden als", + "remote.passwordTitle": "Remote-Zugriffspasswort erstellen", + "remote.passwordBody": "Dieses Passwort schützt den Browserzugriff und ist von deinem GitHub-Passwort getrennt.", + "remote.passwordLabel": "Remote-Passwort", + "remote.passwordConfirm": "Passwort bestätigen", + "remote.passwordLength": "Mindestens 10 Zeichen verwenden.", + "remote.passwordMismatch": "Die Passwörter stimmen nicht überein.", + "remote.passwordFailed": "Remote-Passwort konnte nicht gespeichert werden.", + "remote.savePassword": "Remote-Passwort speichern", + "remote.accountReadyTitle": "Konto und Gerät sind bereit", + "remote.accountReadyBody": "GitHub-Identität, dieser Computer und das Remote-Passwort sind verbunden.", + "remote.connectorNext": "Als Nächstes: den signierten OCX-Connector starten und diesem Computer eine opencodexpages.me-Adresse zuweisen.", + "remote.privateBetaTitle": "Privater Beta-Zugang erforderlich", + "remote.privateBetaBody": "Das Konto ist verbunden, aber Remote kann auf diesem Server nur mit Einladung aktiviert werden.", + "remote.domainTitle": "Adresse dieses Computers wählen", + "remote.domainBody": "OpenCodex erstellt den privaten Tunnel und reserviert eine opencodexpages.me-Adresse für diesen PC.", + "remote.deviceNameLabel": "Computername", + "remote.deviceNamePlaceholder": "Heim-PC", + "remote.domainLabel": "Remote-Adresse", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "Nur Kleinbuchstaben, Zahlen und Bindestriche verwenden.", + "remote.activateFailed": "Remote konnte für diesen Computer nicht aktiviert werden.", + "remote.activating": "Adresse wird reserviert…", + "remote.activate": "Remote aktivieren", + "remote.provisioningTitle": "Privater Tunnel wird erstellt", + "remote.provisioningBody": "Der zentrale Dienst reserviert die Adresse und erstellt isolierte Cloudflare-Ressourcen.", + "remote.connectorTitle": "Lokalen Helfer verbinden", + "remote.connectorBody": "Die Adresse ist bereit. Jetzt den signierten Linux-Helfer koppeln.", + "remote.pairingCode": "Einmaliger Kopplungscode", + "remote.pairingFailed": "Connector-Kopplung konnte nicht vorbereitet werden.", + "remote.preparingConnector": "Wird vorbereitet…", + "remote.prepareConnector": "Connector vorbereiten", + "remote.connectorRequirement": "Das private MVP benötigt den signierten Linux-Helfer mit Administratorfreigabe. Windows und macOS werden noch nicht ausgeliefert.", + "remote.connectingTitle": "Computer wird verbunden", + "remote.connectingBody": "Der Helfer ist gekoppelt. OpenCodex-, Agent-, Tunnel- und Gateway-Prüfungen laufen.", + "remote.readyTitle": "Remote ist online", + "remote.readyBody": "Die lokale OpenCodex-GUI ist über die authentifizierte Adresse erreichbar.", + "remote.openRemote": "Remote-GUI öffnen", + "remote.unavailableTitle": "Remote benötigt Aufmerksamkeit", + "remote.unavailableBody": "Die Instanz ist angehalten oder konnte nicht bereitgestellt werden.", + "remote.disconnect": "Trennen", + "remote.disconnectConfirm": "Diesen Computer von OpenCodex Remote trennen?", + "remote.disconnectFailed": "Dieses Gerät konnte nicht widerrufen werden.", "theme.label": "Design", "theme.light": "Hell", "theme.dark": "Dunkel", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 07a75a705..e0cd20c73 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -4,6 +4,7 @@ export const en = { // sidebar / nav / common "nav.dashboard": "Dashboard", "nav.startup": "Startup", + "nav.remote": "Remote", "nav.providers": "Providers", "nav.models": "Models", "nav.combos": "Combos", @@ -20,6 +21,75 @@ export const en = { "common.remove": "Remove", "common.loading": "Loading…", "common.retry": "Retry", + "remote.title": "Remote", + "remote.subtitle": "Connect this OpenCodex installation to your account, then reach its local GUI through a private Cloudflare Tunnel.", + "remote.refresh": "Refresh Remote status", + "remote.progressLabel": "Remote setup progress", + "remote.stepAccount": "GitHub account", + "remote.stepPassword": "Access password", + "remote.stepTunnel": "Tunnel", + "remote.loading": "Loading Remote status…", + "remote.loadFailed": "Could not load Remote status.", + "remote.signedOutTitle": "Connect this computer", + "remote.signedOutBody": "Sign in through the OpenCodex service. GitHub verifies your identity; this local OCX receives only an OpenCodex device credential.", + "remote.signIn": "Continue with GitHub", + "remote.starting": "Starting…", + "remote.identityTitle": "Identity stays central", + "remote.identityBody": "The service handles GitHub OAuth and never sends your GitHub token to this computer.", + "remote.deviceTitle": "One credential per device", + "remote.deviceBody": "This OCX creates its own device key and can be revoked without signing out your other computers.", + "remote.tunnelTitle": "No inbound port", + "remote.tunnelBody": "Remote traffic will enter through Cloudflare Tunnel instead of exposing your home or office network.", + "remote.startFailed": "Could not start GitHub sign-in.", + "remote.cancelFailed": "Could not cancel device sign-in.", + "remote.pendingTitle": "Approve this computer in your browser", + "remote.pendingBody": "Finish GitHub sign-in on opencodexpages.me and confirm that the code shown there matches this local code.", + "remote.codeLabel": "Device code", + "remote.openBrowser": "Open sign-in page", + "remote.waiting": "Waiting for browser approval…", + "remote.connectedAs": "Connected as", + "remote.passwordTitle": "Create a Remote access password", + "remote.passwordBody": "This password protects remote browser access and is separate from your GitHub password.", + "remote.passwordLabel": "Remote password", + "remote.passwordConfirm": "Confirm password", + "remote.passwordLength": "Use at least 10 characters.", + "remote.passwordMismatch": "The passwords do not match.", + "remote.passwordFailed": "Could not save the Remote password.", + "remote.savePassword": "Save Remote password", + "remote.accountReadyTitle": "Account and device are ready", + "remote.accountReadyBody": "GitHub identity, this computer, and the Remote access password are connected.", + "remote.connectorNext": "Next: install and start the signed OCX connector, then assign this computer its opencodexpages.me address.", + "remote.privateBetaTitle": "Private beta access required", + "remote.privateBetaBody": "This account is connected, but Remote activation is still invite-only on this server.", + "remote.domainTitle": "Choose this computer's address", + "remote.domainBody": "OpenCodex will provision the private Tunnel and reserve one opencodexpages.me address for this PC.", + "remote.deviceNameLabel": "Computer name", + "remote.deviceNamePlaceholder": "Home PC", + "remote.domainLabel": "Remote address", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "Use lowercase letters, numbers, and hyphens for the address.", + "remote.activateFailed": "Could not activate Remote for this computer.", + "remote.activating": "Reserving address…", + "remote.activate": "Enable Remote", + "remote.provisioningTitle": "Creating the private Tunnel", + "remote.provisioningBody": "The central service is reserving the address and creating this PC's isolated Cloudflare resources.", + "remote.connectorTitle": "Connect the local helper", + "remote.connectorBody": "The address is ready. Pair the signed Linux helper that keeps the local OCX and Cloudflare Tunnel connected.", + "remote.pairingCode": "One-time pairing code", + "remote.pairingFailed": "Could not prepare connector pairing.", + "remote.preparingConnector": "Preparing…", + "remote.prepareConnector": "Prepare connector", + "remote.connectorRequirement": "Current private MVP: the signed Linux helper must be installed with administrator approval. Windows and macOS helpers are not shipped yet.", + "remote.connectingTitle": "Connecting this computer", + "remote.connectingBody": "The helper is paired. Waiting for the local OCX, Agent, Tunnel, and Gateway checks to pass.", + "remote.readyTitle": "Remote is online", + "remote.readyBody": "This computer's local OpenCodex GUI is available through its authenticated address.", + "remote.openRemote": "Open Remote GUI", + "remote.unavailableTitle": "Remote needs attention", + "remote.unavailableBody": "This instance is suspended or could not be provisioned. Refresh the status or contact the operator.", + "remote.disconnect": "Disconnect", + "remote.disconnectConfirm": "Disconnect this computer from OpenCodex Remote?", + "remote.disconnectFailed": "Could not revoke this device.", "app.logoAria": "opencodex logo", "app.claudeOn": "Claude ON", "app.claudeOff": "Claude OFF", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 1501e2d08..9d2ea550f 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -4,6 +4,7 @@ export const ja: Record = { // sidebar / nav / common "nav.dashboard": "ダッシュボード", "nav.startup": "起動安全性", + "nav.remote": "リモート", "nav.providers": "プロバイダー", "nav.models": "モデル", "nav.combos": "コンボ", @@ -20,6 +21,75 @@ export const ja: Record = { "common.remove": "削除", "common.loading": "読み込み中…", "common.retry": "再試行", + "remote.title": "リモート", + "remote.subtitle": "この OpenCodex をアカウントに接続し、ローカル GUI へ非公開 Cloudflare Tunnel 経由でアクセスします。", + "remote.refresh": "リモート状態を更新", + "remote.progressLabel": "リモート設定の進行状況", + "remote.stepAccount": "GitHub アカウント", + "remote.stepPassword": "アクセスパスワード", + "remote.stepTunnel": "トンネル", + "remote.loading": "リモート状態を読み込み中…", + "remote.loadFailed": "リモート状態を読み込めませんでした。", + "remote.signedOutTitle": "このコンピューターを接続", + "remote.signedOutBody": "OpenCodex サービス経由でログインします。GitHub は本人確認のみを行い、ローカル OCX には OpenCodex のデバイス資格情報だけが渡されます。", + "remote.signIn": "GitHub で続行", + "remote.starting": "開始中…", + "remote.identityTitle": "本人確認は中央で処理", + "remote.identityBody": "サービスが GitHub OAuth を処理し、GitHub トークンをこの PC へ送りません。", + "remote.deviceTitle": "デバイスごとの資格情報", + "remote.deviceBody": "この OCX は固有のデバイスキーを作成し、他の PC に影響せず個別に解除できます。", + "remote.tunnelTitle": "受信ポート不要", + "remote.tunnelBody": "自宅や社内ネットワークを公開せず、Cloudflare Tunnel でリモート通信を受けます。", + "remote.startFailed": "GitHub ログインを開始できませんでした。", + "remote.cancelFailed": "デバイスログインをキャンセルできませんでした。", + "remote.pendingTitle": "ブラウザーでこの PC を承認してください", + "remote.pendingBody": "opencodexpages.me で GitHub ログインを完了し、表示コードが下のコードと一致することを確認してください。", + "remote.codeLabel": "デバイスコード", + "remote.openBrowser": "ログインページを開く", + "remote.waiting": "ブラウザーの承認を待っています…", + "remote.connectedAs": "接続中のアカウント", + "remote.passwordTitle": "リモートアクセス用パスワードを作成", + "remote.passwordBody": "このパスワードはリモートブラウザーアクセス用で、GitHub パスワードとは別です。", + "remote.passwordLabel": "リモートパスワード", + "remote.passwordConfirm": "パスワードの確認", + "remote.passwordLength": "10 文字以上で入力してください。", + "remote.passwordMismatch": "パスワードが一致しません。", + "remote.passwordFailed": "リモートパスワードを保存できませんでした。", + "remote.savePassword": "リモートパスワードを保存", + "remote.accountReadyTitle": "アカウントとデバイスの準備ができました", + "remote.accountReadyBody": "GitHub の本人確認、この PC、リモートアクセス用パスワードが接続されました。", + "remote.connectorNext": "次の手順: 署名済み OCX コネクターを起動し、この PC に opencodexpages.me アドレスを割り当てます。", + "remote.privateBetaTitle": "プライベートベータの承認が必要です", + "remote.privateBetaBody": "アカウントは接続済みですが、このサーバーでは招待されたアカウントのみ Remote を有効化できます。", + "remote.domainTitle": "このコンピューターのアドレスを選択", + "remote.domainBody": "OpenCodex が専用のプライベート Tunnel と opencodexpages.me アドレスを作成します。", + "remote.deviceNameLabel": "コンピューター名", + "remote.deviceNamePlaceholder": "自宅 PC", + "remote.domainLabel": "Remote アドレス", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "小文字、数字、ハイフンのみ使用できます。", + "remote.activateFailed": "このコンピューターの Remote を有効化できませんでした。", + "remote.activating": "アドレスを予約中…", + "remote.activate": "Remote を有効化", + "remote.provisioningTitle": "プライベート Tunnel を作成中", + "remote.provisioningBody": "中央サービスがアドレスと専用 Cloudflare リソースを作成しています。", + "remote.connectorTitle": "ローカルヘルパーを接続", + "remote.connectorBody": "アドレスの準備ができました。署名済み Linux ヘルパーをペアリングしてください。", + "remote.pairingCode": "一回限りのペアリングコード", + "remote.pairingFailed": "コネクターのペアリングを準備できませんでした。", + "remote.preparingConnector": "準備中…", + "remote.prepareConnector": "コネクターを準備", + "remote.connectorRequirement": "現在のプライベート MVP は管理者承認で Linux ヘルパーをインストールする必要があります。Windows/macOS 版は未提供です。", + "remote.connectingTitle": "このコンピューターを接続中", + "remote.connectingBody": "ヘルパーはペアリング済みです。OCX、Agent、Tunnel、Gateway の確認を待っています。", + "remote.readyTitle": "Remote はオンラインです", + "remote.readyBody": "認証済みアドレスからローカル OpenCodex GUI にアクセスできます。", + "remote.openRemote": "Remote GUI を開く", + "remote.unavailableTitle": "Remote の確認が必要です", + "remote.unavailableBody": "インスタンスが停止中か、プロビジョニングに失敗しました。", + "remote.disconnect": "接続解除", + "remote.disconnectConfirm": "この PC を OpenCodex Remote から切断しますか?", + "remote.disconnectFailed": "このデバイスを解除できませんでした。", "app.logoAria": "opencodex ロゴ", "app.claudeOn": "Claude オン", "app.claudeOff": "Claude オフ", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index b2589b6f0..faa01d7db 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -4,6 +4,7 @@ export const ko: Record = { // sidebar / nav / common "nav.dashboard": "대시보드", "nav.startup": "시작 안전성", + "nav.remote": "리모트", "nav.providers": "프로바이더", "nav.models": "모델", "nav.combos": "콤보", @@ -18,6 +19,75 @@ export const ko: Record = { "common.remove": "삭제", "common.loading": "불러오는 중…", "common.retry": "재시도", + "remote.title": "리모트", + "remote.subtitle": "이 컴퓨터의 OpenCodex를 계정에 연결하고, 로컬 GUI를 비공개 Cloudflare Tunnel로 접속합니다.", + "remote.refresh": "리모트 상태 새로고침", + "remote.progressLabel": "리모트 설정 진행 상태", + "remote.stepAccount": "GitHub 계정", + "remote.stepPassword": "접속 비밀번호", + "remote.stepTunnel": "터널", + "remote.loading": "리모트 상태를 불러오는 중…", + "remote.loadFailed": "리모트 상태를 불러오지 못했습니다.", + "remote.signedOutTitle": "이 컴퓨터 연결", + "remote.signedOutBody": "OpenCodex 서비스를 통해 로그인합니다. GitHub는 신원만 확인하며, 이 로컬 OCX에는 OpenCodex 장치 자격증명만 전달됩니다.", + "remote.signIn": "GitHub로 계속", + "remote.starting": "시작 중…", + "remote.identityTitle": "신원 처리는 중앙에서", + "remote.identityBody": "서버가 GitHub OAuth를 처리하며 GitHub 토큰은 이 컴퓨터로 전달하지 않습니다.", + "remote.deviceTitle": "컴퓨터별 자격증명", + "remote.deviceBody": "각 OCX가 자체 장치 키를 만들기 때문에 다른 컴퓨터의 로그인을 유지한 채 이 장치만 해제할 수 있습니다.", + "remote.tunnelTitle": "인바운드 포트 불필요", + "remote.tunnelBody": "집이나 사무실 네트워크를 직접 노출하지 않고 Cloudflare Tunnel로 원격 트래픽을 받습니다.", + "remote.startFailed": "GitHub 로그인을 시작하지 못했습니다.", + "remote.cancelFailed": "장치 로그인을 취소하지 못했습니다.", + "remote.pendingTitle": "브라우저에서 이 컴퓨터를 승인하세요", + "remote.pendingBody": "opencodexpages.me에서 GitHub 로그인을 마치고 사이트의 코드가 아래 로컬 코드와 같은지 확인하세요.", + "remote.codeLabel": "장치 코드", + "remote.openBrowser": "로그인 페이지 열기", + "remote.waiting": "브라우저 승인을 기다리는 중…", + "remote.connectedAs": "연결된 계정", + "remote.passwordTitle": "리모트 접속 비밀번호 만들기", + "remote.passwordBody": "이 비밀번호는 원격 브라우저 접속을 보호하며 GitHub 비밀번호와는 별개입니다.", + "remote.passwordLabel": "리모트 비밀번호", + "remote.passwordConfirm": "비밀번호 확인", + "remote.passwordLength": "10자 이상 입력하세요.", + "remote.passwordMismatch": "비밀번호가 일치하지 않습니다.", + "remote.passwordFailed": "리모트 비밀번호를 저장하지 못했습니다.", + "remote.savePassword": "리모트 비밀번호 저장", + "remote.accountReadyTitle": "계정과 이 컴퓨터가 준비됐습니다", + "remote.accountReadyBody": "GitHub 신원, 이 컴퓨터, 리모트 접속 비밀번호 연결이 완료됐습니다.", + "remote.connectorNext": "다음 단계: 서명된 OCX 커넥터를 설치·실행하고 이 컴퓨터에 opencodexpages.me 주소를 할당합니다.", + "remote.privateBetaTitle": "비공개 베타 승인이 필요합니다", + "remote.privateBetaBody": "계정 연결은 끝났지만 현재 서버는 초대받은 계정만 리모트를 활성화할 수 있습니다.", + "remote.domainTitle": "이 컴퓨터의 주소 선택", + "remote.domainBody": "OpenCodex가 이 PC 전용 비공개 터널을 만들고 opencodexpages.me 주소 하나를 예약합니다.", + "remote.deviceNameLabel": "컴퓨터 이름", + "remote.deviceNamePlaceholder": "집 PC", + "remote.domainLabel": "리모트 주소", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "주소에는 영문 소문자, 숫자, 하이픈만 사용할 수 있습니다.", + "remote.activateFailed": "이 컴퓨터의 리모트를 활성화하지 못했습니다.", + "remote.activating": "주소 예약 중…", + "remote.activate": "리모트 활성화", + "remote.provisioningTitle": "비공개 터널 생성 중", + "remote.provisioningBody": "중앙 서버가 주소를 예약하고 이 PC 전용 Cloudflare 리소스를 만들고 있습니다.", + "remote.connectorTitle": "로컬 헬퍼 연결", + "remote.connectorBody": "주소 준비가 끝났습니다. 로컬 OCX와 Cloudflare Tunnel을 유지하는 서명된 Linux 헬퍼를 페어링하세요.", + "remote.pairingCode": "일회용 페어링 코드", + "remote.pairingFailed": "커넥터 페어링을 준비하지 못했습니다.", + "remote.preparingConnector": "준비 중…", + "remote.prepareConnector": "커넥터 준비", + "remote.connectorRequirement": "현재 비공개 MVP는 관리자 승인을 받아 서명된 Linux 헬퍼를 설치해야 합니다. Windows와 macOS 헬퍼는 아직 배포하지 않습니다.", + "remote.connectingTitle": "이 컴퓨터 연결 중", + "remote.connectingBody": "헬퍼 페어링이 끝났습니다. 로컬 OCX, Agent, Tunnel, Gateway 검사를 기다리고 있습니다.", + "remote.readyTitle": "리모트 온라인", + "remote.readyBody": "이 컴퓨터의 로컬 OpenCodex GUI를 인증된 주소로 접속할 수 있습니다.", + "remote.openRemote": "리모트 GUI 열기", + "remote.unavailableTitle": "리모트 확인 필요", + "remote.unavailableBody": "인스턴스가 정지됐거나 프로비저닝에 실패했습니다. 상태를 새로고침하거나 운영자에게 문의하세요.", + "remote.disconnect": "연결 해제", + "remote.disconnectConfirm": "이 컴퓨터의 OpenCodex Remote 연결을 해제할까요?", + "remote.disconnectFailed": "이 장치를 해제하지 못했습니다.", "theme.label": "테마", "theme.light": "라이트", "theme.dark": "다크", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 9a21fcae7..3440c6c93 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -4,6 +4,7 @@ export const ru: Record = { // sidebar / nav / common "nav.dashboard": "Дашборд", "nav.startup": "Безопасность запуска", + "nav.remote": "Удалённый доступ", "nav.providers": "Провайдеры", "nav.models": "Модели", "nav.combos": "Комбо", @@ -20,6 +21,75 @@ export const ru: Record = { "common.remove": "Удалить", "common.loading": "Загрузка…", "common.retry": "Повторить", + "remote.title": "Удалённый доступ", + "remote.subtitle": "Подключите этот OpenCodex к аккаунту и открывайте локальный GUI через приватный Cloudflare Tunnel.", + "remote.refresh": "Обновить состояние Remote", + "remote.progressLabel": "Настройка удалённого доступа", + "remote.stepAccount": "Аккаунт GitHub", + "remote.stepPassword": "Пароль доступа", + "remote.stepTunnel": "Туннель", + "remote.loading": "Загрузка состояния Remote…", + "remote.loadFailed": "Не удалось загрузить состояние Remote.", + "remote.signedOutTitle": "Подключить этот компьютер", + "remote.signedOutBody": "Вход выполняется через сервис OpenCodex. GitHub подтверждает личность, а локальный OCX получает только учётные данные устройства OpenCodex.", + "remote.signIn": "Продолжить через GitHub", + "remote.starting": "Запуск…", + "remote.identityTitle": "Идентификация на центральном сервере", + "remote.identityBody": "Сервис обрабатывает GitHub OAuth и не отправляет токен GitHub на этот компьютер.", + "remote.deviceTitle": "Отдельные данные для устройства", + "remote.deviceBody": "Этот OCX создаёт собственный ключ устройства, который можно отозвать отдельно.", + "remote.tunnelTitle": "Без входящего порта", + "remote.tunnelBody": "Трафик идёт через Cloudflare Tunnel без публикации домашней или офисной сети.", + "remote.startFailed": "Не удалось начать вход через GitHub.", + "remote.cancelFailed": "Не удалось отменить вход устройства.", + "remote.pendingTitle": "Подтвердите компьютер в браузере", + "remote.pendingBody": "Завершите вход GitHub на opencodexpages.me и сравните показанный там код с локальным.", + "remote.codeLabel": "Код устройства", + "remote.openBrowser": "Открыть страницу входа", + "remote.waiting": "Ожидание подтверждения в браузере…", + "remote.connectedAs": "Подключено как", + "remote.passwordTitle": "Создайте пароль удалённого доступа", + "remote.passwordBody": "Этот пароль защищает доступ из браузера и отделён от пароля GitHub.", + "remote.passwordLabel": "Пароль Remote", + "remote.passwordConfirm": "Подтвердите пароль", + "remote.passwordLength": "Используйте не менее 10 символов.", + "remote.passwordMismatch": "Пароли не совпадают.", + "remote.passwordFailed": "Не удалось сохранить пароль Remote.", + "remote.savePassword": "Сохранить пароль Remote", + "remote.accountReadyTitle": "Аккаунт и устройство готовы", + "remote.accountReadyBody": "GitHub, этот компьютер и пароль удалённого доступа подключены.", + "remote.connectorNext": "Далее: запустить подписанный коннектор OCX и назначить компьютеру адрес opencodexpages.me.", + "remote.privateBetaTitle": "Нужен доступ к закрытой бете", + "remote.privateBetaBody": "Аккаунт подключен, но активация Remote на этом сервере доступна только по приглашению.", + "remote.domainTitle": "Выберите адрес компьютера", + "remote.domainBody": "OpenCodex создаст приватный Tunnel и зарезервирует адрес opencodexpages.me для этого ПК.", + "remote.deviceNameLabel": "Имя компьютера", + "remote.deviceNamePlaceholder": "Домашний ПК", + "remote.domainLabel": "Remote-адрес", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "Используйте строчные буквы, цифры и дефисы.", + "remote.activateFailed": "Не удалось активировать Remote для этого компьютера.", + "remote.activating": "Резервирование адреса…", + "remote.activate": "Включить Remote", + "remote.provisioningTitle": "Создание приватного Tunnel", + "remote.provisioningBody": "Центральный сервис резервирует адрес и создаёт изолированные ресурсы Cloudflare.", + "remote.connectorTitle": "Подключите локальный помощник", + "remote.connectorBody": "Адрес готов. Выполните сопряжение подписанного Linux-помощника.", + "remote.pairingCode": "Одноразовый код сопряжения", + "remote.pairingFailed": "Не удалось подготовить сопряжение коннектора.", + "remote.preparingConnector": "Подготовка…", + "remote.prepareConnector": "Подготовить коннектор", + "remote.connectorRequirement": "Закрытый MVP требует установки подписанного Linux-помощника с правами администратора. Windows и macOS пока не поставляются.", + "remote.connectingTitle": "Подключение компьютера", + "remote.connectingBody": "Помощник сопряжён. Ожидаются проверки OCX, Agent, Tunnel и Gateway.", + "remote.readyTitle": "Remote в сети", + "remote.readyBody": "Локальный OpenCodex GUI доступен через защищённый адрес.", + "remote.openRemote": "Открыть Remote GUI", + "remote.unavailableTitle": "Remote требует внимания", + "remote.unavailableBody": "Инстанс остановлен или не удалось завершить подготовку.", + "remote.disconnect": "Отключить", + "remote.disconnectConfirm": "Отключить этот компьютер от OpenCodex Remote?", + "remote.disconnectFailed": "Не удалось отозвать это устройство.", "app.logoAria": "Логотип opencodex", "app.claudeOn": "Claude ВКЛ", "app.claudeOff": "Claude ВЫКЛ", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 1ccd0f8a0..bfb606ec0 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -4,6 +4,7 @@ export const zh: Record = { // sidebar / nav / common "nav.dashboard": "仪表盘", "nav.startup": "启动安全", + "nav.remote": "远程", "nav.providers": "提供方", "nav.models": "模型", "nav.combos": "组合", @@ -18,6 +19,75 @@ export const zh: Record = { "common.remove": "移除", "common.loading": "加载中…", "common.retry": "重试", + "remote.title": "远程", + "remote.subtitle": "将此 OpenCodex 连接到你的账户,并通过私有 Cloudflare Tunnel 访问本地 GUI。", + "remote.refresh": "刷新远程状态", + "remote.progressLabel": "远程设置进度", + "remote.stepAccount": "GitHub 账户", + "remote.stepPassword": "访问密码", + "remote.stepTunnel": "隧道", + "remote.loading": "正在加载远程状态…", + "remote.loadFailed": "无法加载远程状态。", + "remote.signedOutTitle": "连接此电脑", + "remote.signedOutBody": "通过 OpenCodex 服务登录。GitHub 仅验证身份,本地 OCX 只会收到 OpenCodex 设备凭据。", + "remote.signIn": "使用 GitHub 继续", + "remote.starting": "正在启动…", + "remote.identityTitle": "身份由中央服务处理", + "remote.identityBody": "服务处理 GitHub OAuth,不会把 GitHub 令牌发送到此电脑。", + "remote.deviceTitle": "每台设备独立凭据", + "remote.deviceBody": "此 OCX 创建独立设备密钥,可单独撤销而不影响其他电脑。", + "remote.tunnelTitle": "无需开放入站端口", + "remote.tunnelBody": "远程流量通过 Cloudflare Tunnel 进入,不暴露家庭或办公网络。", + "remote.startFailed": "无法启动 GitHub 登录。", + "remote.cancelFailed": "无法取消设备登录。", + "remote.pendingTitle": "请在浏览器中批准此电脑", + "remote.pendingBody": "在 opencodexpages.me 完成 GitHub 登录,并确认网站代码与下方代码一致。", + "remote.codeLabel": "设备代码", + "remote.openBrowser": "打开登录页面", + "remote.waiting": "正在等待浏览器批准…", + "remote.connectedAs": "已连接账户", + "remote.passwordTitle": "创建远程访问密码", + "remote.passwordBody": "此密码用于保护远程浏览器访问,与 GitHub 密码分开。", + "remote.passwordLabel": "远程密码", + "remote.passwordConfirm": "确认密码", + "remote.passwordLength": "请至少使用 10 个字符。", + "remote.passwordMismatch": "两次输入的密码不一致。", + "remote.passwordFailed": "无法保存远程密码。", + "remote.savePassword": "保存远程密码", + "remote.accountReadyTitle": "账户和设备已准备就绪", + "remote.accountReadyBody": "GitHub 身份、此电脑和远程访问密码已连接。", + "remote.connectorNext": "下一步:安装并启动签名 OCX 连接器,然后为此电脑分配 opencodexpages.me 地址。", + "remote.privateBetaTitle": "需要私测资格", + "remote.privateBetaBody": "账号已连接,但当前服务器仅允许受邀账号启用远程功能。", + "remote.domainTitle": "选择这台电脑的地址", + "remote.domainBody": "OpenCodex 将创建专用私有隧道并保留一个 opencodexpages.me 地址。", + "remote.deviceNameLabel": "电脑名称", + "remote.deviceNamePlaceholder": "家用电脑", + "remote.domainLabel": "远程地址", + "remote.domainSuffix": ".opencodexpages.me", + "remote.domainInvalid": "地址只能使用小写字母、数字和连字符。", + "remote.activateFailed": "无法为这台电脑启用远程功能。", + "remote.activating": "正在保留地址…", + "remote.activate": "启用远程", + "remote.provisioningTitle": "正在创建私有隧道", + "remote.provisioningBody": "中央服务正在保留地址并创建这台电脑的 Cloudflare 资源。", + "remote.connectorTitle": "连接本地助手", + "remote.connectorBody": "地址已就绪。请配对保持本地 OCX 和 Cloudflare Tunnel 在线的已签名 Linux 助手。", + "remote.pairingCode": "一次性配对码", + "remote.pairingFailed": "无法准备连接器配对。", + "remote.preparingConnector": "准备中…", + "remote.prepareConnector": "准备连接器", + "remote.connectorRequirement": "当前私测版需要管理员批准安装已签名 Linux 助手;暂未提供 Windows 和 macOS 版本。", + "remote.connectingTitle": "正在连接这台电脑", + "remote.connectingBody": "助手已配对,正在等待 OCX、Agent、Tunnel 和 Gateway 检查通过。", + "remote.readyTitle": "远程已上线", + "remote.readyBody": "现在可通过认证地址访问这台电脑的本地 OpenCodex GUI。", + "remote.openRemote": "打开远程 GUI", + "remote.unavailableTitle": "远程功能需要处理", + "remote.unavailableBody": "实例已暂停或配置失败,请刷新状态或联系运营者。", + "remote.disconnect": "断开连接", + "remote.disconnectConfirm": "要断开此电脑与 OpenCodex Remote 的连接吗?", + "remote.disconnectFailed": "无法撤销此设备。", "theme.label": "主题", "theme.light": "浅色", "theme.dark": "深色", diff --git a/gui/src/pages/Remote.tsx b/gui/src/pages/Remote.tsx new file mode 100644 index 000000000..497c88a65 --- /dev/null +++ b/gui/src/pages/Remote.tsx @@ -0,0 +1,244 @@ +import { useCallback, useEffect, useState } from "react"; +import { readJsonOrThrow } from "../fetch-json"; +import { IconCheck, IconExternal, IconGithub, IconGlobe, IconLock, IconRefresh, IconTerminal } from "../icons"; +import { useT } from "../i18n/shared"; +import { Notice } from "../ui"; + +type RemoteStatus = + | { state: "signed_out"; controlPlaneUrl: string; serviceReachable: boolean; error?: string } + | { + state: "pending"; + controlPlaneUrl: string; + serviceReachable: boolean; + authorizeUrl: string; + userCode: string; + expiresAt: string; + error?: string; + } + | { + state: "connected"; + controlPlaneUrl: string; + serviceReachable: boolean; + deviceId: string; + account: { name: string; email: string; githubNumericId: string }; + passwordSet: boolean; + canActivate: boolean; + instance: { + id: string; + name: string; + slug: string; + status: "pending" | "provisioning" | "awaiting_agent" | "connecting" | "online" | "degraded" | "offline" | "suspending" | "suspended" | "deleting" | "delete_failed" | "deleted"; + publicUrl: string; + } | null; + error?: string; + }; + +async function requestRemote(apiBase: string, path: string, init?: RequestInit): Promise { + const response = await fetch(`${apiBase}${path}`, init); + const body = await readJsonOrThrow(response); + if (!body) throw new Error("empty remote response"); + return body; +} + +function RemoteSteps({ status }: { status: RemoteStatus }) { + const t = useT(); + const accountDone = status.state === "connected"; + const passwordDone = accountDone && status.passwordSet; + const tunnelDone = accountDone && status.instance !== null && ["online", "degraded"].includes(status.instance.status); + return
+ {[ + { label: t("remote.stepAccount"), done: accountDone, current: !accountDone }, + { label: t("remote.stepPassword"), done: passwordDone, current: accountDone && !passwordDone }, + { label: t("remote.stepTunnel"), done: tunnelDone, current: passwordDone && !tunnelDone }, + ].map((step, index) =>
+ {step.done ? : index + 1}{step.label} +
)} +
; +} + +export default function Remote({ apiBase }: { apiBase: string }) { + const t = useT(); + const [status, setStatus] = useState(null); + const [loading, setLoading] = useState(true); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + const [password, setPassword] = useState(""); + const [confirmation, setConfirmation] = useState(""); + const [instanceName, setInstanceName] = useState(""); + const [slug, setSlug] = useState(""); + const [pairing, setPairing] = useState<{ code: string; expiresAt: string } | null>(null); + + const refresh = useCallback(async (quiet = false) => { + if (!quiet) setLoading(true); + try { + const next = await requestRemote(apiBase, "/api/remote/status"); + setStatus(next); + setError(next.error ?? null); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.loadFailed")); + } finally { + if (!quiet) setLoading(false); + } + }, [apiBase, t]); + + useEffect(() => { + const controller = new AbortController(); + const timer = window.setTimeout(() => { void refresh(); }, 0); + return () => { controller.abort(); window.clearTimeout(timer); }; + }, [refresh]); + + useEffect(() => { + const waitingForDevice = status?.state === "pending"; + const waitingForInstance = status?.state === "connected" && !!status.instance + && ["pending", "provisioning", "connecting"].includes(status.instance.status); + if (!waitingForDevice && !waitingForInstance) return; + const timer = window.setInterval(() => { void refresh(true); }, 2_000); + return () => window.clearInterval(timer); + }, [refresh, status]); + + const startLogin = async () => { + const popup = window.open("about:blank", "_blank"); + if (popup) popup.opener = null; + setBusy(true); + setError(null); + try { + const next = await requestRemote(apiBase, "/api/remote/link", { method: "POST" }); + setStatus(next); + if (next.state === "pending") { + if (popup) popup.location.href = next.authorizeUrl; + else window.open(next.authorizeUrl, "_blank", "noopener,noreferrer"); + } else popup?.close(); + } catch (reason) { + popup?.close(); + setError(reason instanceof Error ? reason.message : t("remote.startFailed")); + } finally { + setBusy(false); + } + }; + + const cancelLogin = async () => { + setBusy(true); + try { + setStatus(await requestRemote(apiBase, "/api/remote/link/cancel", { method: "POST" })); + setError(null); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.cancelFailed")); + } finally { + setBusy(false); + } + }; + + const savePassword = async () => { + if (password.length < 10) { setError(t("remote.passwordLength")); return; } + if (password !== confirmation) { setError(t("remote.passwordMismatch")); return; } + setBusy(true); + setError(null); + try { + const next = await requestRemote(apiBase, "/api/remote/password", { + method: "PUT", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ password }), + }); + setStatus(next); + setPassword(""); + setConfirmation(""); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.passwordFailed")); + } finally { + setBusy(false); + } + }; + + const disconnect = async () => { + if (!window.confirm(t("remote.disconnectConfirm"))) return; + setBusy(true); + try { + setStatus(await requestRemote(apiBase, "/api/remote/device", { method: "DELETE" })); + setError(null); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.disconnectFailed")); + } finally { + setBusy(false); + } + }; + + const activate = async () => { + const cleanSlug = slug.trim().toLowerCase(); + if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(cleanSlug)) { + setError(t("remote.domainInvalid")); + return; + } + setBusy(true); + setError(null); + try { + setStatus(await requestRemote(apiBase, "/api/remote/activate", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ name: instanceName.trim() || cleanSlug, slug: cleanSlug }), + })); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.activateFailed")); + } finally { + setBusy(false); + } + }; + + const prepareConnector = async () => { + setBusy(true); + setError(null); + try { + setPairing(await requestRemote<{ code: string; expiresAt: string }>(apiBase, "/api/remote/pairing-code", { + method: "POST", + })); + } catch (reason) { + setError(reason instanceof Error ? reason.message : t("remote.pairingFailed")); + } finally { + setBusy(false); + } + }; + + return
+

{t("remote.title")}

{t("remote.subtitle")}

+ +
+ {status && } + {error && {error}} + {loading && !status ?
{t("remote.loading")}
+ : status?.state === "signed_out" ? <> +
+

{t("remote.signedOutTitle")}

{t("remote.signedOutBody")}

+
+
+
+
{t("remote.identityTitle")}{t("remote.identityBody")}
+
{t("remote.deviceTitle")}{t("remote.deviceBody")}
+
{t("remote.tunnelTitle")}{t("remote.tunnelBody")}
+
+ : status?.state === "pending" ?
+
+
: status?.state === "connected" ? <> +
{t("remote.connectedAs")}{status.account.name}{status.account.email}
+ {!status.passwordSet ?

{t("remote.passwordTitle")}

{t("remote.passwordBody")}

+
+
+
+
: !status.canActivate ?

{t("remote.privateBetaTitle")}

{t("remote.privateBetaBody")}

+ : !status.instance ?

{t("remote.domainTitle")}

{t("remote.domainBody")}

+
+
+
+
: ["pending", "provisioning"].includes(status.instance.status) ?

{t("remote.provisioningTitle")}

{t("remote.provisioningBody")}

{status.instance.publicUrl}
+ : ["awaiting_agent", "offline"].includes(status.instance.status) ?

{t("remote.connectorTitle")}

{t("remote.connectorBody")}

+ {status.instance.publicUrl} + {pairing ?
{t("remote.pairingCode")}{pairing.code.match(/.{1,4}/g)?.join(" ")}
: null} +
+ {t("remote.connectorRequirement")} +
: status.instance.status === "connecting" ?

{t("remote.connectingTitle")}

{t("remote.connectingBody")}

{status.instance.publicUrl}
+ : ["online", "degraded"].includes(status.instance.status) ?

{t("remote.readyTitle")}

{t("remote.readyBody")}

{t("remote.openRemote")}
+ :

{t("remote.unavailableTitle")}

{t("remote.unavailableBody")}

} + : null} +
; +} diff --git a/gui/src/styles.css b/gui/src/styles.css index 29a04a56d..79c3e66b8 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -885,6 +885,64 @@ dialog.modal-overlay::backdrop { .modal-actions { display: flex; gap: 8px; margin-top: 16px; } .modal-actions .btn { flex: 1; } +/* Remote is a local control-plane onboarding surface: calm, medium-density cards use the + dashboard's existing opaque material while the three-step rail keeps account, password, + and Tunnel ownership visibly separate. */ +.remote-page { max-width: 900px; } +.remote-page-sub { margin-bottom: 0; } +.remote-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 22px 0 16px; } +.remote-step { position: relative; display: flex; align-items: center; gap: 9px; min-width: 0; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--faint); background: var(--surface); } +.remote-step > span { width: 24px; height: 24px; flex: 0 0 auto; display: grid; place-items: center; border: 1px solid var(--border); border-radius: var(--radius-round); font-size: var(--text-caption); font-weight: var(--weight-semibold); } +.remote-step > span svg { width: 13px; height: 13px; } +.remote-step strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--text-label); } +.remote-step.is-current { color: var(--text); border-color: color-mix(in srgb, var(--accent) 40%, var(--border)); } +.remote-step.is-current > span { color: var(--accent-hover); border-color: var(--accent-ring); background: var(--accent-soft); } +.remote-step.is-done { color: var(--green); border-color: color-mix(in srgb, var(--green) 32%, var(--border)); } +.remote-step.is-done > span { color: var(--green); border-color: transparent; background: var(--green-soft); } +.remote-hero { display: flex; align-items: flex-start; gap: 18px; padding: 24px; margin-bottom: 14px; } +.remote-hero-icon, .remote-account-icon { width: 46px; height: 46px; flex: 0 0 auto; display: grid; place-items: center; border-radius: var(--radius); color: var(--accent-hover); background: var(--accent-soft); } +.remote-hero-icon svg, .remote-account-icon svg { width: 22px; height: 22px; } +.remote-hero > div:last-child { min-width: 0; } +.remote-hero h3, .remote-password-panel h3 { margin: 0 0 6px; font-size: var(--text-subtitle); } +.remote-hero p, .remote-password-panel p { margin: 0 0 18px; max-width: 62ch; color: var(--muted); font-size: var(--text-body); line-height: var(--leading-body); } +.remote-explain-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } +.remote-explain { display: grid; align-content: start; gap: 8px; padding: 18px; } +.remote-explain svg { width: 20px; height: 20px; color: var(--muted); } +.remote-explain strong { font-size: var(--text-control); } +.remote-explain span { color: var(--muted); font-size: var(--text-label); line-height: var(--leading-body); } +.remote-code { display: inline-flex; flex-direction: column; gap: 5px; min-width: 220px; padding: 12px 14px; margin: 0 0 16px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--raised); } +.remote-code span { color: var(--muted); font-size: var(--text-caption); } +.remote-code strong { font-family: var(--font-code); font-size: var(--text-subtitle); letter-spacing: 0.08em; } +.remote-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } +.remote-waiting, .remote-next-note { display: block; margin-top: 14px; color: var(--muted); font-size: var(--text-label); } +.remote-domain-input { display: grid; grid-template-columns: minmax(120px, 1fr) auto; align-items: center; gap: 10px; } +.remote-domain-input > span { color: var(--muted); font-size: var(--text-label); white-space: nowrap; } +.remote-address { display: block; margin: 12px 0 4px; color: var(--accent); font-size: var(--text-label); overflow-wrap: anywhere; } +.remote-open { width: fit-content; margin-top: 16px; } +.remote-waiting::before { content: ""; display: inline-block; width: 7px; height: 7px; margin-right: 7px; border-radius: var(--radius-round); background: var(--amber); box-shadow: 0 0 0 3px var(--amber-soft); } +.remote-account-card { display: flex; align-items: center; gap: 14px; padding: 16px; margin-bottom: 14px; } +.remote-account-icon { width: 38px; height: 38px; color: var(--green); background: var(--green-soft); } +.remote-account-icon svg { width: 18px; height: 18px; } +.remote-account-card > div:nth-child(2) { display: flex; flex-direction: column; min-width: 0; } +.remote-account-card > div:nth-child(2) > span, .remote-account-card small { color: var(--muted); font-size: var(--text-caption); overflow: hidden; text-overflow: ellipsis; } +.remote-account-card .btn { margin-left: auto; } +.remote-password-panel { padding: 22px; } +.remote-password-panel .panel-head { display: flex; align-items: flex-start; gap: 12px; } +.remote-password-panel .panel-head > svg { width: 20px; height: 20px; margin-top: 2px; color: var(--muted); flex: 0 0 auto; } +.remote-password-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 4px 0 16px; } +.remote-password-grid label { display: grid; gap: 6px; } +.remote-password-grid label > span { color: var(--muted); font-size: var(--text-label); } +.remote-ready { border-color: color-mix(in srgb, var(--green) 34%, var(--border)); background: color-mix(in srgb, var(--green-soft) 58%, var(--surface)); } +.remote-ready .remote-hero-icon { color: var(--green); background: var(--green-soft); } +.remote-loading { display: flex; align-items: center; gap: 10px; color: var(--muted); } +.remote-loading svg { width: 18px; height: 18px; animation: spin 1s linear infinite; } +@media (max-width: 700px) { + .remote-steps, .remote-explain-grid, .remote-password-grid { grid-template-columns: 1fr; } + .remote-hero { padding: 18px; } + .remote-account-card { align-items: flex-start; flex-wrap: wrap; } + .remote-account-card .btn { margin-left: 52px; } +} + /* request logs: clamped request id, status + details affordance, detail modal */ .log-reqid { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; diff --git a/gui/tests/remote-page.test.ts b/gui/tests/remote-page.test.ts new file mode 100644 index 000000000..cb3442bfc --- /dev/null +++ b/gui/tests/remote-page.test.ts @@ -0,0 +1,46 @@ +import { expect, test } from "bun:test"; + +const LOCALES = ["en", "de", "ja", "ko", "ru", "zh"] as const; + +async function read(path: string): Promise { + return Bun.file(new URL(path, import.meta.url)).text(); +} + +test("Remote is a local GUI route directly after the established Codex Auth entry", async () => { + const routing = await read("../src/app-routing.ts"); + const app = await read("../src/App.tsx"); + expect(routing).toContain('| "remote"'); + expect(routing).toContain('"remote",'); + expect(app).toContain('{page === "remote" && }'); + const nav = app.slice(app.indexOf("const NAV"), app.indexOf("];", app.indexOf("const NAV"))); + expect(nav.indexOf('id: "codex-auth"')).toBeLessThan(nav.indexOf('id: "remote"')); +}); + +test("Remote page owns device linking, password setup, hostname activation, and connector pairing without handling GitHub credentials", async () => { + const page = await read("../src/pages/Remote.tsx"); + expect(page).toContain("/api/remote/link"); + expect(page).toContain("/api/remote/status"); + expect(page).toContain("/api/remote/password"); + expect(page).toContain("/api/remote/activate"); + expect(page).toContain("/api/remote/pairing-code"); + expect(page).toContain("/api/remote/device"); + expect(page).not.toContain("access_token"); + expect(page).not.toContain("refresh_token"); + expect(page).not.toContain("clientSecret"); +}); + +test("every locale carries the Remote onboarding copy", async () => { + const keys = [ + "nav.remote", "remote.title", "remote.subtitle", "remote.stepAccount", "remote.stepPassword", + "remote.stepTunnel", "remote.signedOutTitle", "remote.signIn", "remote.pendingTitle", + "remote.codeLabel", "remote.passwordTitle", "remote.passwordLabel", "remote.savePassword", + "remote.domainTitle", "remote.activate", "remote.provisioningTitle", "remote.connectorTitle", + "remote.prepareConnector", "remote.readyTitle", "remote.openRemote", "remote.disconnect", + ]; + const missing: string[] = []; + for (const locale of LOCALES) { + const dictionary = await read(`../src/i18n/${locale}.ts`); + for (const key of keys) if (!dictionary.includes(`"${key}":`)) missing.push(`${locale}:${key}`); + } + expect(missing).toEqual([]); +}); diff --git a/platform/docs/IMPLEMENTATION_STATUS.md b/platform/docs/IMPLEMENTATION_STATUS.md index cfeea6bd6..12c922cc9 100644 --- a/platform/docs/IMPLEMENTATION_STATUS.md +++ b/platform/docs/IMPLEMENTATION_STATUS.md @@ -33,6 +33,8 @@ - bounded `jti` replay cache - 기존 admin token과 로컬 GUI session 인증 흐름 유지. - 정상·재사용·잘못된 method/path/instance·만료·수명 초과 집중 테스트 추가. +- `ocx gui`에 **Remote** 로컬 시작점을 추가하고 GitHub device approval, 별도 비밀번호, hostname 예약, 중앙 provisioning 상태를 보호된 `remote.json`과 management API로 연결. +- polling secret과 `ocxr_device_` token은 browser DTO에 포함하지 않고 기존 config directory permission hardening과 atomic write를 재사용. ### 중앙 플랫폼 코드 기반 @@ -45,6 +47,9 @@ - provisioning jobs, Cloudflare resources, health observations - audit logs, abuse reports - Better Auth + GitHub provider 설정과 GitHub numeric ID 필드 추가. +- GitHub OAuth account create/update hook에서 access/refresh/ID token을 DB 저장 전에 제거해 identity-only 경계로 축소. +- Remote device authorization, 장치별 token 폐기, Argon2id Remote password, 5회 실패/15분 잠금, password 변경 시 instance session 폐기 추가. +- 장치 token으로 hostname/instance를 만들고 provisioning 상태와 10분 Agent pairing code를 로컬 GUI에 반환하는 API 추가. - 최초 관리자 numeric ID 부트스트랩과 24시간 일회용 초대 소비 로직 추가. - 사용자당 live instance 1개, 전체 active 사용자 50명 제한 추가. - 인스턴스 slug 트랜잭션 예약과 provisioning job 생성 추가. @@ -98,6 +103,9 @@ - New instance, pairing code, open, token 발급, suspend, delete API 연결. - 개발 demo data mode: `VITE_REMOTE_DEMO=true`. - production SPA fallback과 미등록 `/api/*`, `/agent/*` JSON 404 경계 검증. +- apex `/`는 local `ocx gui → Remote` 안내로 교체하고 운영 console은 `/admin`으로 분리. +- `/connect/` GitHub 장치 승인과 `/access/` GitHub 소유권 + Remote password 접속 화면 추가. +- instance Gateway는 무자격 top-level HTML navigation만 central access 화면으로 redirect하고 API/WebSocket은 계속 은닉 `404` 처리. ### PostgreSQL 17 로컬 통합 검증 @@ -134,6 +142,8 @@ - 실제 worker가 테스트 인스턴스의 Tunnel·DNS·CIDR·hostname route 네 리소스를 생성하고 delete saga가 모두 회수하는지 확인. - public apex health/UI/asset, wildcard TLS와 무자격 `404`, Mesh 연결 상태를 운영 경로에서 확인. - 실제 리소스 ID와 재시작/점검 절차는 [PRODUCTION_DEPLOYMENT.md](./PRODUCTION_DEPLOYMENT.md)에 기록. +- `0002_remote_devices.sql`과 local-first landing/approval/access runtime을 운영에 적용. 적용 전 PostgreSQL 17 dump와 `/opt` runtime archive를 생성. +- capability 없는 Gateway가 read-only bind mount를 읽을 수 있도록 운영 source tree `0755/0644` permission 불변조건을 확인. ## 구현 중인 부분 @@ -184,7 +194,7 @@ - private hostname은 `127.0.0.1` hosts가 아니라 DNS-only RFC1918 A record를 사용한다. Agent `prepare-network`는 구현했지만 installer/systemd의 privileged `ExecStartPre`와 비특권 runtime unit은 아직 미구현이다. - Cloudflare Tunnel, DNS, CIDR route, hostname route create/delete와 token GET 응답 shape를 live account로 검증했다. - Gateway synthetic token과 signing key를 포함한 credential은 root-only systemd/container credential mount로 배포했다. -- Better Auth의 OAuth account에는 GitHub access token이 저장될 수 있다. 운영 전 DB encryption/토큰 최소 보존 정책을 확정해야 한다. +- Better Auth의 GitHub OAuth account token은 DB hook에서 저장 전에 제거한다. callback 성공과 재로그인 후에도 `accounts.access_token`, `refresh_token`, `id_token`이 NULL인지 운영 전환 시 다시 확인한다. - Gateway와 Rust Agent는 100 MiB 양방향 streaming, SSE/WS, 30분 stream을 통과했다. 실제 OpenCodex process와 public ingress를 포함한 부하·backpressure는 아직 측정하지 않았다. - private transport DNS는 Phase 0에서 검증했고 public wildcard ingress와 TLS도 운영 배포에서 확인했다. dedicated GitHub OAuth app이 없어 `opencodex.me`와 `opencodexpages.me`의 production OAuth/cookie 분리는 아직 검증하지 않았다. @@ -195,8 +205,10 @@ PASS bun run typecheck (root) PASS bun test tests/server-management-auth.test.ts 16 tests / 56 expects PASS bun test --isolate tests - 6030 pass / 2 skip / 0 fail / 30540 expects + 6033 pass / 2 skip / 0 fail / 30570 expects PASS bun run privacy:scan +PASS cd gui && bun run lint && bun test tests && bun run build && bun run doctor + 385 pass / 0 fail / 1663 expects; React Doctor 0 issues PASS cd platform && bun run typecheck PASS cd platform && bun test server/tests/cloudflare.test.ts 5 tests / 22 expects @@ -206,12 +218,14 @@ PASS cd platform && CLOUDFLARE_LIVE_TESTS=true ... \ PASS cd platform && VITE_REMOTE_DEMO=true bun run build:web PASS cd platform && PLATFORM_TEST_DATABASE_URL=postgres://postgres@127.0.0.1:55432/postgres \ bun test server/tests/postgres-integration.test.ts - 1 test / 56 expects, PostgreSQL 17.10 + 1 test / 74 expects, PostgreSQL 17.10 PASS cd remote-agent && cargo fmt --check PASS cd remote-agent && cargo check PASS cd remote-agent && cargo clippy --all-targets --all-features -- -D warnings PASS cd remote-agent && cargo test 3 Rust unit tests +PASS cd docs-site && bun run build + 146 pages with localized Remote GUI and CLI documentation ``` 운영 bootstrap에서 추가로 통과한 항목: diff --git a/platform/docs/PRODUCTION_DEPLOYMENT.md b/platform/docs/PRODUCTION_DEPLOYMENT.md index f17c1ec6c..6bddac0ad 100644 --- a/platform/docs/PRODUCTION_DEPLOYMENT.md +++ b/platform/docs/PRODUCTION_DEPLOYMENT.md @@ -18,9 +18,11 @@ Public instance hostnames use `.opencodexpages.me`. Cloudflare Universal S ## Bootstrap authentication -The account does not yet have a dedicated GitHub OAuth application. The apex dashboard is therefore protected by a Cloudflare Access application allowing one exact maintainer email through One-Time PIN. Behind that edge boundary, the Control Plane runs its existing non-production numeric-ID bootstrap path for the same maintainer. +The central service now has a dedicated GitHub OAuth application and the production callback is generated as `https://opencodexpages.me/api/auth/callback/github`. OAuth is identity-only: database hooks clear GitHub access, refresh, and ID tokens before the account row is stored. -This is deliberately single-user. Do not add another Access email while numeric-ID bootstrap mode is active because every allowed request would inherit the bootstrap administrator. Before a private beta, create the GitHub OAuth app, remove `PLATFORM_DEV_AUTH_GITHUB_ID`, set `NODE_ENV=production`, and remove or relax the apex Access application as intended. +The apex remains protected by a Cloudflare Access application allowing one exact maintainer email through One-Time PIN. Behind that edge boundary, the Control Plane still runs its non-production numeric-ID bootstrap path for the same maintainer while the signed Linux helper and abuse controls are unfinished. + +This is deliberately single-user. Do not add another Access email while numeric-ID bootstrap mode is active because every allowed request would inherit the bootstrap administrator. Before a multi-user beta, remove `PLATFORM_DEV_AUTH_GITHUB_ID`, set `NODE_ENV=production`, explicitly choose `PLATFORM_SIGNUP_MODE=private|open`, and remove or relax the apex Access application as intended. The wildcard instance Gateway is not placed behind the apex Access application. It continues to require an instance session or `ocxr_` token and conceals invalid access as `404`. @@ -58,6 +60,8 @@ curl -fsS http://127.0.0.1:10200/healthz docker exec ocxr-mesh warp-cli --accept-tos status ``` +The Gateway container drops every Linux capability. Its read-only `/opt/opencodex-remote/platform` bind mount must therefore remain world-traversable/readable (`0755` directories and `0644` source/assets). A deployment that copies a private `0700/0600` checkout with `rsync -a` makes Bun fail with `CouldntReadCurrentDirectory`. Normalize deployment permissions before restarting the Gateway; no secret is stored in this tree. + Restart Mesh and Gateway as a pair because the Gateway joins the Mesh container network namespace: ```bash @@ -73,6 +77,8 @@ The live worker created a disposable instance Tunnel, DNS-only RFC1918 record, ` An awaiting-Agent private hostname does not synthesize through Gateway until its dedicated Tunnel connector is online. This is expected; the Agent obtains its Tunnel token through the public Control Plane and connects before private Gateway traffic is sent. +The 2026-07-30 local-first onboarding deployment added migration `0002_remote_devices.sql`, the central `/connect/`, `/access/`, and landing routes, device-token activation APIs, Argon2id Remote password verification with a five-attempt lock, and top-level unauthenticated browser redirects from instance hostnames. A version-matched PostgreSQL 17 custom-format dump and the prior `/opt` runtime are stored under `/home/ubuntu/backups/opencodex-remote-onboarding-20260730T063728Z`. + ## Secret boundary Secrets live under root-owned `/etc/opencodex-remote/credentials`. Native services receive individual files with systemd `LoadCredential=`. Containers receive read-only credential mounts. No credential is committed to the repository or written into the Cloudflare state documentation. diff --git a/platform/server/migrations/0002_remote_devices.sql b/platform/server/migrations/0002_remote_devices.sql new file mode 100644 index 000000000..a20a5b2ff --- /dev/null +++ b/platform/server/migrations/0002_remote_devices.sql @@ -0,0 +1,56 @@ +BEGIN; + +CREATE TABLE remote_access_profiles ( + user_id text PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, + password_hash text, + password_set_at timestamptz, + failed_attempts integer NOT NULL DEFAULT 0, + locked_until timestamptz, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); + +CREATE TABLE remote_devices ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + user_id text NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name text NOT NULL, + platform text NOT NULL, + public_key bytea NOT NULL, + instance_id uuid REFERENCES instances(id) ON DELETE SET NULL, + token_hash bytea UNIQUE, + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now(), + last_seen_at timestamptz, + revoked_at timestamptz, + UNIQUE(user_id, public_key) +); +CREATE INDEX remote_devices_user_id_idx ON remote_devices(user_id); + +CREATE TABLE device_authorization_requests ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + poll_secret_hash bytea NOT NULL UNIQUE, + user_code text NOT NULL, + device_name text NOT NULL, + platform text NOT NULL, + public_key bytea NOT NULL, + network_hmac text NOT NULL, + expires_at timestamptz NOT NULL, + approved_by text REFERENCES users(id) ON DELETE CASCADE, + approved_at timestamptz, + device_id uuid REFERENCES remote_devices(id) ON DELETE SET NULL, + encrypted_device_token bytea, + consumed_at timestamptz, + created_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX device_authorization_requests_expires_idx ON device_authorization_requests(expires_at); +CREATE INDEX device_authorization_requests_network_idx ON device_authorization_requests(network_hmac,created_at); + +-- [Decision Log] +-- - 목적과 의도: 로컬 `ocx gui`가 GitHub 자격증명을 직접 받지 않고 중앙 OAuth 결과에 자기 장치 공개키를 연결하게 한다. +-- - 기존 구현 및 제약 조건: 기존 플랫폼은 웹 dashboard session과 별도 Rust Agent pairing만 있었고 npm OCX GUI가 중앙 계정에 연결되는 장치 승인 상태가 없었다. +-- - 검토한 주요 대안: GitHub token을 localhost callback으로 전달, 장기 API token을 URL에 포함, polling secret이 분리된 일회용 device authorization. +-- - 선택한 방식: 10분 device authorization request, 브라우저에는 UUID와 확인 코드만 표시하고 polling secret은 로컬 OCX만 보유한다. 승인 후 장치 token은 암호화해 ACK 전까지만 보관한다. +-- - 다른 대안 대신 이 방식을 선택한 이유: GitHub token과 장기 장치 token이 브라우저 URL·history·central frontend에 노출되지 않고 proxy 재시작 중에도 승인을 재개할 수 있다. +-- - 장점, 단점 및 영향: 일반 사용자의 시작점이 로컬 GUI가 되며 장치별 폐기가 가능하다. 대신 만료 요청 청소와 장치 token lifecycle을 중앙에서 운영해야 한다. + +COMMIT; diff --git a/platform/server/src/app.ts b/platform/server/src/app.ts index 0881cc94e..80f1cbc32 100644 --- a/platform/server/src/app.ts +++ b/platform/server/src/app.ts @@ -9,6 +9,7 @@ import { gatewayPublicKeyPem } from "./security"; interface AppVariables { actor: Actor | null; + remoteDeviceId: string | null; } function errorMessage(error: unknown): string { @@ -26,6 +27,11 @@ async function requireActor(c: Context<{ Variables: AppVariables }>): Promise): string | Response { + const deviceId = c.get("remoteDeviceId"); + return deviceId ?? c.json({ error: "remote device authentication required" }, 401); +} + export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth, store: PlatformStore) { const app = new Hono<{ Variables: AppVariables }>(); app.use("*", secureHeaders({ @@ -41,7 +47,11 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth })); app.use("/api/v1/*", async (c, next) => { let actor: Actor | null = null; - if (config.NODE_ENV !== "production" && config.PLATFORM_DEV_AUTH_GITHUB_ID) { + const device = await store.authorizeDeviceToken(bearer(c.req.raw)); + if (device) { + actor = device.actor; + c.set("remoteDeviceId", device.deviceId); + } else if (config.NODE_ENV !== "production" && config.PLATFORM_DEV_AUTH_GITHUB_ID) { const result = await store.db.query<{ id: string; name: string; email: string; github_numeric_id: string }>( "SELECT id,name,email,github_numeric_id FROM users WHERE github_numeric_id=$1", [config.PLATFORM_DEV_AUTH_GITHUB_ID], @@ -60,6 +70,7 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth }); } } + if (!device) c.set("remoteDeviceId", null); c.set("actor", actor); await next(); }); @@ -67,11 +78,118 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth app.on(["GET", "POST"], "/api/auth/*", c => auth.handler(c.req.raw)); app.get("/healthz", c => c.json({ ok: true, service: "control-plane" })); + app.post("/api/v1/device-links", async c => { + try { + const body = z.object({ + deviceName: z.string().trim().min(1).max(80), + platform: z.string().trim().min(1).max(40), + publicKey: z.string().min(40).max(512), + }).parse(await c.req.json()); + const networkSignal = c.req.header("cf-connecting-ip") + ?? c.req.header("x-forwarded-for")?.split(",")[0]?.trim() + ?? "unknown"; + return c.json(await store.createDeviceAuthorization({ + deviceName: body.deviceName, + platform: body.platform, + publicKeyDer: Buffer.from(body.publicKey, "base64url"), + networkSignal, + }), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.get("/api/v1/device-links/:id", async c => { + const pollSecret = c.req.header("x-ocxr-link-secret"); + if (pollSecret) { + const result = await store.pollDeviceAuthorization(c.req.param("id"), pollSecret); + return result ? c.json(result) : c.json({ error: "not found" }, 404); + } + const display = await store.getDeviceAuthorizationDisplay(c.req.param("id")); + return display ? c.json({ request: display }) : c.json({ error: "not found" }, 404); + }); + + app.post("/api/v1/device-links/:id/approve", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + return c.json({ request: await store.approveDeviceAuthorization(actor, c.req.param("id")) }); + } catch (error) { + return c.json({ error: errorMessage(error) }, 409); + } + }); + + app.post("/api/v1/device-links/:id/ack", async c => { + const pollSecret = c.req.header("x-ocxr-link-secret") ?? ""; + return await store.acknowledgeDeviceAuthorization(c.req.param("id"), pollSecret) + ? c.json({ ok: true }) + : c.json({ error: "not found" }, 404); + }); + app.get("/api/v1/me", async c => { const actor = await requireActor(c); return actor instanceof Response ? actor : c.json({ user: actor }); }); + app.get("/api/v1/remote/profile", async c => { + const actor = await requireActor(c); + return actor instanceof Response ? actor : c.json({ profile: await store.remoteProfile(actor) }); + }); + + app.put("/api/v1/remote/password", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const body = z.object({ password: z.string().min(10).max(128) }).parse(await c.req.json()); + await store.setRemotePassword(actor, body.password); + return c.json({ ok: true }); + }); + + app.post("/api/v1/remote/activate", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const deviceId = requireRemoteDevice(c); + if (deviceId instanceof Response) return deviceId; + try { + const body = z.object({ + name: z.string().trim().min(1).max(80), + slug: z.string().trim().min(1).max(63), + }).parse(await c.req.json()); + return c.json({ profile: await store.activateRemoteInstance(actor, deviceId, body) }, 202); + } catch (error) { + return c.json({ error: errorMessage(error) }, 400); + } + }); + + app.post("/api/v1/remote/pairing-code", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + const deviceId = requireRemoteDevice(c); + if (deviceId instanceof Response) return deviceId; + try { + return c.json(await store.createRemotePairingCode(actor, deviceId), 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 409); + } + }); + + app.post("/api/v1/remote/access/:slug", async c => { + const actor = await requireActor(c); + if (actor instanceof Response) return actor; + try { + const body = z.object({ password: z.string().min(10).max(128) }).parse(await c.req.json()); + return c.json({ url: await store.issueInstanceAuthorizationForSlug(actor, c.req.param("slug"), body.password) }, 201); + } catch (error) { + return c.json({ error: errorMessage(error) }, 401); + } + }); + + app.delete("/api/v1/devices/current", async c => { + const token = bearer(c.req.raw); + return await store.revokeDeviceToken(token) + ? c.json({ ok: true }) + : c.json({ error: "not found" }, 404); + }); + app.post("/api/v1/invites/redeem", async c => { const actor = await requireActor(c); if (actor instanceof Response) return actor; @@ -140,7 +258,8 @@ export function createControlPlaneApp(config: PlatformConfig, auth: PlatformAuth const actor = await requireActor(c); if (actor instanceof Response) return actor; try { - return c.json({ url: await store.issueInstanceAuthorization(actor, c.req.param("id")) }, 201); + const body = z.object({ password: z.string().min(10).max(128) }).parse(await c.req.json()); + return c.json({ url: await store.issueInstanceAuthorization(actor, c.req.param("id"), body.password) }, 201); } catch (error) { return c.json({ error: errorMessage(error) }, 409); } diff --git a/platform/server/src/auth.ts b/platform/server/src/auth.ts index 401ee1ac8..444d7877e 100644 --- a/platform/server/src/auth.ts +++ b/platform/server/src/auth.ts @@ -19,6 +19,34 @@ export function createPlatformAuth(config: PlatformConfig, database: Database) { mapProfileToUser: profile => ({ githubNumericId: String(profile.id) }), }, }, + databaseHooks: { + account: { + create: { + before: async account => account.providerId === "github" ? { + data: { + ...account, + accessToken: null, + refreshToken: null, + idToken: null, + accessTokenExpiresAt: null, + refreshTokenExpiresAt: null, + }, + } : undefined, + }, + update: { + before: async account => account.providerId === "github" ? { + data: { + ...account, + accessToken: null, + refreshToken: null, + idToken: null, + accessTokenExpiresAt: null, + refreshTokenExpiresAt: null, + }, + } : undefined, + }, + }, + }, account: { modelName: "accounts", fields: { diff --git a/platform/server/src/config.ts b/platform/server/src/config.ts index 68072c732..020b9843b 100644 --- a/platform/server/src/config.ts +++ b/platform/server/src/config.ts @@ -9,6 +9,7 @@ const envSchema = z.object({ PLATFORM_INSTANCE_DOMAIN: z.string().min(3), PLATFORM_PRIVATE_HOSTNAME_DOMAIN: z.string().min(3).default("private.remote.opencodexpages.me"), PLATFORM_BOOTSTRAP_GITHUB_ID: z.string().regex(/^\d+$/), + PLATFORM_SIGNUP_MODE: z.enum(["private", "open"]).default("private"), PLATFORM_GATEWAY_ISSUER: z.string().default("opencodex-remote"), PLATFORM_GATEWAY_KID: z.string().default("gateway-1"), PLATFORM_CONTROL_PORT: z.coerce.number().int().min(1).max(65535).default(10200), diff --git a/platform/server/src/gateway.ts b/platform/server/src/gateway.ts index 488b1f2ee..a6f145530 100644 --- a/platform/server/src/gateway.ts +++ b/platform/server/src/gateway.ts @@ -44,6 +44,25 @@ function remoteCredential(req: Request): string | null { return token?.startsWith("ocxr_") ? authorization : null; } +function browserAccessRedirect(req: Request): Response | null { + if (req.method !== "GET" || req.headers.get("upgrade")?.toLowerCase() === "websocket") return null; + const acceptsHtml = req.headers.get("sec-fetch-dest") === "document" + || (req.headers.get("accept") ?? "").includes("text/html"); + if (!acceptsHtml) return null; + const host = (req.headers.get("host") ?? "").toLowerCase().replace(/:\d+$/, ""); + const suffix = `.${config.PLATFORM_INSTANCE_DOMAIN.toLowerCase()}`; + if (!host.endsWith(suffix)) return null; + const slug = host.slice(0, -suffix.length); + if (!/^[a-z0-9-]{1,63}$/.test(slug)) return null; + return new Response(null, { + status: 302, + headers: { + location: `${config.PLATFORM_BASE_URL.replace(/\/$/, "")}/access/${encodeURIComponent(slug)}`, + "cache-control": "no-store", + }, + }); +} + function sanitizeRequestHeaders(req: Request, target: URL, assertion: string): Headers { const headers = new Headers(); for (const [name, value] of req.headers) { @@ -225,7 +244,10 @@ gatewayServer = Bun.serve({ } const auth = await authenticate(req); - if (!auth) return new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } }); + if (!auth) { + return browserAccessRedirect(req) + ?? new Response("Not found", { status: 404, headers: { "cache-control": "no-store" } }); + } const target = privateUrl(auth.instance, url); const assertion = signGatewayAssertion(config, { instanceId: auth.instance.id, diff --git a/platform/server/src/security.ts b/platform/server/src/security.ts index 3cb4b433e..661f7d057 100644 --- a/platform/server/src/security.ts +++ b/platform/server/src/security.ts @@ -19,7 +19,7 @@ export function sha256(value: string): Buffer { return createHash("sha256").update(value).digest(); } -export function issueOpaqueToken(prefix: "ocxr_" | "ocxr_session_" | "ocxr_agent_"): string { +export function issueOpaqueToken(prefix: "ocxr_" | "ocxr_session_" | "ocxr_agent_" | "ocxr_device_"): string { return `${prefix}${randomBytes(32).toString("base64url")}`; } diff --git a/platform/server/src/store.ts b/platform/server/src/store.ts index f784be5d6..953da0d9e 100644 --- a/platform/server/src/store.ts +++ b/platform/server/src/store.ts @@ -25,6 +25,20 @@ export interface Actor { email: string; } +export interface DeviceAuthorizationDisplay { + id: string; + userCode: string; + deviceName: string; + platform: string; + expiresAt: string; + status: "pending" | "approved" | "expired" | "consumed"; +} + +export interface RemoteDeviceActor { + actor: Actor; + deviceId: string; +} + export interface InstanceRecord { id: string; ownerId: string; @@ -36,6 +50,12 @@ export interface InstanceRecord { updatedAt: string; } +export interface RemoteProfile { + passwordSet: boolean; + canActivate: boolean; + instance: (InstanceRecord & { publicUrl: string }) | null; +} + interface InstanceRow { id: string; owner_id: string; @@ -65,6 +85,17 @@ function duplicateConstraint(error: unknown): boolean { return !!error && typeof error === "object" && (error as { code?: string }).code === "23505"; } +const RESERVED_INSTANCE_SLUGS = new Set([ + "account", "admin", "api", "auth", "billing", "login", "official", "status", + "support", "verify", "www", +]); + +function validInstanceSlug(slug: string): boolean { + return /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(slug) + && !RESERVED_INSTANCE_SLUGS.has(slug) + && !/^(?:account|login|support|verify)-/.test(slug); +} + function issuePrivateOriginIp(): string { const bytes = randomBytes(3); return `10.${192 + bytes[0] % 64}.${bytes[1]}.${1 + bytes[2] % 254}`; @@ -80,6 +111,11 @@ export class PlatformStore { "UPDATE users SET role='admin', status='active', updated_at=now() WHERE id=$1 AND github_numeric_id=$2", [user.id, user.githubNumericId], ); + } else if (this.config.PLATFORM_SIGNUP_MODE === "open") { + await this.db.query( + "UPDATE users SET status='active',updated_at=now() WHERE id=$1 AND status='pending_invite'", + [user.id], + ); } const result = await this.db.query<{ id: string; name: string; email: string; github_numeric_id: string; @@ -89,6 +125,279 @@ export class PlatformStore { return row ? { id: row.id, name: row.name, email: row.email, githubNumericId: row.github_numeric_id, role: row.role, status: row.status } : null; } + async createDeviceAuthorization(input: { + deviceName: string; + platform: string; + publicKeyDer: Buffer; + networkSignal: string; + }): Promise<{ id: string; pollSecret: string; userCode: string; authorizeUrl: string; expiresAt: string }> { + if (input.publicKeyDer.length < 32 || input.publicKeyDer.length > 256) throw new Error("invalid device public key"); + const pollSecret = issueOpaqueToken("ocxr_device_"); + const userCode = issueShortCode(8); + const expiresAt = new Date(Date.now() + 10 * 60_000); + const signal = networkSignalHmac(input.networkSignal, this.config.auditHmacKey); + const id = await this.db.transaction(async client => { + await client.query("DELETE FROM device_authorization_requests WHERE expires_at( + `SELECT + count(*) FILTER(WHERE network_hmac=$1)::text AS network_count, + count(*)::text AS global_count + FROM device_authorization_requests + WHERE created_at>now()-interval '10 minutes'`, + [signal], + ); + const counts = capacity.rows[0]; + if (Number(counts.network_count) >= 5 || Number(counts.global_count) >= 500) { + throw new Error("too many device authorization requests"); + } + const result = await client.query<{ id: string }>( + `INSERT INTO device_authorization_requests( + poll_secret_hash,user_code,device_name,platform,public_key,network_hmac,expires_at + ) VALUES($1,$2,$3,$4,$5,$6,$7) RETURNING id`, + [sha256(pollSecret), userCode, input.deviceName, input.platform, input.publicKeyDer, signal, expiresAt], + ); + return result.rows[0].id; + }); + return { + id, + pollSecret, + userCode, + authorizeUrl: `${this.config.PLATFORM_BASE_URL.replace(/\/$/, "")}/connect/${id}`, + expiresAt: expiresAt.toISOString(), + }; + } + + async getDeviceAuthorizationDisplay(id: string): Promise { + const result = await this.db.query<{ + id: string; user_code: string; device_name: string; platform: string; expires_at: Date; + approved_at: Date | null; consumed_at: Date | null; + }>( + `SELECT id,user_code,device_name,platform,expires_at,approved_at,consumed_at + FROM device_authorization_requests WHERE id=$1`, + [id], + ); + const row = result.rows[0]; + if (!row) return null; + const status = row.expires_at.getTime() <= Date.now() + ? "expired" + : row.consumed_at + ? "consumed" + : row.approved_at + ? "approved" + : "pending"; + return { + id: row.id, + userCode: row.user_code, + deviceName: row.device_name, + platform: row.platform, + expiresAt: row.expires_at.toISOString(), + status, + }; + } + + async approveDeviceAuthorization(actor: Actor, id: string): Promise { + const display = await this.db.transaction(async client => { + const pending = await client.query<{ + device_name: string; platform: string; public_key: Buffer; expires_at: Date; + approved_by: string | null; consumed_at: Date | null; + }>( + `SELECT device_name,platform,public_key,expires_at,approved_by,consumed_at + FROM device_authorization_requests WHERE id=$1 FOR UPDATE`, + [id], + ); + const request = pending.rows[0]; + if (!request || request.expires_at.getTime() <= Date.now() || request.consumed_at) { + throw new Error("device authorization expired"); + } + if (request.approved_by && request.approved_by !== actor.id) throw new Error("device authorization already approved"); + if (!request.approved_by) { + const token = issueOpaqueToken("ocxr_device_"); + const device = await client.query<{ id: string }>( + `INSERT INTO remote_devices(user_id,name,platform,public_key,token_hash,last_seen_at) + VALUES($1,$2,$3,$4,$5,now()) + ON CONFLICT(user_id,public_key) DO UPDATE SET + name=excluded.name,platform=excluded.platform,token_hash=excluded.token_hash, + last_seen_at=now(),revoked_at=NULL + RETURNING id`, + [actor.id, request.device_name, request.platform, request.public_key, sha256(token)], + ); + await client.query( + `UPDATE device_authorization_requests SET + approved_by=$2,approved_at=now(),device_id=$3,encrypted_device_token=$4 + WHERE id=$1`, + [id, actor.id, device.rows[0].id, encryptSecret(token, this.config.encryptionKey)], + ); + await this.audit(client, actor.id, "remote_device.approve", null, "success"); + } + return id; + }); + const result = await this.getDeviceAuthorizationDisplay(display); + if (!result) throw new Error("device authorization missing"); + return result; + } + + async pollDeviceAuthorization(id: string, pollSecret: string): Promise<{ + status: DeviceAuthorizationDisplay["status"]; + deviceId?: string; + deviceToken?: string; + user?: { name: string; email: string; githubNumericId: string }; + } | null> { + const result = await this.db.query<{ + expires_at: Date; approved_at: Date | null; consumed_at: Date | null; + device_id: string | null; encrypted_device_token: Buffer | null; + name: string | null; email: string | null; github_numeric_id: string | null; + }>( + `SELECT r.expires_at,r.approved_at,r.consumed_at,r.device_id,r.encrypted_device_token, + u.name,u.email,u.github_numeric_id + FROM device_authorization_requests r + LEFT JOIN users u ON u.id=r.approved_by + WHERE r.id=$1 AND r.poll_secret_hash=$2`, + [id, sha256(pollSecret)], + ); + const row = result.rows[0]; + if (!row) return null; + if (row.expires_at.getTime() <= Date.now()) return { status: "expired" }; + if (row.consumed_at) return { status: "consumed" }; + if (!row.approved_at || !row.device_id || !row.encrypted_device_token || !row.name || !row.email || !row.github_numeric_id) { + return { status: "pending" }; + } + return { + status: "approved", + deviceId: row.device_id, + deviceToken: decryptSecret(row.encrypted_device_token, this.config.encryptionKey), + user: { name: row.name, email: row.email, githubNumericId: row.github_numeric_id }, + }; + } + + async acknowledgeDeviceAuthorization(id: string, pollSecret: string): Promise { + const result = await this.db.query( + `UPDATE device_authorization_requests SET consumed_at=now(),encrypted_device_token=NULL + WHERE id=$1 AND poll_secret_hash=$2 AND approved_at IS NOT NULL + AND consumed_at IS NULL AND expires_at>now()`, + [id, sha256(pollSecret)], + ); + return (result.rowCount ?? 0) > 0; + } + + async authorizeDeviceToken(token: string): Promise { + if (!token.startsWith("ocxr_device_")) return null; + const result = await this.db.query<{ + device_id: string; id: string; name: string; email: string; github_numeric_id: string; + role: "admin" | "user"; status: "active" | "pending_invite" | "suspended"; + }>( + `UPDATE remote_devices d SET last_seen_at=now() + FROM users u + WHERE d.token_hash=$1 AND d.revoked_at IS NULL AND u.id=d.user_id + RETURNING d.id AS device_id,u.id,u.name,u.email,u.github_numeric_id,u.role,u.status`, + [sha256(token)], + ); + const row = result.rows[0]; + if (!row || row.status === "suspended") return null; + return { + deviceId: row.device_id, + actor: { + id: row.id, + name: row.name, + email: row.email, + githubNumericId: row.github_numeric_id, + role: row.role, + status: row.status, + }, + }; + } + + async remoteProfile(actor: Actor): Promise { + const [profile, instance] = await Promise.all([ + this.db.query<{ password_set: boolean }>( + "SELECT password_hash IS NOT NULL AS password_set FROM remote_access_profiles WHERE user_id=$1", + [actor.id], + ), + this.db.query( + "SELECT * FROM instances WHERE owner_id=$1 AND deleted_at IS NULL ORDER BY created_at DESC LIMIT 1", + [actor.id], + ), + ]); + const current = instance.rows[0] ? instanceFromRow(instance.rows[0]) : null; + return { + passwordSet: profile.rows[0]?.password_set ?? false, + canActivate: actor.status === "active", + instance: current ? { + ...current, + publicUrl: `https://${current.slug}.${this.config.PLATFORM_INSTANCE_DOMAIN}`, + } : null, + }; + } + + async setRemotePassword(actor: Actor, password: string): Promise { + const passwordHash = await Bun.password.hash(password, { + algorithm: "argon2id", + memoryCost: 65_536, + timeCost: 3, + }); + await this.db.transaction(async client => { + await client.query( + `INSERT INTO remote_access_profiles(user_id,password_hash,password_set_at) + VALUES($1,$2,now()) + ON CONFLICT(user_id) DO UPDATE SET + password_hash=excluded.password_hash,password_set_at=now(),failed_attempts=0, + locked_until=NULL,updated_at=now()`, + [actor.id, passwordHash], + ); + await client.query( + `UPDATE instance_sessions SET revoked_at=now() + WHERE user_id=$1 AND revoked_at IS NULL`, + [actor.id], + ); + await this.audit(client, actor.id, "remote_password.set", null, "success"); + }); + } + + async activateRemoteInstance( + actor: Actor, + deviceId: string, + input: { name: string; slug: string }, + ): Promise { + if (actor.status !== "active") throw new Error("private beta access is required"); + const password = await this.db.query( + "SELECT 1 FROM remote_access_profiles WHERE user_id=$1 AND password_hash IS NOT NULL", + [actor.id], + ); + if (!password.rowCount) throw new Error("set a remote password first"); + + const existing = await this.db.query( + "SELECT * FROM instances WHERE owner_id=$1 AND deleted_at IS NULL LIMIT 1", + [actor.id], + ); + const instance = existing.rows[0] ? instanceFromRow(existing.rows[0]) : await this.createInstance(actor, input); + const linked = await this.db.query( + `UPDATE remote_devices SET instance_id=$3,updated_at=now() + WHERE id=$1 AND user_id=$2 AND revoked_at IS NULL`, + [deviceId, actor.id, instance.id], + ); + if (!linked.rowCount) throw new Error("remote device is unavailable"); + return this.remoteProfile(actor); + } + + async createRemotePairingCode(actor: Actor, deviceId: string): Promise<{ code: string; expiresAt: string }> { + const linked = await this.db.query<{ instance_id: string }>( + `SELECT instance_id FROM remote_devices + WHERE id=$1 AND user_id=$2 AND revoked_at IS NULL AND instance_id IS NOT NULL`, + [deviceId, actor.id], + ); + const instanceId = linked.rows[0]?.instance_id; + if (!instanceId) throw new Error("remote instance is not activated"); + return this.createPairingCode(actor, instanceId); + } + + async revokeDeviceToken(token: string): Promise { + if (!token.startsWith("ocxr_device_")) return false; + const result = await this.db.query( + "UPDATE remote_devices SET revoked_at=now(),token_hash=NULL WHERE token_hash=$1 AND revoked_at IS NULL", + [sha256(token)], + ); + return (result.rowCount ?? 0) > 0; + } + async redeemInvite(actor: Actor, token: string): Promise { const result = await this.db.transaction(async client => { const invite = await client.query<{ id: string; expected_github_numeric_id: string | null }>( @@ -138,7 +447,7 @@ export class PlatformStore { const name = input.name.trim(); const slug = input.slug.trim().toLowerCase(); if (name.length < 1 || name.length > 80) throw new Error("name must be 1-80 characters"); - if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(slug)) throw new Error("invalid slug"); + if (!validInstanceSlug(slug)) throw new Error("invalid or reserved slug"); const privateHostname = `${randomBytes(20).toString("hex")}.${this.config.PLATFORM_PRIVATE_HOSTNAME_DOMAIN}`; const privateOriginIp = issuePrivateOriginIp(); try { @@ -278,9 +587,49 @@ export class PlatformStore { return { token, expiresAt: expiresAt.toISOString() }; } - async issueInstanceAuthorization(actor: Actor, instanceId: string): Promise { - const instance = await this.getOwnedInstance(actor, instanceId); + private async verifyRemotePassword(actor: Actor, password: string): Promise { + const result = await this.db.transaction(async client => { + const profile = await client.query<{ + password_hash: string | null; failed_attempts: number; locked_until: Date | null; + }>( + `SELECT password_hash,failed_attempts,locked_until FROM remote_access_profiles + WHERE user_id=$1 FOR UPDATE`, + [actor.id], + ); + const row = profile.rows[0]; + if (!row?.password_hash) return "invalid" as const; + if (row.locked_until && row.locked_until.getTime() > Date.now()) return "locked" as const; + const valid = await Bun.password.verify(password, row.password_hash); + if (!valid) { + const attempts = row.failed_attempts + 1; + await client.query( + `UPDATE remote_access_profiles SET failed_attempts=$2, + locked_until=CASE WHEN $2>=5 THEN now()+interval '15 minutes' ELSE NULL END, + updated_at=now() WHERE user_id=$1`, + [actor.id, attempts], + ); + await this.audit(client, actor.id, "remote_password.verify", null, "failure"); + return "invalid" as const; + } + await client.query( + "UPDATE remote_access_profiles SET failed_attempts=0,locked_until=NULL,updated_at=now() WHERE user_id=$1", + [actor.id], + ); + await this.audit(client, actor.id, "remote_password.verify", null, "success"); + return "valid" as const; + }); + if (result === "locked") throw new Error("remote password is temporarily locked"); + if (result !== "valid") throw new Error("invalid remote password"); + } + + async issueInstanceAuthorization(actor: Actor, instanceId: string, password: string): Promise { + const result = await this.db.query( + "SELECT * FROM instances WHERE id=$1 AND owner_id=$2 AND deleted_at IS NULL", + [instanceId, actor.id], + ); + const instance = result.rows[0] ? instanceFromRow(result.rows[0]) : null; if (!instance || !["online", "degraded"].includes(instance.status)) throw new Error("instance is unavailable"); + await this.verifyRemotePassword(actor, password); const code = randomBytes(32).toString("base64url"); await this.db.query( `INSERT INTO instance_authorization_codes(instance_id,user_id,code_hash,expires_at) @@ -290,6 +639,16 @@ export class PlatformStore { return `https://${instance.slug}.${this.config.PLATFORM_INSTANCE_DOMAIN}/_ocxr/exchange?code=${encodeURIComponent(code)}`; } + async issueInstanceAuthorizationForSlug(actor: Actor, slug: string, password: string): Promise { + const result = await this.db.query<{ id: string }>( + "SELECT id FROM instances WHERE owner_id=$1 AND slug=$2 AND deleted_at IS NULL", + [actor.id, slug.toLowerCase()], + ); + const instanceId = result.rows[0]?.id; + if (!instanceId) throw new Error("instance is unavailable"); + return this.issueInstanceAuthorization(actor, instanceId, password); + } + async exchangeInstanceAuthorization(host: string, code: string): Promise<{ token: string; expiresAt: Date } | null> { return this.db.transaction(async client => { const authorization = await client.query<{ id: string; instance_id: string; user_id: string }>( diff --git a/platform/server/tests/postgres-integration.test.ts b/platform/server/tests/postgres-integration.test.ts index 480ff3e46..b53cefaf2 100644 --- a/platform/server/tests/postgres-integration.test.ts +++ b/platform/server/tests/postgres-integration.test.ts @@ -86,10 +86,12 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa try { await adminPool.query(`CREATE DATABASE ${quotedDatabaseName}`); - const migration = readFileSync(join(import.meta.dir, "..", "migrations", "0001_remote_platform.sql"), "utf8"); const migrationPool = new Pool({ connectionString: databaseUrl.toString(), max: 1 }); try { - await migrationPool.query(migration); + for (const migrationName of ["0001_remote_platform.sql", "0002_remote_devices.sql"]) { + const migration = readFileSync(join(import.meta.dir, "..", "migrations", migrationName), "utf8"); + await migrationPool.query(migration); + } } finally { await migrationPool.end(); } @@ -184,6 +186,11 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa }); expect((await adapter.findVerificationValue("postgres-integration"))?.value).toBe("opaque-verification-value"); expect((await adapter.findAccountByProviderId("111111", "github"))?.userId).toBe(first.user.id); + const githubSecrets = await database.query<{ access_token: string | null; refresh_token: string | null; id_token: string | null }>( + "SELECT access_token,refresh_token,id_token FROM accounts WHERE provider_id='github' AND user_id=$1", + [first.user.id], + ); + expect(githubSecrets.rows[0]).toEqual({ access_token: null, refresh_token: null, id_token: null }); await database.query("UPDATE users SET status='active' WHERE id IN ($1,$2)", [first.user.id, second.user.id]); const store = new PlatformStore(database, config); @@ -194,6 +201,35 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa githubNumericId: "222222", }); if (!secondActor) throw new Error("second actor was not authorized"); + const firstActor = await store.authorizeUser({ + id: first.user.id, + name: first.user.name, + email: first.user.email, + githubNumericId: "111111", + }); + if (!firstActor) throw new Error("first actor was not authorized"); + + const deviceKey = generateKeyPairSync("ed25519").publicKey.export({ type: "spki", format: "der" }); + const deviceLink = await store.createDeviceAuthorization({ + deviceName: "Integration workstation", + platform: "linux-x64", + publicKeyDer: deviceKey, + networkSignal: "127.0.0.1", + }); + expect(deviceLink.pollSecret.startsWith("ocxr_device_")).toBe(true); + expect((await store.pollDeviceAuthorization(deviceLink.id, deviceLink.pollSecret))?.status).toBe("pending"); + expect((await store.approveDeviceAuthorization(firstActor, deviceLink.id)).status).toBe("approved"); + const approvedDevice = await store.pollDeviceAuthorization(deviceLink.id, deviceLink.pollSecret); + expect(approvedDevice?.status).toBe("approved"); + expect(approvedDevice?.deviceToken?.startsWith("ocxr_device_")).toBe(true); + const deviceActor = await store.authorizeDeviceToken(approvedDevice?.deviceToken ?? ""); + expect(deviceActor?.actor.id).toBe(firstActor.id); + expect(await store.remoteProfile(firstActor)).toMatchObject({ passwordSet: false, canActivate: true, instance: null }); + await store.setRemotePassword(firstActor, "integration-password"); + await store.setRemotePassword(secondActor, "second-integration-password"); + expect(await store.remoteProfile(firstActor)).toMatchObject({ passwordSet: true, canActivate: true, instance: null }); + expect(await store.acknowledgeDeviceAuthorization(deviceLink.id, deviceLink.pollSecret)).toBe(true); + expect((await store.pollDeviceAuthorization(deviceLink.id, deviceLink.pollSecret))?.status).toBe("consumed"); let firstInstanceId: string | null = null; let upstreamStreamCancelled = false; @@ -315,14 +351,21 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect(missingApi.status).toBe(404); expect(missingApi.headers.get("content-type")).toContain("application/json"); - const createResponse = await fetch(`http://127.0.0.1:${controlPort}/api/v1/instances`, { + const createResponse = await fetch(`http://127.0.0.1:${controlPort}/api/v1/remote/activate`, { method: "POST", - headers: { "content-type": "application/json" }, + headers: { + authorization: `Bearer ${approvedDevice?.deviceToken}`, + "content-type": "application/json", + }, body: JSON.stringify({ name: "First Instance", slug: "first" }), }); - expect(createResponse.status).toBe(202); - const createdFirst = await createResponse.json() as { instance: { id: string } }; - firstInstanceId = createdFirst.instance.id; + const createBody = await createResponse.json() as { error?: string; profile?: { instance: { id: string; publicUrl: string } } }; + if (createResponse.status !== 202 || !createBody.profile) { + throw new Error(`remote activation failed (${createResponse.status}): ${createBody.error ?? "missing profile"}`); + } + const createdFirst = createBody as { profile: { instance: { id: string; publicUrl: string } } }; + firstInstanceId = createdFirst.profile.instance.id; + expect(createdFirst.profile.instance.publicUrl).toBe("https://first.instances.example.test"); const createdSecond = await store.createInstance(secondActor, { name: "Second Instance", slug: "second" }); await waitFor(async () => { @@ -340,6 +383,12 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa ? true : null; }); + const pairingResponse = await fetch(`http://127.0.0.1:${controlPort}/api/v1/remote/pairing-code`, { + method: "POST", + headers: { authorization: `Bearer ${approvedDevice?.deviceToken}` }, + }); + expect(pairingResponse.status).toBe(201); + expect((await pairingResponse.json() as { code: string }).code).toHaveLength(12); await stopProcess(worker); const invisible = await fetch(`http://127.0.0.1:${controlPort}/api/v1/instances/${createdSecond.id}`); @@ -395,9 +444,30 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect((await gatewayRequest("first.instances.example.test")).status).toBe(404); expect((await gatewayRequest("second.instances.example.test", secondToken)).status).toBe(404); + const browserRedirect = await fetch(`http://127.0.0.1:${gatewayPort}/`, { + headers: { host: "first.instances.example.test", accept: "text/html", "sec-fetch-dest": "document" }, + redirect: "manual", + }); + expect(browserRedirect.status).toBe(302); + expect(browserRedirect.headers.get("location")).toBe(`${environment.PLATFORM_BASE_URL}/access/first`); + + const wrongPassword = await fetch( + `http://127.0.0.1:${controlPort}/api/v1/remote/access/first`, + { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ password: "incorrect-password" }), + }, + ); + expect(wrongPassword.status).toBe(401); + const firstAuthorization = await fetch( - `http://127.0.0.1:${controlPort}/api/v1/instances/${firstInstanceId}/authorize`, - { method: "POST" }, + `http://127.0.0.1:${controlPort}/api/v1/remote/access/first`, + { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ password: "integration-password" }), + }, ); expect(firstAuthorization.status).toBe(201); const firstAuthorizationUrl = new URL((await firstAuthorization.json() as { url: string }).url); @@ -408,7 +478,11 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect(firstExchange.status).toBe(302); const firstSessionCookie = firstExchange.headers.get("set-cookie")?.split(";", 1)[0]; expect(firstSessionCookie).toStartWith("__Host-ocxr_instance="); - const secondAuthorizationUrl = new URL(await store.issueInstanceAuthorization(secondActor, createdSecond.id)); + const secondAuthorizationUrl = new URL(await store.issueInstanceAuthorization( + secondActor, + createdSecond.id, + "second-integration-password", + )); const secondExchange = await fetch( `http://127.0.0.1:${gatewayPort}${secondAuthorizationUrl.pathname}${secondAuthorizationUrl.search}`, { headers: { host: "second.instances.example.test" }, redirect: "manual" }, @@ -505,6 +579,9 @@ postgresTest("PostgreSQL 17 auth, lifecycle, isolation, and streaming stay compa expect(observedSocketClose).toEqual({ code: 1008, reason: "instance disabled" }); expect((await gatewayRequest("first.instances.example.test", firstToken)).status).toBe(404); + expect(await store.revokeDeviceToken(approvedDevice?.deviceToken ?? "")).toBe(true); + expect(await store.authorizeDeviceToken(approvedDevice?.deviceToken ?? "")).toBeNull(); + await adapter.deleteVerificationByIdentifier("postgres-integration"); } finally { await Promise.all(processes.map(stopProcess)); diff --git a/platform/web/src/App.tsx b/platform/web/src/App.tsx index 24897a4a9..c417cb9b2 100644 --- a/platform/web/src/App.tsx +++ b/platform/web/src/App.tsx @@ -3,12 +3,13 @@ import { IconActivityHeartbeat, IconArrowLeft, IconBox, IconCheck, IconChevronDown, IconCircleCheckFilled, IconClipboard, IconCopy, IconExternalLink, IconGlobe, IconKey, IconLink, IconLoader2, IconMenu2, IconPlayerPause, - IconPlus, IconServer2, IconShield, IconTerminal2, IconTrash, IconX, + IconLock, IconPlus, IconServer2, IconShield, IconTerminal2, IconTrash, IconX, } from "@tabler/icons-react"; import { createInstance, createPairingCode, deleteInstance, getInstance, issueToken, listInstances, - getCurrentUser, openInstance, redeemInvite, suspendInstance, type CurrentUser, - type Instance, type InstanceStatus, + getCurrentUser, openInstance, redeemInvite, suspendInstance, getDeviceAuthorizationRequest, + approveDeviceAuthorizationRequest, type CurrentUser, type DeviceAuthorizationRequest, + type Instance, type InstanceStatus, accessInstance, } from "./api"; import { authClient } from "./auth-client"; @@ -66,7 +67,9 @@ function Detail({ instance, onChanged }: { instance: Instance; onChanged: () => setNotice(message); setTimeout(() => setNotice(null), 1800); } async function handleOpen() { - const url = await openInstance(instance.id); + const password = window.prompt("Remote access password"); + if (!password) return; + const url = await openInstance(instance.id, password); if (url.startsWith("#")) setNotice("Demo instance is ready"); else window.location.assign(url); } async function rotate() { @@ -189,7 +192,102 @@ function SecondaryPage({ view, instances }: { view: "activity" | "security"; ins

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

uQccssK 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ν0lt^WluG2RgRcqym4 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

qd7!p-q(QWH!q+58Tu@?#mMCd)Y`De@-SIKOLw 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�c5CA}MZU{{`2^y!! zf_b4LP3S+&sE}n&)90q3eTf1~$DJiHx{>NK5b!?xtZ8X8b=i*24QK;##nRTyCK3cg zk*fIPXdGvdF#E2I8nm~p0Yw>+OsWzO#eog`BA4s{))EWH61k>?p#K0_hKFAx;2el; zrzCGm1ZS8tfknEv#akSZZaE-UDs})_S~0R+4upK5CBzunk%r&=6#@GnbL*FrTt+dr zY-Xh{05K&c7KwuP`DNseQ2b!OO;Hoz{(MuZOCqr6D2m!>o{5|CB8-yd?HI8G_JFpe zzVQqSa}^u@q872srt(q-t2z#QDDPC-v|3{Jcf^G;nZ=;p1mR&DY=q@Ch`|*tCC2oH zIZd+2HemqpJAcS^mF$ez;6nEyd*_TVEFdMSo0|aZ3l%CNfTkKW{~L8ACyq!>$e!dh z6`357QIfaQZ+8E-XaKRY@H0;4>2g+Fa*)a@ZK+~0Q(EikbRvp6f>Coa&mc>VXhy;i zDH^4g;}(~^y<0&FXAE>KK~h;jL_0A><0uk%qqIvNTiy1o1HghbBJ8yq0Z5K9+Dnb! z$<3-B0{OU5N4~c!Yt}hQ?yRCQ?2ND6#-ycuv#eU37EiiPEd#tuce*QNBin~Lz)bcf zU#2OvEyYG`Jn7%-#amNMq|z@d_BfAGby&>&ULqvXP_bs`&rNU|iHXZ!1|#kMDvf^% z@5j)#sMj9TFPd|Ev9TO`bU|B3h)-U`g*|d>x&pX~{MmHSsfi0}6DCqrlNE%XFm{rP z^%l3$_ME)!APY+{>nxt75N$L&Xi12T)pYz(J2v$D0|xrhN#3Dk46Sud!L-Kv{!MK& zLc+T1nxsd81;u^n-*o|Qr7Och#byQtI|k~6R9!rIUc^y*@-+Y(?12~!vtV|#SSJ