@x-otto/shared 0.1.0-alpha.3 → 0.1.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -522,6 +522,32 @@ declare function isIntranetReachable(force?: boolean): Promise<boolean>;
522
522
  /** 测试专用:清空进程内缓存,避免用例间相互污染。 */
523
523
  declare function resetIntranetReachabilityCache(): void;
524
524
  //#endregion
525
+ //#region src/safe-dispose.d.ts
526
+ /** 清理回调可能的形态:同步、异步、或压根没提供。 */
527
+ type DisposeFn = () => void | Promise<void>;
528
+ interface SafeDisposeOptions {
529
+ /** 日志端口(省略则失败静默——仅供无 logger 语境的纯函数测试使用)。 */
530
+ logger?: Pick<Logger, 'warn'>;
531
+ /** 结构化日志上下文(如 `{ pluginId, api }`),便于定位是谁的 dispose 炸了。 */
532
+ context?: Record<string, unknown>;
533
+ /** 日志文案前缀,缺省 'dispose failed'。 */
534
+ label?: string;
535
+ }
536
+ /**
537
+ * 隔离执行一个清理回调。**永不抛出**,返回 `true` 表示清理成功、`false` 表示失败(已记录)。
538
+ *
539
+ * `fn` 为 `undefined` 时视为"无需清理",返回 `true`(成功语义——没有要清的东西不算失败)。
540
+ */
541
+ declare function safeDispose(fn: DisposeFn | undefined, options?: SafeDisposeOptions): Promise<boolean>;
542
+ /**
543
+ * `safeDispose` 的鸭子类型版:对象上有可调用的 `dispose` 才执行,否则视为无需清理。
544
+ *
545
+ * 存在理由:注册表持有的是 `ProviderStream` 等**不保证实现 dispose** 的接口,调用点
546
+ * 此前都在内联做 `typeof (x as {dispose?}).dispose === 'function'` 的双重断言——
547
+ * 收口到这里同时消除该断言的重复与 `as` 扩散。
548
+ */
549
+ declare function safeDisposeOf(target: unknown, options?: SafeDisposeOptions): Promise<boolean>;
550
+ //#endregion
525
551
  //#region src/startup-trace.d.ts
526
552
  /**
527
553
  * startup-trace.ts —— 启动相位打点(RFC-150 D7/M0)。
@@ -694,5 +720,5 @@ declare function releaseFileLockSync(dir: string, key: string, options?: Pick<Fi
694
720
  */
695
721
  declare function waitForFileLockReleaseSync(dir: string, key: string, options?: Pick<FileLockOptions, 'timeoutMs' | 'prefix'>): boolean;
696
722
  //#endregion
