@ai-matrx/alchemy 0.8.25 → 0.8.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/core.cjs +5 -3
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +81 -1
- package/dist/core.d.ts +81 -1
- package/dist/core.js +5 -3
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +5 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +81 -1
- package/dist/index.d.ts +81 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/operate-document.cjs.map +1 -1
- package/dist/operate-document.d.cts +2 -0
- package/dist/operate-document.d.ts +2 -0
- package/dist/operate-document.js.map +1 -1
- package/dist/operate-rich-html.cjs.map +1 -1
- package/dist/operate-rich-html.d.cts +2 -0
- package/dist/operate-rich-html.d.ts +2 -0
- package/dist/operate-rich-html.js.map +1 -1
- package/dist/operate-server.cjs.map +1 -1
- package/dist/operate-server.d.cts +2 -0
- package/dist/operate-server.d.ts +2 -0
- package/dist/operate-server.js.map +1 -1
- package/dist/operate-xlsx.cjs.map +1 -1
- package/dist/operate-xlsx.d.cts +2 -0
- package/dist/operate-xlsx.d.ts +2 -0
- package/dist/operate-xlsx.js.map +1 -1
- package/dist/operate.cjs +5 -3
- package/dist/operate.cjs.map +1 -1
- package/dist/operate.d.cts +81 -1
- package/dist/operate.d.ts +81 -1
- package/dist/operate.js +5 -3
- package/dist/operate.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -70,6 +70,8 @@ type Omission = {
|
|
|
70
70
|
path: string;
|
|
71
71
|
reason: "excluded" | "filtered" | "truncated" | "unsupported" | "escaped" | "duplicate";
|
|
72
72
|
count?: number;
|
|
73
|
+
/** What a person reads for this omission (a section's name, a dotted path, a stub's size). */
|
|
74
|
+
label?: string;
|
|
73
75
|
};
|
|
74
76
|
type RawSnapshot = {
|
|
75
77
|
id: string;
|
|
@@ -349,6 +351,12 @@ declare function capture(source: Source | Payload, signal: AbortSignal, scope?:
|
|
|
349
351
|
}>;
|
|
350
352
|
declare function createDraft(s: Snapshot): Draft;
|
|
351
353
|
declare const editDraft: (d: Draft, p: Payload) => Draft;
|
|
354
|
+
/**
|
|
355
|
+
* A deterministic revision of `d` (the structure trees, PP-06/07): same snapshot, next revision,
|
|
356
|
+
* the given omissions added. `baseOmissions` replaces the draft's own when a step re-projects from
|
|
357
|
+
* the snapshot (a section selection), exactly as `applySectionSelection` does.
|
|
358
|
+
*/
|
|
359
|
+
declare const deriveDraft: (d: Draft, p: Payload, o: Omission[], description: string, baseOmissions?: readonly Omission[]) => Draft;
|
|
352
360
|
declare const resetDraft: (s: Snapshot) => Draft;
|
|
353
361
|
declare const sourceChanged: (d: Draft, s: Snapshot) => boolean;
|
|
354
362
|
declare function undoDraft(d: Draft): Draft;
|
|
@@ -1194,6 +1202,78 @@ declare function agentPayloadWithSpans(input: AgentPayloadInput, environment?: A
|
|
|
1194
1202
|
spans: SpanMap;
|
|
1195
1203
|
};
|
|
1196
1204
|
|
|
1205
|
+
type NodeLimit = {
|
|
1206
|
+
kind: "stub";
|
|
1207
|
+
} | {
|
|
1208
|
+
kind: "maxChars";
|
|
1209
|
+
value: number;
|
|
1210
|
+
} | {
|
|
1211
|
+
kind: "maxItems";
|
|
1212
|
+
value: number;
|
|
1213
|
+
};
|
|
1214
|
+
interface StructureRecipe {
|
|
1215
|
+
exclude: readonly string[];
|
|
1216
|
+
limits: Readonly<Record<string, NodeLimit>>;
|
|
1217
|
+
}
|
|
1218
|
+
declare const EMPTY_STRUCTURE: StructureRecipe;
|
|
1219
|
+
/** "" → []; "/a/b~1c" → ["a", "b/c"]. */
|
|
1220
|
+
declare function pointerSegments(pointer: string): string[];
|
|
1221
|
+
declare function joinPointer(segments: readonly string[]): string;
|
|
1222
|
+
/** A pattern names this exact node (`*` matches any one segment). */
|
|
1223
|
+
declare function patternMatches(pattern: string, pointer: string): boolean;
|
|
1224
|
+
/** A pattern names this node or one of its ancestors. */
|
|
1225
|
+
declare function patternCovers(pattern: string, pointer: string): boolean;
|
|
1226
|
+
/** A pattern names a strict descendant of this node (for a parent's mixed state). */
|
|
1227
|
+
declare function patternBelow(pattern: string, pointer: string): boolean;
|
|
1228
|
+
/** The path a person reads and copies: `/messages/*\/metadata` → `data.messages[*].metadata`. */
|
|
1229
|
+
declare function displayPath(pointer: string, root?: string): string;
|
|
1230
|
+
/** Exactly `JSON.stringify(value).length`, computed once per object (large sources stay cheap). */
|
|
1231
|
+
declare function jsonSize(value: Json$1): number;
|
|
1232
|
+
/** The size a person expects for a node: a string's own length, else its JSON. */
|
|
1233
|
+
declare function nodeChars(value: Json$1): number;
|
|
1234
|
+
/**
|
|
1235
|
+
* The one-line stub that stands in for a node: its header (a string's first line, an object's
|
|
1236
|
+
* short scalar members) and its original size.
|
|
1237
|
+
*/
|
|
1238
|
+
declare function stubText(value: Json$1): string;
|
|
1239
|
+
/** Every concrete pointer in `value` a pattern names (for counts, diffs and highlights). */
|
|
1240
|
+
declare function concretePointers(value: Json$1, pattern: string): string[];
|
|
1241
|
+
/** Apply exclusions and per-node limits to a JSON value; returns the new value and what changed. */
|
|
1242
|
+
declare function applyStructureToJson(value: Json$1, recipe: StructureRecipe, labels?: Readonly<Record<string, string>>): {
|
|
1243
|
+
value: Json$1;
|
|
1244
|
+
omissions: Omission[];
|
|
1245
|
+
};
|
|
1246
|
+
/** A JSON (or registered) draft with the person's structure choices applied. */
|
|
1247
|
+
declare function applyJsonStructure(draft: Draft, recipe: StructureRecipe, labels?: Readonly<Record<string, string>>): Draft;
|
|
1248
|
+
/**
|
|
1249
|
+
* Where an ORIGINAL node sits in the output value after `recipe` (array items shift when an
|
|
1250
|
+
* earlier sibling is excluded). Null when the node is excluded or cut; a stubbed ancestor answers
|
|
1251
|
+
* with the stub's own pointer.
|
|
1252
|
+
*/
|
|
1253
|
+
declare function outputPointer(value: Json$1, recipe: StructureRecipe, pointer: string): string | null;
|
|
1254
|
+
declare function isProseSection(section: Section): boolean;
|
|
1255
|
+
interface SectionLayout {
|
|
1256
|
+
text: string;
|
|
1257
|
+
omissions: Omission[];
|
|
1258
|
+
/** Where each kept section landed in `text` (a stub's own line for a stubbed one). */
|
|
1259
|
+
ranges: Record<string, {
|
|
1260
|
+
start: number;
|
|
1261
|
+
end: number;
|
|
1262
|
+
}>;
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* The text a prose source becomes with only `included` sections, each at its limit. Excluded
|
|
1266
|
+
* ranges are cut exactly as `applySectionSelection` cuts them; a stub keeps the range's trailing
|
|
1267
|
+
* line break so the next section still starts on its own line.
|
|
1268
|
+
*/
|
|
1269
|
+
declare function sectionLayout(text: string, sections: readonly Section[], included: readonly string[], limits?: Readonly<Record<string, NodeLimit>>): SectionLayout;
|
|
1270
|
+
/**
|
|
1271
|
+
* A draft with the person's section choices applied, projected from the draft's own payload (call
|
|
1272
|
+
* it on a fresh draft of the snapshot, as `applySectionSelection` projects from the snapshot).
|
|
1273
|
+
* Prose payloads use `sectionLayout`; JSON payloads exclude and limit each section's pointer.
|
|
1274
|
+
*/
|
|
1275
|
+
declare function applySectionStructure(draft: Draft, sections: readonly Section[], included: readonly string[], limits?: Readonly<Record<string, NodeLimit>>): Draft;
|
|
1276
|
+
|
|
1197
1277
|
/**
|
|
1198
1278
|
* Default preparation recipes (Preparation parity PP-13a): which recipe a preparation workspace
|
|
1199
1279
|
* opens with for one source kind, layered exactly like every setting on the platform —
|
|
@@ -1241,4 +1321,4 @@ declare function setPersonDefaultRecipe(ports: Pick<AlchemyHostPorts, "persisten
|
|
|
1241
1321
|
[key: string]: Json;
|
|
1242
1322
|
} | null): Promise<void>;
|
|
1243
1323
|
|
|
1244
|
-
export { type AgentPayloadEnvironment, type AgentPayloadInput, type AiPreparation, type Artifact, type BoundAllMatching, type BuiltInFormatId, type CapturedAllMatching, type CapturedSource, type Column, ContentTransferError, type Coverage, type Delivery, type DeliveryOutcome, type Draft, type ExportPage, type ExportProjection, FORMAT_ADAPTERS, type FormatAdapter, type FormatEngine, type FormatOptions, type Json$1 as Json, type NormalizeTransferJsonOptions, type Notice, type Omission, type OutputSpan, type PageAction, type Payload, type PreparationOptions, type PreparationSession, type QuerySnapshot, type RawSnapshot, type Receipt, type RecipeOrigin, type ResolvedRecipe, type SealedArtifact, type Section, type ServerOperation, type Snapshot, type Source, type SpanMap, type SurfaceHandle, TRANSFER_DEFAULT_RECIPE_SETTING, type TransferLimits, type TransferOperation, type TransferOutcome, type TransferPreferenceOverrides, type TransferPreferences, type TransferScope, type TransferSurfaceDeclaration, type TransferTarget, type Transform, type Transport, type WriteTargetRef, agentPayloadWithSpans, applySectionSelection, applyTransferLimits, assembleAgentPayload, buildAgentPayload, capture, collectAllMatching, createBrowserTransport, createDelivery, createDraft, createSurfaceTransferHandle, directSource, editDraft, eligibleFormats, exportedColumns, extensionForLanguage, fenceJsonBlock, formatAdapter, isSealed, jsonTextSpans, normalizeTransferJson, offsetSpans, openPreparation, projectSnapshot, readTransferCell, recipeKey, reduceJson, refreshDraft, resetDraft, resolveDefaultRecipe, resolveTransferPreferences, resolveTransferRegistry, sealArtifact, sealDraft, sealTransferArtifact, serialize, setPersonDefaultRecipe, sourceChanged, spanMap, transformRows, undoDraft };
|
|
1324
|
+
export { type AgentPayloadEnvironment, type AgentPayloadInput, type AiPreparation, type Artifact, type BoundAllMatching, type BuiltInFormatId, type CapturedAllMatching, type CapturedSource, type Column, ContentTransferError, type Coverage, type Delivery, type DeliveryOutcome, type Draft, EMPTY_STRUCTURE, type ExportPage, type ExportProjection, FORMAT_ADAPTERS, type FormatAdapter, type FormatEngine, type FormatOptions, type Json$1 as Json, type NodeLimit, type NormalizeTransferJsonOptions, type Notice, type Omission, type OutputSpan, type PageAction, type Payload, type PreparationOptions, type PreparationSession, type QuerySnapshot, type RawSnapshot, type Receipt, type RecipeOrigin, type ResolvedRecipe, type SealedArtifact, type Section, type SectionLayout, type ServerOperation, type Snapshot, type Source, type SpanMap, type StructureRecipe, type SurfaceHandle, TRANSFER_DEFAULT_RECIPE_SETTING, type TransferLimits, type TransferOperation, type TransferOutcome, type TransferPreferenceOverrides, type TransferPreferences, type TransferScope, type TransferSurfaceDeclaration, type TransferTarget, type Transform, type Transport, type WriteTargetRef, agentPayloadWithSpans, applyJsonStructure, applySectionSelection, applySectionStructure, applyStructureToJson, applyTransferLimits, assembleAgentPayload, buildAgentPayload, capture, collectAllMatching, concretePointers, createBrowserTransport, createDelivery, createDraft, createSurfaceTransferHandle, deriveDraft, directSource, displayPath, editDraft, eligibleFormats, exportedColumns, extensionForLanguage, fenceJsonBlock, formatAdapter, isProseSection, isSealed, joinPointer, jsonSize, jsonTextSpans, nodeChars, normalizeTransferJson, offsetSpans, openPreparation, outputPointer, patternBelow, patternCovers, patternMatches, pointerSegments, projectSnapshot, readTransferCell, recipeKey, reduceJson, refreshDraft, resetDraft, resolveDefaultRecipe, resolveTransferPreferences, resolveTransferRegistry, sealArtifact, sealDraft, sealTransferArtifact, sectionLayout, serialize, setPersonDefaultRecipe, sourceChanged, spanMap, stubText, transformRows, undoDraft };
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,8 @@ type Omission = {
|
|
|
70
70
|
path: string;
|
|
71
71
|
reason: "excluded" | "filtered" | "truncated" | "unsupported" | "escaped" | "duplicate";
|
|
72
72
|
count?: number;
|
|
73
|
+
/** What a person reads for this omission (a section's name, a dotted path, a stub's size). */
|
|
74
|
+
label?: string;
|
|
73
75
|
};
|
|
74
76
|
type RawSnapshot = {
|
|
75
77
|
id: string;
|
|
@@ -349,6 +351,12 @@ declare function capture(source: Source | Payload, signal: AbortSignal, scope?:
|
|
|
349
351
|
}>;
|
|
350
352
|
declare function createDraft(s: Snapshot): Draft;
|
|
351
353
|
declare const editDraft: (d: Draft, p: Payload) => Draft;
|
|
354
|
+
/**
|
|
355
|
+
* A deterministic revision of `d` (the structure trees, PP-06/07): same snapshot, next revision,
|
|
356
|
+
* the given omissions added. `baseOmissions` replaces the draft's own when a step re-projects from
|
|
357
|
+
* the snapshot (a section selection), exactly as `applySectionSelection` does.
|
|
358
|
+
*/
|
|
359
|
+
declare const deriveDraft: (d: Draft, p: Payload, o: Omission[], description: string, baseOmissions?: readonly Omission[]) => Draft;
|
|
352
360
|
declare const resetDraft: (s: Snapshot) => Draft;
|
|
353
361
|
declare const sourceChanged: (d: Draft, s: Snapshot) => boolean;
|
|
354
362
|
declare function undoDraft(d: Draft): Draft;
|
|
@@ -1194,6 +1202,78 @@ declare function agentPayloadWithSpans(input: AgentPayloadInput, environment?: A
|
|
|
1194
1202
|
spans: SpanMap;
|
|
1195
1203
|
};
|
|
1196
1204
|
|
|
1205
|
+
type NodeLimit = {
|
|
1206
|
+
kind: "stub";
|
|
1207
|
+
} | {
|
|
1208
|
+
kind: "maxChars";
|
|
1209
|
+
value: number;
|
|
1210
|
+
} | {
|
|
1211
|
+
kind: "maxItems";
|
|
1212
|
+
value: number;
|
|
1213
|
+
};
|
|
1214
|
+
interface StructureRecipe {
|
|
1215
|
+
exclude: readonly string[];
|
|
1216
|
+
limits: Readonly<Record<string, NodeLimit>>;
|
|
1217
|
+
}
|
|
1218
|
+
declare const EMPTY_STRUCTURE: StructureRecipe;
|
|
1219
|
+
/** "" → []; "/a/b~1c" → ["a", "b/c"]. */
|
|
1220
|
+
declare function pointerSegments(pointer: string): string[];
|
|
1221
|
+
declare function joinPointer(segments: readonly string[]): string;
|
|
1222
|
+
/** A pattern names this exact node (`*` matches any one segment). */
|
|
1223
|
+
declare function patternMatches(pattern: string, pointer: string): boolean;
|
|
1224
|
+
/** A pattern names this node or one of its ancestors. */
|
|
1225
|
+
declare function patternCovers(pattern: string, pointer: string): boolean;
|
|
1226
|
+
/** A pattern names a strict descendant of this node (for a parent's mixed state). */
|
|
1227
|
+
declare function patternBelow(pattern: string, pointer: string): boolean;
|
|
1228
|
+
/** The path a person reads and copies: `/messages/*\/metadata` → `data.messages[*].metadata`. */
|
|
1229
|
+
declare function displayPath(pointer: string, root?: string): string;
|
|
1230
|
+
/** Exactly `JSON.stringify(value).length`, computed once per object (large sources stay cheap). */
|
|
1231
|
+
declare function jsonSize(value: Json$1): number;
|
|
1232
|
+
/** The size a person expects for a node: a string's own length, else its JSON. */
|
|
1233
|
+
declare function nodeChars(value: Json$1): number;
|
|
1234
|
+
/**
|
|
1235
|
+
* The one-line stub that stands in for a node: its header (a string's first line, an object's
|
|
1236
|
+
* short scalar members) and its original size.
|
|
1237
|
+
*/
|
|
1238
|
+
declare function stubText(value: Json$1): string;
|
|
1239
|
+
/** Every concrete pointer in `value` a pattern names (for counts, diffs and highlights). */
|
|
1240
|
+
declare function concretePointers(value: Json$1, pattern: string): string[];
|
|
1241
|
+
/** Apply exclusions and per-node limits to a JSON value; returns the new value and what changed. */
|
|
1242
|
+
declare function applyStructureToJson(value: Json$1, recipe: StructureRecipe, labels?: Readonly<Record<string, string>>): {
|
|
1243
|
+
value: Json$1;
|
|
1244
|
+
omissions: Omission[];
|
|
1245
|
+
};
|
|
1246
|
+
/** A JSON (or registered) draft with the person's structure choices applied. */
|
|
1247
|
+
declare function applyJsonStructure(draft: Draft, recipe: StructureRecipe, labels?: Readonly<Record<string, string>>): Draft;
|
|
1248
|
+
/**
|
|
1249
|
+
* Where an ORIGINAL node sits in the output value after `recipe` (array items shift when an
|
|
1250
|
+
* earlier sibling is excluded). Null when the node is excluded or cut; a stubbed ancestor answers
|
|
1251
|
+
* with the stub's own pointer.
|
|
1252
|
+
*/
|
|
1253
|
+
declare function outputPointer(value: Json$1, recipe: StructureRecipe, pointer: string): string | null;
|
|
1254
|
+
declare function isProseSection(section: Section): boolean;
|
|
1255
|
+
interface SectionLayout {
|
|
1256
|
+
text: string;
|
|
1257
|
+
omissions: Omission[];
|
|
1258
|
+
/** Where each kept section landed in `text` (a stub's own line for a stubbed one). */
|
|
1259
|
+
ranges: Record<string, {
|
|
1260
|
+
start: number;
|
|
1261
|
+
end: number;
|
|
1262
|
+
}>;
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* The text a prose source becomes with only `included` sections, each at its limit. Excluded
|
|
1266
|
+
* ranges are cut exactly as `applySectionSelection` cuts them; a stub keeps the range's trailing
|
|
1267
|
+
* line break so the next section still starts on its own line.
|
|
1268
|
+
*/
|
|
1269
|
+
declare function sectionLayout(text: string, sections: readonly Section[], included: readonly string[], limits?: Readonly<Record<string, NodeLimit>>): SectionLayout;
|
|
1270
|
+
/**
|
|
1271
|
+
* A draft with the person's section choices applied, projected from the draft's own payload (call
|
|
1272
|
+
* it on a fresh draft of the snapshot, as `applySectionSelection` projects from the snapshot).
|
|
1273
|
+
* Prose payloads use `sectionLayout`; JSON payloads exclude and limit each section's pointer.
|
|
1274
|
+
*/
|
|
1275
|
+
declare function applySectionStructure(draft: Draft, sections: readonly Section[], included: readonly string[], limits?: Readonly<Record<string, NodeLimit>>): Draft;
|
|
1276
|
+
|
|
1197
1277
|
/**
|
|
1198
1278
|
* Default preparation recipes (Preparation parity PP-13a): which recipe a preparation workspace
|
|
1199
1279
|
* opens with for one source kind, layered exactly like every setting on the platform —
|
|
@@ -1241,4 +1321,4 @@ declare function setPersonDefaultRecipe(ports: Pick<AlchemyHostPorts, "persisten
|
|
|
1241
1321
|
[key: string]: Json;
|
|
1242
1322
|
} | null): Promise<void>;
|
|
1243
1323
|
|
|
1244
|
-
export { type AgentPayloadEnvironment, type AgentPayloadInput, type AiPreparation, type Artifact, type BoundAllMatching, type BuiltInFormatId, type CapturedAllMatching, type CapturedSource, type Column, ContentTransferError, type Coverage, type Delivery, type DeliveryOutcome, type Draft, type ExportPage, type ExportProjection, FORMAT_ADAPTERS, type FormatAdapter, type FormatEngine, type FormatOptions, type Json$1 as Json, type NormalizeTransferJsonOptions, type Notice, type Omission, type OutputSpan, type PageAction, type Payload, type PreparationOptions, type PreparationSession, type QuerySnapshot, type RawSnapshot, type Receipt, type RecipeOrigin, type ResolvedRecipe, type SealedArtifact, type Section, type ServerOperation, type Snapshot, type Source, type SpanMap, type SurfaceHandle, TRANSFER_DEFAULT_RECIPE_SETTING, type TransferLimits, type TransferOperation, type TransferOutcome, type TransferPreferenceOverrides, type TransferPreferences, type TransferScope, type TransferSurfaceDeclaration, type TransferTarget, type Transform, type Transport, type WriteTargetRef, agentPayloadWithSpans, applySectionSelection, applyTransferLimits, assembleAgentPayload, buildAgentPayload, capture, collectAllMatching, createBrowserTransport, createDelivery, createDraft, createSurfaceTransferHandle, directSource, editDraft, eligibleFormats, exportedColumns, extensionForLanguage, fenceJsonBlock, formatAdapter, isSealed, jsonTextSpans, normalizeTransferJson, offsetSpans, openPreparation, projectSnapshot, readTransferCell, recipeKey, reduceJson, refreshDraft, resetDraft, resolveDefaultRecipe, resolveTransferPreferences, resolveTransferRegistry, sealArtifact, sealDraft, sealTransferArtifact, serialize, setPersonDefaultRecipe, sourceChanged, spanMap, transformRows, undoDraft };
|
|
1324
|
+
export { type AgentPayloadEnvironment, type AgentPayloadInput, type AiPreparation, type Artifact, type BoundAllMatching, type BuiltInFormatId, type CapturedAllMatching, type CapturedSource, type Column, ContentTransferError, type Coverage, type Delivery, type DeliveryOutcome, type Draft, EMPTY_STRUCTURE, type ExportPage, type ExportProjection, FORMAT_ADAPTERS, type FormatAdapter, type FormatEngine, type FormatOptions, type Json$1 as Json, type NodeLimit, type NormalizeTransferJsonOptions, type Notice, type Omission, type OutputSpan, type PageAction, type Payload, type PreparationOptions, type PreparationSession, type QuerySnapshot, type RawSnapshot, type Receipt, type RecipeOrigin, type ResolvedRecipe, type SealedArtifact, type Section, type SectionLayout, type ServerOperation, type Snapshot, type Source, type SpanMap, type StructureRecipe, type SurfaceHandle, TRANSFER_DEFAULT_RECIPE_SETTING, type TransferLimits, type TransferOperation, type TransferOutcome, type TransferPreferenceOverrides, type TransferPreferences, type TransferScope, type TransferSurfaceDeclaration, type TransferTarget, type Transform, type Transport, type WriteTargetRef, agentPayloadWithSpans, applyJsonStructure, applySectionSelection, applySectionStructure, applyStructureToJson, applyTransferLimits, assembleAgentPayload, buildAgentPayload, capture, collectAllMatching, concretePointers, createBrowserTransport, createDelivery, createDraft, createSurfaceTransferHandle, deriveDraft, directSource, displayPath, editDraft, eligibleFormats, exportedColumns, extensionForLanguage, fenceJsonBlock, formatAdapter, isProseSection, isSealed, joinPointer, jsonSize, jsonTextSpans, nodeChars, normalizeTransferJson, offsetSpans, openPreparation, outputPointer, patternBelow, patternCovers, patternMatches, pointerSegments, projectSnapshot, readTransferCell, recipeKey, reduceJson, refreshDraft, resetDraft, resolveDefaultRecipe, resolveTransferPreferences, resolveTransferRegistry, sealArtifact, sealDraft, sealTransferArtifact, sectionLayout, serialize, setPersonDefaultRecipe, sourceChanged, spanMap, stubText, transformRows, undoDraft };
|
package/dist/index.js
CHANGED
|
@@ -18,11 +18,13 @@ ${summary}<data format="${dataFormat}">
|
|
|
18
18
|
</data>
|
|
19
19
|
</${kind}>`,body,bodyOffset:head.length+fenced.indexOf(`
|
|
20
20
|
`)+1}}var escapeXml,xmlName,presentEntries,init_agent_payload=__esm({"src/operate/agent-payload.ts"(){"use strict";init_fenced_code();escapeXml=value=>value.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),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 exportedColumns(columns){return columns.filter(c=>c.visible&&c.exportable!==!1&&c.classification!=="secret"&&c.classification!=="credential")}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=exportedColumns(payload.columns);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(`
|
|
21
|
-
`),mime="text/markdown;charset=utf-8",extension="md"}else{let delimiter=format==="csv"?",":" ",safe=options.spreadsheetSafe??format==="tsv",
|
|
22
|
-
`),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",initialEnvelope:menu.initialEnvelope??provider.initialEnvelope??"ai",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."}}}}init_agent_payload();init_core();init_fenced_code();var pointerSegment=x=>x.replace(/~/g,"~0").replace(/\//g,"~1");function spanError(message){return new ContentTransferError("unsupported-format",message)}function jsonTextSpans(text,basePath="",offset=0){let spans=[],i=0,fail=what=>{throw spanError(`The sealed text is not JSON at character ${i}: ${what}.`)},ws=()=>{for(;i<text.length&&(text[i]===" "||text[i]===`
|
|
21
|
+
`),mime="text/markdown;charset=utf-8",extension="md"}else{let delimiter=format==="csv"?",":" ",safe=options.spreadsheetSafe??format==="tsv",encode2=(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=>encode2(c.label,`/columns/${enc(c.id)}`)).join(delimiter),...payload.rows.map((row,index)=>columns.map(c=>encode2(columnCell(row,c),`/rows/${index}${c.path}`,typeof readTransferCell(row,c)=="string")).join(delimiter))].join(`
|
|
22
|
+
`),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",initialEnvelope:menu.initialEnvelope??provider.initialEnvelope??"ai",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,deriveDraft,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"),deriveDraft=(d,p,o,description,baseOmissions=d.omissions)=>revise(d,p,o,description,d.manuallyEdited,"deterministic",baseOmissions),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:n2=>options.onNotice?.({code:n2.code,sentence:n2.message,remedy:n2.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."}}}}init_agent_payload();init_core();init_fenced_code();var pointerSegment=x=>x.replace(/~/g,"~0").replace(/\//g,"~1");function spanError(message){return new ContentTransferError("unsupported-format",message)}function jsonTextSpans(text,basePath="",offset=0){let spans=[],i=0,fail=what=>{throw spanError(`The sealed text is not JSON at character ${i}: ${what}.`)},ws=()=>{for(;i<text.length&&(text[i]===" "||text[i]===`
|
|
23
23
|
`||text[i]==="\r"||text[i]===" ");)i++},readString=()=>{text[i]!=='"'&&fail("expected a string");let start=i;for(i++;i<text.length&&text[i]!=='"';)i+=text[i]==="\\"?2:1;return i>=text.length&&fail("unterminated string"),i++,JSON.parse(text.slice(start,i))},value=path=>{ws();let start=i,slot=spans.length;spans.push({path,start:offset+start,end:offset+start});let ch=text[i];if(ch==="{")if(i++,ws(),text[i]==="}")i++;else for(;;){ws();let key=readString();if(ws(),text[i]!==":"&&fail("expected ':'"),i++,value(`${path}/${pointerSegment(key)}`),ws(),text[i]===","){i++;continue}if(text[i]==="}"){i++;break}fail("expected ',' or '}'")}else if(ch==="[")if(i++,ws(),text[i]==="]")i++;else for(let index=0;;index++){if(value(`${path}/${index}`),ws(),text[i]===","){i++;continue}if(text[i]==="]"){i++;break}fail("expected ',' or ']'")}else if(ch==='"')readString();else{let m=/^(?:-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?|true|false|null)/.exec(text.slice(i,i+400));m||fail("expected a value"),i+=m[0].length}spans[slot].end=offset+i};return value(basePath),ws(),i!==text.length&&fail("text after the value"),spans}function delimitedSpans(text,delimiter,columns,rowCount){let spans=[],i=0,readLine=(paths,linePath)=>{let lineStart=i,lineSlot=spans.length;linePath!==null&&spans.push({path:linePath,start:lineStart,end:lineStart}),paths.forEach((path,index)=>{let start=i;if(text[i]==='"')for(i++;;){if(i>=text.length)throw spanError(`An unterminated quoted cell starts at character ${start}.`);if(text[i]==='"'){if(text[i+1]==='"'){i+=2;continue}i++;break}i++}else for(;i<text.length&&text[i]!==delimiter&&text[i]!==`
|
|
24
24
|
`;)i++;spans.push({path,start,end:i});let last=index===paths.length-1,expected=last?`
|
|
25
25
|
`:delimiter;if(!(last&&i===text.length)){if(text[i]!==expected)throw spanError(`Expected ${last?"a line break":"a delimiter"} at character ${i}.`);last||i++}}),linePath!==null&&(spans[lineSlot].end=i),i<text.length&&i++};readLine(columns.map(c=>`/columns/${pointerSegment(c.id)}`),null);for(let row=0;row<rowCount;row++)readLine(columns.map(c=>`/rows/${row}${c.path}`),`/rows/${row}`);if(i<text.length)throw spanError(`Text continues after the last row at character ${i}.`);return spans}function markdownTableSpans(text,columns,rowCount){let spans=[],lines=[],at2=0;for(let line of text.split(`
|
|
26
26
|
`))lines.push({start:at2,end:at2+line.length}),at2+=line.length+1;if(lines.length!==rowCount+2)throw spanError(`A Markdown table of ${rowCount} rows has ${lines.length} lines.`);let cells=(line,paths)=>{let i=line.start;if(text.slice(i,i+2)!=="| ")throw spanError(`A table line must open with "| " at character ${i}.`);if(i+=2,paths.forEach(path=>{let start=i;for(;i<line.end&&text[i]!=="|";)i+=text[i]==="\\"?2:1;if(text[i]!=="|"||text[i-1]!==" ")throw spanError(`A table cell must close with " |" at character ${i}.`);spans.push({path,start,end:i-1}),i+=2}),i-1!==line.end)throw spanError(`A table line has more cells than columns at character ${i}.`)};cells(lines[0],columns.map(c=>`/columns/${pointerSegment(c.id)}`));for(let row=0;row<rowCount;row++){let line=lines[row+2];spans.push({path:`/rows/${row}`,start:line.start,end:line.end}),cells(line,columns.map(c=>`/rows/${row}${c.path}`))}return spans}function spanMap(draft,artifact){if(artifact.snapshotId!==draft.snapshotId||artifact.draftRevision!==draft.revision)throw spanError("This artifact was built from a different draft, so its spans cannot be read from this one. Seal the current draft again.");let text=artifact.plainText,payload=draft.payload,format=artifact.format;if(format==="json"||format==="compact-json")return jsonTextSpans(text,payload.kind==="rows"?"/rows":"");if(format==="csv"||format==="tsv"){if(payload.kind!=="rows")throw spanError(`${format.toUpperCase()} requires tabular data`);return delimitedSpans(text,format==="csv"?",":" ",exportedColumns(payload.columns),payload.rows.length)}if(format!=="plain"&&format!=="markdown"&&format!=="html")throw spanError(`The ${format} format has no text span map; spans cover plain, Markdown, JSON, CSV and TSV text.`);if(payload.kind==="rows"){let columns=exportedColumns(payload.columns);return format==="markdown"?markdownTableSpans(text,columns,payload.rows.length):delimitedSpans(text," ",columns,payload.rows.length)}if(payload.kind==="json"||payload.kind==="registered")return jsonTextSpans(text);if(payload.kind==="text"&&payload.language&&format==="markdown"){if(fencedCodeBlock(payload.text,payload.language)!==text)throw spanError("The Markdown code block does not hold this draft's text.");let start=text.indexOf(`
|
|
27
|
-
`)+1;return[{path:"",start,end:start+payload.text.length}]}return[{path:"",start:0,end:text.length}]}function offsetSpans(spans,offset){return spans.map(s=>({path:s.path,start:s.start+offset,end:s.end+offset}))}function agentPayloadWithSpans(input,environment={}){let{text,body,bodyOffset}=assembleAgentPayload(input,environment);return(input.dataFormat??"json")!=="json"?{text,spans:[{path:"",start:bodyOffset,end:bodyOffset+body.length}]}:{text,spans:jsonTextSpans(body,"",bodyOffset)}}init_core();var
|
|
27
|
+
`)+1;return[{path:"",start,end:start+payload.text.length}]}return[{path:"",start:0,end:text.length}]}function offsetSpans(spans,offset){return spans.map(s=>({path:s.path,start:s.start+offset,end:s.end+offset}))}function agentPayloadWithSpans(input,environment={}){let{text,body,bodyOffset}=assembleAgentPayload(input,environment);return(input.dataFormat??"json")!=="json"?{text,spans:[{path:"",start:bodyOffset,end:bodyOffset+body.length}]}:{text,spans:jsonTextSpans(body,"",bodyOffset)}}init_core();var EMPTY_STRUCTURE=Object.freeze({exclude:Object.freeze([]),limits:Object.freeze({})}),encode=segment=>segment.replace(/~/g,"~0").replace(/\//g,"~1"),decode=segment=>segment.replace(/~1/g,"/").replace(/~0/g,"~");function pointerSegments(pointer){if(pointer==="")return[];if(!pointer.startsWith("/"))throw new ContentTransferError("invalid-pointer",`"${pointer}" is not a JSON Pointer (it must start with "/").`);return pointer.slice(1).split("/").map(decode)}function joinPointer(segments){return segments.map(segment=>`/${encode(segment)}`).join("")}function patternMatches(pattern,pointer){let p=pointerSegments(pattern),s=pointerSegments(pointer);return p.length===s.length&&p.every((segment,index)=>segment==="*"||segment===s[index])}function patternCovers(pattern,pointer){let p=pointerSegments(pattern),s=pointerSegments(pointer);return p.length<=s.length&&p.every((segment,index)=>segment==="*"||segment===s[index])}function patternBelow(pattern,pointer){let p=pointerSegments(pattern),s=pointerSegments(pointer);return p.length>s.length&&s.every((segment,index)=>p[index]==="*"||p[index]===segment)}function displayPath(pointer,root="data"){let out=root;for(let segment of pointerSegments(pointer))segment==="*"||/^(0|[1-9]\d*)$/.test(segment)?out+=`[${segment}]`:/^[A-Za-z_$][\w$]*$/.test(segment)?out+=`${out?".":""}${segment}`:out+=`[${JSON.stringify(segment)}]`;return out}var sizes=new WeakMap;function jsonSize(value){if(value===null)return 4;if(typeof value=="string")return JSON.stringify(value).length;if(typeof value=="number")return(JSON.stringify(value)??"null").length;if(typeof value=="boolean")return value?4:5;let cached=sizes.get(value);if(cached!==void 0)return cached;let total=2;if(Array.isArray(value))value.forEach((item,index)=>{total+=jsonSize(item)+(index?1:0)});else{let index=0;for(let[key,item]of Object.entries(value))total+=JSON.stringify(key).length+1+jsonSize(item)+(index++?1:0)}return sizes.set(value,total),total}function nodeChars(value){return typeof value=="string"?value.length:jsonSize(value)}var n=value=>value.toLocaleString("en-US");function stubText(value){let chars=n(nodeChars(value));if(typeof value=="string"){let first=(value.split(`
|
|
28
|
+
`,1)[0]??"").trim(),head=first.length>120?`${first.slice(0,120)}\u2026`:first;return`${head?`${head} `:""}[stubbed \u2014 ${chars} chars]`}if(Array.isArray(value))return`[stubbed \u2014 ${n(value.length)} items, ${chars} chars]`;if(value&&typeof value=="object"){let header=Object.entries(value).filter(([,item])=>typeof item=="string"&&item.length<=60&&!item.includes(`
|
|
29
|
+
`)||typeof item=="number"||typeof item=="boolean").slice(0,4).map(([key,item])=>`${key}: ${String(item)}`);return`[stubbed \u2014 ${header.length?`${header.join(", ")} \u2014 `:""}${n(Object.keys(value).length)} keys, ${chars} chars]`}return`[stubbed \u2014 ${chars} chars]`}function truncateText(text,max){return text.length>max?`${text.slice(0,max)} \u2026 [truncated \u2014 ${n(text.length)} chars]`:text}function assertLimit2(limit,pattern){if(limit.kind!=="stub"&&(!Number.isSafeInteger(limit.value)||limit.value<0))throw new ContentTransferError("invalid-limit",`The limit on ${displayPath(pattern)} must be a whole number of 0 or more.`)}function concretePointers(value,pattern){let want=pointerSegments(pattern),out=[],walk=(node,depth,at2)=>{if(depth===want.length){out.push(joinPointer(at2));return}if(node===null||typeof node!="object")return;let segment=want[depth],entries=Array.isArray(node)?node.map((item,index)=>[String(index),item]):Object.entries(node);for(let[key,child]of entries)(segment==="*"||segment===key)&&walk(child,depth+1,[...at2,key])};return walk(value,0,[]),out}function applyStructureToJson(value,recipe,labels={}){recipe.exclude.forEach(pattern=>pointerSegments(pattern));let limitEntries=Object.entries(recipe.limits);limitEntries.forEach(([pattern,limit])=>{pointerSegments(pattern),assertLimit2(limit,pattern)});let excluded=new Map,limited=new Map,tally=(map,pattern,chars)=>{let current=map.get(pattern)??{count:0,chars:0};map.set(pattern,{count:current.count+1,chars:current.chars+chars})},walk=(node,segments,cap)=>{let pointer=joinPointer(segments),exclusion=segments.length?recipe.exclude.find(pattern=>patternMatches(pattern,pointer)):void 0;if(exclusion!==void 0){tally(excluded,exclusion,nodeChars(node));return}let limitEntry=limitEntries.find(([pattern])=>patternMatches(pattern,pointer)),limit=limitEntry?.[1];if(limitEntry&&limit?.kind==="stub")return tally(limited,limitEntry[0],nodeChars(node)),stubText(node);let nextCap=limitEntry&&limit?.kind==="maxChars"?{pattern:limitEntry[0],max:limit.value}:cap;if(typeof node=="string")return nextCap&&node.length>nextCap.max?(tally(limited,nextCap.pattern,node.length),truncateText(node,nextCap.max)):node;if(node===null||typeof node!="object")return node;if(Array.isArray(node)){let items=node.map((item,index)=>walk(item,[...segments,String(index)],nextCap)).filter(item=>item!==void 0);return limitEntry&&limit?.kind==="maxItems"&&items.length>limit.value&&(tally(limited,limitEntry[0],items.length-limit.value),items=[...items.slice(0,limit.value),`[\u2026 ${n(items.length-limit.value)} more items]`]),items}let out={};for(let[key,item]of Object.entries(node)){let kept=walk(item,[...segments,key],nextCap);kept!==void 0&&(out[key]=kept)}return out},next=walk(value,[],null)??null,omissions=[];for(let[pattern,{count,chars}]of excluded)omissions.push({path:pattern,reason:"excluded",count,label:labels[pattern]??`${displayPath(pattern)} \u2014 ${n(chars)} chars`});for(let[pattern,{count,chars}]of limited){let limit=recipe.limits[pattern],what=limit.kind==="stub"?`stubbed (${n(chars)} chars)`:limit.kind==="maxChars"?`cut to ${n(limit.value)} chars`:`kept the first ${n(limit.value)} items`;omissions.push({path:pattern,reason:"truncated",count,label:`${labels[pattern]??displayPath(pattern)} \u2014 ${what}`})}return{value:next,omissions}}function applyJsonStructure(draft,recipe,labels={}){let payload=draft.payload;if(payload.kind!=="json"&&payload.kind!=="registered"||!recipe.exclude.length&&!Object.keys(recipe.limits).length)return draft;let{value,omissions}=applyStructureToJson(payload.value,recipe,labels);return deriveDraft(draft,{...payload,value},omissions,"Structure choices")}function outputPointer(value,recipe,pointer){let segments=pointerSegments(pointer),out=[],node=value;for(let depth=0;depth<=segments.length;depth++){let here=joinPointer(segments.slice(0,depth));if(depth>0&&recipe.exclude.some(pattern=>patternMatches(pattern,here)))return null;let limitEntry=Object.entries(recipe.limits).find(([pattern])=>patternMatches(pattern,here));if(limitEntry?.[1].kind==="stub"||depth===segments.length)return joinPointer(out);let segment=segments[depth];if(node===null||typeof node!="object"||node===void 0)return null;if(Array.isArray(node)){let index=Number(segment);if(!Number.isSafeInteger(index)||index>=node.length)return null;let shifted=index;for(let j=0;j<index;j++)recipe.exclude.some(pattern=>patternMatches(pattern,`${here}/${j}`))&&shifted--;if(limitEntry?.[1].kind==="maxItems"&&shifted>=limitEntry[1].value)return null;out.push(String(shifted)),node=node[index]}else{if(!Object.prototype.hasOwnProperty.call(node,segment))return null;out.push(segment),node=node[segment]}}return joinPointer(out)}var RANGE=/^\/text\/(\d+)-(\d+)$/;function isProseSection(section){return RANGE.test(section.path)}function sectionLayout(text,sections,included,limits={}){let keep=new Set(included),parsed=sections.map(section=>{let m=RANGE.exec(section.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 "${section.path}" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`);let limit=limits[section.id];return limit&&assertLimit2(limit,section.path),{section,start,end,limit}}).sort((a,b)=>a.start-b.start),out="",at2=0,omissions=[],ranges={};for(let{section,start,end,limit}of parsed){if(start<at2)throw new ContentTransferError("invalid-section",`Section "${section.label}" overlaps the section before it.`);out+=text.slice(at2,start),at2=end;let body=text.slice(start,end);if(!keep.has(section.id)){omissions.push({path:section.path,reason:"excluded",label:`${section.label} \u2014 ${n(body.length)} chars`});continue}let trailing=/\s*$/.exec(body)?.[0]??"",written=body;limit?.kind==="stub"?(written=`${stubText(body.slice(0,body.length-trailing.length))}${trailing}`,omissions.push({path:section.path,reason:"truncated",label:`${section.label} \u2014 stubbed (${n(body.length)} chars)`})):limit?.kind==="maxChars"&&body.length-trailing.length>limit.value&&(written=`${truncateText(body.slice(0,body.length-trailing.length),limit.value)}${trailing}`,omissions.push({path:section.path,reason:"truncated",label:`${section.label} \u2014 cut to ${n(limit.value)} chars`})),ranges[section.id]={start:out.length,end:out.length+written.length-trailing.length},out+=written}return out+=text.slice(at2),{text:out,omissions,ranges}}function applySectionStructure(draft,sections,included,limits={}){let payload=draft.payload;if(payload.kind==="text"||payload.kind==="markdown"){let layout=sectionLayout(payload.text,sections,included,limits);return deriveDraft(draft,{...payload,text:layout.text},layout.omissions,"Selected sections")}if(payload.kind==="json"||payload.kind==="registered"){let keep=new Set(included),labels=Object.fromEntries(sections.map(section=>[section.path,section.label])),recipe={exclude:sections.filter(section=>!keep.has(section.id)).map(section=>section.path),limits:Object.fromEntries(sections.filter(section=>keep.has(section.id)&&limits[section.id]).map(section=>[section.path,limits[section.id]]))},{value,omissions}=applyStructureToJson(payload.value,recipe,labels);return deriveDraft(draft,{...payload,value},omissions,"Selected sections")}return draft}init_core();var TRANSFER_DEFAULT_RECIPE_SETTING="alchemy.transfer.default_recipe",KEY=/^[a-z0-9][a-z0-9._:-]{0,127}$/;function recipeKey(sourceKind){if(!KEY.test(sourceKind))throw new ContentTransferError("invalid-recipe-key",`"${sourceKind}" is not a source-kind id (lowercase letters, digits and . _ : -, up to 128 characters).`);return sourceKind}var isRecord=v=>v!==null&&typeof v=="object"&&!Array.isArray(v);async function resolveDefaultRecipe(ports,sourceKind,organizationId){let key=recipeKey(sourceKind),notices=[],skip=(error,sentence,remedy)=>{notices.push({sentence,remedy}),ports.diagnostics.capture(error,{area:"operate",detail:{recipeKey:key,sentence}})};if(ports.persistence)try{let own=await ports.persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING);if(own!==null){if(!isRecord(own))skip(new Error("person default recipes are not a map"),"Your saved default recipes could not be read (they are not a list of recipes), so they were skipped.","Save your default recipe for this source again.");else if(own[key]!==void 0){let recipe=own[key];if(isRecord(recipe))return{recipe,from:"person",notices};skip(new Error("person default recipe is not an object"),"Your default recipe for this source is not a recipe, so it was skipped.","Save your default recipe for this source again.")}}}catch(error){skip(error,"Your own default recipe could not be read, so the organization's default applies.","Reopen the workspace to try again.")}if(ports.transferKnobs)try{let org=await ports.transferKnobs.defaultRecipe(key,organizationId);if(org!==null){if(isRecord(org))return{recipe:org,from:"organization",notices};skip(new Error("organization default recipe is not an object"),"Your organization's default recipe for this source is not a recipe, so it was skipped.","Ask an organization admin to set the default recipe again.")}}catch(error){skip(error,"Your organization's default recipe could not be read, so the workspace opens on Full.","Reopen the workspace to try again.")}return{recipe:null,from:"built-in",notices}}async function setPersonDefaultRecipe(ports,sourceKind,recipe){let key=recipeKey(sourceKind),persistence=ports.persistence;if(!persistence)throw new ContentTransferError("capability-absent","This app cannot save your own settings, so a personal default recipe is not available here.");let current;try{current=await persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING)}catch(error){let reason=error instanceof Error?error.message:String(error);throw new ContentTransferError("read-failed",`Nothing was saved: your other default recipes could not be read (${reason}), and saving now would have replaced all of them. Try again in a moment.`)}if(current!==null&&!isRecord(current))throw new ContentTransferError("invalid-setting","Nothing was saved: your saved default recipes are not a list of recipes, so one cannot be changed without replacing them all.");let map={...current??{}};if(recipe===null){if(!(key in map))return;delete map[key]}else map[key]=recipe;await persistence.writeSetting(TRANSFER_DEFAULT_RECIPE_SETTING,Object.keys(map).length===0?null:map)}export{ContentTransferError,EMPTY_STRUCTURE,FORMAT_ADAPTERS,TRANSFER_DEFAULT_RECIPE_SETTING,agentPayloadWithSpans,applyJsonStructure,applySectionSelection,applySectionStructure,applyStructureToJson,applyTransferLimits,assembleAgentPayload,buildAgentPayload,capture,collectAllMatching,concretePointers,createBrowserTransport,createDelivery,createDraft,createSurfaceTransferHandle,deriveDraft,directSource,displayPath,editDraft,eligibleFormats,exportedColumns,extensionForLanguage,fenceJsonBlock,formatAdapter,isProseSection,isSealed,joinPointer,jsonSize,jsonTextSpans,nodeChars,normalizeTransferJson,offsetSpans,openPreparation,outputPointer,patternBelow,patternCovers,patternMatches,pointerSegments,projectSnapshot,readTransferCell,recipeKey,reduceJson,refreshDraft,resetDraft,resolveDefaultRecipe,resolveTransferPreferences,resolveTransferRegistry,sealArtifact,sealDraft,sealTransferArtifact,sectionLayout,serialize,setPersonDefaultRecipe,sourceChanged,spanMap,stubText,transformRows,undoDraft};
|
|
28
30
|
//# sourceMappingURL=index.js.map
|