@zihanw/pi-forge 0.5.3 → 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 (241) hide show
  1. package/CHANGELOG.md +84 -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 +7 -1
  83. package/dist/compile-cycle.d.ts.map +1 -1
  84. package/dist/compile-cycle.js +2 -0
  85. package/dist/compile-cycle.js.map +1 -1
  86. package/dist/compiler.d.ts +7 -1
  87. package/dist/compiler.d.ts.map +1 -1
  88. package/dist/compiler.js +140 -19
  89. package/dist/compiler.js.map +1 -1
  90. package/dist/context-diff-history.d.ts +2 -0
  91. package/dist/context-diff-history.d.ts.map +1 -1
  92. package/dist/context-diff-history.js +9 -0
  93. package/dist/context-diff-history.js.map +1 -1
  94. package/dist/forge-command.d.ts +10 -0
  95. package/dist/forge-command.d.ts.map +1 -0
  96. package/dist/forge-command.js +106 -0
  97. package/dist/forge-command.js.map +1 -0
  98. package/dist/index.d.ts +2 -2
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +58 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/json-fingerprint.d.ts +11 -0
  103. package/dist/json-fingerprint.d.ts.map +1 -0
  104. package/dist/json-fingerprint.js +66 -0
  105. package/dist/json-fingerprint.js.map +1 -0
  106. package/dist/lifecycle.d.ts +14 -0
  107. package/dist/lifecycle.d.ts.map +1 -1
  108. package/dist/lifecycle.js +175 -66
  109. package/dist/lifecycle.js.map +1 -1
  110. package/dist/payload-command.d.ts +2 -2
  111. package/dist/payload-command.d.ts.map +1 -1
  112. package/dist/payload-command.js +80 -26
  113. package/dist/payload-command.js.map +1 -1
  114. package/dist/payload-state.d.ts +1 -0
  115. package/dist/payload-state.d.ts.map +1 -1
  116. package/dist/payload-state.js +1 -0
  117. package/dist/payload-state.js.map +1 -1
  118. package/dist/policy.d.ts +2 -1
  119. package/dist/policy.d.ts.map +1 -1
  120. package/dist/policy.js +3 -0
  121. package/dist/policy.js.map +1 -1
  122. package/dist/preset-command.d.ts +2 -0
  123. package/dist/preset-command.d.ts.map +1 -1
  124. package/dist/preset-command.js +101 -36
  125. package/dist/preset-command.js.map +1 -1
  126. package/dist/preview-text.d.ts +5 -0
  127. package/dist/preview-text.d.ts.map +1 -0
  128. package/dist/preview-text.js +27 -0
  129. package/dist/preview-text.js.map +1 -0
  130. package/dist/preview.d.ts +18 -1
  131. package/dist/preview.d.ts.map +1 -1
  132. package/dist/preview.js +134 -99
  133. package/dist/preview.js.map +1 -1
  134. package/dist/profile-command.d.ts +4 -1
  135. package/dist/profile-command.d.ts.map +1 -1
  136. package/dist/profile-command.js +77 -14
  137. package/dist/profile-command.js.map +1 -1
  138. package/dist/prompt-cache-warning.d.ts +23 -0
  139. package/dist/prompt-cache-warning.d.ts.map +1 -0
  140. package/dist/prompt-cache-warning.js +74 -0
  141. package/dist/prompt-cache-warning.js.map +1 -0
  142. package/dist/regex.d.ts.map +1 -1
  143. package/dist/regex.js +5 -0
  144. package/dist/regex.js.map +1 -1
  145. package/dist/render-helpers.d.ts.map +1 -1
  146. package/dist/render-helpers.js +2 -0
  147. package/dist/render-helpers.js.map +1 -1
  148. package/dist/repositories/capability.d.ts +53 -0
  149. package/dist/repositories/capability.d.ts.map +1 -0
  150. package/dist/repositories/capability.js +294 -0
  151. package/dist/repositories/capability.js.map +1 -0
  152. package/dist/runtime/capability-runtime.d.ts +91 -0
  153. package/dist/runtime/capability-runtime.d.ts.map +1 -0
  154. package/dist/runtime/capability-runtime.js +967 -0
  155. package/dist/runtime/capability-runtime.js.map +1 -0
  156. package/dist/runtime/tool-policy-runtime.d.ts +8 -0
  157. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  158. package/dist/runtime/tool-policy-runtime.js +171 -30
  159. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  160. package/dist/session-adapter.d.ts +13 -0
  161. package/dist/session-adapter.d.ts.map +1 -1
  162. package/dist/session-adapter.js +110 -0
  163. package/dist/session-adapter.js.map +1 -1
  164. package/dist/session-usage.d.ts +65 -0
  165. package/dist/session-usage.d.ts.map +1 -0
  166. package/dist/session-usage.js +134 -0
  167. package/dist/session-usage.js.map +1 -0
  168. package/dist/subagent/fingerprints.d.ts +3 -15
  169. package/dist/subagent/fingerprints.d.ts.map +1 -1
  170. package/dist/subagent/fingerprints.js +5 -69
  171. package/dist/subagent/fingerprints.js.map +1 -1
  172. package/dist/subagent/index.d.ts +2 -0
  173. package/dist/subagent/index.d.ts.map +1 -1
  174. package/dist/subagent/index.js +2 -0
  175. package/dist/subagent/index.js.map +1 -1
  176. package/dist/subagent-host.d.ts +2 -2
  177. package/dist/subagent-host.d.ts.map +1 -1
  178. package/dist/subagent-host.js +13 -1
  179. package/dist/subagent-host.js.map +1 -1
  180. package/dist/types.d.ts +6 -1
  181. package/dist/types.d.ts.map +1 -1
  182. package/dist/types.js.map +1 -1
  183. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  184. package/dist/web-editor/client-script.generated.js +1 -1
  185. package/dist/web-editor/client-script.generated.js.map +1 -1
  186. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  187. package/dist/web-editor/client-styles.generated.js +1 -1
  188. package/dist/web-editor/client-styles.generated.js.map +1 -1
  189. package/dist/web-editor/server.d.ts.map +1 -1
  190. package/dist/web-editor/server.js +152 -4
  191. package/dist/web-editor/server.js.map +1 -1
  192. package/dist/web-editor/styles.d.ts.map +1 -1
  193. package/dist/web-editor/styles.js +521 -116
  194. package/dist/web-editor/styles.js.map +1 -1
  195. package/dist/web-editor/types.d.ts +81 -1
  196. package/dist/web-editor/types.d.ts.map +1 -1
  197. package/dist/web-host.d.ts +7 -0
  198. package/dist/web-host.d.ts.map +1 -1
  199. package/dist/web-host.js +168 -5
  200. package/dist/web-host.js.map +1 -1
  201. package/dist/workspace.d.ts +11 -0
  202. package/dist/workspace.d.ts.map +1 -1
  203. package/dist/workspace.js +63 -5
  204. package/dist/workspace.js.map +1 -1
  205. package/docs/README.md +4 -0
  206. package/docs/design/README.md +3 -1
  207. package/docs/design/architecture-0.5.md +22 -0
  208. package/docs/design/archive/2026-09-12-system-update-design.md +229 -0
  209. package/docs/design/pi-forge-system-update-design-notes.md +157 -0
  210. package/docs/development/release.md +20 -20
  211. package/docs/development/roadmap.md +17 -2
  212. package/docs/development/scoped-global-profiles-stacks.md +1 -1
  213. package/docs/development/setup.md +1 -1
  214. package/docs/getting-started.md +1 -1
  215. package/docs/guides/delegation.md +22 -20
  216. package/docs/guides/migrating-to-0.5.md +29 -0
  217. package/docs/guides/use-cases.md +6 -2
  218. package/docs/guides/web-editor.md +73 -5
  219. package/docs/reference/active-state.md +77 -0
  220. package/docs/reference/capabilities.md +259 -0
  221. package/docs/reference/commands.md +52 -24
  222. package/docs/reference/configuration.md +4 -2
  223. package/docs/reference/features.md +70 -4
  224. package/docs/reference/provider-support.md +67 -0
  225. package/docs/reference/public-api.md +49 -3
  226. package/docs/reference/session-cache.md +112 -0
  227. package/docs/reference/stack-schema.md +18 -4
  228. package/docs/reference/subagent-host-port.md +8 -0
  229. package/docs/zh-CN/README.md +3 -0
  230. package/docs/zh-CN/getting-started.md +1 -1
  231. package/docs/zh-CN/guides/delegation.md +22 -10
  232. package/docs/zh-CN/guides/migrating-to-0.5.md +29 -0
  233. package/docs/zh-CN/guides/web-editor.md +74 -7
  234. package/docs/zh-CN/reference/capabilities.md +259 -0
  235. package/docs/zh-CN/reference/commands.md +61 -33
  236. package/docs/zh-CN/reference/provider-support.md +67 -0
  237. package/docs/zh-CN/reference/session-cache.md +112 -0
  238. package/examples/capabilities/review.json +12 -0
  239. package/examples/capabilities/write-tools.json +15 -0
  240. package/examples/read-first-worker-prompt-stack.json +49 -0
  241. package/package.json +16 -9
