@zihanw/pi-forge 0.5.4 → 0.5.5

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 (228) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +67 -103
  3. package/README.zh-CN.md +67 -95
  4. package/assets/pi-forge-header-concept-1.png +0 -0
  5. package/assets/readme/PROVENANCE.md +95 -0
  6. package/assets/readme/en/capability-tools.gif +0 -0
  7. package/assets/readme/en/context-composition.gif +0 -0
  8. package/assets/readme/en/context-toggle.gif +0 -0
  9. package/assets/readme/en/draft-diff.png +0 -0
  10. package/assets/readme/en/edit-draft-diff.gif +0 -0
  11. package/assets/readme/en/editor-overview-v3.png +0 -0
  12. package/assets/readme/en/editor-overview.png +0 -0
  13. package/assets/readme/en/mode-tools.gif +0 -0
  14. package/assets/readme/en/regex-transforms.gif +0 -0
  15. package/assets/readme/en/tool-selection.gif +0 -0
  16. package/assets/readme/tui-quickstart.gif +0 -0
  17. package/assets/readme/zh-CN/capability-tools.gif +0 -0
  18. package/assets/readme/zh-CN/context-composition.gif +0 -0
  19. package/assets/readme/zh-CN/context-toggle.gif +0 -0
  20. package/assets/readme/zh-CN/draft-diff.png +0 -0
  21. package/assets/readme/zh-CN/edit-draft-diff.gif +0 -0
  22. package/assets/readme/zh-CN/editor-overview-v3.png +0 -0
  23. package/assets/readme/zh-CN/editor-overview.png +0 -0
  24. package/assets/readme/zh-CN/mode-tools.gif +0 -0
  25. package/assets/readme/zh-CN/regex-transforms.gif +0 -0
  26. package/assets/readme/zh-CN/tool-selection.gif +0 -0
  27. package/dist/active-state.d.ts +148 -0
  28. package/dist/active-state.d.ts.map +1 -0
  29. package/dist/active-state.js +374 -0
  30. package/dist/active-state.js.map +1 -0
  31. package/dist/agent-profile.d.ts.map +1 -1
  32. package/dist/agent-profile.js +11 -0
  33. package/dist/agent-profile.js.map +1 -1
  34. package/dist/capabilities.d.ts +39 -0
  35. package/dist/capabilities.d.ts.map +1 -0
  36. package/dist/capabilities.js +160 -0
  37. package/dist/capabilities.js.map +1 -0
  38. package/dist/capability-anchors.d.ts +45 -0
  39. package/dist/capability-anchors.d.ts.map +1 -0
  40. package/dist/capability-anchors.js +263 -0
  41. package/dist/capability-anchors.js.map +1 -0
  42. package/dist/capability-command.d.ts +4 -0
  43. package/dist/capability-command.d.ts.map +1 -0
  44. package/dist/capability-command.js +164 -0
  45. package/dist/capability-command.js.map +1 -0
  46. package/dist/capability-events.d.ts +79 -0
  47. package/dist/capability-events.d.ts.map +1 -0
  48. package/dist/capability-events.js +478 -0
  49. package/dist/capability-events.js.map +1 -0
  50. package/dist/capability-projection.d.ts +22 -0
  51. package/dist/capability-projection.d.ts.map +1 -0
  52. package/dist/capability-projection.js +273 -0
  53. package/dist/capability-projection.js.map +1 -0
  54. package/dist/capability-protocol.d.ts +21 -0
  55. package/dist/capability-protocol.d.ts.map +1 -0
  56. package/dist/capability-protocol.js +15 -0
  57. package/dist/capability-protocol.js.map +1 -0
  58. package/dist/capability-state.d.ts +74 -0
  59. package/dist/capability-state.d.ts.map +1 -0
  60. package/dist/capability-state.js +43 -0
  61. package/dist/capability-state.js.map +1 -0
  62. package/dist/capability-tool.d.ts +11 -0
  63. package/dist/capability-tool.d.ts.map +1 -0
  64. package/dist/capability-tool.js +25 -0
  65. package/dist/capability-tool.js.map +1 -0
  66. package/dist/capability-web-host.d.ts +11 -0
  67. package/dist/capability-web-host.d.ts.map +1 -0
  68. package/dist/capability-web-host.js +105 -0
  69. package/dist/capability-web-host.js.map +1 -0
  70. package/dist/codecs/capability.d.ts +71 -0
  71. package/dist/codecs/capability.d.ts.map +1 -0
  72. package/dist/codecs/capability.js +363 -0
  73. package/dist/codecs/capability.js.map +1 -0
  74. package/dist/codecs/prompt-stack.d.ts +1 -1
  75. package/dist/codecs/prompt-stack.d.ts.map +1 -1
  76. package/dist/codecs/prompt-stack.js +140 -13
  77. package/dist/codecs/prompt-stack.js.map +1 -1
  78. package/dist/command-contribution/index.d.ts +21 -0
  79. package/dist/command-contribution/index.d.ts.map +1 -0
  80. package/dist/command-contribution/index.js +14 -0
  81. package/dist/command-contribution/index.js.map +1 -0
  82. package/dist/compile-cycle.d.ts +1 -0
  83. package/dist/compile-cycle.d.ts.map +1 -1
  84. package/dist/compile-cycle.js.map +1 -1
  85. package/dist/compiler.d.ts.map +1 -1
  86. package/dist/compiler.js +70 -17
  87. package/dist/compiler.js.map +1 -1
  88. package/dist/forge-command.d.ts +10 -0
  89. package/dist/forge-command.d.ts.map +1 -0
  90. package/dist/forge-command.js +106 -0
  91. package/dist/forge-command.js.map +1 -0
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +54 -5
  95. package/dist/index.js.map +1 -1
  96. package/dist/json-fingerprint.d.ts +11 -0
  97. package/dist/json-fingerprint.d.ts.map +1 -0
  98. package/dist/json-fingerprint.js +66 -0
  99. package/dist/json-fingerprint.js.map +1 -0
  100. package/dist/lifecycle.d.ts +14 -0
  101. package/dist/lifecycle.d.ts.map +1 -1
  102. package/dist/lifecycle.js +167 -67
  103. package/dist/lifecycle.js.map +1 -1
  104. package/dist/payload-command.d.ts +2 -2
  105. package/dist/payload-command.d.ts.map +1 -1
  106. package/dist/payload-command.js +80 -26
  107. package/dist/payload-command.js.map +1 -1
  108. package/dist/payload-state.d.ts +1 -0
  109. package/dist/payload-state.d.ts.map +1 -1
  110. package/dist/payload-state.js +1 -0
  111. package/dist/payload-state.js.map +1 -1
  112. package/dist/policy.d.ts +2 -1
  113. package/dist/policy.d.ts.map +1 -1
  114. package/dist/policy.js +3 -0
  115. package/dist/policy.js.map +1 -1
  116. package/dist/preset-command.d.ts.map +1 -1
  117. package/dist/preset-command.js +92 -35
  118. package/dist/preset-command.js.map +1 -1
  119. package/dist/preview-text.d.ts +5 -0
  120. package/dist/preview-text.d.ts.map +1 -0
  121. package/dist/preview-text.js +27 -0
  122. package/dist/preview-text.js.map +1 -0
  123. package/dist/preview.d.ts +18 -1
  124. package/dist/preview.d.ts.map +1 -1
  125. package/dist/preview.js +132 -97
  126. package/dist/preview.js.map +1 -1
  127. package/dist/profile-command.js +68 -9
  128. package/dist/profile-command.js.map +1 -1
  129. package/dist/regex.d.ts.map +1 -1
  130. package/dist/regex.js +5 -0
  131. package/dist/regex.js.map +1 -1
  132. package/dist/render-helpers.d.ts.map +1 -1
  133. package/dist/render-helpers.js +2 -0
  134. package/dist/render-helpers.js.map +1 -1
  135. package/dist/repositories/capability.d.ts +53 -0
  136. package/dist/repositories/capability.d.ts.map +1 -0
  137. package/dist/repositories/capability.js +294 -0
  138. package/dist/repositories/capability.js.map +1 -0
  139. package/dist/runtime/capability-runtime.d.ts +91 -0
  140. package/dist/runtime/capability-runtime.d.ts.map +1 -0
  141. package/dist/runtime/capability-runtime.js +967 -0
  142. package/dist/runtime/capability-runtime.js.map +1 -0
  143. package/dist/runtime/tool-policy-runtime.d.ts +8 -0
  144. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  145. package/dist/runtime/tool-policy-runtime.js +171 -30
  146. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  147. package/dist/session-adapter.d.ts +13 -0
  148. package/dist/session-adapter.d.ts.map +1 -1
  149. package/dist/session-adapter.js +110 -0
  150. package/dist/session-adapter.js.map +1 -1
  151. package/dist/session-usage.d.ts +65 -0
  152. package/dist/session-usage.d.ts.map +1 -0
  153. package/dist/session-usage.js +134 -0
  154. package/dist/session-usage.js.map +1 -0
  155. package/dist/subagent/fingerprints.d.ts +3 -15
  156. package/dist/subagent/fingerprints.d.ts.map +1 -1
  157. package/dist/subagent/fingerprints.js +5 -69
  158. package/dist/subagent/fingerprints.js.map +1 -1
  159. package/dist/subagent/index.d.ts +2 -0
  160. package/dist/subagent/index.d.ts.map +1 -1
  161. package/dist/subagent/index.js +2 -0
  162. package/dist/subagent/index.js.map +1 -1
  163. package/dist/subagent-host.d.ts +2 -2
  164. package/dist/subagent-host.d.ts.map +1 -1
  165. package/dist/subagent-host.js +13 -1
  166. package/dist/subagent-host.js.map +1 -1
  167. package/dist/types.d.ts +6 -1
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/types.js.map +1 -1
  170. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  171. package/dist/web-editor/client-script.generated.js +1 -1
  172. package/dist/web-editor/client-script.generated.js.map +1 -1
  173. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  174. package/dist/web-editor/client-styles.generated.js +1 -1
  175. package/dist/web-editor/client-styles.generated.js.map +1 -1
  176. package/dist/web-editor/server.d.ts.map +1 -1
  177. package/dist/web-editor/server.js +152 -4
  178. package/dist/web-editor/server.js.map +1 -1
  179. package/dist/web-editor/styles.d.ts.map +1 -1
  180. package/dist/web-editor/styles.js +476 -149
  181. package/dist/web-editor/styles.js.map +1 -1
  182. package/dist/web-editor/types.d.ts +81 -1
  183. package/dist/web-editor/types.d.ts.map +1 -1
  184. package/dist/web-host.d.ts +7 -0
  185. package/dist/web-host.d.ts.map +1 -1
  186. package/dist/web-host.js +168 -5
  187. package/dist/web-host.js.map +1 -1
  188. package/dist/workspace.d.ts +11 -0
  189. package/dist/workspace.d.ts.map +1 -1
  190. package/dist/workspace.js +63 -5
  191. package/dist/workspace.js.map +1 -1
  192. package/docs/README.md +4 -0
  193. package/docs/design/README.md +3 -1
  194. package/docs/design/architecture-0.5.md +22 -0
  195. package/docs/design/archive/2026-09-12-system-update-design.md +229 -0
  196. package/docs/design/pi-forge-system-update-design-notes.md +157 -229
  197. package/docs/development/release.md +20 -20
  198. package/docs/development/roadmap.md +17 -2
  199. package/docs/development/scoped-global-profiles-stacks.md +1 -1
  200. package/docs/development/setup.md +1 -1
  201. package/docs/getting-started.md +1 -1
  202. package/docs/guides/delegation.md +22 -20
  203. package/docs/guides/migrating-to-0.5.md +29 -0
  204. package/docs/guides/use-cases.md +6 -2
  205. package/docs/guides/web-editor.md +73 -5
  206. package/docs/reference/active-state.md +77 -0
  207. package/docs/reference/capabilities.md +259 -0
  208. package/docs/reference/commands.md +52 -24
  209. package/docs/reference/configuration.md +4 -2
  210. package/docs/reference/features.md +70 -4
  211. package/docs/reference/provider-support.md +67 -0
  212. package/docs/reference/public-api.md +49 -3
  213. package/docs/reference/session-cache.md +112 -0
  214. package/docs/reference/stack-schema.md +18 -4
  215. package/docs/reference/subagent-host-port.md +8 -0
  216. package/docs/zh-CN/README.md +3 -0
  217. package/docs/zh-CN/getting-started.md +1 -1
  218. package/docs/zh-CN/guides/delegation.md +22 -10
  219. package/docs/zh-CN/guides/migrating-to-0.5.md +29 -0
  220. package/docs/zh-CN/guides/web-editor.md +74 -7
  221. package/docs/zh-CN/reference/capabilities.md +259 -0
  222. package/docs/zh-CN/reference/commands.md +61 -33
  223. package/docs/zh-CN/reference/provider-support.md +67 -0
  224. package/docs/zh-CN/reference/session-cache.md +112 -0
  225. package/examples/capabilities/review.json +12 -0
  226. package/examples/capabilities/write-tools.json +15 -0
  227. package/examples/read-first-worker-prompt-stack.json +49 -0
  228. package/package.json +16 -9
