@culvii/cli 0.0.8 → 0.0.9

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 (64) hide show
  1. package/dist/{HelpView-E7HS4SVF.js → HelpView-PELQJJQQ.js} +1 -1
  2. package/dist/{chunk-IPETC2TK.js → chunk-KM7ZWOEG.js} +1 -1
  3. package/dist/index.js +27 -27
  4. package/dist/{login-OGOHEHFE.js → login-3OMS75QL.js} +1 -1
  5. package/dist/{logout-BRUJBFUK.js → logout-ZYTERDYA.js} +1 -1
  6. package/dist/skill-bundle-Z4FQO3CQ.js +2553 -0
  7. package/package.json +2 -2
  8. package/skills/culvii/.culvii-skill.json +58 -27
  9. package/skills/culvii/SKILL.md +31 -0
  10. package/skills/culvii/examples/agent-workflow.culvii.ts +28 -5
  11. package/skills/culvii/examples/binary-document-workflow.culvii.ts +80 -0
  12. package/skills/culvii/examples/complete-workflow.culvii.ts +55 -11
  13. package/skills/culvii/examples/custom-output-surface.culvii.ts +69 -0
  14. package/skills/culvii/examples/custom-wait-surface.culvii.ts +90 -0
  15. package/skills/culvii/examples/human-in-the-loop-workflow.culvii.ts +125 -0
  16. package/skills/culvii/examples/integration-agent-workflow.culvii.ts +101 -0
  17. package/skills/culvii/examples/multi-agent-workflow-tools.culvii.ts +157 -0
  18. package/skills/culvii/examples/nested-agent-workflow.culvii.ts +108 -0
  19. package/skills/culvii/references/agents.md +53 -5
  20. package/skills/culvii/references/cli-guide.md +1 -1
  21. package/skills/culvii/references/cli-reference.md +33 -0
  22. package/skills/culvii/references/feedback-cycle.md +1 -1
  23. package/skills/culvii/references/kit-api.md +2 -2
  24. package/skills/culvii/references/node-argocd.md +44 -0
  25. package/skills/culvii/references/node-clickup-doc.md +38 -0
  26. package/skills/culvii/references/node-clickup-ticket.md +47 -0
  27. package/skills/culvii/references/node-core-loop-break.md +26 -0
  28. package/skills/culvii/references/node-core-loop-continue.md +26 -0
  29. package/skills/culvii/references/node-core-loop-output.md +24 -0
  30. package/skills/culvii/references/node-core-loop.md +25 -0
  31. package/skills/culvii/references/node-core-merge.md +23 -0
  32. package/skills/culvii/references/node-core-switch.md +24 -0
  33. package/skills/culvii/references/node-cost-explorer.md +45 -0
  34. package/skills/culvii/references/node-elasticsearch.md +2 -2
  35. package/skills/culvii/references/node-github-poll-trigger.md +31 -0
  36. package/skills/culvii/references/node-github-webhook-trigger.md +27 -0
  37. package/skills/culvii/references/node-github.md +251 -0
  38. package/skills/culvii/references/node-gmail-trigger.md +2 -2
  39. package/skills/culvii/references/node-gmail.md +2 -2
  40. package/skills/culvii/references/node-google-calendar.md +2 -2
  41. package/skills/culvii/references/node-google-docs.md +2 -2
  42. package/skills/culvii/references/node-grafana-dashboard.md +38 -0
  43. package/skills/culvii/references/node-grafana-data-source.md +42 -0
  44. package/skills/culvii/references/node-grafana-query.md +34 -0
  45. package/skills/culvii/references/node-hibp-list-domains.md +27 -0
  46. package/skills/culvii/references/node-hibp-stealer-logs.md +30 -0
  47. package/skills/culvii/references/node-kubernetes.md +51 -0
  48. package/skills/culvii/references/node-microsoft-outlook-trigger.md +2 -2
  49. package/skills/culvii/references/node-microsoft-outlook.md +3 -2
  50. package/skills/culvii/references/node-microsoft-sharepoint.md +2 -2
  51. package/skills/culvii/references/node-onionsearch.md +27 -0
  52. package/skills/culvii/references/node-prometheus.md +40 -0
  53. package/skills/culvii/references/node-s3.md +2 -2
  54. package/skills/culvii/references/node-slack-events-trigger.md +37 -0
  55. package/skills/culvii/references/node-slack-interactions-trigger.md +28 -0
  56. package/skills/culvii/references/node-slack-trigger.md +2 -2
  57. package/skills/culvii/references/node-slack.md +128 -4
  58. package/skills/culvii/references/node-supabase.md +61 -0
  59. package/skills/culvii/references/node-twilio.md +2 -2
  60. package/skills/culvii/references/nodes-index.md +24 -0
  61. package/skills/culvii/references/surface-authoring.md +12 -1
  62. package/skills/culvii/references/surface-display.md +1 -1
  63. package/skills/culvii/references/surface-feedback.md +24 -27
  64. package/dist/skill-bundle-7KYK5GBL.js +0 -1377
