@ai-matrx/alchemy 0.11.1 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +1 -1
  3. package/dist/actions.cjs +1 -1
  4. package/dist/actions.cjs.map +1 -1
  5. package/dist/actions.d.cts +74 -1
  6. package/dist/actions.d.ts +74 -1
  7. package/dist/actions.js +1 -1
  8. package/dist/actions.js.map +1 -1
  9. package/dist/checks.cjs +1 -1
  10. package/dist/checks.cjs.map +1 -1
  11. package/dist/checks.d.cts +8 -0
  12. package/dist/checks.d.ts +8 -0
  13. package/dist/checks.js +1 -1
  14. package/dist/checks.js.map +1 -1
  15. package/dist/core.cjs +1 -1
  16. package/dist/core.cjs.map +1 -1
  17. package/dist/core.d.cts +10 -0
  18. package/dist/core.d.ts +10 -0
  19. package/dist/core.js +1 -1
  20. package/dist/core.js.map +1 -1
  21. package/dist/declare/schema.json +3 -0
  22. package/dist/declare.d.cts +8 -0
  23. package/dist/declare.d.ts +8 -0
  24. package/dist/index.cjs +1 -1
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +10 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.js +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/menu.d.cts +31 -0
  31. package/dist/menu.d.ts +31 -0
  32. package/dist/operate.cjs +1 -1
  33. package/dist/operate.cjs.map +1 -1
  34. package/dist/operate.d.cts +10 -0
  35. package/dist/operate.d.ts +10 -0
  36. package/dist/operate.js +1 -1
  37. package/dist/operate.js.map +1 -1
  38. package/dist/ports.cjs.map +1 -1
  39. package/dist/ports.d.cts +10 -0
  40. package/dist/ports.d.ts +10 -0
  41. package/dist/react-bar.cjs +1 -1
  42. package/dist/react-bar.cjs.map +1 -1
  43. package/dist/react-bar.d.cts +8 -0
  44. package/dist/react-bar.d.ts +8 -0
  45. package/dist/react-bar.js +1 -1
  46. package/dist/react-bar.js.map +1 -1
  47. package/dist/react-host.cjs +1 -1
  48. package/dist/react-host.cjs.map +1 -1
  49. package/dist/react-host.d.cts +44 -1
  50. package/dist/react-host.d.ts +44 -1
  51. package/dist/react-host.js +1 -1
  52. package/dist/react-host.js.map +1 -1
  53. package/dist/react-menu.cjs +1 -1
  54. package/dist/react-menu.cjs.map +1 -1
  55. package/dist/react-menu.d.cts +8 -0
  56. package/dist/react-menu.d.ts +8 -0
  57. package/dist/react-menu.js +1 -1
  58. package/dist/react-menu.js.map +1 -1
  59. package/dist/react-overflow.cjs +1 -1
  60. package/dist/react-overflow.cjs.map +1 -1
  61. package/dist/react-overflow.d.cts +31 -0
  62. package/dist/react-overflow.d.ts +31 -0
  63. package/dist/react-overflow.js +1 -1
  64. package/dist/react-overflow.js.map +1 -1
  65. package/dist/react-palette.cjs +1 -1
  66. package/dist/react-palette.cjs.map +1 -1
  67. package/dist/react-palette.d.cts +8 -0
  68. package/dist/react-palette.d.ts +8 -0
  69. package/dist/react-palette.js +1 -1
  70. package/dist/react-palette.js.map +1 -1
  71. package/dist/react-selection.cjs +1 -1
  72. package/dist/react-selection.cjs.map +1 -1
  73. package/dist/react-selection.d.cts +8 -0
  74. package/dist/react-selection.d.ts +8 -0
  75. package/dist/react-selection.js +1 -1
  76. package/dist/react-selection.js.map +1 -1
  77. package/dist/react-sheet.cjs +1 -1
  78. package/dist/react-sheet.cjs.map +1 -1
  79. package/dist/react-sheet.d.cts +8 -0
  80. package/dist/react-sheet.d.ts +8 -0
  81. package/dist/react-sheet.js +1 -1
  82. package/dist/react-sheet.js.map +1 -1
  83. package/dist/surface.cjs +1 -1
  84. package/dist/surface.cjs.map +1 -1
  85. package/dist/surface.d.cts +10 -0
  86. package/dist/surface.d.ts +10 -0
  87. package/dist/surface.js +1 -1
  88. package/dist/surface.js.map +1 -1
  89. package/package.json +1 -1