@@ -1,19 +1,19 @@
1
1
  export const EDITOR_STYLES = String.raw `
2
2
  :root {
3
3
  color-scheme: light;
4
- --bg: #f7f8fb;
4
+ --bg: #f5f8f7;
5
5
  --pane: #ffffff;
6
- --line: #d8dee8;
7
- --line-strong: #aeb8c7;
8
- --text: #18202c;
9
- --muted: #647083;
10
- --accent: #146b5f;
11
- --accent-bg: #e5f3ef;
12
- --warning: #9b6200;
13
- --warning-bg: #fff4d8;
6
+ --line: #d7e3de;
7
+ --line-strong: #a9bdb5;
8
+ --text: #20312f;
9
+ --muted: #657774;
10
+ --accent: #176c5b;
11
+ --accent-bg: #e9f4f0;
12
+ --warning: #8b5d10;
13
+ --warning-bg: #fff4dc;
14
14
  --error: #b42318;
15
15
  --error-bg: #fde8e7;
16
- --success: #1f7a3a;
16
+ --success: #20764b;
17
17
  --role-system: #7564a8;
18
18
  --role-user: #2f7d68;
19
19
  --role-assistant: #3e76ad;
@@ -39,14 +39,14 @@ export const EDITOR_STYLES = String.raw `
39
39
  }
