dsh-paoding 0.2.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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/README_en.md +95 -0
  4. package/bin/dsh-paoding.mjs +12 -0
  5. package/cordis.patch.yml +6 -0
  6. package/docs/architecture.md +292 -0
  7. package/docs/architecture_en.md +363 -0
  8. package/docs/configuration.md +551 -0
  9. package/docs/configuration_en.md +560 -0
  10. package/docs/images/1.png +0 -0
  11. package/docs/images/2.png +0 -0
  12. package/docs/images/3.png +0 -0
  13. package/docs/images/4.png +0 -0
  14. package/docs/images/5.png +0 -0
  15. package/docs/images/6.png +0 -0
  16. package/docs/installation.md +364 -0
  17. package/docs/installation_en.md +367 -0
  18. package/docs/orchestration.md +254 -0
  19. package/docs/orchestration_en.md +255 -0
  20. package/install.sh +31 -0
  21. package/package.json +29 -0
  22. package/plugins/paoding-config-ui/api-core.mjs +100 -0
  23. package/plugins/paoding-config-ui/index.mjs +327 -0
  24. package/plugins/paoding-config-ui/lib/base.css +615 -0
  25. package/plugins/paoding-config-ui/lib/client.js +1154 -0
  26. package/plugins/paoding-config-ui/package.json +23 -0
  27. package/plugins/paoding-config-ui/runtime-inventory.mjs +212 -0
  28. package/presets/orchestrator/agent.cordis.yml +323 -0
  29. package/presets/orchestrator/preset.yml +6 -0
  30. package/presets/orchestrator/restrict.mjs +191 -0
  31. package/tools/install.mjs +24 -0
  32. package/tools/lib/alloc.mjs +138 -0
  33. package/tools/lib/cli.mjs +522 -0
  34. package/tools/lib/compose.mjs +647 -0
  35. package/tools/lib/config.mjs +297 -0
  36. package/tools/lib/host.mjs +288 -0
  37. package/tools/lib/skills.mjs +146 -0
  38. package/tools/lib/spans.mjs +188 -0
  39. package/tools/lib/state.mjs +328 -0
  40. package/tools/lib/util.mjs +26 -0
  41. package/tools/lib/wizard.mjs +516 -0
  42. package/tools/lib/yaml.mjs +266 -0
