@neuralnomads/codenomad-dev 0.20.0-dev-20260907-e9e94a67 → 0.20.0-dev-20260909-855d2ee7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/__tests__/instance-proxy.test.js +14 -0
- package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
- package/dist/server/http-server.js +1 -1
- package/dist/server/http-server.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/App-Nlt9zV-v.js +43 -0
- package/public/assets/App-Nlt9zV-v.js.map +1 -0
- package/public/assets/{FilesTab-CgfwF6tR.js → FilesTab-z7UrjcAQ.js} +3 -3
- package/public/assets/{FilesTab-CgfwF6tR.js.map → FilesTab-z7UrjcAQ.js.map} +1 -1
- package/public/assets/{GitChangesTab-r1JoAD9n.js → GitChangesTab-C04bYKhs.js} +3 -3
- package/public/assets/{GitChangesTab-r1JoAD9n.js.map → GitChangesTab-C04bYKhs.js.map} +1 -1
- package/public/assets/{SplitFilePanel-D9FfoZUZ.js → SplitFilePanel-B29MqCuU.js} +2 -2
- package/public/assets/{SplitFilePanel-D9FfoZUZ.js.map → SplitFilePanel-B29MqCuU.js.map} +1 -1
- package/public/assets/{StatusTab-DMnWj5WS.js → StatusTab-wUKfwnFf.js} +2 -2
- package/public/assets/{StatusTab-DMnWj5WS.js.map → StatusTab-wUKfwnFf.js.map} +1 -1
- package/public/assets/{align-justify-Dc1gjAkp.js → align-justify-glU678D9.js} +2 -2
- package/public/assets/{align-justify-Dc1gjAkp.js.map → align-justify-glU678D9.js.map} +1 -1
- package/public/assets/{bundle-full-CXK0RpEe.js → bundle-full-BrsCElYv.js} +2 -2
- package/public/assets/{bundle-full-CXK0RpEe.js.map → bundle-full-BrsCElYv.js.map} +1 -1
- package/public/assets/{client-state-DmImbmIC.js → client-state-j9Iu7F-E.js} +2 -2
- package/public/assets/{client-state-DmImbmIC.js.map → client-state-j9Iu7F-E.js.map} +1 -1
- package/public/assets/{diff-viewer-CbJWj99J.js → diff-viewer-B0VS1voD.js} +2 -2
- package/public/assets/{diff-viewer-CbJWj99J.js.map → diff-viewer-B0VS1voD.js.map} +1 -1
- package/public/assets/{index-C1AVy0gw.js → index-B6bX3AMT.js} +2 -2
- package/public/assets/{index-C1AVy0gw.js.map → index-B6bX3AMT.js.map} +1 -1
- package/public/assets/{index-Dggdc5Fz.js → index-BIRLnDWY.js} +2 -2
- package/public/assets/{index-Dggdc5Fz.js.map → index-BIRLnDWY.js.map} +1 -1
- package/public/assets/{index-xkTcWbMt.js → index-BuScpzpP.js} +2 -2
- package/public/assets/{index-xkTcWbMt.js.map → index-BuScpzpP.js.map} +1 -1
- package/public/assets/{index-BfORYhCR.js → index-BzAEHHap.js} +3 -3
- package/public/assets/index-BzAEHHap.js.map +1 -0
- package/public/assets/index-C-DZt-oz.css +1 -0
- package/public/assets/{index-C8aIk3bb.js → index-C9RXVQl9.js} +2 -2
- package/public/assets/{index-C8aIk3bb.js.map → index-C9RXVQl9.js.map} +1 -1
- package/public/assets/index-ClaHfu-1.js +2 -0
- package/public/assets/{index-Bv4cVEdt.js.map → index-ClaHfu-1.js.map} +1 -1
- package/public/assets/{index-UtSy15g1.js → index-DBx5htn3.js} +2 -2
- package/public/assets/{index-UtSy15g1.js.map → index-DBx5htn3.js.map} +1 -1
- package/public/assets/{index-AwBa5De4.js → index-DHHMf3u1.js} +2 -2
- package/public/assets/{index-AwBa5De4.js.map → index-DHHMf3u1.js.map} +1 -1
- package/public/assets/{index-CF7UTwOC.js → index-DN4Kstsd.js} +2 -2
- package/public/assets/{index-CF7UTwOC.js.map → index-DN4Kstsd.js.map} +1 -1
- package/public/assets/{index-D5cfewGV.js → index-DbMyNDyo.js} +2 -2
- package/public/assets/{index-D5cfewGV.js.map → index-DbMyNDyo.js.map} +1 -1
- package/public/assets/{index-kaTj6a0V.js → index-rcsmuqww.js} +2 -2
- package/public/assets/{index-kaTj6a0V.js.map → index-rcsmuqww.js.map} +1 -1
- package/public/assets/{index-BJSdILt0.js → index-uz2QFRlk.js} +2 -2
- package/public/assets/{index-BJSdILt0.js.map → index-uz2QFRlk.js.map} +1 -1
- package/public/assets/{loading-CLjF2dnt.js → loading-CYiiwb08.js} +2 -2
- package/public/assets/{loading-CLjF2dnt.js.map → loading-CYiiwb08.js.map} +1 -1
- package/public/assets/main-OmXs7qtG.js +48 -0
- package/public/assets/main-OmXs7qtG.js.map +1 -0
- package/public/assets/{markdown-DP0osupz.js → markdown-DWvSdCZz.js} +4 -4
- package/public/assets/{markdown-DP0osupz.js.map → markdown-DWvSdCZz.js.map} +1 -1
- package/public/assets/{monaco-viewer-BB3_mBkA.js → monaco-viewer-Cc9bWg7I.js} +2 -2
- package/public/assets/{monaco-viewer-BB3_mBkA.js.map → monaco-viewer-Cc9bWg7I.js.map} +1 -1
- package/public/assets/{startup-state-settings-card-Bc27wplD.js → startup-state-settings-card-2KHpBL8U.js} +2 -2
- package/public/assets/{startup-state-settings-card-Bc27wplD.js.map → startup-state-settings-card-2KHpBL8U.js.map} +1 -1
- package/public/assets/{terminal-square-4t6I40X6.js → terminal-square-lzHuj_of.js} +2 -2
- package/public/assets/{terminal-square-4t6I40X6.js.map → terminal-square-lzHuj_of.js.map} +1 -1
- package/public/assets/tool-call-DjkszeT4.js +60 -0
- package/public/assets/tool-call-DjkszeT4.js.map +1 -0
- package/public/assets/{unified-picker-CpvYPG8V.js → unified-picker-5JmIM6a0.js} +2 -2
- package/public/assets/{unified-picker-CpvYPG8V.js.map → unified-picker-5JmIM6a0.js.map} +1 -1
- package/public/assets/{wrap-text-Dq8UDb8D.js → wrap-text-N0Cav2Vp.js} +2 -2
- package/public/assets/{wrap-text-Dq8UDb8D.js.map → wrap-text-N0Cav2Vp.js.map} +1 -1
- package/public/index.html +4 -4
- package/public/loading.html +4 -4
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/public/assets/App-lAZZOE--.js +0 -43
- package/public/assets/App-lAZZOE--.js.map +0 -1
- package/public/assets/index-BfORYhCR.js.map +0 -1
- package/public/assets/index-Bv4cVEdt.js +0 -2
- package/public/assets/index-CT42quXi.css +0 -1
- package/public/assets/main-CA9pw_Mr.js +0 -48
- package/public/assets/main-CA9pw_Mr.js.map +0 -1
- package/public/assets/tool-call-BIHyGWIy.js +0 -60
- package/public/assets/tool-call-BIHyGWIy.js.map +0 -1
|
@@ -151,6 +151,20 @@ async function harness(sessionDirectory = "/repo/worktree", activeSessions = {},
|
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
153
|
describe("instance proxy location enforcement", () => {
|
|
154
|
+
it("forwards native execution settlement only for a session owned by the workspace", async () => {
|
|
155
|
+
const { app, requestCount, sessionGets } = await harness();
|
|
156
|
+
const response = await app.inject({ method: "POST", url: "/workspaces/workspace/instance/api/session/session/wait" });
|
|
157
|
+
assert.equal(response.statusCode, 200);
|
|
158
|
+
assert.equal(JSON.parse(response.body).url, "/api/session/session/wait");
|
|
159
|
+
assert.deepEqual(sessionGets, ["session"]);
|
|
160
|
+
assert.equal(requestCount(), 1);
|
|
161
|
+
});
|
|
162
|
+
it("rejects settlement waits for sessions belonging to another workspace", async () => {
|
|
163
|
+
const { app, requestCount } = await harness("/other");
|
|
164
|
+
const response = await app.inject({ method: "POST", url: "/workspaces/workspace/instance/api/session/session/wait" });
|
|
165
|
+
assert.equal(response.statusCode, 403);
|
|
166
|
+
assert.equal(requestCount(), 0);
|
|
167
|
+
});
|
|
154
168
|
it("filters the project list and its sandboxes to the workspace", async () => {
|
|
155
169
|
const { app, requestCount } = await harness();
|
|
156
170
|
const response = await app.inject({ method: "GET", url: "/workspaces/workspace/instance/api/project" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-proxy.test.js","sourceRoot":"","sources":["../../../src/server/__tests__/instance-proxy.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport { afterEach, describe, it } from \"node:test\"\nimport { Readable } from \"node:stream\"\nimport Fastify, { type FastifyInstance } from \"fastify\"\nimport replyFrom from \"@fastify/reply-from\"\nimport type { OpenCodeClient, SessionInfo } from \"@opencode-ai/client\"\nimport type { Logger } from \"../../logger\"\nimport { redactSecrets, registerInstanceProxyRoutes, type InstanceProxyWorkspaceManager } from \"../http-server\"\nimport { WorktreeDeletionFence } from \"../../workspaces/worktree-session-evacuation\"\n\nconst apps: FastifyInstance[] = []\nafterEach(async () => Promise.all(apps.splice(0).map((app) => app.close())))\n\nconst cursor = (value: object) => Buffer.from(JSON.stringify(value)).toString(\"base64url\")\n\nfunction logger(): Logger {\n const value = { debug() {}, trace() {}, error() {}, isLevelEnabled() { return false } }\n return value as unknown as Logger\n}\n\nasync function harness(\n sessionDirectory = \"/repo/worktree\",\n activeSessions: Record<string, { type: \"running\" }> = {},\n sessionLocations: Record<string, string | Error> = {},\n workspacePath = \"/repo\",\n serviceDirectory = workspacePath,\n pathMappings: Record<string, string> = {},\n ptyDirectories: Record<string, string | Error> = {},\n shellDirectories: Record<string, string | Error> = {},\n directoryMappings: Record<string, string> = {},\n) {\n const upstream = Fastify()\n apps.push(upstream)\n let requests = 0\n let releaseDelayedUpstream: (() => void) | undefined\n let markDelayedUpstreamStarted!: () => void\n const delayedUpstreamStarted = new Promise<void>((resolve) => { markDelayedUpstreamStarted = resolve })\n upstream.all(\"/*\", async (request, reply) => {\n requests++\n if (request.headers[\"x-test-delay-upstream-body\"] === \"1\") {\n let started = false\n const stream = new Readable({\n read() {\n if (started) return\n started = true\n this.push('{\"started\":')\n markDelayedUpstreamStarted()\n releaseDelayedUpstream = () => {\n this.push(\"true}\")\n this.push(null)\n }\n },\n })\n return reply.type(\"application/json\").send(stream)\n }\n if (request.headers[\"x-test-delay-upstream\"] === \"1\") {\n markDelayedUpstreamStarted()\n await new Promise<void>((resolve) => { releaseDelayedUpstream = resolve })\n }\n reply.header(\"set-cookie\", \"upstream_session=secret; Path=/\")\n reply.header(\"www-authenticate\", 'Basic realm=\"OpenCode\"')\n reply.header(\"proxy-authenticate\", 'Basic realm=\"OpenCode proxy\"')\n if (request.headers[\"x-test-challenge\"] === \"1\") reply.code(401)\n return { url: request.raw.url, body: request.body, headers: request.headers }\n })\n await upstream.listen({ host: \"127.0.0.1\", port: 0 })\n const address = upstream.server.address()\n assert.ok(address && typeof address === \"object\")\n\n const owned = new Set([workspacePath, serviceDirectory, \"/repo\", \"/repo/worktree\", ...Object.keys(directoryMappings)])\n const sessionGets: string[] = []\n const pathOwnershipChecks: string[] = []\n const servicePathCalls: string[] = []\n let invalidations = 0\n const client = {\n project: {\n list: async () => [\n { id: \"owned-project\", canonical: serviceDirectory, time: { created: 1, updated: 1 }, sandboxes: [sessionDirectory, \"/other\"] },\n { id: \"foreign-project\", canonical: \"/other\", time: { created: 1, updated: 1 }, sandboxes: [] },\n ],\n },\n session: {\n get: async ({ sessionID }: { sessionID: string }) => {\n sessionGets.push(sessionID)\n const location = sessionLocations[sessionID] ?? sessionDirectory\n if (location instanceof Error) throw location\n return { id: sessionID, location: { directory: location } } as SessionInfo\n },\n active: async () => activeSessions,\n },\n pty: {\n list: async () => ({\n location: { directory: serviceDirectory, project: { id: \"project\", directory: serviceDirectory, canonical: serviceDirectory } },\n data: Object.entries(ptyDirectories).filter((entry): entry is [string, string] => typeof entry[1] === \"string\").map(([id, cwd]) => ({\n id, title: id, command: \"npm\", args: [\"run\", \"dev\"], cwd, status: \"running\" as const, pid: 42,\n })),\n }),\n get: async ({ ptyID }: { ptyID: string }) => {\n const cwd = ptyDirectories[ptyID] ?? sessionDirectory\n if (cwd instanceof Error) throw cwd\n return { data: { id: ptyID, title: ptyID, command: \"npm\", args: [\"run\", \"dev\"], cwd, status: \"running\", pid: 42 } }\n },\n },\n shell: {\n list: async () => ({\n location: { directory: serviceDirectory, project: { id: \"project\", directory: serviceDirectory, canonical: serviceDirectory } },\n data: Object.entries(shellDirectories).filter((entry): entry is [string, string] => typeof entry[1] === \"string\").map(([id, cwd]) => ({\n id, command: \"npm run dev\", cwd, shell: \"sh\", file: \"/tmp/output\", status: \"running\" as const, pid: 42, metadata: {}, time: { started: 1 },\n })),\n }),\n get: async ({ id }: { id: string }) => {\n const cwd = shellDirectories[id] ?? sessionDirectory\n if (cwd instanceof Error) throw cwd\n return { data: { id, command: \"npm run dev\", cwd, shell: \"sh\", file: \"/tmp/output\", status: \"running\", pid: 42, metadata: {}, time: { started: 1 } } }\n },\n },\n } as OpenCodeClient\n const manager: InstanceProxyWorkspaceManager = {\n get: () => ({ id: \"workspace\", path: workspacePath }) as never,\n getSharedServiceEndpoint: async () => ({ url: `http://127.0.0.1:${address.port}` }),\n invalidateSharedServiceConnection: () => { invalidations += 1 },\n getInstanceAuthorizationHeader: () => \"Basic internal-secret\",\n getServiceDirectory: () => serviceDirectory,\n getServiceDirectoryForPath: async (_id, directory) => directory === workspacePath\n ? serviceDirectory\n : owned.has(directory) ? directoryMappings[directory] ?? directory : undefined,\n getWorktreeIdentityForPath: async (_id, directory) => {\n const canonical = directory === workspacePath ? serviceDirectory : directoryMappings[directory] ?? directory\n if (!owned.has(directory)) return undefined\n return canonical.includes(\"/worktree\") ? \"workspace:worktree\" : \"workspace:root\"\n },\n getServicePathForPath: async (_id, candidate) => {\n assert.ok(pathOwnershipChecks.includes(candidate), \"prompt path must be ownership-checked before translation\")\n servicePathCalls.push(candidate)\n return pathMappings[candidate] ?? candidate\n },\n getSharedServiceClient: async () => client,\n ownsLocation: async (_id, location) => owned.has(location.directory)\n && (!location.workspaceID || location.workspaceID === (location.directory.includes(\"worktree\") ? \"worktree-location\" : \"owned-location\")),\n ownsLocationWorkspace: async (_id, workspaceID) => workspaceID === \"owned-location\" || workspaceID === \"worktree-location\",\n ownsDirectory: async (_id, directory) => owned.has(directory),\n ownsPath: async (_id, candidate) => {\n pathOwnershipChecks.push(candidate)\n return candidate === \"/repo\" || candidate.startsWith(\"/repo/\") || candidate in pathMappings\n },\n }\n const app = Fastify()\n const worktreeDeletionFence = new WorktreeDeletionFence()\n apps.push(app)\n await app.register(replyFrom)\n registerInstanceProxyRoutes(app, { workspaceManager: manager, logger: logger(), worktreeDeletionFence })\n await app.ready()\n return {\n app,\n servicePathCalls,\n sessionGets,\n worktreeDeletionFence,\n requestCount: () => requests,\n delayedUpstreamStarted,\n releaseDelayedUpstream: () => releaseDelayedUpstream?.(),\n invalidationCount: () => invalidations,\n }\n}\n\ndescribe(\"instance proxy location enforcement\", () => {\n it(\"filters the project list and its sandboxes to the workspace\", async () => {\n const { app, requestCount } = await harness()\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/project\" })\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body), [{\n id: \"owned-project\",\n canonical: \"/repo\",\n time: { created: 1, updated: 1 },\n sandboxes: [\"/repo/worktree\"],\n }])\n assert.equal(requestCount(), 0)\n })\n\n it(\"rejects arbitrary locations instead of overwriting them\", async () => {\n const { app, requestCount } = await harness()\n const bodyResponse = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/other\" } },\n })\n const queryResponse = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?directory=%2Fother\",\n })\n assert.equal(bodyResponse.statusCode, 403)\n assert.equal(queryResponse.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.doesNotMatch(bodyResponse.body, /internal-secret/)\n })\n\n it(\"preserves owned native workspace selectors and rejects mismatched pairs\", async () => {\n const { app, requestCount } = await harness()\n const query = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?location%5Bdirectory%5D=%2Frepo%2Fworktree&location%5Bworkspace%5D=worktree-location\",\n })\n assert.equal(query.statusCode, 200)\n assert.match(JSON.parse(query.body).url, /location%5Bworkspace%5D=worktree-location/)\n\n const create = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo\", workspaceID: \"owned-location\" } },\n })\n assert.equal(create.statusCode, 200)\n assert.equal(JSON.parse(create.body).body.location.workspaceID, \"owned-location\")\n\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?location%5Bdirectory%5D=%2Frepo%2Fworktree&location%5Bworkspace%5D=owned-location\",\n })\n assert.equal(foreign.statusCode, 403)\n\n const unsupported = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?workspace=owned-location\",\n })\n assert.equal(unsupported.statusCode, 400)\n assert.equal(requestCount(), 2)\n })\n\n it(\"rejects session admission while a worktree deletion is pending\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness()\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"holds mutation admission until the upstream response arrives\", async () => {\n const { app, worktreeDeletionFence, delayedUpstreamStarted, releaseDelayedUpstream } = await harness()\n const mutation = app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-delay-upstream\": \"1\" },\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n await delayedUpstreamStarted\n let deleted = false\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], async () => { deleted = true })\n\n await new Promise((resolve) => setImmediate(resolve))\n assert.equal(deleted, false)\n releaseDelayedUpstream()\n assert.equal((await mutation).statusCode, 200)\n await deletion\n assert.equal(deleted, true)\n })\n\n it(\"holds mutation admission until the upstream response body ends\", async () => {\n const { app, worktreeDeletionFence, delayedUpstreamStarted, releaseDelayedUpstream } = await harness()\n const mutation = app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-delay-upstream-body\": \"1\" },\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n await delayedUpstreamStarted\n let deleted = false\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], async () => { deleted = true })\n\n await new Promise((resolve) => setImmediate(resolve))\n assert.equal(deleted, false)\n releaseDelayedUpstream()\n assert.equal((await mutation).statusCode, 200)\n await deletion\n assert.equal(deleted, true)\n })\n\n it(\"blocks lexical aliases after translation to the canonical worktree\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/.\": \"/repo/worktree\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree/.\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"blocks existing-session mutations through their canonical directory\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, { session: \"/repo/worktree/.\" }, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/.\": \"/repo/worktree\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"DELETE\",\n url: \"/workspaces/workspace/instance/api/session/session\",\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"blocks mutations in nested directories of the deleting worktree\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/nested\": \"/repo/worktree/nested\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree/nested\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"allows the scoped native location bootstrap\", async () => {\n const { app } = await harness()\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/location\" })\n assert.equal(response.statusCode, 200)\n assert.match(JSON.parse(response.body).url, /\\/api\\/location\\?location%5Bdirectory%5D=%2Frepo/)\n })\n\n it(\"allows updates to messages in owned sessions\", async () => {\n const { app, requestCount, sessionGets } = await harness()\n const response = await app.inject({\n method: \"PATCH\",\n url: \"/workspaces/workspace/instance/api/session/session/message/message\",\n payload: { content: [{ type: \"text\", text: \"kept\" }] },\n })\n\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body).body, { content: [{ type: \"text\", text: \"kept\" }] })\n assert.deepEqual(sessionGets, [\"session\"])\n assert.equal(requestCount(), 1)\n })\n\n it(\"allows owned native VCS reads and rejects foreign locations\", async () => {\n const { app, requestCount } = await harness()\n const owned = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/vcs?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/vcs?location%5Bdirectory%5D=%2Fother\",\n })\n\n assert.equal(owned.statusCode, 200)\n assert.equal(JSON.parse(owned.body).url, \"/api/vcs?location%5Bdirectory%5D=%2Frepo%2Fworktree\")\n assert.equal(foreign.statusCode, 403)\n assert.equal(requestCount(), 1)\n })\n\n it(\"authorizes project-only session lists without adding a directory\", async () => {\n const { app } = await harness()\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?project=owned-project\",\n })\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).url, \"/api/session?project=owned-project\")\n\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?project=foreign-project\",\n })\n assert.equal(foreign.statusCode, 403)\n })\n\n it(\"uses the cursor scope and rejects malformed or forged session-list cursors\", async () => {\n const { app, requestCount } = await harness()\n const ownedCursor = cursor({ directory: \"/repo/worktree\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })\n const response = await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${ownedCursor}&directory=%2Fother&workspace=foreign-location`,\n })\n assert.equal(response.statusCode, 200)\n const upstreamUrl = JSON.parse(response.body).url as string\n assert.match(upstreamUrl, new RegExp(`cursor=${ownedCursor}`))\n assert.doesNotMatch(upstreamUrl, /directory=/)\n assert.doesNotMatch(upstreamUrl, /workspace=/)\n\n const forgedCursor = cursor({ directory: \"/other\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${forgedCursor}&directory=%2Frepo`,\n })).statusCode, 403)\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?cursor=not-json\",\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ directory: \"/repo\" })}`,\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ workspace: \"foreign-location\", directory: \"/repo\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })}`,\n })).statusCode, 403)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ workspace: \"owned-location\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })}`,\n })).statusCode, 200)\n assert.equal(requestCount(), 2)\n })\n\n it(\"filters PTYs and rejects foreign PTY access\", async () => {\n const { app, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {\n owned: \"/repo/worktree\",\n foreign: \"/other\",\n })\n\n const listed = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n assert.equal(listed.statusCode, 200)\n assert.deepEqual(JSON.parse(listed.body).data.map((pty: { id: string }) => pty.id), [\"owned\"])\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty?location%5Bdirectory%5D=%2Fother\",\n })).statusCode, 403)\n\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty/foreign/?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"strips browser session and hop-by-hop headers in both directions\", async () => {\n const { app, invalidationCount } = await harness()\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: {\n authorization: \"Bearer browser-secret\",\n connection: \"keep-alive, x-remove-me\",\n cookie: \"codenomad_session=browser-secret; other=value\",\n \"x-forwarded-for\": \"203.0.113.1\",\n \"x-opencode-directory\": \"/other\",\n \"x-opencode-workspace\": \"foreign-workspace\",\n \"x-opencode-routing-test\": \"foreign-route\",\n \"x-remove-me\": \"secret\",\n },\n })\n const headers = JSON.parse(response.body).headers\n assert.equal(headers.authorization, \"Basic internal-secret\")\n assert.equal(headers.cookie, undefined)\n assert.doesNotMatch(headers.connection ?? \"\", /x-remove-me/i)\n assert.equal(headers[\"x-forwarded-for\"], undefined)\n assert.equal(headers[\"x-opencode-directory\"], undefined)\n assert.equal(headers[\"x-opencode-workspace\"], undefined)\n assert.equal(headers[\"x-opencode-routing-test\"], undefined)\n assert.equal(headers[\"x-remove-me\"], undefined)\n assert.equal(response.headers[\"set-cookie\"], undefined)\n assert.equal(response.headers[\"www-authenticate\"], undefined)\n assert.equal(response.headers[\"proxy-authenticate\"], undefined)\n\n const challenge = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-challenge\": \"1\" },\n })\n assert.equal(challenge.statusCode, 401)\n assert.equal(invalidationCount(), 1)\n assert.equal(challenge.headers[\"www-authenticate\"], undefined)\n assert.equal(challenge.headers[\"proxy-authenticate\"], undefined)\n })\n\n it(\"rejects sessions owned by another workspace\", async () => {\n const { app, requestCount } = await harness(\"/other\")\n const response = await app.inject({ method: \"DELETE\", url: \"/workspaces/workspace/instance/api/session/session-2\" })\n assert.equal(response.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.doesNotMatch(response.body, /internal-secret/)\n })\n\n it(\"lists owned shells and rejects foreign shell access\", async () => {\n const { app, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {\n owned: \"/repo/worktree\",\n foreign: \"/other\",\n })\n\n const listed = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/shell?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n assert.equal(listed.statusCode, 200)\n assert.deepEqual(JSON.parse(listed.body).data.map((shell: { id: string }) => shell.id), [\"owned\"])\n for (const [method, path] of [[\"DELETE\", \"foreign/\"], [\"GET\", \"foreign/output/\"]] as const) {\n assert.equal((await app.inject({\n method,\n url: `/workspaces/workspace/instance/api/shell/${path}?location%5Bdirectory%5D=%2Frepo%2Fworktree`,\n })).statusCode, 403)\n }\n assert.equal(requestCount(), 0)\n })\n\n it(\"permits only native global Forms actions without session hydration\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/other\")\n for (const action of [\"reply\", \"cancel\"]) {\n const response = await app.inject({\n method: \"POST\",\n url: `/workspaces/workspace/instance/api/session/global/form/form-1/${action}`,\n payload: action === \"reply\" ? { answers: {} } : {},\n })\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).url, `/api/session/global/form/form-1/${action}?location%5Bdirectory%5D=%2Frepo`)\n }\n assert.deepEqual(sessionGets, [])\n assert.equal(requestCount(), 2)\n\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/prompt\",\n payload: { text: \"no\" },\n })).statusCode, 403)\n assert.deepEqual(sessionGets, [\"global\"])\n })\n\n it(\"forwards a validated global Form root location and workspace\", async () => {\n const { app } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/srv/repo\")\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: {\n \"x-opencode-directory\": encodeURIComponent(\"/repo\"),\n \"x-opencode-workspace\": \"owned-location\",\n },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 200)\n const upstream = JSON.parse(response.body)\n assert.equal(upstream.headers[\"x-opencode-directory\"], encodeURIComponent(\"/srv/repo\"))\n assert.equal(upstream.headers[\"x-opencode-workspace\"], \"owned-location\")\n })\n\n it(\"translates and forwards a validated global Form worktree location\", async () => {\n const { app } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/srv/repo\", {}, {}, {},\n { \"/repo/worktree\": \"/srv/worktree\" },\n )\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/cancel\",\n headers: { \"x-opencode-directory\": encodeURIComponent(\"/repo/worktree\") },\n payload: {},\n })\n\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).headers[\"x-opencode-directory\"], encodeURIComponent(\"/srv/worktree\"))\n })\n\n it(\"rejects a foreign global Form location before proxying\", async () => {\n const { app, requestCount } = await harness()\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": encodeURIComponent(\"/other\") },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 403)\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": \"%ZZ\" },\n payload: { answers: {} },\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: {\n \"x-opencode-directory\": encodeURIComponent(\"/repo\"),\n \"x-opencode-workspace\": \"foreign-location\",\n },\n payload: { answers: {} },\n })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"decodes, translates, and re-encodes Unicode global Form locations\", async () => {\n const directory = \"/工作/100% ready\"\n const serviceDirectory = \"/服务/工作 100%\"\n const { app } = await harness(directory, {}, {}, directory, serviceDirectory)\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": encodeURIComponent(directory) },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).headers[\"x-opencode-directory\"], encodeURIComponent(serviceDirectory))\n })\n\n it(\"rejects deletion through a double-encoded alias of a foreign session\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", {}, {\n \"foreign%25session\": \"/other\",\n })\n const response = await app.inject({\n method: \"DELETE\",\n url: \"/workspaces/workspace/instance/api/session/foreign%2525session\",\n })\n assert.equal(response.statusCode, 403)\n assert.deepEqual(sessionGets, [\"foreign%25session\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"returns a client error when a double-encoded session ID is invalid upstream\", async () => {\n const invalid = Object.assign(new Error(\"invalid session ID\"), { _tag: \"InvalidRequestError\" })\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", {}, {\n \"foreign%25session\": invalid,\n })\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session/foreign%2525session\",\n })\n\n assert.equal(response.statusCode, 400)\n assert.deepEqual(sessionGets, [\"foreign%25session\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"filters active sessions to the workspace without failing on stale ids\", async () => {\n const active = { owned: { type: \"running\" as const }, foreign: { type: \"running\" as const }, stale: { type: \"running\" as const } }\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", active, {\n foreign: \"/other\",\n stale: new Error(\"missing\"),\n })\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/session/active\" })\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body), { owned: { type: \"running\" } })\n assert.deepEqual(sessionGets.sort(), [\"foreign\", \"owned\", \"stale\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"blocks global routes through a workspace\", async () => {\n const { app, requestCount } = await harness()\n for (const route of [\"global/dispose\", \"global/config\", \"global/upgrade\"]) {\n const response = await app.inject({ method: \"POST\", url: `/workspaces/workspace/instance/${route}` })\n assert.equal(response.statusCode, 403)\n }\n for (const route of [\"event\", \"debug/location\"]) {\n const response = await app.inject({ method: \"GET\", url: `/workspaces/workspace/instance/api/${route}` })\n assert.equal(response.statusCode, 403)\n }\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/service/stop\",\n payload: { instanceID: \"instance-1\" },\n })).statusCode, 403)\n assert.equal((await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/permission/saved\" })).statusCode, 403)\n assert.equal((await app.inject({ method: \"DELETE\", url: \"/workspaces/workspace/instance/api/permission/saved/global-rule\" })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"allows native pending-state management for owned sessions\", async () => {\n const { app } = await harness()\n const requests = [\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/inbox\"],\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/permission\"],\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/form\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/background\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/revert/clear\"],\n [\"GET\", \"/workspaces/workspace/instance/api/skill\"],\n [\"GET\", \"/workspaces/workspace/instance/api/reference\"],\n [\"GET\", \"/workspaces/workspace/instance/api/mcp/resource\"],\n [\"GET\", \"/workspaces/workspace/instance/api/websearch/provider\"],\n [\"DELETE\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1/steer\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1/queue\"],\n ] as const\n\n for (const [method, url] of requests) {\n assert.equal((await app.inject({ method, url })).statusCode, 200, `${method} ${url}`)\n }\n })\n\n it(\"rejects literal and encoded dot-segment aliases before authorization\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/other\")\n for (const route of [\n \"api/session/owned/%2e%2e/foreign\",\n \"api/session/owned/%252e%252e/%252e%252e/event\",\n \"api/session/owned/../../debug/location\",\n ]) {\n const response = await app.inject({ method: \"GET\", url: `/workspaces/workspace/instance/${route}` })\n assert.ok([400, 403, 404].includes(response.statusCode), `${route}: ${response.statusCode}`)\n }\n assert.deepEqual(sessionGets, [\"foreign\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"validates prompt file ownership before translating root, worktree, and Windows URIs\", async () => {\n const mappings = {\n \"/repo/notes.txt\": \"/home/dev/repo/notes.txt\",\n \"/repo/worktree/notes.txt\": \"/home/dev/worktree/notes.txt\",\n \"C:/repo/notes.txt\": \"/mnt/c/repo/notes.txt\",\n }\n const { app, servicePathCalls, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", mappings)\n const malformed = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///%ZZ\" }] },\n })\n assert.equal(malformed.statusCode, 400)\n\n const foreign = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///other/secret.txt\" }] },\n })\n assert.equal(foreign.statusCode, 403)\n const traversed = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///repo/worktree/../../other/secret.txt\" }] },\n })\n assert.equal(traversed.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.deepEqual(servicePathCalls, [])\n\n const owned = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [\n { uri: \"file:///repo/notes.txt\" },\n { uri: \"file:///repo/worktree/notes.txt\" },\n { uri: \"file:///C:/repo/notes.txt\" },\n ] },\n })\n assert.equal(owned.statusCode, 200)\n assert.deepEqual(JSON.parse(owned.body).body.files.map((file: { uri: string }) => file.uri), [\n \"file:///home/dev/repo/notes.txt\",\n \"file:///home/dev/worktree/notes.txt\",\n \"file:///mnt/c/repo/notes.txt\",\n ])\n assert.deepEqual(servicePathCalls, Object.keys(mappings))\n assert.equal(requestCount(), 1)\n })\n\n it(\"defaults and validates only schema-defined imported session locations\", async () => {\n const { app, requestCount } = await harness()\n const accepted = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/import\",\n payload: {\n info: { id: \"session-1\", metadata: { location: { directory: \"/other\" } } },\n messages: [{\n type: \"location-switched\",\n location: { directory: \"/repo/worktree\" },\n previous: { location: null },\n metadata: { location: { directory: \"/other\" } },\n content: [{ type: \"tool\", state: { input: { location: \"/other\" } } }],\n }],\n },\n })\n assert.equal(accepted.statusCode, 200)\n const body = JSON.parse(accepted.body).body\n assert.deepEqual(body.location, { directory: \"/repo\" })\n assert.deepEqual(body.info.location, { directory: \"/repo\" })\n assert.deepEqual(body.messages[0].previous.location, { directory: \"/repo\" })\n assert.deepEqual(body.messages[0].metadata.location, { directory: \"/other\" })\n assert.equal(body.messages[0].content[0].state.input.location, \"/other\")\n\n const rejected = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/import\",\n payload: {\n info: { id: \"session-2\", location: { directory: \"/repo\" } },\n messages: [{ type: \"location-switched\", location: { directory: \"/repo/worktree\" }, previous: { location: { directory: \"/other\" } } }],\n },\n })\n assert.equal(rejected.statusCode, 403)\n assert.equal(requestCount(), 1)\n })\n\n it(\"never sends workspace credentials to an encoded or backslash foreign origin\", async () => {\n const foreign = Fastify()\n apps.push(foreign)\n const credentials: unknown[] = []\n foreign.all(\"/*\", async (request) => credentials.push(request.headers.authorization))\n await foreign.listen({ host: \"127.0.0.1\", port: 0 })\n const address = foreign.server.address()\n assert.ok(address && typeof address === \"object\")\n\n const { app, requestCount } = await harness()\n for (const prefix of [\"%2F%2F\", \"%5C%5C\"]) {\n const proxyResponse: Awaited<ReturnType<typeof app.inject>> = await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/${prefix}127.0.0.1:${address.port}/steal`,\n })\n assert.equal(proxyResponse.statusCode, 400)\n assert.doesNotMatch(proxyResponse.body, /internal-secret/)\n }\n assert.equal(requestCount(), 0)\n assert.deepEqual(credentials, [])\n })\n})\n\nit(\"redacts secret-bearing fields recursively\", () => {\n assert.deepEqual(redactSecrets({\n authorization: \"Basic internal-secret\",\n apiKey: \"key-value\",\n nested: { authorizationCode: \"code-value\", password: \"password-value\", safe: \"visible\", retries: 2 },\n items: [{ accessToken: \"token-value\" }, { clientSecret: \"secret-value\" }],\n }), {\n authorization: \"<redacted>\",\n apiKey: \"<redacted>\",\n nested: { authorizationCode: \"<redacted>\", password: \"<redacted>\", safe: \"visible\", retries: 2 },\n items: [{ accessToken: \"<redacted>\" }, { clientSecret: \"<redacted>\" }],\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"instance-proxy.test.js","sourceRoot":"","sources":["../../../src/server/__tests__/instance-proxy.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport { afterEach, describe, it } from \"node:test\"\nimport { Readable } from \"node:stream\"\nimport Fastify, { type FastifyInstance } from \"fastify\"\nimport replyFrom from \"@fastify/reply-from\"\nimport type { OpenCodeClient, SessionInfo } from \"@opencode-ai/client\"\nimport type { Logger } from \"../../logger\"\nimport { redactSecrets, registerInstanceProxyRoutes, type InstanceProxyWorkspaceManager } from \"../http-server\"\nimport { WorktreeDeletionFence } from \"../../workspaces/worktree-session-evacuation\"\n\nconst apps: FastifyInstance[] = []\nafterEach(async () => Promise.all(apps.splice(0).map((app) => app.close())))\n\nconst cursor = (value: object) => Buffer.from(JSON.stringify(value)).toString(\"base64url\")\n\nfunction logger(): Logger {\n const value = { debug() {}, trace() {}, error() {}, isLevelEnabled() { return false } }\n return value as unknown as Logger\n}\n\nasync function harness(\n sessionDirectory = \"/repo/worktree\",\n activeSessions: Record<string, { type: \"running\" }> = {},\n sessionLocations: Record<string, string | Error> = {},\n workspacePath = \"/repo\",\n serviceDirectory = workspacePath,\n pathMappings: Record<string, string> = {},\n ptyDirectories: Record<string, string | Error> = {},\n shellDirectories: Record<string, string | Error> = {},\n directoryMappings: Record<string, string> = {},\n) {\n const upstream = Fastify()\n apps.push(upstream)\n let requests = 0\n let releaseDelayedUpstream: (() => void) | undefined\n let markDelayedUpstreamStarted!: () => void\n const delayedUpstreamStarted = new Promise<void>((resolve) => { markDelayedUpstreamStarted = resolve })\n upstream.all(\"/*\", async (request, reply) => {\n requests++\n if (request.headers[\"x-test-delay-upstream-body\"] === \"1\") {\n let started = false\n const stream = new Readable({\n read() {\n if (started) return\n started = true\n this.push('{\"started\":')\n markDelayedUpstreamStarted()\n releaseDelayedUpstream = () => {\n this.push(\"true}\")\n this.push(null)\n }\n },\n })\n return reply.type(\"application/json\").send(stream)\n }\n if (request.headers[\"x-test-delay-upstream\"] === \"1\") {\n markDelayedUpstreamStarted()\n await new Promise<void>((resolve) => { releaseDelayedUpstream = resolve })\n }\n reply.header(\"set-cookie\", \"upstream_session=secret; Path=/\")\n reply.header(\"www-authenticate\", 'Basic realm=\"OpenCode\"')\n reply.header(\"proxy-authenticate\", 'Basic realm=\"OpenCode proxy\"')\n if (request.headers[\"x-test-challenge\"] === \"1\") reply.code(401)\n return { url: request.raw.url, body: request.body, headers: request.headers }\n })\n await upstream.listen({ host: \"127.0.0.1\", port: 0 })\n const address = upstream.server.address()\n assert.ok(address && typeof address === \"object\")\n\n const owned = new Set([workspacePath, serviceDirectory, \"/repo\", \"/repo/worktree\", ...Object.keys(directoryMappings)])\n const sessionGets: string[] = []\n const pathOwnershipChecks: string[] = []\n const servicePathCalls: string[] = []\n let invalidations = 0\n const client = {\n project: {\n list: async () => [\n { id: \"owned-project\", canonical: serviceDirectory, time: { created: 1, updated: 1 }, sandboxes: [sessionDirectory, \"/other\"] },\n { id: \"foreign-project\", canonical: \"/other\", time: { created: 1, updated: 1 }, sandboxes: [] },\n ],\n },\n session: {\n get: async ({ sessionID }: { sessionID: string }) => {\n sessionGets.push(sessionID)\n const location = sessionLocations[sessionID] ?? sessionDirectory\n if (location instanceof Error) throw location\n return { id: sessionID, location: { directory: location } } as SessionInfo\n },\n active: async () => activeSessions,\n },\n pty: {\n list: async () => ({\n location: { directory: serviceDirectory, project: { id: \"project\", directory: serviceDirectory, canonical: serviceDirectory } },\n data: Object.entries(ptyDirectories).filter((entry): entry is [string, string] => typeof entry[1] === \"string\").map(([id, cwd]) => ({\n id, title: id, command: \"npm\", args: [\"run\", \"dev\"], cwd, status: \"running\" as const, pid: 42,\n })),\n }),\n get: async ({ ptyID }: { ptyID: string }) => {\n const cwd = ptyDirectories[ptyID] ?? sessionDirectory\n if (cwd instanceof Error) throw cwd\n return { data: { id: ptyID, title: ptyID, command: \"npm\", args: [\"run\", \"dev\"], cwd, status: \"running\", pid: 42 } }\n },\n },\n shell: {\n list: async () => ({\n location: { directory: serviceDirectory, project: { id: \"project\", directory: serviceDirectory, canonical: serviceDirectory } },\n data: Object.entries(shellDirectories).filter((entry): entry is [string, string] => typeof entry[1] === \"string\").map(([id, cwd]) => ({\n id, command: \"npm run dev\", cwd, shell: \"sh\", file: \"/tmp/output\", status: \"running\" as const, pid: 42, metadata: {}, time: { started: 1 },\n })),\n }),\n get: async ({ id }: { id: string }) => {\n const cwd = shellDirectories[id] ?? sessionDirectory\n if (cwd instanceof Error) throw cwd\n return { data: { id, command: \"npm run dev\", cwd, shell: \"sh\", file: \"/tmp/output\", status: \"running\", pid: 42, metadata: {}, time: { started: 1 } } }\n },\n },\n } as OpenCodeClient\n const manager: InstanceProxyWorkspaceManager = {\n get: () => ({ id: \"workspace\", path: workspacePath }) as never,\n getSharedServiceEndpoint: async () => ({ url: `http://127.0.0.1:${address.port}` }),\n invalidateSharedServiceConnection: () => { invalidations += 1 },\n getInstanceAuthorizationHeader: () => \"Basic internal-secret\",\n getServiceDirectory: () => serviceDirectory,\n getServiceDirectoryForPath: async (_id, directory) => directory === workspacePath\n ? serviceDirectory\n : owned.has(directory) ? directoryMappings[directory] ?? directory : undefined,\n getWorktreeIdentityForPath: async (_id, directory) => {\n const canonical = directory === workspacePath ? serviceDirectory : directoryMappings[directory] ?? directory\n if (!owned.has(directory)) return undefined\n return canonical.includes(\"/worktree\") ? \"workspace:worktree\" : \"workspace:root\"\n },\n getServicePathForPath: async (_id, candidate) => {\n assert.ok(pathOwnershipChecks.includes(candidate), \"prompt path must be ownership-checked before translation\")\n servicePathCalls.push(candidate)\n return pathMappings[candidate] ?? candidate\n },\n getSharedServiceClient: async () => client,\n ownsLocation: async (_id, location) => owned.has(location.directory)\n && (!location.workspaceID || location.workspaceID === (location.directory.includes(\"worktree\") ? \"worktree-location\" : \"owned-location\")),\n ownsLocationWorkspace: async (_id, workspaceID) => workspaceID === \"owned-location\" || workspaceID === \"worktree-location\",\n ownsDirectory: async (_id, directory) => owned.has(directory),\n ownsPath: async (_id, candidate) => {\n pathOwnershipChecks.push(candidate)\n return candidate === \"/repo\" || candidate.startsWith(\"/repo/\") || candidate in pathMappings\n },\n }\n const app = Fastify()\n const worktreeDeletionFence = new WorktreeDeletionFence()\n apps.push(app)\n await app.register(replyFrom)\n registerInstanceProxyRoutes(app, { workspaceManager: manager, logger: logger(), worktreeDeletionFence })\n await app.ready()\n return {\n app,\n servicePathCalls,\n sessionGets,\n worktreeDeletionFence,\n requestCount: () => requests,\n delayedUpstreamStarted,\n releaseDelayedUpstream: () => releaseDelayedUpstream?.(),\n invalidationCount: () => invalidations,\n }\n}\n\ndescribe(\"instance proxy location enforcement\", () => {\n it(\"forwards native execution settlement only for a session owned by the workspace\", async () => {\n const { app, requestCount, sessionGets } = await harness()\n const response = await app.inject({ method: \"POST\", url: \"/workspaces/workspace/instance/api/session/session/wait\" })\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).url, \"/api/session/session/wait\")\n assert.deepEqual(sessionGets, [\"session\"])\n assert.equal(requestCount(), 1)\n })\n\n it(\"rejects settlement waits for sessions belonging to another workspace\", async () => {\n const { app, requestCount } = await harness(\"/other\")\n const response = await app.inject({ method: \"POST\", url: \"/workspaces/workspace/instance/api/session/session/wait\" })\n assert.equal(response.statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"filters the project list and its sandboxes to the workspace\", async () => {\n const { app, requestCount } = await harness()\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/project\" })\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body), [{\n id: \"owned-project\",\n canonical: \"/repo\",\n time: { created: 1, updated: 1 },\n sandboxes: [\"/repo/worktree\"],\n }])\n assert.equal(requestCount(), 0)\n })\n\n it(\"rejects arbitrary locations instead of overwriting them\", async () => {\n const { app, requestCount } = await harness()\n const bodyResponse = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/other\" } },\n })\n const queryResponse = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?directory=%2Fother\",\n })\n assert.equal(bodyResponse.statusCode, 403)\n assert.equal(queryResponse.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.doesNotMatch(bodyResponse.body, /internal-secret/)\n })\n\n it(\"preserves owned native workspace selectors and rejects mismatched pairs\", async () => {\n const { app, requestCount } = await harness()\n const query = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?location%5Bdirectory%5D=%2Frepo%2Fworktree&location%5Bworkspace%5D=worktree-location\",\n })\n assert.equal(query.statusCode, 200)\n assert.match(JSON.parse(query.body).url, /location%5Bworkspace%5D=worktree-location/)\n\n const create = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo\", workspaceID: \"owned-location\" } },\n })\n assert.equal(create.statusCode, 200)\n assert.equal(JSON.parse(create.body).body.location.workspaceID, \"owned-location\")\n\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?location%5Bdirectory%5D=%2Frepo%2Fworktree&location%5Bworkspace%5D=owned-location\",\n })\n assert.equal(foreign.statusCode, 403)\n\n const unsupported = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/model?workspace=owned-location\",\n })\n assert.equal(unsupported.statusCode, 400)\n assert.equal(requestCount(), 2)\n })\n\n it(\"rejects session admission while a worktree deletion is pending\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness()\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"holds mutation admission until the upstream response arrives\", async () => {\n const { app, worktreeDeletionFence, delayedUpstreamStarted, releaseDelayedUpstream } = await harness()\n const mutation = app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-delay-upstream\": \"1\" },\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n await delayedUpstreamStarted\n let deleted = false\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], async () => { deleted = true })\n\n await new Promise((resolve) => setImmediate(resolve))\n assert.equal(deleted, false)\n releaseDelayedUpstream()\n assert.equal((await mutation).statusCode, 200)\n await deletion\n assert.equal(deleted, true)\n })\n\n it(\"holds mutation admission until the upstream response body ends\", async () => {\n const { app, worktreeDeletionFence, delayedUpstreamStarted, releaseDelayedUpstream } = await harness()\n const mutation = app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-delay-upstream-body\": \"1\" },\n payload: { location: { directory: \"/repo/worktree\" } },\n })\n await delayedUpstreamStarted\n let deleted = false\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], async () => { deleted = true })\n\n await new Promise((resolve) => setImmediate(resolve))\n assert.equal(deleted, false)\n releaseDelayedUpstream()\n assert.equal((await mutation).statusCode, 200)\n await deletion\n assert.equal(deleted, true)\n })\n\n it(\"blocks lexical aliases after translation to the canonical worktree\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/.\": \"/repo/worktree\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree/.\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"blocks existing-session mutations through their canonical directory\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, { session: \"/repo/worktree/.\" }, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/.\": \"/repo/worktree\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"DELETE\",\n url: \"/workspaces/workspace/instance/api/session/session\",\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"blocks mutations in nested directories of the deleting worktree\", async () => {\n const { app, worktreeDeletionFence, requestCount } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {}, { \"/repo/worktree/nested\": \"/repo/worktree/nested\" },\n )\n let release!: () => void\n const deletion = worktreeDeletionFence.run(\"workspace:worktree\", [\"workspace:worktree\"], () => (\n new Promise<void>((resolve) => { release = resolve })\n ))\n\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session\",\n payload: { location: { directory: \"/repo/worktree/nested\" } },\n })\n\n assert.equal(response.statusCode, 409)\n assert.equal(requestCount(), 0)\n release()\n await deletion\n })\n\n it(\"allows the scoped native location bootstrap\", async () => {\n const { app } = await harness()\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/location\" })\n assert.equal(response.statusCode, 200)\n assert.match(JSON.parse(response.body).url, /\\/api\\/location\\?location%5Bdirectory%5D=%2Frepo/)\n })\n\n it(\"allows updates to messages in owned sessions\", async () => {\n const { app, requestCount, sessionGets } = await harness()\n const response = await app.inject({\n method: \"PATCH\",\n url: \"/workspaces/workspace/instance/api/session/session/message/message\",\n payload: { content: [{ type: \"text\", text: \"kept\" }] },\n })\n\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body).body, { content: [{ type: \"text\", text: \"kept\" }] })\n assert.deepEqual(sessionGets, [\"session\"])\n assert.equal(requestCount(), 1)\n })\n\n it(\"allows owned native VCS reads and rejects foreign locations\", async () => {\n const { app, requestCount } = await harness()\n const owned = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/vcs?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/vcs?location%5Bdirectory%5D=%2Fother\",\n })\n\n assert.equal(owned.statusCode, 200)\n assert.equal(JSON.parse(owned.body).url, \"/api/vcs?location%5Bdirectory%5D=%2Frepo%2Fworktree\")\n assert.equal(foreign.statusCode, 403)\n assert.equal(requestCount(), 1)\n })\n\n it(\"authorizes project-only session lists without adding a directory\", async () => {\n const { app } = await harness()\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?project=owned-project\",\n })\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).url, \"/api/session?project=owned-project\")\n\n const foreign = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?project=foreign-project\",\n })\n assert.equal(foreign.statusCode, 403)\n })\n\n it(\"uses the cursor scope and rejects malformed or forged session-list cursors\", async () => {\n const { app, requestCount } = await harness()\n const ownedCursor = cursor({ directory: \"/repo/worktree\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })\n const response = await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${ownedCursor}&directory=%2Fother&workspace=foreign-location`,\n })\n assert.equal(response.statusCode, 200)\n const upstreamUrl = JSON.parse(response.body).url as string\n assert.match(upstreamUrl, new RegExp(`cursor=${ownedCursor}`))\n assert.doesNotMatch(upstreamUrl, /directory=/)\n assert.doesNotMatch(upstreamUrl, /workspace=/)\n\n const forgedCursor = cursor({ directory: \"/other\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${forgedCursor}&directory=%2Frepo`,\n })).statusCode, 403)\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session?cursor=not-json\",\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ directory: \"/repo\" })}`,\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ workspace: \"foreign-location\", directory: \"/repo\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })}`,\n })).statusCode, 403)\n assert.equal((await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/api/session?cursor=${cursor({ workspace: \"owned-location\", anchor: { id: \"session-1\", time: 1, direction: \"next\" } })}`,\n })).statusCode, 200)\n assert.equal(requestCount(), 2)\n })\n\n it(\"filters PTYs and rejects foreign PTY access\", async () => {\n const { app, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {\n owned: \"/repo/worktree\",\n foreign: \"/other\",\n })\n\n const listed = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n assert.equal(listed.statusCode, 200)\n assert.deepEqual(JSON.parse(listed.body).data.map((pty: { id: string }) => pty.id), [\"owned\"])\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty?location%5Bdirectory%5D=%2Fother\",\n })).statusCode, 403)\n\n assert.equal((await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/pty/foreign/?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"strips browser session and hop-by-hop headers in both directions\", async () => {\n const { app, invalidationCount } = await harness()\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: {\n authorization: \"Bearer browser-secret\",\n connection: \"keep-alive, x-remove-me\",\n cookie: \"codenomad_session=browser-secret; other=value\",\n \"x-forwarded-for\": \"203.0.113.1\",\n \"x-opencode-directory\": \"/other\",\n \"x-opencode-workspace\": \"foreign-workspace\",\n \"x-opencode-routing-test\": \"foreign-route\",\n \"x-remove-me\": \"secret\",\n },\n })\n const headers = JSON.parse(response.body).headers\n assert.equal(headers.authorization, \"Basic internal-secret\")\n assert.equal(headers.cookie, undefined)\n assert.doesNotMatch(headers.connection ?? \"\", /x-remove-me/i)\n assert.equal(headers[\"x-forwarded-for\"], undefined)\n assert.equal(headers[\"x-opencode-directory\"], undefined)\n assert.equal(headers[\"x-opencode-workspace\"], undefined)\n assert.equal(headers[\"x-opencode-routing-test\"], undefined)\n assert.equal(headers[\"x-remove-me\"], undefined)\n assert.equal(response.headers[\"set-cookie\"], undefined)\n assert.equal(response.headers[\"www-authenticate\"], undefined)\n assert.equal(response.headers[\"proxy-authenticate\"], undefined)\n\n const challenge = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session\",\n headers: { \"x-test-challenge\": \"1\" },\n })\n assert.equal(challenge.statusCode, 401)\n assert.equal(invalidationCount(), 1)\n assert.equal(challenge.headers[\"www-authenticate\"], undefined)\n assert.equal(challenge.headers[\"proxy-authenticate\"], undefined)\n })\n\n it(\"rejects sessions owned by another workspace\", async () => {\n const { app, requestCount } = await harness(\"/other\")\n const response = await app.inject({ method: \"DELETE\", url: \"/workspaces/workspace/instance/api/session/session-2\" })\n assert.equal(response.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.doesNotMatch(response.body, /internal-secret/)\n })\n\n it(\"lists owned shells and rejects foreign shell access\", async () => {\n const { app, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", {}, {}, {\n owned: \"/repo/worktree\",\n foreign: \"/other\",\n })\n\n const listed = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/shell?location%5Bdirectory%5D=%2Frepo%2Fworktree\",\n })\n assert.equal(listed.statusCode, 200)\n assert.deepEqual(JSON.parse(listed.body).data.map((shell: { id: string }) => shell.id), [\"owned\"])\n for (const [method, path] of [[\"DELETE\", \"foreign/\"], [\"GET\", \"foreign/output/\"]] as const) {\n assert.equal((await app.inject({\n method,\n url: `/workspaces/workspace/instance/api/shell/${path}?location%5Bdirectory%5D=%2Frepo%2Fworktree`,\n })).statusCode, 403)\n }\n assert.equal(requestCount(), 0)\n })\n\n it(\"permits only native global Forms actions without session hydration\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/other\")\n for (const action of [\"reply\", \"cancel\"]) {\n const response = await app.inject({\n method: \"POST\",\n url: `/workspaces/workspace/instance/api/session/global/form/form-1/${action}`,\n payload: action === \"reply\" ? { answers: {} } : {},\n })\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).url, `/api/session/global/form/form-1/${action}?location%5Bdirectory%5D=%2Frepo`)\n }\n assert.deepEqual(sessionGets, [])\n assert.equal(requestCount(), 2)\n\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/prompt\",\n payload: { text: \"no\" },\n })).statusCode, 403)\n assert.deepEqual(sessionGets, [\"global\"])\n })\n\n it(\"forwards a validated global Form root location and workspace\", async () => {\n const { app } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/srv/repo\")\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: {\n \"x-opencode-directory\": encodeURIComponent(\"/repo\"),\n \"x-opencode-workspace\": \"owned-location\",\n },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 200)\n const upstream = JSON.parse(response.body)\n assert.equal(upstream.headers[\"x-opencode-directory\"], encodeURIComponent(\"/srv/repo\"))\n assert.equal(upstream.headers[\"x-opencode-workspace\"], \"owned-location\")\n })\n\n it(\"translates and forwards a validated global Form worktree location\", async () => {\n const { app } = await harness(\n \"/repo/worktree\", {}, {}, \"/repo\", \"/srv/repo\", {}, {}, {},\n { \"/repo/worktree\": \"/srv/worktree\" },\n )\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/cancel\",\n headers: { \"x-opencode-directory\": encodeURIComponent(\"/repo/worktree\") },\n payload: {},\n })\n\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).headers[\"x-opencode-directory\"], encodeURIComponent(\"/srv/worktree\"))\n })\n\n it(\"rejects a foreign global Form location before proxying\", async () => {\n const { app, requestCount } = await harness()\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": encodeURIComponent(\"/other\") },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 403)\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": \"%ZZ\" },\n payload: { answers: {} },\n })).statusCode, 400)\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: {\n \"x-opencode-directory\": encodeURIComponent(\"/repo\"),\n \"x-opencode-workspace\": \"foreign-location\",\n },\n payload: { answers: {} },\n })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"decodes, translates, and re-encodes Unicode global Form locations\", async () => {\n const directory = \"/工作/100% ready\"\n const serviceDirectory = \"/服务/工作 100%\"\n const { app } = await harness(directory, {}, {}, directory, serviceDirectory)\n const response = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/global/form/form-1/reply\",\n headers: { \"x-opencode-directory\": encodeURIComponent(directory) },\n payload: { answers: {} },\n })\n\n assert.equal(response.statusCode, 200)\n assert.equal(JSON.parse(response.body).headers[\"x-opencode-directory\"], encodeURIComponent(serviceDirectory))\n })\n\n it(\"rejects deletion through a double-encoded alias of a foreign session\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", {}, {\n \"foreign%25session\": \"/other\",\n })\n const response = await app.inject({\n method: \"DELETE\",\n url: \"/workspaces/workspace/instance/api/session/foreign%2525session\",\n })\n assert.equal(response.statusCode, 403)\n assert.deepEqual(sessionGets, [\"foreign%25session\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"returns a client error when a double-encoded session ID is invalid upstream\", async () => {\n const invalid = Object.assign(new Error(\"invalid session ID\"), { _tag: \"InvalidRequestError\" })\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", {}, {\n \"foreign%25session\": invalid,\n })\n const response = await app.inject({\n method: \"GET\",\n url: \"/workspaces/workspace/instance/api/session/foreign%2525session\",\n })\n\n assert.equal(response.statusCode, 400)\n assert.deepEqual(sessionGets, [\"foreign%25session\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"filters active sessions to the workspace without failing on stale ids\", async () => {\n const active = { owned: { type: \"running\" as const }, foreign: { type: \"running\" as const }, stale: { type: \"running\" as const } }\n const { app, sessionGets, requestCount } = await harness(\"/repo/worktree\", active, {\n foreign: \"/other\",\n stale: new Error(\"missing\"),\n })\n const response = await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/session/active\" })\n assert.equal(response.statusCode, 200)\n assert.deepEqual(JSON.parse(response.body), { owned: { type: \"running\" } })\n assert.deepEqual(sessionGets.sort(), [\"foreign\", \"owned\", \"stale\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"blocks global routes through a workspace\", async () => {\n const { app, requestCount } = await harness()\n for (const route of [\"global/dispose\", \"global/config\", \"global/upgrade\"]) {\n const response = await app.inject({ method: \"POST\", url: `/workspaces/workspace/instance/${route}` })\n assert.equal(response.statusCode, 403)\n }\n for (const route of [\"event\", \"debug/location\"]) {\n const response = await app.inject({ method: \"GET\", url: `/workspaces/workspace/instance/api/${route}` })\n assert.equal(response.statusCode, 403)\n }\n assert.equal((await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/service/stop\",\n payload: { instanceID: \"instance-1\" },\n })).statusCode, 403)\n assert.equal((await app.inject({ method: \"GET\", url: \"/workspaces/workspace/instance/api/permission/saved\" })).statusCode, 403)\n assert.equal((await app.inject({ method: \"DELETE\", url: \"/workspaces/workspace/instance/api/permission/saved/global-rule\" })).statusCode, 403)\n assert.equal(requestCount(), 0)\n })\n\n it(\"allows native pending-state management for owned sessions\", async () => {\n const { app } = await harness()\n const requests = [\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/inbox\"],\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/permission\"],\n [\"GET\", \"/workspaces/workspace/instance/api/session/owned/form\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/background\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/revert/clear\"],\n [\"GET\", \"/workspaces/workspace/instance/api/skill\"],\n [\"GET\", \"/workspaces/workspace/instance/api/reference\"],\n [\"GET\", \"/workspaces/workspace/instance/api/mcp/resource\"],\n [\"GET\", \"/workspaces/workspace/instance/api/websearch/provider\"],\n [\"DELETE\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1/steer\"],\n [\"POST\", \"/workspaces/workspace/instance/api/session/owned/inbox/prompt-1/queue\"],\n ] as const\n\n for (const [method, url] of requests) {\n assert.equal((await app.inject({ method, url })).statusCode, 200, `${method} ${url}`)\n }\n })\n\n it(\"rejects literal and encoded dot-segment aliases before authorization\", async () => {\n const { app, sessionGets, requestCount } = await harness(\"/other\")\n for (const route of [\n \"api/session/owned/%2e%2e/foreign\",\n \"api/session/owned/%252e%252e/%252e%252e/event\",\n \"api/session/owned/../../debug/location\",\n ]) {\n const response = await app.inject({ method: \"GET\", url: `/workspaces/workspace/instance/${route}` })\n assert.ok([400, 403, 404].includes(response.statusCode), `${route}: ${response.statusCode}`)\n }\n assert.deepEqual(sessionGets, [\"foreign\"])\n assert.equal(requestCount(), 0)\n })\n\n it(\"validates prompt file ownership before translating root, worktree, and Windows URIs\", async () => {\n const mappings = {\n \"/repo/notes.txt\": \"/home/dev/repo/notes.txt\",\n \"/repo/worktree/notes.txt\": \"/home/dev/worktree/notes.txt\",\n \"C:/repo/notes.txt\": \"/mnt/c/repo/notes.txt\",\n }\n const { app, servicePathCalls, requestCount } = await harness(\"/repo/worktree\", {}, {}, \"/repo\", \"/repo\", mappings)\n const malformed = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///%ZZ\" }] },\n })\n assert.equal(malformed.statusCode, 400)\n\n const foreign = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///other/secret.txt\" }] },\n })\n assert.equal(foreign.statusCode, 403)\n const traversed = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [{ uri: \"file:///repo/worktree/../../other/secret.txt\" }] },\n })\n assert.equal(traversed.statusCode, 403)\n assert.equal(requestCount(), 0)\n assert.deepEqual(servicePathCalls, [])\n\n const owned = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/session-1/prompt\",\n payload: { text: \"read this\", files: [\n { uri: \"file:///repo/notes.txt\" },\n { uri: \"file:///repo/worktree/notes.txt\" },\n { uri: \"file:///C:/repo/notes.txt\" },\n ] },\n })\n assert.equal(owned.statusCode, 200)\n assert.deepEqual(JSON.parse(owned.body).body.files.map((file: { uri: string }) => file.uri), [\n \"file:///home/dev/repo/notes.txt\",\n \"file:///home/dev/worktree/notes.txt\",\n \"file:///mnt/c/repo/notes.txt\",\n ])\n assert.deepEqual(servicePathCalls, Object.keys(mappings))\n assert.equal(requestCount(), 1)\n })\n\n it(\"defaults and validates only schema-defined imported session locations\", async () => {\n const { app, requestCount } = await harness()\n const accepted = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/import\",\n payload: {\n info: { id: \"session-1\", metadata: { location: { directory: \"/other\" } } },\n messages: [{\n type: \"location-switched\",\n location: { directory: \"/repo/worktree\" },\n previous: { location: null },\n metadata: { location: { directory: \"/other\" } },\n content: [{ type: \"tool\", state: { input: { location: \"/other\" } } }],\n }],\n },\n })\n assert.equal(accepted.statusCode, 200)\n const body = JSON.parse(accepted.body).body\n assert.deepEqual(body.location, { directory: \"/repo\" })\n assert.deepEqual(body.info.location, { directory: \"/repo\" })\n assert.deepEqual(body.messages[0].previous.location, { directory: \"/repo\" })\n assert.deepEqual(body.messages[0].metadata.location, { directory: \"/other\" })\n assert.equal(body.messages[0].content[0].state.input.location, \"/other\")\n\n const rejected = await app.inject({\n method: \"POST\",\n url: \"/workspaces/workspace/instance/api/session/import\",\n payload: {\n info: { id: \"session-2\", location: { directory: \"/repo\" } },\n messages: [{ type: \"location-switched\", location: { directory: \"/repo/worktree\" }, previous: { location: { directory: \"/other\" } } }],\n },\n })\n assert.equal(rejected.statusCode, 403)\n assert.equal(requestCount(), 1)\n })\n\n it(\"never sends workspace credentials to an encoded or backslash foreign origin\", async () => {\n const foreign = Fastify()\n apps.push(foreign)\n const credentials: unknown[] = []\n foreign.all(\"/*\", async (request) => credentials.push(request.headers.authorization))\n await foreign.listen({ host: \"127.0.0.1\", port: 0 })\n const address = foreign.server.address()\n assert.ok(address && typeof address === \"object\")\n\n const { app, requestCount } = await harness()\n for (const prefix of [\"%2F%2F\", \"%5C%5C\"]) {\n const proxyResponse: Awaited<ReturnType<typeof app.inject>> = await app.inject({\n method: \"GET\",\n url: `/workspaces/workspace/instance/${prefix}127.0.0.1:${address.port}/steal`,\n })\n assert.equal(proxyResponse.statusCode, 400)\n assert.doesNotMatch(proxyResponse.body, /internal-secret/)\n }\n assert.equal(requestCount(), 0)\n assert.deepEqual(credentials, [])\n })\n})\n\nit(\"redacts secret-bearing fields recursively\", () => {\n assert.deepEqual(redactSecrets({\n authorization: \"Basic internal-secret\",\n apiKey: \"key-value\",\n nested: { authorizationCode: \"code-value\", password: \"password-value\", safe: \"visible\", retries: 2 },\n items: [{ accessToken: \"token-value\" }, { clientSecret: \"secret-value\" }],\n }), {\n authorization: \"<redacted>\",\n apiKey: \"<redacted>\",\n nested: { authorizationCode: \"<redacted>\", password: \"<redacted>\", safe: \"visible\", retries: 2 },\n items: [{ accessToken: \"<redacted>\" }, { clientSecret: \"<redacted>\" }],\n })\n})\n"]}
|
|
@@ -1101,7 +1101,7 @@ function isAllowedInstanceApiRoute(method, pathname) {
|
|
|
1101
1101
|
["GET", /^\/api\/session\/[^/]+\/(?:permission|form)$/],
|
|
1102
1102
|
["DELETE", /^\/api\/session\/[^/]+$/],
|
|
1103
1103
|
["DELETE", /^\/api\/session\/[^/]+\/inbox\/[^/]+$/],
|
|
1104
|
-
["POST", /^\/api\/session\/[^/]+\/(?:agent|model|rename|move|prompt|command|shell|compact|interrupt|background|fork)$/],
|
|
1104
|
+
["POST", /^\/api\/session\/[^/]+\/(?:agent|model|rename|move|prompt|command|shell|compact|interrupt|wait|background|fork)$/],
|
|
1105
1105
|
["POST", /^\/api\/session\/[^/]+\/inbox\/[^/]+\/(?:steer|queue)$/],
|
|
1106
1106
|
["POST", /^\/api\/session\/[^/]+\/revert\/(?:stage|clear)$/],
|
|
1107
1107
|
["PUT", /^\/api\/session\/[^/]+\/instructions\/entries\/[^/]+$/],
|