40
40
  body[data-theme="dark"] {
41
41
  color-scheme: dark;
42
- --bg: #111315;
43
- --pane: #181a1d;
44
- --line: #32363b;
45
- --line-strong: #525a63;
46
- --text: #edf0f2;
47
- --muted: #a0a8b2;
48
- --accent: #2aa889;
49
- --accent-bg: #15362f;
42
+ --bg: #111716;
43
+ --pane: #19211f;
44
+ --line: #33413d;
45
+ --line-strong: #536761;
46
+ --text: #e7efeb;
47
+ --muted: #a4b3ad;
48
+ --accent: #3dbb99;
49
+ --accent-bg: #173b33;
50
50
  --warning: #e4b75f;
51
51
  --warning-bg: #3a2d13;
52
52
  --error: #f06f64;
@@ -67,10 +67,10 @@ body[data-theme="dark"] {
67
67
  --slot-date-cwd: #b697dc;
68
68
  --slot-built-in: #a9bacb;
69
69
  --slot-custom: #d0a5c3;
70
- --control: #202327;
71
- --control-muted: #25292e;
72
- --pane-soft: #151719;
73
- --row: #1c1f23;
70
+ --control: #202a27;
71
+ --control-muted: #25312e;
72
+ --pane-soft: #151d1b;
73
+ --row: #1c2623;
74
74
  --code-bg: #0b0d10;
75
75
  --code-text: #e8edf2;
76
76
  --shadow: rgba(0, 0, 0, .42);
@@ -105,20 +105,25 @@ button[data-icon]::before {
105
105
  color: currentColor;
106
106
  }
107
107
  button.icon[data-icon]::before {
108
- margin-right: 0;
108
+ margin:0; font-size:14px; line-height:30px;
109
109
  }
110
110
  button.primary {
111
111
  border-color: var(--accent);
112
112
  background: var(--accent);
113
113
  color: white;
114
114
  }
115
+ button.quiet-danger {
116
+ background:transparent; border-color:transparent; color:var(--muted);
117
+ }
118
+ button.quiet-danger:hover, button.quiet-danger:focus-visible {
119
+ border-color:var(--error); color:var(--error);
120
+ }
115
121
  button.danger {
116
122
  border-color: var(--error);
117
123
  color: var(--error);
118
124
  }
119
125
  button.icon {
120
- width: 34px;
121
- padding: 5px 0;
126
+ width:32px; height:32px; min-height:32px; flex:0 0 32px; padding:0; font-size:0; overflow:hidden;
122
127
  }
123
128
  button:disabled {
124
129
  cursor: default;
@@ -153,14 +158,7 @@ html, body {
153
158
  }
154
159
  }
155
160
  .topbar {
156
- display: flex;
157
- align-items: center;
158
- flex-wrap: wrap;
159
- gap: 8px;
160
- min-height: 40px;
161
- padding: 4px 10px;
162
- border-bottom: 1px solid var(--line);
163
- background: var(--pane);
161
+ display:flex; align-items:center; gap:8px; flex:none; min-height:32px; padding:3px 10px; border-top:1px solid var(--line); background:var(--pane); font-size:12px;
164
162
  }
165
163
  .brand {
166
164
  font-weight: 700;
@@ -190,7 +188,7 @@ html, body {
190
188
  }
191
189
  .shell {
192
190
  display: grid;
193
- grid-template-columns: minmax(210px, 260px) minmax(0, 1fr);
191
+ grid-template-columns: 212px minmax(0, 1fr);
194
192
  height: calc(100vh - 48px);
195
193
  min-height: 0;
196
194
  transition: grid-template-columns .16s ease;
@@ -285,16 +283,7 @@ html, body {
285
283
  flex-direction: column;
286
284
  }
287
285
  .main-actions {
288
- display: flex;
289
- align-items: center;
290
- gap: 6px;
291
- flex-wrap: nowrap;
292
- min-height: 42px;
293
- padding: 5px 10px;
294
- border-bottom: 1px solid var(--line);
295
- background: var(--pane);
296
- position: relative;
297
- z-index: 3;
286
+ display:flex; flex-wrap:wrap; align-items:center; gap:5px; position:relative; z-index:3; flex:0 1 auto; padding:0; border:0; background:transparent;
298
287
  }
299
288
  .new-stack-control {
300
289
  display: flex;
@@ -438,7 +427,7 @@ html, body {
438
427
  }
439
428
  .workspace {
440
429
  display: grid;
441
- grid-template-columns: minmax(220px, 300px) minmax(0, 1fr);
430
+ grid-template-columns: 190px minmax(0, 1fr);
442
431
  flex: 1;
443
432
  min-height: 0;
444
433
  }
@@ -470,33 +459,12 @@ html, body {
470
459
  display: grid;
471
460
  grid-template-columns: minmax(0, 1fr);
472
461
  }
473
- .editor-dock-area.dock-open {
474
- grid-template-columns: minmax(0, 1fr) minmax(440px, 48%);
475
- }
476
462
  .editor-dock-area .workspace,
477
463
  .editor-dock-area .tab-panel,
478
464
  .editor-dock-area .context-diff-panel {
479
465
  min-width: 0;
480
466
  min-height: 0;
481
467
  }
482
- .editor-dock-area.dock-open .workspace {
483
- display: grid;
484
- grid-template-columns: minmax(200px, 260px) minmax(0, 1fr);
485
- border-right: 1px solid var(--line);
486
- }
487
- .editor-dock-area.dock-open .context-diff-panel {
488
- display: block;
489
- border-left: 1px solid var(--line);
490
- }
491
- .editor-dock-area.dock-open.dock-focus {
492
- grid-template-columns: minmax(0, 1fr);
493
- }
494
- .editor-dock-area.dock-open.dock-focus .workspace {
495
- display: none;
496
- }
497
- .editor-dock-area.dock-open.dock-focus .context-diff-panel {
498
- border-left: 0;
499
- }
500
468
  .tab-section {
501
469
  border: 1px solid var(--line);
502
470
  border-radius: 6px;
@@ -530,22 +498,6 @@ html, body {
530
498
  border-bottom: 1px solid var(--line);
531
499
  font-weight: 650;
532
500
  }
533
- .item-tools {
534
- display: flex;
535
- flex-wrap: wrap;
536
- gap: 6px;
537
- padding: 8px 12px;
538
- border-bottom: 1px solid var(--line);
539
- flex: 0 0 auto;
540
- }
541
- .item-tools button,
542
- .main-actions button {
543
- white-space: nowrap;
544
- }
545
- .item-tools-spacer {
546
- flex: 1 1 auto;
547
- min-width: 8px;
548
- }
549
501
  .item-list {
550
502
  padding: 8px;
551
503
  overflow: auto;
@@ -556,20 +508,7 @@ html, body {
556
508
  background: var(--accent-bg);
557
509
  }
558
510
  .item-row {
559
- width: 100%;
560
- text-align: left;
561
- border: 1px solid var(--line);
562
- border-left-width: 3px;
563
- background: var(--row);
564
- border-radius: 6px;
565
- padding: 8px;
566
- margin-bottom: 6px;
567
- display: grid;
568
- grid-template-columns: 18px minmax(0, 1fr) 48px;
569
- gap: 8px;
570
- align-items: center;
571
- cursor: grab;
572
- position: relative;
511
+ width:100%; text-align:left; border:1px solid transparent; border-left:2px solid var(--line); border-bottom-color:var(--line); background:transparent; border-radius:5px; padding:8px 7px 8px 20px; margin-bottom:3px; display:grid; grid-template-columns:minmax(0,1fr) 30px; gap:3px 6px; align-items:center; cursor:grab; position:relative;
573
512
  }
574
513
  .item-row:active {
575
514
  cursor: grabbing;
@@ -593,7 +532,7 @@ html, body {
593
532
  border-left-color: var(--item-slot);
594
533
  }
595
534
  .item-row.disabled {
596
- opacity: .62;
535
+ opacity: .76;
597
536
  }
598
537
  .item-row.dragging {
599
538
  border-style: dashed;
@@ -662,40 +601,8 @@ html, body {
662
601
  background: var(--warning-bg);
663
602
  border-color: var(--warning);
664
603
  }
665
- .item-kind-badge,
666
- .item-slot-badge {
667
- display: inline-block;
668
- border: 1px solid currentColor;
669
- border-radius: 999px;
670
- padding: 0 6px;
671
- line-height: 17px;
672
- font-size: 11px;
673
- font-weight: 650;
674
- }
675
- .item-kind-badge {
676
- margin-right: 4px;
677
- }
678
- .item-kind-badge.block {
679
- color: var(--item-block);
680
- background: color-mix(in srgb, var(--item-block) 12%, var(--row));
681
- }
682
- .item-kind-badge.slot {
683
- color: var(--item-slot);
684
- background: color-mix(in srgb, var(--item-slot) 12%, var(--row));
685
- }
686
- .item-slot-badge {
687
- margin-left: 2px;
688
- }
689
- .item-slot-badge.slot-chat-history { color: var(--slot-chat-history); background: color-mix(in srgb, var(--slot-chat-history) 12%, var(--row)); }
690
- .item-slot-badge.slot-tools { color: var(--slot-tools); background: color-mix(in srgb, var(--slot-tools) 12%, var(--row)); }
691
- .item-slot-badge.slot-tool-guidelines { color: var(--slot-tool-guidelines); background: color-mix(in srgb, var(--slot-tool-guidelines) 12%, var(--row)); }
692
- .item-slot-badge.slot-skills { color: var(--slot-skills); background: color-mix(in srgb, var(--slot-skills) 12%, var(--row)); }
693
- .item-slot-badge.slot-project-context { color: var(--slot-project-context); background: color-mix(in srgb, var(--slot-project-context) 12%, var(--row)); }
694
- .item-slot-badge.slot-date { color: var(--slot-date); background: color-mix(in srgb, var(--slot-date) 12%, var(--row)); }
695
- .item-slot-badge.slot-date-cwd { color: var(--slot-date-cwd); background: color-mix(in srgb, var(--slot-date-cwd) 12%, var(--row)); }
696
- .item-slot-badge.slot-built-in { color: var(--slot-built-in); background: color-mix(in srgb, var(--slot-built-in) 12%, var(--row)); }
697
- .item-slot-badge.slot-custom { color: var(--slot-custom); background: color-mix(in srgb, var(--slot-custom) 12%, var(--row)); }
698
604
  .item-title {
605
+ font-size: 13px;
699
606
  font-weight: 650;
700
607
  overflow-wrap: anywhere;
701
608
  }
@@ -732,6 +639,7 @@ html, body {
732
639
  gap: 10px;
733
640
  flex: 0 0 auto;
734
641
  }
642
+ .slot-flags { grid-column:1 / -1; display:flex; flex-wrap:wrap; gap:6px 24px; }
735
643
  .item-body {
736
644
  flex: 1;
737
645
  min-height: 0;
@@ -774,13 +682,7 @@ html, body {
774
682
  color: var(--accent);
775
683
  }
776
684
  .options-grid {
777
- display: grid;
778
- grid-template-columns: repeat(3, minmax(150px, 1fr));
779
- gap: 10px;
780
- overflow: auto;
781
- padding-right: 4px;
782
- flex: 1;
783
- min-height: 0;
685
+ display:grid; grid-template-columns:repeat(auto-fit,minmax(min(190px,100%),1fr)); align-content:start; align-items:start; gap:14px 16px; overflow:auto; padding-right:4px; flex:1; min-height:0;
784
686
  }
785
687
  .option-note {
786
688
  color: var(--muted);
@@ -1012,6 +914,48 @@ html, body {
1012
914
  padding: 12px;
1013
915
  background: var(--pane-soft);
1014
916
  }
917
+ .modal-dialog.resource-modal {
918
+ align-self: center;
919
+ width: min(560px, calc(100vw - 32px));
920
+ height: auto;
921
+ max-height: calc(100vh - 32px);
922
+ }
923
+ .resource-form {
924
+ display: grid;
925
+ gap: 6px;
926
+ max-width: 480px;
927
+ margin: 0 auto;
928
+ }
929
+ .resource-form label {
930
+ color: var(--muted);
931
+ font-size: 12px;
932
+ font-weight: 600;
933
+ }
934
+ /* New-preset choices share the existing resource dialog and scroll container. */
935
+ .template-options { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 6px; }
936
+ .template-option { display: flex; align-items: flex-start; gap: 10px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--pane); cursor: pointer; }
937
+ .template-option:hover { border-color: var(--line-strong); }
938
+ .template-option:has(input:checked) { border-color: var(--accent); background: var(--accent-bg); }
939
+ .template-option input[type="radio"] { margin: 2px 0 0; width: auto; flex: none; cursor: pointer; accent-color: var(--accent); }
940
+ .template-option:focus-within { outline: 2px solid var(--accent); outline-offset: 1px; }
941
+ .template-option-content { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
942
+ .template-option-title { font-size: 13px; font-weight: 600; color: var(--text); }
943
+ .template-option-desc { font-size: 12px; font-weight: 400; color: var(--muted); line-height: 1.4; }
944
+ .resource-form-note {
945
+ margin: 6px 0 2px;
946
+ padding: 8px;
947
+ border: 1px solid var(--line);
948
+ border-radius: 6px;
949
+ color: var(--warning);
950
+ background: var(--warning-bg);
951
+ font-size: 12px;
952
+ }
953
+ .resource-form-actions {
954
+ display: flex;
955
+ justify-content: flex-end;
956
+ gap: 8px;
957
+ margin-top: 8px;
958
+ }
1015
959
  .modal-toolbar {
1016
960
  display: flex;
1017
961
  gap: 8px;
@@ -1249,17 +1193,7 @@ html, body {
1249
1193
  .workspace {
1250
1194
  display: block;
1251
1195
  }
1252
- .editor-dock-area.dock-open,
1253
- .editor-dock-area.dock-open.dock-focus {
1254
- grid-template-columns: minmax(0, 1fr);
1255
- }
1256
- .editor-dock-area.dock-open .workspace {
1257
- display: none;
1258
- }
1259
- .editor-dock-area.dock-open .context-diff-panel {
1260
- border-left: 0;
1261
- }
1262
- .item-form {
1196
+ .item-form {
1263
1197
  height: auto;
1264
1198
  overflow: visible;
1265
1199
  }
@@ -1282,8 +1216,10 @@ html, body {
1282
1216
  border-right: 0;
1283
1217
  border-bottom: 1px solid var(--line);
1284
1218
  }
1219
+ .shell.sidebar-collapsed { grid-template-columns:minmax(0,1fr); }
1220
+ .shell.sidebar-collapsed .sidebar { display:none; }
1285
1221
  .sidebar {
1286
- min-height: 180px;
1222
+ min-height: 0;
1287
1223
  max-height: 240px;
1288
1224
  }
1289
1225
  .metadata-head {
@@ -1332,5 +1268,396 @@ html, body {
1332
1268
  font-size: 14px;
1333
1269
  }
1334
1270
  }
1271
+
1272
+ /* V4 workspace: the library owns creation/reload; the editor header owns identity. */
1273
+ .topbar .brand {
1274
+ display: none;
1275
+ }
1276
+ .resource-header {
1277
+ display: flex;
1278
+ align-items: center;
1279
+ gap: 10px;
1280
+ flex-wrap: wrap;
1281
+ min-width: 0;
1282
+ padding: 4px 10px;
1283
+ border-bottom: 1px solid var(--line);
1284
+ background: var(--pane);
1285
+ }
1286
+ .resource-identity,
1287
+ .resource-title-line,
1288
+ .resource-subline {
1289
+ min-width: 0;
1290
+ }
1291
+ .resource-title-line {
1292
+ display:flex; flex-wrap:wrap; align-items:center; gap:4px 8px; min-width:0;
1293
+ }
1294
+ .resource-title-line h1 {
1295
+ flex:0 1 auto; min-width:0; max-width:100%; margin:0; font-size:18px; line-height:1.3; font-weight:700; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;
1296
+ }
1297
+ .resource-subline {
1298
+ display: flex;
1299
+ align-items: center;
1300
+ gap: 6px;
1301
+ margin-top: 3px;
1302
+ color: var(--muted);
1303
+ font-size: 12px;
1304
+ overflow-wrap: anywhere;
1305
+ }
1306
+ .resource-subline code {
1307
+ color: var(--accent);
1308
+ overflow-wrap: anywhere;
1309
+ }
1310
+ .resource-editing-label {
1311
+ flex: 0 0 auto;
1312
+ color: var(--muted);
1313
+ font-size: 11px;
1314
+ }
1315
+ .runtime-badge {
1316
+ flex: 0 0 auto;
1317
+ border: 1px solid var(--line);
1318
+ border-radius: 999px;
1319
+ padding: 1px 7px;
1320
+ color: var(--muted);
1321
+ font-size: 11px;
1322
+ white-space: nowrap;
1323
+ }
1324
+ .runtime-badge.active {
1325
+ color: var(--accent);
1326
+ border-color: var(--accent);
1327
+ background: var(--accent-bg);
1328
+ }
1329
+ .side-head {
1330
+ display: flex;
1331
+ flex-direction: column;
1332
+ align-items: stretch;
1333
+ justify-content: space-between;
1334
+ gap: 8px;
1335
+ }
1336
+ .side-head-title {
1337
+ min-width: 0;
1338
+ flex: 1 1 auto;
1339
+ }
1340
+ .library-actions {
1341
+ display: flex;
1342
+ flex-wrap: wrap;
1343
+ align-items: center;
1344
+ gap: 4px;
1345
+ flex: 0 0 auto;
1346
+ }
1347
+ .library-actions select {
1348
+ width: auto;
1349
+ min-width: 74px;
1350
+ padding: 4px 6px;
1351
+ font-size: 12px;
1352
+ }
1353
+ .library-actions button {
1354
+ font-size: 12px;
1355
+ min-height: 30px;
1356
+ padding: 4px 7px;
1357
+ white-space: nowrap;
1358
+ }
1359
+ .library-actions #reloadBtn {
1360
+ width: 30px;
1361
+ padding-inline: 0;
1362
+ overflow: hidden;
1363
+ color: transparent;
1364
+ font-size: 0;
1365
+ }
1366
+ .library-actions #reloadBtn::before {
1367
+ margin-right: 0;
1368
+ color: var(--text);
1369
+ font-size: 14px;
1370
+ }
1371
+ .resource-header .resource-identity {
1372
+ flex:1 1 280px; min-width:min(280px,100%);
1373
+ }
1374
+ .resource-header .main-actions .action-spacer {
1375
+ min-width: 4px;
1376
+ }
1377
+ .item-row:focus-visible {
1378
+ outline: 2px solid var(--accent);
1379
+ outline-offset: 2px;
1380
+ }
1381
+ .item-row.selected {
1382
+ border-color: var(--accent);
1383
+ }
1384
+ .item-row.selected.kind-block,
1385
+ .item-row.selected.kind-slot {
1386
+ border-left-color: var(--accent);
1387
+ }
1388
+ .item-title {
1389
+ display: -webkit-box;
1390
+ -webkit-line-clamp: 2;
1391
+ -webkit-box-orient: vertical;
1392
+ overflow: hidden;
1393
+ color: var(--text);
1394
+ }
1395
+ .item-meta {
1396
+ display: block;
1397
+ white-space: nowrap;
1398
+ overflow: hidden;
1399
+ text-overflow: ellipsis;
1400
+ overflow-wrap: normal;
1401
+ }
1402
+ .item-form {
1403
+ gap: 8px;
1404
+ padding: 14px 16px;
1405
+ }
1406
+ .item-primary-field {
1407
+ flex: 0 0 auto;
1408
+ }
1409
+ .item-primary-field label {
1410
+ color: var(--text);
1411
+ font-weight: 650;
1412
+ }
1413
+ .item-primary-field input {
1414
+ min-height: 36px;
1415
+ font-size: 15px;
1416
+ }
1417
+ .item-technical-row {
1418
+ display: flex;
1419
+ align-items: center;
1420
+ flex-wrap: wrap;
1421
+ gap: 8px;
1422
+ min-width: 0;
1423
+ color: var(--muted);
1424
+ font-size: 12px;
1425
+ }
1426
+ .role-control {
1427
+ display: inline-flex;
1428
+ align-items: center;
1429
+ gap: 4px;
1430
+ min-width: 0;
1431
+ color: var(--text);
1432
+ font-size: 12px;
1433
+ }
1434
+ .role-control select {
1435
+ width: auto;
1436
+ min-width: 88px;
1437
+ min-height: 30px;
1438
+ padding: 3px 22px 3px 5px;
1439
+ border: 1px solid transparent;
1440
+ background-color: transparent;
1441
+ color: var(--text);
1442
+ font-size: 14px;
1443
+ appearance: none;
1444
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23677770' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7.5l5 5 5-5'/%3E%3C/svg%3E");
1445
+ background-position: right 3px center;
1446
+ background-size: 16px 16px;
1447
+ background-repeat: no-repeat;
1448
+ }
1449
+ .role-control select:hover,
1450
+ .role-control select:focus-visible {
1451
+ border-color: var(--line);
1452
+ background: var(--accent-bg);
1453
+ }
1454
+ .item-properties {
1455
+ position: relative;
1456
+ flex: 0 0 auto;
1457
+ }
1458
+ .item-properties > summary {
1459
+ cursor: pointer;
1460
+ list-style: none;
1461
+ color: var(--muted);
1462
+ padding: 3px 5px;
1463
+ border-radius: 4px;
1464
+ }
1465
+ .item-properties > summary::-webkit-details-marker {
1466
+ display: none;
1467
+ }
1468
+ .item-properties > summary::after {
1469
+ content: "⌄";
1470
+ margin-left: 4px;
1471
+ font-size: 16px;
1472
+ line-height: 12px;
1473
+ vertical-align: -1px;
1474
+ }
1475
+ .item-properties[open] > summary::after {
1476
+ content: "⌃";
1477
+ }
1478
+ .item-properties > summary:hover,
1479
+ .item-properties > summary:focus-visible {
1480
+ color: var(--accent);
1481
+ background: var(--accent-bg);
1482
+ outline: none;
1483
+ }
1484
+ .item-properties-popover {
1485
+ position:fixed; z-index:4; display:grid; grid-template-columns:1fr; gap:10px; width:min(330px,calc(100vw - 32px)); max-height:65vh; overflow:auto; padding:12px; border:1px solid var(--line); border-radius:6px; background:var(--pane); box-shadow:0 8px 24px var(--shadow);
1486
+ }
1487
+ .item-properties-popover .field:last-child {
1488
+ grid-column: 1 / -1;
1489
+ }
1490
+ .item-body {
1491
+ min-width: 0;
1492
+ }
1493
+ .content-field {
1494
+ min-width: 0;
1495
+ }
1496
+ .content-field textarea {
1497
+ color: var(--text);
1498
+ background: var(--control);
1499
+ line-height: 1.6;
1500
+ }
1501
+ .metadata-details > summary {
1502
+ display: flex;
1503
+ align-items: center;
1504
+ gap: 8px;
1505
+ min-width: 0;
1506
+ padding: 5px 10px;
1507
+ cursor: pointer;
1508
+ list-style: none;
1509
+ color: var(--muted);
1510
+ font-size: 12px;
1511
+ }
1512
+ .metadata-details > summary::-webkit-details-marker {
1513
+ display: none;
1514
+ }
1515
+ .metadata-details > summary::before {
1516
+ content: "▸";
1517
+ color: var(--accent);
1518
+ }
1519
+ .metadata-details[open] > summary::before {
1520
+ content: "▾";
1521
+ }
1522
+ .metadata-summary-title {
1523
+ flex: 0 0 auto;
1524
+ color: var(--text);
1525
+ font-weight: 650;
1526
+ }
1527
+ .metadata-details .metadata-summary {
1528
+ margin: 0;
1529
+ }
1530
+ @media (max-width: 900px) {
1531
+ .resource-header {
1532
+ padding: 5px 10px;
1533
+ }
1534
+ .resource-header .main-actions {
1535
+ flex: 1 1 auto;
1536
+ }
1537
+ .resource-editing-label {
1538
+ display: none;
1539
+ }
1540
+ .library-actions {
1541
+ flex-wrap: wrap;
1542
+ justify-content: flex-end;
1543
+ }
1544
+ .library-actions select {
1545
+ max-width: 82px;
1546
+ }
1547
+ }
1548
+ @media (max-width: 520px) {
1549
+ .side-head {
1550
+ display: block;
1551
+ }
1552
+ .library-actions {
1553
+ margin-top: 7px;
1554
+ justify-content: flex-start;
1555
+ }
1556
+ .resource-title-line h1 {
1557
+ font-size: 16px;
1558
+ }
1559
+ }
1560
+
1561
+ .item-row .drag-handle { position: absolute; left: 3px; top: 13px; font-size: 14px; width: 12px; }
1562
+ .item-row .item-toggle { width: 30px; min-height: 24px; padding: 1px 0; font-size: 10px; border-radius: 5px; }
1563
+ .item-row .item-toggle.enabled { background: var(--accent-bg); color: var(--accent); border-color: var(--line); }
1564
+ .item-row > div:not(.drag-handle) { min-width: 0; }
1565
+ .item-row .item-title { grid-column:1; grid-row:1; }
1566
+ .item-row .item-toggle { grid-column:2; grid-row:1; }
1567
+ .stack-row { display: flex; flex-direction: column; align-items: stretch; }
1568
+ .stack-row .stack-meta:nth-child(2) { order: -1; font-size: 13px; color: var(--text); font-weight: 650; margin-top: 0; }
1569
+ .stack-row .stack-name { font-size: 11px; color: var(--muted); margin-top: 4px; }
1570
+ .view-tabs { gap: 18px; padding: 0 12px; }
1571
+ .view-tabs button { border: 0; border-radius: 0; background: transparent; padding: 7px 2px; position: relative; }
1572
+ .view-tabs button[data-icon]::before { display: none; }
1573
+ .view-tabs button.active { background: transparent; color: var(--accent); }
1574
+ .view-tabs button.active::after { content: ""; position: absolute; bottom: 0; height: 2px; left: 0; right: 0; background: var(--accent); }
1575
+ .library-actions { flex-wrap: nowrap; }
1576
+ @media(max-width:520px) { .view-tabs { gap: 14px; } }
1577
+
1578
+ .stack-list, .item-list { flex: 0 1 auto; }
1579
+ .side-head { flex-direction: row; align-items: flex-start; }
1580
+ .side-head .library-actions { flex: 0 0 auto; }
1581
+ .side-head .cwd { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1582
+
1583
+ /* Second-pass workspace polish: keep creation and item operations close to their
1584
+ owning list/editor, while the preview remains a separate dock column. */
1585
+ .library-create {
1586
+ flex: 0 0 auto;
1587
+ display: grid;
1588
+ gap: 5px;
1589
+ padding: 10px 8px 12px;
1590
+ border-top: 1px solid var(--line);
1591
+ background: var(--pane-soft);
1592
+ }
1593
+ .library-create #newStackBtn {
1594
+ width: 100%;
1595
+ margin-top: 2px;
1596
+ border-style: dashed;
1597
+ justify-content: center;
1598
+ }
1599
+ .item-add-wrap {
1600
+ position: relative;
1601
+ flex: 0 0 auto;
1602
+ padding: 8px 12px 12px;
1603
+ border-top: 1px solid var(--line);
1604
+ background: var(--pane);
1605
+ }
1606
+ .item-add-wrap > .outline-add {
1607
+ width: 100%;
1608
+ border-style: dashed;
1609
+ color: var(--muted);
1610
+ }
1611
+ .add-content-menu {
1612
+ position: absolute;
1613
+ z-index: 5;
1614
+ left: 12px;
1615
+ right: 12px;
1616
+ bottom: calc(100% - 4px);
1617
+ display: grid;
1618
+ gap: 4px;
1619
+ padding: 6px;
1620
+ border: 1px solid var(--line-strong);
1621
+ border-radius: 7px;
1622
+ background: var(--pane);
1623
+ box-shadow: 0 8px 24px var(--shadow);
1624
+ }
1625
+ .add-content-menu[hidden] {
1626
+ display: none;
1627
+ }
1628
+ .add-content-menu button {
1629
+ width: 100%;
1630
+ display: grid;
1631
+ grid-template-columns: auto minmax(0, 1fr);
1632
+ text-align: left;
1633
+ border-color: transparent;
1634
+ }
1635
+ .add-content-menu button small {
1636
+ grid-column: 2;
1637
+ color: var(--muted);
1638
+ font-size: 11px;
1639
+ }
1640
+ .view-tabs [data-dock-tab] {
1641
+ margin-left: auto;
1642
+ border: 1px solid var(--line);
1643
+ border-radius: 5px;
1644
+ background: var(--pane-soft);
1645
+ padding-inline: 10px;
1646
+ color: var(--muted);
1647
+ font-size: 12px;
1648
+ }
1649
+ .view-tabs [data-dock-tab].active {
1650
+ border-color: var(--accent);
1651
+ background: var(--accent-bg);
1652
+ color: var(--accent);
1653
+ }
1654
+ .view-tabs [data-dock-tab].active::after {
1655
+ display: none;
1656
+ }
1657
+
1658
+
1659
+ /* Navigation has one summary line, not a second miniature form. */
1660
+ .item-row .item-meta { grid-column:1 / -1; margin:0; font-size:11px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
1661
+ .preset-properties-entry { flex:0 0 auto; }
1335
1662
  `;
1336
1663
  //# sourceMappingURL=styles.js.map