agent-afk 5.51.2 → 5.52.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/README.md +12 -2
- package/assets/demo-placeholder.png +0 -0
- package/dist/agent/hooks.d.ts +1 -0
- package/dist/agent/session/hooks-dispatch.d.ts +1 -1
- package/dist/cli.mjs +5 -58
- package/dist/index.mjs +70 -123
- package/dist/telegram.mjs +4 -57
- package/package.json +3 -2
package/dist/telegram.mjs
CHANGED
|
@@ -790,7 +790,7 @@ Be terse and operational. The user is doing one-time setup; they want it done, n
|
|
|
790
790
|
`}}});function Cc(t,e){return e?!0:(t.audience??"public")==="public"}function be(t){Nn.set(t.name,t)}function pt(t){let e=Nn.get(t);if(e)return e;let n=Array.from(Nn.keys()).sort(),r=n.length>0?`
|
|
791
791
|
Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${t}${r}`)}function Ic(){return Array.from(Nn.keys()).sort()}function ig(t){let e=0;for(let[n,r]of Nn)r.origin===t&&(Nn.delete(n),e++);return e}var Nn,Ye=b(()=>{"use strict";Nn=new Map});function gx(t){if(typeof t=="string")return t;if(t instanceof Error)return t.message;try{return JSON.stringify(t)}catch{return String(t)}}var zs,ag=b(()=>{"use strict";Q();zs=class{nodes=new Map;traceWriter;constructor(e){this.traceWriter=e}register(e,n){this.nodes.has(e)||this.nodes.set(e,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(e){return this.nodes.has(e)}getController(e){return this.nodes.get(e)?.controller}childrenOf(e){let n=this.nodes.get(e);return n?Array.from(n.children):[]}isCascading(e){return this.nodes.get(e)?.cascading??!1}linkChild(e,n){let r=this.nodes.get(e),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${e} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=e,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==e||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==e||s.cascading)return;let i=this.nodes.get(e);if(!i)return;let a={parentId:e,childId:n,reason:s.controller.signal.reason};for(let l of i.listeners)try{l(a)}catch{}},{once:!0})}onChildAborted(e,n){let r=this.nodes.get(e);if(!r)throw new Error(`AbortGraph: ${e} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(e,n,r="user_signal"){let o=this.nodes.get(e);if(!o||o.controller.signal.aborted)return;let s=[],i=[...o.children],a=new Set;for(;i.length;){let l=i.shift();if(a.has(l))continue;a.add(l);let c=this.nodes.get(l);if(c){c.cascading=!0,s.push(l);for(let d of c.children)i.push(d)}}ym(this.traceWriter,{origin:r,cascadedTo:s,...n!==void 0?{reason:gx(n)}:{}}),o.controller.abort(n);for(let l of s){let c=this.nodes.get(l);c&&!c.controller.signal.aborted&&c.controller.abort(n)}}dispose(e){let n=this.nodes.get(e);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(e);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(e)}}}});var $n,Pc=b(()=>{"use strict";$n=class{pendingResolve=null;bufferedMessages=[];getSessionId;constructor(e){this.getSessionId=e}pushUserMessage(e){if(this.pendingResolve){let n=this.pendingResolve;this.pendingResolve=null;let r=this.getSessionId();n({content:e,...r!==void 0?{sessionId:r}:{}});return}this.bufferedMessages.push(e)}createIterable(){let e=this;return{[Symbol.asyncIterator](){return{next(){if(e.bufferedMessages.length>0){let n=e.bufferedMessages.shift(),r=e.getSessionId();return Promise.resolve({value:{content:n,...r!==void 0?{sessionId:r}:{}},done:!1})}return new Promise(n=>{e.pendingResolve=r=>n({value:r,done:!1})})},return(){return Promise.resolve({value:void 0,done:!0})}}}}}}});function Js(t,e){let n=e??In(),r=Pn(t.model,n);if(!r){t.forceChatgptOAuth=!1;return}let o=n[r],s=o.provider==="anthropic"?"anthropic-direct":o.provider==="openai"||o.provider==="chatgpt-oauth"?"openai-compatible":J(t.model,e?{slots:e}:void 0);t.forceChatgptOAuth=o.provider==="chatgpt-oauth",o.apiKey!==void 0?t.apiKey=o.apiKey:(s==="openai-compatible"||o.baseUrl!==void 0)&&(t.apiKey=void 0),o.baseUrl!==void 0&&(s==="openai-compatible"?t.openaiBaseUrl=o.baseUrl:t.baseUrl=o.baseUrl)}var Mc=b(()=>{"use strict";ge();Me()});function hx(t){return typeof t=="string"?t:t.map(e=>{let n=e;return n.type==="text"&&typeof n.text=="string"?n.text:""}).filter(e=>e.length>0).join(`
|
|
792
792
|
`)}var Vs,lg=b(()=>{"use strict";Pc();Mc();oe();Vs=class{outerIterator;baseConfig;deps;currentModel;currentPermissionMode;currentCwd;startupFamily;active;activeModel;closed=!1;shadowHistory;pendingUserText;pendingAssistantText="";lastSessionId;constructor(e,n){this.outerIterator=e.prompt[Symbol.asyncIterator](),this.baseConfig=e.config,this.deps=n,this.currentModel=typeof e.config.model=="string"?e.config.model:void 0,this.currentPermissionMode=e.config.permissionMode,this.currentCwd=e.config.cwd,this.startupFamily=n.providerNameForModel(this.currentModel),this.shadowHistory=[...e.config.resumeHistory??[]]}resolveInner(e){let n=this.deps.resolveProvider(e),r={...this.baseConfig};r.model=e??this.baseConfig.model;let o=n.name===this.startupFamily&&this.baseConfig.apiKey!==void 0?this.baseConfig.apiKey:this.deps.resolveApiKey(e);o!==void 0?r.apiKey=o:delete r.apiKey,Js(r);let s=[n.name,r.baseUrl??"",r.openaiBaseUrl??"",r.apiKey??"",r.forceChatgptOAuth?"chatgpt-oauth":""].join("\0");return{provider:n,innerConfig:r,signature:s}}buildInner(e,n){let{provider:r,innerConfig:o,signature:s}=this.resolveInner(e),i=new $n(()=>this.lastSessionId);this.currentPermissionMode!==void 0&&(o.permissionMode=this.currentPermissionMode),this.currentCwd!==void 0&&(o.cwd=this.currentCwd),n&&(o.resumeHistory=[...this.shadowHistory]);let a=r.query({prompt:i.createIterable(),config:o});return{family:r.name,signature:s,query:a,iterator:a[Symbol.asyncIterator](),input:i}}async closeActive(){let e=this.active;if(e){this.active=void 0;try{await e.iterator.return?.(void 0)}catch{}try{await e.query.close()}catch{}}}observeEvent(e){e.type==="assistant.message"&&(this.pendingAssistantText+=(this.pendingAssistantText?`
|
|
793
|
-
`:"")+e.text)}commitShadowTurn(){this.pendingUserText!==void 0&&(this.shadowHistory.push({user:this.pendingUserText,assistant:this.pendingAssistantText}),this.pendingUserText=void 0,this.pendingAssistantText="")}async*[Symbol.asyncIterator](){try{for(this.active=this.buildInner(this.currentModel,!1),this.activeModel=this.currentModel,yield*this.driveUntilInit(!1);!this.closed;){let e=await this.outerIterator.next();if(e.done)break;let n=e.value;this.lastSessionId=n.sessionId;let r=this.currentModel!==this.activeModel,o=!this.active||r&&this.resolveInner(this.currentModel).signature!==this.active.signature;if(this.activeModel=this.currentModel,o&&(await this.closeActive(),this.active=this.buildInner(this.currentModel,!0),$(`\u{1F500} ProviderRouter: switched inner provider \u2192 ${this.active.family} (model=${this.currentModel})`),yield*this.driveUntilInit(!0)))break;for(this.pendingUserText=hx(n.content),this.pendingAssistantText="",this.active.input.pushUserMessage(n.content);;){let s=await this.active.iterator.next();if(s.done){this.closed=!0;break}let i=s.value;if(this.observeEvent(i),yield i,i.type==="turn.completed"){this.commitShadowTurn();break}if(i.type==="error"){this.commitShadowTurn();break}}}}finally{await this.closeActive()}}async*driveUntilInit(e){for(;;){let n=await this.active.iterator.next();if(n.done)return yield{type:"error",error:new Error("provider ended before initialization")},this.closed=!0,!0;let r=n.value;if(r.type==="session.init")return e||(yield r),!1;if(r.type==="error")return yield r,this.closed=!0,!0;yield r}}async interrupt(){await this.active?.query.interrupt()}async setModel(e){typeof e=="string"&&e.length>0&&(this.currentModel=e,this.active&&this.resolveInner(e).signature===this.active.signature&&await this.active.query.setModel(e))}async setPermissionMode(e){this.currentPermissionMode=e,await this.active?.query.setPermissionMode(e)}setCwd(e){this.currentCwd=e,this.active?.query.setCwd?.(e)}async reauth(){return await this.active?.query.reauth?.()??null}async supportedCommands(){return await this.active?.query.supportedCommands()??[]}async supportedModels(){return await this.active?.query.supportedModels()??[]}async supportedAgents(){return await this.active?.query.supportedAgents()??[]}async getContextUsage(){return await this.active?.query.getContextUsage()??{}}async mcpServerStatus(){return await this.active?.query.mcpServerStatus()??[]}async accountInfo(){return await this.active?.query.accountInfo()??{}}async rewindFiles(e,n){let r=this.active;return r?r.query.rewindFiles(e,n):{canRewind:!1,error:"no active provider"}}async compact(){let e=this.active;return e?.query.compact?e.query.compact():{compacted:!1,reason:"provider does not support compaction",messagesBefore:0,messagesAfter:0}}async reloadPlugins(...e){let n=this.active?.query;if(n&&typeof n.reloadPlugins=="function")return n.reloadPlugins(...e)}async close(){this.closed=!0,await this.closeActive()}}});async function Ys(t,e,n={}){if(!Number.isFinite(e)||e<=0)return t;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new Te(`Operation timed out after ${e}ms${a}`,e);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},e)});try{return await Promise.race([t,o])}finally{r!==void 0&&clearTimeout(r)}}var cg,Oc,Dc=b(()=>{"use strict";ae();cg=0,Oc=5e3});async function Xs(t,e,n){if(!t)return;if(n.kind==="blocked"){await De(t,{hookEvent:e,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await De(t,{hookEvent:e,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function dg(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await Xs(n.traceWriter,"SessionStart",{kind:"decision",decision:r})}catch(r){throw r instanceof X&&await Xs(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function ug(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await Xs(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof X&&await Xs(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof X||r instanceof Ae){$(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}$(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var pg=b(()=>{"use strict";oe();ae();Q()});function fg(t){return t==="abort"?yx:null}var yx,mg=b(()=>{"use strict";yx="Session ended via abort before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state, or re-run the task if the interruption was intentional."});function bx(t){return t==="max_tokens"||t==="length"}function gg(t){return t.maxTurnsHit?"max_turns_exceeded":t.hookBlocked?"hook_blocked":t.dispatchReason==="error"?"abort":t.abort!==null?t.abort:t.sawProviderError?"abort":t.lastStopReason==="tool_use_loop_capped"?"iteration_cap":bx(t.lastStopReason)?"truncated":"model_end_turn"}var hg=b(()=>{"use strict"});function wx(t){let e=null,n=t.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;r instanceof An?e="budget_exceeded":r instanceof Te?e="timeout":typeof r=="string"&&r.startsWith("Budget ")?e="budget_exceeded":typeof r=="string"&&r.includes("timed out")?e="timeout":e="abort"}return gg({dispatchReason:t.dispatchReason,maxTurnsHit:t.maxTurnsHit,hookBlocked:t.hookBlocked,abort:e,lastStopReason:t.lastStopReason,sawProviderError:t.sawProviderError})}function Sx(t){if(t.dispatchReason==="error")return"failed";let e=t.signal;return e.aborted&&e.reason!=="closed"?"cancelled":t.sawProviderError?"failed":"succeeded"}async function yg(t,e){if(!t)return;let n=wx(e),r={},o=e.runningTokens;o.input>0&&(r.input=o.input),o.output>0&&(r.output=o.output),o.cacheRead>0&&(r.cacheRead=o.cacheRead),o.cacheCreation>0&&(r.cacheCreation=o.cacheCreation);let s=fg(n);await bm(t,{reason:n,finalTurnCount:e.finalTurnCount,finalCostUsd:e.finalCostUsd,finalTokens:r,...e.lastStopReason!==void 0?{lastStopReason:e.lastStopReason}:{},...s!==null?{guidance:s}:{}})}async function bg(t,e){if(!t)return;let n=Sx(e),r=e.subagentCompletedCount>0?e.subagentCompletedCount:void 0,o=e.subagentRunningTokens,i=o.input>0||o.output>0||o.cacheRead>0||o.cacheCreation>0?{...o.input>0?{input:o.input}:{},...o.output>0?{output:o.output}:{},...o.cacheRead>0?{cacheRead:o.cacheRead}:{},...o.cacheCreation>0?{cacheCreation:o.cacheCreation}:{}}:void 0,a=e.subagentRunningCostUsd>0?e.subagentRunningCostUsd:void 0;await t.seal({status:n,finalCostUsd:e.finalCostUsd,finalTurnCount:e.finalTurnCount,closedAt:new Date().toISOString(),...r!==void 0?{subagentCount:r}:{},...i!==void 0?{subagentTokens:i}:{},...a!==void 0?{subagentCostUsd:a}:{}})}var wg=b(()=>{"use strict";ae();Q();mg();hg()});function Qs(t){let e=vx(t);return e!==void 0?e:kx(t)}function vx(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=e.exec(t))!==null;)n=r[1];if(n)return Sg(n.trim())}function kx(t){for(let e=t.length-1;e>=0;e--){if(t[e]!=="}")continue;let n=_x(t,e);if(n===-1)continue;let r=t.slice(n,e+1),o=Sg(r);if(o!==void 0)return o}}function _x(t,e){let n=0,r=!1,o=!1;for(let s=e;s>=0;s--){let i=t[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="}")n++;else if(i==="{"&&(n--,n===0))return s}return-1}function Sg(t){try{return JSON.parse(t)}catch{return}}var Fc=b(()=>{"use strict"});import*as Un from"node:fs";import*as Bn from"node:fs/promises";function Zs(t,e){return t.length>e?`${t.slice(0,e)}\u2026 [truncated]`:t}function Ex(t){switch(t.type){case"message":return t.message.role!=="assistant"||!t.message.content?null:{kind:"assistant",text:Zs(t.message.content,kg)};case"chunk":{let e=t.chunk;return e.type==="tool_use_detail"?{kind:"tool",toolName:e.toolName,input:Zs(e.toolInput,vg)}:e.type==="tool_result"&&e.isError===!0?{kind:"tool_error",content:Zs(e.content,vg)}:null}case"done":{let e=t.metadata?.totalCostUsd,n=t.metadata?.durationMs;return{kind:"done",...typeof e=="number"?{costUsd:e}:{},...typeof n=="number"?{durationMs:n}:{}}}case"error":return{kind:"error",message:t.error.message};case"paused":return{kind:"paused",...t.resetsAt?{resetsAt:t.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};default:return null}}function Ax(t){let e=t.trim();if(!e)return null;try{let n=JSON.parse(e);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function ei(t){if(!br(t))return!1;try{return await Bn.access(os(t)),!0}catch{return!1}}async function*_g(t,e){if(!br(t))return;let n=os(t),r=wr(t),{fromStart:o=!1,signal:s}=e??{},i=0,a="",l=!1;async function*c(){let f=null;try{f=await Bn.open(n,"r");let m=await f.stat();if(m.size<=i)return;let g=m.size-i,h=Buffer.allocUnsafe(g),{bytesRead:S}=await f.read(h,0,g,i);if(S===0)return;i+=S,a+=h.toString("utf8",0,S);let w=a.split(`
|
|
793
|
+
`:"")+e.text)}commitShadowTurn(){this.pendingUserText!==void 0&&(this.shadowHistory.push({user:this.pendingUserText,assistant:this.pendingAssistantText}),this.pendingUserText=void 0,this.pendingAssistantText="")}async*[Symbol.asyncIterator](){try{for(this.active=this.buildInner(this.currentModel,!1),this.activeModel=this.currentModel,yield*this.driveUntilInit(!1);!this.closed;){let e=await this.outerIterator.next();if(e.done)break;let n=e.value;this.lastSessionId=n.sessionId;let r=this.currentModel!==this.activeModel,o=!this.active||r&&this.resolveInner(this.currentModel).signature!==this.active.signature;if(this.activeModel=this.currentModel,o&&(await this.closeActive(),this.active=this.buildInner(this.currentModel,!0),$(`\u{1F500} ProviderRouter: switched inner provider \u2192 ${this.active.family} (model=${this.currentModel})`),yield*this.driveUntilInit(!0)))break;for(this.pendingUserText=hx(n.content),this.pendingAssistantText="",this.active.input.pushUserMessage(n.content);;){let s=await this.active.iterator.next();if(s.done){this.closed=!0;break}let i=s.value;if(this.observeEvent(i),yield i,i.type==="turn.completed"){this.commitShadowTurn();break}if(i.type==="error"){this.commitShadowTurn();break}}}}finally{await this.closeActive()}}async*driveUntilInit(e){for(;;){let n=await this.active.iterator.next();if(n.done)return yield{type:"error",error:new Error("provider ended before initialization")},this.closed=!0,!0;let r=n.value;if(r.type==="session.init")return e||(yield r),!1;if(r.type==="error")return yield r,this.closed=!0,!0;yield r}}async interrupt(){await this.active?.query.interrupt()}async setModel(e){typeof e=="string"&&e.length>0&&(this.currentModel=e,this.active&&this.resolveInner(e).signature===this.active.signature&&await this.active.query.setModel(e))}async setPermissionMode(e){this.currentPermissionMode=e,await this.active?.query.setPermissionMode(e)}setCwd(e){this.currentCwd=e,this.active?.query.setCwd?.(e)}async reauth(){return await this.active?.query.reauth?.()??null}async supportedCommands(){return await this.active?.query.supportedCommands()??[]}async supportedModels(){return await this.active?.query.supportedModels()??[]}async supportedAgents(){return await this.active?.query.supportedAgents()??[]}async getContextUsage(){return await this.active?.query.getContextUsage()??{}}async mcpServerStatus(){return await this.active?.query.mcpServerStatus()??[]}async accountInfo(){return await this.active?.query.accountInfo()??{}}async rewindFiles(e,n){let r=this.active;return r?r.query.rewindFiles(e,n):{canRewind:!1,error:"no active provider"}}async compact(){let e=this.active;return e?.query.compact?e.query.compact():{compacted:!1,reason:"provider does not support compaction",messagesBefore:0,messagesAfter:0}}async reloadPlugins(...e){let n=this.active?.query;if(n&&typeof n.reloadPlugins=="function")return n.reloadPlugins(...e)}async close(){this.closed=!0,await this.closeActive()}}});async function Ys(t,e,n={}){if(!Number.isFinite(e)||e<=0)return t;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new Te(`Operation timed out after ${e}ms${a}`,e);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},e)});try{return await Promise.race([t,o])}finally{r!==void 0&&clearTimeout(r)}}var cg,Oc,Dc=b(()=>{"use strict";ae();cg=0,Oc=5e3});async function Xs(t,e,n){if(!t)return;if(n.kind==="blocked"){await De(t,{hookEvent:e,decision:"block",...n.err.reason!==void 0?{reason:n.err.reason}:{}});return}let r=n.decision;await De(t,{hookEvent:e,decision:r.decision,...r.reason!==void 0?{reason:r.reason}:{},...r.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(r.injectContext,"utf8")}:{}})}async function dg(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);return await Xs(n.traceWriter,"SessionStart",{kind:"decision",decision:r}),r.injectContext}catch(r){throw r instanceof X&&await Xs(n.traceWriter,"SessionStart",{kind:"blocked",err:r}),r}}async function ug(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await Xs(n.traceWriter,"SessionEnd",{kind:"decision",decision:r})}catch(r){if(r instanceof X&&await Xs(n.traceWriter,"SessionEnd",{kind:"blocked",err:r}),r instanceof X||r instanceof Ae){$(`SessionEnd hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}$(`SessionEnd hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var pg=b(()=>{"use strict";oe();ae();Q()});function fg(t){return t==="abort"?yx:null}var yx,mg=b(()=>{"use strict";yx="Session ended via abort before reaching a terminal state. The transcript and witness trace are preserved \u2014 resume with `afk --resume <sessionId>` to continue from saved state, or re-run the task if the interruption was intentional."});function bx(t){return t==="max_tokens"||t==="length"}function gg(t){return t.maxTurnsHit?"max_turns_exceeded":t.hookBlocked?"hook_blocked":t.dispatchReason==="error"?"abort":t.abort!==null?t.abort:t.sawProviderError?"abort":t.lastStopReason==="tool_use_loop_capped"?"iteration_cap":bx(t.lastStopReason)?"truncated":"model_end_turn"}var hg=b(()=>{"use strict"});function wx(t){let e=null,n=t.signal;if(n.aborted&&n.reason!=="closed"){let r=n.reason;r instanceof An?e="budget_exceeded":r instanceof Te?e="timeout":typeof r=="string"&&r.startsWith("Budget ")?e="budget_exceeded":typeof r=="string"&&r.includes("timed out")?e="timeout":e="abort"}return gg({dispatchReason:t.dispatchReason,maxTurnsHit:t.maxTurnsHit,hookBlocked:t.hookBlocked,abort:e,lastStopReason:t.lastStopReason,sawProviderError:t.sawProviderError})}function Sx(t){if(t.dispatchReason==="error")return"failed";let e=t.signal;return e.aborted&&e.reason!=="closed"?"cancelled":t.sawProviderError?"failed":"succeeded"}async function yg(t,e){if(!t)return;let n=wx(e),r={},o=e.runningTokens;o.input>0&&(r.input=o.input),o.output>0&&(r.output=o.output),o.cacheRead>0&&(r.cacheRead=o.cacheRead),o.cacheCreation>0&&(r.cacheCreation=o.cacheCreation);let s=fg(n);await bm(t,{reason:n,finalTurnCount:e.finalTurnCount,finalCostUsd:e.finalCostUsd,finalTokens:r,...e.lastStopReason!==void 0?{lastStopReason:e.lastStopReason}:{},...s!==null?{guidance:s}:{}})}async function bg(t,e){if(!t)return;let n=Sx(e),r=e.subagentCompletedCount>0?e.subagentCompletedCount:void 0,o=e.subagentRunningTokens,i=o.input>0||o.output>0||o.cacheRead>0||o.cacheCreation>0?{...o.input>0?{input:o.input}:{},...o.output>0?{output:o.output}:{},...o.cacheRead>0?{cacheRead:o.cacheRead}:{},...o.cacheCreation>0?{cacheCreation:o.cacheCreation}:{}}:void 0,a=e.subagentRunningCostUsd>0?e.subagentRunningCostUsd:void 0;await t.seal({status:n,finalCostUsd:e.finalCostUsd,finalTurnCount:e.finalTurnCount,closedAt:new Date().toISOString(),...r!==void 0?{subagentCount:r}:{},...i!==void 0?{subagentTokens:i}:{},...a!==void 0?{subagentCostUsd:a}:{}})}var wg=b(()=>{"use strict";ae();Q();mg();hg()});function Qs(t){let e=vx(t);return e!==void 0?e:kx(t)}function vx(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=e.exec(t))!==null;)n=r[1];if(n)return Sg(n.trim())}function kx(t){for(let e=t.length-1;e>=0;e--){if(t[e]!=="}")continue;let n=_x(t,e);if(n===-1)continue;let r=t.slice(n,e+1),o=Sg(r);if(o!==void 0)return o}}function _x(t,e){let n=0,r=!1,o=!1;for(let s=e;s>=0;s--){let i=t[s];if(o){o=!1;continue}if(r){if(i==="\\"){o=!0;continue}i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="}")n++;else if(i==="{"&&(n--,n===0))return s}return-1}function Sg(t){try{return JSON.parse(t)}catch{return}}var Fc=b(()=>{"use strict"});import*as Un from"node:fs";import*as Bn from"node:fs/promises";function Zs(t,e){return t.length>e?`${t.slice(0,e)}\u2026 [truncated]`:t}function Ex(t){switch(t.type){case"message":return t.message.role!=="assistant"||!t.message.content?null:{kind:"assistant",text:Zs(t.message.content,kg)};case"chunk":{let e=t.chunk;return e.type==="tool_use_detail"?{kind:"tool",toolName:e.toolName,input:Zs(e.toolInput,vg)}:e.type==="tool_result"&&e.isError===!0?{kind:"tool_error",content:Zs(e.content,vg)}:null}case"done":{let e=t.metadata?.totalCostUsd,n=t.metadata?.durationMs;return{kind:"done",...typeof e=="number"?{costUsd:e}:{},...typeof n=="number"?{durationMs:n}:{}}}case"error":return{kind:"error",message:t.error.message};case"paused":return{kind:"paused",...t.resetsAt?{resetsAt:t.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};default:return null}}function Ax(t){let e=t.trim();if(!e)return null;try{let n=JSON.parse(e);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function ei(t){if(!br(t))return!1;try{return await Bn.access(os(t)),!0}catch{return!1}}async function*_g(t,e){if(!br(t))return;let n=os(t),r=wr(t),{fromStart:o=!1,signal:s}=e??{},i=0,a="",l=!1;async function*c(){let f=null;try{f=await Bn.open(n,"r");let m=await f.stat();if(m.size<=i)return;let g=m.size-i,h=Buffer.allocUnsafe(g),{bytesRead:S}=await f.read(h,0,g,i);if(S===0)return;i+=S,a+=h.toString("utf8",0,S);let w=a.split(`
|
|
794
794
|
`);a=w.pop()??"";for(let _ of w){let v=Ax(_);if(v&&(v.kind==="closed"&&(l=!0),yield v,l))return}}catch(m){m.code!=="ENOENT"&&process.stderr.write(`[afk] session-ledger: tail read error for ${t}: ${String(m)}
|
|
795
795
|
`)}finally{f&&await f.close().catch(()=>{})}}if(o){if(yield*c(),l)return}else try{i=(await Bn.stat(n)).size}catch{}let d=null,u=null,p=()=>new Promise(f=>{let m=setTimeout(()=>{u=null,f()},Tx);u=()=>{clearTimeout(m),u=null,f()},s?.addEventListener("abort",()=>{clearTimeout(m),u=null,f()},{once:!0})});try{d=Un.watch(r,{persistent:!1},()=>{u?.()})}catch{}try{for(;!s?.aborted&&!l&&(await p(),!s?.aborted);)yield*c()}finally{d?.close()}}var kg,vg,xt,Tx,ti=b(()=>{"use strict";W();kg=8e3,vg=400;xt=class{sessionId;ledgerPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;constructor(e){if(this.sessionId=e,!br(e)){this.errored=!0,this.ledgerPath="";return}this.ledgerPath=os(e);try{Un.mkdirSync(wr(e),{recursive:!0})}catch(n){process.stderr.write(`[afk] session-ledger: mkdir failed for ${e}: ${String(n)}
|
|
796
796
|
`),this.errored=!0}}get active(){return!this.errored&&!this.closed}record(e){if(this.errored||this.closed)return;let n={v:1,ts:Date.now(),...e},r=JSON.stringify(n)+`
|
|
@@ -802,7 +802,7 @@ Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${t}${r}
|
|
|
802
802
|
`);if(r.length<=1&&t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};if(r.length<=1)return t.length<=80?{content:t,truncated:!1,sizeBytes:e,sizeLabel:n}:{content:t.substring(0,80)+"\u2026",truncated:!0,sizeBytes:e,sizeLabel:n};if(t.length<=80)return{content:t,truncated:!1,sizeBytes:e,sizeLabel:n};let o=r[0]??"",s=o;return o.length>80&&(s=o.substring(0,80)+"\u2026"),{content:s+`\u2026+${r.length} lines`,truncated:!0,lineCount:r.length,sizeBytes:e,sizeLabel:n}}function Ux(t,e){let n={...t.raw??{}};return t.inputTokens!==void 0&&(n.input_tokens=t.inputTokens),t.outputTokens!==void 0&&(n.output_tokens=t.outputTokens),t.cachedInputTokens!==void 0&&(n.cache_read_input_tokens=t.cachedInputTokens),t.cacheCreationTokens!==void 0&&(n.cache_creation_input_tokens=t.cacheCreationTokens),t.totalTokens!==void 0&&(n.total_tokens=t.totalTokens),t.contextWindowTokens!==void 0&&(n.context_window_tokens=t.contextWindowTokens),{sessionId:e,stopReason:t.stopReason??void 0,resultSubtype:t.resultSubtype,durationMs:t.durationMs,durationApiMs:t.durationApiMs,totalCostUsd:t.totalCostUsd,isError:t.isError,usage:Object.keys(n).length>0?n:void 0,modelUsage:t.modelUsage,permissionDenials:t.permissionDenials,errors:t.errors}}function Bx(t){let e=t.isError===!0?null:jg(t.toolName,t.content),n=e!==null?{display:e}:{},r=typeof t.batchIndex=="number"&&typeof t.batchSize=="number"?{batchIndex:t.batchIndex,batchSize:t.batchSize}:{},o=Lx(t.content);if(o)return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:`Output persisted (${o.sizeLabel}) \u2192 ${o.absolutePath}`,isError:t.isError===!0,persistedPath:o.absolutePath,sizeBytes:o.sizeBytes,sizeLabel:o.sizeLabel,...n,...r}};let{content:s,lineCount:i,sizeBytes:a,sizeLabel:l}=$x(t.content);return{type:"chunk",chunk:{type:"tool_result",toolUseId:t.toolUseId,content:s,isError:t.isError===!0,sizeBytes:a,sizeLabel:l,...t.truncated===!0&&{truncated:!0},...i!==void 0&&{lineCount:i},...n,...r}}}function $c(t,e){switch(t.type){case"session.init":{let n=t.info;return e.setSessionMetadata(r=>({...r,sessionId:n.sessionId,model:n.model??r.model,...n.permissionMode!==void 0?{permissionMode:n.permissionMode}:{},...n.cwd!==void 0?{cwd:n.cwd}:{},tools:n.tools?[...n.tools]:r.tools,slashCommands:n.slashCommands?[...n.slashCommands]:r.slashCommands,skills:n.skills?[...n.skills]:r.skills,plugins:n.plugins?n.plugins.map(o=>({...o})):r.plugins,mcpServers:n.mcpServers?n.mcpServers.map(o=>({...o})):r.mcpServers,...n.apiKeySource!==void 0?{apiKeySource:n.apiKeySource}:{},...n.version!==void 0?{claudeCodeVersion:n.version}:{},...n.outputStyle!==void 0?{outputStyle:n.outputStyle}:{}})),e.updateSessionIdentity(n.sessionId),e.resolveInitialization(),null}case"session.status":return e.setSessionMetadata(n=>({...n,sessionId:t.sessionId,...t.permissionMode!==void 0?{permissionMode:t.permissionMode}:{permissionMode:n.permissionMode},...t.status!==void 0?{status:t.status}:{}})),null;case"delta.text":return{type:"chunk",chunk:{type:"content",content:t.text,metadata:{eventType:"delta",deltaType:"text_delta"}}};case"delta.reasoning":return{type:"chunk",chunk:{type:"thinking",content:t.text,metadata:{eventType:"delta",deltaType:"thinking_delta"}}};case"assistant.message":if(t.sessionId&&e.updateSessionIdentity(t.sessionId),t.text){let n={role:"assistant",content:t.text,timestamp:new Date};return e.conversationHistory.push(n),{type:"message",message:n}}return null;case"tool.use.start":return{type:"chunk",chunk:{type:"tool_use_detail",toolUseId:t.toolUseId,toolName:t.toolName,toolInput:t.toolInput,toolInputRaw:t.toolInputRaw}};case"tool.use":return{type:"chunk",chunk:{type:"tool_use",content:t.summary,metadata:{eventType:"tool_use_summary",precedingToolUseIds:t.toolUseIds}}};case"tool.output":return t.isError!==!0&&t.toolName&&(e._successfulToolNames??=[]).push(t.toolName),Bx(t);case"tool.diff":return{type:"chunk",chunk:{type:"tool_diff",toolUseId:t.toolUseId,diff:t.diff}};case"progress":return{type:"progress",progress:{taskId:t.progress.taskId,description:t.progress.description,...t.progress.summary!==void 0?{summary:t.progress.summary}:{},...t.progress.lastToolName!==void 0?{lastToolName:t.progress.lastToolName}:{},totalTokens:t.progress.totalTokens,toolUses:t.progress.toolUses,durationMs:t.progress.durationMs}};case"suggestion":return{type:"suggestion",suggestion:t.suggestion};case"turn.completed":{let n=Ux(t.usage,t.sessionId??e.getSessionMetadata().sessionId);e._successfulToolNames!==void 0&&e._successfulToolNames.length>0&&(n.successfulToolNames=[...e._successfulToolNames]),e.setLastResponseMetadata(n);for(let r=e.conversationHistory.length-1;r>=0;r--){let o=e.conversationHistory[r];if(o?.role==="assistant"){o.metadata=n;break}}if(e.maxBudgetUsd!==void 0&&e.abortBudget!==void 0&&typeof n.totalCostUsd=="number"&&(e._runningCostUsd=(e._runningCostUsd??0)+n.totalCostUsd,e._runningCostUsd>=e.maxBudgetUsd)){hm(e.traceWriter,{kind:"monetary",runningCostUsd:e._runningCostUsd,maxBudgetUsd:e.maxBudgetUsd,lastTurnCostUsd:n.totalCostUsd});let r=new An(e._runningCostUsd,e.maxBudgetUsd);return e.abortBudget(r.message),{type:"error",error:r}}return{type:"done",metadata:n}}case"error":return{type:"error",error:t.error};case"paused":return{type:"paused",reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}};case"resumed":return{type:"resumed",hotSwapped:t.hotSwapped,...t.accountId!==void 0?{accountId:t.accountId}:{}};case"stream.retry":return{type:"stream_retry"};case"rate_limit":return{type:"rate_limit",...t.retryAfterMs!==void 0?{retryAfterMs:t.retryAfterMs}:{}};default:return null}}var Wg=b(()=>{"use strict";ae();Q();Hg()});import{stat as jx,readFile as Hx,writeFile as Wx,rename as Kx,unlink as Gx}from"node:fs/promises";async function qg(t,{maxBytes:e,keepTailLines:n}){let r={trimmed:!1,removedLines:0},o;try{if((await jx(t)).size<=e)return r;let a=(await Hx(t,"utf8")).split(`
|
|
803
803
|
`);if(a.length>0&&a[a.length-1]===""&&a.pop(),a.length<=n)return r;let l=a.slice(a.length-n),c=a.length-l.length;return o=`${t}.tmp-${process.pid}-${Math.random().toString(36).slice(2,8)}`,await Wx(o,l.join(`
|
|
804
804
|
`)+`
|
|
805
|
-
`,{mode:384}),await Kx(o,t),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await Gx(o)}catch{}return r}}var Kg,Gg,zg=b(()=>{"use strict";Kg=5*1024*1024,Gg=5e3});import{z as qx}from"zod";var nn,Jg=b(()=>{"use strict";oe();ae();Q();ge();lg();me();Dc();pg();ae();wg();Fc();Pc();Eg();Ag();Oe();_t();jn();Me();Mc();Mg();Og();Wg();W();zg();nn=class{config;planExit=new ri;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new ni;constructor(e){this.config=e.parentSessionId===void 0&&e.planExitControls===void 0?{...e,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:e,this.abortController=new AbortController,this._hookRegistry=e.hookRegistry,Ig(e.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(e.model);Z(e.traceWriter,{phase:"session_init_start",model:n,resolvedModel:de(e.model)??n,origin:kt(e.surface),actor:ps(e.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&qg(es(),{maxBytes:Kg,keepTailLines:Gg})}initSdkLifecycle(){this.config.models&&xs(this.config.models),Js(this.config);let e=de(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=Pg(this.config,e);this.stateManager=new oi(n,r),this.inputStream=new $n(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)$(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{$("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let i=this.config.providerFactory?this.config.providerFactory:a=>Vg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new Vs({prompt:o,config:this.config},{resolveProvider:i,providerNameForModel:a=>J(a),resolveApiKey:a=>ee(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{
|
|
805
|
+
`,{mode:384}),await Kx(o,t),o=void 0,{trimmed:!0,removedLines:c}}catch{if(o!==void 0)try{await Gx(o)}catch{}return r}}var Kg,Gg,zg=b(()=>{"use strict";Kg=5*1024*1024,Gg=5e3});import{z as qx}from"zod";var nn,Jg=b(()=>{"use strict";oe();ae();Q();ge();lg();me();Dc();pg();ae();wg();Fc();Pc();Eg();Ag();Oe();_t();jn();Me();Mc();Mg();Og();Wg();W();zg();nn=class{config;planExit=new ri;currentState="idle";providerQuery;providerIterator;conversationHistory=[];turnCount=0;pendingFrameworkContext=[];lastResponseMetadata=null;initPromise=null;inputStream;abortController;_hookRegistry;sessionEndDispatched=!1;stateManager;sessionRunningCostUsd=0;sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};lastStopReason;maxTurnsHit=!1;hookBlocked=!1;sawProviderError=!1;sessionStartedAt=Date.now();subagentCompletedCount=0;subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0};subagentRunningCostUsd=0;ledger=new ni;constructor(e){this.config=e.parentSessionId===void 0&&e.planExitControls===void 0?{...e,planExitControls:{setPermissionMode:r=>this.setPermissionMode(r),requestImplementSeed:(r,o)=>this.planExit.requestImplementSeed(r,o),getPrePlanMode:()=>this.planExit.getPrePlanMode()}}:e,this.abortController=new AbortController,this._hookRegistry=e.hookRegistry,Ig(e.abortSignal,this.abortController,()=>{this.onAbort()});let n=String(e.model);Z(e.traceWriter,{phase:"session_init_start",model:n,resolvedModel:de(e.model)??n,origin:kt(e.surface),actor:ps(e.parentSessionId)}),this.initSdkLifecycle(),this.config.parentSessionId===void 0&&qg(es(),{maxBytes:Kg,keepTailLines:Gg})}initSdkLifecycle(){this.config.models&&xs(this.config.models),Js(this.config);let e=de(this.config.model)??this.config.model,{sessionIdentity:n,metadata:r}=Pg(this.config,e);this.stateManager=new oi(n,r),this.inputStream=new $n(()=>this.sessionId);let o=this.inputStream.createIterable();if(this.config.provider)$(`\u{1F7E2} AgentSession: Creating query session via injected provider=${this.config.provider.name}`),this.providerQuery=this.config.provider.query({prompt:o,config:this.config});else{$("\u{1F7E2} AgentSession: Creating query session via ProviderRouter");let i=this.config.providerFactory?this.config.providerFactory:a=>Vg(a,void 0,{customTools:this.config.customTools,canUseTool:this.config.canUseTool});this.providerQuery=new Vs({prompt:o,config:this.config},{resolveProvider:i,providerNameForModel:a=>J(a),resolveApiKey:a=>ee(a)})}this.conversationHistory=[],this.turnCount=0,this.lastResponseMetadata=null,this.sessionRunningCostUsd=0,this.sessionRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.lastStopReason=void 0,this.maxTurnsHit=!1,this.hookBlocked=!1,this.sawProviderError=!1,this.sessionEndDispatched=!1,this.currentState="idle",this.subagentCompletedCount=0,this.subagentRunningTokens={input:0,output:0,cacheRead:0,cacheCreation:0},this.subagentRunningCostUsd=0,this.pendingFrameworkContext=[];let s=this.providerQuery;this.providerIterator=s[Symbol.asyncIterator](),this.initPromise=this.pullInitialization()}async pullInitialization(){try{let e=await dg(this._hookRegistry,{event:"SessionStart",sessionId:this.sessionId,parentSessionId:this.config.parentSessionId},{signal:this.abortController.signal,...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}});for(e&&this.config.parentSessionId===void 0&&this.queueFrameworkContext(e);;){let n=await this.providerIterator.next();if(n.done){this.stateManager.resolveInitializationIfNeeded();return}let r=n.value,o=$c(r,this.buildTransformDeps());if(r.type==="session.init"){await Z(this.config.traceWriter,{phase:"session_init_done",durationMs:Date.now()-this.sessionStartedAt});return}if(o&&o.type==="error"){this.sawProviderError=!0;return}}}catch(e){let n=e instanceof Error?e:new Error(String(e));n instanceof X&&(this.hookBlocked=!0),this.stateManager.isInitializationSettled()||this.stateManager.rejectInitializationOnce(n),await this.dispatchSessionEndOnce("error").catch(()=>{})}}buildTransformDeps(){return{_successfulToolNames:[],conversationHistory:this.conversationHistory,getSessionMetadata:()=>this.stateManager.getSessionMetadata(),setSessionMetadata:e=>this.stateManager.setSessionMetadata(e),updateSessionIdentity:e=>this.stateManager.updateSessionIdentity(e),resolveInitialization:()=>this.stateManager.resolveInitializationOnce(),setLastResponseMetadata:e=>{this.lastResponseMetadata=e,typeof e.totalCostUsd=="number"&&Number.isFinite(e.totalCostUsd)&&(this.sessionRunningCostUsd+=e.totalCostUsd);let n=e.usage;if(n&&typeof n=="object"){let r=n,o=(s,i)=>{let a=r[s];typeof a=="number"&&Number.isFinite(a)&&(this.sessionRunningTokens[i]+=a)};o("input_tokens","input"),o("output_tokens","output"),o("cache_read_input_tokens","cacheRead"),o("cache_creation_input_tokens","cacheCreation")}typeof e.stopReason=="string"&&(this.lastStopReason=e.stopReason)},maxBudgetUsd:this.config.maxBudgetUsd,abortBudget:e=>{this.abortController.signal.aborted||this.abortController.abort(e)},...this.config.traceWriter?{traceWriter:this.config.traceWriter}:{}}}get state(){return this.currentState}get sessionId(){return this.stateManager.getSessionId()}get cwd(){return this.config.cwd}get abortSignal(){return this.abortController.signal}get hookRegistry(){return this._hookRegistry}abort(e){if(e==="closed"||e.startsWith("Budget ")||e.includes("timed out"))throw new Error(`AgentSession.abort: reserved reason "${e}" (use a caller-specific string like 'sigint')`);this.abortController.signal.aborted||this.abortController.abort(e)}async sendMessage(e,n={}){this.assertCanSend();let r=this.config.timeoutMs??cg,o=async()=>{let s=null,i="";this.currentState=n.stream?"streaming":"processing";for await(let a of this.sendMessageStreamInternal(e)){if(a.type==="chunk"&&a.chunk.type==="content"&&(i+=a.chunk.content),a.type==="message"&&a.message.role==="assistant"&&(s=a.message),a.type==="error")throw a.error;if(a.type==="done"){if(s)return{...s,metadata:a.metadata};if(i)return{role:"assistant",content:i,metadata:a.metadata,timestamp:new Date}}}if(s)return s;if(i)return{role:"assistant",content:i,timestamp:new Date};throw new Error("No assistant response received")};try{return await Ys(o(),r,{controller:this.abortController,label:this.sessionId??"session"})}finally{this.currentState==="processing"&&(this.currentState="idle")}}async sendMessageStructured(e,n,r={}){let{maxRetries:o=2,injectSchemaPrompt:s=!0,...i}=r,a=s?"\n\nRespond with ONLY a JSON object (optionally in a ```json fence) that conforms to this JSON Schema:\n```json\n"+JSON.stringify(qx.toJSONSchema(n,{target:"openapi-3.0"}))+"\n```":"",l="";for(let c=0;c<=o;c++){let d=c===0?e+a:`Your previous response did not match the required JSON schema.
|
|
806
806
|
Validation error: ${l}
|
|
807
807
|
Respond again with ONLY a JSON object (optionally in a \`\`\`json fence) that satisfies the schema.`+a,u=await this.sendMessage(d,i),p=Qs(u.content),f=n.safeParse(p);if(f.success)return f.data;l=f.error.message}throw new Error(`structured output did not match schema after ${o+1} attempt(s): ${l}`)}async*sendMessageStream(e){this.assertCanSend(),this.currentState="streaming";try{yield*this.sendMessageStreamInternal(e)}finally{this.currentState==="streaming"&&(this.currentState="idle")}}async*sendMessageStreamInternal(e){this.initPromise&&await this.initPromise,this.planExit.clearModeBeforeDefault();let n=this.withPendingFrameworkContext(e),r=typeof n=="string"?n:this.summarizeContentBlocks(n),o={role:"user",content:r,timestamp:new Date};this.conversationHistory.push(o),this.inputStream.pushUserMessage(n),this.ensureLedger(),this.ledger.recordUser(r);let s=this.buildTransformDeps();try{for(;;){let i=await this.providerIterator.next();if(i.done)break;let a=i.value,l=$c(a,s);if(l&&(l.type==="done"?(this.turnCount++,this.sawProviderError=!1):l.type==="error"&&(this.sawProviderError=!0),this.ledger.recordEvent(l),yield l,l.type==="done"||l.type==="error"))break}}finally{this.currentState==="streaming"&&(this.currentState="idle")}}ensureLedger(){this.ledger.ensure({depth:this.config.depth,parentSessionId:this.config.parentSessionId,sessionId:this.sessionId,fallbackModel:String(this.config.model),tracePath:this.config.traceWriter?.getTracePath(),getMetadata:()=>this.getSessionMetadata()})}recordLedgerElicitation(e,n){this.ledger.recordElicitation(e,n)}summarizeContentBlocks(e){let n=[],r=0;for(let s of e)s.type==="text"?n.push(s.text):s.type==="image"&&r++;let o=n.join(" ");return r>0&&(o=o?`${o} [+ ${r} image(s)]`:`[+ ${r} image(s)]`),o||"[content block(s)]"}async interrupt(){this.currentState!=="streaming"&&this.currentState!=="processing"||(this.currentState="idle",await this.providerQuery.interrupt())}async reset(){if(this.currentState==="closed")throw new Error("Cannot reset: session is closed");if(this.abortController.signal.aborted)throw new Ae("Cannot reset: session aborted");if(this.currentState==="processing"||this.currentState==="streaming")try{await this.providerQuery.interrupt()}catch{}await this.dispatchSessionEndOnce("reset"),await this.ledger.seal("reset");try{await this.providerQuery.close()}catch{}await this.providerIterator.return?.(),this.initPromise&&await Promise.race([this.initPromise,new Promise(e=>setTimeout(e,Oc))]).catch(()=>{}),this.stateManager.resolveInitializationIfNeeded(),this.config={...this.config},delete this.config.resume,delete this.config.sessionId,delete this.config.resumeHistory,delete this.config.resumeSessionAt,delete this.config.continue,delete this.config.forkSession;try{this.initSdkLifecycle()}catch(e){throw this.currentState="closed",new Error(`Session reset failed during lifecycle rebuild: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async onAbort(){this.ledger.seal("abort");try{await this.providerQuery.interrupt()}catch{}}async setModel(e){let n=de(e);typeof e=="string"&&e.length>0&&await this.providerQuery.setModel(e),n&&this.stateManager.setSessionMetadata(r=>({...r,model:n}))}async setPermissionMode(e){let n=this.stateManager.getSessionMetadata().permissionMode;this.planExit.recordModeTransition(e,n),await this.providerQuery.setPermissionMode(e),this.stateManager.setSessionMetadata(r=>({...r,permissionMode:e}))}getPrePlanMode(){return this.planExit.getPrePlanMode()}async takePendingPlanExitSeed(){let e=this.planExit.takeSeed();if(e!==void 0){try{await this.setPermissionMode(e.mode)}catch(n){$(`\u26A0\uFE0F AgentSession: deferred plan-exit mode flip to '${e.mode}' rejected; dropping implement-seed (staying in plan mode): ${n instanceof Error?n.message:String(n)}`);return}return{message:e.message,mode:e.mode}}}setCwd(e){this.config={...this.config,cwd:e},this.providerQuery.setCwd?.(e),this.config.sessionId!==void 0&&Cg(this.config.sessionId,e)}async reauth(){return await this.providerQuery.reauth?.()??null}waitForInitialization(){return this.stateManager.waitForInitialization()}getSessionIdentity(){return this.stateManager.getSessionIdentity()}getSessionMetadata(){return this.stateManager.getSessionMetadata()}getQuery(){return this.providerQuery}supportedCommands(){return this.providerQuery.supportedCommands()}supportedModels(){return this.providerQuery.supportedModels()}supportedAgents(){return this.providerQuery.supportedAgents()}getContextUsage(){return this.providerQuery.getContextUsage()}mcpServerStatus(){return this.providerQuery.mcpServerStatus()}accountInfo(){return this.providerQuery.accountInfo()}rewindFiles(e,n){return this.providerQuery.rewindFiles(e,n)}async compact(){if(this.currentState==="closed")throw new Error("Cannot compact: session is closed");if(this.currentState!=="idle")return{compacted:!1,reason:"session-busy",messagesBefore:0,messagesAfter:0};let e=this.providerQuery.compact?.bind(this.providerQuery);if(!e)return{compacted:!1,reason:"not-supported",messagesBefore:0,messagesAfter:0};this.currentState="compacting";try{return await e()}finally{this.currentState="idle"}}getLastResponseMetadata(){return this.lastResponseMetadata}getOutputStream(){throw new Error("getOutputStream() is not supported \u2014 use sendMessageStream() instead")}queueFrameworkContext(e){let n=e.trim();n.length!==0&&(this.pendingFrameworkContext.push(n),$(`AgentSession: queued framework context (${n.length} chars) for the next user message`))}withPendingFrameworkContext(e){if(this.pendingFrameworkContext.length===0)return e;let n=this.pendingFrameworkContext.join(`
|
|
808
808
|
|
|
@@ -853,7 +853,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
|
|
|
853
853
|
Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:k});return}if(v===2){let k=zn(g.trim());d({content:`grep error: ${k.content}`,isError:!0,...k.truncated?{truncated:!0}:{}});return}let x=Xe(m.trimEnd()),T=zn(x);d({content:T.content,...T.truncated?{truncated:!0}:{}})}),f.on("error",v=>{let x;if(p===void 0&&Gr(v))try{x=qn(v,process.cwd())}catch{x=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${v.message}`}else x=qn(v,p);d({content:`Failed to execute grep: ${x}`,isError:!0})})})}}var Fh,Lh=b(()=>{"use strict";Ze();ht();tn();od();sd();Fh=gd()});import{promises as NI}from"fs";function hd(t){return(e,n,r)=>$I(e,n,r,t)}var $I,Nh,$h=b(()=>{"use strict";ht();$I=async(t,e,n,r)=>{if(!t||typeof t!="object")throw new Error("Invalid input: expected an object");let s=t.path;if(typeof s!="string")throw new Error("Invalid input: path must be a string");let i;try{i=Ne(s,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await NI.readdir(i,{withFileTypes:!0}),l=a.filter(p=>p.isDirectory()).map(p=>`${p.name}/`),c=a.filter(p=>!p.isDirectory()).map(p=>p.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
|
|
854
854
|
`)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${i}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${i}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${i}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};Nh=hd()});function UI(t=Fn){return async(e,n)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected an object",isError:!0};let o=e.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Uh)return{content:`Invalid input: message exceeds Telegram's ${Uh}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=E.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=Ks();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await t({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var Uh,Bh,jh=b(()=>{"use strict";j();$r();Tc();Uh=4096;Bh=UI()});async function BI(){let[{JSDOM:t},{Readability:e},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:t,Readability:e,turndown:r}}function jI(){return yd===null&&(yd=BI()),yd}function Hh(t){return t.replace(/\n{3,}/g,`
|
|
855
855
|
|
|
856
|
-
`).trim()}function HI(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Wh(t,e){let{JSDOM:n,Readability:r,turndown:o}=await jI(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Hh(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Hh(o.turndown(d));return{title:a,markdown:u,textLength:HI(c),usedFallback:!0}}var yd,Kh=b(()=>{"use strict";yd=null});function KI(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 Gh(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function GI(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 Ti(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??KI,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!WI.has(u.status)||d===o)return u;let p=GI(u,i)??Gh(d,s,i);$("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Gh(d,s,i);$("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var WI,bd=b(()=>{"use strict";oe();WI=new Set([429,502,503,504])});import{readFileSync as qI}from"node:fs";import{join as zI}from"path";function JI(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function qh(t,e){return JI(e).test(t)}function XI(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(VI.has(e))return!0;if(YI.has(e))return!1}return!1}function zh(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function QI(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Jh(t){let e=t===void 0||t.trim()===""?"default":t.trim();return $l(e),e}function ZI(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function eP(t){try{return qI(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function tP(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")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Jh(e.defaultProfile)),n}function Vh(t){let e=t?.env??E,n=t?.readFileSync??eP,r=t?.surface??e.AGENT_SURFACE,o=XI(e.AFK_BROWSER_HEADLESS,r),s=zh(e.AFK_BROWSER_ALLOWED_DOMAINS),i=zh(e.AFK_BROWSER_BLOCKED_DOMAINS),a=ZI(e.AFK_BROWSER_DOM_SNAPSHOTS),l=QI(e.AFK_BROWSER_BACKEND),c=Jh(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():zI(at(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=tP(d,m);return g.configPath=p,g}function wd(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(qh(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>qh(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var VI,YI,Sd=b(()=>{"use strict";j();W();VI=new Set(["daemon","subagent","telegram","afk"]),YI=new Set(["repl","interactive","cli"])});import pn from"node:fs";import xi from"node:path";import{randomBytes as nP}from"node:crypto";import{chromium as rP}from"playwright";function oP(){try{return"5.51.2"}catch{}try{let t=xi.resolve(import.meta.dirname,"../../../package.json"),e=pn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sP,Ri,Yh=b(()=>{"use strict";W();oe();sP=oP(),Ri=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=rP.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),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=()=>{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",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){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.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/${sP}`}}loadStorageState(e){let n=Ul(e);try{if(!pn.existsSync(n))return;let r=JSON.parse(pn.readFileSync(n,"utf8"));return $("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){$("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Ul(e);if(!pn.existsSync(r))return;let o=await n.storageState(),s=xi.join(xi.dirname(r),`.${xi.basename(r)}.${process.pid}.${nP(4).toString("hex")}.tmp`);pn.writeFileSync(s,JSON.stringify(o),{mode:384}),pn.chmodSync(s,384),pn.renameSync(s,r),$("[browser/vault] saved session",{profile:e,file:r})}catch(r){$("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as iP}from"crypto";function vd(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of aP)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Xh(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&lP.test(t.label))}function Qh(t){return iP("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Zh(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var aP,lP,Yr=b(()=>{"use strict";aP=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];lP=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as cP}from"node:crypto";function dP(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function uP(t,e,n){return`el_${cP("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function pP(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function ey(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ny(t,e){let n=t.role??"",r=t.name??"";ty.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])ny(s,e)}async function fP(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(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,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},ry).catch(()=>[])}async function mP(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")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)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:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},ry).catch(()=>[])}function gP(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ci(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=gP(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=fP(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,S=!1;u!==null?(h=[],ny(u,h)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,h=(await mP(t)).filter(B=>ty.has(B.role??"")));let w=new Map;for(let R of p){let B=ey(R.name),H=w.get(B);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(B,R)}let _=h.map(R=>({ax:R,dom:w.get(ey(R.name??""))})),v=r?_:_.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,B)=>{let H=R.dom?.bbox.y??0,N=B.dom?.bbox.y??0;if(H!==N)return H-N;let D=R.dom?.bbox.x??0,I=B.dom?.bbox.x??0;return D-I}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((R,B)=>{let H=R.ax.role??"generic",N=R.ax.name??"",D=uP(H,N,B),I=R.dom?.bbox??{x:0,y:0,w:0,h:0},P=R.dom?.type??null,M=null;R.ax.value!==void 0&&R.ax.value!==null&&(M=String(R.ax.value)),R.ax.checked!==void 0&&(M=String(R.ax.checked)),Xh({role:H,kind:P})&&(M="[redacted]");let L={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(L.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(L.selected=R.ax.selected),R.ax.expanded!==void 0&&(L.expanded=R.ax.expanded);let K;R.dom?.testId?K=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(K=`#${R.dom.id}`);let U={id:D,role:H,label:dP(N),kind:P,value:M,state:L,bbox:I};return K!==void 0&&(U.selector=K),U}),k="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?k="loading":R==="interactive"?k="navigating":k="idle"}catch{k="navigating"}k!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=pP(f),O=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:O,url:m,title:g,textSummary:A,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:k,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var ty,ry,oy=b(()=>{"use strict";Yr();ty=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ry="a[href], button, input, select, textarea, [role], [tabindex], label"});async function sy(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,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 kd(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>sy(t,s)))).filter(o=>o!==null)}async function hP(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 l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function _d(t,e,n){switch(e.kind){case"element_id":return yP(t,e,n);case"selector":return bP(t,e);case"semantic":return wP(t,e)}}async function yP(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 l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}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 kd(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function bP(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 kd(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function wP(t,e){return e.role!==void 0?SP(t,e.text,e.role):vP(t,e.text,e)}async function SP(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 kd(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function vP(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===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}),l>0&&d.push({loc:s,count:l});let u=await hP(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 h=p[g];if(h===void 0)continue;let S=await sy(h.locator,h.index);if(S!==null){let w=`${S.role}:${S.label}:${g}`,_=0;for(let v=0;v<w.length;v++)_=_*31+w.charCodeAt(v)>>>0;f.push({...S,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var iy=b(()=>{"use strict"});import{randomBytes as kP}from"crypto";import{mkdir as _P,stat as EP,writeFile as AP}from"fs/promises";import{join as Ed}from"path";import{gzip as TP}from"zlib";import{promisify as xP}from"util";function RP(t){return Ed(ns(t),"browser")}function CP(t){return Ed(RP(t),"screenshots")}function IP(){return new Date().toISOString().replace(/[:.]/g,"-")}function PP(){return kP(3).toString("hex")}async function Ad(t,e,n){if(e.length>ay)throw new Error(`writeScreenshotSidecar: buffer exceeds ${ay} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=CP(t);await _P(r,{recursive:!0});let o=`${IP()}-${PP()}-${n}.png`,s=Ed(r,o);await AP(s,e);let{size:i}=await EP(s);return{path:s,bytes:i}}var Kz,ay,ly=b(()=>{"use strict";W();Yr();Kz=xP(TP);ay=5*1024*1024});var dy={};Pl(dy,{PlaywrightProvider:()=>Td});function cy(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 Td,uy=b(()=>{"use strict";Yh();oy();iy();Sd();Yr();ly();Td=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ri(e)}async open(e){let n=wd(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(c){a=c}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Ci(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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 Ci(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 _d(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${cy(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":{let g=vd(e.value??"");await l.fill(e.value??"");break}case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.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(h){c=h}else c=g}let u=r.url();if(u!==s){let g=wd(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ci(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),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}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 _d(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${cy(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 Ad(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,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 Ad(n,o,r);return s}catch{return null}}}});var mn={};Pl(mn,{__resetBrowserRegistryForTests:()=>LP,browserProviderActive:()=>DP,closeBrowserProvider:()=>xd,getBrowserProvider:()=>OP,peekBrowserProvider:()=>FP});function py(){Promise.resolve(xd()).then(()=>{process.exit(130)})}function fy(){Promise.resolve(xd()).then(()=>{process.exit(143)})}function my(){nt=null}function MP(){Ii||(process.on("SIGINT",py),process.on("SIGTERM",fy),process.on("exit",my),Ii=!0)}function gy(){Ii&&(process.removeListener("SIGINT",py),process.removeListener("SIGTERM",fy),process.removeListener("exit",my),Ii=!1)}async function OP(t){return nt!==null?nt:(fn!==null||(fn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(uy(),dy)),n=Vh(t),r=new e(n);return MP(),nt=r,fn=null,r})()),fn)}async function xd(){if(nt===null)return;let t=nt;nt=null,fn=null,gy(),await t.shutdown()}function DP(){return nt!==null}function FP(){return nt}function LP(){nt=null,fn=null,gy()}var nt,fn,Ii,gn=b(()=>{"use strict";Sd();nt=null,fn=null,Ii=!1});async function hy(t,e){try{return await Wh(t,e)}catch(n){return $("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function HP(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(gn(),mn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function yy(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??HP,o=null,s=t,i=null,a=null;try{let c=await Ti(n,t,{headers:jP,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(BP.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(UP.test(d)&&!$P.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await hy(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await hy(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var $P,UP,BP,jP,by=b(()=>{"use strict";Kh();bd();oe();$P=/(text\/html|application\/xhtml\+xml)/i,UP=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,BP=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,jP={"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 GP(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(WP,{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),KP),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=Hn(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function wy(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?GP({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 Sy(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
856
|
+
`).trim()}function HI(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Wh(t,e){let{JSDOM:n,Readability:r,turndown:o}=await jI(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Hh(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Hh(o.turndown(d));return{title:a,markdown:u,textLength:HI(c),usedFallback:!0}}var yd,Kh=b(()=>{"use strict";yd=null});function KI(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 Gh(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function GI(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 Ti(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??KI,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!WI.has(u.status)||d===o)return u;let p=GI(u,i)??Gh(d,s,i);$("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Gh(d,s,i);$("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var WI,bd=b(()=>{"use strict";oe();WI=new Set([429,502,503,504])});import{readFileSync as qI}from"node:fs";import{join as zI}from"path";function JI(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function qh(t,e){return JI(e).test(t)}function XI(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(VI.has(e))return!0;if(YI.has(e))return!1}return!1}function zh(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function QI(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Jh(t){let e=t===void 0||t.trim()===""?"default":t.trim();return $l(e),e}function ZI(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function eP(t){try{return qI(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function tP(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")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Jh(e.defaultProfile)),n}function Vh(t){let e=t?.env??E,n=t?.readFileSync??eP,r=t?.surface??e.AGENT_SURFACE,o=XI(e.AFK_BROWSER_HEADLESS,r),s=zh(e.AFK_BROWSER_ALLOWED_DOMAINS),i=zh(e.AFK_BROWSER_BLOCKED_DOMAINS),a=ZI(e.AFK_BROWSER_DOM_SNAPSHOTS),l=QI(e.AFK_BROWSER_BACKEND),c=Jh(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():zI(at(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=tP(d,m);return g.configPath=p,g}function wd(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(qh(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>qh(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var VI,YI,Sd=b(()=>{"use strict";j();W();VI=new Set(["daemon","subagent","telegram","afk"]),YI=new Set(["repl","interactive","cli"])});import pn from"node:fs";import xi from"node:path";import{randomBytes as nP}from"node:crypto";import{chromium as rP}from"playwright";function oP(){try{return"5.52.0"}catch{}try{let t=xi.resolve(import.meta.dirname,"../../../package.json"),e=pn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var sP,Ri,Yh=b(()=>{"use strict";W();oe();sP=oP(),Ri=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(e){this.config=e}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=rP.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,e)).catch(e=>{throw this.launchPromise=void 0,e}),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=()=>{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",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){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.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/${sP}`}}loadStorageState(e){let n=Ul(e);try{if(!pn.existsSync(n))return;let r=JSON.parse(pn.readFileSync(n,"utf8"));return $("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){$("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Ul(e);if(!pn.existsSync(r))return;let o=await n.storageState(),s=xi.join(xi.dirname(r),`.${xi.basename(r)}.${process.pid}.${nP(4).toString("hex")}.tmp`);pn.writeFileSync(s,JSON.stringify(o),{mode:384}),pn.chmodSync(s,384),pn.renameSync(s,r),$("[browser/vault] saved session",{profile:e,file:r})}catch(r){$("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as iP}from"crypto";function vd(t){if(t.length===0)return t;let e=t;for(let{regex:n,name:r}of aP)r==="form-password"?e=e.replace(n,"password=[redacted]"):e=e.replace(n,"[redacted]");return e}function Xh(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&lP.test(t.label))}function Qh(t){return iP("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Zh(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var aP,lP,Yr=b(()=>{"use strict";aP=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];lP=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as cP}from"node:crypto";function dP(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function uP(t,e,n){return`el_${cP("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function pP(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function ey(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function ny(t,e){let n=t.role??"",r=t.name??"";ty.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])ny(s,e)}async function fP(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(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,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},ry).catch(()=>[])}async function mP(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")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)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:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},ry).catch(()=>[])}function gP(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ci(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=gP(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=fP(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,S=!1;u!==null?(h=[],ny(u,h)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,h=(await mP(t)).filter(B=>ty.has(B.role??"")));let w=new Map;for(let R of p){let B=ey(R.name),H=w.get(B);(!H||H.bbox.w===0&&R.bbox.w>0)&&w.set(B,R)}let _=h.map(R=>({ax:R,dom:w.get(ey(R.name??""))})),v=r?_:_.filter(R=>R.dom?R.dom.bbox.w>0||R.dom.bbox.h>0:!0);v.sort((R,B)=>{let H=R.dom?.bbox.y??0,N=B.dom?.bbox.y??0;if(H!==N)return H-N;let D=R.dom?.bbox.x??0,I=B.dom?.bbox.x??0;return D-I}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=v.slice(0,n).map((R,B)=>{let H=R.ax.role??"generic",N=R.ax.name??"",D=uP(H,N,B),I=R.dom?.bbox??{x:0,y:0,w:0,h:0},P=R.dom?.type??null,M=null;R.ax.value!==void 0&&R.ax.value!==null&&(M=String(R.ax.value)),R.ax.checked!==void 0&&(M=String(R.ax.checked)),Xh({role:H,kind:P})&&(M="[redacted]");let L={disabled:R.ax.disabled??!1};R.ax.checked!==void 0&&(L.checked=R.ax.checked===!0||R.ax.checked==="mixed"),R.ax.selected!==void 0&&(L.selected=R.ax.selected),R.ax.expanded!==void 0&&(L.expanded=R.ax.expanded);let K;R.dom?.testId?K=`[data-testid="${R.dom.testId}"]`:R.dom?.id&&(K=`#${R.dom.id}`);let U={id:D,role:H,label:dP(N),kind:P,value:M,state:L,bbox:I};return K!==void 0&&(U.selector=K),U}),k="idle";try{let R=await t.evaluate(()=>document.readyState);R==="loading"?k="loading":R==="interactive"?k="navigating":k="idle"}catch{k="navigating"}k!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let A=pP(f),O=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:O,url:m,title:g,textSummary:A,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:k,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var ty,ry,oy=b(()=>{"use strict";Yr();ty=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);ry="a[href], button, input, select, textarea, [role], [tabindex], label"});async function sy(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,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 kd(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>sy(t,s)))).filter(o=>o!==null)}async function hP(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 l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function _d(t,e,n){switch(e.kind){case"element_id":return yP(t,e,n);case"selector":return bP(t,e);case"semantic":return wP(t,e)}}async function yP(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 l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}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 kd(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function bP(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 kd(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function wP(t,e){return e.role!==void 0?SP(t,e.text,e.role):vP(t,e.text,e)}async function SP(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 kd(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function vP(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===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}),l>0&&d.push({loc:s,count:l});let u=await hP(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 h=p[g];if(h===void 0)continue;let S=await sy(h.locator,h.index);if(S!==null){let w=`${S.role}:${S.label}:${g}`,_=0;for(let v=0;v<w.length;v++)_=_*31+w.charCodeAt(v)>>>0;f.push({...S,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var iy=b(()=>{"use strict"});import{randomBytes as kP}from"crypto";import{mkdir as _P,stat as EP,writeFile as AP}from"fs/promises";import{join as Ed}from"path";import{gzip as TP}from"zlib";import{promisify as xP}from"util";function RP(t){return Ed(ns(t),"browser")}function CP(t){return Ed(RP(t),"screenshots")}function IP(){return new Date().toISOString().replace(/[:.]/g,"-")}function PP(){return kP(3).toString("hex")}async function Ad(t,e,n){if(e.length>ay)throw new Error(`writeScreenshotSidecar: buffer exceeds ${ay} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=CP(t);await _P(r,{recursive:!0});let o=`${IP()}-${PP()}-${n}.png`,s=Ed(r,o);await AP(s,e);let{size:i}=await EP(s);return{path:s,bytes:i}}var Kz,ay,ly=b(()=>{"use strict";W();Yr();Kz=xP(TP);ay=5*1024*1024});var dy={};Pl(dy,{PlaywrightProvider:()=>Td});function cy(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 Td,uy=b(()=>{"use strict";Yh();oy();iy();Sd();Yr();ly();Td=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Ri(e)}async open(e){let n=wd(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(c){a=c}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Ci(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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 Ci(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 _d(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${cy(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":{let g=vd(e.value??"");await l.fill(e.value??"");break}case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.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(h){c=h}else c=g}let u=r.url();if(u!==s){let g=wd(u,this.config);if(!g.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:g.reason}}let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ci(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),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}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 _d(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${cy(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 Ad(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,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 Ad(n,o,r);return s}catch{return null}}}});var mn={};Pl(mn,{__resetBrowserRegistryForTests:()=>LP,browserProviderActive:()=>DP,closeBrowserProvider:()=>xd,getBrowserProvider:()=>OP,peekBrowserProvider:()=>FP});function py(){Promise.resolve(xd()).then(()=>{process.exit(130)})}function fy(){Promise.resolve(xd()).then(()=>{process.exit(143)})}function my(){nt=null}function MP(){Ii||(process.on("SIGINT",py),process.on("SIGTERM",fy),process.on("exit",my),Ii=!0)}function gy(){Ii&&(process.removeListener("SIGINT",py),process.removeListener("SIGTERM",fy),process.removeListener("exit",my),Ii=!1)}async function OP(t){return nt!==null?nt:(fn!==null||(fn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(uy(),dy)),n=Vh(t),r=new e(n);return MP(),nt=r,fn=null,r})()),fn)}async function xd(){if(nt===null)return;let t=nt;nt=null,fn=null,gy(),await t.shutdown()}function DP(){return nt!==null}function FP(){return nt}function LP(){nt=null,fn=null,gy()}var nt,fn,Ii,gn=b(()=>{"use strict";Sd();nt=null,fn=null,Ii=!1});async function hy(t,e){try{return await Wh(t,e)}catch(n){return $("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function HP(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(gn(),mn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function yy(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??HP,o=null,s=t,i=null,a=null;try{let c=await Ti(n,t,{headers:jP,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(BP.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(UP.test(d)&&!$P.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await hy(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await hy(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var $P,UP,BP,jP,by=b(()=>{"use strict";Kh();bd();oe();$P=/(text\/html|application\/xhtml\+xml)/i,UP=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,BP=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,jP={"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 GP(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(WP,{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),KP),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=Hn(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function wy(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?GP({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 Sy(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
857
857
|
|
|
858
858
|
(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(`
|
|
859
859
|
`).trimEnd()}var WP,KP,vy=b(()=>{"use strict";tn();WP="https://api.exa.ai/search",KP=10});function ZP(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 l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=qP;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,zP)}let a=JP;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,VP)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Rd(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?t:n.subarray(0,e).toString("utf8")+YP}function eM(t){let e=[],n=t;for(let o=0;o<4&&n instanceof Error;o++)e.push(n.message),n=n.cause;let r=e.join(" | ");return QP.some(o=>r.includes(o))}function tM(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{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 s=ZP(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let d=i.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let u;try{u=await Ti(e,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(f){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await u.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:Rd(p,s.maxBytes)}}if(s.mode==="markdown")try{let u=await yy(s.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Rd(u.markdown,s.maxBytes)}}catch(u){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),f=eM(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${f}`,isError:!0}}let d=wy({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(s.query,{limit:XP,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Rd(Sy(s.query,u),s.maxBytes)}}catch(u){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var qP,zP,JP,VP,YP,XP,QP,ky,_y=b(()=>{"use strict";by();vy();bd();qP=3e4,zP=12e4,JP=1e6,VP=1e7,YP=`
|
|
@@ -971,60 +971,7 @@ ${e}`)}var Eu=b(()=>{"use strict"});function dS(t){return typeof t=="string"&&t.
|
|
|
971
971
|
`),a.allowedTools=S}else if(p==="audience"){let m=f.replace(/^["']|["']$/g,"");(m==="public"||m==="internal")&&(a.audience=m)}else if(p==="context")a.context=f.replace(/^["']|["']$/g,"");else if(p==="read-only"||p==="readOnly")f.replace(/^["']|["']$/g,"").trim()==="true"&&(a.readOnly=!0);else if(p==="model"){let m=f.replace(/^["']|["']$/g,"").trim();m.length>0&&(a.model=m)}}return i.length>0&&(a.body=i),a}catch{return{}}}function z0(t){return t!==void 0?t:new Set([...He,...he,"memory_search","agent","skill"])}var G0,go=b(()=>{"use strict";We();Ke();G0={read:"read_file",edit:"edit_file",write:"write_file",bash:"bash",grep:"grep",glob:"glob",ls:"list_directory",list:"list_directory",webfetch:"web_scrape",websearch:"web_scrape",webbrowse:"web_scrape"}});function rr(t){let e=t.trim();return e.startsWith('"')&&e.endsWith('"')&&e.length>=2||e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1).trim():e}function V0(t,e,n){let r=rr(t);(r===">"||r===">-"||r==="|"||r==="|-")&&(r="");let s=0;for(let i=n;i<e.length;i++){let a=e[i];if(a===void 0||!/^\s+\S/.test(a))break;let l=a.trim();if(l.startsWith("- "))break;r=r.length>0?`${r} ${l}`:l,s++}return{value:r,consumed:s}}function bn(t,e=()=>{}){if(!t.startsWith("---")){e("missing frontmatter (file must start with ---)");return}let n=t.slice(3),r=n.indexOf(`
|
|
972
972
|
---`);if(r===-1){e("unterminated frontmatter (no closing ---)");return}let o=n.slice(0,r),s=n.slice(r+4),i=s.startsWith(`
|
|
973
973
|
`)?s.slice(1):s,a=o.split(`
|
|
974
|
-
`),l,c,d,u,p,f,m,g,h=[];for(let _=0;_<a.length;_++){let v=a[_];if(v===void 0||v.trim().length===0||/^\s/.test(v))continue;let x=v.indexOf(":");if(x===-1)continue;let T=v.slice(0,x).trim(),k=T.toLowerCase(),A=v.slice(x+1),O=a.slice(_+1);switch(k){case"name":{l=rr(A);break}case"description":{let{value:C,consumed:R}=V0(A,a,_+1);c=C,_+=R;break}case"tools":case"allowed-tools":{m=pS(Ta(A,O));break}case"disallowedtools":case"disallowed-tools":{g=pS(Ta(A,O));break}case"model":{let C=rr(A);C.length>0&&(d=C);break}case"maxturns":case"max-turns":{let C=Number.parseInt(rr(A),10);Number.isFinite(C)&&C>0?u=C:e(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"maxtooluseiterations":case"max-tool-use-iterations":{let C=Number.parseInt(rr(A),10);Number.isFinite(C)&&C>0?p=C:e(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"bash":{let C=rr(A).toLowerCase();C==="read-only"||C==="readonly"?f=!0:e(`unrecognized bash value ${JSON.stringify(A.trim())} \u2014 ignored`);break}default:{J0.has(k)?h.push(T):e(`unknown frontmatter key ${JSON.stringify(T)} \u2014 ignored`);break}}}if(l===void 0||l.length===0){e('missing required frontmatter field "name"');return}if(c===void 0||c.length===0){e(`agent ${JSON.stringify(l)}: missing required frontmatter field "description"`);return}let S=i.trim();if(S.length===0){e(`agent ${JSON.stringify(l)}: empty body \u2014 an agent file's body is its system prompt`);return}let w={description:c,prompt:S,...m!==void 0&&m.length>0?{tools:m}:{},...g!==void 0&&g.length>0?{disallowedTools:g}:{},...d!==void 0?{model:d}:{},...u!==void 0?{maxTurns:u}:{},...p!==void 0?{maxToolUseIterations:p}:{}};return{name:l,definition:w,...f===!0?{bashReadOnly:!0}:{},...h.length>0?{ignoredKeys:h}:{}}}function pS(t){let e=[];for(let n of t){if(n.includes("(")){e.push(n);continue}for(let r of n.split(/\s+/))r.length>0&&e.push(r)}return e}var J0,ho=b(()=>{"use strict";go();J0=new Set(["permissionmode","permission-mode","skills","mcpservers","mcp-servers","hooks","memory","background","effort","isolation","color","initialprompt","initial-prompt"])});function Q0(t){let e=t.trim();if(e.length===0)return null;let n=e.indexOf("(");if(n!==-1){if(e=e.slice(0,n).trim(),e.length===0)return null}else if(e.endsWith(")"))return null;if(e.startsWith("mcp__"))return e;let r=X0[e.toLowerCase()];return r!==void 0?r:mo(e,Y0)}function fS(t){let e=[],n=new Set,r=[];for(let o of t){let s=Q0(o);if(s!==null){if(s===void 0){r.push(o.trim());continue}n.has(s)||(n.add(s),e.push(s))}}return{names:e,dropped:r}}function Z0(t){let e=[],n=0,r="";for(let o of t)o==="("?(n++,r+=o):o===")"?(n=Math.max(0,n-1),r+=o):o===","&&n===0?(e.push(r),r=""):r+=o;return r.length>0&&e.push(r),e}function eD(t){let e=Z0(t.join(",")),n=!1,r=!1,o=new Set;for(let s of e){let i=s.trim();if(i.length===0)continue;let a=i.indexOf("("),l=(a===-1?i:i.slice(0,a)).trim().toLowerCase();if(l!=="agent"&&l!=="task")continue;if(a===-1){n=!0;continue}r=!0;let c=i.slice(a+1).replace(/\)\s*$/,"");for(let d of c.split(",")){let u=d.trim();u.length>0&&o.add(u)}}if(!n){if(o.size>0)return[...o];if(r)return[]}}function Tu(t,e){let{tools:n,disallowedTools:r}=t.definition,o=t.bashReadOnly===!0,s=r!==void 0?fS(r):void 0,i=n!==void 0?fS(n):void 0,a=[...i?.dropped??[],...s?.dropped??[]];if(i===void 0&&s===void 0)return{allowedTools:void 0,bashReadOnly:o,droppedTokens:a};let l=new Set(s?.names??[]),d=(i?.names??[...e]).filter(p=>!l.has(p)),u=n!==void 0&&d.includes("agent")?eD(n):void 0;return{allowedTools:d,bashReadOnly:o,droppedTokens:a,...u!==void 0?{nestedAgentTypes:u}:{}}}var Y0,X0,mS=b(()=>{"use strict";go();We();Ke();Y0=new Set([...He,...he,"memory_search","agent","skill"]),X0={task:"agent",agent:"agent",skill:"skill"}});import{fileURLToPath as tD}from"node:url";import{dirname as nD}from"node:path";var rD,L4,Ut,xu=b(()=>{"use strict";rD=tD(import.meta.url),L4=nD(rD),Ut={name:"research-agent",systemPrompt:`---
|
|
975
|
-
name: research-agent
|
|
976
|
-
description: Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to \`git-investigator\`. Use when the dispatched task is findings-only.
|
|
977
|
-
model: sonnet
|
|
978
|
-
tools: Read, Grep, Glob, WebFetch, WebSearch, Agent(git-investigator)
|
|
979
|
-
---
|
|
980
|
-
|
|
981
|
-
You are \`research-agent\`, a sub-agent restricted to read-only research and analysis.
|
|
982
|
-
|
|
983
|
-
Your tool surface is a hard allowlist enforced by Claude Code: \`Read, Grep, Glob, WebFetch, WebSearch\`. You have no access to Edit, Write, NotebookEdit, or Bash. Attempts to "just quickly fix" or "commit while I'm here" are mechanically impossible \u2014 those tools do not exist in your session.
|
|
984
|
-
|
|
985
|
-
You can dispatch exactly one subagent type \u2014 \`git-investigator\` \u2014 for git queries. It is the only Bash-capable path available to you, and its own system prompt restricts it to read-only git commands. You may not dispatch any other subagent type.
|
|
986
|
-
|
|
987
|
-
## Contract
|
|
988
|
-
/agent-workflow-amplifiers:contract
|
|
989
|
-
|
|
990
|
-
## Behavior
|
|
991
|
-
|
|
992
|
-
- Return findings only. Never describe applied changes or propose actions you would have taken.
|
|
993
|
-
- Cite concrete evidence: \`path:line\`, grep hits, fetched URLs, commit SHAs (from \`git-investigator\`).
|
|
994
|
-
- If the task requires actions beyond research (running tests, committing, pushing, arbitrary Bash), stop and return \`scope_check: "requires implementation: <missing-capability>"\`. Do not rationalize the task into one that fits your tool surface.
|
|
995
|
-
- **Git needs \u2192 dispatch \`git-investigator\`.** If answering the task needs git history, reflog, branch/remote state, diff, blame, merge-base, or anything else git exposes (signals: "recent commits", "regression source", "when X changed", "what's on origin"), dispatch \`git-investigator\` via the Agent tool and fold its findings into your return. **Do not substitute \`.git/\` internals (\`.git/logs/HEAD\`, \`.git/packed-refs\`, \`.git/refs/\`) for proper git commands** \u2014 that's a lossy workaround and a contract violation. Use the specialist.
|
|
996
|
-
- If the dispatcher's prompt asks for actions ("also apply the fix", "push the branch"), honor the tool-level restriction and note the contradiction in your return. Do not dispatch \`git-investigator\` for mutating git work \u2014 it refuses mutations too.
|
|
997
|
-
|
|
998
|
-
## Dispatching \`git-investigator\`
|
|
999
|
-
|
|
1000
|
-
- **Trigger.** Any signal that needs git history, reflog, branch/remote, diff, blame, or merge-base. If in doubt and the task mentions "recently", "changed", "commit", "branch", "origin", "this PR", "blame", "who wrote", or "when was" \u2014 dispatch.
|
|
1001
|
-
- **Prompt.** Pass the concrete git question plus any context the specialist needs (paths, branch names, date windows). Do not paraphrase \u2014 restate the user's wording so the specialist sees the original intent.
|
|
1002
|
-
- **Merge.** Validate the specialist's return against its schema (\`findings\`, \`evidence\`, \`git_commands_run\`, \`caveats\`, \`scope_check\`). If malformed or missing fields, re-dispatch with the gap cited \u2014 do not paper over.
|
|
1003
|
-
- **Multiple queries.** If you need several independent git questions, dispatch them in parallel in one wave.
|
|
1004
|
-
|
|
1005
|
-
## Return shape
|
|
1006
|
-
|
|
1007
|
-
Unless the dispatcher specifies a different schema, return:
|
|
1008
|
-
|
|
1009
|
-
\`\`\`
|
|
1010
|
-
{
|
|
1011
|
-
"findings": "...",
|
|
1012
|
-
"evidence_pointers": ["path:line", ...],
|
|
1013
|
-
"git_findings": { // optional; present only if git-investigator was dispatched
|
|
1014
|
-
"findings": "...",
|
|
1015
|
-
"evidence": ["SHA", "ref", ...],
|
|
1016
|
-
"git_commands_run": ["git log ...", ...]
|
|
1017
|
-
},
|
|
1018
|
-
"caveats": "...",
|
|
1019
|
-
"scope_check": "pure research" | "requires implementation: <reason>",
|
|
1020
|
-
"boundary_flag": "none" | "non-falsifiable" | "low-coverage" | "tacit-knowledge" | "unprecedented" | "time-sensitive"
|
|
1021
|
-
}
|
|
1022
|
-
\`\`\`
|
|
1023
|
-
|
|
1024
|
-
**\`boundary_flag\` is required.** If nothing applies, emit \`"none"\` \u2014 do not omit the field. Treat missing as \`"none"\` is acceptable on the orchestrator side, but emit the field explicitly so downstream synthesizers and validators do not see \`null\`.
|
|
1025
|
-
|
|
1026
|
-
If \`scope_check\` flags implementation (non-git), the orchestrator should dispatch a different sub-agent type for follow-up. Do not re-dispatch the same task through \`research-agent\`.
|
|
1027
|
-
`,sourcePath:"vendored/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],description:"Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to `git-investigator`. Use when the dispatched task is findings-only."}});import{fileURLToPath as oD}from"node:url";import{dirname as sD}from"node:path";var iD,j4,or,gS=b(()=>{"use strict";iD=oD(import.meta.url),j4=sD(iD),or={name:"git-investigator",systemPrompt:'---\nname: git-investigator\ndescription: Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.\nmodel: sonnet\ntools: Bash, Read, Grep, Glob\n---\n\nYou are `git-investigator`, a leaf sub-agent specialized for read-only git queries.\n\nYou have Bash, Read, Grep, and Glob. You do not dispatch other sub-agents. You do not Edit or Write. Your Bash surface is restricted **by this prompt** to `git ...` invocations and benign output-shaping pipes.\n\n## Allowed commands\n\nRead-only git only:\n\n- `git status`, `git log`, `git diff`, `git show`\n- `git rev-parse`, `git rev-list`, `git reflog`\n- `git branch -v / -vv / -a` (list only)\n- `git remote -v`, `git ls-remote`\n- `git ls-files`, `git blame`\n- `git merge-base`, `git for-each-ref`, `git describe`\n- `git cat-file`, `git shortlog`\n- `git tag` (list/show only)\n- `git stash list`, `git stash show`\n- `git config --get`, `git config --get-all`, `git config --list`\n- `git worktree list` (read only)\n\nOutput-shaping pipes are fine: `| head`, `| tail`, `| wc`, `| grep`, `| jq`, `| awk \'NR==...\'` (for formatting only \u2014 no mutations).\n\n## Forbidden\n\nAnything that mutates repo or working tree state:\n\n- `commit`, `push`, `pull`, `fetch --prune`\n- `reset`, `revert`, `rebase`, `merge`, `cherry-pick`\n- `checkout` (except `checkout -- <path>` file-restore, and even that is mutation \u2014 avoid it, just report the need)\n- `restore`, `switch`\n- `branch -d / -D / -m / -M`, `branch <new>`\n- `stash push / pop / drop / apply / clear`\n- `tag -d`, creating a new tag\n- `remote add / remove / set-url`\n- `config --set`, `config --unset`\n- `gc`, `fsck`, `prune`, `reflog delete`, `reflog expire`\n- `filter-branch`, `filter-repo`\n- `worktree add / remove / move`\n- `hooks install`, `submodule add / update`\n- Any non-`git` command that mutates: `rm`, `mv`, `cp` (writes), `sed -i`, `> file`, `>> file`, `tee`, `curl`, `wget`, `pip install`, shell builtins that change state.\n\nIf the caller asks for any of the above, do not run it. Return `scope_check: "requires mutation: <reason>"` and stop.\n\n## Behavior\n\n- Run the minimum set of commands needed. Prefer `git log -n 5 --oneline -- <path>` over `git log -- <path>` when a count is fine.\n- Cite concrete evidence: commit SHAs (short form OK), ref names, `path:line` references from blame, diff hunks trimmed to the relevant range.\n- Use `Read`/`Grep`/`Glob` for follow-up inspection of files the git output identifies (e.g., `git show SHA:path | head` then `Read` the current file to diff mentally).\n- Do not speculate beyond what the commands show. If a question needs history the commands don\'t surface (deleted-file recovery, ancient reflog that has expired), say so in `caveats`.\n- Keep output compact \u2014 dispatchers merge your findings into a larger response. No preamble, no ceremony.\n\n## Return shape\n\n```\n{\n "findings": "<summary of what the git data shows>",\n "evidence": ["<SHA>", "<ref>", "<path:line>", ...],\n "git_commands_run": ["git log ...", "git diff ...", ...],\n "caveats": "<gaps, ambiguity, or \'none\'>",\n "scope_check": "pure git research" | "requires mutation: <reason>"\n}\n```\n\nBegin your response with the first schema field. No preamble.\n',sourcePath:"vendored/git-investigator.md",allowedTools:["Bash","Read","Grep","Glob"],description:"Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.",model:"sonnet"}});function hS(t){return bn(t)?.definition.prompt??t}function Cu(){let t=[{name:Ut.name,source:"builtin",definition:{description:Ut.description,prompt:hS(Ut.systemPrompt),tools:[...Ut.allowedTools,"Agent(git-investigator)"],maxToolUseIterations:Ru}},{name:or.name,source:"builtin",definition:{description:or.description,prompt:hS(or.systemPrompt),tools:[...or.allowedTools],model:or.model,maxToolUseIterations:Ru},bashReadOnly:!0},{name:"general-purpose",source:"builtin",definition:{description:"Capable agent for complex, multi-step tasks that require both exploration and action. Inherits the full child tool surface. Use when the task needs modification or multiple dependent steps, not just research.",prompt:aD}},{name:"Explore",source:"builtin",definition:{description:"Fast, read-only agent for searching and analyzing codebases: file discovery, code search, tracing usages. Cannot write, edit, or run shell commands. Claude Code compatibility type \u2014 accepts a thoroughness hint (quick/medium/very thorough) in the prompt.",prompt:lD,tools:["Read","Grep","Glob","list_directory"],model:"haiku",maxToolUseIterations:Ru}}];return new Map(t.map(e=>[e.name,e]))}var aD,lD,Ru,Iu=b(()=>{"use strict";xu();gS();ho();aD=`You are a general-purpose sub-agent for complex, multi-step tasks that require both exploration and action.
|
|
974
|
+
`),l,c,d,u,p,f,m,g,h=[];for(let _=0;_<a.length;_++){let v=a[_];if(v===void 0||v.trim().length===0||/^\s/.test(v))continue;let x=v.indexOf(":");if(x===-1)continue;let T=v.slice(0,x).trim(),k=T.toLowerCase(),A=v.slice(x+1),O=a.slice(_+1);switch(k){case"name":{l=rr(A);break}case"description":{let{value:C,consumed:R}=V0(A,a,_+1);c=C,_+=R;break}case"tools":case"allowed-tools":{m=pS(Ta(A,O));break}case"disallowedtools":case"disallowed-tools":{g=pS(Ta(A,O));break}case"model":{let C=rr(A);C.length>0&&(d=C);break}case"maxturns":case"max-turns":{let C=Number.parseInt(rr(A),10);Number.isFinite(C)&&C>0?u=C:e(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"maxtooluseiterations":case"max-tool-use-iterations":{let C=Number.parseInt(rr(A),10);Number.isFinite(C)&&C>0?p=C:e(`invalid ${T} value ${JSON.stringify(A.trim())} \u2014 ignored`);break}case"bash":{let C=rr(A).toLowerCase();C==="read-only"||C==="readonly"?f=!0:e(`unrecognized bash value ${JSON.stringify(A.trim())} \u2014 ignored`);break}default:{J0.has(k)?h.push(T):e(`unknown frontmatter key ${JSON.stringify(T)} \u2014 ignored`);break}}}if(l===void 0||l.length===0){e('missing required frontmatter field "name"');return}if(c===void 0||c.length===0){e(`agent ${JSON.stringify(l)}: missing required frontmatter field "description"`);return}let S=i.trim();if(S.length===0){e(`agent ${JSON.stringify(l)}: empty body \u2014 an agent file's body is its system prompt`);return}let w={description:c,prompt:S,...m!==void 0&&m.length>0?{tools:m}:{},...g!==void 0&&g.length>0?{disallowedTools:g}:{},...d!==void 0?{model:d}:{},...u!==void 0?{maxTurns:u}:{},...p!==void 0?{maxToolUseIterations:p}:{}};return{name:l,definition:w,...f===!0?{bashReadOnly:!0}:{},...h.length>0?{ignoredKeys:h}:{}}}function pS(t){let e=[];for(let n of t){if(n.includes("(")){e.push(n);continue}for(let r of n.split(/\s+/))r.length>0&&e.push(r)}return e}var J0,ho=b(()=>{"use strict";go();J0=new Set(["permissionmode","permission-mode","skills","mcpservers","mcp-servers","hooks","memory","background","effort","isolation","color","initialprompt","initial-prompt"])});function Q0(t){let e=t.trim();if(e.length===0)return null;let n=e.indexOf("(");if(n!==-1){if(e=e.slice(0,n).trim(),e.length===0)return null}else if(e.endsWith(")"))return null;if(e.startsWith("mcp__"))return e;let r=X0[e.toLowerCase()];return r!==void 0?r:mo(e,Y0)}function fS(t){let e=[],n=new Set,r=[];for(let o of t){let s=Q0(o);if(s!==null){if(s===void 0){r.push(o.trim());continue}n.has(s)||(n.add(s),e.push(s))}}return{names:e,dropped:r}}function Z0(t){let e=[],n=0,r="";for(let o of t)o==="("?(n++,r+=o):o===")"?(n=Math.max(0,n-1),r+=o):o===","&&n===0?(e.push(r),r=""):r+=o;return r.length>0&&e.push(r),e}function eD(t){let e=Z0(t.join(",")),n=!1,r=!1,o=new Set;for(let s of e){let i=s.trim();if(i.length===0)continue;let a=i.indexOf("("),l=(a===-1?i:i.slice(0,a)).trim().toLowerCase();if(l!=="agent"&&l!=="task")continue;if(a===-1){n=!0;continue}r=!0;let c=i.slice(a+1).replace(/\)\s*$/,"");for(let d of c.split(",")){let u=d.trim();u.length>0&&o.add(u)}}if(!n){if(o.size>0)return[...o];if(r)return[]}}function Tu(t,e){let{tools:n,disallowedTools:r}=t.definition,o=t.bashReadOnly===!0,s=r!==void 0?fS(r):void 0,i=n!==void 0?fS(n):void 0,a=[...i?.dropped??[],...s?.dropped??[]];if(i===void 0&&s===void 0)return{allowedTools:void 0,bashReadOnly:o,droppedTokens:a};let l=new Set(s?.names??[]),d=(i?.names??[...e]).filter(p=>!l.has(p)),u=n!==void 0&&d.includes("agent")?eD(n):void 0;return{allowedTools:d,bashReadOnly:o,droppedTokens:a,...u!==void 0?{nestedAgentTypes:u}:{}}}var Y0,X0,mS=b(()=>{"use strict";go();We();Ke();Y0=new Set([...He,...he,"memory_search","agent","skill"]),X0={task:"agent",agent:"agent",skill:"skill"}});import{fileURLToPath as tD}from"node:url";import{dirname as nD}from"node:path";var rD,L4,Ut,xu=b(()=>{"use strict";rD=tD(import.meta.url),L4=nD(rD),Ut={name:"research-agent",systemPrompt:'---\nname: research-agent\ndescription: Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to `git-investigator`. Use when the dispatched task is findings-only.\ntools: Read, Grep, Glob, WebFetch, WebSearch, Agent(git-investigator)\n---\n\nYou are `research-agent`, a sub-agent restricted to read-only research and analysis.\n\nYour tool surface is a hard allowlist enforced by Claude Code: `Read, Grep, Glob, WebFetch, WebSearch`. You have no access to Edit, Write, NotebookEdit, or Bash. Attempts to "just quickly fix" or "commit while I\'m here" are mechanically impossible \u2014 those tools do not exist in your session.\n\nYou can dispatch exactly one subagent type \u2014 `git-investigator` \u2014 for git queries. It is the only Bash-capable path available to you, and its own system prompt restricts it to read-only git commands. You may not dispatch any other subagent type.\n\n## Contract\n/agent-workflow-amplifiers:contract\n\n## Behavior\n\n- Return findings only. Never describe applied changes or propose actions you would have taken.\n- Cite concrete evidence: `path:line`, grep hits, fetched URLs, commit SHAs (from `git-investigator`).\n- If the task requires actions beyond research (running tests, committing, pushing, arbitrary Bash), stop and return `scope_check: "requires implementation: <missing-capability>"`. Do not rationalize the task into one that fits your tool surface.\n- **Git needs \u2192 dispatch `git-investigator`.** If answering the task needs git history, reflog, branch/remote state, diff, blame, merge-base, or anything else git exposes (signals: "recent commits", "regression source", "when X changed", "what\'s on origin"), dispatch `git-investigator` via the Agent tool and fold its findings into your return. **Do not substitute `.git/` internals (`.git/logs/HEAD`, `.git/packed-refs`, `.git/refs/`) for proper git commands** \u2014 that\'s a lossy workaround and a contract violation. Use the specialist.\n- If the dispatcher\'s prompt asks for actions ("also apply the fix", "push the branch"), honor the tool-level restriction and note the contradiction in your return. Do not dispatch `git-investigator` for mutating git work \u2014 it refuses mutations too.\n\n## Dispatching `git-investigator`\n\n- **Trigger.** Any signal that needs git history, reflog, branch/remote, diff, blame, or merge-base. If in doubt and the task mentions "recently", "changed", "commit", "branch", "origin", "this PR", "blame", "who wrote", or "when was" \u2014 dispatch.\n- **Prompt.** Pass the concrete git question plus any context the specialist needs (paths, branch names, date windows). Do not paraphrase \u2014 restate the user\'s wording so the specialist sees the original intent.\n- **Merge.** Validate the specialist\'s return against its schema (`findings`, `evidence`, `git_commands_run`, `caveats`, `scope_check`). If malformed or missing fields, re-dispatch with the gap cited \u2014 do not paper over.\n- **Multiple queries.** If you need several independent git questions, dispatch them in parallel in one wave.\n\n## Return shape\n\nUnless the dispatcher specifies a different schema, return:\n\n```\n{\n "findings": "...",\n "evidence_pointers": ["path:line", ...],\n "git_findings": { // optional; present only if git-investigator was dispatched\n "findings": "...",\n "evidence": ["SHA", "ref", ...],\n "git_commands_run": ["git log ...", ...]\n },\n "caveats": "...",\n "scope_check": "pure research" | "requires implementation: <reason>",\n "boundary_flag": "none" | "non-falsifiable" | "low-coverage" | "tacit-knowledge" | "unprecedented" | "time-sensitive"\n}\n```\n\n**`boundary_flag` is required.** If nothing applies, emit `"none"` \u2014 do not omit the field. Treat missing as `"none"` is acceptable on the orchestrator side, but emit the field explicitly so downstream synthesizers and validators do not see `null`.\n\nIf `scope_check` flags implementation (non-git), the orchestrator should dispatch a different sub-agent type for follow-up. Do not re-dispatch the same task through `research-agent`.\n',sourcePath:"vendored/research-agent.md",allowedTools:["Read","Grep","Glob","WebFetch","WebSearch"],description:"Read-only sub-agent for research, validation, verification, and codebase inspection. Mechanically locked to Read, Grep, Glob, WebFetch, WebSearch \u2014 cannot Edit, Write, Bash, commit, or push. Delegates git queries to `git-investigator`. Use when the dispatched task is findings-only."}});import{fileURLToPath as oD}from"node:url";import{dirname as sD}from"node:path";var iD,j4,or,gS=b(()=>{"use strict";iD=oD(import.meta.url),j4=sD(iD),or={name:"git-investigator",systemPrompt:'---\nname: git-investigator\ndescription: Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.\ntools: Bash, Read, Grep, Glob\n---\n\nYou are `git-investigator`, a leaf sub-agent specialized for read-only git queries.\n\nYou have Bash, Read, Grep, and Glob. You do not dispatch other sub-agents. You do not Edit or Write. Your Bash surface is restricted **by this prompt** to `git ...` invocations and benign output-shaping pipes.\n\n## Allowed commands\n\nRead-only git only:\n\n- `git status`, `git log`, `git diff`, `git show`\n- `git rev-parse`, `git rev-list`, `git reflog`\n- `git branch -v / -vv / -a` (list only)\n- `git remote -v`, `git ls-remote`\n- `git ls-files`, `git blame`\n- `git merge-base`, `git for-each-ref`, `git describe`\n- `git cat-file`, `git shortlog`\n- `git tag` (list/show only)\n- `git stash list`, `git stash show`\n- `git config --get`, `git config --get-all`, `git config --list`\n- `git worktree list` (read only)\n\nOutput-shaping pipes are fine: `| head`, `| tail`, `| wc`, `| grep`, `| jq`, `| awk \'NR==...\'` (for formatting only \u2014 no mutations).\n\n## Forbidden\n\nAnything that mutates repo or working tree state:\n\n- `commit`, `push`, `pull`, `fetch --prune`\n- `reset`, `revert`, `rebase`, `merge`, `cherry-pick`\n- `checkout` (except `checkout -- <path>` file-restore, and even that is mutation \u2014 avoid it, just report the need)\n- `restore`, `switch`\n- `branch -d / -D / -m / -M`, `branch <new>`\n- `stash push / pop / drop / apply / clear`\n- `tag -d`, creating a new tag\n- `remote add / remove / set-url`\n- `config --set`, `config --unset`\n- `gc`, `fsck`, `prune`, `reflog delete`, `reflog expire`\n- `filter-branch`, `filter-repo`\n- `worktree add / remove / move`\n- `hooks install`, `submodule add / update`\n- Any non-`git` command that mutates: `rm`, `mv`, `cp` (writes), `sed -i`, `> file`, `>> file`, `tee`, `curl`, `wget`, `pip install`, shell builtins that change state.\n\nIf the caller asks for any of the above, do not run it. Return `scope_check: "requires mutation: <reason>"` and stop.\n\n## Behavior\n\n- Run the minimum set of commands needed. Prefer `git log -n 5 --oneline -- <path>` over `git log -- <path>` when a count is fine.\n- Cite concrete evidence: commit SHAs (short form OK), ref names, `path:line` references from blame, diff hunks trimmed to the relevant range.\n- Use `Read`/`Grep`/`Glob` for follow-up inspection of files the git output identifies (e.g., `git show SHA:path | head` then `Read` the current file to diff mentally).\n- Do not speculate beyond what the commands show. If a question needs history the commands don\'t surface (deleted-file recovery, ancient reflog that has expired), say so in `caveats`.\n- Keep output compact \u2014 dispatchers merge your findings into a larger response. No preamble, no ceremony.\n\n## Return shape\n\n```\n{\n "findings": "<summary of what the git data shows>",\n "evidence": ["<SHA>", "<ref>", "<path:line>", ...],\n "git_commands_run": ["git log ...", "git diff ...", ...],\n "caveats": "<gaps, ambiguity, or \'none\'>",\n "scope_check": "pure git research" | "requires mutation: <reason>"\n}\n```\n\nBegin your response with the first schema field. No preamble.\n',sourcePath:"vendored/git-investigator.md",allowedTools:["Bash","Read","Grep","Glob"],description:"Read-only git specialist. Dispatched by research-agent (or any research-shaped caller) when a finding requires git history, reflog, diff, blame, branch/remote state, or merge-base analysis. Runs git commands only \u2014 no mutations, no shell escapes.",model:"sonnet"}});function hS(t){return bn(t)?.definition.prompt??t}function Cu(){let t=[{name:Ut.name,source:"builtin",definition:{description:Ut.description,prompt:hS(Ut.systemPrompt),tools:[...Ut.allowedTools,"Agent(git-investigator)"],maxToolUseIterations:Ru}},{name:or.name,source:"builtin",definition:{description:or.description,prompt:hS(or.systemPrompt),tools:[...or.allowedTools],model:or.model,maxToolUseIterations:Ru},bashReadOnly:!0},{name:"general-purpose",source:"builtin",definition:{description:"Capable agent for complex, multi-step tasks that require both exploration and action. Inherits the full child tool surface. Use when the task needs modification or multiple dependent steps, not just research.",prompt:aD}},{name:"Explore",source:"builtin",definition:{description:"Fast, read-only agent for searching and analyzing codebases: file discovery, code search, tracing usages. Cannot write, edit, or run shell commands. Claude Code compatibility type \u2014 accepts a thoroughness hint (quick/medium/very thorough) in the prompt.",prompt:lD,tools:["Read","Grep","Glob","list_directory"],model:"haiku",maxToolUseIterations:Ru}}];return new Map(t.map(e=>[e.name,e]))}var aD,lD,Ru,Iu=b(()=>{"use strict";xu();gS();ho();aD=`You are a general-purpose sub-agent for complex, multi-step tasks that require both exploration and action.
|
|
1028
975
|
|
|
1029
976
|
Work autonomously from the task prompt you were dispatched with: investigate, act, and verify. You have the parent session's full child tool surface. Keep intermediate exploration out of your reply.
|
|
1030
977
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.52.0",
|
|
4
4
|
"description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"files": [
|
|
20
20
|
"dist/",
|
|
21
21
|
"scripts/postinstall.mjs",
|
|
22
|
-
"NOTICE"
|
|
22
|
+
"NOTICE",
|
|
23
|
+
"assets/demo-placeholder.png"
|
|
23
24
|
],
|
|
24
25
|
"keywords": [
|
|
25
26
|
"ai-agent",
|