@particle-academy/agent-integrations 0.38.0 → 0.39.1
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/bridges/grid.d.cts +87 -0
- package/dist/bridges/grid.d.ts +87 -0
- package/dist/bridges-artboard.cjs +1 -1
- package/dist/bridges-artboard.cjs.map +1 -1
- package/dist/bridges-artboard.js +1 -1
- package/dist/bridges-artboard.js.map +1 -1
- package/dist/bridges-grid.cjs +329 -0
- package/dist/bridges-grid.cjs.map +1 -0
- package/dist/bridges-grid.js +7 -0
- package/dist/bridges-grid.js.map +1 -0
- package/dist/chunk-MJ2S25ON.js +209 -0
- package/dist/chunk-MJ2S25ON.js.map +1 -0
- package/dist/index.cjs +227 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +11 -1
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { ensureUndoToolsRegistered, pushUndoEntry } from './chunk-CT3LRNH7.js';
|
|
2
|
+
import { wrapToolWithActivity } from './chunk-2VENWGLZ.js';
|
|
3
|
+
import { textResult, errorResult } from './chunk-DF3PLL2E.js';
|
|
4
|
+
|
|
5
|
+
// src/bridges/grid.ts
|
|
6
|
+
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
7
|
+
function registerGridBridge(host, options) {
|
|
8
|
+
const { adapter } = options;
|
|
9
|
+
const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
|
|
10
|
+
const disposers = [];
|
|
11
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
12
|
+
const target = (part) => ({
|
|
13
|
+
kind: "grid",
|
|
14
|
+
screenId: adapter.screenId,
|
|
15
|
+
elementId: part ? `${adapter.id}:${part}` : adapter.id,
|
|
16
|
+
label: part ? `${adapter.title ?? adapter.id} \u2192 ${part}` : adapter.title ?? adapter.id
|
|
17
|
+
});
|
|
18
|
+
const reg = (name, description, properties, required, handler, isMutation, partFromArgs) => {
|
|
19
|
+
const wrapped = async (args) => {
|
|
20
|
+
try {
|
|
21
|
+
return await handler(args);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return errorResult(e instanceof Error ? e.message : String(e));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const final = isMutation ? wrapToolWithActivity(wrapped, {
|
|
27
|
+
toolName: name,
|
|
28
|
+
agent,
|
|
29
|
+
kind: "grid",
|
|
30
|
+
screenId: adapter.screenId,
|
|
31
|
+
resolveTarget: ({ args }) => target(partFromArgs?.(args))
|
|
32
|
+
}) : wrapped;
|
|
33
|
+
disposers.push(
|
|
34
|
+
host.registerTool(
|
|
35
|
+
{
|
|
36
|
+
name,
|
|
37
|
+
description,
|
|
38
|
+
inputSchema: { type: "object", properties, required, additionalProperties: false }
|
|
39
|
+
},
|
|
40
|
+
final
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
const assertColumn = (id) => {
|
|
45
|
+
const known = adapter.getColumnIds?.();
|
|
46
|
+
if (known && !known.includes(id)) {
|
|
47
|
+
throw new Error(`Unknown column "${id}". Available: ${known.join(", ")}`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const commit = (next, action, label, previous) => {
|
|
51
|
+
adapter.setState(next);
|
|
52
|
+
pushUndoEntry(agent.id, {
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
bridgeId: `grid:${adapter.id}`,
|
|
55
|
+
action,
|
|
56
|
+
label,
|
|
57
|
+
undo: () => adapter.setState(previous),
|
|
58
|
+
redo: () => adapter.setState(next)
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
reg(
|
|
62
|
+
"grid_get",
|
|
63
|
+
"Read the grid's view state \u2014 sorting, filters, selected row ids, pagination \u2014 plus the addressable column and row ids.",
|
|
64
|
+
{},
|
|
65
|
+
[],
|
|
66
|
+
() => {
|
|
67
|
+
const state = adapter.getState();
|
|
68
|
+
return textResult(
|
|
69
|
+
JSON.stringify(
|
|
70
|
+
{
|
|
71
|
+
id: adapter.id,
|
|
72
|
+
title: adapter.title,
|
|
73
|
+
sorting: state.sorting ?? [],
|
|
74
|
+
filters: state.filters ?? [],
|
|
75
|
+
selectedRowIds: Object.entries(state.rowSelection ?? {}).filter(([, on]) => on).map(([id]) => id),
|
|
76
|
+
pagination: state.pagination,
|
|
77
|
+
columnIds: adapter.getColumnIds?.() ?? null,
|
|
78
|
+
rowIds: adapter.getRowIds?.() ?? null,
|
|
79
|
+
editable: Boolean(adapter.editCell)
|
|
80
|
+
},
|
|
81
|
+
null,
|
|
82
|
+
2
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
false
|
|
87
|
+
);
|
|
88
|
+
reg(
|
|
89
|
+
"grid_sort",
|
|
90
|
+
"Sort the grid. Pass an empty array to clear sorting. Multiple entries sort by each in order.",
|
|
91
|
+
{
|
|
92
|
+
sorting: {
|
|
93
|
+
type: "array",
|
|
94
|
+
description: 'e.g. [{ "id": "createdAt", "desc": true }]',
|
|
95
|
+
items: {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: { id: { type: "string" }, desc: { type: "boolean" } },
|
|
98
|
+
required: ["id"],
|
|
99
|
+
additionalProperties: false
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
["sorting"],
|
|
104
|
+
(args) => {
|
|
105
|
+
const raw = Array.isArray(args.sorting) ? args.sorting : [];
|
|
106
|
+
const sorting = raw.map((s) => {
|
|
107
|
+
assertColumn(String(s.id));
|
|
108
|
+
return { id: String(s.id), desc: Boolean(s.desc) };
|
|
109
|
+
});
|
|
110
|
+
const previous = adapter.getState();
|
|
111
|
+
commit({ ...previous, sorting }, "grid_sort", `Sorted by ${sorting.map((s) => s.id).join(", ") || "nothing"}`, previous);
|
|
112
|
+
return textResult(`Sorted by ${sorting.map((s) => `${s.id}${s.desc ? " desc" : ""}`).join(", ") || "nothing"}.`);
|
|
113
|
+
},
|
|
114
|
+
true,
|
|
115
|
+
(args) => Array.isArray(args.sorting) && args.sorting[0] ? String(args.sorting[0].id) : void 0
|
|
116
|
+
);
|
|
117
|
+
reg(
|
|
118
|
+
"grid_filter",
|
|
119
|
+
"Filter the grid. Pass an empty array to clear all filters.",
|
|
120
|
+
{
|
|
121
|
+
filters: {
|
|
122
|
+
type: "array",
|
|
123
|
+
description: 'e.g. [{ "id": "status", "value": "open" }]',
|
|
124
|
+
items: {
|
|
125
|
+
type: "object",
|
|
126
|
+
properties: { id: { type: "string" }, value: { type: "string" } },
|
|
127
|
+
required: ["id", "value"],
|
|
128
|
+
additionalProperties: false
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
["filters"],
|
|
133
|
+
(args) => {
|
|
134
|
+
const raw = Array.isArray(args.filters) ? args.filters : [];
|
|
135
|
+
const filters = raw.map((f) => {
|
|
136
|
+
assertColumn(String(f.id));
|
|
137
|
+
return { id: String(f.id), value: String(f.value) };
|
|
138
|
+
});
|
|
139
|
+
const previous = adapter.getState();
|
|
140
|
+
commit({ ...previous, filters }, "grid_filter", `Filtered ${filters.map((f) => f.id).join(", ") || "cleared"}`, previous);
|
|
141
|
+
return textResult(`Filtering on ${filters.map((f) => `${f.id}=${f.value}`).join(", ") || "nothing"}.`);
|
|
142
|
+
},
|
|
143
|
+
true,
|
|
144
|
+
(args) => Array.isArray(args.filters) && args.filters[0] ? String(args.filters[0].id) : void 0
|
|
145
|
+
);
|
|
146
|
+
reg(
|
|
147
|
+
"grid_select_rows",
|
|
148
|
+
"Replace the grid's row selection with the given row ids. Pass an empty array to clear.",
|
|
149
|
+
{ rowIds: { type: "array", items: { type: "string" }, description: "Row ids, per the grid's getRowId." } },
|
|
150
|
+
["rowIds"],
|
|
151
|
+
(args) => {
|
|
152
|
+
const ids = Array.isArray(args.rowIds) ? args.rowIds.map(String) : [];
|
|
153
|
+
const known = adapter.getRowIds?.();
|
|
154
|
+
if (known) {
|
|
155
|
+
const missing = ids.filter((id) => !known.includes(id));
|
|
156
|
+
if (missing.length) {
|
|
157
|
+
throw new Error(`Row id(s) not on this page: ${missing.join(", ")}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const previous = adapter.getState();
|
|
161
|
+
const rowSelection = {};
|
|
162
|
+
for (const id of ids) rowSelection[id] = true;
|
|
163
|
+
commit({ ...previous, rowSelection }, "grid_select_rows", `Selected ${ids.length} row${ids.length === 1 ? "" : "s"}`, previous);
|
|
164
|
+
return textResult(`Selected ${ids.length} row${ids.length === 1 ? "" : "s"}.`);
|
|
165
|
+
},
|
|
166
|
+
true
|
|
167
|
+
);
|
|
168
|
+
if (adapter.editCell) {
|
|
169
|
+
reg(
|
|
170
|
+
"grid_edit_cell",
|
|
171
|
+
"Write one cell. This changes DATA, not just the view.",
|
|
172
|
+
{
|
|
173
|
+
rowId: { type: "string" },
|
|
174
|
+
columnId: { type: "string" },
|
|
175
|
+
value: { description: "New value. Any JSON scalar or object the column accepts." }
|
|
176
|
+
},
|
|
177
|
+
["rowId", "columnId"],
|
|
178
|
+
async (args) => {
|
|
179
|
+
const rowId = String(args.rowId);
|
|
180
|
+
const columnId = String(args.columnId);
|
|
181
|
+
assertColumn(columnId);
|
|
182
|
+
const apply = async () => {
|
|
183
|
+
await adapter.editCell?.(rowId, columnId, args.value);
|
|
184
|
+
};
|
|
185
|
+
if (options.pendingMode) {
|
|
186
|
+
const id = `grid-edit-${Date.now().toString(36)}`;
|
|
187
|
+
options.onPending?.({ id, label: `set ${columnId} on row ${rowId}`, apply });
|
|
188
|
+
return textResult(`Staged: set ${columnId} on row ${rowId}. Awaiting confirmation.`);
|
|
189
|
+
}
|
|
190
|
+
await apply();
|
|
191
|
+
return textResult(`Set ${columnId} on row ${rowId}.`);
|
|
192
|
+
},
|
|
193
|
+
true,
|
|
194
|
+
(args) => `${String(args.rowId)}:${String(args.columnId)}`
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
id: `grid:${adapter.id}`,
|
|
199
|
+
title: adapter.title ?? adapter.id,
|
|
200
|
+
dispose: () => {
|
|
201
|
+
for (const d of disposers) d();
|
|
202
|
+
disposers.length = 0;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export { registerGridBridge };
|
|
208
|
+
//# sourceMappingURL=chunk-MJ2S25ON.js.map
|
|
209
|
+
//# sourceMappingURL=chunk-MJ2S25ON.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/grid.ts"],"names":[],"mappings":";;;;;AAmEA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAW9D,SAAS,kBAAA,CAAmB,MAAgB,OAAA,EAAoC;AACrF,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC3D,EAAA,MAAM,YAA+B,EAAC;AAEtC,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,MAAgC;AAAA,IAC9C,IAAA,EAAM,MAAA;AAAA,IACN,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,SAAA,EAAW,OAAO,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,KAAK,OAAA,CAAQ,EAAA;AAAA,IACpD,KAAA,EAAO,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAE,CAAA,QAAA,EAAM,IAAI,CAAA,CAAA,GAAM,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ;AAAA,GACvF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CACV,IAAA,EACA,WAAA,EACA,YACA,QAAA,EACA,OAAA,EACA,YACA,YAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAqB;AAC1C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,GACV,oBAAA,CAAqB,OAAA,EAAS;AAAA,MAC5B,QAAA,EAAU,IAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAA,EAAe,CAAC,EAAE,IAAA,OAAW,MAAA,CAAO,YAAA,GAAe,IAAI,CAAC;AAAA,KACzD,CAAA,GACD,OAAA;AAEJ,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,IAAA,CAAK,YAAA;AAAA,QACH;AAAA,UACE,IAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAa,EAAE,IAAA,EAAM,UAAU,UAAA,EAAiC,QAAA,EAAU,sBAAsB,KAAA;AAAM,SACxG;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAqB;AACzC,IAAA,MAAM,KAAA,GAAQ,QAAQ,YAAA,IAAe;AACrC,IAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,EAAE,iBAAiB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAiB,MAAA,EAAgB,OAAe,QAAA,KAA8B;AAC5F,IAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AACrB,IAAA,aAAA,CAAc,MAAM,EAAA,EAAI;AAAA,MACtB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,CAAA,KAAA,EAAQ,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,MAC5B,MAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrC,IAAA,EAAM,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI;AAAA,KAClC,CAAA;AAAA,EACH,CAAA;AAIA,EAAA,GAAA;AAAA,IACE,UAAA;AAAA,IACA,kIAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,MAAA,OAAO,UAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,UACH;AAAA,YACE,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,YAC3B,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,YAC3B,cAAA,EAAgB,OAAO,OAAA,CAAQ,KAAA,CAAM,gBAAgB,EAAE,EACpD,MAAA,CAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAA,CACrB,IAAI,CAAC,CAAC,EAAE,CAAA,KAAM,EAAE,CAAA;AAAA,YACnB,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,SAAA,EAAW,OAAA,CAAQ,YAAA,IAAe,IAAK,IAAA;AAAA,YACvC,MAAA,EAAQ,OAAA,CAAQ,SAAA,IAAY,IAAK,IAAA;AAAA,YACjC,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,QAAQ;AAAA,WACpC;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA;AAAA,IACE,WAAA;AAAA,IACA,8FAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU,EAAE;AAAA,UAChE,QAAA,EAAU,CAAC,IAAI,CAAA;AAAA,UACf,oBAAA,EAAsB;AAAA;AACxB;AACF,KACF;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAK,IAAA,CAAK,UAAyB,EAAC;AAC1E,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACzB,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,IAAA,EAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,MACnD,CAAC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,SAAQ,EAAG,WAAA,EAAa,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,SAAS,IAAI,QAAQ,CAAA;AACvH,MAAA,OAAO,UAAA,CAAW,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,EAAE,CAAA,EAAG,EAAE,IAAA,GAAO,OAAA,GAAU,EAAE,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACjH,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAI,MAAA,CAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAe,EAAE,CAAA,GAAI;AAAA,GACzG;AAEA,EAAA,GAAA;AAAA,IACE,aAAA;AAAA,IACA,4DAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,UAChE,QAAA,EAAU,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,UACxB,oBAAA,EAAsB;AAAA;AACxB;AACF,KACF;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAK,IAAA,CAAK,UAA2B,EAAC;AAC5E,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,QAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACzB,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,GAAG,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAE;AAAA,MACpD,CAAC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,SAAQ,EAAG,aAAA,EAAe,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,SAAS,IAAI,QAAQ,CAAA;AACxH,MAAA,OAAO,WAAW,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IACvG,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAI,MAAA,CAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAiB,EAAE,CAAA,GAAI;AAAA,GAC3G;AAEA,EAAA,GAAA;AAAA,IACE,kBAAA;AAAA,IACA,wFAAA;AAAA,IACA,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,mCAAA,EAAoC,EAAE;AAAA,IACzG,CAAC,QAAQ,CAAA;AAAA,IACT,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,IAAY;AAClC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAC,OAAO,CAAC,KAAA,CAAM,QAAA,CAAS,EAAE,CAAC,CAAA;AACtD,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAGlB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QACrE;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,EAAS;AAClC,MAAA,MAAM,eAAwC,EAAC;AAC/C,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,YAAA,CAAa,EAAE,CAAA,GAAI,IAAA;AAEzC,MAAA,MAAA,CAAO,EAAE,GAAG,QAAA,EAAU,YAAA,EAAa,EAAG,oBAAoB,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,IAAA,EAAO,IAAI,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,IAAI,QAAQ,CAAA;AAC9H,MAAA,OAAO,UAAA,CAAW,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,IAAA,EAAO,IAAI,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,GAAA;AAAA,MACE,gBAAA;AAAA,MACA,uDAAA;AAAA,MACA;AAAA,QACE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAO,EAAE,WAAA,EAAa,0DAAA;AAA2D,OACnF;AAAA,MACA,CAAC,SAAS,UAAU,CAAA;AAAA,MACpB,OAAO,IAAA,KAAS;AACd,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACrC,QAAA,YAAA,CAAa,QAAQ,CAAA;AAErB,QAAA,MAAM,QAAQ,YAAY;AACxB,UAAA,MAAM,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,QAAA,EAAU,KAAK,KAAK,CAAA;AAAA,QACtD,CAAA;AAEA,QAAA,IAAI,QAAQ,WAAA,EAAa;AAIvB,UAAA,MAAM,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC/C,UAAA,OAAA,CAAQ,SAAA,GAAY,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA,IAAA,EAAO,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,EAAI,KAAA,EAAO,CAAA;AAC3E,UAAA,OAAO,UAAA,CAAW,CAAA,YAAA,EAAe,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,wBAAA,CAA0B,CAAA;AAAA,QACrF;AAEA,QAAA,MAAM,KAAA,EAAM;AACZ,QAAA,OAAO,UAAA,CAAW,CAAA,IAAA,EAAO,QAAQ,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACtD,CAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAC,IAAA,KAAS,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,KAAA,EAAQ,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,IACtB,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAA;AAAA,IAChC,SAAS,MAAM;AACb,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAC7B,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AAAA,IACrB;AAAA,GACF;AACF","file":"chunk-MJ2S25ON.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport { pushUndoEntry } from \"../undo/undo-stack\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose grid types — the public state shape of `@particle-academy/fancy-grid`,\n * mirrored here rather than imported.\n *\n * Same reason the scene bridge mirrors fancy-3d's descriptor: a bridge must not\n * drag its surface package into every consumer's tree. fancy-grid keeps\n * TanStack Table and Virtual as PEERS specifically so nothing bundles them, and\n * an `import type` here would still make fancy-grid a build-time dependency of\n * agent-integrations. The state is four small JSON shapes; the coupling is not\n * worth it.\n */\nexport type GridSort = { id: string; desc: boolean };\nexport type GridFilter = { id: string; value: string };\nexport type GridPagination = { pageIndex: number; pageSize: number };\n\nexport type GridState = {\n sorting?: GridSort[];\n filters?: GridFilter[];\n /** Keyed by row id — see the grid's `getRowId`. */\n rowSelection?: Record<string, boolean>;\n pagination?: GridPagination;\n};\n\nexport type GridBridgeAdapter = {\n id: string;\n title?: string;\n screenId?: string;\n /** Controlled state — the same object the grid's `onStateChange` emits. */\n getState: () => GridState;\n setState: (next: GridState) => void;\n /**\n * Column ids an agent may address. Supplied so a tool can REJECT an unknown\n * column instead of writing a sort nothing applies — a silently ignored sort\n * looks identical to a grid that simply is not sorted.\n */\n getColumnIds?: () => string[];\n /** Row ids currently on screen, for `grid_select_rows` validation. */\n getRowIds?: () => string[];\n /**\n * Write one cell. Absent when the grid is read-only, in which case\n * `grid_edit_cell` is not registered at all rather than failing at call time\n * — an agent should discover the capability from the tool list.\n */\n editCell?: (rowId: string, columnId: string, value: unknown) => void | Promise<void>;\n};\n\nexport type GridBridgeOptions = {\n adapter: GridBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n /**\n * Gate writes behind a human confirmation. `grid_edit_cell` is the only\n * mutation that changes DATA rather than view state, so it is the one that\n * matters here — sorting a grid is not a trust-but-verify action.\n */\n pendingMode?: boolean;\n onPending?: (staged: { id: string; label: string; apply: () => void | Promise<void> }) => void;\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerGridBridge — MCP access to a `fancy-grid` surface.\n *\n * `grid_sort`, `grid_filter`, `grid_select_rows` and `grid_edit_cell`, plus a\n * read tool. View state (sort / filter / selection / page) goes through one\n * `setState` channel because that is how the grid is controlled — a bridge that\n * mutated pieces separately would drift from what the component actually\n * accepts.\n */\nexport function registerGridBridge(host: ToolHost, options: GridBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (part?: string): AgentTarget => ({\n kind: \"grid\",\n screenId: adapter.screenId,\n elementId: part ? `${adapter.id}:${part}` : adapter.id,\n label: part ? `${adapter.title ?? adapter.id} → ${part}` : (adapter.title ?? adapter.id),\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<ReturnType<typeof textResult>> | ReturnType<typeof textResult>,\n isMutation: boolean,\n partFromArgs?: (args: JsonObject) => string | undefined,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"grid\",\n screenId: adapter.screenId,\n resolveTarget: ({ args }) => target(partFromArgs?.(args)),\n })\n : wrapped;\n\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: { type: \"object\", properties: properties as never, required, additionalProperties: false },\n },\n final as never,\n ),\n );\n };\n\n /** Reject an unknown column rather than writing state nothing applies. */\n const assertColumn = (id: string): void => {\n const known = adapter.getColumnIds?.();\n if (known && !known.includes(id)) {\n throw new Error(`Unknown column \"${id}\". Available: ${known.join(\", \")}`);\n }\n };\n\n const commit = (next: GridState, action: string, label: string, previous: GridState): void => {\n adapter.setState(next);\n pushUndoEntry(agent.id, {\n timestamp: Date.now(),\n bridgeId: `grid:${adapter.id}`,\n action,\n label,\n undo: () => adapter.setState(previous),\n redo: () => adapter.setState(next),\n });\n };\n\n // ───────────── Read ─────────────\n\n reg(\n \"grid_get\",\n \"Read the grid's view state — sorting, filters, selected row ids, pagination — plus the addressable column and row ids.\",\n {},\n [],\n () => {\n const state = adapter.getState();\n return textResult(\n JSON.stringify(\n {\n id: adapter.id,\n title: adapter.title,\n sorting: state.sorting ?? [],\n filters: state.filters ?? [],\n selectedRowIds: Object.entries(state.rowSelection ?? {})\n .filter(([, on]) => on)\n .map(([id]) => id),\n pagination: state.pagination,\n columnIds: adapter.getColumnIds?.() ?? null,\n rowIds: adapter.getRowIds?.() ?? null,\n editable: Boolean(adapter.editCell),\n },\n null,\n 2,\n ),\n );\n },\n false,\n );\n\n // ───────────── View state ─────────────\n\n reg(\n \"grid_sort\",\n \"Sort the grid. Pass an empty array to clear sorting. Multiple entries sort by each in order.\",\n {\n sorting: {\n type: \"array\",\n description: 'e.g. [{ \"id\": \"createdAt\", \"desc\": true }]',\n items: {\n type: \"object\",\n properties: { id: { type: \"string\" }, desc: { type: \"boolean\" } },\n required: [\"id\"],\n additionalProperties: false,\n },\n },\n },\n [\"sorting\"],\n (args) => {\n const raw = Array.isArray(args.sorting) ? (args.sorting as GridSort[]) : [];\n const sorting = raw.map((s) => {\n assertColumn(String(s.id));\n return { id: String(s.id), desc: Boolean(s.desc) };\n });\n\n const previous = adapter.getState();\n commit({ ...previous, sorting }, \"grid_sort\", `Sorted by ${sorting.map((s) => s.id).join(\", \") || \"nothing\"}`, previous);\n return textResult(`Sorted by ${sorting.map((s) => `${s.id}${s.desc ? \" desc\" : \"\"}`).join(\", \") || \"nothing\"}.`);\n },\n true,\n (args) => (Array.isArray(args.sorting) && args.sorting[0] ? String((args.sorting[0] as GridSort).id) : undefined),\n );\n\n reg(\n \"grid_filter\",\n \"Filter the grid. Pass an empty array to clear all filters.\",\n {\n filters: {\n type: \"array\",\n description: 'e.g. [{ \"id\": \"status\", \"value\": \"open\" }]',\n items: {\n type: \"object\",\n properties: { id: { type: \"string\" }, value: { type: \"string\" } },\n required: [\"id\", \"value\"],\n additionalProperties: false,\n },\n },\n },\n [\"filters\"],\n (args) => {\n const raw = Array.isArray(args.filters) ? (args.filters as GridFilter[]) : [];\n const filters = raw.map((f) => {\n assertColumn(String(f.id));\n return { id: String(f.id), value: String(f.value) };\n });\n\n const previous = adapter.getState();\n commit({ ...previous, filters }, \"grid_filter\", `Filtered ${filters.map((f) => f.id).join(\", \") || \"cleared\"}`, previous);\n return textResult(`Filtering on ${filters.map((f) => `${f.id}=${f.value}`).join(\", \") || \"nothing\"}.`);\n },\n true,\n (args) => (Array.isArray(args.filters) && args.filters[0] ? String((args.filters[0] as GridFilter).id) : undefined),\n );\n\n reg(\n \"grid_select_rows\",\n \"Replace the grid's row selection with the given row ids. Pass an empty array to clear.\",\n { rowIds: { type: \"array\", items: { type: \"string\" }, description: \"Row ids, per the grid's getRowId.\" } },\n [\"rowIds\"],\n (args) => {\n const ids = Array.isArray(args.rowIds) ? args.rowIds.map(String) : [];\n const known = adapter.getRowIds?.();\n if (known) {\n const missing = ids.filter((id) => !known.includes(id));\n if (missing.length) {\n // Selecting a row that is not loaded looks like it worked and shows\n // nothing — worth an error rather than a silent no-op.\n throw new Error(`Row id(s) not on this page: ${missing.join(\", \")}`);\n }\n }\n\n const previous = adapter.getState();\n const rowSelection: Record<string, boolean> = {};\n for (const id of ids) rowSelection[id] = true;\n\n commit({ ...previous, rowSelection }, \"grid_select_rows\", `Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}`, previous);\n return textResult(`Selected ${ids.length} row${ids.length === 1 ? \"\" : \"s\"}.`);\n },\n true,\n );\n\n // ───────────── Data ─────────────\n\n if (adapter.editCell) {\n reg(\n \"grid_edit_cell\",\n \"Write one cell. This changes DATA, not just the view.\",\n {\n rowId: { type: \"string\" },\n columnId: { type: \"string\" },\n value: { description: \"New value. Any JSON scalar or object the column accepts.\" },\n },\n [\"rowId\", \"columnId\"],\n async (args) => {\n const rowId = String(args.rowId);\n const columnId = String(args.columnId);\n assertColumn(columnId);\n\n const apply = async () => {\n await adapter.editCell?.(rowId, columnId, args.value);\n };\n\n if (options.pendingMode) {\n // Trust-but-verify: the only tool here that changes stored data\n // stages instead of writing. Sorting a grid is not a destructive act;\n // editing a cell is.\n const id = `grid-edit-${Date.now().toString(36)}`;\n options.onPending?.({ id, label: `set ${columnId} on row ${rowId}`, apply });\n return textResult(`Staged: set ${columnId} on row ${rowId}. Awaiting confirmation.`);\n }\n\n await apply();\n return textResult(`Set ${columnId} on row ${rowId}.`);\n },\n true,\n (args) => `${String(args.rowId)}:${String(args.columnId)}`,\n );\n }\n\n return {\n id: `grid:${adapter.id}`,\n title: adapter.title ?? adapter.id,\n dispose: () => {\n for (const d of disposers) d();\n disposers.length = 0;\n },\n };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1365,13 +1365,215 @@ function registerChartsBridge(host, options) {
|
|
|
1365
1365
|
};
|
|
1366
1366
|
}
|
|
1367
1367
|
|
|
1368
|
-
// src/bridges/
|
|
1368
|
+
// src/bridges/grid.ts
|
|
1369
1369
|
var DEFAULT_AGENT5 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1370
|
-
function
|
|
1370
|
+
function registerGridBridge(host, options) {
|
|
1371
1371
|
const { adapter } = options;
|
|
1372
1372
|
const agent = { ...DEFAULT_AGENT5, ...options.agent ?? {} };
|
|
1373
1373
|
const disposers = [];
|
|
1374
1374
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1375
|
+
const target = (part) => ({
|
|
1376
|
+
kind: "grid",
|
|
1377
|
+
screenId: adapter.screenId,
|
|
1378
|
+
elementId: part ? `${adapter.id}:${part}` : adapter.id,
|
|
1379
|
+
label: part ? `${adapter.title ?? adapter.id} \u2192 ${part}` : adapter.title ?? adapter.id
|
|
1380
|
+
});
|
|
1381
|
+
const reg = (name, description, properties, required, handler, isMutation, partFromArgs) => {
|
|
1382
|
+
const wrapped = async (args) => {
|
|
1383
|
+
try {
|
|
1384
|
+
return await handler(args);
|
|
1385
|
+
} catch (e) {
|
|
1386
|
+
return errorResult(e instanceof Error ? e.message : String(e));
|
|
1387
|
+
}
|
|
1388
|
+
};
|
|
1389
|
+
const final = isMutation ? wrapToolWithActivity(wrapped, {
|
|
1390
|
+
toolName: name,
|
|
1391
|
+
agent,
|
|
1392
|
+
kind: "grid",
|
|
1393
|
+
screenId: adapter.screenId,
|
|
1394
|
+
resolveTarget: ({ args }) => target(partFromArgs?.(args))
|
|
1395
|
+
}) : wrapped;
|
|
1396
|
+
disposers.push(
|
|
1397
|
+
host.registerTool(
|
|
1398
|
+
{
|
|
1399
|
+
name,
|
|
1400
|
+
description,
|
|
1401
|
+
inputSchema: { type: "object", properties, required, additionalProperties: false }
|
|
1402
|
+
},
|
|
1403
|
+
final
|
|
1404
|
+
)
|
|
1405
|
+
);
|
|
1406
|
+
};
|
|
1407
|
+
const assertColumn = (id) => {
|
|
1408
|
+
const known = adapter.getColumnIds?.();
|
|
1409
|
+
if (known && !known.includes(id)) {
|
|
1410
|
+
throw new Error(`Unknown column "${id}". Available: ${known.join(", ")}`);
|
|
1411
|
+
}
|
|
1412
|
+
};
|
|
1413
|
+
const commit = (next, action, label, previous) => {
|
|
1414
|
+
adapter.setState(next);
|
|
1415
|
+
fancyAutoCommon.pushUndoEntry(agent.id, {
|
|
1416
|
+
timestamp: Date.now(),
|
|
1417
|
+
bridgeId: `grid:${adapter.id}`,
|
|
1418
|
+
action,
|
|
1419
|
+
label,
|
|
1420
|
+
undo: () => adapter.setState(previous),
|
|
1421
|
+
redo: () => adapter.setState(next)
|
|
1422
|
+
});
|
|
1423
|
+
};
|
|
1424
|
+
reg(
|
|
1425
|
+
"grid_get",
|
|
1426
|
+
"Read the grid's view state \u2014 sorting, filters, selected row ids, pagination \u2014 plus the addressable column and row ids.",
|
|
1427
|
+
{},
|
|
1428
|
+
[],
|
|
1429
|
+
() => {
|
|
1430
|
+
const state = adapter.getState();
|
|
1431
|
+
return textResult(
|
|
1432
|
+
JSON.stringify(
|
|
1433
|
+
{
|
|
1434
|
+
id: adapter.id,
|
|
1435
|
+
title: adapter.title,
|
|
1436
|
+
sorting: state.sorting ?? [],
|
|
1437
|
+
filters: state.filters ?? [],
|
|
1438
|
+
selectedRowIds: Object.entries(state.rowSelection ?? {}).filter(([, on]) => on).map(([id]) => id),
|
|
1439
|
+
pagination: state.pagination,
|
|
1440
|
+
columnIds: adapter.getColumnIds?.() ?? null,
|
|
1441
|
+
rowIds: adapter.getRowIds?.() ?? null,
|
|
1442
|
+
editable: Boolean(adapter.editCell)
|
|
1443
|
+
},
|
|
1444
|
+
null,
|
|
1445
|
+
2
|
|
1446
|
+
)
|
|
1447
|
+
);
|
|
1448
|
+
},
|
|
1449
|
+
false
|
|
1450
|
+
);
|
|
1451
|
+
reg(
|
|
1452
|
+
"grid_sort",
|
|
1453
|
+
"Sort the grid. Pass an empty array to clear sorting. Multiple entries sort by each in order.",
|
|
1454
|
+
{
|
|
1455
|
+
sorting: {
|
|
1456
|
+
type: "array",
|
|
1457
|
+
description: 'e.g. [{ "id": "createdAt", "desc": true }]',
|
|
1458
|
+
items: {
|
|
1459
|
+
type: "object",
|
|
1460
|
+
properties: { id: { type: "string" }, desc: { type: "boolean" } },
|
|
1461
|
+
required: ["id"],
|
|
1462
|
+
additionalProperties: false
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
},
|
|
1466
|
+
["sorting"],
|
|
1467
|
+
(args) => {
|
|
1468
|
+
const raw = Array.isArray(args.sorting) ? args.sorting : [];
|
|
1469
|
+
const sorting = raw.map((s) => {
|
|
1470
|
+
assertColumn(String(s.id));
|
|
1471
|
+
return { id: String(s.id), desc: Boolean(s.desc) };
|
|
1472
|
+
});
|
|
1473
|
+
const previous = adapter.getState();
|
|
1474
|
+
commit({ ...previous, sorting }, "grid_sort", `Sorted by ${sorting.map((s) => s.id).join(", ") || "nothing"}`, previous);
|
|
1475
|
+
return textResult(`Sorted by ${sorting.map((s) => `${s.id}${s.desc ? " desc" : ""}`).join(", ") || "nothing"}.`);
|
|
1476
|
+
},
|
|
1477
|
+
true,
|
|
1478
|
+
(args) => Array.isArray(args.sorting) && args.sorting[0] ? String(args.sorting[0].id) : void 0
|
|
1479
|
+
);
|
|
1480
|
+
reg(
|
|
1481
|
+
"grid_filter",
|
|
1482
|
+
"Filter the grid. Pass an empty array to clear all filters.",
|
|
1483
|
+
{
|
|
1484
|
+
filters: {
|
|
1485
|
+
type: "array",
|
|
1486
|
+
description: 'e.g. [{ "id": "status", "value": "open" }]',
|
|
1487
|
+
items: {
|
|
1488
|
+
type: "object",
|
|
1489
|
+
properties: { id: { type: "string" }, value: { type: "string" } },
|
|
1490
|
+
required: ["id", "value"],
|
|
1491
|
+
additionalProperties: false
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
},
|
|
1495
|
+
["filters"],
|
|
1496
|
+
(args) => {
|
|
1497
|
+
const raw = Array.isArray(args.filters) ? args.filters : [];
|
|
1498
|
+
const filters = raw.map((f) => {
|
|
1499
|
+
assertColumn(String(f.id));
|
|
1500
|
+
return { id: String(f.id), value: String(f.value) };
|
|
1501
|
+
});
|
|
1502
|
+
const previous = adapter.getState();
|
|
1503
|
+
commit({ ...previous, filters }, "grid_filter", `Filtered ${filters.map((f) => f.id).join(", ") || "cleared"}`, previous);
|
|
1504
|
+
return textResult(`Filtering on ${filters.map((f) => `${f.id}=${f.value}`).join(", ") || "nothing"}.`);
|
|
1505
|
+
},
|
|
1506
|
+
true,
|
|
1507
|
+
(args) => Array.isArray(args.filters) && args.filters[0] ? String(args.filters[0].id) : void 0
|
|
1508
|
+
);
|
|
1509
|
+
reg(
|
|
1510
|
+
"grid_select_rows",
|
|
1511
|
+
"Replace the grid's row selection with the given row ids. Pass an empty array to clear.",
|
|
1512
|
+
{ rowIds: { type: "array", items: { type: "string" }, description: "Row ids, per the grid's getRowId." } },
|
|
1513
|
+
["rowIds"],
|
|
1514
|
+
(args) => {
|
|
1515
|
+
const ids = Array.isArray(args.rowIds) ? args.rowIds.map(String) : [];
|
|
1516
|
+
const known = adapter.getRowIds?.();
|
|
1517
|
+
if (known) {
|
|
1518
|
+
const missing = ids.filter((id) => !known.includes(id));
|
|
1519
|
+
if (missing.length) {
|
|
1520
|
+
throw new Error(`Row id(s) not on this page: ${missing.join(", ")}`);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
const previous = adapter.getState();
|
|
1524
|
+
const rowSelection = {};
|
|
1525
|
+
for (const id of ids) rowSelection[id] = true;
|
|
1526
|
+
commit({ ...previous, rowSelection }, "grid_select_rows", `Selected ${ids.length} row${ids.length === 1 ? "" : "s"}`, previous);
|
|
1527
|
+
return textResult(`Selected ${ids.length} row${ids.length === 1 ? "" : "s"}.`);
|
|
1528
|
+
},
|
|
1529
|
+
true
|
|
1530
|
+
);
|
|
1531
|
+
if (adapter.editCell) {
|
|
1532
|
+
reg(
|
|
1533
|
+
"grid_edit_cell",
|
|
1534
|
+
"Write one cell. This changes DATA, not just the view.",
|
|
1535
|
+
{
|
|
1536
|
+
rowId: { type: "string" },
|
|
1537
|
+
columnId: { type: "string" },
|
|
1538
|
+
value: { description: "New value. Any JSON scalar or object the column accepts." }
|
|
1539
|
+
},
|
|
1540
|
+
["rowId", "columnId"],
|
|
1541
|
+
async (args) => {
|
|
1542
|
+
const rowId = String(args.rowId);
|
|
1543
|
+
const columnId = String(args.columnId);
|
|
1544
|
+
assertColumn(columnId);
|
|
1545
|
+
const apply = async () => {
|
|
1546
|
+
await adapter.editCell?.(rowId, columnId, args.value);
|
|
1547
|
+
};
|
|
1548
|
+
if (options.pendingMode) {
|
|
1549
|
+
const id = `grid-edit-${Date.now().toString(36)}`;
|
|
1550
|
+
options.onPending?.({ id, label: `set ${columnId} on row ${rowId}`, apply });
|
|
1551
|
+
return textResult(`Staged: set ${columnId} on row ${rowId}. Awaiting confirmation.`);
|
|
1552
|
+
}
|
|
1553
|
+
await apply();
|
|
1554
|
+
return textResult(`Set ${columnId} on row ${rowId}.`);
|
|
1555
|
+
},
|
|
1556
|
+
true,
|
|
1557
|
+
(args) => `${String(args.rowId)}:${String(args.columnId)}`
|
|
1558
|
+
);
|
|
1559
|
+
}
|
|
1560
|
+
return {
|
|
1561
|
+
id: `grid:${adapter.id}`,
|
|
1562
|
+
title: adapter.title ?? adapter.id,
|
|
1563
|
+
dispose: () => {
|
|
1564
|
+
for (const d of disposers) d();
|
|
1565
|
+
disposers.length = 0;
|
|
1566
|
+
}
|
|
1567
|
+
};
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
// src/bridges/scene.ts
|
|
1571
|
+
var DEFAULT_AGENT6 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1572
|
+
function registerSceneBridge(host, options) {
|
|
1573
|
+
const { adapter } = options;
|
|
1574
|
+
const agent = { ...DEFAULT_AGENT6, ...options.agent ?? {} };
|
|
1575
|
+
const disposers = [];
|
|
1576
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1375
1577
|
const target = (objectId) => ({
|
|
1376
1578
|
kind: "scene",
|
|
1377
1579
|
screenId: adapter.screenId,
|
|
@@ -1564,10 +1766,10 @@ function parseTriple(v) {
|
|
|
1564
1766
|
}
|
|
1565
1767
|
|
|
1566
1768
|
// src/bridges/screens.ts
|
|
1567
|
-
var
|
|
1769
|
+
var DEFAULT_AGENT7 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1568
1770
|
function registerScreensBridge(host, options) {
|
|
1569
1771
|
const { adapter } = options;
|
|
1570
|
-
const agent = { ...
|
|
1772
|
+
const agent = { ...DEFAULT_AGENT7, ...options.agent ?? {} };
|
|
1571
1773
|
const disposers = [];
|
|
1572
1774
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1573
1775
|
const target = (screenId) => ({
|
|
@@ -1739,10 +1941,10 @@ function registerScreensBridge(host, options) {
|
|
|
1739
1941
|
}
|
|
1740
1942
|
|
|
1741
1943
|
// src/bridges/slides.ts
|
|
1742
|
-
var
|
|
1944
|
+
var DEFAULT_AGENT8 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1743
1945
|
function registerSlidesBridge(host, options) {
|
|
1744
1946
|
const { adapter } = options;
|
|
1745
|
-
const agent = { ...
|
|
1947
|
+
const agent = { ...DEFAULT_AGENT8, ...options.agent ?? {} };
|
|
1746
1948
|
const disposers = [];
|
|
1747
1949
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1748
1950
|
const deckTarget = () => ({
|
|
@@ -2182,13 +2384,13 @@ function firstTextContent(slide) {
|
|
|
2182
2384
|
}
|
|
2183
2385
|
|
|
2184
2386
|
// src/bridges/map.ts
|
|
2185
|
-
var
|
|
2387
|
+
var DEFAULT_AGENT9 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
2186
2388
|
var num2 = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
2187
2389
|
var str2 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
2188
2390
|
var newId = (prefix) => `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;
|
|
2189
2391
|
function registerMapBridge(host, options) {
|
|
2190
2392
|
const { adapter } = options;
|
|
2191
|
-
const agent = { ...
|
|
2393
|
+
const agent = { ...DEFAULT_AGENT9, ...options.agent ?? {} };
|
|
2192
2394
|
const disposers = [];
|
|
2193
2395
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
2194
2396
|
const mTarget = (args, result) => ({
|
|
@@ -2596,7 +2798,7 @@ function registerGitBridge(host, options) {
|
|
|
2596
2798
|
}
|
|
2597
2799
|
|
|
2598
2800
|
// src/bridges/files.ts
|
|
2599
|
-
var
|
|
2801
|
+
var DEFAULT_AGENT10 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
2600
2802
|
var MAX_SNAPSHOT_DEPTH = 8;
|
|
2601
2803
|
function assertPathWithinRoot(root, path) {
|
|
2602
2804
|
const segments = path.replace(/[\\/]+/g, "/").split("/");
|
|
@@ -2626,7 +2828,7 @@ var asPaths = (v) => {
|
|
|
2626
2828
|
};
|
|
2627
2829
|
function registerFilesBridge(host, options) {
|
|
2628
2830
|
const { adapter } = options;
|
|
2629
|
-
const agent = { ...
|
|
2831
|
+
const agent = { ...DEFAULT_AGENT10, ...options.agent ?? {} };
|
|
2630
2832
|
const disposers = [];
|
|
2631
2833
|
const guard = (path) => {
|
|
2632
2834
|
if (options.root !== void 0) assertPathWithinRoot(options.root, path);
|
|
@@ -2826,10 +3028,10 @@ function registerFilesBridge(host, options) {
|
|
|
2826
3028
|
}
|
|
2827
3029
|
|
|
2828
3030
|
// src/bridges/terminal.ts
|
|
2829
|
-
var
|
|
3031
|
+
var DEFAULT_AGENT11 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
2830
3032
|
var truncate = (s, n = 60) => s.length > n ? s.slice(0, n) + "\u2026" : s;
|
|
2831
3033
|
function registerTerminalBridge(host, options) {
|
|
2832
|
-
const agent = { ...
|
|
3034
|
+
const agent = { ...DEFAULT_AGENT11, ...options.agent ?? {} };
|
|
2833
3035
|
const pendingMode = options.pendingMode ?? true;
|
|
2834
3036
|
const screenId = options.screenId ?? options.adapter?.screenId;
|
|
2835
3037
|
const disposers = [];
|
|
@@ -3119,10 +3321,10 @@ function registerTerminalBridge(host, options) {
|
|
|
3119
3321
|
}
|
|
3120
3322
|
|
|
3121
3323
|
// src/bridges/navigation.ts
|
|
3122
|
-
var
|
|
3324
|
+
var DEFAULT_AGENT12 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
3123
3325
|
function registerNavigationBridge(host, options) {
|
|
3124
3326
|
const { adapter } = options;
|
|
3125
|
-
const agent = { ...
|
|
3327
|
+
const agent = { ...DEFAULT_AGENT12, ...options.agent ?? {} };
|
|
3126
3328
|
const pendingMode = options.pendingMode ?? true;
|
|
3127
3329
|
const disposers = [];
|
|
3128
3330
|
let groundedRevision = null;
|
|
@@ -3383,12 +3585,12 @@ function registerNavigationBridge(host, options) {
|
|
|
3383
3585
|
}
|
|
3384
3586
|
|
|
3385
3587
|
// src/bridges/catalog.ts
|
|
3386
|
-
var
|
|
3588
|
+
var DEFAULT_AGENT13 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
3387
3589
|
var str4 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
3388
3590
|
var num4 = (v, fallback = 0) => typeof v === "number" && Number.isFinite(v) ? v : fallback;
|
|
3389
3591
|
function registerCatalogBridge(host, options) {
|
|
3390
3592
|
const { adapter } = options;
|
|
3391
|
-
const agent = { ...
|
|
3593
|
+
const agent = { ...DEFAULT_AGENT13, ...options.agent ?? {} };
|
|
3392
3594
|
const pendingMode = options.pendingMode ?? true;
|
|
3393
3595
|
const catalogId = adapter.id ?? "catalog";
|
|
3394
3596
|
const disposers = [];
|
|
@@ -3684,12 +3886,12 @@ function registerCatalogBridge(host, options) {
|
|
|
3684
3886
|
}
|
|
3685
3887
|
|
|
3686
3888
|
// src/bridges/features.ts
|
|
3687
|
-
var
|
|
3889
|
+
var DEFAULT_AGENT14 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
3688
3890
|
var str5 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
3689
3891
|
var num5 = (v, fallback = 0) => typeof v === "number" && Number.isFinite(v) ? v : fallback;
|
|
3690
3892
|
function registerFeaturesBridge(host, options) {
|
|
3691
3893
|
const { adapter } = options;
|
|
3692
|
-
const agent = { ...
|
|
3894
|
+
const agent = { ...DEFAULT_AGENT14, ...options.agent ?? {} };
|
|
3693
3895
|
const pendingMode = options.pendingMode ?? true;
|
|
3694
3896
|
const featuresId = adapter.id ?? "features";
|
|
3695
3897
|
const disposers = [];
|
|
@@ -3898,7 +4100,7 @@ function registerFeaturesBridge(host, options) {
|
|
|
3898
4100
|
}
|
|
3899
4101
|
|
|
3900
4102
|
// src/bridges/passkeys.ts
|
|
3901
|
-
var
|
|
4103
|
+
var DEFAULT_AGENT15 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
3902
4104
|
var str6 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
3903
4105
|
function toSummary(record) {
|
|
3904
4106
|
return {
|
|
@@ -3921,7 +4123,7 @@ var PASSKEY_BRIDGE_TOOLS = [
|
|
|
3921
4123
|
];
|
|
3922
4124
|
function registerPasskeyBridge(host, options) {
|
|
3923
4125
|
const { adapter } = options;
|
|
3924
|
-
const agent = { ...
|
|
4126
|
+
const agent = { ...DEFAULT_AGENT15, ...options.agent ?? {} };
|
|
3925
4127
|
const surfaceId = adapter.id ?? "passkeys";
|
|
3926
4128
|
const disposers = [];
|
|
3927
4129
|
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
@@ -4082,10 +4284,10 @@ function registerPasskeyBridge(host, options) {
|
|
|
4082
4284
|
}
|
|
4083
4285
|
};
|
|
4084
4286
|
}
|
|
4085
|
-
var
|
|
4287
|
+
var DEFAULT_AGENT16 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
4086
4288
|
function registerDocBridge(host, options) {
|
|
4087
4289
|
const { adapter, surface } = options;
|
|
4088
|
-
const agent = { ...
|
|
4290
|
+
const agent = { ...DEFAULT_AGENT16, ...options.agent ?? {} };
|
|
4089
4291
|
const reducer = options.reducer ?? fancyDocCommons.treeReducer();
|
|
4090
4292
|
const stage = options.stagePolicy ?? fancyDocCommons.autoApply;
|
|
4091
4293
|
const makeNode = options.makeNode ?? (({ id, type, parent, order }, props) => ({ id, type, parent, order, props }));
|
|
@@ -4744,11 +4946,11 @@ function attachSseRelay(server, options) {
|
|
|
4744
4946
|
|
|
4745
4947
|
// src/sharing/use-co-browse-session.ts
|
|
4746
4948
|
init_registry();
|
|
4747
|
-
var
|
|
4949
|
+
var DEFAULT_AGENT17 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
4748
4950
|
var USER = { id: "human", name: "You" };
|
|
4749
4951
|
function useCoBrowseSession(options) {
|
|
4750
4952
|
const { adapter, extraBridges } = options;
|
|
4751
|
-
const agent = { ...
|
|
4953
|
+
const agent = { ...DEFAULT_AGENT17, ...options.agent ?? {} };
|
|
4752
4954
|
const relayBaseUrl = options.relayBaseUrl ?? "/agent-relay";
|
|
4753
4955
|
const serverRef = react.useRef(null);
|
|
4754
4956
|
const relayRef = react.useRef(null);
|
|
@@ -6080,6 +6282,7 @@ exports.registerFeaturesBridge = registerFeaturesBridge;
|
|
|
6080
6282
|
exports.registerFilesBridge = registerFilesBridge;
|
|
6081
6283
|
exports.registerFormBridge = registerFormBridge;
|
|
6082
6284
|
exports.registerGitBridge = registerGitBridge;
|
|
6285
|
+
exports.registerGridBridge = registerGridBridge;
|
|
6083
6286
|
exports.registerMapBridge = registerMapBridge;
|
|
6084
6287
|
exports.registerNavigationBridge = registerNavigationBridge;
|
|
6085
6288
|
exports.registerPasskeyBridge = registerPasskeyBridge;
|