package/dist/index.js CHANGED
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$5}from'./chunk-RS5GDTRN.js';import {a as a$4,b as b$1,c as c$1}from'./chunk-KZG5CFSB.js';import {d,f,a as a$1,e,j,n,c,q,r,s,o,k,l}from'./chunk-IPETC2TK.js';import {a as a$3}from'./chunk-HX54IFSD.js';import'./chunk-57XLDHK6.js';import {x,w,y,z}from'./chunk-YKFGEPLO.js';import {a as a$2}from'./chunk-YPLDPHHD.js';import {a,b}from'./chunk-7UWDMECF.js';import {Command}from'commander';import Q,{realpathSync,existsSync}from'fs';import {fileURLToPath}from'url';import ve from'react';import {render}from'ink';import mt from'ws';import {randomUUID,createHash}from'crypto';import rr from'chokidar';import ce from'fs/promises';import re,{dirname,join}from'path';import {spawn}from'child_process';import {createRequire}from'module';import fr from'readline';import bt from'os';import {createInterface}from'readline/promises';import {stdout,stdin}from'process';import {jsx}from'react/jsx-runtime';var ht=a(U=>{Object.defineProperty(U,"__esModule",{value:true});U.SINGLE_CHILD_SURFACE_COMPONENTS=U.RESERVED_SURFACE_COMPONENT_TYPES=U.SURFACE_COMPONENT_TYPES=U.SURFACE_COMPONENT_CATALOG=U.SURFACE_BADGE_TONES=U.SURFACE_TONES=U.SURFACE_TEXT_TRANSFORMS=U.SURFACE_VALUE_FORMATS=void 0;U.SURFACE_VALUE_FORMATS=["text","number","compact","percent","currency","bytes","duration","date","datetime","time","list","json","boolean"];U.SURFACE_TEXT_TRANSFORMS=["capitalize","title","upper","lower","humanize"];U.SURFACE_TONES=["default","muted","success","warning","error","info"];U.SURFACE_BADGE_TONES=["neutral","info","success","warning","error"];var te=(t=false)=>({type:"any",bindable:t}),_=(t=false,e)=>({type:"string",bindable:t,...e?{values:e}:{}}),z=(t=false,e={})=>({type:"number",bindable:t,...e}),Y=(t=false)=>({type:"boolean",bindable:t}),xe=(t=false,e)=>({type:"array",bindable:t,...e?{items:e}:{}}),ge=(t=false,e,n=false)=>({type:"object",bindable:t,...e?{properties:e}:{},additionalProperties:n}),De=(t,...e)=>({type:"union",bindable:t,variants:e}),p=(t,e,n={})=>({schema:t,description:e,...n}),vt=["xs","sm","md","lg"],Rn=["xs","sm","md","lg"],Et=["seconds","ms"],qe=()=>({format:p(_(false,U.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Text transform."),currency:p(_(),"ISO 4217 currency code."),unit:p(_(false,Et),"Numeric timestamp unit."),decimals:p(z(false,{integer:true,min:0,max:20}),"Fixed decimal places."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}),Ce=p(_(false,U.SURFACE_TONES),"Displayed value tone."),Ge=p(_(false,Rn),"Displayed value size."),kt=p(ge(false,void 0,te()),"Map known displayed values to labels."),xn=ge(false,{label:p(_(true),"Row label."),value:p(te(true),"Row value."),...qe(),map:kt,mono:p(Y(),"Render the value in monospace."),tone:Ce,type:p(_(false,["status"]),"Set to status to render a status pill.")},false),$n=De(false,_(),ge(false,{header:p(_(),"Column heading."),key:p(_(),"Field name inside each row.",{required:true}),...qe(),map:kt,align:p(_(false,["left","center","right"]),"Cell alignment."),mono:p(Y(),"Render cells in monospace."),tone:Ce,type:p(_(false,["status"]),"Set to status to render status pills.")},false)),On=De(false,_(),z(),ge(false,{label:p(_(),"Displayed option label."),value:p(De(false,_(),z()),"Submitted option value.",{required:true})},false)),Nn=ge(true,{key:p(_(),"Binary property key.",{required:true}),fileName:p(_(),"Original file name."),mimeType:p(_(),"MIME type."),size:p(z(false,{min:0}),"File size in bytes."),downloadUrl:p(_(),"Protected download URL.")},false),Ln=ge(false,void 0,_());U.SURFACE_COMPONENT_CATALOG={Stack:{group:"layout",summary:"Vertical stack and the default surface container.",children:"list",props:{gap:p(_(false,vt),"Spacing between children.",{default:"md"})}},Row:{group:"layout",summary:"Wrapping horizontal group.",children:"list",props:{gap:p(_(false,vt),"Spacing between children.",{default:"md"}),align:p(_(false,["start","center","end","baseline"]),"Cross-axis alignment.",{default:"center"}),justify:p(_(false,["between"]),"Set to between to push children apart.")}},Grid:{group:"layout",summary:"Responsive equal-width columns.",children:"list",props:{columns:p(z(false,{integer:true,values:[1,2,3,4]}),"Column count.",{default:2}),gap:p(_(false,vt),"Spacing between children.",{default:"md"})}},Card:{group:"layout",summary:"Bordered container with an optional header and status.",children:"single",props:{title:p(_(true),"Header title."),subtitle:p(_(true),"Header subtitle."),status:p(te(true),"Status value used to derive the header pill."),statusLabel:p(te(true),"Header status label."),statusTone:p(_(false,U.SURFACE_BADGE_TONES),"Forced status tone."),map:kt,transform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Status label transform."),dense:p(Y(),"Use tighter body padding.")}},Section:{group:"layout",summary:"Labelled group with one child.",children:"single",props:{title:p(_(true),"Section label."),description:p(_(true),"Section description."),collapsible:p(Y(),"Allow the section to be folded."),defaultOpen:p(Y(),"Initial collapsible state.",{default:true})}},Divider:{group:"layout",summary:"Horizontal rule between content blocks.",children:"none",props:{}},Form:{group:"layout",summary:"Groups wait-surface inputs and actions.",children:"list",props:{title:p(_(true),"Form heading.")}},Heading:{group:"display",summary:"A section title.",children:"none",props:{text:p(te(true),"Heading text."),level:p(z(false,{integer:true,values:[1,2,3]}),"Heading level.",{default:2}),transform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},Text:{group:"display",summary:"Body text with shared formatting.",children:"none",props:{text:p(te(true),"Value to display."),...qe(),size:Ge,weight:p(_(false,["normal","medium","semibold"]),"Font weight."),tone:Ce,muted:p(Y(),"Shorthand for the muted tone."),mono:p(Y(),"Render in monospace.")}},Badge:{group:"display",summary:"Small label with an explicit tone.",children:"none",props:{text:p(te(true),"Badge label."),tone:p(_(false,U.SURFACE_BADGE_TONES),"Badge tone.",{default:"neutral"}),format:p(_(false,U.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},StatusPill:{group:"display",summary:"Semantic status pill for statuses, booleans, and HTTP codes.",children:"none",props:{status:p(te(true),"Status value."),label:p(te(true),"Displayed label."),tone:p(_(false,U.SURFACE_BADGE_TONES),"Forced tone."),format:p(_(false,U.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},Stat:{group:"display",summary:"One prominent value with a label and caption.",children:"none",props:{label:p(_(true),"Label above the value."),value:p(te(true),"Displayed value."),caption:p(te(true),"Caption below the value."),captionTransform:p(_(false,U.SURFACE_TEXT_TRANSFORMS),"Caption transform."),...qe(),tone:Ce,mono:p(Y(),"Render the value in monospace.")}},KeyValue:{group:"display",summary:"Declared label/value entries or a bound object.",children:"none",props:{entries:p(xe(true,xn),"Declared label/value entries."),value:p(ge(true,void 0,true),"Object whose keys become labels."),humanizeKeys:p(Y(),"Humanize object keys.",{default:true}),columns:p(z(false,{integer:true,values:[1,2]}),"Pairs per row."),dense:p(Y(),"Use tighter row spacing."),mono:p(Y(),"Render shorthand values in monospace."),hideEmpty:p(Y(),"Hide missing values."),emptyText:p(_(true),"Empty-state text.")}},Table:{group:"display",summary:"Tabular view of an array.",children:"none",props:{items:p(xe(true,te()),"Rows to render."),columns:p(xe(false,$n),"Literal field names or column definitions."),dense:p(Y(),"Use tighter rows."),emptyText:p(_(true),"Empty-state text.")},limits:{renderedRows:100}},Timestamp:{group:"display",summary:"ISO or epoch timestamp.",children:"none",props:{value:p(De(true,_(),z()),"ISO string or epoch number."),format:p(_(false,["datetime","date","time","smart"]),"Timestamp format.",{default:"datetime"}),relative:p(Y(),"Display relative time."),unit:p(_(false,Et),"Numeric timestamp unit."),size:Ge,tone:Ce}},Duration:{group:"display",summary:"A duration in milliseconds or between two instants.",children:"none",props:{value:p(z(true,{min:0}),"Duration in milliseconds."),start:p(De(true,_(),z()),"Start instant."),end:p(De(true,_(),z()),"End instant."),unit:p(_(false,Et),"Numeric instant unit."),size:Ge,tone:Ce}},Money:{group:"display",summary:"A formatted currency amount.",children:"none",props:{value:p(z(true),"Currency amount."),currency:p(_(true),"ISO 4217 currency code.",{default:"USD"}),decimals:p(z(false,{integer:true,min:0,max:20}),"Fixed decimal places."),signed:p(Y(),"Colour positive and negative values."),size:Ge,tone:Ce}},Avatar:{group:"display",summary:"Initials derived from a name or email.",children:"none",props:{name:p(_(true),"Name used for initials."),email:p(_(true),"Fallback source for initials."),label:p(_(true),"Text beside the avatar."),size:p(_(false,["sm","md","lg"]),"Avatar size.",{default:"md"})}},Code:{group:"display",summary:"Monospace text block.",children:"none",props:{text:p(te(true),"Code or payload."),label:p(_(true),"Block label."),wrap:p(Y(),"Wrap long lines.")},limits:{characters:2e4}},HtmlRenderer:{group:"display",summary:"Sandboxed HTML fragment renderer.",children:"none",props:{html:p(_(true),"HTML markup."),label:p(_(true),"Frame label."),height:p(z(false,{min:80,max:1200}),"Frame height in pixels.",{default:320}),allowRemoteImages:p(Y(),"Allow remote HTTPS images.",{default:false}),emptyText:p(_(true),"Empty-state text.")},limits:{characters:2e4}},JsonInspector:{group:"display",summary:"Collapsible JSON tree and default fallback renderer.",children:"none",props:{value:p(te(true),"Any JSON value."),collapsed:p(Y(),"Start collapsed.")}},FileChip:{group:"display",summary:"Metadata and download affordance for a produced file.",children:"none",interaction:"single-action",props:{file:p(Nn,"Binary descriptor."),label:p(_(true),"Displayed file name.")}},EmailMessageCard:{group:"display",summary:"Inbox list or opened email message.",children:"none",props:{messages:p(xe(true,ge(false,void 0,true)),"Message list."),message:p(ge(true,void 0,true),"Single message."),from:p(_(true),"Sender."),to:p(_(true),"Recipients."),cc:p(_(true),"Carbon-copy recipients."),subject:p(_(true),"Subject."),snippet:p(_(true),"Preview text."),body:p(_(true),"Message body."),date:p(De(true,_(),z()),"Sent or received instant."),labels:p(xe(true,_()),"Message labels."),unread:p(Y(true),"Unread state."),fields:p(Ln,"Field-name mapping."),emptyText:p(_(true),"Empty-state text.")},limits:{renderedMessages:50}},DiffView:{group:"display",summary:"Structural JSON or line-by-line text comparison.",children:"none",props:{before:p(te(true),"Prior value."),after:p(te(true),"Proposed value."),mode:p(_(false,["json","text"]),"Comparison mode.",{default:"json"})},limits:{depth:6,children:100,lines:2e3,characters:2e5}},TextField:{group:"input",summary:"Single-line form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),placeholder:p(_(true),"Placeholder."),type:p(_(false,["text","number","email","url"]),"HTML input type.",{default:"text"}),disabled:p(Y(true),"Disabled state.")}},TextArea:{group:"input",summary:"Multi-line form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),placeholder:p(_(true),"Placeholder."),rows:p(z(false,{integer:true,min:1}),"Visible rows.",{default:3}),disabled:p(Y(true),"Disabled state.")}},Select:{group:"input",summary:"Single-choice form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),options:p(xe(true,On),"Literal or bound options."),placeholder:p(_(true),"Placeholder."),disabled:p(Y(true),"Disabled state.")}},Checkbox:{group:"input",summary:"Boolean form input.",children:"none",interaction:"input",props:{label:p(_(true),"Text beside the checkbox."),description:p(_(true),"Helper text."),disabled:p(Y(true),"Disabled state.")}},Button:{group:"action",summary:"Single-action button.",children:"none",interaction:"single-action",props:{label:p(_(true),"Button label."),variant:p(_(false,["primary","default","danger"]),"Button variant.",{default:"default"}),disabled:p(Y(true),"Disabled state.")}},ApproveRejectBar:{group:"action",summary:"Named approve/reject decision actions.",children:"none",interaction:"multi-action",actionNames:{allowed:["approve","reject"]},props:{canDecide:p(Y(true),"Whether the viewer may decide."),approveLabel:p(_(true),"Approve button label."),rejectLabel:p(_(true),"Reject button label."),disabledReason:p(_(true),"Reason actions are disabled."),commentRequired:p(Y(true),"Require a comment before rejection."),comment:p(_(true),"Current comment value."),decision:p(_(true),"Recorded decision."),decidedBy:p(_(true),"Recorded decider.")}}};U.SURFACE_COMPONENT_TYPES=Object.keys(U.SURFACE_COMPONENT_CATALOG);U.RESERVED_SURFACE_COMPONENT_TYPES=["Tabs","Accordion","Spacer","Markdown","Icon","Image","List","Tree","ProgressBar","Spinner","ErrorPanel","Timeline","RadioGroup","DatePicker","SlackMessageCard","SlackThread","CalendarEventCard","AgentRunPanel","ToolCallCard"];U.SINGLE_CHILD_SURFACE_COMPONENTS=U.SURFACE_COMPONENT_TYPES.filter(t=>U.SURFACE_COMPONENT_CATALOG[t].children==="single");});var Ht=a(ne=>{Object.defineProperty(ne,"__esModule",{value:true});ne.SURFACE_SLOTS=ne.SURFACE_SLOT_POLICY=void 0;ne.getSurfaceBindingPaths=Vt;ne.validateSurfaceDefinition=Yt;ne.validateSurfaceResource=Yn;var Mt=ht();ne.SURFACE_SLOT_POLICY={output:{actions:["navigate"],form:false},wait:{actions:["navigate","node.resume","node.stop"],form:true}};ne.SURFACE_SLOTS=Object.keys(ne.SURFACE_SLOT_POLICY);var jt=300,Wt=12,Fn=new Set(Mt.SURFACE_COMPONENT_TYPES),Un=new Set(["$output","$input","$exec","$binary"]),Pn=new Set(["text","number","date","datetime","json"]),jn=new Set(["text","textarea","number","email","url","checkbox","select","file"]);function Wn(t){return (t.startsWith("/")?t.slice(1):t).split("/",1)[0]}function Pe(t,e){if(Array.isArray(t))for(let n of t)Pe(n,e);else if(t&&typeof t=="object"){let n=t;if(typeof n.path=="string")e.push(n.path);else for(let r of Object.values(n))Pe(r,e);}}function $e(t,e){if(Array.isArray(t)){for(let r of t)$e(r,e);return}if(!t||typeof t!="object")return;let n=t;if("path"in n){typeof n.path!="string"&&e.push("Surface binding path must be a string."),n.format!==void 0&&!Pn.has(String(n.format))&&e.push(`Unknown surface binding format "${String(n.format)}".`);return}for(let r of Object.values(n))$e(r,e);}function Je(t){return !!t&&typeof t=="object"&&!Array.isArray(t)}function Mn(t){return Je(t)&&"path"in t}function Ue(t,e,n,r){if(Mn(t)){e.bindable||r.push(`${n} does not accept a surface binding.`),$e(t,r);return}if(e.type==="any")return;if(e.type==="union"){let a=e.variants.filter(i=>i.type==="any"||i.type==="union"?true:i.type==="array"?Array.isArray(t):i.type==="object"?Je(t):typeof t===i.type),c=(a.length?a:e.variants).map(i=>{let s=[];return Ue(t,i,n,s),s});c.every(i=>i.length>0)&&r.push(...c.reduce((i,s)=>s.length<i.length?s:i));return}if(e.type==="string"){if(typeof t!="string"){r.push(`${n} must be a string.`);return}e.values&&!e.values.includes(t)&&r.push(`${n} must be one of ${e.values.join(", ")}.`),e.maxLength!==void 0&&t.length>e.maxLength&&r.push(`${n} cannot exceed ${e.maxLength} characters.`);return}if(e.type==="number"){if(typeof t!="number"||!Number.isFinite(t)){r.push(`${n} must be a finite number.`);return}e.integer&&!Number.isInteger(t)&&r.push(`${n} must be an integer.`),e.min!==void 0&&t<e.min&&r.push(`${n} must be at least ${e.min}.`),e.max!==void 0&&t>e.max&&r.push(`${n} cannot exceed ${e.max}.`),e.values&&!e.values.includes(t)&&r.push(`${n} must be one of ${e.values.join(", ")}.`);return}if(e.type==="boolean"){typeof t!="boolean"&&r.push(`${n} must be a boolean.`);return}if(e.type==="array"){if(!Array.isArray(t)){r.push(`${n} must be an array.`);return}e.maxItems!==void 0&&t.length>e.maxItems&&r.push(`${n} cannot contain more than ${e.maxItems} items.`),e.items&&t.forEach((a,c)=>Ue(a,e.items,`${n}[${c}]`,r));return}if(!Je(t)){r.push(`${n} must be an object.`);return}let o=e.properties??{};for(let[a,c]of Object.entries(o))c.required&&!(a in t)&&r.push(`${n}.${a} is required.`);for(let[a,c]of Object.entries(t)){let i=o[a];if(i){Ue(c,i.schema,`${n}.${a}`,r);continue}e.additionalProperties===false||e.additionalProperties===void 0?r.push(`${n} has unknown field "${a}".`):e.additionalProperties!==true&&Ue(c,e.additionalProperties,`${n}.${a}`,r);}}function Vn(t,e,n){let r=t.props;if(!(r===void 0||!Je(r))){for(let[o,a]of Object.entries(e.props))a.required&&!(o in r)&&n.push(`Component "${t.id}" prop "${o}" is required.`);for(let[o,a]of Object.entries(r)){if(o==="bind")continue;let c=e.props[o];if(!c){n.push(`Component "${t.id}" (${t.type}) has unknown prop "${o}".`);continue}Ue(a,c.schema,`Component "${t.id}" prop "${o}"`,n);}}}function Vt(t){let e=[];for(let n of t.components??[])!n||typeof n!="object"||(Pe(n.props,e),Pe(n.actions,e));return Pe(t.form,e),Array.from(new Set(e))}function Yt(t,e){let n=[];try{new TextEncoder().encode(JSON.stringify(t)).byteLength>256*1024&&n.push("Surface definition exceeds 256 KiB.");}catch{return ["Surface definition must be JSON serializable."]}if(t?.schema!=="kit.ui/v1"&&n.push('Surface schema must be "kit.ui/v1".'),!Array.isArray(t?.components)||t.components.length===0)return [...n,"Surface requires at least one component."];t.components.length>jt&&n.push(`Surface cannot exceed ${jt} components.`);let r=new Map;for(let i of t.components){if(!i||typeof i!="object"||Array.isArray(i)){n.push("Every surface component must be an object.");continue}let s=i;if(typeof s.id!="string"||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(s.id)||typeof s.type!="string"){n.push("Every surface component requires id and type.");continue}r.has(s.id)&&n.push(`Duplicate component id "${s.id}".`),r.set(s.id,s),Fn.has(s.type)||n.push(`Unknown component type "${s.type}".`);let d=Mt.SURFACE_COMPONENT_CATALOG[s.type];s.props!==void 0&&(!s.props||typeof s.props!="object"||Array.isArray(s.props))&&n.push(`Component "${s.id}" props must be an object.`),d&&Vn(s,d,n),s.children!==void 0&&!Array.isArray(s.children)?n.push(`Component "${s.id}" children must be an array.`):s.children?.length&&d?.children==="none"?n.push(`Component "${s.id}" cannot have children.`):s.children&&s.children.length>1&&d?.children==="single"&&n.push(`Component "${s.id}" can have at most one child.`);let l=s.props?.bind;if(l!==void 0&&(d?.interaction!=="input"?n.push(`Component "${s.id}" cannot bind form state.`):(!ne.SURFACE_SLOT_POLICY[e].form||typeof l!="string"||!(l==="/$form"||l.startsWith("/$form/")||l.startsWith("$form.")))&&n.push(`Component "${s.id}" requires a wait-surface $form binding.`)),s.actions!==void 0&&(!s.actions||typeof s.actions!="object"||Array.isArray(s.actions))){n.push(`Component "${s.id}" actions must be an object.`);continue}let k=Object.keys(s.actions??{}).length;if(k&&!["single-action","multi-action"].includes(d?.interaction??"")?n.push(`Component "${s.id}" cannot have actions.`):k>1&&d?.interaction==="single-action"&&n.push(`Component "${s.id}" can have at most one action.`),d?.actionNames){let f=Object.keys(s.actions??{});for(let w of d.actionNames.required??[])f.includes(w)||n.push(`Component "${s.id}" requires action "${w}".`);for(let w of f)d.actionNames.allowed&&!d.actionNames.allowed.includes(w)&&n.push(`Component "${s.id}" does not support action "${w}".`);}$e(s.props,n);for(let f of Object.values(s.actions??{})){if(!f||typeof f!="object"||Array.isArray(f)){n.push(`Component "${s.id}" has an invalid action.`);continue}let w=f;if(!["navigate","node.resume","node.stop"].includes(w.type)){n.push(`Unknown surface action "${String(w.type)}".`);continue}ne.SURFACE_SLOT_POLICY[e].actions.includes(w.type)||n.push(`Action "${w.type}" is not allowed on "${e}" surfaces.`),w.type==="navigate"&&(!w.href||typeof w.href!="object"||typeof w.href.path!="string")&&n.push("Navigate actions require an href binding."),$e(w,n);}}(typeof t.root!="string"||!r.has(t.root))&&n.push(`Surface root "${String(t.root)}" is missing.`);let o=new Set,a=new Set,c=(i,s)=>{if(s>Wt)return void n.push(`Surface component depth exceeds ${Wt}.`);if(a.has(i))return void n.push(`Surface component cycle includes "${i}".`);if(o.has(i))return;let d=r.get(i);if(d){a.add(i);for(let l of Array.isArray(d.children)?d.children:[]){if(typeof l!="string"){n.push(`Component "${i}" has a non-string child reference.`);continue}r.has(l)?c(l,s+1):n.push(`Component "${i}" references missing child "${l}".`);}a.delete(i),o.add(i);}};typeof t.root=="string"&&c(t.root,1);for(let i of r.keys())o.has(i)||n.push(`Component "${i}" is unreachable from root.`);for(let i of Vt(t)){let s=Wn(i);s==="$form"&&!ne.SURFACE_SLOT_POLICY[e].form?n.push(`Binding "${i}" is only allowed on wait surfaces.`):s!=="$form"&&!Un.has(s)&&n.push(`Invalid surface binding path "${i}".`);}if(t.form!==void 0)if(ne.SURFACE_SLOT_POLICY[e].form||n.push("Forms are only allowed on wait surfaces."),!Array.isArray(t.form?.fields))n.push("Surface form fields must be an array.");else {let i=new Set;for(let s of t.form.fields){if(!s||typeof s!="object"||Array.isArray(s)){n.push("Every surface form field must be an object.");continue}let d=s,l=d?.name,k=d?.type;typeof l!="string"||!l||i.has(l)?n.push(`Surface form field name "${String(l)}" is invalid or duplicated.`):i.add(l),jn.has(String(k))||n.push(`Unknown surface form field type "${String(k)}".`),(typeof d.label!="string"||!d.label.trim())&&n.push(`Surface form field "${String(l)}" requires a label.`),k==="file"&&"default"in d&&n.push(`File field "${String(l)}" cannot have a default binding.`),k==="file"&&(d.maxFiles!==void 0&&(!Number.isInteger(d.maxFiles)||Number(d.maxFiles)<1||Number(d.maxFiles)>5)&&n.push(`File field "${String(l)}" maxFiles must be between 1 and 5.`),d.maxBytes!==void 0&&(!Number.isInteger(d.maxBytes)||Number(d.maxBytes)<1||Number(d.maxBytes)>10*1024*1024)&&n.push(`File field "${String(l)}" maxBytes exceeds platform limits.`),d.accept!==void 0&&(!Array.isArray(d.accept)||d.accept.some(f=>typeof f!="string"||!/^[a-z0-9.+-]+\/(?:[a-z0-9.+-]+|\*)$/i.test(f)))&&n.push(`File field "${String(l)}" has invalid MIME types.`)),k==="select"&&(!Array.isArray(d.options)||d.options.length===0?n.push(`Select field "${String(l)}" requires options.`):d.options.some(f=>!f||typeof f!="object"||typeof f.label!="string"||typeof f.value!="string")&&n.push(`Select field "${String(l)}" has invalid options.`));}$e(t.form,n);}return Array.from(new Set(n))}function Yn(t){let e=t;if(!e||typeof e!="object")return ["Surface must be an object."];let n=[];return (typeof e.id!="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(e.id))&&n.push("Surface requires a kebab-case id."),(typeof e.name!="string"||!e.name.trim())&&n.push("Surface requires a name."),ne.SURFACE_SLOTS.includes(e.slot)?n.push(...Yt(e.definition,e.slot)):n.push(`Surface requires slot ${ne.SURFACE_SLOTS.map(r=>`"${r}"`).join(" or ")}.`),Array.from(new Set(n))}});var Bt=a(q=>{var Hn=q&&q.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var o=Object.getOwnPropertyDescriptor(e,n);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:true,get:function(){return e[n]}}),Object.defineProperty(t,r,o);}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n];})),Bn=q&&q.__exportStar||function(t,e){for(var n in t)n!=="default"&&!Object.prototype.hasOwnProperty.call(e,n)&&Hn(e,t,n);};Object.defineProperty(q,"__esModule",{value:true});q.SURFACE_VALUE_FORMATS=q.SURFACE_TONES=q.SURFACE_TEXT_TRANSFORMS=q.SURFACE_COMPONENT_TYPES=q.SURFACE_COMPONENT_CATALOG=q.SURFACE_BADGE_TONES=q.SINGLE_CHILD_SURFACE_COMPONENTS=q.RESERVED_SURFACE_COMPONENT_TYPES=void 0;var Ee=ht();Object.defineProperty(q,"RESERVED_SURFACE_COMPONENT_TYPES",{enumerable:true,get:function(){return Ee.RESERVED_SURFACE_COMPONENT_TYPES}});Object.defineProperty(q,"SINGLE_CHILD_SURFACE_COMPONENTS",{enumerable:true,get:function(){return Ee.SINGLE_CHILD_SURFACE_COMPONENTS}});Object.defineProperty(q,"SURFACE_BADGE_TONES",{enumerable:true,get:function(){return Ee.SURFACE_BADGE_TONES}});Object.defineProperty(q,"SURFACE_COMPONENT_CATALOG",{enumerable:true,get:function(){return Ee.SURFACE_COMPONENT_CATALOG}});Object.defineProperty(q,"SURFACE_COMPONENT_TYPES",{enumerable:true,get:function(){return Ee.SURFACE_COMPONENT_TYPES}});Object.defineProperty(q,"SURFACE_TEXT_TRANSFORMS",{enumerable:true,get:function(){return Ee.SURFACE_TEXT_TRANSFORMS}});Object.defineProperty(q,"SURFACE_TONES",{enumerable:true,get:function(){return Ee.SURFACE_TONES}});Object.defineProperty(q,"SURFACE_VALUE_FORMATS",{enumerable:true,get:function(){return Ee.SURFACE_VALUE_FORMATS}});Bn(Ht(),q);});var Ke=class extends Error{constructor(){super("401 Unauthorized"),this.name="UnauthorizedError";}};function bn(t,e=Date.now()){return t-e<3e4}async function K(t){let e$1=new a$4,r=await(async()=>await e$1.withLock(async()=>{b$1.info("Tokens read from disk for auth check");let o=await e$1.get();if(o||(b$1.error("No tokens found on disk"),render(ve.createElement(c$1,{state:{type:"login_error",message:"Not logged in",detail:"run `culvii login`"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),!bn(o.expiresAt))return b$1.info("Access token valid, skipping refresh"),o.accessToken;b$1.info("Access token expired, attempting refresh");let a=`https://${q.cognitoDomain}/oauth2/token`,c=new URLSearchParams;c.set("grant_type","refresh_token"),c.set("refresh_token",o.refreshToken),c.set("client_id",q.clientId);let i;try{i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});}catch(k){b$1.error("Network error during refresh",{error:k.message}),render(ve.createElement(c$1,{state:{type:"login_error",message:"Refresh failed",detail:"Cannot reach auth server \u2014 check your connection"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1);}let s=await i.json();(!i.ok||s.error==="invalid_grant")&&(b$1.warn("Refresh failed with invalid_grant"),await e$1.delete(),render(ve.createElement(c$1,{state:{type:"login_error",message:"Session expired",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1));let d=Date.now(),l=d+s.expires_in*1e3;return b$1.info("Refresh succeeded",{expiresAt:l}),await e$1.set({accessToken:s.access_token,refreshToken:s.refresh_token||o.refreshToken,idToken:s.id_token||o.idToken,expiresAt:l,tokenType:"Bearer",scope:o.scope,issuedAt:d,issuer:o.issuer}),s.access_token}))();try{await t(r);}catch(o){if(!(o instanceof Ke))throw o;b$1.info("Mid-session 401 detected, attempting refresh");let a=await e$1.withLock(async()=>{b$1.info("Tokens read from disk for retry");let c=await e$1.get();c||(b$1.error("No tokens found on disk during retry"),render(ve.createElement(c$1,{state:{type:"login_error",message:"Not logged in",detail:"run `culvii login`"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),b$1.info("Access token expired (forced by 401), attempting refresh");let i=`https://${q.cognitoDomain}/oauth2/token`,s=new URLSearchParams;s.set("grant_type","refresh_token"),s.set("refresh_token",c.refreshToken),s.set("client_id",q.clientId);let d;try{d=await fetch(i,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:s.toString()});}catch(w){b$1.error("Network error during refresh retry",{error:w.message}),render(ve.createElement(c$1,{state:{type:"login_error",message:"Refresh failed",detail:"Cannot reach auth server \u2014 check your connection"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1);}let l=await d.json();(!d.ok||l.error==="invalid_grant")&&(b$1.warn("Refresh retry failed with invalid_grant"),await e$1.delete(),render(ve.createElement(c$1,{state:{type:"login_error",message:"Session expired",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1));let k=Date.now(),f=k+l.expires_in*1e3;return b$1.info("Refresh retry succeeded",{expiresAt:f}),await e$1.set({accessToken:l.access_token,refreshToken:l.refresh_token||c.refreshToken,idToken:l.id_token||c.idToken,expiresAt:f,tokenType:"Bearer",scope:c.scope,issuedAt:k,issuer:c.issuer}),l.access_token});try{b$1.info("Retry after refresh succeeded"),await t(a);}catch(c){throw c instanceof Ke&&(b$1.error("Retry after refresh failed (still 401)"),await e$1.withLock(async()=>{await e$1.delete();}),render(ve.createElement(c$1,{state:{type:"login_error",message:"Session invalidated",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),c}}}async function gt(){let t=new a$4;return t.withLock(async()=>{let e=await t.get();if(!e)return null;let n=`https://${q.cognitoDomain}/oauth2/token`,r=new URLSearchParams;r.set("grant_type","refresh_token"),r.set("refresh_token",e.refreshToken),r.set("client_id",q.clientId);let o;try{o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});}catch(s){return b$1.error("Network error during silent refresh",{error:s.message}),null}let a=await o.json();if(!o.ok||a.error==="invalid_grant")return b$1.warn("Silent refresh failed",{error:a.error}),null;let c=Date.now(),i=c+a.expires_in*1e3;return await t.set({accessToken:a.access_token,refreshToken:a.refresh_token||e.refreshToken,idToken:a.id_token||e.idToken,expiresAt:i,tokenType:"Bearer",scope:e.scope,issuedAt:c,issuer:e.issuer}),a.access_token})}async function V(t){let e=await t.text();try{let n=JSON.parse(e);if(n.error)return n.error}catch{}return e}async function W(t,e,n={}){let{skipEnvironmentHeader:r,...o$1}=n,c=await new a$3().read({exitOnError:false}),i=c.contexts[c.active],s=i?.tenant_id,d=i?.environment||"dev",l=o()??d,k$1=i?.environment_ids?.[l]??(l===d?i?.environment_id:void 0),f=k[l],w=r?{}:k$1?{"x-environment-id":k$1}:{"x-environment-slug":f},m={Authorization:`Bearer ${e}`,...s?{"x-tenant-id":s}:{},...w,...o$1.headers||{}};return fetch(t,{...o$1,headers:m})}function Ut(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Pt(t){let e$1=t.command("workspace").description("Workspace commands").option("--env <env>","Target environment (sandbox or prod)");e$1.command("create").description("Create a new workspace").requiredOption("--name <name>","Workspace name").requiredOption("--slug <slug>","Workspace slug").action(async n=>{if(Ut()){let c=function(){let[i,s]=ve.useState({type:"loading"});return ve.useEffect(()=>(a=s,()=>{a=null;}),[]),ve.createElement(o,{state:i})};let{WorkspaceCreateView:o}=await import('./WorkspaceView-ID7ZMBHV.js'),a=null;await G(Promise.resolve(ve.createElement(c))),await K(async i=>{let{apiUrl:s$1,context:d$1}=await r({env:e$1.opts().env}),l=s(d$1);try{let k=await W(`${s$1}/api/workspaces`,i,{method:"POST",headers:{...l,"Content-Type":"application/json"},body:JSON.stringify({name:n.name,slug:n.slug,tenantId:d$1.tenant_id})});if(!k.ok){let T=await V(k);a?.({type:"error",message:"Failed to create workspace",detail:`Server responded with ${k.status}: ${T}`});let{userId:I,tenantId:x}=await d();I?await f(a$1.WORKSPACE_CREATE_FAILED,I,x,{error_class:"ApiError",slug:n.slug,env:d$1.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:"ApiError",slug:n.slug,env:d$1.environment}),await j();return}let f$1=await k.json();a?.({type:"success",id:f$1?.data?.workspaceId,slug:f$1?.data?.workspaceSlug||n.slug,name:n.name});let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_CREATED,w,m,{slug:n.slug,env:d$1.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:d$1.environment}),await j();}catch(k){a?.({type:"error",message:"Unexpected error",detail:k.message});let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.WORKSPACE_CREATE_FAILED,f$1,w,{error_class:k?.constructor?.name,env:d$1.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:k?.constructor?.name,env:d$1.environment}),await j();}});return}await K(async o=>{let{apiUrl:a,context:c}=await r({env:e$1.opts().env}),i=s(c);console.log(`tenant: ${c.tenant_slug} | workspace: N/A | env: ${c.environment}`);try{let s=await W(`${a}/api/workspaces`,o,{method:"POST",headers:{...i,"Content-Type":"application/json"},body:JSON.stringify({name:n.name,slug:n.slug,tenantId:c.tenant_id})});if(!s.ok){let f$1=await V(s);console.error(`Error: Failed to create workspace. Server responded with ${s.status}: ${f$1}`);let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_CREATE_FAILED,w,m,{error_class:"ApiError",slug:n.slug,env:c.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:"ApiError",slug:n.slug,env:c.environment}),await j(),process.exit(1);}let d$1=await s.json();console.log(`${w} Workspace created successfully.`),console.log(` ID: ${d$1?.data?.workspaceId}`),d$1?.data?.workspaceSlug&&console.log(` Slug: ${d$1?.data?.workspaceSlug}`);let{userId:l,tenantId:k}=await d();l?await f(a$1.WORKSPACE_CREATED,l,k,{slug:n.slug,env:c.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:c.environment}),await j();}catch(s){console.error(`Error: Network or unexpected error: ${s.message}`);let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.WORKSPACE_CREATE_FAILED,d$1,l,{error_class:s?.constructor?.name,env:c.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:s?.constructor?.name,env:c.environment}),await j(),process.exit(1);}});}),e$1.command("list").description("List workspaces").action(async()=>{if(Ut()){let a=function(){let[c,i]=ve.useState({type:"loading"});return ve.useEffect(()=>(o=i,()=>{o=null;}),[]),ve.createElement(r$1,{state:c})};let{WorkspaceListView:r$1}=await import('./WorkspaceView-ID7ZMBHV.js'),o=null;await G(Promise.resolve(ve.createElement(a))),await K(async c=>{let{apiUrl:i,context:s$1}=await r({env:e$1.opts().env}),d$1=s(s$1);try{let l=await W(`${i}/api/workspaces?tenantId=${s$1.tenant_id}`,c,{headers:d$1});if(!l.ok){let T=await V(l);o?.({type:"error",message:"Failed to list workspaces",detail:`Server responded with ${l.status}: ${T}`});let{userId:I,tenantId:x}=await d();I?await f(a$1.WORKSPACE_LIST_FAILED,I,x,{error_class:"ApiError",env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"ApiError",env:s$1.environment}),await j();return}let f$1=(await l.json())?.data?.workspaces;if(!Array.isArray(f$1)){o?.({type:"error",message:"Unexpected response format"});let{userId:T,tenantId:I}=await d();T?await f(a$1.WORKSPACE_LIST_FAILED,T,I,{error_class:"UnexpectedResponse",env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"UnexpectedResponse",env:s$1.environment}),await j();return}o?.({type:"success",workspaces:f$1.map(T=>({id:T.id,name:T.name,slug:T.slug??""}))});let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_LISTED,w,m,{env:s$1.environment}):await e(a$1.WORKSPACE_LISTED,{env:s$1.environment}),await j();}catch(l){o?.({type:"error",message:"Unexpected error",detail:l.message});let{userId:k,tenantId:f$1}=await d();k?await f(a$1.WORKSPACE_LIST_FAILED,k,f$1,{error_class:l?.constructor?.name,env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:l?.constructor?.name,env:s$1.environment}),await j();}});return}await K(async r$1=>{let{apiUrl:o,context:a}=await r({env:e$1.opts().env}),c=s(a);console.log(`tenant: ${a.tenant_slug} | workspace: N/A | env: ${a.environment}`);try{let i=await W(`${o}/api/workspaces?tenantId=${a.tenant_id}`,r$1,{headers:c});if(!i.ok){let f$1=await V(i);console.error(`Error: Failed to list workspaces. Server responded with ${i.status}: ${f$1}`);let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_LIST_FAILED,w,m,{error_class:"ApiError",env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"ApiError",env:a.environment}),await j(),process.exit(1);}let d$1=(await i.json())?.data?.workspaces;if(!Array.isArray(d$1)){console.error("Error: Unexpected response format");let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.WORKSPACE_LIST_FAILED,f$1,w,{error_class:"UnexpectedResponse",env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"UnexpectedResponse",env:a.environment}),await j(),process.exit(1);}for(let f of d$1)console.log(`${f.id} ${f.name} ${f.slug}`);let{userId:l,tenantId:k}=await d();l?await f(a$1.WORKSPACE_LISTED,l,k,{env:a.environment}):await e(a$1.WORKSPACE_LISTED,{env:a.environment}),await j();}catch(i){console.error(`Error: Network or unexpected error: ${i.message}`);let{userId:s,tenantId:d$1}=await d();s?await f(a$1.WORKSPACE_LIST_FAILED,s,d$1,{error_class:i?.constructor?.name,env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:i?.constructor?.name,env:a.environment}),await j(),process.exit(1);}});});}function wt(t,e,n){let r=null,o=0,a=false,c=[],i=new Map,s=null,d=null,l=0,k=[1e3,2e3,4e3,8e3,16e3];function f(){s&&(clearInterval(s),s=null),d&&(clearTimeout(d),d=null),l=0;}function w(){f(),s=setInterval(()=>{if(!r||r.readyState!==mt.OPEN)return;let R=Date.now().toString()+"-"+Math.random().toString();r.send(JSON.stringify({type:"client-ping",requestId:R})),d=setTimeout(()=>{l++,l>=2&&(b$1.warn("devSync WebSocket dead (missed 2 pongs), terminating"),f(),r?.terminate());},5e3);},2e4);}function m(R){R.removeAllListeners(),R.on("error",()=>{});try{R.terminate();}catch(N){b$1.warn("devSync error terminating stale socket",{error:N.message});}}let T=0;async function I(){if(a)return;let R=++T,N;try{N=await e();}catch(S){b$1.error("devSync failed to obtain headers for connection",{error:S.message}),R===T&&x();return}if(a||R!==T)return;r&&m(r);let y=new mt(t,{headers:N});r=y,y.on("open",()=>{if(r===y){o=0,b$1.info("devSync WebSocket connected",{url:t}),n.onOpen();for(let S of c)y.send(JSON.stringify(S));c=[],w();}}),y.on("message",S=>{if(r!==y)return;let h=Buffer.isBuffer(S)?S.toString("utf-8"):S instanceof ArrayBuffer?Buffer.from(S).toString("utf-8"):Buffer.concat(S).toString("utf-8"),g;try{g=JSON.parse(h);}catch{b$1.warn("Received invalid JSON from devSync",{raw:h});return}if(g.ok===true&&g.slug&&typeof g.warning=="string"){n.onWarning?.(g.slug,g.warning);return}if(g.type==="session-probe"&&typeof g.requestId=="string"){y.send(JSON.stringify({type:"session-pong",requestId:g.requestId}));return}if(g.type==="client-pong"){d&&(clearTimeout(d),d=null),l=0;return}if(g.ok===true&&g.slug&&g.type==="validation-error"){n.onValidationErrorAck?.(g.slug);return}if(g.ok===true&&g.slug){g.resourceId&&i.set(g.slug,g.resourceId),n.onAck(g.slug,g.resourceId,g.orphaned===true);return}if(g.ok===false&&g.slug){n.onError(g.slug,g.error||"Unknown error");return}if(g.ok===false&&!g.slug){n.onFatal(g.error||"Fatal error from server"),a=true,f(),y.close();return}}),y.on("unexpected-response",(S,h)=>{if(r===y){if(h.statusCode===401){b$1.error("devSync credentials rejected (401)"),a=true,f(),y.terminate(),n.onAuthFailure?n.onAuthFailure():n.onFatal("Credentials rejected by server (401)");return}b$1.warn("devSync unexpected handshake response",{statusCode:h.statusCode}),f(),y.terminate(),x();}}),y.on("close",S=>{r!==y||a||(b$1.warn("devSync WebSocket closed",{code:S}),f(),x());}),y.on("error",S=>{r===y&&b$1.error("devSync WebSocket error",{error:S.message});});}function x(){if(f(),a)return;if(o>=k.length){let y=`devSync PERMANENT FAILURE: giving up after ${k.length} retries`;b$1.error(y,{retryCount:o,retryDelaysMs:k}),n.onFatal(y),a=true;return}let R=k[o];o++;let N=k.length-o;b$1.info(`devSync reconnecting in ${R}ms (attempt ${o}/${k.length}, ${N} left before permanent failure)`),setTimeout(()=>{I();},R);}function J(R){r&&r.readyState===mt.OPEN?r.send(JSON.stringify(R)):c.push(R);}function H(){a=true,f(),r&&m(r),b$1.info("devSync WebSocket closed by client");}function D(){a||(f(),o=0,r&&m(r),I());}return I(),{send:J,close:H,reconnectNow:D}}var Gt=b(Bt(),1);var Xn=fileURLToPath(import.meta.url),Zn=dirname(Xn),Qn=join(Zn,"lib","evaluator.js"),er=createRequire(import.meta.url),tr=er.resolve("tsx/cli");async function je(t){try{let r=await ce.readFile(re.join(t,"culvii.yaml"),"utf-8"),o=[],a=!1;for(let c of r.split(`
3
- `)){if(c.trim().startsWith("entrypoints:")){a=!0;continue}if(!a)continue;let i=c.match(/^\s+-\s+(.+)$/);i?o.push(re.resolve(t,i[1].trim())):c.trim()&&!c.trim().startsWith("#")&&(a=!1);}if(o.length)return o}catch{}let e=[];async function n(r){let o;try{o=await ce.readdir(r,{withFileTypes:!0});}catch{return}for(let a of o){if(a.name.startsWith(".")||a.name==="node_modules"||a.name==="dist")continue;let c=re.join(r,a.name);a.isDirectory()?await n(c):a.isFile()&&a.name.endsWith(".culvii.ts")&&e.push(c);}}return await n(t),e}function We(t,e={}){return new Promise((n,r)=>{if(!t.length)return n([]);let o=spawn(process.execPath,[tr,Qn,...t],{env:{...process.env,...e,CULVII_DEV:"true"},stdio:["ignore","pipe","pipe"]}),a="",c="",i=false;o.stdout.on("data",s=>a+=s.toString()),o.stderr.on("data",s=>c+=s.toString()),o.on("error",s=>{i||(i=true,r(s));}),o.on("close",s=>{if(i)return;if(i=true,s!==0){r(new Error(`Evaluator exited with code ${s}. ${c.trim()||"Check your files for syntax or validation errors."}`));return}let d=[],l=new Set,k=a.split(`
4
- `).filter(f=>f.includes("__culvii_dev_definitions__"));for(let f of k)try{let w=JSON.parse(f);for(let m of w.__culvii_dev_definitions__||[]){let T=m?.definition?.id,I=m?.type&&T?`${m.type}:${T}`:null;I&&l.has(I)||(I&&l.add(I),d.push(m));}}catch{}n(d);});})}function ze(t){return (0, Gt.validateSurfaceResource)(t)}function At(t){if(Array.isArray(t))return t.map(At);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=At(t[n]);return e}return t}function ar(t){if(!t||typeof t!="object")return t;let e={...t};return Array.isArray(e.nodes)&&(e.nodes=e.nodes.map(({id:n,...r})=>r)),e}function sr(t){return createHash("sha256").update(JSON.stringify(At(ar(t)))).digest("hex")}function ke(t){return (Array.isArray(t?.nodes)?t.nodes:[]).filter(n=>n?.type==="core.agent").map(n=>n?.nodeParams?.agentReferenceKey??n?.nodeParams?.agentId).filter(n=>typeof n=="string"&&!n.startsWith("agt_"))}function Xe(t){return (Array.isArray(t?.nodes)?t.nodes:[]).flatMap(n=>["output","wait"].map(r=>n?.ui?.[r]).filter(r=>r?.kind==="custom"&&typeof r.surfaceKey=="string").map(r=>({surfaceKey:r.surfaceKey,...Number.isInteger(r.version)?{version:r.version}:{}})))}function or(t){return Array.isArray(t)?t:t&&typeof t=="object"?Object.entries(t).map(([e,n])=>n&&typeof n=="object"&&!Array.isArray(n)?{name:e,...n}:n):[]}function Oe(t){return or(t?.tools).filter(e=>e&&typeof e=="object"&&!Array.isArray(e)).map(e=>({referenceKey:e.workflowReferenceKey??e.workflowId,toolName:e.name,triggerNodeName:e.triggerNodeName})).filter(e=>typeof e.referenceKey=="string"&&!e.referenceKey.startsWith("wfl_"))}function Ne(t){return Oe(t).map(e=>e.referenceKey)}function ir(t){return typeof t?.type=="string"&&t.type!=="manualTrigger"&&t.type.endsWith("Trigger")}function cr(t,e){return t.get(e)??t.get(M(e))}function qt(t){let e=new Set,n=[];for(let r of t.values())e.has(r.id)||(e.add(r.id),n.push(r));return n}function Jt(t,e){let n=typeof t?.id=="string"?t.id:"unknown";if(Oe(t).length>0)return {id:n,definition:t};let r=n==="unknown"?void 0:cr(e,n);return r?{id:n,definition:r.definition}:t&&typeof t=="object"&&!Array.isArray(t)?{id:n,definition:t}:null}function It(t,e){let n=[t];for(let r of t.definition?.secondaryAgents??[]){let o=Jt(r,e);o&&n.push(o);}return n}function Ze(t){let e=new Map,n=new Map;for(let a of t){let c=a.definition?.id;typeof c=="string"&&(a.type==="agent"?(e.set(c,{id:c,definition:a.definition}),e.set(M(c),{id:c,definition:a.definition})):a.type==="workflow"&&(n.set(c,a.definition),n.set(M(c),a.definition)));}let r=new Set;for(let a of qt(e))for(let c of It(a,e))for(let i of Ne(c.definition))r.add(M(i));let o=new Set;for(let a of r){let c=n.get(a);if(c)for(let i of ke(c))o.add(M(i));}for(let a of o){let c=e.get(a);if(c){if(Oe(c.definition).length>0)return `agent '${c.id}' cannot define workflow tools when invoked by an agent workflow tool.`;for(let i of c.definition?.secondaryAgents??[]){let s=Jt(i,e);if(s&&Oe(s.definition).length>0)return `secondary agent '${s.id}' referenced by agent '${c.id}' cannot define workflow tools when '${c.id}' is invoked by an agent workflow tool.`}}}return null}function Qe(t){let e=new Map,n=new Map;for(let o of t){let a=o.definition?.id;typeof a=="string"&&(o.type==="agent"?(e.set(a,{id:a,definition:o.definition}),e.set(M(a),{id:a,definition:o.definition})):o.type==="workflow"&&(n.set(a,o.definition),n.set(M(a),o.definition)));}let r=new Set;for(let o of n.values())for(let a of ke(o))r.add(M(a));for(let o of r){let a=e.get(o);if(!a)continue;let c=It(a,e);for(let i of c)for(let s of Oe(i.definition)){let d=n.get(s.referenceKey)??n.get(M(s.referenceKey));if(!(!d||ke(d).length===0))return `workflow tool '${s.toolName??"unknown"}' on agent '${i.id}' cannot reference workflow '${s.referenceKey}' because '${a.id}' is invoked by a workflow and the target workflow contains an agent node.`}}return null}function et(t){let e=new Map,n=new Map;for(let r of t){let o=r.definition?.id;typeof o=="string"&&(r.type==="agent"?(e.set(o,{id:o,definition:r.definition}),e.set(M(o),{id:o,definition:r.definition})):r.type==="workflow"&&(n.set(o,r.definition),n.set(M(o),r.definition)));}for(let r of qt(e))for(let o of It(r,e))for(let a of Oe(o.definition)){let c=n.get(a.referenceKey)??n.get(M(a.referenceKey));if(!c)continue;let i=Array.isArray(c.nodes)?c.nodes:[],s=i.find(ir);if(s)return `workflow tool '${a.toolName??"unknown"}' on agent '${o.id}' references workflow '${a.referenceKey}' with non-manual trigger '${s.name??s.type}'.`;if(a.triggerNodeName){if(i.find(k=>k?.name===a.triggerNodeName)?.type==="manualTrigger")continue;return `workflow tool '${a.toolName??"unknown"}' on agent '${o.id}' must use a manual trigger in workflow '${a.referenceKey}'.`}let d=i.filter(l=>l?.type==="manualTrigger");if(d.length!==1)return d.length===0?`workflow tool '${a.toolName??"unknown"}' on agent '${o.id}' references workflow '${a.referenceKey}' without a manual trigger.`:`workflow tool '${a.toolName??"unknown"}' on agent '${o.id}' must specify triggerNodeName because workflow '${a.referenceKey}' has multiple manual triggers.`}return null}function tt(t){let e=[],n=(r,o)=>{let a=o&&typeof o=="object"&&!Array.isArray(o)?o.credentialId:void 0;(typeof a!="string"||!a.trim())&&e.push(`agent '${r}' model must include a credentialId \u2014 use model: { provider, modelId, credentialId }.`);};t?.modelConfig!==void 0&&t?.modelConfig!==null&&n(t?.id,t.modelConfig);for(let r of t?.secondaryAgents??[])r?.modelConfig!==void 0&&r?.modelConfig!==null&&n(r?.id??t?.id,r.modelConfig);return e}function nt(t){let e=new Map;for(let o of t){let a=o.definition?.id;if(!a)continue;let c=o.type==="agent"?Ne(o.definition).map(i=>`workflow:${i}`):o.type==="workflow"?ke(o.definition).map(i=>`agent:${i}`):[];e.set(`${o.type}:${a}`,c);}let n=null;function r(o,a){if(!n)for(let c of e.get(o)??[]){if(!e.has(c))continue;let i=[...a,c];if(a.length>=3){n=`Unsupported nested SDK reference chain: ${i.join(" -> ")}. Only workflow -> agent -> workflow or agent -> workflow -> agent is supported.`;return}r(c,i);}}for(let o of e.keys())r(o,[o]);return n}function M(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").slice(0,63)}function St(t){let e=process.cwd(),n=new Map,r=null,o=false,a=false,c=false;async function i(){if(o){a=true;return}o=true;try{c&&(c=!1,n.clear()),await d();}catch(f){b$1.error("Evaluation failed",{error:f.message});}finally{o=false,a&&(a=false,i());}}function s(f,w,m){t.onLog?t.onLog(w,m):(m==="error"?process.stderr:process.stdout).write(`${f} ${w}
5
- `);}async function d(){let f=await je(e),w;try{w=await We(f);}catch(g){s(x,`Evaluation failed, skipping this sync cycle: ${g.message}`,"error");return}let m=new Map,T=new Set,I=new Set(w.map(g=>g.definition.id).filter(Boolean)),x$1=new Set(w.filter(g=>g.type==="surface").flatMap(g=>{let b=g.definition.id;return typeof b=="string"?[b,M(b)]:[]})),J=false,H=false;for(let g of w){let b=g.definition.id;if(!b){s(y,`Skipping ${g.type}: referenced resources require an explicit id.`,"warn");continue}let O=typeof b=="string"?M(b):String(b);if(!O){s(y,`Skipping definition: could not derive a valid slug from "${b}". Add an explicit id field.`,"warn");continue}if(g.type==="surface"){let j=ze(g.definition);if(j.length){s(x,`Invalid surface '${O}': ${j.join("; ")}.`,"error");return}}let L=`${g.type}:${O}`;if(T.has(L)){s(x,`Duplicate slug '${O}' detected in ${g.type}s. Fix all collisions before syncing.`,"error");return}T.add(L);let ee=sr(g.definition);m.set(L,{slug:O,type:g.type,definition:g.definition,hash:ee});let se=g.type==="agent"?Ne(g.definition):[],fe=g.type==="workflow"?ke(g.definition):[],me=g.type==="workflow"?Xe(g.definition):[];if(g.type==="agent"){for(let j of tt(g.definition))s(x,j,"error"),H=true;for(let j of g.definition.secondaryAgents||[]){let $=j?.id,le=!!(j?.systemPrompt||j?.modelConfig);if(typeof $=="string"&&!le&&!I.has($)){let ae=`Dangling ref: agent '${O}' references secondary agent '${$}' which is not defined locally.`;s(x,ae,"error"),J=true,t.onValidationError?.({resourceType:"agent",slug:O,missingReferenceId:$,message:ae});}}}for(let j of se)if(!I.has(j)){let $=`Dangling ref: agent '${O}' references workflow '${j}' which is not defined locally.`;s(x,$,"error"),J=true,t.onValidationError?.({resourceType:"agent",slug:O,missingReferenceId:j,message:$});}for(let j of fe)if(!I.has(j)){let $=`Dangling ref: workflow '${O}' references agent '${j}' which is not defined locally.`;s(x,$,"error"),J=true,t.onValidationError?.({resourceType:"workflow",slug:O,missingReferenceId:j,message:$});}for(let j of me)if(j.version===void 0&&!x$1.has(j.surfaceKey)){let $=`Dangling ref: workflow '${O}' references local surface '${j.surfaceKey}' which is not defined locally. Pin a published version or define the surface.`;s(x,$,"error"),J=true,t.onValidationError?.({resourceType:"workflow",slug:O,missingReferenceId:j.surfaceKey,message:$});}}if(J){s(x,"Fix all dangling references before syncing.","error");return}if(H){s(x,"Fix the model configuration before syncing.","error");return}let D=Ze(w);if(D){s(x,D,"error"),s(x,"Fix the secondary agent tools before syncing.","error");return}let R=et(w);if(R){s(x,R,"error"),s(x,"Fix the workflow tool trigger before syncing.","error");return}let N=Qe(w);if(N){s(x,N,"error"),s(x,"Fix the workflow tool target before syncing.","error");return}let y$1=nt(w);if(y$1){s(x,y$1,"error"),s(x,"Fix the reference chain before syncing.","error");return}let S=0;for(let[g,{hash:b,type:O}]of n.entries())if(!m.has(g)){let L=g.slice(g.indexOf(":")+1),ee=O==="agent"?[...m.values()].find(se=>se.hash===b&&se.type===O):void 0;ee?s(y,`Looks like '${L}' was renamed to '${ee.slug}'.
6
- Run: culvii rename ${L} ${ee.slug} --resource-type ${O}`,"warn"):(t.onOrphan(L,O),n.delete(g),S++);}let h=[...m.entries()].sort(([,g],[,b])=>+(b.type==="surface")-+(g.type==="surface"));for(let[g,{slug:b,type:O,definition:L,hash:ee}]of h){let se=n.get(g);(!se||se.hash!==ee)&&(n.set(g,{hash:ee,type:O}),t.onSync({type:O,slug:b,definition:L,configHash:ee}),S++);}S===0&&s(z,"No changes to sync.","info");}let l=rr.watch(e,{ignored:f=>f.includes("node_modules")||f.includes("/dist/")||f.includes("/.git/"),ignoreInitial:true,persistent:true});l.on("all",(f,w)=>{w.endsWith(".ts")&&(r&&clearTimeout(r),r=setTimeout(()=>{i();},500));});let k=false;return {close:()=>l.close(),triggerFullSync:()=>{if(k){i();return}if(k=true,o){c=true,a=true;return}n.clear(),i();}}}function lr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}var dr="https://console.culvii.com/";function Le(t,e){return `${dr}${t}/development/${e}/workflows`}function zt(){let t=new Date,e=n=>String(n).padStart(2,"0");return `${e(t.getHours())}:${e(t.getMinutes())}:${e(t.getSeconds())}`}async function ur(){let{DevView:t}=await import('./DevView-GPKSSOLA.js'),e$1=null;function n(){let[r,o]=ve.useState({type:"provisioning",message:"Starting dev server\u2026"});return ve.useEffect(()=>(e$1=o,()=>{e$1=null;}),[]),ve.createElement(t,{state:r})}await G(Promise.resolve(ve.createElement(n))),await K(async r$1=>{let o=new a$3,a=await o.read({exitOnError:!1}),c=Date.now();if(!a.active||!a.contexts[a.active]){e$1?.({type:"error",message:"No active context. Run culvii login first."});let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_FAILED,y,S,{error_class:"NoActiveContext",workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"NoActiveContext",workspace:s$1?.workspace_slug,env:s$1?.environment}),await j();return}let{apiUrl:i,context:s$1}=await r({env:"dev"}),d$1=s(s$1),l=s$1.workspace_id,k=s$1.workspace_slug;e$1?.({type:"provisioning",message:"Provisioning dev workspace\u2026"});try{let y=await W(`${i}/api/workspaces`,r$1,{method:"POST",headers:{...d$1,"Content-Type":"application/json"},body:JSON.stringify({name:`dev-${s$1.user_id.slice(0,12)}`,slug:`dev-${s$1.user_id.slice(0,12)}`,tenantId:s$1.tenant_id})});if(!y.ok){let h=await V(y);e$1?.({type:"error",message:`Failed to auto-provision workspace: ${h}`});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEV_FAILED,g,b,{error_class:"WorkspaceProvisionError",workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"WorkspaceProvisionError",workspace:s$1?.workspace_slug,env:s$1?.environment}),await j();return}let S=await y.json();await o.withLock(async()=>{a=await o.read();let h=a.contexts[a.active];h.workspace_ids={...h.workspace_ids||{},dev:S?.data?.workspaceId},h.workspace_slugs={...h.workspace_slugs||{},dev:S?.data?.workspaceSlug},h.workspace_id=S?.data?.workspaceId,h.workspace_slug=S?.data?.workspaceSlug,await o.write(a);}),s$1={...a.contexts[a.active],environment:"dev"},l=s$1.workspace_id,k=s$1.workspace_slug;}catch(y){e$1?.({type:"error",message:`Failed to auto-provision workspace: ${y.message}`});let{userId:S,tenantId:h}=await d();S?await f(a$1.DEV_FAILED,S,h,{error_class:y?.constructor?.name,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:y?.constructor?.name,workspace:s$1?.workspace_slug,env:s$1?.environment}),await j();return}let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.DEV_STARTED,f$1,w,{workspace:s$1.workspace_slug,env:s$1.environment}):await e(a$1.DEV_STARTED,{workspace:s$1.workspace_slug,env:s$1.environment});let m=[];function T(y){return {Authorization:`Bearer ${y}`,...d$1}}let I=r$1;async function x(){let y=await gt();return y&&(I=y),T(I)}let J=i.replace(/^http/,"ws")+"/api/dev/sync?workspaceId="+encodeURIComponent(l),H,D=wt(J,x,{onOpen:()=>{e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)}),H?.triggerFullSync();},onAck:(y,S,h)=>{let g={type:h?"orphaned":"synced",message:`${h?"orphaned":"synced"} ${y}`,timestamp:zt()};m.push(g),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onValidationErrorAck:()=>{},onWarning:(y,S)=>{let h={type:"warning",message:S};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onError:(y,S)=>{let h={type:"error",message:`Sync failed for ${y}: ${S}`};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onFatal:async y=>{clearInterval(N);let S=`Fatal error: ${y}. Shutting down...`;e$1?.({type:"error",message:S});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEV_FAILED,h,g,{error_class:"FatalWebSocketError",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"FatalWebSocketError",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}),H?.close(),D?.close(),be(1,S);},onAuthFailure:async()=>{clearInterval(N);let y="Your session was rejected by the server. Run `culvii login` to re-authenticate. Shutting down...";e$1?.({type:"error",message:y});let{userId:S,tenantId:h}=await d();S?await f(a$1.DEV_FAILED,S,h,{error_class:"ApiKeyRejected",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"ApiKeyRejected",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}),H?.close(),D?.close(),be(1,y);}});H=St({workspaceId:l,onSync:y=>{D.send({type:"sync",slug:y.slug,resourceType:y.type,definition:y.definition,workspaceId:l});},onOrphan:(y,S)=>{D.send({type:"orphan",slug:y,resourceType:S,workspaceId:l});},onValidationError:({resourceType:y,slug:S,missingReferenceId:h,message:g})=>{D.send({type:"validation-error",slug:S,resourceType:y,workspaceId:l,missingReferenceId:h,message:g});},onLog:(y,S)=>{let h={type:S==="error"?"error":S==="warn"?"warning":"info",message:y};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});}});let R=3e3*1e3,N=setInterval(()=>{D.reconnectNow();},R);process.on("SIGINT",async()=>{clearInterval(N),D.close(),H.close(),e$1?.({type:"disconnected"});let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_STOPPED,y,S,{duration_ms:Date.now()-c,workspace:s$1.workspace_slug,env:s$1.environment}):await e(a$1.DEV_STOPPED,{duration_ms:Date.now()-c,workspace:s$1.workspace_slug,env:s$1.environment}),await j(),process.exit(0);});});}function Xt(t){t.command("dev").description("Start the development server and file watcher").action(async()=>{if(lr()){await ur();return}await K(async e$1=>{let n=new a$3,r$1=await n.read({exitOnError:!1});if(!r$1.active||!r$1.contexts[r$1.active]){console.error("No active context. Run culvii login first.");let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_FAILED,D,R,{error_class:"NoActiveContext",workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"NoActiveContext",workspace:a?.workspace_slug,env:a?.environment}),await j(),process.exit(1);}let{apiUrl:o,context:a}=await r({env:"dev"}),c=s(a),i=Date.now(),s$1=a.workspace_id,d$1=a.workspace_slug;try{let D=await W(`${o}/api/workspaces`,e$1,{method:"POST",headers:{...c,"Content-Type":"application/json"},body:JSON.stringify({name:`dev-${a.user_id.slice(0,12)}`,slug:`dev-${a.user_id.slice(0,12)}`,tenantId:a.tenant_id})});if(!D.ok){let N=await V(D);console.error(`Failed to auto-provision workspace: ${N}`);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_FAILED,y,S,{error_class:"WorkspaceProvisionError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"WorkspaceProvisionError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),process.exit(1);}let R=await D.json();await n.withLock(async()=>{r$1=await n.read();let N=r$1.contexts[r$1.active];N.workspace_ids={...N.workspace_ids||{},dev:R?.data?.workspaceId},N.workspace_slugs={...N.workspace_slugs||{},dev:R?.data?.workspaceSlug},N.workspace_id=R?.data?.workspaceId,N.workspace_slug=R?.data?.workspaceSlug,await n.write(r$1);}),a={...r$1.contexts[r$1.active],environment:"dev"},s$1=a.workspace_id,d$1=a.workspace_slug;}catch(D){console.error(`Failed to auto-provision workspace: ${D.message}`);let{userId:R,tenantId:N}=await d();R?await f(a$1.DEV_FAILED,R,N,{error_class:D?.constructor?.name,workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:D?.constructor?.name,workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),process.exit(1);}console.log(`tenant: ${a.tenant_slug} | workspace: ${d$1||"unknown"} | env: dev`);let{userId:l,tenantId:k}=await d();l?await f(a$1.DEV_STARTED,l,k,{workspace:a.workspace_slug,env:a.environment}):await e(a$1.DEV_STARTED,{workspace:a.workspace_slug,env:a.environment});function f$1(D){return {Authorization:`Bearer ${D}`,...c}}let w$1=e$1;async function m(){let D=await gt();return D&&(w$1=D),f$1(w$1)}let T=o.replace(/^http/,"ws")+"/api/dev/sync?workspaceId="+encodeURIComponent(s$1),I,x$1=wt(T,m,{onOpen:()=>{console.log("Watching ./..."),console.log(`You can access your dev session here: ${Le(a.tenant_slug,s$1)}`),I?.triggerFullSync();},onAck:(D,R,N)=>{let y=zt();console.log(N?`${w} [${y}] orphaned ${D}`:`${w} [${y}] synced ${D}`);},onValidationErrorAck:()=>{},onWarning:(D,R)=>{console.log(`${y} ${R}`);},onError:(D,R)=>{console.log(`${y} Sync failed for ${D}: ${R}`);},onFatal:async D=>{clearInterval(H),console.error(`Fatal error: ${D}. Shutting down...`);let{userId:R,tenantId:N}=await d();R?await f(a$1.DEV_FAILED,R,N,{error_class:"FatalWebSocketError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"FatalWebSocketError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),I?.close(),x$1?.close(),process.exit(1);},onAuthFailure:async()=>{clearInterval(H),console.error(`${x} Your session was rejected by the server. Run \`culvii login\` to re-authenticate. Shutting down...`);let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_FAILED,D,R,{error_class:"ApiKeyRejected",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"ApiKeyRejected",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),I?.close(),x$1?.close(),process.exit(1);}});I=St({workspaceId:s$1,onSync:D=>{let R={type:"sync",slug:D.slug,resourceType:D.type,definition:D.definition,workspaceId:s$1};x$1.send(R);},onOrphan:(D,R)=>{let N={type:"orphan",slug:D,resourceType:R,workspaceId:s$1};x$1.send(N);},onValidationError:({resourceType:D,slug:R,missingReferenceId:N,message:y})=>{let S={type:"validation-error",slug:R,resourceType:D,workspaceId:s$1,missingReferenceId:N,message:y};x$1.send(S);}});let J=3e3*1e3,H=setInterval(()=>{x$1.reconnectNow();},J);process.on("SIGINT",async()=>{clearInterval(H),x$1.close(),I.close(),console.log("Disconnected. Draft state discarded.");let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_STOPPED,D,R,{duration_ms:Date.now()-i,workspace:a.workspace_slug,env:a.environment}):await e(a$1.DEV_STOPPED,{duration_ms:Date.now()-i,workspace:a.workspace_slug,env:a.environment}),await j(),process.exit(0);});});});}function yr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Tt(t){if(Array.isArray(t))return t.map(Tt);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Tt(t[n]);return e}return t}function gr(t){if(!t||typeof t!="object")return t;let e={...t};return Array.isArray(e.nodes)&&(e.nodes=e.nodes.map(({id:n,...r})=>r)),e}function Qt(t){return createHash("sha256").update(JSON.stringify(Tt(gr(t)))).digest("hex")}function mr(t){return new Promise(e=>{let n=fr.createInterface({input:process.stdin,output:process.stdout});n.question(t,r=>{n.close(),e(r.toLowerCase()==="y"||r.toLowerCase()==="yes");});})}function wr(t){let e=t.versionCount??1,n=t.activeVersion??t.previousVersion;return ` - ${t.slug}: deletes all ${e} ${e===1?"version":"versions"}${n?`; active is v${n}`:""}`}function Zt(t){let e=t.executions??0,n=t.activeExecutions??0,r=t.activeVersion??t.previousVersion;return `${e} total, active${r?` v${r}`:""}: ${n} executions`}async function vr(t){let{DeployView:e$1}=await import('./DeployView-D4UEXMDJ.js'),n=null,r$1=null;function o(){let[a,c]=ve.useState({type:"planning"});return ve.useEffect(()=>(n=c,()=>{n=null;}),[]),ve.createElement(e$1,{state:a,onConfirm:i=>r$1?.(i)})}await G(Promise.resolve(ve.createElement(o))),await K(async a=>{if(t.env==="dev"){n?.({type:"error",message:"Use culvii dev for local iteration"}),await j();return}if(t.env!=="sandbox"&&t.env!=="prod"){n?.({type:"error",message:"Environment must be sandbox or prod"}),await j();return}let{apiUrl:c,context:i}=await r({env:t.env}),s$1=s(i);if(!t.workspaceSlug){n?.({type:"error",message:"--workspace-slug <slug> is required for deploy",detail:"Run `culvii workspace list` to see available workspaces."});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{error_class:"NoWorkspace",workspace:t.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{error_class:"NoWorkspace",workspace:t.workspaceSlug}),await j();return}let d$1=await W(`${c}/api/workspaces?tenantId=${i.tenant_id}`,a,{headers:s$1});if(!d$1.ok){n?.({type:"error",message:"Failed to fetch workspaces",detail:await V(d$1)});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{env:t.env,error_class:"WorkspaceFetchError",workspace:t.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{env:t.env,error_class:"WorkspaceFetchError",workspace:t.workspaceSlug}),await j();return}let f$1=((await d$1.json())?.data?.workspaces||[]).find(h=>h.slug===t.workspaceSlug);if(!f$1){n?.({type:"error",message:`Workspace not found: ${t.workspaceSlug}`});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{env:t.env,workspace:t.workspaceSlug,error_class:"WorkspaceNotFound"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:t.workspaceSlug,error_class:"WorkspaceNotFound"}),await j();return}let w=f$1.id,m=async h=>{n?.({type:"error",message:h});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEPLOY_FAILED,g,b,{env:t.env,workspace:f$1?.slug,error_class:"ValidationError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"ValidationError"}),await j();},T=process.cwd(),I=await je(T),x;try{x=(await We(I)).sort((h,g)=>+(g.type==="surface")-+(h.type==="surface"));}catch(h){await m(`Deploy failed: ${h.message}`);return}let J=[],H=new Set,D=new Set(x.filter(h=>h.type==="surface").map(h=>M(h.definition.id??"")).filter(Boolean));for(let h of x){let g=h.definition.id;g&&H.add(typeof g=="string"?M(g):String(g));}for(let h of x){let g=h.definition.id;if(!g){n?.({type:"error",message:`Deploy failed: ${h.type} is missing an explicit id.`}),await j();return}let b=typeof g=="string"?M(g):String(g);if(h.type==="surface"){let O=ze(h.definition);if(O.length)return m(`Deploy failed: surface '${b}' ${O.join("; ")}.`)}if(h.type==="agent"){for(let L of tt(h.definition))return m(`Deploy failed: ${L}`);let O=h.definition.secondaryAgents||[];for(let L of O){let ee=L.id,se=!!(L?.systemPrompt||L?.modelConfig);if(ee&&!se&&!H.has(ee))return m(`Deploy failed: agent '${b}' references secondary agent '${ee}' which is not defined.`)}for(let L of Ne(h.definition))if(!H.has(M(L)))return m(`Deploy failed: agent '${b}' references workflow '${L}' which is not defined.`)}if(h.type==="workflow"){for(let O of ke(h.definition))if(!H.has(M(O)))return m(`Deploy failed: workflow '${b}' references agent '${O}' which is not defined.`);for(let O of Xe(h.definition))if(O.version===void 0&&!D.has(M(O.surfaceKey)))return m(`Deploy failed: workflow '${b}' references local surface '${O.surfaceKey}' which is not defined. Pin a published version or define the surface.`)}J.push({type:h.type,slug:b,definition:h.definition,configHash:Qt(h.definition)});}let R=Ze(x);if(R)return m(`Deploy failed: ${R}`);let N=et(x);if(N)return m(`Deploy failed: ${N}`);let y=Qe(x);if(y)return m(`Deploy failed: ${y}`);let S=nt(x);if(S)return m(`Deploy failed: ${S}`);try{let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_STARTED,h,g,{env:t.env,workspace:f$1.slug}):await e(a$1.DEPLOY_STARTED,{env:t.env,workspace:f$1.slug});let b=await W(`${c}/api/workspaces/${w}/deploys/plan`,a,{method:"POST",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({environment:t.env,definitions:J})});if(!b.ok){let ae=await V(b);n?.({type:"error",message:"Failed to plan deploy",detail:ae});let{userId:_e,tenantId:ft}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,ft,{env:t.env,workspace:f$1?.slug,error_class:"PlanError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"PlanError"}),await j();return}let O=await b.json(),L=O.plan,ee=O.planToken;if(!((L.created||[]).length>0||(L.versioned||[]).length>0||(L.destroyed||[]).length>0)){n?.({type:"no_changes"}),await j();return}if(!await new Promise(ae=>{r$1=ae,n?.({type:"confirming",plan:{created:L.created||[],versioned:L.versioned||[],destroyed:L.destroyed||[]},env:t.env});})){n?.({type:"aborted",reason:"user_cancelled"});let{userId:ae,tenantId:_e}=await d();ae?await f(a$1.DEPLOY_ABORTED,ae,_e,{env:t.env,workspace:f$1?.slug,reason:"user_cancelled"}):await e(a$1.DEPLOY_ABORTED,{env:t.env,workspace:f$1?.slug,reason:"user_cancelled"}),await j();return}n?.({type:"applying"});let me=await W(`${c}/api/workspaces/${w}/deploys/apply`,a,{method:"POST",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({planToken:ee})});if(!me.ok){let ae=await V(me);n?.({type:"error",message:"Failed to apply deploy",detail:ae});let{userId:_e,tenantId:ft}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,ft,{env:t.env,workspace:f$1?.slug,error_class:"ApplyError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"ApplyError"}),await j();return}let j$1=await me.json();n?.({type:"success",env:t.env,created:(j$1.created||[]).length,versioned:(j$1.versioned||[]).length,destroyed:(j$1.destroyed||[]).length,createdItems:j$1.created||[],versionedItems:j$1.versioned||[],destroyedItems:j$1.destroyed||[]});let{userId:$,tenantId:le}=await d();$?await f(a$1.DEPLOY_SUCCEEDED,$,le,{env:t.env,workspace:f$1.slug,created:L.created.length,versioned:L.versioned.length,destroyed:L.destroyed.length}):await e(a$1.DEPLOY_SUCCEEDED,{env:t.env,workspace:f$1.slug,created:L.created.length,versioned:L.versioned.length,destroyed:L.destroyed.length});}catch(h){n?.({type:"error",message:"Unexpected error",detail:h.message});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEPLOY_FAILED,g,b,{env:t.env,workspace:f$1?.slug,error_class:h?.constructor?.name}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:h?.constructor?.name}),await j();}});}function en(t){t.command("deploy").description("Deploy an agent").requiredOption("--env <env>","Environment (sandbox or prod)").option("--workspace-slug <slug>","Target workspace slug (overrides config)").action(async e$1=>{if(yr()){await vr(e$1);return}await K(async n=>{e$1.env==="dev"&&(console.log("Use culvii dev for local iteration"),await j(),process.exit(1)),e$1.env!=="sandbox"&&e$1.env!=="prod"&&(console.error("Environment must be sandbox or prod"),await j(),process.exit(1));let{apiUrl:r$1,context:o}=await r({env:e$1.env}),a=s(o);if(!e$1.workspaceSlug){console.error("Error: --workspace-slug <slug> is required for deploy. Run `culvii workspace list` to see available workspaces.");let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{error_class:"NoWorkspace",workspace:e$1.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{error_class:"NoWorkspace",workspace:e$1.workspaceSlug}),await j(),process.exit(1);}let c=null,i=await W(`${r$1}/api/workspaces?tenantId=${o.tenant_id}`,n,{headers:a});if(!i.ok){console.error(`Failed to fetch workspaces: ${await V(i)}`);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{env:e$1.env,error_class:"WorkspaceFetchError",workspace:e$1.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,error_class:"WorkspaceFetchError",workspace:e$1.workspaceSlug}),await j(),process.exit(1);}let l=((await i.json())?.data?.workspaces||[]).find(y=>y.slug===e$1.workspaceSlug);if(!l){console.error("Workspace not found: "+e$1.workspaceSlug);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{env:e$1.env,workspace:e$1.workspaceSlug,error_class:"WorkspaceNotFound"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:e$1.workspaceSlug,error_class:"WorkspaceNotFound"}),await j(),process.exit(1);}c=l.id;let k=e$1.workspaceSlug;console.log(`tenant: ${o.tenant_slug} | workspace: ${k} | env: ${e$1.env}`);let f$1=async y=>{console.error(y);let{userId:S,tenantId:h}=await d();S?await f(a$1.DEPLOY_FAILED,S,h,{env:e$1.env,workspace:l?.slug,error_class:"ValidationError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"ValidationError"}),await j(),process.exit(1);},w$1=process.cwd(),m=await je(w$1),T;try{T=(await We(m)).sort((y,S)=>+(S.type==="surface")-+(y.type==="surface"));}catch(y){await f$1(`Deploy failed: ${y.message}`);return}let I=[],x=new Set,J=new Set(T.filter(y=>y.type==="surface").map(y=>M(y.definition.id??"")).filter(Boolean));for(let y of T){let S=y.definition.id;S&&x.add(typeof S=="string"?M(S):String(S));}for(let y of T){let S=y.definition.id;S||(console.error(`Deploy failed: ${y.type} is missing an explicit id.`),await j(),process.exit(1));let h=typeof S=="string"?M(S):String(S);if(y.type==="surface"){let g=ze(y.definition);g.length&&await f$1(`Deploy failed: surface '${h}' ${g.join("; ")}.`);}if(y.type==="agent"){for(let b of tt(y.definition))await f$1(`Deploy failed: ${b}`);let g=y.definition.secondaryAgents||[];for(let b of g){let O=b.id,L=!!(b?.systemPrompt||b?.modelConfig);O&&!L&&!x.has(O)&&await f$1(`Deploy failed: agent '${h}' references secondary agent '${O}' which is not defined in this workspace. Define '${O}' before deploying.`);}for(let b of Ne(y.definition))x.has(M(b))||await f$1(`Deploy failed: agent '${h}' references workflow '${b}' which is not defined in this workspace. Define '${b}' before deploying.`);}if(y.type==="workflow"){for(let g of ke(y.definition))x.has(M(g))||await f$1(`Deploy failed: workflow '${h}' references agent '${g}' which is not defined in this workspace. Define '${g}' before deploying.`);for(let g of Xe(y.definition))g.version===void 0&&!J.has(M(g.surfaceKey))&&await f$1(`Deploy failed: workflow '${h}' references local surface '${g.surfaceKey}' which is not defined. Pin a published version or define the surface.`);}I.push({type:y.type,slug:h,definition:y.definition,configHash:Qt(y.definition)});}let H=Ze(T);H&&await f$1(`Deploy failed: ${H}`);let D=et(T);D&&await f$1(`Deploy failed: ${D}`);let R=Qe(T);R&&await f$1(`Deploy failed: ${R}`);let N=nt(T);N&&await f$1(`Deploy failed: ${N}`);try{let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_STARTED,y,S,{env:e$1.env,workspace:l.slug}):await e(a$1.DEPLOY_STARTED,{env:e$1.env,workspace:l.slug});let h=await W(`${r$1}/api/workspaces/${c}/deploys/plan`,n,{method:"POST",headers:{...a,"Content-Type":"application/json"},body:JSON.stringify({environment:e$1.env,definitions:I})});if(!h.ok){let $=await V(h);console.error(`Error: Failed to plan deploy. ${$}`);let{userId:le,tenantId:ae}=await d();le?await f(a$1.DEPLOY_FAILED,le,ae,{env:e$1.env,workspace:l?.slug,error_class:"PlanError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"PlanError"}),await j(),process.exit(1);}let g=await h.json(),b=g.plan,O=g.planToken;(b.created||[]).length>0||(b.versioned||[]).length>0||(b.destroyed||[]).length>0||(console.log("Nothing to deploy. All resources are up to date."),await j(),process.exit(0)),console.log(`Plan for ${e$1.env}:`);for(let $ of b.created||[])console.log(` + ${$.slug} CREATED`);for(let $ of b.versioned||[])console.log(` ~ ${$.slug} VERSIONED (${Zt($)})`);for(let $ of b.destroyed||[])console.log(` - ${$.slug} DELETE (${Zt($)})`),console.log(wr($));if(!await mr(`Deploy to ${e$1.env}? [y/N] `)){console.log("Deployment cancelled.");let{userId:$,tenantId:le}=await d();$?await f(a$1.DEPLOY_ABORTED,$,le,{env:e$1.env,workspace:l?.slug,reason:"user_cancelled"}):await e(a$1.DEPLOY_ABORTED,{env:e$1.env,workspace:l?.slug,reason:"user_cancelled"}),await j(),process.exit(0);}let se=await W(`${r$1}/api/workspaces/${c}/deploys/apply`,n,{method:"POST",headers:{...a,"Content-Type":"application/json"},body:JSON.stringify({planToken:O})});if(!se.ok){let $=await V(se);console.error(`Error: Failed to apply deploy. ${$}`);let{userId:le,tenantId:ae}=await d();le?await f(a$1.DEPLOY_FAILED,le,ae,{env:e$1.env,workspace:l?.slug,error_class:"ApplyError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"ApplyError"}),await j(),process.exit(1);}let fe=await se.json();console.log(`${w} Deployed to ${e$1.env}`),console.log(` Created: ${(fe.created||[]).length} resource(s)`);for(let $ of fe.created||[])console.log(` + ${$.slug||$.referenceKey||$.id}`);console.log(` Versioned: ${(fe.versioned||[]).length} resource(s)`);for(let $ of fe.versioned||[])console.log(` ~ ${$.slug||$.referenceKey||$.id}`);console.log(` Destroyed: ${(fe.destroyed||[]).length} resource(s)`);for(let $ of fe.destroyed||[])console.log(` - ${$.slug||$.referenceKey||$.id}`);let{userId:me,tenantId:j$1}=await d();me?await f(a$1.DEPLOY_SUCCEEDED,me,j$1,{env:e$1.env,workspace:l.slug,created:b.created.length,versioned:b.versioned.length,destroyed:b.destroyed.length}):await e(a$1.DEPLOY_SUCCEEDED,{env:e$1.env,workspace:l.slug,created:b.created.length,versioned:b.versioned.length,destroyed:b.destroyed.length});}catch(y){console.error(`Error: Network or unexpected error: ${y.message}`);let{userId:S,tenantId:h}=await d();S?await f(a$1.DEPLOY_FAILED,S,h,{env:e$1.env,workspace:l?.slug,error_class:y?.constructor?.name}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:y?.constructor?.name}),await j(),process.exit(1);}});});}function Er(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function tn(t){t.command("rename").description("Rename a resource").argument("<old-slug>","Current slug").argument("<new-slug>","New slug").requiredOption("--resource-type <type>","Type of resource (agent)").option("--env <env>","Target environment (sandbox or prod)").option("--workspace-slug <slug>","Target workspace slug (overrides config)").action(async(e$1,n,r$1)=>{if(Er()){let i=function(){let[s,d]=ve.useState({type:"loading"});return ve.useEffect(()=>(c.current=d,()=>{c.current=null;}),[]),ve.createElement(a,{state:s})};let{RenameView:a}=await import('./RenameView-3BABATL6.js'),c={current:null};if(await G(Promise.resolve(ve.createElement(i))),r$1.resourceType!=="agent"){c.current?.({type:"error",message:"Invalid resource type",detail:`'${r$1.resourceType}' \u2014 must be: agent`}),await e(a$1.RENAME_FAILED,{error_class:"InvalidResourceType",resourceType:r$1.resourceType,env:r$1.env,workspace:r$1.workspaceSlug}),await j();return}await K(async s$1=>{let{apiUrl:d$1,context:l}=await r({env:r$1.env}),k=s(l),{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.RENAME_STARTED,f$1,w,{resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_STARTED,{resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();let m=l.workspace_id;if(r$1.workspaceSlug){let T=await W(`${d$1}/api/workspaces?tenantId=${l.tenant_id}`,s$1,{headers:k});if(!T.ok){c.current?.({type:"error",message:"Failed to fetch workspaces",detail:await V(T)}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}let x=((await T.json())?.data?.workspaces||[]).find(J=>J.slug===r$1.workspaceSlug);if(!x){c.current?.({type:"error",message:`Workspace not found: ${r$1.workspaceSlug}`}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}m=x.id;}if(!m){c.current?.({type:"error",message:"No workspace configured",detail:"Run culvii dev first, or provide --workspace-slug <slug>."}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}try{let T=await W(`${d$1}/api/workspaces/${m}/resources/${e$1}/rename`,s$1,{method:"PATCH",headers:{...k,"Content-Type":"application/json"},body:JSON.stringify({newSlug:n,resourceType:r$1.resourceType})});if(!T.ok){let I=await V(T);c.current?.({type:"error",message:"Failed to rename resource",detail:`Server responded with ${T.status}: ${I}`}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:I,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:I,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}c.current?.({type:"success",oldSlug:e$1,newSlug:n}),f$1?await f(a$1.RENAME_SUCCEEDED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_SUCCEEDED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();}catch(T){c.current?.({type:"error",message:"Unexpected error",detail:T.message}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:T.message,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:T.message,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();}});return}await K(async a=>{r$1.resourceType!=="agent"&&(console.error(`Error: Invalid resource type '${r$1.resourceType}'. Must be: agent`),await e(a$1.RENAME_FAILED,{error_class:"InvalidResourceType",resourceType:r$1.resourceType,env:r$1.env,workspace:r$1.workspaceSlug}),await j(),process.exit(1));let{apiUrl:c,context:i}=await r({env:r$1.env}),s$1=s(i),{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.RENAME_STARTED,d$1,l,{resourceType:r$1.resourceType,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_STARTED,{resourceType:r$1.resourceType,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),console.log(`tenant: ${i.tenant_slug} | workspace: ${r$1.workspaceSlug||i.workspace_slug||"unknown"} | env: ${i.environment}`);let k=i.workspace_id;if(r$1.workspaceSlug){let f$1=await W(`${c}/api/workspaces?tenantId=${i.tenant_id}`,a,{headers:s$1});f$1.ok||(console.error(`Failed to fetch workspaces: ${await V(f$1)}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),process.exit(1));let T=((await f$1.json())?.data?.workspaces||[]).find(I=>I.slug===r$1.workspaceSlug);T||(console.error("Workspace not found: "+r$1.workspaceSlug),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),process.exit(1)),k=T.id;}k||(console.error("Error: No workspace configured. Run culvii dev first, or provide --workspace-slug <slug>."),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),process.exit(1));try{let f$1=await W(`${c}/api/workspaces/${k}/resources/${e$1}/rename`,a,{method:"PATCH",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({newSlug:n,resourceType:r$1.resourceType})});if(!f$1.ok){let w=await V(f$1);console.error(`Error: Failed to rename resource. Server responded with ${f$1.status}: ${w}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:w,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:w,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),process.exit(1);}console.log(`${w} Renamed ${e$1} ${z} ${n}`),console.log(" Immutable ID preserved. All execution history retained."),d$1?await f(a$1.RENAME_SUCCEEDED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_SUCCEEDED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j();}catch(f$1){console.error(`Error: Network or unexpected error: ${f$1.message}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:f$1.message,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:f$1.message,env:i.environment,workspace:r$1.workspaceSlug??i.workspace_slug}),await j(),process.exit(1);}});});}async function rn(t,e,n){let r=await W(`${e}/auth/me`,t,{skipEnvironmentHeader:true});if(!r.ok)return {ok:false,status:r.status,error:await V(r)};let o=await r.json(),a=o?.user||o?.data?.user||o,c=o?.tenant||o?.data?.tenant||{},i=c?.slug||n.tenant_slug||"Unknown",s=c?.name||n.tenant_slug||"Unknown",d=Array.isArray(o?.tenants)?o.tenants.find(k=>k.id===c?.id):void 0,l=Array.isArray(d?.roleConfig?.grants)?d.roleConfig.grants:[];return {ok:true,email:a?.email||"Unknown",name:a?.name||"Unknown",tenant:i,tenantName:s,workspace:n.workspace_slug||null,access:l}}function kr(t){let e=t.environment?t.workspace?`${t.environment.environmentName} / ${t.workspace.workspaceName}`:`${t.environment.environmentName} \xB7 all workspaces`:"tenant level";return `${t.role.displayName} \u2014 ${e}`}async function Me(t,e$1){let{userId:n,tenantId:r}=await d(),o=t?{error:true,...e$1}:e$1?{...e$1}:void 0;n?await f(a$1.WHOAMI_VIEWED,n,r,o):await e(a$1.WHOAMI_VIEWED,o),await j();}function an(t){t.command("whoami").description("Show current authenticated user context").option("--json","Output as JSON").action(async e=>{let{getCapabilities:n}=await import('./terminalCapabilities-LJTRMVG4.js'),r=n();if(e.json||!r.isTTY||r.isCI||!r.supportsColor||!r.supportsUnicode){await hr();return}await _r();});}async function hr(){await K(async t=>{let{apiUrl:e,context:n}=await r(),r$1=await rn(t,e,n);r$1.ok||(process.stderr.write(JSON.stringify({error:r$1.error})+`
7
- `),await Me(!0),process.exit(1)),process.stdout.write(JSON.stringify({email:r$1.email,name:r$1.name,tenant:r$1.tenant,tenant_name:r$1.tenantName,workspace:r$1.workspace,access:r$1.access})+`
8
- `),await Me(!1,{workspace:r$1.workspace});});}async function _r(){let{WhoamiView:t}=await import('./WhoamiView-TKSYSHQ2.js'),e={type:"loading"},n=null,{useState:r$1,useEffect:o}=await import('react');function a(){let[c,i]=r$1(e);return o(()=>(n=i,()=>{n=null;}),[]),ve.createElement(t,{state:c})}await G(Promise.resolve(ve.createElement(a))),await K(async c=>{try{let{apiUrl:i,context:s}=await r(),d=await rn(c,i,s);if(!d.ok){n?.({type:"error",message:"Failed to fetch identity",detail:`Server responded with ${d.status}: ${d.error}`}),await Me(!0);return}n?.({type:"success",email:d.email,name:d.name,tenant:d.tenant,tenantName:d.tenantName,workspace:d.workspace,access:d.access.map(kr)}),await Me(!1,{workspace:d.workspace});}catch(i){n?.({type:"error",message:"Unexpected error",detail:i.message}),await Me(!0);}});}function Ar(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function it(t){return t.workspace_slugs?.[t.environment]??t.workspace_slug??null}function sn(t){t.command("switch [tenant-slug]").description("Switch the active tenant context").action(async e$1=>{try{let n=new a$3,r;try{r=await n.read({exitOnError:!1});}catch(d$1){if(d$1.message==="Active context key not found"){let l=re.join(bt.homedir(),".culvii","config"),k=await ce.readFile(l,"utf-8");r=JSON.parse(k);}else if(d$1.code==="ENOENT"){console.error("No configuration found. Please run `culvii login` first.");let{userId:l,tenantId:k}=await d();l?await f(a$1.TENANT_SWITCH_FAILED,l,k,{error_class:"ENOENT",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"ENOENT",slug:e$1}),await j(),process.exit(1);}else throw d$1}if(!r||!r.contexts){console.error("No configuration found. Please run `culvii login` first.");let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"NoConfig",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoConfig",slug:e$1}),await j(),process.exit(1);}let o=r.contexts,a=Object.keys(o);if(a.length===0){console.error("No tenants available. Please run `culvii login` first.");let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"NoTenants",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoTenants",slug:e$1}),await j(),process.exit(1);}if(Ar()){let{SwitchView:d$1}=await import('./SwitchView-PS3ICKZT.js');if(a.length===1&&!e$1&&(await G(Promise.resolve(ve.createElement(d$1,{state:{type:"only_one",slug:a[0]}}))),process.exit(0)),!e$1){let w=a.map(m=>({slug:m,tenantId:o[m].tenant_id,workspaceSlug:it(o[m]),environment:o[m].environment,isActive:m===r.active}));await G(Promise.resolve(ve.createElement(d$1,{state:{type:"list",tenants:w}}))),process.exit(0);}if(!o[e$1]){let w=a.map(I=>({slug:I,tenantId:o[I].tenant_id,workspaceSlug:it(o[I]),environment:o[I].environment,isActive:I===r.active}));await G(Promise.resolve(ve.createElement(d$1,{state:{type:"error",message:`Tenant '${e$1}' not found.`}})));let{userId:m,tenantId:T}=await d();m?await f(a$1.TENANT_SWITCH_FAILED,m,T,{error_class:"TenantNotFound",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"TenantNotFound",slug:e$1}),await j(),process.exit(1);}await n.withLock(async()=>{let w=re.join(bt.homedir(),".culvii","config"),m=await ce.readFile(w,"utf-8"),T=JSON.parse(m);await n.write({...T,active:e$1});});let l=o[e$1];await G(Promise.resolve(ve.createElement(d$1,{state:{type:"success",slug:e$1,workspaceSlug:it(l),environment:l.environment}}))),c();let{userId:k,tenantId:f$1}=await d();k?await f(a$1.TENANT_SWITCHED,k,f$1,{to:e$1}):await e(a$1.TENANT_SWITCHED,{to:e$1}),await j();return}if(a.length===1&&!e$1&&(console.log(`Only one tenant available: ${a[0]}`),process.exit(0)),e$1||(console.log("Available tenants:"),a.forEach((d,l)=>{let k=o[d],f=d===r.active?"*":" ";console.log(`${l+1}. ${f} ${d} (Tenant ID: ${k.tenant_id})`);}),console.log(`
9
- To switch, run: culvii switch <tenant-slug>`),process.exit(0)),!o[e$1]){console.error(`Error: Tenant '${e$1}' not found.`),console.log(`
10
- Available tenants:`),a.forEach((k,f)=>{let w=o[k],m=k===r.active?"*":" ";console.log(`${f+1}. ${m} ${k} (Tenant ID: ${w.tenant_id})`);});let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"TenantNotFound",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"TenantNotFound",slug:e$1}),await j(),process.exit(1);}await n.withLock(async()=>{let d=re.join(bt.homedir(),".culvii","config"),l=await ce.readFile(d,"utf-8"),k=JSON.parse(l);await n.write({...k,active:e$1});});let c$1=o[e$1];console.log(`tenant: ${e$1} | workspace: ${it(c$1)||"none"} | env: ${c$1.environment}`),console.log(`Switched to tenant: ${e$1}`),c();let{userId:i,tenantId:s}=await d();i?await f(a$1.TENANT_SWITCHED,i,s,{to:e$1}):await e(a$1.TENANT_SWITCHED,{to:e$1}),await j();}catch(n){n.code==="ENOENT"?console.error("No configuration found. Please run `culvii login` first."):console.error(`Failed to switch context: ${n.message}`);let{userId:r,tenantId:o}=await d();r?await f(a$1.TENANT_SWITCH_FAILED,r,o,{error_class:n.code||n.constructor?.name||"UnknownError",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:n.code||n.constructor?.name||"UnknownError",slug:e$1}),await j(),process.exit(1);}});}var on=["dev","sandbox","prod"];function Dr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}async function ct(t){if(!Dr())return false;let{EnvView:e}=await import('./EnvView-3ZURMIZS.js');return await G(Promise.resolve(ve.createElement(e,{state:t}))),true}async function br(t,e,n){let r=await W(`${e}/auth/me`,t,{skipEnvironmentHeader:true});if(!r.ok)return [];let o=await r.json(),a=o?.tenant||{};return ((Array.isArray(o?.tenants)?o.tenants.find(i=>i.id===(n??a?.id)):void 0)?.environments??[]).map(i=>l(i.slug)).filter(i=>i!==null)}function cn(t){t.command("env [environment]").description("Show or switch the active environment (dev, sandbox, prod)").action(async e$1=>{await K(async n=>{let{apiUrl:r$1,context:o}=await r(),a=await br(n,r$1,o.tenant_id);if(!e$1){if(await ct({type:"show",current:o.environment,tenant:o.tenant_slug,accessible:a}))return;let k=a.includes(o.environment)?"":" (no access)";process.stdout.write(`current: ${o.environment}${k}
11
- `),process.stdout.write(`tenant: ${o.tenant_slug}
2
+ import {a as a$5}from'./chunk-RS5GDTRN.js';import {a as a$4,b as b$1,c as c$1}from'./chunk-KZG5CFSB.js';import {d,f,a as a$1,e,j,n,c,q,r,s,o,k,l}from'./chunk-KM7ZWOEG.js';import {a as a$3}from'./chunk-HX54IFSD.js';import'./chunk-57XLDHK6.js';import {x,w,y,z}from'./chunk-YKFGEPLO.js';import {a as a$2}from'./chunk-YPLDPHHD.js';import {a,b}from'./chunk-7UWDMECF.js';import {Command}from'commander';import Q,{realpathSync,existsSync}from'fs';import {fileURLToPath}from'url';import Ee from'react';import {render}from'ink';import wt from'ws';import {randomUUID,createHash}from'crypto';import ar from'chokidar';import ce from'fs/promises';import re,{dirname,join}from'path';import {spawn}from'child_process';import {createRequire}from'module';import pr from'readline';import Rt from'os';import {createInterface}from'readline/promises';import {stdout,stdin}from'process';import {jsx}from'react/jsx-runtime';import qr from'open';var _t=a(F=>{Object.defineProperty(F,"__esModule",{value:true});F.SINGLE_CHILD_SURFACE_COMPONENTS=F.RESERVED_SURFACE_COMPONENT_TYPES=F.SURFACE_COMPONENT_TYPES=F.SURFACE_COMPONENT_CATALOG=F.SURFACE_BADGE_TONES=F.SURFACE_TONES=F.SURFACE_TEXT_TRANSFORMS=F.SURFACE_VALUE_FORMATS=void 0;F.SURFACE_VALUE_FORMATS=["text","number","compact","percent","currency","bytes","duration","date","datetime","time","list","json","boolean"];F.SURFACE_TEXT_TRANSFORMS=["capitalize","title","upper","lower","humanize"];F.SURFACE_TONES=["default","muted","success","warning","error","info"];F.SURFACE_BADGE_TONES=["neutral","info","success","warning","error"];var te=(t=false)=>({type:"any",bindable:t}),_=(t=false,e)=>({type:"string",bindable:t,...e?{values:e}:{}}),z=(t=false,e={})=>({type:"number",bindable:t,...e}),B=(t=false)=>({type:"boolean",bindable:t}),xe=(t=false,e)=>({type:"array",bindable:t,...e?{items:e}:{}}),me=(t=false,e,n=false)=>({type:"object",bindable:t,...e?{properties:e}:{},additionalProperties:n}),De=(t,...e)=>({type:"union",bindable:t,variants:e}),p=(t,e,n={})=>({schema:t,description:e,...n}),Et=["xs","sm","md","lg"],xn=["xs","sm","md","lg"],kt=["seconds","ms"],qe=()=>({format:p(_(false,F.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Text transform."),currency:p(_(),"ISO 4217 currency code."),unit:p(_(false,kt),"Numeric timestamp unit."),decimals:p(z(false,{integer:true,min:0,max:20}),"Fixed decimal places."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}),Ce=p(_(false,F.SURFACE_TONES),"Displayed value tone."),Je=p(_(false,xn),"Displayed value size."),ht=p(me(false,void 0,te()),"Map known displayed values to labels."),$n=me(false,{label:p(_(true),"Row label."),value:p(te(true),"Row value."),...qe(),map:ht,mono:p(B(),"Render the value in monospace."),tone:Ce,type:p(_(false,["status"]),"Set to status to render a status pill.")},false),On=De(false,_(),me(false,{header:p(_(),"Column heading."),key:p(_(),"Field name inside each row.",{required:true}),...qe(),map:ht,align:p(_(false,["left","center","right"]),"Cell alignment."),mono:p(B(),"Render cells in monospace."),tone:Ce,type:p(_(false,["status"]),"Set to status to render status pills.")},false)),Nn=De(false,_(),z(),me(false,{label:p(_(),"Displayed option label."),value:p(De(false,_(),z()),"Submitted option value.",{required:true})},false)),Ln=me(true,{key:p(_(),"Binary property key.",{required:true}),fileName:p(_(),"Original file name."),mimeType:p(_(),"MIME type."),size:p(z(false,{min:0}),"File size in bytes."),downloadUrl:p(_(),"Protected download URL.")},false),Un=me(false,void 0,_());F.SURFACE_COMPONENT_CATALOG={Stack:{group:"layout",summary:"Vertical stack and the default surface container.",children:"list",props:{gap:p(_(false,Et),"Spacing between children.",{default:"md"})}},Row:{group:"layout",summary:"Wrapping horizontal group.",children:"list",props:{gap:p(_(false,Et),"Spacing between children.",{default:"md"}),align:p(_(false,["start","center","end","baseline"]),"Cross-axis alignment.",{default:"center"}),justify:p(_(false,["between"]),"Set to between to push children apart.")}},Grid:{group:"layout",summary:"Responsive equal-width columns.",children:"list",props:{columns:p(z(false,{integer:true,values:[1,2,3,4]}),"Column count.",{default:2}),gap:p(_(false,Et),"Spacing between children.",{default:"md"})}},Card:{group:"layout",summary:"Bordered container with an optional header and status.",children:"single",props:{title:p(_(true),"Header title."),subtitle:p(_(true),"Header subtitle."),status:p(te(true),"Status value used to derive the header pill."),statusLabel:p(te(true),"Header status label."),statusTone:p(_(false,F.SURFACE_BADGE_TONES),"Forced status tone."),map:ht,transform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Status label transform."),dense:p(B(),"Use tighter body padding.")}},Section:{group:"layout",summary:"Labelled group with one child.",children:"single",props:{title:p(_(true),"Section label."),description:p(_(true),"Section description."),collapsible:p(B(),"Allow the section to be folded."),defaultOpen:p(B(),"Initial collapsible state.",{default:true})}},Divider:{group:"layout",summary:"Horizontal rule between content blocks.",children:"none",props:{}},Form:{group:"layout",summary:"Groups wait-surface inputs and actions.",children:"list",props:{title:p(_(true),"Form heading.")}},Heading:{group:"display",summary:"A section title.",children:"none",props:{text:p(te(true),"Heading text."),level:p(z(false,{integer:true,values:[1,2,3]}),"Heading level.",{default:2}),transform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},Text:{group:"display",summary:"Body text with shared formatting.",children:"none",props:{text:p(te(true),"Value to display."),...qe(),size:Je,weight:p(_(false,["normal","medium","semibold"]),"Font weight."),tone:Ce,muted:p(B(),"Shorthand for the muted tone."),mono:p(B(),"Render in monospace.")}},Badge:{group:"display",summary:"Small label with an explicit tone.",children:"none",props:{text:p(te(true),"Badge label."),tone:p(_(false,F.SURFACE_BADGE_TONES),"Badge tone.",{default:"neutral"}),format:p(_(false,F.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},StatusPill:{group:"display",summary:"Semantic status pill for statuses, booleans, and HTTP codes.",children:"none",props:{status:p(te(true),"Status value."),label:p(te(true),"Displayed label."),tone:p(_(false,F.SURFACE_BADGE_TONES),"Forced tone."),format:p(_(false,F.SURFACE_VALUE_FORMATS),"Display format."),transform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Text transform."),maxChars:p(z(false,{integer:true,min:1}),"Maximum displayed characters.")}},Stat:{group:"display",summary:"One prominent value with a label and caption.",children:"none",props:{label:p(_(true),"Label above the value."),value:p(te(true),"Displayed value."),caption:p(te(true),"Caption below the value."),captionTransform:p(_(false,F.SURFACE_TEXT_TRANSFORMS),"Caption transform."),...qe(),tone:Ce,mono:p(B(),"Render the value in monospace.")}},KeyValue:{group:"display",summary:"Declared label/value entries or a bound object.",children:"none",props:{entries:p(xe(true,$n),"Declared label/value entries."),value:p(me(true,void 0,true),"Object whose keys become labels."),humanizeKeys:p(B(),"Humanize object keys.",{default:true}),columns:p(z(false,{integer:true,values:[1,2]}),"Pairs per row."),dense:p(B(),"Use tighter row spacing."),mono:p(B(),"Render shorthand values in monospace."),hideEmpty:p(B(),"Hide missing values."),emptyText:p(_(true),"Empty-state text.")}},Table:{group:"display",summary:"Tabular view of an array.",children:"none",props:{items:p(xe(true,te()),"Rows to render."),columns:p(xe(false,On),"Literal field names or column definitions."),dense:p(B(),"Use tighter rows."),emptyText:p(_(true),"Empty-state text.")},limits:{renderedRows:100}},Timestamp:{group:"display",summary:"ISO or epoch timestamp.",children:"none",props:{value:p(De(true,_(),z()),"ISO string or epoch number."),format:p(_(false,["datetime","date","time","smart"]),"Timestamp format.",{default:"datetime"}),relative:p(B(),"Display relative time."),unit:p(_(false,kt),"Numeric timestamp unit."),size:Je,tone:Ce}},Duration:{group:"display",summary:"A duration in milliseconds or between two instants.",children:"none",props:{value:p(z(true,{min:0}),"Duration in milliseconds."),start:p(De(true,_(),z()),"Start instant."),end:p(De(true,_(),z()),"End instant."),unit:p(_(false,kt),"Numeric instant unit."),size:Je,tone:Ce}},Money:{group:"display",summary:"A formatted currency amount.",children:"none",props:{value:p(z(true),"Currency amount."),currency:p(_(true),"ISO 4217 currency code.",{default:"USD"}),decimals:p(z(false,{integer:true,min:0,max:20}),"Fixed decimal places."),signed:p(B(),"Colour positive and negative values."),size:Je,tone:Ce}},Avatar:{group:"display",summary:"Initials derived from a name or email.",children:"none",props:{name:p(_(true),"Name used for initials."),email:p(_(true),"Fallback source for initials."),label:p(_(true),"Text beside the avatar."),size:p(_(false,["sm","md","lg"]),"Avatar size.",{default:"md"})}},Code:{group:"display",summary:"Monospace text block.",children:"none",props:{text:p(te(true),"Code or payload."),label:p(_(true),"Block label."),wrap:p(B(),"Wrap long lines.")},limits:{characters:2e4}},HtmlRenderer:{group:"display",summary:"Sandboxed HTML fragment renderer.",children:"none",props:{html:p(_(true),"HTML markup."),label:p(_(true),"Frame label."),height:p(z(false,{min:80,max:1200}),"Frame height in pixels.",{default:320}),allowRemoteImages:p(B(),"Allow remote HTTPS images.",{default:false}),emptyText:p(_(true),"Empty-state text.")},limits:{characters:2e4}},JsonInspector:{group:"display",summary:"Collapsible JSON tree and default fallback renderer.",children:"none",props:{value:p(te(true),"Any JSON value."),collapsed:p(B(),"Start collapsed.")}},FileChip:{group:"display",summary:'Metadata and download affordance for a produced file. Binding `file` alone does not make the chip clickable \u2014 declare `actions.default` as a `navigate` action with `href` bound to the same descriptor\'s `downloadUrl` path (e.g. `{ path: "/$binary/<step>/main/0/0/<key>/downloadUrl" }`), or the chip renders as a read-only file summary with no download button.',children:"none",interaction:"single-action",props:{file:p(Ln,"Binary descriptor."),label:p(_(true),"Displayed file name.")}},EmailMessageCard:{group:"display",summary:"Inbox list or opened email message.",children:"none",props:{messages:p(xe(true,me(false,void 0,true)),"Message list."),message:p(me(true,void 0,true),"Single message."),from:p(_(true),"Sender."),to:p(_(true),"Recipients."),cc:p(_(true),"Carbon-copy recipients."),subject:p(_(true),"Subject."),snippet:p(_(true),"Preview text."),body:p(_(true),"Message body."),date:p(De(true,_(),z()),"Sent or received instant."),labels:p(xe(true,_()),"Message labels."),unread:p(B(true),"Unread state."),fields:p(Un,"Field-name mapping."),emptyText:p(_(true),"Empty-state text.")},limits:{renderedMessages:50}},DiffView:{group:"display",summary:"Structural JSON or line-by-line text comparison.",children:"none",props:{before:p(te(true),"Prior value."),after:p(te(true),"Proposed value."),mode:p(_(false,["json","text"]),"Comparison mode.",{default:"json"})},limits:{depth:6,children:100,lines:2e3,characters:2e5}},TextField:{group:"input",summary:"Single-line form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),placeholder:p(_(true),"Placeholder."),type:p(_(false,["text","number","email","url"]),"HTML input type.",{default:"text"}),disabled:p(B(true),"Disabled state.")}},TextArea:{group:"input",summary:"Multi-line form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),placeholder:p(_(true),"Placeholder."),rows:p(z(false,{integer:true,min:1}),"Visible rows.",{default:3}),disabled:p(B(true),"Disabled state.")}},Select:{group:"input",summary:"Single-choice form input.",children:"none",interaction:"input",props:{label:p(_(true),"Field label."),options:p(xe(true,Nn),"Literal or bound options."),placeholder:p(_(true),"Placeholder."),disabled:p(B(true),"Disabled state.")}},Checkbox:{group:"input",summary:"Boolean form input.",children:"none",interaction:"input",props:{label:p(_(true),"Text beside the checkbox."),description:p(_(true),"Helper text."),disabled:p(B(true),"Disabled state.")}},Button:{group:"action",summary:"Single-action button.",children:"none",interaction:"single-action",props:{label:p(_(true),"Button label."),variant:p(_(false,["primary","default","danger"]),"Button variant.",{default:"default"}),disabled:p(B(true),"Disabled state.")}},ApproveRejectBar:{group:"action",summary:"Named approve/reject decision actions.",children:"none",interaction:"multi-action",actionNames:{allowed:["approve","reject"]},props:{canDecide:p(B(true),"Whether the viewer may decide."),approveLabel:p(_(true),"Approve button label."),rejectLabel:p(_(true),"Reject button label."),disabledReason:p(_(true),"Reason actions are disabled."),commentRequired:p(B(true),"Require a comment before rejection."),comment:p(_(true),"Current comment value."),decision:p(_(true),"Recorded decision."),decidedBy:p(_(true),"Recorded decider.")}}};F.SURFACE_COMPONENT_TYPES=Object.keys(F.SURFACE_COMPONENT_CATALOG);F.RESERVED_SURFACE_COMPONENT_TYPES=["Tabs","Accordion","Spacer","Markdown","Icon","Image","List","Tree","ProgressBar","Spinner","ErrorPanel","Timeline","RadioGroup","DatePicker","SlackMessageCard","SlackThread","CalendarEventCard","AgentRunPanel","ToolCallCard"];F.SINGLE_CHILD_SURFACE_COMPONENTS=F.SURFACE_COMPONENT_TYPES.filter(t=>F.SURFACE_COMPONENT_CATALOG[t].children==="single");});var Bt=a(ne=>{Object.defineProperty(ne,"__esModule",{value:true});ne.SURFACE_SLOTS=ne.SURFACE_SLOT_POLICY=void 0;ne.getSurfaceBindingPaths=Yt;ne.validateSurfaceDefinition=Ht;ne.validateSurfaceResource=Hn;var Vt=_t();ne.SURFACE_SLOT_POLICY={output:{actions:["navigate"],form:false},wait:{actions:["navigate","node.resume","node.stop"],form:true}};ne.SURFACE_SLOTS=Object.keys(ne.SURFACE_SLOT_POLICY);var Wt=300,Mt=12,Fn=new Set(Vt.SURFACE_COMPONENT_TYPES),Pn=new Set(["$output","$input","$exec","$binary"]),jn=new Set(["text","number","date","datetime","json"]),Wn=new Set(["text","textarea","number","email","url","checkbox","select","file"]);function Mn(t){return (t.startsWith("/")?t.slice(1):t).split("/",1)[0]}function je(t,e){if(Array.isArray(t))for(let n of t)je(n,e);else if(t&&typeof t=="object"){let n=t;if(typeof n.path=="string")e.push(n.path);else for(let r of Object.values(n))je(r,e);}}function $e(t,e){if(Array.isArray(t)){for(let r of t)$e(r,e);return}if(!t||typeof t!="object")return;let n=t;if("path"in n){typeof n.path!="string"&&e.push("Surface binding path must be a string."),n.format!==void 0&&!jn.has(String(n.format))&&e.push(`Unknown surface binding format "${String(n.format)}".`);return}for(let r of Object.values(n))$e(r,e);}function ze(t){return !!t&&typeof t=="object"&&!Array.isArray(t)}function Vn(t){return ze(t)&&"path"in t}function Pe(t,e,n,r){if(Vn(t)){e.bindable||r.push(`${n} does not accept a surface binding.`),$e(t,r);return}if(e.type==="any")return;if(e.type==="union"){let a=e.variants.filter(o=>o.type==="any"||o.type==="union"?true:o.type==="array"?Array.isArray(t):o.type==="object"?ze(t):typeof t===o.type),c=(a.length?a:e.variants).map(o=>{let s=[];return Pe(t,o,n,s),s});c.every(o=>o.length>0)&&r.push(...c.reduce((o,s)=>s.length<o.length?s:o));return}if(e.type==="string"){if(typeof t!="string"){r.push(`${n} must be a string.`);return}e.values&&!e.values.includes(t)&&r.push(`${n} must be one of ${e.values.join(", ")}.`),e.maxLength!==void 0&&t.length>e.maxLength&&r.push(`${n} cannot exceed ${e.maxLength} characters.`);return}if(e.type==="number"){if(typeof t!="number"||!Number.isFinite(t)){r.push(`${n} must be a finite number.`);return}e.integer&&!Number.isInteger(t)&&r.push(`${n} must be an integer.`),e.min!==void 0&&t<e.min&&r.push(`${n} must be at least ${e.min}.`),e.max!==void 0&&t>e.max&&r.push(`${n} cannot exceed ${e.max}.`),e.values&&!e.values.includes(t)&&r.push(`${n} must be one of ${e.values.join(", ")}.`);return}if(e.type==="boolean"){typeof t!="boolean"&&r.push(`${n} must be a boolean.`);return}if(e.type==="array"){if(!Array.isArray(t)){r.push(`${n} must be an array.`);return}e.maxItems!==void 0&&t.length>e.maxItems&&r.push(`${n} cannot contain more than ${e.maxItems} items.`),e.items&&t.forEach((a,c)=>Pe(a,e.items,`${n}[${c}]`,r));return}if(!ze(t)){r.push(`${n} must be an object.`);return}let i=e.properties??{};for(let[a,c]of Object.entries(i))c.required&&!(a in t)&&r.push(`${n}.${a} is required.`);for(let[a,c]of Object.entries(t)){let o=i[a];if(o){Pe(c,o.schema,`${n}.${a}`,r);continue}e.additionalProperties===false||e.additionalProperties===void 0?r.push(`${n} has unknown field "${a}".`):e.additionalProperties!==true&&Pe(c,e.additionalProperties,`${n}.${a}`,r);}}function Yn(t,e,n){let r=t.props;if(!(r===void 0||!ze(r))){for(let[i,a]of Object.entries(e.props))a.required&&!(i in r)&&n.push(`Component "${t.id}" prop "${i}" is required.`);for(let[i,a]of Object.entries(r)){if(i==="bind")continue;let c=e.props[i];if(!c){n.push(`Component "${t.id}" (${t.type}) has unknown prop "${i}".`);continue}Pe(a,c.schema,`Component "${t.id}" prop "${i}"`,n);}}}function Yt(t){let e=[];for(let n of t.components??[])!n||typeof n!="object"||(je(n.props,e),je(n.actions,e));return je(t.form,e),Array.from(new Set(e))}function Ht(t,e){let n=[];try{new TextEncoder().encode(JSON.stringify(t)).byteLength>256*1024&&n.push("Surface definition exceeds 256 KiB.");}catch{return ["Surface definition must be JSON serializable."]}if(t?.schema!=="kit.ui/v1"&&n.push('Surface schema must be "kit.ui/v1".'),!Array.isArray(t?.components)||t.components.length===0)return [...n,"Surface requires at least one component."];t.components.length>Wt&&n.push(`Surface cannot exceed ${Wt} components.`);let r=new Map;for(let o of t.components){if(!o||typeof o!="object"||Array.isArray(o)){n.push("Every surface component must be an object.");continue}let s=o;if(typeof s.id!="string"||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(s.id)||typeof s.type!="string"){n.push("Every surface component requires id and type.");continue}r.has(s.id)&&n.push(`Duplicate component id "${s.id}".`),r.set(s.id,s),Fn.has(s.type)||n.push(`Unknown component type "${s.type}".`);let d=Vt.SURFACE_COMPONENT_CATALOG[s.type];s.props!==void 0&&(!s.props||typeof s.props!="object"||Array.isArray(s.props))&&n.push(`Component "${s.id}" props must be an object.`),d&&Yn(s,d,n),s.children!==void 0&&!Array.isArray(s.children)?n.push(`Component "${s.id}" children must be an array.`):s.children?.length&&d?.children==="none"?n.push(`Component "${s.id}" cannot have children.`):s.children&&s.children.length>1&&d?.children==="single"&&n.push(`Component "${s.id}" can have at most one child.`);let l=s.props?.bind;if(l!==void 0&&(d?.interaction!=="input"?n.push(`Component "${s.id}" cannot bind form state.`):(!ne.SURFACE_SLOT_POLICY[e].form||typeof l!="string"||!(l==="/$form"||l.startsWith("/$form/")||l.startsWith("$form.")))&&n.push(`Component "${s.id}" requires a wait-surface $form binding.`)),s.actions!==void 0&&(!s.actions||typeof s.actions!="object"||Array.isArray(s.actions))){n.push(`Component "${s.id}" actions must be an object.`);continue}let v=Object.keys(s.actions??{}).length;if(v&&!["single-action","multi-action"].includes(d?.interaction??"")?n.push(`Component "${s.id}" cannot have actions.`):v>1&&d?.interaction==="single-action"&&n.push(`Component "${s.id}" can have at most one action.`),d?.actionNames){let f=Object.keys(s.actions??{});for(let w of d.actionNames.required??[])f.includes(w)||n.push(`Component "${s.id}" requires action "${w}".`);for(let w of f)d.actionNames.allowed&&!d.actionNames.allowed.includes(w)&&n.push(`Component "${s.id}" does not support action "${w}".`);}$e(s.props,n);for(let f of Object.values(s.actions??{})){if(!f||typeof f!="object"||Array.isArray(f)){n.push(`Component "${s.id}" has an invalid action.`);continue}let w=f;if(!["navigate","node.resume","node.stop"].includes(w.type)){n.push(`Unknown surface action "${String(w.type)}".`);continue}ne.SURFACE_SLOT_POLICY[e].actions.includes(w.type)||n.push(`Action "${w.type}" is not allowed on "${e}" surfaces.`),w.type==="navigate"&&(!w.href||typeof w.href!="object"||typeof w.href.path!="string")&&n.push("Navigate actions require an href binding."),$e(w,n);}}(typeof t.root!="string"||!r.has(t.root))&&n.push(`Surface root "${String(t.root)}" is missing.`);let i=new Set,a=new Set,c=(o,s)=>{if(s>Mt)return void n.push(`Surface component depth exceeds ${Mt}.`);if(a.has(o))return void n.push(`Surface component cycle includes "${o}".`);if(i.has(o))return;let d=r.get(o);if(d){a.add(o);for(let l of Array.isArray(d.children)?d.children:[]){if(typeof l!="string"){n.push(`Component "${o}" has a non-string child reference.`);continue}r.has(l)?c(l,s+1):n.push(`Component "${o}" references missing child "${l}".`);}a.delete(o),i.add(o);}};typeof t.root=="string"&&c(t.root,1);for(let o of r.keys())i.has(o)||n.push(`Component "${o}" is unreachable from root.`);for(let o of Yt(t)){let s=Mn(o);s==="$form"&&!ne.SURFACE_SLOT_POLICY[e].form?n.push(`Binding "${o}" is only allowed on wait surfaces.`):s!=="$form"&&!Pn.has(s)&&n.push(`Invalid surface binding path "${o}".`);}if(t.form!==void 0)if(ne.SURFACE_SLOT_POLICY[e].form||n.push("Forms are only allowed on wait surfaces."),!Array.isArray(t.form?.fields))n.push("Surface form fields must be an array.");else {let o=new Set;for(let s of t.form.fields){if(!s||typeof s!="object"||Array.isArray(s)){n.push("Every surface form field must be an object.");continue}let d=s,l=d?.name,v=d?.type;typeof l!="string"||!l||o.has(l)?n.push(`Surface form field name "${String(l)}" is invalid or duplicated.`):o.add(l),Wn.has(String(v))||n.push(`Unknown surface form field type "${String(v)}".`),(typeof d.label!="string"||!d.label.trim())&&n.push(`Surface form field "${String(l)}" requires a label.`),v==="file"&&"default"in d&&n.push(`File field "${String(l)}" cannot have a default binding.`),v==="file"&&(d.maxFiles!==void 0&&(!Number.isInteger(d.maxFiles)||Number(d.maxFiles)<1||Number(d.maxFiles)>5)&&n.push(`File field "${String(l)}" maxFiles must be between 1 and 5.`),d.maxBytes!==void 0&&(!Number.isInteger(d.maxBytes)||Number(d.maxBytes)<1||Number(d.maxBytes)>10*1024*1024)&&n.push(`File field "${String(l)}" maxBytes exceeds platform limits.`),d.accept!==void 0&&(!Array.isArray(d.accept)||d.accept.some(f=>typeof f!="string"||!/^[a-z0-9.+-]+\/(?:[a-z0-9.+-]+|\*)$/i.test(f)))&&n.push(`File field "${String(l)}" has invalid MIME types.`)),v==="select"&&(!Array.isArray(d.options)||d.options.length===0?n.push(`Select field "${String(l)}" requires options.`):d.options.some(f=>!f||typeof f!="object"||typeof f.label!="string"||typeof f.value!="string")&&n.push(`Select field "${String(l)}" has invalid options.`));}$e(t.form,n);}return Array.from(new Set(n))}function Hn(t){let e=t;if(!e||typeof e!="object")return ["Surface must be an object."];let n=[];return (typeof e.id!="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(e.id))&&n.push("Surface requires a kebab-case id."),(typeof e.name!="string"||!e.name.trim())&&n.push("Surface requires a name."),ne.SURFACE_SLOTS.includes(e.slot)?n.push(...Ht(e.definition,e.slot)):n.push(`Surface requires slot ${ne.SURFACE_SLOTS.map(r=>`"${r}"`).join(" or ")}.`),Array.from(new Set(n))}});var Kt=a(J=>{var Bn=J&&J.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var i=Object.getOwnPropertyDescriptor(e,n);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:true,get:function(){return e[n]}}),Object.defineProperty(t,r,i);}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n];})),Kn=J&&J.__exportStar||function(t,e){for(var n in t)n!=="default"&&!Object.prototype.hasOwnProperty.call(e,n)&&Bn(e,t,n);};Object.defineProperty(J,"__esModule",{value:true});J.SURFACE_VALUE_FORMATS=J.SURFACE_TONES=J.SURFACE_TEXT_TRANSFORMS=J.SURFACE_COMPONENT_TYPES=J.SURFACE_COMPONENT_CATALOG=J.SURFACE_BADGE_TONES=J.SINGLE_CHILD_SURFACE_COMPONENTS=J.RESERVED_SURFACE_COMPONENT_TYPES=void 0;var ke=_t();Object.defineProperty(J,"RESERVED_SURFACE_COMPONENT_TYPES",{enumerable:true,get:function(){return ke.RESERVED_SURFACE_COMPONENT_TYPES}});Object.defineProperty(J,"SINGLE_CHILD_SURFACE_COMPONENTS",{enumerable:true,get:function(){return ke.SINGLE_CHILD_SURFACE_COMPONENTS}});Object.defineProperty(J,"SURFACE_BADGE_TONES",{enumerable:true,get:function(){return ke.SURFACE_BADGE_TONES}});Object.defineProperty(J,"SURFACE_COMPONENT_CATALOG",{enumerable:true,get:function(){return ke.SURFACE_COMPONENT_CATALOG}});Object.defineProperty(J,"SURFACE_COMPONENT_TYPES",{enumerable:true,get:function(){return ke.SURFACE_COMPONENT_TYPES}});Object.defineProperty(J,"SURFACE_TEXT_TRANSFORMS",{enumerable:true,get:function(){return ke.SURFACE_TEXT_TRANSFORMS}});Object.defineProperty(J,"SURFACE_TONES",{enumerable:true,get:function(){return ke.SURFACE_TONES}});Object.defineProperty(J,"SURFACE_VALUE_FORMATS",{enumerable:true,get:function(){return ke.SURFACE_VALUE_FORMATS}});Kn(Bt(),J);});var Ge=class extends Error{constructor(){super("401 Unauthorized"),this.name="UnauthorizedError";}};function Rn(t,e=Date.now()){return t-e<3e4}async function V(t){let e$1=new a$4,r=await(async()=>await e$1.withLock(async()=>{b$1.info("Tokens read from disk for auth check");let i=await e$1.get();if(i||(b$1.error("No tokens found on disk"),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Not logged in",detail:"run `culvii login`"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),!Rn(i.expiresAt))return b$1.info("Access token valid, skipping refresh"),i.accessToken;b$1.info("Access token expired, attempting refresh");let a=`https://${q.cognitoDomain}/oauth2/token`,c=new URLSearchParams;c.set("grant_type","refresh_token"),c.set("refresh_token",i.refreshToken),c.set("client_id",q.clientId);let o;try{o=await fetch(a,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});}catch(v){b$1.error("Network error during refresh",{error:v.message}),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Refresh failed",detail:"Cannot reach auth server \u2014 check your connection"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1);}let s=await o.json();(!o.ok||s.error==="invalid_grant")&&(b$1.warn("Refresh failed with invalid_grant"),await e$1.delete(),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Session expired",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1));let d=Date.now(),l=d+s.expires_in*1e3;return b$1.info("Refresh succeeded",{expiresAt:l}),await e$1.set({accessToken:s.access_token,refreshToken:s.refresh_token||i.refreshToken,idToken:s.id_token||i.idToken,expiresAt:l,tokenType:"Bearer",scope:i.scope,issuedAt:d,issuer:i.issuer}),s.access_token}))();try{await t(r);}catch(i){if(!(i instanceof Ge))throw i;b$1.info("Mid-session 401 detected, attempting refresh");let a=await e$1.withLock(async()=>{b$1.info("Tokens read from disk for retry");let c=await e$1.get();c||(b$1.error("No tokens found on disk during retry"),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Not logged in",detail:"run `culvii login`"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),b$1.info("Access token expired (forced by 401), attempting refresh");let o=`https://${q.cognitoDomain}/oauth2/token`,s=new URLSearchParams;s.set("grant_type","refresh_token"),s.set("refresh_token",c.refreshToken),s.set("client_id",q.clientId);let d;try{d=await fetch(o,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:s.toString()});}catch(w){b$1.error("Network error during refresh retry",{error:w.message}),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Refresh failed",detail:"Cannot reach auth server \u2014 check your connection"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1);}let l=await d.json();(!d.ok||l.error==="invalid_grant")&&(b$1.warn("Refresh retry failed with invalid_grant"),await e$1.delete(),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Session expired",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1));let v=Date.now(),f=v+l.expires_in*1e3;return b$1.info("Refresh retry succeeded",{expiresAt:f}),await e$1.set({accessToken:l.access_token,refreshToken:l.refresh_token||c.refreshToken,idToken:l.id_token||c.idToken,expiresAt:f,tokenType:"Bearer",scope:c.scope,issuedAt:v,issuer:c.issuer}),l.access_token});try{b$1.info("Retry after refresh succeeded"),await t(a);}catch(c){throw c instanceof Ge&&(b$1.error("Retry after refresh failed (still 401)"),await e$1.withLock(async()=>{await e$1.delete();}),render(Ee.createElement(c$1,{state:{type:"login_error",message:"Session invalidated",detail:"run `culvii login` to authenticate"}})),await e(a$1.LOGIN_FAILED,{reason:"session_expired"}),await j(),process.exit(1)),c}}}async function mt(){let t=new a$4;return t.withLock(async()=>{let e=await t.get();if(!e)return null;let n=`https://${q.cognitoDomain}/oauth2/token`,r=new URLSearchParams;r.set("grant_type","refresh_token"),r.set("refresh_token",e.refreshToken),r.set("client_id",q.clientId);let i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});}catch(s){return b$1.error("Network error during silent refresh",{error:s.message}),null}let a=await i.json();if(!i.ok||a.error==="invalid_grant")return b$1.warn("Silent refresh failed",{error:a.error}),null;let c=Date.now(),o=c+a.expires_in*1e3;return await t.set({accessToken:a.access_token,refreshToken:a.refresh_token||e.refreshToken,idToken:a.id_token||e.idToken,expiresAt:o,tokenType:"Bearer",scope:e.scope,issuedAt:c,issuer:e.issuer}),a.access_token})}async function H(t){let e=await t.text();try{let n=JSON.parse(e);if(n.error)return n.error}catch{}return e}async function W(t,e,n={}){let{skipEnvironmentHeader:r,...i}=n,c=await new a$3().read({exitOnError:false}),o$1=c.contexts[c.active],s=o$1?.tenant_id,d=o$1?.environment||"dev",l=o()??d,v=o$1?.environment_ids?.[l]??(l===d?o$1?.environment_id:void 0),f=k[l],w=r?{}:v?{"x-environment-id":v}:{"x-environment-slug":f},m={Authorization:`Bearer ${e}`,...s?{"x-tenant-id":s}:{},...w,...i.headers||{}};return fetch(t,{...i,headers:m})}function Pt(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function jt(t){let e$1=t.command("workspace").description("Workspace commands").option("--env <env>","Target environment (sandbox or prod)");e$1.command("create").description("Create a new workspace").requiredOption("--name <name>","Workspace name").requiredOption("--slug <slug>","Workspace slug").action(async n=>{if(Pt()){let c=function(){let[o,s]=Ee.useState({type:"loading"});return Ee.useEffect(()=>(a=s,()=>{a=null;}),[]),Ee.createElement(i,{state:o})};let{WorkspaceCreateView:i}=await import('./WorkspaceView-ID7ZMBHV.js'),a=null;await G(Promise.resolve(Ee.createElement(c))),await V(async o=>{let{apiUrl:s$1,context:d$1}=await r({env:e$1.opts().env}),l=s(d$1);try{let v=await W(`${s$1}/api/workspaces`,o,{method:"POST",headers:{...l,"Content-Type":"application/json"},body:JSON.stringify({name:n.name,slug:n.slug,tenantId:d$1.tenant_id})});if(!v.ok){let T=await H(v);a?.({type:"error",message:"Failed to create workspace",detail:`Server responded with ${v.status}: ${T}`});let{userId:I,tenantId:x}=await d();I?await f(a$1.WORKSPACE_CREATE_FAILED,I,x,{error_class:"ApiError",slug:n.slug,env:d$1.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:"ApiError",slug:n.slug,env:d$1.environment}),await j();return}let f$1=await v.json();a?.({type:"success",id:f$1?.data?.workspaceId,slug:f$1?.data?.workspaceSlug||n.slug,name:n.name});let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_CREATED,w,m,{slug:n.slug,env:d$1.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:d$1.environment}),await j();}catch(v){a?.({type:"error",message:"Unexpected error",detail:v.message});let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.WORKSPACE_CREATE_FAILED,f$1,w,{error_class:v?.constructor?.name,env:d$1.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:v?.constructor?.name,env:d$1.environment}),await j();}});return}await V(async i=>{let{apiUrl:a,context:c}=await r({env:e$1.opts().env}),o=s(c);console.log(`tenant: ${c.tenant_slug} | workspace: N/A | env: ${c.environment}`);try{let s=await W(`${a}/api/workspaces`,i,{method:"POST",headers:{...o,"Content-Type":"application/json"},body:JSON.stringify({name:n.name,slug:n.slug,tenantId:c.tenant_id})});if(!s.ok){let f$1=await H(s);console.error(`Error: Failed to create workspace. Server responded with ${s.status}: ${f$1}`);let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_CREATE_FAILED,w,m,{error_class:"ApiError",slug:n.slug,env:c.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:"ApiError",slug:n.slug,env:c.environment}),await j(),process.exit(1);}let d$1=await s.json();console.log(`${w} Workspace created successfully.`),console.log(` ID: ${d$1?.data?.workspaceId}`),d$1?.data?.workspaceSlug&&console.log(` Slug: ${d$1?.data?.workspaceSlug}`);let{userId:l,tenantId:v}=await d();l?await f(a$1.WORKSPACE_CREATED,l,v,{slug:n.slug,env:c.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:c.environment}),await j();}catch(s){console.error(`Error: Network or unexpected error: ${s.message}`);let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.WORKSPACE_CREATE_FAILED,d$1,l,{error_class:s?.constructor?.name,env:c.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:s?.constructor?.name,env:c.environment}),await j(),process.exit(1);}});}),e$1.command("list").description("List workspaces").action(async()=>{if(Pt()){let a=function(){let[c,o]=Ee.useState({type:"loading"});return Ee.useEffect(()=>(i=o,()=>{i=null;}),[]),Ee.createElement(r$1,{state:c})};let{WorkspaceListView:r$1}=await import('./WorkspaceView-ID7ZMBHV.js'),i=null;await G(Promise.resolve(Ee.createElement(a))),await V(async c=>{let{apiUrl:o,context:s$1}=await r({env:e$1.opts().env}),d$1=s(s$1);try{let l=await W(`${o}/api/workspaces?tenantId=${s$1.tenant_id}`,c,{headers:d$1});if(!l.ok){let T=await H(l);i?.({type:"error",message:"Failed to list workspaces",detail:`Server responded with ${l.status}: ${T}`});let{userId:I,tenantId:x}=await d();I?await f(a$1.WORKSPACE_LIST_FAILED,I,x,{error_class:"ApiError",env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"ApiError",env:s$1.environment}),await j();return}let f$1=(await l.json())?.data?.workspaces;if(!Array.isArray(f$1)){i?.({type:"error",message:"Unexpected response format"});let{userId:T,tenantId:I}=await d();T?await f(a$1.WORKSPACE_LIST_FAILED,T,I,{error_class:"UnexpectedResponse",env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"UnexpectedResponse",env:s$1.environment}),await j();return}i?.({type:"success",workspaces:f$1.map(T=>({id:T.id,name:T.name,slug:T.slug??""}))});let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_LISTED,w,m,{env:s$1.environment}):await e(a$1.WORKSPACE_LISTED,{env:s$1.environment}),await j();}catch(l){i?.({type:"error",message:"Unexpected error",detail:l.message});let{userId:v,tenantId:f$1}=await d();v?await f(a$1.WORKSPACE_LIST_FAILED,v,f$1,{error_class:l?.constructor?.name,env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:l?.constructor?.name,env:s$1.environment}),await j();}});return}await V(async r$1=>{let{apiUrl:i,context:a}=await r({env:e$1.opts().env}),c=s(a);console.log(`tenant: ${a.tenant_slug} | workspace: N/A | env: ${a.environment}`);try{let o=await W(`${i}/api/workspaces?tenantId=${a.tenant_id}`,r$1,{headers:c});if(!o.ok){let f$1=await H(o);console.error(`Error: Failed to list workspaces. Server responded with ${o.status}: ${f$1}`);let{userId:w,tenantId:m}=await d();w?await f(a$1.WORKSPACE_LIST_FAILED,w,m,{error_class:"ApiError",env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"ApiError",env:a.environment}),await j(),process.exit(1);}let d$1=(await o.json())?.data?.workspaces;if(!Array.isArray(d$1)){console.error("Error: Unexpected response format");let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.WORKSPACE_LIST_FAILED,f$1,w,{error_class:"UnexpectedResponse",env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:"UnexpectedResponse",env:a.environment}),await j(),process.exit(1);}for(let f of d$1)console.log(`${f.id} ${f.name} ${f.slug}`);let{userId:l,tenantId:v}=await d();l?await f(a$1.WORKSPACE_LISTED,l,v,{env:a.environment}):await e(a$1.WORKSPACE_LISTED,{env:a.environment}),await j();}catch(o){console.error(`Error: Network or unexpected error: ${o.message}`);let{userId:s,tenantId:d$1}=await d();s?await f(a$1.WORKSPACE_LIST_FAILED,s,d$1,{error_class:o?.constructor?.name,env:a.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:o?.constructor?.name,env:a.environment}),await j(),process.exit(1);}});});}function vt(t,e,n){let r=null,i=0,a=false,c=[],o=new Map,s=null,d=null,l=0,v=[1e3,2e3,4e3,8e3,16e3];function f(){s&&(clearInterval(s),s=null),d&&(clearTimeout(d),d=null),l=0;}function w(){f(),s=setInterval(()=>{if(!r||r.readyState!==wt.OPEN)return;let R=Date.now().toString()+"-"+Math.random().toString();r.send(JSON.stringify({type:"client-ping",requestId:R})),d=setTimeout(()=>{l++,l>=2&&(b$1.warn("devSync WebSocket dead (missed 2 pongs), terminating"),f(),r?.terminate());},5e3);},2e4);}function m(R){R.removeAllListeners(),R.on("error",()=>{});try{R.terminate();}catch(N){b$1.warn("devSync error terminating stale socket",{error:N.message});}}let T=0;async function I(){if(a)return;let R=++T,N;try{N=await e();}catch(S){b$1.error("devSync failed to obtain headers for connection",{error:S.message}),R===T&&x();return}if(a||R!==T)return;r&&m(r);let y=new wt(t,{headers:N});r=y,y.on("open",()=>{if(r===y){i=0,b$1.info("devSync WebSocket connected",{url:t}),n.onOpen();for(let S of c)y.send(JSON.stringify(S));c=[],w();}}),y.on("message",S=>{if(r!==y)return;let h=Buffer.isBuffer(S)?S.toString("utf-8"):S instanceof ArrayBuffer?Buffer.from(S).toString("utf-8"):Buffer.concat(S).toString("utf-8"),g;try{g=JSON.parse(h);}catch{b$1.warn("Received invalid JSON from devSync",{raw:h});return}if(g.ok===true&&g.slug&&typeof g.warning=="string"){n.onWarning?.(g.slug,g.warning);return}if(g.type==="session-probe"&&typeof g.requestId=="string"){y.send(JSON.stringify({type:"session-pong",requestId:g.requestId}));return}if(g.type==="client-pong"){d&&(clearTimeout(d),d=null),l=0;return}if(g.ok===true&&g.slug&&g.type==="validation-error"){n.onValidationErrorAck?.(g.slug);return}if(g.ok===true&&g.slug){g.resourceId&&o.set(g.slug,g.resourceId),n.onAck(g.slug,g.resourceId,g.orphaned===true);return}if(g.ok===false&&g.slug){n.onError(g.slug,g.error||"Unknown error");return}if(g.ok===false&&!g.slug){n.onFatal(g.error||"Fatal error from server"),a=true,f(),y.close();return}}),y.on("unexpected-response",(S,h)=>{if(r===y){if(h.statusCode===401){b$1.error("devSync credentials rejected (401)"),a=true,f(),y.terminate(),n.onAuthFailure?n.onAuthFailure():n.onFatal("Credentials rejected by server (401)");return}b$1.warn("devSync unexpected handshake response",{statusCode:h.statusCode}),f(),y.terminate(),x();}}),y.on("close",S=>{r!==y||a||(b$1.warn("devSync WebSocket closed",{code:S}),f(),x());}),y.on("error",S=>{r===y&&b$1.error("devSync WebSocket error",{error:S.message});});}function x(){if(f(),a)return;if(i>=v.length){let y=`devSync PERMANENT FAILURE: giving up after ${v.length} retries`;b$1.error(y,{retryCount:i,retryDelaysMs:v}),n.onFatal(y),a=true;return}let R=v[i];i++;let N=v.length-i;b$1.info(`devSync reconnecting in ${R}ms (attempt ${i}/${v.length}, ${N} left before permanent failure)`),setTimeout(()=>{I();},R);}function q(R){r&&r.readyState===wt.OPEN?r.send(JSON.stringify(R)):c.push(R);}function K(){a=true,f(),r&&m(r),b$1.info("devSync WebSocket closed by client");}function D(){a||(f(),i=0,r&&m(r),I());}return I(),{send:q,close:K,reconnectNow:D}}var Jt=b(Kt(),1);var Zn=fileURLToPath(import.meta.url),Qn=dirname(Zn),er=join(Qn,"lib","evaluator.js"),tr=createRequire(import.meta.url),nr=tr.resolve("tsx/cli");async function We(t){try{let r=await ce.readFile(re.join(t,"culvii.yaml"),"utf-8"),i=[],a=!1;for(let c of r.split(`
3
+ `)){if(c.trim().startsWith("entrypoints:")){a=!0;continue}if(!a)continue;let o=c.match(/^\s+-\s+(.+)$/);o?i.push(re.resolve(t,o[1].trim())):c.trim()&&!c.trim().startsWith("#")&&(a=!1);}if(i.length)return i}catch{}let e=[];async function n(r){let i;try{i=await ce.readdir(r,{withFileTypes:!0});}catch{return}for(let a of i){if(a.name.startsWith(".")||a.name==="node_modules"||a.name==="dist")continue;let c=re.join(r,a.name);a.isDirectory()?await n(c):a.isFile()&&a.name.endsWith(".culvii.ts")&&e.push(c);}}return await n(t),e}function Me(t,e={}){return new Promise((n,r)=>{if(!t.length)return n([]);let i=spawn(process.execPath,[nr,er,...t],{env:{...process.env,...e,CULVII_DEV:"true"},stdio:["ignore","pipe","pipe"]}),a="",c="",o=false;i.stdout.on("data",s=>a+=s.toString()),i.stderr.on("data",s=>c+=s.toString()),i.on("error",s=>{o||(o=true,r(s));}),i.on("close",s=>{if(o)return;if(o=true,s!==0){r(new Error(`Evaluator exited with code ${s}. ${c.trim()||"Check your files for syntax or validation errors."}`));return}let d=[],l=new Set,v=a.split(`
4
+ `).filter(f=>f.includes("__culvii_dev_definitions__"));for(let f of v)try{let w=JSON.parse(f);for(let m of w.__culvii_dev_definitions__||[]){let T=m?.definition?.id,I=m?.type&&T?`${m.type}:${T}`:null;I&&l.has(I)||(I&&l.add(I),d.push(m));}}catch{}n(d);});})}function Xe(t){return (0, Jt.validateSurfaceResource)(t)}function It(t){if(Array.isArray(t))return t.map(It);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=It(t[n]);return e}return t}function sr(t){if(!t||typeof t!="object")return t;let e={...t};return Array.isArray(e.nodes)&&(e.nodes=e.nodes.map(({id:n,...r})=>r)),e}function or(t){return createHash("sha256").update(JSON.stringify(It(sr(t)))).digest("hex")}function he(t){return (Array.isArray(t?.nodes)?t.nodes:[]).filter(n=>n?.type==="core.agent").map(n=>n?.nodeParams?.agentReferenceKey??n?.nodeParams?.agentId).filter(n=>typeof n=="string"&&!n.startsWith("agt_"))}function Ze(t){return (Array.isArray(t?.nodes)?t.nodes:[]).flatMap(n=>["output","wait"].map(r=>n?.ui?.[r]).filter(r=>r?.kind==="custom"&&typeof r.surfaceKey=="string").map(r=>({surfaceKey:r.surfaceKey,...Number.isInteger(r.version)?{version:r.version}:{}})))}function ir(t){return Array.isArray(t)?t:t&&typeof t=="object"?Object.entries(t).map(([e,n])=>n&&typeof n=="object"&&!Array.isArray(n)?{name:e,...n}:n):[]}function Oe(t){return ir(t?.tools).filter(e=>e&&typeof e=="object"&&!Array.isArray(e)).map(e=>({referenceKey:e.workflowReferenceKey??e.workflowId,toolName:e.name,triggerNodeName:e.triggerNodeName})).filter(e=>typeof e.referenceKey=="string"&&!e.referenceKey.startsWith("wfl_"))}function Ne(t){return Oe(t).map(e=>e.referenceKey)}function cr(t){return typeof t?.type=="string"&&t.type!=="manualTrigger"&&t.type.endsWith("Trigger")}function lr(t,e){return t.get(e)??t.get(Y(e))}function qt(t){let e=new Set,n=[];for(let r of t.values())e.has(r.id)||(e.add(r.id),n.push(r));return n}function zt(t,e){let n=typeof t?.id=="string"?t.id:"unknown";if(Oe(t).length>0)return {id:n,definition:t};let r=n==="unknown"?void 0:lr(e,n);return r?{id:n,definition:r.definition}:t&&typeof t=="object"&&!Array.isArray(t)?{id:n,definition:t}:null}function St(t,e){let n=[t];for(let r of t.definition?.secondaryAgents??[]){let i=zt(r,e);i&&n.push(i);}return n}function Qe(t){let e=new Map,n=new Map;for(let a of t){let c=a.definition?.id;typeof c=="string"&&(a.type==="agent"?(e.set(c,{id:c,definition:a.definition}),e.set(Y(c),{id:c,definition:a.definition})):a.type==="workflow"&&(n.set(c,a.definition),n.set(Y(c),a.definition)));}let r=new Set;for(let a of qt(e))for(let c of St(a,e))for(let o of Ne(c.definition))r.add(Y(o));let i=new Set;for(let a of r){let c=n.get(a);if(c)for(let o of he(c))i.add(Y(o));}for(let a of i){let c=e.get(a);if(c){if(Oe(c.definition).length>0)return `agent '${c.id}' cannot define workflow tools when invoked by an agent workflow tool.`;for(let o of c.definition?.secondaryAgents??[]){let s=zt(o,e);if(s&&Oe(s.definition).length>0)return `secondary agent '${s.id}' referenced by agent '${c.id}' cannot define workflow tools when '${c.id}' is invoked by an agent workflow tool.`}}}return null}function et(t){let e=new Map,n=new Map;for(let i of t){let a=i.definition?.id;typeof a=="string"&&(i.type==="agent"?(e.set(a,{id:a,definition:i.definition}),e.set(Y(a),{id:a,definition:i.definition})):i.type==="workflow"&&(n.set(a,i.definition),n.set(Y(a),i.definition)));}let r=new Set;for(let i of n.values())for(let a of he(i))r.add(Y(a));for(let i of r){let a=e.get(i);if(!a)continue;let c=St(a,e);for(let o of c)for(let s of Oe(o.definition)){let d=n.get(s.referenceKey)??n.get(Y(s.referenceKey));if(!(!d||he(d).length===0))return `workflow tool '${s.toolName??"unknown"}' on agent '${o.id}' cannot reference workflow '${s.referenceKey}' because '${a.id}' is invoked by a workflow and the target workflow contains an agent node.`}}return null}function tt(t){let e=new Map,n=new Map;for(let r of t){let i=r.definition?.id;typeof i=="string"&&(r.type==="agent"?(e.set(i,{id:i,definition:r.definition}),e.set(Y(i),{id:i,definition:r.definition})):r.type==="workflow"&&(n.set(i,r.definition),n.set(Y(i),r.definition)));}for(let r of qt(e))for(let i of St(r,e))for(let a of Oe(i.definition)){let c=n.get(a.referenceKey)??n.get(Y(a.referenceKey));if(!c)continue;let o=Array.isArray(c.nodes)?c.nodes:[],s=o.find(cr);if(s)return `workflow tool '${a.toolName??"unknown"}' on agent '${i.id}' references workflow '${a.referenceKey}' with non-manual trigger '${s.name??s.type}'.`;if(a.triggerNodeName){if(o.find(v=>v?.name===a.triggerNodeName)?.type==="manualTrigger")continue;return `workflow tool '${a.toolName??"unknown"}' on agent '${i.id}' must use a manual trigger in workflow '${a.referenceKey}'.`}let d=o.filter(l=>l?.type==="manualTrigger");if(d.length!==1)return d.length===0?`workflow tool '${a.toolName??"unknown"}' on agent '${i.id}' references workflow '${a.referenceKey}' without a manual trigger.`:`workflow tool '${a.toolName??"unknown"}' on agent '${i.id}' must specify triggerNodeName because workflow '${a.referenceKey}' has multiple manual triggers.`}return null}function nt(t){let e=[],n=(r,i)=>{let a=i&&typeof i=="object"&&!Array.isArray(i)?i.credentialId:void 0;(typeof a!="string"||!a.trim())&&e.push(`agent '${r}' model must include a credentialId \u2014 use model: { provider, modelId, credentialId }.`);};t?.modelConfig!==void 0&&t?.modelConfig!==null&&n(t?.id,t.modelConfig);for(let r of t?.secondaryAgents??[])r?.modelConfig!==void 0&&r?.modelConfig!==null&&n(r?.id??t?.id,r.modelConfig);return e}function rt(t){let e=new Map;for(let i of t){let a=i.definition?.id;if(!a)continue;let c=i.type==="agent"?Ne(i.definition).map(o=>`workflow:${o}`):i.type==="workflow"?he(i.definition).map(o=>`agent:${o}`):[];e.set(`${i.type}:${a}`,c);}let n=null;function r(i,a){if(!n)for(let c of e.get(i)??[]){if(!e.has(c))continue;let o=[...a,c];if(a.length>=3){n=`Unsupported nested SDK reference chain: ${o.join(" -> ")}. Only workflow -> agent -> workflow or agent -> workflow -> agent is supported.`;return}r(c,o);}}for(let i of e.keys())r(i,[i]);return n}function Y(t){return t.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").slice(0,63)}function Tt(t){let e=process.cwd(),n=new Map,r=null,i=false,a=false,c=false;async function o(){if(i){a=true;return}i=true;try{c&&(c=!1,n.clear()),await d();}catch(f){b$1.error("Evaluation failed",{error:f.message});}finally{i=false,a&&(a=false,o());}}function s(f,w,m){t.onLog?t.onLog(w,m):(m==="error"?process.stderr:process.stdout).write(`${f} ${w}
5
+ `);}async function d(){let f=await We(e),w;try{w=await Me(f);}catch(g){s(x,`Evaluation failed, skipping this sync cycle: ${g.message}`,"error");return}let m=new Map,T=new Set,I=new Set(w.map(g=>g.definition.id).filter(Boolean)),x$1=new Set(w.filter(g=>g.type==="surface").flatMap(g=>{let b=g.definition.id;return typeof b=="string"?[b,Y(b)]:[]})),q=false,K=false;for(let g of w){let b=g.definition.id;if(!b){s(y,`Skipping ${g.type}: referenced resources require an explicit id.`,"warn");continue}let O=typeof b=="string"?Y(b):String(b);if(!O){s(y,`Skipping definition: could not derive a valid slug from "${b}". Add an explicit id field.`,"warn");continue}if(g.type==="surface"){let j=Xe(g.definition);if(j.length){s(x,`Invalid surface '${O}': ${j.join("; ")}.`,"error");return}}let L=`${g.type}:${O}`;if(T.has(L)){s(x,`Duplicate slug '${O}' detected in ${g.type}s. Fix all collisions before syncing.`,"error");return}T.add(L);let ee=or(g.definition);m.set(L,{slug:O,type:g.type,definition:g.definition,hash:ee});let se=g.type==="agent"?Ne(g.definition):[],pe=g.type==="workflow"?he(g.definition):[],we=g.type==="workflow"?Ze(g.definition):[];if(g.type==="agent"){for(let j of nt(g.definition))s(x,j,"error"),K=true;for(let j of g.definition.secondaryAgents||[]){let $=j?.id,le=!!(j?.systemPrompt||j?.modelConfig);if(typeof $=="string"&&!le&&!I.has($)){let ae=`Dangling ref: agent '${O}' references secondary agent '${$}' which is not defined locally.`;s(x,ae,"error"),q=true,t.onValidationError?.({resourceType:"agent",slug:O,missingReferenceId:$,message:ae});}}}for(let j of se)if(!I.has(j)){let $=`Dangling ref: agent '${O}' references workflow '${j}' which is not defined locally.`;s(x,$,"error"),q=true,t.onValidationError?.({resourceType:"agent",slug:O,missingReferenceId:j,message:$});}for(let j of pe)if(!I.has(j)){let $=`Dangling ref: workflow '${O}' references agent '${j}' which is not defined locally.`;s(x,$,"error"),q=true,t.onValidationError?.({resourceType:"workflow",slug:O,missingReferenceId:j,message:$});}for(let j of we)if(j.version===void 0&&!x$1.has(j.surfaceKey)){let $=`Dangling ref: workflow '${O}' references local surface '${j.surfaceKey}' which is not defined locally. Pin a published version or define the surface.`;s(x,$,"error"),q=true,t.onValidationError?.({resourceType:"workflow",slug:O,missingReferenceId:j.surfaceKey,message:$});}}if(q){s(x,"Fix all dangling references before syncing.","error");return}if(K){s(x,"Fix the model configuration before syncing.","error");return}let D=Qe(w);if(D){s(x,D,"error"),s(x,"Fix the secondary agent tools before syncing.","error");return}let R=tt(w);if(R){s(x,R,"error"),s(x,"Fix the workflow tool trigger before syncing.","error");return}let N=et(w);if(N){s(x,N,"error"),s(x,"Fix the workflow tool target before syncing.","error");return}let y$1=rt(w);if(y$1){s(x,y$1,"error"),s(x,"Fix the reference chain before syncing.","error");return}let S=0;for(let[g,{hash:b,type:O}]of n.entries())if(!m.has(g)){let L=g.slice(g.indexOf(":")+1),ee=O==="agent"?[...m.values()].find(se=>se.hash===b&&se.type===O):void 0;ee?s(y,`Looks like '${L}' was renamed to '${ee.slug}'.
6
+ Run: culvii rename ${L} ${ee.slug} --resource-type ${O}`,"warn"):(t.onOrphan(L,O),n.delete(g),S++);}let h=[...m.entries()].sort(([,g],[,b])=>+(b.type==="surface")-+(g.type==="surface"));for(let[g,{slug:b,type:O,definition:L,hash:ee}]of h){let se=n.get(g);(!se||se.hash!==ee)&&(n.set(g,{hash:ee,type:O}),t.onSync({type:O,slug:b,definition:L,configHash:ee}),S++);}S===0&&s(z,"No changes to sync.","info");}let l=ar.watch(e,{ignored:f=>f.includes("node_modules")||f.includes(".pnpm-store")||f.includes("/dist/")||f.includes("/.git/")||f.includes("/.next/")||f.includes("/.turbo/"),ignoreInitial:true,persistent:true});l.on("all",(f,w)=>{w.endsWith(".ts")&&(r&&clearTimeout(r),r=setTimeout(()=>{o();},500));});let v=false;return {close:()=>l.close(),triggerFullSync:()=>{if(v){o();return}if(v=true,i){c=true,a=true;return}n.clear(),o();}}}function dr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}var ur="https://console.culvii.com/";function Le(t,e){return `${ur}${t}/development/${e}/workflows`}function Xt(){let t=new Date,e=n=>String(n).padStart(2,"0");return `${e(t.getHours())}:${e(t.getMinutes())}:${e(t.getSeconds())}`}async function fr(){let{DevView:t}=await import('./DevView-GPKSSOLA.js'),e$1=null;function n(){let[r,i]=Ee.useState({type:"provisioning",message:"Starting dev server\u2026"});return Ee.useEffect(()=>(e$1=i,()=>{e$1=null;}),[]),Ee.createElement(t,{state:r})}await G(Promise.resolve(Ee.createElement(n))),await V(async r$1=>{let i=new a$3,a=await i.read({exitOnError:!1}),c=Date.now();if(!a.active||!a.contexts[a.active]){e$1?.({type:"error",message:"No active context. Run culvii login first."});let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_FAILED,y,S,{error_class:"NoActiveContext"}):await e(a$1.DEV_FAILED,{error_class:"NoActiveContext"}),await j();return}let{apiUrl:o,context:s$1}=await r({env:"dev"}),d$1=s(s$1),l=s$1.workspace_id,v=s$1.workspace_slug;e$1?.({type:"provisioning",message:"Provisioning dev workspace\u2026"});try{let y=await W(`${o}/api/workspaces`,r$1,{method:"POST",headers:{...d$1,"Content-Type":"application/json"},body:JSON.stringify({name:`dev-${s$1.user_id.slice(0,12)}`,slug:`dev-${s$1.user_id.slice(0,12)}`,tenantId:s$1.tenant_id})});if(!y.ok){let h=await H(y);e$1?.({type:"error",message:`Failed to auto-provision workspace: ${h}`});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEV_FAILED,g,b,{error_class:"WorkspaceProvisionError",workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"WorkspaceProvisionError",workspace:s$1?.workspace_slug,env:s$1?.environment}),await j();return}let S=await y.json();await i.withLock(async()=>{a=await i.read();let h=a.contexts[a.active];h.workspace_ids={...h.workspace_ids||{},dev:S?.data?.workspaceId},h.workspace_slugs={...h.workspace_slugs||{},dev:S?.data?.workspaceSlug},h.workspace_id=S?.data?.workspaceId,h.workspace_slug=S?.data?.workspaceSlug,await i.write(a);}),s$1={...a.contexts[a.active],environment:"dev"},l=s$1.workspace_id,v=s$1.workspace_slug;}catch(y){e$1?.({type:"error",message:`Failed to auto-provision workspace: ${y.message}`});let{userId:S,tenantId:h}=await d();S?await f(a$1.DEV_FAILED,S,h,{error_class:y?.constructor?.name,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:y?.constructor?.name,workspace:s$1?.workspace_slug,env:s$1?.environment}),await j();return}let{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.DEV_STARTED,f$1,w,{workspace:s$1.workspace_slug,env:s$1.environment}):await e(a$1.DEV_STARTED,{workspace:s$1.workspace_slug,env:s$1.environment});let m=[];function T(y){return {Authorization:`Bearer ${y}`,...d$1}}let I=r$1;async function x(){let y=await mt();return y&&(I=y),T(I)}let q=o.replace(/^http/,"ws")+"/api/dev/sync?workspaceId="+encodeURIComponent(l),K,D=vt(q,x,{onOpen:()=>{e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)}),K?.triggerFullSync();},onAck:(y,S,h)=>{let g={type:h?"orphaned":"synced",message:`${h?"orphaned":"synced"} ${y}`,timestamp:Xt()};m.push(g),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onValidationErrorAck:()=>{},onWarning:(y,S)=>{let h={type:"warning",message:S};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onError:(y,S)=>{let h={type:"error",message:`Sync failed for ${y}: ${S}`};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});},onFatal:async y=>{clearInterval(N);let S=`Fatal error: ${y}. Shutting down...`;e$1?.({type:"error",message:S});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEV_FAILED,h,g,{error_class:"FatalWebSocketError",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"FatalWebSocketError",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}),K?.close(),D?.close(),be(1,S);},onAuthFailure:async()=>{clearInterval(N);let y="Your session was rejected by the server. Run `culvii login` to re-authenticate. Shutting down...";e$1?.({type:"error",message:y});let{userId:S,tenantId:h}=await d();S?await f(a$1.DEV_FAILED,S,h,{error_class:"ApiKeyRejected",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}):await e(a$1.DEV_FAILED,{error_class:"ApiKeyRejected",workspace:s$1.workspace_slug,workspace:s$1?.workspace_slug,env:s$1?.environment}),K?.close(),D?.close(),be(1,y);}});K=Tt({workspaceId:l,onSync:y=>{D.send({type:"sync",slug:y.slug,resourceType:y.type,definition:y.definition,workspaceId:l});},onOrphan:(y,S)=>{D.send({type:"orphan",slug:y,resourceType:S,workspaceId:l});},onValidationError:({resourceType:y,slug:S,missingReferenceId:h,message:g})=>{D.send({type:"validation-error",slug:S,resourceType:y,workspaceId:l,missingReferenceId:h,message:g});},onLog:(y,S)=>{let h={type:S==="error"?"error":S==="warn"?"warning":"info",message:y};m.push(h),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,l)});}});let R=3e3*1e3,N=setInterval(()=>{D.reconnectNow();},R);process.on("SIGINT",async()=>{clearInterval(N),D.close(),K.close(),e$1?.({type:"disconnected"});let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_STOPPED,y,S,{duration_ms:Date.now()-c,workspace:s$1.workspace_slug,env:s$1.environment}):await e(a$1.DEV_STOPPED,{duration_ms:Date.now()-c,workspace:s$1.workspace_slug,env:s$1.environment}),await j(),process.exit(0);});});}function Zt(t){t.command("dev").description("Start the development server and file watcher").action(async()=>{if(dr()){await fr();return}await V(async e$1=>{let n=new a$3,r$1=await n.read({exitOnError:!1});if(!r$1.active||!r$1.contexts[r$1.active]){console.error("No active context. Run culvii login first.");let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_FAILED,D,R,{error_class:"NoActiveContext"}):await e(a$1.DEV_FAILED,{error_class:"NoActiveContext"}),await j(),process.exit(1);}let{apiUrl:i,context:a}=await r({env:"dev"}),c=s(a),o=Date.now(),s$1=a.workspace_id,d$1=a.workspace_slug;try{let D=await W(`${i}/api/workspaces`,e$1,{method:"POST",headers:{...c,"Content-Type":"application/json"},body:JSON.stringify({name:`dev-${a.user_id.slice(0,12)}`,slug:`dev-${a.user_id.slice(0,12)}`,tenantId:a.tenant_id})});if(!D.ok){let N=await H(D);console.error(`Failed to auto-provision workspace: ${N}`);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEV_FAILED,y,S,{error_class:"WorkspaceProvisionError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"WorkspaceProvisionError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),process.exit(1);}let R=await D.json();await n.withLock(async()=>{r$1=await n.read();let N=r$1.contexts[r$1.active];N.workspace_ids={...N.workspace_ids||{},dev:R?.data?.workspaceId},N.workspace_slugs={...N.workspace_slugs||{},dev:R?.data?.workspaceSlug},N.workspace_id=R?.data?.workspaceId,N.workspace_slug=R?.data?.workspaceSlug,await n.write(r$1);}),a={...r$1.contexts[r$1.active],environment:"dev"},s$1=a.workspace_id,d$1=a.workspace_slug;}catch(D){console.error(`Failed to auto-provision workspace: ${D.message}`);let{userId:R,tenantId:N}=await d();R?await f(a$1.DEV_FAILED,R,N,{error_class:D?.constructor?.name,workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:D?.constructor?.name,workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),process.exit(1);}console.log(`tenant: ${a.tenant_slug} | workspace: ${d$1||"unknown"} | env: dev`);let{userId:l,tenantId:v}=await d();l?await f(a$1.DEV_STARTED,l,v,{workspace:a.workspace_slug,env:a.environment}):await e(a$1.DEV_STARTED,{workspace:a.workspace_slug,env:a.environment});function f$1(D){return {Authorization:`Bearer ${D}`,...c}}let w$1=e$1;async function m(){let D=await mt();return D&&(w$1=D),f$1(w$1)}let T=i.replace(/^http/,"ws")+"/api/dev/sync?workspaceId="+encodeURIComponent(s$1),I,x$1=vt(T,m,{onOpen:()=>{console.log("Watching ./..."),console.log(`You can access your dev session here: ${Le(a.tenant_slug,s$1)}`),I?.triggerFullSync();},onAck:(D,R,N)=>{let y=Xt();console.log(N?`${w} [${y}] orphaned ${D}`:`${w} [${y}] synced ${D}`);},onValidationErrorAck:()=>{},onWarning:(D,R)=>{console.log(`${y} ${R}`);},onError:(D,R)=>{console.log(`${y} Sync failed for ${D}: ${R}`);},onFatal:async D=>{clearInterval(K),console.error(`Fatal error: ${D}. Shutting down...`);let{userId:R,tenantId:N}=await d();R?await f(a$1.DEV_FAILED,R,N,{error_class:"FatalWebSocketError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"FatalWebSocketError",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),I?.close(),x$1?.close(),process.exit(1);},onAuthFailure:async()=>{clearInterval(K),console.error(`${x} Your session was rejected by the server. Run \`culvii login\` to re-authenticate. Shutting down...`);let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_FAILED,D,R,{error_class:"ApiKeyRejected",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}):await e(a$1.DEV_FAILED,{error_class:"ApiKeyRejected",workspace:a.workspace_slug,workspace:a?.workspace_slug,env:a?.environment}),await j(),I?.close(),x$1?.close(),process.exit(1);}});I=Tt({workspaceId:s$1,onSync:D=>{let R={type:"sync",slug:D.slug,resourceType:D.type,definition:D.definition,workspaceId:s$1};x$1.send(R);},onOrphan:(D,R)=>{let N={type:"orphan",slug:D,resourceType:R,workspaceId:s$1};x$1.send(N);},onValidationError:({resourceType:D,slug:R,missingReferenceId:N,message:y})=>{let S={type:"validation-error",slug:R,resourceType:D,workspaceId:s$1,missingReferenceId:N,message:y};x$1.send(S);}});let q=3e3*1e3,K=setInterval(()=>{x$1.reconnectNow();},q);process.on("SIGINT",async()=>{clearInterval(K),x$1.close(),I.close(),console.log("Disconnected. Draft state discarded.");let{userId:D,tenantId:R}=await d();D?await f(a$1.DEV_STOPPED,D,R,{duration_ms:Date.now()-o,workspace:a.workspace_slug,env:a.environment}):await e(a$1.DEV_STOPPED,{duration_ms:Date.now()-o,workspace:a.workspace_slug,env:a.environment}),await j(),process.exit(0);});});});}function gr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Ct(t){if(Array.isArray(t))return t.map(Ct);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Ct(t[n]);return e}return t}function mr(t){if(!t||typeof t!="object")return t;let e={...t};return Array.isArray(e.nodes)&&(e.nodes=e.nodes.map(({id:n,...r})=>r)),e}function en(t){return createHash("sha256").update(JSON.stringify(Ct(mr(t)))).digest("hex")}function wr(t){return new Promise(e=>{let n=pr.createInterface({input:process.stdin,output:process.stdout});n.question(t,r=>{n.close(),e(r.toLowerCase()==="y"||r.toLowerCase()==="yes");});})}function vr(t){let e=t.versionCount??1,n=t.activeVersion??t.previousVersion;return ` - ${t.slug}: deletes all ${e} ${e===1?"version":"versions"}${n?`; active is v${n}`:""}`}function Qt(t){let e=t.executions??0,n=t.activeExecutions??0,r=t.activeVersion??t.previousVersion;return `${e} total, active${r?` v${r}`:""}: ${n} executions`}async function Er(t){let{DeployView:e$1}=await import('./DeployView-D4UEXMDJ.js'),n=null,r$1=null;function i(){let[a,c]=Ee.useState({type:"planning"});return Ee.useEffect(()=>(n=c,()=>{n=null;}),[]),Ee.createElement(e$1,{state:a,onConfirm:o=>r$1?.(o)})}await G(Promise.resolve(Ee.createElement(i))),await V(async a=>{if(t.env==="dev"){n?.({type:"error",message:"Use culvii dev for local iteration"}),await j();return}if(t.env!=="sandbox"&&t.env!=="prod"){n?.({type:"error",message:"Environment must be sandbox or prod"}),await j();return}let{apiUrl:c,context:o}=await r({env:t.env}),s$1=s(o);if(!t.workspaceSlug){n?.({type:"error",message:"--workspace-slug <slug> is required for deploy",detail:"Run `culvii workspace list` to see available workspaces."});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{error_class:"NoWorkspace",workspace:t.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{error_class:"NoWorkspace",workspace:t.workspaceSlug}),await j();return}let d$1=await W(`${c}/api/workspaces?tenantId=${o.tenant_id}`,a,{headers:s$1});if(!d$1.ok){n?.({type:"error",message:"Failed to fetch workspaces",detail:await H(d$1)});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{env:t.env,error_class:"WorkspaceFetchError",workspace:t.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{env:t.env,error_class:"WorkspaceFetchError",workspace:t.workspaceSlug}),await j();return}let f$1=((await d$1.json())?.data?.workspaces||[]).find(h=>h.slug===t.workspaceSlug);if(!f$1){n?.({type:"error",message:`Workspace not found: ${t.workspaceSlug}`});let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_FAILED,h,g,{env:t.env,workspace:t.workspaceSlug,error_class:"WorkspaceNotFound"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:t.workspaceSlug,error_class:"WorkspaceNotFound"}),await j();return}let w=f$1.id,m=async h=>{n?.({type:"error",message:h});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEPLOY_FAILED,g,b,{env:t.env,workspace:f$1?.slug,error_class:"ValidationError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"ValidationError"}),await j();},T=process.cwd(),I=await We(T),x;try{x=(await Me(I)).sort((h,g)=>+(g.type==="surface")-+(h.type==="surface"));}catch(h){await m(`Deploy failed: ${h.message}`);return}let q=[],K=new Set,D=new Set(x.filter(h=>h.type==="surface").map(h=>Y(h.definition.id??"")).filter(Boolean));for(let h of x){let g=h.definition.id;g&&K.add(typeof g=="string"?Y(g):String(g));}for(let h of x){let g=h.definition.id;if(!g){n?.({type:"error",message:`Deploy failed: ${h.type} is missing an explicit id.`}),await j();return}let b=typeof g=="string"?Y(g):String(g);if(h.type==="surface"){let O=Xe(h.definition);if(O.length)return m(`Deploy failed: surface '${b}' ${O.join("; ")}.`)}if(h.type==="agent"){for(let L of nt(h.definition))return m(`Deploy failed: ${L}`);let O=h.definition.secondaryAgents||[];for(let L of O){let ee=L.id,se=!!(L?.systemPrompt||L?.modelConfig);if(ee&&!se&&!K.has(ee))return m(`Deploy failed: agent '${b}' references secondary agent '${ee}' which is not defined.`)}for(let L of Ne(h.definition))if(!K.has(Y(L)))return m(`Deploy failed: agent '${b}' references workflow '${L}' which is not defined.`)}if(h.type==="workflow"){for(let O of he(h.definition))if(!K.has(Y(O)))return m(`Deploy failed: workflow '${b}' references agent '${O}' which is not defined.`);for(let O of Ze(h.definition))if(O.version===void 0&&!D.has(Y(O.surfaceKey)))return m(`Deploy failed: workflow '${b}' references local surface '${O.surfaceKey}' which is not defined. Pin a published version or define the surface.`)}q.push({type:h.type,slug:b,definition:h.definition,configHash:en(h.definition)});}let R=Qe(x);if(R)return m(`Deploy failed: ${R}`);let N=tt(x);if(N)return m(`Deploy failed: ${N}`);let y=et(x);if(y)return m(`Deploy failed: ${y}`);let S=rt(x);if(S)return m(`Deploy failed: ${S}`);try{let{userId:h,tenantId:g}=await d();h?await f(a$1.DEPLOY_STARTED,h,g,{env:t.env,workspace:f$1.slug}):await e(a$1.DEPLOY_STARTED,{env:t.env,workspace:f$1.slug});let b=await W(`${c}/api/workspaces/${w}/deploys/plan`,a,{method:"POST",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({environment:t.env,definitions:q})});if(!b.ok){let ae=await H(b);n?.({type:"error",message:"Failed to plan deploy",detail:ae});let{userId:_e,tenantId:pt}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,pt,{env:t.env,workspace:f$1?.slug,error_class:"PlanError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"PlanError"}),await j();return}let O=await b.json(),L=O.plan,ee=O.planToken;if(!((L.created||[]).length>0||(L.versioned||[]).length>0||(L.destroyed||[]).length>0)){n?.({type:"no_changes"}),await j();return}if(!await new Promise(ae=>{r$1=ae,n?.({type:"confirming",plan:{created:L.created||[],versioned:L.versioned||[],destroyed:L.destroyed||[]},env:t.env});})){n?.({type:"aborted",reason:"user_cancelled"});let{userId:ae,tenantId:_e}=await d();ae?await f(a$1.DEPLOY_ABORTED,ae,_e,{env:t.env,workspace:f$1?.slug,reason:"user_cancelled"}):await e(a$1.DEPLOY_ABORTED,{env:t.env,workspace:f$1?.slug,reason:"user_cancelled"}),await j();return}n?.({type:"applying"});let we=await W(`${c}/api/workspaces/${w}/deploys/apply`,a,{method:"POST",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({planToken:ee})});if(!we.ok){let ae=await H(we);n?.({type:"error",message:"Failed to apply deploy",detail:ae});let{userId:_e,tenantId:pt}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,pt,{env:t.env,workspace:f$1?.slug,error_class:"ApplyError"}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:"ApplyError"}),await j();return}let j$1=await we.json();n?.({type:"success",env:t.env,created:(j$1.created||[]).length,versioned:(j$1.versioned||[]).length,destroyed:(j$1.destroyed||[]).length,createdItems:j$1.created||[],versionedItems:j$1.versioned||[],destroyedItems:j$1.destroyed||[]});let{userId:$,tenantId:le}=await d();$?await f(a$1.DEPLOY_SUCCEEDED,$,le,{env:t.env,workspace:f$1.slug,created:L.created.length,versioned:L.versioned.length,destroyed:L.destroyed.length}):await e(a$1.DEPLOY_SUCCEEDED,{env:t.env,workspace:f$1.slug,created:L.created.length,versioned:L.versioned.length,destroyed:L.destroyed.length});}catch(h){n?.({type:"error",message:"Unexpected error",detail:h.message});let{userId:g,tenantId:b}=await d();g?await f(a$1.DEPLOY_FAILED,g,b,{env:t.env,workspace:f$1?.slug,error_class:h?.constructor?.name}):await e(a$1.DEPLOY_FAILED,{env:t.env,workspace:f$1?.slug,error_class:h?.constructor?.name}),await j();}});}function tn(t){t.command("deploy").description("Deploy an agent").requiredOption("--env <env>","Environment (sandbox or prod)").option("--workspace-slug <slug>","Target workspace slug (overrides config)").action(async e$1=>{if(gr()){await Er(e$1);return}await V(async n=>{e$1.env==="dev"&&(console.log("Use culvii dev for local iteration"),await j(),process.exit(1)),e$1.env!=="sandbox"&&e$1.env!=="prod"&&(console.error("Environment must be sandbox or prod"),await j(),process.exit(1));let{apiUrl:r$1,context:i}=await r({env:e$1.env}),a=s(i);if(!e$1.workspaceSlug){console.error("Error: --workspace-slug <slug> is required for deploy. Run `culvii workspace list` to see available workspaces.");let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{error_class:"NoWorkspace",workspace:e$1.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{error_class:"NoWorkspace",workspace:e$1.workspaceSlug}),await j(),process.exit(1);}let c=null,o=await W(`${r$1}/api/workspaces?tenantId=${i.tenant_id}`,n,{headers:a});if(!o.ok){console.error(`Failed to fetch workspaces: ${await H(o)}`);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{env:e$1.env,error_class:"WorkspaceFetchError",workspace:e$1.workspaceSlug}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,error_class:"WorkspaceFetchError",workspace:e$1.workspaceSlug}),await j(),process.exit(1);}let l=((await o.json())?.data?.workspaces||[]).find(y=>y.slug===e$1.workspaceSlug);if(!l){console.error("Workspace not found: "+e$1.workspaceSlug);let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_FAILED,y,S,{env:e$1.env,workspace:e$1.workspaceSlug,error_class:"WorkspaceNotFound"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:e$1.workspaceSlug,error_class:"WorkspaceNotFound"}),await j(),process.exit(1);}c=l.id;let v=e$1.workspaceSlug;console.log(`tenant: ${i.tenant_slug} | workspace: ${v} | env: ${e$1.env}`);let f$1=async y=>{console.error(y);let{userId:S,tenantId:h}=await d();S?await f(a$1.DEPLOY_FAILED,S,h,{env:e$1.env,workspace:l?.slug,error_class:"ValidationError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"ValidationError"}),await j(),process.exit(1);},w$1=process.cwd(),m=await We(w$1),T;try{T=(await Me(m)).sort((y,S)=>+(S.type==="surface")-+(y.type==="surface"));}catch(y){await f$1(`Deploy failed: ${y.message}`);return}let I=[],x=new Set,q=new Set(T.filter(y=>y.type==="surface").map(y=>Y(y.definition.id??"")).filter(Boolean));for(let y of T){let S=y.definition.id;S&&x.add(typeof S=="string"?Y(S):String(S));}for(let y of T){let S=y.definition.id;S||(console.error(`Deploy failed: ${y.type} is missing an explicit id.`),await j(),process.exit(1));let h=typeof S=="string"?Y(S):String(S);if(y.type==="surface"){let g=Xe(y.definition);g.length&&await f$1(`Deploy failed: surface '${h}' ${g.join("; ")}.`);}if(y.type==="agent"){for(let b of nt(y.definition))await f$1(`Deploy failed: ${b}`);let g=y.definition.secondaryAgents||[];for(let b of g){let O=b.id,L=!!(b?.systemPrompt||b?.modelConfig);O&&!L&&!x.has(O)&&await f$1(`Deploy failed: agent '${h}' references secondary agent '${O}' which is not defined in this workspace. Define '${O}' before deploying.`);}for(let b of Ne(y.definition))x.has(Y(b))||await f$1(`Deploy failed: agent '${h}' references workflow '${b}' which is not defined in this workspace. Define '${b}' before deploying.`);}if(y.type==="workflow"){for(let g of he(y.definition))x.has(Y(g))||await f$1(`Deploy failed: workflow '${h}' references agent '${g}' which is not defined in this workspace. Define '${g}' before deploying.`);for(let g of Ze(y.definition))g.version===void 0&&!q.has(Y(g.surfaceKey))&&await f$1(`Deploy failed: workflow '${h}' references local surface '${g.surfaceKey}' which is not defined. Pin a published version or define the surface.`);}I.push({type:y.type,slug:h,definition:y.definition,configHash:en(y.definition)});}let K=Qe(T);K&&await f$1(`Deploy failed: ${K}`);let D=tt(T);D&&await f$1(`Deploy failed: ${D}`);let R=et(T);R&&await f$1(`Deploy failed: ${R}`);let N=rt(T);N&&await f$1(`Deploy failed: ${N}`);try{let{userId:y,tenantId:S}=await d();y?await f(a$1.DEPLOY_STARTED,y,S,{env:e$1.env,workspace:l.slug}):await e(a$1.DEPLOY_STARTED,{env:e$1.env,workspace:l.slug});let h=await W(`${r$1}/api/workspaces/${c}/deploys/plan`,n,{method:"POST",headers:{...a,"Content-Type":"application/json"},body:JSON.stringify({environment:e$1.env,definitions:I})});if(!h.ok){let $=await H(h);console.error(`Error: Failed to plan deploy. ${$}`);let{userId:le,tenantId:ae}=await d();le?await f(a$1.DEPLOY_FAILED,le,ae,{env:e$1.env,workspace:l?.slug,error_class:"PlanError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"PlanError"}),await j(),process.exit(1);}let g=await h.json(),b=g.plan,O=g.planToken;(b.created||[]).length>0||(b.versioned||[]).length>0||(b.destroyed||[]).length>0||(console.log("Nothing to deploy. All resources are up to date."),await j(),process.exit(0)),console.log(`Plan for ${e$1.env}:`);for(let $ of b.created||[])console.log(` + ${$.slug} CREATED`);for(let $ of b.versioned||[])console.log(` ~ ${$.slug} VERSIONED (${Qt($)})`);for(let $ of b.destroyed||[])console.log(` - ${$.slug} DELETE (${Qt($)})`),console.log(vr($));if(!await wr(`Deploy to ${e$1.env}? [y/N] `)){console.log("Deployment cancelled.");let{userId:$,tenantId:le}=await d();$?await f(a$1.DEPLOY_ABORTED,$,le,{env:e$1.env,workspace:l?.slug,reason:"user_cancelled"}):await e(a$1.DEPLOY_ABORTED,{env:e$1.env,workspace:l?.slug,reason:"user_cancelled"}),await j(),process.exit(0);}let se=await W(`${r$1}/api/workspaces/${c}/deploys/apply`,n,{method:"POST",headers:{...a,"Content-Type":"application/json"},body:JSON.stringify({planToken:O})});if(!se.ok){let $=await H(se);console.error(`Error: Failed to apply deploy. ${$}`);let{userId:le,tenantId:ae}=await d();le?await f(a$1.DEPLOY_FAILED,le,ae,{env:e$1.env,workspace:l?.slug,error_class:"ApplyError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:"ApplyError"}),await j(),process.exit(1);}let pe=await se.json();console.log(`${w} Deployed to ${e$1.env}`),console.log(` Created: ${(pe.created||[]).length} resource(s)`);for(let $ of pe.created||[])console.log(` + ${$.slug||$.referenceKey||$.id}`);console.log(` Versioned: ${(pe.versioned||[]).length} resource(s)`);for(let $ of pe.versioned||[])console.log(` ~ ${$.slug||$.referenceKey||$.id}`);console.log(` Destroyed: ${(pe.destroyed||[]).length} resource(s)`);for(let $ of pe.destroyed||[])console.log(` - ${$.slug||$.referenceKey||$.id}`);let{userId:we,tenantId:j$1}=await d();we?await f(a$1.DEPLOY_SUCCEEDED,we,j$1,{env:e$1.env,workspace:l.slug,created:b.created.length,versioned:b.versioned.length,destroyed:b.destroyed.length}):await e(a$1.DEPLOY_SUCCEEDED,{env:e$1.env,workspace:l.slug,created:b.created.length,versioned:b.versioned.length,destroyed:b.destroyed.length});}catch(y){console.error(`Error: Network or unexpected error: ${y.message}`);let{userId:S,tenantId:h}=await d();S?await f(a$1.DEPLOY_FAILED,S,h,{env:e$1.env,workspace:l?.slug,error_class:y?.constructor?.name}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:l?.slug,error_class:y?.constructor?.name}),await j(),process.exit(1);}});});}function kr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function nn(t){t.command("rename").description("Rename a resource").argument("<old-slug>","Current slug").argument("<new-slug>","New slug").requiredOption("--resource-type <type>","Type of resource (agent)").option("--env <env>","Target environment (sandbox or prod)").option("--workspace-slug <slug>","Target workspace slug (overrides config)").action(async(e$1,n,r$1)=>{if(kr()){let o=function(){let[s,d]=Ee.useState({type:"loading"});return Ee.useEffect(()=>(c.current=d,()=>{c.current=null;}),[]),Ee.createElement(a,{state:s})};let{RenameView:a}=await import('./RenameView-3BABATL6.js'),c={current:null};if(await G(Promise.resolve(Ee.createElement(o))),r$1.resourceType!=="agent"){c.current?.({type:"error",message:"Invalid resource type",detail:`'${r$1.resourceType}' \u2014 must be: agent`}),await e(a$1.RENAME_FAILED,{error_class:"InvalidResourceType",resourceType:r$1.resourceType,env:r$1.env,workspace:r$1.workspaceSlug}),await j();return}await V(async s$1=>{let{apiUrl:d$1,context:l}=await r({env:r$1.env}),v=s(l),{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.RENAME_STARTED,f$1,w,{resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_STARTED,{resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();let m=l.workspace_id;if(r$1.workspaceSlug){let T=await W(`${d$1}/api/workspaces?tenantId=${l.tenant_id}`,s$1,{headers:v});if(!T.ok){c.current?.({type:"error",message:"Failed to fetch workspaces",detail:await H(T)}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}let x=((await T.json())?.data?.workspaces||[]).find(q=>q.slug===r$1.workspaceSlug);if(!x){c.current?.({type:"error",message:`Workspace not found: ${r$1.workspaceSlug}`}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}m=x.id;}if(!m){c.current?.({type:"error",message:"No workspace configured",detail:"Run culvii dev first, or provide --workspace-slug <slug>."}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}try{let T=await W(`${d$1}/api/workspaces/${m}/resources/${e$1}/rename`,s$1,{method:"PATCH",headers:{...v,"Content-Type":"application/json"},body:JSON.stringify({newSlug:n,resourceType:r$1.resourceType})});if(!T.ok){let I=await H(T);c.current?.({type:"error",message:"Failed to rename resource",detail:`Server responded with ${T.status}: ${I}`}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:I,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:I,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();return}c.current?.({type:"success",oldSlug:e$1,newSlug:n}),f$1?await f(a$1.RENAME_SUCCEEDED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_SUCCEEDED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();}catch(T){c.current?.({type:"error",message:"Unexpected error",detail:T.message}),f$1?await f(a$1.RENAME_FAILED,f$1,w,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:T.message,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:T.message,env:l.environment,workspace:r$1.workspaceSlug??l.workspace_slug}),await j();}});return}await V(async a=>{r$1.resourceType!=="agent"&&(console.error(`Error: Invalid resource type '${r$1.resourceType}'. Must be: agent`),await e(a$1.RENAME_FAILED,{error_class:"InvalidResourceType",resourceType:r$1.resourceType,env:r$1.env,workspace:r$1.workspaceSlug}),await j(),process.exit(1));let{apiUrl:c,context:o}=await r({env:r$1.env}),s$1=s(o),{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.RENAME_STARTED,d$1,l,{resourceType:r$1.resourceType,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_STARTED,{resourceType:r$1.resourceType,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),console.log(`tenant: ${o.tenant_slug} | workspace: ${r$1.workspaceSlug||o.workspace_slug||"unknown"} | env: ${o.environment}`);let v=o.workspace_id;if(r$1.workspaceSlug){let f$1=await W(`${c}/api/workspaces?tenantId=${o.tenant_id}`,a,{headers:s$1});f$1.ok||(console.error(`Failed to fetch workspaces: ${await H(f$1)}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),process.exit(1));let T=((await f$1.json())?.data?.workspaces||[]).find(I=>I.slug===r$1.workspaceSlug);T||(console.error("Workspace not found: "+r$1.workspaceSlug),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),process.exit(1)),v=T.id;}v||(console.error("Error: No workspace configured. Run culvii dev first, or provide --workspace-slug <slug>."),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),process.exit(1));try{let f$1=await W(`${c}/api/workspaces/${v}/resources/${e$1}/rename`,a,{method:"PATCH",headers:{...s$1,"Content-Type":"application/json"},body:JSON.stringify({newSlug:n,resourceType:r$1.resourceType})});if(!f$1.ok){let w=await H(f$1);console.error(`Error: Failed to rename resource. Server responded with ${f$1.status}: ${w}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:w,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:w,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),process.exit(1);}console.log(`${w} Renamed ${e$1} ${z} ${n}`),console.log(" Immutable ID preserved. All execution history retained."),d$1?await f(a$1.RENAME_SUCCEEDED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_SUCCEEDED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j();}catch(f$1){console.error(`Error: Network or unexpected error: ${f$1.message}`),d$1?await f(a$1.RENAME_FAILED,d$1,l,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:f$1.message,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:f$1.message,env:o.environment,workspace:r$1.workspaceSlug??o.workspace_slug}),await j(),process.exit(1);}});});}async function an(t,e,n){let r=await W(`${e}/auth/me`,t,{skipEnvironmentHeader:true});if(!r.ok)return {ok:false,status:r.status,error:await H(r)};let i=await r.json(),a=i?.user||i?.data?.user||i,c=i?.tenant||i?.data?.tenant||{},o=c?.slug||n.tenant_slug||"Unknown",s=c?.name||n.tenant_slug||"Unknown",d=Array.isArray(i?.tenants)?i.tenants.find(v=>v.id===c?.id):void 0,l=Array.isArray(d?.roleConfig?.grants)?d.roleConfig.grants:[];return {ok:true,email:a?.email||"Unknown",name:a?.name||"Unknown",tenant:o,tenantName:s,workspace:n.workspace_slug||null,access:l}}function hr(t){let e=t.environment?t.workspace?`${t.environment.environmentName} / ${t.workspace.workspaceName}`:`${t.environment.environmentName} \xB7 all workspaces`:"tenant level";return `${t.role.displayName} \u2014 ${e}`}async function Ve(t,e$1){let{userId:n,tenantId:r}=await d(),i=t?{error:true,...e$1}:e$1?{...e$1}:void 0;n?await f(a$1.WHOAMI_VIEWED,n,r,i):await e(a$1.WHOAMI_VIEWED,i),await j();}function sn(t){t.command("whoami").description("Show current authenticated user context").option("--json","Output as JSON").action(async e=>{let{getCapabilities:n}=await import('./terminalCapabilities-LJTRMVG4.js'),r=n();if(e.json||!r.isTTY||r.isCI||!r.supportsColor||!r.supportsUnicode){await _r();return}await Ar();});}async function _r(){await V(async t=>{let{apiUrl:e,context:n}=await r(),r$1=await an(t,e,n);r$1.ok||(process.stderr.write(JSON.stringify({error:r$1.error})+`
7
+ `),await Ve(!0),process.exit(1)),process.stdout.write(JSON.stringify({email:r$1.email,name:r$1.name,tenant:r$1.tenant,tenant_name:r$1.tenantName,workspace:r$1.workspace,access:r$1.access})+`
8
+ `),await Ve(!1,{workspace:r$1.workspace});});}async function Ar(){let{WhoamiView:t}=await import('./WhoamiView-TKSYSHQ2.js'),e={type:"loading"},n=null,{useState:r$1,useEffect:i}=await import('react');function a(){let[c,o]=r$1(e);return i(()=>(n=o,()=>{n=null;}),[]),Ee.createElement(t,{state:c})}await G(Promise.resolve(Ee.createElement(a))),await V(async c=>{try{let{apiUrl:o,context:s}=await r(),d=await an(c,o,s);if(!d.ok){n?.({type:"error",message:"Failed to fetch identity",detail:`Server responded with ${d.status}: ${d.error}`}),await Ve(!0);return}n?.({type:"success",email:d.email,name:d.name,tenant:d.tenant,tenantName:d.tenantName,workspace:d.workspace,access:d.access.map(hr)}),await Ve(!1,{workspace:d.workspace});}catch(o){n?.({type:"error",message:"Unexpected error",detail:o.message}),await Ve(!0);}});}function Ir(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function ct(t){return t.workspace_slugs?.[t.environment]??t.workspace_slug??null}function on(t){t.command("switch [tenant-slug]").description("Switch the active tenant context").action(async e$1=>{try{let n=new a$3,r;try{r=await n.read({exitOnError:!1});}catch(d$1){if(d$1.message==="Active context key not found"){let l=re.join(Rt.homedir(),".culvii","config"),v=await ce.readFile(l,"utf-8");r=JSON.parse(v);}else if(d$1.code==="ENOENT"){console.error("No configuration found. Please run `culvii login` first.");let{userId:l,tenantId:v}=await d();l?await f(a$1.TENANT_SWITCH_FAILED,l,v,{error_class:"ENOENT",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"ENOENT",slug:e$1}),await j(),process.exit(1);}else throw d$1}if(!r||!r.contexts){console.error("No configuration found. Please run `culvii login` first.");let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"NoConfig",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoConfig",slug:e$1}),await j(),process.exit(1);}let i=r.contexts,a=Object.keys(i);if(a.length===0){console.error("No tenants available. Please run `culvii login` first.");let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"NoTenants",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoTenants",slug:e$1}),await j(),process.exit(1);}if(Ir()){let{SwitchView:d$1}=await import('./SwitchView-PS3ICKZT.js');if(a.length===1&&!e$1&&(await G(Promise.resolve(Ee.createElement(d$1,{state:{type:"only_one",slug:a[0]}}))),process.exit(0)),!e$1){let w=a.map(m=>({slug:m,tenantId:i[m].tenant_id,workspaceSlug:ct(i[m]),environment:i[m].environment,isActive:m===r.active}));await G(Promise.resolve(Ee.createElement(d$1,{state:{type:"list",tenants:w}}))),process.exit(0);}if(!i[e$1]){let w=a.map(I=>({slug:I,tenantId:i[I].tenant_id,workspaceSlug:ct(i[I]),environment:i[I].environment,isActive:I===r.active}));await G(Promise.resolve(Ee.createElement(d$1,{state:{type:"error",message:`Tenant '${e$1}' not found.`}})));let{userId:m,tenantId:T}=await d();m?await f(a$1.TENANT_SWITCH_FAILED,m,T,{error_class:"TenantNotFound",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"TenantNotFound",slug:e$1}),await j(),process.exit(1);}await n.withLock(async()=>{let w=re.join(Rt.homedir(),".culvii","config"),m=await ce.readFile(w,"utf-8"),T=JSON.parse(m);await n.write({...T,active:e$1});});let l=i[e$1];await G(Promise.resolve(Ee.createElement(d$1,{state:{type:"success",slug:e$1,workspaceSlug:ct(l),environment:l.environment}}))),c();let{userId:v,tenantId:f$1}=await d();v?await f(a$1.TENANT_SWITCHED,v,f$1,{to:e$1}):await e(a$1.TENANT_SWITCHED,{to:e$1}),await j();return}if(a.length===1&&!e$1&&(console.log(`Only one tenant available: ${a[0]}`),process.exit(0)),e$1||(console.log("Available tenants:"),a.forEach((d,l)=>{let v=i[d],f=d===r.active?"*":" ";console.log(`${l+1}. ${f} ${d} (Tenant ID: ${v.tenant_id})`);}),console.log(`
9
+ To switch, run: culvii switch <tenant-slug>`),process.exit(0)),!i[e$1]){console.error(`Error: Tenant '${e$1}' not found.`),console.log(`
10
+ Available tenants:`),a.forEach((v,f)=>{let w=i[v],m=v===r.active?"*":" ";console.log(`${f+1}. ${m} ${v} (Tenant ID: ${w.tenant_id})`);});let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,l,{error_class:"TenantNotFound",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"TenantNotFound",slug:e$1}),await j(),process.exit(1);}await n.withLock(async()=>{let d=re.join(Rt.homedir(),".culvii","config"),l=await ce.readFile(d,"utf-8"),v=JSON.parse(l);await n.write({...v,active:e$1});});let c$1=i[e$1];console.log(`tenant: ${e$1} | workspace: ${ct(c$1)||"none"} | env: ${c$1.environment}`),console.log(`Switched to tenant: ${e$1}`),c();let{userId:o,tenantId:s}=await d();o?await f(a$1.TENANT_SWITCHED,o,s,{to:e$1}):await e(a$1.TENANT_SWITCHED,{to:e$1}),await j();}catch(n){n.code==="ENOENT"?console.error("No configuration found. Please run `culvii login` first."):console.error(`Failed to switch context: ${n.message}`);let{userId:r,tenantId:i}=await d();r?await f(a$1.TENANT_SWITCH_FAILED,r,i,{error_class:n.code||n.constructor?.name||"UnknownError",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:n.code||n.constructor?.name||"UnknownError",slug:e$1}),await j(),process.exit(1);}});}var cn=["dev","sandbox","prod"];function br(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}async function lt(t){if(!br())return false;let{EnvView:e}=await import('./EnvView-3ZURMIZS.js');return await G(Promise.resolve(Ee.createElement(e,{state:t}))),true}async function Rr(t,e,n){let r=await W(`${e}/auth/me`,t,{skipEnvironmentHeader:true});if(!r.ok)return [];let i=await r.json(),a=i?.tenant||{};return ((Array.isArray(i?.tenants)?i.tenants.find(o=>o.id===(n??a?.id)):void 0)?.environments??[]).map(o=>l(o.slug)).filter(o=>o!==null)}function ln(t){t.command("env [environment]").description("Show or switch the active environment (dev, sandbox, prod)").action(async e$1=>{await V(async n=>{let{apiUrl:r$1,context:i}=await r(),a=await Rr(n,r$1,i.tenant_id);if(!e$1){if(await lt({type:"show",current:i.environment,tenant:i.tenant_slug,accessible:a}))return;let v=a.includes(i.environment)?"":" (no access)";process.stdout.write(`current: ${i.environment}${v}
11
+ `),process.stdout.write(`tenant: ${i.tenant_slug}
12
12
  `),process.stdout.write(`available: ${a.length?a.join(", "):"none"}
13
- `),!a.includes(o.environment)&&a.length>0&&process.stdout.write(`
13
+ `),!a.includes(i.environment)&&a.length>0&&process.stdout.write(`
14
14
  Switch with: culvii env ${a[0]}
15
- `);return}let c$1=e$1.toLowerCase();if(!on.includes(c$1)){let k=`Invalid environment '${e$1}'.`,f=`Valid values: ${on.join(", ")}.`;if(await e(a$1.ENV_SWITCH_FAILED,{error_class:"InvalidEnv",env:e$1}),await j(),await ct({type:"error",message:k,detail:f})){process.exitCode=1;return}process.stderr.write(`${k} ${f}
16
- `),process.exit(1);}let i=c$1;if(a.length&&!a.includes(i)){let k=`You don't have access to '${i}' in this tenant.`,f=`Accessible: ${a.join(", ")}.`;if(await e(a$1.ENV_SWITCH_FAILED,{error_class:"NoAccess",env:i}),await j(),await ct({type:"error",message:k,detail:f})){process.exitCode=1;return}process.stderr.write(`${k} ${f}
17
- `),process.exit(1);}let s=new a$3;await s.withLock(async()=>{let k=re.join(bt.homedir(),".culvii","config"),f=await ce.readFile(k,"utf-8"),w=JSON.parse(f),m=w.contexts[w.active];m&&(m.environment=i,m.environment_id=m.environment_ids?.[i]??m.environment_id),await s.write(w);}),await ct({type:"success",env:i,tenant:o.tenant_slug})||(process.stdout.write(`env: ${i} | tenant: ${o.tenant_slug}
18
- `),process.stdout.write(`Switched environment to ${i}
19
- `)),c();let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.ENV_SWITCHED,d$1,l,{to:i}):await e(a$1.ENV_SWITCHED,{to:i}),await j();});});}var lt={claude:{projectDir:".claude/skills/culvii",globalDir:".claude/skills/culvii",detect:".claude"},cursor:{projectDir:".cursor/skills/culvii",globalDir:".cursor/skills/culvii",detect:".cursor"},windsurf:{projectDir:".windsurf/skills/culvii",globalDir:".codeium/windsurf/skills/culvii",detect:".windsurf"},github:{projectDir:".github/skills/culvii",globalDir:".copilot/skills/culvii",detect:".github"},opencode:{projectDir:".opencode/skills/culvii",globalDir:".config/opencode/skills/culvii",detect:".opencode"},gemini:{projectDir:".gemini/skills/culvii",globalDir:".gemini/skills/culvii",detect:".gemini"},kiro:{projectDir:".kiro/skills/culvii",globalDir:".kiro/skills/culvii",detect:".kiro"},agents:{projectDir:".agents/skills/culvii",globalDir:".agents/skills/culvii",detect:".agents"}};function Nr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Lr(t,e=process.cwd()){let n=new Set;if(t){let o=t.toLowerCase()==="codex"?"agents":t.toLowerCase();return lt[o]?(n.add(o),{targets:n}):{error:`Invalid agent: ${t}. Must be one of: ${[...Object.keys(lt),"codex"].sort().join(", ")}.`}}for(let[o,a]of Object.entries(lt))o!=="agents"&&Q.existsSync(re.join(e,a.detect))&&n.add(o);let r=n.size>0;return n.add("agents"),r?{targets:n}:(n.add("claude"),{targets:n,fallbackWarning:"No specific agent directories detected. Defaulting to Claude Code and portable .agents paths."})}function Fr(t){try{let e=JSON.parse(Q.readFileSync(re.join(t,".culvii-skill.json"),"utf8"));return e?.schemaVersion===1&&e?.name==="culvii"&&typeof e?.bundleHash=="string"?e:void 0}catch{return}}function Ur(t,e){for(let n of Object.keys(e).sort()){if(re.isAbsolute(n)||n.split(/[\\/]/).includes(".."))throw new Error(`Unsafe skill bundle path: ${n}`);let r=re.join(t,n);Q.mkdirSync(re.dirname(r),{recursive:true}),Q.writeFileSync(r,e[n],"utf8");}}function Pr(t,e){let n=new Set([...Object.keys(e.files),".culvii-skill.json"]),r=(a,c="")=>Q.readdirSync(a,{withFileTypes:true}).flatMap(i=>{let s=re.posix.join(c,i.name);return i.isDirectory()?r(re.join(a,i.name),s):[s]}),o=r(t);return o.length!==n.size||o.some(a=>!n.has(a))?false:Object.entries(e.files).every(([a,c])=>{let i=Q.readFileSync(re.join(t,a));return createHash("sha256").update(i).digest("hex")===c})}function jr(t,e){let{bundle:n,manifest:r}=e,o=Q.existsSync(t)?Fr(t):void 0;if(o?.bundleHash===r.bundleHash&&Pr(t,r))return "unchanged";if(Q.existsSync(t)&&!o&&!e.force)throw new Error(`Refusing to replace unmanaged skill directory: ${t}. Re-run with --force.`);let a=re.dirname(t);Q.mkdirSync(a,{recursive:true});let c=`${process.pid}-${randomUUID()}`,i=re.join(a,`.culvii.tmp-${c}`),s=re.join(a,`.culvii.backup-${c}`),d=false;try{return Q.mkdirSync(i),Ur(i,n),Q.existsSync(t)&&(Q.renameSync(t,s),d=!0),Q.renameSync(i,t),d&&Q.rmSync(s,{recursive:!0,force:!0}),o?"updated":"installed"}catch(l){throw Q.rmSync(i,{recursive:true,force:true}),d&&!Q.existsSync(t)&&Q.existsSync(s)&&Q.renameSync(s,t),l}}function ln(t){t.command("skill").description("Manage AI agent skills").command("install").description("Install the Culvii authoring skill bundle for AI agents").option("--agent <agent>","Specify agent (claude|cursor|windsurf|github|opencode|gemini|kiro|codex|agents)").option("--global","Install globally instead of in the current project").option("--force","Replace an existing unmanaged Culvii skill directory").action(async e=>{let n=Lr(e.agent);if("error"in n){console.error(`${x} ${n.error}`),process.exitCode=1;return}let r=[];try{let{CULVII_SKILL_BUNDLE:o,CULVII_SKILL_MANIFEST:a}=await import('./skill-bundle-7KYK5GBL.js');for(let c of n.targets){let i=lt[c],s=e.global?i.globalDir:i.projectDir,d=re.join(e.global?bt.homedir():process.cwd(),s),l=jr(d,{force:e.force,bundle:o,manifest:a}),k=re.join(e.global?"~":"",s),f=c==="agents"?"Portable/Codex":c;r.push({agentName:`${f} (${l})`,displayPath:k});}}catch(o){console.error(`${x} ${o.message}`),process.exitCode=1;return}if(Nr()){let{SkillView:o}=await import('./SkillView-N27S3VSV.js');await G(Promise.resolve(ve.createElement(o,{state:{type:"success",installed:r,fallbackWarning:n.fallbackWarning}})));return}n.fallbackWarning&&console.log(`${w} ${n.fallbackWarning}`);for(let o of r)console.log(`${w} Installed skill for ${o.agentName} at ${o.displayPath}`);});}function Rt({label:t,items:e,defaultIndex:n,onSelect:r}){let o=e.map((c,i)=>({key:String(i+1),label:c.label,description:c.description})),a=n!==void 0?String(n+1):void 0;return jsx(a$5,{label:t,options:o,defaultKey:a,onSubmit:c=>{let i=parseInt(c,10)-1,s=e[i];s&&r(s.value);}})}function Hr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}var de=["agent-only","agent-workflow","agent-workflow-tool","multi-agent"],ue=["openai","anthropic","gemini","google-vertex"],un={"agent-only":"A single standalone AI agent","agent-workflow":"An AI agent triggered by a manual workflow","agent-workflow-tool":"An agent that invokes a workflow as a callable tool","multi-agent":"A coordinator agent that delegates to a specialist agent"},fn={openai:"openai/YOUR_MODEL_ID",anthropic:"anthropic/YOUR_MODEL_ID",gemini:"gemini/YOUR_MODEL_ID","google-vertex":"google-vertex/YOUR_MODEL_ID"},pn=`{
15
+ `);return}let c$1=e$1.toLowerCase();if(!cn.includes(c$1)){let v=`Invalid environment '${e$1}'.`,f=`Valid values: ${cn.join(", ")}.`;if(await e(a$1.ENV_SWITCH_FAILED,{error_class:"InvalidEnv",env:e$1}),await j(),await lt({type:"error",message:v,detail:f})){process.exitCode=1;return}process.stderr.write(`${v} ${f}
16
+ `),process.exit(1);}let o=c$1;if(a.length&&!a.includes(o)){let v=`You don't have access to '${o}' in this tenant.`,f=`Accessible: ${a.join(", ")}.`;if(await e(a$1.ENV_SWITCH_FAILED,{error_class:"NoAccess",env:o}),await j(),await lt({type:"error",message:v,detail:f})){process.exitCode=1;return}process.stderr.write(`${v} ${f}
17
+ `),process.exit(1);}let s=new a$3;await s.withLock(async()=>{let v=re.join(Rt.homedir(),".culvii","config"),f=await ce.readFile(v,"utf-8"),w=JSON.parse(f),m=w.contexts[w.active];m&&(m.environment=o,m.environment_id=m.environment_ids?.[o]??m.environment_id),await s.write(w);}),await lt({type:"success",env:o,tenant:i.tenant_slug})||(process.stdout.write(`env: ${o} | tenant: ${i.tenant_slug}
18
+ `),process.stdout.write(`Switched environment to ${o}
19
+ `)),c();let{userId:d$1,tenantId:l}=await d();d$1?await f(a$1.ENV_SWITCHED,d$1,l,{to:o}):await e(a$1.ENV_SWITCHED,{to:o}),await j();});});}var dt={claude:{projectDir:".claude/skills/culvii",globalDir:".claude/skills/culvii",detect:".claude"},cursor:{projectDir:".cursor/skills/culvii",globalDir:".cursor/skills/culvii",detect:".cursor"},windsurf:{projectDir:".windsurf/skills/culvii",globalDir:".codeium/windsurf/skills/culvii",detect:".windsurf"},github:{projectDir:".github/skills/culvii",globalDir:".copilot/skills/culvii",detect:".github"},opencode:{projectDir:".opencode/skills/culvii",globalDir:".config/opencode/skills/culvii",detect:".opencode"},gemini:{projectDir:".gemini/skills/culvii",globalDir:".gemini/skills/culvii",detect:".gemini"},kiro:{projectDir:".kiro/skills/culvii",globalDir:".kiro/skills/culvii",detect:".kiro"},agents:{projectDir:".agents/skills/culvii",globalDir:".agents/skills/culvii",detect:".agents"}};function Lr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Ur(t,e=process.cwd()){let n=new Set;if(t){let i=t.toLowerCase()==="codex"?"agents":t.toLowerCase();return dt[i]?(n.add(i),{targets:n}):{error:`Invalid agent: ${t}. Must be one of: ${[...Object.keys(dt),"codex"].sort().join(", ")}.`}}for(let[i,a]of Object.entries(dt))i!=="agents"&&Q.existsSync(re.join(e,a.detect))&&n.add(i);let r=n.size>0;return n.add("agents"),r?{targets:n}:(n.add("claude"),{targets:n,fallbackWarning:"No specific agent directories detected. Defaulting to Claude Code and portable .agents paths."})}function Fr(t){try{let e=JSON.parse(Q.readFileSync(re.join(t,".culvii-skill.json"),"utf8"));return e?.schemaVersion===1&&e?.name==="culvii"&&typeof e?.bundleHash=="string"?e:void 0}catch{return}}function Pr(t,e){for(let n of Object.keys(e).sort()){if(re.isAbsolute(n)||n.split(/[\\/]/).includes(".."))throw new Error(`Unsafe skill bundle path: ${n}`);let r=re.join(t,n);Q.mkdirSync(re.dirname(r),{recursive:true}),Q.writeFileSync(r,e[n],"utf8");}}function jr(t,e){let n=new Set([...Object.keys(e.files),".culvii-skill.json"]),r=(a,c="")=>Q.readdirSync(a,{withFileTypes:true}).flatMap(o=>{let s=re.posix.join(c,o.name);return o.isDirectory()?r(re.join(a,o.name),s):[s]}),i=r(t);return i.length!==n.size||i.some(a=>!n.has(a))?false:Object.entries(e.files).every(([a,c])=>{let o=Q.readFileSync(re.join(t,a));return createHash("sha256").update(o).digest("hex")===c})}function Wr(t,e){let{bundle:n,manifest:r}=e,i=Q.existsSync(t)?Fr(t):void 0;if(i?.bundleHash===r.bundleHash&&jr(t,r))return "unchanged";if(Q.existsSync(t)&&!i&&!e.force)throw new Error(`Refusing to replace unmanaged skill directory: ${t}. Re-run with --force.`);let a=re.dirname(t);Q.mkdirSync(a,{recursive:true});let c=`${process.pid}-${randomUUID()}`,o=re.join(a,`.culvii.tmp-${c}`),s=re.join(a,`.culvii.backup-${c}`),d=false;try{return Q.mkdirSync(o),Pr(o,n),Q.existsSync(t)&&(Q.renameSync(t,s),d=!0),Q.renameSync(o,t),d&&Q.rmSync(s,{recursive:!0,force:!0}),i?"updated":"installed"}catch(l){throw Q.rmSync(o,{recursive:true,force:true}),d&&!Q.existsSync(t)&&Q.existsSync(s)&&Q.renameSync(s,t),l}}function dn(t){t.command("skill").description("Manage AI agent skills").command("install").description("Install the Culvii authoring skill bundle for AI agents").option("--agent <agent>","Specify agent (claude|cursor|windsurf|github|opencode|gemini|kiro|codex|agents)").option("--global","Install globally instead of in the current project").option("--force","Replace an existing unmanaged Culvii skill directory").action(async e=>{let n=Ur(e.agent);if("error"in n){console.error(`${x} ${n.error}`),process.exitCode=1;return}let r=[];try{let{CULVII_SKILL_BUNDLE:i,CULVII_SKILL_MANIFEST:a}=await import('./skill-bundle-Z4FQO3CQ.js');for(let c of n.targets){let o=dt[c],s=e.global?o.globalDir:o.projectDir,d=re.join(e.global?Rt.homedir():process.cwd(),s),l=Wr(d,{force:e.force,bundle:i,manifest:a}),v=re.join(e.global?"~":"",s),f=c==="agents"?"Portable/Codex":c;r.push({agentName:`${f} (${l})`,displayPath:v});}}catch(i){console.error(`${x} ${i.message}`),process.exitCode=1;return}if(Lr()){let{SkillView:i}=await import('./SkillView-N27S3VSV.js');await G(Promise.resolve(Ee.createElement(i,{state:{type:"success",installed:r,fallbackWarning:n.fallbackWarning}})));return}n.fallbackWarning&&console.log(`${w} ${n.fallbackWarning}`);for(let i of r)console.log(`${w} Installed skill for ${i.agentName} at ${i.displayPath}`);});}function xt({label:t,items:e,defaultIndex:n,onSelect:r}){let i=e.map((c,o)=>({key:String(o+1),label:c.label,description:c.description})),a=n!==void 0?String(n+1):void 0;return jsx(a$5,{label:t,options:i,defaultKey:a,onSubmit:c=>{let o=parseInt(c,10)-1,s=e[o];s&&r(s.value);}})}function Br(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}var de=["agent-only","agent-workflow","agent-workflow-tool","multi-agent"],ue=["openai","anthropic","gemini","google-vertex"],fn={"agent-only":"A single standalone AI agent","agent-workflow":"An AI agent triggered by a manual workflow","agent-workflow-tool":"An agent that invokes a workflow as a callable tool","multi-agent":"A coordinator agent that delegates to a specialist agent"},pn={openai:"openai/YOUR_MODEL_ID",anthropic:"anthropic/YOUR_MODEL_ID",gemini:"gemini/YOUR_MODEL_ID","google-vertex":"google-vertex/YOUR_MODEL_ID"},yn=`{
20
20
  "compilerOptions": {
21
21
  "target": "ES2022",
22
22
  "module": "NodeNext",
@@ -26,7 +26,7 @@ Switch with: culvii env ${a[0]}
26
26
  "esModuleInterop": true
27
27
  },
28
28
  "include": ["src/**/*.ts"]
29
- }`;function yn(t){return JSON.stringify({name:t,version:"0.1.0",type:"commonjs",private:true,scripts:{dev:"culvii dev",deploy:"culvii deploy"},dependencies:{"@culvii/kit":"latest",tsx:"^4.22.3"},engines:{node:">=22.0.0"}},null,2)}function dt(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
29
+ }`;function gn(t){return JSON.stringify({name:t,version:"0.1.0",type:"commonjs",private:true,scripts:{dev:"culvii dev",deploy:"culvii deploy"},dependencies:{"@culvii/kit":"latest",tsx:"^4.22.3"},engines:{node:">=22.0.0"}},null,2)}function ut(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
30
30
  import { MultiAgentEngine, createAgentModelConfigFromRef } from '@culvii/kit';
31
31
 
32
32
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -45,7 +45,7 @@ function createGreeterAgent() {
45
45
  }
46
46
 
47
47
  createGreeterAgent();
48
- `}var gn=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
48
+ `}var mn=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
49
49
  import { Workflow, Step } from '@culvii/kit';
50
50
 
51
51
  function createGreetingWorkflow() {
@@ -76,7 +76,7 @@ function createGreetingWorkflow() {
76
76
  }
77
77
 
78
78
  createGreetingWorkflow();
79
- `;function mn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
79
+ `;function wn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
80
80
  import { MultiAgentEngine, createAgentModelConfigFromRef } from '@culvii/kit';
81
81
 
82
82
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -104,7 +104,7 @@ function createCoordinatorAgent() {
104
104
  }
105
105
 
106
106
  createCoordinatorAgent();
107
- `}function wn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
107
+ `}function vn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
108
108
  import { MultiAgentEngine, createAgentModelConfigFromRef, defineWorkflowTool } from '@culvii/kit';
109
109
 
110
110
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -137,7 +137,7 @@ function createResearchAgent() {
137
137
  }
138
138
 
139
139
  createResearchAgent();
140
- `}var vn=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
140
+ `}var En=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
141
141
  import { Workflow, Step } from '@culvii/kit';
142
142
 
143
143
  function createResearchWorkflow() {
@@ -155,7 +155,7 @@ function createResearchWorkflow() {
155
155
  }
156
156
 
157
157
  createResearchWorkflow();
158
- `;function En(){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
158
+ `;function kn(){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
159
159
  import { Workflow, Step } from '@culvii/kit';
160
160
 
161
161
  function createCoordinationWorkflow() {
@@ -186,9 +186,9 @@ function createCoordinationWorkflow() {
186
186
  }
187
187
 
188
188
  createCoordinationWorkflow();
189
- `}async function xt(t,e){return (await t.question(e)).trim()}async function Br(t,e$1){let{userId:n,tenantId:r}=await d(),o=async(f$1,w={})=>{n?await f(f$1,n,r,w):await e(f$1,w);};await o(a$1.INIT_STARTED);let a=t,c=e$1.template,i=e$1.provider;if(c&&!de.includes(c)&&(console.error(`${x} Invalid template '${c}'. Valid options: ${de.join(", ")}`),await o(a$1.INIT_FAILED,{error_class:"InvalidTemplate"}),await j(),process.exit(1)),i&&!ue.includes(i)&&(console.error(`${x} Invalid provider '${i}'. Valid options: ${ue.join(", ")}`),await o(a$1.INIT_FAILED,{error_class:"InvalidProvider"}),await j(),process.exit(1)),!e$1.yes&&process.stdout.isTTY&&process.stdin.isTTY){let{render:f}=await import('ink');if(!a&&!e$1.here&&(a=await new Promise(w=>{let{unmount:m}=f(ve.createElement(a$5,{label:"Project name [Enter = my-culvii-project]",defaultValue:"my-culvii-project",onSubmit:T=>{m(),w(T||"my-culvii-project");}}));})),!c){let w=de.indexOf("agent-workflow");c=await new Promise(m=>{let{unmount:T}=f(ve.createElement(Rt,{label:"Select a template [Enter = agent-workflow]",items:de.map(I=>({value:I,label:I.padEnd(16),description:un[I]})),defaultIndex:w,onSelect:I=>{T(),m(I);}}));});}if(!i){let w=ue.indexOf("openai");i=await new Promise(m=>{let{unmount:T}=f(ve.createElement(Rt,{label:"Select a model provider [Enter = openai]",items:ue.map(I=>({value:I,label:I})),defaultIndex:w,onSelect:I=>{T(),m(I);}}));});}}else !a&&!e$1.here&&(a="my-culvii-project"),c||(c="agent-workflow"),i||(i="openai");let{InitView:d$1}=await import('./InitView-TI2HU6VV.js'),l={update:null};function k(){let[f,w]=ve.useState({type:"scaffolding",message:"Scaffolding project\u2026"});return ve.useEffect(()=>(l.update=w,()=>{l.update=null;}),[]),ve.createElement(d$1,{state:f})}await G(Promise.resolve(ve.createElement(k)));try{let f=e$1.here?process.cwd():re.join(process.cwd(),a);if(existsSync(f)){if((await ce.readdir(f)).filter(D=>!D.startsWith(".")).length>0){l.update?.({type:"error",message:`Directory '${re.relative(process.cwd(),f)||"."}' already exists and is not empty.`}),await o(a$1.INIT_FAILED,{error_class:"DirectoryNotEmpty"}),await j();return}}else await ce.mkdir(f,{recursive:!0});let w=re.join(f,"src");await ce.mkdir(w,{recursive:!0});let m=fn[i],T=[];await ce.writeFile(re.join(f,"package.json"),yn(e$1.here?re.basename(f):a),"utf-8"),await ce.writeFile(re.join(f,"tsconfig.json"),pn,"utf-8"),T.push("package.json"),T.push("tsconfig.json");let I=async(J,H)=>{await ce.writeFile(re.join(w,J),H,"utf-8"),T.push(re.join("src",J));};c==="agent-only"?await I("greeter-agent.culvii.ts",dt(m)):c==="agent-workflow"?(await I("greeter-agent.culvii.ts",dt(m)),await I("greeting-workflow.culvii.ts",gn)):c==="agent-workflow-tool"?(await I("research-agent.culvii.ts",wn(m)),await I("research-workflow.culvii.ts",vn)):c==="multi-agent"&&(await I("coordinator-agent.culvii.ts",mn(m)),await I("coordination-workflow.culvii.ts",En()));let x=e$1.here?".":`./${a}`;l.update?.({type:"success",template:c,projectDir:x,written:T,here:!!e$1.here,projectName:a}),await o(a$1.INIT_SUCCEEDED,{template:c,provider:i}),await j();}catch(f){l.update?.({type:"error",message:`Initialization failed: ${f.message}`}),await o(a$1.INIT_FAILED,{error_class:f?.constructor?.name??"UnknownError"}),await j();return}}function kn(t){t.command("init [project-name]").description("Scaffold a new Culvii project with working agent and workflow files").option("--template <template>",`Template: ${de.join(" | ")}`).option("--provider <provider>",`Model provider: ${ue.join(" | ")}`).option("--here","Scaffold into the current directory instead of a named subdirectory").option("-y, --yes","Accept all defaults non-interactively").action(async(e$1,n)=>{if(Hr()){await Br(e$1,n);return}let{userId:r,tenantId:o}=await d(),a=async(d,l={})=>{r?await f(d,r,o,l):await e(d,l);};await a(a$1.INIT_STARTED);let c=e$1,i=n.template,s=n.provider;i&&!de.includes(i)&&(console.error(`${x} Invalid template '${i}'. Valid options: ${de.join(", ")}`),await a(a$1.INIT_FAILED,{error_class:"InvalidTemplate"}),await j(),process.exit(1)),s&&!ue.includes(s)&&(console.error(`${x} Invalid provider '${s}'. Valid options: ${ue.join(", ")}`),await a(a$1.INIT_FAILED,{error_class:"InvalidProvider"}),await j(),process.exit(1));try{if(!n.yes&&process.stdout.isTTY&&process.stdin.isTTY){let T=createInterface({input:stdin,output:stdout});try{if(!c&&!n.here&&(c=await xt(T,"Project name (my-culvii-project): ")||"my-culvii-project"),!i)for(console.log(`
190
- Select a template:`),de.forEach((I,x)=>{console.log(` ${x+1}) ${I.padEnd(16)} ${un[I]}`);});!i;){let I=await xt(T,"Template [1-4] (2): "),x=I?parseInt(I,10)-1:1;x>=0&&x<de.length?i=de[x]:console.log(` Please enter a number between 1 and ${de.length}.`);}if(!s)for(console.log(`
191
- Select a model provider:`),ue.forEach((I,x)=>{console.log(` ${x+1}) ${I}`);});!s;){let I=await xt(T,"Provider [1-4] (1): "),x=I?parseInt(I,10)-1:0;x>=0&&x<ue.length?s=ue[x]:console.log(` Please enter a number between 1 and ${ue.length}.`);}}finally{T.close();}}else !c&&!n.here&&(c="my-culvii-project"),i||(i="agent-workflow"),s||(s="openai");let l=n.here?process.cwd():re.join(process.cwd(),c);existsSync(l)?(await ce.readdir(l)).filter(x=>!x.startsWith(".")).length>0&&(console.error(`${x} Directory '${re.relative(process.cwd(),l)||"."}' already exists and is not empty.`),await a(a$1.INIT_FAILED,{error_class:"DirectoryNotEmpty"}),await j(),process.exit(1)):await ce.mkdir(l,{recursive:!0});let k=re.join(l,"src");await ce.mkdir(k,{recursive:!0});let f=fn[s],w$1=[];await ce.writeFile(re.join(l,"package.json"),yn(n.here?re.basename(l):c),"utf-8"),await ce.writeFile(re.join(l,"tsconfig.json"),pn,"utf-8"),w$1.push("package.json"),w$1.push("tsconfig.json");let m=async(T,I)=>{await ce.writeFile(re.join(k,T),I,"utf-8"),w$1.push(re.join("src",T));};i==="agent-only"?await m("greeter-agent.culvii.ts",dt(f)):i==="agent-workflow"?(await m("greeter-agent.culvii.ts",dt(f)),await m("greeting-workflow.culvii.ts",gn)):i==="agent-workflow-tool"?(await m("research-agent.culvii.ts",wn(f)),await m("research-workflow.culvii.ts",vn)):i==="multi-agent"&&(await m("coordinator-agent.culvii.ts",mn(f)),await m("coordination-workflow.culvii.ts",En())),console.log(`${w} Initialized '${i}' project${n.here?"":` in ./${c}`}`),w$1.forEach(T=>console.log(` + ${T}`)),n.here||console.log(` cd ${c}`),console.log(" 1. Run `npm install`"),console.log(" 2. Replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console"),console.log(" 3. Run `culvii dev`"),await a(a$1.INIT_SUCCEEDED,{template:i,provider:s}),await j();}catch(d){console.error(`${x} Initialization failed: ${d.message}`),await a(a$1.INIT_FAILED,{error_class:d?.constructor?.name??"UnknownError"}),await j(),process.exit(1);}});}function he(t){console.error(`Error: ${t}`),process.exit(1);}function In(t,e){try{return JSON.parse(t)}catch(n){he(`${e} is not valid JSON: ${n.message}`);}}function hn(t,e){let n=re.resolve(t);try{return In(Q.readFileSync(n,"utf8"),e)}catch(r){throw r.code==="ENOENT"&&he(`${e} not found: ${n}`),r}}async function ut(t,e,n,r){let o=await W(t,e,{...r,headers:{...s(n),...r?.body?{"Content-Type":"application/json"}:{},...r?.headers}});return o.ok||he(`Server responded with ${o.status}: ${await V(o)}`),o.json()}function $t(t){return t.workspace_id||he("No workspace configured. Start culvii dev first.")}async function _n(t,e,n){let r=$t(n.context),a=(await ut(`${n.apiUrl}/api/workspaces/${encodeURIComponent(r)}/workflows/${encodeURIComponent(t)}`,e,n.context))?.data?.versions;return (!Array.isArray(a)||a.length===0)&&he(`Workflow not found: ${t}`),a.find(c=>c.isDraft===true)??a[0]}function An(t,e){let n=Number(t);return (!Number.isInteger(n)||n<1)&&he(`${e} must be a positive integer`),n}function Sn(t){let e=t.command("workflow").description("Workflow execution commands").option("--env <env>","Target environment (dev, sandbox, or prod)");e.command("run <workflow>").description("Start a workflow execution").requiredOption("--trigger <node-name>","Trigger node name").option("--payload <json>","Trigger payload as JSON").option("--payload-file <path>","Read trigger payload from a JSON file").option("--mocks-file <path>","JSON object mapping node IDs to mock outputs").option("--json","Print machine-readable JSON").action(async(r$1,o)=>{o.payload&&o.payloadFile&&he("Use only one of --payload or --payload-file"),await K(async a=>{let c=await r({env:e.opts().env}),i=await _n(r$1,a,c),s=o.payloadFile?hn(o.payloadFile,"Payload file"):o.payload?In(o.payload,"Payload"):{},d=o.mocksFile?hn(o.mocksFile,"Mocks file"):void 0;d!==void 0&&(!d||typeof d!="object"||Array.isArray(d))&&he("Mocks file must contain an object keyed by workflow node ID");let l=await ut(`${c.apiUrl}/api/executions/start`,a,c.context,{method:"POST",body:JSON.stringify({workflowId:i.id,triggerNode:o.trigger,workspaceId:$t(c.context),payload:s,feedback:{mode:"mock",...d?{nodeMocks:d}:{}}})});o.json?console.log(JSON.stringify(l.data,null,2)):(console.log(`Execution started: ${l.data.executionId}`),console.log(`Status: ${l.data.status}`));});});let n=t.command("execution").description("Inspect workflow executions").option("--env <env>","Target environment (dev, sandbox, or prod)");n.command("list").description("List workspace executions").option("--workflow <workflow>","Filter by workflow reference key or ID").option("--status <status>","Filter by execution status").option("--trigger <trigger>","Filter by trigger type").option("--page <page>","Page number","1").option("--limit <limit>","Results per page","20").option("--json","Print machine-readable JSON").action(async r$1=>{await K(async o=>{let a=await r({env:n.opts().env}),c=new URLSearchParams({page:String(An(r$1.page,"--page")),limit:String(An(r$1.limit,"--limit"))});if(r$1.workflow){let s=await _n(r$1.workflow,o,a);c.set("workflowId",s.id);}r$1.status&&c.set("status",r$1.status),r$1.trigger&&c.set("trigger",r$1.trigger);let i=await ut(`${a.apiUrl}/api/workspaces/${encodeURIComponent($t(a.context))}/executions?${c}`,o,a.context);if(r$1.json)console.log(JSON.stringify(i.data,null,2));else {for(let d of i.data.executions)console.log(`${d.id} ${d.status} ${d.workflowName} ${d.startedAt}`);let s=i.data.pagination;console.log(`Page ${s.page}/${s.totalPages||1} (${s.totalCount} executions)`);}});}),n.command("get <execution-id>").description("Get execution details, step outputs, and errors").option("--json","Print machine-readable JSON").action(async(r$1,o)=>{await K(async a=>{let c=await r({env:n.opts().env}),i=await ut(`${c.apiUrl}/api/executions/${encodeURIComponent(r$1)}`,a,c.context);if(o.json)console.log(JSON.stringify(i.data,null,2));else {console.log(`${i.data.executionId} ${i.data.status} ${i.data.workflowName}`);for(let s of i.data.steps)console.log(`${s.stepId} ${s.status} ${s.name}`);i.data.error&&console.error(`Error: ${i.data.error.message}`);}});});}function qr(t){let e=k[t.environment];return `https://console.culvii.com/${t.tenant_slug}/${e}/integrations`}function Jr(t){return t.scope==="tenant"?"tenant":t.scope==="environment"?`environment:${t.environmentId??"unknown"}`:`workspace:${t.workspaceIds.join(",")||"unknown"}`}async function Tn(t,e){if(!t.ok)throw new Error(`${e} failed (${t.status}): ${await V(t)}`);let n=await t.json();return Array.isArray(n?.data)?n.data:[]}function Cn(t){let e=t.command("integration").description("List and manage Culvii integrations").option("--env <env>","Target environment (dev, sandbox, or prod)");e.command("list").description("List available integration credentials and their scopes").option("--json","Print machine-readable JSON").action(async n=>{await K(async r$1=>{let{apiUrl:o,context:a}=await r({env:e.opts().env}),c={headers:s(a)},[i,s$1]=await Promise.all([W(`${o}/api/auth-identities`,r$1,c),W(`${o}/api/credential-entities`,r$1,c)]),[d,l]=await Promise.all([Tn(i,"Listing integrations"),Tn(s$1,"Listing integration providers")]),k=new Map(l.map(m=>[m.id,m])),f=qr(a),w=d.map(m=>{let T=k.get(m.providerId);return {credentialId:m.id,name:m.name,provider:T?.key??T?.name??m.providerId,connected:m.connected===!0,scope:Jr(m),oauthScopes:m.scopes}});if(n.json){console.log(JSON.stringify({addUrl:f,integrations:w},null,2));return}if(console.log(`Add or manage integrations: ${f}`),!w.length){console.log("No integrations available in the active scope.");return}console.log("credentialId provider name connected scope oauthScopes");for(let m of w)console.log(`${m.credentialId} ${m.provider} ${m.name} ${m.connected?"yes":"no"} ${m.scope} ${m.oauthScopes.join(",")||"-"}`);});});}var Ve=null;function Qr(t){Ve=t;}async function be(t=0,e){e&&process.stderr.write(e.endsWith(`
189
+ `}async function $t(t,e){return (await t.question(e)).trim()}async function Kr(t,e$1){let{userId:n,tenantId:r}=await d(),i=async(f$1,w={})=>{n?await f(f$1,n,r,w):await e(f$1,w);};await i(a$1.INIT_STARTED);let a=t,c=e$1.template,o=e$1.provider;if(c&&!de.includes(c)&&(console.error(`${x} Invalid template '${c}'. Valid options: ${de.join(", ")}`),await i(a$1.INIT_FAILED,{error_class:"InvalidTemplate"}),await j(),process.exit(1)),o&&!ue.includes(o)&&(console.error(`${x} Invalid provider '${o}'. Valid options: ${ue.join(", ")}`),await i(a$1.INIT_FAILED,{error_class:"InvalidProvider"}),await j(),process.exit(1)),!e$1.yes&&process.stdout.isTTY&&process.stdin.isTTY){let{render:f}=await import('ink');if(!a&&!e$1.here&&(a=await new Promise(w=>{let{unmount:m}=f(Ee.createElement(a$5,{label:"Project name [Enter = my-culvii-project]",defaultValue:"my-culvii-project",onSubmit:T=>{m(),w(T||"my-culvii-project");}}));})),!c){let w=de.indexOf("agent-workflow");c=await new Promise(m=>{let{unmount:T}=f(Ee.createElement(xt,{label:"Select a template [Enter = agent-workflow]",items:de.map(I=>({value:I,label:I.padEnd(16),description:fn[I]})),defaultIndex:w,onSelect:I=>{T(),m(I);}}));});}if(!o){let w=ue.indexOf("openai");o=await new Promise(m=>{let{unmount:T}=f(Ee.createElement(xt,{label:"Select a model provider [Enter = openai]",items:ue.map(I=>({value:I,label:I})),defaultIndex:w,onSelect:I=>{T(),m(I);}}));});}}else !a&&!e$1.here&&(a="my-culvii-project"),c||(c="agent-workflow"),o||(o="openai");let{InitView:d$1}=await import('./InitView-TI2HU6VV.js'),l={update:null};function v(){let[f,w]=Ee.useState({type:"scaffolding",message:"Scaffolding project\u2026"});return Ee.useEffect(()=>(l.update=w,()=>{l.update=null;}),[]),Ee.createElement(d$1,{state:f})}await G(Promise.resolve(Ee.createElement(v)));try{let f=e$1.here?process.cwd():re.join(process.cwd(),a);if(existsSync(f)){if((await ce.readdir(f)).filter(D=>!D.startsWith(".")).length>0){l.update?.({type:"error",message:`Directory '${re.relative(process.cwd(),f)||"."}' already exists and is not empty.`}),await i(a$1.INIT_FAILED,{error_class:"DirectoryNotEmpty"}),await j();return}}else await ce.mkdir(f,{recursive:!0});let w=re.join(f,"src");await ce.mkdir(w,{recursive:!0});let m=pn[o],T=[];await ce.writeFile(re.join(f,"package.json"),gn(e$1.here?re.basename(f):a),"utf-8"),await ce.writeFile(re.join(f,"tsconfig.json"),yn,"utf-8"),T.push("package.json"),T.push("tsconfig.json");let I=async(q,K)=>{await ce.writeFile(re.join(w,q),K,"utf-8"),T.push(re.join("src",q));};c==="agent-only"?await I("greeter-agent.culvii.ts",ut(m)):c==="agent-workflow"?(await I("greeter-agent.culvii.ts",ut(m)),await I("greeting-workflow.culvii.ts",mn)):c==="agent-workflow-tool"?(await I("research-agent.culvii.ts",vn(m)),await I("research-workflow.culvii.ts",En)):c==="multi-agent"&&(await I("coordinator-agent.culvii.ts",wn(m)),await I("coordination-workflow.culvii.ts",kn()));let x=e$1.here?".":`./${a}`;l.update?.({type:"success",template:c,projectDir:x,written:T,here:!!e$1.here,projectName:a}),await i(a$1.INIT_SUCCEEDED,{template:c,provider:o}),await j();}catch(f){l.update?.({type:"error",message:`Initialization failed: ${f.message}`}),await i(a$1.INIT_FAILED,{error_class:f?.constructor?.name??"UnknownError"}),await j();return}}function hn(t){t.command("init [project-name]").description("Scaffold a new Culvii project with working agent and workflow files").option("--template <template>",`Template: ${de.join(" | ")}`).option("--provider <provider>",`Model provider: ${ue.join(" | ")}`).option("--here","Scaffold into the current directory instead of a named subdirectory").option("-y, --yes","Accept all defaults non-interactively").action(async(e$1,n)=>{if(Br()){await Kr(e$1,n);return}let{userId:r,tenantId:i}=await d(),a=async(d,l={})=>{r?await f(d,r,i,l):await e(d,l);};await a(a$1.INIT_STARTED);let c=e$1,o=n.template,s=n.provider;o&&!de.includes(o)&&(console.error(`${x} Invalid template '${o}'. Valid options: ${de.join(", ")}`),await a(a$1.INIT_FAILED,{error_class:"InvalidTemplate"}),await j(),process.exit(1)),s&&!ue.includes(s)&&(console.error(`${x} Invalid provider '${s}'. Valid options: ${ue.join(", ")}`),await a(a$1.INIT_FAILED,{error_class:"InvalidProvider"}),await j(),process.exit(1));try{if(!n.yes&&process.stdout.isTTY&&process.stdin.isTTY){let T=createInterface({input:stdin,output:stdout});try{if(!c&&!n.here&&(c=await $t(T,"Project name (my-culvii-project): ")||"my-culvii-project"),!o)for(console.log(`
190
+ Select a template:`),de.forEach((I,x)=>{console.log(` ${x+1}) ${I.padEnd(16)} ${fn[I]}`);});!o;){let I=await $t(T,"Template [1-4] (2): "),x=I?parseInt(I,10)-1:1;x>=0&&x<de.length?o=de[x]:console.log(` Please enter a number between 1 and ${de.length}.`);}if(!s)for(console.log(`
191
+ Select a model provider:`),ue.forEach((I,x)=>{console.log(` ${x+1}) ${I}`);});!s;){let I=await $t(T,"Provider [1-4] (1): "),x=I?parseInt(I,10)-1:0;x>=0&&x<ue.length?s=ue[x]:console.log(` Please enter a number between 1 and ${ue.length}.`);}}finally{T.close();}}else !c&&!n.here&&(c="my-culvii-project"),o||(o="agent-workflow"),s||(s="openai");let l=n.here?process.cwd():re.join(process.cwd(),c);existsSync(l)?(await ce.readdir(l)).filter(x=>!x.startsWith(".")).length>0&&(console.error(`${x} Directory '${re.relative(process.cwd(),l)||"."}' already exists and is not empty.`),await a(a$1.INIT_FAILED,{error_class:"DirectoryNotEmpty"}),await j(),process.exit(1)):await ce.mkdir(l,{recursive:!0});let v=re.join(l,"src");await ce.mkdir(v,{recursive:!0});let f=pn[s],w$1=[];await ce.writeFile(re.join(l,"package.json"),gn(n.here?re.basename(l):c),"utf-8"),await ce.writeFile(re.join(l,"tsconfig.json"),yn,"utf-8"),w$1.push("package.json"),w$1.push("tsconfig.json");let m=async(T,I)=>{await ce.writeFile(re.join(v,T),I,"utf-8"),w$1.push(re.join("src",T));};o==="agent-only"?await m("greeter-agent.culvii.ts",ut(f)):o==="agent-workflow"?(await m("greeter-agent.culvii.ts",ut(f)),await m("greeting-workflow.culvii.ts",mn)):o==="agent-workflow-tool"?(await m("research-agent.culvii.ts",vn(f)),await m("research-workflow.culvii.ts",En)):o==="multi-agent"&&(await m("coordinator-agent.culvii.ts",wn(f)),await m("coordination-workflow.culvii.ts",kn())),console.log(`${w} Initialized '${o}' project${n.here?"":` in ./${c}`}`),w$1.forEach(T=>console.log(` + ${T}`)),n.here||console.log(` cd ${c}`),console.log(" 1. Run `npm install`"),console.log(" 2. Replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console"),console.log(" 3. Run `culvii dev`"),await a(a$1.INIT_SUCCEEDED,{template:o,provider:s}),await j();}catch(d){console.error(`${x} Initialization failed: ${d.message}`),await a(a$1.INIT_FAILED,{error_class:d?.constructor?.name??"UnknownError"}),await j(),process.exit(1);}});}function fe(t){console.error(`Error: ${t}`),process.exit(1);}function Sn(t,e){try{return JSON.parse(t)}catch(n){fe(`${e} is not valid JSON: ${n.message}`);}}function Ot(t,e){let n=re.resolve(t);try{return Sn(Q.readFileSync(n,"utf8"),e)}catch(r){throw r.code==="ENOENT"&&fe(`${e} not found: ${n}`),r}}async function Ue(t,e,n,r){let i=await W(t,e,{...r,headers:{...s(n),...r?.body?{"Content-Type":"application/json"}:{},...r?.headers}});return i.ok||fe(`Server responded with ${i.status}: ${await H(i)}`),i.json()}function ft(t){return t.workspace_id||fe("No workspace configured. Start culvii dev first.")}async function _n(t,e,n){let r=ft(n.context),a=(await Ue(`${n.apiUrl}/api/workspaces/${encodeURIComponent(r)}/workflows/${encodeURIComponent(t)}`,e,n.context))?.data?.versions;return (!Array.isArray(a)||a.length===0)&&fe(`Workflow not found: ${t}`),a.find(c=>c.isDraft===true)??a[0]}function An(t,e){let n=Number(t);return (!Number.isInteger(n)||n<1)&&fe(`${e} must be a positive integer`),n}function In(t,e){let n=e.environment||"dev";return (!e.tenant_slug||!e.workspace_id)&&fe("No tenant or workspace configured. Start culvii dev first."),`https://console.culvii.com/${e.tenant_slug}/${k[n]}/${e.workspace_id}/surface-reviews/${t}`}function zr(t){let e=t?.items;return (!Array.isArray(e)||e.length===0)&&fe("Review file must contain a non-empty items array"),e.map((n,r)=>((!n||typeof n!="object"||typeof n.executionId!="string"||typeof n.nodeId!="string")&&fe(`Review item ${r+1} must contain executionId and nodeId strings`),{executionId:n.executionId,nodeId:n.nodeId}))}function Tn(t){let e=t.command("surface").description("Surface authoring and review commands").option("--env <env>","Target environment (dev, sandbox, or prod)"),n=e.command("review").description("Review custom runtime surfaces");n.command("create").description("Create a browser review for selected execution surfaces").requiredOption("--file <path>","JSON file with { items: [{ executionId, nodeId }] }").option("--json","Print machine-readable JSON").action(async a=>{await V(async c=>{let o=await r({env:e.opts().env}),s=await Ue(`${o.apiUrl}/api/surface-reviews`,c,o.context,{method:"POST",body:JSON.stringify({workspaceId:ft(o.context),items:zr(Ot(a.file,"Review file"))})}),d={reviewId:s.data.id,url:In(s.data.id,o.context)};a.json?console.log(JSON.stringify(d,null,2)):(console.log(`Surface review: ${d.reviewId}`),console.log(d.url));});}),n.command("get <review-id>").description("Get selected surfaces and the user feedback collected so far").option("--json","Print machine-readable JSON").action(async(a,c)=>{await V(async o=>{let s=await r({env:e.opts().env}),d=await Ue(`${s.apiUrl}/api/surface-reviews/${encodeURIComponent(a)}`,o,s.context);if(c.json)console.log(JSON.stringify(d.data,null,2));else {console.log(`${d.data.id} ${d.data.submittedAt?"submitted":"in progress"}`);for(let l of d.data.items)console.log(`${l.workflowName} ${l.nodeName} ${l.decision??"pending"} ${l.source}`);}});}),n.command("open <review-id>").description("Open a surface review in the Culvii Console").action(async a=>{await V(async()=>{let c=await r({env:e.opts().env}),o=In(a,c.context);await qr(o),console.log(o);});});let r$1=t.command("workflow").description("Workflow execution commands").option("--env <env>","Target environment (dev, sandbox, or prod)");r$1.command("run <workflow>").description("Start a workflow execution").requiredOption("--trigger <node-name>","Trigger node name").option("--payload <json>","Trigger payload as JSON").option("--payload-file <path>","Read trigger payload from a JSON file").option("--mocks-file <path>","JSON object mapping node IDs to mock outputs").option("--json","Print machine-readable JSON").action(async(a,c)=>{c.payload&&c.payloadFile&&fe("Use only one of --payload or --payload-file"),await V(async o=>{let s=await r({env:r$1.opts().env}),d=await _n(a,o,s),l=c.payloadFile?Ot(c.payloadFile,"Payload file"):c.payload?Sn(c.payload,"Payload"):{},v=c.mocksFile?Ot(c.mocksFile,"Mocks file"):void 0;v!==void 0&&(!v||typeof v!="object"||Array.isArray(v))&&fe("Mocks file must contain an object keyed by workflow node ID");let f=await Ue(`${s.apiUrl}/api/executions/start`,o,s.context,{method:"POST",body:JSON.stringify({workflowId:d.id,triggerNode:c.trigger,workspaceId:ft(s.context),payload:l,feedback:{mode:"mock",...v?{nodeMocks:v}:{}}})});c.json?console.log(JSON.stringify(f.data,null,2)):(console.log(`Execution started: ${f.data.executionId}`),console.log(`Status: ${f.data.status}`));});});let i=t.command("execution").description("Inspect workflow executions").option("--env <env>","Target environment (dev, sandbox, or prod)");i.command("list").description("List workspace executions").option("--workflow <workflow>","Filter by workflow reference key or ID").option("--status <status>","Filter by execution status").option("--trigger <trigger>","Filter by trigger type").option("--page <page>","Page number","1").option("--limit <limit>","Results per page","20").option("--json","Print machine-readable JSON").action(async a=>{await V(async c=>{let o=await r({env:i.opts().env}),s=new URLSearchParams({page:String(An(a.page,"--page")),limit:String(An(a.limit,"--limit"))});if(a.workflow){let l=await _n(a.workflow,c,o);s.set("workflowId",l.id);}a.status&&s.set("status",a.status),a.trigger&&s.set("trigger",a.trigger);let d=await Ue(`${o.apiUrl}/api/workspaces/${encodeURIComponent(ft(o.context))}/executions?${s}`,c,o.context);if(a.json)console.log(JSON.stringify(d.data,null,2));else {for(let v of d.data.executions)console.log(`${v.id} ${v.status} ${v.workflowName} ${v.startedAt}`);let l=d.data.pagination;console.log(`Page ${l.page}/${l.totalPages||1} (${l.totalCount} executions)`);}});}),i.command("get <execution-id>").description("Get execution details, step outputs, and errors").option("--json","Print machine-readable JSON").action(async(a,c)=>{await V(async o=>{let s=await r({env:i.opts().env}),d=await Ue(`${s.apiUrl}/api/executions/${encodeURIComponent(a)}`,o,s.context);if(c.json)console.log(JSON.stringify(d.data,null,2));else {console.log(`${d.data.executionId} ${d.data.status} ${d.data.workflowName}`);for(let l of d.data.steps)console.log(`${l.stepId} ${l.status} ${l.name}`);d.data.error&&console.error(`Error: ${d.data.error.message}`);}});});}function Xr(t){return `https://console.culvii.com/${t.tenant_slug}/sandbox/integrations`}function Zr(t){return t.scope==="tenant"?"tenant":t.scope==="environment"?`environment:${t.environmentId??"unknown"}`:`workspace:${t.workspaceIds.join(",")||"unknown"}`}async function Cn(t,e){if(!t.ok)throw new Error(`${e} failed (${t.status}): ${await H(t)}`);let n=await t.json();return Array.isArray(n?.data)?n.data:[]}function Dn(t){let e=t.command("integration").description("List and manage Culvii integrations").option("--env <env>","Target environment (dev, sandbox, or prod)");e.command("list").description("List available integration credentials and their scopes").option("--json","Print machine-readable JSON").action(async n=>{await V(async r$1=>{let{apiUrl:i,context:a}=await r({env:e.opts().env}),c={headers:s(a)},[o,s$1]=await Promise.all([W(`${i}/api/auth-identities`,r$1,c),W(`${i}/api/credential-entities`,r$1,c)]),[d,l]=await Promise.all([Cn(o,"Listing integrations"),Cn(s$1,"Listing integration providers")]),v=new Map(l.map(m=>[m.id,m])),f=Xr(a),w=d.map(m=>{let T=v.get(m.providerId);return {credentialId:m.id,name:m.name,provider:T?.key??T?.name??m.providerId,connected:m.connected===!0,scope:Zr(m),oauthScopes:m.scopes}});if(n.json){console.log(JSON.stringify({addUrl:f,integrations:w},null,2));return}if(console.log(`Add or manage integrations: ${f}`),!w.length){console.log("No integrations available in the active scope.");return}console.log("credentialId provider name connected scope oauthScopes");for(let m of w)console.log(`${m.credentialId} ${m.provider} ${m.name} ${m.connected?"yes":"no"} ${m.scope} ${m.oauthScopes.join(",")||"-"}`);});});}var Ye=null;function na(t){Ye=t;}async function be(t=0,e){e&&process.stderr.write(e.endsWith(`
192
192
  `)?e:`${e}
193
- `),Ve?.(),Ve=null,await j(),process.exit(t);}async function G(t){Ve?.(),Ve=null;let e=a$2();e.noColor&&(process.env.FORCE_COLOR="0");let n=process.argv.slice(2);if((!e.isTTY||e.isCI)&&!n.includes("--help")&&!n.includes("-h")){console.log("Running in non-interactive mode.");return}let{render:r}=await import('ink'),{unmount:o}=r(await t);Qr(o);}function ea(t="0.0.8"){let e=new Command().name("culvii").description("Culvii CLI").version(t).option("--debug","Enable debug logging to ~/.culvii/logs/cli.log").configureOutput({writeOut:r=>process.stdout.write(r),writeErr:r=>process.stderr.write(r)});e.exitOverride(r=>{r.code==="commander.helpDisplayed"||r.code==="commander.version"?be(0):be(r.exitCode);}),e.hook("preAction",(r,o)=>{n(o.optsWithGlobals().env);});let n$1=e.command("auth").description("Authentication commands");return n$1.command("login").description("Login to Culvii").action(async()=>{let{login:r}=await import('./login-OGOHEHFE.js');await r();}),n$1.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-BRUJBFUK.js');await r();}),e.command("login").description("Login to Culvii").action(async()=>{let{login:r}=await import('./login-OGOHEHFE.js');await r();}),e.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-BRUJBFUK.js');await r();}),Pt(e),Xt(e),en(e),tn(e),an(e),sn(e),cn(e),ln(e),kn(e),Sn(e),Cn(e),e}async function ta(t){let e$1=process.argv.slice(2);try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js');await new n().read({exitOnError:!1});}catch{await e(a$1.CLI_INSTALLED),await j();}if(e$1.length===0){let[{OnboardingView:n},r]=await Promise.all([import('./OnboardingView-QWEF3FJU.js'),import('react')]);await G(Promise.resolve(r.createElement(n)));return}if(e$1.includes("--help")||e$1.includes("-h")){let[{HelpView:n},r]=await Promise.all([import('./HelpView-E7HS4SVF.js'),import('react')]),o=e$1[0]&&!e$1[0].startsWith("-")?e$1[0]:"culvii";await e(a$1.CLI_HELP_VIEWED,{command:o}),await j(),await G(Promise.resolve(r.createElement(n)));return}if(e$1.includes("--version")||e$1.includes("-V")||e$1.includes("-v")){await e(a$1.CLI_VERSION_VIEWED),process.stdout.write(`${t.version()}
194
- `),await be(0);return}await t.parseAsync(process.argv);}var Ot=false;try{Ot=!!process.argv[1]&&realpathSync(process.argv[1])===fileURLToPath(import.meta.url);}catch{Ot=false;}Ot&&ta(ea()).catch(async t=>{let{userId:e$1,tenantId:n}=await d(),r={error_class:t?.constructor?.name||"UnknownError",command:process.argv.slice(2).join(" ")};e$1?await f(a$1.CLI_UNHANDLED_ERROR,e$1,n,r):await e(a$1.CLI_UNHANDLED_ERROR,r),await j(),console.error(t),await be(1);});export{Ve as activeUnmount,ea as createProgram,be as exit,G as renderApp,Qr as setActiveUnmount};
193
+ `),Ye?.(),Ye=null,await j(),process.exit(t);}async function G(t){Ye?.(),Ye=null;let e=a$2();e.noColor&&(process.env.FORCE_COLOR="0");let n=process.argv.slice(2);if((!e.isTTY||e.isCI)&&!n.includes("--help")&&!n.includes("-h")){console.log("Running in non-interactive mode.");return}let{render:r}=await import('ink'),{unmount:i}=r(await t);na(i);}function ra(t="0.0.9"){let e=new Command().name("culvii").description("Culvii CLI").version(t).option("--debug","Enable debug logging to ~/.culvii/logs/cli.log").configureOutput({writeOut:r=>process.stdout.write(r),writeErr:r=>process.stderr.write(r)});e.exitOverride(r=>{r.code==="commander.helpDisplayed"||r.code==="commander.version"?be(0):be(r.exitCode);}),e.hook("preAction",(r,i)=>{n(i.optsWithGlobals().env);});let n$1=e.command("auth").description("Authentication commands");return n$1.command("login").description("Login to Culvii").action(async()=>{let{login:r}=await import('./login-3OMS75QL.js');await r();}),n$1.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-ZYTERDYA.js');await r();}),e.command("login").description("Login to Culvii").action(async()=>{let{login:r}=await import('./login-3OMS75QL.js');await r();}),e.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-ZYTERDYA.js');await r();}),jt(e),Zt(e),tn(e),nn(e),sn(e),on(e),ln(e),dn(e),hn(e),Tn(e),Dn(e),e}async function aa(t){let e$1=process.argv.slice(2);try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js');await new n().read({exitOnError:!1});}catch{await e(a$1.CLI_INSTALLED),await j();}if(e$1.length===0){let[{OnboardingView:n},r]=await Promise.all([import('./OnboardingView-QWEF3FJU.js'),import('react')]);await G(Promise.resolve(r.createElement(n)));return}if(e$1.includes("--help")||e$1.includes("-h")){let[{HelpView:n},r]=await Promise.all([import('./HelpView-PELQJJQQ.js'),import('react')]),i=e$1[0]&&!e$1[0].startsWith("-")?e$1[0]:"culvii";await e(a$1.CLI_HELP_VIEWED,{command:i}),await j(),await G(Promise.resolve(r.createElement(n)));return}if(e$1.includes("--version")||e$1.includes("-V")||e$1.includes("-v")){await e(a$1.CLI_VERSION_VIEWED),process.stdout.write(`${t.version()}
194
+ `),await be(0);return}await t.parseAsync(process.argv);}var Nt=false;try{Nt=!!process.argv[1]&&realpathSync(process.argv[1])===fileURLToPath(import.meta.url);}catch{Nt=false;}Nt&&aa(ra()).catch(async t=>{let{userId:e$1,tenantId:n}=await d(),r={error_class:t?.constructor?.name||"UnknownError",command:process.argv.slice(2).join(" ")};e$1?await f(a$1.CLI_UNHANDLED_ERROR,e$1,n,r):await e(a$1.CLI_UNHANDLED_ERROR,r),await j(),console.error(t),await be(1);});export{Ye as activeUnmount,ra as createProgram,be as exit,G as renderApp,na as setActiveUnmount};