@corenel/editor 0.1.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 (109) hide show
  1. package/dist/diagnostics.d.ts +9 -0
  2. package/dist/diagnostics.d.ts.map +1 -0
  3. package/dist/diagnostics.js +2 -0
  4. package/dist/diagnostics.js.map +1 -0
  5. package/dist/dock/PanelChooser.d.ts +13 -0
  6. package/dist/dock/PanelChooser.d.ts.map +1 -0
  7. package/dist/dock/PanelChooser.js +72 -0
  8. package/dist/dock/PanelChooser.js.map +1 -0
  9. package/dist/dock/PanelFrame.d.ts +37 -0
  10. package/dist/dock/PanelFrame.d.ts.map +1 -0
  11. package/dist/dock/PanelFrame.js +102 -0
  12. package/dist/dock/PanelFrame.js.map +1 -0
  13. package/dist/dock/PanelHost.d.ts +12 -0
  14. package/dist/dock/PanelHost.d.ts.map +1 -0
  15. package/dist/dock/PanelHost.js +331 -0
  16. package/dist/dock/PanelHost.js.map +1 -0
  17. package/dist/dock/config.d.ts +35 -0
  18. package/dist/dock/config.d.ts.map +1 -0
  19. package/dist/dock/config.js +2 -0
  20. package/dist/dock/config.js.map +1 -0
  21. package/dist/dock/index.d.ts +9 -0
  22. package/dist/dock/index.d.ts.map +1 -0
  23. package/dist/dock/index.js +13 -0
  24. package/dist/dock/index.js.map +1 -0
  25. package/dist/dock/layouts.d.ts +12 -0
  26. package/dist/dock/layouts.d.ts.map +1 -0
  27. package/dist/dock/layouts.js +50 -0
  28. package/dist/dock/layouts.js.map +1 -0
  29. package/dist/dock/tree.d.ts +73 -0
  30. package/dist/dock/tree.d.ts.map +1 -0
  31. package/dist/dock/tree.js +276 -0
  32. package/dist/dock/tree.js.map +1 -0
  33. package/dist/dock/types.d.ts +51 -0
  34. package/dist/dock/types.d.ts.map +1 -0
  35. package/dist/dock/types.js +42 -0
  36. package/dist/dock/types.js.map +1 -0
  37. package/dist/dock/use-layout.d.ts +41 -0
  38. package/dist/dock/use-layout.d.ts.map +1 -0
  39. package/dist/dock/use-layout.js +114 -0
  40. package/dist/dock/use-layout.js.map +1 -0
  41. package/dist/engine/index.d.ts +6 -0
  42. package/dist/engine/index.d.ts.map +1 -0
  43. package/dist/engine/index.js +8 -0
  44. package/dist/engine/index.js.map +1 -0
  45. package/dist/engine/runModel.d.ts +16 -0
  46. package/dist/engine/runModel.d.ts.map +1 -0
  47. package/dist/engine/runModel.js +7 -0
  48. package/dist/engine/runModel.js.map +1 -0
  49. package/dist/engine/useDocResults.d.ts +38 -0
  50. package/dist/engine/useDocResults.d.ts.map +1 -0
  51. package/dist/engine/useDocResults.js +51 -0
  52. package/dist/engine/useDocResults.js.map +1 -0
  53. package/dist/engine/useRunController.d.ts +18 -0
  54. package/dist/engine/useRunController.d.ts.map +1 -0
  55. package/dist/engine/useRunController.js +28 -0
  56. package/dist/engine/useRunController.js.map +1 -0
  57. package/dist/engine/useRunHistory.d.ts +22 -0
  58. package/dist/engine/useRunHistory.d.ts.map +1 -0
  59. package/dist/engine/useRunHistory.js +20 -0
  60. package/dist/engine/useRunHistory.js.map +1 -0
  61. package/dist/engine/useRunOutput.d.ts +32 -0
  62. package/dist/engine/useRunOutput.d.ts.map +1 -0
  63. package/dist/engine/useRunOutput.js +51 -0
  64. package/dist/engine/useRunOutput.js.map +1 -0
  65. package/dist/errorLog.d.ts +17 -0
  66. package/dist/errorLog.d.ts.map +1 -0
  67. package/dist/errorLog.js +44 -0
  68. package/dist/errorLog.js.map +1 -0
  69. package/dist/index.d.ts +3 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +6 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/inlineAssist.d.ts +109 -0
  74. package/dist/inlineAssist.d.ts.map +1 -0
  75. package/dist/inlineAssist.js +272 -0
  76. package/dist/inlineAssist.js.map +1 -0
  77. package/dist/panels/DesignView.d.ts +9 -0
  78. package/dist/panels/DesignView.d.ts.map +1 -0
  79. package/dist/panels/DesignView.js +36 -0
  80. package/dist/panels/DesignView.js.map +1 -0
  81. package/dist/panels/ParamCard.d.ts +14 -0
  82. package/dist/panels/ParamCard.d.ts.map +1 -0
  83. package/dist/panels/ParamCard.js +138 -0
  84. package/dist/panels/ParamCard.js.map +1 -0
  85. package/dist/panels/ProblemsPanel.d.ts +9 -0
  86. package/dist/panels/ProblemsPanel.d.ts.map +1 -0
  87. package/dist/panels/ProblemsPanel.js +46 -0
  88. package/dist/panels/ProblemsPanel.js.map +1 -0
  89. package/dist/panels/UsageButton.d.ts +9 -0
  90. package/dist/panels/UsageButton.d.ts.map +1 -0
  91. package/dist/panels/UsageButton.js +40 -0
  92. package/dist/panels/UsageButton.js.map +1 -0
  93. package/dist/panels/index.d.ts +5 -0
  94. package/dist/panels/index.d.ts.map +1 -0
  95. package/dist/panels/index.js +8 -0
  96. package/dist/panels/index.js.map +1 -0
  97. package/dist/params.d.ts +27 -0
  98. package/dist/params.d.ts.map +1 -0
  99. package/dist/params.js +142 -0
  100. package/dist/params.js.map +1 -0
  101. package/dist/useWorkbench.d.ts +9 -0
  102. package/dist/useWorkbench.d.ts.map +1 -0
  103. package/dist/useWorkbench.js +21 -0
  104. package/dist/useWorkbench.js.map +1 -0
  105. package/dist/workflowModel.d.ts +128 -0
  106. package/dist/workflowModel.d.ts.map +1 -0
  107. package/dist/workflowModel.js +135 -0
  108. package/dist/workflowModel.js.map +1 -0
  109. package/package.json +62 -0
