@langgenius/nodwork-linux-x64 0.0.1-beta.3 → 0.0.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/.env.example +2 -2
- package/payload/dist/cli.js +1 -1
- package/payload/package.json +1 -1
package/package.json
CHANGED
package/payload/.env.example
CHANGED
|
@@ -2,5 +2,5 @@ API_BASE_URL=http://localhost:3001
|
|
|
2
2
|
WS_BASE_URL=ws://localhost:3001/ws
|
|
3
3
|
|
|
4
4
|
# Optional build-time defaults for packaged releases. CI can inject either name.
|
|
5
|
-
# NODWORK_BUNDLED_SERVICE_BASE_URL=https://nod.work
|
|
6
|
-
# VITE_SERVICE_BASE_URL=https://nod.work
|
|
5
|
+
# NODWORK_BUNDLED_SERVICE_BASE_URL=https://api.nod.work
|
|
6
|
+
# VITE_SERVICE_BASE_URL=https://api.nod.work
|
package/payload/dist/cli.js
CHANGED
|
@@ -218,7 +218,7 @@ ${t}`),r}if(e instanceof Error)return t&&(e.message=`${e.message}
|
|
|
218
218
|
[agent stderr]
|
|
219
219
|
${t}`),e;let n=Error(String(e));return t&&(n.message=`${n.message}
|
|
220
220
|
[agent stderr]
|
|
221
|
-
${t}`),n}var YI=`acp.acp_provider_agent_dynamic_tool`;S_.object({toolCallId:S_.string().describe(`The unique ID of the tool call.`),toolName:S_.string().describe(`The name of the tool being called.`),args:S_.record(S_.unknown()).describe(`The input arguments for the tool call.`)});var XI=class{onSessionUpdateCallback;onPermissionRequestCallback;setSessionUpdateHandler(e){this.onSessionUpdateCallback=e}setPermissionRequestHandler(e){this.onPermissionRequestCallback=e}sessionUpdate(e){return this.onSessionUpdateCallback&&this.onSessionUpdateCallback(e),Promise.resolve()}async requestPermission(e){return this.onPermissionRequestCallback?await this.onPermissionRequestCallback(e):{outcome:{outcome:`selected`,optionId:e.options[0]?.optionId||`allow`}}}writeTextFile(e){throw Error(`File operations not implemented in language model client`)}readTextFile(e){throw Error(`File operations not implemented in language model client`)}},ZI=class{specificationVersion=`v3`;provider=`acp`;modelId;modeId;supportedUrls={};config;agentProcess=null;connection=null;sessionId=null;sessionResponse=null;client=null;currentModelId=null;currentModeId=null;isFreshSession=!0;stderrChunks=[];textBlockIndex=0;thinkBlockIndex=0;currentTextId=null;currentThinkingId=null;toolCallsMap=new Map;toolProxyHost=null;clientToolAbort=null;debug=new qI;availableAuthMethodIds=[];constructor(e,t,n){this.modelId=e,this.modeId=t,this.config=n,this.debug.ensureAgentMessageLogFile()}resetStreamState(){this.textBlockIndex=0,this.thinkBlockIndex=0,this.currentTextId=null,this.currentThinkingId=null,this.toolCallsMap.clear(),this.clientToolAbort=null}hasToolInput(e){return e==null?!1:typeof e==`object`?Object.keys(e).length>0:typeof e==`string`?e.length>0:!0}normalizeToolInput(e){return e??{}}parseToolCall(e){if(e.sessionUpdate!==`tool_call`)throw Error(`Invalid update type for parseToolCall`);return{toolCallId:e.toolCallId,toolName:e.title||e.toolCallId,toolInput:e.rawInput??{}}}parseToolResult(e){if(e.sessionUpdate!==`tool_call_update`)throw Error(`Invalid update type for parseToolResult`);return{toolCallId:e.toolCallId,toolName:e.title||e.toolCallId,toolResult:e.rawOutput??e.content??null,isError:e.status===`failed`,status:e.status}}isClientToolResult(e){if(!Array.isArray(e)||e.length===0)return{isClientTool:!1};let t=e[0];if(!t?.type)return{isClientTool:!1};let n=t.type===`text`&&typeof t.text==`string`?t.text:t.type===`content`&&t.content?.type===`text`?t.content.text:void 0;if(!n)return{isClientTool:!1};try{let e=JSON.parse(n);if(e.isClientTool===!0)return{isClientTool:!0,toolName:e.toolName,args:e.args}}catch{}return{isClientTool:!1}}async connectClient(){if(this.debug.ensureAgentMessageLogFile(),this.connection)return;if(!this.agentProcess){let e=this.config.session?.cwd||(typeof T.cwd==`function`?T.cwd():`/`);if(this.agentProcess=ce(this.config.command,this.config.args??[],{stdio:[`pipe`,`pipe`,`pipe`],env:{...T.env,...this.config.env},cwd:e,...T.platform===`win32`?{windowsHide:!0}:{}}),!this.agentProcess.stdout||!this.agentProcess.stdin)throw Error(`Failed to spawn agent process with stdio`);this.stderrChunks=[],this.agentProcess.stderr?.on(`data`,e=>{let t=new TextDecoder().decode(e);this.stderrChunks.push(t),T.stderr.write(e)});let t=ge.toWeb(this.agentProcess.stdin),n=me.toWeb(this.agentProcess.stdout);this.client=new XI,this.connection=new Xm(()=>this.client,Ym(t,n))}if(!this.connection)throw Error(`Connection not initialized`);let e={...this.config.initialize,protocolVersion:this.config.initialize?.protocolVersion??1,clientCapabilities:this.config.initialize?.clientCapabilities??{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1}};try{let t=(await this.connection.initialize(e)).authMethods??[];if(this.availableAuthMethodIds=t.map(e=>e.id),t.length>0){let e=this.config.authMethodId;if(e)this.availableAuthMethodIds.includes(e)?console.log(`[acp-ai-provider] Lazy auth enabled with authMethodId="${e}". Authentication will run only when required (code ${WI}).`):console.log(`[acp-ai-provider] Warning: authMethodId "${e}" is not in initialize.authMethods. Lazy auth auto-retry will be skipped unless you call authenticate() with a valid method.`,JSON.stringify(t,null,2));else{let e=this.availableAuthMethodIds[0];console.log(`[acp-ai-provider] Warning: authMethodId is not configured. Lazy auth will default to the first auth method "${e}".`,JSON.stringify(t,null,2))}}}catch(e){throw JI(e,this.stderrChunks.join(``))}}async startSession(e){if(!this.connection)throw Error(`Not connected`);try{let t=[...this.config.session?.mcpServers??[]],n=!1;if(e&&e.length>0&&!this.toolProxyHost){this.debug.log(`[acp-ai-provider] Setting up tool proxy for client-side tools...`,e.map(e=>e.name)),this.toolProxyHost=new MI(`acp-ai-sdk-tools`);for(let t of e)this.toolProxyHost.registerTool(t.name,t);n=!0}if(this.toolProxyHost){let e=await this.toolProxyHost.start();t.push(e)}if(this.sessionId&&n){this.sessionResponse=await this.connection.newSession({...this.config.session,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.sessionResponse.sessionId,this.isFreshSession=!0,await this.applySessionDelay();return}if(this.sessionId)return;this.config.existingSessionId?(await this.connection.loadSession({sessionId:this.config.existingSessionId,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.config.existingSessionId,this.sessionResponse={sessionId:this.config.existingSessionId},this.isFreshSession=!1):(this.sessionResponse=await this.connection.newSession({...this.config.session,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.sessionResponse.sessionId,this.isFreshSession=!0);let{models:r,modes:i}=this.sessionResponse??{};r?.currentModelId&&(this.currentModelId=r.currentModelId),i?.currentModeId&&(this.currentModeId=i.currentModeId),this.modelId&&this.modelId!==this.currentModelId&&(await this.setModel(this.modelId),this.currentModelId=this.modelId),this.modeId&&this.modeId!==this.currentModeId&&(await this.setMode(this.modeId),this.currentModeId=this.modeId),await this.applySessionDelay()}catch(e){throw JI(e,this.stderrChunks.join(``))}}async applySessionDelay(){this.config.sessionDelayMs&&(this.debug.log(`[acp-ai-provider] Waiting ${this.config.sessionDelayMs}ms after session setup...`),await new Promise(e=>setTimeout(e,this.config.sessionDelayMs)))}resolveLazyAuthMethodId(){let e=this.config.authMethodId;return e?this.availableAuthMethodIds.length===0||this.availableAuthMethodIds.includes(e)?e:null:this.availableAuthMethodIds[0]??null}async withLazyAuthRetry(e,t){try{return await t()}catch(n){if(!KI(n))throw n;let r=this.resolveLazyAuthMethodId();if(!r)throw n;return this.debug.log(`[acp-ai-provider] Authentication required during ${e} (code ${WI}). Running lazy authenticate with methodId="${r}" and retrying once...`),await this.authenticate(r),await t()}}async ensureConnected(e){await this.withLazyAuthRetry(`session setup`,async()=>{await this.connectClient(),await this.startSession(e)})}cleanup(){this.config.persistSession||this.forceCleanup()}getSessionId(){return this.sessionId}async initSession(e){let t=UI(e,!1);return await this.ensureConnected(t.length>0?t:void 0),this.sessionResponse}async authenticate(e){if(await this.connectClient(),!this.connection)throw Error(`Not connected`);try{await this.connection.authenticate({methodId:e})}catch(e){throw JI(e,this.stderrChunks.join(``))}}async promptWithLazyAuthRetry(e){if(!this.connection)throw Error(`Not connected`);return await this.withLazyAuthRetry(`prompt`,()=>this.connection.prompt(e))}async setMode(e){if(!this.connection||!this.sessionId)throw Error(`Not connected. Call preconnect() first.`);let t=this.sessionResponse?.modes?.availableModes;if(t&&!t.find(t=>t.id===e)){let n=t.map(e=>e.id).join(`, `),r=this.sessionResponse?.modes?.currentModeId?` (Current: "${this.sessionResponse.modes.currentModeId}")`:``;throw Error(`Mode "${e}" is not available${r}. Available modes: ${n}`)}await this.connection.setSessionMode({sessionId:this.sessionId,modeId:e}),this.currentModeId=e}async setModel(e){if(!this.connection||!this.sessionId)throw Error(`Not connected. Call preconnect() first.`);let{models:t}=this.sessionResponse??{};if(t?.availableModels&&!t.availableModels.some(t=>t.modelId===e)){let n=t.availableModels.map(e=>e.modelId).join(`, `),r=this.currentModelId?` (Current: "${this.currentModelId}")`:``;throw Error(`Model "${e}" is not available${r}. Available models: ${n}`)}await this.connection.unstable_setSessionModel({sessionId:this.sessionId,modelId:e}),this.currentModelId=e}forceCleanup(){this.toolProxyHost&&=(this.toolProxyHost.stop(),null),this.agentProcess&&=(this.agentProcess.kill(),this.agentProcess.stdin?.end(),this.agentProcess.stdout?.destroy(),this.agentProcess.stderr?.destroy(),null),this.connection=null,this.sessionId=null,this.sessionResponse=null,this.client=null,this.stderrChunks=[],this.availableAuthMethodIds=[]}emitRawContent(e,t){if(`entries`in t){e.enqueue({type:`raw`,rawValue:JSON.stringify({type:`plan`,entries:t.entries})});return}for(let n of t.content)(n.type===`diff`||n.type===`terminal`)&&e.enqueue({type:`raw`,rawValue:JSON.stringify({...n,toolCallId:t.toolCallId})})}flushPendingToolCalls(e){for(let[t,n]of this.toolCallsMap.entries())n.inputAvailable||(n.inputAvailable=!0,e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:n.name,args:{}})}))}handleStreamNotification(e,t){this.debug.appendAgentMessage(t);let n=t.update;switch(n.sessionUpdate){case`plan`:this.flushPendingToolCalls(e),this.emitRawContent(e,{type:`plan`,entries:n.entries});break;case`agent_thought_chunk`:this.flushPendingToolCalls(e),this.currentThinkingId||(this.currentThinkingId=`reasoning - ${this.thinkBlockIndex++} `,e.enqueue({type:`reasoning-start`,id:this.currentThinkingId})),e.enqueue({type:`reasoning-delta`,id:this.currentThinkingId,delta:n.content.type===`text`?n.content.text:``});break;case`agent_message_chunk`:if(this.flushPendingToolCalls(e),this.currentThinkingId&&=(e.enqueue({type:`reasoning-end`,id:this.currentThinkingId}),null),n.content.type===`text`){let t=n.content.text;this.currentTextId||(this.currentTextId=`text - ${this.textBlockIndex++} `,e.enqueue({type:`text-start`,id:this.currentTextId})),e.enqueue({type:`text-delta`,id:this.currentTextId,delta:t})}break;case`tool_call`:{this.currentTextId&&=(e.enqueue({type:`text-end`,id:this.currentTextId}),null),this.currentThinkingId&&=(e.enqueue({type:`reasoning-end`,id:this.currentThinkingId}),null);let{toolCallId:t,toolName:r,toolInput:i}=this.parseToolCall(n),a=this.toolCallsMap.get(t),o=this.hasToolInput(i);a?!a.inputAvailable&&o&&(a.inputAvailable=!0,n.title&&a.name!==n.title&&n.title!==t&&(a.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:a.name,args:i})})):(this.toolCallsMap.set(t,{index:this.toolCallsMap.size,name:r,inputStarted:!0,inputAvailable:!!o}),e.enqueue({type:`tool-input-start`,id:t,toolName:r}),o&&e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:r,args:i})}));break}case`tool_call_update`:{let{toolCallId:t,toolName:r,toolResult:i,isError:a}=this.parseToolResult(n),o=n.status??`in_progress`,s=this.toolCallsMap.get(t),c=this.normalizeToolInput(`rawInput`in n?n.rawInput:void 0);if(o===`in_progress`){s||(s={index:this.toolCallsMap.size,name:r,inputStarted:!0,inputAvailable:!1},this.toolCallsMap.set(t,s),e.enqueue({type:`tool-input-start`,id:t,toolName:r}));let i=this.hasToolInput(c);(!s.inputAvailable||i)&&(s.inputAvailable=!0,n.title&&s.name!==n.title&&n.title!==t&&(s.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:s.name,args:c})}));let a=n.content??[];a.length>0&&this.emitRawContent(e,{content:a,toolCallId:t});break}if(![`completed`,`failed`].includes(o))break;if(!s)s={index:this.toolCallsMap.size,name:r,inputAvailable:!0},this.toolCallsMap.set(t,s),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:r,args:c})});else{let r=this.hasToolInput(c);(!s.inputAvailable||r)&&(s.inputAvailable=!0,n.title&&s.name!==n.title&&n.title!==t&&(s.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:s.name,args:c})}))}let l=this.isClientToolResult(i);if(l.isClientTool){this.debug.log(`[acp-ai-provider] Detected client tool: ${l.toolName}, stopping stream`);let r=n.content??[];r.length>0&&this.emitRawContent(e,{content:r,toolCallId:t}),this.clientToolAbort&&(e.enqueue({type:`finish`,finishReason:{unified:`tool-calls`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}}}),e.close(),this.clientToolAbort.resolve(),this.cleanup());break}e.enqueue({type:`tool-result`,toolCallId:t,toolName:YI,result:i,...a&&{isError:!0,result:Error(wI(i))}});let u=n.content??[];u.length>0&&this.emitRawContent(e,{content:u,toolCallId:t});break}}}async doGenerate(e){try{await this.ensureConnected();let t=HI(e,this.isFreshSession);this.isFreshSession=!1;let n=``,r=[],i=new Map,a={enqueue:e=>{switch(e.type){case`text-delta`:n+=e.delta;break;case`tool-call`:{let t=JSON.parse(e.input);r.push({id:e.toolCallId,name:t.toolName,input:t.args});break}case`tool-result`:{let t=r.find(t=>t.id===e.toolCallId);i.set(e.toolCallId,{name:t?.name||e.toolCallId,result:e.result,isError:e.isError});break}default:break}}},o=this.handleStreamNotification.bind(this);this.resetStreamState(),this.client&&this.client.setSessionUpdateHandler(e=>{o(a,e)});let s=await this.promptWithLazyAuthRetry({sessionId:this.sessionId,prompt:t}),c=[];n.trim()&&c.push({type:`text`,text:n});for(let e of r)c.push({type:`tool-call`,toolCallId:e.id,toolName:e.name,args:JSON.stringify(e.input),input:e.input,output:i.get(e.id)?.result});let l={content:c,finishReason:{unified:s.stopReason===`end_turn`?`stop`:`other`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}},warnings:[]};return this.cleanup(),l}catch(e){throw this.cleanup(),e}}async doStream(e){let t=UI(e.tools);try{await this.ensureConnected(t.length>0?t:void 0)}catch(e){throw this.forceCleanup(),e}let n=HI(e,this.isFreshSession);this.isFreshSession=!1;let r=this.sessionId,i=this.client,a=()=>this.cleanup(),o=this.handleStreamNotification.bind(this);return{stream:new ReadableStream({start:async e=>{e.enqueue({type:`stream-start`,warnings:[]}),this.resetStreamState();let t=new Promise(t=>{this.clientToolAbort={controller:e,resolve:t}});try{i&&i.setSessionUpdateHandler(t=>{o(e,t)});let s=this.promptWithLazyAuthRetry({sessionId:r,prompt:n}),c=await Promise.race([s.then(e=>({type:`response`,response:e})),t.then(()=>({type:`client-tool`}))]);if(c.type===`client-tool`)return;let l=c.response;e.enqueue({type:`finish`,finishReason:{unified:l.stopReason===`end_turn`?`stop`:`other`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}}}),e.close(),a()}catch(t){a(),e.enqueue({type:`error`,error:JI(t,this.stderrChunks.join(``))})}},cancel:()=>{a()}}),warnings:void 0}}get tools(){return FI()}},QI=class{config;model=null;constructor(e){this.config=e}languageModel(e,t){return this.model||=new ZI(e,t,this.config),e&&(this.model.modelId=e),t&&(this.model.modeId=t),this.model}call(){return this.languageModel()}get tools(){return this.model?.tools}getSessionId(){return this.model?.getSessionId()??null}initSession(e){return this.model||this.languageModel(),this.model.initSession(e)}connect(){return this.model||this.languageModel(),this.model.connectClient()}authenticate(e){this.model||this.languageModel();let t=e??this.config.authMethodId;if(!t)throw Error(`No auth method configured. Pass methodId or set authMethodId in ACPProviderSettings.`);return this.model.authenticate(t)}setMode(e){if(!this.model)throw Error(`No model initialized. Call languageModel() first.`);return this.model.setMode(e)}setModel(e){if(!this.model)throw Error(`No model initialized. Call languageModel() first.`);return this.model.setModel(e)}cleanup(){this.model?.forceCleanup()}};function $I(e){return new QI(e)}function eL(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=`toolName`in e&&typeof e.toolName==`string`?e.toolName:null,n=`args`in e&&e.args&&typeof e.args==`object`&&!Array.isArray(e.args)?e.args:void 0;return t?{toolName:t,...n?{args:n}:{}}:null}function tL(e){if(typeof e==`string`)return e;if(e!==void 0)try{return JSON.stringify(e)}catch{return}}function nL(e){return typeof e==`string`?e:null}function rL(e){return e instanceof Error?e.message:String(e)}async function iL(e){let t=`completed`,n=``,r,i,a=new Set,o={};try{if(e.intent===Ta.HISTORY)i=await e.listSessions(),n=i.length>0?`Found ${i.length} ACP session${i.length===1?``:`s`} for ${e.cwd}`:`No ACP sessions found for ${e.cwd}`;else if(e.intent===Ta.SWITCH_SESSION)n=e.sessionId?`Switched ACP session to ${e.sessionId}`:`ACP session switched`;else if(e.intent===Ta.CLOSE)n=e.closeText;else{let i=e.instruction?.trim();if(!i)throw Error(`ACP instruction is required for run intent`);if(!e.runtime||!e.abortController)throw Error(`ACP runtime is required for run intent`);let s=xI({model:e.runtime.languageModel(),tools:e.runtime.tools,prompt:i,abortSignal:e.abortController.signal});for await(let i of s.fullStream)switch(o[i.type]=(o[i.type]??0)+1,i.type){case`text-delta`:{let t=nL(i.text);if(!t)continue;n+=t,await e.observer?.onTextDelta?.(t);break}case`reasoning-delta`:{let t=nL(i.text);if(!t)continue;await e.observer?.onReasoningDelta?.(t);break}case`tool-call`:{let t=eL(i.input),n=t?.toolName??nL(i.toolName);if(!n)continue;a.add(n),await e.observer?.onToolCall?.({toolName:n,...t?.args?{args:t.args}:{}});break}case`tool-result`:{let t=eL(i.output)?.toolName??nL(i.toolName);if(!t)continue;a.add(t);let n=tL(`output`in i?i.output:void 0);await e.observer?.onToolResult?.({toolName:t,...`isError`in i&&typeof i.isError==`boolean`?{ok:!i.isError}:{},...n?{text:n}:{}});break}case`error`:r=rL(i.error),t=`failed`,await e.observer?.onError?.(r);break;default:break}}}catch(n){e.abortController?.signal.aborted?t=`stopped`:(t=`failed`,r=rL(n),await e.observer?.onError?.(r),e.onError?.(n))}return{outcome:t,finalText:n,...r?{error:r}:{},...i?{sessions:i}:{},toolNames:[...a],streamPartCounts:o}}function aL(e){return Error(`ACP session listing does not support client method ${e}`)}function oL(){return{sessionUpdate:async()=>{},requestPermission:async()=>({outcome:{outcome:`cancelled`}}),readTextFile:async()=>{throw aL(`readTextFile`)},writeTextFile:async()=>{throw aL(`writeTextFile`)},createTerminal:async()=>{throw aL(`createTerminal`)},extMethod:async()=>({}),extNotification:async()=>{}}}async function sL(e){let t=await Sa(e.provider);if(!t)throw Error(`Local ACP provider '${e.provider}' is not available on this host`);let n=ce(t.command,t.args,{stdio:[`pipe`,`pipe`,`pipe`],env:process.env,cwd:e.cwd,...process.platform===`win32`?{windowsHide:!0}:{}});if(!n.stdin||!n.stdout)throw Error(`Failed to spawn ACP agent process with stdio`);let r=[];n.stderr?.on(`data`,e=>{r.push(new TextDecoder().decode(e))});let i=new Xm(oL,Ym(ge.toWeb(n.stdin),me.toWeb(n.stdout)));try{let t=await i.initialize({protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1}}),n=Ca(e.provider),r=(t.authMethods??[]).map(e=>e.id);return n&&r.includes(n)&&await i.authenticate({methodId:n}),(await i.unstable_listSessions({cwd:e.cwd,cursor:null})).sessions.map(e=>({sessionId:e.sessionId,cwd:e.cwd,...e.title?{title:e.title}:{},...e.updatedAt?{updatedAt:e.updatedAt}:{}}))}catch(e){let t=r.join(``).trim(),n=t?` (${t})`:``;throw Error(`${e instanceof Error?e.message:String(e)}${n}`)}finally{n.killed||n.kill()}}function cL(e){return e===`~`?ne():e.startsWith(`~/`)?h(ne(),e.slice(2)):e}async function lL(e){let t=e.trim();if(!t)throw Error(`ACP cwd is required`);return await x(h(cL(t)))}function uL(e){let t=ie(`sha1`).update(e.cwd).digest(`hex`).slice(0,12);return`${e.taskId}:${e.deviceCode}:${e.provider}:${t}`}var dL=class{sessions=new Map;get(e){return this.sessions.get(e)??null}set(e){this.sessions.set(e.sessionScopeKey,e)}delete(e){this.sessions.delete(e)}values(){return[...this.sessions.values()]}findByTaskAndDevice(e,t){return this.values().filter(n=>n.taskId===e&&n.deviceCode===t)}};function fL(e,t){console.warn(`[local-acp] ${e}`,t)}async function pL(e){let t=e.registry.get(e.sessionScopeKey);if(t&&t.cwd===e.cwd&&t.provider===e.provider&&(!e.sessionId||t.sessionId===e.sessionId))return t.lastActiveAt=Date.now(),fL(`host session reuse`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,sessionScopeKey:t.sessionScopeKey,sessionId:t.sessionId}),t;t&&(fL(`host session replace`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,sessionScopeKey:t.sessionScopeKey,sessionId:t.sessionId}),t.state=`closing`,t.runtime.cleanup(),e.registry.delete(t.sessionScopeKey));for(let t of e.registry.findByTaskAndDevice(e.taskId,e.deviceCode))t.provider!==e.provider&&(t.state=`closing`,t.activeRun?.abortController.abort(),t.activeRun=null,t.runtime.cleanup(),e.registry.delete(t.sessionScopeKey));let n=await Sa(e.provider);if(!n)throw Error(`Local ACP provider '${e.provider}' is not available on this host`);let r=Ca(e.provider);fL(`host session create`,{provider:e.provider,cwd:e.cwd,taskId:e.taskId,deviceCode:e.deviceCode,sessionScopeKey:e.sessionScopeKey,sessionId:e.sessionId,command:n.command,args:n.args,authMethodId:r});let i=$I({command:n.command,args:n.args,...r?{authMethodId:r}:{},session:{cwd:e.cwd,mcpServers:[]},...e.sessionId?{existingSessionId:e.sessionId}:{},persistSession:!0}),a=(await i.initSession()).sessionId||i.getSessionId(),o={sessionScopeKey:e.sessionScopeKey,taskId:e.taskId,deviceCode:e.deviceCode,provider:e.provider,cwd:e.cwd,createdAt:Date.now(),lastActiveAt:Date.now(),state:`idle`,sessionId:a,runtime:i,activeRun:null};return e.registry.set(o),fL(`host session created`,{provider:o.provider,cwd:o.cwd,taskId:o.taskId,deviceCode:o.deviceCode,sessionScopeKey:o.sessionScopeKey,sessionId:o.sessionId}),o}async function mL(e,t){fL(`host session close`,{provider:e.provider,cwd:e.cwd,taskId:e.taskId,deviceCode:e.deviceCode,sessionScopeKey:e.sessionScopeKey,sessionId:e.sessionId,activeRunId:e.activeRun?.runId}),e.state=`closing`,e.activeRun?.abortController.abort(),e.activeRun=null,e.runtime.cleanup(),t.delete(e.sessionScopeKey)}function hL(e){let t=e.finalText?.trim()||e.error?.trim()||`${e.provider} ACP ${e.intent} ${e.outcome}`;return{synopsis:t.length>600?`${t.slice(0,597)}...`:t,keyPoints:[`provider=${e.provider}`,`cwd=${e.cwd}`,`intent=${e.intent}`,`outcome=${e.outcome}`,...e.sessionId?[`sessionId=${e.sessionId}`]:[],...e.sessions?[`sessions=${e.sessions.length}`]:[],...e.toolNames.length>0?[`tools=${e.toolNames.join(`, `)}`]:[],...e.error?[`error=${e.error}`]:[]]}}function gL(e){return{ok:e.ok,runId:e.runId,provider:e.provider,intent:e.intent,outcome:e.outcome,summary:hL({provider:e.provider,cwd:e.cwd,intent:e.intent,outcome:e.outcome,finalText:e.finalText,error:e.error,sessionId:e.sessionId,sessions:e.sessions,toolNames:e.toolNames??[]}),...e.sessionId?{sessionId:e.sessionId}:{},...e.sessions?{sessions:e.sessions}:{},...e.finalText?{finalText:e.finalText}:{},...e.error?{error:e.error}:{}}}function _L(e){return{runId:e.runId,provider:e.record.provider,deviceCode:e.record.deviceCode,cwd:e.record.cwd,intent:e.intent,status:`running`,sessionScopeKey:e.record.sessionScopeKey,...e.record.sessionId?{sessionId:e.record.sessionId}:{},startedAt:Date.now(),activity:{totalEventCount:0,windowStartSeq:0,truncated:!1,items:[]}}}function vL(e,t){let n=e.activity.items;if(n.push(t),e.activity.totalEventCount+=1,n.length>200){n.shift(),e.activity.truncated=!0,e.activity.windowStartSeq=n[0]?.seq??t.seq;return}e.activity.windowStartSeq===0&&(e.activity.windowStartSeq=n[0]?.seq??t.seq)}function yL(e){return{...e,activity:{...e.activity,items:[...e.activity.items]},...e.result?{result:{...e.result,...e.result.sessions?{sessions:[...e.result.sessions]}:{}}}:{}}}async function bL(e){let t=new AbortController,n={runId:e.runId,toolCallId:e.toolCallId,startedAt:Date.now(),abortController:t};e.record.activeRun=n,e.record.state=`running`,e.record.lastActiveAt=Date.now(),e.record.sessionId=e.record.runtime.getSessionId()??e.record.sessionId;try{return await e.run(t)}finally{e.record.activeRun=null,e.record.state=`idle`,e.record.lastActiveAt=Date.now(),e.record.sessionId=e.record.runtime.getSessionId()??e.record.sessionId}}async function xL(e){let{record:t,registry:n,toolCallId:r,instruction:i,intent:a,onProgress:o,onError:s}=e,c=ae(),l=_L({runId:c,record:t,intent:a}),u=0,d=()=>{o?.({taskId:t.taskId,toolCallId:r,projection:yL(l)})};fL(`host turn start`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,toolCallId:r,runId:c,sessionId:t.sessionId}),vL(l,{seq:++u,at:Date.now(),kind:`status`,acpType:`status`,status:`running`,text:`Running ${t.provider} ${a} in ${t.cwd}`}),d();let{outcome:f,finalText:p,error:m,sessions:h,toolNames:g,streamPartCounts:_}=await bL({record:t,runId:c,toolCallId:r,run:async e=>await iL({provider:t.provider,cwd:t.cwd,intent:a,sessionId:t.sessionId,instruction:i,runtime:t.runtime,abortController:e,listSessions:async()=>await sL({provider:t.provider,cwd:t.cwd}),closeText:`Closed ACP session for ${t.cwd}`,observer:{onTextDelta:e=>{vL(l,{seq:++u,at:Date.now(),kind:`assistant_text`,acpType:`text_delta`,text:e}),d()},onReasoningDelta:e=>{vL(l,{seq:++u,at:Date.now(),kind:`reasoning`,acpType:`reasoning_delta`,text:e}),d()},onToolCall:({toolName:e,args:t})=>{vL(l,{seq:++u,at:Date.now(),kind:`tool_call`,acpType:`tool_call`,toolName:e,...t?{argsPreview:JSON.stringify(t)}:{}}),d()},onToolResult:({toolName:e,ok:t,text:n})=>{vL(l,{seq:++u,at:Date.now(),kind:`tool_result`,acpType:`tool_result`,toolName:e,...t===void 0?{}:{ok:t},...n?{text:n}:{}}),d()},onError:e=>{vL(l,{seq:++u,at:Date.now(),kind:`error`,acpType:`error`,message:e}),d()}},onError:s})});return a===Ta.CLOSE&&await mL(t,n),fL(`host turn done`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,toolCallId:r,runId:c,sessionId:t.sessionId,outcome:f,ok:f===`completed`,toolNames:g,streamPartCounts:_,finalTextLength:p.length,hasError:!!m}),l.status=f,l.finishedAt=Date.now(),l.sessionId=t.sessionId??l.sessionId,l.result={...l.result??{},summary:hL({provider:t.provider,cwd:t.cwd,intent:a,outcome:f,finalText:p,error:m,sessionId:t.sessionId,sessions:h,toolNames:g}).synopsis,...p?{finalText:p}:{},...m?{error:m}:{},...h?{sessions:h}:{},...t.sessionId?{sessionId:t.sessionId}:{}},vL(l,{seq:++u,at:Date.now(),kind:`status`,acpType:`status`,status:f,text:f===`completed`?`ACP run completed`:f===`stopped`?`ACP run stopped`:m??`ACP run failed`}),d(),gL({ok:f===`completed`,runId:c,provider:t.provider,cwd:t.cwd,intent:a,outcome:f,sessionId:t.sessionId,sessions:h,toolNames:g,finalText:p,error:m})}function SL(e){let t=new dL;return{listAvailableProviders:async()=>await xa(),listSessions:async e=>{let t=await lL(e.cwd);return await sL({provider:e.provider,cwd:t})},executeLocalAcp:async n=>{let r=await lL(n.cwd);fL(`host execute start`,{provider:n.provider,cwd:r,taskId:n.taskId,toolCallId:n.toolCallId,deviceCode:n.deviceCode,intent:n.intent,sessionId:n.sessionId});let i=uL({taskId:n.taskId,deviceCode:n.deviceCode,provider:n.provider,cwd:r}),a=t.get(i);if(a&&a.state!==`idle`)return fL(`host execute busy`,{provider:a.provider,cwd:a.cwd,taskId:a.taskId,toolCallId:a.activeRun?.toolCallId,state:a.state,sessionScopeKey:i,sessionId:a.sessionId}),{ok:!1,runId:a.activeRun?.runId??ae(),provider:a.provider,intent:n.intent,outcome:`failed`,summary:hL({provider:a.provider,cwd:a.cwd,intent:n.intent,outcome:`failed`,error:`ACP session busy on host (${a.provider}, state=${a.state})`,toolNames:[]}),error:`ACP session busy on host (${a.provider}, state=${a.state})`};if(n.intent===Ta.HISTORY){let e=ae(),t=await iL({provider:n.provider,cwd:r,intent:n.intent,listSessions:async()=>await sL({provider:n.provider,cwd:r}),closeText:`No active ACP session bound for ${r}`});return gL({ok:t.outcome===`completed`,runId:e,provider:n.provider,cwd:r,intent:n.intent,outcome:t.outcome,sessions:t.sessions,finalText:t.finalText,error:t.error})}if(n.intent===Ta.CLOSE){let e=ae();a&&await mL(a,t);let i=await iL({provider:n.provider,cwd:r,intent:n.intent,listSessions:async()=>[],closeText:a?`Closed ACP session for ${r}`:`No active ACP session bound for ${r}`});return gL({ok:i.outcome===`completed`,runId:e,provider:n.provider,cwd:r,intent:n.intent,outcome:i.outcome,finalText:i.finalText,error:i.error})}let o=await pL({sessionScopeKey:i,taskId:n.taskId,deviceCode:n.deviceCode,provider:n.provider,cwd:r,sessionId:n.sessionId,registry:t});if(n.intent===Ta.SWITCH_SESSION){let e=await iL({provider:n.provider,cwd:r,intent:n.intent,sessionId:o.sessionId,listSessions:async()=>[],closeText:`Closed ACP session for ${r}`}),t=ae();return gL({ok:e.outcome===`completed`,runId:t,provider:n.provider,cwd:r,intent:n.intent,outcome:e.outcome,sessionId:o.sessionId,finalText:e.finalText,error:e.error})}let s=n.instruction?.trim();if(!s)return gL({ok:!1,runId:ae(),provider:n.provider,cwd:r,intent:n.intent,outcome:`failed`,sessionId:o.sessionId,error:`ACP instruction is required for run intent`});let c=await xL({record:o,registry:t,toolCallId:n.toolCallId,instruction:s,intent:n.intent,onProgress:n.onProgress,onError:e?.onError});return fL(`host execute done`,{provider:n.provider,cwd:r,taskId:n.taskId,toolCallId:n.toolCallId,intent:n.intent,outcome:c.outcome,ok:c.ok,runId:c.runId,sessionId:o.sessionId}),c},closeTaskSessions:async e=>{for(let n of t.values())n.taskId===e.taskId&&(e.deviceCode&&n.deviceCode!==e.deviceCode||await mL(n,t))},closeAll:async()=>{for(let e of t.values())await mL(e,t)}}}const CL={android:`android`,darwin:`macos`,ios:`ios`,linux:`linux`,macos:`macos`,web:`web`,win32:`windows`,windows:`windows`},wL=e=>{let t=typeof e==`string`?e.trim().toLowerCase():``;return!t||!(t in CL)?null:CL[t]},TL=[`/etc/os-release`,`/usr/lib/os-release`],EL=/\r?\n/,DL=[`$os = Get-CimInstance Win32_OperatingSystem`,`$cs = Get-CimInstance Win32_ComputerSystem`,`$csp = Get-CimInstance Win32_ComputerSystemProduct`,`[pscustomobject]@{`,` osVersion = $os.Version`,` osBuild = $os.BuildNumber`,` manufacturer = $cs.Manufacturer`,` modelName = $cs.Model`,` modelIdentifier = $csp.Version`,`} | ConvertTo-Json -Compress`].join(`; `),OL=e=>typeof e==`string`&&e.trim()?e.trim():null,kL=e=>wL(e)??`linux`,AL=e=>{let t=OL(e);if(!t)return null;let n=t.toLowerCase();return n.includes(`arm64`)||n.includes(`aarch64`)?`arm64`:n===`arm`||n.startsWith(`armv`)?`arm`:n.includes(`x86_64`)||n.includes(`amd64`)||n===`x64`?`x64`:n===`ia32`||n===`x86`||n===`i386`||n===`i686`?`ia32`:t},jL=async(e,t)=>{try{return OL(await new Promise((n,r)=>{oe(e,t,{encoding:`utf8`,env:process.env,timeout:3e3},(e,t)=>{if(e){r(e);return}n(t)})}))}catch{return null}},ML=async e=>{for(let{command:t,args:n}of e){let e=await jL(t,n);if(e)return e}return null},NL=async e=>{try{return OL(await b(e,`utf8`))}catch{return null}},PL=e=>{try{return OL(JSON.parse(e).SPHardwareDataType?.[0]?.machine_name)}catch{return null}},FL=e=>{try{let t=JSON.parse(e);return{osVersion:OL(t.osVersion),osBuild:OL(t.osBuild),manufacturer:OL(t.manufacturer),modelName:OL(t.modelName),modelIdentifier:OL(t.modelIdentifier)}}catch{return null}},IL=e=>{let t=new Map;for(let n of e.split(EL)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim().toUpperCase(),a=e.slice(r+1).trim(),o=a.startsWith(`"`)&&a.endsWith(`"`)?a.slice(1,-1):a;t.set(i,o)}return{versionId:OL(t.get(`VERSION_ID`)),buildId:OL(t.get(`BUILD_ID`))}},LL=async()=>{for(let e of TL){let t=await NL(e);if(t)return IL(t)}return null},RL=async()=>{let e=await jL(`system_profiler`,[`SPHardwareDataType`,`-json`]);return e?PL(e):null},zL=async()=>await jL(`sysctl`,[`-n`,`hw.model`]),BL=async()=>{let e=await ML([{command:`powershell.exe`,args:[`-NoLogo`,`-NoProfile`,`-NonInteractive`,`-Command`,DL]},{command:`powershell`,args:[`-NoLogo`,`-NoProfile`,`-NonInteractive`,`-Command`,DL]}]);return e?FL(e):null},VL=e=>({osPlatform:e,osVersion:null,osBuild:null,cpuArchitecture:AL(process.arch),manufacturer:null,modelName:null,modelIdentifier:null}),HL={linux:async()=>{let[e,t,n,r,i]=await Promise.all([LL(),jL(`uname`,[`-r`]),NL(`/sys/devices/virtual/dmi/id/sys_vendor`),NL(`/sys/devices/virtual/dmi/id/product_name`),NL(`/sys/devices/virtual/dmi/id/product_version`)]);return{...VL(`linux`),osVersion:e?.versionId??null,osBuild:e?.buildId??t,manufacturer:n,modelName:r,modelIdentifier:i}},macos:async()=>{let[e,t,n,r]=await Promise.all([jL(`sw_vers`,[`-productVersion`]),jL(`sw_vers`,[`-buildVersion`]),RL(),zL()]);return{...VL(`macos`),osVersion:e,osBuild:t,manufacturer:`Apple`,modelName:n,modelIdentifier:r}},windows:async()=>{let e=await BL();return{...VL(`windows`),osVersion:e?.osVersion??null,osBuild:e?.osBuild??null,manufacturer:e?.manufacturer??null,modelName:e?.modelName??null,modelIdentifier:e?.modelIdentifier??null}}},UL=async()=>{let e=kL(process.platform),t=HL[e];return t?await t():VL(e)},WL=()=>`Echo CLI (${re()})`,GL=UL;let KL=null;const qL=async()=>(KL??=GL(),await KL),JL=async e=>{let t=e.useAuthStore.getState();if(t.authStatus!==`authenticated`){if(t.authStatus===`error`)throw Error(t.authError??`Authentication failed`);await new Promise((t,n)=>{let r=e.useAuthStore.subscribe(e=>{if(e.authStatus===`authenticated`){r(),t();return}e.authStatus===`error`&&(r(),n(Error(e.authError??`Authentication failed`)))})})}},YL=e=>(fi(e.endpoints),$r({apiBaseUrl:e.endpoints.apiBaseUrl,wsBaseUrl:e.endpoints.wsBaseUrl,persistence:ci,providers:{github:ur,slack:dr,googleWorkspace:fr},hooks:{getDeviceCode:async()=>e.deviceCode,getDeviceInfo:async()=>await qL(),getDeviceName:async()=>WL(),getDeviceType:async()=>`cli_host`,getUserAgent:async()=>`echo-cli`,openExternalUrl:e.onExternalUrl,supportBrowser:async()=>!1,supportTmux:async()=>!1,supportAcp:async()=>(await ba()).some(e=>e.available)},...e.callbacks?{callbacks:e.callbacks}:{}})),XL=e=>e.useAuthStore.getState().authError,ZL=async e=>{let t=await It(e.endpoints.apiBaseUrl,{token:e.token,deviceCode:e.deviceCode,deviceName:WL()});await gi({email:t.email,token:t.token,expiresAt:t.expiresAt,...t.updatedAt?{updatedAt:t.updatedAt}:{},userId:t.userId,name:t.name,avatarUrl:t.avatarUrl??null},e.endpoints);let n=YL({deviceCode:e.deviceCode,endpoints:e.endpoints,onExternalUrl:async()=>{throw Error(`Token login should not request an external URL`)}});try{await n.start(),await JL(n)}finally{n.stop()}},QL=e=>typeof e==`string`?e.trim():e,$L=/^[A-Z_]+/,eR=/\/+$/,tR=(e,t)=>{if(typeof e==`string`){let t=e.trim();if(t.length>0&&t!==`undefined`&&t!==`null`)return t}for(let e of t){if(typeof e!=`string`)continue;let t=e.trim();if(t.length>0&&t!==`undefined`&&t!==`null`)return t}},nR=If(QL,Sd({message:`API_BASE_URL must be a valid http:// or https:// URL`,protocol:/^https?$/})),rR=If(QL,Sd({message:`WS_BASE_URL must be a valid ws:// or wss:// URL`,protocol:/^wss?$/})),iR=e=>typeof e==`string`&&e.trim()===`http://localhost:3001`,aR=e=>typeof e==`string`&&e.trim()===`ws://localhost:3001/ws`,oR=()=>tr([process.env.LC_ALL??``,process.env.LC_MESSAGES??``,process.env.LANG??``].filter(Boolean)),sR=(e,t,n)=>{let r=e.safeParse(t);if(r.success)return r.data;let i=r.error.issues[0]?.message??`Invalid value for ${n}`;throw Error(i.replace($L,n))},cR=(e,t,n)=>{let r=typeof t==`string`?t.trim():``;if(r)return sR(e,r,n)},lR=()=>{let e=tR(`https://nod.work`,[`https://nod.work`]),t=tR(``,[``]);return{API_BASE_URL:cR(nR,process.env.API_BASE_URL,`API_BASE_URL`),WS_BASE_URL:cR(rR,process.env.WS_BASE_URL,`WS_BASE_URL`),bundledApiBaseUrl:cR(nR,e,`bundled API base URL`),bundledWsBaseUrl:cR(rR,t,`bundled WS base URL`)}},uR=e=>{let t=e.trim();if(!t||t===`/`)return`/`;let n=t.startsWith(`/`)?t:`/${t}`;return n.length>1&&n.endsWith(`/`)?n.replace(eR,``):n},dR=e=>{let t=e.toString();return t.endsWith(`/`)&&e.pathname===`/`?t.slice(0,-1):t},fR=e=>{let t=e.trim(),n=new URL(t);if(![`ws:`,`wss:`].includes(n.protocol))throw Error(`WebSocket URL must use ws:// or wss://`);n.protocol=n.protocol===`wss:`?`https:`:`http:`,n.search=``,n.hash=``;let r=uR(n.pathname);return r===`/ws`?(n.pathname=`/`,dR(n)):(n.pathname=r.endsWith(`/ws`)?r.slice(0,-3)||`/`:r,dR(n))},pR=e=>{let t=e.trim(),n=new URL(t);if(![`http:`,`https:`].includes(n.protocol))throw Error(`API URL must use http:// or https://`);return n.protocol=n.protocol===`https:`?`wss:`:`ws:`,n.pathname=n.pathname===`/`?`/ws`:`${uR(n.pathname)}/ws`,n.search=``,n.hash=``,dR(n)},mR=(e={})=>{let t=lR(),n=t.bundledApiBaseUrl!=null&&iR(e.storedApiBaseUrl)&&aR(e.storedWsBaseUrl),r=n?void 0:e.storedApiBaseUrl,i=n?void 0:e.storedWsBaseUrl,a=cR(nR,e.apiBaseUrl,`--api-base-url`)??t.API_BASE_URL??cR(nR,r,`stored api base URL`)??t.bundledApiBaseUrl,o=cR(rR,e.wsBaseUrl,`--ws-base-url`)??t.WS_BASE_URL??cR(rR,i,`stored ws base URL`)??t.bundledWsBaseUrl,s=a??(o?fR(o):void 0),c=o??(a?pR(a):void 0);if(!s||!c)throw Error(`Missing backend endpoint configuration. Provide API_BASE_URL, WS_BASE_URL, or --ws-base-url.`);return{apiBaseUrl:s,wsBaseUrl:c}},hR=e=>e.map(e=>`${e}\n`).join(``),gR=()=>{let e=Promise.resolve(),t=null;return{appendLines:n=>{if(n.length===0)return;let r=hR(n);e=e.then(async()=>{await y(ri(),{recursive:!0}),await v(ai(new Date),r,`utf8`)}).catch(e=>{t=e})},flush:async()=>{if(await e,!t)return;let n=t;throw t=null,n instanceof Error?n:Error(String(n))}}},_R={STAT_LOCAL_FILE:`stat_local_file`,REQUEST_SERVER_FILE:`request_server_file`,UPLOAD_FILE:`upload_file`,CHECK_UPLOAD_FILENAME:`check_upload_filename`,REQUEST_LOCAL_FILE:`request_local_file`,PUT_FILE_TO_LOCAL:`put_file_to_local`,LIST_LOCAL_FILES:`list_local_files`},vR={PIPELINE_LIST:`pipeline.list`,PIPELINE_GRAPH_GET:`pipeline.graph.get`,PIPELINE_CREATE:`pipeline.create`,PIPELINE_NAME_GENERATE:`pipeline.name.generate`,PIPELINE_PUBLISH:`pipeline.publish`,PIPELINE_ASSIGN:`pipeline.assign`,PIPELINE_PARTICIPANTS_LIST:`pipeline.participants.list`,PIPELINE_DEVICES_LIST:`pipeline.devices.list`,PIPELINE_DEVICES_SET:`pipeline.devices.set`,PIPELINE_FILES_LIST:`pipeline.files.list`,PIPELINE_FILES_UPLOAD:`pipeline.files.upload`,PIPELINE_FILES_DOWNLOAD:`pipeline.files.download`,PIPELINE_FILES_PREVIEW:`pipeline.files.preview`},yR={REVIEW_SUBSCRIBE:`review.subscribe`,REVIEW_LIST_PENDING:`review.list_pending`,REVIEW_GET:`review.get`,REVIEW_CALL_DEVICE_PROXIER:`review.callDeviceProxier`},bR={TASK_LIST:`task.list`,TASK_OPTIONS_SET:`task.options.set`,TASK_STATUS_SET:`task.status.set`,TASK_UNREADS_CLEAR:`task.unreads.clear`,TASK_ROOT_CREATE:`task.root.create`,TASK_SEND:`task.send`,TASK_INTERACTION_START:`task.interaction.start`,TASK_STOP:`task.stop`,TASK_TOOLS:`task.tools`,TASK_SUBSCRIBE:`task.subscribe`,TASK_MESSAGES:`task.messages`,TASK_TOOL_RESULT_GET:`task.tool_result.get`,TASK_AGENT_INSTRUCTION_GET:`task.agent_instruction.get`,TASK_AGENT_INSTRUCTION_SAVE:`task.agent_instruction.save`};var xR=class{command(e,t){let[n,...r]=e;if(!n)throw Error(`Command is required`);return new SR(n,r,t||{})}},SR=class{proc=null;startTime=0;started=!1;timeoutHandle=null;constructor(e,t,n){this.command=e,this.args=t,this.options=n}async start(){if(this.started)throw Error(`Command already started`);this.started=!0,this.startTime=Date.now();let e={cwd:this.options.cwd,env:this.options.env?{...process.env,...this.options.env}:process.env,shell:this.options.shell!==!1};this.proc=ce(this.command,this.args,e),this.options.timeoutMs&&(this.timeoutHandle=setTimeout(()=>{this.proc&&!this.proc.killed&&(this.proc.kill(`SIGTERM`),setTimeout(()=>{this.proc&&!this.proc.killed&&this.proc.kill(`SIGKILL`)},5e3))},this.options.timeoutMs))}async wait(){if(!this.started||!this.proc)throw Error(`Command not started`);return new Promise((e,t)=>{this.proc.on(`exit`,(t,n)=>{this.timeoutHandle&&=(clearTimeout(this.timeoutHandle),null);let r=Date.now()-this.startTime;e({code:t??1,signal:n||void 0,durationMs:r})}),this.proc.on(`error`,e=>{this.timeoutHandle&&=(clearTimeout(this.timeoutHandle),null),t(e)})})}stdinPipe(){if(!this.started||!this.proc||!this.proc.stdin)throw Error(`Command not started or stdin not available`);return this.proc.stdin}stdoutPipe(){if(!this.started||!this.proc||!this.proc.stdout)throw Error(`Command not started or stdout not available`);return this.proc.stdout}stderrPipe(){if(!this.started||!this.proc||!this.proc.stderr)throw Error(`Command not started or stderr not available`);return this.proc.stderr}signal(e){if(!this.proc)throw Error(`Command not started`);this.proc.kill(e)}kill(){if(!this.proc)throw Error(`Command not started`);this.proc.kill(`SIGTERM`),setTimeout(()=>{this.proc&&!this.proc.killed&&this.proc.kill(`SIGKILL`)},5e3)}};let CR=function(e){return e.TOOL_CALL=`tool_call`,e.CONFIRM=`confirm`,e}({}),wR=function(e){return e.SUBMIT=`submit`,e.REJECT=`reject`,e}({});const TR=async e=>(await e.connection.sendRpc(yR.REVIEW_LIST_PENDING,{})).reviews,ER=async(e,t)=>await e.connection.sendRpc(yR.REVIEW_SUBSCRIBE,t),DR=async(e,t)=>(await e.connection.sendRpc(yR.REVIEW_GET,{reviewId:t})).review,OR=async(e,t,n,r)=>{let i=t.metadata.taskReview;await e.connection.sendRpc(bR.TASK_SEND,{taskId:i.taskId,toTaskId:i.taskId,to:`bot`,inputs:{blocks:[],resume:{messageId:i.taskMessageId,blockIndex:i.taskMessageBlockIndex,source:CR.TOOL_CALL,reviewId:t.id,resume:{kind:n,data:r}}}})},kR=async(e,t)=>{await e.connection.sendRpc(bR.TASK_INTERACTION_START,{reviewId:t})},AR=async(e,t,n)=>{await e.connection.sendRpc(yR.REVIEW_CALL_DEVICE_PROXIER,{reviewId:t,decision:n})},jR={ok:!1,rejected:!0,error:`Local execution rejected by user`},MR=e=>({ok:!1,rejected:!0,provider:e.provider,intent:e.intent,outcome:`failed`,error:`Local ACP execution rejected by user`,summary:{synopsis:`Local ACP execution rejected by user`,keyPoints:[`provider=${e.provider}`,`intent=${e.intent}`,`outcome=failed`,`rejected=true`]}}),NR=async(e,t,n)=>{let r=e.reviewsById.get(n);if(r)return r;let i=await DR(t,n);return e.reviewsById.set(i.id,i),i},PR=async(e,t,n,r,i)=>{let a=n.metadata.taskReview;if(a.executionKind===wa.LOCAL_COMMAND){if(r.localCommand?.approved!==!0){await OR(t,n,wR.REJECT,jR);return}let o=a.snapshot?.localCommand;if(!o)throw Error(`INVALID_LOCAL_COMMAND_REVIEW_SNAPSHOT`);let s=t.executors?.localCommand;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}await kR(t,n.id);let c=await s({reviewId:n.id,command:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}if(a.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD){if(r.requestLocalFileUpload?.approved!==!0){await OR(t,n,wR.REJECT,jR);return}let o=a.snapshot?.localFileUpload;if(!o)throw Error(`INVALID_LOCAL_FILE_UPLOAD_REVIEW_SNAPSHOT`);let s=t.executors?.localFileUpload;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}let c=await s({reviewId:n.id,upload:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}if(a.executionKind===wa.BROWSER_COMMAND){if(r.browserCommand?.approved===!0){await OR(t,n,wR.SUBMIT,{approved:!0});return}await OR(t,n,wR.REJECT,{ok:!1,rejected:!0,approved:!1});return}if(a.executionKind===wa.ACP_SUBAGENT){if(r.acpSubagent?.approved!==!0){let e=a.snapshot?.acpSubagent;await OR(t,n,wR.REJECT,MR({provider:e?.provider??`unknown`,intent:e?.intent??`run`}));return}let o=a.snapshot?.acpSubagent;if(!o)throw Error(`INVALID_ACP_SUBAGENT_REVIEW_SNAPSHOT`);let s=t.executors?.acpSubagent;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}let c=await s({reviewId:n.id,taskId:a.taskId,toolCallId:a.toolCallId,deviceCode:a.deviceCode,request:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}throw Error(`Unsupported review kind: ${a.executionKind}`)},FR=async(e,t,n,r,i)=>{let a=await NR(e,t,n),o=a.metadata.taskReview,s=i?.mode??`manual`;if(o.executionKind===wa.BROWSER_COMMAND){await PR(e,t,a,r,s);return}let c=await t.getCurrentDeviceCode();if(o.deviceCode!==c){if(s===`auto`)return;if(i?.allowProxy===!1)throw Error(`Review is not owned by this device`);await AR(t,n,r);return}await PR(e,t,a,r,s)},IR=async(e,t,n,r,i)=>{try{return await FR(e,t,n,r,{mode:`manual`}),!0}catch(e){return t.notifyError?.(i,e),!1}},LR={ACK:`ack`,DEVICE_PRESENCE_UPDATE:`device.presence.update`,TASK_UPDATE:`task.update`,TASK_INBOX_UPDATE:`task.inbox.update`,REVIEW_PENDING_UPDATE:`review.pending.update`,PIPELINE_UPDATE:`pipeline.update`,RELAY_SESSION_CONNECT_REQUEST:`relay.session.connect_request`,RELAY_SESSION_READY:`relay.session.ready`,RELAY_SESSION_FAILED:`relay.session.failed`,WORKSPACE_MEMBERS_UPDATE:`workspace.members.update`},RR=async(e,t,n=e.pendingReviews)=>{let r=await t.getCurrentDeviceCode();if(r)for(let i of n){let n=i.metadata.taskReview;if(!(i.status!==`pending`||n.reviewRequired!==!1||n.deviceCode!==r||n.executionKind===wa.BROWSER_COMMAND)&&!e.inFlightReviewIds.has(i.id)){e.inFlightReviewIds.add(i.id);try{if(n.executionKind===wa.LOCAL_COMMAND&&!t.executors?.localCommand||n.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD&&!t.executors?.localFileUpload||n.executionKind===wa.ACP_SUBAGENT&&!t.executors?.acpSubagent)continue;let r=n.executionKind===wa.LOCAL_COMMAND?{kind:wa.LOCAL_COMMAND,localCommand:{approved:!0}}:n.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD?{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!0}}:{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!0}};await FR(e,t,i.id,r,{mode:`auto`})}catch(e){t.notifyError?.(`Failed to auto-process pending review`,e)}finally{e.inFlightReviewIds.delete(i.id)}}}},zR=async(e,t,n)=>{try{return await FR(e,t,n.reviewId,n.decision,{allowProxy:!1,mode:`manual`}),{ok:!0}}catch(e){throw new ut(e instanceof Error?e.message:String(e),{code:`INTERNAL_ERROR`,domain:`rpc`})}},BR=(e,t)=>t.connection.registerRpcHandler(yR.REVIEW_CALL_DEVICE_PROXIER,async n=>await zR(e,t,n)),VR=()=>({pendingReviews:[],reviews:[]}),HR=e=>{let t={...VR(),...e};return qt(e=>({...t,patchSnapshot:t=>e(t),replaceSnapshot:t=>e(t),reset:()=>e(VR())}))},UR=()=>new Date(Date.now()+9e5).toISOString(),WR=e=>{let t={pendingReviews:[...e.pendingReviews],reviews:[...e.reviewsById.values()]};e.useReviewStore?.getState().replaceSnapshot(t);for(let n of e.listeners)n(t)},GR=async(e,t)=>{let n=await TR(t);e.pendingReviews=n;for(let t of n)e.reviewsById.set(t.id,t);WR(e)},KR=e=>e.connection.getConnectionStatus()===`connected`&&(e.auth?.isAuthenticated()??!0),qR=(e,t)=>{e.reviewPendingSubscription&&=(t.connection.removeChannelListener(LR.REVIEW_PENDING_UPDATE,e.reviewPendingSubscription),null),e.reviewSubscriptionRefreshTimer&&=(clearInterval(e.reviewSubscriptionRefreshTimer),null),e.active=!1,e.pendingReviews=[],e.reviewsById.clear(),e.useReviewStore?.getState().replaceSnapshot(VR())},JR=(e,t)=>{t.acceptRemoteDecisions===!1||e.proxiedDecisionHandlerSubscription||(e.proxiedDecisionHandlerSubscription=BR(e,t))},YR=(e,t)=>{e.proxiedDecisionHandlerSubscription&&=(t.connection.removeRpcHandler(e.proxiedDecisionHandlerSubscription),null)},XR=async(e,t)=>{await GR(e,t),await RR(e,t)},ZR=async(e,t)=>{await ER(t,{expireAt:UR()})},QR=async(e,t)=>{e.active||=(await ZR(e,t),e.reviewSubscriptionRefreshTimer=setInterval(()=>{ZR(e,t).catch(e=>{t.notifyError?.(`Failed to refresh review subscription`,e)})},6e5),e.reviewPendingSubscription=t.connection.setupChannelListener(LR.REVIEW_PENDING_UPDATE,()=>{XR(e,t).catch(e=>{t.notifyError?.(`Failed to refresh pending reviews`,e)})}),!0),await XR(e,t)},$R=async(e,t)=>{if(e.started){if(!KR(t)){qR(e,t);return}await QR(e,t)}},ez=async(e,t)=>{if(e.reconcilePromise){e.needsReconcile=!0,await e.reconcilePromise;return}e.reconcilePromise=(async()=>{do e.needsReconcile=!1,await $R(e,t);while(e.started&&e.needsReconcile)})().finally(()=>{e.reconcilePromise=null}),await e.reconcilePromise},tz=async(e,t)=>{if(e.started){await ez(e,t);return}e.started=!0,JR(e,t),e.connectionStatusSubscription=t.connection.setupConnectionStatusListener(()=>{ez(e,t).catch(e=>{t.notifyError?.(`Failed to reconcile review runtime lifecycle`,e)})}),e.authSubscriptionRemove=t.auth?.subscribe(()=>{ez(e,t).catch(e=>{t.notifyError?.(`Failed to reconcile review runtime lifecycle`,e)})})??null,await ez(e,t)},nz=(e,t)=>{e.started=!1,YR(e,t),e.connectionStatusSubscription&&=(t.connection.removeConnectionStatusListener(e.connectionStatusSubscription),null),e.authSubscriptionRemove?.(),e.authSubscriptionRemove=null,qR(e,t)},rz=()=>({reviewsById:new Map,pendingReviews:[],listeners:new Set,inFlightReviewIds:new Set,started:!1,active:!1,reviewPendingSubscription:null,reviewSubscriptionRefreshTimer:null,connectionStatusSubscription:null,proxiedDecisionHandlerSubscription:null,authSubscriptionRemove:null,reconcilePromise:null,needsReconcile:!1,useReviewStore:null});function iz(e){let t=rz(),n=HR();return t.useReviewStore=n,{useReviewStore:n,start:async()=>{await tz(t,e)},stop:()=>{nz(t,e)},onReviewUpdate:e=>{t.listeners.add(e);let r={pendingReviews:[...t.pendingReviews],reviews:[...t.reviewsById.values()]};return n.getState().replaceSnapshot(r),e(r),()=>{t.listeners.delete(e)}},getPendingReviews:()=>[...t.pendingReviews],getReviews:()=>[...t.reviewsById.values()],getReview:e=>t.reviewsById.get(e)??null,processReviews:n=>RR(t,e,n),actions:{reviewCommandExecution:{approve:n=>IR(t,e,n,{kind:wa.LOCAL_COMMAND,localCommand:{approved:!0}},`Failed to approve local execution`),reject:n=>IR(t,e,n,{kind:wa.LOCAL_COMMAND,localCommand:{approved:!1}},`Failed to reject local execution`)},reviewRequestFileUpload:{approve:n=>IR(t,e,n,{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!0}},`Failed to approve local file upload`),reject:n=>IR(t,e,n,{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!1}},`Failed to reject local file upload`)},reviewBrowserCommandExecution:{approve:n=>IR(t,e,n,{kind:wa.BROWSER_COMMAND,browserCommand:{approved:!0}},`Failed to approve browser execution`),reject:n=>IR(t,e,n,{kind:wa.BROWSER_COMMAND,browserCommand:{approved:!1}},`Failed to reject browser execution`)},reviewAcpExecution:{approve:n=>IR(t,e,n,{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!0}},`Failed to approve ACP execution`),reject:n=>IR(t,e,n,{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!1}},`Failed to reject ACP execution`)}},handleProxiedDecision:async(n,r)=>{await FR(t,e,n,r,{allowProxy:!1,mode:`manual`})}}}const az=e=>{let t=e?.metadata?.command;return typeof t?.cwd==`string`&&t.cwd.trim()?t.cwd.trim():void 0},oz=async(e,t,n,r)=>await e.sendRpc(_R.UPLOAD_FILE,{taskId:t,filename:n,sizeBytes:r}),sz=async(e,t)=>await e.sendRpc(_R.UPLOAD_FILE,{...t,status:`completed`}),cz=async e=>{let t=ie(`sha256`);return await new Promise((n,r)=>{let i=l(e);i.on(`data`,e=>t.update(e)),i.on(`error`,r),i.on(`end`,()=>n())}),t.digest(`hex`)},lz=async e=>{let t=await te(e.path);if(!t.isFile())throw Error(`Local file does not exist or is not a regular file: ${e.path}`);let n=e.filename.trim()||f(e.path),r=e.sizeBytes??t.size,i=await cz(e.path),a=await oz(e.provider,e.taskId,n,r),o=await fetch(a.uploadUrl,{method:`PUT`,...a.headers?{headers:a.headers}:{},body:l(e.path),duplex:`half`});if(!o.ok)throw Error(`Failed to upload local file: HTTP ${o.status}`);return await sz(e.provider,{taskId:e.taskId,fileId:a.fileId,filename:n,sizeBytes:r,sha256:i}),{fileId:a.fileId}},uz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_LIST,{pipelineId:t}),dz=async e=>{if(!e.pipelineId||e.provider.getConnectionStatus()!==`connected`)return e.fallbackCwd;try{return az((await uz(e.provider,e.pipelineId)).items.find(t=>t.deviceCode===e.deviceCode))??e.fallbackCwd}catch{return e.fallbackCwd}},fz=e=>{let t=new xR,n=null,r=iz({connection:e.networkRuntime.provider,auth:{isAuthenticated:()=>e.networkRuntime.useAuthStore.getState().authStatus===`authenticated`,subscribe:t=>e.networkRuntime.useAuthStore.subscribe((e,n)=>{e.authStatus!==n.authStatus&&t()})},getCurrentDeviceCode:async()=>e.deviceCode,executors:{localCommand:async({reviewId:r,command:i})=>{let a=n?.getReview(r),o=await dz({provider:e.networkRuntime.provider,pipelineId:a?.metadata.taskReview.pipelineId??e.getPublishedPipelineId(),deviceCode:e.deviceCode,fallbackCwd:e.fallbackCwd}),s=t.command(i.cmd,{cwd:o,...i.env?{env:i.env}:{},shell:!1}),c=[],l=[];await s.start(),s.stdoutPipe().on(`data`,e=>{c.push(E.isBuffer(e)?e:E.from(e))}),s.stderrPipe().on(`data`,e=>{l.push(E.isBuffer(e)?e:E.from(e))});try{let e=await s.wait(),t=E.concat(c).toString(`utf8`),n=E.concat(l).toString(`utf8`);return{ok:e.code===0,stdout:t,stderr:n,exitCode:e.code,signal:e.signal??null,durationMs:e.durationMs,...e.code===0?{}:{error:n.trim()||`Command exited with code ${e.code}`}}}catch(e){return{ok:!1,stdout:E.concat(c).toString(`utf8`),stderr:E.concat(l).toString(`utf8`),exitCode:null,signal:null,error:e instanceof Error?e.message:String(e)}}},localFileUpload:async({reviewId:t,upload:r})=>{let i=n?.getReview(t);if(!i)throw TypeError(`REVIEW_NOT_FOUND`);return await lz({provider:e.networkRuntime.provider,taskId:i.metadata.taskReview.taskId,path:r.sourcePath,filename:r.filename,...r.sizeBytes===void 0?{}:{sizeBytes:r.sizeBytes}})},acpSubagent:async({taskId:t,toolCallId:n,request:r})=>await e.acpHostRuntime.executeLocalAcp({taskId:t,toolCallId:n,deviceCode:e.deviceCode,provider:r.provider,cwd:r.cwd,intent:r.intent,...r.instruction?{instruction:r.instruction}:{},...r.sessionId?{sessionId:r.sessionId}:{}})},notifyError:e.notifyError});return n=r,r},pz=e=>{let t=e.find(e=>e.type===`creature_root`);if(!t)throw Error(`No creature_root pipeline found for the current account`);return t},mz=e=>e.map(e=>({deviceCode:e.deviceCode,metadata:e.metadata})),hz=e=>({deviceCode:e.deviceCode,metadata:{command:{cwd:e.cwd,reviewRequired:!1},localFileUpload:{reviewRequired:!1},...e.acpProviders.length>0||e.acpStatuses.length>0?{acp:{providers:e.acpProviders,...e.acpStatuses.length>0?{statuses:e.acpStatuses}:{},reviewRequired:!1}}:{}}}),gz=e=>{let t=hz(e);return e.current.find(t=>t.deviceCode===e.deviceCode)?e.current.map(n=>n.deviceCode===e.deviceCode?{...n,metadata:{...n.metadata,command:t.metadata.command,localFileUpload:t.metadata.localFileUpload,...t.metadata.acp?{acp:t.metadata.acp}:{}}}:n):[...e.current,t]},_z=e=>e.current.filter(t=>t.deviceCode!==e.deviceCode),vz=async e=>await e.sendRpc(vR.PIPELINE_LIST,{}),yz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_LIST,{pipelineId:t}),bz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_SET,t),xz=async e=>{if(!await hi())throw Error("No valid auth session found. Run `nodwork login --non-interactive` first.");let t=SL({onError:t=>{e.logSink.writeLine(`[local-acp] ${t instanceof Error?t.message:String(t)}`)}}),n=null,r=!1,i=null,a=new Promise(e=>{i=e}),o=async()=>{},s=YL({deviceCode:e.deviceCode,endpoints:e.endpoints,onExternalUrl:async()=>{throw Error(`CLI runtime does not support interactive external login`)},callbacks:{onSessionAuthenticated:async({response:t})=>{e.logSink.writeLine(`[run] auth.login:ok userId=${t.userId} expiresAt=${t.expiresAt}`);let r=await ba(),i=r.filter(e=>e.available).map(e=>e.provider);e.logSink.writeLine(`[run] pipeline.list:start deviceCode=${e.deviceCode}`);let a=await vz(s.provider);e.logSink.writeLine(`[run] pipeline.list:ok count=${String(a.items.length)} deviceCode=${e.deviceCode}`);let o=pz(a.items);e.logSink.writeLine(`[run] pipeline.listDevices:start pipeline=${o.pipelineId} deviceCode=${e.deviceCode}`);let c=await yz(s.provider,o.pipelineId);e.logSink.writeLine(`[run] pipeline.listDevices:ok pipeline=${o.pipelineId} items=${String(c.items.length)} deviceCode=${e.deviceCode}`),e.logSink.writeLine(`[run] pipeline.setDevices:start pipeline=${o.pipelineId} deviceCode=${e.deviceCode} cwd=${e.cwd}`),await bz(s.provider,{pipelineId:o.pipelineId,devices:gz({current:mz(c.items),deviceCode:e.deviceCode,cwd:e.cwd,acpProviders:i,acpStatuses:r})}),n=o.pipelineId,e.logSink.writeLine(`[run] pipeline.setDevices:ok pipeline=${o.pipelineId} deviceCode=${e.deviceCode}`),e.logSink.writeLine(`published local environment: pipeline=${o.pipelineId} deviceCode=${e.deviceCode} cwd=${e.cwd}`)},onSessionCleared:async t=>{t!==`logout`&&(e.logSink.writeLine(`authentication expired; CLI runtime stopped`),await o())}}}),c=fz({acpHostRuntime:t,deviceCode:e.deviceCode,fallbackCwd:e.cwd,getPublishedPipelineId:()=>n,networkRuntime:s,notifyError:(t,n)=>{e.logSink.writeLine(`${t}: ${n instanceof Error?n.message:String(n)}`)}}),l=s.provider.setupConnectionStatusListener(t=>{if(!r){if(t===`connected`){e.logSink.writeLine(`[run] socket connected: deviceCode=${e.deviceCode}`);return}e.logSink.writeLine(`socket ${t}`)}});return o=async()=>{if(!r){if(r=!0,s.provider.getConnectionStatus()===`connected`&&n){let t=await yz(s.provider,n).catch(()=>null);t&&await bz(s.provider,{pipelineId:n,devices:_z({current:mz(t.items),deviceCode:e.deviceCode})}).catch(()=>{})}s.provider.removeConnectionStatusListener(l),c.stop(),s.stop(),await t.closeAll().catch(()=>{}),i?.()}},{start:async()=>{e.logSink.writeLine(`Starting CLI runtime: deviceCode=${e.deviceCode} cwd=${e.cwd}`),await s.start(),await c.start()},stop:o,waitUntilStopped:async()=>await a}},Sz=[`github`,`slack`,`googleWorkspace`],Cz={github:`GitHub`,slack:`Slack`,googleWorkspace:`Google Workspace`},wz=e=>Cz[e],Tz=(e,t)=>{let n=Math.floor(e/2),r=e%2;switch(t){case`left`:return n*2+Math.max(r-1,0);case`right`:return Math.min(n*2+Math.min(r+1,1),Sz.length-1);case`up`:return Math.max(e-2,0);case`down`:return Math.min(e+2,Sz.length-1)}},Ez=/\r?\n/g,Dz=e=>e instanceof Error?e.message:String(e),Oz=e=>e.replace(Ez,` `),kz=(e,t,n)=>Math.min(Math.max(e,t),n),Az=e=>Math.max(1,e),jz=e=>Math.max(0,e.linesLength-Az(e.visibleLogRowCount)),Mz=e=>kz(e.nextTop,0,jz({linesLength:e.linesLength,visibleLogRowCount:e.visibleLogRowCount})),Nz=e=>{let t=e.logLines.length,n=e.logCount;if(t===0)return{isFollowingTail:e.isFollowingLogTail,lines:[],showingFrom:0,showingTo:0,totalLogCount:n,totalRetained:t};let r=Az(e.visibleLogRowCount),i=e.isFollowingLogTail?Math.max(0,t-r):Mz({linesLength:t,nextTop:e.logViewportTop,visibleLogRowCount:r}),a=e.logLines.slice(i,i+r);return{isFollowingTail:e.isFollowingLogTail,lines:a,showingFrom:i,showingTo:i+a.length,totalLogCount:n,totalRetained:t}},Pz=e=>e?.email??null,Fz=e=>{let t=e.maxLogLines??300,n=gR(),r=null,i=new Promise(e=>{r=e});return Bt((a,o)=>{let s=e=>{o().exitCode===null&&(a({exitCode:e}),r?.(e),r=null)},c=e=>{o().isDisposed||a({errorMessage:null,fatalMessage:e,screen:`fatal`,statusMessage:null})},l=()=>{let e=o().loginRuntime;e&&(e.stop(),o().loginRuntime===e&&a({loginRuntime:null}))},u=async()=>{let e=o().cliRunRuntime;e&&(await e.stop().catch(()=>{}),o().cliRunRuntime===e&&a({cliRunRuntime:null}))},d=async()=>{let t=await di(),n=mR({...e.wsBaseUrl?{wsBaseUrl:e.wsBaseUrl}:{},...t?.apiBaseUrl?{storedApiBaseUrl:t.apiBaseUrl}:{},...t?.wsBaseUrl?{storedWsBaseUrl:t.wsBaseUrl}:{}});return await fi(n),o().isDisposed||a({resolvedEndpoints:n}),n},f=async()=>{let t=await di(),n=mR({...e.wsBaseUrl?{wsBaseUrl:e.wsBaseUrl}:{},...t?.apiBaseUrl?{storedApiBaseUrl:t.apiBaseUrl}:{},...t?.wsBaseUrl?{storedWsBaseUrl:t.wsBaseUrl}:{}});await fi(n);let r=await hi(n);return o().isDisposed||a({authenticatedEmail:Pz(r),resolvedEndpoints:n}),{endpoints:n,session:r}},p=async()=>{let e=o().deviceCode;if(e)return e;let t=await wi();return o().isDisposed||a({deviceCode:t}),t},m=async t=>{let n=e.token?.trim();return n?(a({bootMessage:`Signing in with bootstrap token...`,screen:`boot`}),await ZL({deviceCode:t,endpoints:await d(),token:n}),o().isDisposed||a({authenticatedEmail:Pz(await hi())}),!0):!1},h=async e=>{let t=o().loginRuntime;if(t)return t;a({bootMessage:`Connecting login runtime...`,screen:`boot`});let n=YL({deviceCode:e,endpoints:await d(),onExternalUrl:async e=>{if(o().isDisposed)return;let t=o().currentProvider;a({errorMessage:null,externalUrl:e,providerLabel:t?wz(t):`External provider`,screen:`external_url`,statusMessage:null})}});if(await n.start(),o().isDisposed)throw n.stop(),Error(`CLI store disposed before login runtime was ready`);return a({currentProvider:null,errorMessage:null,loginRuntime:n,screen:`login_method`,selectedIndex:0,statusMessage:null}),n},g=async(e,t,n)=>{l(),await u();let r=n??await f();if(!r.session)throw Error("No valid auth session found. Run `nodwork login --non-interactive` first.");a({authenticatedEmail:Pz(r.session),bootMessage:`Starting CLI runtime...`,cliRunRuntime:null,currentProvider:null,cwd:t,deviceCode:e,errorMessage:null,externalUrl:null,isFollowingLogTail:!0,logCount:0,logLines:[],logViewportTop:0,providerLabel:null,resolvedEndpoints:r.endpoints,screen:`boot`,statusMessage:null});let i=null;try{if(i=await xz({cwd:t,deviceCode:e,endpoints:r.endpoints,logSink:{writeLine:e=>{o().appendLogLine(e)}}}),o().isDisposed){await i.stop().catch(()=>{});return}if(a({cliRunRuntime:i}),await i.start(),o().isDisposed){await i.stop().catch(()=>{});return}a({fatalMessage:null,screen:`running`}),i.waitUntilStopped().then(()=>{let e=o();e.isDisposed||e.isShuttingDown||e.setExitCode(0)})}catch(e){i&&await i.stop().catch(()=>{}),c(Dz(e))}},_=async e=>{let t=await f();if(!t.session)throw Error(`Login reported success, but no persisted session was found`);if(!o().isDisposed){if(e.kind===`run`){let n=o().deviceCode;if(!n)throw Error(`Missing device code`);await g(n,e.cwd,t);return}l(),a({authenticatedEmail:Pz(t.session),currentProvider:null,errorMessage:null,externalUrl:null,providerLabel:null,screen:`login_method`,statusMessage:null})}},v=async(e,t={kind:`stay`})=>{let n=o().loginRuntime;if(!n){c(`Login runtime is not available`);return}a({currentProvider:e,errorMessage:null,screen:`login_method`,selectedIndex:Sz.indexOf(e),statusMessage:`Preparing ${wz(e)} login...`});try{if(!await n.startLogin(e,{preferredLanguage:oR()}))throw Error(XL(n)??`${wz(e)} login failed`);await _(t)}catch(t){if(o().isDisposed)return;a({currentProvider:null,errorMessage:Dz(t),screen:`login_method`,selectedIndex:Sz.indexOf(e),statusMessage:null})}};return{authenticatedEmail:null,bootMessage:`Booting nodwork...`,cliRunRuntime:null,currentProvider:null,cwd:e.defaultCwd,deviceCode:null,errorMessage:null,exitCode:null,externalUrl:null,fatalMessage:null,isFollowingLogTail:!0,isDisposed:!1,isShuttingDown:!1,logCount:0,logLines:[],logViewportTop:0,loginRuntime:null,providerLabel:null,resolvedEndpoints:null,screen:`boot`,selectedIndex:0,statusMessage:null,visibleLogRowCount:12,appendLogLine:e=>{let r=Oz(e);a(e=>({...(()=>{let i=[...e.logLines,r],a=Math.max(0,i.length-t),o=a>0?i.slice(0,a):[],s=a>0?i.slice(a):i;o.length>0&&n.appendLines(o);let c=e.isFollowingLogTail?Math.max(0,s.length-Az(e.visibleLogRowCount)):Mz({linesLength:s.length,nextTop:e.logViewportTop-a,visibleLogRowCount:e.visibleLogRowCount});return{logCount:e.logCount+1,logLines:s,logViewportTop:c}})()}))},bootstrapHeadlessLogin:async()=>{try{a({bootMessage:`Preparing device identity...`,fatalMessage:null,screen:`boot`});let e=await p();if(o().isDisposed)return;let t=await m(e);if(o().isDisposed||t)return;await h(e)}catch(e){c(Dz(e))}},bootstrapHeadlessRun:async()=>{try{a({bootMessage:`Preparing device identity...`,cwd:e.defaultCwd,fatalMessage:null,screen:`boot`});let t=await p();if(o().isDisposed||(await m(t),o().isDisposed))return;let n=await f();if(!n.session){c("No valid auth session found. Run `nodwork login --non-interactive` first.");return}await g(t,e.defaultCwd,n)}catch(e){c(Dz(e))}},bootstrapInteractive:async()=>{try{a({bootMessage:`Preparing device identity...`,fatalMessage:null,screen:`boot`});let e=await p();if(o().isDisposed||(await m(e),o().isDisposed))return;let t=await f();if(o().isDisposed)return;if(t.session){await g(e,o().cwd,t);return}await h(e)}catch(e){c(Dz(e))}},dispose:async()=>{o().isDisposed||(a({isDisposed:!0}),l(),await u(),await n.flush().catch(()=>{}))},jumpLogsToEnd:()=>{a(e=>({isFollowingLogTail:!0,logViewportTop:jz({linesLength:e.logLines.length,visibleLogRowCount:e.visibleLogRowCount})}))},jumpLogsToStart:()=>{a({isFollowingLogTail:!1,logViewportTop:0})},moveLoginSelection:e=>{o().screen===`login_method`&&a(t=>({errorMessage:null,selectedIndex:Tz(t.selectedIndex,e)}))},pageLogsDown:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop+Az(e.visibleLogRowCount),visibleLogRowCount:e.visibleLogRowCount})}))},pageLogsUp:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop-Az(e.visibleLogRowCount),visibleLogRowCount:e.visibleLogRowCount})}))},scrollLogsDown:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop+1,visibleLogRowCount:e.visibleLogRowCount})}))},scrollLogsUp:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop-1,visibleLogRowCount:e.visibleLogRowCount})}))},setExitCode:e=>{o().isDisposed||s(e)},setVisibleLogRowCount:e=>{a(t=>{let n=Az(e);return{logViewportTop:t.isFollowingLogTail?Math.max(0,t.logLines.length-n):Mz({linesLength:t.logLines.length,nextTop:t.logViewportTop,visibleLogRowCount:n}),visibleLogRowCount:n}})},shutdown:async e=>{o().isDisposed||o().isShuttingDown||(a({isShuttingDown:!0}),l(),await u(),await n.flush().catch(()=>{}),!o().isDisposed&&s(e))},startProviderLogin:v,submitSelectedLoginMethod:async()=>{let{screen:e,selectedIndex:t}=o();e===`login_method`&&await v(Sz[t]??`github`,{cwd:o().cwd,kind:`run`})},waitForExit:async()=>await i}})},Iz=()=>({writeLine:e=>{fe.write(`${e}\n`)}}),Lz=[`github`,`googleWorkspace`,`slack`],Rz=e=>Lz.includes(e),zz=e=>{let t=e?.trim();if(!t||!Rz(t))throw Error(`login requires --method github|googleWorkspace|slack when --token is not provided`);return t},Bz=e=>{let t=e.getState().fatalMessage;if(t)throw Error(t)},Vz=async e=>{let t=Iz(),n=Fz({defaultCwd:process.cwd(),token:e.token,wsBaseUrl:e.wsBaseUrl}),r=n.subscribe((e,n)=>{e.externalUrl&&e.externalUrl!==n.externalUrl&&(t.writeLine(`Open this URL to continue login:`),t.writeLine(e.externalUrl))});try{if(await n.getState().bootstrapHeadlessLogin(),Bz(n),e.token?.trim()){t.writeLine(`CLI session verified and saved`);return}let r=zz(e.method);await n.getState().startProviderLogin(r,{kind:`stay`}),Bz(n),t.writeLine(`CLI session verified and saved`)}finally{r(),await n.getState().dispose()}},Hz=e=>{let t=e.getState().fatalMessage;if(t)throw Error(t)},Uz=async e=>{let t=Iz(),n=Fz({defaultCwd:process.cwd(),token:e.token,wsBaseUrl:e.wsBaseUrl}),r=n.subscribe((e,n)=>{if(e.logCount<=n.logCount)return;let r=e.logLines.at(-1);r&&t.writeLine(r)}),i=async()=>{await n.getState().shutdown(0)},a=()=>{i()},o=()=>{i()};process.once(`SIGINT`,a),process.once(`SIGTERM`,o);try{await n.getState().bootstrapHeadlessRun(),Hz(n),await n.getState().waitForExit()}finally{r(),process.off(`SIGINT`,a),process.off(`SIGTERM`,o),await n.getState().dispose()}};function Wz(e,t,{signal:n,edges:r}={}){let i,a=null,o=r!=null&&r.includes(`leading`),s=r==null||r.includes(`trailing`),c=()=>{a!==null&&(e.apply(i,a),i=void 0,a=null)},l=()=>{s&&c(),p()},u=null,d=()=>{u!=null&&clearTimeout(u),u=setTimeout(()=>{u=null,l()},t)},f=()=>{u!==null&&(clearTimeout(u),u=null)},p=()=>{f(),i=void 0,a=null},m=()=>{c()},h=function(...e){if(n?.aborted)return;i=this,a=e;let t=u==null;d(),o&&t&&c()};return h.schedule=d,h.cancel=p,h.flush=m,n?.addEventListener(`abort`,p,{once:!0}),h}function Gz(e,t=0,n={}){typeof n!=`object`&&(n={});let{leading:r=!1,trailing:i=!0,maxWait:a}=n,o=[,,];r&&(o[0]=`leading`),i&&(o[1]=`trailing`);let s,c=null,l=Wz(function(...t){s=e.apply(this,t),c=null},t,{edges:o}),u=function(...t){return a!=null&&(c===null&&(c=Date.now()),Date.now()-c>=a)?(s=e.apply(this,t),c=Date.now(),l.cancel(),l.schedule(),s):(l.apply(this,t),s)};return u.cancel=l.cancel,u.flush=()=>(l.flush(),s),u}function Kz(e,t=0,n={}){let{leading:r=!0,trailing:i=!0}=n;return Gz(e,t,{leading:r,maxWait:t,trailing:i})}const qz=globalThis.window?.document!==void 0;globalThis.process?.versions?.node,globalThis.process?.versions?.bun,globalThis.Deno?.version?.deno,globalThis.process?.versions?.electron,globalThis.navigator?.userAgent?.includes(`jsdom`),typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope,typeof DedicatedWorkerGlobalScope<`u`&&globalThis instanceof DedicatedWorkerGlobalScope,typeof SharedWorkerGlobalScope<`u`&&globalThis instanceof SharedWorkerGlobalScope,typeof ServiceWorkerGlobalScope<`u`&&globalThis instanceof ServiceWorkerGlobalScope;const Jz=globalThis.navigator?.userAgentData?.platform;Jz===`macOS`||globalThis.navigator?.platform===`MacIntel`||globalThis.navigator?.userAgent?.includes(` Mac `)===!0||globalThis.process?.platform,Jz===`Windows`||globalThis.navigator?.platform===`Win32`||globalThis.process?.platform,Jz===`Linux`||globalThis.navigator?.platform?.startsWith(`Linux`)===!0||globalThis.navigator?.userAgent?.includes(` Linux `)===!0||globalThis.process?.platform,Jz===`iOS`||globalThis.navigator?.platform===`MacIntel`&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),Jz===`Android`||globalThis.navigator?.platform===`Android`||globalThis.navigator?.userAgent?.includes(` Android `)===!0||globalThis.process?.platform,!qz&&T.env.TERM_PROGRAM;const Yz=!qz&&T.platform===`win32`;!qz&&(T.env.TERM?.startsWith(`screen`)||T.env.TERM?.startsWith(`tmux`)||T.env.TMUX),qz||T.cwd;const Xz=(e,t)=>{if(typeof e!=`number`)throw TypeError("The `x` argument is required");return typeof t==`number`?`\x1B[`+(t+1)+`;`+(e+1)+`H`:`\x1B[`+(e+1)+`G`},Zz=(e=1)=>`\x1B[`+e+`A`,Qz=(e=1)=>`\x1B[`+e+`B`,$z=e=>{let t=``;for(let n=0;n<e;n++)t+=eB+(n<e-1?Zz():``);return e&&(t+=`\x1B[G`),t},eB=`\x1B[2K`,tB=`\x1B[2J`;`${tB}`;const nB=(()=>{if(qz||!Yz)return!1;let e=C.release().split(`.`),t=Number(e[0]),n=Number(e[2]??0);return t<10||t===10&&n<10586})()?`${tB}[0f`:`${tB}[3J[H`,rB=e=>e in de&&de[e]!==`0`&&de[e]!==`false`,iB=rB(`CI`)||rB(`CONTINUOUS_INTEGRATION`),aB=e=>{let t=new Set;do for(let n of Reflect.ownKeys(e))t.add([e,n]);while((e=Reflect.getPrototypeOf(e))&&e!==Object.prototype);return t};function oB(e,{include:t,exclude:n}={}){let r=e=>{let r=t=>typeof t==`string`?e===t:t.test(e);return t?t.some(r):n?!n.some(r):!0};for(let[t,n]of aB(e.constructor.prototype)){if(n===`constructor`||!r(n))continue;let i=Reflect.getOwnPropertyDescriptor(t,n);i&&typeof i.value==`function`&&(e[n]=e[n].bind(e))}return e}var sB=e(ea(),1);const cB=[`assert`,`count`,`countReset`,`debug`,`dir`,`dirxml`,`error`,`group`,`groupCollapsed`,`groupEnd`,`info`,`log`,`table`,`time`,`timeEnd`,`timeLog`,`trace`,`warn`];let lB={};const uB=e=>{let t=new pe,n=new pe;t.write=t=>{e(`stdout`,t)},n.write=t=>{e(`stderr`,t)};let r=new console.Console(t,n);for(let e of cB)lB[e]=console[e],console[e]=r[e];return()=>{for(let e of cB)console[e]=lB[e];lB={}}};
|
|
221
|
+
${t}`),n}var YI=`acp.acp_provider_agent_dynamic_tool`;S_.object({toolCallId:S_.string().describe(`The unique ID of the tool call.`),toolName:S_.string().describe(`The name of the tool being called.`),args:S_.record(S_.unknown()).describe(`The input arguments for the tool call.`)});var XI=class{onSessionUpdateCallback;onPermissionRequestCallback;setSessionUpdateHandler(e){this.onSessionUpdateCallback=e}setPermissionRequestHandler(e){this.onPermissionRequestCallback=e}sessionUpdate(e){return this.onSessionUpdateCallback&&this.onSessionUpdateCallback(e),Promise.resolve()}async requestPermission(e){return this.onPermissionRequestCallback?await this.onPermissionRequestCallback(e):{outcome:{outcome:`selected`,optionId:e.options[0]?.optionId||`allow`}}}writeTextFile(e){throw Error(`File operations not implemented in language model client`)}readTextFile(e){throw Error(`File operations not implemented in language model client`)}},ZI=class{specificationVersion=`v3`;provider=`acp`;modelId;modeId;supportedUrls={};config;agentProcess=null;connection=null;sessionId=null;sessionResponse=null;client=null;currentModelId=null;currentModeId=null;isFreshSession=!0;stderrChunks=[];textBlockIndex=0;thinkBlockIndex=0;currentTextId=null;currentThinkingId=null;toolCallsMap=new Map;toolProxyHost=null;clientToolAbort=null;debug=new qI;availableAuthMethodIds=[];constructor(e,t,n){this.modelId=e,this.modeId=t,this.config=n,this.debug.ensureAgentMessageLogFile()}resetStreamState(){this.textBlockIndex=0,this.thinkBlockIndex=0,this.currentTextId=null,this.currentThinkingId=null,this.toolCallsMap.clear(),this.clientToolAbort=null}hasToolInput(e){return e==null?!1:typeof e==`object`?Object.keys(e).length>0:typeof e==`string`?e.length>0:!0}normalizeToolInput(e){return e??{}}parseToolCall(e){if(e.sessionUpdate!==`tool_call`)throw Error(`Invalid update type for parseToolCall`);return{toolCallId:e.toolCallId,toolName:e.title||e.toolCallId,toolInput:e.rawInput??{}}}parseToolResult(e){if(e.sessionUpdate!==`tool_call_update`)throw Error(`Invalid update type for parseToolResult`);return{toolCallId:e.toolCallId,toolName:e.title||e.toolCallId,toolResult:e.rawOutput??e.content??null,isError:e.status===`failed`,status:e.status}}isClientToolResult(e){if(!Array.isArray(e)||e.length===0)return{isClientTool:!1};let t=e[0];if(!t?.type)return{isClientTool:!1};let n=t.type===`text`&&typeof t.text==`string`?t.text:t.type===`content`&&t.content?.type===`text`?t.content.text:void 0;if(!n)return{isClientTool:!1};try{let e=JSON.parse(n);if(e.isClientTool===!0)return{isClientTool:!0,toolName:e.toolName,args:e.args}}catch{}return{isClientTool:!1}}async connectClient(){if(this.debug.ensureAgentMessageLogFile(),this.connection)return;if(!this.agentProcess){let e=this.config.session?.cwd||(typeof T.cwd==`function`?T.cwd():`/`);if(this.agentProcess=ce(this.config.command,this.config.args??[],{stdio:[`pipe`,`pipe`,`pipe`],env:{...T.env,...this.config.env},cwd:e,...T.platform===`win32`?{windowsHide:!0}:{}}),!this.agentProcess.stdout||!this.agentProcess.stdin)throw Error(`Failed to spawn agent process with stdio`);this.stderrChunks=[],this.agentProcess.stderr?.on(`data`,e=>{let t=new TextDecoder().decode(e);this.stderrChunks.push(t),T.stderr.write(e)});let t=ge.toWeb(this.agentProcess.stdin),n=me.toWeb(this.agentProcess.stdout);this.client=new XI,this.connection=new Xm(()=>this.client,Ym(t,n))}if(!this.connection)throw Error(`Connection not initialized`);let e={...this.config.initialize,protocolVersion:this.config.initialize?.protocolVersion??1,clientCapabilities:this.config.initialize?.clientCapabilities??{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1}};try{let t=(await this.connection.initialize(e)).authMethods??[];if(this.availableAuthMethodIds=t.map(e=>e.id),t.length>0){let e=this.config.authMethodId;if(e)this.availableAuthMethodIds.includes(e)?console.log(`[acp-ai-provider] Lazy auth enabled with authMethodId="${e}". Authentication will run only when required (code ${WI}).`):console.log(`[acp-ai-provider] Warning: authMethodId "${e}" is not in initialize.authMethods. Lazy auth auto-retry will be skipped unless you call authenticate() with a valid method.`,JSON.stringify(t,null,2));else{let e=this.availableAuthMethodIds[0];console.log(`[acp-ai-provider] Warning: authMethodId is not configured. Lazy auth will default to the first auth method "${e}".`,JSON.stringify(t,null,2))}}}catch(e){throw JI(e,this.stderrChunks.join(``))}}async startSession(e){if(!this.connection)throw Error(`Not connected`);try{let t=[...this.config.session?.mcpServers??[]],n=!1;if(e&&e.length>0&&!this.toolProxyHost){this.debug.log(`[acp-ai-provider] Setting up tool proxy for client-side tools...`,e.map(e=>e.name)),this.toolProxyHost=new MI(`acp-ai-sdk-tools`);for(let t of e)this.toolProxyHost.registerTool(t.name,t);n=!0}if(this.toolProxyHost){let e=await this.toolProxyHost.start();t.push(e)}if(this.sessionId&&n){this.sessionResponse=await this.connection.newSession({...this.config.session,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.sessionResponse.sessionId,this.isFreshSession=!0,await this.applySessionDelay();return}if(this.sessionId)return;this.config.existingSessionId?(await this.connection.loadSession({sessionId:this.config.existingSessionId,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.config.existingSessionId,this.sessionResponse={sessionId:this.config.existingSessionId},this.isFreshSession=!1):(this.sessionResponse=await this.connection.newSession({...this.config.session,cwd:this.config.session?.cwd??T.cwd(),mcpServers:t}),this.sessionId=this.sessionResponse.sessionId,this.isFreshSession=!0);let{models:r,modes:i}=this.sessionResponse??{};r?.currentModelId&&(this.currentModelId=r.currentModelId),i?.currentModeId&&(this.currentModeId=i.currentModeId),this.modelId&&this.modelId!==this.currentModelId&&(await this.setModel(this.modelId),this.currentModelId=this.modelId),this.modeId&&this.modeId!==this.currentModeId&&(await this.setMode(this.modeId),this.currentModeId=this.modeId),await this.applySessionDelay()}catch(e){throw JI(e,this.stderrChunks.join(``))}}async applySessionDelay(){this.config.sessionDelayMs&&(this.debug.log(`[acp-ai-provider] Waiting ${this.config.sessionDelayMs}ms after session setup...`),await new Promise(e=>setTimeout(e,this.config.sessionDelayMs)))}resolveLazyAuthMethodId(){let e=this.config.authMethodId;return e?this.availableAuthMethodIds.length===0||this.availableAuthMethodIds.includes(e)?e:null:this.availableAuthMethodIds[0]??null}async withLazyAuthRetry(e,t){try{return await t()}catch(n){if(!KI(n))throw n;let r=this.resolveLazyAuthMethodId();if(!r)throw n;return this.debug.log(`[acp-ai-provider] Authentication required during ${e} (code ${WI}). Running lazy authenticate with methodId="${r}" and retrying once...`),await this.authenticate(r),await t()}}async ensureConnected(e){await this.withLazyAuthRetry(`session setup`,async()=>{await this.connectClient(),await this.startSession(e)})}cleanup(){this.config.persistSession||this.forceCleanup()}getSessionId(){return this.sessionId}async initSession(e){let t=UI(e,!1);return await this.ensureConnected(t.length>0?t:void 0),this.sessionResponse}async authenticate(e){if(await this.connectClient(),!this.connection)throw Error(`Not connected`);try{await this.connection.authenticate({methodId:e})}catch(e){throw JI(e,this.stderrChunks.join(``))}}async promptWithLazyAuthRetry(e){if(!this.connection)throw Error(`Not connected`);return await this.withLazyAuthRetry(`prompt`,()=>this.connection.prompt(e))}async setMode(e){if(!this.connection||!this.sessionId)throw Error(`Not connected. Call preconnect() first.`);let t=this.sessionResponse?.modes?.availableModes;if(t&&!t.find(t=>t.id===e)){let n=t.map(e=>e.id).join(`, `),r=this.sessionResponse?.modes?.currentModeId?` (Current: "${this.sessionResponse.modes.currentModeId}")`:``;throw Error(`Mode "${e}" is not available${r}. Available modes: ${n}`)}await this.connection.setSessionMode({sessionId:this.sessionId,modeId:e}),this.currentModeId=e}async setModel(e){if(!this.connection||!this.sessionId)throw Error(`Not connected. Call preconnect() first.`);let{models:t}=this.sessionResponse??{};if(t?.availableModels&&!t.availableModels.some(t=>t.modelId===e)){let n=t.availableModels.map(e=>e.modelId).join(`, `),r=this.currentModelId?` (Current: "${this.currentModelId}")`:``;throw Error(`Model "${e}" is not available${r}. Available models: ${n}`)}await this.connection.unstable_setSessionModel({sessionId:this.sessionId,modelId:e}),this.currentModelId=e}forceCleanup(){this.toolProxyHost&&=(this.toolProxyHost.stop(),null),this.agentProcess&&=(this.agentProcess.kill(),this.agentProcess.stdin?.end(),this.agentProcess.stdout?.destroy(),this.agentProcess.stderr?.destroy(),null),this.connection=null,this.sessionId=null,this.sessionResponse=null,this.client=null,this.stderrChunks=[],this.availableAuthMethodIds=[]}emitRawContent(e,t){if(`entries`in t){e.enqueue({type:`raw`,rawValue:JSON.stringify({type:`plan`,entries:t.entries})});return}for(let n of t.content)(n.type===`diff`||n.type===`terminal`)&&e.enqueue({type:`raw`,rawValue:JSON.stringify({...n,toolCallId:t.toolCallId})})}flushPendingToolCalls(e){for(let[t,n]of this.toolCallsMap.entries())n.inputAvailable||(n.inputAvailable=!0,e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:n.name,args:{}})}))}handleStreamNotification(e,t){this.debug.appendAgentMessage(t);let n=t.update;switch(n.sessionUpdate){case`plan`:this.flushPendingToolCalls(e),this.emitRawContent(e,{type:`plan`,entries:n.entries});break;case`agent_thought_chunk`:this.flushPendingToolCalls(e),this.currentThinkingId||(this.currentThinkingId=`reasoning - ${this.thinkBlockIndex++} `,e.enqueue({type:`reasoning-start`,id:this.currentThinkingId})),e.enqueue({type:`reasoning-delta`,id:this.currentThinkingId,delta:n.content.type===`text`?n.content.text:``});break;case`agent_message_chunk`:if(this.flushPendingToolCalls(e),this.currentThinkingId&&=(e.enqueue({type:`reasoning-end`,id:this.currentThinkingId}),null),n.content.type===`text`){let t=n.content.text;this.currentTextId||(this.currentTextId=`text - ${this.textBlockIndex++} `,e.enqueue({type:`text-start`,id:this.currentTextId})),e.enqueue({type:`text-delta`,id:this.currentTextId,delta:t})}break;case`tool_call`:{this.currentTextId&&=(e.enqueue({type:`text-end`,id:this.currentTextId}),null),this.currentThinkingId&&=(e.enqueue({type:`reasoning-end`,id:this.currentThinkingId}),null);let{toolCallId:t,toolName:r,toolInput:i}=this.parseToolCall(n),a=this.toolCallsMap.get(t),o=this.hasToolInput(i);a?!a.inputAvailable&&o&&(a.inputAvailable=!0,n.title&&a.name!==n.title&&n.title!==t&&(a.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:a.name,args:i})})):(this.toolCallsMap.set(t,{index:this.toolCallsMap.size,name:r,inputStarted:!0,inputAvailable:!!o}),e.enqueue({type:`tool-input-start`,id:t,toolName:r}),o&&e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:r,args:i})}));break}case`tool_call_update`:{let{toolCallId:t,toolName:r,toolResult:i,isError:a}=this.parseToolResult(n),o=n.status??`in_progress`,s=this.toolCallsMap.get(t),c=this.normalizeToolInput(`rawInput`in n?n.rawInput:void 0);if(o===`in_progress`){s||(s={index:this.toolCallsMap.size,name:r,inputStarted:!0,inputAvailable:!1},this.toolCallsMap.set(t,s),e.enqueue({type:`tool-input-start`,id:t,toolName:r}));let i=this.hasToolInput(c);(!s.inputAvailable||i)&&(s.inputAvailable=!0,n.title&&s.name!==n.title&&n.title!==t&&(s.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:s.name,args:c})}));let a=n.content??[];a.length>0&&this.emitRawContent(e,{content:a,toolCallId:t});break}if(![`completed`,`failed`].includes(o))break;if(!s)s={index:this.toolCallsMap.size,name:r,inputAvailable:!0},this.toolCallsMap.set(t,s),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:r,args:c})});else{let r=this.hasToolInput(c);(!s.inputAvailable||r)&&(s.inputAvailable=!0,n.title&&s.name!==n.title&&n.title!==t&&(s.name=n.title),e.enqueue({type:`tool-call`,toolCallId:t,toolName:YI,input:JSON.stringify({toolCallId:t,toolName:s.name,args:c})}))}let l=this.isClientToolResult(i);if(l.isClientTool){this.debug.log(`[acp-ai-provider] Detected client tool: ${l.toolName}, stopping stream`);let r=n.content??[];r.length>0&&this.emitRawContent(e,{content:r,toolCallId:t}),this.clientToolAbort&&(e.enqueue({type:`finish`,finishReason:{unified:`tool-calls`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}}}),e.close(),this.clientToolAbort.resolve(),this.cleanup());break}e.enqueue({type:`tool-result`,toolCallId:t,toolName:YI,result:i,...a&&{isError:!0,result:Error(wI(i))}});let u=n.content??[];u.length>0&&this.emitRawContent(e,{content:u,toolCallId:t});break}}}async doGenerate(e){try{await this.ensureConnected();let t=HI(e,this.isFreshSession);this.isFreshSession=!1;let n=``,r=[],i=new Map,a={enqueue:e=>{switch(e.type){case`text-delta`:n+=e.delta;break;case`tool-call`:{let t=JSON.parse(e.input);r.push({id:e.toolCallId,name:t.toolName,input:t.args});break}case`tool-result`:{let t=r.find(t=>t.id===e.toolCallId);i.set(e.toolCallId,{name:t?.name||e.toolCallId,result:e.result,isError:e.isError});break}default:break}}},o=this.handleStreamNotification.bind(this);this.resetStreamState(),this.client&&this.client.setSessionUpdateHandler(e=>{o(a,e)});let s=await this.promptWithLazyAuthRetry({sessionId:this.sessionId,prompt:t}),c=[];n.trim()&&c.push({type:`text`,text:n});for(let e of r)c.push({type:`tool-call`,toolCallId:e.id,toolName:e.name,args:JSON.stringify(e.input),input:e.input,output:i.get(e.id)?.result});let l={content:c,finishReason:{unified:s.stopReason===`end_turn`?`stop`:`other`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}},warnings:[]};return this.cleanup(),l}catch(e){throw this.cleanup(),e}}async doStream(e){let t=UI(e.tools);try{await this.ensureConnected(t.length>0?t:void 0)}catch(e){throw this.forceCleanup(),e}let n=HI(e,this.isFreshSession);this.isFreshSession=!1;let r=this.sessionId,i=this.client,a=()=>this.cleanup(),o=this.handleStreamNotification.bind(this);return{stream:new ReadableStream({start:async e=>{e.enqueue({type:`stream-start`,warnings:[]}),this.resetStreamState();let t=new Promise(t=>{this.clientToolAbort={controller:e,resolve:t}});try{i&&i.setSessionUpdateHandler(t=>{o(e,t)});let s=this.promptWithLazyAuthRetry({sessionId:r,prompt:n}),c=await Promise.race([s.then(e=>({type:`response`,response:e})),t.then(()=>({type:`client-tool`}))]);if(c.type===`client-tool`)return;let l=c.response;e.enqueue({type:`finish`,finishReason:{unified:l.stopReason===`end_turn`?`stop`:`other`,raw:void 0},usage:{inputTokens:{total:void 0,noCache:void 0,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:void 0,text:void 0,reasoning:void 0}}}),e.close(),a()}catch(t){a(),e.enqueue({type:`error`,error:JI(t,this.stderrChunks.join(``))})}},cancel:()=>{a()}}),warnings:void 0}}get tools(){return FI()}},QI=class{config;model=null;constructor(e){this.config=e}languageModel(e,t){return this.model||=new ZI(e,t,this.config),e&&(this.model.modelId=e),t&&(this.model.modeId=t),this.model}call(){return this.languageModel()}get tools(){return this.model?.tools}getSessionId(){return this.model?.getSessionId()??null}initSession(e){return this.model||this.languageModel(),this.model.initSession(e)}connect(){return this.model||this.languageModel(),this.model.connectClient()}authenticate(e){this.model||this.languageModel();let t=e??this.config.authMethodId;if(!t)throw Error(`No auth method configured. Pass methodId or set authMethodId in ACPProviderSettings.`);return this.model.authenticate(t)}setMode(e){if(!this.model)throw Error(`No model initialized. Call languageModel() first.`);return this.model.setMode(e)}setModel(e){if(!this.model)throw Error(`No model initialized. Call languageModel() first.`);return this.model.setModel(e)}cleanup(){this.model?.forceCleanup()}};function $I(e){return new QI(e)}function eL(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=`toolName`in e&&typeof e.toolName==`string`?e.toolName:null,n=`args`in e&&e.args&&typeof e.args==`object`&&!Array.isArray(e.args)?e.args:void 0;return t?{toolName:t,...n?{args:n}:{}}:null}function tL(e){if(typeof e==`string`)return e;if(e!==void 0)try{return JSON.stringify(e)}catch{return}}function nL(e){return typeof e==`string`?e:null}function rL(e){return e instanceof Error?e.message:String(e)}async function iL(e){let t=`completed`,n=``,r,i,a=new Set,o={};try{if(e.intent===Ta.HISTORY)i=await e.listSessions(),n=i.length>0?`Found ${i.length} ACP session${i.length===1?``:`s`} for ${e.cwd}`:`No ACP sessions found for ${e.cwd}`;else if(e.intent===Ta.SWITCH_SESSION)n=e.sessionId?`Switched ACP session to ${e.sessionId}`:`ACP session switched`;else if(e.intent===Ta.CLOSE)n=e.closeText;else{let i=e.instruction?.trim();if(!i)throw Error(`ACP instruction is required for run intent`);if(!e.runtime||!e.abortController)throw Error(`ACP runtime is required for run intent`);let s=xI({model:e.runtime.languageModel(),tools:e.runtime.tools,prompt:i,abortSignal:e.abortController.signal});for await(let i of s.fullStream)switch(o[i.type]=(o[i.type]??0)+1,i.type){case`text-delta`:{let t=nL(i.text);if(!t)continue;n+=t,await e.observer?.onTextDelta?.(t);break}case`reasoning-delta`:{let t=nL(i.text);if(!t)continue;await e.observer?.onReasoningDelta?.(t);break}case`tool-call`:{let t=eL(i.input),n=t?.toolName??nL(i.toolName);if(!n)continue;a.add(n),await e.observer?.onToolCall?.({toolName:n,...t?.args?{args:t.args}:{}});break}case`tool-result`:{let t=eL(i.output)?.toolName??nL(i.toolName);if(!t)continue;a.add(t);let n=tL(`output`in i?i.output:void 0);await e.observer?.onToolResult?.({toolName:t,...`isError`in i&&typeof i.isError==`boolean`?{ok:!i.isError}:{},...n?{text:n}:{}});break}case`error`:r=rL(i.error),t=`failed`,await e.observer?.onError?.(r);break;default:break}}}catch(n){e.abortController?.signal.aborted?t=`stopped`:(t=`failed`,r=rL(n),await e.observer?.onError?.(r),e.onError?.(n))}return{outcome:t,finalText:n,...r?{error:r}:{},...i?{sessions:i}:{},toolNames:[...a],streamPartCounts:o}}function aL(e){return Error(`ACP session listing does not support client method ${e}`)}function oL(){return{sessionUpdate:async()=>{},requestPermission:async()=>({outcome:{outcome:`cancelled`}}),readTextFile:async()=>{throw aL(`readTextFile`)},writeTextFile:async()=>{throw aL(`writeTextFile`)},createTerminal:async()=>{throw aL(`createTerminal`)},extMethod:async()=>({}),extNotification:async()=>{}}}async function sL(e){let t=await Sa(e.provider);if(!t)throw Error(`Local ACP provider '${e.provider}' is not available on this host`);let n=ce(t.command,t.args,{stdio:[`pipe`,`pipe`,`pipe`],env:process.env,cwd:e.cwd,...process.platform===`win32`?{windowsHide:!0}:{}});if(!n.stdin||!n.stdout)throw Error(`Failed to spawn ACP agent process with stdio`);let r=[];n.stderr?.on(`data`,e=>{r.push(new TextDecoder().decode(e))});let i=new Xm(oL,Ym(ge.toWeb(n.stdin),me.toWeb(n.stdout)));try{let t=await i.initialize({protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1}}),n=Ca(e.provider),r=(t.authMethods??[]).map(e=>e.id);return n&&r.includes(n)&&await i.authenticate({methodId:n}),(await i.unstable_listSessions({cwd:e.cwd,cursor:null})).sessions.map(e=>({sessionId:e.sessionId,cwd:e.cwd,...e.title?{title:e.title}:{},...e.updatedAt?{updatedAt:e.updatedAt}:{}}))}catch(e){let t=r.join(``).trim(),n=t?` (${t})`:``;throw Error(`${e instanceof Error?e.message:String(e)}${n}`)}finally{n.killed||n.kill()}}function cL(e){return e===`~`?ne():e.startsWith(`~/`)?h(ne(),e.slice(2)):e}async function lL(e){let t=e.trim();if(!t)throw Error(`ACP cwd is required`);return await x(h(cL(t)))}function uL(e){let t=ie(`sha1`).update(e.cwd).digest(`hex`).slice(0,12);return`${e.taskId}:${e.deviceCode}:${e.provider}:${t}`}var dL=class{sessions=new Map;get(e){return this.sessions.get(e)??null}set(e){this.sessions.set(e.sessionScopeKey,e)}delete(e){this.sessions.delete(e)}values(){return[...this.sessions.values()]}findByTaskAndDevice(e,t){return this.values().filter(n=>n.taskId===e&&n.deviceCode===t)}};function fL(e,t){console.warn(`[local-acp] ${e}`,t)}async function pL(e){let t=e.registry.get(e.sessionScopeKey);if(t&&t.cwd===e.cwd&&t.provider===e.provider&&(!e.sessionId||t.sessionId===e.sessionId))return t.lastActiveAt=Date.now(),fL(`host session reuse`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,sessionScopeKey:t.sessionScopeKey,sessionId:t.sessionId}),t;t&&(fL(`host session replace`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,sessionScopeKey:t.sessionScopeKey,sessionId:t.sessionId}),t.state=`closing`,t.runtime.cleanup(),e.registry.delete(t.sessionScopeKey));for(let t of e.registry.findByTaskAndDevice(e.taskId,e.deviceCode))t.provider!==e.provider&&(t.state=`closing`,t.activeRun?.abortController.abort(),t.activeRun=null,t.runtime.cleanup(),e.registry.delete(t.sessionScopeKey));let n=await Sa(e.provider);if(!n)throw Error(`Local ACP provider '${e.provider}' is not available on this host`);let r=Ca(e.provider);fL(`host session create`,{provider:e.provider,cwd:e.cwd,taskId:e.taskId,deviceCode:e.deviceCode,sessionScopeKey:e.sessionScopeKey,sessionId:e.sessionId,command:n.command,args:n.args,authMethodId:r});let i=$I({command:n.command,args:n.args,...r?{authMethodId:r}:{},session:{cwd:e.cwd,mcpServers:[]},...e.sessionId?{existingSessionId:e.sessionId}:{},persistSession:!0}),a=(await i.initSession()).sessionId||i.getSessionId(),o={sessionScopeKey:e.sessionScopeKey,taskId:e.taskId,deviceCode:e.deviceCode,provider:e.provider,cwd:e.cwd,createdAt:Date.now(),lastActiveAt:Date.now(),state:`idle`,sessionId:a,runtime:i,activeRun:null};return e.registry.set(o),fL(`host session created`,{provider:o.provider,cwd:o.cwd,taskId:o.taskId,deviceCode:o.deviceCode,sessionScopeKey:o.sessionScopeKey,sessionId:o.sessionId}),o}async function mL(e,t){fL(`host session close`,{provider:e.provider,cwd:e.cwd,taskId:e.taskId,deviceCode:e.deviceCode,sessionScopeKey:e.sessionScopeKey,sessionId:e.sessionId,activeRunId:e.activeRun?.runId}),e.state=`closing`,e.activeRun?.abortController.abort(),e.activeRun=null,e.runtime.cleanup(),t.delete(e.sessionScopeKey)}function hL(e){let t=e.finalText?.trim()||e.error?.trim()||`${e.provider} ACP ${e.intent} ${e.outcome}`;return{synopsis:t.length>600?`${t.slice(0,597)}...`:t,keyPoints:[`provider=${e.provider}`,`cwd=${e.cwd}`,`intent=${e.intent}`,`outcome=${e.outcome}`,...e.sessionId?[`sessionId=${e.sessionId}`]:[],...e.sessions?[`sessions=${e.sessions.length}`]:[],...e.toolNames.length>0?[`tools=${e.toolNames.join(`, `)}`]:[],...e.error?[`error=${e.error}`]:[]]}}function gL(e){return{ok:e.ok,runId:e.runId,provider:e.provider,intent:e.intent,outcome:e.outcome,summary:hL({provider:e.provider,cwd:e.cwd,intent:e.intent,outcome:e.outcome,finalText:e.finalText,error:e.error,sessionId:e.sessionId,sessions:e.sessions,toolNames:e.toolNames??[]}),...e.sessionId?{sessionId:e.sessionId}:{},...e.sessions?{sessions:e.sessions}:{},...e.finalText?{finalText:e.finalText}:{},...e.error?{error:e.error}:{}}}function _L(e){return{runId:e.runId,provider:e.record.provider,deviceCode:e.record.deviceCode,cwd:e.record.cwd,intent:e.intent,status:`running`,sessionScopeKey:e.record.sessionScopeKey,...e.record.sessionId?{sessionId:e.record.sessionId}:{},startedAt:Date.now(),activity:{totalEventCount:0,windowStartSeq:0,truncated:!1,items:[]}}}function vL(e,t){let n=e.activity.items;if(n.push(t),e.activity.totalEventCount+=1,n.length>200){n.shift(),e.activity.truncated=!0,e.activity.windowStartSeq=n[0]?.seq??t.seq;return}e.activity.windowStartSeq===0&&(e.activity.windowStartSeq=n[0]?.seq??t.seq)}function yL(e){return{...e,activity:{...e.activity,items:[...e.activity.items]},...e.result?{result:{...e.result,...e.result.sessions?{sessions:[...e.result.sessions]}:{}}}:{}}}async function bL(e){let t=new AbortController,n={runId:e.runId,toolCallId:e.toolCallId,startedAt:Date.now(),abortController:t};e.record.activeRun=n,e.record.state=`running`,e.record.lastActiveAt=Date.now(),e.record.sessionId=e.record.runtime.getSessionId()??e.record.sessionId;try{return await e.run(t)}finally{e.record.activeRun=null,e.record.state=`idle`,e.record.lastActiveAt=Date.now(),e.record.sessionId=e.record.runtime.getSessionId()??e.record.sessionId}}async function xL(e){let{record:t,registry:n,toolCallId:r,instruction:i,intent:a,onProgress:o,onError:s}=e,c=ae(),l=_L({runId:c,record:t,intent:a}),u=0,d=()=>{o?.({taskId:t.taskId,toolCallId:r,projection:yL(l)})};fL(`host turn start`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,toolCallId:r,runId:c,sessionId:t.sessionId}),vL(l,{seq:++u,at:Date.now(),kind:`status`,acpType:`status`,status:`running`,text:`Running ${t.provider} ${a} in ${t.cwd}`}),d();let{outcome:f,finalText:p,error:m,sessions:h,toolNames:g,streamPartCounts:_}=await bL({record:t,runId:c,toolCallId:r,run:async e=>await iL({provider:t.provider,cwd:t.cwd,intent:a,sessionId:t.sessionId,instruction:i,runtime:t.runtime,abortController:e,listSessions:async()=>await sL({provider:t.provider,cwd:t.cwd}),closeText:`Closed ACP session for ${t.cwd}`,observer:{onTextDelta:e=>{vL(l,{seq:++u,at:Date.now(),kind:`assistant_text`,acpType:`text_delta`,text:e}),d()},onReasoningDelta:e=>{vL(l,{seq:++u,at:Date.now(),kind:`reasoning`,acpType:`reasoning_delta`,text:e}),d()},onToolCall:({toolName:e,args:t})=>{vL(l,{seq:++u,at:Date.now(),kind:`tool_call`,acpType:`tool_call`,toolName:e,...t?{argsPreview:JSON.stringify(t)}:{}}),d()},onToolResult:({toolName:e,ok:t,text:n})=>{vL(l,{seq:++u,at:Date.now(),kind:`tool_result`,acpType:`tool_result`,toolName:e,...t===void 0?{}:{ok:t},...n?{text:n}:{}}),d()},onError:e=>{vL(l,{seq:++u,at:Date.now(),kind:`error`,acpType:`error`,message:e}),d()}},onError:s})});return a===Ta.CLOSE&&await mL(t,n),fL(`host turn done`,{provider:t.provider,cwd:t.cwd,taskId:t.taskId,deviceCode:t.deviceCode,toolCallId:r,runId:c,sessionId:t.sessionId,outcome:f,ok:f===`completed`,toolNames:g,streamPartCounts:_,finalTextLength:p.length,hasError:!!m}),l.status=f,l.finishedAt=Date.now(),l.sessionId=t.sessionId??l.sessionId,l.result={...l.result??{},summary:hL({provider:t.provider,cwd:t.cwd,intent:a,outcome:f,finalText:p,error:m,sessionId:t.sessionId,sessions:h,toolNames:g}).synopsis,...p?{finalText:p}:{},...m?{error:m}:{},...h?{sessions:h}:{},...t.sessionId?{sessionId:t.sessionId}:{}},vL(l,{seq:++u,at:Date.now(),kind:`status`,acpType:`status`,status:f,text:f===`completed`?`ACP run completed`:f===`stopped`?`ACP run stopped`:m??`ACP run failed`}),d(),gL({ok:f===`completed`,runId:c,provider:t.provider,cwd:t.cwd,intent:a,outcome:f,sessionId:t.sessionId,sessions:h,toolNames:g,finalText:p,error:m})}function SL(e){let t=new dL;return{listAvailableProviders:async()=>await xa(),listSessions:async e=>{let t=await lL(e.cwd);return await sL({provider:e.provider,cwd:t})},executeLocalAcp:async n=>{let r=await lL(n.cwd);fL(`host execute start`,{provider:n.provider,cwd:r,taskId:n.taskId,toolCallId:n.toolCallId,deviceCode:n.deviceCode,intent:n.intent,sessionId:n.sessionId});let i=uL({taskId:n.taskId,deviceCode:n.deviceCode,provider:n.provider,cwd:r}),a=t.get(i);if(a&&a.state!==`idle`)return fL(`host execute busy`,{provider:a.provider,cwd:a.cwd,taskId:a.taskId,toolCallId:a.activeRun?.toolCallId,state:a.state,sessionScopeKey:i,sessionId:a.sessionId}),{ok:!1,runId:a.activeRun?.runId??ae(),provider:a.provider,intent:n.intent,outcome:`failed`,summary:hL({provider:a.provider,cwd:a.cwd,intent:n.intent,outcome:`failed`,error:`ACP session busy on host (${a.provider}, state=${a.state})`,toolNames:[]}),error:`ACP session busy on host (${a.provider}, state=${a.state})`};if(n.intent===Ta.HISTORY){let e=ae(),t=await iL({provider:n.provider,cwd:r,intent:n.intent,listSessions:async()=>await sL({provider:n.provider,cwd:r}),closeText:`No active ACP session bound for ${r}`});return gL({ok:t.outcome===`completed`,runId:e,provider:n.provider,cwd:r,intent:n.intent,outcome:t.outcome,sessions:t.sessions,finalText:t.finalText,error:t.error})}if(n.intent===Ta.CLOSE){let e=ae();a&&await mL(a,t);let i=await iL({provider:n.provider,cwd:r,intent:n.intent,listSessions:async()=>[],closeText:a?`Closed ACP session for ${r}`:`No active ACP session bound for ${r}`});return gL({ok:i.outcome===`completed`,runId:e,provider:n.provider,cwd:r,intent:n.intent,outcome:i.outcome,finalText:i.finalText,error:i.error})}let o=await pL({sessionScopeKey:i,taskId:n.taskId,deviceCode:n.deviceCode,provider:n.provider,cwd:r,sessionId:n.sessionId,registry:t});if(n.intent===Ta.SWITCH_SESSION){let e=await iL({provider:n.provider,cwd:r,intent:n.intent,sessionId:o.sessionId,listSessions:async()=>[],closeText:`Closed ACP session for ${r}`}),t=ae();return gL({ok:e.outcome===`completed`,runId:t,provider:n.provider,cwd:r,intent:n.intent,outcome:e.outcome,sessionId:o.sessionId,finalText:e.finalText,error:e.error})}let s=n.instruction?.trim();if(!s)return gL({ok:!1,runId:ae(),provider:n.provider,cwd:r,intent:n.intent,outcome:`failed`,sessionId:o.sessionId,error:`ACP instruction is required for run intent`});let c=await xL({record:o,registry:t,toolCallId:n.toolCallId,instruction:s,intent:n.intent,onProgress:n.onProgress,onError:e?.onError});return fL(`host execute done`,{provider:n.provider,cwd:r,taskId:n.taskId,toolCallId:n.toolCallId,intent:n.intent,outcome:c.outcome,ok:c.ok,runId:c.runId,sessionId:o.sessionId}),c},closeTaskSessions:async e=>{for(let n of t.values())n.taskId===e.taskId&&(e.deviceCode&&n.deviceCode!==e.deviceCode||await mL(n,t))},closeAll:async()=>{for(let e of t.values())await mL(e,t)}}}const CL={android:`android`,darwin:`macos`,ios:`ios`,linux:`linux`,macos:`macos`,web:`web`,win32:`windows`,windows:`windows`},wL=e=>{let t=typeof e==`string`?e.trim().toLowerCase():``;return!t||!(t in CL)?null:CL[t]},TL=[`/etc/os-release`,`/usr/lib/os-release`],EL=/\r?\n/,DL=[`$os = Get-CimInstance Win32_OperatingSystem`,`$cs = Get-CimInstance Win32_ComputerSystem`,`$csp = Get-CimInstance Win32_ComputerSystemProduct`,`[pscustomobject]@{`,` osVersion = $os.Version`,` osBuild = $os.BuildNumber`,` manufacturer = $cs.Manufacturer`,` modelName = $cs.Model`,` modelIdentifier = $csp.Version`,`} | ConvertTo-Json -Compress`].join(`; `),OL=e=>typeof e==`string`&&e.trim()?e.trim():null,kL=e=>wL(e)??`linux`,AL=e=>{let t=OL(e);if(!t)return null;let n=t.toLowerCase();return n.includes(`arm64`)||n.includes(`aarch64`)?`arm64`:n===`arm`||n.startsWith(`armv`)?`arm`:n.includes(`x86_64`)||n.includes(`amd64`)||n===`x64`?`x64`:n===`ia32`||n===`x86`||n===`i386`||n===`i686`?`ia32`:t},jL=async(e,t)=>{try{return OL(await new Promise((n,r)=>{oe(e,t,{encoding:`utf8`,env:process.env,timeout:3e3},(e,t)=>{if(e){r(e);return}n(t)})}))}catch{return null}},ML=async e=>{for(let{command:t,args:n}of e){let e=await jL(t,n);if(e)return e}return null},NL=async e=>{try{return OL(await b(e,`utf8`))}catch{return null}},PL=e=>{try{return OL(JSON.parse(e).SPHardwareDataType?.[0]?.machine_name)}catch{return null}},FL=e=>{try{let t=JSON.parse(e);return{osVersion:OL(t.osVersion),osBuild:OL(t.osBuild),manufacturer:OL(t.manufacturer),modelName:OL(t.modelName),modelIdentifier:OL(t.modelIdentifier)}}catch{return null}},IL=e=>{let t=new Map;for(let n of e.split(EL)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim().toUpperCase(),a=e.slice(r+1).trim(),o=a.startsWith(`"`)&&a.endsWith(`"`)?a.slice(1,-1):a;t.set(i,o)}return{versionId:OL(t.get(`VERSION_ID`)),buildId:OL(t.get(`BUILD_ID`))}},LL=async()=>{for(let e of TL){let t=await NL(e);if(t)return IL(t)}return null},RL=async()=>{let e=await jL(`system_profiler`,[`SPHardwareDataType`,`-json`]);return e?PL(e):null},zL=async()=>await jL(`sysctl`,[`-n`,`hw.model`]),BL=async()=>{let e=await ML([{command:`powershell.exe`,args:[`-NoLogo`,`-NoProfile`,`-NonInteractive`,`-Command`,DL]},{command:`powershell`,args:[`-NoLogo`,`-NoProfile`,`-NonInteractive`,`-Command`,DL]}]);return e?FL(e):null},VL=e=>({osPlatform:e,osVersion:null,osBuild:null,cpuArchitecture:AL(process.arch),manufacturer:null,modelName:null,modelIdentifier:null}),HL={linux:async()=>{let[e,t,n,r,i]=await Promise.all([LL(),jL(`uname`,[`-r`]),NL(`/sys/devices/virtual/dmi/id/sys_vendor`),NL(`/sys/devices/virtual/dmi/id/product_name`),NL(`/sys/devices/virtual/dmi/id/product_version`)]);return{...VL(`linux`),osVersion:e?.versionId??null,osBuild:e?.buildId??t,manufacturer:n,modelName:r,modelIdentifier:i}},macos:async()=>{let[e,t,n,r]=await Promise.all([jL(`sw_vers`,[`-productVersion`]),jL(`sw_vers`,[`-buildVersion`]),RL(),zL()]);return{...VL(`macos`),osVersion:e,osBuild:t,manufacturer:`Apple`,modelName:n,modelIdentifier:r}},windows:async()=>{let e=await BL();return{...VL(`windows`),osVersion:e?.osVersion??null,osBuild:e?.osBuild??null,manufacturer:e?.manufacturer??null,modelName:e?.modelName??null,modelIdentifier:e?.modelIdentifier??null}}},UL=async()=>{let e=kL(process.platform),t=HL[e];return t?await t():VL(e)},WL=()=>`Echo CLI (${re()})`,GL=UL;let KL=null;const qL=async()=>(KL??=GL(),await KL),JL=async e=>{let t=e.useAuthStore.getState();if(t.authStatus!==`authenticated`){if(t.authStatus===`error`)throw Error(t.authError??`Authentication failed`);await new Promise((t,n)=>{let r=e.useAuthStore.subscribe(e=>{if(e.authStatus===`authenticated`){r(),t();return}e.authStatus===`error`&&(r(),n(Error(e.authError??`Authentication failed`)))})})}},YL=e=>(fi(e.endpoints),$r({apiBaseUrl:e.endpoints.apiBaseUrl,wsBaseUrl:e.endpoints.wsBaseUrl,persistence:ci,providers:{github:ur,slack:dr,googleWorkspace:fr},hooks:{getDeviceCode:async()=>e.deviceCode,getDeviceInfo:async()=>await qL(),getDeviceName:async()=>WL(),getDeviceType:async()=>`cli_host`,getUserAgent:async()=>`echo-cli`,openExternalUrl:e.onExternalUrl,supportBrowser:async()=>!1,supportTmux:async()=>!1,supportAcp:async()=>(await ba()).some(e=>e.available)},...e.callbacks?{callbacks:e.callbacks}:{}})),XL=e=>e.useAuthStore.getState().authError,ZL=async e=>{let t=await It(e.endpoints.apiBaseUrl,{token:e.token,deviceCode:e.deviceCode,deviceName:WL()});await gi({email:t.email,token:t.token,expiresAt:t.expiresAt,...t.updatedAt?{updatedAt:t.updatedAt}:{},userId:t.userId,name:t.name,avatarUrl:t.avatarUrl??null},e.endpoints);let n=YL({deviceCode:e.deviceCode,endpoints:e.endpoints,onExternalUrl:async()=>{throw Error(`Token login should not request an external URL`)}});try{await n.start(),await JL(n)}finally{n.stop()}},QL=e=>typeof e==`string`?e.trim():e,$L=/^[A-Z_]+/,eR=/\/+$/,tR=(e,t)=>{if(typeof e==`string`){let t=e.trim();if(t.length>0&&t!==`undefined`&&t!==`null`)return t}for(let e of t){if(typeof e!=`string`)continue;let t=e.trim();if(t.length>0&&t!==`undefined`&&t!==`null`)return t}},nR=If(QL,Sd({message:`API_BASE_URL must be a valid http:// or https:// URL`,protocol:/^https?$/})),rR=If(QL,Sd({message:`WS_BASE_URL must be a valid ws:// or wss:// URL`,protocol:/^wss?$/})),iR=e=>typeof e==`string`&&e.trim()===`http://localhost:3001`,aR=e=>typeof e==`string`&&e.trim()===`ws://localhost:3001/ws`,oR=()=>tr([process.env.LC_ALL??``,process.env.LC_MESSAGES??``,process.env.LANG??``].filter(Boolean)),sR=(e,t,n)=>{let r=e.safeParse(t);if(r.success)return r.data;let i=r.error.issues[0]?.message??`Invalid value for ${n}`;throw Error(i.replace($L,n))},cR=(e,t,n)=>{let r=typeof t==`string`?t.trim():``;if(r)return sR(e,r,n)},lR=()=>{let e=tR(`https://api.nod.work`,[`https://api.nod.work`]),t=tR(``,[``]);return{API_BASE_URL:cR(nR,process.env.API_BASE_URL,`API_BASE_URL`),WS_BASE_URL:cR(rR,process.env.WS_BASE_URL,`WS_BASE_URL`),bundledApiBaseUrl:cR(nR,e,`bundled API base URL`),bundledWsBaseUrl:cR(rR,t,`bundled WS base URL`)}},uR=e=>{let t=e.trim();if(!t||t===`/`)return`/`;let n=t.startsWith(`/`)?t:`/${t}`;return n.length>1&&n.endsWith(`/`)?n.replace(eR,``):n},dR=e=>{let t=e.toString();return t.endsWith(`/`)&&e.pathname===`/`?t.slice(0,-1):t},fR=e=>{let t=e.trim(),n=new URL(t);if(![`ws:`,`wss:`].includes(n.protocol))throw Error(`WebSocket URL must use ws:// or wss://`);n.protocol=n.protocol===`wss:`?`https:`:`http:`,n.search=``,n.hash=``;let r=uR(n.pathname);return r===`/ws`?(n.pathname=`/`,dR(n)):(n.pathname=r.endsWith(`/ws`)?r.slice(0,-3)||`/`:r,dR(n))},pR=e=>{let t=e.trim(),n=new URL(t);if(![`http:`,`https:`].includes(n.protocol))throw Error(`API URL must use http:// or https://`);return n.protocol=n.protocol===`https:`?`wss:`:`ws:`,n.pathname=n.pathname===`/`?`/ws`:`${uR(n.pathname)}/ws`,n.search=``,n.hash=``,dR(n)},mR=(e={})=>{let t=lR(),n=t.bundledApiBaseUrl!=null&&iR(e.storedApiBaseUrl)&&aR(e.storedWsBaseUrl),r=n?void 0:e.storedApiBaseUrl,i=n?void 0:e.storedWsBaseUrl,a=cR(nR,e.apiBaseUrl,`--api-base-url`)??t.API_BASE_URL??cR(nR,r,`stored api base URL`)??t.bundledApiBaseUrl,o=cR(rR,e.wsBaseUrl,`--ws-base-url`)??t.WS_BASE_URL??cR(rR,i,`stored ws base URL`)??t.bundledWsBaseUrl,s=a??(o?fR(o):void 0),c=o??(a?pR(a):void 0);if(!s||!c)throw Error(`Missing backend endpoint configuration. Provide API_BASE_URL, WS_BASE_URL, or --ws-base-url.`);return{apiBaseUrl:s,wsBaseUrl:c}},hR=e=>e.map(e=>`${e}\n`).join(``),gR=()=>{let e=Promise.resolve(),t=null;return{appendLines:n=>{if(n.length===0)return;let r=hR(n);e=e.then(async()=>{await y(ri(),{recursive:!0}),await v(ai(new Date),r,`utf8`)}).catch(e=>{t=e})},flush:async()=>{if(await e,!t)return;let n=t;throw t=null,n instanceof Error?n:Error(String(n))}}},_R={STAT_LOCAL_FILE:`stat_local_file`,REQUEST_SERVER_FILE:`request_server_file`,UPLOAD_FILE:`upload_file`,CHECK_UPLOAD_FILENAME:`check_upload_filename`,REQUEST_LOCAL_FILE:`request_local_file`,PUT_FILE_TO_LOCAL:`put_file_to_local`,LIST_LOCAL_FILES:`list_local_files`},vR={PIPELINE_LIST:`pipeline.list`,PIPELINE_GRAPH_GET:`pipeline.graph.get`,PIPELINE_CREATE:`pipeline.create`,PIPELINE_NAME_GENERATE:`pipeline.name.generate`,PIPELINE_PUBLISH:`pipeline.publish`,PIPELINE_ASSIGN:`pipeline.assign`,PIPELINE_PARTICIPANTS_LIST:`pipeline.participants.list`,PIPELINE_DEVICES_LIST:`pipeline.devices.list`,PIPELINE_DEVICES_SET:`pipeline.devices.set`,PIPELINE_FILES_LIST:`pipeline.files.list`,PIPELINE_FILES_UPLOAD:`pipeline.files.upload`,PIPELINE_FILES_DOWNLOAD:`pipeline.files.download`,PIPELINE_FILES_PREVIEW:`pipeline.files.preview`},yR={REVIEW_SUBSCRIBE:`review.subscribe`,REVIEW_LIST_PENDING:`review.list_pending`,REVIEW_GET:`review.get`,REVIEW_CALL_DEVICE_PROXIER:`review.callDeviceProxier`},bR={TASK_LIST:`task.list`,TASK_OPTIONS_SET:`task.options.set`,TASK_STATUS_SET:`task.status.set`,TASK_UNREADS_CLEAR:`task.unreads.clear`,TASK_ROOT_CREATE:`task.root.create`,TASK_SEND:`task.send`,TASK_INTERACTION_START:`task.interaction.start`,TASK_STOP:`task.stop`,TASK_TOOLS:`task.tools`,TASK_SUBSCRIBE:`task.subscribe`,TASK_MESSAGES:`task.messages`,TASK_TOOL_RESULT_GET:`task.tool_result.get`,TASK_AGENT_INSTRUCTION_GET:`task.agent_instruction.get`,TASK_AGENT_INSTRUCTION_SAVE:`task.agent_instruction.save`};var xR=class{command(e,t){let[n,...r]=e;if(!n)throw Error(`Command is required`);return new SR(n,r,t||{})}},SR=class{proc=null;startTime=0;started=!1;timeoutHandle=null;constructor(e,t,n){this.command=e,this.args=t,this.options=n}async start(){if(this.started)throw Error(`Command already started`);this.started=!0,this.startTime=Date.now();let e={cwd:this.options.cwd,env:this.options.env?{...process.env,...this.options.env}:process.env,shell:this.options.shell!==!1};this.proc=ce(this.command,this.args,e),this.options.timeoutMs&&(this.timeoutHandle=setTimeout(()=>{this.proc&&!this.proc.killed&&(this.proc.kill(`SIGTERM`),setTimeout(()=>{this.proc&&!this.proc.killed&&this.proc.kill(`SIGKILL`)},5e3))},this.options.timeoutMs))}async wait(){if(!this.started||!this.proc)throw Error(`Command not started`);return new Promise((e,t)=>{this.proc.on(`exit`,(t,n)=>{this.timeoutHandle&&=(clearTimeout(this.timeoutHandle),null);let r=Date.now()-this.startTime;e({code:t??1,signal:n||void 0,durationMs:r})}),this.proc.on(`error`,e=>{this.timeoutHandle&&=(clearTimeout(this.timeoutHandle),null),t(e)})})}stdinPipe(){if(!this.started||!this.proc||!this.proc.stdin)throw Error(`Command not started or stdin not available`);return this.proc.stdin}stdoutPipe(){if(!this.started||!this.proc||!this.proc.stdout)throw Error(`Command not started or stdout not available`);return this.proc.stdout}stderrPipe(){if(!this.started||!this.proc||!this.proc.stderr)throw Error(`Command not started or stderr not available`);return this.proc.stderr}signal(e){if(!this.proc)throw Error(`Command not started`);this.proc.kill(e)}kill(){if(!this.proc)throw Error(`Command not started`);this.proc.kill(`SIGTERM`),setTimeout(()=>{this.proc&&!this.proc.killed&&this.proc.kill(`SIGKILL`)},5e3)}};let CR=function(e){return e.TOOL_CALL=`tool_call`,e.CONFIRM=`confirm`,e}({}),wR=function(e){return e.SUBMIT=`submit`,e.REJECT=`reject`,e}({});const TR=async e=>(await e.connection.sendRpc(yR.REVIEW_LIST_PENDING,{})).reviews,ER=async(e,t)=>await e.connection.sendRpc(yR.REVIEW_SUBSCRIBE,t),DR=async(e,t)=>(await e.connection.sendRpc(yR.REVIEW_GET,{reviewId:t})).review,OR=async(e,t,n,r)=>{let i=t.metadata.taskReview;await e.connection.sendRpc(bR.TASK_SEND,{taskId:i.taskId,toTaskId:i.taskId,to:`bot`,inputs:{blocks:[],resume:{messageId:i.taskMessageId,blockIndex:i.taskMessageBlockIndex,source:CR.TOOL_CALL,reviewId:t.id,resume:{kind:n,data:r}}}})},kR=async(e,t)=>{await e.connection.sendRpc(bR.TASK_INTERACTION_START,{reviewId:t})},AR=async(e,t,n)=>{await e.connection.sendRpc(yR.REVIEW_CALL_DEVICE_PROXIER,{reviewId:t,decision:n})},jR={ok:!1,rejected:!0,error:`Local execution rejected by user`},MR=e=>({ok:!1,rejected:!0,provider:e.provider,intent:e.intent,outcome:`failed`,error:`Local ACP execution rejected by user`,summary:{synopsis:`Local ACP execution rejected by user`,keyPoints:[`provider=${e.provider}`,`intent=${e.intent}`,`outcome=failed`,`rejected=true`]}}),NR=async(e,t,n)=>{let r=e.reviewsById.get(n);if(r)return r;let i=await DR(t,n);return e.reviewsById.set(i.id,i),i},PR=async(e,t,n,r,i)=>{let a=n.metadata.taskReview;if(a.executionKind===wa.LOCAL_COMMAND){if(r.localCommand?.approved!==!0){await OR(t,n,wR.REJECT,jR);return}let o=a.snapshot?.localCommand;if(!o)throw Error(`INVALID_LOCAL_COMMAND_REVIEW_SNAPSHOT`);let s=t.executors?.localCommand;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}await kR(t,n.id);let c=await s({reviewId:n.id,command:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}if(a.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD){if(r.requestLocalFileUpload?.approved!==!0){await OR(t,n,wR.REJECT,jR);return}let o=a.snapshot?.localFileUpload;if(!o)throw Error(`INVALID_LOCAL_FILE_UPLOAD_REVIEW_SNAPSHOT`);let s=t.executors?.localFileUpload;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}let c=await s({reviewId:n.id,upload:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}if(a.executionKind===wa.BROWSER_COMMAND){if(r.browserCommand?.approved===!0){await OR(t,n,wR.SUBMIT,{approved:!0});return}await OR(t,n,wR.REJECT,{ok:!1,rejected:!0,approved:!1});return}if(a.executionKind===wa.ACP_SUBAGENT){if(r.acpSubagent?.approved!==!0){let e=a.snapshot?.acpSubagent;await OR(t,n,wR.REJECT,MR({provider:e?.provider??`unknown`,intent:e?.intent??`run`}));return}let o=a.snapshot?.acpSubagent;if(!o)throw Error(`INVALID_ACP_SUBAGENT_REVIEW_SNAPSHOT`);let s=t.executors?.acpSubagent;if(!s){if(i===`auto`)return;throw Error(`No local review executor registered for execution kind: ${a.executionKind}`)}let c=await s({reviewId:n.id,taskId:a.taskId,toolCallId:a.toolCallId,deviceCode:a.deviceCode,request:o});await OR(t,n,wR.SUBMIT,c),e.reviewsById.set(n.id,n);return}throw Error(`Unsupported review kind: ${a.executionKind}`)},FR=async(e,t,n,r,i)=>{let a=await NR(e,t,n),o=a.metadata.taskReview,s=i?.mode??`manual`;if(o.executionKind===wa.BROWSER_COMMAND){await PR(e,t,a,r,s);return}let c=await t.getCurrentDeviceCode();if(o.deviceCode!==c){if(s===`auto`)return;if(i?.allowProxy===!1)throw Error(`Review is not owned by this device`);await AR(t,n,r);return}await PR(e,t,a,r,s)},IR=async(e,t,n,r,i)=>{try{return await FR(e,t,n,r,{mode:`manual`}),!0}catch(e){return t.notifyError?.(i,e),!1}},LR={ACK:`ack`,DEVICE_PRESENCE_UPDATE:`device.presence.update`,TASK_UPDATE:`task.update`,TASK_INBOX_UPDATE:`task.inbox.update`,REVIEW_PENDING_UPDATE:`review.pending.update`,PIPELINE_UPDATE:`pipeline.update`,RELAY_SESSION_CONNECT_REQUEST:`relay.session.connect_request`,RELAY_SESSION_READY:`relay.session.ready`,RELAY_SESSION_FAILED:`relay.session.failed`,WORKSPACE_MEMBERS_UPDATE:`workspace.members.update`},RR=async(e,t,n=e.pendingReviews)=>{let r=await t.getCurrentDeviceCode();if(r)for(let i of n){let n=i.metadata.taskReview;if(!(i.status!==`pending`||n.reviewRequired!==!1||n.deviceCode!==r||n.executionKind===wa.BROWSER_COMMAND)&&!e.inFlightReviewIds.has(i.id)){e.inFlightReviewIds.add(i.id);try{if(n.executionKind===wa.LOCAL_COMMAND&&!t.executors?.localCommand||n.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD&&!t.executors?.localFileUpload||n.executionKind===wa.ACP_SUBAGENT&&!t.executors?.acpSubagent)continue;let r=n.executionKind===wa.LOCAL_COMMAND?{kind:wa.LOCAL_COMMAND,localCommand:{approved:!0}}:n.executionKind===wa.REQUEST_LOCAL_FILE_UPLOAD?{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!0}}:{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!0}};await FR(e,t,i.id,r,{mode:`auto`})}catch(e){t.notifyError?.(`Failed to auto-process pending review`,e)}finally{e.inFlightReviewIds.delete(i.id)}}}},zR=async(e,t,n)=>{try{return await FR(e,t,n.reviewId,n.decision,{allowProxy:!1,mode:`manual`}),{ok:!0}}catch(e){throw new ut(e instanceof Error?e.message:String(e),{code:`INTERNAL_ERROR`,domain:`rpc`})}},BR=(e,t)=>t.connection.registerRpcHandler(yR.REVIEW_CALL_DEVICE_PROXIER,async n=>await zR(e,t,n)),VR=()=>({pendingReviews:[],reviews:[]}),HR=e=>{let t={...VR(),...e};return qt(e=>({...t,patchSnapshot:t=>e(t),replaceSnapshot:t=>e(t),reset:()=>e(VR())}))},UR=()=>new Date(Date.now()+9e5).toISOString(),WR=e=>{let t={pendingReviews:[...e.pendingReviews],reviews:[...e.reviewsById.values()]};e.useReviewStore?.getState().replaceSnapshot(t);for(let n of e.listeners)n(t)},GR=async(e,t)=>{let n=await TR(t);e.pendingReviews=n;for(let t of n)e.reviewsById.set(t.id,t);WR(e)},KR=e=>e.connection.getConnectionStatus()===`connected`&&(e.auth?.isAuthenticated()??!0),qR=(e,t)=>{e.reviewPendingSubscription&&=(t.connection.removeChannelListener(LR.REVIEW_PENDING_UPDATE,e.reviewPendingSubscription),null),e.reviewSubscriptionRefreshTimer&&=(clearInterval(e.reviewSubscriptionRefreshTimer),null),e.active=!1,e.pendingReviews=[],e.reviewsById.clear(),e.useReviewStore?.getState().replaceSnapshot(VR())},JR=(e,t)=>{t.acceptRemoteDecisions===!1||e.proxiedDecisionHandlerSubscription||(e.proxiedDecisionHandlerSubscription=BR(e,t))},YR=(e,t)=>{e.proxiedDecisionHandlerSubscription&&=(t.connection.removeRpcHandler(e.proxiedDecisionHandlerSubscription),null)},XR=async(e,t)=>{await GR(e,t),await RR(e,t)},ZR=async(e,t)=>{await ER(t,{expireAt:UR()})},QR=async(e,t)=>{e.active||=(await ZR(e,t),e.reviewSubscriptionRefreshTimer=setInterval(()=>{ZR(e,t).catch(e=>{t.notifyError?.(`Failed to refresh review subscription`,e)})},6e5),e.reviewPendingSubscription=t.connection.setupChannelListener(LR.REVIEW_PENDING_UPDATE,()=>{XR(e,t).catch(e=>{t.notifyError?.(`Failed to refresh pending reviews`,e)})}),!0),await XR(e,t)},$R=async(e,t)=>{if(e.started){if(!KR(t)){qR(e,t);return}await QR(e,t)}},ez=async(e,t)=>{if(e.reconcilePromise){e.needsReconcile=!0,await e.reconcilePromise;return}e.reconcilePromise=(async()=>{do e.needsReconcile=!1,await $R(e,t);while(e.started&&e.needsReconcile)})().finally(()=>{e.reconcilePromise=null}),await e.reconcilePromise},tz=async(e,t)=>{if(e.started){await ez(e,t);return}e.started=!0,JR(e,t),e.connectionStatusSubscription=t.connection.setupConnectionStatusListener(()=>{ez(e,t).catch(e=>{t.notifyError?.(`Failed to reconcile review runtime lifecycle`,e)})}),e.authSubscriptionRemove=t.auth?.subscribe(()=>{ez(e,t).catch(e=>{t.notifyError?.(`Failed to reconcile review runtime lifecycle`,e)})})??null,await ez(e,t)},nz=(e,t)=>{e.started=!1,YR(e,t),e.connectionStatusSubscription&&=(t.connection.removeConnectionStatusListener(e.connectionStatusSubscription),null),e.authSubscriptionRemove?.(),e.authSubscriptionRemove=null,qR(e,t)},rz=()=>({reviewsById:new Map,pendingReviews:[],listeners:new Set,inFlightReviewIds:new Set,started:!1,active:!1,reviewPendingSubscription:null,reviewSubscriptionRefreshTimer:null,connectionStatusSubscription:null,proxiedDecisionHandlerSubscription:null,authSubscriptionRemove:null,reconcilePromise:null,needsReconcile:!1,useReviewStore:null});function iz(e){let t=rz(),n=HR();return t.useReviewStore=n,{useReviewStore:n,start:async()=>{await tz(t,e)},stop:()=>{nz(t,e)},onReviewUpdate:e=>{t.listeners.add(e);let r={pendingReviews:[...t.pendingReviews],reviews:[...t.reviewsById.values()]};return n.getState().replaceSnapshot(r),e(r),()=>{t.listeners.delete(e)}},getPendingReviews:()=>[...t.pendingReviews],getReviews:()=>[...t.reviewsById.values()],getReview:e=>t.reviewsById.get(e)??null,processReviews:n=>RR(t,e,n),actions:{reviewCommandExecution:{approve:n=>IR(t,e,n,{kind:wa.LOCAL_COMMAND,localCommand:{approved:!0}},`Failed to approve local execution`),reject:n=>IR(t,e,n,{kind:wa.LOCAL_COMMAND,localCommand:{approved:!1}},`Failed to reject local execution`)},reviewRequestFileUpload:{approve:n=>IR(t,e,n,{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!0}},`Failed to approve local file upload`),reject:n=>IR(t,e,n,{kind:wa.REQUEST_LOCAL_FILE_UPLOAD,requestLocalFileUpload:{approved:!1}},`Failed to reject local file upload`)},reviewBrowserCommandExecution:{approve:n=>IR(t,e,n,{kind:wa.BROWSER_COMMAND,browserCommand:{approved:!0}},`Failed to approve browser execution`),reject:n=>IR(t,e,n,{kind:wa.BROWSER_COMMAND,browserCommand:{approved:!1}},`Failed to reject browser execution`)},reviewAcpExecution:{approve:n=>IR(t,e,n,{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!0}},`Failed to approve ACP execution`),reject:n=>IR(t,e,n,{kind:wa.ACP_SUBAGENT,acpSubagent:{approved:!1}},`Failed to reject ACP execution`)}},handleProxiedDecision:async(n,r)=>{await FR(t,e,n,r,{allowProxy:!1,mode:`manual`})}}}const az=e=>{let t=e?.metadata?.command;return typeof t?.cwd==`string`&&t.cwd.trim()?t.cwd.trim():void 0},oz=async(e,t,n,r)=>await e.sendRpc(_R.UPLOAD_FILE,{taskId:t,filename:n,sizeBytes:r}),sz=async(e,t)=>await e.sendRpc(_R.UPLOAD_FILE,{...t,status:`completed`}),cz=async e=>{let t=ie(`sha256`);return await new Promise((n,r)=>{let i=l(e);i.on(`data`,e=>t.update(e)),i.on(`error`,r),i.on(`end`,()=>n())}),t.digest(`hex`)},lz=async e=>{let t=await te(e.path);if(!t.isFile())throw Error(`Local file does not exist or is not a regular file: ${e.path}`);let n=e.filename.trim()||f(e.path),r=e.sizeBytes??t.size,i=await cz(e.path),a=await oz(e.provider,e.taskId,n,r),o=await fetch(a.uploadUrl,{method:`PUT`,...a.headers?{headers:a.headers}:{},body:l(e.path),duplex:`half`});if(!o.ok)throw Error(`Failed to upload local file: HTTP ${o.status}`);return await sz(e.provider,{taskId:e.taskId,fileId:a.fileId,filename:n,sizeBytes:r,sha256:i}),{fileId:a.fileId}},uz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_LIST,{pipelineId:t}),dz=async e=>{if(!e.pipelineId||e.provider.getConnectionStatus()!==`connected`)return e.fallbackCwd;try{return az((await uz(e.provider,e.pipelineId)).items.find(t=>t.deviceCode===e.deviceCode))??e.fallbackCwd}catch{return e.fallbackCwd}},fz=e=>{let t=new xR,n=null,r=iz({connection:e.networkRuntime.provider,auth:{isAuthenticated:()=>e.networkRuntime.useAuthStore.getState().authStatus===`authenticated`,subscribe:t=>e.networkRuntime.useAuthStore.subscribe((e,n)=>{e.authStatus!==n.authStatus&&t()})},getCurrentDeviceCode:async()=>e.deviceCode,executors:{localCommand:async({reviewId:r,command:i})=>{let a=n?.getReview(r),o=await dz({provider:e.networkRuntime.provider,pipelineId:a?.metadata.taskReview.pipelineId??e.getPublishedPipelineId(),deviceCode:e.deviceCode,fallbackCwd:e.fallbackCwd}),s=t.command(i.cmd,{cwd:o,...i.env?{env:i.env}:{},shell:!1}),c=[],l=[];await s.start(),s.stdoutPipe().on(`data`,e=>{c.push(E.isBuffer(e)?e:E.from(e))}),s.stderrPipe().on(`data`,e=>{l.push(E.isBuffer(e)?e:E.from(e))});try{let e=await s.wait(),t=E.concat(c).toString(`utf8`),n=E.concat(l).toString(`utf8`);return{ok:e.code===0,stdout:t,stderr:n,exitCode:e.code,signal:e.signal??null,durationMs:e.durationMs,...e.code===0?{}:{error:n.trim()||`Command exited with code ${e.code}`}}}catch(e){return{ok:!1,stdout:E.concat(c).toString(`utf8`),stderr:E.concat(l).toString(`utf8`),exitCode:null,signal:null,error:e instanceof Error?e.message:String(e)}}},localFileUpload:async({reviewId:t,upload:r})=>{let i=n?.getReview(t);if(!i)throw TypeError(`REVIEW_NOT_FOUND`);return await lz({provider:e.networkRuntime.provider,taskId:i.metadata.taskReview.taskId,path:r.sourcePath,filename:r.filename,...r.sizeBytes===void 0?{}:{sizeBytes:r.sizeBytes}})},acpSubagent:async({taskId:t,toolCallId:n,request:r})=>await e.acpHostRuntime.executeLocalAcp({taskId:t,toolCallId:n,deviceCode:e.deviceCode,provider:r.provider,cwd:r.cwd,intent:r.intent,...r.instruction?{instruction:r.instruction}:{},...r.sessionId?{sessionId:r.sessionId}:{}})},notifyError:e.notifyError});return n=r,r},pz=e=>{let t=e.find(e=>e.type===`creature_root`);if(!t)throw Error(`No creature_root pipeline found for the current account`);return t},mz=e=>e.map(e=>({deviceCode:e.deviceCode,metadata:e.metadata})),hz=e=>({deviceCode:e.deviceCode,metadata:{command:{cwd:e.cwd,reviewRequired:!1},localFileUpload:{reviewRequired:!1},...e.acpProviders.length>0||e.acpStatuses.length>0?{acp:{providers:e.acpProviders,...e.acpStatuses.length>0?{statuses:e.acpStatuses}:{},reviewRequired:!1}}:{}}}),gz=e=>{let t=hz(e);return e.current.find(t=>t.deviceCode===e.deviceCode)?e.current.map(n=>n.deviceCode===e.deviceCode?{...n,metadata:{...n.metadata,command:t.metadata.command,localFileUpload:t.metadata.localFileUpload,...t.metadata.acp?{acp:t.metadata.acp}:{}}}:n):[...e.current,t]},_z=e=>e.current.filter(t=>t.deviceCode!==e.deviceCode),vz=async e=>await e.sendRpc(vR.PIPELINE_LIST,{}),yz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_LIST,{pipelineId:t}),bz=async(e,t)=>await e.sendRpc(vR.PIPELINE_DEVICES_SET,t),xz=async e=>{if(!await hi())throw Error("No valid auth session found. Run `nodwork login --non-interactive` first.");let t=SL({onError:t=>{e.logSink.writeLine(`[local-acp] ${t instanceof Error?t.message:String(t)}`)}}),n=null,r=!1,i=null,a=new Promise(e=>{i=e}),o=async()=>{},s=YL({deviceCode:e.deviceCode,endpoints:e.endpoints,onExternalUrl:async()=>{throw Error(`CLI runtime does not support interactive external login`)},callbacks:{onSessionAuthenticated:async({response:t})=>{e.logSink.writeLine(`[run] auth.login:ok userId=${t.userId} expiresAt=${t.expiresAt}`);let r=await ba(),i=r.filter(e=>e.available).map(e=>e.provider);e.logSink.writeLine(`[run] pipeline.list:start deviceCode=${e.deviceCode}`);let a=await vz(s.provider);e.logSink.writeLine(`[run] pipeline.list:ok count=${String(a.items.length)} deviceCode=${e.deviceCode}`);let o=pz(a.items);e.logSink.writeLine(`[run] pipeline.listDevices:start pipeline=${o.pipelineId} deviceCode=${e.deviceCode}`);let c=await yz(s.provider,o.pipelineId);e.logSink.writeLine(`[run] pipeline.listDevices:ok pipeline=${o.pipelineId} items=${String(c.items.length)} deviceCode=${e.deviceCode}`),e.logSink.writeLine(`[run] pipeline.setDevices:start pipeline=${o.pipelineId} deviceCode=${e.deviceCode} cwd=${e.cwd}`),await bz(s.provider,{pipelineId:o.pipelineId,devices:gz({current:mz(c.items),deviceCode:e.deviceCode,cwd:e.cwd,acpProviders:i,acpStatuses:r})}),n=o.pipelineId,e.logSink.writeLine(`[run] pipeline.setDevices:ok pipeline=${o.pipelineId} deviceCode=${e.deviceCode}`),e.logSink.writeLine(`published local environment: pipeline=${o.pipelineId} deviceCode=${e.deviceCode} cwd=${e.cwd}`)},onSessionCleared:async t=>{t!==`logout`&&(e.logSink.writeLine(`authentication expired; CLI runtime stopped`),await o())}}}),c=fz({acpHostRuntime:t,deviceCode:e.deviceCode,fallbackCwd:e.cwd,getPublishedPipelineId:()=>n,networkRuntime:s,notifyError:(t,n)=>{e.logSink.writeLine(`${t}: ${n instanceof Error?n.message:String(n)}`)}}),l=s.provider.setupConnectionStatusListener(t=>{if(!r){if(t===`connected`){e.logSink.writeLine(`[run] socket connected: deviceCode=${e.deviceCode}`);return}e.logSink.writeLine(`socket ${t}`)}});return o=async()=>{if(!r){if(r=!0,s.provider.getConnectionStatus()===`connected`&&n){let t=await yz(s.provider,n).catch(()=>null);t&&await bz(s.provider,{pipelineId:n,devices:_z({current:mz(t.items),deviceCode:e.deviceCode})}).catch(()=>{})}s.provider.removeConnectionStatusListener(l),c.stop(),s.stop(),await t.closeAll().catch(()=>{}),i?.()}},{start:async()=>{e.logSink.writeLine(`Starting CLI runtime: deviceCode=${e.deviceCode} cwd=${e.cwd}`),await s.start(),await c.start()},stop:o,waitUntilStopped:async()=>await a}},Sz=[`github`,`slack`,`googleWorkspace`],Cz={github:`GitHub`,slack:`Slack`,googleWorkspace:`Google Workspace`},wz=e=>Cz[e],Tz=(e,t)=>{let n=Math.floor(e/2),r=e%2;switch(t){case`left`:return n*2+Math.max(r-1,0);case`right`:return Math.min(n*2+Math.min(r+1,1),Sz.length-1);case`up`:return Math.max(e-2,0);case`down`:return Math.min(e+2,Sz.length-1)}},Ez=/\r?\n/g,Dz=e=>e instanceof Error?e.message:String(e),Oz=e=>e.replace(Ez,` `),kz=(e,t,n)=>Math.min(Math.max(e,t),n),Az=e=>Math.max(1,e),jz=e=>Math.max(0,e.linesLength-Az(e.visibleLogRowCount)),Mz=e=>kz(e.nextTop,0,jz({linesLength:e.linesLength,visibleLogRowCount:e.visibleLogRowCount})),Nz=e=>{let t=e.logLines.length,n=e.logCount;if(t===0)return{isFollowingTail:e.isFollowingLogTail,lines:[],showingFrom:0,showingTo:0,totalLogCount:n,totalRetained:t};let r=Az(e.visibleLogRowCount),i=e.isFollowingLogTail?Math.max(0,t-r):Mz({linesLength:t,nextTop:e.logViewportTop,visibleLogRowCount:r}),a=e.logLines.slice(i,i+r);return{isFollowingTail:e.isFollowingLogTail,lines:a,showingFrom:i,showingTo:i+a.length,totalLogCount:n,totalRetained:t}},Pz=e=>e?.email??null,Fz=e=>{let t=e.maxLogLines??300,n=gR(),r=null,i=new Promise(e=>{r=e});return Bt((a,o)=>{let s=e=>{o().exitCode===null&&(a({exitCode:e}),r?.(e),r=null)},c=e=>{o().isDisposed||a({errorMessage:null,fatalMessage:e,screen:`fatal`,statusMessage:null})},l=()=>{let e=o().loginRuntime;e&&(e.stop(),o().loginRuntime===e&&a({loginRuntime:null}))},u=async()=>{let e=o().cliRunRuntime;e&&(await e.stop().catch(()=>{}),o().cliRunRuntime===e&&a({cliRunRuntime:null}))},d=async()=>{let t=await di(),n=mR({...e.wsBaseUrl?{wsBaseUrl:e.wsBaseUrl}:{},...t?.apiBaseUrl?{storedApiBaseUrl:t.apiBaseUrl}:{},...t?.wsBaseUrl?{storedWsBaseUrl:t.wsBaseUrl}:{}});return await fi(n),o().isDisposed||a({resolvedEndpoints:n}),n},f=async()=>{let t=await di(),n=mR({...e.wsBaseUrl?{wsBaseUrl:e.wsBaseUrl}:{},...t?.apiBaseUrl?{storedApiBaseUrl:t.apiBaseUrl}:{},...t?.wsBaseUrl?{storedWsBaseUrl:t.wsBaseUrl}:{}});await fi(n);let r=await hi(n);return o().isDisposed||a({authenticatedEmail:Pz(r),resolvedEndpoints:n}),{endpoints:n,session:r}},p=async()=>{let e=o().deviceCode;if(e)return e;let t=await wi();return o().isDisposed||a({deviceCode:t}),t},m=async t=>{let n=e.token?.trim();return n?(a({bootMessage:`Signing in with bootstrap token...`,screen:`boot`}),await ZL({deviceCode:t,endpoints:await d(),token:n}),o().isDisposed||a({authenticatedEmail:Pz(await hi())}),!0):!1},h=async e=>{let t=o().loginRuntime;if(t)return t;a({bootMessage:`Connecting login runtime...`,screen:`boot`});let n=YL({deviceCode:e,endpoints:await d(),onExternalUrl:async e=>{if(o().isDisposed)return;let t=o().currentProvider;a({errorMessage:null,externalUrl:e,providerLabel:t?wz(t):`External provider`,screen:`external_url`,statusMessage:null})}});if(await n.start(),o().isDisposed)throw n.stop(),Error(`CLI store disposed before login runtime was ready`);return a({currentProvider:null,errorMessage:null,loginRuntime:n,screen:`login_method`,selectedIndex:0,statusMessage:null}),n},g=async(e,t,n)=>{l(),await u();let r=n??await f();if(!r.session)throw Error("No valid auth session found. Run `nodwork login --non-interactive` first.");a({authenticatedEmail:Pz(r.session),bootMessage:`Starting CLI runtime...`,cliRunRuntime:null,currentProvider:null,cwd:t,deviceCode:e,errorMessage:null,externalUrl:null,isFollowingLogTail:!0,logCount:0,logLines:[],logViewportTop:0,providerLabel:null,resolvedEndpoints:r.endpoints,screen:`boot`,statusMessage:null});let i=null;try{if(i=await xz({cwd:t,deviceCode:e,endpoints:r.endpoints,logSink:{writeLine:e=>{o().appendLogLine(e)}}}),o().isDisposed){await i.stop().catch(()=>{});return}if(a({cliRunRuntime:i}),await i.start(),o().isDisposed){await i.stop().catch(()=>{});return}a({fatalMessage:null,screen:`running`}),i.waitUntilStopped().then(()=>{let e=o();e.isDisposed||e.isShuttingDown||e.setExitCode(0)})}catch(e){i&&await i.stop().catch(()=>{}),c(Dz(e))}},_=async e=>{let t=await f();if(!t.session)throw Error(`Login reported success, but no persisted session was found`);if(!o().isDisposed){if(e.kind===`run`){let n=o().deviceCode;if(!n)throw Error(`Missing device code`);await g(n,e.cwd,t);return}l(),a({authenticatedEmail:Pz(t.session),currentProvider:null,errorMessage:null,externalUrl:null,providerLabel:null,screen:`login_method`,statusMessage:null})}},v=async(e,t={kind:`stay`})=>{let n=o().loginRuntime;if(!n){c(`Login runtime is not available`);return}a({currentProvider:e,errorMessage:null,screen:`login_method`,selectedIndex:Sz.indexOf(e),statusMessage:`Preparing ${wz(e)} login...`});try{if(!await n.startLogin(e,{preferredLanguage:oR()}))throw Error(XL(n)??`${wz(e)} login failed`);await _(t)}catch(t){if(o().isDisposed)return;a({currentProvider:null,errorMessage:Dz(t),screen:`login_method`,selectedIndex:Sz.indexOf(e),statusMessage:null})}};return{authenticatedEmail:null,bootMessage:`Booting nodwork...`,cliRunRuntime:null,currentProvider:null,cwd:e.defaultCwd,deviceCode:null,errorMessage:null,exitCode:null,externalUrl:null,fatalMessage:null,isFollowingLogTail:!0,isDisposed:!1,isShuttingDown:!1,logCount:0,logLines:[],logViewportTop:0,loginRuntime:null,providerLabel:null,resolvedEndpoints:null,screen:`boot`,selectedIndex:0,statusMessage:null,visibleLogRowCount:12,appendLogLine:e=>{let r=Oz(e);a(e=>({...(()=>{let i=[...e.logLines,r],a=Math.max(0,i.length-t),o=a>0?i.slice(0,a):[],s=a>0?i.slice(a):i;o.length>0&&n.appendLines(o);let c=e.isFollowingLogTail?Math.max(0,s.length-Az(e.visibleLogRowCount)):Mz({linesLength:s.length,nextTop:e.logViewportTop-a,visibleLogRowCount:e.visibleLogRowCount});return{logCount:e.logCount+1,logLines:s,logViewportTop:c}})()}))},bootstrapHeadlessLogin:async()=>{try{a({bootMessage:`Preparing device identity...`,fatalMessage:null,screen:`boot`});let e=await p();if(o().isDisposed)return;let t=await m(e);if(o().isDisposed||t)return;await h(e)}catch(e){c(Dz(e))}},bootstrapHeadlessRun:async()=>{try{a({bootMessage:`Preparing device identity...`,cwd:e.defaultCwd,fatalMessage:null,screen:`boot`});let t=await p();if(o().isDisposed||(await m(t),o().isDisposed))return;let n=await f();if(!n.session){c("No valid auth session found. Run `nodwork login --non-interactive` first.");return}await g(t,e.defaultCwd,n)}catch(e){c(Dz(e))}},bootstrapInteractive:async()=>{try{a({bootMessage:`Preparing device identity...`,fatalMessage:null,screen:`boot`});let e=await p();if(o().isDisposed||(await m(e),o().isDisposed))return;let t=await f();if(o().isDisposed)return;if(t.session){await g(e,o().cwd,t);return}await h(e)}catch(e){c(Dz(e))}},dispose:async()=>{o().isDisposed||(a({isDisposed:!0}),l(),await u(),await n.flush().catch(()=>{}))},jumpLogsToEnd:()=>{a(e=>({isFollowingLogTail:!0,logViewportTop:jz({linesLength:e.logLines.length,visibleLogRowCount:e.visibleLogRowCount})}))},jumpLogsToStart:()=>{a({isFollowingLogTail:!1,logViewportTop:0})},moveLoginSelection:e=>{o().screen===`login_method`&&a(t=>({errorMessage:null,selectedIndex:Tz(t.selectedIndex,e)}))},pageLogsDown:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop+Az(e.visibleLogRowCount),visibleLogRowCount:e.visibleLogRowCount})}))},pageLogsUp:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop-Az(e.visibleLogRowCount),visibleLogRowCount:e.visibleLogRowCount})}))},scrollLogsDown:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop+1,visibleLogRowCount:e.visibleLogRowCount})}))},scrollLogsUp:()=>{a(e=>({isFollowingLogTail:!1,logViewportTop:Mz({linesLength:e.logLines.length,nextTop:e.logViewportTop-1,visibleLogRowCount:e.visibleLogRowCount})}))},setExitCode:e=>{o().isDisposed||s(e)},setVisibleLogRowCount:e=>{a(t=>{let n=Az(e);return{logViewportTop:t.isFollowingLogTail?Math.max(0,t.logLines.length-n):Mz({linesLength:t.logLines.length,nextTop:t.logViewportTop,visibleLogRowCount:n}),visibleLogRowCount:n}})},shutdown:async e=>{o().isDisposed||o().isShuttingDown||(a({isShuttingDown:!0}),l(),await u(),await n.flush().catch(()=>{}),!o().isDisposed&&s(e))},startProviderLogin:v,submitSelectedLoginMethod:async()=>{let{screen:e,selectedIndex:t}=o();e===`login_method`&&await v(Sz[t]??`github`,{cwd:o().cwd,kind:`run`})},waitForExit:async()=>await i}})},Iz=()=>({writeLine:e=>{fe.write(`${e}\n`)}}),Lz=[`github`,`googleWorkspace`,`slack`],Rz=e=>Lz.includes(e),zz=e=>{let t=e?.trim();if(!t||!Rz(t))throw Error(`login requires --method github|googleWorkspace|slack when --token is not provided`);return t},Bz=e=>{let t=e.getState().fatalMessage;if(t)throw Error(t)},Vz=async e=>{let t=Iz(),n=Fz({defaultCwd:process.cwd(),token:e.token,wsBaseUrl:e.wsBaseUrl}),r=n.subscribe((e,n)=>{e.externalUrl&&e.externalUrl!==n.externalUrl&&(t.writeLine(`Open this URL to continue login:`),t.writeLine(e.externalUrl))});try{if(await n.getState().bootstrapHeadlessLogin(),Bz(n),e.token?.trim()){t.writeLine(`CLI session verified and saved`);return}let r=zz(e.method);await n.getState().startProviderLogin(r,{kind:`stay`}),Bz(n),t.writeLine(`CLI session verified and saved`)}finally{r(),await n.getState().dispose()}},Hz=e=>{let t=e.getState().fatalMessage;if(t)throw Error(t)},Uz=async e=>{let t=Iz(),n=Fz({defaultCwd:process.cwd(),token:e.token,wsBaseUrl:e.wsBaseUrl}),r=n.subscribe((e,n)=>{if(e.logCount<=n.logCount)return;let r=e.logLines.at(-1);r&&t.writeLine(r)}),i=async()=>{await n.getState().shutdown(0)},a=()=>{i()},o=()=>{i()};process.once(`SIGINT`,a),process.once(`SIGTERM`,o);try{await n.getState().bootstrapHeadlessRun(),Hz(n),await n.getState().waitForExit()}finally{r(),process.off(`SIGINT`,a),process.off(`SIGTERM`,o),await n.getState().dispose()}};function Wz(e,t,{signal:n,edges:r}={}){let i,a=null,o=r!=null&&r.includes(`leading`),s=r==null||r.includes(`trailing`),c=()=>{a!==null&&(e.apply(i,a),i=void 0,a=null)},l=()=>{s&&c(),p()},u=null,d=()=>{u!=null&&clearTimeout(u),u=setTimeout(()=>{u=null,l()},t)},f=()=>{u!==null&&(clearTimeout(u),u=null)},p=()=>{f(),i=void 0,a=null},m=()=>{c()},h=function(...e){if(n?.aborted)return;i=this,a=e;let t=u==null;d(),o&&t&&c()};return h.schedule=d,h.cancel=p,h.flush=m,n?.addEventListener(`abort`,p,{once:!0}),h}function Gz(e,t=0,n={}){typeof n!=`object`&&(n={});let{leading:r=!1,trailing:i=!0,maxWait:a}=n,o=[,,];r&&(o[0]=`leading`),i&&(o[1]=`trailing`);let s,c=null,l=Wz(function(...t){s=e.apply(this,t),c=null},t,{edges:o}),u=function(...t){return a!=null&&(c===null&&(c=Date.now()),Date.now()-c>=a)?(s=e.apply(this,t),c=Date.now(),l.cancel(),l.schedule(),s):(l.apply(this,t),s)};return u.cancel=l.cancel,u.flush=()=>(l.flush(),s),u}function Kz(e,t=0,n={}){let{leading:r=!0,trailing:i=!0}=n;return Gz(e,t,{leading:r,maxWait:t,trailing:i})}const qz=globalThis.window?.document!==void 0;globalThis.process?.versions?.node,globalThis.process?.versions?.bun,globalThis.Deno?.version?.deno,globalThis.process?.versions?.electron,globalThis.navigator?.userAgent?.includes(`jsdom`),typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope,typeof DedicatedWorkerGlobalScope<`u`&&globalThis instanceof DedicatedWorkerGlobalScope,typeof SharedWorkerGlobalScope<`u`&&globalThis instanceof SharedWorkerGlobalScope,typeof ServiceWorkerGlobalScope<`u`&&globalThis instanceof ServiceWorkerGlobalScope;const Jz=globalThis.navigator?.userAgentData?.platform;Jz===`macOS`||globalThis.navigator?.platform===`MacIntel`||globalThis.navigator?.userAgent?.includes(` Mac `)===!0||globalThis.process?.platform,Jz===`Windows`||globalThis.navigator?.platform===`Win32`||globalThis.process?.platform,Jz===`Linux`||globalThis.navigator?.platform?.startsWith(`Linux`)===!0||globalThis.navigator?.userAgent?.includes(` Linux `)===!0||globalThis.process?.platform,Jz===`iOS`||globalThis.navigator?.platform===`MacIntel`&&globalThis.navigator?.maxTouchPoints>1||/iPad|iPhone|iPod/.test(globalThis.navigator?.platform),Jz===`Android`||globalThis.navigator?.platform===`Android`||globalThis.navigator?.userAgent?.includes(` Android `)===!0||globalThis.process?.platform,!qz&&T.env.TERM_PROGRAM;const Yz=!qz&&T.platform===`win32`;!qz&&(T.env.TERM?.startsWith(`screen`)||T.env.TERM?.startsWith(`tmux`)||T.env.TMUX),qz||T.cwd;const Xz=(e,t)=>{if(typeof e!=`number`)throw TypeError("The `x` argument is required");return typeof t==`number`?`\x1B[`+(t+1)+`;`+(e+1)+`H`:`\x1B[`+(e+1)+`G`},Zz=(e=1)=>`\x1B[`+e+`A`,Qz=(e=1)=>`\x1B[`+e+`B`,$z=e=>{let t=``;for(let n=0;n<e;n++)t+=eB+(n<e-1?Zz():``);return e&&(t+=`\x1B[G`),t},eB=`\x1B[2K`,tB=`\x1B[2J`;`${tB}`;const nB=(()=>{if(qz||!Yz)return!1;let e=C.release().split(`.`),t=Number(e[0]),n=Number(e[2]??0);return t<10||t===10&&n<10586})()?`${tB}[0f`:`${tB}[3J[H`,rB=e=>e in de&&de[e]!==`0`&&de[e]!==`false`,iB=rB(`CI`)||rB(`CONTINUOUS_INTEGRATION`),aB=e=>{let t=new Set;do for(let n of Reflect.ownKeys(e))t.add([e,n]);while((e=Reflect.getPrototypeOf(e))&&e!==Object.prototype);return t};function oB(e,{include:t,exclude:n}={}){let r=e=>{let r=t=>typeof t==`string`?e===t:t.test(e);return t?t.some(r):n?!n.some(r):!0};for(let[t,n]of aB(e.constructor.prototype)){if(n===`constructor`||!r(n))continue;let i=Reflect.getOwnPropertyDescriptor(t,n);i&&typeof i.value==`function`&&(e[n]=e[n].bind(e))}return e}var sB=e(ea(),1);const cB=[`assert`,`count`,`countReset`,`debug`,`dir`,`dirxml`,`error`,`group`,`groupCollapsed`,`groupEnd`,`info`,`log`,`table`,`time`,`timeEnd`,`timeLog`,`trace`,`warn`];let lB={};const uB=e=>{let t=new pe,n=new pe;t.write=t=>{e(`stdout`,t)},n.write=t=>{e(`stderr`,t)};let r=new console.Console(t,n);for(let e of cB)lB[e]=console[e],console[e]=r[e];return()=>{for(let e of cB)console[e]=lB[e];lB={}}};
|
|
222
222
|
/**
|
|
223
223
|
* @license React
|
|
224
224
|
* react-reconciler-constants.production.js
|