{"_id":"@braedonsaunders/appkit-remote-sessions","_rev":"2-654626e3265d0736edc3a60d7c70d6ba","name":"@braedonsaunders/appkit-remote-sessions","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@braedonsaunders/appkit-remote-sessions","version":"0.1.0","keywords":["agents","appkit","remote-desktop","rdp","vnc","ssh","winrm","terminal"],"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","_id":"@braedonsaunders/appkit-remote-sessions@0.1.0","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/remote-sessions#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"dist":{"shasum":"bdd99f84b61b63334b9f55fb736904ccd0a227da","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-remote-sessions/-/appkit-remote-sessions-0.1.0.tgz","fileCount":36,"integrity":"sha512-twFNUsfSB1X8R/dwWSBq8m3zrcIgtgupC148nCKGwE8Zahwk6CH2Ljlq2wX+EQ43FmVya28VQJGUl/wCUHvRWQ==","signatures":[{"sig":"MEYCIQCQZUuVOrBXwA6gGWrdejTZIuxpK678Grfj23lxbIJVTwIhAK9QfZGBP1G72yzj1nms047VNgY5jFVsc9tkdWfVGeFZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-remote-sessions@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":183163},"main":"./index.js","type":"module","_from":"file:braedonsaunders-appkit-remote-sessions-0.1.0.tgz","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./memory":{"types":"./memory.d.ts","import":"./memory.js","default":"./memory.js"},"./guacamole":{"types":"./guacamole.d.ts","import":"./guacamole.js","default":"./guacamole.js"},"./styles.css":"./styles.css","./package.json":"./package.json"},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"_resolved":"/tmp/497bdce02911cda70cbab0cd5babc97c/braedonsaunders-appkit-remote-sessions-0.1.0.tgz","_integrity":"sha512-twFNUsfSB1X8R/dwWSBq8m3zrcIgtgupC148nCKGwE8Zahwk6CH2Ljlq2wX+EQ43FmVya28VQJGUl/wCUHvRWQ==","repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/remote-sessions"},"_npmVersion":"10.9.8","description":"Provider-neutral remote computer and terminal sessions with fenced leases, one-time viewer grants, append-only events, observable control, and executable provider conformance.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.23.2","dependencies":{"@xterm/xterm":"^6.0.0","guacamole-lite":"^1.2.0","@xterm/addon-fit":"^0.11.0","guacamole-common-js":"^1.5.0"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit-remote-sessions_0.1.0_1787095123963_0.5295251600654725","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@braedonsaunders/appkit-remote-sessions","version":"0.1.1","description":"Provider-neutral remote computer and terminal sessions with fenced leases, one-time viewer grants, append-only events, observable control, and executable provider conformance.","license":"AGPL-3.0-or-later","type":"module","exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./memory":{"types":"./memory.d.ts","import":"./memory.js","default":"./memory.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./guacamole":{"types":"./guacamole.d.ts","import":"./guacamole.js","default":"./guacamole.js"},"./styles.css":"./styles.css","./package.json":"./package.json"},"main":"./index.js","types":"./index.d.ts","sideEffects":["*.css"],"peerDependencies":{"react":">=18.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"author":{"name":"Braedon Saunders"},"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/remote-sessions"},"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/remote-sessions#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"engines":{"node":">=22"},"keywords":["agents","appkit","remote-desktop","rdp","vnc","ssh","winrm","terminal"],"dependencies":{"@xterm/addon-fit":"^0.11.0","@xterm/xterm":"^6.0.0","guacamole-common-js":"^1.5.0","guacamole-lite":"^1.2.0"},"_id":"@braedonsaunders/appkit-remote-sessions@0.1.1","_integrity":"sha512-TYbDLpRiPIW6y9+BvY69fGtk38Ttwa/VpmNnduqdnK7IKdM8d3K/GLAMXgJEUAridAsis3JTMDo05ks+4fG1JQ==","_resolved":"/tmp/27463fff798881e0acaf9561c55383f9/braedonsaunders-appkit-remote-sessions-0.1.1.tgz","_from":"file:braedonsaunders-appkit-remote-sessions-0.1.1.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-TYbDLpRiPIW6y9+BvY69fGtk38Ttwa/VpmNnduqdnK7IKdM8d3K/GLAMXgJEUAridAsis3JTMDo05ks+4fG1JQ==","shasum":"f856fa68fb7fdfb2c1f089e9361544666a8f3fce","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-remote-sessions/-/appkit-remote-sessions-0.1.1.tgz","fileCount":36,"unpackedSize":197283,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-remote-sessions@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEEOZNf2IA45h2F0wg4UJkn0tuYm4K+UkZ+vCpBomHH+AiAN70Fyj87Dz4iB7zRzVLwqpkc6YmSVDBhMHPv/LqxZFg=="}]},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"directories":{},"maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appkit-remote-sessions_0.1.1_1787157937423_0.780538793409671"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T23:18:43.839Z","modified":"2026-08-19T16:45:37.922Z","0.1.0":"2026-08-18T23:18:44.131Z","0.1.1":"2026-08-19T16:45:37.569Z"},"bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/remote-sessions#readme","keywords":["agents","appkit","remote-desktop","rdp","vnc","ssh","winrm","terminal"],"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/remote-sessions"},"description":"Provider-neutral remote computer and terminal sessions with fenced leases, one-time viewer grants, append-only events, observable control, and executable provider conformance.","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"readme":"# @braedonsaunders/appkit-remote-sessions\n\nRemote computers are not agent desks. A desk is an application-owned machine belonging to an agent; a remote session connects that agent to an existing customer computer or appliance over RDP, VNC, SSH, WinRM, PowerShell-over-SSH, or Telnet.\n\nThis package extracts Steward's working remote-computer model and terminal presentation and hardens their reusable boundary: provider-neutral targets, fenced immutable leases, append-only events, one-time viewer grants, cancellation, terminal output, programmatic RDP/VNC actions with returned frames, an injected credential resolver, policy ports, a memory adapter, provider conformance, a browser-safe React viewer, and a read-only `TerminalSurface` that renders an application-owned durable command ledger. The application owns tenant persistence, authorization, feature gates, credentials, audit projection, routes, and the provider bridge.\n\n```ts\nconst remote = createRemoteSessionService({ store, provider, policy, resolveCredential })\nconst session = await remote.open({ target, runId, personId, kind: 'computer' })\nconst lease = await remote.lease({ tenantId, sessionId: session.id, holder: userId, purpose: 'Watch the agent work', scope: 'observe' })\nconst connection = await remote.viewer({ tenantId, sessionId: session.id, leaseId: lease.id })\nconst result = await remote.control({ tenantId, sessionId: session.id, action: { action: 'click', x: 420, y: 180 } })\n```\n\nNever persist provider viewer URLs or raw credentials. Exchange a short-lived, signed AppKit grant inside an authenticated same-origin route, atomically consume its grant id, and return a fresh provider connection. Releasing a lease is terminal: a still-valid signed grant must not recreate it.\n\n`TerminalSurface` is deliberately execution-free. Feed it recorded command,\nstdout, stderr, system, and status entries from the same append-only session record used\nfor audit; do not create a browser-only scrollback that can disagree with the\nrun history. Import `@braedonsaunders/appkit-remote-sessions/styles.css` once in\nthe host stylesheet. The surface uses xterm.js for ANSI color, Unicode,\nselection, terminal-native scrollback, and responsive fitting while remaining\nread-only. Durable non-PTY output is still terminal-grade: AppKit adds\ndeterministic semantic ANSI to unstyled prompts and shell tokens (commands,\nflags, strings, variables, and operators), distinguishes stdout, stderr, system,\nand status entries, and maps that palette through AppKit's light/dark tokens.\nProvider ANSI is passed through unchanged rather than recolored. It opens at the\nlatest output and continues following while the\nviewer remains near the bottom. Scrolling upward suspends that behavior so\npolling or new output cannot pull the viewer away from what they are reading.\nHosts can add contextual controls such as fullscreen through `headerActions`;\nplaceholder working directories (`.` and `./`) are intentionally hidden.\n","readmeFilename":"README.md"}