@miragon/mcp-toolkit-ui 1.1.0 → 2.0.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 (77) hide show
  1. package/dist/app/builder/BuilderBanners.d.ts +19 -0
  2. package/dist/app/builder/BuilderBanners.d.ts.map +1 -0
  3. package/dist/app/builder/BuilderBanners.js +22 -0
  4. package/dist/app/builder/BuilderBanners.js.map +1 -0
  5. package/dist/app/builder/CanvasRow.d.ts +26 -0
  6. package/dist/app/builder/CanvasRow.d.ts.map +1 -0
  7. package/dist/app/builder/CanvasRow.js +98 -0
  8. package/dist/app/builder/CanvasRow.js.map +1 -0
  9. package/dist/app/builder/CellPropsSheet.d.ts +19 -0
  10. package/dist/app/builder/CellPropsSheet.d.ts.map +1 -0
  11. package/dist/app/builder/CellPropsSheet.js +28 -0
  12. package/dist/app/builder/CellPropsSheet.js.map +1 -0
  13. package/dist/app/builder/EmptyHint.d.ts +6 -0
  14. package/dist/app/builder/EmptyHint.d.ts.map +1 -0
  15. package/dist/app/builder/EmptyHint.js +10 -0
  16. package/dist/app/builder/EmptyHint.js.map +1 -0
  17. package/dist/app/builder/LayoutSurface.d.ts +27 -0
  18. package/dist/app/builder/LayoutSurface.d.ts.map +1 -0
  19. package/dist/app/builder/LayoutSurface.js +45 -0
  20. package/dist/app/builder/LayoutSurface.js.map +1 -0
  21. package/dist/app/builder/Workspace.d.ts +9 -3
  22. package/dist/app/builder/Workspace.d.ts.map +1 -1
  23. package/dist/app/builder/Workspace.js +3 -97
  24. package/dist/app/builder/Workspace.js.map +1 -1
  25. package/dist/app/builder/builder-reducer.d.ts.map +1 -1
  26. package/dist/app/builder/builder-reducer.js +176 -164
  27. package/dist/app/builder/builder-reducer.js.map +1 -1
  28. package/dist/app/builder/use-builder-catalogue.d.ts +33 -0
  29. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -0
  30. package/dist/app/builder/use-builder-catalogue.js +155 -0
  31. package/dist/app/builder/use-builder-catalogue.js.map +1 -0
  32. package/dist/app/builder/use-key-step-entries.d.ts +22 -0
  33. package/dist/app/builder/use-key-step-entries.d.ts.map +1 -0
  34. package/dist/app/builder/use-key-step-entries.js +46 -0
  35. package/dist/app/builder/use-key-step-entries.js.map +1 -0
  36. package/dist/app/builder/use-save-dashboard.d.ts +33 -0
  37. package/dist/app/builder/use-save-dashboard.d.ts.map +1 -0
  38. package/dist/app/builder/use-save-dashboard.js +78 -0
  39. package/dist/app/builder/use-save-dashboard.js.map +1 -0
  40. package/dist/app/layout-builder.d.ts.map +1 -1
  41. package/dist/app/layout-builder.js +46 -277
  42. package/dist/app/layout-builder.js.map +1 -1
  43. package/dist/app/mcp-app-view-chrome.d.ts +77 -0
  44. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -0
  45. package/dist/app/mcp-app-view-chrome.js +53 -0
  46. package/dist/app/mcp-app-view-chrome.js.map +1 -0
  47. package/dist/app/mcp-app-view.d.ts +3 -9
  48. package/dist/app/mcp-app-view.d.ts.map +1 -1
  49. package/dist/app/mcp-app-view.js +4 -31
  50. package/dist/app/mcp-app-view.js.map +1 -1
  51. package/dist/render-cases-primitives.d.ts +17 -0
  52. package/dist/render-cases-primitives.d.ts.map +1 -0
  53. package/dist/render-cases-primitives.js +88 -0
  54. package/dist/render-cases-primitives.js.map +1 -0
  55. package/dist/render-cases.d.ts +4 -0
  56. package/dist/render-cases.d.ts.map +1 -0
  57. package/dist/render-cases.js +140 -0
  58. package/dist/render-cases.js.map +1 -0
  59. package/package.json +10 -5
  60. package/src/app/builder/BuilderBanners.tsx +61 -0
  61. package/src/app/builder/CanvasRow.tsx +316 -0
  62. package/src/app/builder/CellPropsSheet.tsx +47 -0
  63. package/src/app/builder/EmptyHint.tsx +29 -0
  64. package/src/app/builder/LayoutSurface.tsx +140 -0
  65. package/src/app/builder/Workspace.tsx +33 -342
  66. package/src/app/builder/builder-reducer.ts +204 -170
  67. package/src/app/builder/use-builder-catalogue.ts +187 -0
  68. package/src/app/builder/use-key-step-entries.ts +60 -0
  69. package/src/app/builder/use-save-dashboard.ts +97 -0
  70. package/src/app/layout-builder.tsx +92 -497
  71. package/src/app/mcp-app-view-chrome.tsx +204 -0
  72. package/src/app/mcp-app-view.tsx +32 -140
  73. package/src/lib/parse-tool-result.property.test.ts +90 -0
  74. package/src/render-cases-primitives.tsx +255 -0
  75. package/src/render-cases.tsx +239 -0
  76. package/src/render-smoke.test.tsx +100 -0
  77. 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
