@ai-matrx/alchemy 0.8.13 → 0.8.17

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 (88) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/actions.cjs +1 -373
  3. package/dist/actions.cjs.map +1 -1
  4. package/dist/actions.js +1 -350
  5. package/dist/actions.js.map +1 -1
  6. package/dist/checks.cjs +9 -314
  7. package/dist/checks.cjs.map +1 -1
  8. package/dist/checks.js +8 -290
  9. package/dist/checks.js.map +1 -1
  10. package/dist/core.cjs +9 -1728
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +2 -0
  13. package/dist/core.d.ts +2 -0
  14. package/dist/core.js +9 -1702
  15. package/dist/core.js.map +1 -1
  16. package/dist/declare-host.cjs +1 -18
  17. package/dist/declare-host.cjs.map +1 -1
  18. package/dist/declare.cjs +1 -638
  19. package/dist/declare.cjs.map +1 -1
  20. package/dist/declare.js +1 -615
  21. package/dist/declare.js.map +1 -1
  22. package/dist/index.cjs +9 -1728
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +2 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +9 -1702
  27. package/dist/index.js.map +1 -1
  28. package/dist/menu.cjs +1 -529
  29. package/dist/menu.cjs.map +1 -1
  30. package/dist/menu.js +1 -506
  31. package/dist/menu.js.map +1 -1
  32. package/dist/operate-document.cjs +4 -162
  33. package/dist/operate-document.cjs.map +1 -1
  34. package/dist/operate-document.js +4 -129
  35. package/dist/operate-document.js.map +1 -1
  36. package/dist/operate-rich-html.cjs +1 -128
  37. package/dist/operate-rich-html.cjs.map +1 -1
  38. package/dist/operate-rich-html.js +1 -95
  39. package/dist/operate-rich-html.js.map +1 -1
  40. package/dist/operate-server.cjs +1 -156
  41. package/dist/operate-server.cjs.map +1 -1
  42. package/dist/operate-server.js +1 -133
  43. package/dist/operate-server.js.map +1 -1
  44. package/dist/operate-xlsx.cjs +143 -34230
  45. package/dist/operate-xlsx.cjs.map +1 -1
  46. package/dist/operate-xlsx.js +143 -34214
  47. package/dist/operate-xlsx.js.map +1 -1
  48. package/dist/operate.cjs +9 -1726
  49. package/dist/operate.cjs.map +1 -1
  50. package/dist/operate.d.cts +2 -0
  51. package/dist/operate.d.ts +2 -0
  52. package/dist/operate.js +9 -1702
  53. package/dist/operate.js.map +1 -1
  54. package/dist/ports.cjs +1 -18
  55. package/dist/ports.cjs.map +1 -1
  56. package/dist/react-bar.cjs +2 -795
  57. package/dist/react-bar.cjs.map +1 -1
  58. package/dist/react-bar.js +2 -774
  59. package/dist/react-bar.js.map +1 -1
  60. package/dist/react-host.cjs +1 -299
  61. package/dist/react-host.cjs.map +1 -1
  62. package/dist/react-host.js +1 -267
  63. package/dist/react-host.js.map +1 -1
  64. package/dist/react-menu.cjs +2 -848
  65. package/dist/react-menu.cjs.map +1 -1
  66. package/dist/react-menu.js +2 -835
  67. package/dist/react-menu.js.map +1 -1
  68. package/dist/react-overflow.cjs +2 -695
  69. package/dist/react-overflow.cjs.map +1 -1
  70. package/dist/react-overflow.js +2 -674
  71. package/dist/react-overflow.js.map +1 -1
  72. package/dist/react-palette.cjs +2 -586
  73. package/dist/react-palette.cjs.map +1 -1
  74. package/dist/react-palette.js +2 -554
  75. package/dist/react-palette.js.map +1 -1
  76. package/dist/react-selection.cjs +2 -726
  77. package/dist/react-selection.cjs.map +1 -1
  78. package/dist/react-selection.js +2 -705
  79. package/dist/react-selection.js.map +1 -1
  80. package/dist/react-sheet.cjs +2 -734
  81. package/dist/react-sheet.cjs.map +1 -1
  82. package/dist/react-sheet.js +2 -713
  83. package/dist/react-sheet.js.map +1 -1
  84. package/dist/react.cjs +1 -29
  85. package/dist/react.cjs.map +1 -1
  86. package/dist/react.js +1 -8
  87. package/dist/react.js.map +1 -1
  88. package/package.json +1 -1