@@ -1,19 +1,34 @@
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
+ --role-system: #7564a8;
18
+ --role-user: #2f7d68;
19
+ --role-assistant: #3e76ad;
20
+ --role-tool-result: #b16b2e;
21
+ --item-block: #4f6f9f;
22
+ --item-slot: #8b5fa8;
23
+ --slot-chat-history: #2f8a78;
24
+ --slot-tools: #a36a2c;
25
+ --slot-tool-guidelines: #ad7a32;
26
+ --slot-skills: #4e7fa3;
27
+ --slot-project-context: #6977a8;
28
+ --slot-date: #8b6aa8;
29
+ --slot-date-cwd: #7b6095;
30
+ --slot-built-in: #5f7185;
31
+ --slot-custom: #8a667d;
17
32
  --control: #ffffff;
18
33
  --control-muted: #f3f5f8;
19
34
  --pane-soft: #fbfcfe;
@@ -24,23 +39,38 @@ export const EDITOR_STYLES = String.raw `
24
39
  }
25
40
  body[data-theme="dark"] {
26
41
  color-scheme: dark;
27
- --bg: #111315;
28
- --pane: #181a1d;
29
- --line: #32363b;
30
- --line-strong: #525a63;
31
- --text: #edf0f2;
32
- --muted: #a0a8b2;
33
- --accent: #2aa889;
34
- --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;
35
50
  --warning: #e4b75f;
36
51
  --warning-bg: #3a2d13;
37
52
  --error: #f06f64;
38
53
  --error-bg: #3c1d1a;
39
54
  --success: #69c98c;
40
- --control: #202327;
41
- --control-muted: #25292e;
42
- --pane-soft: #151719;
43
- --row: #1c1f23;
55
+ --role-system: #b8a8ec;
56
+ --role-user: #65c6a9;
57
+ --role-assistant: #82b9ef;
58
+ --role-tool-result: #e5ad70;
59
+ --item-block: #88a9dc;
60
+ --item-slot: #c59be0;
61
+ --slot-chat-history: #70d0ba;
62
+ --slot-tools: #e5aa68;
63
+ --slot-tool-guidelines: #e7bd74;
64
+ --slot-skills: #8fc5e8;
65
+ --slot-project-context: #a7b4eb;
66
+ --slot-date: #c6a8e9;
67
+ --slot-date-cwd: #b697dc;
68
+ --slot-built-in: #a9bacb;
69
+ --slot-custom: #d0a5c3;
70
+ --control: #202a27;
71
+ --control-muted: #25312e;
72
+ --pane-soft: #151d1b;
73
+ --row: #1c2623;
44
74
  --code-bg: #0b0d10;
45
75
  --code-text: #e8edf2;
46
76
  --shadow: rgba(0, 0, 0, .42);
@@ -75,20 +105,25 @@ button[data-icon]::before {
75
105
  color: currentColor;
76
106
  }
77
107
  button.icon[data-icon]::before {
78
- margin-right: 0;
108
+ margin:0; font-size:14px; line-height:30px;
79
109
  }
80
110
  button.primary {
81
111
  border-color: var(--accent);
82
112
  background: var(--accent);
83
113
  color: white;
84
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
+ }
85
121
  button.danger {
86
122
  border-color: var(--error);
87
123
  color: var(--error);
88
124
  }
89
125
  button.icon {
90
- width: 34px;
91
- padding: 5px 0;
126
+ width:32px; height:32px; min-height:32px; flex:0 0 32px; padding:0; font-size:0; overflow:hidden;
92
127
  }
93
128
  button:disabled {
94
129
  cursor: default;
@@ -123,14 +158,7 @@ html, body {
123
158
  }
124
159
  }
125
160
  .topbar {
126
- display: flex;
127
- align-items: center;
128
- flex-wrap: wrap;
129
- gap: 8px;
130
- min-height: 40px;
131
- padding: 4px 10px;
132
- border-bottom: 1px solid var(--line);
133
- 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;
134
162
  }
135
163
  .brand {
136
164
  font-weight: 700;
@@ -160,7 +188,7 @@ html, body {
160
188
  }
161
189
  .shell {
162
190
  display: grid;
163
- grid-template-columns: minmax(210px, 260px) minmax(0, 1fr);
191
+ grid-template-columns: 212px minmax(0, 1fr);
164
192
  height: calc(100vh - 48px);
165
193
  min-height: 0;
166
194
  transition: grid-template-columns .16s ease;
@@ -255,16 +283,7 @@ html, body {
255
283
  flex-direction: column;
256
284
  }
257
285
  .main-actions {
258
- display: flex;
259
- align-items: center;
260
- gap: 6px;
261
- flex-wrap: nowrap;
262
- min-height: 42px;
263
- padding: 5px 10px;
264
- border-bottom: 1px solid var(--line);
265
- background: var(--pane);
266
- position: relative;
267
- 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;
268
287
  }
269
288
  .new-stack-control {
270
289
  display: flex;
@@ -408,7 +427,7 @@ html, body {
408
427
  }
409
428
  .workspace {
410
429
  display: grid;
411
- grid-template-columns: minmax(220px, 300px) minmax(0, 1fr);
430
+ grid-template-columns: 190px minmax(0, 1fr);
412
431
  flex: 1;
413
432
  min-height: 0;
414
433
  }
@@ -440,33 +459,12 @@ html, body {
440
459
  display: grid;
441
460
  grid-template-columns: minmax(0, 1fr);
442
461
  }
443
- .editor-dock-area.dock-open {
444
- grid-template-columns: minmax(0, 1fr) minmax(440px, 48%);
445
- }
446
462
  .editor-dock-area .workspace,
447
463
  .editor-dock-area .tab-panel,
448
464
  .editor-dock-area .context-diff-panel {
449
465
  min-width: 0;
450
466
  min-height: 0;
451
467
  }
452
- .editor-dock-area.dock-open .workspace {
453
- display: grid;
454
- grid-template-columns: minmax(200px, 260px) minmax(0, 1fr);
455
- border-right: 1px solid var(--line);
456
- }
457
- .editor-dock-area.dock-open .context-diff-panel {
458
- display: block;
459
- border-left: 1px solid var(--line);
460
- }
461
- .editor-dock-area.dock-open.dock-focus {
462
- grid-template-columns: minmax(0, 1fr);
463
- }
464
- .editor-dock-area.dock-open.dock-focus .workspace {
465
- display: none;
466
- }
467
- .editor-dock-area.dock-open.dock-focus .context-diff-panel {
468
- border-left: 0;
469
- }
470
468
  .tab-section {
471
469
  border: 1px solid var(--line);
472
470
  border-radius: 6px;
@@ -500,22 +498,6 @@ html, body {
500
498
  border-bottom: 1px solid var(--line);
501
499
  font-weight: 650;
502
500
  }
503
- .item-tools {
504
- display: flex;
505
- flex-wrap: wrap;
506
- gap: 6px;
507
- padding: 8px 12px;
508
- border-bottom: 1px solid var(--line);
509
- flex: 0 0 auto;
510
- }
511
- .item-tools button,
512
- .main-actions button {
513
- white-space: nowrap;
514
- }
515
- .item-tools-spacer {
516
- flex: 1 1 auto;
517
- min-width: 8px;
518
- }
519
501
  .item-list {
520
502
  padding: 8px;
521
503
  overflow: auto;
@@ -526,29 +508,31 @@ html, body {
526
508
  background: var(--accent-bg);
527
509
  }
528
510
  .item-row {
529
- width: 100%;
530
- text-align: left;
531
- border: 1px solid var(--line);
532
- background: var(--row);
533
- border-radius: 6px;
534
- padding: 8px;
535
- margin-bottom: 6px;
536
- display: grid;
537
- grid-template-columns: 18px minmax(0, 1fr) 48px;
538
- gap: 8px;
539
- align-items: center;
540
- cursor: grab;
541
- 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;
542
512
  }
543
513
  .item-row:active {
544
514
  cursor: grabbing;
545
515
  }
516
+ .item-row.kind-block {
517
+ border-left-color: var(--item-block);
518
+ }
519
+ .item-row.kind-slot {
520
+ border-left-color: var(--item-slot);
521
+ }
546
522
  .item-row.selected {
547
- border-color: var(--accent);
523
+ border-top-color: var(--accent);
524
+ border-right-color: var(--accent);
525
+ border-bottom-color: var(--accent);
548
526
  background: var(--accent-bg);
549
527
  }
528
+ .item-row.selected.kind-block {
529
+ border-left-color: var(--item-block);
530
+ }
531
+ .item-row.selected.kind-slot {
532
+ border-left-color: var(--item-slot);
533
+ }
550
534
  .item-row.disabled {
551
- opacity: .62;
535
+ opacity: .76;
552
536
  }
553
537
  .item-row.dragging {
554
538
  border-style: dashed;
@@ -618,6 +602,7 @@ html, body {
618
602
  border-color: var(--warning);
619
603
  }
620
604
  .item-title {
605
+ font-size: 13px;
621
606
  font-weight: 650;
622
607
  overflow-wrap: anywhere;
623
608
  }
@@ -654,6 +639,7 @@ html, body {
654
639
  gap: 10px;
655
640
  flex: 0 0 auto;
656
641
  }
642
+ .slot-flags { grid-column:1 / -1; display:flex; flex-wrap:wrap; gap:6px 24px; }
657
643
  .item-body {
658
644
  flex: 1;
659
645
  min-height: 0;
@@ -696,13 +682,7 @@ html, body {
696
682
  color: var(--accent);
697
683
  }
698
684
  .options-grid {
699
- display: grid;
700
- grid-template-columns: repeat(3, minmax(150px, 1fr));
701
- gap: 10px;
702
- overflow: auto;
703
- padding-right: 4px;
704
- flex: 1;
705
- 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;
706
686
  }
707
687
  .option-note {
708
688
  color: var(--muted);
@@ -934,6 +914,48 @@ html, body {
934
914
  padding: 12px;
935
915
  background: var(--pane-soft);
936
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
+ }
937
959
  .modal-toolbar {
938
960
  display: flex;
939
961
  gap: 8px;
@@ -1171,17 +1193,7 @@ html, body {
1171
1193
  .workspace {
1172
1194
  display: block;
1173
1195
  }
1174
- .editor-dock-area.dock-open,
1175
- .editor-dock-area.dock-open.dock-focus {
1176
- grid-template-columns: minmax(0, 1fr);
1177
- }
1178
- .editor-dock-area.dock-open .workspace {
1179
- display: none;
1180
- }
1181
- .editor-dock-area.dock-open .context-diff-panel {
1182
- border-left: 0;
1183
- }
1184
- .item-form {
1196
+ .item-form {
1185
1197
  height: auto;
1186
1198
  overflow: visible;
1187
1199
  }
@@ -1204,8 +1216,10 @@ html, body {
1204
1216
  border-right: 0;
1205
1217
  border-bottom: 1px solid var(--line);
1206
1218
  }
1219
+ .shell.sidebar-collapsed { grid-template-columns:minmax(0,1fr); }
1220
+ .shell.sidebar-collapsed .sidebar { display:none; }
1207
1221
  .sidebar {
1208
- min-height: 180px;
1222
+ min-height: 0;
1209
1223
  max-height: 240px;
1210
1224
  }
1211
1225
  .metadata-head {
@@ -1254,5 +1268,396 @@ html, body {
1254
1268
  font-size: 14px;
1255
1269
  }
1256
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; }
1257
1662
  `;
1258
1663
  //# sourceMappingURL=styles.js.map