@yadsh/dsh-session-scope 0.5.0

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.
Files changed (53) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +110 -0
  3. package/compatibility.json +20 -0
  4. package/cordis.patch.yml +7 -0
  5. package/lib/client.d.ts +1 -0
  6. package/lib/client.d.ts.map +1 -0
  7. package/lib/client.js +716 -0
  8. package/lib/client.js.map +1 -0
  9. package/lib/core.d.ts +204 -0
  10. package/lib/core.d.ts.map +1 -0
  11. package/lib/core.js +375 -0
  12. package/lib/core.js.map +1 -0
  13. package/lib/host-api.d.ts +23 -0
  14. package/lib/host-api.d.ts.map +1 -0
  15. package/lib/host-api.js +40 -0
  16. package/lib/host-api.js.map +1 -0
  17. package/lib/index.d.ts +32 -0
  18. package/lib/index.d.ts.map +1 -0
  19. package/lib/index.js +594 -0
  20. package/lib/index.js.map +1 -0
  21. package/lib/scope-context.d.ts +3 -0
  22. package/lib/scope-context.d.ts.map +1 -0
  23. package/lib/scope-context.js +29 -0
  24. package/lib/scope-context.js.map +1 -0
  25. package/lib/scope-delegation.d.ts +23 -0
  26. package/lib/scope-delegation.d.ts.map +1 -0
  27. package/lib/scope-delegation.js +49 -0
  28. package/lib/scope-delegation.js.map +1 -0
  29. package/lib/scope-fs.d.ts +47 -0
  30. package/lib/scope-fs.d.ts.map +1 -0
  31. package/lib/scope-fs.js +150 -0
  32. package/lib/scope-fs.js.map +1 -0
  33. package/lib/scope-processes.d.ts +31 -0
  34. package/lib/scope-processes.d.ts.map +1 -0
  35. package/lib/scope-processes.js +71 -0
  36. package/lib/scope-processes.js.map +1 -0
  37. package/lib/scope-sandbox-linux.d.ts +35 -0
  38. package/lib/scope-sandbox-linux.d.ts.map +1 -0
  39. package/lib/scope-sandbox-linux.js +177 -0
  40. package/lib/scope-sandbox-linux.js.map +1 -0
  41. package/lib/scope-visibility.d.ts +14 -0
  42. package/lib/scope-visibility.d.ts.map +1 -0
  43. package/lib/scope-visibility.js +62 -0
  44. package/lib/scope-visibility.js.map +1 -0
  45. package/lib/session-scope.d.ts +54 -0
  46. package/lib/session-scope.d.ts.map +1 -0
  47. package/lib/session-scope.js +200 -0
  48. package/lib/session-scope.js.map +1 -0
  49. package/lib/tool-guard.d.ts +52 -0
  50. package/lib/tool-guard.d.ts.map +1 -0
  51. package/lib/tool-guard.js +233 -0
  52. package/lib/tool-guard.js.map +1 -0
  53. package/package.json +150 -0
