@miragon/mcp-toolkit-ui 1.0.1 → 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.
Files changed (82) hide show
  1. package/README.md +1 -1
  2. package/dist/app/builder/BuilderBanners.d.ts +19 -0
  3. package/dist/app/builder/BuilderBanners.d.ts.map +1 -0
  4. package/dist/app/builder/BuilderBanners.js +22 -0
  5. package/dist/app/builder/BuilderBanners.js.map +1 -0
  6. package/dist/app/builder/CanvasRow.d.ts +26 -0
  7. package/dist/app/builder/CanvasRow.d.ts.map +1 -0
  8. package/dist/app/builder/CanvasRow.js +98 -0
  9. package/dist/app/builder/CanvasRow.js.map +1 -0
  10. package/dist/app/builder/CellPropsSheet.d.ts +19 -0
  11. package/dist/app/builder/CellPropsSheet.d.ts.map +1 -0
  12. package/dist/app/builder/CellPropsSheet.js +28 -0
  13. package/dist/app/builder/CellPropsSheet.js.map +1 -0
  14. package/dist/app/builder/EmptyHint.d.ts +6 -0
  15. package/dist/app/builder/EmptyHint.d.ts.map +1 -0
  16. package/dist/app/builder/EmptyHint.js +10 -0
  17. package/dist/app/builder/EmptyHint.js.map +1 -0
  18. package/dist/app/builder/LayoutSurface.d.ts +27 -0
  19. package/dist/app/builder/LayoutSurface.d.ts.map +1 -0
  20. package/dist/app/builder/LayoutSurface.js +45 -0
  21. package/dist/app/builder/LayoutSurface.js.map +1 -0
  22. package/dist/app/builder/Workspace.d.ts +9 -3
  23. package/dist/app/builder/Workspace.d.ts.map +1 -1
  24. package/dist/app/builder/Workspace.js +3 -97
  25. package/dist/app/builder/Workspace.js.map +1 -1
  26. package/dist/app/builder/builder-reducer.d.ts.map +1 -1
  27. package/dist/app/builder/builder-reducer.js +176 -164
  28. package/dist/app/builder/builder-reducer.js.map +1 -1
  29. package/dist/app/builder/use-builder-catalogue.d.ts +33 -0
  30. package/dist/app/builder/use-builder-catalogue.d.ts.map +1 -0
  31. package/dist/app/builder/use-builder-catalogue.js +155 -0
  32. package/dist/app/builder/use-builder-catalogue.js.map +1 -0
  33. package/dist/app/builder/use-key-step-entries.d.ts +22 -0
  34. package/dist/app/builder/use-key-step-entries.d.ts.map +1 -0
  35. package/dist/app/builder/use-key-step-entries.js +46 -0
  36. package/dist/app/builder/use-key-step-entries.js.map +1 -0
  37. package/dist/app/builder/use-save-dashboard.d.ts +33 -0
  38. package/dist/app/builder/use-save-dashboard.d.ts.map +1 -0
  39. package/dist/app/builder/use-save-dashboard.js +78 -0
  40. package/dist/app/builder/use-save-dashboard.js.map +1 -0
  41. package/dist/app/host-bridge.d.ts +4 -4
  42. package/dist/app/host-bridge.js +2 -2
  43. package/dist/app/layout-builder.d.ts.map +1 -1
  44. package/dist/app/layout-builder.js +46 -277
  45. package/dist/app/layout-builder.js.map +1 -1
  46. package/dist/app/mcp-app-view-chrome.d.ts +77 -0
  47. package/dist/app/mcp-app-view-chrome.d.ts.map +1 -0
  48. package/dist/app/mcp-app-view-chrome.js +53 -0
  49. package/dist/app/mcp-app-view-chrome.js.map +1 -0
  50. package/dist/app/mcp-app-view.d.ts +3 -9
  51. package/dist/app/mcp-app-view.d.ts.map +1 -1
  52. package/dist/app/mcp-app-view.js +4 -31
  53. package/dist/app/mcp-app-view.js.map +1 -1
  54. package/dist/render-cases-primitives.d.ts +17 -0
  55. package/dist/render-cases-primitives.d.ts.map +1 -0
  56. package/dist/render-cases-primitives.js +88 -0
  57. package/dist/render-cases-primitives.js.map +1 -0
  58. package/dist/render-cases.d.ts +4 -0
  59. package/dist/render-cases.d.ts.map +1 -0
  60. package/dist/render-cases.js +140 -0
  61. package/dist/render-cases.js.map +1 -0
  62. package/package.json +12 -7
  63. package/src/app/builder/BuilderBanners.tsx +61 -0
  64. package/src/app/builder/CanvasRow.tsx +316 -0
  65. package/src/app/builder/CellPropsSheet.tsx +47 -0
  66. package/src/app/builder/EmptyHint.tsx +29 -0
  67. package/src/app/builder/LayoutSurface.tsx +140 -0
  68. package/src/app/builder/Workspace.tsx +33 -342
  69. package/src/app/builder/builder-reducer.ts +204 -170
  70. package/src/app/builder/use-builder-catalogue.ts +187 -0
  71. package/src/app/builder/use-key-step-entries.ts +60 -0
  72. package/src/app/builder/use-save-dashboard.ts +97 -0
  73. package/src/app/host-bridge.tsx +4 -4
  74. package/src/app/layout-builder.tsx +92 -497
  75. package/src/app/mcp-app-view-chrome.tsx +204 -0
  76. package/src/app/mcp-app-view.tsx +32 -140
  77. package/src/lib/parse-tool-result.property.test.ts +90 -0
  78. package/src/render-cases-primitives.tsx +255 -0
  79. package/src/render-cases.tsx +239 -0
  80. package/src/render-smoke.test.tsx +100 -0
  81. package/src/ui-catalog.test.ts +52 -0
  82. package/ui-catalog.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"builder-reducer.d.ts","sourceRoot":"","sources":["../../../src/app/builder/builder-reducer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAa,KAAK,WAAW,EAAiB,MAAM,oBAAoB,CAAA;AAM/E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAQtE;AAMD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC1C,GACD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAkCzC,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,iBAAiB,CA0L/F"}
1
+ {"version":3,"file":"builder-reducer.d.ts","sourceRoot":"","sources":["../../../src/app/builder/builder-reducer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAa,KAAK,WAAW,EAAiB,MAAM,oBAAoB,CAAA;AAM/E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAQtE;AAMD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IACE,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC1C,GACD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAqPzC,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAS/F"}
@@ -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":"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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":"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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"}