@miragon/mcp-toolkit-ui 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/builder/BuilderBanners.d.ts +19 -0
- package/dist/app/builder/BuilderBanners.d.ts.map +1 -0
- package/dist/app/builder/BuilderBanners.js +22 -0
- package/dist/app/builder/BuilderBanners.js.map +1 -0
- package/dist/app/builder/CanvasRow.d.ts +26 -0
- package/dist/app/builder/CanvasRow.d.ts.map +1 -0
- package/dist/app/builder/CanvasRow.js +98 -0
- package/dist/app/builder/CanvasRow.js.map +1 -0
- package/dist/app/builder/CellPropsSheet.d.ts +19 -0
- package/dist/app/builder/CellPropsSheet.d.ts.map +1 -0
- package/dist/app/builder/CellPropsSheet.js +28 -0
- package/dist/app/builder/CellPropsSheet.js.map +1 -0
- package/dist/app/builder/EmptyHint.d.ts +6 -0
- package/dist/app/builder/EmptyHint.d.ts.map +1 -0
- package/dist/app/builder/EmptyHint.js +10 -0
- package/dist/app/builder/EmptyHint.js.map +1 -0
- package/dist/app/builder/LayoutSurface.d.ts +27 -0
- package/dist/app/builder/LayoutSurface.d.ts.map +1 -0
- package/dist/app/builder/LayoutSurface.js +45 -0
- package/dist/app/builder/LayoutSurface.js.map +1 -0
- package/dist/app/builder/Workspace.d.ts +9 -3
- package/dist/app/builder/Workspace.d.ts.map +1 -1
- package/dist/app/builder/Workspace.js +3 -97
- package/dist/app/builder/Workspace.js.map +1 -1
- package/dist/app/builder/builder-reducer.d.ts.map +1 -1
- package/dist/app/builder/builder-reducer.js +176 -164
- package/dist/app/builder/builder-reducer.js.map +1 -1
- package/dist/app/builder/use-builder-catalogue.d.ts +33 -0
- package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -0
- package/dist/app/builder/use-builder-catalogue.js +155 -0
- package/dist/app/builder/use-builder-catalogue.js.map +1 -0
- package/dist/app/builder/use-key-step-entries.d.ts +22 -0
- package/dist/app/builder/use-key-step-entries.d.ts.map +1 -0
- package/dist/app/builder/use-key-step-entries.js +46 -0
- package/dist/app/builder/use-key-step-entries.js.map +1 -0
- package/dist/app/builder/use-save-dashboard.d.ts +33 -0
- package/dist/app/builder/use-save-dashboard.d.ts.map +1 -0
- package/dist/app/builder/use-save-dashboard.js +78 -0
- package/dist/app/builder/use-save-dashboard.js.map +1 -0
- package/dist/app/layout-builder.d.ts.map +1 -1
- package/dist/app/layout-builder.js +46 -277
- package/dist/app/layout-builder.js.map +1 -1
- package/dist/app/mcp-app-view-chrome.d.ts +77 -0
- package/dist/app/mcp-app-view-chrome.d.ts.map +1 -0
- package/dist/app/mcp-app-view-chrome.js +53 -0
- package/dist/app/mcp-app-view-chrome.js.map +1 -0
- package/dist/app/mcp-app-view.d.ts +3 -9
- package/dist/app/mcp-app-view.d.ts.map +1 -1
- package/dist/app/mcp-app-view.js +4 -31
- package/dist/app/mcp-app-view.js.map +1 -1
- package/dist/render-cases-primitives.d.ts +17 -0
- package/dist/render-cases-primitives.d.ts.map +1 -0
- package/dist/render-cases-primitives.js +88 -0
- package/dist/render-cases-primitives.js.map +1 -0
- package/dist/render-cases.d.ts +4 -0
- package/dist/render-cases.d.ts.map +1 -0
- package/dist/render-cases.js +140 -0
- package/dist/render-cases.js.map +1 -0
- package/package.json +10 -5
- package/src/app/builder/BuilderBanners.tsx +61 -0
- package/src/app/builder/CanvasRow.tsx +316 -0
- package/src/app/builder/CellPropsSheet.tsx +47 -0
- package/src/app/builder/EmptyHint.tsx +29 -0
- package/src/app/builder/LayoutSurface.tsx +140 -0
- package/src/app/builder/Workspace.tsx +33 -342
- package/src/app/builder/builder-reducer.ts +204 -170
- package/src/app/builder/use-builder-catalogue.ts +187 -0
- package/src/app/builder/use-key-step-entries.ts +60 -0
- package/src/app/builder/use-save-dashboard.ts +97 -0
- package/src/app/layout-builder.tsx +92 -497
- package/src/app/mcp-app-view-chrome.tsx +204 -0
- package/src/app/mcp-app-view.tsx +32 -140
- package/src/lib/parse-tool-result.property.test.ts +90 -0
- package/src/render-cases-primitives.tsx +255 -0
- package/src/render-cases.tsx +239 -0
- package/src/render-smoke.test.tsx +100 -0
- package/src/ui-catalog.test.ts +52 -0
|
@@ -29,173 +29,185 @@ function mapActiveRows(draft, activeTabIndex, fn) {
|
|
|
29
29
|
const tabs = draft.tabs.map((t, idx) => (idx === activeTabIndex ? { ...t, rows: fn(t.rows) } : t));
|
|
30
30
|
return { kind: "tabs", tabs };
|
|
31
31
|
}
|
|
32
|
+
function addWidgetToRow(state, action) {
|
|
33
|
+
const rows = activeRowsOf(state.draft, state.activeTabIndex);
|
|
34
|
+
const safeLen = rows.length > 0 ? rows.length : 1;
|
|
35
|
+
const idx = Math.min(Math.max(action.targetRowIdx ?? state.focusedRowIndex, 0), safeLen - 1);
|
|
36
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rs) => {
|
|
37
|
+
const safeRows = rs.length > 0 ? rs : emptyRows();
|
|
38
|
+
return safeRows.map((r, i) => i === idx ? { row: [...r.row, { widget: action.widgetId, span: action.defaultSpan }] } : r);
|
|
39
|
+
});
|
|
40
|
+
return { ...state, draft, focusedRowIndex: idx };
|
|
41
|
+
}
|
|
42
|
+
function addRow(state) {
|
|
43
|
+
let newIndex = state.focusedRowIndex;
|
|
44
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => {
|
|
45
|
+
const next = [...rows, { row: [] }];
|
|
46
|
+
newIndex = next.length - 1;
|
|
47
|
+
return next;
|
|
48
|
+
});
|
|
49
|
+
return { ...state, draft, focusedRowIndex: newIndex };
|
|
50
|
+
}
|
|
51
|
+
function removeRow(state, action) {
|
|
52
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => {
|
|
53
|
+
const next = rows.filter((_, i) => i !== action.rowIdx);
|
|
54
|
+
return next.length > 0 ? next : emptyRows();
|
|
55
|
+
});
|
|
56
|
+
// Matches the previous behaviour: decrement, floored at 0. Finding [9]
|
|
57
|
+
// clamping is scoped to tab switch / removeTab, so this stays as-is.
|
|
58
|
+
return { ...state, draft, focusedRowIndex: Math.max(0, state.focusedRowIndex - 1) };
|
|
59
|
+
}
|
|
60
|
+
function moveRow(state, action) {
|
|
61
|
+
const target = action.rowIdx + action.direction;
|
|
62
|
+
const rows = activeRowsOf(state.draft, state.activeTabIndex);
|
|
63
|
+
if (target < 0 || target >= rows.length)
|
|
64
|
+
return state;
|
|
65
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rs) => {
|
|
66
|
+
const next = [...rs];
|
|
67
|
+
const [moved] = next.splice(action.rowIdx, 1);
|
|
68
|
+
if (!moved)
|
|
69
|
+
return rs;
|
|
70
|
+
next.splice(target, 0, moved);
|
|
71
|
+
return next;
|
|
72
|
+
});
|
|
73
|
+
return { ...state, draft, focusedRowIndex: target };
|
|
74
|
+
}
|
|
75
|
+
function setCellSpan(state, action) {
|
|
76
|
+
const clamped = Math.max(1, Math.min(12, action.span));
|
|
77
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx
|
|
78
|
+
? { row: r.row.map((c, j) => (j === action.cellIdx ? { ...c, span: clamped } : c)) }
|
|
79
|
+
: r));
|
|
80
|
+
return { ...state, draft };
|
|
81
|
+
}
|
|
82
|
+
function removeCell(state, action) {
|
|
83
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx ? { row: r.row.filter((_, j) => j !== action.cellIdx) } : r));
|
|
84
|
+
return { ...state, draft };
|
|
85
|
+
}
|
|
86
|
+
function setCellProps(state, action) {
|
|
87
|
+
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx
|
|
88
|
+
? {
|
|
89
|
+
row: r.row.map((c, j) => {
|
|
90
|
+
if (j !== action.cellIdx)
|
|
91
|
+
return c;
|
|
92
|
+
if (action.next === undefined) {
|
|
93
|
+
const rest = { widget: c.widget };
|
|
94
|
+
if (c.span !== undefined)
|
|
95
|
+
rest.span = c.span;
|
|
96
|
+
return rest;
|
|
97
|
+
}
|
|
98
|
+
return { ...c, props: action.next };
|
|
99
|
+
}),
|
|
100
|
+
}
|
|
101
|
+
: r));
|
|
102
|
+
return { ...state, draft };
|
|
103
|
+
}
|
|
104
|
+
function setFocusedRow(state, action) {
|
|
105
|
+
return { ...state, focusedRowIndex: Math.max(0, action.rowIdx) };
|
|
106
|
+
}
|
|
107
|
+
function selectTab(state, action) {
|
|
108
|
+
if (state.draft.kind !== "tabs")
|
|
109
|
+
return state;
|
|
110
|
+
if (action.tabIdx < 0 || action.tabIdx >= state.draft.tabs.length)
|
|
111
|
+
return state;
|
|
112
|
+
const rows = state.draft.tabs[action.tabIdx]?.rows ?? [];
|
|
113
|
+
return {
|
|
114
|
+
...state,
|
|
115
|
+
activeTabIndex: action.tabIdx,
|
|
116
|
+
focusedRowIndex: clampRowIndex(state.focusedRowIndex, rows.length),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function startEditingTab(state, action) {
|
|
120
|
+
return { ...state, editingTabIdx: action.tabIdx };
|
|
121
|
+
}
|
|
122
|
+
function stopEditingTab(state) {
|
|
123
|
+
return { ...state, editingTabIdx: null };
|
|
124
|
+
}
|
|
125
|
+
function addTab(state) {
|
|
126
|
+
if (state.draft.kind === "tabs") {
|
|
127
|
+
const label = `Tab ${state.draft.tabs.length + 1}`;
|
|
128
|
+
const nextTabs = [...state.draft.tabs, { label, rows: emptyRows() }];
|
|
129
|
+
return {
|
|
130
|
+
...state,
|
|
131
|
+
draft: { kind: "tabs", tabs: nextTabs },
|
|
132
|
+
activeTabIndex: nextTabs.length - 1,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const seededTabs = [
|
|
136
|
+
{ label: "Tab 1", rows: state.draft.rows },
|
|
137
|
+
{ label: "Tab 2", rows: emptyRows() },
|
|
138
|
+
];
|
|
139
|
+
return { ...state, draft: { kind: "tabs", tabs: seededTabs }, activeTabIndex: 1 };
|
|
140
|
+
}
|
|
141
|
+
function renameTab(state, action) {
|
|
142
|
+
const trimmed = action.label.trim();
|
|
143
|
+
if (!trimmed)
|
|
144
|
+
return state;
|
|
145
|
+
if (state.draft.kind !== "tabs")
|
|
146
|
+
return state;
|
|
147
|
+
// Reject duplicates — Tabs keys by label, collisions break the
|
|
148
|
+
// component. Signal the rejection so the UI can give feedback; the
|
|
149
|
+
// old label stays put.
|
|
150
|
+
if (state.draft.tabs.some((t, i) => i !== action.tabIdx && t.label === trimmed)) {
|
|
151
|
+
return { ...state, renameRejectedAt: state.renameRejectedAt + 1 };
|
|
152
|
+
}
|
|
153
|
+
const tabs = state.draft.tabs.map((t, i) => (i === action.tabIdx ? { ...t, label: trimmed } : t));
|
|
154
|
+
return { ...state, draft: { kind: "tabs", tabs } };
|
|
155
|
+
}
|
|
156
|
+
function removeTab(state, action) {
|
|
157
|
+
if (state.draft.kind !== "tabs")
|
|
158
|
+
return state;
|
|
159
|
+
const tabs = state.draft.tabs.filter((_, i) => i !== action.tabIdx);
|
|
160
|
+
// One tab left collapses back to a flat draft (zero left: a flat empty one).
|
|
161
|
+
if (tabs.length <= 1) {
|
|
162
|
+
const draft = { kind: "rows", rows: tabs[0]?.rows ?? emptyRows() };
|
|
163
|
+
return {
|
|
164
|
+
...state,
|
|
165
|
+
draft,
|
|
166
|
+
activeTabIndex: 0,
|
|
167
|
+
editingTabIdx: null,
|
|
168
|
+
focusedRowIndex: clampRowIndex(state.focusedRowIndex, draft.rows.length),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const activeTabIndex = clampRowIndex(state.activeTabIndex, tabs.length);
|
|
172
|
+
const rows = tabs[activeTabIndex]?.rows ?? [];
|
|
173
|
+
return {
|
|
174
|
+
...state,
|
|
175
|
+
draft: { kind: "tabs", tabs },
|
|
176
|
+
activeTabIndex,
|
|
177
|
+
editingTabIdx: null,
|
|
178
|
+
focusedRowIndex: clampRowIndex(state.focusedRowIndex, rows.length),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
32
181
|
// -------------------------------------------------------------------------- //
|
|
33
182
|
// Reducer
|
|
34
183
|
// -------------------------------------------------------------------------- //
|
|
184
|
+
/**
|
|
185
|
+
* Dispatch table instead of a switch: one small handler per action. The
|
|
186
|
+
* mapped type keeps it exhaustive — a new `BuilderAction` variant without a
|
|
187
|
+
* matching entry is a type error (the table equivalent of the old switch's
|
|
188
|
+
* `never` default).
|
|
189
|
+
*/
|
|
190
|
+
const handlers = {
|
|
191
|
+
addWidgetToRow,
|
|
192
|
+
addRow,
|
|
193
|
+
removeRow,
|
|
194
|
+
moveRow,
|
|
195
|
+
setCellSpan,
|
|
196
|
+
removeCell,
|
|
197
|
+
setCellProps,
|
|
198
|
+
setFocusedRow,
|
|
199
|
+
selectTab,
|
|
200
|
+
startEditingTab,
|
|
201
|
+
stopEditingTab,
|
|
202
|
+
addTab,
|
|
203
|
+
renameTab,
|
|
204
|
+
removeTab,
|
|
205
|
+
};
|
|
35
206
|
export function draftReducer(state, action) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rs) => {
|
|
42
|
-
const safeRows = rs.length > 0 ? rs : emptyRows();
|
|
43
|
-
return safeRows.map((r, i) => i === idx
|
|
44
|
-
? { row: [...r.row, { widget: action.widgetId, span: action.defaultSpan }] }
|
|
45
|
-
: r);
|
|
46
|
-
});
|
|
47
|
-
return { ...state, draft, focusedRowIndex: idx };
|
|
48
|
-
}
|
|
49
|
-
case "addRow": {
|
|
50
|
-
let newIndex = state.focusedRowIndex;
|
|
51
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => {
|
|
52
|
-
const next = [...rows, { row: [] }];
|
|
53
|
-
newIndex = next.length - 1;
|
|
54
|
-
return next;
|
|
55
|
-
});
|
|
56
|
-
return { ...state, draft, focusedRowIndex: newIndex };
|
|
57
|
-
}
|
|
58
|
-
case "removeRow": {
|
|
59
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => {
|
|
60
|
-
const next = rows.filter((_, i) => i !== action.rowIdx);
|
|
61
|
-
return next.length > 0 ? next : emptyRows();
|
|
62
|
-
});
|
|
63
|
-
// Matches the previous behaviour: decrement, floored at 0. Finding [9]
|
|
64
|
-
// clamping is scoped to tab switch / removeTab, so this stays as-is.
|
|
65
|
-
return { ...state, draft, focusedRowIndex: Math.max(0, state.focusedRowIndex - 1) };
|
|
66
|
-
}
|
|
67
|
-
case "moveRow": {
|
|
68
|
-
const target = action.rowIdx + action.direction;
|
|
69
|
-
const rows = activeRowsOf(state.draft, state.activeTabIndex);
|
|
70
|
-
if (target < 0 || target >= rows.length)
|
|
71
|
-
return state;
|
|
72
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rs) => {
|
|
73
|
-
const next = [...rs];
|
|
74
|
-
const [moved] = next.splice(action.rowIdx, 1);
|
|
75
|
-
if (!moved)
|
|
76
|
-
return rs;
|
|
77
|
-
next.splice(target, 0, moved);
|
|
78
|
-
return next;
|
|
79
|
-
});
|
|
80
|
-
return { ...state, draft, focusedRowIndex: target };
|
|
81
|
-
}
|
|
82
|
-
case "setCellSpan": {
|
|
83
|
-
const clamped = Math.max(1, Math.min(12, action.span));
|
|
84
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx
|
|
85
|
-
? { row: r.row.map((c, j) => (j === action.cellIdx ? { ...c, span: clamped } : c)) }
|
|
86
|
-
: r));
|
|
87
|
-
return { ...state, draft };
|
|
88
|
-
}
|
|
89
|
-
case "removeCell": {
|
|
90
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx ? { row: r.row.filter((_, j) => j !== action.cellIdx) } : r));
|
|
91
|
-
return { ...state, draft };
|
|
92
|
-
}
|
|
93
|
-
case "setCellProps": {
|
|
94
|
-
const draft = mapActiveRows(state.draft, state.activeTabIndex, (rows) => rows.map((r, i) => i === action.rowIdx
|
|
95
|
-
? {
|
|
96
|
-
row: r.row.map((c, j) => {
|
|
97
|
-
if (j !== action.cellIdx)
|
|
98
|
-
return c;
|
|
99
|
-
if (action.next === undefined) {
|
|
100
|
-
const rest = { widget: c.widget };
|
|
101
|
-
if (c.span !== undefined)
|
|
102
|
-
rest.span = c.span;
|
|
103
|
-
return rest;
|
|
104
|
-
}
|
|
105
|
-
return { ...c, props: action.next };
|
|
106
|
-
}),
|
|
107
|
-
}
|
|
108
|
-
: r));
|
|
109
|
-
return { ...state, draft };
|
|
110
|
-
}
|
|
111
|
-
case "setFocusedRow":
|
|
112
|
-
return { ...state, focusedRowIndex: Math.max(0, action.rowIdx) };
|
|
113
|
-
case "selectTab": {
|
|
114
|
-
if (state.draft.kind !== "tabs")
|
|
115
|
-
return state;
|
|
116
|
-
if (action.tabIdx < 0 || action.tabIdx >= state.draft.tabs.length)
|
|
117
|
-
return state;
|
|
118
|
-
const rows = state.draft.tabs[action.tabIdx]?.rows ?? [];
|
|
119
|
-
return {
|
|
120
|
-
...state,
|
|
121
|
-
activeTabIndex: action.tabIdx,
|
|
122
|
-
focusedRowIndex: clampRowIndex(state.focusedRowIndex, rows.length),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
case "startEditingTab":
|
|
126
|
-
return { ...state, editingTabIdx: action.tabIdx };
|
|
127
|
-
case "stopEditingTab":
|
|
128
|
-
return { ...state, editingTabIdx: null };
|
|
129
|
-
case "addTab": {
|
|
130
|
-
if (state.draft.kind === "tabs") {
|
|
131
|
-
const label = `Tab ${state.draft.tabs.length + 1}`;
|
|
132
|
-
const nextTabs = [...state.draft.tabs, { label, rows: emptyRows() }];
|
|
133
|
-
return {
|
|
134
|
-
...state,
|
|
135
|
-
draft: { kind: "tabs", tabs: nextTabs },
|
|
136
|
-
activeTabIndex: nextTabs.length - 1,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
const seededTabs = [
|
|
140
|
-
{ label: "Tab 1", rows: state.draft.rows },
|
|
141
|
-
{ label: "Tab 2", rows: emptyRows() },
|
|
142
|
-
];
|
|
143
|
-
return { ...state, draft: { kind: "tabs", tabs: seededTabs }, activeTabIndex: 1 };
|
|
144
|
-
}
|
|
145
|
-
case "renameTab": {
|
|
146
|
-
const trimmed = action.label.trim();
|
|
147
|
-
if (!trimmed)
|
|
148
|
-
return state;
|
|
149
|
-
if (state.draft.kind !== "tabs")
|
|
150
|
-
return state;
|
|
151
|
-
// Reject duplicates — Tabs keys by label, collisions break the
|
|
152
|
-
// component. Signal the rejection so the UI can give feedback; the
|
|
153
|
-
// old label stays put.
|
|
154
|
-
if (state.draft.tabs.some((t, i) => i !== action.tabIdx && t.label === trimmed)) {
|
|
155
|
-
return { ...state, renameRejectedAt: state.renameRejectedAt + 1 };
|
|
156
|
-
}
|
|
157
|
-
const tabs = state.draft.tabs.map((t, i) => i === action.tabIdx ? { ...t, label: trimmed } : t);
|
|
158
|
-
return { ...state, draft: { kind: "tabs", tabs } };
|
|
159
|
-
}
|
|
160
|
-
case "removeTab": {
|
|
161
|
-
if (state.draft.kind !== "tabs")
|
|
162
|
-
return state;
|
|
163
|
-
const tabs = state.draft.tabs.filter((_, i) => i !== action.tabIdx);
|
|
164
|
-
const activeTabIndex = clampRowIndex(state.activeTabIndex, tabs.length);
|
|
165
|
-
if (tabs.length === 0) {
|
|
166
|
-
const draft = { kind: "rows", rows: emptyRows() };
|
|
167
|
-
return {
|
|
168
|
-
...state,
|
|
169
|
-
draft,
|
|
170
|
-
activeTabIndex: 0,
|
|
171
|
-
editingTabIdx: null,
|
|
172
|
-
focusedRowIndex: clampRowIndex(state.focusedRowIndex, draft.rows.length),
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
if (tabs.length === 1 && tabs[0]) {
|
|
176
|
-
const draft = { kind: "rows", rows: tabs[0].rows };
|
|
177
|
-
return {
|
|
178
|
-
...state,
|
|
179
|
-
draft,
|
|
180
|
-
activeTabIndex: 0,
|
|
181
|
-
editingTabIdx: null,
|
|
182
|
-
focusedRowIndex: clampRowIndex(state.focusedRowIndex, draft.rows.length),
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
const rows = tabs[activeTabIndex]?.rows ?? [];
|
|
186
|
-
return {
|
|
187
|
-
...state,
|
|
188
|
-
draft: { kind: "tabs", tabs },
|
|
189
|
-
activeTabIndex,
|
|
190
|
-
editingTabIdx: null,
|
|
191
|
-
focusedRowIndex: clampRowIndex(state.focusedRowIndex, rows.length),
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
default: {
|
|
195
|
-
// Exhaustiveness guard: a new action type without a case is a type error.
|
|
196
|
-
const _never = action;
|
|
197
|
-
return _never;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
207
|
+
// TS cannot correlate `handlers[action.type]` with `action` across the
|
|
208
|
+
// union, so widen the picked handler once; the table type above already
|
|
209
|
+
// guarantees the per-variant pairing.
|
|
210
|
+
const handle = handlers[action.type];
|
|
211
|
+
return handle(state, action);
|
|
200
212
|
}
|
|
201
213
|
//# sourceMappingURL=builder-reducer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder-reducer.js","sourceRoot":"","sources":["../../../src/app/builder/builder-reducer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAmC,MAAM,oBAAoB,CAAA;AAyB/E,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,OAAO;QACL,KAAK;QACL,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,CAAC;KACpB,CAAA;AACH,CAAC;AA2BD,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,6EAA6E;AAC7E,SAAS,YAAY,CAAC,KAAkB,EAAE,cAAsB;IAC9D,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;AACtF,CAAC;AAED,0EAA0E;AAC1E,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAgB;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,KAAkB,EAClB,cAAsB,EACtB,EAAgC;IAEhC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAC/B,CAAC;
|
|
1
|
+
{"version":3,"file":"builder-reducer.js","sourceRoot":"","sources":["../../../src/app/builder/builder-reducer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AvailableStep, KeyCatalogEntry, PipelineContext, PipelineStepRef, ReachableWidget, UnreachableWidget } from "@miragon/mcp-toolkit-core";
|
|
2
|
+
import { type KeyEntry } from "./builder-model.js";
|
|
3
|
+
import type { RefreshStatus } from "./labels.js";
|
|
4
|
+
/**
|
|
5
|
+
* Owns the builder's live catalogue: the snapshots fetched from the app-only
|
|
6
|
+
* `get-builder-catalogue` tool (the LLM never sees this data), the refresh
|
|
7
|
+
* status for the auto-apply chip, and the lookups derived from the
|
|
8
|
+
* snapshots. Extracted from `layout-builder.tsx` unchanged: fetch on mount
|
|
9
|
+
* (no debounce) so the builder is ready immediately, then debounce 600ms on
|
|
10
|
+
* every keys/steps edit. The ref pattern keeps the effect dependent on only
|
|
11
|
+
* `keyEntries` / `stepEntries`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useBuilderCatalogue({ callTool, catalogueToolName, keyEntries, stepEntries, }: {
|
|
14
|
+
callTool: (name: string, args: object) => Promise<unknown>;
|
|
15
|
+
catalogueToolName: string;
|
|
16
|
+
keyEntries: KeyEntry[];
|
|
17
|
+
stepEntries: PipelineStepRef[];
|
|
18
|
+
}): {
|
|
19
|
+
liveReachable: ReachableWidget[];
|
|
20
|
+
liveUnreachable: UnreachableWidget[];
|
|
21
|
+
liveCatalog: KeyCatalogEntry[];
|
|
22
|
+
liveSteps: AvailableStep[];
|
|
23
|
+
liveContext: PipelineContext;
|
|
24
|
+
validationIssues: string[];
|
|
25
|
+
status: RefreshStatus;
|
|
26
|
+
refreshError: string | null;
|
|
27
|
+
widgetById: Map<string, ReachableWidget>;
|
|
28
|
+
propsSchemaByWidgetId: Map<string, Record<string, unknown>>;
|
|
29
|
+
paletteByApp: [string, ReachableWidget[]][];
|
|
30
|
+
liveKeyCount: number;
|
|
31
|
+
stepsByApp: [string, AvailableStep[]][];
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=use-builder-catalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-builder-catalogue.d.ts","sourceRoot":"","sources":["../../../src/app/builder/use-builder-catalogue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAQhD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,WAAW,EAAE,eAAe,EAAE,CAAA;CAC/B;;;;;;;;;;;;;;EA+IA"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { parseToolResult } from "../../lib/parse-tool-result.js";
|
|
3
|
+
import { entriesToKeys, toPipelineContext, } from "./builder-model.js";
|
|
4
|
+
// -------------------------------------------------------------------------- //
|
|
5
|
+
// Builder catalogue hook — live snapshots from `get-builder-catalogue`
|
|
6
|
+
// -------------------------------------------------------------------------- //
|
|
7
|
+
const EMPTY_CONTEXT = { steps: {}, keys: {}, errors: [] };
|
|
8
|
+
/**
|
|
9
|
+
* Owns the builder's live catalogue: the snapshots fetched from the app-only
|
|
10
|
+
* `get-builder-catalogue` tool (the LLM never sees this data), the refresh
|
|
11
|
+
* status for the auto-apply chip, and the lookups derived from the
|
|
12
|
+
* snapshots. Extracted from `layout-builder.tsx` unchanged: fetch on mount
|
|
13
|
+
* (no debounce) so the builder is ready immediately, then debounce 600ms on
|
|
14
|
+
* every keys/steps edit. The ref pattern keeps the effect dependent on only
|
|
15
|
+
* `keyEntries` / `stepEntries`.
|
|
16
|
+
*/
|
|
17
|
+
export function useBuilderCatalogue({ callTool, catalogueToolName, keyEntries, stepEntries, }) {
|
|
18
|
+
// ── Live snapshots from get-builder-catalogue responses ─────────────────
|
|
19
|
+
// Start empty — the first effect below fetches the catalogue on mount.
|
|
20
|
+
const [liveReachable, setLiveReachable] = useState([]);
|
|
21
|
+
const [liveUnreachable, setLiveUnreachable] = useState([]);
|
|
22
|
+
const [liveCatalog, setLiveCatalog] = useState([]);
|
|
23
|
+
const [liveSteps, setLiveSteps] = useState([]);
|
|
24
|
+
const [liveContext, setLiveContext] = useState(EMPTY_CONTEXT);
|
|
25
|
+
// Pipeline validation issues from the catalogue (Finding [10]/[6]). The
|
|
26
|
+
// catalogue is fail-soft, but `render-view` is fail-hard, so we surface
|
|
27
|
+
// these so the user sees — before committing — that the pipeline as
|
|
28
|
+
// configured wouldn't render.
|
|
29
|
+
const [validationIssues, setValidationIssues] = useState([]);
|
|
30
|
+
// ── Refresh status (for the auto-apply chip) ────────────────────────────
|
|
31
|
+
const [status, setStatus] = useState("idle");
|
|
32
|
+
// Last catalogue-fetch failure (Finding [3]). Surfaced as a toolbar banner
|
|
33
|
+
// instead of only `console.warn`-ing, so the user knows the palette/context
|
|
34
|
+
// may be stale. Cleared on the next successful refresh.
|
|
35
|
+
const [refreshError, setRefreshError] = useState(null);
|
|
36
|
+
const refreshBuilder = useCallback(async () => {
|
|
37
|
+
setStatus("refreshing");
|
|
38
|
+
try {
|
|
39
|
+
const result = await callTool(catalogueToolName, {
|
|
40
|
+
keys: entriesToKeys(keyEntries),
|
|
41
|
+
steps: stepEntries.filter((s) => s.step.trim().length > 0),
|
|
42
|
+
});
|
|
43
|
+
const sc = parseToolResult(result);
|
|
44
|
+
if (sc?.reachableWidgets)
|
|
45
|
+
setLiveReachable(sc.reachableWidgets);
|
|
46
|
+
if (sc?.unreachableWidgets)
|
|
47
|
+
setLiveUnreachable(sc.unreachableWidgets);
|
|
48
|
+
if (sc?.availableSteps)
|
|
49
|
+
setLiveSteps(sc.availableSteps);
|
|
50
|
+
if (sc?.keyCatalog)
|
|
51
|
+
setLiveCatalog(sc.keyCatalog);
|
|
52
|
+
if (sc?.context)
|
|
53
|
+
setLiveContext(toPipelineContext(sc.context));
|
|
54
|
+
// Pipeline issues are fail-soft in the catalogue but fail-hard in
|
|
55
|
+
// render-view; surface them so the user sees the render path wouldn't
|
|
56
|
+
// run as configured (Finding [10]/[6]). Coerce undefined → [] so a
|
|
57
|
+
// fixed pipeline clears a previously-shown warning.
|
|
58
|
+
setValidationIssues(sc?.validationIssues ?? []);
|
|
59
|
+
// A successful fetch clears any stale failure banner.
|
|
60
|
+
setRefreshError(null);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
// Fail soft: when the host's server hasn't registered the app-only
|
|
64
|
+
// `get-builder-catalogue` tool (the builder platform is opt-in via
|
|
65
|
+
// `app.builder`), the call rejects. Degrade to the static catalogue
|
|
66
|
+
// already derived from the layout rather than crashing the iframe —
|
|
67
|
+
// but surface the failure so the user knows the palette may be stale
|
|
68
|
+
// (Finding [3]).
|
|
69
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
70
|
+
console.warn(`[mcp-toolkit] builder catalogue fetch failed (${catalogueToolName}): ${reason}. ` +
|
|
71
|
+
"The builder platform may be disabled on this server (app.builder).");
|
|
72
|
+
setRefreshError(reason);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
setStatus("idle");
|
|
76
|
+
}
|
|
77
|
+
}, [catalogueToolName, callTool, keyEntries, stepEntries]);
|
|
78
|
+
const refreshRef = useRef(refreshBuilder);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
refreshRef.current = refreshBuilder;
|
|
81
|
+
}, [refreshBuilder]);
|
|
82
|
+
const isFirstRun = useRef(true);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (isFirstRun.current) {
|
|
85
|
+
isFirstRun.current = false;
|
|
86
|
+
void refreshRef.current();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
setStatus("pending");
|
|
90
|
+
const handle = window.setTimeout(() => {
|
|
91
|
+
void refreshRef.current();
|
|
92
|
+
}, 600);
|
|
93
|
+
return () => {
|
|
94
|
+
window.clearTimeout(handle);
|
|
95
|
+
};
|
|
96
|
+
}, [keyEntries, stepEntries]);
|
|
97
|
+
// ── Derived lookups ─────────────────────────────────────────────────────
|
|
98
|
+
const widgetById = useMemo(() => {
|
|
99
|
+
const map = new Map();
|
|
100
|
+
for (const w of liveReachable)
|
|
101
|
+
map.set(w.id, w);
|
|
102
|
+
return map;
|
|
103
|
+
}, [liveReachable]);
|
|
104
|
+
// Per-widget propsSchema lookup. Merged from both reachable and
|
|
105
|
+
// unreachable lists because a saved layout can reference a widget whose
|
|
106
|
+
// `requires` aren't currently satisfied — we still want the user to be
|
|
107
|
+
// able to edit its props.
|
|
108
|
+
const propsSchemaByWidgetId = useMemo(() => {
|
|
109
|
+
const map = new Map();
|
|
110
|
+
for (const w of liveReachable) {
|
|
111
|
+
if (w.propsSchema)
|
|
112
|
+
map.set(w.id, w.propsSchema);
|
|
113
|
+
}
|
|
114
|
+
for (const w of liveUnreachable) {
|
|
115
|
+
if (w.propsSchema)
|
|
116
|
+
map.set(w.id, w.propsSchema);
|
|
117
|
+
}
|
|
118
|
+
return map;
|
|
119
|
+
}, [liveReachable, liveUnreachable]);
|
|
120
|
+
const paletteByApp = useMemo(() => {
|
|
121
|
+
const groups = new Map();
|
|
122
|
+
for (const w of liveReachable) {
|
|
123
|
+
if (!groups.has(w.app))
|
|
124
|
+
groups.set(w.app, []);
|
|
125
|
+
groups.get(w.app).push(w);
|
|
126
|
+
}
|
|
127
|
+
return [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
128
|
+
}, [liveReachable]);
|
|
129
|
+
const liveKeyCount = useMemo(() => liveCatalog.filter((c) => c.inContext).length, [liveCatalog]);
|
|
130
|
+
const stepsByApp = useMemo(() => {
|
|
131
|
+
const groups = new Map();
|
|
132
|
+
for (const s of liveSteps) {
|
|
133
|
+
if (!groups.has(s.app))
|
|
134
|
+
groups.set(s.app, []);
|
|
135
|
+
groups.get(s.app).push(s);
|
|
136
|
+
}
|
|
137
|
+
return [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
138
|
+
}, [liveSteps]);
|
|
139
|
+
return {
|
|
140
|
+
liveReachable,
|
|
141
|
+
liveUnreachable,
|
|
142
|
+
liveCatalog,
|
|
143
|
+
liveSteps,
|
|
144
|
+
liveContext,
|
|
145
|
+
validationIssues,
|
|
146
|
+
status,
|
|
147
|
+
refreshError,
|
|
148
|
+
widgetById,
|
|
149
|
+
propsSchemaByWidgetId,
|
|
150
|
+
paletteByApp,
|
|
151
|
+
liveKeyCount,
|
|
152
|
+
stepsByApp,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=use-builder-catalogue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-builder-catalogue.js","sourceRoot":"","sources":["../../../src/app/builder/use-builder-catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AASzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAGlB,MAAM,oBAAoB,CAAA;AAG3B,gFAAgF;AAChF,uEAAuE;AACvE,gFAAgF;AAEhF,MAAM,aAAa,GAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAE1E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,WAAW,GAMZ;IACC,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAA;IACzE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAsB,EAAE,CAAC,CAAA;IAC/E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAA;IACrE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAA;IAC/D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAkB,aAAa,CAAC,CAAA;IAC9E,wEAAwE;IACxE,wEAAwE;IACxE,oEAAoE;IACpE,8BAA8B;IAC9B,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAEtE,2EAA2E;IAC3E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,MAAM,CAAC,CAAA;IAC3D,2EAA2E;IAC3E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAErE,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,SAAS,CAAC,YAAY,CAAC,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE;gBAC/C,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC;gBAC/B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3D,CAAC,CAAA;YACF,MAAM,EAAE,GAAG,eAAe,CAOhB,MAAM,CAAC,CAAA;YACjB,IAAI,EAAE,EAAE,gBAAgB;gBAAE,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAA;YAC/D,IAAI,EAAE,EAAE,kBAAkB;gBAAE,kBAAkB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAA;YACrE,IAAI,EAAE,EAAE,cAAc;gBAAE,YAAY,CAAC,EAAE,CAAC,cAAc,CAAC,CAAA;YACvD,IAAI,EAAE,EAAE,UAAU;gBAAE,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;YACjD,IAAI,EAAE,EAAE,OAAO;gBAAE,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;YAC9D,kEAAkE;YAClE,sEAAsE;YACtE,mEAAmE;YACnE,oDAAoD;YACpD,mBAAmB,CAAC,EAAE,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAA;YAC/C,sDAAsD;YACtD,eAAe,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,mEAAmE;YACnE,oEAAoE;YACpE,oEAAoE;YACpE,qEAAqE;YACrE,iBAAiB;YACjB,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CACV,iDAAiD,iBAAiB,MAAM,MAAM,IAAI;gBAChF,oEAAoE,CACvE,CAAA;YACD,eAAe,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IAE1D,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,cAAc,CAAA;IACrC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAA;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAA;YAC1B,KAAK,UAAU,CAAC,OAAO,EAAE,CAAA;YACzB,OAAM;QACR,CAAC;QACD,SAAS,CAAC,SAAS,CAAC,CAAA;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACpC,KAAK,UAAU,CAAC,OAAO,EAAE,CAAA;QAC3B,CAAC,EAAE,GAAG,CAAC,CAAA;QACP,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7B,2EAA2E;IAC3E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAA;QAC9C,KAAK,MAAM,CAAC,IAAI,aAAa;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC/C,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,gEAAgE;IAChE,wEAAwE;IACxE,uEAAuE;IACvE,0BAA0B;IAC1B,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAA;QACtD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,WAAW;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;QACjD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,WAAW;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAA;QACnD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEhG,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAA;QACjD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO;QACL,aAAa;QACb,eAAe;QACf,WAAW;QACX,SAAS;QACT,WAAW;QACX,gBAAgB;QAChB,MAAM;QACN,YAAY;QACZ,UAAU;QACV,qBAAqB;QACrB,YAAY;QACZ,YAAY;QACZ,UAAU;KACX,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PipelineStepRef } from "@miragon/mcp-toolkit-core";
|
|
2
|
+
import { type KeyEntry } from "./builder-model.js";
|
|
3
|
+
/**
|
|
4
|
+
* Owns the key/step editor entries and their mutations, extracted from
|
|
5
|
+
* `layout-builder.tsx` unchanged. `addKey` de-dupes a prefilled name (the
|
|
6
|
+
* catalogue's "Add as key" action) and `addStep` derives a unique context
|
|
7
|
+
* id via `defaultStepIdFor`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useKeyStepEntries({ initialKeys, initialSteps, }: {
|
|
10
|
+
initialKeys?: Record<string, unknown>;
|
|
11
|
+
initialSteps?: PipelineStepRef[];
|
|
12
|
+
}): {
|
|
13
|
+
keyEntries: KeyEntry[];
|
|
14
|
+
stepEntries: PipelineStepRef[];
|
|
15
|
+
addKey: (prefilledName?: string) => void;
|
|
16
|
+
updateKey: (idx: number, patch: Partial<KeyEntry>) => void;
|
|
17
|
+
removeKey: (idx: number) => void;
|
|
18
|
+
addStep: (stepId?: string) => void;
|
|
19
|
+
updateStep: (idx: number, patch: Partial<PipelineStepRef>) => void;
|
|
20
|
+
removeStep: (idx: number) => void;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=use-key-step-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-key-step-entries.d.ts","sourceRoot":"","sources":["../../../src/app/builder/use-key-step-entries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAMnF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,YAAY,GACb,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAA;CACjC;;;6BAI6C,MAAM;qBAUd,MAAM,SAAS,OAAO,CAAC,QAAQ,CAAC;qBAIhC,MAAM;uBAIJ,MAAM;sBAQP,MAAM,SAAS,OAAO,CAAC,eAAe,CAAC;sBAIvC,MAAM;EAK5C"}
|