697
- export { API_IMAGE_DIMENSION_LIMIT_PX, AgentError, CLAUDE_TO_OTTO_TOOL, CodedError, type CommandCheckResult, DEFAULT_FILE_LOCK_TIMEOUT_MS, type DeepPartial, type DeepReadonly, EventBus, type EventListener, type Events, type FileLockOptions, type FuzzySearchOptions, type HighlightRange, type HttpRequestOptions, type HttpResponse, InvariantError, LARGE_FILE_BYTE_THRESHOLD, type LogLevel, type Logger, type LoggerOptions, type LoopbackCallback, type LoopbackServer, type LoopbackServerOptions, McpError, NetworkError, OAuthError, PROVIDER_IMAGE_INLINE_MAX_BYTES, type ParsedFrontmatter, type PkcePair, ProviderError, type ProxyProbeErrorKind, type ProxyProbeResult, type RankedMatch, type ReadCappedResult, type SearchableItem, type SseEvent, type SubsequenceResult, type TruncateOptions, type TruncatedResult, type TruncationMeta, TypedEventEmitter, acquireFileLock, acquireFileLockSync, attachLogListener, buildAllowedEnv, checkShellCommand, createDispatcher, createLogger, createPkcePair, createProjectOverflowLogPath, createTempLoggerPath, exists, formatBytes, generateChallenge, generateState, generateVerifier, getDefaultProxy, getHomeDir, getProjectDir, getThirdPartyToolBinaryDir, getThirdPartyToolDir, headerGet, installGlobalProxyDispatcher, invariant, isDirectory, isFile, isIntranetReachable, isStartupTraceEnabled, isTransportInitialized, lockPath, mapClaudeAgentToolNames, mapClaudeToolName, markStartupPhase, matchSubsequence, matchesGlobPattern, mime, mkdirp, normalizePath, openBrowser, ottoToClaudeToolName, parseFrontmatterFields, parseFrontmatterList, parseJsonc, positionsToHighlightRanges, probeImageDimensions, probeProxy, rankCandidates, rankLabeledItems, rankNamedItems, readFileCapped, releaseFileLock, releaseFileLockSync, request, resetIntranetReachabilityCache, safeStringify, scoreSubsequence, setDefaultProxy, setLogLevel, splitFrontmatter, startLoopbackServer, stream, sweepStaleProjectOverflowLogs, sweepStaleTempLogs, toTruncationMeta, traceStartupPhase, traceStartupPhaseSync, truncateHead, truncateLine, truncateTail, waitForFileLockRelease, waitForFileLockReleaseSync };
723
+ export { API_IMAGE_DIMENSION_LIMIT_PX, AgentError, CLAUDE_TO_OTTO_TOOL, CodedError, type CommandCheckResult, DEFAULT_FILE_LOCK_TIMEOUT_MS, type DeepPartial, type DeepReadonly, type DisposeFn, EventBus, type EventListener, type Events, type FileLockOptions, type FuzzySearchOptions, type HighlightRange, type HttpRequestOptions, type HttpResponse, InvariantError, LARGE_FILE_BYTE_THRESHOLD, type LogLevel, type Logger, type LoggerOptions, type LoopbackCallback, type LoopbackServer, type LoopbackServerOptions, McpError, NetworkError, OAuthError, PROVIDER_IMAGE_INLINE_MAX_BYTES, type ParsedFrontmatter, type PkcePair, ProviderError, type ProxyProbeErrorKind, type ProxyProbeResult, type RankedMatch, type ReadCappedResult, type SafeDisposeOptions, type SearchableItem, type SseEvent, type SubsequenceResult, type TruncateOptions, type TruncatedResult, type TruncationMeta, TypedEventEmitter, acquireFileLock, acquireFileLockSync, attachLogListener, buildAllowedEnv, checkShellCommand, createDispatcher, createLogger, createPkcePair, createProjectOverflowLogPath, createTempLoggerPath, exists, formatBytes, generateChallenge, generateState, generateVerifier, getDefaultProxy, getHomeDir, getProjectDir, getThirdPartyToolBinaryDir, getThirdPartyToolDir, headerGet, installGlobalProxyDispatcher, invariant, isDirectory, isFile, isIntranetReachable, isStartupTraceEnabled, isTransportInitialized, lockPath, mapClaudeAgentToolNames, mapClaudeToolName, markStartupPhase, matchSubsequence, matchesGlobPattern, mime, mkdirp, normalizePath, openBrowser, ottoToClaudeToolName, parseFrontmatterFields, parseFrontmatterList, parseJsonc, positionsToHighlightRanges, probeImageDimensions, probeProxy, rankCandidates, rankLabeledItems, rankNamedItems, readFileCapped, releaseFileLock, releaseFileLockSync, request, resetIntranetReachabilityCache, safeDispose, safeDisposeOf, safeStringify, scoreSubsequence, setDefaultProxy, setLogLevel, splitFrontmatter, startLoopbackServer, stream, sweepStaleProjectOverflowLogs, sweepStaleTempLogs, toTruncationMeta, traceStartupPhase, traceStartupPhaseSync, truncateHead, truncateLine, truncateTail, waitForFileLockRelease, waitForFileLockReleaseSync };
698
724
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import{n as e,t}from"./event-bus-CABu09lC.js";import{createRequire as n}from"node:module";import r from"pino";import{LOG_FILE as i,LOG_LEVEL as a,OTTO_HOME as o,OTTO_PROJECT_DIR as s,normalizePath as c,resolveIntranetProbeUrls as l}from"@x-otto/env";import{PassThrough as u}from"node:stream";import{chmod as d,mkdir as f,open as p,readFile as m,readdir as h,stat as g,unlink as _,utimes as ee}from"node:fs/promises";import{lookup as te}from"mime-types";import{join as v,resolve as ne}from"node:path";import{tmpdir as re}from"node:os";import{createHash as ie,randomBytes as ae,randomUUID as y}from"node:crypto";import{parse as oe,printParseErrorCode as se}from"jsonc-parser";import ce from"safe-stable-stringify";import{createParser as le}from"eventsource-parser";import{EnvHttpProxyAgent as ue,ProxyAgent as de,getGlobalDispatcher as fe,setGlobalDispatcher as b}from"undici";import{createServer as pe}from"node:http";import{spawn as me}from"node:child_process";import{chmodSync as he,closeSync as ge,mkdirSync as _e,openSync as ve,readFileSync as ye,statSync as be,unlinkSync as x,writeSync as xe}from"node:fs";var S=class extends Error{code;cause;status;headers;errorType;pluginSource;abortKind;constructor(e,t){super(e,{cause:t.cause}),this.name=new.target.name,this.code=t.code,this.cause=t.cause,this.status=t.status,this.headers=t.headers,this.errorType=t.errorType,this.pluginSource=t.pluginSource,this.abortKind=t.abortKind}},C=class extends S{},Se=class extends S{},w=class extends S{},Ce=class extends S{},we=class extends S{};const{setPrototypeOf:Te=function(e,t){return e.__proto__=t,e}}=Object;var Ee=class e extends Error{framesToPop=1;name=`Invariant Violation`;constructor(t=`Invariant Violation`){super(typeof t==`number`?`Invariant Violation: ${t}`:t),Te(this,e.prototype)}};function T(e,t){if(typeof e==`function`)T(e(),t);else if(!e)throw new Ee(t)}const De=new Set([`trace`,`debug`,`info`,`warn`,`error`,`fatal`]);function E(e){return De.has(e)?e:`info`}const Oe=(()=>{try{return n(import.meta.url)}catch{return}})();function ke(){if(!Oe)return!1;try{return Oe.resolve(`pino-pretty`),!0}catch{return!1}}function Ae(e){return e===`stdout`?1:e===`stderr`?2:e}function je(){return process.env.OTTO_LOG_STDERR===`0`}function Me(){return process.env.OTTO_LOG_FILE||`${process.env.HOME||process.env.USERPROFILE||`.`}/.otto/logs/otto.log`}function Ne(e,t){let n=ke(),r=je(),i={target:n?`pino-pretty`:`pino/file`,options:n?{colorize:!0,destination:2}:{destination:2},level:t};if(!e||e===`stdout`||e===`stderr`)return r?[{target:`pino/file`,options:{destination:Me(),mkdir:!0},level:t}]:[i];let a={target:`pino/file`,options:{destination:Ae(e),mkdir:!0},level:t};return r?[a]:[a,i]}const Pe=new u,Fe=new t;Pe.on(`data`,e=>{try{Fe.publish({log:[JSON.parse(e.toString())]})}catch(t){console.warn(`Failed to parse log chunk for listener:`,e.toString(),t)}});function Ie(e){return Fe.subscribe(`log`,e)}let D=null,O=E(a);const k=new Set;function Le(e){if(De.has(e)){O=e,D&&(D.level=e);for(let t of k)t.level=e}}function Re(){return A!==null}let A=null;function ze(e,t){return{write(n){A??=r.transport({targets:Ne(e,t)}),A.write(n)}}}function Be(e,t){return D??=r({level:e},r.multistream([{level:e,stream:Pe},{level:e,stream:ze(t,e)}])),O=E(D.level),D}function Ve(e,t){Be(t?.level??E(a),t?.destination??i),T(D,`Root logger is not initialized`);let n=D.child({name:e},{level:t?.level??O});return k.add(n),n}const He=10*1024*1024;async function Ue(e){return te(e)||`application/octet-stream`}async function We(e){await f(e,{recursive:!0})}async function Ge(e){try{return await g(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Ke(e){return(await g(e)).isDirectory()}async function qe(e){return(await g(e)).isFile()}async function Je(e,t=He){let n=await g(e);if(n.size<=t)return{content:await m(e,`utf-8`),truncated:!1,totalBytes:n.size};let r=await p(e,`r`);try{let e=Buffer.alloc(t),{bytesRead:i}=await r.read(e,0,t,0);return{content:e.subarray(0,i).toString(`utf-8`),truncated:!0,totalBytes:n.size}}finally{await r.close()}}function Ye(e){let{content:t,...n}=e;return n}function Xe(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}function j(e){let t=e.outputBytes??Buffer.byteLength(e.content,`utf-8`),n=e.outputLines??e.content.split(`
1
+ import{n as e,t}from"./event-bus-CABu09lC.js";import{createRequire as n}from"node:module";import r from"pino";import{LOG_FILE as i,LOG_LEVEL as a,OTTO_HOME as o,OTTO_PROJECT_DIR as s,normalizePath as c,resolveIntranetProbeUrls as l}from"@x-otto/env";import{PassThrough as u}from"node:stream";import{chmod as d,mkdir as f,open as p,readFile as m,readdir as h,stat as g,unlink as _,utimes as ee}from"node:fs/promises";import{lookup as te}from"mime-types";import{join as v,resolve as ne}from"node:path";import{tmpdir as re}from"node:os";import{createHash as ie,randomBytes as ae,randomUUID as y}from"node:crypto";import{parse as oe,printParseErrorCode as se}from"jsonc-parser";import ce from"safe-stable-stringify";import{createParser as le}from"eventsource-parser";import{EnvHttpProxyAgent as ue,ProxyAgent as de,getGlobalDispatcher as fe,setGlobalDispatcher as pe}from"undici";import{createServer as me}from"node:http";import{spawn as he}from"node:child_process";import{chmodSync as ge,closeSync as _e,mkdirSync as ve,openSync as ye,readFileSync as be,statSync as b,unlinkSync as xe,writeSync as Se}from"node:fs";var x=class extends Error{code;cause;status;headers;errorType;pluginSource;abortKind;constructor(e,t){super(e,{cause:t.cause}),this.name=new.target.name,this.code=t.code,this.cause=t.cause,this.status=t.status,this.headers=t.headers,this.errorType=t.errorType,this.pluginSource=t.pluginSource,this.abortKind=t.abortKind}},S=class extends x{},Ce=class extends x{},C=class extends x{},we=class extends x{},Te=class extends x{};const{setPrototypeOf:Ee=function(e,t){return e.__proto__=t,e}}=Object;var De=class e extends Error{framesToPop=1;name=`Invariant Violation`;constructor(t=`Invariant Violation`){super(typeof t==`number`?`Invariant Violation: ${t}`:t),Ee(this,e.prototype)}};function w(e,t){if(typeof e==`function`)w(e(),t);else if(!e)throw new De(t)}const Oe=new Set([`trace`,`debug`,`info`,`warn`,`error`,`fatal`]);function T(e){return Oe.has(e)?e:`info`}const ke=(()=>{try{return n(import.meta.url)}catch{return}})();function Ae(){if(!ke)return!1;try{return ke.resolve(`pino-pretty`),!0}catch{return!1}}function je(e){return e===`stdout`?1:e===`stderr`?2:e}function Me(){return process.env.OTTO_LOG_STDERR===`0`}function Ne(){return process.env.OTTO_LOG_FILE||`${process.env.HOME||process.env.USERPROFILE||`.`}/.otto/logs/otto.log`}function Pe(e,t){let n=Ae(),r=Me(),i={target:n?`pino-pretty`:`pino/file`,options:n?{colorize:!0,destination:2}:{destination:2},level:t};if(!e||e===`stdout`||e===`stderr`)return r?[{target:`pino/file`,options:{destination:Ne(),mkdir:!0},level:t}]:[i];let a={target:`pino/file`,options:{destination:je(e),mkdir:!0},level:t};return r?[a]:[a,i]}const E=new u,Fe=new t;E.on(`data`,e=>{try{Fe.publish({log:[JSON.parse(e.toString())]})}catch(t){console.warn(`Failed to parse log chunk for listener:`,e.toString(),t)}});function Ie(e){return Fe.subscribe(`log`,e)}let D=null,O=T(a);const Le=new Set;function Re(e){if(Oe.has(e)){O=e,D&&(D.level=e);for(let t of Le)t.level=e}}function ze(){return k!==null}let k=null;function Be(e,t){return globalThis.__miniv8_wasm===void 0?{write(n){k??=r.transport({targets:Pe(e,t)}),k.write(n)}}:{write:e=>{E.write(e)}}}function Ve(e,t){return D??=r({level:e},r.multistream([{level:e,stream:E},{level:e,stream:Be(t,e)}])),O=T(D.level),D}function He(e,t){Ve(t?.level??T(a),t?.destination??i),w(D,`Root logger is not initialized`);let n=D.child({name:e},{level:t?.level??O});return Le.add(n),n}const A=10*1024*1024;async function Ue(e){return te(e)||`application/octet-stream`}async function We(e){await f(e,{recursive:!0})}async function Ge(e){try{return await g(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Ke(e){return(await g(e)).isDirectory()}async function qe(e){return(await g(e)).isFile()}async function Je(e,t=A){let n=await g(e);if(n.size<=t)return{content:await m(e,`utf-8`),truncated:!1,totalBytes:n.size};let r=await p(e,`r`);try{let e=Buffer.alloc(t),{bytesRead:i}=await r.read(e,0,t,0);return{content:e.subarray(0,i).toString(`utf-8`),truncated:!0,totalBytes:n.size}}finally{await r.close()}}function Ye(e){let{content:t,...n}=e;return n}function Xe(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}function j(e){let t=e.outputBytes??Buffer.byteLength(e.content,`utf-8`),n=e.outputLines??e.content.split(`
2
2
  `).length;return{content:e.content,truncated:e.truncated,truncatedBy:e.truncatedBy,totalLines:e.totalLines,totalBytes:e.totalBytes,outputLines:n,outputBytes:t,lastLinePartial:e.lastLinePartial,firstLineExceedsLimit:e.firstLineExceedsLimit,options:e.options}}function Ze(e,t){let{maxLines:n,maxBytes:r}=t,i=Buffer.byteLength(e,`utf-8`),a=e.split(`
3
3
  `),o=a.length;if(a.length<=n&&i<=r)return j({content:e,truncated:!1,truncatedBy:`lines`,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:o,outputBytes:i});if(n===0)return j({content:``,truncated:!0,truncatedBy:`lines`,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:0,outputBytes:0});if(Buffer.byteLength(a[0],`utf-8`)>r)return j({content:``,truncated:!0,truncatedBy:`bytes`,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!0,options:{maxLines:n,maxBytes:r},outputLines:0,outputBytes:0});let s=[],c=0,l=`lines`;for(let e=0;e<a.length&&e<n;e++){let t=a[e],n=Buffer.byteLength(t,`utf-8`)+(s.length>0?1:0);if(c+n>r){l=`bytes`;break}s.push(t),c+=n}return s.length>=n&&c<=r&&(l=`lines`),j({content:s.join(`
4
4
  `),truncated:!0,truncatedBy:l,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:s.length,outputBytes:c})}function Qe(e,t){let{maxLines:n,maxBytes:r}=t,i=Buffer.byteLength(e,`utf-8`),a=e.split(`
5
5
  `),o=a.length;if(o<=n&&i<=r)return j({content:e,truncated:!1,truncatedBy:`lines`,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:o,outputBytes:i});if(n===0)return j({content:``,truncated:!0,truncatedBy:`lines`,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:0,outputBytes:0});let s=[],c=0,l=`lines`,u=!1;for(let e=a.length-1;e>=0&&s.length<n;e--){let t=a[e],n=Buffer.byteLength(t,`utf-8`)+(s.length>0?1:0);if(c+n>r){if(l=`bytes`,s.length===0){let e=$e(t,r);e.length>0&&(s.unshift(e),c=Buffer.byteLength(e,`utf-8`),u=!0)}break}s.unshift(t),c+=n}return s.length>=n&&c<=r&&(l=`lines`),j({content:s.join(`
6
- `),truncated:!0,truncatedBy:l,totalLines:o,totalBytes:i,lastLinePartial:u,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:s.length,outputBytes:c})}function $e(e,t){let n=Buffer.from(e,`utf-8`);if(n.length<=t)return e;let r=n.length-t;for(;r<n.length;){let e=n[r];if(e===void 0||(e&192)!=128)break;r++}return n.subarray(r).toString(`utf-8`)}function et(e,t){return e.length<=t?{text:e,wasTruncated:!1}:{text:`${e.slice(0,t)}... [truncated]`,wasTruncated:!0}}const M=`otto-coding-`,N=`.log`;function P(){return s}function tt(){return o}function nt(){return ne(tt(),`tools`)}function rt(e,t=``){return ne(nt(),...t?[e,t]:[e])}function it(){let e=y();return v(re(),`${M}${e}${N}`)}function at(){let e=y();return v(P(),`tool-results`,`bash`,`${M}${e}${N}`)}async function ot(e,t){return ct(re(),e,t)}async function st(e,t){return ct(v(P(),`tool-results`,`bash`),e,t)}async function ct(e,t,n){let r;try{r=await h(e)}catch{return 0}let i=r.filter(e=>e.startsWith(M)&&e.endsWith(N)),a=0;return await Promise.all(i.map(async r=>{let i=v(e,r);try{n-(await g(i)).mtimeMs>t&&(await _(i),a++)}catch{}})),a}function lt(e){let t=[],n=oe(e,t,{allowTrailingComma:!0,disallowComments:!1,allowEmptyContent:!1});if(t.length>0){let e=t[0],n=e?se(e.error):`UnknownError`;throw Error(`Invalid JSONC: ${n}`)}return n}function ut(e,t){return ce(e,void 0,t)??`null`}function dt(e,t){let n=``;for(let t=0;t<e.length;t++){let r=e[t];r===`*`?e[t+1]===`*`?(n+=`.*`,t++):n+=`[^/]*`:r===`?`?n+=`.`:n+=r.replace(/[.+^${}()|[\]\\]/g,`\\$&`)}return RegExp(`^${n}$`,`i`).test(t)}let F;function ft(e){F=e||void 0}function pt(){return F}function I(e){let t=e||F;if(t)try{return new de({uri:t})}catch{return}}let L;function mt(e){if(L===void 0&&(L=fe()),!e){b(L);return}try{b(new ue({httpProxy:e,httpsProxy:e,noProxy:`localhost,127.0.0.1,[::1]`}))}catch{}}async function ht(e,t=5e3){let n=Date.now(),r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let t=await fetch(e,{method:`GET`,signal:r.signal});return{ok:!0,latencyMs:Date.now()-n,status:t.status}}catch(e){let t=Date.now()-n;if(r.signal.aborted)return{ok:!1,latencyMs:t,errorKind:`timeout`,errorMessage:`timeout`};let i=e instanceof Error?e.message:String(e);return{ok:!1,latencyMs:t,errorKind:gt(e),errorMessage:i}}finally{clearTimeout(i)}}function gt(e){switch(e?.cause?.code??e?.code){case`ECONNREFUSED`:case`ECONNRESET`:case`EHOSTUNREACH`:case`ENETUNREACH`:return`proxy-unreachable`;case`ENOTFOUND`:case`EAI_AGAIN`:return`target-unreachable`;case`UND_ERR_CONNECT_TIMEOUT`:case`UND_ERR_HEADERS_TIMEOUT`:case`ETIMEDOUT`:return`timeout`;default:return`unknown`}}async function _t(e){let{url:t,method:n=`POST`,headers:r={},body:i,timeout:a=6e4,signal:o}=e,s=new AbortController,c=o?AbortSignal.any([o,s.signal]):s.signal,l=setTimeout(()=>s.abort(),a);try{let a=I(e.proxy),o={method:n,headers:{"content-type":`application/json`,...r},signal:c};i&&(o.body=typeof i==`string`?i:JSON.stringify(i));let s=await fetch(t,a?{...o,dispatcher:a}:o),l=await s.text();return{status:s.status,headers:s.headers,body:l,ok:s.ok}}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?new C(`HTTP request aborted or timed out`,{code:`NETWORK_TIMEOUT`,cause:e}):new C(`HTTP request failed`,{code:`NETWORK_ERROR`,cause:e instanceof Error?e:Error(String(e))})}finally{clearTimeout(l)}}const vt={kind:`idle`},yt={kind:`wallclock`};function bt(e,t){return e?t.idleTimeout:t.firstTokenIdleTimeout}function xt(e){let t=e.idleTimeout??12e4,n=e.firstTokenIdleTimeout??Math.max(t,9e5),r=e.timeout??3e5;return{timeout:Math.max(r,n+6e4),idleTimeout:t,firstTokenIdleTimeout:n}}function St(e){let t=e.signal.reason;return typeof t==`object`&&t&&`kind`in t?t.kind:`external`}async function*Ct(e){let{url:t,method:n=`POST`,headers:r={},body:i,signal:a}=e,{timeout:o,idleTimeout:s,firstTokenIdleTimeout:c}=xt(e),l=new AbortController,u=a?AbortSignal.any([a,l.signal]):l.signal,d=setTimeout(()=>l.abort(yt),o),f,p=!1,m=()=>{f&&clearTimeout(f),f=setTimeout(()=>l.abort(vt),bt(p,{idleTimeout:s,firstTokenIdleTimeout:c}))},h;try{let a=I(e.proxy),o={method:n,headers:{"content-type":`application/json`,accept:`text/event-stream`,...r},body:i?typeof i==`string`?i:JSON.stringify(i):void 0,signal:u},s=await fetch(t,a?{...o,dispatcher:a}:o);if(!s.ok){let e=await s.text(),t=`BAD_RESPONSE`;s.status===429?t=`RATE_LIMIT`:s.status===529?t=`OVERLOADED`:s.status>=500?t=`SERVER_ERROR`:s.status>=400&&(t=`REQUEST_ERROR`);let n;try{let t=JSON.parse(e)?.error;n=t?.code??t?.type}catch{}throw new C(`Http request failed ${s.status}: ${e}`,{code:t,status:s.status,headers:s.headers,errorType:n})}if(e.onResponse?.(s.headers),!s.body)throw new C(`Response body is empty`,{code:`BAD_RESPONSE`});h=s.body.getReader();let c=new TextDecoder,l=[],d=le({onEvent(e){l.push({event:e.event||void 0,data:e.data,id:e.id||void 0})}});for(m();;){let{done:e,value:t}=await h.read();if(e)break;for(m(),d.feed(c.decode(t,{stream:!0}));l.length>0;){let e=l.shift();e&&(p||(p=!0,m()),yield e)}}for(d.feed(c.decode());l.length>0;){let e=l.shift();e&&(p||(p=!0,m()),yield e)}}catch(e){throw e instanceof C?e:l.signal.aborted||e instanceof DOMException&&e.name===`AbortError`?new C(`Stream aborted or timed out`,{code:`TIMEOUT`,cause:e instanceof Error?e:Error(String(e)),abortKind:St(l)}):new C(`Stream request failed`,{code:`NETWORK_ERROR`,cause:e instanceof Error?e:Error(String(e))})}finally{clearTimeout(d),f&&clearTimeout(f),h&&h.cancel().catch(()=>{})}}function wt(e,t){if(e==null)return;if(typeof e.get==`function`)return e.get(t)??void 0;let n=e;for(let e of Object.keys(n))if(e.toLowerCase()===t){let t=n[e];return typeof t==`string`?t:void 0}}const Tt=[{description:`递归强制删除`,substring:`rm -rf`},{description:`递归强制删除(长格式)`,substring:`rm -r -f`},{description:`递归强制删除(长格式 2)`,substring:`rm --recursive --force`},{description:`删除根目录`,substring:`rm -rf /`},{description:`权限提升`,substring:`sudo rm`},{description:`权限提升`,substring:`sudo `},{description:`chmod 777`,substring:`chmod 777`},{description:`chmod -R 777`,substring:`chmod -R 777`},{description:`chmod 777 递归`,substring:`chmod -R`},{description:`curl 管道 shell 执行`,regex:/curl\s+\S+\s*\|\s*(ba)?sh/},{description:`wget 管道 shell 执行`,regex:/wget\s+\S+\s*-\s*O\s*-\s*\|\s*(ba)?sh/},{description:`fork bomb`,regex:/:\s*\(\s*\)\s*\{\s*:\s*\|\s*:?\s*&\s*\}\s*;?\s*:/},{description:`覆盖关键系统文件`,regex:/>\s*\/(etc|boot|sys|proc|dev)\//},{description:`mkfs 格式化`,substring:`mkfs.`},{description:`dd 覆写磁盘`,regex:/dd\s+if=.*of=\/dev\//}];function Et(e){let t=e.trim();if(!t)return{safe:!0};for(let e of Tt)if(e.substring!==void 0&&t.includes(e.substring)||e.regex!==void 0&&e.regex.test(t))return{safe:!1,reason:e.description};return{safe:!0}}function Dt(e){let t=new Map,n=[`LC_`,`OTTO_`,`npm_`],r=new Set([`PATH`,`HOME`,`USER`,`SHELL`,`TMPDIR`,`TEMP`,`TMP`,`LANG`,`NODE_PATH`,`NODE_ENV`,`TERM`,`COLORTERM`,`TERM_PROGRAM`,`SSH_AUTH_SOCK`,`DISPLAY`,`WAYLAND_DISPLAY`,`XDG_RUNTIME_DIR`,`XDG_SESSION_TYPE`]);for(let[e,i]of Object.entries(process.env)){if(!i)continue;if(r.has(e)){t.set(e,i);continue}let a=e.toLowerCase();a.includes(`api_key`)||a.includes(`token`)||a.includes(`secret`)||a.includes(`password`)||a.includes(`passwd`)||a.includes(`credential`)||a.includes(`auth`)||n.some(t=>e.startsWith(t))&&t.set(e,i)}if(e)for(let[n,r]of Object.entries(e))r===void 0?t.delete(n):t.set(n,r);return Object.fromEntries(t)}const R={Bash:`bash`,Read:`read`,Write:`write`,Edit:`edit`,MultiEdit:`edit`,Grep:`grep`,Glob:`find`,WebFetch:`web_fetch`,WebSearch:`web_search`,Task:`task_delegate`,TodoWrite:`write_todos`};function Ot(e){return R[e]}const kt=Object.fromEntries(Object.entries(R).reverse().map(([e,t])=>[t,e]));function At(e){return kt[e]??e}function jt(e){return e.map(e=>R[e]??e)}function z(e){return e.toString(`base64url`)}function B(){return z(ae(32))}function V(e){return z(ie(`sha256`).update(e).digest())}function Mt(){let e=B();return{verifier:e,challenge:V(e),method:`S256`}}function Nt(){return z(ae(16))}const Pt=[1455,1457];function Ft(){return`<span class="otto-wordmark">OTTO</span>`}function It(){return`<svg viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg">
6
+ `),truncated:!0,truncatedBy:l,totalLines:o,totalBytes:i,lastLinePartial:u,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:s.length,outputBytes:c})}function $e(e,t){let n=Buffer.from(e,`utf-8`);if(n.length<=t)return e;let r=n.length-t;for(;r<n.length;){let e=n[r];if(e===void 0||(e&192)!=128)break;r++}return n.subarray(r).toString(`utf-8`)}function et(e,t){return e.length<=t?{text:e,wasTruncated:!1}:{text:`${e.slice(0,t)}... [truncated]`,wasTruncated:!0}}const M=`otto-coding-`,N=`.log`;function P(){return s}function tt(){return o}function nt(){return ne(tt(),`tools`)}function rt(e,t=``){return ne(nt(),...t?[e,t]:[e])}function it(){let e=y();return v(re(),`${M}${e}${N}`)}function at(){let e=y();return v(P(),`tool-results`,`bash`,`${M}${e}${N}`)}async function ot(e,t){return ct(re(),e,t)}async function st(e,t){return ct(v(P(),`tool-results`,`bash`),e,t)}async function ct(e,t,n){let r;try{r=await h(e)}catch{return 0}let i=r.filter(e=>e.startsWith(M)&&e.endsWith(N)),a=0;return await Promise.all(i.map(async r=>{let i=v(e,r);try{n-(await g(i)).mtimeMs>t&&(await _(i),a++)}catch{}})),a}function lt(e){let t=[],n=oe(e,t,{allowTrailingComma:!0,disallowComments:!1,allowEmptyContent:!1});if(t.length>0){let e=t[0],n=e?se(e.error):`UnknownError`;throw Error(`Invalid JSONC: ${n}`)}return n}function ut(e,t){return ce(e,void 0,t)??`null`}function dt(e,t){let n=``;for(let t=0;t<e.length;t++){let r=e[t];r===`*`?e[t+1]===`*`?(n+=`.*`,t++):n+=`[^/]*`:r===`?`?n+=`.`:n+=r.replace(/[.+^${}()|[\]\\]/g,`\\$&`)}return RegExp(`^${n}$`,`i`).test(t)}let F;function ft(e){F=e||void 0}function pt(){return F}function I(e){let t=e||F;if(t)try{return new de({uri:t})}catch{return}}let L;function mt(e){if(L===void 0&&(L=fe()),!e){pe(L);return}try{pe(new ue({httpProxy:e,httpsProxy:e,noProxy:`localhost,127.0.0.1,[::1]`}))}catch{}}async function ht(e,t=5e3){let n=Date.now(),r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let t=await fetch(e,{method:`GET`,signal:r.signal});return{ok:!0,latencyMs:Date.now()-n,status:t.status}}catch(e){let t=Date.now()-n;if(r.signal.aborted)return{ok:!1,latencyMs:t,errorKind:`timeout`,errorMessage:`timeout`};let i=e instanceof Error?e.message:String(e);return{ok:!1,latencyMs:t,errorKind:gt(e),errorMessage:i}}finally{clearTimeout(i)}}function gt(e){switch(e?.cause?.code??e?.code){case`ECONNREFUSED`:case`ECONNRESET`:case`EHOSTUNREACH`:case`ENETUNREACH`:return`proxy-unreachable`;case`ENOTFOUND`:case`EAI_AGAIN`:return`target-unreachable`;case`UND_ERR_CONNECT_TIMEOUT`:case`UND_ERR_HEADERS_TIMEOUT`:case`ETIMEDOUT`:return`timeout`;default:return`unknown`}}async function _t(e){let{url:t,method:n=`POST`,headers:r={},body:i,timeout:a=6e4,signal:o}=e,s=new AbortController,c=o?AbortSignal.any([o,s.signal]):s.signal,l=setTimeout(()=>s.abort(),a);try{let a=I(e.proxy),o={method:n,headers:{"content-type":`application/json`,...r},signal:c};i&&(o.body=typeof i==`string`?i:JSON.stringify(i));let s=await fetch(t,a?{...o,dispatcher:a}:o),l=await s.text();return{status:s.status,headers:s.headers,body:l,ok:s.ok}}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?new S(`HTTP request aborted or timed out`,{code:`NETWORK_TIMEOUT`,cause:e}):new S(`HTTP request failed`,{code:`NETWORK_ERROR`,cause:e instanceof Error?e:Error(String(e))})}finally{clearTimeout(l)}}const vt={kind:`idle`},yt={kind:`wallclock`};function bt(e,t){return e?t.idleTimeout:t.firstTokenIdleTimeout}function xt(e){let t=e.idleTimeout??12e4,n=e.firstTokenIdleTimeout??Math.max(t,9e5),r=e.timeout??3e5;return{timeout:Math.max(r,n+6e4),idleTimeout:t,firstTokenIdleTimeout:n}}function St(e){let t=e.signal.reason;return typeof t==`object`&&t&&`kind`in t?t.kind:`external`}async function*Ct(e){let{url:t,method:n=`POST`,headers:r={},body:i,signal:a}=e,{timeout:o,idleTimeout:s,firstTokenIdleTimeout:c}=xt(e),l=new AbortController,u=a?AbortSignal.any([a,l.signal]):l.signal,d=setTimeout(()=>l.abort(yt),o),f,p=!1,m=()=>{f&&clearTimeout(f),f=setTimeout(()=>l.abort(vt),bt(p,{idleTimeout:s,firstTokenIdleTimeout:c}))},h;try{let a=I(e.proxy),o={method:n,headers:{"content-type":`application/json`,accept:`text/event-stream`,...r},body:i?typeof i==`string`?i:JSON.stringify(i):void 0,signal:u},s=await fetch(t,a?{...o,dispatcher:a}:o);if(!s.ok){let e=await s.text(),t=`BAD_RESPONSE`;s.status===429?t=`RATE_LIMIT`:s.status===529?t=`OVERLOADED`:s.status>=500?t=`SERVER_ERROR`:s.status>=400&&(t=`REQUEST_ERROR`);let n;try{let t=JSON.parse(e)?.error;n=t?.code??t?.type}catch{}throw new S(`Http request failed ${s.status}: ${e}`,{code:t,status:s.status,headers:s.headers,errorType:n})}if(e.onResponse?.(s.headers),!s.body)throw new S(`Response body is empty`,{code:`BAD_RESPONSE`});h=s.body.getReader();let c=new TextDecoder,l=[],d=le({onEvent(e){l.push({event:e.event||void 0,data:e.data,id:e.id||void 0})}});for(m();;){let{done:e,value:t}=await h.read();if(e)break;for(m(),d.feed(c.decode(t,{stream:!0}));l.length>0;){let e=l.shift();e&&(p||(p=!0,m()),yield e)}}for(d.feed(c.decode());l.length>0;){let e=l.shift();e&&(p||(p=!0,m()),yield e)}}catch(e){throw e instanceof S?e:l.signal.aborted||e instanceof DOMException&&e.name===`AbortError`?new S(`Stream aborted or timed out`,{code:`TIMEOUT`,cause:e instanceof Error?e:Error(String(e)),abortKind:St(l)}):new S(`Stream request failed`,{code:`NETWORK_ERROR`,cause:e instanceof Error?e:Error(String(e))})}finally{clearTimeout(d),f&&clearTimeout(f),h&&h.cancel().catch(()=>{})}}function wt(e,t){if(e==null)return;if(typeof e.get==`function`)return e.get(t)??void 0;let n=e;for(let e of Object.keys(n))if(e.toLowerCase()===t){let t=n[e];return typeof t==`string`?t:void 0}}const Tt=[{description:`递归强制删除`,substring:`rm -rf`},{description:`递归强制删除(长格式)`,substring:`rm -r -f`},{description:`递归强制删除(长格式 2)`,substring:`rm --recursive --force`},{description:`删除根目录`,substring:`rm -rf /`},{description:`权限提升`,substring:`sudo rm`},{description:`权限提升`,substring:`sudo `},{description:`chmod 777`,substring:`chmod 777`},{description:`chmod -R 777`,substring:`chmod -R 777`},{description:`chmod 777 递归`,substring:`chmod -R`},{description:`curl 管道 shell 执行`,regex:/curl\s+\S+\s*\|\s*(ba)?sh/},{description:`wget 管道 shell 执行`,regex:/wget\s+\S+\s*-\s*O\s*-\s*\|\s*(ba)?sh/},{description:`fork bomb`,regex:/:\s*\(\s*\)\s*\{\s*:\s*\|\s*:?\s*&\s*\}\s*;?\s*:/},{description:`覆盖关键系统文件`,regex:/>\s*\/(etc|boot|sys|proc|dev)\//},{description:`mkfs 格式化`,substring:`mkfs.`},{description:`dd 覆写磁盘`,regex:/dd\s+if=.*of=\/dev\//}];function Et(e){let t=e.trim();if(!t)return{safe:!0};for(let e of Tt)if(e.substring!==void 0&&t.includes(e.substring)||e.regex!==void 0&&e.regex.test(t))return{safe:!1,reason:e.description};return{safe:!0}}function Dt(e){let t=new Map,n=[`LC_`,`OTTO_`,`npm_`],r=new Set([`PATH`,`HOME`,`USER`,`SHELL`,`TMPDIR`,`TEMP`,`TMP`,`LANG`,`NODE_PATH`,`NODE_ENV`,`TERM`,`COLORTERM`,`TERM_PROGRAM`,`SSH_AUTH_SOCK`,`DISPLAY`,`WAYLAND_DISPLAY`,`XDG_RUNTIME_DIR`,`XDG_SESSION_TYPE`]);for(let[e,i]of Object.entries(process.env)){if(!i)continue;if(r.has(e)){t.set(e,i);continue}let a=e.toLowerCase();a.includes(`api_key`)||a.includes(`token`)||a.includes(`secret`)||a.includes(`password`)||a.includes(`passwd`)||a.includes(`credential`)||a.includes(`auth`)||n.some(t=>e.startsWith(t))&&t.set(e,i)}if(e)for(let[n,r]of Object.entries(e))r===void 0?t.delete(n):t.set(n,r);return Object.fromEntries(t)}const R={Bash:`bash`,Read:`read`,Write:`write`,Edit:`edit`,MultiEdit:`edit`,Grep:`grep`,Glob:`find`,WebFetch:`web_fetch`,WebSearch:`web_search`,Task:`task_delegate`,TodoWrite:`write_todos`};function Ot(e){return R[e]}const kt=Object.fromEntries(Object.entries(R).reverse().map(([e,t])=>[t,e]));function At(e){return kt[e]??e}function jt(e){return e.map(e=>R[e]??e)}function z(e){return e.toString(`base64url`)}function B(){return z(ae(32))}function V(e){return z(ie(`sha256`).update(e).digest())}function Mt(){let e=B();return{verifier:e,challenge:V(e),method:`S256`}}function Nt(){return z(ae(16))}const Pt=[1455,1457];function Ft(){return`<span class="otto-wordmark">OTTO</span>`}function It(){return`<svg viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg">
7
7
  <circle cx="26" cy="26" r="24" fill="var(--gray-3)" stroke="var(--gray-5)" stroke-width="2"/>
8
8
  <path d="M15.5 27l7 6.5 14-15" stroke="var(--gray-12)" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round"/>
9
9
  </svg>`}function Lt(){return`<svg viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -86,5 +86,5 @@ import{n as e,t}from"./event-bus-CABu09lC.js";import{createRequire as n}from"nod
86
86
  </section>
87
87
  </main>
88
88
  </body>
89
- </html>`}const zt=Rt(`success`,`Login complete`,`You can close this window and return to the terminal.`,`Otto Auth`);function U(e){return Rt(`error`,`Login failed`,e,`Otto Auth`)}function W(e,t,n){let r=Buffer.from(n,`utf-8`);e.writeHead(t,{"Content-Type":`text/html; charset=utf-8`,"Content-Length":String(r.length),Connection:`close`}),e.end(r)}function Bt(e,t,n){return new Promise((r,i)=>{if(n.length===0){i(new w(`No loopback port specified.`,{code:`OAUTH_LOOPBACK_PORT_UNAVAILABLE`}));return}let a=0,o=()=>{e.removeListener(`error`,l),e.removeListener(`listening`,c)},s=()=>{let r=n[a++];e.listen(r,t)},c=()=>{o();let t=e.address();r(typeof t==`object`&&t?t.port:n[a-1])},l=e=>{if(e.code===`EADDRINUSE`||e.code===`EACCES`){if(a<n.length){s();return}o(),i(new w(`No available loopback port among: ${n.join(`, `)}`,{code:`OAUTH_LOOPBACK_PORT_UNAVAILABLE`}));return}o(),i(e)};e.on(`error`,l),e.on(`listening`,c),s()})}function Vt(e,t){e.value||(e.value=!0,t())}async function Ht(e={}){let{ports:t=Pt,callbackPath:n=`/auth/callback`,expectedState:r,host:i=`127.0.0.1`,signal:a}=e;if(a?.aborted)throw new w(`Login cancelled`,{code:`OAUTH_CANCELLED`});let o,s,c={value:!1},l=new Promise((e,t)=>{o=t=>Vt(c,()=>e(t)),s=e=>Vt(c,()=>t(e))});l.catch(()=>{});let u=0,d=()=>`http://${i}:${u}`,f=pe((e,t)=>{let i;try{i=new URL(e.url??`/`,d())}catch{W(t,400,U(`Invalid request URL`)),s(new w(`Invalid callback URL`,{code:`OAUTH_INVALID_REQUEST`}));return}if(i.pathname!==n){W(t,404,U(`Not found`));return}let a=i.searchParams.get(`error`);if(a){let e=i.searchParams.get(`error_description`)??``;W(t,400,U(e||a)),s(new w(`Authorization failed: ${a}${e?`: ${e}`:``}`,{code:`OAUTH_AUTHORIZE_FAILED`}));return}let c=i.searchParams.get(`code`);if(!c){W(t,400,U(`Missing authorization code.`)),s(new w(`Callback missing authorization code.`,{code:`OAUTH_AUTHORIZE_FAILED`}));return}let l=i.searchParams.get(`state`)??void 0;if(r!==void 0&&l!==r){W(t,400,U(`State mismatch.`)),s(new w(`OAuth state mismatch (possible CSRF).`,{code:`OAUTH_STATE_MISMATCH`}));return}W(t,200,zt),o({code:c,state:l})});u=await Bt(f,i,t);let p=!1,m=()=>new Promise(e=>{if(p){e();return}p=!0,s(new w(`Login cancelled (server closed)`,{code:`OAUTH_CANCELLED`})),f.close(()=>e()),f.closeAllConnections?.()});return a&&a.addEventListener(`abort`,()=>{s(new w(`Login cancelled`,{code:`OAUTH_CANCELLED`})),m()},{once:!0}),{port:u,redirectUri:`${d()}${n}`,waitForCallback:()=>l,close:m}}function Ut(e){try{new URL(e)}catch{return!1}try{let t=process.platform,n=t===`darwin`?[`open`,[e]]:t===`win32`?[`cmd`,[`/c`,`start`,``,e]]:[`xdg-open`,[e]];return me(n[0],[...n[1]],{detached:!0,stdio:`ignore`}).unref(),!0}catch{return!1}}const Wt=/^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;function Gt(e){let t=Wt.exec(e);return t?{fields:Kt(t[1]??``),body:(t[2]??``).trim()}:null}function Kt(e){let t=new Map;for(let n of e.split(`
90
- `)){let e=n.indexOf(`:`);if(e<=0)continue;let r=n.slice(0,e).trim().toLowerCase().replaceAll(`_`,``),i=n.slice(e+1).trim().replace(/^["']|["']$/g,``);r&&i&&t.set(r,i)}return t}function qt(e){if(!e)return;let t=(e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e).split(`,`).map(e=>e.trim().replace(/^["']|["']$/g,``)).filter(e=>e!==``);return t.length>0?t:void 0}const Jt=8e3,Yt=5*1024*1024,Xt=Buffer.from([137,80,78,71,13,10,26,10]),Zt=Buffer.from(`GIF8`,`ascii`);function Qt(e,t){if(!(!e||e.length===0)&&!(e.length>7340032))try{return $t(Buffer.from(e.slice(0,128),`base64`),e,t)}catch{return}}function $t(e,t,n){let r=n.toLowerCase();if(r.includes(`png`))return en(e);if(r.includes(`jpeg`)||r.includes(`jpg`))return tn(Buffer.from(t,`base64`));if(r.includes(`gif`))return nn(e);if(r.includes(`webp`))return rn(e);if(e.length>=8&&e.subarray(0,8).equals(Xt))return en(e);if(e.length>=2&&e.readUInt16BE(0)===65496)return tn(Buffer.from(t,`base64`));if(e.length>=4&&e.subarray(0,4).equals(Zt))return nn(e);if(e.length>=12&&e.readUInt32BE(0)===1380533830&&e.readUInt32BE(8)===1464156752)return rn(e)}function en(e){if(!(e.length<24)&&e.subarray(0,8).equals(Xt))try{return e.toString(`ascii`,12,16)===`IHDR`?{width:e.readUInt32BE(16),height:e.readUInt32BE(20)}:void 0}catch{return}}function tn(e){if(!(e.length<2))try{let t=2,n=0;for(;t<e.length-1;){if(n++,n>1e5)return;let r=e.readUInt16BE(t);if(r===65497||(r&65280)!=65280)return;let i=r&255;if(i>=192&&i<=195||i>=197&&i<=199||i>=201&&i<=203||i>=205&&i<=207){if(t+9>e.length||e.readUInt16BE(t+2)<8)return;let n=e.readUInt16BE(t+5);return{width:e.readUInt16BE(t+7),height:n}}if(i===216||i===217){t+=2;continue}if(t+4>e.length)return;let a=e.readUInt16BE(t+2);if(a<2)return;t+=2+a}return}catch{return}}function nn(e){if(!(e.length<10)&&e.subarray(0,4).equals(Zt))try{return{width:e.readUInt16LE(6),height:e.readUInt16LE(8)}}catch{return}}function rn(e){if(!(e.length<16)&&!(e.readUInt32BE(0)!==1380533830||e.readUInt32BE(8)!==1464156752))try{let t=e.toString(`ascii`,12,16);return t===`VP8X`?an(e):t===`VP8 `?on(e):t===`VP8L`?sn(e):void 0}catch{return}}function an(e){if(!(e.length<30))return{width:(e[24]|e[25]<<8|e[26]<<16)+1,height:(e[27]|e[28]<<8|e[29]<<16)+1}}function on(e){if(e.length<30)return;let t=e.readUInt16LE(26)&16383,n=e.readUInt16LE(28)&16383;if(!(t===0||n===0))return{width:t,height:n}}function sn(e){if(e.length<25||e[20]!==47)return;let t=e.readUInt32LE(21);return{width:(t&16383)+1,height:(t>>14&16383)+1}}let G;async function cn(e=!1){let t=Date.now();if(!e&&G&&t-G.at<3e5)return G.reachable;let n=l();if(n.length===0)return G={reachable:!1,at:t},!1;for(let e of n){let n=new AbortController,r=setTimeout(()=>n.abort(),2e3);try{if(await fetch(e,{method:`HEAD`,signal:n.signal}))return G={reachable:!0,at:t},!0}catch{}finally{clearTimeout(r)}}return G={reachable:!1,at:t},!1}function ln(){G=void 0}const K=process.env.OTTO_STARTUP_TRACE===`1`,un=K?performance.now():0;function dn(e){if(!K)return;let t=performance.now()-un;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}async function fn(e,t){if(!K)return t();let n=performance.now();try{return await t()}finally{let t=performance.now()-n;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}}function pn(e,t){if(!K)return t();let n=performance.now();try{return t()}finally{let t=performance.now()-n;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}}function mn(){return K}const hn=/[/\-_\s.]/;function gn(e){return e!==void 0&&hn.test(e)}function q(e,t){if(e.length===0)return{score:0,positions:[]};if(t.length===0)return null;let n=e.toLowerCase(),r=t.toLowerCase(),i=0,a=0,o=[],s=-2;for(let e=0;e<r.length&&a<n.length;e++)r[e]===n[a]&&(s===e-1?i+=24:(i+=16,s>=0&&(i-=(e-s-1)*3)),e===0?i+=12:gn(r[e-1])&&(i+=8),o.push(e),s=e,a++);return a<n.length?null:(i-=Math.max(0,r.length-n.length)*.5,{score:i,positions:o})}function _n(e,t){return q(e,t)?.score??-1}function vn(e){if(e.length===0)return[];let t=[],n=e[0],r=n+1;for(let i=1;i<e.length;i++){let a=e[i];a===r?r++:(t.push({start:n,end:r}),n=a,r=a+1)}return t.push({start:n,end:r}),t}function yn(e,t,n){let r=q(e,t);for(let t of n??[]){let n=q(e,t);n&&(!r||n.score>r.score)&&(r=n)}return r}function J(e,t,n={}){let r=n.maxResults??50,i=n.matchEmpty??!0,a=t.trim();if(a===``)return i?e.slice(0,r).map(e=>({item:e,score:0,highlightRanges:[]})):[];let o=[];for(let t of e){let e=yn(a,t.text,t.aliases);if(!e)continue;let n=q(a,t.text);o.push({item:t,score:e.score,highlightRanges:vn(n?.positions??[])})}return o.sort((e,t)=>t.score-e.score||(e.item.sortKey??e.item.text).localeCompare(t.item.sortKey??t.item.text)),o.slice(0,r)}function bn(e,t,n){return J(e.map(e=>({text:e.name,aliases:e.description?[e.description]:void 0,payload:e,sortKey:e.sortKey})),t,n).map(e=>e.item.payload)}function xn(e,t,n){return J(e.map(e=>({text:e.searchText??e.label,aliases:[e.group,e.detail,e.value].filter(e=>!!e),payload:e})),t,{maxResults:n?.maxResults??e.length,matchEmpty:n?.matchEmpty}).map(e=>e.item.payload)}const Y=Ve(`@x-otto/shared:file-lock`),Sn=15e3;function Cn(e){return Math.floor(e/3)}const X=new Map,Z=new Map;function Q(e,t,n=`file-lock`){return v(e,`.${n}-${t}.lock`)}function wn(e,t){Tn(e);let n=setInterval(()=>{let t=new Date;ee(e,t,t).catch(()=>{})},Cn(t));n.unref?.(),X.set(e,n)}function Tn(e){let t=X.get(e);t&&(clearInterval(t),X.delete(e))}async function En(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=async(n=!1)=>{try{let e=await p(i,`wx`),t=y();await e.writeFile(t),await e.close(),Z.set(i,t);try{await d(i,384)}catch{}return wn(i,r),!0}catch(r){if(r.code===`EEXIST`)return!1;if(r.code===`ENOENT`&&!n){try{await f(e,{recursive:!0})}catch(e){return Y.warn(`Failed to create lock directory for ${t}: ${e.message}`),!1}return await a(!0)}return Y.warn(`Failed to acquire file lock for ${t}: ${r.message}`),!1}};if(await a())return!0;try{let e=await g(i);if(Date.now()-e.mtimeMs>r)return await _(i).catch(()=>{}),await a()}catch{return await a()}return!1}async function Dn(e,t,n={}){let r=Q(e,t,n.prefix);Tn(r);let i=Z.get(r);if(Z.delete(r),i!==void 0)try{if(await m(r,`utf-8`)!==i){Y.warn(`File lock ownership drifted for ${t} — another process stole this lock (likely stale-lock takeover during a heartbeat gap). Skipping unlink to avoid deleting the new owner's lock.`);return}}catch{}await _(r).catch(()=>{})}async function On(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=Date.now()+r;for(;Date.now()<a;){try{await g(i)}catch{return!0}await new Promise(e=>setTimeout(e,100))}return!1}const $=new Map;function kn(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=(n=!1)=>{let r;try{r=ve(i,`wx`)}catch(r){let i=r.code;if(i===`EEXIST`)return!1;if(i===`ENOENT`&&!n){try{_e(e,{recursive:!0})}catch(e){return Y.warn(`Failed to create lock directory for ${t}: ${e.message}`),!1}return a(!0)}return Y.warn(`Failed to acquire file lock for ${t}: ${r.message}`),!1}let o=y();try{xe(r,o)}finally{ge(r)}$.set(i,o);try{he(i,384)}catch{}return!0};if(a())return!0;try{let e=be(i);if(Date.now()-e.mtimeMs>r){try{x(i)}catch{}return a()}}catch{return a()}return!1}function An(e,t,n={}){let r=Q(e,t,n.prefix),i=$.get(r);if($.delete(r),i!==void 0)try{if(ye(r,`utf-8`)!==i){Y.warn(`File lock ownership drifted for ${t} — another process stole this lock. Skipping unlink to avoid deleting the new owner's lock.`);return}}catch{}try{x(r)}catch{}}function jn(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=Date.now()+r,o=new Int32Array(new SharedArrayBuffer(4));for(;Date.now()<a;){try{be(i)}catch{return!0}Atomics.wait(o,0,0,100)}return!1}export{Jt as API_IMAGE_DIMENSION_LIMIT_PX,Ce as AgentError,R as CLAUDE_TO_OTTO_TOOL,S as CodedError,Sn as DEFAULT_FILE_LOCK_TIMEOUT_MS,t as EventBus,Ee as InvariantError,He as LARGE_FILE_BYTE_THRESHOLD,we as McpError,C as NetworkError,w as OAuthError,Yt as PROVIDER_IMAGE_INLINE_MAX_BYTES,Se as ProviderError,e as TypedEventEmitter,En as acquireFileLock,kn as acquireFileLockSync,Ie as attachLogListener,Dt as buildAllowedEnv,Et as checkShellCommand,I as createDispatcher,Ve as createLogger,Mt as createPkcePair,at as createProjectOverflowLogPath,it as createTempLoggerPath,Ge as exists,Xe as formatBytes,V as generateChallenge,Nt as generateState,B as generateVerifier,pt as getDefaultProxy,tt as getHomeDir,P as getProjectDir,rt as getThirdPartyToolBinaryDir,nt as getThirdPartyToolDir,wt as headerGet,mt as installGlobalProxyDispatcher,T as invariant,Ke as isDirectory,qe as isFile,cn as isIntranetReachable,mn as isStartupTraceEnabled,Re as isTransportInitialized,Q as lockPath,jt as mapClaudeAgentToolNames,Ot as mapClaudeToolName,dn as markStartupPhase,q as matchSubsequence,dt as matchesGlobPattern,Ue as mime,We as mkdirp,c as normalizePath,Ut as openBrowser,At as ottoToClaudeToolName,Kt as parseFrontmatterFields,qt as parseFrontmatterList,lt as parseJsonc,vn as positionsToHighlightRanges,Qt as probeImageDimensions,ht as probeProxy,J as rankCandidates,xn as rankLabeledItems,bn as rankNamedItems,Je as readFileCapped,Dn as releaseFileLock,An as releaseFileLockSync,_t as request,ln as resetIntranetReachabilityCache,ut as safeStringify,_n as scoreSubsequence,ft as setDefaultProxy,Le as setLogLevel,Gt as splitFrontmatter,Ht as startLoopbackServer,Ct as stream,st as sweepStaleProjectOverflowLogs,ot as sweepStaleTempLogs,Ye as toTruncationMeta,fn as traceStartupPhase,pn as traceStartupPhaseSync,Ze as truncateHead,et as truncateLine,Qe as truncateTail,On as waitForFileLockRelease,jn as waitForFileLockReleaseSync};
89
+ </html>`}const zt=Rt(`success`,`Login complete`,`You can close this window and return to the terminal.`,`Otto Auth`);function U(e){return Rt(`error`,`Login failed`,e,`Otto Auth`)}function W(e,t,n){let r=Buffer.from(n,`utf-8`);e.writeHead(t,{"Content-Type":`text/html; charset=utf-8`,"Content-Length":String(r.length),Connection:`close`}),e.end(r)}function Bt(e,t,n){return new Promise((r,i)=>{if(n.length===0){i(new C(`No loopback port specified.`,{code:`OAUTH_LOOPBACK_PORT_UNAVAILABLE`}));return}let a=0,o=()=>{e.removeListener(`error`,l),e.removeListener(`listening`,c)},s=()=>{let r=n[a++];e.listen(r,t)},c=()=>{o();let t=e.address();r(typeof t==`object`&&t?t.port:n[a-1])},l=e=>{if(e.code===`EADDRINUSE`||e.code===`EACCES`){if(a<n.length){s();return}o(),i(new C(`No available loopback port among: ${n.join(`, `)}`,{code:`OAUTH_LOOPBACK_PORT_UNAVAILABLE`}));return}o(),i(e)};e.on(`error`,l),e.on(`listening`,c),s()})}function Vt(e,t){e.value||(e.value=!0,t())}async function Ht(e={}){let{ports:t=Pt,callbackPath:n=`/auth/callback`,expectedState:r,host:i=`127.0.0.1`,signal:a}=e;if(a?.aborted)throw new C(`Login cancelled`,{code:`OAUTH_CANCELLED`});let o,s,c={value:!1},l=new Promise((e,t)=>{o=t=>Vt(c,()=>e(t)),s=e=>Vt(c,()=>t(e))});l.catch(()=>{});let u=0,d=()=>`http://${i}:${u}`,f=me((e,t)=>{let i;try{i=new URL(e.url??`/`,d())}catch{W(t,400,U(`Invalid request URL`)),s(new C(`Invalid callback URL`,{code:`OAUTH_INVALID_REQUEST`}));return}if(i.pathname!==n){W(t,404,U(`Not found`));return}let a=i.searchParams.get(`error`);if(a){let e=i.searchParams.get(`error_description`)??``;W(t,400,U(e||a)),s(new C(`Authorization failed: ${a}${e?`: ${e}`:``}`,{code:`OAUTH_AUTHORIZE_FAILED`}));return}let c=i.searchParams.get(`code`);if(!c){W(t,400,U(`Missing authorization code.`)),s(new C(`Callback missing authorization code.`,{code:`OAUTH_AUTHORIZE_FAILED`}));return}let l=i.searchParams.get(`state`)??void 0;if(r!==void 0&&l!==r){W(t,400,U(`State mismatch.`)),s(new C(`OAuth state mismatch (possible CSRF).`,{code:`OAUTH_STATE_MISMATCH`}));return}W(t,200,zt),o({code:c,state:l})});u=await Bt(f,i,t);let p=!1,m=()=>new Promise(e=>{if(p){e();return}p=!0,s(new C(`Login cancelled (server closed)`,{code:`OAUTH_CANCELLED`})),f.close(()=>e()),f.closeAllConnections?.()});return a&&a.addEventListener(`abort`,()=>{s(new C(`Login cancelled`,{code:`OAUTH_CANCELLED`})),m()},{once:!0}),{port:u,redirectUri:`${d()}${n}`,waitForCallback:()=>l,close:m}}function Ut(e){try{new URL(e)}catch{return!1}try{let t=process.platform,n=t===`darwin`?[`open`,[e]]:t===`win32`?[`cmd`,[`/c`,`start`,``,e]]:[`xdg-open`,[e]];return he(n[0],[...n[1]],{detached:!0,stdio:`ignore`}).unref(),!0}catch{return!1}}const Wt=/^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/;function Gt(e){let t=Wt.exec(e);return t?{fields:Kt(t[1]??``),body:(t[2]??``).trim()}:null}function Kt(e){let t=new Map;for(let n of e.split(`
90
+ `)){let e=n.indexOf(`:`);if(e<=0)continue;let r=n.slice(0,e).trim().toLowerCase().replaceAll(`_`,``),i=n.slice(e+1).trim().replace(/^["']|["']$/g,``);r&&i&&t.set(r,i)}return t}function qt(e){if(!e)return;let t=(e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e).split(`,`).map(e=>e.trim().replace(/^["']|["']$/g,``)).filter(e=>e!==``);return t.length>0?t:void 0}const Jt=8e3,Yt=5*1024*1024,Xt=Buffer.from([137,80,78,71,13,10,26,10]),Zt=Buffer.from(`GIF8`,`ascii`);function Qt(e,t){if(!(!e||e.length===0)&&!(e.length>7340032))try{return $t(Buffer.from(e.slice(0,128),`base64`),e,t)}catch{return}}function $t(e,t,n){let r=n.toLowerCase();if(r.includes(`png`))return en(e);if(r.includes(`jpeg`)||r.includes(`jpg`))return tn(Buffer.from(t,`base64`));if(r.includes(`gif`))return nn(e);if(r.includes(`webp`))return rn(e);if(e.length>=8&&e.subarray(0,8).equals(Xt))return en(e);if(e.length>=2&&e.readUInt16BE(0)===65496)return tn(Buffer.from(t,`base64`));if(e.length>=4&&e.subarray(0,4).equals(Zt))return nn(e);if(e.length>=12&&e.readUInt32BE(0)===1380533830&&e.readUInt32BE(8)===1464156752)return rn(e)}function en(e){if(!(e.length<24)&&e.subarray(0,8).equals(Xt))try{return e.toString(`ascii`,12,16)===`IHDR`?{width:e.readUInt32BE(16),height:e.readUInt32BE(20)}:void 0}catch{return}}function tn(e){if(!(e.length<2))try{let t=2,n=0;for(;t<e.length-1;){if(n++,n>1e5)return;let r=e.readUInt16BE(t);if(r===65497||(r&65280)!=65280)return;let i=r&255;if(i>=192&&i<=195||i>=197&&i<=199||i>=201&&i<=203||i>=205&&i<=207){if(t+9>e.length||e.readUInt16BE(t+2)<8)return;let n=e.readUInt16BE(t+5);return{width:e.readUInt16BE(t+7),height:n}}if(i===216||i===217){t+=2;continue}if(t+4>e.length)return;let a=e.readUInt16BE(t+2);if(a<2)return;t+=2+a}return}catch{return}}function nn(e){if(!(e.length<10)&&e.subarray(0,4).equals(Zt))try{return{width:e.readUInt16LE(6),height:e.readUInt16LE(8)}}catch{return}}function rn(e){if(!(e.length<16)&&!(e.readUInt32BE(0)!==1380533830||e.readUInt32BE(8)!==1464156752))try{let t=e.toString(`ascii`,12,16);return t===`VP8X`?an(e):t===`VP8 `?on(e):t===`VP8L`?sn(e):void 0}catch{return}}function an(e){if(!(e.length<30))return{width:(e[24]|e[25]<<8|e[26]<<16)+1,height:(e[27]|e[28]<<8|e[29]<<16)+1}}function on(e){if(e.length<30)return;let t=e.readUInt16LE(26)&16383,n=e.readUInt16LE(28)&16383;if(!(t===0||n===0))return{width:t,height:n}}function sn(e){if(e.length<25||e[20]!==47)return;let t=e.readUInt32LE(21);return{width:(t&16383)+1,height:(t>>14&16383)+1}}let G;async function cn(e=!1){let t=Date.now();if(!e&&G&&t-G.at<3e5)return G.reachable;let n=l();if(n.length===0)return G={reachable:!1,at:t},!1;for(let e of n){let n=new AbortController,r=setTimeout(()=>n.abort(),2e3);try{if(await fetch(e,{method:`HEAD`,signal:n.signal}))return G={reachable:!0,at:t},!0}catch{}finally{clearTimeout(r)}}return G={reachable:!1,at:t},!1}function ln(){G=void 0}async function un(e,t={}){if(e===void 0)return!0;try{return await e(),!0}catch(e){return t.logger?.warn({...t.context,err:e instanceof Error?e.message:String(e)},t.label??`dispose failed`),!1}}async function dn(e,t={}){let n=e?.dispose;return typeof n==`function`?un(()=>n.call(e),t):!0}const K=process.env.OTTO_STARTUP_TRACE===`1`,fn=K?performance.now():0;function pn(e){if(!K)return;let t=performance.now()-fn;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}async function mn(e,t){if(!K)return t();let n=performance.now();try{return await t()}finally{let t=performance.now()-n;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}}function hn(e,t){if(!K)return t();let n=performance.now();try{return t()}finally{let t=performance.now()-n;process.stderr.write(`[startup] ${e}: ${t.toFixed(1)}ms\n`)}}function gn(){return K}const _n=/[/\-_\s.]/;function vn(e){return e!==void 0&&_n.test(e)}function q(e,t){if(e.length===0)return{score:0,positions:[]};if(t.length===0)return null;let n=e.toLowerCase(),r=t.toLowerCase(),i=0,a=0,o=[],s=-2;for(let e=0;e<r.length&&a<n.length;e++)r[e]===n[a]&&(s===e-1?i+=24:(i+=16,s>=0&&(i-=(e-s-1)*3)),e===0?i+=12:vn(r[e-1])&&(i+=8),o.push(e),s=e,a++);return a<n.length?null:(i-=Math.max(0,r.length-n.length)*.5,{score:i,positions:o})}function yn(e,t){return q(e,t)?.score??-1}function bn(e){if(e.length===0)return[];let t=[],n=e[0],r=n+1;for(let i=1;i<e.length;i++){let a=e[i];a===r?r++:(t.push({start:n,end:r}),n=a,r=a+1)}return t.push({start:n,end:r}),t}function xn(e,t,n){let r=q(e,t);for(let t of n??[]){let n=q(e,t);n&&(!r||n.score>r.score)&&(r=n)}return r}function J(e,t,n={}){let r=n.maxResults??50,i=n.matchEmpty??!0,a=t.trim();if(a===``)return i?e.slice(0,r).map(e=>({item:e,score:0,highlightRanges:[]})):[];let o=[];for(let t of e){let e=xn(a,t.text,t.aliases);if(!e)continue;let n=q(a,t.text);o.push({item:t,score:e.score,highlightRanges:bn(n?.positions??[])})}return o.sort((e,t)=>t.score-e.score||(e.item.sortKey??e.item.text).localeCompare(t.item.sortKey??t.item.text)),o.slice(0,r)}function Sn(e,t,n){return J(e.map(e=>({text:e.name,aliases:e.description?[e.description]:void 0,payload:e,sortKey:e.sortKey})),t,n).map(e=>e.item.payload)}function Cn(e,t,n){return J(e.map(e=>({text:e.searchText??e.label,aliases:[e.group,e.detail,e.value].filter(e=>!!e),payload:e})),t,{maxResults:n?.maxResults??e.length,matchEmpty:n?.matchEmpty}).map(e=>e.item.payload)}const Y=He(`@x-otto/shared:file-lock`),wn=15e3;function Tn(e){return Math.floor(e/3)}const X=new Map,Z=new Map;function Q(e,t,n=`file-lock`){return v(e,`.${n}-${t}.lock`)}function En(e,t){Dn(e);let n=setInterval(()=>{let t=new Date;ee(e,t,t).catch(()=>{})},Tn(t));n.unref?.(),X.set(e,n)}function Dn(e){let t=X.get(e);t&&(clearInterval(t),X.delete(e))}async function On(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=async(n=!1)=>{try{let e=await p(i,`wx`),t=y();await e.writeFile(t),await e.close(),Z.set(i,t);try{await d(i,384)}catch{}return En(i,r),!0}catch(r){if(r.code===`EEXIST`)return!1;if(r.code===`ENOENT`&&!n){try{await f(e,{recursive:!0})}catch(e){return Y.warn(`Failed to create lock directory for ${t}: ${e.message}`),!1}return await a(!0)}return Y.warn(`Failed to acquire file lock for ${t}: ${r.message}`),!1}};if(await a())return!0;try{let e=await g(i);if(Date.now()-e.mtimeMs>r)return await _(i).catch(()=>{}),await a()}catch{return await a()}return!1}async function kn(e,t,n={}){let r=Q(e,t,n.prefix);Dn(r);let i=Z.get(r);if(Z.delete(r),i!==void 0)try{if(await m(r,`utf-8`)!==i){Y.warn(`File lock ownership drifted for ${t} — another process stole this lock (likely stale-lock takeover during a heartbeat gap). Skipping unlink to avoid deleting the new owner's lock.`);return}}catch{}await _(r).catch(()=>{})}async function An(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=Date.now()+r;for(;Date.now()<a;){try{await g(i)}catch{return!0}await new Promise(e=>setTimeout(e,100))}return!1}const $=new Map;function jn(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=(n=!1)=>{let r;try{r=ye(i,`wx`)}catch(r){let i=r.code;if(i===`EEXIST`)return!1;if(i===`ENOENT`&&!n){try{ve(e,{recursive:!0})}catch(e){return Y.warn(`Failed to create lock directory for ${t}: ${e.message}`),!1}return a(!0)}return Y.warn(`Failed to acquire file lock for ${t}: ${r.message}`),!1}let o=y();try{Se(r,o)}finally{_e(r)}$.set(i,o);try{ge(i,384)}catch{}return!0};if(a())return!0;try{let e=b(i);if(Date.now()-e.mtimeMs>r){try{xe(i)}catch{}return a()}}catch{return a()}return!1}function Mn(e,t,n={}){let r=Q(e,t,n.prefix),i=$.get(r);if($.delete(r),i!==void 0)try{if(be(r,`utf-8`)!==i){Y.warn(`File lock ownership drifted for ${t} — another process stole this lock. Skipping unlink to avoid deleting the new owner's lock.`);return}}catch{}try{xe(r)}catch{}}function Nn(e,t,n={}){let r=n.timeoutMs??15e3,i=Q(e,t,n.prefix),a=Date.now()+r,o=new Int32Array(new SharedArrayBuffer(4));for(;Date.now()<a;){try{b(i)}catch{return!0}Atomics.wait(o,0,0,100)}return!1}export{Jt as API_IMAGE_DIMENSION_LIMIT_PX,we as AgentError,R as CLAUDE_TO_OTTO_TOOL,x as CodedError,wn as DEFAULT_FILE_LOCK_TIMEOUT_MS,t as EventBus,De as InvariantError,A as LARGE_FILE_BYTE_THRESHOLD,Te as McpError,S as NetworkError,C as OAuthError,Yt as PROVIDER_IMAGE_INLINE_MAX_BYTES,Ce as ProviderError,e as TypedEventEmitter,On as acquireFileLock,jn as acquireFileLockSync,Ie as attachLogListener,Dt as buildAllowedEnv,Et as checkShellCommand,I as createDispatcher,He as createLogger,Mt as createPkcePair,at as createProjectOverflowLogPath,it as createTempLoggerPath,Ge as exists,Xe as formatBytes,V as generateChallenge,Nt as generateState,B as generateVerifier,pt as getDefaultProxy,tt as getHomeDir,P as getProjectDir,rt as getThirdPartyToolBinaryDir,nt as getThirdPartyToolDir,wt as headerGet,mt as installGlobalProxyDispatcher,w as invariant,Ke as isDirectory,qe as isFile,cn as isIntranetReachable,gn as isStartupTraceEnabled,ze as isTransportInitialized,Q as lockPath,jt as mapClaudeAgentToolNames,Ot as mapClaudeToolName,pn as markStartupPhase,q as matchSubsequence,dt as matchesGlobPattern,Ue as mime,We as mkdirp,c as normalizePath,Ut as openBrowser,At as ottoToClaudeToolName,Kt as parseFrontmatterFields,qt as parseFrontmatterList,lt as parseJsonc,bn as positionsToHighlightRanges,Qt as probeImageDimensions,ht as probeProxy,J as rankCandidates,Cn as rankLabeledItems,Sn as rankNamedItems,Je as readFileCapped,kn as releaseFileLock,Mn as releaseFileLockSync,_t as request,ln as resetIntranetReachabilityCache,un as safeDispose,dn as safeDisposeOf,ut as safeStringify,yn as scoreSubsequence,ft as setDefaultProxy,Re as setLogLevel,Gt as splitFrontmatter,Ht as startLoopbackServer,Ct as stream,st as sweepStaleProjectOverflowLogs,ot as sweepStaleTempLogs,Ye as toTruncationMeta,mn as traceStartupPhase,hn as traceStartupPhaseSync,Ze as truncateHead,et as truncateLine,Qe as truncateTail,An as waitForFileLockRelease,Nn as waitForFileLockReleaseSync};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-otto/shared",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.5",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -23,7 +23,6 @@
23
23
  "tag": "alpha"
24
24
  },
25
25
  "dependencies": {
26
- "@x-otto/env": "0.1.0-alpha.3",
27
26
  "eventsource-parser": "3.0.6",
28
27
  "jsonc-parser": "3.3.1",
29
28
  "mime-types": "3.0.2",
@@ -31,7 +30,8 @@
31
30
  "pino-pretty": "13.1.3",
32
31
  "safe-stable-stringify": "2.5.0",
33
32
  "undici": "8.7.0",
34
- "uuid": "13.0.0"
33
+ "uuid": "13.0.0",
34
+ "@x-otto/env": "0.1.0-alpha.5"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/mime-types": "3.0.1"