agent-afk 5.201.0 → 5.202.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/tools/handlers/_rolling-tail.d.ts +1 -0
- package/dist/cli.mjs +690 -689
- package/dist/index.mjs +109 -109
- package/dist/telegram.mjs +6 -6
- package/dist/web-server/frontend/schedule-form.d.ts +7 -0
- package/dist/web-server/frontend/schedule-history.d.ts +1 -0
- package/dist/web-server/frontend/schedules-view.d.ts +32 -0
- package/dist/web-server/routes.schedules.d.ts +8 -0
- package/dist/web-ui-assets/app.js +30 -30
- package/dist/web-ui-assets/index.html +6 -0
- package/dist/web-ui-assets/schedules.css +202 -0
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -266,12 +266,12 @@ ${n}
|
|
|
266
266
|
Remedy: these paths are outside the fork's granted read roots. Re-dispatch with the needed paths inside the child's cwd/worktree, or pass explicit readRoots granting them. If this worker is deliberately confined (e.g. an \`afk farm\` branch worker), this failure is expected \u2014 the paths are outside its assigned scope; widen the scope or narrow the task.`}var Mo,yE,Qg,Di=h(()=>{"use strict";Mo="denial-breaker",yE=new Set(["read_file","list_directory","glob","grep"]),Qg="Sub-agent path access denied:"});import{createHash as n2}from"node:crypto";function kE(){return{recent:[],firedFingerprints:new Set}}function rd(t){let e;try{e=o2(t.input)}catch{e=String(t.input)}return n2("sha256").update(t.name).update("\0").update(e).digest("hex")}function o2(t){return JSON.stringify(Zg(t))??"null"}function Zg(t){if(Array.isArray(t))return t.map(Zg);if(t!==null&&typeof t=="object"){let e=t,n={};for(let r of Object.keys(e).sort())n[r]=Zg(e[r]);return n}return t}function s2(t,e){let n=0;for(let r of t)r===e&&(n+=1);return n}function vE(t,e){t.recent.push(e),t.recent.length>eh&&t.recent.shift();let n=s2(t.recent,e);return n>=r2&&!t.firedFingerprints.has(e)?(t.firedFingerprints.add(e),{fired:!0,count:n}):{fired:!1,count:n}}var r2,eh,th=h(()=>{"use strict";r2=5,eh=20});function a2(t){if(t===null||typeof t!="object"||Array.isArray(t))return t;let e={};for(let[n,r]of Object.entries(t))i2.has(n)||(e[n]=r);return e}function Fi(t){return rd({...t,input:a2(t.input)})}function c2(t){let e=t.content.split(`
|
|
267
267
|
`).find(n=>n.trim()!=="")?.trim()??"";return e.length<=TE?e:`${e.slice(0,TE)}\u2026`}var nh,i2,TE,od,rh=h(()=>{"use strict";th();nh=3,i2=new Set(["timeout_ms","timeoutMs","timeout"]),TE=240;od=class{streaks=new Map;check(e){let n=this.streaks.get(Fi(e));return n===void 0||n.count<nh?null:{count:n.count,tool:e.name,result:{content:`Repeat-failure guard: "${e.name}" has already failed ${n.count} times in a row with the same arguments, so this call was NOT executed again. The last failure was: ${n.lastError}
|
|
268
268
|
|
|
269
|
-
Retrying it verbatim will fail the same way. Fix the underlying cause, change the arguments, use a different tool, or stop and report the blocker.`,isError:!0,failureClass:"repeat-failure"}}}note(e,n){let r=Fi(e);if(n.isError!==!0){this.streaks.delete(r);return}let o=this.streaks.get(r);this.streaks.set(r,{count:(o?.count??0)+1,lastError:c2(n)})}streakFor(e){return this.streaks.get(Fi(e))?.count??0}}});async function Oo(t,e,n){let r=new Array(t.length),o=Math.min(Math.max(1,Math.floor(e)),t.length),s=0,i=[];for(let a=0;a<o;a++)i.push((async()=>{for(;s<t.length;){let c=s++;try{r[c]={status:"fulfilled",value:await n(t[c])}}catch(l){r[c]={status:"rejected",reason:l}}}})());return await Promise.all(i),r}var sd=h(()=>{"use strict";Nl()});function _E(t,e,n){if(n.has(t.name))return null;let r=e.check(t);return r===null?null:(D(`[repeat-failure-guard #723] refused ${r.tool} after ${r.count} identical failures`),r.result)}function l2(t){if(!t)return{enter:()=>{},leave:()=>{}};let e=new Set,n=()=>{try{t([...e])}catch{}};return{enter:r=>{e.add(r),n()},leave:r=>{e.delete(r),n()}}}async function d2(t,e,n,r){let{call:o,originalIndex:s}=e[t];if(o.signal.aborted)return{result:{content:"Tool call aborted",isError:!0,failureClass:Ne(o.signal)},originalIndex:s};r?.enter(o.id);try{return{result:await n(o),originalIndex:s}}finally{r?.leave(o.id)}}function u2(t,e,n,r){for(let o of t)if(o.status==="fulfilled")r[o.value.originalIndex]=o.value.result;else{let s=o.reason instanceof Error?o.reason.message:String(o.reason),i=e[t.indexOf(o)];r[n[i].originalIndex]={content:`Tool execution error: ${s}`,isError:!0}}}function EE(t,e,n){let r=t.indices.length;for(let o=0;o<t.indices.length;o++){let s=t.indices[o],i=n[e[s].originalIndex];i&&(i.batchIndex=o+1,i.batchSize=r)}}async function AE(t,e,n,r){let o=[...t.indices];for(;o.length>0;){let s=new Map,i=[],a=[];for(let u of o){let{call:p,originalIndex:f}=e[u],m=_E(p,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(m){n[f]=m;continue}if(r.repeatBreakerExemptTools.has(p.name)){i.push(u);continue}let g=Fi(p),y=nh-r.repeatFailureGuard.streakFor(p),b=s.get(g)??0;b<y?(s.set(g,b+1),i.push(u)):a.push(u)}o=a;let c=i.map(u=>e[u]?.call).filter(u=>u!==void 0&&u.name==="agent");if(c.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveStart(c,r.sessionId??"",null)}catch{}let l=l2(r.onActivity),d=await Oo(i,r.maxConcurrentSafeCalls,u=>d2(u,e,r.executeCore,l));u2(d,i,e,n);for(let u of i){let{call:p,originalIndex:f}=e[u],m=n[f];m!==void 0&&m.failureClass!=="abort"&&r.repeatFailureGuard.note(p,m)}if(c.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveEnd()}catch{}}}async function xE(t,e,n,r){for(let o of t.indices){let{call:s,originalIndex:i}=e[o];if(s.signal.aborted){n[i]={content:"Tool call aborted",isError:!0,failureClass:Ne(s.signal)};continue}let a=_E(s,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(a){n[i]=a;continue}let c=await r.executeCore(s);n[i]=c,r.repeatFailureGuard.note(s,c)}}var RE=h(()=>{"use strict";In();sd();ie();rh()});function IE(t){return t==="agent"||t==="cancel_background_job"||t==="send_message_to_agent"}async function CE(t,e){if(!t)return{result:{content:e.name==="agent"?"Agent tool is not available in this session configuration":"Background mode is not available in this session configuration",isError:!0}};try{return{result:e.name==="agent"?await t.execute(e):e.name==="send_message_to_agent"?await t.sendMessageToAgent(e):await t.cancelBackgroundJob(e)}}catch(n){let r=n instanceof Error?n.message:String(n);return{result:{content:`${e.name==="agent"?"Agent":e.name==="send_message_to_agent"?"Steering":"Background cancellation"} tool error: ${r}`,isError:!0},thrownMessage:r}}}var PE=h(()=>{"use strict"});var f2,oh,Kt,id=h(()=>{"use strict";Nl();ie();se();In();Hl();ql();Ig();Ht();Ml();J();Yg();hE();Di();th();rh();RE();PE();Yg();f2=8,oh=new Set,Kt=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;subagentId;sessionGrantManager;traceWriter;readOnlyBash;maxOutputBytes;spawnedPidRegistry;bashOutputTailReporter;repeatBreaker=null;repeatFailureGuard=new od;denialBreaker=null;suspectedLoopWindow=null;grantManager;constructor(e){this.handlers=e.handlers,this.schemas=e.schemas,this.hookRegistry=e.hookRegistry,this.permissions=e.permissions,this.canUseTool=e.canUseTool,this.subagentExecutor=e.subagentExecutor,this.skillExecutor=e.skillExecutor,this.composeExecutor=e.composeExecutor,this.classifier=e.concurrencyClassifier??Vg,this.maxConcurrentSafeCalls=typeof e.maxConcurrentSafeCalls=="number"&&Number.isFinite(e.maxConcurrentSafeCalls)&&e.maxConcurrentSafeCalls>=1?Math.floor(e.maxConcurrentSafeCalls):T_(),this.resolveBase=e.cwd,this._env=e.env,this.sessionId=e.sessionId,this.parentSessionId=e.parentSessionId,this.subagentId=e.subagentId,this.sessionGrantManager=e.sessionGrantManager,this.traceWriter=e.traceWriter,this.readOnlyBash=e.readOnlyBash===!0,this.maxOutputBytes=typeof e.maxOutputBytes=="number"&&Number.isFinite(e.maxOutputBytes)&&e.maxOutputBytes>0?e.maxOutputBytes:void 0,this._allowAll=e.allowAll===!0,this.spawnedPidRegistry=e.spawnedPidRegistry,this.bashOutputTailReporter=e.bashOutputTailReporter;let n=e.cwd?[e.cwd]:[];this._readRoots=e.readRoots??n.slice(),this._writeRoots=e.writeRoots??n.slice(),this.grantManager=new Rn({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,getProtectedRoot:()=>this.resolveBase,getAllowAll:()=>this._allowAll,getDefaultSessionId:()=>this.sessionId})}get handlerContext(){return{cwd:this.resolveBase,resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),...this._allowAll?{allowAll:!0}:{},...this._env!==void 0?{env:this._env}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.spawnedPidRegistry!==void 0?{spawnedPidRegistry:this.spawnedPidRegistry}:{}}}callHandlerContext(e){let n=this.bashOutputTailReporter!==void 0&&e.id?this.bashOutputTailReporter(e.id):void 0;return{...this.handlerContext,toolUseId:e.id,...this.traceWriter!==void 0?{traceWriter:this.traceWriter}:{},...n!==void 0?{onBashOutputTail:n}:{}}}addReadRoot(e,n="slash",r){this.grantManager.addReadRoot(e,n,r)}addWriteRoot(e,n="slash",r){this.grantManager.addWriteRoot(e,n,r)}revokeRoot(e,n="slash",r){this.grantManager.revokeRoot(e,n,r)}getGrants(){return this.grantManager.getGrants()}setAllowAll(e){this._allowAll=e}setResolveBase(e){let n=this.resolveBase;if(n!==e){if(this.resolveBase=e,n!==void 0){let r=this._readRoots.indexOf(n);r!==-1?this._readRoots[r]=e:this._readRoots.includes(e)||this._readRoots.push(e);let o=this._writeRoots.indexOf(n);o!==-1?this._writeRoots[o]=e:this._writeRoots.includes(e)||this._writeRoots.push(e)}else this._readRoots.includes(e)||this._readRoots.push(e),this._writeRoots.includes(e)||this._writeRoots.push(e);this.subagentExecutor?.setCwd(e),this.skillExecutor?.setCwd(e),this.composeExecutor?.setCwd(e)}}get toolDefs(){let e=this.subagentExecutor?.supportsBackgroundJobs?.()?this.schemas:this.schemas.filter(o=>o.name!=="cancel_background_job"&&o.name!=="send_message_to_agent"),n=this.permissions?.allowedTools;if(!n)return e;let r=new Set(n);return e.filter(o=>r.has(o.name))}denialReason(e,n){return this.isRegisteredTool(e)?n??`Tool "${e}" is not permitted`:this.unknownToolMessage(e)}isRegisteredTool(e){return this.handlers.has(e)||e==="agent"&&this.subagentExecutor!==void 0||e==="cancel_background_job"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||e==="send_message_to_agent"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||e==="skill"&&this.skillExecutor!==void 0||e==="compose"&&this.composeExecutor!==void 0}unknownToolMessage(e){let n=this.toolDefs.map(o=>o.name).join(", "),r=n.length>0?`Available tools: ${n}. Do NOT retry "${e}" or a variant of it; use one of the tools listed above.`:`Do NOT retry "${e}" or a variant of it.`;return`Unknown tool "${e}" \u2014 it does not exist in this session. ${r}`}async checkReadOnlyBash(e){if(!this.readOnlyBash||e.name!=="bash")return null;let n=e.input,r=typeof n=="object"&&n!==null?n.command:void 0;if(typeof r!="string")return null;let o=zl(r);if(!o.mutating)return null;let s=`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff/show/ls-remote, ls, cat, find, grep, gh pr view/diff). For a remote ref you have not fetched, \`gh pr diff <n>\`, \`gh pr view <n>\` and \`git ls-remote\` need no local ref \u2014 \`git fetch\` is blocked. Do NOT retry variants of a blocked command: if the task genuinely requires a mutation, stop and report that requirement to your caller instead.`;return await this.emitPreToolUseBlock(e.name,s),{content:s,isError:!0,failureClass:"permission-denied"}}async emitPreToolUseBlock(e,n){await dt(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:e,reason:n,...this.subagentId!==void 0?{subagentId:this.subagentId}:{}})}checkRepeatCircuitBreaker(e){if(oh.has(e.name))return null;let n=gE(e);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<f2?null:{content:`Loop circuit breaker: "${e.name}" has been called ${this.repeatBreaker.count} times in a row with byte-identical input. The result will not change. Stop repeating this call \u2014 reuse the previous result, change the input, try a different tool, or end the turn.`,isError:!0,circuitBreaker:!0}}checkRepeatFailureGuard(e){if(oh.has(e.name))return null;let n=this.repeatFailureGuard.check(e);return n===null?null:(D(`[repeat-failure-guard #723] refused ${n.tool} after ${n.count} identical failures`),n.result)}observeSuspectedLoop(e){if(this.parentSessionId===void 0)return;this.suspectedLoopWindow===null&&(this.suspectedLoopWindow=kE());let n=rd(e),r=vE(this.suspectedLoopWindow,n);r.fired&&q(this.traceWriter,{phase:"suspected_loop",metadata:{tool:e.name,count:r.count,windowSize:eh}})}recordForkReadDenial(e,n,r){if(this.parentSessionId===void 0||!yE.has(e.name)||!bE(n))return r;let o=this.denialBreaker??{count:0,deniedPaths:[]};o.count+=1;let s=wE(e);return o.deniedPaths.includes(s)||o.deniedPaths.push(s),this.denialBreaker=o,o.count<5?r:{content:SE(o.deniedPaths,o.count),isError:!0,failureClass:Mo}}resetDenialBreaker(){this.denialBreaker=null}async runCanUseTool(e){if(!this.canUseTool)return null;let n;try{n=await this.canUseTool(e.name,e.input??{},{signal:e.signal,toolUseID:e.id})}catch(r){let o=`Tool "${e.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`;return await this.emitPreToolUseBlock(e.name,o),{content:o,isError:!0,failureClass:"permission-denied"}}if(n.behavior==="deny"){let r=n.message||`Tool "${e.name}" denied by permission policy`;return await this.emitPreToolUseBlock(e.name,r),{content:r,isError:!0,failureClass:"permission-denied"}}return n.updatedInput!==void 0&&(e.input=n.updatedInput),null}async runPreDispatchGates(e){if(this.hookRegistry){let a={event:"PreToolUse",toolName:e.name,input:e.input,...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{},...e.id!==void 0?{toolUseId:e.id}:{}};try{await M_(this.hookRegistry,a,{signal:e.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(c){if(c instanceof ee)return this.recordForkReadDenial(e,c.reason,{content:`Tool "${e.name}" blocked by PreToolUse hook${c.reason?`: ${c.reason}`:""}${c.injectContext?`
|
|
269
|
+
Retrying it verbatim will fail the same way. Fix the underlying cause, change the arguments, use a different tool, or stop and report the blocker.`,isError:!0,failureClass:"repeat-failure"}}}note(e,n){let r=Fi(e);if(n.isError!==!0){this.streaks.delete(r);return}let o=this.streaks.get(r);this.streaks.set(r,{count:(o?.count??0)+1,lastError:c2(n)})}streakFor(e){return this.streaks.get(Fi(e))?.count??0}}});async function Oo(t,e,n){let r=new Array(t.length),o=Math.min(Math.max(1,Math.floor(e)),t.length),s=0,i=[];for(let a=0;a<o;a++)i.push((async()=>{for(;s<t.length;){let c=s++;try{r[c]={status:"fulfilled",value:await n(t[c])}}catch(l){r[c]={status:"rejected",reason:l}}}})());return await Promise.all(i),r}var sd=h(()=>{"use strict";Nl()});function _E(t,e,n){if(n.has(t.name))return null;let r=e.check(t);return r===null?null:(D(`[repeat-failure-guard #723] refused ${r.tool} after ${r.count} identical failures`),r.result)}function l2(t){if(!t)return{enter:()=>{},leave:()=>{}};let e=new Set,n=()=>{try{t([...e])}catch{}};return{enter:r=>{e.add(r),n()},leave:r=>{e.delete(r),n()}}}async function d2(t,e,n,r){let{call:o,originalIndex:s}=e[t];if(o.signal.aborted)return{result:{content:"Tool call aborted",isError:!0,failureClass:Ne(o.signal)},originalIndex:s};r?.enter(o.id);try{return{result:await n(o),originalIndex:s}}finally{r?.leave(o.id)}}function u2(t,e,n,r){for(let o of t)if(o.status==="fulfilled")r[o.value.originalIndex]=o.value.result;else{let s=o.reason instanceof Error?o.reason.message:String(o.reason),i=e[t.indexOf(o)];r[n[i].originalIndex]={content:`Tool execution error: ${s}`,isError:!0}}}function EE(t,e,n){let r=t.indices.length;for(let o=0;o<t.indices.length;o++){let s=t.indices[o],i=n[e[s].originalIndex];i&&(i.batchIndex=o+1,i.batchSize=r)}}async function AE(t,e,n,r){let o=[...t.indices];for(;o.length>0;){let s=new Map,i=[],a=[];for(let u of o){let{call:p,originalIndex:f}=e[u],m=_E(p,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(m){n[f]=m;continue}if(r.repeatBreakerExemptTools.has(p.name)){i.push(u);continue}let g=Fi(p),y=nh-r.repeatFailureGuard.streakFor(p),b=s.get(g)??0;b<y?(s.set(g,b+1),i.push(u)):a.push(u)}o=a;let c=i.map(u=>e[u]?.call).filter(u=>u!==void 0&&u.name==="agent");if(c.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveStart(c,r.sessionId??"",null)}catch{}let l=l2(r.onActivity),d=await Oo(i,r.maxConcurrentSafeCalls,u=>d2(u,e,r.executeCore,l));u2(d,i,e,n);for(let u of i){let{call:p,originalIndex:f}=e[u],m=n[f];m!==void 0&&m.failureClass!=="abort"&&r.repeatFailureGuard.note(p,m)}if(c.length>=2&&r.subagentExecutor)try{r.subagentExecutor.notifyWaveEnd()}catch{}}}async function xE(t,e,n,r){for(let o of t.indices){let{call:s,originalIndex:i}=e[o];if(s.signal.aborted){n[i]={content:"Tool call aborted",isError:!0,failureClass:Ne(s.signal)};continue}let a=_E(s,r.repeatFailureGuard,r.repeatBreakerExemptTools);if(a){n[i]=a;continue}let c=await r.executeCore(s);n[i]=c,r.repeatFailureGuard.note(s,c)}}var RE=h(()=>{"use strict";In();sd();ie();rh()});function IE(t){return t==="agent"||t==="cancel_background_job"||t==="send_message_to_agent"}async function CE(t,e){if(!t)return{result:{content:e.name==="agent"?"Agent tool is not available in this session configuration":"Background mode is not available in this session configuration",isError:!0}};try{return{result:e.name==="agent"?await t.execute(e):e.name==="send_message_to_agent"?await t.sendMessageToAgent(e):await t.cancelBackgroundJob(e)}}catch(n){let r=n instanceof Error?n.message:String(n);return{result:{content:`${e.name==="agent"?"Agent":e.name==="send_message_to_agent"?"Steering":"Background cancellation"} tool error: ${r}`,isError:!0},thrownMessage:r}}}var PE=h(()=>{"use strict"});var f2,oh,Kt,id=h(()=>{"use strict";Nl();ie();se();In();Hl();ql();Ig();Ht();Ml();J();Yg();hE();Di();th();rh();RE();PE();Yg();f2=8,oh=new Set,Kt=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;subagentId;sessionGrantManager;traceWriter;readOnlyBash;maxOutputBytes;spawnedPidRegistry;bashOutputTailReporter;repeatBreaker=null;repeatFailureGuard=new od;denialBreaker=null;suspectedLoopWindow=null;grantManager;constructor(e){this.handlers=e.handlers,this.schemas=e.schemas,this.hookRegistry=e.hookRegistry,this.permissions=e.permissions,this.canUseTool=e.canUseTool,this.subagentExecutor=e.subagentExecutor,this.skillExecutor=e.skillExecutor,this.composeExecutor=e.composeExecutor,this.classifier=e.concurrencyClassifier??Vg,this.maxConcurrentSafeCalls=typeof e.maxConcurrentSafeCalls=="number"&&Number.isFinite(e.maxConcurrentSafeCalls)&&e.maxConcurrentSafeCalls>=1?Math.floor(e.maxConcurrentSafeCalls):T_(),this.resolveBase=e.cwd,this._env=e.env,this.sessionId=e.sessionId,this.parentSessionId=e.parentSessionId,this.subagentId=e.subagentId,this.sessionGrantManager=e.sessionGrantManager,this.traceWriter=e.traceWriter,this.readOnlyBash=e.readOnlyBash===!0,this.maxOutputBytes=typeof e.maxOutputBytes=="number"&&Number.isFinite(e.maxOutputBytes)&&e.maxOutputBytes>0?e.maxOutputBytes:void 0,this._allowAll=e.allowAll===!0,this.spawnedPidRegistry=e.spawnedPidRegistry,this.bashOutputTailReporter=e.bashOutputTailReporter;let n=e.cwd?[e.cwd]:[];this._readRoots=e.readRoots??n.slice(),this._writeRoots=e.writeRoots??n.slice(),this.grantManager=new Rn({getReadRoots:()=>this._readRoots,getWriteRoots:()=>this._writeRoots,getProtectedRoot:()=>this.resolveBase,getAllowAll:()=>this._allowAll,getDefaultSessionId:()=>this.sessionId})}get handlerContext(){return{cwd:this.resolveBase,resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),...this._allowAll?{allowAll:!0}:{},...this._env!==void 0?{env:this._env}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.spawnedPidRegistry!==void 0?{spawnedPidRegistry:this.spawnedPidRegistry}:{}}}callHandlerContext(e){let n=e.name==="bash"&&this.bashOutputTailReporter!==void 0&&e.id?this.bashOutputTailReporter(e.id):void 0;return{...this.handlerContext,toolUseId:e.id,...this.traceWriter!==void 0?{traceWriter:this.traceWriter}:{},...n!==void 0?{onBashOutputTail:n}:{}}}addReadRoot(e,n="slash",r){this.grantManager.addReadRoot(e,n,r)}addWriteRoot(e,n="slash",r){this.grantManager.addWriteRoot(e,n,r)}revokeRoot(e,n="slash",r){this.grantManager.revokeRoot(e,n,r)}getGrants(){return this.grantManager.getGrants()}setAllowAll(e){this._allowAll=e}setResolveBase(e){let n=this.resolveBase;if(n!==e){if(this.resolveBase=e,n!==void 0){let r=this._readRoots.indexOf(n);r!==-1?this._readRoots[r]=e:this._readRoots.includes(e)||this._readRoots.push(e);let o=this._writeRoots.indexOf(n);o!==-1?this._writeRoots[o]=e:this._writeRoots.includes(e)||this._writeRoots.push(e)}else this._readRoots.includes(e)||this._readRoots.push(e),this._writeRoots.includes(e)||this._writeRoots.push(e);this.subagentExecutor?.setCwd(e),this.skillExecutor?.setCwd(e),this.composeExecutor?.setCwd(e)}}get toolDefs(){let e=this.subagentExecutor?.supportsBackgroundJobs?.()?this.schemas:this.schemas.filter(o=>o.name!=="cancel_background_job"&&o.name!=="send_message_to_agent"),n=this.permissions?.allowedTools;if(!n)return e;let r=new Set(n);return e.filter(o=>r.has(o.name))}denialReason(e,n){return this.isRegisteredTool(e)?n??`Tool "${e}" is not permitted`:this.unknownToolMessage(e)}isRegisteredTool(e){return this.handlers.has(e)||e==="agent"&&this.subagentExecutor!==void 0||e==="cancel_background_job"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||e==="send_message_to_agent"&&this.subagentExecutor?.supportsBackgroundJobs?.()===!0||e==="skill"&&this.skillExecutor!==void 0||e==="compose"&&this.composeExecutor!==void 0}unknownToolMessage(e){let n=this.toolDefs.map(o=>o.name).join(", "),r=n.length>0?`Available tools: ${n}. Do NOT retry "${e}" or a variant of it; use one of the tools listed above.`:`Do NOT retry "${e}" or a variant of it.`;return`Unknown tool "${e}" \u2014 it does not exist in this session. ${r}`}async checkReadOnlyBash(e){if(!this.readOnlyBash||e.name!=="bash")return null;let n=e.input,r=typeof n=="object"&&n!==null?n.command:void 0;if(typeof r!="string")return null;let o=zl(r);if(!o.mutating)return null;let s=`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff/show/ls-remote, ls, cat, find, grep, gh pr view/diff). For a remote ref you have not fetched, \`gh pr diff <n>\`, \`gh pr view <n>\` and \`git ls-remote\` need no local ref \u2014 \`git fetch\` is blocked. Do NOT retry variants of a blocked command: if the task genuinely requires a mutation, stop and report that requirement to your caller instead.`;return await this.emitPreToolUseBlock(e.name,s),{content:s,isError:!0,failureClass:"permission-denied"}}async emitPreToolUseBlock(e,n){await dt(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:e,reason:n,...this.subagentId!==void 0?{subagentId:this.subagentId}:{}})}checkRepeatCircuitBreaker(e){if(oh.has(e.name))return null;let n=gE(e);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<f2?null:{content:`Loop circuit breaker: "${e.name}" has been called ${this.repeatBreaker.count} times in a row with byte-identical input. The result will not change. Stop repeating this call \u2014 reuse the previous result, change the input, try a different tool, or end the turn.`,isError:!0,circuitBreaker:!0}}checkRepeatFailureGuard(e){if(oh.has(e.name))return null;let n=this.repeatFailureGuard.check(e);return n===null?null:(D(`[repeat-failure-guard #723] refused ${n.tool} after ${n.count} identical failures`),n.result)}observeSuspectedLoop(e){if(this.parentSessionId===void 0)return;this.suspectedLoopWindow===null&&(this.suspectedLoopWindow=kE());let n=rd(e),r=vE(this.suspectedLoopWindow,n);r.fired&&q(this.traceWriter,{phase:"suspected_loop",metadata:{tool:e.name,count:r.count,windowSize:eh}})}recordForkReadDenial(e,n,r){if(this.parentSessionId===void 0||!yE.has(e.name)||!bE(n))return r;let o=this.denialBreaker??{count:0,deniedPaths:[]};o.count+=1;let s=wE(e);return o.deniedPaths.includes(s)||o.deniedPaths.push(s),this.denialBreaker=o,o.count<5?r:{content:SE(o.deniedPaths,o.count),isError:!0,failureClass:Mo}}resetDenialBreaker(){this.denialBreaker=null}async runCanUseTool(e){if(!this.canUseTool)return null;let n;try{n=await this.canUseTool(e.name,e.input??{},{signal:e.signal,toolUseID:e.id})}catch(r){let o=`Tool "${e.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`;return await this.emitPreToolUseBlock(e.name,o),{content:o,isError:!0,failureClass:"permission-denied"}}if(n.behavior==="deny"){let r=n.message||`Tool "${e.name}" denied by permission policy`;return await this.emitPreToolUseBlock(e.name,r),{content:r,isError:!0,failureClass:"permission-denied"}}return n.updatedInput!==void 0&&(e.input=n.updatedInput),null}async runPreDispatchGates(e){if(this.hookRegistry){let a={event:"PreToolUse",toolName:e.name,input:e.input,...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.resolveBase!==void 0?{cwd:this.resolveBase}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager!==void 0?{grantManager:this.sessionGrantManager}:{},...e.id!==void 0?{toolUseId:e.id}:{}};try{await M_(this.hookRegistry,a,{signal:e.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(c){if(c instanceof ee)return this.recordForkReadDenial(e,c.reason,{content:`Tool "${e.name}" blocked by PreToolUse hook${c.reason?`: ${c.reason}`:""}${c.injectContext?`
|
|
270
270
|
|
|
271
271
|
${c.injectContext}`:""}`,isError:!0,failureClass:"hook-block"});throw c}}let n=F_(e.name,this.permissions);if(!n.allowed){let a=this.denialReason(e.name,n.reason);return await this.emitPreToolUseBlock(e.name,a),{content:a,isError:!0,failureClass:"permission-denied"}}let r=await this.runCanUseTool(e);if(r)return r;let o=await this.checkReadOnlyBash(e);if(o)return o;let s=this.checkRepeatCircuitBreaker(e);if(s)return s;let i=this.checkRepeatFailureGuard(e);return i||(this.observeSuspectedLoop(e),null)}async execute(e){if(e.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:Ne(e.signal)};let n=await this.runPreDispatchGates(e);if(n)return n;let r=await this.executeCore(e);return this.repeatFailureGuard.note(e,r),r.isError!==!0&&this.resetDenialBreaker(),r}async executeBatch(e,n){if(e.length===0)return[];if(e.length===1)return[await this.execute(e[0])];let r=new Array(e.length),o=new Set;for(let c=0;c<e.length;c++){let l=e[c];if(l.signal.aborted){r[c]={content:"Tool call aborted",isError:!0,failureClass:Ne(l.signal)},o.add(c);continue}let d=await this.runPreDispatchGates(l);if(d){r[c]=d,o.add(c);continue}}let s=e.map((c,l)=>({call:c,originalIndex:l})).filter((c,l)=>!o.has(l));if(s.length===0)return r;let i=mE(s.map(c=>c.call),this.classifier),a={repeatFailureGuard:this.repeatFailureGuard,repeatBreakerExemptTools:oh,executeCore:c=>this.executeCore(c),subagentExecutor:this.subagentExecutor,sessionId:this.sessionId,maxConcurrentSafeCalls:this.maxConcurrentSafeCalls,onActivity:n};for(let c of i)c.isConcurrencySafe?await AE(c,s,r,a):await xE(c,s,r,a),EE(c,s,r);return r.some(c=>c!==void 0&&c.isError!==!0)&&this.resetDenialBreaker(),r}async executeCore(e){let n=await this.executeCoreInner(e);return this.applyOutputCap(n)}applyOutputCap(e){let n=this.maxOutputBytes;if(n===void 0)return e;let r=Buffer.byteLength(e.content,"utf8");return r<=n||(e.content=Et(e.content,n),e.truncated=!0,D(`[output-cap #661] fork tool result capped: original=${r}B capped=${Buffer.byteLength(e.content,"utf8")}B (cap=${n}B)`)),e}async executeCoreInner(e){if(IE(e.name)){let i=await CE(this.subagentExecutor,e);return i.thrownMessage!==void 0?this.firePostToolUseFailure(e.name,i.thrownMessage,e.signal,e.input):this.firePostToolUse(e.name,i.result.content,e.signal,e.input,i.result),i.result}if(e.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let i,a=!1,c="";try{i=await this.skillExecutor.execute(e)}catch(l){a=!0,c=l instanceof Error?l.message:String(l),i={content:`Skill tool error: ${c}`,isError:!0}}return a?this.firePostToolUseFailure(e.name,c,e.signal,e.input):this.firePostToolUse(e.name,i.content,e.signal,e.input,i),i}if(e.name==="compose"){let i=await this.executeCompose(e);return this.firePostToolUse(e.name,i.content,e.signal,e.input,i),i}let n=this.handlers.get(e.name);if(!n){let i=this.unknownToolMessage(e.name);return await this.emitPreToolUseBlock(e.name,i),{content:i,isError:!0,failureClass:"permission-denied"}}let r,o=!1,s="";try{r=await n(e.input,e.signal,this.callHandlerContext(e))}catch(i){o=!0,s=i instanceof Error?i.message:String(i),r={content:`Tool execution error: ${s}`,isError:!0}}return o?this.firePostToolUseFailure(e.name,s,e.signal,e.input):this.firePostToolUse(e.name,r.content,e.signal,e.input,r),r}async executeCompose(e){if(!this.composeExecutor)return{content:"Compose tool is not available in this session configuration",isError:!0};try{return await this.composeExecutor.execute(e)}catch(n){return{content:`Compose tool error: ${n instanceof Error?n.message:String(n)}`,isError:!0}}}firePostToolUse(e,n,r,o,s){if(!this.hookRegistry)return;let i={event:"PostToolUse",toolName:e,output:n,...o!==void 0?{input:o}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{},...this.sessionGrantManager?{grantManager:this.sessionGrantManager}:{},...s?.isError===!0?{isError:!0}:{},...s?.incomplete===!0?{incomplete:!0,...s.incompleteReason?{incompleteReason:s.incompleteReason}:{}}:{}};O_(this.hookRegistry,i,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(()=>{})}firePostToolUseFailure(e,n,r,o){if(!this.hookRegistry)return;let s={event:"PostToolUseFailure",toolName:e,error:n,...o!==void 0?{input:o}:{},...this.sessionId!==void 0?{sessionId:this.sessionId}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};D_(this.hookRegistry,s,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(i=>{D(`firePostToolUseFailure outer catch (tool=${e}): ${String(i)}`)})}}});import{mkdir as m2,writeFile as g2}from"fs/promises";import{dirname as h2,join as y2}from"path";function b2(){return y2(vt(),"routing-decisions.jsonl")}function w2(t){let e={surface:"afk"};for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}async function ne(t){if(!(k.VITEST||k.NODE_ENV==="test"))try{let e=b2();await m2(h2(e),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r=JSON.stringify({ts:n,...w2(t)})+`
|
|
272
|
-
`;await g2(e,r,{flag:"a"})}catch{}}var Rt=h(()=>{"use strict";N();j()});function C2(t){let e=t.match(S2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10),o=e[3]!==void 0?parseInt(e[3],10):void 0;return{runner:"vitest",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function P2(t){let e=t.match(k2);if(!e)return null;let n=parseInt(e[1]??"0",10);return{runner:"jest",passed:parseInt(e[2]??"0",10),failed:n}}function M2(t){let e=t.match(v2);if(!e)return null;if(e[2]!==void 0){let n=parseInt(e[2],10),r=parseInt(e[1]??"0",10);return{runner:"pytest",passed:n,failed:r}}return e[4]!==void 0?{runner:"pytest",passed:parseInt(e[4],10),failed:0}:null}function O2(t){let e=t.match(T2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=t.match(_2),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function D2(t){let e=[...t.matchAll(E2)];if(e.length===0)return null;let n=0,r=0;for(let o of e)o[1]==="ok"?n++:o[1]==="FAIL"&&r++;return{runner:"go-test",passed:n,failed:r}}function F2(t){let e=t.match(A2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10),o=e[3]!==void 0?parseInt(e[3],10):void 0;return{runner:"cargo",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function L2(t){let e=t.match(x2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10);return{runner:"rspec",passed:n-r,failed:r}}function N2(t){let e=t.match(R2);if(e)return{runner:"phpunit",passed:parseInt(e[1]??"0",10),failed:0};let n=t.match(I2);if(n){let r=parseInt(n[1]??"0",10),o=parseInt(n[2]??"0",10);return{runner:"phpunit",passed:r-o,failed:o}}return null}function Li(t){return C2(t)??P2(t)??M2(t)??O2(t)??D2(t)??F2(t)??L2(t)??N2(t)??null}var S2,k2,v2,T2,_2,E2,A2,x2,R2,I2,sh=h(()=>{"use strict";S2=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,k2=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,v2=/={3,}\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed(?:,\s*(\d+)\s+warning)?.*in\s+[\d.]+s\s*={3,}|={3,}\s*(\d+)\s+passed.*in\s+[\d.]+s\s*={3,}/,T2=/(\d+)\s+passing/,_2=/(\d+)\s+failing/,E2=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,A2=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,x2=/(\d+) examples?, (\d+) failures?/,R2=/OK \((\d+) tests?/,I2=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});import{statSync as $2}from"node:fs";function Ni(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.code==="ENOENT"&&typeof e.syscall=="string"&&e.syscall.startsWith("spawn")}function U2(t){if(t===void 0)return!1;try{return $2(t),!1}catch{return!0}}function Do(t,e){let n=t instanceof Error?t.message:typeof t?.message=="string"?String(t.message):String(t);return Ni(t)&&U2(e)?`working directory does not exist: ${e} (deleted worktree?) \u2014 underlying: ${n}`:n}var ih=h(()=>{"use strict"});function qt(t){let e=t instanceof Error?t.message:String(t);ME.has(e)||(ME.add(e),console.warn(`[afk-home] Malformed AFK home/state env var ignored while deriving the credential floor: ${e}. The relocated tree is NOT protected \u2014 the default ~/.afk entries still apply. Fix the env var to restore coverage.`))}var ME,$i=h(()=>{"use strict";ME=new Set});import{statSync as ch}from"node:fs";import{homedir as B2}from"node:os";import{basename as j2,dirname as DE,join as H2}from"node:path";function FE(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function W2(t){let e=j2(t),n=e===e.toLowerCase()?e.toUpperCase():e.toLowerCase();if(n===e)return;let r;try{r=ch(t)}catch{return}let o=ah.get(r.dev);if(o!==void 0)return o;try{let s=ch(H2(DE(t),n)),i=r.dev===s.dev&&r.ino===s.ino;return ah.set(r.dev,i),i}catch(s){let i=FE(s);return i==="ENOENT"||i==="ENOTDIR"?(ah.set(r.dev,!1),!1):void 0}}function LE(t=B2()){if(OE!==void 0)return OE;let e=t;for(;;)try{return ch(e),W2(e)??!0}catch(n){let r=FE(n);if(r!=="ENOENT"&&r!=="ENOTDIR")return!0;let o=DE(e);if(o===e)return!0;e=o}}function Fo(t,e,n=e){if(t===e||t.startsWith(e+"/")||t.startsWith(e+"\\"))return!0;if(!LE(n))return!1;let r=t.toLowerCase(),o=e.toLowerCase();return r===o||r.startsWith(o+"/")||r.startsWith(o+"\\")}function ad(t,e){return t.includes(e)?!0:LE(e)?t.toLowerCase().includes(e.toLowerCase()):!1}var OE,ah,cd=h(()=>{"use strict";ah=new Map});import{realpathSync as NE}from"fs";import{dirname as K2,resolve as Ar,join as dd}from"path";import{homedir as pt}from"os";function G2(){let t=[];try{let e=oe();t.push(Ar(dd(e,"config"))),t.push(Ar(dd(e,"state")))}catch(e){qt(e)}try{t.push(Ar(te()))}catch(e){qt(e)}return t}function lh(){let t=`${k.AFK_WRITE_DENYLIST??""}\0${k.AFK_HOME??""}\0${k.AFK_STATE_DIR??""}`;if(!ld||ld.key!==t){let e=k.AFK_WRITE_DENYLIST,n=process.platform==="win32"?";":":",r=e?e.split(n).map(o=>o.trim()).filter(Boolean).map(o=>o==="~"||o.startsWith("~/")||o.startsWith("~\\")?dd(pt(),o.slice(2)):o).map(o=>Ar(o)).filter(Boolean):[];ld={key:t,unresolved:[...new Set([...q2.map(o=>Ar(o)),...G2()]),...r]}}return[...new Set(ld.unresolved.map(e=>Be(e)))]}function Be(t){let e=Ar(t);try{return NE(e)}catch{}let n=[],r=e;for(let o=0;o<64;o++){let s=K2(r);if(s===r)break;n.unshift(r.slice(s.length+1)),r=s;try{let i=NE(r);return dd(i,...n)}catch{}}return e}function Lo(t,e="write_file"){let n=Be(Ar(t));for(let r of lh())if(Fo(n,r))throw new Error(`${e}: refusing to write to protected path: ${n} (matches denylist entry: ${r})`)}var q2,ld,xr=h(()=>{"use strict";N();j();$i();cd();q2=[`${pt()}/.ssh`,`${pt()}/.aws`,`${pt()}/.gnupg`,`${pt()}/.config/gcloud`,"/etc","/System","/private/etc","/usr/local/etc",`${pt()}/.afk/config`,`${pt()}/.afk/state`,`${pt()}/.npmrc`,`${pt()}/.docker/config.json`,`${pt()}/Library/LaunchAgents`,`${pt()}/Library/LaunchDaemons`,"/Library/LaunchAgents","/Library/LaunchDaemons",`${pt()}/.config/systemd`,...process.platform==="win32"&&k.APPDATA?[`${k.APPDATA}\\gcloud`,`${k.APPDATA}\\Docker`]:[],...process.platform==="win32"&&k.USERPROFILE?[`${k.USERPROFILE}\\.ssh`,`${k.USERPROFILE}\\.aws`,`${k.USERPROFILE}\\.gnupg`]:[]]});import{isAbsolute as X2,relative as z2,sep as J2}from"node:path";import{homedir as ud}from"node:os";function V2(t,e){let n=z2(e,t);return n===""||n!==".."&&!n.startsWith(`..${J2}`)&&!X2(n)}function dh(t,e){return t.filter(n=>!e.some(r=>V2(n,r)))}function Y2(t,e){return t.filter(({source:n})=>n!==e).map(({root:n})=>n)}function $E(t,e){return t.flatMap(({rel:n,resolved:r})=>dh([r],Y2(e,Q2[n])))}var Q2,UE=h(()=>{"use strict";Q2={".afk/config/mcp.json":`${ud()}/.afk/config`,".afk/config/schedules.json":`${ud()}/.afk/config`,".ssh/config":`${ud()}/.ssh`,".ssh/known_hosts":`${ud()}/.ssh`}});import{isAbsolute as wfe,resolve as Z2}from"path";import{homedir as BE}from"os";function No(t){return t==="~"?BE():t.startsWith("~/")?Z2(BE(),t.slice(2)):t}var uh=h(()=>{"use strict"});import{basename as eX,dirname as tX,join as pd,relative as nX,resolve as $o,sep as Ui}from"path";import{homedir as pe}from"os";function HE(t){let e=$o(t);return pd(Be(tX(e)),eX(e))}function fh(t){if(!t)return[];let e=process.platform==="win32"?";":":";return t.split(e).map(n=>n.trim()).filter(Boolean).map(n=>n==="~"||n.startsWith("~/")||n.startsWith("~\\")?No(n.replace(/^~[/\\]+/,"~/")):n).map(n=>$o(n))}function oX(){try{return[Be($o(pd(oe(),"config")))]}catch(t){return qt(t),[]}}function sX(){try{let t=oe();return Rr.filter(e=>e.startsWith(jE)).map(e=>HE(pd(t,e.slice(jE.length))))}catch(t){return qt(t),[]}}function WE(){let t=`${k.AFK_READ_DENYLIST??""}\0${k.AFK_HOME??""}`;if(Bi&&Bi.key===t)return Bi;let e=fh(k.AFK_READ_DENYLIST).map(i=>Be(i)).filter(Boolean),n=ph.map(i=>({source:i,root:Be($o(i))})),r=oX(),o=[...new Set([...n.map(({root:i})=>i),...r])],s=n.filter(({source:i,root:a})=>i!==rX||!r.includes(a)).map(({root:i})=>i);return Bi={key:t,builtins:o,extras:e,allow:[...new Set([...$E(Rr.map(i=>({rel:i,resolved:HE(`${pe()}/${i}`)})),n),...dh(sX(),s)])]},Bi}function mh(){let{builtins:t,extras:e}=WE();return[...t,...e]}function KE(t){let e=Be($o(t));return mh().filter(n=>n!==e&&Fo(n,e,n)).map(n=>(n.startsWith(e+Ui)?nX(e,n):n.split(Ui).slice(e.split(Ui).length).join(Ui)).split(Ui).join("/"))}function ft(t){let e=Be($o(t)),{builtins:n,extras:r,allow:o}=WE();for(let s of r)if(Fo(e,s))return{denied:!0,matched:s};if(o.includes(e))return{denied:!1};for(let s of n)if(Fo(e,s))return{denied:!0,matched:s};return{denied:!1}}var ph,Rr,rX,Pfe,Bi,jE,Uo,fd,Cn=h(()=>{"use strict";N();xr();j();$i();UE();cd();uh();ph=[`${pe()}/.ssh`,`${pe()}/.aws`,`${pe()}/.gnupg`,`${pe()}/.config/gcloud`,`${pe()}/.afk/config`,`${pe()}/.npmrc`,`${pe()}/.docker/config.json`,`${pe()}/.git-credentials`,`${pe()}/.netrc`,`${pe()}/.config/gh/hosts.yml`,`${pe()}/.kube/config`,"/etc/shadow","/etc/sudoers","/private/etc/master.passwd",`${pe()}/.password-store`,`${pe()}/Library/Application Support/Google/Chrome`,`${pe()}/Library/Application Support/Chromium`,`${pe()}/Library/Application Support/BraveSoftware`,`${pe()}/Library/Application Support/Microsoft Edge`,`${pe()}/Library/Application Support/Arc`,`${pe()}/Library/Application Support/Firefox`,...process.platform==="win32"&&k.USERPROFILE?[`${k.USERPROFILE}\\.ssh`,`${k.USERPROFILE}\\.aws`,`${k.USERPROFILE}\\.gnupg`]:[],...process.platform==="win32"&&k.APPDATA?[`${k.APPDATA}\\gcloud`,`${k.APPDATA}\\Docker`,`${k.APPDATA}\\Mozilla\\Firefox`]:[],...process.platform==="win32"&&k.LOCALAPPDATA?[`${k.LOCALAPPDATA}\\Google\\Chrome`,`${k.LOCALAPPDATA}\\Chromium`,`${k.LOCALAPPDATA}\\BraveSoftware`,`${k.LOCALAPPDATA}\\Microsoft\\Edge`]:[]],Rr=[".afk/config/mcp.json",".afk/config/schedules.json",".ssh/config",".ssh/known_hosts"],rX=`${pe()}/.afk/config`,Pfe=Rr.map(t=>pd(pe(),t));jE=".afk/";Uo="read-denylist entry:",fd="is a protected credential/secret path"});import Ir from"path";import{realpathSync as iX}from"fs";function je(t){try{return iX.native(t)}catch{let e=Ir.dirname(t),n=Ir.basename(t);return e===t?t:Ir.join(je(e),n)}}function aX(t){let e=qE.get(t);if(e!==void 0)return e;let n=je(t);return qE.set(t,n),n}function GE(t,e,n,r){let o=e?.resolveBase??e?.cwd??r,s=Ir.isAbsolute(t)?t:Ir.resolve(o??process.cwd(),t);if(e?.allowAll===!0)return{restricted:!1,resolved:s,roots:[]};if(o===void 0)return{restricted:!1,resolved:s,roots:[]};let i=je(s),a=n==="read"?e?.readRoots??[o]:e?.writeRoots??[o];for(let c of a){let l=aX(c),d=Ir.relative(l,i);if(!d.startsWith("..")&&!Ir.isAbsolute(d))return{restricted:!1,resolved:s,roots:a}}return{restricted:!0,resolved:s,roots:a}}function de(t,e,n="read",r){let{restricted:o,resolved:s,roots:i}=GE(t,e,n,r);if(n==="read"){let a=ft(s);if(a.denied)throw new Error(`Path \`${t}\` ${fd} (${Uo} \`${a.matched}\`) and cannot be read.`)}if(o){let a=i.map(l=>`\`${l}\``).join(", "),c=n==="read"?"read roots":"write roots";throw new Error(`Path \`${t}\` is outside the allowed ${c} [${a}].`)}return s}function ji(t,e,n="read",r){return GE(t,e,n,r)}function XE(t){let e=new Set,n=[];for(let r of t.split(/\s+/)){if(r.length===0)continue;let o=r.replace(/^\d*[<>|&]+/,"").replace(/^['"]/,"").replace(/['";,)]+$/,"");if(o.length===0)continue;let s=o.startsWith("/"),i=o==="~"||o.startsWith("~/");!s&&!i||e.has(o)||(e.add(o),n.push(o))}return n}var qE,Ae=h(()=>{"use strict";Cn();qE=new Map});import{execFileSync as cX}from"node:child_process";function cn(t,e="SIGKILL"){if(!(t<=0))try{process.platform==="win32"?cX("taskkill",["/F","/T","/PID",String(t)],{stdio:"ignore",timeout:5e3}):process.kill(-t,e)}catch{}}var md=h(()=>{"use strict"});import{mkdirSync as lX,openSync as dX,writeSync as uX,closeSync as pX}from"fs";function gh(t,e,n){try{let r=Am(t);if(r===void 0)return;lX(r,{recursive:!0,mode:448});let o=e.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,128)||"capture",s=`${r}/${o}.txt`,i=Buffer.from(n,"utf8"),a=i.length<=zE?i:i.subarray(0,zE),c=dX(s,"wx",384);try{uX(c,a)}finally{pX(c)}return s}catch{return}}var zE,JE=h(()=>{"use strict";j();zE=8e6});var fX,mX,gd,VE=h(()=>{"use strict";et();fX=5,mX=300,gd=class{constructor(e,n=fX,r=mX){this.onChange=e;this.maxLines=n;this.throttleMs=r}onChange;maxLines;throttleMs;lines=[];lastNotifiedAt=0;pendingFlush;cleared=!1;push(e){if(this.cleared||e.length===0)return;let n=e.split(`
|
|
273
|
-
`);for(let r=0;r<n.length;r++){let s=n[r].split("\r"),i=s[s.length-1];if(r===0)if(this.lines.length===0)this.lines.push(i);else{let a=this.lines[this.lines.length-1];this.lines[this.lines.length-1]=s.length>1?i:a+i}else{if(this.lines.length>0){let a=Y(this.lines[this.lines.length-1]);a.length>0?this.lines[this.lines.length-1]=a:this.lines.pop()}i.length>0
|
|
274
|
-
`)||void 0}clear(){this.cleared||(this.cleared=!0,this.lines=[],this.pendingFlush!==void 0&&(clearTimeout(this.pendingFlush),this.pendingFlush=void 0),this.onChange(void 0))}scheduleNotify(){let e=Date.now(),n=e-this.lastNotifiedAt;if(n>=this.throttleMs)this.lastNotifiedAt=e,this.pendingFlush!==void 0&&(clearTimeout(this.pendingFlush),this.pendingFlush=void 0),this.fireNotify();else if(this.pendingFlush===void 0){let r=this.throttleMs-n;this.pendingFlush=setTimeout(()=>{this.pendingFlush=void 0,!this.cleared&&(this.lastNotifiedAt=Date.now(),this.fireNotify())},r),typeof this.pendingFlush=="object"&&"unref"in this.pendingFlush&&this.pendingFlush.unref()}}fireNotify(){let e=this.peek()
|
|
272
|
+
`;await g2(e,r,{flag:"a"})}catch{}}var Rt=h(()=>{"use strict";N();j()});function C2(t){let e=t.match(S2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10),o=e[3]!==void 0?parseInt(e[3],10):void 0;return{runner:"vitest",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function P2(t){let e=t.match(k2);if(!e)return null;let n=parseInt(e[1]??"0",10);return{runner:"jest",passed:parseInt(e[2]??"0",10),failed:n}}function M2(t){let e=t.match(v2);if(!e)return null;if(e[2]!==void 0){let n=parseInt(e[2],10),r=parseInt(e[1]??"0",10);return{runner:"pytest",passed:n,failed:r}}return e[4]!==void 0?{runner:"pytest",passed:parseInt(e[4],10),failed:0}:null}function O2(t){let e=t.match(T2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=t.match(_2),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function D2(t){let e=[...t.matchAll(E2)];if(e.length===0)return null;let n=0,r=0;for(let o of e)o[1]==="ok"?n++:o[1]==="FAIL"&&r++;return{runner:"go-test",passed:n,failed:r}}function F2(t){let e=t.match(A2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10),o=e[3]!==void 0?parseInt(e[3],10):void 0;return{runner:"cargo",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function L2(t){let e=t.match(x2);if(!e)return null;let n=parseInt(e[1]??"0",10),r=parseInt(e[2]??"0",10);return{runner:"rspec",passed:n-r,failed:r}}function N2(t){let e=t.match(R2);if(e)return{runner:"phpunit",passed:parseInt(e[1]??"0",10),failed:0};let n=t.match(I2);if(n){let r=parseInt(n[1]??"0",10),o=parseInt(n[2]??"0",10);return{runner:"phpunit",passed:r-o,failed:o}}return null}function Li(t){return C2(t)??P2(t)??M2(t)??O2(t)??D2(t)??F2(t)??L2(t)??N2(t)??null}var S2,k2,v2,T2,_2,E2,A2,x2,R2,I2,sh=h(()=>{"use strict";S2=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,k2=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,v2=/={3,}\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed(?:,\s*(\d+)\s+warning)?.*in\s+[\d.]+s\s*={3,}|={3,}\s*(\d+)\s+passed.*in\s+[\d.]+s\s*={3,}/,T2=/(\d+)\s+passing/,_2=/(\d+)\s+failing/,E2=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,A2=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,x2=/(\d+) examples?, (\d+) failures?/,R2=/OK \((\d+) tests?/,I2=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});import{statSync as $2}from"node:fs";function Ni(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.code==="ENOENT"&&typeof e.syscall=="string"&&e.syscall.startsWith("spawn")}function U2(t){if(t===void 0)return!1;try{return $2(t),!1}catch{return!0}}function Do(t,e){let n=t instanceof Error?t.message:typeof t?.message=="string"?String(t.message):String(t);return Ni(t)&&U2(e)?`working directory does not exist: ${e} (deleted worktree?) \u2014 underlying: ${n}`:n}var ih=h(()=>{"use strict"});function qt(t){let e=t instanceof Error?t.message:String(t);ME.has(e)||(ME.add(e),console.warn(`[afk-home] Malformed AFK home/state env var ignored while deriving the credential floor: ${e}. The relocated tree is NOT protected \u2014 the default ~/.afk entries still apply. Fix the env var to restore coverage.`))}var ME,$i=h(()=>{"use strict";ME=new Set});import{statSync as ch}from"node:fs";import{homedir as B2}from"node:os";import{basename as j2,dirname as DE,join as H2}from"node:path";function FE(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function W2(t){let e=j2(t),n=e===e.toLowerCase()?e.toUpperCase():e.toLowerCase();if(n===e)return;let r;try{r=ch(t)}catch{return}let o=ah.get(r.dev);if(o!==void 0)return o;try{let s=ch(H2(DE(t),n)),i=r.dev===s.dev&&r.ino===s.ino;return ah.set(r.dev,i),i}catch(s){let i=FE(s);return i==="ENOENT"||i==="ENOTDIR"?(ah.set(r.dev,!1),!1):void 0}}function LE(t=B2()){if(OE!==void 0)return OE;let e=t;for(;;)try{return ch(e),W2(e)??!0}catch(n){let r=FE(n);if(r!=="ENOENT"&&r!=="ENOTDIR")return!0;let o=DE(e);if(o===e)return!0;e=o}}function Fo(t,e,n=e){if(t===e||t.startsWith(e+"/")||t.startsWith(e+"\\"))return!0;if(!LE(n))return!1;let r=t.toLowerCase(),o=e.toLowerCase();return r===o||r.startsWith(o+"/")||r.startsWith(o+"\\")}function ad(t,e){return t.includes(e)?!0:LE(e)?t.toLowerCase().includes(e.toLowerCase()):!1}var OE,ah,cd=h(()=>{"use strict";ah=new Map});import{realpathSync as NE}from"fs";import{dirname as K2,resolve as Ar,join as dd}from"path";import{homedir as pt}from"os";function G2(){let t=[];try{let e=oe();t.push(Ar(dd(e,"config"))),t.push(Ar(dd(e,"state")))}catch(e){qt(e)}try{t.push(Ar(te()))}catch(e){qt(e)}return t}function lh(){let t=`${k.AFK_WRITE_DENYLIST??""}\0${k.AFK_HOME??""}\0${k.AFK_STATE_DIR??""}`;if(!ld||ld.key!==t){let e=k.AFK_WRITE_DENYLIST,n=process.platform==="win32"?";":":",r=e?e.split(n).map(o=>o.trim()).filter(Boolean).map(o=>o==="~"||o.startsWith("~/")||o.startsWith("~\\")?dd(pt(),o.slice(2)):o).map(o=>Ar(o)).filter(Boolean):[];ld={key:t,unresolved:[...new Set([...q2.map(o=>Ar(o)),...G2()]),...r]}}return[...new Set(ld.unresolved.map(e=>Be(e)))]}function Be(t){let e=Ar(t);try{return NE(e)}catch{}let n=[],r=e;for(let o=0;o<64;o++){let s=K2(r);if(s===r)break;n.unshift(r.slice(s.length+1)),r=s;try{let i=NE(r);return dd(i,...n)}catch{}}return e}function Lo(t,e="write_file"){let n=Be(Ar(t));for(let r of lh())if(Fo(n,r))throw new Error(`${e}: refusing to write to protected path: ${n} (matches denylist entry: ${r})`)}var q2,ld,xr=h(()=>{"use strict";N();j();$i();cd();q2=[`${pt()}/.ssh`,`${pt()}/.aws`,`${pt()}/.gnupg`,`${pt()}/.config/gcloud`,"/etc","/System","/private/etc","/usr/local/etc",`${pt()}/.afk/config`,`${pt()}/.afk/state`,`${pt()}/.npmrc`,`${pt()}/.docker/config.json`,`${pt()}/Library/LaunchAgents`,`${pt()}/Library/LaunchDaemons`,"/Library/LaunchAgents","/Library/LaunchDaemons",`${pt()}/.config/systemd`,...process.platform==="win32"&&k.APPDATA?[`${k.APPDATA}\\gcloud`,`${k.APPDATA}\\Docker`]:[],...process.platform==="win32"&&k.USERPROFILE?[`${k.USERPROFILE}\\.ssh`,`${k.USERPROFILE}\\.aws`,`${k.USERPROFILE}\\.gnupg`]:[]]});import{isAbsolute as X2,relative as z2,sep as J2}from"node:path";import{homedir as ud}from"node:os";function V2(t,e){let n=z2(e,t);return n===""||n!==".."&&!n.startsWith(`..${J2}`)&&!X2(n)}function dh(t,e){return t.filter(n=>!e.some(r=>V2(n,r)))}function Y2(t,e){return t.filter(({source:n})=>n!==e).map(({root:n})=>n)}function $E(t,e){return t.flatMap(({rel:n,resolved:r})=>dh([r],Y2(e,Q2[n])))}var Q2,UE=h(()=>{"use strict";Q2={".afk/config/mcp.json":`${ud()}/.afk/config`,".afk/config/schedules.json":`${ud()}/.afk/config`,".ssh/config":`${ud()}/.ssh`,".ssh/known_hosts":`${ud()}/.ssh`}});import{isAbsolute as wfe,resolve as Z2}from"path";import{homedir as BE}from"os";function No(t){return t==="~"?BE():t.startsWith("~/")?Z2(BE(),t.slice(2)):t}var uh=h(()=>{"use strict"});import{basename as eX,dirname as tX,join as pd,relative as nX,resolve as $o,sep as Ui}from"path";import{homedir as pe}from"os";function HE(t){let e=$o(t);return pd(Be(tX(e)),eX(e))}function fh(t){if(!t)return[];let e=process.platform==="win32"?";":":";return t.split(e).map(n=>n.trim()).filter(Boolean).map(n=>n==="~"||n.startsWith("~/")||n.startsWith("~\\")?No(n.replace(/^~[/\\]+/,"~/")):n).map(n=>$o(n))}function oX(){try{return[Be($o(pd(oe(),"config")))]}catch(t){return qt(t),[]}}function sX(){try{let t=oe();return Rr.filter(e=>e.startsWith(jE)).map(e=>HE(pd(t,e.slice(jE.length))))}catch(t){return qt(t),[]}}function WE(){let t=`${k.AFK_READ_DENYLIST??""}\0${k.AFK_HOME??""}`;if(Bi&&Bi.key===t)return Bi;let e=fh(k.AFK_READ_DENYLIST).map(i=>Be(i)).filter(Boolean),n=ph.map(i=>({source:i,root:Be($o(i))})),r=oX(),o=[...new Set([...n.map(({root:i})=>i),...r])],s=n.filter(({source:i,root:a})=>i!==rX||!r.includes(a)).map(({root:i})=>i);return Bi={key:t,builtins:o,extras:e,allow:[...new Set([...$E(Rr.map(i=>({rel:i,resolved:HE(`${pe()}/${i}`)})),n),...dh(sX(),s)])]},Bi}function mh(){let{builtins:t,extras:e}=WE();return[...t,...e]}function KE(t){let e=Be($o(t));return mh().filter(n=>n!==e&&Fo(n,e,n)).map(n=>(n.startsWith(e+Ui)?nX(e,n):n.split(Ui).slice(e.split(Ui).length).join(Ui)).split(Ui).join("/"))}function ft(t){let e=Be($o(t)),{builtins:n,extras:r,allow:o}=WE();for(let s of r)if(Fo(e,s))return{denied:!0,matched:s};if(o.includes(e))return{denied:!1};for(let s of n)if(Fo(e,s))return{denied:!0,matched:s};return{denied:!1}}var ph,Rr,rX,Pfe,Bi,jE,Uo,fd,Cn=h(()=>{"use strict";N();xr();j();$i();UE();cd();uh();ph=[`${pe()}/.ssh`,`${pe()}/.aws`,`${pe()}/.gnupg`,`${pe()}/.config/gcloud`,`${pe()}/.afk/config`,`${pe()}/.npmrc`,`${pe()}/.docker/config.json`,`${pe()}/.git-credentials`,`${pe()}/.netrc`,`${pe()}/.config/gh/hosts.yml`,`${pe()}/.kube/config`,"/etc/shadow","/etc/sudoers","/private/etc/master.passwd",`${pe()}/.password-store`,`${pe()}/Library/Application Support/Google/Chrome`,`${pe()}/Library/Application Support/Chromium`,`${pe()}/Library/Application Support/BraveSoftware`,`${pe()}/Library/Application Support/Microsoft Edge`,`${pe()}/Library/Application Support/Arc`,`${pe()}/Library/Application Support/Firefox`,...process.platform==="win32"&&k.USERPROFILE?[`${k.USERPROFILE}\\.ssh`,`${k.USERPROFILE}\\.aws`,`${k.USERPROFILE}\\.gnupg`]:[],...process.platform==="win32"&&k.APPDATA?[`${k.APPDATA}\\gcloud`,`${k.APPDATA}\\Docker`,`${k.APPDATA}\\Mozilla\\Firefox`]:[],...process.platform==="win32"&&k.LOCALAPPDATA?[`${k.LOCALAPPDATA}\\Google\\Chrome`,`${k.LOCALAPPDATA}\\Chromium`,`${k.LOCALAPPDATA}\\BraveSoftware`,`${k.LOCALAPPDATA}\\Microsoft\\Edge`]:[]],Rr=[".afk/config/mcp.json",".afk/config/schedules.json",".ssh/config",".ssh/known_hosts"],rX=`${pe()}/.afk/config`,Pfe=Rr.map(t=>pd(pe(),t));jE=".afk/";Uo="read-denylist entry:",fd="is a protected credential/secret path"});import Ir from"path";import{realpathSync as iX}from"fs";function je(t){try{return iX.native(t)}catch{let e=Ir.dirname(t),n=Ir.basename(t);return e===t?t:Ir.join(je(e),n)}}function aX(t){let e=qE.get(t);if(e!==void 0)return e;let n=je(t);return qE.set(t,n),n}function GE(t,e,n,r){let o=e?.resolveBase??e?.cwd??r,s=Ir.isAbsolute(t)?t:Ir.resolve(o??process.cwd(),t);if(e?.allowAll===!0)return{restricted:!1,resolved:s,roots:[]};if(o===void 0)return{restricted:!1,resolved:s,roots:[]};let i=je(s),a=n==="read"?e?.readRoots??[o]:e?.writeRoots??[o];for(let c of a){let l=aX(c),d=Ir.relative(l,i);if(!d.startsWith("..")&&!Ir.isAbsolute(d))return{restricted:!1,resolved:s,roots:a}}return{restricted:!0,resolved:s,roots:a}}function de(t,e,n="read",r){let{restricted:o,resolved:s,roots:i}=GE(t,e,n,r);if(n==="read"){let a=ft(s);if(a.denied)throw new Error(`Path \`${t}\` ${fd} (${Uo} \`${a.matched}\`) and cannot be read.`)}if(o){let a=i.map(l=>`\`${l}\``).join(", "),c=n==="read"?"read roots":"write roots";throw new Error(`Path \`${t}\` is outside the allowed ${c} [${a}].`)}return s}function ji(t,e,n="read",r){return GE(t,e,n,r)}function XE(t){let e=new Set,n=[];for(let r of t.split(/\s+/)){if(r.length===0)continue;let o=r.replace(/^\d*[<>|&]+/,"").replace(/^['"]/,"").replace(/['";,)]+$/,"");if(o.length===0)continue;let s=o.startsWith("/"),i=o==="~"||o.startsWith("~/");!s&&!i||e.has(o)||(e.add(o),n.push(o))}return n}var qE,Ae=h(()=>{"use strict";Cn();qE=new Map});import{execFileSync as cX}from"node:child_process";function cn(t,e="SIGKILL"){if(!(t<=0))try{process.platform==="win32"?cX("taskkill",["/F","/T","/PID",String(t)],{stdio:"ignore",timeout:5e3}):process.kill(-t,e)}catch{}}var md=h(()=>{"use strict"});import{mkdirSync as lX,openSync as dX,writeSync as uX,closeSync as pX}from"fs";function gh(t,e,n){try{let r=Am(t);if(r===void 0)return;lX(r,{recursive:!0,mode:448});let o=e.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,128)||"capture",s=`${r}/${o}.txt`,i=Buffer.from(n,"utf8"),a=i.length<=zE?i:i.subarray(0,zE),c=dX(s,"wx",384);try{uX(c,a)}finally{pX(c)}return s}catch{return}}var zE,JE=h(()=>{"use strict";j();zE=8e6});var fX,mX,gd,VE=h(()=>{"use strict";et();fX=5,mX=300,gd=class{constructor(e,n=fX,r=mX){this.onChange=e;this.maxLines=n;this.throttleMs=r}onChange;maxLines;throttleMs;lines=[];lastNotifiedAt=0;pendingFlush;cleared=!1;atLineBoundary=!0;push(e){if(this.cleared||e.length===0)return;let n=e.split(`
|
|
273
|
+
`);for(let r=0;r<n.length;r++){let s=n[r].split("\r"),i=s[s.length-1];if(r===0){if(this.atLineBoundary||this.lines.length===0)i.length>0&&this.lines.push(i);else{let a=this.lines[this.lines.length-1];this.lines[this.lines.length-1]=s.length>1?i:a+i}i.length>0&&(this.atLineBoundary=!1)}else{if(this.lines.length>0){let a=Y(this.lines[this.lines.length-1]);a.length>0?this.lines[this.lines.length-1]=a:this.lines.pop()}i.length>0?(this.lines.push(i),this.atLineBoundary=!1):this.atLineBoundary=!0}}this.lines.length>this.maxLines&&(this.lines=this.lines.slice(this.lines.length-this.maxLines)),this.scheduleNotify()}peek(){if(!(this.cleared||this.lines.length===0))return this.lines.map(e=>Y(e)).filter(e=>e.length>0).join(`
|
|
274
|
+
`)||void 0}clear(){this.cleared||(this.cleared=!0,this.lines=[],this.pendingFlush!==void 0&&(clearTimeout(this.pendingFlush),this.pendingFlush=void 0),this.onChange(void 0))}scheduleNotify(){let e=Date.now(),n=e-this.lastNotifiedAt;if(n>=this.throttleMs)this.lastNotifiedAt=e,this.pendingFlush!==void 0&&(clearTimeout(this.pendingFlush),this.pendingFlush=void 0),this.fireNotify();else if(this.pendingFlush===void 0){let r=this.throttleMs-n;this.pendingFlush=setTimeout(()=>{this.pendingFlush=void 0,!this.cleared&&(this.lastNotifiedAt=Date.now(),this.fireNotify())},r),typeof this.pendingFlush=="object"&&"unref"in this.pendingFlush&&this.pendingFlush.unref()}}fireNotify(){let e=this.peek();!this.cleared&&e===void 0||this.onChange(e)}}});import{spawn as YE}from"child_process";import gX from"os";function hX(t){if(typeof t!="object"||t===null)throw new Error("Input must be an object");let e=t;if(typeof e.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(e.timeout_ms<0||e.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=e.timeout_ms}return{command:e.command,timeout_ms:n}}function hd(t,e){let n=!1,r=!1;function o(){n||t==="bypassPermissions"&&(n=!0,console.warn("[security] bash handler: shell=true with bypassPermissions \u2014 all shell metacharacters are interpreted without confirmation. Migrate to execFile to eliminate this risk (tracked: C4)."))}function s(i,a){if(r)return;let c=a.resolveBase??a.cwd??e,l=gX.homedir(),d=[];for(let u of XE(i)){let p=u==="~"?l:u.startsWith("~/")?l+u.slice(1):u,f=ji(p,a,"write",c);f.restricted&&d.push(f.resolved)}d.length!==0&&(r=!0,console.warn(`[security] bash: command references path(s) outside writeRoots: ${d.join(", ")} \u2014 bash containment is best-effort (tracked C4); use file tools for contained writes.`),ne({event:"tool.bash_path_escape",tool:"bash",restricted_count:d.length,mode:"write"}))}return async(i,a,c)=>{let{command:l,timeout_ms:d}=hX(i);if(a.aborted)return{content:"Command aborted",isError:!0};if(o(),c!==void 0)try{s(l,c)}catch{}let u=Date.now();return new Promise(p=>{let f=!1,m=c?.onBashOutputTail!==void 0?new gd(T=>{try{c.onBashOutputTail(T)}catch{}}):void 0;function g(T){f||(f=!0,clearTimeout(v),a.removeEventListener("abort",_),m?.clear(),p(T))}let y=rE(),b={detached:!0,stdio:["ignore","pipe","pipe"],...(c?.resolveBase??c?.cwd??e)!==void 0?{cwd:c?.resolveBase??c?.cwd??e}:{},...c?.env!==void 0?{env:{...process.env,...c.env}}:{}},w=y.shell===!0?YE(l,{shell:!0,...b}):YE(y.shell,[...y.args??[],l],b);w.unref(),c?.spawnedPidRegistry!==void 0&&w.pid!==void 0&&c.spawnedPidRegistry.register(w.pid);let v=setTimeout(()=>{w.pid!==void 0&&cn(w.pid),g({content:`Command timed out after ${d}ms`,isError:!0,durationMs:Date.now()-u})},d),E="",x="",A=0,I=!1;function C(T){if(I||f||A<8e6)return;I=!0,console.warn(`[bash] overflow kill: stream=${T} totalBytes=${A} command="${l}"`),ne({event:"tool.overflow_kill",tool:"bash",total_bytes:A,stream:T}),w.kill("SIGKILL");let R=ve((E+x).trimEnd()),P=Li(R)??void 0,H=Et(R,1e5)+W_;g({content:H,truncated:!0,durationMs:Date.now()-u,...P!==void 0?{testResult:P}:{}})}w.stdout.on("data",T=>{let R=8e6-A,P=T.length<=R?T:T.subarray(0,Math.max(0,R));A+=P.length;let H=P.toString("utf8");E+=H,m?.push(H),C("stdout")}),w.stderr.on("data",T=>{let R=8e6-A,P=T.length<=R?T:T.subarray(0,Math.max(0,R));A+=P.length;let H=P.toString("utf8");x+=H,m?.push(H),C("stderr")});let _=()=>{w.pid!==void 0&&cn(w.pid),g({content:"Command aborted",isError:!0,durationMs:Date.now()-u})};a.addEventListener("abort",_),a.aborted&&_(),w.on("close",T=>{if(a.aborted){g({content:"Command aborted",isError:!0,durationMs:Date.now()-u});return}if(T!==null&&T!==0){let F=x.trimEnd()||E.trimEnd(),L=vr(F),B=Date.now()-u,W=L.truncated?gh(c?.sessionId,c?.toolUseId??"",F):void 0;g({content:`Command exited with code ${T}${L.content?`
|
|
275
275
|
`+L.content:""}`,isError:!0,...L.truncated?{truncated:!0}:{},...W!==void 0?{capturePath:W}:{},durationMs:B,exitCode:T});return}if(I)return;let R=ve((E+x).trimEnd()),P=Li(R)??void 0,H=vr(R),M=Date.now()-u,$=H.truncated?gh(c?.sessionId,c?.toolUseId??"",R):void 0;g({content:H.content,...H.truncated?{truncated:!0}:{},...$!==void 0?{capturePath:$}:{},durationMs:M,...T!==null?{exitCode:T}:{},...P!==void 0?{testResult:P}:{}})}),w.on("error",T=>{let R=c?.resolveBase??c?.cwd??e,P;if(R===void 0&&Ni(T))try{let H=process.cwd();P=Do(T,H)}catch{P=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${T.message}`}else P=Do(T,R);g({content:`Failed to execute: ${P}`,isError:!0,durationMs:Date.now()-u})})})}}var QE,ZE=h(()=>{"use strict";Rt();sh();et();ih();Ht();Ae();md();JE();Ug();VE();QE=hd("default")});function mt(t,e,n="Path"){if(!(t instanceof Error))return;let r=t.code;if(r==="ENOENT")return{content:`${n} not found: ${e}`,isError:!0};if(r==="EACCES")return{content:`Permission denied: ${e}`,isError:!0};if(r==="ENOTDIR")return{content:`Not a directory: ${e}`,isError:!0}}var Cr=h(()=>{"use strict"});import{promises as yX}from"fs";function yh(t){return(e,n,r)=>bX(e,n,r,t)}var bX,eA,tA=h(()=>{"use strict";Ae();Cr();bX=async(t,e,n,r)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t,s=o.file_path,i=o.offset??1,a=o.limit??2e3;if(typeof s!="string")return{content:"Invalid input: file_path must be a string",isError:!0};if(typeof i!="number"||i<1)return{content:"Invalid input: offset must be a positive number",isError:!0};if(typeof a!="number"||a<1)return{content:"Invalid input: limit must be a positive number",isError:!0};let c;try{c=de(s,n,"read",r)}catch(l){return{content:l instanceof Error?l.message:String(l),isError:!0}}try{let l=await yX.readFile(c),d=Math.min(8192,l.length);for(let v=0;v<d;v++)if(l[v]===0)return{content:`File appears to be binary: ${c}. Use extract_document for .docx, .pdf, .xlsx, .pptx, and .zip files.`,isError:!0};let u=l.toString("utf-8");if(u.length===0)return{content:""};let p=u.split(`
|
|
276
276
|
`),f=Math.max(0,i-1),m=Math.min(p.length,f+a),g=p.slice(f,m),y=p.length;if(g.length===0)return{content:`... (offset ${i} is past end of file \u2014 file has ${y} lines)`};let b=String(y).length,w=g.map((v,E)=>{let x=f+E+1;return`${String(x).padStart(b," ")} ${v}`}).join(`
|
|
277
277
|
`);if(g.length<y){let v=f+1,E=f+g.length,x=E<y?` \u2014 pass offset=${E+1} to continue`:"";return{content:`${w}
|
|
@@ -325,7 +325,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
|
|
|
325
325
|
|
|
326
326
|
${e}`}var wJ,Wh=h(()=>{"use strict";wJ=new Set(["script","style","noscript","template","svg"])});function vJ(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Mx(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function TJ(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function Ox(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??vJ,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!kJ.has(u.status)||d===o)return u;let p=TJ(u,i)??Mx(d,s,i);D("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=Mx(d,s,i);D("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var kJ,Dx=h(()=>{"use strict";ie();kJ=new Set([429,502,503,504])});import{BlockList as _J,isIP as qh}from"node:net";import{lookup as EJ}from"node:dns/promises";import{Agent as AJ}from"undici";function Lx(){let t=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function CJ(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function Kh(t){let e=qh(t);return e===0?!1:IJ.check(t,e===4?"ipv4":"ipv6")}async function Nx(t){return EJ(t,{all:!0,verbatim:!0})}async function Dr(t,e={}){if(e.allowPrivateHosts??Lx())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=CJ(n.hostname),o=(a,c)=>`refusing to fetch ${c} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(qh(r)!==0)return Kh(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??Nx,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(Kh(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Zi(t,e={}){let n=await Dr(t,e);if(!n.allowed)throw new Ce(n.reason)}async function Dn(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=Fx;i++){await Zi(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??Lx())?{dispatcher:PJ}:{}},c=await Ox(t,s,a,r.retry??{});if(!MJ.has(c.status))return c;let l=c.headers.get("location");if(l===null||l.trim()==="")return c;let d;try{d=new URL(l,c.url||s).toString()}catch{return c}await c.body?.cancel().catch(()=>{}),s=d}throw new Ce(`too many redirects (>${Fx}) starting from ${e}`)}var xJ,RJ,IJ,Ce,PJ,Fx,MJ,Fr=h(()=>{"use strict";N();Dx();xJ=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],RJ=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],IJ=(()=>{let t=new _J;for(let[e,n]of xJ)t.addSubnet(e,n,"ipv4");for(let[e,n]of RJ)t.addSubnet(e,n,"ipv6");return t})(),Ce=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};PJ=new AJ({connect:{lookup(t,e,n){Nx(t).then(r=>{let o=r.find(i=>Kh(i.address));if(o!==void 0){n(new Ce(`refusing to connect to ${t} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,qh(s.address))},r=>n(r,"",0))}}});Fx=20,MJ=new Set([301,302,303,307,308])});var Xh={};po(Xh,{enforceDomainPolicy:()=>It,loadBrowserConfig:()=>Gh});import{readFileSync as OJ}from"node:fs";import{join as DJ}from"path";function FJ(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function $x(t,e){return FJ(e).test(t)}function $J(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(LJ.has(e))return!0;if(NJ.has(e))return!1}return!1}function Ux(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function UJ(t){if(t===void 0||t==="")return"auto";if(t==="playwright"||t==="agent-browser"||t==="auto")return t;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${t}`)}function Bx(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Om(e),e}function BJ(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function jJ(t){try{return OJ(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function HJ(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright"||e.backend==="agent-browser"||e.backend==="auto")n.backend=e.backend;else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Bx(e.defaultProfile)),n}function Gh(t){let e=t?.env??k,n=t?.readFileSync??jJ,r=t?.surface??e.AGENT_SURFACE,o=$J(e.AFK_BROWSER_HEADLESS,r),s=Ux(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Ux(e.AFK_BROWSER_BLOCKED_DOMAINS),a=BJ(e.AFK_BROWSER_DOM_SNAPSHOTS),c=UJ(e.AFK_BROWSER_BACKEND),l=Bx(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():DJ(rn(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=HJ(d,m);return g.configPath=p,g}function It(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if($x(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>$x(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var LJ,NJ,Fn=h(()=>{"use strict";N();j();LJ=new Set(["daemon","subagent","telegram","afk"]),NJ=new Set(["repl","interactive","cli"])});import{readFileSync as WJ}from"node:fs";import{join as KJ}from"node:path";import{homedir as qJ}from"node:os";function XJ(t){let e=t??GJ,n;try{n=WJ(e,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let s;try{s=new URL(o.url)}catch{return null}let{hostname:i,protocol:a}=s;if(!(i==="127.0.0.1"||i==="localhost"||i==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function zJ(t){try{return process.kill(t,0),!0}catch{return!1}}async function JJ(t,e,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),s=await fetch(`${t}/health`,{method:"GET",headers:{Authorization:`Bearer ${e}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),s.ok}catch{return!1}}async function zh(t){let e=XJ(t);return e===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:zJ(e.pid)?await JJ(e.url,e.token)?{available:!0,connection:e,reason:null}:{available:!1,connection:e,reason:`health probe failed at ${e.url}`}:{available:!1,connection:e,reason:`stale connection file: PID ${e.pid} not alive`}}var GJ,jx=h(()=>{"use strict";GJ=KJ(qJ(),".config","agent-browser","connection.json")});async function Hx(t){let{config:e,surface:n}=t;if(e.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(e.backend==="agent-browser"){let i=Date.now(),a=await zh(),c=Date.now()-i;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:c,availability:a}}if(n&&VJ.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(e.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await zh(),s=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:s,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:s,availability:o}}var VJ,Wx=h(()=>{"use strict";jx();VJ=new Set(["daemon","subagent"])});import{createHash as YJ}from"crypto";function Kx(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&QJ.test(t.label))}function qx(t){return YJ("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Gx(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var QJ,Id=h(()=>{"use strict";QJ=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as ZJ}from"crypto";import{mkdir as eV,stat as tV,writeFile as nV}from"fs/promises";import{join as Jh}from"path";import{gzip as rV}from"zlib";import{promisify as oV}from"util";function sV(t){return Jh(it(t),"browser")}function iV(t){return Jh(sV(t),"screenshots")}function aV(){return new Date().toISOString().replace(/[:.]/g,"-")}function cV(){return ZJ(3).toString("hex")}async function Go(t,e,n){if(e.length>Xx)throw new Error(`writeScreenshotSidecar: buffer exceeds ${Xx} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=iV(t);await eV(r,{recursive:!0});let o=`${aV()}-${cV()}-${n}.png`,s=Jh(r,o);await nV(s,e);let{size:i}=await tV(s);return{path:s,bytes:i}}var Lye,Xx,Vh=h(()=>{"use strict";j();Id();Lye=oV(rV);Xx=5*1024*1024});var Cd,zx=h(()=>{"use strict";Cd=class{baseUrl;token;constructor(e){this.baseUrl=e.url,this.token=e.token}async call(e,n,r=3e4){let o={version:1,method:e,params:n},s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:s.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Agent Browser ${e} failed (HTTP ${a.status}): ${c}`)}return await a.json()}finally{clearTimeout(i)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(e){return{tabId:(await this.call("tabs.open",{url:e},6e4)).tab_id}}async closeTab(e){await this.call("tabs.close",{tab_id:e})}async read(e,n){return this.call("page.read",{tab_id:e,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(e,n){return this.call("page.inspect",{tab_id:e,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(e,n){await this.call("page.click",{tab_id:e,element_id:n})}async fill(e,n,r){await this.call("page.fill",{tab_id:e,element_id:n,value:r})}async press(e,n,r){await this.call("page.press",{tab_id:e,key:n,...r?{element_id:r}:{}})}async select(e,n,r){await this.call("page.select",{tab_id:e,element_id:n,value:r})}async waitFor(e,n,r){await this.call("page.wait",{tab_id:e,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(e,n){return this.call("page.eval",{tab_id:e,script:n})}async screenshot(e){return this.call("page.screenshot",{tab_id:e})}}});function Yh(t){return{id:t.id,role:t.role,label:t.label,kind:t.kind,value:t.value,state:{disabled:t.disabled,...t.checked!==void 0?{checked:t.checked}:{},...t.selected!==void 0?{selected:t.selected}:{},...t.expanded!==void 0?{expanded:t.expanded}:{}},bbox:t.bbox,...t.selector?{selector:t.selector}:{}}}function Jx(t,e){switch(e.kind){case"element_id":if(t.has(e.elementId))return e.elementId;throw new Error(`Element ${e.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function Qh(t,e,n,r,o,s){switch(n){case"click":await t.click(e,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await t.fill(e,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await t.press(e,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await t.select(e,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let i=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await t.evalScript(e,`document.querySelector('[data-element-id="${i}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await t.waitFor(e,"element",{value:r,timeout:s??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function Vx(t,e){if(e.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await t.client.inspect(t.tabId,{mode:"interactive",query:e.target.text,limit:10}),r=n;if(e.target.role){let c=e.target.role.toLowerCase();r=n.filter(l=>l.role.toLowerCase()===c)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${e.target.text}"`+(e.target.role?`, role="${e.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:e.target.text,...e.target.role?{role:e.target.role}:{}},candidates:r.slice(0,5).map(Yh)};let s=r[0].id;await Qh(t.client,t.tabId,e.action,s,e.value,e.timeoutMs);let i=await t.client.read(t.tabId,{mode:"main"}),a=It(i.url,t.config);return a.allowed?{elementId:s}:{outcome:"blocked_by_policy",url:i.url,reason:`action navigated to blocked domain: ${a.reason}`}}var Yx=h(()=>{"use strict";Fn()});var Qx={};po(Qx,{AgentBrowserProvider:()=>Zh});var Zh,Zx=h(()=>{"use strict";Fn();Vh();zx();Yx();Zh=class{name="agent-browser";config;client;sessions=new Map;constructor(e,n){this.config=e,this.client=new Cd(n)}async open(e){let n=It(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let r=this.sessions.get(e.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(e.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:e.timeoutMs??3e4});else{let{tabId:i}=await this.client.openTab(e.url);await this.client.waitFor(i,"load",{timeout:e.timeoutMs??3e4}),r={tabId:i,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(e.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),s=It(o.url,this.config);return s.allowed?this.buildObservation(r,e.sessionId,e.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${s.reason}`})}async observe(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);return this.buildObservation(n,e.sessionId,e.screenshot,e.maxElements,"browser_observe")}async act(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);let r=Jx(n.knownElements,e.target);if(r===null){if(e.target.kind==="semantic"){let i=await Vx({client:this.client,config:this.config,tabId:n.tabId},e);return"outcome"in i?i:(n.lastAction=`browser_act:${e.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,e.sessionId,e.screenshot,void 0,"browser_act"))}throw e.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(e.target)}`)}await Qh(this.client,n.tabId,e.action,r,e.value,e.timeoutMs),n.lastAction=`browser_act:${e.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),s=It(o.url,this.config);return s.allowed?this.buildObservation(n,e.sessionId,e.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${s.reason}`})}async render(e){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(e){let n=this.sessions.get(e.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${e.sessionId}. Call browser_open first.`);if(e.target!==void 0||e.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),s=o.length>=24?o.readUInt32BE(16):0,i=o.length>=24?o.readUInt32BE(20):0;return{path:(await Go(e.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:s,height:i,dataBase64:r.data,mediaType:"image/png"}}async extract(e){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(e){let n=this.sessions.get(e.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(e.sessionId)}}describe(e){let n=this.sessions.get(e);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let e=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(e),this.sessions.clear()}async buildObservation(e,n,r,o,s="browser_open"){let[i,a]=await Promise.all([this.client.read(e.tabId,{mode:"main",budget:4e3}),this.client.inspect(e.tabId,{mode:"interactive",limit:o??80})]),c=a.elements.map(Yh),l=o??80,d=c.slice(0,l);e.observationCounter+=1,e.knownElements=new Map(d.map(g=>[g.id,g])),e.currentUrl=i.url,e.currentTitle=i.title;let u=[];c.length>l&&u.push(`page has ${c.length} interactive elements; showing first ${l}`);let p=null;if(r)try{let g=await this.client.screenshot(e.tabId),y=Buffer.from(g.data,"base64");p=(await Go(n,y,s)).path}catch{u.push("screenshot capture failed")}let f=`obs_${e.observationCounter.toString(36)}`,m={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:i.url,title:i.title,textSummary:i.content.slice(0,4e3),interactive:d,status:m,warnings:u,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as lV,readFileSync as dV}from"node:fs";import{createRequire as uV}from"node:module";import{dirname as pV,join as fV}from"node:path";function nR(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<gV&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function ze(t){let e=nR(t);return tR.some(n=>e.includes(n))}function hV(){try{let e=uV(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(dV(e,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let s=fV(pV(e),o);return lV(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function ea(){return eR??=hV()??mV,eR}function ey(t){return t.includes("install chromium")}function gt(t,e){let n=nR(t),r=e?.latched===!0?` ${yV}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${ea()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${ea()}). Or pick a different tool.${r}`}function Pd(t,e,n=!1){if(!ze(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
|
|
327
327
|
|
|
328
|
-
${gt(t,{headless:e,latched:n})}`,{cause:t})}var tR,mV,gV,eR,yV,ty=h(()=>{"use strict";tR=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],mV="pnpm exec playwright install chromium",gV=4;yV="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Lr from"node:fs";import Md from"node:path";import{randomBytes as bV}from"node:crypto";function wV(){try{return"5.201.0"}catch{}try{let t=Md.resolve(import.meta.dirname,"../../../package.json"),e=Lr.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var SV,Od,rR=h(()=>{"use strict";ty();j();ie();SV=wV(),Od=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let e;try{({chromium:e}=await import("playwright"))}catch(n){let r=Pd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await e.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Pd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${SV}`}}loadStorageState(e){let n=Dm(e);try{if(!Lr.existsSync(n))return;let r=JSON.parse(Lr.readFileSync(n,"utf8"));return D("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){D("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Dm(e);if(!Lr.existsSync(r))return;let o=await n.storageState(),s=Md.join(Md.dirname(r),`.${Md.basename(r)}.${process.pid}.${bV(4).toString("hex")}.tmp`);Lr.writeFileSync(s,JSON.stringify(o),{mode:384}),Lr.chmodSync(s,384),Lr.renameSync(s,r),D("[browser/vault] saved session",{profile:e,file:r})}catch(r){D("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as kV}from"node:crypto";function vV(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function TV(t,e,n){return`el_${kV("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function _V(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function oR(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function iR(t,e){let n=t.role??"",r=t.name??"";sR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])iR(s,e)}async function EV(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},aR).catch(()=>[])}async function AV(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},aR).catch(()=>[])}function xV(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Dd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=xV(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=EV(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],iR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AV(t)).filter(P=>sR.has(P.role??"")));let w=new Map;for(let R of p){let P=oR(R.name),H=w.get(P);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(P,R)}let v=y.map(R=>({ax:R,dom:w.get(oR(R.name??""))})),E=r?v:v.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);E.sort((R,P)=>{let H=R.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(H!==M)return H-M;let $=R.dom?.bbox.x??0,F=P.dom?.bbox.x??0;return $-F}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((R,P)=>{let H=R.ax.role??"generic",M=R.ax.name??"",$=TV(H,M,P),F=R.dom?.bbox??{x:0,y:0,w:0,h:0},L=R.dom?.type??null,B=null;R.ax.value!==void 0&&R.ax.value!==null&&(B=String(R.ax.value)),R.ax.checked!==void 0&&(B=String(R.ax.checked)),Kx({role:H,kind:L})&&(B="[redacted]");let W={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(W.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(W.selected=R.ax.selected),R.ax.expanded!==void 0&&(W.expanded=R.ax.expanded);let Q;R.dom?.testId?Q=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(Q=`#${R.dom.id}`);let Ft={id:$,role:H,label:vV(M),kind:L,value:B,state:W,bbox:F};return Q!==void 0&&(Ft.selector=Q),Ft}),I="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?I="loading":R==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=_V(f),_=`obs_${e.observationCounter.toString(36)}`,T=new Date().toISOString();return{observationId:_,url:m,title:g,textSummary:C,interactive:A,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:T}}var sR,aR,cR=h(()=>{"use strict";Id();sR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function lR(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function ny(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>lR(t,s)))).filter(o=>o!==null)}async function RV(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ry(t,e,n){switch(e.kind){case"element_id":return IV(t,e,n);case"selector":return CV(t,e);case"semantic":return PV(t,e)}}async function IV(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await ny(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function CV(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await ny(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function PV(t,e){return e.role!==void 0?MV(t,e.text,e.role):OV(t,e.text,e)}async function MV(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await ny(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function OV(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await RV(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await lR(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${g}`,v=0;for(let E=0;E<w.length;E++)v=v*31+w.charCodeAt(E)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var dR=h(()=>{"use strict"});async function oy(t,e,n,r){let o=t.url();if(o===n)return null;let s=It(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var uR=h(()=>{"use strict";Fn()});var iy={};po(iy,{PlaywrightProvider:()=>sy});function pR(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var sy,ay=h(()=>{"use strict";rR();cR();dR();Fn();uR();Vh();sy=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Od(e)}async open(e){let n=It(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await oy(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Dd(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Dd(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await ry(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${pR(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await oy(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Dd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await ry(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${pR(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Go(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Go(n,o,r);return s}catch{return null}}}});var $r={};po($r,{__resetBrowserRegistryForTests:()=>UV,browserProviderActive:()=>LV,closeBrowserProvider:()=>ly,getBrowserProvider:()=>FV,getLastRoutingDecision:()=>$V,peekBrowserProvider:()=>NV});function fR(){Promise.resolve(ly()).then(()=>{process.exit(130)})}function mR(){Promise.resolve(ly()).then(()=>{process.exit(143)})}function gR(){Xt=null}function DV(){Fd||(process.on("SIGINT",fR),process.on("SIGTERM",mR),process.on("exit",gR),Fd=!0)}function hR(){Fd&&(process.removeListener("SIGINT",fR),process.removeListener("SIGTERM",mR),process.removeListener("exit",gR),Fd=!1)}async function FV(t){return Xt!==null?Xt:(Nr!==null||(Nr=(async()=>{let e=Gh(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await Hx({config:e,surface:n});cy=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(Zx(),Qx)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(ay(),iy));o=new s(e)}return DV(),Xt=o,Nr=null,o})()),Nr)}async function ly(){if(Xt===null)return;let t=Xt;Xt=null,Nr=null,hR(),await t.shutdown()}function LV(){return Xt!==null}function NV(){return Xt}function $V(){return cy}function UV(){Xt=null,Nr=null,cy=null,hR()}var Xt,Nr,Fd,cy,Ur=h(()=>{"use strict";Fn();Wx();N();Xt=null,Nr=null,Fd=!1,cy=null});async function yR(t,e){try{return await Ix(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function qV(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ur(),$r)),r=await n();try{return await r.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(ay(),iy)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Fn(),Xh)),a=i(),c=new s(a);try{return await c.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}finally{await c.shutdown()}}throw o}}async function bR(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??qV,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Dn(n,t,{headers:KV,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(WV.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(HV.test(p)&&!jV.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await yR(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ce||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=Hh({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Zi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Zi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Zi(u.finalUrl,o);let p=await yR(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Hh({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof Ce)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var jV,HV,WV,KV,wR=h(()=>{"use strict";Cx();Wh();Fr();ie();jV=/(text\/html|application\/xhtml\+xml)/i,HV=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,WV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,KV={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function zV(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(GV,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),XV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Y(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function SR(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?zV({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function kR(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
328
|
+
${gt(t,{headless:e,latched:n})}`,{cause:t})}var tR,mV,gV,eR,yV,ty=h(()=>{"use strict";tR=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],mV="pnpm exec playwright install chromium",gV=4;yV="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Lr from"node:fs";import Md from"node:path";import{randomBytes as bV}from"node:crypto";function wV(){try{return"5.202.0"}catch{}try{let t=Md.resolve(import.meta.dirname,"../../../package.json"),e=Lr.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var SV,Od,rR=h(()=>{"use strict";ty();j();ie();SV=wV(),Od=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let e;try{({chromium:e}=await import("playwright"))}catch(n){let r=Pd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await e.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Pd(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${SV}`}}loadStorageState(e){let n=Dm(e);try{if(!Lr.existsSync(n))return;let r=JSON.parse(Lr.readFileSync(n,"utf8"));return D("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){D("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Dm(e);if(!Lr.existsSync(r))return;let o=await n.storageState(),s=Md.join(Md.dirname(r),`.${Md.basename(r)}.${process.pid}.${bV(4).toString("hex")}.tmp`);Lr.writeFileSync(s,JSON.stringify(o),{mode:384}),Lr.chmodSync(s,384),Lr.renameSync(s,r),D("[browser/vault] saved session",{profile:e,file:r})}catch(r){D("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as kV}from"node:crypto";function vV(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function TV(t,e,n){return`el_${kV("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function _V(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function oR(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function iR(t,e){let n=t.role??"",r=t.name??"";sR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])iR(s,e)}async function EV(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},aR).catch(()=>[])}async function AV(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?l="checkbox":g==="radio"?l="radio":g==="button"||g==="submit"||g==="reset"?l="button":g==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},aR).catch(()=>[])}function xV(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Dd(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=xV(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=EV(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],iR(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await AV(t)).filter(P=>sR.has(P.role??"")));let w=new Map;for(let R of p){let P=oR(R.name),H=w.get(P);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(P,R)}let v=y.map(R=>({ax:R,dom:w.get(oR(R.name??""))})),E=r?v:v.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);E.sort((R,P)=>{let H=R.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(H!==M)return H-M;let $=R.dom?.bbox.x??0,F=P.dom?.bbox.x??0;return $-F}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=E.slice(0,n).map((R,P)=>{let H=R.ax.role??"generic",M=R.ax.name??"",$=TV(H,M,P),F=R.dom?.bbox??{x:0,y:0,w:0,h:0},L=R.dom?.type??null,B=null;R.ax.value!==void 0&&R.ax.value!==null&&(B=String(R.ax.value)),R.ax.checked!==void 0&&(B=String(R.ax.checked)),Kx({role:H,kind:L})&&(B="[redacted]");let W={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(W.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(W.selected=R.ax.selected),R.ax.expanded!==void 0&&(W.expanded=R.ax.expanded);let Q;R.dom?.testId?Q=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(Q=`#${R.dom.id}`);let Ft={id:$,role:H,label:vV(M),kind:L,value:B,state:W,bbox:F};return Q!==void 0&&(Ft.selector=Q),Ft}),I="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?I="loading":R==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=_V(f),_=`obs_${e.observationCounter.toString(36)}`,T=new Date().toISOString();return{observationId:_,url:m,title:g,textSummary:C,interactive:A,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:T}}var sR,aR,cR=h(()=>{"use strict";Id();sR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function lR(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function ny(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>lR(t,s)))).filter(o=>o!==null)}async function RV(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ry(t,e,n){switch(e.kind){case"element_id":return IV(t,e,n);case"selector":return CV(t,e);case"semantic":return PV(t,e)}}async function IV(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await ny(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function CV(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await ny(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function PV(t,e){return e.role!==void 0?MV(t,e.text,e.role):OV(t,e.text,e)}async function MV(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await ny(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function OV(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await RV(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let y=p[g];if(y===void 0)continue;let b=await lR(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${g}`,v=0;for(let E=0;E<w.length;E++)v=v*31+w.charCodeAt(E)>>>0;f.push({...b,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var dR=h(()=>{"use strict"});async function oy(t,e,n,r){let o=t.url();if(o===n)return null;let s=It(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var uR=h(()=>{"use strict";Fn()});var iy={};po(iy,{PlaywrightProvider:()=>sy});function pR(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var sy,ay=h(()=>{"use strict";rR();cR();dR();Fn();uR();Vh();sy=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Od(e)}async open(e){let n=It(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await oy(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Dd(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Dd(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await ry(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${pR(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(y){l=y}else l=g}let u=await oy(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Dd(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await ry(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${pR(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Go(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Go(n,o,r);return s}catch{return null}}}});var $r={};po($r,{__resetBrowserRegistryForTests:()=>UV,browserProviderActive:()=>LV,closeBrowserProvider:()=>ly,getBrowserProvider:()=>FV,getLastRoutingDecision:()=>$V,peekBrowserProvider:()=>NV});function fR(){Promise.resolve(ly()).then(()=>{process.exit(130)})}function mR(){Promise.resolve(ly()).then(()=>{process.exit(143)})}function gR(){Xt=null}function DV(){Fd||(process.on("SIGINT",fR),process.on("SIGTERM",mR),process.on("exit",gR),Fd=!0)}function hR(){Fd&&(process.removeListener("SIGINT",fR),process.removeListener("SIGTERM",mR),process.removeListener("exit",gR),Fd=!1)}async function FV(t){return Xt!==null?Xt:(Nr!==null||(Nr=(async()=>{let e=Gh(t),n=t?.surface??(t?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await Hx({config:e,surface:n});cy=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:s}=await Promise.resolve().then(()=>(Zx(),Qx)),i=r.availability.connection;o=new s(e,i)}else{let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(ay(),iy));o=new s(e)}return DV(),Xt=o,Nr=null,o})()),Nr)}async function ly(){if(Xt===null)return;let t=Xt;Xt=null,Nr=null,hR(),await t.shutdown()}function LV(){return Xt!==null}function NV(){return Xt}function $V(){return cy}function UV(){Xt=null,Nr=null,cy=null,hR()}var Xt,Nr,Fd,cy,Ur=h(()=>{"use strict";Fn();Wx();N();Xt=null,Nr=null,Fd=!1,cy=null});async function yR(t,e){try{return await Ix(t,e)}catch(n){return D("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function qV(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ur(),$r)),r=await n();try{return await r.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:s}=await Promise.resolve().then(()=>(ay(),iy)),{loadBrowserConfig:i}=await Promise.resolve().then(()=>(Fn(),Xh)),a=i(),c=new s(a);try{return await c.render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}finally{await c.shutdown()}}throw o}}async function bR(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??qV,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Dn(n,t,{headers:KV,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(WV.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(HV.test(p)&&!jV.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await yR(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof Ce||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=Hh({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await Zi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>Zi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await Zi(u.finalUrl,o);let p=await yR(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Hh({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof Ce)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var jV,HV,WV,KV,wR=h(()=>{"use strict";Cx();Wh();Fr();ie();jV=/(text\/html|application\/xhtml\+xml)/i,HV=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,WV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,KV={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function zV(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(GV,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),XV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Y(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function SR(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?zV({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function kR(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
329
329
|
|
|
330
330
|
(no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
331
331
|
`).trimEnd()}var GV,XV,vR=h(()=>{"use strict";et();GV="https://api.exa.ai/search",XV=10});function Ld(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Br=h(()=>{"use strict";ty()});function e4(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=JV;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,VV)}let a=YV;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,QV)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function dy(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:Et(t,e),truncated:!0}}function t4(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=e4(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,c=()=>{a.abort(s.reason)},l,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",c,{once:!0}),l=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Dr(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Dn(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof Ce?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=dy(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await bR(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=dy(Px(p.markdown,p.advisory),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof Ce)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=ze(p)&&!ey(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${ea()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=SR({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:ZV,timeoutMs:i.timeoutMs,signal:a.signal}),f=dy(kR(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),s.removeEventListener("abort",c)}}}var JV,VV,YV,QV,ZV,TR,_R=h(()=>{"use strict";wR();vR();Fr();Ht();Wh();Br();JV=3e4,VV=12e4,YV=1e5,QV=1e6,ZV=10;TR=t4()});function o4(t){return n4.has(t)?"low":t==="DELETE"?"high":"medium"}function s4(t){return r4.has(t)}function c4(t){let e={};return t.forEach((n,r)=>{let o=r.toLowerCase();a4.has(o)||i4.some(s=>o.startsWith(s))||(e[r]=n)}),e}function l4(t,e){if(t==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(e).some(o=>o.toLowerCase()==="content-type");return typeof t=="string"?{serialized:t,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(t),inferredContentType:n?void 0:"application/json"}}function d4(t,e,n){let r=Buffer.byteLength(t,"utf8"),o=t,s=!1;if(r>n&&(o=Et(t,n),s=!0),!s&&/application\/json/i.test(e))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:s}}async function xR(t){let{url:e,method:n,signal:r,domainCheck:o,recordEffect:s}=t,i=Math.min(t.maxResponseBytes??uy,py),a={...t.headers},c=t.fetchFn??globalThis.fetch,l=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},d=o4(n);if(o!==void 0){let _=o(e);if(!_.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${_.reason}`),{name:"DomainPolicyError"})}let u=await Dr(e,l);if(!u.allowed)throw new Ce(u.reason);let{serialized:p,inferredContentType:f}=l4(t.body,a);f!==void 0&&(a["content-type"]=f);let m={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},y=s4(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},b=Date.now(),w;try{w=await Dn(c,e,m,{...l,retry:y})}catch(_){throw _ instanceof Ce,_}let v=Date.now()-b,E=w.headers.get("content-type")??"",x;try{let _=w.body?.getReader();if(!_)x="";else{let T=[],R=0,P=i*2;for(;;){let{done:H,value:M}=await _.read();if(H||!M)break;if(T.push(M),R+=M.byteLength,R>=P){await _.cancel();break}}x=new TextDecoder().decode(Buffer.concat(T,R))}}catch{x=""}let{body:A,truncated:I}=d4(x,E,i),C=c4(w.headers);return s!==void 0&&Promise.resolve(s({url:e,method:n,status:w.status,risk:d,timing_ms:v})).catch(()=>{}),{status:w.status,headers:C,body:A,truncated:I,timing_ms:v,risk:d}}function RR(t){if(typeof t!="string"||t.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let e=t.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(e)?e:{error:`method "${t}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var ER,AR,uy,py,n4,r4,i4,a4,IR=h(()=>{"use strict";Fr();Ht();ER=3e4,AR=12e4,uy=1e5,py=1e6,n4=new Set(["GET","HEAD","OPTIONS"]),r4=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);i4=["set-cookie","x-"],a4=new Set(["server","via","age","vary","authorization","www-authenticate"])});function u4(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t;if(typeof e.url!="string"||e.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{error:`Invalid input: protocol "${n.protocol}" not supported (http/https only)`};n.username="",n.password="";let r=n.toString(),o=RR(e.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let s=o,i;if(e.body!==void 0&&e.body!==null){if(typeof e.body!="string"&&typeof e.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};i=e.body}let a={};if(e.headers!==void 0){if(typeof e.headers!="object"||e.headers===null||Array.isArray(e.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let u=e.headers;for(let[p,f]of Object.entries(u)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let c=ER;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};c=Math.min(e.timeout_ms,AR)}let l=uy;if(e.max_response_bytes!==void 0){if(typeof e.max_response_bytes!="number"||!Number.isFinite(e.max_response_bytes)||e.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};l=Math.min(e.max_response_bytes,py)}let d;if(e.credential!==void 0){if(typeof e.credential!="string"||e.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};d=e.credential}return{url:r,method:s,body:i,headers:a,timeoutMs:c,maxResponseBytes:l,credential:d}}function p4(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;async function r(){if(t.domainCheck!==void 0)return t.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:s}=await Promise.resolve().then(()=>(Fn(),Xh)),i=o();return a=>s(a,i)}catch{return}}return async(o,s)=>{if(typeof e!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let i=u4(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let p=s.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...i.headers};if(i.credential!==void 0){let p=n[i.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${i.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(m=>m.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let c=new AbortController,l=()=>c.abort(s.reason),d,u=()=>{let p=c.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{s.addEventListener("abort",l,{once:!0}),d=setTimeout(()=>{c.abort(new Error(`web_request timeout after ${i.timeoutMs}ms`))},i.timeoutMs);let p=await r(),f={url:i.url,method:i.method,body:i.body,headers:a,maxResponseBytes:i.maxResponseBytes,signal:c.signal,fetchFn:e,lookupFn:t.lookupFn,domainCheck:p,recordEffect:t.recordEffect},m;try{m=await xR(f)}catch(w){if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};if(w instanceof Ce)return{content:`web_request blocked: ${w.message}`,isError:!0};let v=w instanceof Error&&w.name==="DomainPolicyError"?"blocked":"network error",E=w instanceof Error?w.message:String(w);return{content:`web_request ${v}: ${E}`,isError:!0}}if(c.signal.aborted)return{content:`web_request aborted: ${u()}`,isError:!0};let g=m.body;if(typeof g=="string")g=qe(g);else if(typeof g=="object"&&g!==null){let w=qe(JSON.stringify(g));try{g=JSON.parse(w)}catch{g=w}}let y={status:m.status,headers:m.headers,body:g,timing_ms:m.timing_ms,...m.truncated?{truncated:!0}:{}};return{content:JSON.stringify(y,null,2),...m.truncated?{truncated:!0}:{}}}finally{d!==void 0&&clearTimeout(d),s.removeEventListener("abort",l)}}}var CR,PR=h(()=>{"use strict";IR();Fr();vn();CR=p4()});import{existsSync as OR,mkdirSync as f4,readFileSync as m4,renameSync as g4,unlinkSync as h4,writeFileSync as y4}from"node:fs";import{dirname as MR,join as b4}from"node:path";import{randomBytes as w4}from"node:crypto";function jr(t){let e=t??Im();if(!OR(e))return[];try{let n=m4(e,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${e}: ${r}`),[]}}function ta(t,e){let n=e??Im();f4(MR(n),{recursive:!0});let r=b4(MR(n),`.schedules.json.${process.pid}.${w4(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{y4(r,o,"utf-8"),g4(r,n)}catch(s){try{OR(r)&&h4(r)}catch{}throw s}}function DR(t,e){let n=jr(e),r=n.map(c=>c.id),o=S4(t.name),s=k4(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),ta(n,e),a}function FR(t,e){let n=jr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(ta(o,e),!0)}function LR(t,e){return jr(e).find(n=>n.id===t)}function S4(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function k4(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function NR(t){return{taskId:t.id,command:t.command,trigger:t.trigger??"cron",...t.cron!==void 0?{cronExpression:t.cron}:{},...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{},...t.notifyChat!==void 0?{notifyChat:t.notifyChat}:{}}}var $R=h(()=>{"use strict";j()});import{existsSync as v4,readFileSync as T4}from"node:fs";import{join as _4}from"node:path";async function Xo(t,e,n){let r,o;try{let s=_4(kv("default"),"port");if(!v4(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=T4(s,"utf-8").trim(),a=E4(i);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let s=r.includes(":")?`[${r}]`:r,i=await fetch(`http://${s}:${o}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return i.ok?{synced:!0,detail:"synced"}:t==="POST"&&i.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&i.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${i.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function E4(t){let e=parseInt(t,10);if(String(e)===t&&!Number.isNaN(e))return e<1||e>65535?null:{host:"localhost",port:e};let n=t.lastIndexOf(":");if(n<1)return null;let r=t.slice(0,n),o=t.slice(n+1);if(!/^\d+$/.test(o))return null;let s=parseInt(o,10);return Number.isNaN(s)||s<1||s>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:s}}var fy,UR=h(()=>{"use strict";j();fy="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as A4}from"node:fs";import{readFile as x4}from"node:fs/promises";var BR,jR,HR,WR,KR=h(()=>{"use strict";$R();j();UR();BR=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let s=DR({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=s.enabled?await Xo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await Xo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:fy}})}},jR=async(t,e)=>{let n=jr();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},HR=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=$c();if(!A4(s))return{content:JSON.stringify([])};let i;try{let l=await x4(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
|
|
@@ -1210,7 +1210,7 @@ ${y}`:c,sessionId:this.initSessionId}:(yield{type:"assistant.message",text:c,ses
|
|
|
1210
1210
|
|
|
1211
1211
|
`+a})}if(r!==null){let a=r===Mt?gp:Mu;o.push({role:"user",content:a})}let s=r!==null?void 0:this.activeOpenAITools(),i={controller:e,traceWriter:this.traceWriter,initSessionId:this.initSessionId,currentModel:this.currentModel,isClosed:()=>this.closed};if(this.wireMode==="responses"){let a=this.opts.auth.source==="chatgpt-oauth";if(a&&Vu(this.currentModel))return yield{type:"error",error:new Error(`Model "${this.currentModel}" can't run on a ChatGPT subscription \u2014 the ChatGPT/Codex backend only supports OpenAI gpt-5.x models. This usually means a subagent or skill requested a Claude model. Pass a gpt-5.x model to it (e.g. model: "gpt-5.5"); for an auto-dispatched agent you can't pass a model to (e.g. git-investigator), set AFK_DEFAULT_SUBAGENT_MODEL to a gpt-5.x id. Or run it on a provider configured with the matching API key.`)},null;let c=tp({model:this.currentModel,messages:o,activeTools:s,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature,isChatGptBackend:a});return yield*gw(i,{createStream:async l=>await this.client.responses.create(c,{signal:l}),translate:(l,d)=>Ju(l,d,this.initSessionId),clarifyError:l=>this.clarifyResponsesError(l,a)})}else{let a=RO({model:this.currentModel,messages:o,activeTools:s,maxOutputTokens:this.opts.config.maxOutputTokens,effort:this.opts.config.effort,temperature:this.opts.config.temperature});return yield*gw(i,{createStream:async c=>await this.client.chat.completions.create(a,{signal:c}),translate:(c,l)=>oO(c,l,this.initSessionId),clarifyError:c=>c instanceof Error?c:new Error(String(c))})}}async*dispatchAndAppend(e,n,r){return yield*NO({state:e,signal:n,vision:r,toolDispatcher:this.toolDispatcher,traceWriter:this.traceWriter,priorTurns:this.priorTurns,sessionId:this.initSessionId,subagentId:this.opts.config.subagentId})}async interrupt(e="interrupted"){this.abort.requestAbort(e)}async compact(){let e=await this.compactHistory("manual");return e.compacted&&(this.lastUsage=null),e}async compactHistory(e){let n=this.priorTurns.length;if(this.opts.auth.apiKey===null)return{compacted:!1,reason:"no-usable-auth",messagesBefore:n,messagesAfter:n};if(this.wireMode==="responses"&&this.responsesCompactionUnavailable){let s=ls(k.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,k.AFK_MICROCOMPACT_KEEP_LAST),{blocksCleared:i,bytesReclaimed:a}=nw(this.priorTurns,s);return i>0?{compacted:!1,reason:"microcompacted",messagesBefore:n,messagesAfter:this.priorTurns.length,microcompaction:{blocksCleared:i,bytesReclaimed:a}}:{compacted:!1,reason:"responses-compaction-unavailable",messagesBefore:n,messagesAfter:n}}let r=k.AFK_COMPACT_MODEL??this.currentModel,o=bi(Ee(this.lastUsage??{}),sn(this.currentModel));return kO({priorTurns:this.priorTurns,usedFraction:o,shrinkAtFraction:SO(),summarize:(s,i)=>this.wireMode==="responses"?this.summarizeViaResponses(s,i,r):rp({client:this.client,model:r,system:Ra,user:Pa(s),maxTokens:1024,signal:i}),isClosed:this.closed,isIdle:this.abort.isIdle(),beginAbort:()=>this.abort.begin(),clearAbort:s=>this.abort.clear(s),trigger:e,traceWriter:this.traceWriter})}async summarizeViaResponses(e,n,r){try{return await CO({client:this.client,model:r,system:Ra,user:Pa(e),isChatGptBackend:this.opts.auth.source==="chatgpt-oauth",maxTokens:1024,signal:n})}catch(o){if(!n.aborted&&XO(o)){this.responsesCompactionUnavailable=!0;let s=zn(o);q(this.traceWriter,{phase:"compaction_disabled",metadata:{wire:"responses",reason:"responses-compaction-unavailable",error:o instanceof Error?o.message:String(o),...s!==void 0?{status:s}:{}}})}throw o}}async setModel(e){e!==void 0&&(this.currentModel=_e(e)??e)}async setPermissionMode(e){this.currentPermissionMode=rw(e);let n=_t(this.currentPermissionMode);this.toolDispatcher?.setAllowAll?.(n),this.onPermissionMode?.(this.currentPermissionMode)}setCwd(e){this.toolDispatcher?.setResolveBase?.(e),this.onCwdChange?.(e)}async supportedCommands(){return Ku()}async supportedModels(){return[{value:"gpt-5.6",displayName:"GPT-5.6 (Sol)",description:"OpenAI flagship \u2014 alias for gpt-5.6-sol"},{value:"gpt-5.6-sol",displayName:"GPT-5.6 Sol",description:"Frontier capability"},{value:"gpt-5.6-terra",displayName:"GPT-5.6 Terra",description:"Balanced intelligence/cost"},{value:"gpt-5.6-luna",displayName:"GPT-5.6 Luna",description:"Fast, high-volume workloads"},{value:"gpt-5.5",displayName:"GPT-5.5",description:"Prior flagship (ChatGPT backend)"},{value:"gpt-4o",displayName:"GPT-4o",description:"OpenAI flagship multimodal"},{value:"gpt-4o-mini",displayName:"GPT-4o mini",description:"Fast/cheap GPT-4o"},{value:"gpt-4.1",displayName:"GPT-4.1",description:"Long-context GPT-4"},{value:"gpt-4.1-mini",displayName:"GPT-4.1 mini",description:"Fast 4.1 variant"},{value:"o1",displayName:"o1",description:"Reasoning model"},{value:"o1-mini",displayName:"o1 mini",description:"Fast reasoning"},{value:"o3-mini",displayName:"o3 mini",description:"Newer reasoning, faster"}]}async supportedAgents(){return[]}async getContextUsage(){let e=this.lastUsage,n=Tt(this.currentModel),r;if(e&&n>0){let i=Ee(e);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=hi(e);return{tools:[],agents:[],isAutoCompactEnabled:this.autoCompactThreshold!==void 0,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.opts.mcpManager?this.opts.mcpManager.getServerStates().map(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{authSource:this.opts.auth.source}}async rewindFiles(e,n){return{canRewind:!1,error:`${hw} provider does not support file checkpoint rewind yet.`}}close(){this.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed(),D(`\u{1F7E2} ${hw}: closed`)}}});var bw,xe,v9,fs=h(()=>{"use strict";mu();ql();id();Ml();Io();sb();cb();Gr();ut();Nt();hr();yu();ki();Vl();j();Nb();Gn();yw();op();Ue();hb();Ea();yw();bw="openai-compatible",xe=class{name=bw;providerOpts;memoryStore;workspaceStore;stateStore;schemas;_defaultHeaders;_sharedReadRoots;_sharedWriteRoots;_currentPermissionMode="default";_sharedCurrentCwd;_presenceSessionId=null;_mintedSessionId=null;_spawnedPidRegistry=new Yo;constructor(e={}){this.providerOpts=e,this._defaultHeaders=e.defaultHeaders,this.memoryStore=e.memoryStore??new Ze,this.workspaceStore=e.workspaceStore,this.stateStore=e.stateStore??new Bn(mo());let n=[...Wt];e.subagentExecutor&&n.push(e.subagentExecutor.describeAgentTool?.()??rt),e.skillExecutor&&n.push(Tr),e.composeExecutor&&n.push(_r),e.readOnlyMemory===!0?n.push(So):n.push(...kn),e.readOnlyMemory===!0?n.push(...Jl):n.push(...Co),n.push(...this.workspaceStore!==void 0?[_i,Ei]:[],xt);for(let r of e.customTools??[])n.some(o=>o.name===r.schema.name)||n.push(r.schema);this.schemas=n}setEndpointDefaults(e){e.baseURL!==void 0&&(this.providerOpts.baseURL=e.baseURL),e.defaultHeaders!==void 0&&(this._defaultHeaders=e.defaultHeaders)}query(e){let n=e.config,r=n.permissionMode??"default";this._currentPermissionMode=r,this.ensureSharedRoots(n.cwd),n.readRoots&&this._sharedReadRoots&&this._sharedReadRoots.length<=1&&(this._sharedReadRoots.length=0,this._sharedReadRoots.push(...n.readRoots)),n.writeRoots&&this._sharedWriteRoots&&this._sharedWriteRoots.length<=1&&(this._sharedWriteRoots.length=0,this._sharedWriteRoots.push(...n.writeRoots));let o,s=typeof n.model=="string"?n.model:String(n.model),i=n.cwd??process.cwd(),a=Ci({surface:this.providerOpts.surface??"cli",getCwd:()=>i,modelName:s,providerName:bw,permissionMode:r,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},...n.phaseRole!==void 0?{phaseRole:n.phaseRole}:{},getEnabledToolNames:()=>o instanceof Kt?o.toolDefs.map(E=>E.name):[],getMcpTools:()=>this.providerOpts.mcpManager?.getMcpTools()??[],getSubagents:()=>this.providerOpts.subagentExecutor?this.providerOpts.subagentExecutor.getSubagentsLite():{active:[],backgroundJobs:[]}});o=this.providerOpts.tools?Pi(this.providerOpts.tools,a):this.buildDispatcher(r,{...n.cwd!==void 0?{cwd:n.cwd}:{},...this._sharedReadRoots!==void 0?{readRoots:this._sharedReadRoots}:{},...this._sharedWriteRoots!==void 0?{writeRoots:this._sharedWriteRoots}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{},...n.parentSessionId!==void 0?{parentSessionId:n.parentSessionId}:{},...n.subagentId!==void 0?{subagentId:n.subagentId}:{},...n.subagentToolOutputCapBytes!==void 0?{subagentToolOutputCapBytes:n.subagentToolOutputCapBytes}:{},...n.traceWriter!==void 0?{traceWriter:n.traceWriter}:{},...n.bashOutputTailReporter!==void 0?{bashOutputTailReporter:n.bashOutputTailReporter}:{},runtimeStateSource:a,...n.isSkillDispatch?{isSkillDispatch:!0}:{},...n.isNonInteractive?{isNonInteractive:!0}:{},...n.hookRegistry!==void 0?{hookRegistry:n.hookRegistry}:{},...n.planExitControls!==void 0?{planExitControls:n.planExitControls}:{}});let c=ha({sessionId:n.sessionId,resume:n.resume,depth:n.depth,parentSessionId:n.parentSessionId,surface:this.providerOpts.surface??"cli",memoized:this._mintedSessionId});this._mintedSessionId=c.memoized;let l={};c.id!==void 0&&(l.sessionIdOverride=c.id);let d=n.openaiBaseUrl??this.providerOpts.baseURL;d!==void 0&&(l.baseURL=d),this._defaultHeaders!==void 0&&(l.defaultHeaders=this._defaultHeaders),l.toolDispatcher=o,l.onPermissionMode=E=>{this._currentPermissionMode=E},this.providerOpts.mcpManager!==void 0&&(l.mcpManager=this.providerOpts.mcpManager),this._presenceSessionId=ya({depth:n.depth,parentSessionId:n.parentSessionId,sessionId:c.id,currentPresenceSessionId:this._presenceSessionId,runtimeStateSource:a,surface:this.providerOpts.surface??"cli",cwd:n.cwd,providerName:bw,model:s});let u=ju(n.isSkillDispatch),p=Hu(this.providerOpts.readOnlyMemory),f=this.providerOpts.skillExecutor?Sp(void 0,{...typeof n.cwd=="string"&&n.cwd.length>0?{cwd:n.cwd}:{},...typeof n.skillDispatchName=="string"&&n.skillDispatchName.length>0?{excludeName:n.skillDispatchName}:{}}):"",m=typeof n.hotMemory=="string"?n.hotMemory:"",g=typeof n.systemPrompt=="string"?n.systemPrompt:void 0,y=E=>{let x=[u];g!==void 0&&g.length>0&&x.push(g),x.push(p);let A=Wu(this.workspaceStore!==void 0);return A&&x.push(A),m.length>0&&x.push(m),x.push(E),f.length>0&&x.push(f),x.join(`
|
|
1212
1212
|
|
|
1213
|
-
`)},b=()=>Ii({cwd:i,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:a.getWorkspace()}),w={...n,systemPrompt:y(b())},v=E=>{i=E,this._sharedCurrentCwd=E,w.systemPrompt=y(b())};return l.onCwdChange=v,JO(w,e.prompt,l)}buildDispatcher(e,n){let r=du(e,n.cwd),o=si(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);if(this.workspaceStore!==void 0)for(let[d,u]of Ai(this.workspaceStore,n.sessionId??"",n.subagentId))r.set(d,u);for(let[d,u]of Dl(this.stateStore,n.sessionId))this.providerOpts.readOnlyMemory===!0&&d!=="state_get"&&d!=="state_query"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",Po(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let s=n.planExitControls;s&&r.set(yt,pu(s));let i=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"&&d.name!=="clipboard_write"&&d.name!=="clipboard_read"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="clipboard_read"&&d.name!=="clipboard_write"):this.schemas,c={handlers:r,schemas:[...a,...i,...s?[uu]:[]],hookRegistry:fu(n.hookRegistry,this.providerOpts.hookRegistry)},l=Kl(this.providerOpts.mcpManager?Wl(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.schema.name));return l!==void 0&&(c.permissions=l),this.providerOpts.subagentExecutor!==void 0&&(c.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(c.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(c.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(c.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(c.cwd=n.cwd),n.readRoots!==void 0&&(c.readRoots=n.readRoots),n.writeRoots!==void 0&&(c.writeRoots=n.writeRoots),n.sessionId!==void 0&&(c.sessionId=n.sessionId),n.parentSessionId!==void 0&&(c.parentSessionId=n.parentSessionId),n.subagentId!==void 0&&(c.subagentId=n.subagentId),n.subagentToolOutputCapBytes!==void 0&&(c.maxOutputBytes=n.subagentToolOutputCapBytes),n.traceWriter!==void 0&&(c.traceWriter=n.traceWriter),this.providerOpts.readOnlyBash===!0&&(c.readOnlyBash=!0),c.allowAll=_t(e),c.sessionGrantManager=this,c.spawnedPidRegistry=this._spawnedPidRegistry,new Kt(c)}ensureSharedRoots(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._sharedCurrentCwd&&(this._sharedCurrentCwd=e)}}grantManager=new Rn({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._sharedCurrentCwd,getAllowAll:()=>_t(this._currentPermissionMode)});addReadRoot(e,n="slash",r){this.grantManager.addReadRoot(e,n,r)}addWriteRoot(e,n="slash",r){this.grantManager.addWriteRoot(e,n,r)}revokeRoot(e,n="slash",r){this.grantManager.revokeRoot(e,n,r)}getGrants(){return this.grantManager.getGrants()}close(){this.memoryStore.close(),this.workspaceStore?.close(),this.stateStore.close()}async complete(e){let n={model:e.model??"gpt-4o-mini",system:e.system,user:e.user,maxTokens:e.maxTokens??64};e.apiKey!==void 0&&(n.apiKey=e.apiKey);let r=e.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),this._defaultHeaders!==void 0&&(n.defaultHeaders=this._defaultHeaders),e.signal&&(n.signal=e.signal),rp(n)}},v9=new xe});function VO(t,e){return`Skill tool not available at nesting depth ${t} (max ${e}). ${ww}`}function YO(t,e){return`Agent tool not available at nesting depth ${t} (max ${e}). ${ww}`}function QO(t,e){return`Compose tool not available at nesting depth ${t} (max ${e}). ${ww}`}var ww,kp=h(()=>{"use strict";ww="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function ZO(t){return T9.has(t)}var T9,eD=h(()=>{"use strict";T9=new Set});function tD(t){for(let e of _9)e(t)}function nD(t){for(let e of E9)e(t)}var _9,E9,rD=h(()=>{"use strict";_9=new Set,E9=new Set});function vp(t){return A9.has(t)}function oD(t,e=x9){return t.length<=e?t:t.slice(0,e)+"\u2026"}function ms(t){return t.surface!==void 0?{origin:wn(t.surface),actor:Sn(t.depth)}:{}}var A9,x9,Sw=h(()=>{"use strict";lr();A9=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);x9=240});function sD(t){let e=[],n="",r=null,o=!1;for(let s of t){if(r!==null){s===r?r=null:n+=s;continue}if(s==='"'||s==="'"){r=s,o=!0;continue}if(/\s/.test(s)){o&&(e.push(n),n="",o=!1);continue}n+=s,o=!0}return o&&e.push(n),e}function Vn(t,e){let n=e??"",r;return t.replace(/(\\?)\$(ARGUMENTS?\b|\{(\d+)\})/g,(o,s,i,a)=>{if(s==="\\")return o.slice(1);if(i==="ARGUMENT"||i==="ARGUMENTS")return n;let c=Number(a);return c<1?o:(r??=sD(n),r[c-1]??o)})}var Tp=h(()=>{"use strict"});function iD(t,e,n){let r=n&&n.trim().length>0?n.trim():"(none)";return{content:`${`[Skill "${t}" loaded into your current context \u2014 act on it now]
|
|
1213
|
+
`)},b=()=>Ii({cwd:i,...n.sessionId!==void 0?{sessionId:n.sessionId}:{},surface:this.providerOpts.surface??"cli",...n.depth!==void 0?{depth:n.depth}:{},...n.maxDepth!==void 0?{maxDepth:n.maxDepth}:{},workspace:a.getWorkspace()}),w={...n,systemPrompt:y(b())},v=E=>{i=E,this._sharedCurrentCwd=E,w.systemPrompt=y(b())};return l.onCwdChange=v,JO(w,e.prompt,l)}buildDispatcher(e,n){let r=du(e,n.cwd),o=si(this.memoryStore,void 0,this.providerOpts.surface??"cli");for(let[d,u]of o)this.providerOpts.readOnlyMemory===!0&&d!=="memory_search"||r.set(d,u);if(this.workspaceStore!==void 0)for(let[d,u]of Ai(this.workspaceStore,n.sessionId??"",n.subagentId))r.set(d,u);for(let[d,u]of Dl(this.stateStore,n.sessionId))this.providerOpts.readOnlyMemory===!0&&d!=="state_get"&&d!=="state_query"||r.set(d,u);n.runtimeStateSource&&r.set("get_runtime_state",Po(n.runtimeStateSource));for(let d of this.providerOpts.customTools??[])r.has(d.schema.name)||r.set(d.schema.name,d.handler);let s=n.planExitControls;s&&r.set(yt,pu(s));let i=this.providerOpts.mcpManager?this.providerOpts.mcpManager.getMcpTools():[];if(this.providerOpts.mcpManager)for(let[d,u]of this.providerOpts.mcpManager.getMcpHandlers())r.set(d,u);let a=n.isSkillDispatch?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="terminal_font_size"&&d.name!=="clipboard_write"&&d.name!=="clipboard_read"):n.isNonInteractive?this.schemas.filter(d=>d.name!=="ask_question"&&d.name!=="clipboard_read"&&d.name!=="clipboard_write"):this.schemas,c={handlers:r,schemas:[...a,...i,...s?[uu]:[]],hookRegistry:fu(n.hookRegistry,this.providerOpts.hookRegistry)},l=Kl(this.providerOpts.mcpManager?Wl(this.providerOpts.permissions,this.providerOpts.mcpManager.getMcpToolWireNames()):this.providerOpts.permissions,(this.providerOpts.customTools??[]).map(d=>d.schema.name));return l!==void 0&&(c.permissions=l),this.providerOpts.subagentExecutor!==void 0&&(c.subagentExecutor=this.providerOpts.subagentExecutor),this.providerOpts.skillExecutor!==void 0&&(c.skillExecutor=this.providerOpts.skillExecutor),this.providerOpts.composeExecutor!==void 0&&(c.composeExecutor=this.providerOpts.composeExecutor),this.providerOpts.canUseTool!==void 0&&(c.canUseTool=this.providerOpts.canUseTool),n.cwd!==void 0&&(c.cwd=n.cwd),n.readRoots!==void 0&&(c.readRoots=n.readRoots),n.writeRoots!==void 0&&(c.writeRoots=n.writeRoots),n.sessionId!==void 0&&(c.sessionId=n.sessionId),n.parentSessionId!==void 0&&(c.parentSessionId=n.parentSessionId),n.subagentId!==void 0&&(c.subagentId=n.subagentId),n.subagentToolOutputCapBytes!==void 0&&(c.maxOutputBytes=n.subagentToolOutputCapBytes),n.traceWriter!==void 0&&(c.traceWriter=n.traceWriter),n.bashOutputTailReporter!==void 0&&(c.bashOutputTailReporter=n.bashOutputTailReporter),this.providerOpts.readOnlyBash===!0&&(c.readOnlyBash=!0),c.allowAll=_t(e),c.sessionGrantManager=this,c.spawnedPidRegistry=this._spawnedPidRegistry,new Kt(c)}ensureSharedRoots(e){if(!this._sharedReadRoots){let n=e?[e]:[];this._sharedReadRoots=n.slice(),this._sharedWriteRoots=n.slice(),e&&!this._sharedCurrentCwd&&(this._sharedCurrentCwd=e)}}grantManager=new Rn({getReadRoots:()=>this._sharedReadRoots,getWriteRoots:()=>this._sharedWriteRoots,ensureInitialized:()=>this.ensureSharedRoots(),getProtectedRoot:()=>this._sharedCurrentCwd,getAllowAll:()=>_t(this._currentPermissionMode)});addReadRoot(e,n="slash",r){this.grantManager.addReadRoot(e,n,r)}addWriteRoot(e,n="slash",r){this.grantManager.addWriteRoot(e,n,r)}revokeRoot(e,n="slash",r){this.grantManager.revokeRoot(e,n,r)}getGrants(){return this.grantManager.getGrants()}close(){this.memoryStore.close(),this.workspaceStore?.close(),this.stateStore.close()}async complete(e){let n={model:e.model??"gpt-4o-mini",system:e.system,user:e.user,maxTokens:e.maxTokens??64};e.apiKey!==void 0&&(n.apiKey=e.apiKey);let r=e.baseUrl??this.providerOpts.baseURL;return r!==void 0&&(n.baseURL=r),this._defaultHeaders!==void 0&&(n.defaultHeaders=this._defaultHeaders),e.signal&&(n.signal=e.signal),rp(n)}},v9=new xe});function VO(t,e){return`Skill tool not available at nesting depth ${t} (max ${e}). ${ww}`}function YO(t,e){return`Agent tool not available at nesting depth ${t} (max ${e}). ${ww}`}function QO(t,e){return`Compose tool not available at nesting depth ${t} (max ${e}). ${ww}`}var ww,kp=h(()=>{"use strict";ww="You are too deeply nested to delegate further \u2014 perform the work inline with your own tools instead of calling skill/agent/compose."});function ZO(t){return T9.has(t)}var T9,eD=h(()=>{"use strict";T9=new Set});function tD(t){for(let e of _9)e(t)}function nD(t){for(let e of E9)e(t)}var _9,E9,rD=h(()=>{"use strict";_9=new Set,E9=new Set});function vp(t){return A9.has(t)}function oD(t,e=x9){return t.length<=e?t:t.slice(0,e)+"\u2026"}function ms(t){return t.surface!==void 0?{origin:wn(t.surface),actor:Sn(t.depth)}:{}}var A9,x9,Sw=h(()=>{"use strict";lr();A9=new Set(["ask-gate","fanout-pace","right-size-delegation","premise-gate","long-bash-gate","exploration-gate","irreversible-action-gate","safe-destruct","plan-probe"]);x9=240});function sD(t){let e=[],n="",r=null,o=!1;for(let s of t){if(r!==null){s===r?r=null:n+=s;continue}if(s==='"'||s==="'"){r=s,o=!0;continue}if(/\s/.test(s)){o&&(e.push(n),n="",o=!1);continue}n+=s,o=!0}return o&&e.push(n),e}function Vn(t,e){let n=e??"",r;return t.replace(/(\\?)\$(ARGUMENTS?\b|\{(\d+)\})/g,(o,s,i,a)=>{if(s==="\\")return o.slice(1);if(i==="ARGUMENT"||i==="ARGUMENTS")return n;let c=Number(a);return c<1?o:(r??=sD(n),r[c-1]??o)})}var Tp=h(()=>{"use strict"});function iD(t,e,n){let r=n&&n.trim().length>0?n.trim():"(none)";return{content:`${`[Skill "${t}" loaded into your current context \u2014 act on it now]
|
|
1214
1214
|
The instructions below are your operating procedure for THIS task. Execute them immediately, in this session, using the tools you already have. This is an instruction set, not reference material: follow it directly \u2014 do not merely summarize or describe it. No sub-agent was forked; you are the one carrying it out.
|
|
1215
1215
|
Arguments: ${r}`}
|
|
1216
1216
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ScheduleConfig } from './schedules-view.js';
|
|
2
|
+
interface ScheduleFormOptions {
|
|
3
|
+
api: <T>(path: string, init?: RequestInit) => Promise<T>;
|
|
4
|
+
onSaved: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function openScheduleForm(schedule: ScheduleConfig | null, opts: ScheduleFormOptions): void;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function openScheduleHistory(scheduleId: string, api: <T>(path: string, init?: RequestInit) => Promise<T>): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface ScheduleConfig {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
command: string;
|
|
5
|
+
cron: string;
|
|
6
|
+
trigger?: 'cron' | 'sessionstart' | 'both';
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
notifyOn?: 'failure' | 'always' | 'never';
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
interface SchedulesViewOptions {
|
|
13
|
+
container: HTMLElement;
|
|
14
|
+
api: <T>(path: string, init?: RequestInit) => Promise<T>;
|
|
15
|
+
onEdit: (schedule: ScheduleConfig) => void;
|
|
16
|
+
onShowHistory: (id: string) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare class SchedulesView {
|
|
19
|
+
private container;
|
|
20
|
+
private api;
|
|
21
|
+
private onEdit;
|
|
22
|
+
private onShowHistory;
|
|
23
|
+
private schedules;
|
|
24
|
+
private daemonStatus;
|
|
25
|
+
constructor(opts: SchedulesViewOptions);
|
|
26
|
+
load(): Promise<void>;
|
|
27
|
+
private render;
|
|
28
|
+
private renderCard;
|
|
29
|
+
private toggleSchedule;
|
|
30
|
+
private deleteSchedule;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ServerResponse } from 'node:http';
|
|
2
|
+
export declare function handleListSchedules(res: ServerResponse): Promise<void>;
|
|
3
|
+
export declare function handleCreateSchedule(res: ServerResponse, body: unknown): Promise<void>;
|
|
4
|
+
export declare function handleUpdateSchedule(res: ServerResponse, id: string, body: unknown): Promise<void>;
|
|
5
|
+
export declare function handleDeleteSchedule(res: ServerResponse, id: string): Promise<void>;
|
|
6
|
+
export declare function handleToggleSchedule(res: ServerResponse, id: string): Promise<void>;
|
|
7
|
+
export declare function handleScheduleHistory(res: ServerResponse, id: string): Promise<void>;
|
|
8
|
+
export declare function handleDaemonStatus(res: ServerResponse): Promise<void>;
|