{"_id":"@dongkseo/sandbox-remote","_rev":"6-2c7748e5dc1f500c5fd73d7854633463","name":"@dongkseo/sandbox-remote","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@dongkseo/sandbox-remote","version":"0.1.0","_id":"@dongkseo/sandbox-remote@0.1.0","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"1b2e1390c6c1d30ee81f63af4c8c60f14dd01b7b","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.1.0.tgz","fileCount":14,"integrity":"sha512-cF/PqTpiTRNbSijupNi2LDTjzdGXfRfjP2kqA6eUpA8ZEjFSqS+FFYRVElYSgbprJkZwXDUcfqnqhM+KxARHOw==","signatures":[{"sig":"MEYCIQC7fkso5FS0nyjpvSteNWF0nXBRNM2K1DErFvhs8xtHYQIhAJNiFH3eDw2zZWodB681WMYxUJZyV1WrTYcE0De4fIuO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41033},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-sandbox-remote-0.1.0.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/aae0a7626f5784846fb9e114624d813e/dongkseo-sandbox-remote-0.1.0.tgz","_integrity":"sha512-cF/PqTpiTRNbSijupNi2LDTjzdGXfRfjP2kqA6eUpA8ZEjFSqS+FFYRVElYSgbprJkZwXDUcfqnqhM+KxARHOw==","_npmVersion":"11.16.0","description":"**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1","@dongkseo/sandbox-server":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-remote_0.1.0_1783067410404_0.6743242347114062","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dongkseo/sandbox-remote","version":"0.1.1","_id":"@dongkseo/sandbox-remote@0.1.1","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"13b6872b7f1b11ef62243c390e19064d7e482cd0","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.1.1.tgz","fileCount":14,"integrity":"sha512-+yyhNtYMiCfFclZ8sbgB1JCMJMmrG5s1y8RbW7pywQVpn66OpEh4w5kzysvDo87Xq8n4n/50DKGKCofQQUQBLQ==","signatures":[{"sig":"MEQCIANXQXFpt/s/e+vtFAA9Jl+w/Cqn7VFSqjpfO6SxSto5AiBXslzQKQVUVKYI3rvTV6oA+TLeDI4d0L6KpJZD0vWaqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41610},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-sandbox-remote-0.1.1.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/0b07e992fbdde3935517bc0634951b37/dongkseo-sandbox-remote-0.1.1.tgz","_integrity":"sha512-+yyhNtYMiCfFclZ8sbgB1JCMJMmrG5s1y8RbW7pywQVpn66OpEh4w5kzysvDo87Xq8n4n/50DKGKCofQQUQBLQ==","_npmVersion":"11.16.0","description":"**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.26"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1","@dongkseo/sandbox-server":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-remote_0.1.1_1783068042114_0.6603012600013498","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dongkseo/sandbox-remote","version":"0.1.2","_id":"@dongkseo/sandbox-remote@0.1.2","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"805ae24c8ab04fc472e0582b05a44baab2f1878e","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.1.2.tgz","fileCount":14,"integrity":"sha512-/3Q8blKbDhxVDmX7cy4jcJ0Dph/T7HaxynEYbVN0FJhagyFrKwoIIy8ls0/2jM0/ZTeLZjqFOAS/arkBdKPujA==","signatures":[{"sig":"MEQCIA/rdTaYXwLbyX7t7z7XJuVeQ+l3mlbVV/8f6/SIQVy2AiA6DsWOt/L8no72c96+jc+Hc8Yj8Air+3ttgUW2LZUrSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51137},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-sandbox-remote-0.1.2.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/0bb107888f63075ff0727eb9e7a6b6af/dongkseo-sandbox-remote-0.1.2.tgz","_integrity":"sha512-/3Q8blKbDhxVDmX7cy4jcJ0Dph/T7HaxynEYbVN0FJhagyFrKwoIIy8ls0/2jM0/ZTeLZjqFOAS/arkBdKPujA==","_npmVersion":"11.17.0","description":"**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`","directories":{},"_nodeVersion":"26.4.0","dependencies":{"@dongkseo/contracts":"^0.1.26"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1","@dongkseo/sandbox-server":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-remote_0.1.2_1783319495487_0.40906700933387596","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dongkseo/sandbox-remote","version":"0.2.0","_id":"@dongkseo/sandbox-remote@0.2.0","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"515c6e44b1896890fbf0fd9ddcb68d686f1c1edd","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.2.0.tgz","fileCount":14,"integrity":"sha512-WcI1IAJsO//t4dAgoq0tPa7598IP9JN1e7iiR3YWqrKAEYNkqhw9qsedC3jVg/23Kx4hATWPGIOtb+VjZJHy0Q==","signatures":[{"sig":"MEYCIQCcylOqq9Kb5jJbD/tbo2DX7eQvyX3XLXBTX5qZo0+fMwIhAJHCWczpgW5yZvzhmBXwIX9lyaTKNexj1vX6tSUR96ji","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57596},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-sandbox-remote-0.2.0.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/9f3e98a251e036c034efc52b00bae372/dongkseo-sandbox-remote-0.2.0.tgz","_integrity":"sha512-WcI1IAJsO//t4dAgoq0tPa7598IP9JN1e7iiR3YWqrKAEYNkqhw9qsedC3jVg/23Kx4hATWPGIOtb+VjZJHy0Q==","_npmVersion":"11.16.0","description":"**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.26"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1","@dongkseo/sandbox-server":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-remote_0.2.0_1783349464949_0.5163876710959554","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@dongkseo/sandbox-remote","version":"0.2.1","_id":"@dongkseo/sandbox-remote@0.2.1","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"ebf1914166b9e367d31a74c7a0cd8216730c0132","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.2.1.tgz","fileCount":14,"integrity":"sha512-bJtH0/NdQbyBVIYXkQbz9K26hCBNsOkMoyLErBVVLNG9fZ6xwi8uZR1yuW6l+/jTXFPahZ6Gt19Fxwpaz3N78w==","signatures":[{"sig":"MEUCIQDN/vnMTbg9kdeboOA5X7OgSRVU5LV+LFIXtafEnH2gQQIgb+L6f0wHvjRmNJUObdh4Ea0Nf8fp9IpqRJAVB9CBi1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58618},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-sandbox-remote-0.2.1.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/3928ec08766b425c41dfb5affce42272/dongkseo-sandbox-remote-0.2.1.tgz","_integrity":"sha512-bJtH0/NdQbyBVIYXkQbz9K26hCBNsOkMoyLErBVVLNG9fZ6xwi8uZR1yuW6l+/jTXFPahZ6Gt19Fxwpaz3N78w==","_npmVersion":"11.16.0","description":"**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.27"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.3","@types/node":"^26.0.1","@dongkseo/sandbox-server":"^0.3.5"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-remote_0.2.1_1783441116853_0.9647073615433395","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@dongkseo/sandbox-remote","version":"0.2.2","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"@dongkseo/contracts":"^0.1.32"},"devDependencies":{"@types/node":"^26.1.2","typescript":"^7.0.2","@dongkseo/sandbox-server":"^0.3.22"},"nexora":{"stability":"experimental"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run","clean":"rm -rf dist .tsbuildinfo"},"_nodeVersion":"26.7.0","_id":"@dongkseo/sandbox-remote@0.2.2","dist":{"integrity":"sha512-OmVGNnzpYeHFY3DQKDoyRofaAt5U5SsRtrSpPz1Dr0nJohP0yYWGvhrlsZ+YgJsZrhoVF/baqfvRQ0/71rRGCA==","shasum":"646d75407537bdfb502bb0ebac639a2672209708","tarball":"https://registry.npmjs.org/@dongkseo/sandbox-remote/-/sandbox-remote-0.2.2.tgz","fileCount":18,"unpackedSize":65812,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCKcBrrq3FoC8wEpb0mZDAw8fTp+5myrRc93Y/u6la5aAIgEN/PDlq/bBlBSqGFkZDqaRc7Ki8vXab329yssJTHl2A="}]},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"directories":{},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sandbox-remote_0.2.2_1786622542706_0.30182031387748975"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T08:30:10.238Z","modified":"2026-08-13T12:02:22.977Z","0.1.0":"2026-07-03T08:30:10.549Z","0.1.1":"2026-07-03T08:40:42.254Z","0.1.2":"2026-07-06T06:31:35.615Z","0.2.0":"2026-07-06T14:51:05.090Z","0.2.1":"2026-07-07T16:18:36.997Z","0.2.2":"2026-08-13T12:02:22.849Z"},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"readme":"# @dongkseo/sandbox-remote\n\n**Stability: experimental** · `pnpm add @dongkseo/sandbox-remote`\n\n> 원격/클라우드 sandbox에 붙는 `SandboxClient`. 로컬 sandbox 클라이언트를 이걸로 **교체만** 하면\n> 에이전트·도구 코드를 바꾸지 않고 워크스페이스 경계를 provider-관리 호스트로 옮긴다(포터빌리티 축).\n\n## 무엇인가 / 무엇이 아닌가\n\n- ✅ 담는 것: `RemoteSandboxClient` — Nexora sandbox wire 프로토콜(`@dongkseo/sandbox-server`)로 원격 세션을\n  프로비저닝하고, 원격 exec·워크스페이스 persist/hydrate·**살아있는 세션 reattach**를 수행. `SandboxClient` +\n  `WorkspaceProvider` 양쪽을 구현하며 `resume(SandboxSessionState)`를 제공 → `ContinuousWorkspaceProvider`에 그대로 주입 가능.\n- ❌ 안 담는 것: OS 격리 그 자체(서버가 자기 backend로 강제한다). 상용 provider 어댑터(Cloudflare/Modal 등 — 후속).\n\n원격 세션은 서버가 격리하므로 **`wrapCommand`를 의도적으로 구현하지 않는다**(로컬에서 감쌀 jail이 없음). detached/background\n실행이 필요하면 호스트에서 비격리 spawn으로 폴백하지 말고 서버측 task로 라우팅해야 한다. 이 규칙은 이제 문서가 아니라\n`@dongkseo/tools`의 exec 툴이 강제한다 — `run`은 있는데 `wrapCommand`가 없는 세션에서 `run_in_background`는 거부된다.\n\n## 핵심 개념\n\n- **create** → `POST /sessions`(manifest seed) → 원격 세션.\n- **run** → `POST /sessions/:id/exec` → 버퍼링된 `SandboxCommandResult`(기존 seam과 동일).\n- **파일 I/O** → `WorkspaceSession.fs`(`WorkspaceFs`: read/write/stat/readdir/realPath)를 wire(`GET·PUT /fs`, `GET /stat`, `GET /readdir`)로 구현. root-jail 재검증은 서버가 강제(탈출은 403).\n- **snapshot / sessionState** → `POST /persist`로 tar를 받아 로컬에 스풀 → `SandboxSessionState{ backend:'remote', ref:<원격 세션 id>, snapshot }`.\n- **resume** → `ref`가 살아있으면 `POST /reattach`로 **재접속(HOT)**, 아니면 새 세션 + `POST /hydrate`로 **재수화(COLD)**.\n- 자격증명(토큰)은 옵션/헤더에만 존재하며 `SandboxSessionState`·로그·에러에 절대 실리지 않는다.\n\n> 원격-root 파일 I/O는 완결됐다: 빌트인 파일 도구(read/write/edit)가 로컬 `node:fs`가 아니라 `ctx.workspace.fs`(`WorkspaceFs` seam)를 통과하도록 리팩터됐고(`@dongkseo/tools`), `RemoteSandboxClient`가 그 seam을 위 wire 라우트로 구현한다. detached/background 실행만은 호스트 비격리 spawn으로 폴백하지 말고 서버측 task로 라우팅한다(위 참고).\n\n## 사용 레시피\n\n```ts\nimport { RemoteSandboxClient } from '@dongkseo/sandbox-remote';\nimport { ContinuousWorkspaceProvider } from '@dongkseo/core';\nimport { AgentRunner } from '@dongkseo/core';\n\nconst remote = new RemoteSandboxClient({ endpoint: 'https://sbx.example.com', token: process.env.SBX_TOKEN });\n\n// 대화 연속성까지: 원격 세션 재접속/재수화를 conversationId 기준으로.\nconst provider = new ContinuousWorkspaceProvider(remote, workspaceStateStore, conversationId);\n\nconst runner = new AgentRunner({ /* … */, workspaceProvider: provider });\n```\n\n로컬↔원격 교체는 `workspaceProvider` 한 줄뿐 — 나머지는 동일.\n\n## API 표면 (소스 안 열고 타입만)\n\n```\nctx_read(path=\"packages/sandbox-remote/src/index.ts\",  mode=\"map\")\nctx_read(path=\"packages/sandbox-remote/src/client.ts\", mode=\"signatures\")\n```\n\n## 유지보수 (drift 방지)\n\n- API 정본은 소스 TSDoc. wire DTO 정본은 `@dongkseo/contracts`의 `sandbox-protocol.ts`.\n- 프로토콜을 바꾸면 `@dongkseo/sandbox-server`와 동시에 갱신하고 통합 테스트로 고정.\n\n## Tests\n\n```bash\ncd packages/sandbox-remote && pnpm test   # 서버를 띄워 end-to-end 포터빌리티 검증\n```\n\nPart of the [Nexora](../../README.md) multi-tenant agent framework. · [Package map](../../docs/architecture/packages-map.md)\n","readmeFilename":""}