@@ -0,0 +1,276 @@
1
+ import { EDITOR_PANEL_IDS, panelKind } from './types';
2
+ /** Fresh, collision-resistant id for a split. Browser-only; persisted ids
3
+ * round-trip through localStorage unchanged. */
4
+ function sid() {
5
+ return `sp-${Math.random().toString(36).slice(2, 10)}`;
6
+ }
7
+ const panel = (id, collapsed = false) => collapsed ? { type: 'panel', id, collapsed: true } : { type: 'panel', id };
8
+ const split = (dir, sizes, children) => ({ type: 'split', id: sid(), dir, sizes, children });
9
+ /* ---- layout presets (the simple, one-tap focus switcher) ----
10
+ * Every preset contains the full panel set exactly once (so isValidLayout passes
11
+ * and switching never loses a panel — unused ones become collapsed rails). */
12
+ export const PRESET_NAMES = ['editor', 'chat', 'balanced'];
13
+ export const PRESET_LABELS = {
14
+ editor: 'Editor',
15
+ chat: 'Chat',
16
+ balanced: 'Balanced',
17
+ };
18
+ /* Weighting: the primary content panels (editor / assistant / result) carry the
19
+ * weight so they dominate the surface and can be dragged toward full width; the
20
+ * auxiliary panels (files / packages / params / context) stay compact. A panel's
21
+ * weight applies even while collapsed, so reopening a primary rail expands it
22
+ * large (not to a sliver). */
23
+ const PRIMARY = 3;
24
+ const AUX = 1;
25
+ /** Editor-focused: editor large in the center, params/result on the right, the
26
+ * agent + file/package surfaces as collapsed rails. The factory default. */
27
+ export function editorPreset() {
28
+ return split('row', [AUX, AUX, PRIMARY + 1, PRIMARY, PRIMARY], [
29
+ panel('files', true),
30
+ panel('packages', true),
31
+ panel('editor'),
32
+ split('col', [AUX, PRIMARY - 1], [panel('params'), panel('result')]),
33
+ panel('agent', true),
34
+ ]);
35
+ }
36
+ /** Chat-focused (brainstorm mode): the agent fills the surface; the editor and the
37
+ * rest collapse to rails on the left, one click away. */
38
+ export function chatPreset() {
39
+ return split('row', [AUX, PRIMARY + 1], [
40
+ split('col', [AUX, AUX, PRIMARY, AUX, PRIMARY], [
41
+ panel('files', true),
42
+ panel('packages', true),
43
+ panel('editor', true),
44
+ panel('params', true),
45
+ panel('result', true),
46
+ ]),
47
+ panel('agent'),
48
+ ]);
49
+ }
50
+ /** Balanced: editor and agent side by side, params/result tucked to the right,
51
+ * file/package rails on the left. */
52
+ export function balancedPreset() {
53
+ return split('row', [AUX, PRIMARY, PRIMARY, PRIMARY - 1], [
54
+ split('col', [AUX, AUX], [panel('files', true), panel('packages', true)]),
55
+ panel('editor'),
56
+ panel('agent'),
57
+ split('col', [AUX, PRIMARY - 1], [panel('params'), panel('result')]),
58
+ ]);
59
+ }
60
+ export const PRESETS = {
61
+ editor: editorPreset,
62
+ chat: chatPreset,
63
+ balanced: balancedPreset,
64
+ };
65
+ export function defaultLayout() {
66
+ return editorPreset();
67
+ }
68
+ /* ---- pure tree ops ---- */
69
+ /** Every panel id present in the tree, in left-to-right / top-to-bottom order. */
70
+ export function collectPanels(node, acc = []) {
71
+ if (node.type === 'panel')
72
+ acc.push(node.id);
73
+ else
74
+ for (const c of node.children)
75
+ collectPanels(c, acc);
76
+ return acc;
77
+ }
78
+ /** Whether a panel is showing its content right now: present in the tree AND not
79
+ * collapsed (a collapsed panel renders only as a rail, so it isn't "visible"). */
80
+ export function isPanelVisible(node, id) {
81
+ if (node.type === 'panel')
82
+ return node.id === id && !node.collapsed;
83
+ return node.children.some((c) => isPanelVisible(c, id));
84
+ }
85
+ /**
86
+ * Whether a node contributes NO expanded content: a collapsed panel, a childless
87
+ * split, or a split whose every descendant is itself inert. The renderer must not
88
+ * give such a node a flex-growing pane — it would keep its slot while rendering
89
+ * only a rail (or, for an empty split, nothing at all), leaving dead space a
90
+ * sibling can't reclaim. Its panel leaves are gathered into the collapsed tab bar.
91
+ *
92
+ * The empty-split case (`children.length === 0`) is load-bearing: a childless
93
+ * split is inert. Treating it as expanded is exactly the bug that left a growing
94
+ * blank pane beside the editor.
95
+ */
96
+ export function isInert(node) {
97
+ return node.type === 'panel'
98
+ ? Boolean(node.collapsed)
99
+ : node.children.length === 0 || node.children.every(isInert);
100
+ }
101
+ /**
102
+ * Remove a panel from the tree. Splits left with a single child are lifted (that
103
+ * child replaces the split, keeping the tree minimal); empty splits vanish.
104
+ * Returns null only if `node` itself was the removed panel.
105
+ */
106
+ export function removePanel(node, id) {
107
+ if (node.type === 'panel')
108
+ return node.id === id ? null : node;
109
+ const children = [];
110
+ const sizes = [];
111
+ node.children.forEach((c, i) => {
112
+ const r = removePanel(c, id);
113
+ if (r) {
114
+ children.push(r);
115
+ sizes.push(node.sizes[i] ?? 1);
116
+ }
117
+ });
118
+ if (children.length === 0)
119
+ return null;
120
+ if (children.length === 1)
121
+ return children[0];
122
+ return { ...node, children, sizes };
123
+ }
124
+ function wrap(target, p, edge) {
125
+ const dir = edge === 'left' || edge === 'right' ? 'row' : 'col';
126
+ const before = edge === 'left' || edge === 'top';
127
+ return { type: 'split', id: sid(), dir, sizes: [1, 1], children: before ? [p, target] : [target, p] };
128
+ }
129
+ /** Replace the target panel leaf with a 2-way split that places `p` on the given
130
+ * edge. (Adjacent same-direction splits are merged later by `normalize`.) */
131
+ export function insertBeside(node, targetId, p, edge) {
132
+ if (node.type === 'panel')
133
+ return node.id === targetId ? wrap(node, p, edge) : node;
134
+ return { ...node, children: node.children.map((c) => insertBeside(c, targetId, p, edge)) };
135
+ }
136
+ /**
137
+ * Flatten the tree: merge a split into its parent when they share a direction (so
138
+ * dragging never produces redundant nesting), and lift any single-child split.
139
+ * Child weights are scaled into the parent's slot so sizes stay sensible.
140
+ */
141
+ export function normalize(node) {
142
+ if (node.type === 'panel')
143
+ return node;
144
+ const merged = node.children.map(normalize);
145
+ const children = [];
146
+ const sizes = [];
147
+ merged.forEach((c, i) => {
148
+ // Drop childless splits (e.g. left behind by a move) — they would otherwise
149
+ // render as a flex-growing blank pane (see isInert).
150
+ if (c.type === 'split' && c.children.length === 0)
151
+ return;
152
+ const slot = node.sizes[i] ?? 1;
153
+ if (c.type === 'split' && c.dir === node.dir) {
154
+ const innerTotal = c.sizes.reduce((a, b) => a + b, 0) || c.children.length;
155
+ c.children.forEach((ic, j) => {
156
+ children.push(ic);
157
+ sizes.push(slot * ((c.sizes[j] ?? 1) / innerTotal));
158
+ });
159
+ }
160
+ else {
161
+ children.push(c);
162
+ sizes.push(slot);
163
+ }
164
+ });
165
+ if (children.length === 1)
166
+ return children[0];
167
+ return { ...node, children, sizes };
168
+ }
169
+ /** Move `dragId` to the given edge of `targetId`, returning a normalized tree.
170
+ * No-op if the ids match or the dragged panel isn't present. */
171
+ export function movePanel(root, dragId, targetId, edge) {
172
+ if (dragId === targetId)
173
+ return root;
174
+ const removed = removePanel(root, dragId);
175
+ if (!removed)
176
+ return root;
177
+ // Moving onto a panel that was just removed-into-nothing can't happen here since
178
+ // targetId stays in the tree; insert beside it.
179
+ return normalize(insertBeside(removed, targetId, panel(dragId), edge));
180
+ }
181
+ /** Index of the nearest non-inert sibling to `from` within `children`, preferring
182
+ * the closer one and, on ties, the one after (right/below). -1 if none expanded. */
183
+ function nearestExpandedSibling(children, from) {
184
+ for (let d = 1; d < children.length; d++) {
185
+ const next = from + d;
186
+ if (next < children.length && !isInert(children[next]))
187
+ return next;
188
+ const prev = from - d;
189
+ if (prev >= 0 && !isInert(children[prev]))
190
+ return prev;
191
+ }
192
+ return -1;
193
+ }
194
+ /**
195
+ * Set the collapsed flag on a single panel, moving its flex weight to (collapse)
196
+ * or back from (expand) its nearest expanded sibling. Without this, collapsing a
197
+ * panel leaves flexbox to spread the freed space across every remaining pane by
198
+ * weight — so a heavy auxiliary pane (e.g. an empty result column) greedily
199
+ * inflates while the panel you're actually working in shrinks, reading as
200
+ * unrecoverable dead space. Keeping the freed space with the neighbor is local and
201
+ * symmetric: a collapse/expand round-trip restores the prior sizes.
202
+ */
203
+ export function setCollapsed(node, id, collapsed) {
204
+ if (node.type === 'panel')
205
+ return node.id === id ? { ...node, collapsed } : node;
206
+ const idx = node.children.findIndex((c) => c.type === 'panel' && c.id === id);
207
+ if (idx === -1)
208
+ return { ...node, children: node.children.map((c) => setCollapsed(c, id, collapsed)) };
209
+ const cur = node.children[idx];
210
+ if (Boolean(cur.collapsed) === collapsed)
211
+ return node; // no transition — don't drift sizes
212
+ const children = node.children.map((c, i) => (i === idx ? { ...cur, collapsed } : c));
213
+ const sizes = [...node.sizes];
214
+ const sib = nearestExpandedSibling(children, idx);
215
+ if (sib !== -1) {
216
+ const w = sizes[idx] ?? 1;
217
+ sizes[sib] = collapsed ? (sizes[sib] ?? 1) + w : Math.max(0.1, (sizes[sib] ?? 1) - w);
218
+ }
219
+ return { ...node, children, sizes };
220
+ }
221
+ /** Replace a split's child weights (used by the resizer). */
222
+ export function setSizes(node, splitId, sizes) {
223
+ if (node.type === 'panel')
224
+ return node;
225
+ if (node.id === splitId)
226
+ return { ...node, sizes };
227
+ return { ...node, children: node.children.map((c) => setSizes(c, splitId, sizes)) };
228
+ }
229
+ /** Close a panel (remove it from the tree). Splits collapse via removePanel.
230
+ * Returns the tree unchanged if it would empty the surface (never close the last). */
231
+ export function closePanel(root, id) {
232
+ if (collectPanels(root).length <= 1)
233
+ return root;
234
+ return removePanel(root, id) ?? root;
235
+ }
236
+ /** Dock a panel against an edge of the whole surface (top/right/bottom/left).
237
+ * Removes it first if already present, so this also re-docks an open panel. */
238
+ export function addPanelAtEdge(root, id, edge) {
239
+ const base = removePanel(root, id) ?? root;
240
+ const p = panel(id);
241
+ const dir = edge === 'left' || edge === 'right' ? 'row' : 'col';
242
+ const before = edge === 'left' || edge === 'top';
243
+ const node = {
244
+ type: 'split', id: sid(), dir,
245
+ sizes: before ? [1, 3] : [3, 1],
246
+ children: before ? [p, base] : [base, p],
247
+ };
248
+ return normalize(node);
249
+ }
250
+ /** A persisted tree is trusted if it holds a non-empty, duplicate-free SUBSET of
251
+ * `expected`'s panels (panels can be closed, so not all need be present). `isNode`
252
+ * already rejects unknown ids. Otherwise fall back to the default. */
253
+ export function isValidLayout(node, expected = EDITOR_PANEL_IDS) {
254
+ if (!isNode(node, expected))
255
+ return false;
256
+ const ids = collectPanels(node);
257
+ if (ids.length === 0)
258
+ return false;
259
+ return ids.length === new Set(ids).size;
260
+ }
261
+ function isNode(value, expected = EDITOR_PANEL_IDS) {
262
+ if (!value || typeof value !== 'object')
263
+ return false;
264
+ const n = value;
265
+ if (n.type === 'panel')
266
+ return typeof n.id === 'string' && expected.includes(panelKind(n.id));
267
+ if (n.type === 'split') {
268
+ return (typeof n.id === 'string' &&
269
+ Array.isArray(n.children) &&
270
+ Array.isArray(n.sizes) &&
271
+ n.children.length === n.sizes.length &&
272
+ n.children.every((c) => isNode(c, expected)));
273
+ }
274
+ return false;
275
+ }
276
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../dock/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dockable panel layout model (ported from the Marshal web dock, adapted for
3
+ * prompd-web). A surface's panels are leaves in a recursive split tree: a `split`
4
+ * arranges its children left-to-right (`row`) or top-to-bottom (`col`), each child
5
+ * getting a flex weight from `sizes`. Dragging a panel to any edge of another
6
+ * rewrites the tree. The whole tree persists to localStorage.
7
+ *
8
+ * This module is the pure data contract — no React, no DOM, no storage — so the
9
+ * tree ops in `tree.ts` stay unit-testable in isolation. Leaves are single panels
10
+ * (no tab-stacks) by deliberate choice: fewer states, simpler UX.
11
+ */
12
+ export type PanelId = string;
13
+ /** The editor surface's panel KINDS. Most kinds appear at most once, but `editor`
14
+ * may appear multiple times (one per editor group) via instance ids like
15
+ * `editor:2` — see panelKind. Validity is checked against kinds, uniqueness
16
+ * against full ids, so two editor groups coexist while everything else stays single. */
17
+ export declare const EDITOR_PANEL_IDS: readonly ["editor", "params", "result", "agent", "files", "packages", "context", "todos", "dag", "workflows", "terminal", "tests", "problems"];
18
+ /** A panel id is `<kind>` or `<kind>:<instance>` (e.g. `editor:2`). The kind is
19
+ * what's validated against the allowed set; the instance suffix lets one kind
20
+ * (editor) appear more than once in a layout. */
21
+ export declare function panelKind(id: PanelId): string;
22
+ export type SplitDir = 'row' | 'col';
23
+ export interface SplitNode {
24
+ type: 'split';
25
+ /** Stable id so a resize can target this split without a positional path. */
26
+ id: string;
27
+ dir: SplitDir;
28
+ /** Flex weight per child (parallel to `children`); only relative size matters. */
29
+ sizes: number[];
30
+ children: LayoutNode[];
31
+ }
32
+ export interface PanelNode {
33
+ type: 'panel';
34
+ id: PanelId;
35
+ /** Collapsed panels render as a thin click-to-expand rail and take no weight. */
36
+ collapsed?: boolean;
37
+ }
38
+ export type LayoutNode = SplitNode | PanelNode;
39
+ /** Which edge of a target panel a dragged panel was dropped on. Left/right open a
40
+ * `row` split, top/bottom a `col` split; left/top place the dropped panel first. */
41
+ export type DropEdge = 'top' | 'right' | 'bottom' | 'left';
42
+ /** Bounds for a peek overlay's resized extent (px). Kept here, beside the data
43
+ * contract, so the live hook, the persistence layer, and the saved-layout store
44
+ * all clamp identically — no drift between where a size is set and re-read. */
45
+ export declare const OVERLAY_MIN_PX = 220;
46
+ export declare const OVERLAY_MAX_PX = 900;
47
+ export declare const clampOverlaySize: (px: number) => number;
48
+ /** Coerce a persisted/incoming overlay-size map to finite, clamped numbers,
49
+ * dropping anything malformed (NaN, Infinity, non-numbers). */
50
+ export declare function sanitizeOverlaySizes(value: unknown): Record<PanelId, number>;
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../dock/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;;wFAGwF;AACxF,eAAO,MAAM,gBAAgB,gJAAiJ,CAAC;AAE/K;;iDAEiD;AACjD,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAG7C;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,QAAQ,CAAC;IACd,kFAAkF;IAClF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/C;oFACoF;AACpF,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D;;+EAE+E;AAC/E,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,KAAG,MAAgE,CAAC;AAE/G;+DAC+D;AAC/D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAO5E"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Dockable panel layout model (ported from the Marshal web dock, adapted for
3
+ * prompd-web). A surface's panels are leaves in a recursive split tree: a `split`
4
+ * arranges its children left-to-right (`row`) or top-to-bottom (`col`), each child
5
+ * getting a flex weight from `sizes`. Dragging a panel to any edge of another
6
+ * rewrites the tree. The whole tree persists to localStorage.
7
+ *
8
+ * This module is the pure data contract — no React, no DOM, no storage — so the
9
+ * tree ops in `tree.ts` stay unit-testable in isolation. Leaves are single panels
10
+ * (no tab-stacks) by deliberate choice: fewer states, simpler UX.
11
+ */
12
+ /** The editor surface's panel KINDS. Most kinds appear at most once, but `editor`
13
+ * may appear multiple times (one per editor group) via instance ids like
14
+ * `editor:2` — see panelKind. Validity is checked against kinds, uniqueness
15
+ * against full ids, so two editor groups coexist while everything else stays single. */
16
+ export const EDITOR_PANEL_IDS = ['editor', 'params', 'result', 'agent', 'files', 'packages', 'context', 'todos', 'dag', 'workflows', 'terminal', 'tests', 'problems'];
17
+ /** A panel id is `<kind>` or `<kind>:<instance>` (e.g. `editor:2`). The kind is
18
+ * what's validated against the allowed set; the instance suffix lets one kind
19
+ * (editor) appear more than once in a layout. */
20
+ export function panelKind(id) {
21
+ const i = id.indexOf(':');
22
+ return i === -1 ? id : id.slice(0, i);
23
+ }
24
+ /** Bounds for a peek overlay's resized extent (px). Kept here, beside the data
25
+ * contract, so the live hook, the persistence layer, and the saved-layout store
26
+ * all clamp identically — no drift between where a size is set and re-read. */
27
+ export const OVERLAY_MIN_PX = 220;
28
+ export const OVERLAY_MAX_PX = 900;
29
+ export const clampOverlaySize = (px) => Math.min(OVERLAY_MAX_PX, Math.max(OVERLAY_MIN_PX, px));
30
+ /** Coerce a persisted/incoming overlay-size map to finite, clamped numbers,
31
+ * dropping anything malformed (NaN, Infinity, non-numbers). */
32
+ export function sanitizeOverlaySizes(value) {
33
+ if (!value || typeof value !== 'object')
34
+ return {};
35
+ const out = {};
36
+ for (const [k, v] of Object.entries(value)) {
37
+ if (typeof v === 'number' && Number.isFinite(v))
38
+ out[k] = clampOverlaySize(v);
39
+ }
40
+ return out;
41
+ }
42
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../dock/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;wFAGwF;AACxF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AAE/K;;iDAEiD;AACjD,MAAM,UAAU,SAAS,CAAC,EAAW;IACnC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AA2BD;;+EAE+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/G;+DAC+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type PresetName } from './tree';
2
+ import { type DropEdge, type LayoutNode, type PanelId } from './types';
3
+ /** What the layout hook needs — the panel set, where it persists, and a default.
4
+ * Decoupled from the live PanelDef registry (which the host receives directly), so
5
+ * this can be memoized stably while panel bodies re-render freely. */
6
+ export interface DockLayoutConfig {
7
+ ids: readonly PanelId[];
8
+ storageKey: string;
9
+ makeDefault: () => LayoutNode;
10
+ }
11
+ export interface DockApi {
12
+ tree: LayoutNode;
13
+ /** Which preset is active (null once the user hand-edits the layout). */
14
+ preset: PresetName | null;
15
+ move: (dragId: PanelId, targetId: PanelId, edge: DropEdge) => void;
16
+ collapse: (id: PanelId, collapsed: boolean) => void;
17
+ resize: (splitId: string, sizes: number[]) => void;
18
+ /** Remove a panel from the surface. */
19
+ close: (id: PanelId) => void;
20
+ /** Dock a (usually closed) panel against a surface edge. */
21
+ addPanel: (id: PanelId, edge: DropEdge) => void;
22
+ /** Insert a new panel beside an existing target (used to split the editor). */
23
+ splitBeside: (id: PanelId, targetId: PanelId, edge: DropEdge) => void;
24
+ /** Panel ids currently in the tree. */
25
+ openPanels: () => PanelId[];
26
+ applyPreset: (name: PresetName) => void;
27
+ reset: () => void;
28
+ /** Persisted extent (px) of each panel's peek overlay — width on a left/right
29
+ * edge, height on top/bottom. Empty until the user resizes one. */
30
+ overlaySizes: Record<PanelId, number>;
31
+ /** Remember a panel's peek-overlay extent (px) for this layout. */
32
+ setOverlaySize: (id: PanelId, px: number) => void;
33
+ }
34
+ /**
35
+ * A dock surface's persisted layout plus the actions that rewrite it. Drag-to-dock,
36
+ * collapse, resize, and the one-tap presets all funnel through the pure tree ops;
37
+ * every change is written back to localStorage. Hand-edits clear the active preset
38
+ * so the toolbar reflects "custom".
39
+ */
40
+ export declare function useDockLayout(cfg: DockLayoutConfig): DockApi;
41
+ //# sourceMappingURL=use-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-layout.d.ts","sourceRoot":"","sources":["../../dock/use-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAiI,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAExK,OAAO,EAA0C,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAG/G;;sEAEsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,UAAU,CAAC;CAC/B;AAsBD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,uCAAuC;IACvC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChD,+EAA+E;IAC/E,WAAW,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtE,uCAAuC;IACvC,UAAU,EAAE,MAAM,OAAO,EAAE,CAAC;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;uEACmE;IACnE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,mEAAmE;IACnE,cAAc,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CA+E5D"}
@@ -0,0 +1,114 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { isValidLayout, movePanel, setCollapsed, setSizes, closePanel, addPanelAtEdge, insertBeside, normalize, collectPanels, PRESETS } from './tree';
3
+ import { saveLayout, getLayout } from './layouts';
4
+ import { clampOverlaySize, sanitizeOverlaySizes } from './types';
5
+ import { safeLocalStorageSet } from '@corenel/tools-web/storageHealth';
6
+ function load(cfg) {
7
+ try {
8
+ const raw = localStorage.getItem(cfg.storageKey);
9
+ if (raw) {
10
+ const parsed = JSON.parse(raw);
11
+ if (parsed && isValidLayout(parsed.tree, cfg.ids)) {
12
+ // Normalize on load so any degenerate structure persisted by an earlier
13
+ // version (childless or single-child splits, redundant same-dir nesting)
14
+ // is cleaned up — it would otherwise render as a blank growing pane.
15
+ return { tree: normalize(parsed.tree), preset: parsed.preset ?? null, overlaySizes: sanitizeOverlaySizes(parsed.overlaySizes) };
16
+ }
17
+ }
18
+ }
19
+ catch {
20
+ // fall through to default
21
+ }
22
+ return { tree: cfg.makeDefault(), preset: 'editor', overlaySizes: {} };
23
+ }
24
+ /**
25
+ * A dock surface's persisted layout plus the actions that rewrite it. Drag-to-dock,
26
+ * collapse, resize, and the one-tap presets all funnel through the pure tree ops;
27
+ * every change is written back to localStorage. Hand-edits clear the active preset
28
+ * so the toolbar reflects "custom".
29
+ */
30
+ export function useDockLayout(cfg) {
31
+ const initial = useRef(load(cfg)).current;
32
+ const [tree, setTree] = useState(initial.tree);
33
+ const [preset, setPreset] = useState(initial.preset);
34
+ const [overlaySizes, setOverlaySizes] = useState(initial.overlaySizes);
35
+ const treeRef = useRef(tree);
36
+ treeRef.current = tree;
37
+ const overlaySizesRef = useRef(overlaySizes);
38
+ overlaySizesRef.current = overlaySizes;
39
+ useEffect(() => {
40
+ const value = { v: 1, tree, preset, overlaySizes };
41
+ // Fails soft + reports storage-full (so the UI can explain why a layout didn't
42
+ // stick) instead of silently dropping the write.
43
+ safeLocalStorageSet(cfg.storageKey, JSON.stringify(value));
44
+ }, [cfg.storageKey, tree, preset, overlaySizes]);
45
+ // Layout control from Settings (which doesn't hold the dock api) via events:
46
+ // reset, apply a preset, save the current tree, load a saved one.
47
+ useEffect(() => {
48
+ const detailName = (e) => e.detail?.name;
49
+ const onReset = () => { setTree(cfg.makeDefault()); setPreset('editor'); setOverlaySizes({}); };
50
+ const onPreset = (e) => { const n = detailName(e); if (n && n in PRESETS) {
51
+ setTree(PRESETS[n]());
52
+ setPreset(n);
53
+ } };
54
+ const onSave = (e) => { const n = detailName(e); if (n)
55
+ saveLayout(n, treeRef.current, overlaySizesRef.current); };
56
+ const onLoad = (e) => {
57
+ const n = detailName(e);
58
+ const saved = n ? getLayout(n) : null;
59
+ if (saved) {
60
+ setTree(saved.tree);
61
+ setOverlaySizes(saved.overlaySizes ?? {});
62
+ setPreset(null);
63
+ }
64
+ };
65
+ window.addEventListener('prompd:reset-layout', onReset);
66
+ window.addEventListener('prompd:apply-preset', onPreset);
67
+ window.addEventListener('prompd:save-layout', onSave);
68
+ window.addEventListener('prompd:load-layout', onLoad);
69
+ return () => {
70
+ window.removeEventListener('prompd:reset-layout', onReset);
71
+ window.removeEventListener('prompd:apply-preset', onPreset);
72
+ window.removeEventListener('prompd:save-layout', onSave);
73
+ window.removeEventListener('prompd:load-layout', onLoad);
74
+ };
75
+ }, [cfg]);
76
+ const move = useCallback((dragId, targetId, edge) => {
77
+ setTree((t) => movePanel(t, dragId, targetId, edge));
78
+ setPreset(null);
79
+ }, []);
80
+ const collapse = useCallback((id, collapsed) => {
81
+ setTree((t) => setCollapsed(t, id, collapsed));
82
+ setPreset(null);
83
+ }, []);
84
+ const resize = useCallback((splitId, sizes) => {
85
+ setTree((t) => setSizes(t, splitId, sizes));
86
+ }, []);
87
+ const close = useCallback((id) => {
88
+ setTree((t) => closePanel(t, id));
89
+ setPreset(null);
90
+ }, []);
91
+ const addPanel = useCallback((id, edge) => {
92
+ setTree((t) => addPanelAtEdge(t, id, edge));
93
+ setPreset(null);
94
+ }, []);
95
+ const splitBeside = useCallback((id, targetId, edge) => {
96
+ setTree((t) => normalize(insertBeside(t, targetId, { type: 'panel', id }, edge)));
97
+ setPreset(null);
98
+ }, []);
99
+ const openPanels = useCallback(() => collectPanels(tree), [tree]);
100
+ const applyPreset = useCallback((name) => {
101
+ setTree(PRESETS[name]());
102
+ setPreset(name);
103
+ }, []);
104
+ const reset = useCallback(() => {
105
+ setTree(cfg.makeDefault());
106
+ setPreset('editor');
107
+ setOverlaySizes({});
108
+ }, [cfg]);
109
+ const setOverlaySize = useCallback((id, px) => {
110
+ setOverlaySizes((s) => ({ ...s, [id]: clampOverlaySize(Math.round(px)) }));
111
+ }, []);
112
+ return { tree, preset, move, collapse, resize, close, addPanel, splitBeside, openPanels, applyPreset, reset, overlaySizes, setOverlaySize };
113
+ }
114
+ //# sourceMappingURL=use-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-layout.js","sourceRoot":"","sources":["../../dock/use-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { useRunHistory, type RunHistoryApi, type RunHistoryOptions } from './useRunHistory';
2
+ export { useRunOutput, type RunOutputApi, type RunTool } from './useRunOutput';
3
+ export { useRunController, type RunController } from './useRunController';
4
+ export { useDocResults, EMPTY_RESULT, type DocResult, type DocResults, type DocResultApi } from './useDocResults';
5
+ export type { RunState, RunMeta, ErrorAction } from './runModel';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../engine/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClH,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /* The editor engine — run/build/compile/persistence state extracted from
2
+ * prompd-web's EditorApp as injectable hooks (see docs/editor-decomposition.md).
3
+ * Starts with run history; the run/build/compile engine follows. */
4
+ export { useRunHistory } from './useRunHistory';
5
+ export { useRunOutput } from './useRunOutput';
6
+ export { useRunController } from './useRunController';
7
+ export { useDocResults, EMPTY_RESULT } from './useDocResults';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../engine/index.ts"],"names":[],"mappings":"AAAA;;oEAEoE;AACpE,OAAO,EAAE,aAAa,EAA8C,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAmC,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAsD,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type RunState = 'idle' | 'running' | 'done' | 'error';
2
+ /** Token/cost/latency telemetry for a run, shown in the Result panel. */
3
+ export interface RunMeta {
4
+ inTok?: number;
5
+ outTok?: number | null;
6
+ ms?: number | null;
7
+ cost?: number | null;
8
+ source?: 'backend' | 'preview' | null;
9
+ }
10
+ /** CTA for a guard-blocked run (e.g. "Sign in to run"). */
11
+ export interface ErrorAction {
12
+ title?: string;
13
+ label: string;
14
+ onClick: () => void;
15
+ }
16
+ //# sourceMappingURL=runModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runModel.d.ts","sourceRoot":"","sources":["../../engine/runModel.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7D,yEAAyE;AACzE,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;CACvC;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
@@ -0,0 +1,7 @@
1
+ /* Prompt-run view-model vocabulary — the state shapes a single-prompt run flows
2
+ * through (status, token/cost telemetry, the guard-blocked CTA). Zero-dependency
3
+ * types shared by the editor engine and the Result panel. The workflow + test
4
+ * run-models (WorkflowRun/TestRun) are their subsystems' view-models and live
5
+ * with those subsystems, not here. */
6
+ export {};
7
+ //# sourceMappingURL=runModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runModel.js","sourceRoot":"","sources":["../../engine/runModel.ts"],"names":[],"mappings":"AAAA;;;;sCAIsC"}