@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.
@@ -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
@@ -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 form of one Session surface operation. */
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 start: number;
384
- readonly end: number;
387
+ readonly startSeq: number;
388
+ readonly endSeq: number;
385
389
  };
386
- /** One history-page record. V2 embeds compact Assistant streams inside events. */
390
+ /** One history-page record with compact Assistant streams embedded inside events. */
387
391
  export type SessionHistoryRecord = SessionEventEntry;
388
- /** Session event wire form; durable readers own recognition of merge-extensible event names. */
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
- readonly sourceEventSeqs?: number[];
396
- readonly surfaceOp?: SessionWireSurfaceOp;
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.3-alpha.2",
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-brand": "^0.1.3-alpha.2",
69
- "@deepseek-ai/dsh-deque": "^0.1.3-alpha.2",
70
- "@deepseek-ai/schemastery": "^3.18.2"
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.3-alpha.2",
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-default-model": "^0.1.3-alpha.2",
76
- "@deepseek-ai/dsh-agent-presets": "^0.1.3-alpha.2",
77
- "@deepseek-ai/dsh-attachment": "^0.1.3-alpha.2",
78
- "@deepseek-ai/dsh-api-gateway": "^0.1.3-alpha.2",
79
- "@deepseek-ai/dsh-client-connection": "^0.1.3-alpha.2",
80
- "@deepseek-ai/dsh-client-file-upload": "^0.1.3-alpha.2",
81
- "@deepseek-ai/dsh-commands": "^0.1.3-alpha.2",
82
- "@deepseek-ai/dsh-file-reference": "^0.1.3-alpha.2",
83
- "@deepseek-ai/dsh-jobs": "^0.1.3-alpha.2",
84
- "@deepseek-ai/dsh-llm": "^0.1.3-alpha.2",
85
- "@deepseek-ai/dsh-native-command": "^0.1.3-alpha.2",
86
- "@deepseek-ai/dsh-scope": "^0.1.3-alpha.2",
87
- "@deepseek-ai/dsh-session": "^0.1.3-alpha.2",
88
- "@deepseek-ai/dsh-session-persistence": "^0.1.3-alpha.2",
89
- "@deepseek-ai/dsh-session-projection": "^0.1.3-alpha.2",
90
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.3-alpha.2",
91
- "@deepseek-ai/dsh-session-query": "^0.1.3-alpha.2",
92
- "@deepseek-ai/dsh-skill": "^0.1.3-alpha.2",
93
- "@deepseek-ai/dsh-subagent": "^0.1.3-alpha.2",
94
- "@deepseek-ai/dsh-typert-protocol": "^0.1.3-alpha.2",
95
- "@deepseek-ai/dsh-typert-registry": "^0.1.3-alpha.2",
96
- "@deepseek-ai/dsh-util-time": "^0.1.3-alpha.2",
97
- "@deepseek-ai/dsh-util-values": "^0.1.3-alpha.2",
98
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.3-alpha.2",
99
- "@deepseek-ai/dsh-workspace": "^0.1.3-alpha.2",
100
- "@deepseek-ai/dsh-session-title": "^0.1.3-alpha.2"
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.3-alpha.2",
116
- "@deepseek-ai/dsh-agent-default-model": "^0.1.3-alpha.2",
117
- "@deepseek-ai/dsh-api-gateway": "^0.1.3-alpha.2",
118
- "@deepseek-ai/dsh-attachment": "^0.1.3-alpha.2",
119
- "@deepseek-ai/dsh-client-connection": "^0.1.3-alpha.2",
120
- "@deepseek-ai/dsh-client-file-upload": "^0.1.3-alpha.2",
121
- "@deepseek-ai/dsh-commands": "^0.1.3-alpha.2",
122
- "@deepseek-ai/dsh-client-store": "^0.1.3-alpha.2",
123
- "@deepseek-ai/dsh-file-reference": "^0.1.3-alpha.2",
124
- "@deepseek-ai/dsh-agent-presets": "^0.1.3-alpha.2",
125
- "@deepseek-ai/dsh-jobs": "^0.1.3-alpha.2",
126
- "@deepseek-ai/dsh-llm": "^0.1.3-alpha.2",
127
- "@deepseek-ai/dsh-native-command": "^0.1.3-alpha.2",
128
- "@deepseek-ai/dsh-permission-presets": "^0.1.3-alpha.2",
129
- "@deepseek-ai/dsh-session": "^0.1.3-alpha.2",
130
- "@deepseek-ai/dsh-session-persistence": "^0.1.3-alpha.2",
131
- "@deepseek-ai/dsh-session-projection": "^0.1.3-alpha.2",
132
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.3-alpha.2",
133
- "@deepseek-ai/dsh-session-query": "^0.1.3-alpha.2",
134
- "@deepseek-ai/dsh-scope": "^0.1.3-alpha.2",
135
- "@deepseek-ai/dsh-session-title": "^0.1.3-alpha.2",
136
- "@deepseek-ai/dsh-skill": "^0.1.3-alpha.2",
137
- "@deepseek-ai/dsh-storage": "^0.1.3-alpha.2",
138
- "@deepseek-ai/dsh-storage-domain": "^0.1.3-alpha.2",
139
- "@deepseek-ai/dsh-storage-json": "^0.1.3-alpha.2",
140
- "@deepseek-ai/dsh-subagent": "^0.1.3-alpha.2",
141
- "@deepseek-ai/dsh-typert-protocol": "^0.1.3-alpha.2",
142
- "@deepseek-ai/dsh-typert-registry": "^0.1.3-alpha.2",
143
- "@deepseek-ai/dsh-util-crypto": "^0.1.3-alpha.2",
144
- "@deepseek-ai/dsh-util-time": "^0.1.3-alpha.2",
145
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.3-alpha.2",
146
- "@deepseek-ai/dsh-workspace": "^0.1.3-alpha.2",
147
- "@deepseek-ai/dsh-util-values": "^0.1.3-alpha.2"
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",