package/dist/operate.js CHANGED
@@ -1,1711 +1,18 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res, err) => function __init() {
4
- if (err) throw err[0];
5
- try {
6
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
- } catch (e) {
8
- throw err = [e], e;
9
- }
10
- };
11
- var __export = (target, all) => {
12
- for (var name in all)
13
- __defProp(target, name, { get: all[name], enumerable: true });
14
- };
15
-
16
- // src/operate/types.ts
17
- var init_types = __esm({
18
- "src/operate/types.ts"() {
19
- "use strict";
20
- }
21
- });
22
-
23
- // src/operate/fenced-code.ts
24
- function fencedCodeBlock(text, language) {
25
- const runs = text.match(/`+/g) ?? [];
26
- const fence = "`".repeat(Math.max(3, ...runs.map((run) => run.length + 1)));
27
- return `${fence}${language}
28
- ${text}${text.endsWith("\n") ? "" : "\n"}${fence}`;
29
- }
30
- var init_fenced_code = __esm({
31
- "src/operate/fenced-code.ts"() {
32
- "use strict";
33
- }
34
- });
35
-
36
- // src/operate/agent-payload.ts
37
- function fenceJsonBlock(json) {
38
- return fencedCodeBlock(json.trimEnd(), "json");
39
- }
40
- function buildAgentPayload(input, environment = {}) {
41
- const kind = xmlName(input.kind);
42
- const url = environment.url ?? (typeof window === "undefined" ? "" : window.location.href);
43
- const route = environment.route ?? (typeof window === "undefined" ? "" : window.location.pathname);
44
- const attrs = presentEntries(input.attributes).map(([key, value]) => ` ${xmlName(key)}="${escapeXml(String(value))}"`).join("");
45
- const entries = [
46
- ["location", input.location],
47
- ...url ? [["url", url]] : [],
48
- ...route ? [["route", route]] : [],
49
- ["copied", input.description],
50
- ["copied-at", environment.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString()],
51
- ...presentEntries(input.context).map(([key, value]) => [xmlName(key), String(value)])
52
- ];
53
- const json = JSON.stringify(input.data, null, 2);
54
- if (json === void 0) throw new Error("AI envelope data must be JSON serializable.");
55
- const safeJson = json.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026");
56
- const context = entries.map(([key, value]) => `<${key}>${escapeXml(value)}</${key}>`).join("\n");
57
- const summary = input.summary ? `<summary>
1
+ var __defProp=Object.defineProperty;var __getOwnPropNames=Object.getOwnPropertyNames;var __esm=(fn,res,err)=>function(){if(err)throw err[0];try{return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res}catch(e){throw err=[e],e}};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};var init_types=__esm({"src/operate/types.ts"(){"use strict"}});function fencedCodeBlock(text,language){let runs=text.match(/`+/g)??[],fence="`".repeat(Math.max(3,...runs.map(run=>run.length+1)));return`${fence}${language}
2
+ ${text}${text.endsWith(`
3
+ `)?"":`
4
+ `}${fence}`}var init_fenced_code=__esm({"src/operate/fenced-code.ts"(){"use strict"}});function fenceJsonBlock(json){return fencedCodeBlock(json.trimEnd(),"json")}function buildAgentPayload(input,environment={}){let kind=xmlName(input.kind),url=environment.url??(typeof window>"u"?"":window.location.href),route=environment.route??(typeof window>"u"?"":window.location.pathname),attrs=presentEntries(input.attributes).map(([key,value])=>` ${xmlName(key)}="${escapeXml(String(value))}"`).join(""),entries=[["location",input.location],...url?[["url",url]]:[],...route?[["route",route]]:[],["copied",input.description],["copied-at",environment.capturedAt??new Date().toISOString()],...presentEntries(input.context).map(([key,value])=>[xmlName(key),String(value)])],json=JSON.stringify(input.data,null,2);if(json===void 0)throw new Error("AI envelope data must be JSON serializable.");let safeJson=json.replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026"),context=entries.map(([key,value])=>`<${key}>${escapeXml(value)}</${key}>`).join(`
5
+ `),summary=input.summary?`<summary>
58
6
  ${escapeXml(input.summary)}
59
7
  </summary>
60
- ` : "";
61
- return `<${kind}${attrs}>
8
+ `:"";return`<${kind}${attrs}>
62
9
  <context>
63
10
  ${context}
64
11
  </context>
65
12
  ${summary}<data format="json">
66
13
  ${fenceJsonBlock(safeJson)}
67
14
  </data>
68
- </${kind}>`;
69
- }
70
- var escapeXml, xmlName, presentEntries;
71
- var init_agent_payload = __esm({
72
- "src/operate/agent-payload.ts"() {
73
- "use strict";
74
- init_fenced_code();
75
- escapeXml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
76
- xmlName = (name) => {
77
- if (!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(name)) throw new Error(`Invalid AI envelope name: ${name}`);
78
- return name;
79
- };
80
- presentEntries = (values) => Object.entries(values ?? {}).filter(([, value]) => value !== null && value !== void 0 && value !== "");
81
- }
82
- });
83
-
84
- // src/operate/core.ts
85
- import { stringifyJson } from "@ai-matrx/kit/json-format";
86
- import { escapeHtml } from "@ai-matrx/kit/html-escape";
87
- function clone(v, path = "", seen = /* @__PURE__ */ new WeakSet(), policy = {}) {
88
- if (v === null || typeof v === "string" || typeof v === "boolean") return v;
89
- if (typeof v === "number") {
90
- if (!Number.isFinite(v))
91
- throw new ContentTransferError(
92
- "unsupported-value",
93
- "Only finite numbers are transferable",
94
- path
95
- );
96
- return v;
97
- }
98
- if (typeof v !== "object")
99
- throw new ContentTransferError(
100
- "unsupported-value",
101
- "Unsupported value",
102
- path
103
- );
104
- if (seen.has(v))
105
- throw new ContentTransferError(
106
- "circular-value",
107
- "Circular values cannot be transferred",
108
- path
109
- );
110
- if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype && Object.getPrototypeOf(v) !== null)
111
- throw new ContentTransferError(
112
- "unsupported-value",
113
- "Only plain JSON objects are transferable",
114
- path
115
- );
116
- seen.add(v);
117
- if (Array.isArray(v)) {
118
- for (let index = 0; index < v.length; index += 1)
119
- if (!Object.hasOwn(v, index))
120
- throw new ContentTransferError(
121
- "unsupported-value",
122
- "Sparse arrays cannot be transferred",
123
- `${path}/${index}`
124
- );
125
- }
126
- const out = Array.isArray(v) ? v.map((x, i) => clone(x, `${path}/${i}`, seen, policy)) : Object.fromEntries(
127
- Object.entries(v).filter(([, x]) => !policy.omitUndefinedObjectProperties || x !== void 0).map(([k, x]) => [
128
- k,
129
- clone(x, `${path}/${enc(k)}`, seen, policy)
130
- ])
131
- );
132
- seen.delete(v);
133
- return out;
134
- }
135
- function displaySurfacePointer(path) {
136
- if (!path) return "/";
137
- const safe = path.split("/").slice(1).map((segment) => {
138
- const controlSafe = segment.replace(
139
- /[\u0000-\u001F\u007F-\u009F]/g,
140
- (character) => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`
141
- );
142
- return truncateSurfacePointer(controlSafe, maxSurfacePointerSegmentLength);
143
- }).join("/");
144
- const pointer = `/${safe}`;
145
- return truncateSurfacePointer(pointer, maxSurfacePointerLength);
146
- }
147
- function cloneSurfaceValue(value, path) {
148
- try {
149
- return normalizeTransferJsonAtPath(value, path, {
150
- omitUndefinedObjectProperties: true
151
- });
152
- } catch (error) {
153
- if (error instanceof ContentTransferError)
154
- throw new ContentTransferError(
155
- error.code,
156
- `Surface capture rejected value at ${displaySurfacePointer(error.path)}: ${error.message}`,
157
- error.path
158
- );
159
- throw error;
160
- }
161
- }
162
- function normalizeTransferJsonAtPath(value, path, options = {}) {
163
- return clone(value, path, /* @__PURE__ */ new WeakSet(), options);
164
- }
165
- function normalizeTransferJson(value, options = {}) {
166
- return normalizeTransferJsonAtPath(value, "", options);
167
- }
168
- function deepFreeze(v) {
169
- if (ArrayBuffer.isView(v)) return v;
170
- if (v && typeof v === "object" && !Object.isFrozen(v)) {
171
- Object.freeze(v);
172
- for (const x of Object.values(v)) deepFreeze(x);
173
- }
174
- return v;
175
- }
176
- function at(v, path) {
177
- validatePointer(path);
178
- if (path === "") return v;
179
- if (!path.startsWith("/"))
180
- throw new ContentTransferError(
181
- "invalid-path",
182
- "Expected RFC 6901 pointer",
183
- path
184
- );
185
- let cur = v;
186
- for (const part of path.slice(1).split("/").map(dec)) {
187
- if (Array.isArray(cur)) cur = cur[Number(part)];
188
- else if (cur && typeof cur === "object")
189
- cur = Object.hasOwn(cur, part) ? cur[part] : void 0;
190
- else return void 0;
191
- }
192
- return cur;
193
- }
194
- function validatePointer(path) {
195
- if (path !== "" && !path.startsWith("/") || /~(?![01])/u.test(path))
196
- throw new ContentTransferError(
197
- "invalid-path",
198
- "Expected an RFC 6901 JSON pointer",
199
- path
200
- );
201
- }
202
- function readTransferCell(row, column) {
203
- return at(row, column.path);
204
- }
205
- function without(v, paths, omit, path = "") {
206
- if (paths.includes(path)) {
207
- omit.push({ path, reason: "excluded" });
208
- return void 0;
209
- }
210
- if (Array.isArray(v))
211
- return v.map((x, i) => without(x, paths, omit, `${path}/${i}`)).filter((x) => x !== void 0);
212
- if (v && typeof v === "object") {
213
- const out = /* @__PURE__ */ Object.create(null);
214
- for (const [k, x] of Object.entries(v)) {
215
- const y = without(x, paths, omit, `${path}/${enc(k)}`);
216
- if (y !== void 0) out[k] = y;
217
- }
218
- return out;
219
- }
220
- return v;
221
- }
222
- function projectValue(v, rules, target, omit) {
223
- rules.forEach((rule) => validatePointer(rule.path));
224
- return without(
225
- clone(v),
226
- rules.filter(
227
- (r) => r.target === target && (!r.exportable || r.classification !== "ordinary")
228
- ).map((r) => r.path),
229
- omit
230
- ) ?? null;
231
- }
232
- function excludedColumn(column) {
233
- return column.exportable === false || column.classification === "secret" || column.classification === "credential";
234
- }
235
- function rowProjectionExcludesColumnSchema(column, rules) {
236
- return rules.some(
237
- (rule) => rule.target === "row" && (!rule.exportable || rule.classification !== "ordinary") && (rule.path === column.path || column.path.startsWith(`${rule.path}/`))
238
- );
239
- }
240
- function projectColumnSchema(column, rules, omit) {
241
- if (column.schema === void 0) return void 0;
242
- const root = `/columns/${enc(column.id)}/schema`;
243
- const schemaRules = rules.filter((rule) => rule.target === "payload" && (rule.path === root || rule.path.startsWith(`${root}/`))).map((rule) => ({ ...rule, path: rule.path.slice(root.length) }));
244
- const projected = projectValue(column.schema, schemaRules, "payload", omit);
245
- if (schemaRules.some((rule) => rule.path === "" && (!rule.exportable || rule.classification !== "ordinary")))
246
- return void 0;
247
- return projected;
248
- }
249
- function normalize(p, projection, omit) {
250
- if (p.kind === "text" || p.kind === "markdown") {
251
- if (typeof p.text !== "string")
252
- throw new ContentTransferError(
253
- "unsupported-value",
254
- "Text payload must contain a string",
255
- "/text"
256
- );
257
- const value = projectValue(p.text, projection.rules, "payload", omit);
258
- const text = typeof value === "string" ? value : "";
259
- return p.kind === "text" && typeof p.language === "string" && p.language.trim() ? { kind: "text", text, language: p.language.trim() } : { kind: p.kind, text };
260
- }
261
- if (p.kind === "json")
262
- return {
263
- kind: "json",
264
- value: projectValue(p.value, projection.rules, "payload", omit)
265
- };
266
- if (p.kind === "registered")
267
- return {
268
- kind: "registered",
269
- format: p.format,
270
- value: projectValue(p.value, projection.rules, "payload", omit)
271
- };
272
- const rowsPayload = p;
273
- if (p.kind !== "rows")
274
- throw new ContentTransferError(
275
- "invalid-payload",
276
- "Unsupported payload kind"
277
- );
278
- const sourceColumns = rowsPayload.columns.map((column) => ({ ...column }));
279
- const columns = sourceColumns.filter((column) => !excludedColumn(column)).map((column) => {
280
- const { schema: _sourceSchema, ...withoutSchema } = column;
281
- const schema = rowProjectionExcludesColumnSchema(column, projection.rules) ? void 0 : projectColumnSchema(column, projection.rules, omit);
282
- return {
283
- ...withoutSchema,
284
- ...schema === void 0 ? {} : { schema }
285
- };
286
- });
287
- resolveTransferRegistry(columns);
288
- columns.forEach((column) => validatePointer(column.path));
289
- const rules = [
290
- ...projection.rules,
291
- ...sourceColumns.filter(excludedColumn).map((c) => ({
292
- target: "row",
293
- path: c.path,
294
- exportable: c.exportable ?? true,
295
- classification: c.classification ?? "ordinary"
296
- }))
297
- ];
298
- return {
299
- kind: "rows",
300
- columns,
301
- rows: rowsPayload.rows.map((row, index) => {
302
- if (!row || typeof row !== "object" || Array.isArray(row))
303
- throw new ContentTransferError(
304
- "invalid-row",
305
- "A table row must be a JSON object",
306
- `/rows/${index}`
307
- );
308
- const projected = projectValue(row, rules, "row", omit);
309
- return projected === null ? {} : projected;
310
- })
311
- };
312
- }
313
- function projectSnapshot(raw, projection) {
314
- const omissions = raw.omissions.map((o) => ({ ...o }));
315
- const normalized = normalize(raw.payload, projection, omissions);
316
- const payload = raw.limits ? limitPayload(normalized, raw.limits, omissions) : normalized;
317
- const included = payload.kind === "rows" ? payload.rows.length : raw.coverage.included;
318
- return deepFreeze({
319
- ...raw,
320
- payload,
321
- coverage: {
322
- ...raw.coverage,
323
- included,
324
- ...included < raw.coverage.included ? { status: "partial", reason: "Source export limit applied" } : {}
325
- },
326
- omissions,
327
- sections: raw.sections.filter(
328
- (section) => !projection.rules.some(
329
- (rule) => rule.target === "payload" && (!rule.exportable || rule.classification !== "ordinary") && (section.path === rule.path || section.path.startsWith(`${rule.path}/`))
330
- )
331
- ).map((x) => ({ ...x })),
332
- ...raw.limits ? { limits: { ...raw.limits } } : {}
333
- });
334
- }
335
- function directSource(payload, options = {}) {
336
- const id = options.id ?? uid();
337
- return {
338
- projection: options.projection ?? { rules: [] },
339
- snapshot: {
340
- id,
341
- sourceId: options.sourceId ?? id,
342
- revision: options.revision ?? uid(),
343
- capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
344
- label: options.label ?? "Content",
345
- payload,
346
- coverage: options.coverage ?? {
347
- status: "complete",
348
- included: payload.kind === "rows" ? payload.rows.length : 1,
349
- total: payload.kind === "rows" ? payload.rows.length : 1
350
- },
351
- unsavedChanges: options.unsavedChanges ?? false,
352
- omissions: [],
353
- sections: options.sections ?? [],
354
- ...options.limits ? { limits: { ...options.limits } } : {}
355
- }
356
- };
357
- }
358
- async function capture(source, signal, scope = "target") {
359
- stop(signal);
360
- const captured = "kind" in source ? directSource(source) : await source.capture({ scope, signal });
361
- stop(signal);
362
- const all = captured.allMatching;
363
- if (all && (all.query.sourceId !== captured.snapshot.sourceId || all.query.revision !== captured.snapshot.revision || all.query.order.length === 0))
364
- throw new ContentTransferError(
365
- "query-mismatch",
366
- "All-matching query must be captured with stable ordering"
367
- );
368
- const snapshot = projectSnapshot(captured.snapshot, captured.projection);
369
- if (!all) return { snapshot };
370
- return {
371
- snapshot,
372
- allMatching: deepFreeze({
373
- [bound]: true,
374
- source: {
375
- ...all,
376
- query: {
377
- ...all.query,
378
- query: clone(all.query.query),
379
- order: all.query.order.map((x) => ({ ...x }))
380
- }
381
- },
382
- projection: { rules: captured.projection.rules.map((x) => ({ ...x })) },
383
- // Page rows must be normalized against the original declaration so excluded
384
- // column values are removed before stable IDs or any caller can observe them.
385
- columns: captured.snapshot.payload.kind === "rows" ? captured.snapshot.payload.columns.map((column) => ({ ...column })) : [],
386
- ...snapshot.limits ? { limits: { ...snapshot.limits } } : {}
387
- })
388
- };
389
- }
390
- function createDraft(s) {
391
- return deepFreeze({
392
- snapshotId: s.id,
393
- sourceId: s.sourceId,
394
- sourceRevision: s.revision,
395
- revision: 0,
396
- payload: normalize(s.payload, { rules: [] }, []),
397
- omissions: [...s.omissions],
398
- manuallyEdited: false,
399
- provenance: [{ kind: "original", description: "Captured source snapshot" }]
400
- });
401
- }
402
- function revise(d, p, o, description, manual = d.manuallyEdited, kind = "deterministic", baseOmissions = d.omissions) {
403
- const { history: _history, ...previous } = d;
404
- return deepFreeze({
405
- ...d,
406
- revision: d.revision + 1,
407
- payload: normalize(p, { rules: [] }, []),
408
- omissions: [...baseOmissions, ...o],
409
- manuallyEdited: manual,
410
- provenance: [...d.provenance, { kind, description }],
411
- history: [...d.history ?? [], previous]
412
- });
413
- }
414
- function undoDraft(d) {
415
- const previous = d.history?.at(-1);
416
- if (!previous) return d;
417
- return deepFreeze({
418
- ...previous,
419
- revision: d.revision + 1,
420
- history: d.history.slice(0, -1)
421
- });
422
- }
423
- function refreshDraft(draft, snapshot, choice) {
424
- return choice === "keep" ? draft : createDraft(snapshot);
425
- }
426
- function applySectionSelection(d, s, ids) {
427
- if (d.snapshotId !== s.id || d.sourceId !== s.sourceId || d.sourceRevision !== s.revision)
428
- throw new ContentTransferError(
429
- "snapshot-mismatch",
430
- "Section selection requires the draft's captured source snapshot"
431
- );
432
- const selected = new Set(ids), omit = [], paths = s.sections.filter((x) => !selected.has(x.id)).map((x) => {
433
- omit.push({ path: x.path, reason: "excluded" });
434
- return x.path;
435
- }), baseOmissions = s.omissions;
436
- if (s.payload.kind === "json")
437
- return revise(
438
- d,
439
- { kind: "json", value: without(s.payload.value, paths, []) ?? null },
440
- omit,
441
- "Selected sections",
442
- d.manuallyEdited,
443
- "deterministic",
444
- baseOmissions
445
- );
446
- if (s.payload.kind === "registered")
447
- return revise(
448
- d,
449
- {
450
- kind: "registered",
451
- format: s.payload.format,
452
- value: without(s.payload.value, paths, []) ?? null
453
- },
454
- omit,
455
- "Selected sections",
456
- d.manuallyEdited,
457
- "deterministic",
458
- baseOmissions
459
- );
460
- return revise(
461
- d,
462
- s.payload,
463
- omit,
464
- "Selected sections",
465
- d.manuallyEdited,
466
- "deterministic",
467
- baseOmissions
468
- );
469
- }
470
- function transformRows(d, o) {
471
- if (d.payload.kind !== "rows") return d;
472
- if (o.top != null) assertLimit(o.top, "maxRows");
473
- const cols = o.visibleColumns ? o.visibleColumns.map(
474
- (id) => d.payload.kind === "rows" ? d.payload.columns.find((c) => c.id === id) : void 0
475
- ).filter((c) => Boolean(c)) : d.payload.columns.filter((c) => c.visible);
476
- const get = readTransferCell;
477
- let rows = [...d.payload.rows], omit = [];
478
- const before = rows.length;
479
- if (o.selectedIndices !== void 0) {
480
- const selected = /* @__PURE__ */ new Set();
481
- for (const index of o.selectedIndices) {
482
- if (!Number.isSafeInteger(index) || index < 0 || index >= d.payload.rows.length)
483
- throw new ContentTransferError(
484
- "invalid-selection-index",
485
- "Selected row indexes must be non-negative positions in the input draft rows"
486
- );
487
- selected.add(index);
488
- }
489
- rows = d.payload.rows.filter((_, index) => selected.has(index));
490
- }
491
- if (o.selectedIds && o.idColumn) {
492
- const set = new Set(o.selectedIds);
493
- const idColumn = d.payload.columns.find((c) => c.id === o.idColumn);
494
- rows = rows.filter(
495
- (r) => set.has(String(idColumn ? get(r, idColumn) : r[o.idColumn]))
496
- );
497
- }
498
- if (o.search) {
499
- const q = o.search.toLowerCase();
500
- rows = rows.filter(
501
- (r) => cols.some(
502
- (c) => String(get(r, c) ?? "").toLowerCase().includes(q)
503
- )
504
- );
505
- }
506
- for (const [id, q] of Object.entries(o.filters ?? {})) {
507
- const c = cols.find((x) => x.id === id);
508
- if (c)
509
- rows = rows.filter(
510
- (r) => String(get(r, c) ?? "").toLowerCase().includes(q.toLowerCase())
511
- );
512
- }
513
- if (rows.length !== before)
514
- omit.push({
515
- path: "/rows",
516
- reason: "filtered",
517
- count: before - rows.length
518
- });
519
- if (o.sort) {
520
- const c = cols.find((x) => x.id === o.sort.column);
521
- if (c)
522
- rows.sort((a, b) => {
523
- const left = get(a, c);
524
- const right = get(b, c);
525
- const compare = typeof left === "number" && typeof right === "number" ? left - right : String(left ?? "").localeCompare(String(right ?? ""));
526
- return compare * (o.sort.direction === "asc" ? 1 : -1);
527
- });
528
- }
529
- if (o.top != null && rows.length > o.top) {
530
- omit.push({
531
- path: "/rows",
532
- reason: "truncated",
533
- count: rows.length - o.top
534
- });
535
- rows = rows.slice(0, o.top);
536
- }
537
- if (o.structuredProjection === "visible") {
538
- rows = rows.map(
539
- (r) => Object.fromEntries(cols.map((c) => [c.id, get(r, c) ?? null]))
540
- );
541
- const excludedColumns = d.payload.columns.length - cols.length;
542
- if (excludedColumns > 0)
543
- omit.push({
544
- path: "/columns",
545
- reason: "excluded",
546
- count: excludedColumns
547
- });
548
- }
549
- return revise(
550
- d,
551
- {
552
- kind: "rows",
553
- rows,
554
- columns: cols.map((c) => ({
555
- ...c,
556
- visible: true,
557
- ...o.structuredProjection === "visible" ? { path: `/${enc(c.id)}` } : {}
558
- }))
559
- },
560
- omit,
561
- "Prepared row subset"
562
- );
563
- }
564
- function reduceJson(draft, options) {
565
- if (draft.payload.kind !== "json" && draft.payload.kind !== "registered")
566
- return draft;
567
- const omissions = [];
568
- options.exclude?.forEach(validatePointer);
569
- const filtered = without(clone(draft.payload.value), options.exclude ?? [], omissions) ?? null;
570
- const payload = limitPayload(
571
- { ...draft.payload, value: filtered },
572
- options,
573
- omissions
574
- );
575
- return revise(draft, payload, omissions, "Reduced JSON");
576
- }
577
- async function collectAllMatching(c, signal) {
578
- const rows = [], omissions = [], ids = /* @__PURE__ */ new Set(), cursors = /* @__PURE__ */ new Set();
579
- let cursor = null, token, last = {
580
- status: "unknown",
581
- included: 0,
582
- total: null
583
- };
584
- let certifiedTotal;
585
- const maxRows = c.limits?.maxRows;
586
- if (maxRows != null) assertLimit(maxRows, "maxRows");
587
- const finishAtLimit = (total, knownOmitted) => ({
588
- rows: deepFreeze(rows),
589
- omissions: deepFreeze([
590
- ...omissions,
591
- {
592
- path: "/rows",
593
- reason: "truncated",
594
- ...knownOmitted === void 0 || knownOmitted <= 0 ? {} : { count: knownOmitted }
595
- }
596
- ]),
597
- coverage: deepFreeze({
598
- status: "partial",
599
- included: rows.length,
600
- total,
601
- reason: "Source export limit applied"
602
- })
603
- });
604
- try {
605
- if (maxRows === 0) return finishAtLimit(null);
606
- do {
607
- stop(signal);
608
- const page = await c.source.page({
609
- query: c.source.query,
610
- cursor,
611
- consistencyToken: token ?? null,
612
- signal
613
- });
614
- stop(signal);
615
- if (token === void 0) token = page.consistencyToken;
616
- else if (page.consistencyToken !== token)
617
- throw new ContentTransferError(
618
- "consistency-token-changed",
619
- "All-matching export changed during collection"
620
- );
621
- if (page.coverage.included !== page.rows.length)
622
- throw new ContentTransferError(
623
- "invalid-page-coverage",
624
- "Page count does not match returned rows"
625
- );
626
- if (page.coverage.total !== null && (!Number.isSafeInteger(page.coverage.total) || page.coverage.total < 0))
627
- throw new ContentTransferError(
628
- "invalid-page-coverage",
629
- "Page total must be a non-negative integer or null"
630
- );
631
- if (certifiedTotal === void 0) certifiedTotal = page.coverage.total;
632
- else if (page.coverage.total !== certifiedTotal)
633
- throw new ContentTransferError(
634
- "inconsistent-total",
635
- "All-matching source changed its reported total during collection"
636
- );
637
- const projected = normalize(
638
- { kind: "rows", rows: page.rows, columns: [...c.columns] },
639
- c.projection,
640
- omissions
641
- ).rows;
642
- let uniqueBeyondLimit = 0;
643
- for (const row of projected) {
644
- const id = c.source.getRowId(row);
645
- if (!id)
646
- throw new ContentTransferError(
647
- "invalid-row-id",
648
- "All-matching source returned empty projected ID"
649
- );
650
- if (!ids.has(id)) {
651
- ids.add(id);
652
- if (maxRows == null || rows.length < maxRows)
653
- rows.push(
654
- limitPayload(
655
- { kind: "rows", rows: [row], columns: [...c.columns] },
656
- { ...c.limits, maxRows: null },
657
- omissions
658
- ).rows[0]
659
- );
660
- else uniqueBeyondLimit += 1;
661
- } else omissions.push({ path: `/rows/${enc(id)}`, reason: "duplicate" });
662
- }
663
- if (page.coverage.total !== null && page.coverage.total < ids.size)
664
- throw new ContentTransferError(
665
- "invalid-page-coverage",
666
- "Page total is smaller than the accumulated unique row count"
667
- );
668
- last = page.coverage;
669
- if (maxRows != null && rows.length >= maxRows && (uniqueBeyondLimit > 0 || page.nextCursor !== null))
670
- return finishAtLimit(
671
- page.coverage.total,
672
- page.nextCursor === null ? uniqueBeyondLimit : page.coverage.total != null && page.coverage.total > rows.length ? page.coverage.total - rows.length : void 0
673
- );
674
- cursor = page.nextCursor;
675
- if (cursor !== null && (!cursor || cursors.has(cursor)))
676
- throw new ContentTransferError(
677
- "non-advancing-cursor",
678
- "All-matching source repeated a cursor"
679
- );
680
- if (cursor) cursors.add(cursor);
681
- } while (cursor !== null);
682
- const complete = c.source.stableSnapshot === true && last.status === "complete" && last.total === rows.length && token !== void 0;
683
- return {
684
- rows: deepFreeze(rows),
685
- omissions: deepFreeze(omissions),
686
- coverage: deepFreeze(
687
- complete ? { ...last, included: rows.length } : {
688
- ...last,
689
- status: "partial",
690
- included: rows.length,
691
- reason: last.reason ?? "Source did not certify a stable complete snapshot"
692
- }
693
- )
694
- };
695
- } catch (e) {
696
- const error = e instanceof ContentTransferError ? e : new ContentTransferError(
697
- signal.aborted ? "cancelled" : "page-failed",
698
- e instanceof Error ? e.message : "Page collection failed"
699
- );
700
- return {
701
- rows: deepFreeze(rows),
702
- omissions: deepFreeze(omissions),
703
- coverage: deepFreeze({
704
- status: "partial",
705
- included: rows.length,
706
- total: last.total,
707
- reason: error.message
708
- }),
709
- error
710
- };
711
- }
712
- }
713
- function sealTransferArtifact(artifact) {
714
- if (!artifact.file)
715
- return deepFreeze({
716
- ...artifact,
717
- omissions: artifact.omissions.map((o) => ({ ...o }))
718
- });
719
- const bytes = artifact.file.bytes.slice();
720
- const file = {
721
- filename: artifact.file.filename,
722
- mime: artifact.file.mime,
723
- get bytes() {
724
- return bytes.slice();
725
- }
726
- };
727
- return deepFreeze({
728
- ...artifact,
729
- file,
730
- omissions: artifact.omissions.map((o) => ({ ...o }))
731
- });
732
- }
733
- function serialize(draft, format, options = {}) {
734
- const payload = draft.payload;
735
- const omissions = draft.omissions.map((o) => ({ ...o }));
736
- let plainText = "", html;
737
- let mime = "text/plain;charset=utf-8", extension = "txt";
738
- const columnCell = (row, column) => textValue(readTransferCell(row, column));
739
- if ((format === "csv" || format === "tsv") && payload.kind !== "rows") {
740
- throw new ContentTransferError(
741
- "unsupported-format",
742
- `${format.toUpperCase()} requires tabular data`
743
- );
744
- }
745
- if (format === "json" || format === "compact-json") {
746
- const value = payload.kind === "rows" ? payload.rows : payload.kind === "text" || payload.kind === "markdown" ? payload.text : payload.value;
747
- plainText = stringifyJson(value, {
748
- style: format === "json" ? "pretty" : "compact"
749
- });
750
- mime = "application/json;charset=utf-8";
751
- extension = "json";
752
- } else if (payload.kind === "rows") {
753
- const columns = payload.columns.filter(
754
- (c) => c.visible && c.exportable !== false && c.classification !== "secret" && c.classification !== "credential"
755
- );
756
- if (format === "markdown") {
757
- const escapeCell = (value) => escapeHtml(value).replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\r\n|\r|\n/g, "<br>");
758
- plainText = [
759
- `| ${columns.map((c) => escapeCell(c.label)).join(" | ")} |`,
760
- `| ${columns.map(() => "---").join(" | ")} |`,
761
- ...payload.rows.map(
762
- (row) => `| ${columns.map((c) => escapeCell(columnCell(row, c))).join(" | ")} |`
763
- )
764
- ].join("\n");
765
- mime = "text/markdown;charset=utf-8";
766
- extension = "md";
767
- } else {
768
- const delimiter = format === "csv" ? "," : " ";
769
- const safe = options.spreadsheetSafe ?? format === "tsv";
770
- const encode = (value, path, isString = true) => {
771
- let text = value;
772
- if (safe && isString && /^[\t\r\n ]*[=+\-@]/.test(text)) {
773
- text = `'${text}`;
774
- omissions.push({ path, reason: "escaped", count: 1 });
775
- }
776
- return text.includes(delimiter) || /["\n\r]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
777
- };
778
- plainText = [
779
- columns.map((c) => encode(c.label, `/columns/${enc(c.id)}`)).join(delimiter),
780
- ...payload.rows.map(
781
- (row, index) => columns.map(
782
- (c) => encode(
783
- columnCell(row, c),
784
- `/rows/${index}${c.path}`,
785
- typeof readTransferCell(row, c) === "string"
786
- )
787
- ).join(delimiter)
788
- )
789
- ].join("\n");
790
- if (format === "csv") {
791
- mime = "text/csv;charset=utf-8";
792
- extension = "csv";
793
- }
794
- if (format === "tsv") {
795
- mime = "text/tab-separated-values;charset=utf-8";
796
- extension = "tsv";
797
- }
798
- }
799
- if (format === "html")
800
- html = `<table><thead><tr>${columns.map((c) => `<th>${escapeHtml(c.label)}</th>`).join("")}</tr></thead><tbody>${payload.rows.map((row) => `<tr>${columns.map((c) => `<td>${escapeHtml(columnCell(row, c)).replace(/\r\n|\r|\n/g, "<br>")}</td>`).join("")}</tr>`).join("")}</tbody></table>`;
801
- } else {
802
- plainText = payload.kind === "text" || payload.kind === "markdown" ? payload.text : stringifyJson(payload.value, { style: "pretty" });
803
- if (format === "markdown") {
804
- mime = "text/markdown;charset=utf-8";
805
- extension = "md";
806
- }
807
- if (format === "html") html = `<pre>${escapeHtml(plainText)}</pre>`;
808
- }
809
- if (format === "html") {
810
- mime = "text/html;charset=utf-8";
811
- extension = "html";
812
- }
813
- return sealTransferArtifact({
814
- snapshotId: draft.snapshotId,
815
- draftRevision: draft.revision,
816
- format,
817
- plainText,
818
- ...html === void 0 ? {} : { html },
819
- file: {
820
- filename: options.filename ?? `export.${extension}`,
821
- mime,
822
- bytes: new TextEncoder().encode(
823
- format === "html" ? html ?? plainText : plainText
824
- )
825
- },
826
- omissions
827
- });
828
- }
829
- function createBrowserTransport() {
830
- return {
831
- async copy(a, signal) {
832
- const cancelled = () => signal.aborted ? { status: "cancelled" } : void 0;
833
- try {
834
- if (cancelled()) return cancelled();
835
- const c = globalThis.navigator?.clipboard;
836
- if (!c?.write && !c?.writeText)
837
- return {
838
- status: "error",
839
- code: "clipboard-unavailable",
840
- message: "Clipboard writing is unavailable",
841
- retryable: false
842
- };
843
- if (a.html && c.write && typeof globalThis.ClipboardItem === "function") {
844
- try {
845
- await c.write([
846
- new ClipboardItem({
847
- "text/plain": new Blob([a.plainText], { type: "text/plain" }),
848
- "text/html": new Blob([a.html], { type: "text/html" })
849
- })
850
- ]);
851
- if (cancelled()) return cancelled();
852
- return {
853
- status: "success",
854
- delivered: "clipboard",
855
- mimeTypes: ["text/plain", "text/html"]
856
- };
857
- } catch {
858
- if (cancelled()) return cancelled();
859
- }
860
- }
861
- if (c.writeText) {
862
- await c.writeText(a.plainText);
863
- if (cancelled()) return cancelled();
864
- return a.html ? {
865
- status: "degraded",
866
- delivered: "plain-text",
867
- reason: "Rich clipboard write was unavailable or rejected"
868
- } : {
869
- status: "success",
870
- delivered: "clipboard",
871
- mimeTypes: ["text/plain"]
872
- };
873
- }
874
- return {
875
- status: "error",
876
- code: "clipboard-rejected",
877
- message: "Clipboard rejected the write",
878
- retryable: true
879
- };
880
- } catch (e) {
881
- return cancelled() ?? {
882
- status: "error",
883
- code: "clipboard-rejected",
884
- message: e instanceof Error ? e.message : "Clipboard rejected the write",
885
- retryable: true
886
- };
887
- }
888
- },
889
- async download(a, signal) {
890
- if (signal.aborted) return { status: "cancelled" };
891
- if (!a.file || typeof document === "undefined" || !URL?.createObjectURL)
892
- return {
893
- status: "error",
894
- code: "download-unavailable",
895
- message: "Download is unavailable",
896
- retryable: false
897
- };
898
- let url;
899
- try {
900
- url = URL.createObjectURL(
901
- new Blob([a.file.bytes.slice().buffer], {
902
- type: a.file.mime
903
- })
904
- );
905
- const link = document.createElement("a");
906
- link.href = url;
907
- link.download = a.file.filename;
908
- link.click();
909
- return signal.aborted ? { status: "cancelled" } : {
910
- status: "success",
911
- delivered: "download-started",
912
- mimeTypes: [a.file.mime]
913
- };
914
- } catch (e) {
915
- return signal.aborted ? { status: "cancelled" } : {
916
- status: "error",
917
- code: "download-failed",
918
- message: e instanceof Error ? e.message : "Download failed",
919
- retryable: true
920
- };
921
- } finally {
922
- if (url) setTimeout(() => URL.revokeObjectURL(url), 0);
923
- }
924
- }
925
- };
926
- }
927
- function assertLimit(value, name) {
928
- if (value != null && (!Number.isSafeInteger(value) || value < 0)) {
929
- throw new ContentTransferError(
930
- "invalid-limit",
931
- `${name} must be a non-negative safe integer or null`
932
- );
933
- }
934
- }
935
- function resolveTransferPreferences(provider = {}, menu = {}, sourceLimits = {}) {
936
- const limits = {
937
- maxRows: null,
938
- maxStringChars: null,
939
- maxDepth: null,
940
- maxArrayItems: null,
941
- targetTokens: null
942
- };
943
- for (const key of limitKeys) {
944
- const candidates = [
945
- provider.limits?.[key],
946
- menu.limits?.[key],
947
- sourceLimits[key]
948
- ];
949
- candidates.forEach((value) => assertLimit(value, key));
950
- const finite = candidates.filter((value) => value != null);
951
- limits[key] = finite.length ? Math.min(...finite) : null;
952
- }
953
- return deepFreeze({
954
- initialFormat: menu.initialFormat ?? provider.initialFormat ?? "plain",
955
- initialPreset: menu.initialPreset ?? provider.initialPreset ?? "full",
956
- limits
957
- });
958
- }
959
- function isReactElementType(value) {
960
- const tag = value.$$typeof;
961
- return typeof tag === "symbol";
962
- }
963
- function cloneTransferRegistration(value, path = "registration", seen = /* @__PURE__ */ new WeakSet()) {
964
- if (value === null || typeof value !== "object" && typeof value !== "function")
965
- return value;
966
- if (typeof value === "function") return value;
967
- if (isReactElementType(value)) return value;
968
- if (seen.has(value))
969
- throw new ContentTransferError(
970
- "unsupported-registration-metadata",
971
- "Circular transfer registration metadata is unsupported",
972
- path
973
- );
974
- seen.add(value);
975
- if (Array.isArray(value)) {
976
- const copy2 = value.map(
977
- (item, index) => cloneTransferRegistration(item, `${path}/${index}`, seen)
978
- );
979
- seen.delete(value);
980
- return Object.freeze(copy2);
981
- }
982
- const prototype = Object.getPrototypeOf(value);
983
- if (prototype !== Object.prototype && prototype !== null)
984
- throw new ContentTransferError(
985
- "unsupported-registration-metadata",
986
- "Transfer registration metadata must use plain objects and arrays",
987
- path
988
- );
989
- const copy = Object.create(prototype);
990
- for (const key of Reflect.ownKeys(value)) {
991
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
992
- if (!("value" in descriptor))
993
- throw new ContentTransferError(
994
- "unsupported-registration-metadata",
995
- "Transfer registration metadata cannot use accessors",
996
- `${path}/${String(key)}`
997
- );
998
- Object.defineProperty(copy, key, {
999
- value: cloneTransferRegistration(
1000
- descriptor.value,
1001
- `${path}/${String(key)}`,
1002
- seen
1003
- ),
1004
- enumerable: descriptor.enumerable === true,
1005
- writable: false,
1006
- configurable: false
1007
- });
1008
- }
1009
- seen.delete(value);
1010
- return Object.freeze(copy);
1011
- }
1012
- function resolveTransferRegistry(...groups) {
1013
- const ids = /* @__PURE__ */ new Set();
1014
- const result = [];
1015
- for (const group of groups)
1016
- for (const item of group) {
1017
- const copy = cloneTransferRegistration(item);
1018
- if (!copy.id.trim() || ids.has(copy.id))
1019
- throw new ContentTransferError(
1020
- "duplicate-registration",
1021
- `Transfer id ${JSON.stringify(copy.id)} is empty or registered more than once`
1022
- );
1023
- ids.add(copy.id);
1024
- result.push(copy);
1025
- }
1026
- return Object.freeze(result);
1027
- }
1028
- function createSurfaceTransferHandle(options) {
1029
- const declarations = resolveTransferRegistry(
1030
- options.manifest.values.map((value) => ({ ...value, id: value.name }))
1031
- );
1032
- return {
1033
- instanceId: options.instanceId,
1034
- surfaceName: options.manifest.surfaceName,
1035
- isMounted: options.isMounted,
1036
- async capture(signal) {
1037
- stop(signal);
1038
- if (!options.isMounted())
1039
- throw new ContentTransferError(
1040
- "surface-unmounted",
1041
- "The captured surface is no longer mounted"
1042
- );
1043
- const revisionBefore = options.getRevision?.();
1044
- const scope = await options.getScope();
1045
- stop(signal);
1046
- if (!options.isMounted())
1047
- throw new ContentTransferError(
1048
- "surface-unmounted",
1049
- "The surface closed during capture"
1050
- );
1051
- if (revisionBefore !== void 0 && options.getRevision?.() !== revisionBefore)
1052
- throw new ContentTransferError(
1053
- "surface-changed",
1054
- "The surface changed during capture; capture again"
1055
- );
1056
- const value = {};
1057
- for (const declaration of declarations) {
1058
- if (Object.hasOwn(scope, declaration.name) && scope[declaration.name] !== void 0) {
1059
- Object.defineProperty(value, declaration.name, {
1060
- value: cloneSurfaceValue(
1061
- scope[declaration.name],
1062
- `/${enc(declaration.name)}`
1063
- ),
1064
- enumerable: true,
1065
- writable: true,
1066
- configurable: true
1067
- });
1068
- }
1069
- }
1070
- return directSource(
1071
- { kind: "json", value },
1072
- {
1073
- sourceId: options.instanceId,
1074
- revision: revisionBefore ?? uid(),
1075
- label: options.manifest.label ?? options.manifest.surfaceName,
1076
- unsavedChanges: options.unsavedChanges?.() ?? false,
1077
- sections: declarations.filter((d) => Object.hasOwn(value, d.name)).map((d) => ({
1078
- id: d.name,
1079
- label: d.label,
1080
- path: `/${enc(d.name)}`,
1081
- includedByDefault: d.includedByDefault ?? true
1082
- })),
1083
- projection: {
1084
- rules: [
1085
- ...options.projection?.rules ?? [],
1086
- ...declarations.map((d) => ({
1087
- target: "payload",
1088
- path: `/${enc(d.name)}`,
1089
- exportable: d.exportable ?? true,
1090
- classification: d.classification ?? "ordinary"
1091
- }))
1092
- ]
1093
- },
1094
- ...options.limits ? { limits: options.limits } : {}
1095
- }
1096
- );
1097
- }
1098
- };
1099
- }
1100
- function limitJson(value, limits, omissions, path = "", depth = 0) {
1101
- if (limits.maxDepth != null && depth > limits.maxDepth) {
1102
- omissions.push({ path, reason: "truncated" });
1103
- return null;
1104
- }
1105
- if (typeof value === "string" && limits.maxStringChars != null && Array.from(value).length > limits.maxStringChars) {
1106
- const chars = Array.from(value);
1107
- omissions.push({
1108
- path,
1109
- reason: "truncated",
1110
- count: chars.length - limits.maxStringChars
1111
- });
1112
- return chars.slice(0, limits.maxStringChars).join("");
1113
- }
1114
- if (Array.isArray(value)) {
1115
- const count = Math.min(value.length, limits.maxArrayItems ?? value.length);
1116
- if (count < value.length)
1117
- omissions.push({
1118
- path,
1119
- reason: "truncated",
1120
- count: value.length - count
1121
- });
1122
- return value.slice(0, count).map(
1123
- (item, index) => limitJson(item, limits, omissions, `${path}/${index}`, depth + 1)
1124
- );
1125
- }
1126
- if (value && typeof value === "object")
1127
- return Object.fromEntries(
1128
- Object.entries(value).map(([key, item]) => [
1129
- key,
1130
- limitJson(item, limits, omissions, `${path}/${enc(key)}`, depth + 1)
1131
- ])
1132
- );
1133
- return value;
1134
- }
1135
- function limitPayload(payload, limits, omissions) {
1136
- limitKeys.forEach((key) => assertLimit(limits[key], key));
1137
- if (payload.kind === "rows") {
1138
- const count = Math.min(
1139
- payload.rows.length,
1140
- limits.maxRows ?? payload.rows.length
1141
- );
1142
- if (count < payload.rows.length)
1143
- omissions.push({
1144
- path: "/rows",
1145
- reason: "truncated",
1146
- count: payload.rows.length - count
1147
- });
1148
- return {
1149
- ...payload,
1150
- rows: payload.rows.slice(0, count).map(
1151
- (row, index) => limitJson(row, limits, omissions, `/rows/${index}`)
1152
- )
1153
- };
1154
- }
1155
- if (payload.kind === "json" || payload.kind === "registered")
1156
- return { ...payload, value: limitJson(payload.value, limits, omissions) };
1157
- return {
1158
- ...payload,
1159
- text: limitJson(payload.text, limits, omissions)
1160
- };
1161
- }
1162
- function applyTransferLimits(draft, limits) {
1163
- const omissions = [];
1164
- const payload = limitPayload(draft.payload, limits, omissions);
1165
- return omissions.length ? revise(draft, payload, omissions, "Applied preparation limits") : draft;
1166
- }
1167
- var TRANSFER_ERROR, ContentTransferError, bound, stop, enc, dec, maxSurfacePointerSegmentLength, maxSurfacePointerLength, truncateSurfacePointer, uid, editDraft, resetDraft, sourceChanged, textValue, limitKeys;
1168
- var init_core = __esm({
1169
- "src/operate/core.ts"() {
1170
- "use strict";
1171
- init_types();
1172
- init_agent_payload();
1173
- TRANSFER_ERROR = /* @__PURE__ */ Symbol.for("ai-matrx.alchemy.operate.transfer-error");
1174
- ContentTransferError = class extends Error {
1175
- code;
1176
- path;
1177
- constructor(code, message, path) {
1178
- super(message);
1179
- this.code = code;
1180
- this.path = path;
1181
- this[TRANSFER_ERROR] = true;
1182
- }
1183
- /**
1184
- * One error class across every loaded copy: while `@ai-matrx/kit/content-transfer`
1185
- * still bundles this module for its not-yet-repointed consumers (ALC-16), an
1186
- * error raised by one copy is `instanceof` the other.
1187
- */
1188
- static [Symbol.hasInstance](value) {
1189
- return typeof value === "object" && value !== null && value[TRANSFER_ERROR] === true;
1190
- }
1191
- };
1192
- bound = /* @__PURE__ */ Symbol.for("ai-matrx.alchemy.operate.bound-all-matching");
1193
- stop = (s) => {
1194
- if (s.aborted) throw new DOMException("Cancelled", "AbortError");
1195
- };
1196
- enc = (x) => x.replace(/~/g, "~0").replace(/\//g, "~1");
1197
- dec = (x) => x.replace(/~1/g, "/").replace(/~0/g, "~");
1198
- maxSurfacePointerSegmentLength = 64;
1199
- maxSurfacePointerLength = 192;
1200
- truncateSurfacePointer = (value, maxLength) => {
1201
- const characters = Array.from(value);
1202
- return characters.length > maxLength ? `${characters.slice(0, maxLength - 1).join("")}\u2026` : value;
1203
- };
1204
- uid = () => globalThis.crypto?.randomUUID?.() ?? `capture-${Date.now()}-${Math.random()}`;
1205
- editDraft = (d, p) => revise(d, p, [], "Manual edit", true, "manual");
1206
- resetDraft = (s) => createDraft(s);
1207
- sourceChanged = (d, s) => d.sourceId !== s.sourceId || d.sourceRevision !== s.revision;
1208
- textValue = (value) => value === void 0 || value === null ? "" : typeof value === "string" ? value : stringifyJson(value, { style: "compact" });
1209
- limitKeys = [
1210
- "maxRows",
1211
- "maxStringChars",
1212
- "maxDepth",
1213
- "maxArrayItems",
1214
- "targetTokens"
1215
- ];
1216
- }
1217
- });
1218
-
1219
- // src/operate/formats/rich-html.ts
1220
- var rich_html_exports = {};
1221
- __export(rich_html_exports, {
1222
- loadMarkdownHtmlEngine: () => loadMarkdownHtmlEngine,
1223
- markdownPlainText: () => markdownPlainText,
1224
- richHtmlEngine: () => richHtmlEngine
1225
- });
1226
- async function loadMarkdownHtmlEngine() {
1227
- const g = globalThis;
1228
- g[ENGINE] ??= import("@ai-matrx/print/markdown-html").then((m) => m.createMarkdownHtmlEngine());
1229
- return g[ENGINE];
1230
- }
1231
- function parseOptions(options, signal) {
1232
- return {
1233
- signal,
1234
- ...options.onNotice ? { onNotice: options.onNotice } : {},
1235
- ...options.assets ? { assets: options.assets } : {}
1236
- };
1237
- }
1238
- async function markdownPlainText(markdown, options, signal) {
1239
- const engine = await loadMarkdownHtmlEngine();
1240
- return engine.plainText(await engine.parse(markdown, parseOptions(options, signal)));
1241
- }
1242
- var ENGINE, richHtmlEngine;
1243
- var init_rich_html = __esm({
1244
- "src/operate/formats/rich-html.ts"() {
1245
- "use strict";
1246
- init_core();
1247
- ENGINE = /* @__PURE__ */ Symbol.for("ai-matrx.alchemy.operate.markdown-html-engine");
1248
- richHtmlEngine = {
1249
- async build(draft, options, signal) {
1250
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1251
- if (draft.payload.kind !== "markdown") {
1252
- throw new ContentTransferError("unsupported-format", "Formatted copy needs Markdown content. Copy it as plain text instead.");
1253
- }
1254
- const engine = await loadMarkdownHtmlEngine();
1255
- const tree = await engine.parse(draft.payload.text, parseOptions(options, signal));
1256
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1257
- const html = engine.fragment(tree, { skin: options.skin ?? "inline", profile: options.profile ?? "generic" });
1258
- return sealTransferArtifact({
1259
- snapshotId: draft.snapshotId,
1260
- draftRevision: draft.revision,
1261
- format: "rich-html",
1262
- plainText: engine.plainText(tree),
1263
- html,
1264
- file: { filename: options.filename ?? "export.html", mime: "text/html;charset=utf-8", bytes: new TextEncoder().encode(html) },
1265
- omissions: draft.omissions.map((o) => ({ ...o }))
1266
- });
1267
- }
1268
- };
1269
- }
1270
- });
1271
-
1272
- // src/operate/formats/document.ts
1273
- var document_exports = {};
1274
- __export(document_exports, {
1275
- documentEngine: () => documentEngine,
1276
- documentHtmlEngine: () => documentHtmlEngine
1277
- });
1278
- function markdownOf(draft) {
1279
- const p = draft.payload;
1280
- if (p.kind === "markdown") return p.text;
1281
- if (p.kind === "text") {
1282
- if (!p.language) return p.text;
1283
- return fencedCodeBlock(p.text, p.language);
1284
- }
1285
- throw new ContentTransferError("unsupported-format", "A document needs text or Markdown content. Download it as JSON or CSV instead.");
1286
- }
1287
- function documentEngine(format) {
1288
- return {
1289
- async build(draft, options, signal) {
1290
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1291
- const source = markdownOf(draft);
1292
- const { exportDocument } = await import("@ai-matrx/print/document");
1293
- const name = stem(options.filename);
1294
- const out = await exportDocument(source, format, {
1295
- ...name ? { fileName: name } : {},
1296
- ...options.onNotice ? { onNotice: (n) => options.onNotice?.({ code: n.code, sentence: n.message, remedy: n.remedy }) } : {}
1297
- });
1298
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1299
- return sealTransferArtifact({
1300
- snapshotId: draft.snapshotId,
1301
- draftRevision: draft.revision,
1302
- format,
1303
- plainText: source,
1304
- file: { filename: out.fileName, mime: out.mime, bytes: out.bytes },
1305
- omissions: draft.omissions.map((o) => ({ ...o }))
1306
- });
1307
- }
1308
- };
1309
- }
1310
- var enc2, stem, documentHtmlEngine;
1311
- var init_document = __esm({
1312
- "src/operate/formats/document.ts"() {
1313
- "use strict";
1314
- init_core();
1315
- init_fenced_code();
1316
- init_rich_html();
1317
- enc2 = new TextEncoder();
1318
- stem = (filename) => filename ? filename.replace(/\.[a-z0-9]+$/i, "") : void 0;
1319
- documentHtmlEngine = {
1320
- async build(draft, options, signal) {
1321
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1322
- const engine = await loadMarkdownHtmlEngine();
1323
- const tree = await engine.parse(markdownOf(draft), {
1324
- signal,
1325
- ...options.onNotice ? { onNotice: options.onNotice } : {},
1326
- ...options.assets ? { assets: options.assets } : {}
1327
- });
1328
- const page = engine.document(tree);
1329
- return sealTransferArtifact({
1330
- snapshotId: draft.snapshotId,
1331
- draftRevision: draft.revision,
1332
- format: "html",
1333
- plainText: engine.plainText(tree),
1334
- html: page,
1335
- file: { filename: options.filename ?? "export.html", mime: "text/html;charset=utf-8", bytes: enc2.encode(page) },
1336
- omissions: draft.omissions.map((o) => ({ ...o }))
1337
- });
1338
- }
1339
- };
1340
- }
1341
- });
1342
-
1343
- // src/operate.ts
1344
- init_core();
1345
-
1346
- // src/operate/formats.ts
1347
- init_core();
1348
- init_fenced_code();
1349
- var enc3 = new TextEncoder();
1350
- var isRows = (p) => p.kind === "rows";
1351
- var isProse = (p) => p.kind === "markdown" || p.kind === "text";
1352
- var always = () => true;
1353
- var LANGUAGE_EXTENSION = {
1354
- typescript: "ts",
1355
- ts: "ts",
1356
- tsx: "tsx",
1357
- javascript: "js",
1358
- js: "js",
1359
- jsx: "jsx",
1360
- python: "py",
1361
- py: "py",
1362
- json: "json",
1363
- html: "html",
1364
- css: "css",
1365
- sql: "sql",
1366
- bash: "sh",
1367
- sh: "sh",
1368
- shell: "sh",
1369
- zsh: "sh",
1370
- yaml: "yaml",
1371
- yml: "yaml",
1372
- markdown: "md",
1373
- md: "md",
1374
- go: "go",
1375
- rust: "rs",
1376
- java: "java",
1377
- ruby: "rb",
1378
- php: "php",
1379
- csharp: "cs",
1380
- cs: "cs",
1381
- cpp: "cpp",
1382
- c: "c",
1383
- swift: "swift",
1384
- kotlin: "kt",
1385
- xml: "xml",
1386
- toml: "toml"
1387
- };
1388
- function extensionForLanguage(language) {
1389
- return language && LANGUAGE_EXTENSION[language.trim().toLowerCase()] || "txt";
1390
- }
1391
- function checkSignal(signal) {
1392
- if (signal.aborted) throw new DOMException("Cancelled", "AbortError");
1393
- }
1394
- function textArtifact(draft, format, text, mime, filename, html) {
1395
- return sealTransferArtifact({
1396
- snapshotId: draft.snapshotId,
1397
- draftRevision: draft.revision,
1398
- format,
1399
- plainText: text,
1400
- ...html === void 0 ? {} : { html },
1401
- file: { filename, mime, bytes: enc3.encode(html ?? text) },
1402
- omissions: draft.omissions.map((o) => ({ ...o }))
1403
- });
1404
- }
1405
- function serialized(format, extension) {
1406
- return {
1407
- async build(draft, options, signal) {
1408
- checkSignal(signal);
1409
- const a = serialize(draft, format, {
1410
- filename: options.filename ?? `export.${extension}`,
1411
- ...options.spreadsheetSafe === void 0 ? { spreadsheetSafe: format === "csv" || format === "tsv" } : { spreadsheetSafe: options.spreadsheetSafe }
1412
- });
1413
- return a;
1414
- }
1415
- };
1416
- }
1417
- var plainEngine = {
1418
- async build(draft, options, signal) {
1419
- checkSignal(signal);
1420
- if (draft.payload.kind === "markdown") {
1421
- const { markdownPlainText: markdownPlainText2 } = await Promise.resolve().then(() => (init_rich_html(), rich_html_exports));
1422
- const text = await markdownPlainText2(draft.payload.text, options, signal);
1423
- return textArtifact(draft, "plain", text, "text/plain;charset=utf-8", options.filename ?? "export.txt");
1424
- }
1425
- const ext = draft.payload.kind === "text" ? extensionForLanguage(draft.payload.language) : "txt";
1426
- const a = serialize(draft, "plain", { filename: options.filename ?? `export.${ext}` });
1427
- return a;
1428
- }
1429
- };
1430
- var markdownEngine = {
1431
- async build(draft, options, signal) {
1432
- checkSignal(signal);
1433
- const p = draft.payload;
1434
- if (p.kind === "text" && p.language) {
1435
- const text = fencedCodeBlock(p.text, p.language);
1436
- return textArtifact(draft, "markdown", text, "text/markdown;charset=utf-8", options.filename ?? "export.md");
1437
- }
1438
- return serialize(draft, "markdown", { filename: options.filename ?? "export.md" });
1439
- }
1440
- };
1441
- var htmlEngine = {
1442
- async build(draft, options, signal) {
1443
- checkSignal(signal);
1444
- if (isProse(draft.payload)) {
1445
- const { documentHtmlEngine: documentHtmlEngine2 } = await Promise.resolve().then(() => (init_document(), document_exports));
1446
- return documentHtmlEngine2.build(draft, options, signal);
1447
- }
1448
- return serialize(draft, "html", { filename: options.filename ?? "export.html" });
1449
- }
1450
- };
1451
- var lazy = (pick) => pick;
1452
- var FORMAT_ADAPTERS = Object.freeze([
1453
- { id: "plain", label: "Plain text", extension: "txt", mime: "text/plain;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: always, load: async () => plainEngine },
1454
- { id: "markdown", label: "Markdown", extension: "md", mime: "text/markdown;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: (p) => p.kind !== "json" && p.kind !== "registered", load: async () => markdownEngine },
1455
- {
1456
- // Google Docs and Word are ONE action until a destination profile produces different bytes (1.9a).
1457
- id: "rich-html",
1458
- label: "Copy formatted",
1459
- extension: "html",
1460
- mime: "text/html;charset=utf-8",
1461
- modes: ["copy"],
1462
- runsOn: "client",
1463
- supports: (p) => p.kind === "markdown",
1464
- load: lazy(async () => (await Promise.resolve().then(() => (init_rich_html(), rich_html_exports))).richHtmlEngine)
1465
- },
1466
- { id: "html", label: "HTML page", extension: "html", mime: "text/html;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: (p) => p.kind !== "registered", load: async () => htmlEngine },
1467
- { id: "json", label: "JSON", extension: "json", mime: "application/json;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: (p) => p.kind !== "registered", load: async () => serialized("json", "json") },
1468
- { id: "compact-json", label: "Compact JSON", extension: "json", mime: "application/json;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: (p) => p.kind !== "registered", load: async () => serialized("compact-json", "json") },
1469
- { id: "csv", label: "CSV", extension: "csv", mime: "text/csv;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: isRows, load: async () => serialized("csv", "csv") },
1470
- { id: "tsv", label: "Google Sheets", extension: "tsv", mime: "text/tab-separated-values;charset=utf-8", modes: ["copy", "download"], runsOn: "client", supports: isRows, load: async () => serialized("tsv", "tsv") },
1471
- {
1472
- id: "xlsx",
1473
- label: "Excel workbook",
1474
- extension: "xlsx",
1475
- mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
1476
- modes: ["download"],
1477
- runsOn: "client",
1478
- supports: isRows,
1479
- load: lazy(async () => (await import("@ai-matrx/alchemy/operate/formats/xlsx")).xlsxEngine)
1480
- },
1481
- {
1482
- id: "pdf",
1483
- label: "PDF",
1484
- extension: "pdf",
1485
- mime: "application/pdf",
1486
- modes: ["download"],
1487
- runsOn: "client",
1488
- supports: isProse,
1489
- load: lazy(async () => (await Promise.resolve().then(() => (init_document(), document_exports))).documentEngine("pdf"))
1490
- },
1491
- {
1492
- id: "docx",
1493
- label: "Word document",
1494
- extension: "docx",
1495
- mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1496
- modes: ["download"],
1497
- runsOn: "client",
1498
- supports: isProse,
1499
- load: lazy(async () => (await Promise.resolve().then(() => (init_document(), document_exports))).documentEngine("docx"))
1500
- },
1501
- {
1502
- id: "epub",
1503
- label: "EPUB book",
1504
- extension: "epub",
1505
- mime: "application/epub+zip",
1506
- modes: ["download"],
1507
- runsOn: "client",
1508
- supports: isProse,
1509
- load: lazy(async () => (await Promise.resolve().then(() => (init_document(), document_exports))).documentEngine("epub"))
1510
- }
1511
- ]);
1512
- function eligibleFormats(payload, registered = [], mode) {
1513
- return resolveTransferRegistry(FORMAT_ADAPTERS, registered).filter(
1514
- (f) => f.supports(payload) && (mode === void 0 || f.modes.includes(mode))
1515
- );
1516
- }
1517
- function formatAdapter(id, registered = []) {
1518
- const found = resolveTransferRegistry(FORMAT_ADAPTERS, registered).find((f) => f.id === id);
1519
- if (!found) throw new ContentTransferError("unsupported-format", `There is no "${id}" format. Choose one of the formats offered for this content.`);
1520
- return found;
1521
- }
1522
-
1523
- // src/operate/preparation.ts
1524
- init_core();
1525
- var SEALED = /* @__PURE__ */ Symbol.for("ai-matrx.alchemy.operate.sealed-artifacts");
1526
- function sealedSet() {
1527
- const g = globalThis;
1528
- g[SEALED] ??= /* @__PURE__ */ new WeakSet();
1529
- return g[SEALED];
1530
- }
1531
- function sealArtifact(artifact) {
1532
- const frozen = sealTransferArtifact(artifact);
1533
- sealedSet().add(frozen);
1534
- return frozen;
1535
- }
1536
- function isSealed(artifact) {
1537
- return typeof artifact === "object" && artifact !== null && sealedSet().has(artifact);
1538
- }
1539
- var notSealed = {
1540
- status: "error",
1541
- code: "not-sealed",
1542
- message: "This content was not prepared for delivery, so nothing was copied or saved. Prepare it again and retry.",
1543
- retryable: true
1544
- };
1545
- var optionsKey = (o) => JSON.stringify({ f: o.filename ?? null, s: o.spreadsheetSafe ?? null, k: o.skin ?? null, p: o.profile ?? null, h: o.highlightCode ?? false });
1546
- async function openPreparation(source, scope, signal, options = {}) {
1547
- const { snapshot } = await capture(source, signal, scope);
1548
- let draft = createDraft(snapshot);
1549
- const transforms = /* @__PURE__ */ new Map();
1550
- for (const t of options.transforms ?? []) {
1551
- if (transforms.has(t.id)) throw new ContentTransferError("duplicate-registration", `Transform "${t.id}" is registered more than once`);
1552
- transforms.set(t.id, t);
1553
- }
1554
- const cache = /* @__PURE__ */ new Map();
1555
- return {
1556
- get snapshot() {
1557
- return snapshot;
1558
- },
1559
- get draft() {
1560
- return draft;
1561
- },
1562
- async transform(id, transformOptions, transformSignal) {
1563
- const t = transforms.get(id);
1564
- if (!t) throw new ContentTransferError("unsupported-transform", `There is no "${id}" preparation step here.`);
1565
- draft = await t.apply(draft, transformOptions, transformSignal);
1566
- return draft;
1567
- },
1568
- edit(payload) {
1569
- draft = editDraft(draft, payload);
1570
- return draft;
1571
- },
1572
- selectSections(ids) {
1573
- draft = applySectionSelection(draft, snapshot, ids);
1574
- return draft;
1575
- },
1576
- undo() {
1577
- draft = undoDraft(draft);
1578
- return draft;
1579
- },
1580
- seal(format, formatOptions, sealSignal) {
1581
- const adapter = formatAdapter(format, options.formats);
1582
- if (!adapter.supports(draft.payload)) {
1583
- return Promise.reject(new ContentTransferError("unsupported-format", `${adapter.label} is not available for this content.`));
1584
- }
1585
- const key = `${draft.revision}\0${format}\0${optionsKey(formatOptions)}`;
1586
- const hit = cache.get(key);
1587
- if (hit) return hit;
1588
- const at2 = draft;
1589
- const built = adapter.load().then((engine) => engine.build(at2, formatOptions, sealSignal)).then(sealArtifact);
1590
- built.catch(() => cache.delete(key));
1591
- cache.set(key, built);
1592
- return built;
1593
- }
1594
- };
1595
- }
1596
- async function sealDraft(draft, format, options, signal, formats) {
1597
- const adapter = formatAdapter(format, formats);
1598
- if (!adapter.supports(draft.payload)) throw new ContentTransferError("unsupported-format", `${adapter.label} is not available for this content.`);
1599
- return sealArtifact(await (await adapter.load()).build(draft, options, signal));
1600
- }
1601
- function narrow(outcome) {
1602
- if (outcome.status === "success" && outcome.delivered === "action") {
1603
- return { status: "success", delivered: "clipboard", mimeTypes: outcome.mimeTypes };
1604
- }
1605
- if (outcome.status === "queued") {
1606
- return { status: "error", code: "unexpected-queued", message: outcome.message, retryable: false };
1607
- }
1608
- return outcome;
1609
- }
1610
- function createDelivery(ports = {}) {
1611
- const transport = ports.transport ?? createBrowserTransport();
1612
- return {
1613
- async copy(artifact, signal) {
1614
- if (!isSealed(artifact)) return notSealed;
1615
- return narrow(await transport.copy(artifact, signal));
1616
- },
1617
- copyPending(pending, signal, options = {}) {
1618
- const clipboard = globalThis.navigator?.clipboard;
1619
- const Item = globalThis.ClipboardItem;
1620
- const checked = pending.then((a) => {
1621
- if (!isSealed(a)) throw new ContentTransferError("not-sealed", notSealed.status === "error" ? notSealed.message : "");
1622
- return a;
1623
- });
1624
- if (clipboard?.write && typeof Item === "function") {
1625
- const text = checked.then((a) => new Blob([a.plainText], { type: "text/plain" }));
1626
- const entries = { "text/plain": text };
1627
- if (options.html) entries["text/html"] = checked.then((a) => new Blob([a.html ?? a.plainText], { type: "text/html" }));
1628
- let item = null;
1629
- try {
1630
- item = new Item(entries);
1631
- } catch {
1632
- item = null;
1633
- }
1634
- if (item) {
1635
- const written = clipboard.write([item]);
1636
- return written.then(
1637
- async () => signal.aborted ? { status: "cancelled" } : { status: "success", delivered: "clipboard", mimeTypes: options.html ? ["text/plain", "text/html"] : ["text/plain"] },
1638
- async () => {
1639
- try {
1640
- const a = await checked;
1641
- return narrow(await transport.copy(a, signal));
1642
- } catch (error) {
1643
- return error instanceof ContentTransferError && error.code === "not-sealed" ? notSealed : { status: "error", code: "clipboard-rejected", message: "The clipboard refused the copy. Try again.", retryable: true };
1644
- }
1645
- }
1646
- );
1647
- }
1648
- }
1649
- return checked.then(
1650
- async (a) => narrow(await transport.copy(a, signal)),
1651
- () => notSealed
1652
- );
1653
- },
1654
- async download(artifact, signal) {
1655
- if (!isSealed(artifact)) return notSealed;
1656
- return narrow(await transport.download(artifact, signal));
1657
- },
1658
- async send(artifact, to, via) {
1659
- if (!isSealed(artifact)) {
1660
- return { status: "refused", to, reason: "failed", sentence: notSealed.status === "error" ? notSealed.message : "", remedy: "Prepare the content again, then send it." };
1661
- }
1662
- if (!ports.door) {
1663
- return {
1664
- status: "refused",
1665
- to,
1666
- reason: "unapplicable",
1667
- sentence: "Sending to a destination is not available here yet, so nothing was sent.",
1668
- remedy: "Copy or download it instead, then paste it where it belongs."
1669
- };
1670
- }
1671
- return ports.door.apply({ to, value: artifact.file ? artifact.file.bytes : artifact.plainText, origin: "user", via });
1672
- }
1673
- };
1674
- }
1675
- export {
1676
- ContentTransferError,
1677
- FORMAT_ADAPTERS,
1678
- applySectionSelection,
1679
- applyTransferLimits,
1680
- buildAgentPayload,
1681
- capture,
1682
- collectAllMatching,
1683
- createBrowserTransport,
1684
- createDelivery,
1685
- createDraft,
1686
- createSurfaceTransferHandle,
1687
- directSource,
1688
- editDraft,
1689
- eligibleFormats,
1690
- extensionForLanguage,
1691
- fenceJsonBlock,
1692
- formatAdapter,
1693
- isSealed,
1694
- normalizeTransferJson,
1695
- openPreparation,
1696
- projectSnapshot,
1697
- readTransferCell,
1698
- reduceJson,
1699
- refreshDraft,
1700
- resetDraft,
1701
- resolveTransferPreferences,
1702
- resolveTransferRegistry,
1703
- sealArtifact,
1704
- sealDraft,
1705
- sealTransferArtifact,
1706
- serialize,
1707
- sourceChanged,
1708
- transformRows,
1709
- undoDraft
1710
- };
15
+ </${kind}>`}var escapeXml,xmlName,presentEntries,init_agent_payload=__esm({"src/operate/agent-payload.ts"(){"use strict";init_fenced_code();escapeXml=value=>value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),xmlName=name=>{if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(name))throw new Error(`Invalid AI envelope name: ${name}`);return name},presentEntries=values=>Object.entries(values??{}).filter(([,value])=>value!=null&&value!=="")}});import{stringifyJson}from"@ai-matrx/kit/json-format";import{escapeHtml}from"@ai-matrx/kit/html-escape";function clone(v,path="",seen=new WeakSet,policy={}){if(v===null||typeof v=="string"||typeof v=="boolean")return v;if(typeof v=="number"){if(!Number.isFinite(v))throw new ContentTransferError("unsupported-value","Only finite numbers are transferable",path);return v}if(typeof v!="object")throw new ContentTransferError("unsupported-value","Unsupported value",path);if(seen.has(v))throw new ContentTransferError("circular-value","Circular values cannot be transferred",path);if(!Array.isArray(v)&&Object.getPrototypeOf(v)!==Object.prototype&&Object.getPrototypeOf(v)!==null)throw new ContentTransferError("unsupported-value","Only plain JSON objects are transferable",path);if(seen.add(v),Array.isArray(v)){for(let index=0;index<v.length;index+=1)if(!Object.hasOwn(v,index))throw new ContentTransferError("unsupported-value","Sparse arrays cannot be transferred",`${path}/${index}`)}let out=Array.isArray(v)?v.map((x,i)=>clone(x,`${path}/${i}`,seen,policy)):Object.fromEntries(Object.entries(v).filter(([,x])=>!policy.omitUndefinedObjectProperties||x!==void 0).map(([k,x])=>[k,clone(x,`${path}/${enc(k)}`,seen,policy)]));return seen.delete(v),out}function displaySurfacePointer(path){if(!path)return"/";let pointer=`/${path.split("/").slice(1).map(segment=>{let controlSafe=segment.replace(/[\u0000-\u001F\u007F-\u009F]/g,character=>`\\u${character.charCodeAt(0).toString(16).padStart(4,"0")}`);return truncateSurfacePointer(controlSafe,maxSurfacePointerSegmentLength)}).join("/")}`;return truncateSurfacePointer(pointer,maxSurfacePointerLength)}function cloneSurfaceValue(value,path){try{return normalizeTransferJsonAtPath(value,path,{omitUndefinedObjectProperties:!0})}catch(error){throw error instanceof ContentTransferError?new ContentTransferError(error.code,`Surface capture rejected value at ${displaySurfacePointer(error.path)}: ${error.message}`,error.path):error}}function normalizeTransferJsonAtPath(value,path,options={}){return clone(value,path,new WeakSet,options)}function normalizeTransferJson(value,options={}){return normalizeTransferJsonAtPath(value,"",options)}function deepFreeze(v){if(ArrayBuffer.isView(v))return v;if(v&&typeof v=="object"&&!Object.isFrozen(v)){Object.freeze(v);for(let x of Object.values(v))deepFreeze(x)}return v}function at(v,path){if(validatePointer(path),path==="")return v;if(!path.startsWith("/"))throw new ContentTransferError("invalid-path","Expected RFC 6901 pointer",path);let cur=v;for(let part of path.slice(1).split("/").map(dec))if(Array.isArray(cur))cur=cur[Number(part)];else if(cur&&typeof cur=="object")cur=Object.hasOwn(cur,part)?cur[part]:void 0;else return;return cur}function validatePointer(path){if(path!==""&&!path.startsWith("/")||/~(?![01])/u.test(path))throw new ContentTransferError("invalid-path","Expected an RFC 6901 JSON pointer",path)}function readTransferCell(row,column){return at(row,column.path)}function without(v,paths,omit,path=""){if(paths.includes(path)){omit.push({path,reason:"excluded"});return}if(Array.isArray(v))return v.map((x,i)=>without(x,paths,omit,`${path}/${i}`)).filter(x=>x!==void 0);if(v&&typeof v=="object"){let out=Object.create(null);for(let[k,x]of Object.entries(v)){let y=without(x,paths,omit,`${path}/${enc(k)}`);y!==void 0&&(out[k]=y)}return out}return v}function projectValue(v,rules,target,omit){return rules.forEach(rule=>validatePointer(rule.path)),without(clone(v),rules.filter(r=>r.target===target&&(!r.exportable||r.classification!=="ordinary")).map(r=>r.path),omit)??null}function excludedColumn(column){return column.exportable===!1||column.classification==="secret"||column.classification==="credential"}function rowProjectionExcludesColumnSchema(column,rules){return rules.some(rule=>rule.target==="row"&&(!rule.exportable||rule.classification!=="ordinary")&&(rule.path===column.path||column.path.startsWith(`${rule.path}/`)))}function projectColumnSchema(column,rules,omit){if(column.schema===void 0)return;let root=`/columns/${enc(column.id)}/schema`,schemaRules=rules.filter(rule=>rule.target==="payload"&&(rule.path===root||rule.path.startsWith(`${root}/`))).map(rule=>({...rule,path:rule.path.slice(root.length)})),projected=projectValue(column.schema,schemaRules,"payload",omit);if(!schemaRules.some(rule=>rule.path===""&&(!rule.exportable||rule.classification!=="ordinary")))return projected}function normalize(p,projection,omit){if(p.kind==="text"||p.kind==="markdown"){if(typeof p.text!="string")throw new ContentTransferError("unsupported-value","Text payload must contain a string","/text");let value=projectValue(p.text,projection.rules,"payload",omit),text=typeof value=="string"?value:"";return p.kind==="text"&&typeof p.language=="string"&&p.language.trim()?{kind:"text",text,language:p.language.trim()}:{kind:p.kind,text}}if(p.kind==="json")return{kind:"json",value:projectValue(p.value,projection.rules,"payload",omit)};if(p.kind==="registered")return{kind:"registered",format:p.format,value:projectValue(p.value,projection.rules,"payload",omit)};let rowsPayload=p;if(p.kind!=="rows")throw new ContentTransferError("invalid-payload","Unsupported payload kind");let sourceColumns=rowsPayload.columns.map(column=>({...column})),columns=sourceColumns.filter(column=>!excludedColumn(column)).map(column=>{let{schema:_sourceSchema,...withoutSchema}=column,schema=rowProjectionExcludesColumnSchema(column,projection.rules)?void 0:projectColumnSchema(column,projection.rules,omit);return{...withoutSchema,...schema===void 0?{}:{schema}}});resolveTransferRegistry(columns),columns.forEach(column=>validatePointer(column.path));let rules=[...projection.rules,...sourceColumns.filter(excludedColumn).map(c=>({target:"row",path:c.path,exportable:c.exportable??!0,classification:c.classification??"ordinary"}))];return{kind:"rows",columns,rows:rowsPayload.rows.map((row,index)=>{if(!row||typeof row!="object"||Array.isArray(row))throw new ContentTransferError("invalid-row","A table row must be a JSON object",`/rows/${index}`);let projected=projectValue(row,rules,"row",omit);return projected===null?{}:projected})}}function projectSnapshot(raw,projection){let omissions=raw.omissions.map(o=>({...o})),normalized=normalize(raw.payload,projection,omissions),payload=raw.limits?limitPayload(normalized,raw.limits,omissions):normalized,included=payload.kind==="rows"?payload.rows.length:raw.coverage.included;return deepFreeze({...raw,payload,coverage:{...raw.coverage,included,...included<raw.coverage.included?{status:"partial",reason:"Source export limit applied"}:{}},omissions,sections:raw.sections.filter(section=>!projection.rules.some(rule=>rule.target==="payload"&&(!rule.exportable||rule.classification!=="ordinary")&&(section.path===rule.path||section.path.startsWith(`${rule.path}/`)))).map(x=>({...x})),...raw.limits?{limits:{...raw.limits}}:{}})}function directSource(payload,options={}){let id=options.id??uid();return{projection:options.projection??{rules:[]},snapshot:{id,sourceId:options.sourceId??id,revision:options.revision??uid(),capturedAt:new Date().toISOString(),label:options.label??"Content",payload,coverage:options.coverage??{status:"complete",included:payload.kind==="rows"?payload.rows.length:1,total:payload.kind==="rows"?payload.rows.length:1},unsavedChanges:options.unsavedChanges??!1,omissions:[],sections:options.sections??[],...options.limits?{limits:{...options.limits}}:{}}}}async function capture(source,signal,scope="target"){stop(signal);let captured="kind"in source?directSource(source):await source.capture({scope,signal});stop(signal);let all=captured.allMatching;if(all&&(all.query.sourceId!==captured.snapshot.sourceId||all.query.revision!==captured.snapshot.revision||all.query.order.length===0))throw new ContentTransferError("query-mismatch","All-matching query must be captured with stable ordering");let snapshot=projectSnapshot(captured.snapshot,captured.projection);return all?{snapshot,allMatching:deepFreeze({[bound]:!0,source:{...all,query:{...all.query,query:clone(all.query.query),order:all.query.order.map(x=>({...x}))}},projection:{rules:captured.projection.rules.map(x=>({...x}))},columns:captured.snapshot.payload.kind==="rows"?captured.snapshot.payload.columns.map(column=>({...column})):[],...snapshot.limits?{limits:{...snapshot.limits}}:{}})}:{snapshot}}function createDraft(s){return deepFreeze({snapshotId:s.id,sourceId:s.sourceId,sourceRevision:s.revision,revision:0,payload:normalize(s.payload,{rules:[]},[]),omissions:[...s.omissions],manuallyEdited:!1,provenance:[{kind:"original",description:"Captured source snapshot"}]})}function revise(d,p,o,description,manual=d.manuallyEdited,kind="deterministic",baseOmissions=d.omissions){let{history:_history,...previous}=d;return deepFreeze({...d,revision:d.revision+1,payload:normalize(p,{rules:[]},[]),omissions:[...baseOmissions,...o],manuallyEdited:manual,provenance:[...d.provenance,{kind,description}],history:[...d.history??[],previous]})}function undoDraft(d){let previous=d.history?.at(-1);return previous?deepFreeze({...previous,revision:d.revision+1,history:d.history.slice(0,-1)}):d}function refreshDraft(draft,snapshot,choice){return choice==="keep"?draft:createDraft(snapshot)}function applySectionSelection(d,s,ids){if(d.snapshotId!==s.id||d.sourceId!==s.sourceId||d.sourceRevision!==s.revision)throw new ContentTransferError("snapshot-mismatch","Section selection requires the draft's captured source snapshot");let selected=new Set(ids),omit=[],paths=s.sections.filter(x=>!selected.has(x.id)).map(x=>(omit.push({path:x.path,reason:"excluded"}),x.path)),baseOmissions=s.omissions;if(s.payload.kind==="json")return revise(d,{kind:"json",value:without(s.payload.value,paths,[])??null},omit,"Selected sections",d.manuallyEdited,"deterministic",baseOmissions);if(s.payload.kind==="registered")return revise(d,{kind:"registered",format:s.payload.format,value:without(s.payload.value,paths,[])??null},omit,"Selected sections",d.manuallyEdited,"deterministic",baseOmissions);if(s.payload.kind==="markdown"||s.payload.kind==="text"){let text=s.payload.text,ranges=paths.map(path=>{let m=/^\/text\/(\d+)-(\d+)$/.exec(path),start=m?Number(m[1]):NaN,end=m?Number(m[2]):NaN;if(!m||start>end||end>text.length)throw new ContentTransferError("invalid-section",`Section "${path}" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`);return[start,end]}).sort((a,b)=>b[0]-a[0]),kept=text;for(let[start,end]of ranges)kept=kept.slice(0,start)+kept.slice(end);return revise(d,{...s.payload,text:kept},omit,"Selected sections",d.manuallyEdited,"deterministic",baseOmissions)}return revise(d,s.payload,omit,"Selected sections",d.manuallyEdited,"deterministic",baseOmissions)}function transformRows(d,o){if(d.payload.kind!=="rows")return d;o.top!=null&&assertLimit(o.top,"maxRows");let cols=o.visibleColumns?o.visibleColumns.map(id=>d.payload.kind==="rows"?d.payload.columns.find(c=>c.id===id):void 0).filter(c=>!!c):d.payload.columns.filter(c=>c.visible),get=readTransferCell,rows=[...d.payload.rows],omit=[],before=rows.length;if(o.selectedIndices!==void 0){let selected=new Set;for(let index of o.selectedIndices){if(!Number.isSafeInteger(index)||index<0||index>=d.payload.rows.length)throw new ContentTransferError("invalid-selection-index","Selected row indexes must be non-negative positions in the input draft rows");selected.add(index)}rows=d.payload.rows.filter((_,index)=>selected.has(index))}if(o.selectedIds&&o.idColumn){let set=new Set(o.selectedIds),idColumn=d.payload.columns.find(c=>c.id===o.idColumn);rows=rows.filter(r=>set.has(String(idColumn?get(r,idColumn):r[o.idColumn])))}if(o.search){let q=o.search.toLowerCase();rows=rows.filter(r=>cols.some(c=>String(get(r,c)??"").toLowerCase().includes(q)))}for(let[id,q]of Object.entries(o.filters??{})){let c=cols.find(x=>x.id===id);c&&(rows=rows.filter(r=>String(get(r,c)??"").toLowerCase().includes(q.toLowerCase())))}if(rows.length!==before&&omit.push({path:"/rows",reason:"filtered",count:before-rows.length}),o.sort){let c=cols.find(x=>x.id===o.sort.column);c&&rows.sort((a,b)=>{let left=get(a,c),right=get(b,c);return(typeof left=="number"&&typeof right=="number"?left-right:String(left??"").localeCompare(String(right??"")))*(o.sort.direction==="asc"?1:-1)})}if(o.top!=null&&rows.length>o.top&&(omit.push({path:"/rows",reason:"truncated",count:rows.length-o.top}),rows=rows.slice(0,o.top)),o.structuredProjection==="visible"){rows=rows.map(r=>Object.fromEntries(cols.map(c=>[c.id,get(r,c)??null])));let excludedColumns=d.payload.columns.length-cols.length;excludedColumns>0&&omit.push({path:"/columns",reason:"excluded",count:excludedColumns})}return revise(d,{kind:"rows",rows,columns:cols.map(c=>({...c,visible:!0,...o.structuredProjection==="visible"?{path:`/${enc(c.id)}`}:{}}))},omit,"Prepared row subset")}function reduceJson(draft,options){if(draft.payload.kind!=="json"&&draft.payload.kind!=="registered")return draft;let omissions=[];options.exclude?.forEach(validatePointer);let filtered=without(clone(draft.payload.value),options.exclude??[],omissions)??null,payload=limitPayload({...draft.payload,value:filtered},options,omissions);return revise(draft,payload,omissions,"Reduced JSON")}async function collectAllMatching(c,signal){let rows=[],omissions=[],ids=new Set,cursors=new Set,cursor=null,token,last={status:"unknown",included:0,total:null},certifiedTotal,maxRows=c.limits?.maxRows;maxRows!=null&&assertLimit(maxRows,"maxRows");let finishAtLimit=(total,knownOmitted)=>({rows:deepFreeze(rows),omissions:deepFreeze([...omissions,{path:"/rows",reason:"truncated",...knownOmitted===void 0||knownOmitted<=0?{}:{count:knownOmitted}}]),coverage:deepFreeze({status:"partial",included:rows.length,total,reason:"Source export limit applied"})});try{if(maxRows===0)return finishAtLimit(null);do{stop(signal);let page=await c.source.page({query:c.source.query,cursor,consistencyToken:token??null,signal});if(stop(signal),token===void 0)token=page.consistencyToken;else if(page.consistencyToken!==token)throw new ContentTransferError("consistency-token-changed","All-matching export changed during collection");if(page.coverage.included!==page.rows.length)throw new ContentTransferError("invalid-page-coverage","Page count does not match returned rows");if(page.coverage.total!==null&&(!Number.isSafeInteger(page.coverage.total)||page.coverage.total<0))throw new ContentTransferError("invalid-page-coverage","Page total must be a non-negative integer or null");if(certifiedTotal===void 0)certifiedTotal=page.coverage.total;else if(page.coverage.total!==certifiedTotal)throw new ContentTransferError("inconsistent-total","All-matching source changed its reported total during collection");let projected=normalize({kind:"rows",rows:page.rows,columns:[...c.columns]},c.projection,omissions).rows,uniqueBeyondLimit=0;for(let row of projected){let id=c.source.getRowId(row);if(!id)throw new ContentTransferError("invalid-row-id","All-matching source returned empty projected ID");ids.has(id)?omissions.push({path:`/rows/${enc(id)}`,reason:"duplicate"}):(ids.add(id),maxRows==null||rows.length<maxRows?rows.push(limitPayload({kind:"rows",rows:[row],columns:[...c.columns]},{...c.limits,maxRows:null},omissions).rows[0]):uniqueBeyondLimit+=1)}if(page.coverage.total!==null&&page.coverage.total<ids.size)throw new ContentTransferError("invalid-page-coverage","Page total is smaller than the accumulated unique row count");if(last=page.coverage,maxRows!=null&&rows.length>=maxRows&&(uniqueBeyondLimit>0||page.nextCursor!==null))return finishAtLimit(page.coverage.total,page.nextCursor===null?uniqueBeyondLimit:page.coverage.total!=null&&page.coverage.total>rows.length?page.coverage.total-rows.length:void 0);if(cursor=page.nextCursor,cursor!==null&&(!cursor||cursors.has(cursor)))throw new ContentTransferError("non-advancing-cursor","All-matching source repeated a cursor");cursor&&cursors.add(cursor)}while(cursor!==null);let complete=c.source.stableSnapshot===!0&&last.status==="complete"&&last.total===rows.length&&token!==void 0;return{rows:deepFreeze(rows),omissions:deepFreeze(omissions),coverage:deepFreeze(complete?{...last,included:rows.length}:{...last,status:"partial",included:rows.length,reason:last.reason??"Source did not certify a stable complete snapshot"})}}catch(e){let error=e instanceof ContentTransferError?e:new ContentTransferError(signal.aborted?"cancelled":"page-failed",e instanceof Error?e.message:"Page collection failed");return{rows:deepFreeze(rows),omissions:deepFreeze(omissions),coverage:deepFreeze({status:"partial",included:rows.length,total:last.total,reason:error.message}),error}}}function sealTransferArtifact(artifact){if(!artifact.file)return deepFreeze({...artifact,omissions:artifact.omissions.map(o=>({...o}))});let bytes=artifact.file.bytes.slice(),file={filename:artifact.file.filename,mime:artifact.file.mime,get bytes(){return bytes.slice()}};return deepFreeze({...artifact,file,omissions:artifact.omissions.map(o=>({...o}))})}function serialize(draft,format,options={}){let payload=draft.payload,omissions=draft.omissions.map(o=>({...o})),plainText="",html,mime="text/plain;charset=utf-8",extension="txt",columnCell=(row,column)=>textValue(readTransferCell(row,column));if((format==="csv"||format==="tsv")&&payload.kind!=="rows")throw new ContentTransferError("unsupported-format",`${format.toUpperCase()} requires tabular data`);if(format==="json"||format==="compact-json"){let value=payload.kind==="rows"?payload.rows:payload.kind==="text"||payload.kind==="markdown"?payload.text:payload.value;plainText=stringifyJson(value,{style:format==="json"?"pretty":"compact"}),mime="application/json;charset=utf-8",extension="json"}else if(payload.kind==="rows"){let columns=payload.columns.filter(c=>c.visible&&c.exportable!==!1&&c.classification!=="secret"&&c.classification!=="credential");if(format==="markdown"){let escapeCell=value=>escapeHtml(value).replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\r\n|\r|\n/g,"<br>");plainText=[`| ${columns.map(c=>escapeCell(c.label)).join(" | ")} |`,`| ${columns.map(()=>"---").join(" | ")} |`,...payload.rows.map(row=>`| ${columns.map(c=>escapeCell(columnCell(row,c))).join(" | ")} |`)].join(`
16
+ `),mime="text/markdown;charset=utf-8",extension="md"}else{let delimiter=format==="csv"?",":" ",safe=options.spreadsheetSafe??format==="tsv",encode=(value,path,isString=!0)=>{let text=value;return safe&&isString&&/^[\t\r\n ]*[=+\-@]/.test(text)&&(text=`'${text}`,omissions.push({path,reason:"escaped",count:1})),text.includes(delimiter)||/["\n\r]/.test(text)?`"${text.replace(/"/g,'""')}"`:text};plainText=[columns.map(c=>encode(c.label,`/columns/${enc(c.id)}`)).join(delimiter),...payload.rows.map((row,index)=>columns.map(c=>encode(columnCell(row,c),`/rows/${index}${c.path}`,typeof readTransferCell(row,c)=="string")).join(delimiter))].join(`
17
+ `),format==="csv"&&(mime="text/csv;charset=utf-8",extension="csv"),format==="tsv"&&(mime="text/tab-separated-values;charset=utf-8",extension="tsv")}format==="html"&&(html=`<table><thead><tr>${columns.map(c=>`<th>${escapeHtml(c.label)}</th>`).join("")}</tr></thead><tbody>${payload.rows.map(row=>`<tr>${columns.map(c=>`<td>${escapeHtml(columnCell(row,c)).replace(/\r\n|\r|\n/g,"<br>")}</td>`).join("")}</tr>`).join("")}</tbody></table>`)}else plainText=payload.kind==="text"||payload.kind==="markdown"?payload.text:stringifyJson(payload.value,{style:"pretty"}),format==="markdown"&&(mime="text/markdown;charset=utf-8",extension="md"),format==="html"&&(html=`<pre>${escapeHtml(plainText)}</pre>`);return format==="html"&&(mime="text/html;charset=utf-8",extension="html"),sealTransferArtifact({snapshotId:draft.snapshotId,draftRevision:draft.revision,format,plainText,...html===void 0?{}:{html},file:{filename:options.filename??`export.${extension}`,mime,bytes:new TextEncoder().encode(format==="html"?html??plainText:plainText)},omissions})}function createBrowserTransport(){return{async copy(a,signal){let cancelled=()=>signal.aborted?{status:"cancelled"}:void 0;try{if(cancelled())return cancelled();let c=globalThis.navigator?.clipboard;if(!c?.write&&!c?.writeText)return{status:"error",code:"clipboard-unavailable",message:"Clipboard writing is unavailable",retryable:!1};if(a.html&&c.write&&typeof globalThis.ClipboardItem=="function")try{return await c.write([new ClipboardItem({"text/plain":new Blob([a.plainText],{type:"text/plain"}),"text/html":new Blob([a.html],{type:"text/html"})})]),cancelled()?cancelled():{status:"success",delivered:"clipboard",mimeTypes:["text/plain","text/html"]}}catch{if(cancelled())return cancelled()}return c.writeText?(await c.writeText(a.plainText),cancelled()?cancelled():a.html?{status:"degraded",delivered:"plain-text",reason:"Rich clipboard write was unavailable or rejected"}:{status:"success",delivered:"clipboard",mimeTypes:["text/plain"]}):{status:"error",code:"clipboard-rejected",message:"Clipboard rejected the write",retryable:!0}}catch(e){return cancelled()??{status:"error",code:"clipboard-rejected",message:e instanceof Error?e.message:"Clipboard rejected the write",retryable:!0}}},async download(a,signal){if(signal.aborted)return{status:"cancelled"};if(!a.file||typeof document>"u"||!URL?.createObjectURL)return{status:"error",code:"download-unavailable",message:"Download is unavailable",retryable:!1};let url;try{url=URL.createObjectURL(new Blob([a.file.bytes.slice().buffer],{type:a.file.mime}));let link=document.createElement("a");return link.href=url,link.download=a.file.filename,link.click(),signal.aborted?{status:"cancelled"}:{status:"success",delivered:"download-started",mimeTypes:[a.file.mime]}}catch(e){return signal.aborted?{status:"cancelled"}:{status:"error",code:"download-failed",message:e instanceof Error?e.message:"Download failed",retryable:!0}}finally{url&&setTimeout(()=>URL.revokeObjectURL(url),0)}}}}function assertLimit(value,name){if(value!=null&&(!Number.isSafeInteger(value)||value<0))throw new ContentTransferError("invalid-limit",`${name} must be a non-negative safe integer or null`)}function resolveTransferPreferences(provider={},menu={},sourceLimits={}){let limits={maxRows:null,maxStringChars:null,maxDepth:null,maxArrayItems:null,targetTokens:null};for(let key of limitKeys){let candidates=[provider.limits?.[key],menu.limits?.[key],sourceLimits[key]];candidates.forEach(value=>assertLimit(value,key));let finite=candidates.filter(value=>value!=null);limits[key]=finite.length?Math.min(...finite):null}return deepFreeze({initialFormat:menu.initialFormat??provider.initialFormat??"plain",initialPreset:menu.initialPreset??provider.initialPreset??"full",limits})}function isReactElementType(value){return typeof value.$$typeof=="symbol"}function cloneTransferRegistration(value,path="registration",seen=new WeakSet){if(value===null||typeof value!="object"&&typeof value!="function"||typeof value=="function"||isReactElementType(value))return value;if(seen.has(value))throw new ContentTransferError("unsupported-registration-metadata","Circular transfer registration metadata is unsupported",path);if(seen.add(value),Array.isArray(value)){let copy2=value.map((item,index)=>cloneTransferRegistration(item,`${path}/${index}`,seen));return seen.delete(value),Object.freeze(copy2)}let prototype=Object.getPrototypeOf(value);if(prototype!==Object.prototype&&prototype!==null)throw new ContentTransferError("unsupported-registration-metadata","Transfer registration metadata must use plain objects and arrays",path);let copy=Object.create(prototype);for(let key of Reflect.ownKeys(value)){let descriptor=Object.getOwnPropertyDescriptor(value,key);if(!("value"in descriptor))throw new ContentTransferError("unsupported-registration-metadata","Transfer registration metadata cannot use accessors",`${path}/${String(key)}`);Object.defineProperty(copy,key,{value:cloneTransferRegistration(descriptor.value,`${path}/${String(key)}`,seen),enumerable:descriptor.enumerable===!0,writable:!1,configurable:!1})}return seen.delete(value),Object.freeze(copy)}function resolveTransferRegistry(...groups){let ids=new Set,result=[];for(let group of groups)for(let item of group){let copy=cloneTransferRegistration(item);if(!copy.id.trim()||ids.has(copy.id))throw new ContentTransferError("duplicate-registration",`Transfer id ${JSON.stringify(copy.id)} is empty or registered more than once`);ids.add(copy.id),result.push(copy)}return Object.freeze(result)}function createSurfaceTransferHandle(options){let declarations=resolveTransferRegistry(options.manifest.values.map(value=>({...value,id:value.name})));return{instanceId:options.instanceId,surfaceName:options.manifest.surfaceName,isMounted:options.isMounted,async capture(signal){if(stop(signal),!options.isMounted())throw new ContentTransferError("surface-unmounted","The captured surface is no longer mounted");let revisionBefore=options.getRevision?.(),scope=await options.getScope();if(stop(signal),!options.isMounted())throw new ContentTransferError("surface-unmounted","The surface closed during capture");if(revisionBefore!==void 0&&options.getRevision?.()!==revisionBefore)throw new ContentTransferError("surface-changed","The surface changed during capture; capture again");let value={};for(let declaration of declarations)Object.hasOwn(scope,declaration.name)&&scope[declaration.name]!==void 0&&Object.defineProperty(value,declaration.name,{value:cloneSurfaceValue(scope[declaration.name],`/${enc(declaration.name)}`),enumerable:!0,writable:!0,configurable:!0});return directSource({kind:"json",value},{sourceId:options.instanceId,revision:revisionBefore??uid(),label:options.manifest.label??options.manifest.surfaceName,unsavedChanges:options.unsavedChanges?.()??!1,sections:declarations.filter(d=>Object.hasOwn(value,d.name)).map(d=>({id:d.name,label:d.label,path:`/${enc(d.name)}`,includedByDefault:d.includedByDefault??!0})),projection:{rules:[...options.projection?.rules??[],...declarations.map(d=>({target:"payload",path:`/${enc(d.name)}`,exportable:d.exportable??!0,classification:d.classification??"ordinary"}))]},...options.limits?{limits:options.limits}:{}})}}}function limitJson(value,limits,omissions,path="",depth=0){if(limits.maxDepth!=null&&depth>limits.maxDepth)return omissions.push({path,reason:"truncated"}),null;if(typeof value=="string"&&limits.maxStringChars!=null&&Array.from(value).length>limits.maxStringChars){let chars=Array.from(value);return omissions.push({path,reason:"truncated",count:chars.length-limits.maxStringChars}),chars.slice(0,limits.maxStringChars).join("")}if(Array.isArray(value)){let count=Math.min(value.length,limits.maxArrayItems??value.length);return count<value.length&&omissions.push({path,reason:"truncated",count:value.length-count}),value.slice(0,count).map((item,index)=>limitJson(item,limits,omissions,`${path}/${index}`,depth+1))}return value&&typeof value=="object"?Object.fromEntries(Object.entries(value).map(([key,item])=>[key,limitJson(item,limits,omissions,`${path}/${enc(key)}`,depth+1)])):value}function limitPayload(payload,limits,omissions){if(limitKeys.forEach(key=>assertLimit(limits[key],key)),payload.kind==="rows"){let count=Math.min(payload.rows.length,limits.maxRows??payload.rows.length);return count<payload.rows.length&&omissions.push({path:"/rows",reason:"truncated",count:payload.rows.length-count}),{...payload,rows:payload.rows.slice(0,count).map((row,index)=>limitJson(row,limits,omissions,`/rows/${index}`))}}return payload.kind==="json"||payload.kind==="registered"?{...payload,value:limitJson(payload.value,limits,omissions)}:{...payload,text:limitJson(payload.text,limits,omissions)}}function applyTransferLimits(draft,limits){let omissions=[],payload=limitPayload(draft.payload,limits,omissions);return omissions.length?revise(draft,payload,omissions,"Applied preparation limits"):draft}var TRANSFER_ERROR,ContentTransferError,bound,stop,enc,dec,maxSurfacePointerSegmentLength,maxSurfacePointerLength,truncateSurfacePointer,uid,editDraft,resetDraft,sourceChanged,textValue,limitKeys,init_core=__esm({"src/operate/core.ts"(){"use strict";init_types();init_agent_payload();TRANSFER_ERROR=Symbol.for("ai-matrx.alchemy.operate.transfer-error"),ContentTransferError=class extends Error{code;path;constructor(code,message,path){super(message),this.code=code,this.path=path,this[TRANSFER_ERROR]=!0}static[Symbol.hasInstance](value){return typeof value=="object"&&value!==null&&value[TRANSFER_ERROR]===!0}},bound=Symbol.for("ai-matrx.alchemy.operate.bound-all-matching"),stop=s=>{if(s.aborted)throw new DOMException("Cancelled","AbortError")},enc=x=>x.replace(/~/g,"~0").replace(/\//g,"~1"),dec=x=>x.replace(/~1/g,"/").replace(/~0/g,"~");maxSurfacePointerSegmentLength=64,maxSurfacePointerLength=192,truncateSurfacePointer=(value,maxLength)=>{let characters=Array.from(value);return characters.length>maxLength?`${characters.slice(0,maxLength-1).join("")}\u2026`:value};uid=()=>globalThis.crypto?.randomUUID?.()??`capture-${Date.now()}-${Math.random()}`;editDraft=(d,p)=>revise(d,p,[],"Manual edit",!0,"manual"),resetDraft=s=>createDraft(s),sourceChanged=(d,s)=>d.sourceId!==s.sourceId||d.sourceRevision!==s.revision;textValue=value=>value==null?"":typeof value=="string"?value:stringifyJson(value,{style:"compact"});limitKeys=["maxRows","maxStringChars","maxDepth","maxArrayItems","targetTokens"]}});var rich_html_exports={};__export(rich_html_exports,{loadMarkdownHtmlEngine:()=>loadMarkdownHtmlEngine,markdownPlainText:()=>markdownPlainText,richHtmlEngine:()=>richHtmlEngine});async function loadMarkdownHtmlEngine(){let g=globalThis;return g[ENGINE]??=import("@ai-matrx/print/markdown-html").then(m=>m.createMarkdownHtmlEngine()),g[ENGINE]}function parseOptions(options,signal){return{signal,...options.onNotice?{onNotice:options.onNotice}:{},...options.assets?{assets:options.assets}:{}}}async function markdownPlainText(markdown,options,signal){let engine=await loadMarkdownHtmlEngine();return engine.plainText(await engine.parse(markdown,parseOptions(options,signal)))}var ENGINE,richHtmlEngine,init_rich_html=__esm({"src/operate/formats/rich-html.ts"(){"use strict";init_core();ENGINE=Symbol.for("ai-matrx.alchemy.operate.markdown-html-engine");richHtmlEngine={async build(draft,options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");if(draft.payload.kind!=="markdown")throw new ContentTransferError("unsupported-format","Formatted copy needs Markdown content. Copy it as plain text instead.");let engine=await loadMarkdownHtmlEngine(),tree=await engine.parse(draft.payload.text,parseOptions(options,signal));if(signal.aborted)throw new DOMException("Cancelled","AbortError");let html=engine.fragment(tree,{skin:options.skin??"inline",profile:options.profile??"generic"});return sealTransferArtifact({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"rich-html",plainText:engine.plainText(tree),html,file:{filename:options.filename??"export.html",mime:"text/html;charset=utf-8",bytes:new TextEncoder().encode(html)},omissions:draft.omissions.map(o=>({...o}))})}}}});var document_exports={};__export(document_exports,{documentEngine:()=>documentEngine,documentHtmlEngine:()=>documentHtmlEngine});function markdownOf(draft){let p=draft.payload;if(p.kind==="markdown")return p.text;if(p.kind==="text")return p.language?fencedCodeBlock(p.text,p.language):p.text;throw new ContentTransferError("unsupported-format","A document needs text or Markdown content. Download it as JSON or CSV instead.")}function documentEngine(format){return{async build(draft,options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");let source=markdownOf(draft),{exportDocument}=await import("@ai-matrx/print/document"),name=stem(options.filename),out=await exportDocument(source,format,{...name?{fileName:name}:{},...options.onNotice?{onNotice:n=>options.onNotice?.({code:n.code,sentence:n.message,remedy:n.remedy})}:{}});if(signal.aborted)throw new DOMException("Cancelled","AbortError");return sealTransferArtifact({snapshotId:draft.snapshotId,draftRevision:draft.revision,format,plainText:source,file:{filename:out.fileName,mime:out.mime,bytes:out.bytes},omissions:draft.omissions.map(o=>({...o}))})}}}var enc2,stem,documentHtmlEngine,init_document=__esm({"src/operate/formats/document.ts"(){"use strict";init_core();init_fenced_code();init_rich_html();enc2=new TextEncoder;stem=filename=>filename?filename.replace(/\.[a-z0-9]+$/i,""):void 0,documentHtmlEngine={async build(draft,options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");let engine=await loadMarkdownHtmlEngine(),tree=await engine.parse(markdownOf(draft),{signal,...options.onNotice?{onNotice:options.onNotice}:{},...options.assets?{assets:options.assets}:{}}),page=engine.document(tree);return sealTransferArtifact({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"html",plainText:engine.plainText(tree),html:page,file:{filename:options.filename??"export.html",mime:"text/html;charset=utf-8",bytes:enc2.encode(page)},omissions:draft.omissions.map(o=>({...o}))})}}}});init_core();init_core();init_fenced_code();var enc3=new TextEncoder,isRows=p=>p.kind==="rows",isProse=p=>p.kind==="markdown"||p.kind==="text",always=()=>!0,LANGUAGE_EXTENSION={typescript:"ts",ts:"ts",tsx:"tsx",javascript:"js",js:"js",jsx:"jsx",python:"py",py:"py",json:"json",html:"html",css:"css",sql:"sql",bash:"sh",sh:"sh",shell:"sh",zsh:"sh",yaml:"yaml",yml:"yaml",markdown:"md",md:"md",go:"go",rust:"rs",java:"java",ruby:"rb",php:"php",csharp:"cs",cs:"cs",cpp:"cpp",c:"c",swift:"swift",kotlin:"kt",xml:"xml",toml:"toml"};function extensionForLanguage(language){return language&&LANGUAGE_EXTENSION[language.trim().toLowerCase()]||"txt"}function checkSignal(signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError")}function textArtifact(draft,format,text,mime,filename,html){return sealTransferArtifact({snapshotId:draft.snapshotId,draftRevision:draft.revision,format,plainText:text,...html===void 0?{}:{html},file:{filename,mime,bytes:enc3.encode(html??text)},omissions:draft.omissions.map(o=>({...o}))})}function serialized(format,extension){return{async build(draft,options,signal){return checkSignal(signal),serialize(draft,format,{filename:options.filename??`export.${extension}`,...options.spreadsheetSafe===void 0?{spreadsheetSafe:format==="csv"||format==="tsv"}:{spreadsheetSafe:options.spreadsheetSafe}})}}}var plainEngine={async build(draft,options,signal){if(checkSignal(signal),draft.payload.kind==="markdown"){let{markdownPlainText:markdownPlainText2}=await Promise.resolve().then(()=>(init_rich_html(),rich_html_exports)),text=await markdownPlainText2(draft.payload.text,options,signal);return textArtifact(draft,"plain",text,"text/plain;charset=utf-8",options.filename??"export.txt")}let ext=draft.payload.kind==="text"?extensionForLanguage(draft.payload.language):"txt";return serialize(draft,"plain",{filename:options.filename??`export.${ext}`})}},markdownEngine={async build(draft,options,signal){checkSignal(signal);let p=draft.payload;if(p.kind==="text"&&p.language){let text=fencedCodeBlock(p.text,p.language);return textArtifact(draft,"markdown",text,"text/markdown;charset=utf-8",options.filename??"export.md")}return serialize(draft,"markdown",{filename:options.filename??"export.md"})}},htmlEngine={async build(draft,options,signal){if(checkSignal(signal),isProse(draft.payload)){let{documentHtmlEngine:documentHtmlEngine2}=await Promise.resolve().then(()=>(init_document(),document_exports));return documentHtmlEngine2.build(draft,options,signal)}return serialize(draft,"html",{filename:options.filename??"export.html"})}},lazy=pick=>pick,FORMAT_ADAPTERS=Object.freeze([{id:"plain",label:"Plain text",extension:"txt",mime:"text/plain;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:always,load:async()=>plainEngine},{id:"markdown",label:"Markdown",extension:"md",mime:"text/markdown;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:p=>p.kind!=="json"&&p.kind!=="registered",load:async()=>markdownEngine},{id:"rich-html",label:"Copy formatted",extension:"html",mime:"text/html;charset=utf-8",modes:["copy"],runsOn:"client",supports:p=>p.kind==="markdown",load:lazy(async()=>(await Promise.resolve().then(()=>(init_rich_html(),rich_html_exports))).richHtmlEngine)},{id:"html",label:"HTML page",extension:"html",mime:"text/html;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:p=>p.kind!=="registered",load:async()=>htmlEngine},{id:"json",label:"JSON",extension:"json",mime:"application/json;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:p=>p.kind!=="registered",load:async()=>serialized("json","json")},{id:"compact-json",label:"Compact JSON",extension:"json",mime:"application/json;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:p=>p.kind!=="registered",load:async()=>serialized("compact-json","json")},{id:"csv",label:"CSV",extension:"csv",mime:"text/csv;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:isRows,load:async()=>serialized("csv","csv")},{id:"tsv",label:"Google Sheets",extension:"tsv",mime:"text/tab-separated-values;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:isRows,load:async()=>serialized("tsv","tsv")},{id:"xlsx",label:"Excel workbook",extension:"xlsx",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",modes:["download"],runsOn:"client",supports:isRows,load:lazy(async()=>(await import("@ai-matrx/alchemy/operate/formats/xlsx")).xlsxEngine)},{id:"pdf",label:"PDF",extension:"pdf",mime:"application/pdf",modes:["download"],runsOn:"client",supports:isProse,load:lazy(async()=>(await Promise.resolve().then(()=>(init_document(),document_exports))).documentEngine("pdf"))},{id:"docx",label:"Word document",extension:"docx",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",modes:["download"],runsOn:"client",supports:isProse,load:lazy(async()=>(await Promise.resolve().then(()=>(init_document(),document_exports))).documentEngine("docx"))},{id:"epub",label:"EPUB book",extension:"epub",mime:"application/epub+zip",modes:["download"],runsOn:"client",supports:isProse,load:lazy(async()=>(await Promise.resolve().then(()=>(init_document(),document_exports))).documentEngine("epub"))}]);function eligibleFormats(payload,registered=[],mode){return resolveTransferRegistry(FORMAT_ADAPTERS,registered).filter(f=>f.supports(payload)&&(mode===void 0||f.modes.includes(mode)))}function formatAdapter(id,registered=[]){let found=resolveTransferRegistry(FORMAT_ADAPTERS,registered).find(f=>f.id===id);if(!found)throw new ContentTransferError("unsupported-format",`There is no "${id}" format. Choose one of the formats offered for this content.`);return found}init_core();var SEALED=Symbol.for("ai-matrx.alchemy.operate.sealed-artifacts");function sealedSet(){let g=globalThis;return g[SEALED]??=new WeakSet,g[SEALED]}function sealArtifact(artifact){let frozen=sealTransferArtifact(artifact);return sealedSet().add(frozen),frozen}function isSealed(artifact){return typeof artifact=="object"&&artifact!==null&&sealedSet().has(artifact)}var notSealed={status:"error",code:"not-sealed",message:"This content was not prepared for delivery, so nothing was copied or saved. Prepare it again and retry.",retryable:!0},optionsKey=o=>JSON.stringify({f:o.filename??null,s:o.spreadsheetSafe??null,k:o.skin??null,p:o.profile??null,h:o.highlightCode??!1});async function openPreparation(source,scope,signal,options={}){let{snapshot}=await capture(source,signal,scope),draft=createDraft(snapshot),transforms=new Map;for(let t of options.transforms??[]){if(transforms.has(t.id))throw new ContentTransferError("duplicate-registration",`Transform "${t.id}" is registered more than once`);transforms.set(t.id,t)}let cache=new Map;return{get snapshot(){return snapshot},get draft(){return draft},async transform(id,transformOptions,transformSignal){let t=transforms.get(id);if(!t)throw new ContentTransferError("unsupported-transform",`There is no "${id}" preparation step here.`);return draft=await t.apply(draft,transformOptions,transformSignal),draft},edit(payload){return draft=editDraft(draft,payload),draft},selectSections(ids){return draft=applySectionSelection(draft,snapshot,ids),draft},undo(){return draft=undoDraft(draft),draft},seal(format,formatOptions,sealSignal){let adapter=formatAdapter(format,options.formats);if(!adapter.supports(draft.payload))return Promise.reject(new ContentTransferError("unsupported-format",`${adapter.label} is not available for this content.`));let key=`${draft.revision}\0${format}\0${optionsKey(formatOptions)}`,hit=cache.get(key);if(hit)return hit;let at2=draft,built=adapter.load().then(engine=>engine.build(at2,formatOptions,sealSignal)).then(sealArtifact);return built.catch(()=>cache.delete(key)),cache.set(key,built),built}}}async function sealDraft(draft,format,options,signal,formats){let adapter=formatAdapter(format,formats);if(!adapter.supports(draft.payload))throw new ContentTransferError("unsupported-format",`${adapter.label} is not available for this content.`);return sealArtifact(await(await adapter.load()).build(draft,options,signal))}function narrow(outcome){return outcome.status==="success"&&outcome.delivered==="action"?{status:"success",delivered:"clipboard",mimeTypes:outcome.mimeTypes}:outcome.status==="queued"?{status:"error",code:"unexpected-queued",message:outcome.message,retryable:!1}:outcome}function createDelivery(ports={}){let transport=ports.transport??createBrowserTransport();return{async copy(artifact,signal){return isSealed(artifact)?narrow(await transport.copy(artifact,signal)):notSealed},copyPending(pending,signal,options={}){let clipboard=globalThis.navigator?.clipboard,Item=globalThis.ClipboardItem,checked=pending.then(a=>{if(!isSealed(a))throw new ContentTransferError("not-sealed",notSealed.status==="error"?notSealed.message:"");return a});if(clipboard?.write&&typeof Item=="function"){let entries={"text/plain":checked.then(a=>new Blob([a.plainText],{type:"text/plain"}))};options.html&&(entries["text/html"]=checked.then(a=>new Blob([a.html??a.plainText],{type:"text/html"})));let item=null;try{item=new Item(entries)}catch{item=null}if(item)return clipboard.write([item]).then(async()=>signal.aborted?{status:"cancelled"}:{status:"success",delivered:"clipboard",mimeTypes:options.html?["text/plain","text/html"]:["text/plain"]},async()=>{try{let a=await checked;return narrow(await transport.copy(a,signal))}catch(error){return error instanceof ContentTransferError&&error.code==="not-sealed"?notSealed:{status:"error",code:"clipboard-rejected",message:"The clipboard refused the copy. Try again.",retryable:!0}}})}return checked.then(async a=>narrow(await transport.copy(a,signal)),()=>notSealed)},async download(artifact,signal){return isSealed(artifact)?narrow(await transport.download(artifact,signal)):notSealed},async send(artifact,to,via){return isSealed(artifact)?ports.door?ports.door.apply({to,value:artifact.file?artifact.file.bytes:artifact.plainText,origin:"user",via}):{status:"refused",to,reason:"unapplicable",sentence:"Sending to a destination is not available here yet, so nothing was sent.",remedy:"Copy or download it instead, then paste it where it belongs."}:{status:"refused",to,reason:"failed",sentence:notSealed.status==="error"?notSealed.message:"",remedy:"Prepare the content again, then send it."}}}}export{ContentTransferError,FORMAT_ADAPTERS,applySectionSelection,applyTransferLimits,buildAgentPayload,capture,collectAllMatching,createBrowserTransport,createDelivery,createDraft,createSurfaceTransferHandle,directSource,editDraft,eligibleFormats,extensionForLanguage,fenceJsonBlock,formatAdapter,isSealed,normalizeTransferJson,openPreparation,projectSnapshot,readTransferCell,reduceJson,refreshDraft,resetDraft,resolveTransferPreferences,resolveTransferRegistry,sealArtifact,sealDraft,sealTransferArtifact,serialize,sourceChanged,transformRows,undoDraft};
1711
18
  //# sourceMappingURL=operate.js.map