@@ -0,0 +1,233 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+ import { canonicalPath, isLexicallyUnder } from "./core.js";
3
+ import { getScope } from "./host-api.js";
4
+ import { assertScopeAccess, scopedSearchRoots, } from "./scope-visibility.js";
5
+ import { SESSION_SCOPE_ERROR, SessionScopeError, } from "./session-scope.js";
6
+ const DENIAL_REASON = `${SESSION_SCOPE_ERROR.DENIED}: Path is outside the active session scope. Change the session scope if access is required.`;
7
+ const ISOLATION_UNAVAILABLE_REASON = `${SESSION_SCOPE_ERROR.ISOLATION_UNAVAILABLE}: Isolated session scope is unavailable for this process execution.`;
8
+ const ISOLATION_DANGER_REASON = `${SESSION_SCOPE_ERROR.ISOLATION_UNAVAILABLE}: Isolated session scope cannot execute shell processes with danger-full-access.`;
9
+ function record(value) {
10
+ return value !== null && typeof value === "object" && !Array.isArray(value)
11
+ ? value
12
+ : undefined;
13
+ }
14
+ function stringField(value, name) {
15
+ const object = record(value);
16
+ return typeof object?.[name] === "string" ? object[name] : undefined;
17
+ }
18
+ function singlePathAdapter(name, field, operation) {
19
+ return {
20
+ name,
21
+ extractPaths(value) {
22
+ const args = record(value);
23
+ const path = stringField(value, field);
24
+ if (args === undefined || path === undefined)
25
+ return [];
26
+ return [{ path, operation: typeof operation === "function" ? operation(args) : operation }];
27
+ },
28
+ };
29
+ }
30
+ function searchPathAdapter(name) {
31
+ return {
32
+ name,
33
+ extractPaths(value) {
34
+ const args = record(value);
35
+ if (args === undefined)
36
+ return [];
37
+ const path = stringField(value, "path") ?? ".";
38
+ return [{ path, operation: "search" }];
39
+ },
40
+ };
41
+ }
42
+ export const DEFAULT_TOOL_ADAPTERS = Object.freeze([
43
+ singlePathAdapter("read", "file_path", "read"),
44
+ singlePathAdapter("read_image", "file_path", "read"),
45
+ singlePathAdapter("write", "file_path", "write"),
46
+ singlePathAdapter("edit", "file_path", "write"),
47
+ searchPathAdapter("glob"),
48
+ searchPathAdapter("grep"),
49
+ singlePathAdapter("str_replace_editor", "path", (args) => args.command === "view" ? "list" : "write"),
50
+ ]);
51
+ export class ScopeToolAdapterRegistry {
52
+ adapters = new Map();
53
+ constructor(adapters = DEFAULT_TOOL_ADAPTERS) {
54
+ for (const adapter of adapters)
55
+ this.register(adapter);
56
+ }
57
+ register(adapter) {
58
+ if (!adapter.name || this.adapters.has(adapter.name)) {
59
+ throw new Error(`session-scope tool adapter already registered: ${adapter.name}`);
60
+ }
61
+ this.adapters.set(adapter.name, adapter);
62
+ return () => {
63
+ if (this.adapters.get(adapter.name) === adapter)
64
+ this.adapters.delete(adapter.name);
65
+ };
66
+ }
67
+ requests(execution) {
68
+ return this.adapters.get(execution.name)?.extractPaths(execution.arguments) ?? [];
69
+ }
70
+ }
71
+ function absoluteToolPath(path, scope, sessionWorkspaceRoot) {
72
+ const target = isAbsolute(path) ? path : resolve(scope.workspaceRoot, path);
73
+ const workspaceSpellings = [scope.workspaceRoot, sessionWorkspaceRoot]
74
+ .filter((root) => typeof root === "string" && root.length > 0);
75
+ const originatedInsideWorkspace = workspaceSpellings.some((root) => isLexicallyUnder(target, root));
76
+ const canonicalTarget = canonicalPath(target);
77
+ const aliasMappedTarget = sessionWorkspaceRoot
78
+ && !samePath(sessionWorkspaceRoot, scope.workspaceRoot)
79
+ && isLexicallyUnder(target, sessionWorkspaceRoot)
80
+ ? resolve(scope.workspaceRoot, relative(sessionWorkspaceRoot, target))
81
+ : undefined;
82
+ const identityTarget = !samePath(canonicalTarget, target)
83
+ ? canonicalTarget
84
+ : aliasMappedTarget ?? canonicalTarget;
85
+ // A path lexically inside the session workspace which resolves outside it
86
+ // is a symlink/alias escape, not an ordinary external host path.
87
+ if (originatedInsideWorkspace && !isLexicallyUnder(identityTarget, scope.workspaceRoot)) {
88
+ throw new SessionScopeError(SESSION_SCOPE_ERROR.SYMLINK_ESCAPE, "Path resolves outside the session workspace.");
89
+ }
90
+ // Missing targets cannot be realpathed, so identityTarget may instead be
91
+ // mapped from a session-header alias (notably a Windows 8.3 path).
92
+ return identityTarget;
93
+ }
94
+ /** Monotonic tool guard: undefined allows; a stable reason string denies. */
95
+ export function guardScopeToolExecution(execution, adapters, fallbackWorkspaceRoot = "", options = {}) {
96
+ const session = execution.agent?.session;
97
+ if (session === undefined)
98
+ return undefined;
99
+ const scope = getScope(session, fallbackWorkspaceRoot);
100
+ const sessionWorkspaceRoot = session.header?.cwd;
101
+ if (scope.mode === "full")
102
+ return undefined;
103
+ // Current LSP providers index and return locations for the entire immutable
104
+ // session cwd. An input-path check alone cannot prevent hidden sibling
105
+ // symbols or hover content from leaking through the server result.
106
+ if (execution.name === "lsp")
107
+ return DENIAL_REASON;
108
+ try {
109
+ for (const request of adapters.requests(execution)) {
110
+ const target = absoluteToolPath(request.path, scope, sessionWorkspaceRoot);
111
+ if (request.operation === "search"
112
+ && options.splitBroadSearches === true
113
+ && (execution.name === "glob" || execution.name === "grep")) {
114
+ scopedSearchRoots(scope, target);
115
+ }
116
+ else {
117
+ assertScopeAccess(scope, target, request.operation);
118
+ }
119
+ }
120
+ if (scope.mode === "isolated" && (execution.name === "bash" || execution.name === "terminal_open")) {
121
+ if (options.isolatedBackendReady !== true)
122
+ return ISOLATION_UNAVAILABLE_REASON;
123
+ const args = record(execution.arguments);
124
+ if (options.sandboxMode === "danger-full-access" || stringField(args, "sandbox_permissions") === "danger-full-access") {
125
+ return ISOLATION_DANGER_REASON;
126
+ }
127
+ const field = execution.name === "bash" ? "workdir" : "cwd";
128
+ const requestedWorkingDirectory = stringField(args, field);
129
+ if (requestedWorkingDirectory !== undefined) {
130
+ const target = absoluteToolPath(requestedWorkingDirectory, scope, sessionWorkspaceRoot);
131
+ if (!samePath(target, scope.workspaceRoot))
132
+ assertScopeAccess(scope, target, "list");
133
+ }
134
+ }
135
+ return undefined;
136
+ }
137
+ catch {
138
+ return DENIAL_REASON;
139
+ }
140
+ }
141
+ function samePath(left, right) {
142
+ return process.platform === "win32"
143
+ ? left.toLowerCase() === right.toLowerCase()
144
+ : left === right;
145
+ }
146
+ function mergeGlobValues(requestedRoot, results, scope) {
147
+ const paths = new Set();
148
+ for (const result of results) {
149
+ const value = record(result.value);
150
+ if (!Array.isArray(value?.paths))
151
+ continue;
152
+ for (const path of value.paths) {
153
+ if (typeof path !== "string")
154
+ continue;
155
+ try {
156
+ assertScopeAccess(scope, absoluteToolPath(path, scope), "search");
157
+ paths.add(path);
158
+ }
159
+ catch {
160
+ // A malformed or changed search backend cannot leak a hidden path.
161
+ }
162
+ }
163
+ }
164
+ return {
165
+ isError: false,
166
+ value: { root: requestedRoot, paths: [...paths] },
167
+ content: [],
168
+ };
169
+ }
170
+ function mergeGrepValues(results, scope) {
171
+ const matches = [];
172
+ for (const result of results) {
173
+ const value = record(result.value);
174
+ if (!Array.isArray(value?.matches))
175
+ continue;
176
+ for (const match of value.matches) {
177
+ const path = stringField(match, "path");
178
+ if (path === undefined)
179
+ continue;
180
+ try {
181
+ assertScopeAccess(scope, absoluteToolPath(path, scope), "search");
182
+ matches.push(match);
183
+ }
184
+ catch {
185
+ // Drop the entire match, including its line content, on any path leak.
186
+ }
187
+ }
188
+ }
189
+ return {
190
+ isError: false,
191
+ value: { matches },
192
+ content: [],
193
+ };
194
+ }
195
+ /**
196
+ * Split a navigation-root glob/grep into child calls under content roots.
197
+ * Direct searches already inside one content root pass through unchanged.
198
+ */
199
+ export async function dispatchScopedSearchExecution(execution, dispatcher, next, fallbackWorkspaceRoot = "") {
200
+ if (execution.name !== "glob" && execution.name !== "grep")
201
+ return next();
202
+ const session = execution.agent?.session;
203
+ const args = record(execution.arguments);
204
+ if (session === undefined || args === undefined)
205
+ return next();
206
+ const scope = getScope(session, fallbackWorkspaceRoot);
207
+ if (scope.mode === "full")
208
+ return next();
209
+ const requestedPath = typeof args.path === "string" ? args.path : ".";
210
+ const requestedRoot = absoluteToolPath(requestedPath, scope, session.header?.cwd);
211
+ const roots = scopedSearchRoots(scope, requestedRoot);
212
+ if (roots.length === 1 && samePath(roots[0], requestedRoot))
213
+ return next();
214
+ const results = [];
215
+ for (let index = 0; index < roots.length; index += 1) {
216
+ const result = await dispatcher.execute({
217
+ callId: `${execution.callId ?? execution.name}:scope:${index}`,
218
+ rootCallId: execution.rootCallId ?? execution.callId,
219
+ name: execution.name,
220
+ arguments: { ...args, path: roots[index] },
221
+ agent: execution.agent,
222
+ signal: execution.signal,
223
+ parent: execution.token,
224
+ });
225
+ if (result.isError)
226
+ return result;
227
+ results.push(result);
228
+ }
229
+ return execution.name === "glob"
230
+ ? mergeGlobValues(requestedPath, results, scope)
231
+ : mergeGrepValues(results, scope);
232
+ }
233
+ //# sourceMappingURL=tool-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-guard.js","sourceRoot":"","sources":["../src/tool-guard.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,150 @@
1
+ {
2
+ "name": "@yadsh/dsh-session-scope",
3
+ "version": "0.5.0",
4
+ "description": "Per-session workspace visibility scopes for DeepSeek Harness.",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "types": "./lib/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "import": "./lib/index.js"
12
+ },
13
+ "./client": {
14
+ "types": "./lib/client.d.ts",
15
+ "import": "./lib/client.js",
16
+ "default": "./lib/client.js"
17
+ },
18
+ "./core": {
19
+ "types": "./lib/core.d.ts",
20
+ "import": "./lib/core.js"
21
+ },
22
+ "./session-scope": {
23
+ "types": "./lib/session-scope.d.ts",
24
+ "import": "./lib/session-scope.js"
25
+ },
26
+ "./host-api": {
27
+ "types": "./lib/host-api.d.ts",
28
+ "import": "./lib/host-api.js"
29
+ },
30
+ "./scope-visibility": {
31
+ "types": "./lib/scope-visibility.d.ts",
32
+ "import": "./lib/scope-visibility.js"
33
+ },
34
+ "./scope-context": {
35
+ "types": "./lib/scope-context.d.ts",
36
+ "import": "./lib/scope-context.js"
37
+ },
38
+ "./scope-delegation": {
39
+ "types": "./lib/scope-delegation.d.ts",
40
+ "import": "./lib/scope-delegation.js"
41
+ },
42
+ "./scope-fs": {
43
+ "types": "./lib/scope-fs.d.ts",
44
+ "import": "./lib/scope-fs.js"
45
+ },
46
+ "./scope-processes": {
47
+ "types": "./lib/scope-processes.d.ts",
48
+ "import": "./lib/scope-processes.js"
49
+ },
50
+ "./scope-sandbox-linux": {
51
+ "types": "./lib/scope-sandbox-linux.d.ts",
52
+ "import": "./lib/scope-sandbox-linux.js"
53
+ },
54
+ "./tool-guard": {
55
+ "types": "./lib/tool-guard.d.ts",
56
+ "import": "./lib/tool-guard.js"
57
+ },
58
+ "./package.json": "./package.json"
59
+ },
60
+ "files": [
61
+ "lib",
62
+ "cordis.patch.yml",
63
+ "compatibility.json",
64
+ "README.md",
65
+ "LICENSE"
66
+ ],
67
+ "scripts": {
68
+ "build": "tsc -p tsconfig.json",
69
+ "lint": "eslint src test scripts",
70
+ "typecheck": "tsc -p tsconfig.json --noEmit",
71
+ "test": "vitest run",
72
+ "test:watch": "vitest",
73
+ "verify:client": "node scripts/verify-client-bundle.mjs",
74
+ "verify:compatibility": "node scripts/verify-compatibility.mjs",
75
+ "verify:package": "node scripts/verify-package.mjs",
76
+ "verify": "npm run verify:client && npm run verify:compatibility && npm run verify:package",
77
+ "check": "npm run build && npm test && npm run verify",
78
+ "smoke:packed": "node scripts/smoke-packed-dsh.mjs",
79
+ "release:prepare": "node scripts/prepare-release.mjs",
80
+ "prepublishOnly": "npm run check"
81
+ },
82
+ "dsh": {
83
+ "bundle": {
84
+ "patch": "./cordis.patch.yml"
85
+ },
86
+ "client": {
87
+ "inject": [
88
+ "@deepseek-ai/dsh-client-runtime",
89
+ "@deepseek-ai/dsh-client-connection",
90
+ "@deepseek-ai/dsh-api-remotes",
91
+ "@deepseek-ai/dsh-client-ui-slots"
92
+ ],
93
+ "platform": "web"
94
+ }
95
+ },
96
+ "peerDependencies": {
97
+ "@deepseek-ai/dsh-fs": "catalog:dsh",
98
+ "@deepseek-ai/dsh-sandbox": "catalog:dsh",
99
+ "@deepseek-ai/dsh-session": "catalog:dsh",
100
+ "react": "^18.2.0",
101
+ "react-dom": "^18.2.0"
102
+ },
103
+ "peerDependenciesMeta": {
104
+ "react": {
105
+ "optional": true
106
+ },
107
+ "react-dom": {
108
+ "optional": true
109
+ }
110
+ },
111
+ "engines": {
112
+ "node": ">=20"
113
+ },
114
+ "keywords": [
115
+ "dsh",
116
+ "dsh-plugin",
117
+ "sandbox",
118
+ "permission",
119
+ "session-scope",
120
+ "workspace-scope"
121
+ ],
122
+ "license": "MIT",
123
+ "repository": {
124
+ "type": "git",
125
+ "url": "git+https://github.com/xarleyn/dsh-plugins.git",
126
+ "directory": "plugins/dsh-session-scope"
127
+ },
128
+ "bugs": {
129
+ "url": "https://github.com/xarleyn/dsh-plugins/issues"
130
+ },
131
+ "homepage": "https://github.com/xarleyn/dsh-plugins/tree/main/plugins/dsh-session-scope#readme",
132
+ "author": "xarleyn",
133
+ "publishConfig": {
134
+ "access": "public",
135
+ "registry": "https://registry.npmjs.org/"
136
+ },
137
+ "devDependencies": {
138
+ "@deepseek-ai/dsh-fs": "catalog:dsh-dev",
139
+ "@deepseek-ai/dsh-sandbox": "catalog:dsh-dev",
140
+ "@deepseek-ai/dsh-session": "catalog:dsh-dev",
141
+ "@types/node": "catalog:tooling",
142
+ "@types/react": "catalog:frontend-dev",
143
+ "@types/react-dom": "catalog:frontend-dev",
144
+ "eslint": "catalog:tooling",
145
+ "react": "catalog:frontend-dev",
146
+ "react-dom": "catalog:frontend-dev",
147
+ "typescript": "catalog:plugin-tooling",
148
+ "vitest": "catalog:tooling"
149
+ }
150
+ }