package/dist/menu.d.cts CHANGED
@@ -249,6 +249,14 @@ interface SurfaceDeclaration {
249
249
  urlPattern?: string;
250
250
  inheritsFrom?: string;
251
251
  intro?: string;
252
+ /**
253
+ * The moment in plain words (`ui_surface.situation`, AP-6): a short paragraph
254
+ * with blanks `{value}`, `{value.path}` or `{value|words when missing}` bound to
255
+ * this surface's declared values and the request's `user`. The server renders
256
+ * it on every agent turn and puts it FIRST (`<situation>`). Omitted: the server
257
+ * builds an automatic sentence from the value labels.
258
+ */
259
+ situation?: string;
252
260
  overlayId?: string;
253
261
  values: readonly DeclaredValue[];
254
262
  groups?: readonly ValueGroup[];
@@ -835,6 +843,8 @@ interface ApprovalRequest {
835
843
  input: Json;
836
844
  by: "agent" | "applet" | "automation";
837
845
  surfaceName: string;
846
+ /** The run this approval belongs to, when the caller named one — lets a host match the answer to its own waiting write or Action instead of guessing by value. */
847
+ runId?: string;
838
848
  }
839
849
  interface ApprovalPort {
840
850
  /** Resolves true when the person approves; false when they decline or dismiss. */
@@ -1017,9 +1027,25 @@ interface ActionSection {
1017
1027
  */
1018
1028
  kind?: "group" | "target";
1019
1029
  }
1030
+ /**
1031
+ * Where an Action can be reached. "menu" (the default): menus, bars, palettes and sheets — it runs
1032
+ * through `run(target, ctx)`. "invoke": code runs it BY ID through `invokeAction` — it runs through
1033
+ * `invoke(input, ctx)`. An Action whose `surfaces` omits "menu" is never resolved into a menu, so it
1034
+ * needs no eligibility of its own (`invocableAction` builds one).
1035
+ */
1036
+ type ActionSurface = "menu" | "invoke";
1037
+ /** What a programmatic invocation receives: the host's ports and a capability-scoped context the caller binds. */
1038
+ interface InvocationContext {
1039
+ ports: AlchemyHostPorts;
1040
+ /** Opaque to the package: the capabilities the caller hands this one Action (a launcher, the acting user). */
1041
+ context: unknown;
1042
+ signal: AbortSignal;
1043
+ }
1020
1044
  interface Action {
1021
1045
  /** Globally unique. A duplicate is refused (never overwritten). */
1022
1046
  id: string;
1047
+ /** Where it is reachable. Default ["menu"]. ["invoke"] = programmatic only: absent from every menu. */
1048
+ surfaces?: readonly ActionSurface[];
1023
1049
  /** The provider that registered it — filled by the registry. */
1024
1050
  provider?: string;
1025
1051
  /** Resolved through I18nPort.t(labelKey ?? id, label). */
@@ -1079,6 +1105,11 @@ interface Action {
1079
1105
  /** Shown centred when `expand` resolves empty. */
1080
1106
  emptyLabel?: string;
1081
1107
  run(target: ClickTarget, context: ActionRunContext): Promise<TransferOutcome | void> | TransferOutcome | void;
1108
+ /**
1109
+ * The typed invocation channel (programmatic Actions): input in, a never-thrown result envelope out.
1110
+ * Called only by `invokeAction`; a throw here is captured there and answered `action_failed`.
1111
+ */
1112
+ invoke?(input: unknown, context: InvocationContext): Promise<ActionResult<unknown>> | ActionResult<unknown>;
1082
1113
  }
1083
1114
  /** One removed read, recorded (kit content-transfer's omission shape). */
1084
1115
  interface ReadOmission {
package/dist/menu.d.ts CHANGED
@@ -249,6 +249,14 @@ interface SurfaceDeclaration {
249
249
  urlPattern?: string;
250
250
  inheritsFrom?: string;
251
251
  intro?: string;
252
+ /**
253
+ * The moment in plain words (`ui_surface.situation`, AP-6): a short paragraph
254
+ * with blanks `{value}`, `{value.path}` or `{value|words when missing}` bound to
255
+ * this surface's declared values and the request's `user`. The server renders
256
+ * it on every agent turn and puts it FIRST (`<situation>`). Omitted: the server
257
+ * builds an automatic sentence from the value labels.
258
+ */
259
+ situation?: string;
252
260
  overlayId?: string;
253
261
  values: readonly DeclaredValue[];
254
262
  groups?: readonly ValueGroup[];
@@ -835,6 +843,8 @@ interface ApprovalRequest {
835
843
  input: Json;
836
844
  by: "agent" | "applet" | "automation";
837
845
  surfaceName: string;
846
+ /** The run this approval belongs to, when the caller named one — lets a host match the answer to its own waiting write or Action instead of guessing by value. */
847
+ runId?: string;
838
848
  }
839
849
  interface ApprovalPort {
840
850
  /** Resolves true when the person approves; false when they decline or dismiss. */
@@ -1017,9 +1027,25 @@ interface ActionSection {
1017
1027
  */
1018
1028
  kind?: "group" | "target";
1019
1029
  }
1030
+ /**
1031
+ * Where an Action can be reached. "menu" (the default): menus, bars, palettes and sheets — it runs
1032
+ * through `run(target, ctx)`. "invoke": code runs it BY ID through `invokeAction` — it runs through
1033
+ * `invoke(input, ctx)`. An Action whose `surfaces` omits "menu" is never resolved into a menu, so it
1034
+ * needs no eligibility of its own (`invocableAction` builds one).
1035
+ */
1036
+ type ActionSurface = "menu" | "invoke";
1037
+ /** What a programmatic invocation receives: the host's ports and a capability-scoped context the caller binds. */
1038
+ interface InvocationContext {
1039
+ ports: AlchemyHostPorts;
1040
+ /** Opaque to the package: the capabilities the caller hands this one Action (a launcher, the acting user). */
1041
+ context: unknown;
1042
+ signal: AbortSignal;
1043
+ }
1020
1044
  interface Action {
1021
1045
  /** Globally unique. A duplicate is refused (never overwritten). */
1022
1046
  id: string;
1047
+ /** Where it is reachable. Default ["menu"]. ["invoke"] = programmatic only: absent from every menu. */
1048
+ surfaces?: readonly ActionSurface[];
1023
1049
  /** The provider that registered it — filled by the registry. */
1024
1050
  provider?: string;
1025
1051
  /** Resolved through I18nPort.t(labelKey ?? id, label). */
@@ -1079,6 +1105,11 @@ interface Action {
1079
1105
  /** Shown centred when `expand` resolves empty. */
1080
1106
  emptyLabel?: string;
1081
1107
  run(target: ClickTarget, context: ActionRunContext): Promise<TransferOutcome | void> | TransferOutcome | void;
1108
+ /**
1109
+ * The typed invocation channel (programmatic Actions): input in, a never-thrown result envelope out.
1110
+ * Called only by `invokeAction`; a throw here is captured there and answered `action_failed`.
1111
+ */
1112
+ invoke?(input: unknown, context: InvocationContext): Promise<ActionResult<unknown>> | ActionResult<unknown>;
1082
1113
  }
1083
1114
  /** One removed read, recorded (kit content-transfer's omission shape). */
1084
1115
  interface ReadOmission {
package/dist/operate.cjs CHANGED
@@ -19,7 +19,7 @@ ${summary}<data format="${dataFormat}">
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),xmlName=name=>{if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(name))throw new Error(`Invalid AI envelope name: ${name}`);return name},presentEntries=values=>Object.entries(values??{}).filter(([,value])=>value!=null&&value!=="")}});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=(0,import_json_format.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=>(0,import_html_escape.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
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>${(0,import_html_escape.escapeHtml)(c.label)}</th>`).join("")}</tr></thead><tbody>${payload.rows.map(row=>`<tr>${columns.map(c=>`<td>${(0,import_html_escape.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:(0,import_json_format.stringifyJson)(payload.value,{style:"pretty"}),format==="markdown"&&(mime="text/markdown;charset=utf-8",extension="md"),format==="html"&&(html=`<pre>${(0,import_html_escape.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 import_json_format,import_html_escape,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";import_json_format=require("@ai-matrx/kit/json-format"),import_html_escape=require("@ai-matrx/kit/html-escape");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:(0,import_json_format.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}))})}}}});var operate_exports={};__export(operate_exports,{ContentTransferError:()=>ContentTransferError,DuplicateWriteHandlerError:()=>DuplicateWriteHandlerError,EMPTY_STRUCTURE:()=>EMPTY_STRUCTURE,FORMAT_ADAPTERS:()=>FORMAT_ADAPTERS,TRANSFER_DEFAULT_RECIPE_SETTING:()=>TRANSFER_DEFAULT_RECIPE_SETTING,agentPayloadWithSpans:()=>agentPayloadWithSpans,applyJsonStructure:()=>applyJsonStructure,applySectionSelection:()=>applySectionSelection,applySectionStructure:()=>applySectionStructure,applyStructureToJson:()=>applyStructureToJson,applyTransferLimits:()=>applyTransferLimits,assembleAgentPayload:()=>assembleAgentPayload,buildAgentPayload:()=>buildAgentPayload,capture:()=>capture,collectAllMatching:()=>collectAllMatching,concretePointers:()=>concretePointers,createBrowserTransport:()=>createBrowserTransport,createDelivery:()=>createDelivery,createDraft:()=>createDraft,createSurfaceTransferHandle:()=>createSurfaceTransferHandle,createWriteDoor:()=>createWriteDoor,deriveDraft:()=>deriveDraft,directSource:()=>directSource,displayPath:()=>displayPath,editDraft:()=>editDraft,eligibleFormats:()=>eligibleFormats,exportedColumns:()=>exportedColumns,extensionForLanguage:()=>extensionForLanguage,fenceJsonBlock:()=>fenceJsonBlock,formatAdapter:()=>formatAdapter,isProseSection:()=>isProseSection,isSealed:()=>isSealed,joinPointer:()=>joinPointer,jsonSize:()=>jsonSize,jsonTextSpans:()=>jsonTextSpans,nodeChars:()=>nodeChars,normalizeTransferJson:()=>normalizeTransferJson,offsetSpans:()=>offsetSpans,openPreparation:()=>openPreparation,outputPointer:()=>outputPointer,patternBelow:()=>patternBelow,patternCovers:()=>patternCovers,patternMatches:()=>patternMatches,pointerSegments:()=>pointerSegments,projectSnapshot:()=>projectSnapshot,readTransferCell:()=>readTransferCell,recipeKey:()=>recipeKey,reduceJson:()=>reduceJson,refreshDraft:()=>refreshDraft,resetDraft:()=>resetDraft,resolveDefaultRecipe:()=>resolveDefaultRecipe,resolveTransferPreferences:()=>resolveTransferPreferences,resolveTransferRegistry:()=>resolveTransferRegistry,sealArtifact:()=>sealArtifact,sealDraft:()=>sealDraft,sealTransferArtifact:()=>sealTransferArtifact,sectionLayout:()=>sectionLayout,serialize:()=>serialize,setPersonDefaultRecipe:()=>setPersonDefaultRecipe,sourceChanged:()=>sourceChanged,spanMap:()=>spanMap,stubText:()=>stubText,transformRows:()=>transformRows,undoDraft:()=>undoDraft});module.exports=__toCommonJS(operate_exports);init_core();var PERSON=new Set(["person","menu","destination"]),POLICIES=new Set(["manual","ask","auto","queued"]),DuplicateWriteHandlerError=class extends Error{constructor(surfaceName,targetName){super(`[door] "${surfaceName}" already has a headless handler for "${targetName}". One handler per target; nothing was overwritten.`),this.name="DuplicateWriteHandlerError"}};function handlerKey(surfaceName,itemType,name){return`${surfaceName}\0${itemType}\0${name}`}function splitTarget(target,itemType){let dot=target.indexOf(".");return dot>0&&!itemType?{itemType:target.slice(0,dot),name:target.slice(dot+1)}:{itemType:itemType??"",name:target}}function qualified(itemType,name){return itemType?`${itemType}.${name}`:name}function messageOf(error){return error instanceof Error&&error.message.trim()?error.message:typeof error=="string"&&error.trim()?error:"The save failed without saying why."}function toJson(value){if(value===void 0)return null;if(value instanceof Uint8Array)return`<${value.byteLength} bytes>`;try{return JSON.parse(JSON.stringify(value))}catch{return String(value)}}function typeMatches(valueType,value){switch(valueType){case"string":return typeof value=="string";case"number":return typeof value=="number"&&Number.isFinite(value);case"boolean":return typeof value=="boolean";case"array":return Array.isArray(value);case"object":return typeof value=="object"&&value!==null&&!Array.isArray(value)&&!(value instanceof Uint8Array);case"document":return typeof value=="string"||value instanceof Uint8Array||typeof value=="object"&&value!==null;default:return!0}}var CANNOT_APPLY_WORDS={stale:{sentence:"it changed since this was written",remedy:"Reload the latest version and apply it again."},"missing-record":{sentence:"the record it belongs to no longer exists",remedy:"Pick where it should go instead and apply it again."},"broken-span":{sentence:"it would break a protected part of the content",remedy:"Review the change against the protected part and apply it again."}};function cannotApplyOf(error){let code=error?.code;return code==="stale"||code==="missing-record"||code==="broken-span"?code:null}function createWriteDoor(options){let{ports,declarations}=options,headless=new Map,live=new Map,capture2=(error,detail)=>{try{ports.diagnostics.capture(error,{area:"write",detail})}catch{}};function resolveTarget(surfaceName,itemType,name){let chain=[surfaceName];try{chain=[surfaceName,...(declarations.ancestry?.(surfaceName)??[]).slice().reverse()]}catch(error){capture2(error,{stage:"ancestry",surfaceName})}for(let surface of chain){let declaration=declarations.get(surface);if(!declaration)continue;let screen=(declaration.writeTargets??[]).find(t=>t.name===name&&(t.itemType??"")===itemType);if(screen){let item=itemType?declaration.itemTypes?.find(i=>i.name===itemType):void 0;return{target:screen,declaredOn:surface,itemType,identity:itemType?item?.identity??[]:null}}if(itemType){let item=declaration.itemTypes?.find(i=>i.name===itemType),own=item?.writeTargets?.find(t=>t.name===name);if(item&&own)return{target:own,declaredOn:surface,itemType,identity:item.identity}}}return null}function chainUpTo(surfaceName,declaredOn){let chain=[surfaceName];try{chain=[surfaceName,...(declarations.ancestry?.(surfaceName)??[]).slice().reverse()]}catch(error){capture2(error,{stage:"ancestry",surfaceName})}let end=chain.indexOf(declaredOn);return end>=0?chain.slice(0,end+1):[surfaceName,declaredOn]}function handlerFor(surfaces,itemType,name){for(let surface of surfaces){let key=handlerKey(surface,itemType,name),stack=live.get(key);if(stack?.length)return stack[stack.length-1]??null}for(let surface of surfaces){let handler=headless.get(handlerKey(surface,itemType,name));if(handler)return handler}return null}async function write(request,signal=new AbortController().signal){if(!request||typeof request.target!="string"||!request.target)return{status:"refused",to:{surfaceName:String(request?.surfaceName??""),target:String(request?.target??"")},reason:"malformed",sentence:"This write names no place to save, so nothing was saved.",remedy:"Name the declared write target to save into."};let{itemType,name}=splitTarget(request.target,request.itemType),to={surfaceName:request.surfaceName,target:qualified(itemType,name),...request.itemIdentity&&itemType?{item:{itemType,identity:request.itemIdentity}}:{}},refuse=(reason,sentence,remedy)=>({status:"refused",to,reason,sentence,remedy}),isPerson=PERSON.has(request.by);try{if(!request.surfaceName)return refuse("undeclared",`This write names no screen, so "${to.target}" can't be found.`,"Send it from the screen it belongs to.");let resolved=resolveTarget(request.surfaceName,itemType,name);if(!resolved)return refuse("undeclared",`${request.surfaceName} declares no write target ${to.target}, so nothing was saved.`,`Pick one of ${request.surfaceName}'s declared places to save, or declare "${to.target}" on it.`);let{target,declaredOn}=resolved,label=target.label||target.name,item;if(resolved.identity){let identity=request.itemIdentity??{},missing=resolved.identity.filter(key=>!identity[key]);if(!request.itemIdentity||missing.length)return refuse("needs_item",`"${label}" saves into one ${resolved.itemType}, and this write doesn't say which${missing.length?` (missing ${missing.join(", ")})`:""}.`,`Pick the ${resolved.itemType} first, then save again.`);item={itemType:resolved.itemType,identity:{...identity}}}let hasOps=request.ops!==void 0;if(hasOps===(request.value!==void 0))return refuse("malformed",hasOps?`A write to "${label}" carries both a value and edits; send one.`:`A write to "${label}" carries nothing to save.`,"Send either the whole value or the edits, then try again.");if((target.mode==="stream"||hasOps&&target.patchable)&&!target.updatesValue)return capture2(new Error(`write target "${to.target}" on ${declaredOn} edits text but declares no updatesValue`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),refuse("declaration_broken",`"${label}" edits text but doesn't say which value it edits, so it can't be applied safely.`,`Declare updatesValue on ${declaredOn}'s "${to.target}".`);if(target.mode==="stream"){if(!hasOps)return refuse("malformed",`"${label}" takes edits, not a whole value.`,`Send it as edits (${(target.streamOps??[]).join(", ")||"none declared"}).`);if(!target.streamOps?.length)return capture2(new Error(`stream target "${to.target}" on ${declaredOn} declares no streamOps`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),refuse("declaration_broken",`"${label}" takes edits but declares none it accepts.`,`Declare streamOps on ${declaredOn}'s "${to.target}".`)}else if(hasOps&&!target.patchable)return refuse("malformed",target.mode==="entity"?`"${label}" saves a whole record at once and takes no live edits.`:`"${label}" takes a whole value, not edits.`,target.mode==="entity"?"Stream the edits into the editor, then save the result.":"Send the whole value instead.");if(hasOps){let allowed=new Set(target.mode==="stream"?target.streamOps??[]:target.streamOps??["patch"]),bad=(request.ops??[]).filter(op=>!op||!allowed.has(op.op)).map(op=>String(op?.op));if(!request.ops?.length||bad.length){let sentence=request.ops?.length?`"${label}" doesn't accept the edit${bad.length>1?"s":""} ${bad.join(", ")}.`:`A write to "${label}" carries no edits.`;return refuse("malformed",sentence,`Use only ${[...allowed].join(", ")}.`)}}let warning=null;if(!hasOps){let problem=null;if(!typeMatches(target.valueType,request.value))problem={sentence:`"${label}" expects ${target.valueType==="array"?"a list":`a ${target.valueType}`}.`,remedy:`Send it as ${target.valueType==="array"?"a list":`a ${target.valueType}`}.`};else if(target.valueKind)if(!ports.kinds)problem={sentence:`"${label}" holds ${target.valueKind}, and it can't be checked here.`,remedy:"Check the content before relying on it."};else{let verdict=await ports.kinds.validate(target.valueKind,request.value,signal);verdict.ok||(problem={sentence:verdict.sentence,remedy:verdict.remedy})}if(problem){if(!isPerson)return refuse("malformed",`The write to "${label}" was refused: ${problem.sentence}`,problem.remedy);warning={warning:problem.sentence,fix:problem.remedy}}}let applyRequest={surfaceName:request.surfaceName,declaredOn,target,...item?{item}:{},...request.ops?{ops:request.ops}:{value:request.value},by:request.by,...request.runId?{runId:request.runId}:{}},declaredPolicy=target.applyPolicy??"manual",policy=POLICIES.has(declaredPolicy)?declaredPolicy:"manual";if(policy!==declaredPolicy&&capture2(new Error(`write target "${to.target}" on ${declaredOn} declares unknown applyPolicy "${String(declaredPolicy)}"; treated as manual`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),policy==="manual"&&!isPerson)return refuse("manual_only",`"${label}" is saved only by a person, so the ${request.by}'s write was not applied.`,"Ask a person to review it and save it themselves.");if(policy==="ask"&&!isPerson){if(!ports.approvals)return refuse("needs_approval",`"${label}" needs a person's approval, and there is no one to ask here.`,`Open ${request.surfaceName} so a person can approve it.`);if(signal.aborted)return refuse("cancelled",`"${label}" was cancelled before anyone was asked, so nothing was saved.`,"Send it again when you're ready.");let approved;try{approved=await ports.approvals.ask({action:to.target,label,description:target.description,input:hasOps?{ops:toJson(request.ops)}:toJson(request.value),by:request.by,surfaceName:request.surfaceName})}catch(error){return capture2(error,{stage:"approval",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`Couldn't ask a person to approve "${label}", so nothing was saved: ${messageOf(error)}`,"Try again; if it keeps failing, open the page and save it yourself.")}if(!approved)return refuse("declined",`"${label}" was not approved, so nothing was saved.`,"Change it and propose it again.")}if(policy==="queued"){if(!ports.review)return refuse("no_review",`"${label}" is saved only after review, and review isn't available here.`,`Open ${request.surfaceName} where review is available, then send it again.`);let filed=await ports.review.file(applyRequest);return{status:"queued",to,sentence:filed?.sentence??`Sent "${label}" for review; it will be saved once approved.`,remedy:filed?.remedy??"Open the review queue to approve it."}}let handler=handlerFor(chainUpTo(request.surfaceName,declaredOn),resolved.itemType,name);if(!handler)return refuse("unapplicable",`"${label}" can only be saved with ${request.surfaceName} open, so nothing was saved.`,`Open ${request.surfaceName} to apply it.`);if(signal.aborted)return refuse("cancelled",`"${label}" was cancelled, so nothing was saved.`,"Send it again when you're ready.");let result;try{result=await handler(applyRequest,signal)}catch(error){let signalled=cannotApplyOf(error);if(signalled){let words=CANNOT_APPLY_WORDS[signalled];return refuse("cannot_apply",`Can't apply "${label}": ${words.sentence}.`,words.remedy)}return capture2(error,{stage:"apply",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`"${label}" was not saved: ${messageOf(error)}`,"Try again; if it keeps failing, copy it and paste it in by hand.")}if(result&&result.status==="cannot-apply"){let words=CANNOT_APPLY_WORDS[result.cannotApply];return refuse("cannot_apply",result.sentence??`Can't apply "${label}": ${words.sentence}.`,result.remedy??words.remedy)}return{status:"applied",to,sentence:result&&result.sentence||`Saved to "${label}".`,...warning??{}}}catch(error){return capture2(error,{stage:"door",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`"${to.target}" was not saved: ${messageOf(error)}`,"Try again; if it keeps failing, copy it and paste it in by hand.")}}return{write,registerHeadless(surfaceName,targetName,handler){let{itemType,name}=splitTarget(targetName),key=handlerKey(surfaceName,itemType,name);if(headless.has(key))throw new DuplicateWriteHandlerError(surfaceName,targetName);return headless.set(key,handler),()=>{headless.get(key)===handler&&headless.delete(key)}},registerLive(surfaceName,targetName,handler){let{itemType,name}=splitTarget(targetName),key=handlerKey(surfaceName,itemType,name),stack=live.get(key)??[];return stack.push(handler),live.set(key,stack),()=>{let current=live.get(key);if(!current)return;let index=current.lastIndexOf(handler);index!==-1&&current.splice(index,1),current.length||live.delete(key)}}}}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.write({surfaceName:to.surfaceName??"",target:to.target,...to.item?{itemType:to.item.itemType,itemIdentity:to.item.identity}:{},value:artifact.file?artifact.file.bytes:artifact.plainText,by:"destination"}):{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]===`
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>${(0,import_html_escape.escapeHtml)(c.label)}</th>`).join("")}</tr></thead><tbody>${payload.rows.map(row=>`<tr>${columns.map(c=>`<td>${(0,import_html_escape.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:(0,import_json_format.stringifyJson)(payload.value,{style:"pretty"}),format==="markdown"&&(mime="text/markdown;charset=utf-8",extension="md"),format==="html"&&(html=`<pre>${(0,import_html_escape.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 import_json_format,import_html_escape,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";import_json_format=require("@ai-matrx/kit/json-format"),import_html_escape=require("@ai-matrx/kit/html-escape");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:(0,import_json_format.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}))})}}}});var operate_exports={};__export(operate_exports,{ContentTransferError:()=>ContentTransferError,DuplicateWriteHandlerError:()=>DuplicateWriteHandlerError,EMPTY_STRUCTURE:()=>EMPTY_STRUCTURE,FORMAT_ADAPTERS:()=>FORMAT_ADAPTERS,TRANSFER_DEFAULT_RECIPE_SETTING:()=>TRANSFER_DEFAULT_RECIPE_SETTING,agentPayloadWithSpans:()=>agentPayloadWithSpans,applyJsonStructure:()=>applyJsonStructure,applySectionSelection:()=>applySectionSelection,applySectionStructure:()=>applySectionStructure,applyStructureToJson:()=>applyStructureToJson,applyTransferLimits:()=>applyTransferLimits,assembleAgentPayload:()=>assembleAgentPayload,buildAgentPayload:()=>buildAgentPayload,capture:()=>capture,collectAllMatching:()=>collectAllMatching,concretePointers:()=>concretePointers,createBrowserTransport:()=>createBrowserTransport,createDelivery:()=>createDelivery,createDraft:()=>createDraft,createSurfaceTransferHandle:()=>createSurfaceTransferHandle,createWriteDoor:()=>createWriteDoor,deriveDraft:()=>deriveDraft,directSource:()=>directSource,displayPath:()=>displayPath,editDraft:()=>editDraft,eligibleFormats:()=>eligibleFormats,exportedColumns:()=>exportedColumns,extensionForLanguage:()=>extensionForLanguage,fenceJsonBlock:()=>fenceJsonBlock,formatAdapter:()=>formatAdapter,isProseSection:()=>isProseSection,isSealed:()=>isSealed,joinPointer:()=>joinPointer,jsonSize:()=>jsonSize,jsonTextSpans:()=>jsonTextSpans,nodeChars:()=>nodeChars,normalizeTransferJson:()=>normalizeTransferJson,offsetSpans:()=>offsetSpans,openPreparation:()=>openPreparation,outputPointer:()=>outputPointer,patternBelow:()=>patternBelow,patternCovers:()=>patternCovers,patternMatches:()=>patternMatches,pointerSegments:()=>pointerSegments,projectSnapshot:()=>projectSnapshot,readTransferCell:()=>readTransferCell,recipeKey:()=>recipeKey,reduceJson:()=>reduceJson,refreshDraft:()=>refreshDraft,resetDraft:()=>resetDraft,resolveDefaultRecipe:()=>resolveDefaultRecipe,resolveTransferPreferences:()=>resolveTransferPreferences,resolveTransferRegistry:()=>resolveTransferRegistry,sealArtifact:()=>sealArtifact,sealDraft:()=>sealDraft,sealTransferArtifact:()=>sealTransferArtifact,sectionLayout:()=>sectionLayout,serialize:()=>serialize,setPersonDefaultRecipe:()=>setPersonDefaultRecipe,sourceChanged:()=>sourceChanged,spanMap:()=>spanMap,stubText:()=>stubText,transformRows:()=>transformRows,undoDraft:()=>undoDraft});module.exports=__toCommonJS(operate_exports);init_core();var PERSON=new Set(["person","menu","destination"]),POLICIES=new Set(["manual","ask","auto","queued"]),DuplicateWriteHandlerError=class extends Error{constructor(surfaceName,targetName){super(`[door] "${surfaceName}" already has a headless handler for "${targetName}". One handler per target; nothing was overwritten.`),this.name="DuplicateWriteHandlerError"}};function handlerKey(surfaceName,itemType,name){return`${surfaceName}\0${itemType}\0${name}`}function splitTarget(target,itemType){let dot=target.indexOf(".");return dot>0&&!itemType?{itemType:target.slice(0,dot),name:target.slice(dot+1)}:{itemType:itemType??"",name:target}}function qualified(itemType,name){return itemType?`${itemType}.${name}`:name}function messageOf(error){return error instanceof Error&&error.message.trim()?error.message:typeof error=="string"&&error.trim()?error:"The save failed without saying why."}function toJson(value){if(value===void 0)return null;if(value instanceof Uint8Array)return`<${value.byteLength} bytes>`;try{return JSON.parse(JSON.stringify(value))}catch{return String(value)}}function typeMatches(valueType,value){switch(valueType){case"string":return typeof value=="string";case"number":return typeof value=="number"&&Number.isFinite(value);case"boolean":return typeof value=="boolean";case"array":return Array.isArray(value);case"object":return typeof value=="object"&&value!==null&&!Array.isArray(value)&&!(value instanceof Uint8Array);case"document":return typeof value=="string"||value instanceof Uint8Array||typeof value=="object"&&value!==null;default:return!0}}var CANNOT_APPLY_WORDS={stale:{sentence:"it changed since this was written",remedy:"Reload the latest version and apply it again."},"missing-record":{sentence:"the record it belongs to no longer exists",remedy:"Pick where it should go instead and apply it again."},"broken-span":{sentence:"it would break a protected part of the content",remedy:"Review the change against the protected part and apply it again."}};function cannotApplyOf(error){let code=error?.code;return code==="stale"||code==="missing-record"||code==="broken-span"?code:null}function createWriteDoor(options){let{ports,declarations}=options,headless=new Map,live=new Map,capture2=(error,detail)=>{try{ports.diagnostics.capture(error,{area:"write",detail})}catch{}};function resolveTarget(surfaceName,itemType,name){let chain=[surfaceName];try{chain=[surfaceName,...(declarations.ancestry?.(surfaceName)??[]).slice().reverse()]}catch(error){capture2(error,{stage:"ancestry",surfaceName})}for(let surface of chain){let declaration=declarations.get(surface);if(!declaration)continue;let screen=(declaration.writeTargets??[]).find(t=>t.name===name&&(t.itemType??"")===itemType);if(screen){let item=itemType?declaration.itemTypes?.find(i=>i.name===itemType):void 0;return{target:screen,declaredOn:surface,itemType,identity:itemType?item?.identity??[]:null}}if(itemType){let item=declaration.itemTypes?.find(i=>i.name===itemType),own=item?.writeTargets?.find(t=>t.name===name);if(item&&own)return{target:own,declaredOn:surface,itemType,identity:item.identity}}}return null}function chainUpTo(surfaceName,declaredOn){let chain=[surfaceName];try{chain=[surfaceName,...(declarations.ancestry?.(surfaceName)??[]).slice().reverse()]}catch(error){capture2(error,{stage:"ancestry",surfaceName})}let end=chain.indexOf(declaredOn);return end>=0?chain.slice(0,end+1):[surfaceName,declaredOn]}function handlerFor(surfaces,itemType,name){for(let surface of surfaces){let key=handlerKey(surface,itemType,name),stack=live.get(key);if(stack?.length)return stack[stack.length-1]??null}for(let surface of surfaces){let handler=headless.get(handlerKey(surface,itemType,name));if(handler)return handler}return null}async function write(request,signal=new AbortController().signal){if(!request||typeof request.target!="string"||!request.target)return{status:"refused",to:{surfaceName:String(request?.surfaceName??""),target:String(request?.target??"")},reason:"malformed",sentence:"This write names no place to save, so nothing was saved.",remedy:"Name the declared write target to save into."};let{itemType,name}=splitTarget(request.target,request.itemType),to={surfaceName:request.surfaceName,target:qualified(itemType,name),...request.itemIdentity&&itemType?{item:{itemType,identity:request.itemIdentity}}:{}},refuse=(reason,sentence,remedy)=>({status:"refused",to,reason,sentence,remedy}),isPerson=PERSON.has(request.by);try{if(!request.surfaceName)return refuse("undeclared",`This write names no screen, so "${to.target}" can't be found.`,"Send it from the screen it belongs to.");let resolved=resolveTarget(request.surfaceName,itemType,name);if(!resolved)return refuse("undeclared",`${request.surfaceName} declares no write target ${to.target}, so nothing was saved.`,`Pick one of ${request.surfaceName}'s declared places to save, or declare "${to.target}" on it.`);let{target,declaredOn}=resolved,label=target.label||target.name,item;if(resolved.identity){let identity=request.itemIdentity??{},missing=resolved.identity.filter(key=>!identity[key]);if(!request.itemIdentity||missing.length)return refuse("needs_item",`"${label}" saves into one ${resolved.itemType}, and this write doesn't say which${missing.length?` (missing ${missing.join(", ")})`:""}.`,`Pick the ${resolved.itemType} first, then save again.`);item={itemType:resolved.itemType,identity:{...identity}}}let hasOps=request.ops!==void 0;if(hasOps===(request.value!==void 0))return refuse("malformed",hasOps?`A write to "${label}" carries both a value and edits; send one.`:`A write to "${label}" carries nothing to save.`,"Send either the whole value or the edits, then try again.");if((target.mode==="stream"||hasOps&&target.patchable)&&!target.updatesValue)return capture2(new Error(`write target "${to.target}" on ${declaredOn} edits text but declares no updatesValue`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),refuse("declaration_broken",`"${label}" edits text but doesn't say which value it edits, so it can't be applied safely.`,`Declare updatesValue on ${declaredOn}'s "${to.target}".`);if(target.mode==="stream"){if(!hasOps)return refuse("malformed",`"${label}" takes edits, not a whole value.`,`Send it as edits (${(target.streamOps??[]).join(", ")||"none declared"}).`);if(!target.streamOps?.length)return capture2(new Error(`stream target "${to.target}" on ${declaredOn} declares no streamOps`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),refuse("declaration_broken",`"${label}" takes edits but declares none it accepts.`,`Declare streamOps on ${declaredOn}'s "${to.target}".`)}else if(hasOps&&!target.patchable)return refuse("malformed",target.mode==="entity"?`"${label}" saves a whole record at once and takes no live edits.`:`"${label}" takes a whole value, not edits.`,target.mode==="entity"?"Stream the edits into the editor, then save the result.":"Send the whole value instead.");if(hasOps){let allowed=new Set(target.mode==="stream"?target.streamOps??[]:target.streamOps??["patch"]),bad=(request.ops??[]).filter(op=>!op||!allowed.has(op.op)).map(op=>String(op?.op));if(!request.ops?.length||bad.length){let sentence=request.ops?.length?`"${label}" doesn't accept the edit${bad.length>1?"s":""} ${bad.join(", ")}.`:`A write to "${label}" carries no edits.`;return refuse("malformed",sentence,`Use only ${[...allowed].join(", ")}.`)}}let warning=null;if(!hasOps){let problem=null;if(!typeMatches(target.valueType,request.value))problem={sentence:`"${label}" expects ${target.valueType==="array"?"a list":`a ${target.valueType}`}.`,remedy:`Send it as ${target.valueType==="array"?"a list":`a ${target.valueType}`}.`};else if(target.valueKind)if(!ports.kinds)problem={sentence:`"${label}" holds ${target.valueKind}, and it can't be checked here.`,remedy:"Check the content before relying on it."};else{let verdict=await ports.kinds.validate(target.valueKind,request.value,signal);verdict.ok||(problem={sentence:verdict.sentence,remedy:verdict.remedy})}if(problem){if(!isPerson)return refuse("malformed",`The write to "${label}" was refused: ${problem.sentence}`,problem.remedy);warning={warning:problem.sentence,fix:problem.remedy}}}let applyRequest={surfaceName:request.surfaceName,declaredOn,target,...item?{item}:{},...request.ops?{ops:request.ops}:{value:request.value},by:request.by,...request.runId?{runId:request.runId}:{}},declaredPolicy=target.applyPolicy??"manual",policy=POLICIES.has(declaredPolicy)?declaredPolicy:"manual";if(policy!==declaredPolicy&&capture2(new Error(`write target "${to.target}" on ${declaredOn} declares unknown applyPolicy "${String(declaredPolicy)}"; treated as manual`),{stage:"declaration",surfaceName:declaredOn,target:to.target}),policy==="manual"&&!isPerson)return refuse("manual_only",`"${label}" is saved only by a person, so the ${request.by}'s write was not applied.`,"Ask a person to review it and save it themselves.");if(policy==="ask"&&!isPerson){if(!ports.approvals)return refuse("needs_approval",`"${label}" needs a person's approval, and there is no one to ask here.`,`Open ${request.surfaceName} so a person can approve it.`);if(signal.aborted)return refuse("cancelled",`"${label}" was cancelled before anyone was asked, so nothing was saved.`,"Send it again when you're ready.");let approved;try{approved=await ports.approvals.ask({action:to.target,label,description:target.description,input:hasOps?{ops:toJson(request.ops)}:toJson(request.value),by:request.by,surfaceName:request.surfaceName,...request.runId?{runId:request.runId}:{}})}catch(error){return capture2(error,{stage:"approval",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`Couldn't ask a person to approve "${label}", so nothing was saved: ${messageOf(error)}`,"Try again; if it keeps failing, open the page and save it yourself.")}if(!approved)return refuse("declined",`"${label}" was not approved, so nothing was saved.`,"Change it and propose it again.")}if(policy==="queued"){if(!ports.review)return refuse("no_review",`"${label}" is saved only after review, and review isn't available here.`,`Open ${request.surfaceName} where review is available, then send it again.`);let filed=await ports.review.file(applyRequest);return{status:"queued",to,sentence:filed?.sentence??`Sent "${label}" for review; it will be saved once approved.`,remedy:filed?.remedy??"Open the review queue to approve it."}}let handler=handlerFor(chainUpTo(request.surfaceName,declaredOn),resolved.itemType,name);if(!handler)return refuse("unapplicable",`"${label}" can only be saved with ${request.surfaceName} open, so nothing was saved.`,`Open ${request.surfaceName} to apply it.`);if(signal.aborted)return refuse("cancelled",`"${label}" was cancelled, so nothing was saved.`,"Send it again when you're ready.");let result;try{result=await handler(applyRequest,signal)}catch(error){let signalled=cannotApplyOf(error);if(signalled){let words=CANNOT_APPLY_WORDS[signalled];return refuse("cannot_apply",`Can't apply "${label}": ${words.sentence}.`,words.remedy)}return capture2(error,{stage:"apply",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`"${label}" was not saved: ${messageOf(error)}`,"Try again; if it keeps failing, copy it and paste it in by hand.")}if(result&&result.status==="cannot-apply"){let words=CANNOT_APPLY_WORDS[result.cannotApply];return refuse("cannot_apply",result.sentence??`Can't apply "${label}": ${words.sentence}.`,result.remedy??words.remedy)}return{status:"applied",to,sentence:result&&result.sentence||`Saved to "${label}".`,...warning??{}}}catch(error){return capture2(error,{stage:"door",surfaceName:request.surfaceName,target:to.target,by:request.by}),refuse("failed",`"${to.target}" was not saved: ${messageOf(error)}`,"Try again; if it keeps failing, copy it and paste it in by hand.")}}return{write,registerHeadless(surfaceName,targetName,handler){let{itemType,name}=splitTarget(targetName),key=handlerKey(surfaceName,itemType,name);if(headless.has(key))throw new DuplicateWriteHandlerError(surfaceName,targetName);return headless.set(key,handler),()=>{headless.get(key)===handler&&headless.delete(key)}},registerLive(surfaceName,targetName,handler){let{itemType,name}=splitTarget(targetName),key=handlerKey(surfaceName,itemType,name),stack=live.get(key)??[];return stack.push(handler),live.set(key,stack),()=>{let current=live.get(key);if(!current)return;let index=current.lastIndexOf(handler);index!==-1&&current.splice(index,1),current.length||live.delete(key)}}}}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.write({surfaceName:to.surfaceName??"",target:to.target,...to.item?{itemType:to.item.itemType,itemIdentity:to.item.identity}:{},value:artifact.file?artifact.file.bytes:artifact.plainText,by:"destination"}):{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(`