@deepseek-ai/dsh-api-session-controller 0.1.3-alpha.2 → 0.1.5-alpha.2
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/README.i18n.yaml +2 -2
- package/README.md +12 -2
- package/README.zh.md +12 -2
- package/lib/client.js +248 -30
- package/lib/index.js +125 -31
- package/lib/typert.host.js +149 -58
- package/lib/typert.remote-client.js +74 -34
- package/lib/types/agent.js +6 -8
- package/lib/types/client/session-wire-event.d.ts +11 -0
- package/lib/types/client/session-wire-event.js +43 -0
- package/lib/types/client/transport.js +6 -0
- package/lib/types/commands.d.ts +1 -1
- package/lib/types/commands.js +14 -4
- package/lib/types/control.d.ts +0 -1
- package/lib/types/control.js +19 -22
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +18 -2
- package/lib/types/media-references.d.ts +16 -0
- package/lib/types/media-references.js +77 -0
- package/lib/types/types.d.ts +17 -7
- package/package.json +71 -64
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated GET/HEAD /api/file reads bounded file responses through
|
|
3
|
+
* the composed filesystem provider. Paths and MIME types do not restrict access;
|
|
4
|
+
* the connection service authenticates requests before this handler.
|
|
5
|
+
* @module @deepseek-ai/dsh-api-session-controller/media-references
|
|
6
|
+
*/
|
|
7
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
8
|
+
/**
|
|
9
|
+
* File-display contribution. The connection service supplies authentication;
|
|
10
|
+
* `ctx.fs` supplies the execution world's paths, reads, and access policy.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SessionMediaReferences: {
|
|
13
|
+
inject: string[];
|
|
14
|
+
apply(ctx: Context): void;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=media-references.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated GET/HEAD /api/file reads bounded file responses through
|
|
3
|
+
* the composed filesystem provider. Paths and MIME types do not restrict access;
|
|
4
|
+
* the connection service authenticates requests before this handler.
|
|
5
|
+
* @module @deepseek-ai/dsh-api-session-controller/media-references
|
|
6
|
+
*/
|
|
7
|
+
import { isAbsolute } from 'node:path';
|
|
8
|
+
import { FsError } from '@deepseek-ai/dsh-fs';
|
|
9
|
+
import mime from 'mime-types';
|
|
10
|
+
const BASE_HEADERS = {
|
|
11
|
+
'Cache-Control': 'private, no-store',
|
|
12
|
+
'X-Content-Type-Options': 'nosniff',
|
|
13
|
+
// HTML and SVG files may be opened directly on the authenticated API origin.
|
|
14
|
+
'Content-Security-Policy': "sandbox; default-src 'none'",
|
|
15
|
+
};
|
|
16
|
+
async function serveFile(request, fs, maxBytes) {
|
|
17
|
+
const fail = (status, text) => new Response(request.method === 'HEAD' ? null : text, { status, headers: BASE_HEADERS });
|
|
18
|
+
const path = new URL(request.url).searchParams.get('path');
|
|
19
|
+
if (path === null || path.length === 0)
|
|
20
|
+
return fail(400, 'missing path');
|
|
21
|
+
if (path.includes('\0') || !isAbsolute(path))
|
|
22
|
+
return fail(400, 'absolute path required');
|
|
23
|
+
try {
|
|
24
|
+
const target = await fs.resolve(path, { signal: request.signal });
|
|
25
|
+
const mediaType = mime.lookup(target.displayPath) || 'application/octet-stream';
|
|
26
|
+
const headers = {
|
|
27
|
+
...BASE_HEADERS,
|
|
28
|
+
'Content-Type': mediaType,
|
|
29
|
+
};
|
|
30
|
+
if (request.method === 'HEAD') {
|
|
31
|
+
const info = await fs.stat(target, request.signal);
|
|
32
|
+
if (info === undefined)
|
|
33
|
+
return fail(404, 'not found');
|
|
34
|
+
if (info.type !== 'file')
|
|
35
|
+
return fail(403, 'not a regular file');
|
|
36
|
+
if (info.size !== undefined) {
|
|
37
|
+
if (info.size > maxBytes)
|
|
38
|
+
return fail(413, 'file exceeds byte limit');
|
|
39
|
+
headers['Content-Length'] = String(info.size);
|
|
40
|
+
}
|
|
41
|
+
return new Response(null, { headers });
|
|
42
|
+
}
|
|
43
|
+
const bytes = await fs.readBytes(target, request.signal, maxBytes);
|
|
44
|
+
headers['Content-Length'] = String(bytes.byteLength);
|
|
45
|
+
return new Response(bytes.slice(), { headers });
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (!(error instanceof FsError))
|
|
49
|
+
throw error;
|
|
50
|
+
const statuses = {
|
|
51
|
+
FS_NOT_FOUND: 404,
|
|
52
|
+
FS_NOT_REGULAR_FILE: 403,
|
|
53
|
+
FS_PERMISSION_DENIED: 403,
|
|
54
|
+
FS_SANDBOX_DENIED: 403,
|
|
55
|
+
FS_TOO_LARGE: 413,
|
|
56
|
+
FS_ABORTED: 499,
|
|
57
|
+
};
|
|
58
|
+
return fail(statuses[error.code] ?? 500, error.code);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* File-display contribution. The connection service supplies authentication;
|
|
63
|
+
* `ctx.fs` supplies the execution world's paths, reads, and access policy.
|
|
64
|
+
*/
|
|
65
|
+
export const SessionMediaReferences = {
|
|
66
|
+
inject: ['connection', 'fs', 'attachments'],
|
|
67
|
+
apply(ctx) {
|
|
68
|
+
const maxBytes = ctx.attachments.imageLimits.maxImageBytes;
|
|
69
|
+
ctx.effect(() => ctx.connection.fetch.register({
|
|
70
|
+
path: '/api/file',
|
|
71
|
+
methods: ['GET', 'HEAD'],
|
|
72
|
+
requestBody: 'buffered',
|
|
73
|
+
fetch: request => serveFile(request, ctx.fs, maxBytes),
|
|
74
|
+
}), 'session-controller: /api/file');
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=media-references.js.map
|
package/lib/types/types.d.ts
CHANGED
|
@@ -134,6 +134,7 @@ export interface ModelCatalog {
|
|
|
134
134
|
/** One client-requested mutation of a still-pending queue item. */
|
|
135
135
|
export type QueueAction = {
|
|
136
136
|
readonly kind: 'edit';
|
|
137
|
+
/** Non-empty text-only replacement content. */
|
|
137
138
|
readonly content: readonly ContentBlock[];
|
|
138
139
|
} | {
|
|
139
140
|
readonly kind: 'remove';
|
|
@@ -293,6 +294,7 @@ export interface SessionPromptRequest {
|
|
|
293
294
|
readonly requestId: SessionRequestId;
|
|
294
295
|
readonly sessionId: SessionId;
|
|
295
296
|
readonly mode: 'queue' | 'steer';
|
|
297
|
+
/** At least one non-whitespace text part or attachment. */
|
|
296
298
|
readonly content: readonly PromptContentPart[];
|
|
297
299
|
readonly clientTimeZone?: string;
|
|
298
300
|
}
|
|
@@ -330,6 +332,8 @@ export interface SessionCancelValue {
|
|
|
330
332
|
}
|
|
331
333
|
/** Request to open one path prepared by a Session-aware caller on the Host desktop. */
|
|
332
334
|
export interface SessionOpenWorkspacePathRequest {
|
|
335
|
+
/** File-manager navigation when requested; omission uses the default application. */
|
|
336
|
+
readonly action?: 'reveal';
|
|
333
337
|
/** Path after best-effort Session workspace resolution, in Host filesystem syntax. */
|
|
334
338
|
readonly path: string;
|
|
335
339
|
}
|
|
@@ -377,23 +381,29 @@ export interface SessionWireHeader {
|
|
|
377
381
|
readonly delegationDepth?: number;
|
|
378
382
|
readonly agentPreset?: string;
|
|
379
383
|
}
|
|
380
|
-
/** Browser wire
|
|
384
|
+
/** Browser wire surface operation; replacement endpoints are earlier event seqs in surface order. */
|
|
381
385
|
export type SessionWireSurfaceOp = 'append' | {
|
|
382
386
|
readonly op: 'replace';
|
|
383
|
-
readonly
|
|
384
|
-
readonly
|
|
387
|
+
readonly startSeq: number;
|
|
388
|
+
readonly endSeq: number;
|
|
385
389
|
};
|
|
386
|
-
/** One history-page record
|
|
390
|
+
/** One history-page record with compact Assistant streams embedded inside events. */
|
|
387
391
|
export type SessionHistoryRecord = SessionEventEntry;
|
|
388
|
-
/**
|
|
392
|
+
/**
|
|
393
|
+
* Exact Session event envelope accepted by the Client journal adapter.
|
|
394
|
+
* Surface events require surfaceOp; only non-Assistant surface events may cite earlier sources.
|
|
395
|
+
* Durable readers own recognition of merge-extensible event names.
|
|
396
|
+
*/
|
|
389
397
|
export interface SessionWireEvent {
|
|
390
398
|
readonly type: string;
|
|
391
399
|
readonly seq: number;
|
|
392
400
|
readonly time: number;
|
|
393
401
|
readonly data: JsonValue;
|
|
394
402
|
readonly ignorable?: true;
|
|
395
|
-
|
|
396
|
-
readonly
|
|
403
|
+
/** Earlier sources on current surface events; opaque JSON on unknown ignorable events. */
|
|
404
|
+
readonly sourceEventSeqs?: JsonValue;
|
|
405
|
+
/** Canonical placement on current surface events; opaque JSON on unknown ignorable events. */
|
|
406
|
+
readonly surfaceOp?: JsonValue;
|
|
397
407
|
}
|
|
398
408
|
/** One message-aligned backwards-history request. */
|
|
399
409
|
export interface SessionPageRequest {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-api-session-controller",
|
|
3
3
|
"description": "Session Remote commands, cold reads, and live control transport",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.5-alpha.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -64,40 +64,42 @@
|
|
|
64
64
|
],
|
|
65
65
|
"license": "MIT",
|
|
66
66
|
"dependencies": {
|
|
67
|
+
"mime-types": "^3.0.2",
|
|
67
68
|
"zod": "^4.4.3",
|
|
68
|
-
"@deepseek-ai/dsh-
|
|
69
|
-
"@deepseek-ai/
|
|
70
|
-
"@deepseek-ai/
|
|
69
|
+
"@deepseek-ai/dsh-deque": "^0.1.5-alpha.2",
|
|
70
|
+
"@deepseek-ai/schemastery": "^3.18.2",
|
|
71
|
+
"@deepseek-ai/dsh-brand": "^0.1.5-alpha.2"
|
|
71
72
|
},
|
|
72
73
|
"peerDependencies": {
|
|
73
|
-
"@deepseek-ai/dsh-agent": "^0.1.
|
|
74
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-alpha.2",
|
|
75
|
+
"@deepseek-ai/dsh-agent-default-model": "^0.1.5-alpha.2",
|
|
74
76
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
75
|
-
"@deepseek-ai/dsh-agent-
|
|
76
|
-
"@deepseek-ai/dsh-
|
|
77
|
-
"@deepseek-ai/dsh-attachment": "^0.1.
|
|
78
|
-
"@deepseek-ai/dsh-
|
|
79
|
-
"@deepseek-ai/dsh-client-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-session": "^0.1.
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-session-projection": "^0.1.
|
|
90
|
-
"@deepseek-ai/dsh-session-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
96
|
-
"@deepseek-ai/dsh-util-time": "^0.1.
|
|
97
|
-
"@deepseek-ai/dsh-
|
|
98
|
-
"@deepseek-ai/dsh-util-
|
|
99
|
-
"@deepseek-ai/dsh-workspace": "^0.1.
|
|
100
|
-
"@deepseek-ai/dsh-
|
|
77
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-alpha.2",
|
|
78
|
+
"@deepseek-ai/dsh-api-gateway": "^0.1.5-alpha.2",
|
|
79
|
+
"@deepseek-ai/dsh-attachment": "^0.1.5-alpha.2",
|
|
80
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.5-alpha.2",
|
|
81
|
+
"@deepseek-ai/dsh-client-file-upload": "^0.1.5-alpha.2",
|
|
82
|
+
"@deepseek-ai/dsh-commands": "^0.1.5-alpha.2",
|
|
83
|
+
"@deepseek-ai/dsh-file-reference": "^0.1.5-alpha.2",
|
|
84
|
+
"@deepseek-ai/dsh-jobs": "^0.1.5-alpha.2",
|
|
85
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-alpha.2",
|
|
86
|
+
"@deepseek-ai/dsh-native-command": "^0.1.5-alpha.2",
|
|
87
|
+
"@deepseek-ai/dsh-scope": "^0.1.5-alpha.2",
|
|
88
|
+
"@deepseek-ai/dsh-session": "^0.1.5-alpha.2",
|
|
89
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-alpha.2",
|
|
90
|
+
"@deepseek-ai/dsh-fs": "^0.1.5-alpha.2",
|
|
91
|
+
"@deepseek-ai/dsh-session-projection-cache": "^0.1.5-alpha.2",
|
|
92
|
+
"@deepseek-ai/dsh-session-query": "^0.1.5-alpha.2",
|
|
93
|
+
"@deepseek-ai/dsh-skill": "^0.1.5-alpha.2",
|
|
94
|
+
"@deepseek-ai/dsh-subagent": "^0.1.5-alpha.2",
|
|
95
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-alpha.2",
|
|
96
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.5-alpha.2",
|
|
97
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-alpha.2",
|
|
98
|
+
"@deepseek-ai/dsh-util-time": "^0.1.5-alpha.2",
|
|
99
|
+
"@deepseek-ai/dsh-typert-registry": "^0.1.5-alpha.2",
|
|
100
|
+
"@deepseek-ai/dsh-util-values": "^0.1.5-alpha.2",
|
|
101
|
+
"@deepseek-ai/dsh-util-workspace-path": "^0.1.5-alpha.2",
|
|
102
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-alpha.2"
|
|
101
103
|
},
|
|
102
104
|
"peerDependenciesMeta": {
|
|
103
105
|
"@deepseek-ai/dsh-jobs": {
|
|
@@ -111,40 +113,45 @@
|
|
|
111
113
|
}
|
|
112
114
|
},
|
|
113
115
|
"devDependencies": {
|
|
116
|
+
"@types/mime-types": "^3.0.1",
|
|
114
117
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
115
|
-
"@deepseek-ai/dsh-agent": "^0.1.
|
|
116
|
-
"@deepseek-ai/dsh-agent-default-model": "^0.1.
|
|
117
|
-
"@deepseek-ai/dsh-
|
|
118
|
-
"@deepseek-ai/dsh-
|
|
119
|
-
"@deepseek-ai/dsh-
|
|
120
|
-
"@deepseek-ai/dsh-
|
|
121
|
-
"@deepseek-ai/dsh-
|
|
122
|
-
"@deepseek-ai/dsh-client-
|
|
123
|
-
"@deepseek-ai/dsh-file-
|
|
124
|
-
"@deepseek-ai/dsh-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-
|
|
129
|
-
"@deepseek-ai/dsh-
|
|
130
|
-
"@deepseek-ai/dsh-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-
|
|
133
|
-
"@deepseek-ai/dsh-session
|
|
134
|
-
"@deepseek-ai/dsh-
|
|
135
|
-
"@deepseek-ai/dsh-session-
|
|
136
|
-
"@deepseek-ai/dsh-
|
|
137
|
-
"@deepseek-ai/dsh-
|
|
138
|
-
"@deepseek-ai/dsh-
|
|
139
|
-
"@deepseek-ai/dsh-
|
|
140
|
-
"@deepseek-ai/dsh-
|
|
141
|
-
"@deepseek-ai/dsh-
|
|
142
|
-
"@deepseek-ai/dsh-
|
|
143
|
-
"@deepseek-ai/dsh-
|
|
144
|
-
"@deepseek-ai/dsh-
|
|
145
|
-
"@deepseek-ai/dsh-
|
|
146
|
-
"@deepseek-ai/dsh-
|
|
147
|
-
"@deepseek-ai/dsh-util-
|
|
118
|
+
"@deepseek-ai/dsh-agent": "^0.1.5-alpha.2",
|
|
119
|
+
"@deepseek-ai/dsh-agent-default-model": "^0.1.5-alpha.2",
|
|
120
|
+
"@deepseek-ai/dsh-agent-loop": "^0.1.5-alpha.2",
|
|
121
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "^0.1.5-alpha.2",
|
|
122
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.5-alpha.2",
|
|
123
|
+
"@deepseek-ai/dsh-api-gateway": "^0.1.5-alpha.2",
|
|
124
|
+
"@deepseek-ai/dsh-attachment": "^0.1.5-alpha.2",
|
|
125
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.5-alpha.2",
|
|
126
|
+
"@deepseek-ai/dsh-client-file-upload": "^0.1.5-alpha.2",
|
|
127
|
+
"@deepseek-ai/dsh-client-store": "^0.1.5-alpha.2",
|
|
128
|
+
"@deepseek-ai/dsh-commands": "^0.1.5-alpha.2",
|
|
129
|
+
"@deepseek-ai/dsh-file-reference": "^0.1.5-alpha.2",
|
|
130
|
+
"@deepseek-ai/dsh-fs": "^0.1.5-alpha.2",
|
|
131
|
+
"@deepseek-ai/dsh-fs-local": "^0.1.5-alpha.2",
|
|
132
|
+
"@deepseek-ai/dsh-jobs": "^0.1.5-alpha.2",
|
|
133
|
+
"@deepseek-ai/dsh-llm": "^0.1.5-alpha.2",
|
|
134
|
+
"@deepseek-ai/dsh-native-command": "^0.1.5-alpha.2",
|
|
135
|
+
"@deepseek-ai/dsh-permission-presets": "^0.1.5-alpha.2",
|
|
136
|
+
"@deepseek-ai/dsh-session": "^0.1.5-alpha.2",
|
|
137
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.5-alpha.2",
|
|
138
|
+
"@deepseek-ai/dsh-session-projection": "^0.1.5-alpha.2",
|
|
139
|
+
"@deepseek-ai/dsh-session-projection-cache": "^0.1.5-alpha.2",
|
|
140
|
+
"@deepseek-ai/dsh-session-query": "^0.1.5-alpha.2",
|
|
141
|
+
"@deepseek-ai/dsh-session-title": "^0.1.5-alpha.2",
|
|
142
|
+
"@deepseek-ai/dsh-skill": "^0.1.5-alpha.2",
|
|
143
|
+
"@deepseek-ai/dsh-storage": "^0.1.5-alpha.2",
|
|
144
|
+
"@deepseek-ai/dsh-storage-json": "^0.1.5-alpha.2",
|
|
145
|
+
"@deepseek-ai/dsh-storage-domain": "^0.1.5-alpha.2",
|
|
146
|
+
"@deepseek-ai/dsh-subagent": "^0.1.5-alpha.2",
|
|
147
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.5-alpha.2",
|
|
148
|
+
"@deepseek-ai/dsh-scope": "^0.1.5-alpha.2",
|
|
149
|
+
"@deepseek-ai/dsh-typert-registry": "^0.1.5-alpha.2",
|
|
150
|
+
"@deepseek-ai/dsh-util-crypto": "^0.1.5-alpha.2",
|
|
151
|
+
"@deepseek-ai/dsh-util-time": "^0.1.5-alpha.2",
|
|
152
|
+
"@deepseek-ai/dsh-util-values": "^0.1.5-alpha.2",
|
|
153
|
+
"@deepseek-ai/dsh-util-workspace-path": "^0.1.5-alpha.2",
|
|
154
|
+
"@deepseek-ai/dsh-workspace": "^0.1.5-alpha.2"
|
|
148
155
|
},
|
|
149
156
|
"scripts": {
|
|
150
157
|
"bundle": "tsdown",
|