@sparkelf/dsh-plugin-mobile-gateway 0.8.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.
@@ -0,0 +1,32 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>Archify automated browser evidence · runtime-architecture.html</title>
7
+ <style>
8
+ *{box-sizing:border-box}body{margin:0;padding:24px;background:#e9eef5;color:#172033;font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}header{max-width:1500px;margin:0 auto 18px}h1{margin:0 0 6px;font-size:20px}p{margin:0;color:#526176}.grid{max-width:1500px;margin:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}figure{margin:0;padding:10px;background:white;border:1px solid #c9d4e3;border-radius:12px;box-shadow:0 10px 30px rgba(15,23,42,.08)}img{display:block;width:100%;height:auto;border:1px solid #e2e8f0}figcaption{padding:9px 4px 2px;color:#526176}@media(max-width:900px){.grid{grid-template-columns:1fr}}
9
+ </style>
10
+ </head>
11
+ <body>
12
+ <header><h1>Automated browser evidence</h1><p>runtime-architecture.html · visual-check containment pass · perceptual visual review pending</p></header>
13
+ <main class="grid">
14
+ <figure>
15
+ <img src="runtime-architecture.visual-check.1440x900.light.png" alt="light 1440 by 900">
16
+ <figcaption><strong>LIGHT</strong> · 1440×900 · containment pass</figcaption>
17
+ </figure>
18
+ <figure>
19
+ <img src="runtime-architecture.visual-check.1440x900.dark.png" alt="dark 1440 by 900">
20
+ <figcaption><strong>DARK</strong> · 1440×900 · containment pass</figcaption>
21
+ </figure>
22
+ <figure>
23
+ <img src="runtime-architecture.visual-check.2048x1320.light.png" alt="light 2048 by 1320">
24
+ <figcaption><strong>LIGHT</strong> · 2048×1320 · containment pass</figcaption>
25
+ </figure>
26
+ <figure>
27
+ <img src="runtime-architecture.visual-check.2048x1320.dark.png" alt="dark 2048 by 1320">
28
+ <figcaption><strong>DARK</strong> · 2048×1320 · containment pass</figcaption>
29
+ </figure>
30
+ </main>
31
+ </body>
32
+ </html>
@@ -0,0 +1,548 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "ok": true,
4
+ "command": "visual-check",
5
+ "evidenceKind": "automated-browser",
6
+ "status": "pass",
7
+ "visualReview": "pending",
8
+ "artifact": {
9
+ "path": "/Users/lichaofan/DeepseekHarnessProject/dsh-plugin-mobile-gateway/docs/runtime-architecture.html",
10
+ "sha256": "9bf712d96fb1487b2c7ff731f92c94b6d02433fcb3a186316438778de5d67e1c",
11
+ "bytes": 812726
12
+ },
13
+ "state": {
14
+ "detail": "read",
15
+ "motion": "still"
16
+ },
17
+ "chrome": {
18
+ "status": "available",
19
+ "executable": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
20
+ },
21
+ "diagnostics": [],
22
+ "containment": {
23
+ "status": "pass",
24
+ "viewports": [
25
+ {
26
+ "width": 1440,
27
+ "height": 900,
28
+ "theme": "light",
29
+ "innerWidth": 1440,
30
+ "innerHeight": 900,
31
+ "scrollWidth": 1440,
32
+ "scrollHeight": 900,
33
+ "overflowX": false,
34
+ "overflowY": false,
35
+ "ok": true,
36
+ "readerWidth": 1057,
37
+ "diagramWidth": 1027,
38
+ "viewBoxWidth": 1300,
39
+ "minimumProjectedNodeTextPx": 6.636000000000001,
40
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
41
+ "minimumProjectedNodeTextDetail": "context",
42
+ "minimumRequiredNodeTextPx": 6,
43
+ "readabilityOk": true,
44
+ "hasLegend": true,
45
+ "hasNavigationDock": true,
46
+ "legendDockIntersectionArea": 0,
47
+ "dockStageIntersectionArea": 0,
48
+ "dockStageGap": 10.21875,
49
+ "requiredDockStageGap": 10,
50
+ "viewerChromeStageOk": true,
51
+ "viewerChromeReserve": 51,
52
+ "viewerChromeActive": true,
53
+ "viewerChromeOk": true,
54
+ "resolvedTheme": "light"
55
+ },
56
+ {
57
+ "width": 1600,
58
+ "height": 1000,
59
+ "theme": "light",
60
+ "innerWidth": 1600,
61
+ "innerHeight": 1000,
62
+ "scrollWidth": 1600,
63
+ "scrollHeight": 1000,
64
+ "overflowX": false,
65
+ "overflowY": false,
66
+ "ok": true,
67
+ "readerWidth": 1091,
68
+ "diagramWidth": 1061,
69
+ "viewBoxWidth": 1300,
70
+ "minimumProjectedNodeTextPx": 6.8556923076923075,
71
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
72
+ "minimumProjectedNodeTextDetail": "context",
73
+ "minimumRequiredNodeTextPx": 6,
74
+ "readabilityOk": true,
75
+ "hasLegend": true,
76
+ "hasNavigationDock": true,
77
+ "legendDockIntersectionArea": 0,
78
+ "dockStageIntersectionArea": 0,
79
+ "dockStageGap": 10.21875,
80
+ "requiredDockStageGap": 10,
81
+ "viewerChromeStageOk": true,
82
+ "viewerChromeReserve": 51,
83
+ "viewerChromeActive": true,
84
+ "viewerChromeOk": true,
85
+ "resolvedTheme": "light"
86
+ },
87
+ {
88
+ "width": 1920,
89
+ "height": 1080,
90
+ "theme": "light",
91
+ "innerWidth": 1920,
92
+ "innerHeight": 1080,
93
+ "scrollWidth": 1920,
94
+ "scrollHeight": 1080,
95
+ "overflowX": false,
96
+ "overflowY": false,
97
+ "ok": true,
98
+ "readerWidth": 1239,
99
+ "diagramWidth": 1209,
100
+ "viewBoxWidth": 1300,
101
+ "minimumProjectedNodeTextPx": 7.812000000000001,
102
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
103
+ "minimumProjectedNodeTextDetail": "context",
104
+ "minimumRequiredNodeTextPx": 6,
105
+ "readabilityOk": true,
106
+ "hasLegend": true,
107
+ "hasNavigationDock": true,
108
+ "legendDockIntersectionArea": 0,
109
+ "dockStageIntersectionArea": 0,
110
+ "dockStageGap": 10.21875,
111
+ "requiredDockStageGap": 10,
112
+ "viewerChromeStageOk": true,
113
+ "viewerChromeReserve": 51,
114
+ "viewerChromeActive": true,
115
+ "viewerChromeOk": true,
116
+ "resolvedTheme": "light"
117
+ },
118
+ {
119
+ "width": 2048,
120
+ "height": 1320,
121
+ "theme": "light",
122
+ "innerWidth": 2048,
123
+ "innerHeight": 1320,
124
+ "scrollWidth": 2048,
125
+ "scrollHeight": 1320,
126
+ "overflowX": false,
127
+ "overflowY": false,
128
+ "ok": true,
129
+ "readerWidth": 1627,
130
+ "diagramWidth": 1577,
131
+ "viewBoxWidth": 1300,
132
+ "minimumProjectedNodeTextPx": 8.4,
133
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
134
+ "minimumProjectedNodeTextDetail": "context",
135
+ "minimumRequiredNodeTextPx": 6,
136
+ "readabilityOk": true,
137
+ "hasLegend": true,
138
+ "hasNavigationDock": true,
139
+ "legendDockIntersectionArea": 0,
140
+ "dockStageIntersectionArea": 0,
141
+ "dockStageGap": 10.21875,
142
+ "requiredDockStageGap": 10,
143
+ "viewerChromeStageOk": true,
144
+ "viewerChromeReserve": 41,
145
+ "viewerChromeActive": true,
146
+ "viewerChromeOk": true,
147
+ "resolvedTheme": "light"
148
+ }
149
+ ]
150
+ },
151
+ "readability": {
152
+ "status": "pass",
153
+ "minimumProjectedNodeTextPx": 6,
154
+ "viewports": [
155
+ {
156
+ "width": 1440,
157
+ "height": 900,
158
+ "theme": "light",
159
+ "innerWidth": 1440,
160
+ "innerHeight": 900,
161
+ "scrollWidth": 1440,
162
+ "scrollHeight": 900,
163
+ "overflowX": false,
164
+ "overflowY": false,
165
+ "ok": true,
166
+ "readerWidth": 1057,
167
+ "diagramWidth": 1027,
168
+ "viewBoxWidth": 1300,
169
+ "minimumProjectedNodeTextPx": 6.636000000000001,
170
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
171
+ "minimumProjectedNodeTextDetail": "context",
172
+ "minimumRequiredNodeTextPx": 6,
173
+ "readabilityOk": true,
174
+ "hasLegend": true,
175
+ "hasNavigationDock": true,
176
+ "legendDockIntersectionArea": 0,
177
+ "dockStageIntersectionArea": 0,
178
+ "dockStageGap": 10.21875,
179
+ "requiredDockStageGap": 10,
180
+ "viewerChromeStageOk": true,
181
+ "viewerChromeReserve": 51,
182
+ "viewerChromeActive": true,
183
+ "viewerChromeOk": true,
184
+ "resolvedTheme": "light"
185
+ },
186
+ {
187
+ "width": 1600,
188
+ "height": 1000,
189
+ "theme": "light",
190
+ "innerWidth": 1600,
191
+ "innerHeight": 1000,
192
+ "scrollWidth": 1600,
193
+ "scrollHeight": 1000,
194
+ "overflowX": false,
195
+ "overflowY": false,
196
+ "ok": true,
197
+ "readerWidth": 1091,
198
+ "diagramWidth": 1061,
199
+ "viewBoxWidth": 1300,
200
+ "minimumProjectedNodeTextPx": 6.8556923076923075,
201
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
202
+ "minimumProjectedNodeTextDetail": "context",
203
+ "minimumRequiredNodeTextPx": 6,
204
+ "readabilityOk": true,
205
+ "hasLegend": true,
206
+ "hasNavigationDock": true,
207
+ "legendDockIntersectionArea": 0,
208
+ "dockStageIntersectionArea": 0,
209
+ "dockStageGap": 10.21875,
210
+ "requiredDockStageGap": 10,
211
+ "viewerChromeStageOk": true,
212
+ "viewerChromeReserve": 51,
213
+ "viewerChromeActive": true,
214
+ "viewerChromeOk": true,
215
+ "resolvedTheme": "light"
216
+ },
217
+ {
218
+ "width": 1920,
219
+ "height": 1080,
220
+ "theme": "light",
221
+ "innerWidth": 1920,
222
+ "innerHeight": 1080,
223
+ "scrollWidth": 1920,
224
+ "scrollHeight": 1080,
225
+ "overflowX": false,
226
+ "overflowY": false,
227
+ "ok": true,
228
+ "readerWidth": 1239,
229
+ "diagramWidth": 1209,
230
+ "viewBoxWidth": 1300,
231
+ "minimumProjectedNodeTextPx": 7.812000000000001,
232
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
233
+ "minimumProjectedNodeTextDetail": "context",
234
+ "minimumRequiredNodeTextPx": 6,
235
+ "readabilityOk": true,
236
+ "hasLegend": true,
237
+ "hasNavigationDock": true,
238
+ "legendDockIntersectionArea": 0,
239
+ "dockStageIntersectionArea": 0,
240
+ "dockStageGap": 10.21875,
241
+ "requiredDockStageGap": 10,
242
+ "viewerChromeStageOk": true,
243
+ "viewerChromeReserve": 51,
244
+ "viewerChromeActive": true,
245
+ "viewerChromeOk": true,
246
+ "resolvedTheme": "light"
247
+ },
248
+ {
249
+ "width": 2048,
250
+ "height": 1320,
251
+ "theme": "light",
252
+ "innerWidth": 2048,
253
+ "innerHeight": 1320,
254
+ "scrollWidth": 2048,
255
+ "scrollHeight": 1320,
256
+ "overflowX": false,
257
+ "overflowY": false,
258
+ "ok": true,
259
+ "readerWidth": 1627,
260
+ "diagramWidth": 1577,
261
+ "viewBoxWidth": 1300,
262
+ "minimumProjectedNodeTextPx": 8.4,
263
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
264
+ "minimumProjectedNodeTextDetail": "context",
265
+ "minimumRequiredNodeTextPx": 6,
266
+ "readabilityOk": true,
267
+ "hasLegend": true,
268
+ "hasNavigationDock": true,
269
+ "legendDockIntersectionArea": 0,
270
+ "dockStageIntersectionArea": 0,
271
+ "dockStageGap": 10.21875,
272
+ "requiredDockStageGap": 10,
273
+ "viewerChromeStageOk": true,
274
+ "viewerChromeReserve": 41,
275
+ "viewerChromeActive": true,
276
+ "viewerChromeOk": true,
277
+ "resolvedTheme": "light"
278
+ }
279
+ ]
280
+ },
281
+ "viewerChrome": {
282
+ "status": "pass",
283
+ "viewports": [
284
+ {
285
+ "width": 1440,
286
+ "height": 900,
287
+ "theme": "light",
288
+ "innerWidth": 1440,
289
+ "innerHeight": 900,
290
+ "scrollWidth": 1440,
291
+ "scrollHeight": 900,
292
+ "overflowX": false,
293
+ "overflowY": false,
294
+ "ok": true,
295
+ "readerWidth": 1057,
296
+ "diagramWidth": 1027,
297
+ "viewBoxWidth": 1300,
298
+ "minimumProjectedNodeTextPx": 6.636000000000001,
299
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
300
+ "minimumProjectedNodeTextDetail": "context",
301
+ "minimumRequiredNodeTextPx": 6,
302
+ "readabilityOk": true,
303
+ "hasLegend": true,
304
+ "hasNavigationDock": true,
305
+ "legendDockIntersectionArea": 0,
306
+ "dockStageIntersectionArea": 0,
307
+ "dockStageGap": 10.21875,
308
+ "requiredDockStageGap": 10,
309
+ "viewerChromeStageOk": true,
310
+ "viewerChromeReserve": 51,
311
+ "viewerChromeActive": true,
312
+ "viewerChromeOk": true,
313
+ "resolvedTheme": "light"
314
+ },
315
+ {
316
+ "width": 1600,
317
+ "height": 1000,
318
+ "theme": "light",
319
+ "innerWidth": 1600,
320
+ "innerHeight": 1000,
321
+ "scrollWidth": 1600,
322
+ "scrollHeight": 1000,
323
+ "overflowX": false,
324
+ "overflowY": false,
325
+ "ok": true,
326
+ "readerWidth": 1091,
327
+ "diagramWidth": 1061,
328
+ "viewBoxWidth": 1300,
329
+ "minimumProjectedNodeTextPx": 6.8556923076923075,
330
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
331
+ "minimumProjectedNodeTextDetail": "context",
332
+ "minimumRequiredNodeTextPx": 6,
333
+ "readabilityOk": true,
334
+ "hasLegend": true,
335
+ "hasNavigationDock": true,
336
+ "legendDockIntersectionArea": 0,
337
+ "dockStageIntersectionArea": 0,
338
+ "dockStageGap": 10.21875,
339
+ "requiredDockStageGap": 10,
340
+ "viewerChromeStageOk": true,
341
+ "viewerChromeReserve": 51,
342
+ "viewerChromeActive": true,
343
+ "viewerChromeOk": true,
344
+ "resolvedTheme": "light"
345
+ },
346
+ {
347
+ "width": 1920,
348
+ "height": 1080,
349
+ "theme": "light",
350
+ "innerWidth": 1920,
351
+ "innerHeight": 1080,
352
+ "scrollWidth": 1920,
353
+ "scrollHeight": 1080,
354
+ "overflowX": false,
355
+ "overflowY": false,
356
+ "ok": true,
357
+ "readerWidth": 1239,
358
+ "diagramWidth": 1209,
359
+ "viewBoxWidth": 1300,
360
+ "minimumProjectedNodeTextPx": 7.812000000000001,
361
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
362
+ "minimumProjectedNodeTextDetail": "context",
363
+ "minimumRequiredNodeTextPx": 6,
364
+ "readabilityOk": true,
365
+ "hasLegend": true,
366
+ "hasNavigationDock": true,
367
+ "legendDockIntersectionArea": 0,
368
+ "dockStageIntersectionArea": 0,
369
+ "dockStageGap": 10.21875,
370
+ "requiredDockStageGap": 10,
371
+ "viewerChromeStageOk": true,
372
+ "viewerChromeReserve": 51,
373
+ "viewerChromeActive": true,
374
+ "viewerChromeOk": true,
375
+ "resolvedTheme": "light"
376
+ },
377
+ {
378
+ "width": 2048,
379
+ "height": 1320,
380
+ "theme": "light",
381
+ "innerWidth": 2048,
382
+ "innerHeight": 1320,
383
+ "scrollWidth": 2048,
384
+ "scrollHeight": 1320,
385
+ "overflowX": false,
386
+ "overflowY": false,
387
+ "ok": true,
388
+ "readerWidth": 1627,
389
+ "diagramWidth": 1577,
390
+ "viewBoxWidth": 1300,
391
+ "minimumProjectedNodeTextPx": 8.4,
392
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
393
+ "minimumProjectedNodeTextDetail": "context",
394
+ "minimumRequiredNodeTextPx": 6,
395
+ "readabilityOk": true,
396
+ "hasLegend": true,
397
+ "hasNavigationDock": true,
398
+ "legendDockIntersectionArea": 0,
399
+ "dockStageIntersectionArea": 0,
400
+ "dockStageGap": 10.21875,
401
+ "requiredDockStageGap": 10,
402
+ "viewerChromeStageOk": true,
403
+ "viewerChromeReserve": 41,
404
+ "viewerChromeActive": true,
405
+ "viewerChromeOk": true,
406
+ "resolvedTheme": "light"
407
+ }
408
+ ]
409
+ },
410
+ "captures": {
411
+ "status": "pass",
412
+ "screenshots": [
413
+ {
414
+ "width": 1440,
415
+ "height": 900,
416
+ "theme": "light",
417
+ "innerWidth": 1440,
418
+ "innerHeight": 900,
419
+ "scrollWidth": 1440,
420
+ "scrollHeight": 900,
421
+ "overflowX": false,
422
+ "overflowY": false,
423
+ "ok": true,
424
+ "readerWidth": 1057,
425
+ "diagramWidth": 1027,
426
+ "viewBoxWidth": 1300,
427
+ "minimumProjectedNodeTextPx": 6.636000000000001,
428
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
429
+ "minimumProjectedNodeTextDetail": "context",
430
+ "minimumRequiredNodeTextPx": 6,
431
+ "readabilityOk": true,
432
+ "hasLegend": true,
433
+ "hasNavigationDock": true,
434
+ "legendDockIntersectionArea": 0,
435
+ "dockStageIntersectionArea": 0,
436
+ "dockStageGap": 10.21875,
437
+ "requiredDockStageGap": 10,
438
+ "viewerChromeStageOk": true,
439
+ "viewerChromeReserve": 51,
440
+ "viewerChromeActive": true,
441
+ "viewerChromeOk": true,
442
+ "resolvedTheme": "light",
443
+ "file": "runtime-architecture.visual-check.1440x900.light.png"
444
+ },
445
+ {
446
+ "width": 1440,
447
+ "height": 900,
448
+ "theme": "dark",
449
+ "innerWidth": 1440,
450
+ "innerHeight": 900,
451
+ "scrollWidth": 1440,
452
+ "scrollHeight": 900,
453
+ "overflowX": false,
454
+ "overflowY": false,
455
+ "ok": true,
456
+ "readerWidth": 1057,
457
+ "diagramWidth": 1027,
458
+ "viewBoxWidth": 1300,
459
+ "minimumProjectedNodeTextPx": 6.636000000000001,
460
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
461
+ "minimumProjectedNodeTextDetail": "context",
462
+ "minimumRequiredNodeTextPx": 6,
463
+ "readabilityOk": true,
464
+ "hasLegend": true,
465
+ "hasNavigationDock": true,
466
+ "legendDockIntersectionArea": 0,
467
+ "dockStageIntersectionArea": 0,
468
+ "dockStageGap": 10.21875,
469
+ "requiredDockStageGap": 10,
470
+ "viewerChromeStageOk": true,
471
+ "viewerChromeReserve": 51,
472
+ "viewerChromeActive": true,
473
+ "viewerChromeOk": true,
474
+ "resolvedTheme": "dark",
475
+ "file": "runtime-architecture.visual-check.1440x900.dark.png"
476
+ },
477
+ {
478
+ "width": 2048,
479
+ "height": 1320,
480
+ "theme": "light",
481
+ "innerWidth": 2048,
482
+ "innerHeight": 1320,
483
+ "scrollWidth": 2048,
484
+ "scrollHeight": 1320,
485
+ "overflowX": false,
486
+ "overflowY": false,
487
+ "ok": true,
488
+ "readerWidth": 1627,
489
+ "diagramWidth": 1577,
490
+ "viewBoxWidth": 1300,
491
+ "minimumProjectedNodeTextPx": 8.4,
492
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
493
+ "minimumProjectedNodeTextDetail": "context",
494
+ "minimumRequiredNodeTextPx": 6,
495
+ "readabilityOk": true,
496
+ "hasLegend": true,
497
+ "hasNavigationDock": true,
498
+ "legendDockIntersectionArea": 0,
499
+ "dockStageIntersectionArea": 0,
500
+ "dockStageGap": 10.21875,
501
+ "requiredDockStageGap": 10,
502
+ "viewerChromeStageOk": true,
503
+ "viewerChromeReserve": 41,
504
+ "viewerChromeActive": true,
505
+ "viewerChromeOk": true,
506
+ "resolvedTheme": "light",
507
+ "file": "runtime-architecture.visual-check.2048x1320.light.png"
508
+ },
509
+ {
510
+ "width": 2048,
511
+ "height": 1320,
512
+ "theme": "dark",
513
+ "innerWidth": 2048,
514
+ "innerHeight": 1320,
515
+ "scrollWidth": 2048,
516
+ "scrollHeight": 1320,
517
+ "overflowX": false,
518
+ "overflowY": false,
519
+ "ok": true,
520
+ "readerWidth": 1627,
521
+ "diagramWidth": 1577,
522
+ "viewBoxWidth": 1300,
523
+ "minimumProjectedNodeTextPx": 8.4,
524
+ "minimumProjectedNodeText": "SessionEvent · control · workspace",
525
+ "minimumProjectedNodeTextDetail": "context",
526
+ "minimumRequiredNodeTextPx": 6,
527
+ "readabilityOk": true,
528
+ "hasLegend": true,
529
+ "hasNavigationDock": true,
530
+ "legendDockIntersectionArea": 0,
531
+ "dockStageIntersectionArea": 0,
532
+ "dockStageGap": 10.21875,
533
+ "requiredDockStageGap": 10,
534
+ "viewerChromeStageOk": true,
535
+ "viewerChromeReserve": 41,
536
+ "viewerChromeActive": true,
537
+ "viewerChromeOk": true,
538
+ "resolvedTheme": "dark",
539
+ "file": "runtime-architecture.visual-check.2048x1320.dark.png"
540
+ }
541
+ ],
542
+ "contactSheet": "runtime-architecture.visual-check.html"
543
+ },
544
+ "sidecars": {
545
+ "receipt": "runtime-architecture.visual-check.json",
546
+ "contactSheet": "runtime-architecture.visual-check.html"
547
+ }
548
+ }
@@ -0,0 +1,93 @@
1
+ # App 会话运行模式接入说明
2
+
3
+ ## 实现范围
4
+
5
+ gateway 已增加同一 Session 内的 Agent 模式查询、切换、锁定与通知。App 界面尚未修改;本次源码没有发布 npm,也没有升级本机 DSH。
6
+
7
+ 用户流程:创建空白会话 → 进入会话页 → 选择已有模式,可重复修改 → 发送第一条消息 → 模式固定,后续完成、停止、重连均不可再次修改。
8
+
9
+ 这里的模式是 Agent preset,例如 `standard`、`minimal`,与模型选择、权限模式及 gateway 的常驻/临时运行模式相互独立。
10
+
11
+ ## 接入顺序
12
+
13
+ 1. 检查 `hello.capabilities` 是否包含 `session-agent-preset`。没有则不提供当前会话切换入口。
14
+ 2. 用现有 `session-create` 创建会话,收到 `session-created` 后以其 `sessionId` 进入会话页。
15
+ 3. 在 Control 通道查询 `agent-presets` 和 `session-agent-preset`;查询未完成期间禁止选择。
16
+ 4. 显示当前模式的名称;只有 `locked: false` 才允许打开选择器。名册使用 `presets`,显示 `name/description`,提交 `id`,有 `broken` 的项禁用并显示原因。
17
+ 5. 选择后发送 `select-agent-preset`,携带唯一 `requestId`。保存期间禁止再次切换和发送消息;以成功响应的 `agentPreset` 更新当前值。失败保留原值并展示错误。
18
+ 6. 成功切换后重新读取该 Session 的 `commands` 和 `skills`,因为模式决定工具、命令及技能集合。
19
+ 7. 点击发送第一条消息立即在 App 暂时禁用模式选择,收到 `sent` 后保持锁定。若提交报错,重新查询状态再决定是否解锁;连接断开或请求超时也必须先重新查询。
20
+ 8. 每次进入会话或重连时重查当前模式状态,不能依赖上次连接的本地可编辑标记。
21
+
22
+ `agent-presets` 的 `modeSelectionEnabled: false` 表示 Host 隐藏模式选择 UI 的设置,App 可遵循同一设置隐藏入口;旧 Host 没有该字段时默认显示。它不改变 `locked` 的含义。全局 `isDefault` 只用于未指定模式时的默认提示,不能覆盖已有会话当前值。
23
+
24
+ ## 请求与响应
25
+
26
+ ```json
27
+ {"type":"session-create","requestId":"create-1","workspaceId":"w1","agentPreset":"standard"}
28
+ {"kind":"session-created","requestId":"create-1","sessionId":"s1","agentPreset":"standard"}
29
+
30
+ {"type":"agent-presets"}
31
+ {"kind":"agent-presets","presets":[{"id":"standard","name":"标准模式","isDefault":true},{"id":"minimal","name":"精简模式","isDefault":false}],"modeSelectionEnabled":true}
32
+
33
+ {"type":"session-agent-preset","sessionId":"s1","requestId":"state-1"}
34
+ {"kind":"session-agent-preset","sessionId":"s1","requestId":"state-1","agentPreset":"standard","locked":false}
35
+
36
+ {"type":"select-agent-preset","sessionId":"s1","agentPreset":"minimal","requestId":"select-1"}
37
+ {"kind":"select-agent-preset","sessionId":"s1","requestId":"select-1","agentPreset":"minimal"}
38
+ ```
39
+
40
+ 创建时的 `agentPreset` 可省略,沿用 Host 默认值。选择成功响应不带 `locked: false`,避免把并发到达的开始对话通知重新解锁。
41
+
42
+ 如果沿用“首条消息自动创建会话”的流程,只能在不带 `sessionId` 的 `message` 上附带 `agentPreset`;已有 Session 的模式修改必须使用独立选择接口。
43
+
44
+ ## 多端更新及缓存
45
+
46
+ Control 通道(或旧版单连接)会收到:
47
+
48
+ ```json
49
+ {"kind":"session-agent-preset-updated","sessionId":"s1","agentPreset":"minimal","seq":12,"time":1000}
50
+ {"kind":"session-agent-preset-updated","sessionId":"s1","locked":true,"seq":13,"time":1100}
51
+ ```
52
+
53
+ - 第一种表示模式已提交,包括从 WebUI 切换产生的事件;仅更新模式,清除命令/技能缓存。
54
+ - 第二种表示已开始对话,仅更新锁定状态。未携带的字段保持原值。
55
+ - 更新按 `gatewayId + sessionId` 定位;这些控制增量不受对话订阅过滤,不要错误应用到当前显示的其他会话。
56
+ - `seq` 是该通知对应的持久事件序号,不是独立的控制通知连续序列。
57
+ - 同一页面只保留最新 `requestId` 的查询/选择响应;离开页面、切换 gateway 或 session 后忽略旧响应。查询发出后若收到锁定通知,不可被该查询的迟到 `locked: false` 覆盖。
58
+ - 通知不重放连接基线。重连查询负责恢复当前值和锁定状态,历史 `projections.values.agentPreset` 也可更新模式。
59
+ - Session header 的 preset 是创建事实;用户在空白阶段切换后,当前值来自投影,不能只读 header。
60
+
61
+ ## 错误处理
62
+
63
+ | code | App 行为 |
64
+ |---|---|
65
+ | `agent-preset/locked` | 锁定模式入口,提示对话开始后不可修改 |
66
+ | `agent-preset/not-found` | 保留原模式,刷新已有模式列表 |
67
+ | `agent-preset/invalid` | 保留原模式,展示 Host 返回的损坏或不可用原因 |
68
+ | `agent-preset/unavailable` | 状态未知,保持禁用;不可假定为空白会话 |
69
+ | `session/not-found` | 刷新会话列表并退出无效会话 |
70
+ | `bad-request` | 请求缺少有效的 sessionId 或 agentPreset,应修正客户端参数 |
71
+ | 其他 Host/网络错误 | 保留原模式,重查状态;不自动重复有副作用的写入 |
72
+
73
+ 新增查询和选择接口的成功及 Host 错误响应均保留有效 `sessionId` 和传入的字符串 `requestId`。本地参数错误至少保留 `requestType/requestId`。
74
+
75
+ ## Host 对接与锁定规则
76
+
77
+ - 切换调用官方 `agentPresets/select`,参数为 `{ agentId: sessionId, agentPreset }`;它重组 Agent、写入 `agent-preset/selected`,不更换 ID、不修改全局默认值。
78
+ - 查询读取 `session/follow` 首帧的当前 preset 和 `sessionListMetadata`,不以“历史 events 数组为空”判断可编辑,因为历史会分页,空白会话也有初始化事件。
79
+ - 历史含对话轮次或用户输入即锁定。gateway 还覆盖 prompt 已受理但尚未写入轮次事件的间隙。
80
+ - 同一 gateway 内,模式选择与消息提交按 Session 串行,Control/Conversation 两个 socket 的竞争不会让第一条消息越过尚未完成的模式切换。
81
+ - Host 自身仍会检查会话轮次边界。WebUI 等绕过 gateway 的并发操作由 Host 自身负责;本次没有修改 Host 的并发实现。
82
+
83
+ ## 验收
84
+
85
+ - 新建 → 查询标准模式 → 改成精简模式 → 改回标准模式,全程 session ID 不变。
86
+ - 发送第一条消息后,UI 立即锁定;绕过 UI 直接调用选择接口也返回 `agent-preset/locked`。
87
+ - 轮次完成、停止、App 重连、gateway 重启后仍锁定。
88
+ - 未知/损坏模式切换失败,原模式与会话保留;之后仍可选择有效模式。
89
+ - 保存模式期间发送消息不会抢先执行;两个设备并发操作能按响应和通知收敛。
90
+ - WebUI 切换模式后,App 当前模式、命令和技能缓存同步更新;WebUI 开始对话后 App 锁定。
91
+ - 切换到另一个 Session 时,旧 Session 的迟到响应不能修改新页面。
92
+
93
+ 自动测试覆盖 Adapter 真实参数、消息/选择排序、历史锁定、输入校验、错误透传和真实本地 WebSocket 的模式查询、切换通知、锁定、双通道分流。未执行新版真实 DSH 与手机联调。