@culvii/cli 0.0.9 → 0.1.0

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.
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import {p as p$1}from'./chunk-KM7ZWOEG.js';import'./chunk-HX54IFSD.js';import {a}from'./chunk-FQVHJUX4.js';import {q,r as r$1}from'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import {useEffect}from'react';import {useApp,Box,Text}from'ink';import {jsxs,jsx}from'react/jsx-runtime';function p({children:i}){return jsx(Text,{color:q,children:i})}function s({children:i}){return jsx(Text,{color:r$1,children:i})}var r={Flag:p,Arg:s};function P(){let{exit:i}=useApp();return useEffect(()=>{i();},[i]),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",gap:1,children:[jsx(a.OutStrong,{children:"culvii"}),jsx(a.Dim,{children:"\u2014 the operating system for governed agents"})]}),jsxs(a.Dim,{children:["0.0.9"," \xB7 https://culvii.dev"]}),jsx(a.Sep,{}),jsxs(Box,{paddingBottom:1,children:[jsx(a.OutStrong,{children:"USAGE"}),jsxs(a.Out,{children:[" culvii ","<command>"," [subcommand] [flags]"]})]}),jsxs(Box,{paddingBottom:1,flexDirection:"column",children:[jsx(a.OutStrong,{children:"CORE COMMANDS"}),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" auth"})})}),jsx(a.Out,{children:"login, rotate keys, inspect identity"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" init"})})}),jsx(a.Out,{children:"scaffold a new agent from a template"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" deploy"})})}),jsx(a.Out,{children:"push an agent to an environment"})]})]})]}),jsxs(Box,{paddingBottom:1,flexDirection:"column",children:[jsx(a.OutStrong,{children:"FLAGS"}),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsxs(Text,{children:[jsx(r.Flag,{children:" --env "}),jsx(r.Arg,{children:"<name>"})]})}),jsxs(a.Out,{children:["target environment (default: ",p$1,")"]})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" --json"})})}),jsx(a.Out,{children:"machine-readable output"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" --no-color"})})}),jsx(a.Out,{children:"disable ANSI colors"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" -h, --help"})})}),jsx(a.Out,{children:"help for any command"})]})]})]}),jsxs(a.Dim,{children:["Run `culvii ","<command>"," --help` for more. Everything here respects your policy bundle."]})]})}
2
+ import {p as p$1}from'./chunk-D3YFBXU5.js';import'./chunk-HX54IFSD.js';import {a}from'./chunk-FQVHJUX4.js';import {q,r as r$1}from'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import {useEffect}from'react';import {useApp,Box,Text}from'ink';import {jsxs,jsx}from'react/jsx-runtime';function p({children:i}){return jsx(Text,{color:q,children:i})}function s({children:i}){return jsx(Text,{color:r$1,children:i})}var r={Flag:p,Arg:s};function P(){let{exit:i}=useApp();return useEffect(()=>{i();},[i]),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",gap:1,children:[jsx(a.OutStrong,{children:"culvii"}),jsx(a.Dim,{children:"\u2014 the operating system for governed agents"})]}),jsxs(a.Dim,{children:["0.1.0"," \xB7 https://culvii.dev"]}),jsx(a.Sep,{}),jsxs(Box,{paddingBottom:1,children:[jsx(a.OutStrong,{children:"USAGE"}),jsxs(a.Out,{children:[" culvii ","<command>"," [subcommand] [flags]"]})]}),jsxs(Box,{paddingBottom:1,flexDirection:"column",children:[jsx(a.OutStrong,{children:"CORE COMMANDS"}),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" auth"})})}),jsx(a.Out,{children:"login, rotate keys, inspect identity"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" init"})})}),jsx(a.Out,{children:"scaffold a new agent from a template"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:15,children:jsx(Text,{children:jsx(r.Flag,{children:" deploy"})})}),jsx(a.Out,{children:"push an agent to an environment"})]})]})]}),jsxs(Box,{paddingBottom:1,flexDirection:"column",children:[jsx(a.OutStrong,{children:"FLAGS"}),jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsxs(Text,{children:[jsx(r.Flag,{children:" --env "}),jsx(r.Arg,{children:"<name>"})]})}),jsxs(a.Out,{children:["target environment (default: ",p$1,")"]})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" --json"})})}),jsx(a.Out,{children:"machine-readable output"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" --no-color"})})}),jsx(a.Out,{children:"disable ANSI colors"})]}),jsxs(Box,{flexDirection:"row",children:[jsx(Box,{width:26,children:jsx(Text,{children:jsx(r.Flag,{children:" -h, --help"})})}),jsx(a.Out,{children:"help for any command"})]})]})]}),jsxs(a.Dim,{children:["Run `culvii ","<command>"," --help` for more. Everything here respects your policy bundle."]})]})}
3
3
  export{P as HelpView};
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import {a}from'./chunk-HX54IFSD.js';import {Analytics}from'@segment/analytics-node';var h={CLI_INSTALLED:"cli_installed",CLI_VERSION_VIEWED:"cli_version_viewed",CLI_HELP_VIEWED:"cli_help_viewed",CLI_UNHANDLED_ERROR:"cli_unhandled_error",LOGIN_STARTED:"login_started",LOGIN_SUCCEEDED:"login_succeeded",LOGIN_FAILED:"login_failed",LOGOUT:"logout",DEV_STARTED:"dev_started",DEV_STOPPED:"dev_stopped",DEV_FAILED:"dev_failed",DEPLOY_STARTED:"deploy_started",DEPLOY_SUCCEEDED:"deploy_succeeded",DEPLOY_FAILED:"deploy_failed",DEPLOY_ABORTED:"deploy_aborted",API_KEY_CREATED:"api_key_created",API_KEY_LISTED:"api_key_listed",API_KEY_REVOKED:"api_key_revoked",API_KEY_ROTATED:"api_key_rotated",API_KEY_CREATE_FAILED:"api_key_create_failed",API_KEY_LIST_FAILED:"api_key_list_failed",API_KEY_ROTATE_FAILED:"api_key_rotate_failed",API_KEY_REVOKE_FAILED:"api_key_revoke_failed",TENANT_SWITCHED:"tenant_switched",ENV_SWITCHED:"env_switched",ENV_SWITCH_FAILED:"env_switch_failed",WORKSPACE_CREATED:"workspace_created",WORKSPACE_LISTED:"workspace_listed",TENANT_SWITCH_FAILED:"tenant_switch_failed",WORKSPACE_CREATE_FAILED:"workspace_create_failed",WORKSPACE_LIST_FAILED:"workspace_list_failed",WHOAMI_VIEWED:"whoami_viewed",RENAME_STARTED:"rename_started",RENAME_SUCCEEDED:"rename_succeeded",RENAME_FAILED:"rename_failed",INIT_STARTED:"init_started",INIT_SUCCEEDED:"init_succeeded",INIT_FAILED:"init_failed"},D="byn3jQco5axUIlfeohbQYYPGrZgGpw7A",x=process.env.CULVII_TELEMETRY!=="false",r=x?new Analytics({writeKey:D,flushAt:1,flushInterval:0}):null;function g(){return {surface:"cli",cli_version:"0.0.9",node_version:process.version,os:process.platform,arch:process.arch}}var c=null;async function w(){if(c)return c;try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js');c=(await new n().read({exitOnError:!1})).anonymousId??"unknown";}catch{c="unknown";}return c}var d=null,E=null,f=false;function U(){f=false;}async function y(){if(f)return {userId:d,tenantId:E};try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js'),e=await new n().read({exitOnError:!1}),i=e.contexts[e.active];E=i?.tenant_id??null,d=i?.user_id??e.anonymousId??null;}catch{d=null,E=null;}finally{f=true;}return {userId:d,tenantId:E}}async function C(n,t={},e,i){if(r)try{let o=await y(),a=e??o.userId,s=i!==void 0?i:o.tenantId,_=await w();a?r.track({userId:a,event:n,properties:{...g(),...s?{tenant_id:s}:{},...t}}):r.track({anonymousId:_,event:n,properties:{...g(),...t}});}catch{}}async function V(n,t,e,i={}){await C(n,i,t,e);}async function b(n,t={}){if(r)try{r.identify({userId:n,traits:t});}catch{}}async function F(n,t){if(r)try{r.alias({userId:n,previousId:t});}catch{}}async function K(n,t,e={}){if(r)try{r.group({userId:n,groupId:t,traits:e});}catch{}}var l=null;async function p(){if(r)return l||(l=r.flush({timeout:3e3}).catch(()=>{}).finally(()=>{l=null;}),l)}var u={dev:"development",sandbox:"sandbox",prod:"production"};function k(n){let t=Object.entries(u).find(([,e])=>e===n);return t?t[0]:null}var L=["dev","sandbox","prod"];function W(n){let t=new Set(n.map(k).filter(e=>e!==null));return L.find(e=>t.has(e))??null}var v;function G(n){v=n&&n in u?n:void 0;}function H(){return v}var R="https://api.platform.culvii.com",S={apiBaseUrl:R,clientId:"7fklt2iomn19epdbhpmfblk820",cognitoDomain:"culvii-console.auth.us-east-2.amazoncognito.com"},I=process.env.CULVII_ENV,N=I&&I in u?I:"dev",O={...S,logicalEnvironment:N,scopes:["openid","email","profile"],callbackPorts:[52700,52701,52702,52703,52704,52705,52706,52707,52708,52709],callbackPath:"/callback"};async function M(n){let e=await new a().read(),i=e.contexts[e.active];i||(console.error("Error: Active context key not found in contexts in ~/.culvii/config."),console.error("Please run `culvii login` to authenticate and configure your active context."),await p(),process.exit(1));let o={...i},a$1=n?.env??v;a$1&&(o.environment=a$1);let s=o.environment||"dev";o.environment_id=o.environment_ids?.[s]??o.environment_id,o.workspace_ids&&s in o.workspace_ids&&(o.workspace_id=o.workspace_ids[s]??null),o.workspace_slugs&&s in o.workspace_slugs&&(o.workspace_slug=o.workspace_slugs[s]??null),n?.workspace&&(o.workspace_id=n.workspace);let _=O.apiBaseUrl;return _||(console.error("Error: No API URL found for the configured platform."),await p(),process.exit(1)),{apiUrl:_,context:o}}function j(n){let t=n.environment||"dev",e=n.environment_ids?.[t]??n.environment_id;return {...n.tenant_id?{"x-tenant-id":n.tenant_id}:{},...e?{"x-environment-id":e}:{"x-environment-slug":u[t]}}}
2
+ import {a}from'./chunk-HX54IFSD.js';import {Analytics}from'@segment/analytics-node';var h={CLI_INSTALLED:"cli_installed",CLI_VERSION_VIEWED:"cli_version_viewed",CLI_HELP_VIEWED:"cli_help_viewed",CLI_UNHANDLED_ERROR:"cli_unhandled_error",LOGIN_STARTED:"login_started",LOGIN_SUCCEEDED:"login_succeeded",LOGIN_FAILED:"login_failed",LOGOUT:"logout",DEV_STARTED:"dev_started",DEV_STOPPED:"dev_stopped",DEV_FAILED:"dev_failed",DEPLOY_STARTED:"deploy_started",DEPLOY_SUCCEEDED:"deploy_succeeded",DEPLOY_FAILED:"deploy_failed",DEPLOY_ABORTED:"deploy_aborted",API_KEY_CREATED:"api_key_created",API_KEY_LISTED:"api_key_listed",API_KEY_REVOKED:"api_key_revoked",API_KEY_ROTATED:"api_key_rotated",API_KEY_CREATE_FAILED:"api_key_create_failed",API_KEY_LIST_FAILED:"api_key_list_failed",API_KEY_ROTATE_FAILED:"api_key_rotate_failed",API_KEY_REVOKE_FAILED:"api_key_revoke_failed",TENANT_SWITCHED:"tenant_switched",ENV_SWITCHED:"env_switched",ENV_SWITCH_FAILED:"env_switch_failed",WORKSPACE_CREATED:"workspace_created",WORKSPACE_LISTED:"workspace_listed",TENANT_SWITCH_FAILED:"tenant_switch_failed",WORKSPACE_CREATE_FAILED:"workspace_create_failed",WORKSPACE_LIST_FAILED:"workspace_list_failed",WHOAMI_VIEWED:"whoami_viewed",RENAME_STARTED:"rename_started",RENAME_SUCCEEDED:"rename_succeeded",RENAME_FAILED:"rename_failed",INIT_STARTED:"init_started",INIT_SUCCEEDED:"init_succeeded",INIT_FAILED:"init_failed"},D="byn3jQco5axUIlfeohbQYYPGrZgGpw7A",x=process.env.CULVII_TELEMETRY!=="false",r=x?new Analytics({writeKey:D,flushAt:1,flushInterval:0}):null;function g(){return {surface:"cli",cli_version:"0.1.0",node_version:process.version,os:process.platform,arch:process.arch}}var c=null;async function w(){if(c)return c;try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js');c=(await new n().read({exitOnError:!1})).anonymousId??"unknown";}catch{c="unknown";}return c}var d=null,E=null,f=false;function U(){f=false;}async function y(){if(f)return {userId:d,tenantId:E};try{let{ConfigStore:n}=await import('./config-store-WSXGIIJ4.js'),e=await new n().read({exitOnError:!1}),i=e.contexts[e.active];E=i?.tenant_id??null,d=i?.user_id??e.anonymousId??null;}catch{d=null,E=null;}finally{f=true;}return {userId:d,tenantId:E}}async function C(n,t={},e,i){if(r)try{let o=await y(),a=e??o.userId,s=i!==void 0?i:o.tenantId,_=await w();a?r.track({userId:a,event:n,properties:{...g(),...s?{tenant_id:s}:{},...t}}):r.track({anonymousId:_,event:n,properties:{...g(),...t}});}catch{}}async function V(n,t,e,i={}){await C(n,i,t,e);}async function b(n,t={}){if(r)try{r.identify({userId:n,traits:t});}catch{}}async function F(n,t){if(r)try{r.alias({userId:n,previousId:t});}catch{}}async function K(n,t,e={}){if(r)try{r.group({userId:n,groupId:t,traits:e});}catch{}}var l=null;async function p(){if(r)return l||(l=r.flush({timeout:3e3}).catch(()=>{}).finally(()=>{l=null;}),l)}var u={dev:"development",sandbox:"sandbox",prod:"production"};function k(n){let t=Object.entries(u).find(([,e])=>e===n);return t?t[0]:null}var L=["dev","sandbox","prod"];function W(n){let t=new Set(n.map(k).filter(e=>e!==null));return L.find(e=>t.has(e))??null}var v;function G(n){v=n&&n in u?n:void 0;}function H(){return v}var R="https://api.platform.culvii.com",S={apiBaseUrl:R,clientId:"7fklt2iomn19epdbhpmfblk820",cognitoDomain:"culvii-console.auth.us-east-2.amazoncognito.com"},I=process.env.CULVII_ENV,N=I&&I in u?I:"dev",O={...S,logicalEnvironment:N,scopes:["openid","email","profile"],callbackPorts:[52700,52701,52702,52703,52704,52705,52706,52707,52708,52709],callbackPath:"/callback"};async function M(n){let e=await new a().read(),i=e.contexts[e.active];i||(console.error("Error: Active context key not found in contexts in ~/.culvii/config."),console.error("Please run `culvii login` to authenticate and configure your active context."),await p(),process.exit(1));let o={...i},a$1=n?.env??v;a$1&&(o.environment=a$1);let s=o.environment||"dev";o.environment_id=o.environment_ids?.[s]??o.environment_id,o.workspace_ids&&s in o.workspace_ids&&(o.workspace_id=o.workspace_ids[s]??null),o.workspace_slugs&&s in o.workspace_slugs&&(o.workspace_slug=o.workspace_slugs[s]??null),n?.workspace&&(o.workspace_id=n.workspace);let _=O.apiBaseUrl;return _||(console.error("Error: No API URL found for the configured platform."),await p(),process.exit(1)),{apiUrl:_,context:o}}function j(n){let t=n.environment||"dev",e=n.environment_ids?.[t]??n.environment_id;return {...n.tenant_id?{"x-tenant-id":n.tenant_id}:{},...e?{"x-environment-id":e}:{"x-environment-slug":u[t]}}}
3
3
  export{h as a,w as b,U as c,y as d,C as e,V as f,b as g,F as h,K as i,p as j,u as k,k as l,W as m,G as n,H as o,N as p,O as q,M as r,j as s};
package/dist/index.js CHANGED
@@ -1,22 +1,20 @@
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-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})+`
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 as j$1,n,c,q,r,s,o,k,l}from'./chunk-D3YFBXU5.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,{existsSync,realpathSync}from'fs';import {fileURLToPath}from'url';import Ee from'react';import {render}from'ink';import vt from'ws';import {randomUUID,createHash}from'crypto';import dr from'chokidar';import ce from'fs/promises';import re,{dirname,join}from'path';import {spawn}from'child_process';import {createRequire}from'module';import _r from'readline';import Rt from'os';import {createInterface}from'readline/promises';import {stdout,stdin}from'process';import {jsx}from'react/jsx-runtime';import aa from'open';var At=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}),kt=["xs","sm","md","lg"],Wn=["xs","sm","md","lg"],ht=["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,ht),"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,Wn),"Displayed value size."),_t=p(me(false,void 0,te()),"Map known displayed values to labels."),jn=me(false,{label:p(_(true),"Row label."),value:p(te(true),"Row value."),...qe(),map:_t,mono:p(B(),"Render the value in monospace."),tone:Ce,type:p(_(false,["status"]),"Set to status to render a status pill.")},false),Mn=De(false,_(),me(false,{header:p(_(),"Column heading."),key:p(_(),"Field name inside each row.",{required:true}),...qe(),map:_t,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)),Vn=De(false,_(),z(),me(false,{label:p(_(),"Displayed option label."),value:p(De(false,_(),z()),"Submitted option value.",{required:true})},false)),Yn=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),Hn=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,kt),"Spacing between children.",{default:"md"})}},Row:{group:"layout",summary:"Wrapping horizontal group.",children:"list",props:{gap:p(_(false,kt),"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,kt),"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:_t,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,jn),"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,Mn),"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,ht),"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,ht),"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(Yn,"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(Hn,"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,Vn),"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=Zn;var Vt=At();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,Mt=12,Bn=new Set(Vt.SURFACE_COMPONENT_TYPES),Kn=new Set(["$output","$input","$exec","$binary"]),Gn=new Set(["text","number","date","datetime","json"]),Jn=new Set(["text","textarea","number","email","url","checkbox","select","file"]);function qn(t){return (t.startsWith("/")?t.slice(1):t).split("/",1)[0]}function We(t,e){if(Array.isArray(t))for(let n of t)We(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))We(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&&!Gn.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 zn(t){return ze(t)&&"path"in t}function Pe(t,e,n,r){if(zn(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 Xn(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"||(We(n.props,e),We(n.actions,e));return We(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>jt&&n.push(`Surface cannot exceed ${jt} 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),Bn.has(s.type)||n.push(`Unknown component type "${s.type}".`);let l=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.`),l&&Xn(s,l,n),s.children!==void 0&&!Array.isArray(s.children)?n.push(`Component "${s.id}" children must be an array.`):s.children?.length&&l?.children==="none"?n.push(`Component "${s.id}" cannot have children.`):s.children&&s.children.length>1&&l?.children==="single"&&n.push(`Component "${s.id}" can have at most one child.`);let d=s.props?.bind;if(d!==void 0&&(l?.interaction!=="input"?n.push(`Component "${s.id}" cannot bind form state.`):(!ne.SURFACE_SLOT_POLICY[e].form||typeof d!="string"||!(d==="/$form"||d.startsWith("/$form/")||d.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(l?.interaction??"")?n.push(`Component "${s.id}" cannot have actions.`):v>1&&l?.interaction==="single-action"&&n.push(`Component "${s.id}" can have at most one action.`),l?.actionNames){let f=Object.keys(s.actions??{});for(let w of l.actionNames.required??[])f.includes(w)||n.push(`Component "${s.id}" requires action "${w}".`);for(let w of f)l.actionNames.allowed&&!l.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 l=r.get(o);if(l){a.add(o);for(let d of Array.isArray(l.children)?l.children:[]){if(typeof d!="string"){n.push(`Component "${o}" has a non-string child reference.`);continue}r.has(d)?c(d,s+1):n.push(`Component "${o}" references missing child "${d}".`);}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=qn(o);s==="$form"&&!ne.SURFACE_SLOT_POLICY[e].form?n.push(`Binding "${o}" is only allowed on wait surfaces.`):s!=="$form"&&!Kn.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 l=s,d=l?.name,v=l?.type;typeof d!="string"||!d||o.has(d)?n.push(`Surface form field name "${String(d)}" is invalid or duplicated.`):o.add(d),Jn.has(String(v))||n.push(`Unknown surface form field type "${String(v)}".`),(typeof l.label!="string"||!l.label.trim())&&n.push(`Surface form field "${String(d)}" requires a label.`),v==="file"&&"default"in l&&n.push(`File field "${String(d)}" cannot have a default binding.`),v==="file"&&(l.maxFiles!==void 0&&(!Number.isInteger(l.maxFiles)||Number(l.maxFiles)<1||Number(l.maxFiles)>5)&&n.push(`File field "${String(d)}" maxFiles must be between 1 and 5.`),l.maxBytes!==void 0&&(!Number.isInteger(l.maxBytes)||Number(l.maxBytes)<1||Number(l.maxBytes)>10*1024*1024)&&n.push(`File field "${String(d)}" maxBytes exceeds platform limits.`),l.accept!==void 0&&(!Array.isArray(l.accept)||l.accept.some(f=>typeof f!="string"||!/^[a-z0-9.+-]+\/(?:[a-z0-9.+-]+|\*)$/i.test(f)))&&n.push(`File field "${String(d)}" has invalid MIME types.`)),v==="select"&&(!Array.isArray(l.options)||l.options.length===0?n.push(`Select field "${String(d)}" requires options.`):l.options.some(f=>!f||typeof f!="object"||typeof f.label!="string"||typeof f.value!="string")&&n.push(`Select field "${String(d)}" has invalid options.`));}$e(t.form,n);}return Array.from(new Set(n))}function Zn(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 Qn=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];})),er=J&&J.__exportStar||function(t,e){for(var n in t)n!=="default"&&!Object.prototype.hasOwnProperty.call(e,n)&&Qn(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=At();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}});er(Bt(),J);});var Ge=class extends Error{constructor(){super("401 Unauthorized"),this.name="UnauthorizedError";}};function Pn(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$1(),process.exit(1)),!Pn(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$1(),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$1(),process.exit(1));let l=Date.now(),d=l+s.expires_in*1e3;return b$1.info("Refresh succeeded",{expiresAt:d}),await e$1.set({accessToken:s.access_token,refreshToken:s.refresh_token||i.refreshToken,idToken:s.id_token||i.idToken,expiresAt:d,tokenType:"Bearer",scope:i.scope,issuedAt:l,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$1(),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 l;try{l=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$1(),process.exit(1);}let d=await l.json();(!l.ok||d.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$1(),process.exit(1));let v=Date.now(),f=v+d.expires_in*1e3;return b$1.info("Refresh retry succeeded",{expiresAt:f}),await e$1.set({accessToken:d.access_token,refreshToken:d.refresh_token||c.refreshToken,idToken:d.id_token||c.idToken,expiresAt:f,tokenType:"Bearer",scope:c.scope,issuedAt:v,issuer:c.issuer}),d.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$1(),process.exit(1)),c}}}async function wt(){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 j(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,l=o$1?.environment||"dev",d=o()??l,v=o$1?.environment_ids?.[d]??(d===l?o$1?.environment_id:void 0),f=k[d],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 Wt(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:l}=await r({env:e$1.opts().env}),d$1=s(l);try{let v=await j(`${s$1}/api/workspaces`,o,{method:"POST",headers:{...d$1,"Content-Type":"application/json"},body:JSON.stringify({name:n.name,slug:n.slug,tenantId:l.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:l.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:"ApiError",slug:n.slug,env:l.environment}),await j$1();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:l.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:l.environment}),await j$1();}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:l.environment}):await e(a$1.WORKSPACE_CREATE_FAILED,{error_class:v?.constructor?.name,env:l.environment}),await j$1();}});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 j(`${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$1(),process.exit(1);}let l=await s.json();console.log(`${w} Workspace created successfully.`),console.log(` ID: ${l?.data?.workspaceId}`),l?.data?.workspaceSlug&&console.log(` Slug: ${l?.data?.workspaceSlug}`);let{userId:d$1,tenantId:v}=await d();d$1?await f(a$1.WORKSPACE_CREATED,d$1,v,{slug:n.slug,env:c.environment}):await e(a$1.WORKSPACE_CREATED,{slug:n.slug,env:c.environment}),await j$1();}catch(s){console.error(`Error: Network or unexpected error: ${s.message}`);let{userId:l,tenantId:d$1}=await d();l?await f(a$1.WORKSPACE_CREATE_FAILED,l,d$1,{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$1(),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}),l=s(s$1);try{let d$1=await j(`${o}/api/workspaces?tenantId=${s$1.tenant_id}`,c,{headers:l});if(!d$1.ok){let T=await H(d$1);i?.({type:"error",message:"Failed to list workspaces",detail:`Server responded with ${d$1.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$1();return}let f$1=(await d$1.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$1();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$1();}catch(d$1){i?.({type:"error",message:"Unexpected error",detail:d$1.message});let{userId:v,tenantId:f$1}=await d();v?await f(a$1.WORKSPACE_LIST_FAILED,v,f$1,{error_class:d$1?.constructor?.name,env:s$1.environment}):await e(a$1.WORKSPACE_LIST_FAILED,{error_class:d$1?.constructor?.name,env:s$1.environment}),await j$1();}});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 j(`${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$1(),process.exit(1);}let l=(await o.json())?.data?.workspaces;if(!Array.isArray(l)){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$1(),process.exit(1);}for(let f of l)console.log(`${f.id} ${f.name} ${f.slug}`);let{userId:d$1,tenantId:v}=await d();d$1?await f(a$1.WORKSPACE_LISTED,d$1,v,{env:a.environment}):await e(a$1.WORKSPACE_LISTED,{env:a.environment}),await j$1();}catch(o){console.error(`Error: Network or unexpected error: ${o.message}`);let{userId:s,tenantId:l}=await d();s?await f(a$1.WORKSPACE_LIST_FAILED,s,l,{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$1(),process.exit(1);}});});}function Et(t,e,n){let r=null,i=0,a=false,c=[],o=new Map,s=null,l=null,d=0,v=[1e3,2e3,4e3,8e3,16e3];function f(){s&&(clearInterval(s),s=null),l&&(clearTimeout(l),l=null),d=0;}function w(){f(),s=setInterval(()=>{if(!r||r.readyState!==vt.OPEN)return;let R=Date.now().toString()+"-"+Math.random().toString();r.send(JSON.stringify({type:"client-ping",requestId:R})),l=setTimeout(()=>{d++,d>=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 vt(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"){l&&(clearTimeout(l),l=null),d=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===vt.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 nn=b(Kt(),1);var sr=fileURLToPath(import.meta.url),Qt=dirname(sr),qt=join(Qt,"lib","evaluator.js"),zt=join(Qt,"evaluator.ts"),or=existsSync(qt)||!existsSync(zt)?qt:zt,ir=createRequire(import.meta.url),cr=ir.resolve("tsx/cli");function Xt(t){let e=t.trim();if(!e||e.startsWith("#"))return "";let n=e.match(/^(?:"((?:\\.|[^"\\])*)"|'((?:''|[^'])*)')(?:\s+#.*)?$/);return n?n[1]!==void 0?n[1].replace(/\\(["\\])/g,"$1").trim().replace(/\\/g,"/"):n[2].replace(/''/g,"'").trim().replace(/\\/g,"/"):e.replace(/\s+#.*$/,"").trim().replace(/\\/g,"/")}async function je(t){try{let r=await ce.readFile(re.join(t,"culvii.yaml"),"utf-8"),i=[],a=!1;for(let c of r.replace(/^\uFEFF/,"").split(/\r?\n/)){let o=c.trim().match(/^entrypoints\s*:(?:\s*(.*))?$/);if(o){let l=(o[1]??"").trim(),d=l.match(/^\[(.*)\](?:\s+#.*)?$/);if(d){let f=d[1].match(/(?:"(?:\\.|[^"\\])*"|'(?:''|[^'])*'|[^,]+)+/g)??[];for(let w of f){let m=Xt(w);m&&i.push(re.resolve(t,m));}a=!1;continue}a=!l.replace(/(?:^|\s+)#.*$/,"").trim();continue}if(!a)continue;let s=c.match(/^\s*-(?:\s+(.*))?$/);if(s){let l=Xt(s[1]??"");l&&i.push(re.resolve(t,l));}else 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}),i.sort((a,c)=>a.name.localeCompare(c.name));}catch{return}for(let a of i){let c=a.name.toLowerCase();if(a.name.startsWith(".")||c==="node_modules"||c==="dist")continue;let o=re.join(r,a.name);a.isDirectory()?await n(o):a.isFile()&&c.endsWith(".culvii.ts")&&e.push(o);}}return await n(t),e}function Me(t,e={}){return new Promise((n,r)=>{if(!t.length)return n([]);let i=spawn(process.execPath,[cr,or,...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 l=[],d=new Set,v=a.split(/\r?\n/).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&&d.has(I)||(I&&d.add(I),l.push(m));}}catch{}n(l);});})}function Ze(t){return (0, nn.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 ur(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 fr(t){return createHash("sha256").update(JSON.stringify(It(ur(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 Qe(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 pr(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 pr(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 yr(t){return typeof t?.type=="string"&&t.type!=="manualTrigger"&&t.type.endsWith("Trigger")}function gr(t,e){return t.get(e)??t.get(Y(e))}function rn(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 an(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:gr(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=an(r,e);i&&n.push(i);}return n}function et(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 rn(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=an(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 tt(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 l=n.get(s.referenceKey)??n.get(Y(s.referenceKey));if(!(!l||he(l).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 nt(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 rn(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(yr);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 l=o.filter(d=>d?.type==="manualTrigger");if(l.length!==1)return l.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 rt(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 at(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)}var mr=new Set(["node_modules","dist"]),wr=/^[a-zA-Z]:(?:\/|$)/;function en(t){return t.replace(/\\/g,"/").replace(/\/+$/,"")}function tn(t,e){return t.includes("\\")||wr.test(e)||e.startsWith("//")}function vr(t,e=process.cwd()){let n=en(t),r=e?en(e):"",i=n.startsWith("/")&&!n.startsWith("//")&&!t.includes("\\"),a=tn(t,n)||!i&&!!e&&tn(e,r),c=a?n.toLowerCase():n,o=a?r.toLowerCase():r,s=c;if(e){if(c===o)return false;c.startsWith(o+"/")&&(s=c.slice(o.length+1));}return s.split("/").some(l=>!!l&&(mr.has(l.toLowerCase())||l.startsWith(".")&&l!=="."&&l!==".."))}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 l();}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}
3
+ `);}async function l(){let f=await je(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 W=Ze(g.definition);if(W.length){s(x,`Invalid surface '${O}': ${W.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=fr(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"?Qe(g.definition):[];if(g.type==="agent"){for(let W of rt(g.definition))s(x,W,"error"),K=true;for(let W of g.definition.secondaryAgents||[]){let $=W?.id,le=!!(W?.systemPrompt||W?.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 W of se)if(!I.has(W)){let $=`Dangling ref: agent '${O}' references workflow '${W}' which is not defined locally.`;s(x,$,"error"),q=true,t.onValidationError?.({resourceType:"agent",slug:O,missingReferenceId:W,message:$});}for(let W of pe)if(!I.has(W)){let $=`Dangling ref: workflow '${O}' references agent '${W}' which is not defined locally.`;s(x,$,"error"),q=true,t.onValidationError?.({resourceType:"workflow",slug:O,missingReferenceId:W,message:$});}for(let W of we)if(W.version===void 0&&!x$1.has(W.surfaceKey)){let $=`Dangling ref: workflow '${O}' references local surface '${W.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:W.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=et(w);if(D){s(x,D,"error"),s(x,"Fix the secondary agent tools before syncing.","error");return}let R=nt(w);if(R){s(x,R,"error"),s(x,"Fix the workflow tool trigger before syncing.","error");return}let N=tt(w);if(N){s(x,N,"error"),s(x,"Fix the workflow tool target before syncing.","error");return}let y$1=at(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}'.
4
+ 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 d=dr.watch(e,{ignored:f=>vr(f,e),ignoreInitial:true,persistent:true});d.on("all",(f,w)=>{w.toLowerCase().endsWith(".ts")&&(r&&clearTimeout(r),r=setTimeout(()=>{o();},500));});let v=false;return {close:()=>d.close(),triggerFullSync:()=>{if(v){o();return}if(v=true,i){c=true,a=true;return}n.clear(),o();}}}function Er(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}var kr="https://console.culvii.com/";function Le(t,e){return `${kr}${t}/development/${e}/workflows`}function sn(){let t=new Date,e=n=>String(n).padStart(2,"0");return `${e(t.getHours())}:${e(t.getMinutes())}:${e(t.getSeconds())}`}async function hr(){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$1();return}let{apiUrl:o,context:s$1}=await r({env:"dev"}),l=s(s$1),d$1=s$1.workspace_id,v=s$1.workspace_slug;e$1?.({type:"provisioning",message:"Provisioning dev workspace\u2026"});try{let y=await j(`${o}/api/workspaces`,r$1,{method:"POST",headers:{...l,"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$1();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"},d$1=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$1();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}`,...l}}let I=r$1;async function x(){let y=await wt();return y&&(I=y),T(I)}let q=o.replace(/^http/,"ws")+"/api/dev/sync?workspaceId="+encodeURIComponent(d$1),K,D=Et(q,x,{onOpen:()=>{e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,d$1)}),K?.triggerFullSync();},onAck:(y,S,h)=>{let g={type:h?"orphaned":"synced",message:`${h?"orphaned":"synced"} ${y}`,timestamp:sn()};m.push(g),e$1?.({type:"connected",log:[...m],consoleUrl:Le(s$1.tenant_slug,d$1)});},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,d$1)});},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,d$1)});},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:d$1,onSync:y=>{D.send({type:"sync",slug:y.slug,resourceType:y.type,definition:y.definition,workspaceId:d$1});},onOrphan:(y,S)=>{D.send({type:"orphan",slug:y,resourceType:S,workspaceId:d$1});},onValidationError:({resourceType:y,slug:S,missingReferenceId:h,message:g})=>{D.send({type:"validation-error",slug:S,resourceType:y,workspaceId:d$1,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,d$1)});}});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$1(),process.exit(0);});});}function on(t){t.command("dev").description("Start the development server and file watcher").action(async()=>{if(Er()){await hr();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$1(),process.exit(1);}let{apiUrl:i,context:a}=await r({env:"dev"}),c=s(a),o=Date.now(),s$1=a.workspace_id,l=a.workspace_slug;try{let D=await j(`${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$1(),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,l=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$1(),process.exit(1);}console.log(`tenant: ${a.tenant_slug} | workspace: ${l||"unknown"} | env: dev`);let{userId:d$1,tenantId:v}=await d();d$1?await f(a$1.DEV_STARTED,d$1,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 wt();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=Et(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=sn();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$1(),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$1(),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$1(),process.exit(0);});});});}function Ir(){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 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 ln(t){return createHash("sha256").update(JSON.stringify(Ct(Sr(t)))).digest("hex")}function Tr(t){return new Promise(e=>{let n=_r.createInterface({input:process.stdin,output:process.stdout});n.question(t,r=>{n.close(),e(r.toLowerCase()==="y"||r.toLowerCase()==="yes");});})}function Cr(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 cn(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 Dr(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$1();return}if(t.env!=="sandbox"&&t.env!=="prod"){n?.({type:"error",message:"Environment must be sandbox or prod"}),await j$1();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$1();return}let l=await j(`${c}/api/workspaces?tenantId=${o.tenant_id}`,a,{headers:s$1});if(!l.ok){n?.({type:"error",message:"Failed to fetch workspaces",detail:await H(l)});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$1();return}let f$1=((await l.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$1();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$1();},T=process.cwd(),I=await je(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$1();return}let b=typeof g=="string"?Y(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 rt(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 Qe(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:ln(h.definition)});}let R=et(x);if(R)return m(`Deploy failed: ${R}`);let N=nt(x);if(N)return m(`Deploy failed: ${N}`);let y=tt(x);if(y)return m(`Deploy failed: ${y}`);let S=at(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 j(`${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:yt}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,yt,{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$1();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$1();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$1();return}n?.({type:"applying"});let we=await j(`${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:yt}=await d();_e?await f(a$1.DEPLOY_FAILED,_e,yt,{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$1();return}let W=await we.json();n?.({type:"success",env:t.env,created:(W.created||[]).length,versioned:(W.versioned||[]).length,destroyed:(W.destroyed||[]).length,createdItems:W.created||[],versionedItems:W.versioned||[],destroyedItems:W.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$1();}});}function dn(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(Ir()){await Dr(e$1);return}await V(async n=>{e$1.env==="dev"&&(console.log("Use culvii dev for local iteration"),await j$1(),process.exit(1)),e$1.env!=="sandbox"&&e$1.env!=="prod"&&(console.error("Environment must be sandbox or prod"),await j$1(),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$1(),process.exit(1);}let c=null,o=await j(`${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$1(),process.exit(1);}let d$1=((await o.json())?.data?.workspaces||[]).find(y=>y.slug===e$1.workspaceSlug);if(!d$1){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$1(),process.exit(1);}c=d$1.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:d$1?.slug,error_class:"ValidationError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:d$1?.slug,error_class:"ValidationError"}),await j$1(),process.exit(1);},w$1=process.cwd(),m=await je(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$1(),process.exit(1));let h=typeof S=="string"?Y(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 rt(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 Qe(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:ln(y.definition)});}let K=et(T);K&&await f$1(`Deploy failed: ${K}`);let D=nt(T);D&&await f$1(`Deploy failed: ${D}`);let R=tt(T);R&&await f$1(`Deploy failed: ${R}`);let N=at(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:d$1.slug}):await e(a$1.DEPLOY_STARTED,{env:e$1.env,workspace:d$1.slug});let h=await j(`${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:d$1?.slug,error_class:"PlanError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:d$1?.slug,error_class:"PlanError"}),await j$1(),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$1(),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 (${cn($)})`);for(let $ of b.destroyed||[])console.log(` - ${$.slug} DELETE (${cn($)})`),console.log(Cr($));if(!await Tr(`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:d$1?.slug,reason:"user_cancelled"}):await e(a$1.DEPLOY_ABORTED,{env:e$1.env,workspace:d$1?.slug,reason:"user_cancelled"}),await j$1(),process.exit(0);}let se=await j(`${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:d$1?.slug,error_class:"ApplyError"}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:d$1?.slug,error_class:"ApplyError"}),await j$1(),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:W}=await d();we?await f(a$1.DEPLOY_SUCCEEDED,we,W,{env:e$1.env,workspace:d$1.slug,created:b.created.length,versioned:b.versioned.length,destroyed:b.destroyed.length}):await e(a$1.DEPLOY_SUCCEEDED,{env:e$1.env,workspace:d$1.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:d$1?.slug,error_class:y?.constructor?.name}):await e(a$1.DEPLOY_FAILED,{env:e$1.env,workspace:d$1?.slug,error_class:y?.constructor?.name}),await j$1(),process.exit(1);}});});}function br(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function un(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(br()){let o=function(){let[s,l]=Ee.useState({type:"loading"});return Ee.useEffect(()=>(c.current=l,()=>{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$1();return}await V(async s$1=>{let{apiUrl:l,context:d$1}=await r({env:r$1.env}),v=s(d$1),{userId:f$1,tenantId:w}=await d();f$1?await f(a$1.RENAME_STARTED,f$1,w,{resourceType:r$1.resourceType,env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_STARTED,{resourceType:r$1.resourceType,env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();let m=d$1.workspace_id;if(r$1.workspaceSlug){let T=await j(`${l}/api/workspaces?tenantId=${d$1.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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceFetchError",env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"WorkspaceNotFound",env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error_class:"NoWorkspace",env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();return}try{let T=await j(`${l}/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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:I,env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_SUCCEEDED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();}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:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}):await e(a$1.RENAME_FAILED,{oldSlug:e$1,newSlug:n,resourceType:r$1.resourceType,error:T.message,env:d$1.environment,workspace:r$1.workspaceSlug??d$1.workspace_slug}),await j$1();}});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$1(),process.exit(1));let{apiUrl:c,context:o}=await r({env:r$1.env}),s$1=s(o),{userId:l,tenantId:d$1}=await d();l?await f(a$1.RENAME_STARTED,l,d$1,{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$1(),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 j(`${c}/api/workspaces?tenantId=${o.tenant_id}`,a,{headers:s$1});f$1.ok||(console.error(`Failed to fetch workspaces: ${await H(f$1)}`),l?await f(a$1.RENAME_FAILED,l,d$1,{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$1(),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),l?await f(a$1.RENAME_FAILED,l,d$1,{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$1(),process.exit(1)),v=T.id;}v||(console.error("Error: No workspace configured. Run culvii dev first, or provide --workspace-slug <slug>."),l?await f(a$1.RENAME_FAILED,l,d$1,{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$1(),process.exit(1));try{let f$1=await j(`${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}`),l?await f(a$1.RENAME_FAILED,l,d$1,{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$1(),process.exit(1);}console.log(`${w} Renamed ${e$1} ${z} ${n}`),console.log(" Immutable ID preserved. All execution history retained."),l?await f(a$1.RENAME_SUCCEEDED,l,d$1,{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$1();}catch(f$1){console.error(`Error: Network or unexpected error: ${f$1.message}`),l?await f(a$1.RENAME_FAILED,l,d$1,{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$1(),process.exit(1);}});});}async function pn(t,e,n){let r=await j(`${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",l=Array.isArray(i?.tenants)?i.tenants.find(v=>v.id===c?.id):void 0,d=Array.isArray(l?.roleConfig?.grants)?l.roleConfig.grants:[];return {ok:true,email:a?.email||"Unknown",name:a?.name||"Unknown",tenant:o,tenantName:s,workspace:n.workspace_slug||null,access:d}}function Rr(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$1();}function yn(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 xr();return}await $r();});}async function xr(){await V(async t=>{let{apiUrl:e,context:n}=await r(),r$1=await pn(t,e,n);r$1.ok||(process.stderr.write(JSON.stringify({error:r$1.error})+`
7
5
  `),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(`
6
+ `),await Ve(!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: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(),l=await pn(c,o,s);if(!l.ok){n?.({type:"error",message:"Failed to fetch identity",detail:`Server responded with ${l.status}: ${l.error}`}),await Ve(!0);return}n?.({type:"success",email:l.email,name:l.name,tenant:l.tenant,tenantName:l.tenantName,workspace:l.workspace,access:l.access.map(Rr)}),await Ve(!1,{workspace:l.workspace});}catch(o){n?.({type:"error",message:"Unexpected error",detail:o.message}),await Ve(!0);}});}function Or(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function lt(t){return t.workspace_slugs?.[t.environment]??t.workspace_slug??null}function gn(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(l){if(l.message==="Active context key not found"){let d=re.join(Rt.homedir(),".culvii","config"),v=await ce.readFile(d,"utf-8");r=JSON.parse(v);}else if(l.code==="ENOENT"){console.error("No configuration found. Please run `culvii login` first.");let{userId:d$1,tenantId:v}=await d();d$1?await f(a$1.TENANT_SWITCH_FAILED,d$1,v,{error_class:"ENOENT",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"ENOENT",slug:e$1}),await j$1(),process.exit(1);}else throw l}if(!r||!r.contexts){console.error("No configuration found. Please run `culvii login` first.");let{userId:l,tenantId:d$1}=await d();l?await f(a$1.TENANT_SWITCH_FAILED,l,d$1,{error_class:"NoConfig",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoConfig",slug:e$1}),await j$1(),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:l,tenantId:d$1}=await d();l?await f(a$1.TENANT_SWITCH_FAILED,l,d$1,{error_class:"NoTenants",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"NoTenants",slug:e$1}),await j$1(),process.exit(1);}if(Or()){let{SwitchView:l}=await import('./SwitchView-PS3ICKZT.js');if(a.length===1&&!e$1&&(await G(Promise.resolve(Ee.createElement(l,{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:lt(i[m]),environment:i[m].environment,isActive:m===r.active}));await G(Promise.resolve(Ee.createElement(l,{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:lt(i[I]),environment:i[I].environment,isActive:I===r.active}));await G(Promise.resolve(Ee.createElement(l,{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$1(),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 d$1=i[e$1];await G(Promise.resolve(Ee.createElement(l,{state:{type:"success",slug:e$1,workspaceSlug:lt(d$1),environment:d$1.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$1();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((l,d)=>{let v=i[l],f=l===r.active?"*":" ";console.log(`${d+1}. ${f} ${l} (Tenant ID: ${v.tenant_id})`);}),console.log(`
9
7
  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}
8
+ 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:l,tenantId:d$1}=await d();l?await f(a$1.TENANT_SWITCH_FAILED,l,d$1,{error_class:"TenantNotFound",slug:e$1}):await e(a$1.TENANT_SWITCH_FAILED,{error_class:"TenantNotFound",slug:e$1}),await j$1(),process.exit(1);}await n.withLock(async()=>{let l=re.join(Rt.homedir(),".culvii","config"),d=await ce.readFile(l,"utf-8"),v=JSON.parse(d);await n.write({...v,active:e$1});});let c$1=i[e$1];console.log(`tenant: ${e$1} | workspace: ${lt(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$1();}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$1(),process.exit(1);}});}var mn=["dev","sandbox","prod"];function Pr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}async function dt(t){if(!Pr())return false;let{EnvView:e}=await import('./EnvView-3ZURMIZS.js');return await G(Promise.resolve(Ee.createElement(e,{state:t}))),true}async function Wr(t,e,n){let r=await j(`${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 wn(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 Wr(n,r$1,i.tenant_id);if(!e$1){if(await dt({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
9
  `),process.stdout.write(`tenant: ${i.tenant_slug}
12
10
  `),process.stdout.write(`available: ${a.length?a.join(", "):"none"}
13
11
  `),!a.includes(i.environment)&&a.length>0&&process.stdout.write(`
14
12
  Switch with: culvii env ${a[0]}
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}
13
+ `);return}let c$1=e$1.toLowerCase();if(!mn.includes(c$1)){let v=`Invalid environment '${e$1}'.`,f=`Valid values: ${mn.join(", ")}.`;if(await e(a$1.ENV_SWITCH_FAILED,{error_class:"InvalidEnv",env:e$1}),await j$1(),await dt({type:"error",message:v,detail:f})){process.exitCode=1;return}process.stderr.write(`${v} ${f}
14
+ `),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$1(),await dt({type:"error",message:v,detail:f})){process.exitCode=1;return}process.stderr.write(`${v} ${f}
15
+ `),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 dt({type:"success",env:o,tenant:i.tenant_slug})||(process.stdout.write(`env: ${o} | tenant: ${i.tenant_slug}
18
16
  `),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=`{
17
+ `)),c();let{userId:l,tenantId:d$1}=await d();l?await f(a$1.ENV_SWITCHED,l,d$1,{to:o}):await e(a$1.ENV_SWITCHED,{to:o}),await j$1();});});}var ut={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 Hr(){let t=a$2();return t.isTTY&&!t.isCI&&t.supportsColor&&t.supportsUnicode}function Br(t,e=process.cwd()){let n=new Set;if(t){let i=t.toLowerCase()==="codex"?"agents":t.toLowerCase();return ut[i]?(n.add(i),{targets:n}):{error:`Invalid agent: ${t}. Must be one of: ${[...Object.keys(ut),"codex"].sort().join(", ")}.`}}for(let[i,a]of Object.entries(ut))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 Kr(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 Gr(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 qr(t,e){let{bundle:n,manifest:r}=e,i=Q.existsSync(t)?Kr(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}`),l=false;try{return Q.mkdirSync(o),Gr(o,n),Q.existsSync(t)&&(Q.renameSync(t,s),l=!0),Q.renameSync(o,t),l&&Q.rmSync(s,{recursive:!0,force:!0}),i?"updated":"installed"}catch(d){throw Q.rmSync(o,{recursive:true,force:true}),l&&!Q.existsSync(t)&&Q.existsSync(s)&&Q.renameSync(s,t),d}}function vn(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=Br(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-5WQTV2OV.js');for(let c of n.targets){let o=ut[c],s=e.global?o.globalDir:o.projectDir,l=re.join(e.global?Rt.homedir():process.cwd(),s),d=qr(l,{force:e.force,bundle:i,manifest:a}),v=re.join(e.global?"~":"",s),f=c==="agents"?"Portable/Codex":c;r.push({agentName:`${f} (${d})`,displayPath:v});}}catch(i){console.error(`${x} ${i.message}`),process.exitCode=1;return}if(Hr()){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 ea(){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"],kn={"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"},hn={openai:"openai/YOUR_MODEL_ID",anthropic:"anthropic/YOUR_MODEL_ID",gemini:"gemini/YOUR_MODEL_ID","google-vertex":"google-vertex/YOUR_MODEL_ID"},_n=`{
20
18
  "compilerOptions": {
21
19
  "target": "ES2022",
22
20
  "module": "NodeNext",
@@ -26,7 +24,7 @@ Switch with: culvii env ${a[0]}
26
24
  "esModuleInterop": true
27
25
  },
28
26
  "include": ["src/**/*.ts"]
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
27
+ }`;function An(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 ft(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
30
28
  import { MultiAgentEngine, createAgentModelConfigFromRef } from '@culvii/kit';
31
29
 
32
30
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -45,7 +43,7 @@ function createGreeterAgent() {
45
43
  }
46
44
 
47
45
  createGreeterAgent();
48
- `}var mn=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
46
+ `}var In=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
49
47
  import { Workflow, Step } from '@culvii/kit';
50
48
 
51
49
  function createGreetingWorkflow() {
@@ -76,7 +74,7 @@ function createGreetingWorkflow() {
76
74
  }
77
75
 
78
76
  createGreetingWorkflow();
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
77
+ `;function Sn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
80
78
  import { MultiAgentEngine, createAgentModelConfigFromRef } from '@culvii/kit';
81
79
 
82
80
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -104,7 +102,7 @@ function createCoordinatorAgent() {
104
102
  }
105
103
 
106
104
  createCoordinatorAgent();
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
105
+ `}function Tn(t){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
108
106
  import { MultiAgentEngine, createAgentModelConfigFromRef, defineWorkflowTool } from '@culvii/kit';
109
107
 
110
108
  const MODEL_CREDENTIAL_ID = 'YOUR_CREDENTIAL_ID';
@@ -137,7 +135,7 @@ function createResearchAgent() {
137
135
  }
138
136
 
139
137
  createResearchAgent();
140
- `}var En=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
138
+ `}var Cn=`// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
141
139
  import { Workflow, Step } from '@culvii/kit';
142
140
 
143
141
  function createResearchWorkflow() {
@@ -155,7 +153,7 @@ function createResearchWorkflow() {
155
153
  }
156
154
 
157
155
  createResearchWorkflow();
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
156
+ `;function Dn(){return `// Generated by culvii init \u2014 replace YOUR_CREDENTIAL_ID and YOUR_MODEL_ID with your actual values from the Culvii console
159
157
  import { Workflow, Step } from '@culvii/kit';
160
158
 
161
159
  function createCoordinationWorkflow() {
@@ -186,9 +184,9 @@ function createCoordinationWorkflow() {
186
184
  }
187
185
 
188
186
  createCoordinationWorkflow();
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(`
187
+ `}async function $t(t,e){return (await t.question(e)).trim()}async function ta(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$1(),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$1(),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:kn[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:l}=await import('./InitView-TI2HU6VV.js'),d$1={update:null};function v(){let[f,w]=Ee.useState({type:"scaffolding",message:"Scaffolding project\u2026"});return Ee.useEffect(()=>(d$1.update=w,()=>{d$1.update=null;}),[]),Ee.createElement(l,{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){d$1.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$1();return}}else await ce.mkdir(f,{recursive:!0});let w=re.join(f,"src");await ce.mkdir(w,{recursive:!0});let m=hn[o],T=[];await ce.writeFile(re.join(f,"package.json"),An(e$1.here?re.basename(f):a),"utf-8"),await ce.writeFile(re.join(f,"tsconfig.json"),_n,"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",ft(m)):c==="agent-workflow"?(await I("greeter-agent.culvii.ts",ft(m)),await I("greeting-workflow.culvii.ts",In)):c==="agent-workflow-tool"?(await I("research-agent.culvii.ts",Tn(m)),await I("research-workflow.culvii.ts",Cn)):c==="multi-agent"&&(await I("coordinator-agent.culvii.ts",Sn(m)),await I("coordination-workflow.culvii.ts",Dn()));let x=e$1.here?".":`./${a}`;d$1.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$1();}catch(f){d$1.update?.({type:"error",message:`Initialization failed: ${f.message}`}),await i(a$1.INIT_FAILED,{error_class:f?.constructor?.name??"UnknownError"}),await j$1();return}}function bn(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(ea()){await ta(e$1,n);return}let{userId:r,tenantId:i}=await d(),a=async(l,d={})=>{r?await f(l,r,i,d):await e(l,d);};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$1(),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$1(),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(`
188
+ Select a template:`),de.forEach((I,x)=>{console.log(` ${x+1}) ${I.padEnd(16)} ${kn[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(`
189
+ 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 d=n.here?process.cwd():re.join(process.cwd(),c);existsSync(d)?(await ce.readdir(d)).filter(x=>!x.startsWith(".")).length>0&&(console.error(`${x} Directory '${re.relative(process.cwd(),d)||"."}' already exists and is not empty.`),await a(a$1.INIT_FAILED,{error_class:"DirectoryNotEmpty"}),await j$1(),process.exit(1)):await ce.mkdir(d,{recursive:!0});let v=re.join(d,"src");await ce.mkdir(v,{recursive:!0});let f=hn[s],w$1=[];await ce.writeFile(re.join(d,"package.json"),An(n.here?re.basename(d):c),"utf-8"),await ce.writeFile(re.join(d,"tsconfig.json"),_n,"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",ft(f)):o==="agent-workflow"?(await m("greeter-agent.culvii.ts",ft(f)),await m("greeting-workflow.culvii.ts",In)):o==="agent-workflow-tool"?(await m("research-agent.culvii.ts",Tn(f)),await m("research-workflow.culvii.ts",Cn)):o==="multi-agent"&&(await m("coordinator-agent.culvii.ts",Sn(f)),await m("coordination-workflow.culvii.ts",Dn())),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$1();}catch(l){console.error(`${x} Initialization failed: ${l.message}`),await a(a$1.INIT_FAILED,{error_class:l?.constructor?.name??"UnknownError"}),await j$1(),process.exit(1);}});}function fe(t){console.error(`Error: ${t}`),process.exit(1);}function On(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 On(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 j(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 pt(t){return t.workspace_id||fe("No workspace configured. Start culvii dev first.")}async function Rn(t,e,n){let r=pt(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 xn(t,e){let n=Number(t);return (!Number.isInteger(n)||n<1)&&fe(`${e} must be a positive integer`),n}function $n(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 sa(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 Nn(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:pt(o.context),items:sa(Ot(a.file,"Review file"))})}),l={reviewId:s.data.id,url:$n(s.data.id,o.context)};a.json?console.log(JSON.stringify(l,null,2)):(console.log(`Surface review: ${l.reviewId}`),console.log(l.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}),l=await Ue(`${s.apiUrl}/api/surface-reviews/${encodeURIComponent(a)}`,o,s.context);if(c.json)console.log(JSON.stringify(l.data,null,2));else {console.log(`${l.data.id} ${l.data.submittedAt?"submitted":"in progress"}`);for(let d of l.data.items)console.log(`${d.workflowName} ${d.nodeName} ${d.decision??"pending"} ${d.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=$n(a,c.context);await aa(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}),l=await Rn(a,o,s),d=c.payloadFile?Ot(c.payloadFile,"Payload file"):c.payload?On(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:l.id,triggerNode:c.trigger,workspaceId:pt(s.context),payload:d,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(xn(a.page,"--page")),limit:String(xn(a.limit,"--limit"))});if(a.workflow){let d=await Rn(a.workflow,c,o);s.set("workflowId",d.id);}a.status&&s.set("status",a.status),a.trigger&&s.set("trigger",a.trigger);let l=await Ue(`${o.apiUrl}/api/workspaces/${encodeURIComponent(pt(o.context))}/executions?${s}`,c,o.context);if(a.json)console.log(JSON.stringify(l.data,null,2));else {for(let v of l.data.executions)console.log(`${v.id} ${v.status} ${v.workflowName} ${v.startedAt}`);let d=l.data.pagination;console.log(`Page ${d.page}/${d.totalPages||1} (${d.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}),l=await Ue(`${s.apiUrl}/api/executions/${encodeURIComponent(a)}`,o,s.context);if(c.json)console.log(JSON.stringify(l.data,null,2));else {console.log(`${l.data.executionId} ${l.data.status} ${l.data.workflowName}`);for(let d of l.data.steps)console.log(`${d.stepId} ${d.status} ${d.name}`);l.data.error&&console.error(`Error: ${l.data.error.message}`);}});});}function oa(t){return `https://console.culvii.com/${t.tenant_slug}/sandbox/integrations`}function ia(t){return t.scope==="tenant"?"tenant":t.scope==="environment"?`environment:${t.environmentId??"unknown"}`:`workspace:${t.workspaceIds.join(",")||"unknown"}`}async function Ln(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 Un(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([j(`${i}/api/auth-identities`,r$1,c),j(`${i}/api/credential-entities`,r$1,c)]),[l,d]=await Promise.all([Ln(o,"Listing integrations"),Ln(s$1,"Listing integration providers")]),v=new Map(d.map(m=>[m.id,m])),f=oa(a),w=l.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:ia(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 ua(t){Ye=t;}async function be(t=0,e){e&&process.stderr.write(e.endsWith(`
192
190
  `)?e:`${e}
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};
191
+ `),Ye?.(),Ye=null,await j$1(),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);ua(i);}function fa(t="0.1.0"){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-7VBXFHFC.js');await r();}),n$1.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-OJRK2KGE.js');await r();}),e.command("login").description("Login to Culvii").action(async()=>{let{login:r}=await import('./login-7VBXFHFC.js');await r();}),e.command("logout").description("Logout of Culvii").action(async()=>{let{logout:r}=await import('./logout-OJRK2KGE.js');await r();}),Wt(e),on(e),dn(e),un(e),yn(e),gn(e),wn(e),vn(e),bn(e),Nn(e),Un(e),e}async function pa(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$1();}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-NKJCCU5A.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$1(),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()}
192
+ `),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&&pa(fa()).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$1(),console.error(t),await be(1);});export{Ye as activeUnmount,fa as createProgram,be as exit,G as renderApp,ua as setActiveUnmount};
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import i from'path';async function o(){let r=process.argv.slice(2);r.length===0&&process.exit(0);let e=false;for(let s of r)try{await import(i.resolve(s));}catch(t){process.stderr.write(`[culvii evaluator] Failed to import ${s}: ${t.message}
3
- `),e=true;}try{await globalThis.__culvii_dev_registry__?.flushAsync();}catch{}process.exit(e?1:0);}o().catch(r=>{process.stderr.write(`[culvii evaluator] Fatal error: ${r.message}
2
+ import i from'path';import {pathToFileURL}from'url';async function a(){let r=process.argv.slice(2);r.length===0&&process.exit(0);let s=false;for(let e of r)try{await import(pathToFileURL(i.resolve(e)).href);}catch(t){process.stderr.write(`[culvii evaluator] Failed to import ${e}: ${t.message}
3
+ `),s=true;}try{await globalThis.__culvii_dev_registry__?.flushAsync();}catch{}process.exit(s?1:0);}a().catch(r=>{process.stderr.write(`[culvii evaluator] Fatal error: ${r.message}
4
4
  `),process.exit(1);});
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$4}from'./chunk-RS5GDTRN.js';import {b,c,a as a$2}from'./chunk-KZG5CFSB.js';import {e,a,j as j$1,q,l,m,b as b$1,h,g,i as i$1,c as c$1,f}from'./chunk-KM7ZWOEG.js';import {a as a$3}from'./chunk-HX54IFSD.js';import {a as a$1}from'./chunk-JYNOILCD.js';import'./chunk-57XLDHK6.js';import'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import ue from'open';import i from'react';import {render}from'ink';import Y,{timingSafeEqual}from'crypto';import {createInterface}from'readline/promises';import se from'http';import {jsx}from'react/jsx-runtime';function j(n){return n.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function ne(){let n=Y.randomBytes(64);return j(n)}function ae(n){let y=Y.createHash("sha256").update(n).digest();return j(y)}function oe(){let n=Y.randomBytes(32);return j(n)}var de=`<!DOCTYPE html>
2
+ import {a as a$4}from'./chunk-RS5GDTRN.js';import {b,c,a as a$2}from'./chunk-KZG5CFSB.js';import {e,a,j as j$1,q,l,m,b as b$1,h,g,i as i$1,c as c$1,f}from'./chunk-D3YFBXU5.js';import {a as a$3}from'./chunk-HX54IFSD.js';import {a as a$1}from'./chunk-JYNOILCD.js';import'./chunk-57XLDHK6.js';import'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import ue from'open';import i from'react';import {render}from'ink';import Y,{timingSafeEqual}from'crypto';import {createInterface}from'readline/promises';import se from'http';import {jsx}from'react/jsx-runtime';function j(n){return n.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function ne(){let n=Y.randomBytes(64);return j(n)}function ae(n){let y=Y.createHash("sha256").update(n).digest();return j(y)}function oe(){let n=Y.randomBytes(32);return j(n)}var de=`<!DOCTYPE html>
3
3
  <html>
4
4
  <head>
5
5
  <meta charset="utf-8">
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import {b,a,c}from'./chunk-KZG5CFSB.js';import {q,d,f,a as a$1,e,j}from'./chunk-KM7ZWOEG.js';import'./chunk-HX54IFSD.js';import'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import w from'react';import {render}from'ink';async function S(){b.info("Logout flow started");let e$1=new a,o=false;await e$1.withLock(async()=>{let a=await e$1.get();if(!a){o=false;return}if(a.refreshToken){b.info("Revocation attempted");let g=`https://${q.cognitoDomain}/oauth2/revoke`,r=new URLSearchParams;r.set("token",a.refreshToken),r.set("client_id",q.clientId);try{await fetch(g,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()}),b.info("Revocation completed");}catch{b.info("Revocation network error ignored");}}await e$1.delete(),b.info("Tokens deleted"),o=true;let{userId:c,tenantId:u}=await d();c?await f(a$1.LOGOUT,c,u):await e(a$1.LOGOUT),await j();}),o?render(w.createElement(c,{state:{type:"logout_success"}})):render(w.createElement(c,{state:{type:"already_logged_out"}}));}
2
+ import {b,a,c}from'./chunk-KZG5CFSB.js';import {q,d,f,a as a$1,e,j}from'./chunk-D3YFBXU5.js';import'./chunk-HX54IFSD.js';import'./chunk-YKFGEPLO.js';import'./chunk-YPLDPHHD.js';import'./chunk-7UWDMECF.js';import w from'react';import {render}from'ink';async function S(){b.info("Logout flow started");let e$1=new a,o=false;await e$1.withLock(async()=>{let a=await e$1.get();if(!a){o=false;return}if(a.refreshToken){b.info("Revocation attempted");let g=`https://${q.cognitoDomain}/oauth2/revoke`,r=new URLSearchParams;r.set("token",a.refreshToken),r.set("client_id",q.clientId);try{await fetch(g,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()}),b.info("Revocation completed");}catch{b.info("Revocation network error ignored");}}await e$1.delete(),b.info("Tokens deleted"),o=true;let{userId:c,tenantId:u}=await d();c?await f(a$1.LOGOUT,c,u):await e(a$1.LOGOUT),await j();}),o?render(w.createElement(c,{state:{type:"logout_success"}})):render(w.createElement(c,{state:{type:"already_logged_out"}}));}
3
3
  export{S as logout};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-7UWDMECF.js';var e={schemaVersion:1,name:"culvii",bundleHash:"bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",generatorVersion:1,sources:{"@culvii/kit":"0.0.8",nodes:"1.0.0","surface-contract":"1.0.0","@culvii/cli":"0.0.9"},files:{"agents/openai.yaml":"80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b","examples/agent-workflow.culvii.ts":"c82471aa06e2fb2f939f50b70ae797b6fed22f2d51277975a93c16d0b94ecd76","examples/binary-document-workflow.culvii.ts":"3bc13dd2cf04b426449d5509749343a9c040b5e51bcb7e5982339b1173a459c6","examples/complete-workflow.culvii.ts":"2c59f6b9d525092e75b980aa174ccd8b0187621c8c196270453e03591000a08d","examples/custom-output-surface.culvii.ts":"8ccfb826d8b140dae94f8e57458eba7d98bf1cdf3dda372c23b757f9f47cb72b","examples/custom-wait-surface.culvii.ts":"4efef08381de6b51c4530fa312450682a09c3008c77f74c4b55c44b685bf4348","examples/human-in-the-loop-workflow.culvii.ts":"9daee28598cdae498786aea1b55640c1065097825d19262eb072c1b584328cfc","examples/integration-agent-workflow.culvii.ts":"3c9b3a3c174ebdfc4f128b2076d44685355d4ce952e54a5a4ec7061e1f231daf","examples/multi-agent-workflow-tools.culvii.ts":"ac96689205433dc647078acb323e970ac1c2ef06be118f087d428200b852a560","examples/nested-agent-workflow.culvii.ts":"e1255b0e22e83c26ea09876c9e90496c4c5ab4c24a52cf30d2cc2a7e9b1212a7","examples/output-surface.culvii.ts":"1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702","examples/wait-surface.culvii.ts":"ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2","references/agents.md":"bdd14922138c42c9b2ac6466d0eca5960365750451079e8ab28b65f2e0602ae5","references/authoring-files.md":"ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53","references/cli-guide.md":"f127193a2e669861ec9884fdf1f3618af6baf37324029943a05cc13a49d696bc","references/cli-reference.md":"1c97ed69b833a62b8e9000f20684c99315ff1eabaca265ba9fe54817c3b67020","references/feedback-cycle.md":"54ad5b36049e377344220e10a7ddaea1e010f532d9fe7ab39b6abd3d435a6a2a","references/integrations.md":"9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68","references/kit-api.md":"c082d1b63bec52fdd7124e711f4e86bfae015f1cd7045b25e4910349c4fca1fd","references/node-argocd.md":"5abd8bfc02ced232d85d366108f2395bfe8d82e0dd0414527ccf932d85da6191","references/node-clickup-doc.md":"bf62328992963604fe0e015063b9af34d67ca49181c744b77b591a635c1b8c35","references/node-clickup-ticket.md":"b616e8c02a771eb5283fe33972e100aa6be410f88dd01adfbbfc58fe794b6d23","references/node-core-agent.md":"09b0b3a5607dbdd06f3f463d140f9633a27b580e59b22f135f1bb349b7fcc0bf","references/node-core-browser-automation.md":"797f7dbd3374c2ea38de830ab2e9b08a2762e45a3cf56dad1ff274cf8109e7e7","references/node-core-code.md":"2768aa7a0fec5f12d716ece9727b038ee2a205647e7c41bd85f0139165bbbd51","references/node-core-http.md":"4799365201368c31d270644161a6e415d5ecfa25d9c75cf5e550330aff7679b4","references/node-core-if.md":"3298f6dbe803eae9e3a69eb7084b08f43a6c76e139e56051539c7603a705b7e1","references/node-core-jwt.md":"8828d11751ee88474f962a296cf29b279fa055ea2b95d9ee0362d211596bdedb","references/node-core-loop-break.md":"d383011f16ae620860e2535be49cafc862a57c7ecae7d7fbd57ac767a5afbd3c","references/node-core-loop-continue.md":"308af6ffa74572a211f784ffc77b565702105cc73718ae5e8874f1f13254a0ff","references/node-core-loop-output.md":"dd70d65ad423387cf1190f9e103d4ba734763e32b82674299b733cdb299dbac6","references/node-core-loop.md":"35d9e5f15ef49d9e5eb1ed824f438a1c61382ca00ff2a838e371fd60919f3b26","references/node-core-merge.md":"f1c2753761791f872a3e786552ba776742c81b5b56985c23660d90bed6c9422a","references/node-core-set.md":"511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468","references/node-core-switch.md":"512edc581e410f44f7f15ac31ed27fbd1698c0c4cfb9a7fd93feb42bbb29d1ae","references/node-cost-explorer.md":"65bafd0f0e3c9910f3af2f210d492fc0d1648b570c61ff258642c4b441e688f2","references/node-cron-trigger.md":"ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b","references/node-elasticsearch.md":"276ca5fa4368a0c7a12a4383dd01404bdc3c345f6c837ec5fc1c9d609b3138b2","references/node-github-poll-trigger.md":"132d7a0d7b56cfa29be552418725eeddefb0a11716b7b7192f53de6d57667ee8","references/node-github-webhook-trigger.md":"09de1c2b493476d908611f71a88850fc76786d6aed48b74e573c6b647110c6a3","references/node-github.md":"b7ed8f59ecdbcf3ea0166268a27905f1ada3c3fcc5e3e121dc32dea5427a3d06","references/node-gmail-trigger.md":"59ca6745079299e3bdf77f87fa328bd7900227bbe131ed7a977f781d2ee606e1","references/node-gmail.md":"f9d8f18d005acc6423c49e8741d909fe8541c4d849ae8ae590c04b561576bd82","references/node-google-calendar.md":"3bf8ed7c280036fd0009c299fcacbf920bb3b18429f2734ac603e18e16796f73","references/node-google-docs.md":"b8d6d68914b4228f11adf575753bcaa86cbf71fd3c7dfa36fb07d84627250ad1","references/node-grafana-dashboard.md":"9bdfafcdfd461a0082b0645a4089826204021fb273589732071ee56ff97ab83e","references/node-grafana-data-source.md":"050f9dda595a35346b5396563de0e8c18acb05a9139655c61d2a706cc39b5544","references/node-grafana-query.md":"35c95c6528c01766cfe0c88a9f1adcf786a95061ce81e963025ec131da1d1873","references/node-hibp-list-domains.md":"b977ed4babb1c419bfe13d76166528fffeddbaeb81147ece07b3c19d34d0f797","references/node-hibp-stealer-logs.md":"13758678d5eebd520823bc0e56d12cbef8b72835b54b0fc00e9402b744d44550","references/node-kubernetes.md":"293fd70959588d4f10fd8869388cf37809f477e2f987752da5ab0cdfb2c7cdc2","references/node-manual-trigger.md":"4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086","references/node-microsoft-outlook-trigger.md":"aa4385d1734de97e79ce59d2c6ca802683e6c07f625b521d606f8bf5f8540ac5","references/node-microsoft-outlook.md":"51d55b369461dc0b88dd9b1fcf905f6f9b37fd9270053fc9e2022c2d3c33bed2","references/node-microsoft-sharepoint.md":"10f27d6507989598ead041a5e1965dd3014dd610848d2b12e4ee81864e4373ed","references/node-onionsearch.md":"3711791d3c5516ae6ee88bf29b1d18a79da3446cb310446d1e4fb77e22934fe6","references/node-prometheus.md":"337c4583bbe7f18b54bd7bcf452b8b7f0eb8dbab5d4c65945e6bdec2bbddc35b","references/node-s3.md":"8ecc9a791cda334707431dfcfed34abe9eedbedbb9c06f1ad03907f8af59b2a8","references/node-slack-events-trigger.md":"9884a5f369f654b5bf78cd352aaee9df27ec6e5fa548edde8485ea7f47d31eb2","references/node-slack-interactions-trigger.md":"b8fe95a36582dc8bc0d96b842a621e50fbacf6141914d00c13abfc9912748916","references/node-slack-trigger.md":"43e6caa5ee349e1ba3c256da3d3279b7385e182829b78e134f2123a650c3d052","references/node-slack.md":"2d24da368e43494487fa740b111f33d7ab9b763ec88ab45be852a8a8b64c3ff7","references/node-supabase.md":"c67e87065053adbb5c44425ad62d1e531c0fd9d98de0a7dc91b45e582a24c270","references/node-twilio.md":"a191b4c071a738c1283d545512e6b73f52aabb1c7fae4d9acb08c5346f5a6ad3","references/node-wait-timer.md":"72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d","references/node-webhook-trigger.md":"b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a","references/nodes-index.md":"e8feb33feff53ddf84628f6db9a45db26f9dd5cd6c14082912606af4f1c299eb","references/runtime-values.md":"93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038","references/surface-authoring.md":"21ae1e1b64e15c8d89ff1d95efec84829ffa2f2aa2f0d5ba400c78742463586d","references/surface-display.md":"9a24b5fc81f48ad517d36f202c99291258866b7e607f8481763a985bd26d1a26","references/surface-feedback.md":"425f70b7bbda1923624bd9639fb0d7f071828ad7b59feb54867ef6fe5b5054cb","references/surface-input-actions.md":"54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da","references/surface-layout.md":"3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559","references/validation.md":"224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68","references/workflows.md":"5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648","SKILL.md":"d885d3601c21bd69156cdce3116268464edbbf88bc7cec0b6e98989d3a33e41b"}},n={"agents/openai.yaml":`interface:
2
+ import'./chunk-7UWDMECF.js';var e={schemaVersion:1,name:"culvii",bundleHash:"bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",generatorVersion:1,sources:{"@culvii/kit":"0.1.24",nodes:"1.0.0","surface-contract":"1.0.0","@culvii/cli":"0.1.0"},files:{"agents/openai.yaml":"80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b","examples/agent-workflow.culvii.ts":"c82471aa06e2fb2f939f50b70ae797b6fed22f2d51277975a93c16d0b94ecd76","examples/binary-document-workflow.culvii.ts":"3bc13dd2cf04b426449d5509749343a9c040b5e51bcb7e5982339b1173a459c6","examples/complete-workflow.culvii.ts":"2c59f6b9d525092e75b980aa174ccd8b0187621c8c196270453e03591000a08d","examples/custom-output-surface.culvii.ts":"8ccfb826d8b140dae94f8e57458eba7d98bf1cdf3dda372c23b757f9f47cb72b","examples/custom-wait-surface.culvii.ts":"4efef08381de6b51c4530fa312450682a09c3008c77f74c4b55c44b685bf4348","examples/human-in-the-loop-workflow.culvii.ts":"9daee28598cdae498786aea1b55640c1065097825d19262eb072c1b584328cfc","examples/integration-agent-workflow.culvii.ts":"3c9b3a3c174ebdfc4f128b2076d44685355d4ce952e54a5a4ec7061e1f231daf","examples/multi-agent-workflow-tools.culvii.ts":"ac96689205433dc647078acb323e970ac1c2ef06be118f087d428200b852a560","examples/nested-agent-workflow.culvii.ts":"e1255b0e22e83c26ea09876c9e90496c4c5ab4c24a52cf30d2cc2a7e9b1212a7","examples/output-surface.culvii.ts":"1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702","examples/wait-surface.culvii.ts":"ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2","references/agents.md":"bdd14922138c42c9b2ac6466d0eca5960365750451079e8ab28b65f2e0602ae5","references/authoring-files.md":"ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53","references/cli-guide.md":"f127193a2e669861ec9884fdf1f3618af6baf37324029943a05cc13a49d696bc","references/cli-reference.md":"1c97ed69b833a62b8e9000f20684c99315ff1eabaca265ba9fe54817c3b67020","references/feedback-cycle.md":"54ad5b36049e377344220e10a7ddaea1e010f532d9fe7ab39b6abd3d435a6a2a","references/integrations.md":"9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68","references/kit-api.md":"c082d1b63bec52fdd7124e711f4e86bfae015f1cd7045b25e4910349c4fca1fd","references/node-argocd.md":"5abd8bfc02ced232d85d366108f2395bfe8d82e0dd0414527ccf932d85da6191","references/node-clickup-doc.md":"bf62328992963604fe0e015063b9af34d67ca49181c744b77b591a635c1b8c35","references/node-clickup-ticket.md":"b616e8c02a771eb5283fe33972e100aa6be410f88dd01adfbbfc58fe794b6d23","references/node-core-agent.md":"09b0b3a5607dbdd06f3f463d140f9633a27b580e59b22f135f1bb349b7fcc0bf","references/node-core-browser-automation.md":"797f7dbd3374c2ea38de830ab2e9b08a2762e45a3cf56dad1ff274cf8109e7e7","references/node-core-code.md":"2768aa7a0fec5f12d716ece9727b038ee2a205647e7c41bd85f0139165bbbd51","references/node-core-http.md":"4799365201368c31d270644161a6e415d5ecfa25d9c75cf5e550330aff7679b4","references/node-core-if.md":"3298f6dbe803eae9e3a69eb7084b08f43a6c76e139e56051539c7603a705b7e1","references/node-core-jwt.md":"8828d11751ee88474f962a296cf29b279fa055ea2b95d9ee0362d211596bdedb","references/node-core-loop-break.md":"d383011f16ae620860e2535be49cafc862a57c7ecae7d7fbd57ac767a5afbd3c","references/node-core-loop-continue.md":"308af6ffa74572a211f784ffc77b565702105cc73718ae5e8874f1f13254a0ff","references/node-core-loop-output.md":"dd70d65ad423387cf1190f9e103d4ba734763e32b82674299b733cdb299dbac6","references/node-core-loop.md":"35d9e5f15ef49d9e5eb1ed824f438a1c61382ca00ff2a838e371fd60919f3b26","references/node-core-merge.md":"f1c2753761791f872a3e786552ba776742c81b5b56985c23660d90bed6c9422a","references/node-core-set.md":"511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468","references/node-core-switch.md":"512edc581e410f44f7f15ac31ed27fbd1698c0c4cfb9a7fd93feb42bbb29d1ae","references/node-cost-explorer.md":"65bafd0f0e3c9910f3af2f210d492fc0d1648b570c61ff258642c4b441e688f2","references/node-cron-trigger.md":"ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b","references/node-elasticsearch.md":"276ca5fa4368a0c7a12a4383dd01404bdc3c345f6c837ec5fc1c9d609b3138b2","references/node-github-poll-trigger.md":"132d7a0d7b56cfa29be552418725eeddefb0a11716b7b7192f53de6d57667ee8","references/node-github-webhook-trigger.md":"09de1c2b493476d908611f71a88850fc76786d6aed48b74e573c6b647110c6a3","references/node-github.md":"b7ed8f59ecdbcf3ea0166268a27905f1ada3c3fcc5e3e121dc32dea5427a3d06","references/node-gmail-trigger.md":"59ca6745079299e3bdf77f87fa328bd7900227bbe131ed7a977f781d2ee606e1","references/node-gmail.md":"f9d8f18d005acc6423c49e8741d909fe8541c4d849ae8ae590c04b561576bd82","references/node-google-calendar.md":"3bf8ed7c280036fd0009c299fcacbf920bb3b18429f2734ac603e18e16796f73","references/node-google-docs.md":"b8d6d68914b4228f11adf575753bcaa86cbf71fd3c7dfa36fb07d84627250ad1","references/node-grafana-dashboard.md":"9bdfafcdfd461a0082b0645a4089826204021fb273589732071ee56ff97ab83e","references/node-grafana-data-source.md":"050f9dda595a35346b5396563de0e8c18acb05a9139655c61d2a706cc39b5544","references/node-grafana-query.md":"35c95c6528c01766cfe0c88a9f1adcf786a95061ce81e963025ec131da1d1873","references/node-hibp-list-domains.md":"b977ed4babb1c419bfe13d76166528fffeddbaeb81147ece07b3c19d34d0f797","references/node-hibp-stealer-logs.md":"13758678d5eebd520823bc0e56d12cbef8b72835b54b0fc00e9402b744d44550","references/node-kubernetes.md":"293fd70959588d4f10fd8869388cf37809f477e2f987752da5ab0cdfb2c7cdc2","references/node-manual-trigger.md":"4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086","references/node-microsoft-outlook-trigger.md":"aa4385d1734de97e79ce59d2c6ca802683e6c07f625b521d606f8bf5f8540ac5","references/node-microsoft-outlook.md":"51d55b369461dc0b88dd9b1fcf905f6f9b37fd9270053fc9e2022c2d3c33bed2","references/node-microsoft-sharepoint.md":"10f27d6507989598ead041a5e1965dd3014dd610848d2b12e4ee81864e4373ed","references/node-onionsearch.md":"3711791d3c5516ae6ee88bf29b1d18a79da3446cb310446d1e4fb77e22934fe6","references/node-prometheus.md":"337c4583bbe7f18b54bd7bcf452b8b7f0eb8dbab5d4c65945e6bdec2bbddc35b","references/node-s3.md":"8ecc9a791cda334707431dfcfed34abe9eedbedbb9c06f1ad03907f8af59b2a8","references/node-slack-events-trigger.md":"9884a5f369f654b5bf78cd352aaee9df27ec6e5fa548edde8485ea7f47d31eb2","references/node-slack-interactions-trigger.md":"b8fe95a36582dc8bc0d96b842a621e50fbacf6141914d00c13abfc9912748916","references/node-slack-trigger.md":"43e6caa5ee349e1ba3c256da3d3279b7385e182829b78e134f2123a650c3d052","references/node-slack.md":"2d24da368e43494487fa740b111f33d7ab9b763ec88ab45be852a8a8b64c3ff7","references/node-supabase.md":"c67e87065053adbb5c44425ad62d1e531c0fd9d98de0a7dc91b45e582a24c270","references/node-twilio.md":"a191b4c071a738c1283d545512e6b73f52aabb1c7fae4d9acb08c5346f5a6ad3","references/node-wait-timer.md":"72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d","references/node-webhook-trigger.md":"b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a","references/nodes-index.md":"e8feb33feff53ddf84628f6db9a45db26f9dd5cd6c14082912606af4f1c299eb","references/runtime-values.md":"93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038","references/surface-authoring.md":"21ae1e1b64e15c8d89ff1d95efec84829ffa2f2aa2f0d5ba400c78742463586d","references/surface-display.md":"9a24b5fc81f48ad517d36f202c99291258866b7e607f8481763a985bd26d1a26","references/surface-feedback.md":"425f70b7bbda1923624bd9639fb0d7f071828ad7b59feb54867ef6fe5b5054cb","references/surface-input-actions.md":"54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da","references/surface-layout.md":"3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559","references/validation.md":"224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68","references/workflows.md":"5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648","SKILL.md":"d885d3601c21bd69156cdce3116268464edbbf88bc7cec0b6e98989d3a33e41b"}},n={"agents/openai.yaml":`interface:
3
3
  display_name: "Culvii"
4
4
  short_description: "Build Culvii agents, workflows, and surfaces"
5
5
  default_prompt: "Use $culvii to build and validate a Culvii agent or workflow."
@@ -2466,10 +2466,10 @@ Do not bypass platform validation, add unsupported surface markup/CSS/JavaScript
2466
2466
  "bundleHash": "bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",
2467
2467
  "generatorVersion": 1,
2468
2468
  "sources": {
2469
- "@culvii/kit": "0.0.8",
2469
+ "@culvii/kit": "0.1.24",
2470
2470
  "nodes": "1.0.0",
2471
2471
  "surface-contract": "1.0.0",
2472
- "@culvii/cli": "0.0.9"
2472
+ "@culvii/cli": "0.1.0"
2473
2473
  },
2474
2474
  "files": {
2475
2475
  "agents/openai.yaml": "80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@culvii/cli",
3
- "version": "0.0.9",
3
+ "version": "0.1.0",
4
4
  "description": "Culvii CLI",
5
5
  "private": false,
6
6
  "type": "module",
@@ -50,7 +50,7 @@
50
50
  "tsup": "8.5.1",
51
51
  "typescript": "6.0.3",
52
52
  "vitest": "^4.1.5",
53
- "@culvii/kit": "0.0.8",
53
+ "@culvii/kit": "0.1.24",
54
54
  "surface-contract": "1.0.0"
55
55
  },
56
56
  "engines": {
@@ -4,10 +4,10 @@
4
4
  "bundleHash": "bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",
5
5
  "generatorVersion": 1,
6
6
  "sources": {
7
- "@culvii/kit": "0.0.8",
7
+ "@culvii/kit": "0.1.24",
8
8
  "nodes": "1.0.0",
9
9
  "surface-contract": "1.0.0",
10
- "@culvii/cli": "0.0.9"
10
+ "@culvii/cli": "0.1.0"
11
11
  },
12
12
  "files": {
13
13
  "agents/openai.yaml": "80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b",