- switch (action.type) {
37
- case "addWidgetToRow": {
38
- const rows = activeRowsOf(state.draft, state.activeTabIndex);
39
- const safeLen = rows.length > 0 ? rows.length : 1;
40
- const idx = Math.min(Math.max(action.targetRowIdx ?? state.focusedRowIndex, 0), safeLen - 1);
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":"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"}
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;AAQD,SAAS,cAAc,CACrB,KAAwB,EACxB,MAAkC;IAElC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;IAC5F,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE;QACpE,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;QACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3B,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC3F,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,CAAA;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,KAAwB;IACtC,IAAI,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAA;IACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;QACnC,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB,EAAE,MAA6B;IACxE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;QACvD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IACF,uEAAuE;IACvE,qEAAqE;IACrE,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAA;AACrF,CAAC;AAED,SAAS,OAAO,CAAC,KAAwB,EAAE,MAA2B;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAA;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;IAC5D,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE;QACpE,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;QACpB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,MAA+B;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACtE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,MAAM,CAAC,MAAM;QACjB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACpF,CAAC,CAAC,CAAC,CACN,CACF,CAAA;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAA;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,KAAwB,EAAE,MAA8B;IAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACtE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAChF,CACF,CAAA;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAA;AAC5B,CAAC;AAED,SAAS,YAAY,CACnB,KAAwB,EACxB,MAAgC;IAEhC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACtE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,MAAM,CAAC,MAAM;QACjB,CAAC,CAAC;YACE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,CAAA;gBAClC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAa,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;oBAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;wBAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;oBAC5C,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;YACrC,CAAC,CAAC;SACH;QACH,CAAC,CAAC,CAAC,CACN,CACF,CAAA;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAA;AAC5B,CAAC;AAED,SAAS,aAAa,CACpB,KAAwB,EACxB,MAAiC;IAEjC,OAAO,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;AAClE,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB,EAAE,MAA6B;IACxE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;IACxD,OAAO;QACL,GAAG,KAAK;QACR,cAAc,EAAE,MAAM,CAAC,MAAM;QAC7B,eAAe,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;KACnE,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CACtB,KAAwB,EACxB,MAAmC;IAEnC,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,MAAM,CAAC,KAAwB;IACtC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;QAClD,MAAM,QAAQ,GAAe,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAChF,OAAO;YACL,GAAG,KAAK;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvC,cAAc,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;SACpC,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAe;QAC7B,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QAC1C,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;KACtC,CAAA;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAA;AACnF,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB,EAAE,MAA6B;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAC7C,+DAA+D;IAC/D,mEAAmE;IACnE,uBAAuB;IACvB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAA;IACnE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjG,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAA;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB,EAAE,MAA6B;IACxE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;IACnE,6EAA6E;IAC7E,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,EAAE,CAAA;QAC/E,OAAO;YACL,GAAG,KAAK;YACR,KAAK;YACL,cAAc,EAAE,CAAC;YACjB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACzE,CAAA;IACH,CAAC;IACD,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;IAC7C,OAAO;QACL,GAAG,KAAK;QACR,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7B,cAAc;QACd,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;KACnE,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,QAAQ,GAEV;IACF,cAAc;IACd,MAAM;IACN,SAAS;IACT,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,aAAa;IACb,SAAS;IACT,eAAe;IACf,cAAc;IACd,MAAM;IACN,SAAS;IACT,SAAS;CACV,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,KAAwB,EAAE,MAAqB;IAC1E,uEAAuE;IACvE,wEAAwE;IACxE,sCAAsC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAGb,CAAA;IACtB,OAAO,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AAC9B,CAAC"}
@@ -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":"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"}
@@ -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"}