@@ -0,0 +1,615 @@
1
+ /* paoding-config-ui / base — DSH-native settings section chrome.
2
+ All colors are DSH design tokens (--dsw-alias-*), injected at runtime, so
3
+ the panel follows the shell's light/dark theme automatically. */
4
+
5
+ .omd-section {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 16px;
9
+ width: 100%;
10
+ max-width: 760px;
11
+ }
12
+
13
+ .omd-intro {
14
+ margin: 0;
15
+ padding: 0 2px;
16
+ font-size: 13px;
17
+ line-height: 20px;
18
+ color: var(--dsw-alias-label-tertiary);
19
+ }
20
+
21
+ /* Group container: the DSH PluginCard recipe — l2 hairline, r16, layer-3. */
22
+ .omd-group {
23
+ flex: none;
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 12px;
27
+ padding: 20px;
28
+ box-sizing: border-box;
29
+ border: 1px solid var(--dsw-alias-border-l2);
30
+ border-radius: 16px;
31
+ background: var(--dsw-alias-bg-layer-3);
32
+ }
33
+
34
+ .omd-groupHeading {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 7px;
38
+ padding: 0 2px 6px;
39
+ font-size: 13px;
40
+ line-height: 20px;
41
+ font-weight: 600;
42
+ color: var(--dsw-alias-label-primary);
43
+ }
44
+
45
+ .omd-groupIcon {
46
+ display: inline-flex;
47
+ flex: none;
48
+ color: var(--dsw-alias-label-tertiary);
49
+ }
50
+
51
+ /* Inventory count badge (the settings catalogHeading recipe). */
52
+ .omd-count {
53
+ flex: none;
54
+ padding: 1px 8px;
55
+ border-radius: 999px;
56
+ background: var(--dsw-alias-accent-soft, var(--dsw-alias-bg-layer-2));
57
+ font-size: 11px;
58
+ line-height: 16px;
59
+ font-weight: 500;
60
+ color: var(--dsw-alias-label-secondary);
61
+ font-variant-numeric: tabular-nums;
62
+ }
63
+
64
+ /* Status bar: neutral by default, success / warn / error variants. */
65
+ .omd-status {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 8px;
69
+ min-width: 0;
70
+ padding: 8px 12px;
71
+ box-sizing: border-box;
72
+ border: 1px solid var(--dsw-alias-border-l1);
73
+ border-radius: 12px;
74
+ background: var(--dsw-alias-bg-layer-2);
75
+ color: var(--dsw-alias-label-secondary);
76
+ font-size: 12px;
77
+ line-height: 18px;
78
+ }
79
+
80
+ .omd-statusIcon { display: inline-flex; flex: none; }
81
+ .omd-statusText { min-width: 0; overflow-wrap: anywhere; }
82
+
83
+ .omd-statusOk {
84
+ border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);
85
+ background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);
86
+ color: var(--dsw-alias-state-success-primary);
87
+ }
88
+
89
+ .omd-statusWarn {
90
+ border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
91
+ background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);
92
+ color: var(--dsw-alias-state-warn-primary);
93
+ }
94
+
95
+ .omd-statusError {
96
+ border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 40%, transparent);
97
+ background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);
98
+ color: var(--dsw-alias-state-error-primary);
99
+ }
100
+
101
+ .omd-actions {
102
+ display: flex;
103
+ flex-wrap: wrap;
104
+ gap: 8px;
105
+ align-items: center;
106
+ }
107
+
108
+ .omd-chips {
109
+ display: flex;
110
+ flex-wrap: wrap;
111
+ gap: 6px;
112
+ align-items: center;
113
+ }
114
+
115
+ .omd-chipSecondary {
116
+ flex-basis: 100%;
117
+ opacity: 0.62;
118
+ font-size: 11px;
119
+ line-height: 1.5;
120
+ }
121
+
122
+ .omd-chipErrText { color: var(--dsw-alias-state-error-primary); }
123
+
124
+ /* Role cards: stacked small cards (l2 hairline, r12, layer-1 fill). */
125
+ .omd-roleCard {
126
+ flex: none;
127
+ display: flex;
128
+ flex-direction: column;
129
+ border: 1px solid var(--dsw-alias-border-l2);
130
+ border-radius: 12px;
131
+ background: var(--dsw-alias-bg-layer-1);
132
+ overflow: hidden;
133
+ }
134
+
135
+ .omd-roleHeadWrap { display: flex; align-items: stretch; }
136
+
137
+ .omd-roleHead {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 8px;
141
+ flex: 1;
142
+ min-width: 0;
143
+ padding: 10px 12px;
144
+ border: 0;
145
+ background: transparent;
146
+ color: var(--dsw-alias-label-primary);
147
+ font: inherit;
148
+ font-size: 13px;
149
+ line-height: 20px;
150
+ font-weight: 600;
151
+ text-align: left;
152
+ cursor: pointer;
153
+ transition: background 0.12s ease;
154
+ }
155
+
156
+ .omd-roleHead:hover { background: var(--dsw-alias-interactive-bg-hover); }
157
+ .omd-roleHead:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: -2px; }
158
+
159
+ .omd-chevron {
160
+ display: inline-flex;
161
+ flex: none;
162
+ color: var(--dsw-alias-label-tertiary);
163
+ transition: transform 0.15s ease;
164
+ }
165
+
166
+ .omd-chevronOpen { transform: rotate(180deg); }
167
+
168
+ .omd-roleName {
169
+ min-width: 0;
170
+ overflow: hidden;
171
+ text-overflow: ellipsis;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .omd-roleBadge {
176
+ flex: none;
177
+ padding: 1px 8px;
178
+ border-radius: 999px;
179
+ border: 1px solid var(--dsw-alias-border-l1);
180
+ background: var(--dsw-alias-bg-layer-2);
181
+ color: var(--dsw-alias-label-secondary);
182
+ font-size: 11px;
183
+ line-height: 16px;
184
+ font-weight: 500;
185
+ font-variant-numeric: tabular-nums;
186
+ }
187
+
188
+ .omd-roleCount {
189
+ margin-left: auto;
190
+ flex: none;
191
+ padding-right: 4px;
192
+ font-size: 12px;
193
+ line-height: 18px;
194
+ font-weight: 400;
195
+ color: var(--dsw-alias-label-tertiary);
196
+ font-variant-numeric: tabular-nums;
197
+ }
198
+
199
+ .omd-roleDel {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ flex: none;
204
+ width: 36px;
205
+ padding: 0;
206
+ border: 0;
207
+ background: transparent;
208
+ color: var(--dsw-alias-label-tertiary);
209
+ cursor: pointer;
210
+ transition: color 0.12s ease, background 0.12s ease;
211
+ }
212
+
213
+ .omd-roleDel:hover {
214
+ color: var(--dsw-alias-state-error-primary);
215
+ background: var(--dsw-alias-interactive-bg-hover);
216
+ }
217
+
218
+ .omd-roleDel:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: -2px; }
219
+
220
+ .omd-roleBody {
221
+ display: flex;
222
+ flex-direction: column;
223
+ gap: 2px;
224
+ padding: 4px 12px 12px;
225
+ border-top: 1px solid var(--dsw-alias-border-l1);
226
+ }
227
+
228
+ /* Group sub-label inside a role card (secondary, small caps). */
229
+ .omd-glabel {
230
+ margin: 10px 0 4px;
231
+ font-size: 11px;
232
+ line-height: 16px;
233
+ font-weight: 600;
234
+ letter-spacing: 0.05em;
235
+ text-transform: uppercase;
236
+ color: var(--dsw-alias-label-secondary);
237
+ }
238
+
239
+ .omd-toolGrid {
240
+ display: grid;
241
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
242
+ gap: 2px 12px;
243
+ padding: 2px 0;
244
+ }
245
+
246
+ .omd-toolItem {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 8px;
250
+ min-width: 0;
251
+ padding: 4px 6px;
252
+ border-radius: 8px;
253
+ font-size: 12px;
254
+ line-height: 18px;
255
+ color: var(--dsw-alias-label-secondary);
256
+ cursor: pointer;
257
+ transition: background 0.12s ease, color 0.12s ease;
258
+ }
259
+
260
+ .omd-toolItem:hover { background: var(--dsw-alias-interactive-bg-hover); }
261
+
262
+ .omd-check {
263
+ flex: none;
264
+ width: 14px;
265
+ height: 14px;
266
+ margin: 0;
267
+ accent-color: var(--dsw-alias-button-primary-fill);
268
+ cursor: pointer;
269
+ }
270
+
271
+ .omd-check:disabled { cursor: default; opacity: 0.55; }
272
+
273
+ .omd-toolName {
274
+ min-width: 0;
275
+ /* 工具名不做超长隐藏:允许换行展示(overflow-wrap: anywhere 使
276
+ mcp__server__tool 这类无断点长名也能在任意字符处折行,不溢出) */
277
+ white-space: normal;
278
+ overflow-wrap: anywhere;
279
+ font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace);
280
+ font-size: 11px;
281
+ line-height: 16px;
282
+ }
283
+
284
+ /* Source badge: "base" neutral, "host" warn-tinted (matches the old amber). */
285
+ .omd-toolTag {
286
+ flex: none;
287
+ margin-left: auto;
288
+ padding: 0 6px;
289
+ border: 1px solid var(--dsw-alias-border-l1);
290
+ border-radius: 4px;
291
+ background: var(--dsw-alias-bg-layer-2);
292
+ color: var(--dsw-alias-label-tertiary);
293
+ font-size: 10px;
294
+ line-height: 16px;
295
+ font-weight: 500;
296
+ }
297
+
298
+ .omd-toolTagHost {
299
+ border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 35%, transparent);
300
+ background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);
301
+ color: var(--dsw-alias-state-warn-primary);
302
+ }
303
+
304
+ .omd-empty {
305
+ padding: 6px;
306
+ font-size: 12px;
307
+ line-height: 18px;
308
+ color: var(--dsw-alias-label-tertiary);
309
+ }
310
+
311
+ /* "New custom role" entry: dashed card button (the repo's dashed affordance). */
312
+ .omd-addRole {
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: center;
316
+ gap: 6px;
317
+ width: 100%;
318
+ padding: 8px 12px;
319
+ box-sizing: border-box;
320
+ border: 1px dashed var(--dsw-alias-border-l2);
321
+ border-radius: 12px;
322
+ background: transparent;
323
+ color: var(--dsw-alias-label-secondary);
324
+ font: inherit;
325
+ font-size: 12px;
326
+ line-height: 18px;
327
+ cursor: pointer;
328
+ transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
329
+ }
330
+
331
+ .omd-addRole:hover {
332
+ background: var(--dsw-alias-interactive-bg-hover);
333
+ border-color: var(--dsw-alias-interactive-bg-hover-accent);
334
+ color: var(--dsw-alias-label-primary);
335
+ }
336
+
337
+ .omd-addRole:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: 1px; }
338
+
339
+ /* Collapsible persona editor (hairline-dashed separated from the tools). */
340
+ .omd-persona {
341
+ margin-top: 10px;
342
+ padding-top: 10px;
343
+ border-top: 1px dashed var(--dsw-alias-border-l2);
344
+ }
345
+
346
+ .omd-personaToggle {
347
+ display: inline-flex;
348
+ align-items: center;
349
+ gap: 6px;
350
+ padding: 0;
351
+ border: 0;
352
+ background: none;
353
+ color: var(--dsw-alias-label-secondary);
354
+ font: inherit;
355
+ font-size: 12px;
356
+ line-height: 18px;
357
+ cursor: pointer;
358
+ transition: color 0.12s ease;
359
+ }
360
+
361
+ .omd-personaToggle:hover { color: var(--dsw-alias-label-primary); }
362
+ .omd-personaToggle:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: 2px; }
363
+
364
+ .omd-personaEdit {
365
+ display: inline-flex;
366
+ flex: none;
367
+ margin-left: auto;
368
+ color: var(--dsw-alias-label-tertiary);
369
+ }
370
+
371
+ .omd-personaBody {
372
+ display: flex;
373
+ flex-direction: column;
374
+ margin-top: 8px;
375
+ }
376
+
377
+ .omd-textarea {
378
+ width: 100%;
379
+ box-sizing: border-box;
380
+ min-height: 64px;
381
+ padding: 8px 10px;
382
+ border: 1px solid var(--dsw-alias-border-l2);
383
+ border-radius: 8px;
384
+ background: var(--dsw-alias-bg-layer-2);
385
+ color: var(--dsw-alias-label-primary);
386
+ font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace);
387
+ font-size: 12px;
388
+ line-height: 1.6;
389
+ resize: vertical;
390
+ transition: border-color 0.16s ease;
391
+ }
392
+
393
+ .omd-textarea:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: 1px; }
394
+ .omd-textarea::placeholder { color: var(--dsw-alias-label-tertiary); }
395
+
396
+ .omd-hint {
397
+ margin-top: 6px;
398
+ font-size: 11px;
399
+ line-height: 16px;
400
+ color: var(--dsw-alias-label-tertiary);
401
+ }
402
+
403
+ /* Skill assignment rows: mono name + per-role checkboxes, hairline rows. */
404
+ .omd-skillRow {
405
+ display: flex;
406
+ align-items: flex-start;
407
+ gap: 12px;
408
+ padding: 8px 2px;
409
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
410
+ }
411
+
412
+ .omd-skillRow:last-child { border-bottom: none; }
413
+
414
+ .omd-skillName {
415
+ flex: none;
416
+ width: 150px;
417
+ min-width: 0;
418
+ overflow: hidden;
419
+ text-overflow: ellipsis;
420
+ white-space: nowrap;
421
+ font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace);
422
+ font-size: 12px;
423
+ line-height: 20px;
424
+ color: var(--dsw-alias-label-primary);
425
+ }
426
+
427
+ .omd-skillRoles {
428
+ display: flex;
429
+ flex-wrap: wrap;
430
+ gap: 6px 14px;
431
+ min-width: 0;
432
+ }
433
+
434
+ .omd-skillRole {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ gap: 5px;
438
+ font-size: 12px;
439
+ line-height: 20px;
440
+ color: var(--dsw-alias-label-secondary);
441
+ cursor: pointer;
442
+ }
443
+
444
+ /* Preview: success summary + scrollable mono yml block. */
445
+ .omd-previewSummary {
446
+ font-size: 12px;
447
+ line-height: 18px;
448
+ color: var(--dsw-alias-state-success-primary);
449
+ overflow-wrap: anywhere;
450
+ }
451
+
452
+ .omd-pre {
453
+ box-sizing: border-box;
454
+ margin: 0;
455
+ padding: 12px;
456
+ border: 1px solid var(--dsw-alias-border-l1);
457
+ border-radius: 12px;
458
+ background: var(--dsw-alias-bg-layer-2);
459
+ color: var(--dsw-alias-label-secondary);
460
+ font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace);
461
+ font-size: 11px;
462
+ line-height: 1.6;
463
+ max-height: 360px;
464
+ overflow: auto;
465
+ white-space: pre;
466
+ }
467
+
468
+ .omd-loading {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 8px;
472
+ padding: 4px 2px;
473
+ font-size: 12px;
474
+ line-height: 18px;
475
+ color: var(--dsw-alias-label-tertiary);
476
+ }
477
+
478
+ .omd-spin { animation: omd-spin 0.9s linear infinite; }
479
+
480
+ @keyframes omd-spin {
481
+ to { transform: rotate(360deg); }
482
+ }
483
+
484
+ /* 主 agent「人设追加」编辑器:更高 textarea + 恢复默认按钮行。 */
485
+ .omd-extraArea { min-height: 96px; }
486
+
487
+ .omd-extraActions {
488
+ display: flex;
489
+ align-items: flex-start;
490
+ gap: 10px;
491
+ margin-top: 6px;
492
+ }
493
+
494
+ .omd-extraRestore {
495
+ flex: none;
496
+ padding: 0;
497
+ border: 0;
498
+ background: none;
499
+ color: var(--dsw-alias-state-business-primary);
500
+ font: inherit;
501
+ font-size: 11px;
502
+ line-height: 16px;
503
+ cursor: pointer;
504
+ transition: color 0.12s ease;
505
+ }
506
+
507
+ .omd-extraRestore:hover { text-decoration: underline; }
508
+ .omd-extraRestore:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: 2px; }
509
+
510
+ .omd-extraHint {
511
+ margin: 0;
512
+ font-size: 11px;
513
+ line-height: 16px;
514
+ color: var(--dsw-alias-label-tertiary);
515
+ }
516
+
517
+ /* 主 agent「名称」行:单行文本输入 + 并排「恢复默认」(按钮复用 omd-extraRestore)。 */
518
+ .omd-mainName {
519
+ display: flex;
520
+ flex-direction: column;
521
+ margin-top: 10px;
522
+ }
523
+
524
+ .omd-mainName .omd-glabel { margin-top: 0; }
525
+
526
+ .omd-nameRow {
527
+ display: flex;
528
+ align-items: center;
529
+ gap: 10px;
530
+ margin-top: 4px;
531
+ }
532
+
533
+ .omd-nameInput {
534
+ flex: 1;
535
+ min-width: 0;
536
+ box-sizing: border-box;
537
+ padding: 5px 10px;
538
+ border: 1px solid var(--dsw-alias-border-l2);
539
+ border-radius: 8px;
540
+ background: var(--dsw-alias-bg-layer-2);
541
+ color: var(--dsw-alias-label-primary);
542
+ font: inherit;
543
+ font-size: 12px;
544
+ line-height: 20px;
545
+ transition: border-color 0.16s ease;
546
+ }
547
+
548
+ .omd-nameInput:focus-visible {
549
+ outline: 2px solid var(--dsw-alias-state-business-primary);
550
+ outline-offset: 1px;
551
+ }
552
+
553
+ .omd-nameInput::placeholder { color: var(--dsw-alias-label-tertiary); }
554
+
555
+ /* 已删除的内置角色:恢复区(dashed 容器,与「新建自定义角色」虚线按钮呼应)。 */
556
+ .omd-restoreRow {
557
+ display: flex;
558
+ flex-direction: column;
559
+ gap: 8px;
560
+ padding: 12px;
561
+ box-sizing: border-box;
562
+ border: 1px dashed var(--dsw-alias-border-l2);
563
+ border-radius: 12px;
564
+ }
565
+
566
+ .omd-restoreTitle {
567
+ font-size: 12px;
568
+ line-height: 18px;
569
+ font-weight: 600;
570
+ color: var(--dsw-alias-label-secondary);
571
+ }
572
+
573
+ .omd-restorePill {
574
+ display: inline-flex;
575
+ align-items: center;
576
+ gap: 6px;
577
+ padding: 3px 10px;
578
+ border: 1px solid var(--dsw-alias-border-l1);
579
+ border-radius: 999px;
580
+ background: var(--dsw-alias-bg-layer-2);
581
+ color: var(--dsw-alias-label-secondary);
582
+ font: inherit;
583
+ font-size: 12px;
584
+ line-height: 18px;
585
+ cursor: pointer;
586
+ transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
587
+ }
588
+
589
+ .omd-restorePill:hover {
590
+ background: var(--dsw-alias-interactive-bg-hover);
591
+ border-color: var(--dsw-alias-interactive-bg-hover-accent);
592
+ color: var(--dsw-alias-label-primary);
593
+ }
594
+
595
+ .omd-restorePill:focus-visible {
596
+ outline: 2px solid var(--dsw-alias-border-l4);
597
+ outline-offset: 1px;
598
+ }
599
+
600
+ @media (prefers-reduced-motion: reduce) {
601
+ .omd-roleHead,
602
+ .omd-roleDel,
603
+ .omd-addRole,
604
+ .omd-personaToggle,
605
+ .omd-toolItem,
606
+ .omd-chevron,
607
+ .omd-textarea,
608
+ .omd-extraRestore,
609
+ .omd-nameInput,
610
+ .omd-restorePill,
611
+ .omd-spin {
612
+ transition: none;
613
+ animation: none;
614
+ }
615
+ }