@x-otto/shared 0.1.0-alpha.1 → 0.1.0-alpha.3
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 +1 -1
- package/dist/index.d.ts +45 -1
- package/dist/index.js +15 -15
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ for await (const event of stream('https://api.example.com/stream')) {
|
|
|
90
90
|
- `rankCandidates(query, items)` / `rankNamedItems(query, items)` — ranked search
|
|
91
91
|
|
|
92
92
|
### Other
|
|
93
|
-
- `invariant(condition, message)` — type-narrowing assertion (merged from `@x-otto/invariant
|
|
93
|
+
- `invariant(condition, message)` — type-narrowing assertion (merged from `@x-otto/invariant`)
|
|
94
94
|
- `splitFrontmatter(text)` / `parseFrontmatterFields(text)` — frontmatter parsing
|
|
95
95
|
- `probeImageDimensions(data)` — image dimension extraction
|
|
96
96
|
- `checkShellCommand(cmd)` / `buildAllowedEnv()` — command validation
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,20 @@ declare class CodedError extends Error {
|
|
|
29
29
|
* `packages/coding/src/plugin/module-wiring.ts`)在包装点补充。
|
|
30
30
|
*/
|
|
31
31
|
readonly pluginSource?: string;
|
|
32
|
+
/**
|
|
33
|
+
* RFC-361 D4:SSE 流被 abort 时的**触发源**——`'idle'`(空闲超时)/ `'wallclock'`
|
|
34
|
+
* (整请求墙钟超时)/ `'external'`(调用方传入的 signal 主动中止)。
|
|
35
|
+
*
|
|
36
|
+
* 存在的理由:三个 abort 源产生完全相同的 AbortError,错误消息也统一是
|
|
37
|
+
* "Stream aborted or timed out"。上层此前只能按**消息文本**分类,而
|
|
38
|
+
* `stream-errors.ts` 的 `TRANSIENT_NETWORK_PATTERNS` 含 `/timed? ?out/i`,于是
|
|
39
|
+
* idle 超时被误判为网络断连、走了「固定 30s × 5 次」的断连重试节奏——每次必然
|
|
40
|
+
* 复现同样超时(真机实测 12 个任务累计空耗 231 分钟)。有了本字段,重试层可以
|
|
41
|
+
* 按**语义**而非文本分类。
|
|
42
|
+
*
|
|
43
|
+
* 仅由 `@x-otto/shared` 的 `stream()` 设置;其他错误路径为 `undefined`。
|
|
44
|
+
*/
|
|
45
|
+
readonly abortKind?: 'idle' | 'wallclock' | 'external';
|
|
32
46
|
constructor(message: string, options: {
|
|
33
47
|
code: string;
|
|
34
48
|
cause?: Error;
|
|
@@ -36,6 +50,7 @@ declare class CodedError extends Error {
|
|
|
36
50
|
headers?: unknown;
|
|
37
51
|
errorType?: string;
|
|
38
52
|
pluginSource?: string;
|
|
53
|
+
abortKind?: 'idle' | 'wallclock' | 'external';
|
|
39
54
|
});
|
|
40
55
|
}
|
|
41
56
|
declare class NetworkError extends CodedError {}
|
|
@@ -288,8 +303,23 @@ interface HttpRequestOptions {
|
|
|
288
303
|
* SSE 流的**空闲**超时(毫秒,仅 `stream()`):每收到一个 chunk 就重置;连续 `idleTimeout` 内无任何
|
|
289
304
|
* 字节到达即 abort。区别于 `timeout`(整请求一次性墙钟上限)——空闲超时专治「连接活着但 provider
|
|
290
305
|
* 静默不再吐字节」的挂死(健康流远比此频繁吐 token,不受影响)。默认 120s。
|
|
306
|
+
*
|
|
307
|
+
* RFC-361:本值只作用于**首个 SSE 事件产出之后**;首事件之前用 `firstTokenIdleTimeout`。
|
|
291
308
|
*/
|
|
292
309
|
idleTimeout?: number;
|
|
310
|
+
/**
|
|
311
|
+
* RFC-361:**首个 SSE 事件产出之前**的空闲超时(毫秒,仅 `stream()`)。默认
|
|
312
|
+
* `max(idleTimeout, 900_000)`。
|
|
313
|
+
*
|
|
314
|
+
* 为什么要分段:reasoning 模型在 max/xhigh 档下 thinking 阶段可持续数分钟零可见输出,
|
|
315
|
+
* 这是**正常行为**;而"已经开始吐字却突然静默两分钟"才是真卡死。二者故障模式完全不同,
|
|
316
|
+
* 用同一个阈值必然顾此失彼——调大则真卡死检测被延迟,调小则误杀长思考。
|
|
317
|
+
* 真机实证:Terminal-Bench-2 评测中 4 个长推理任务因此被误杀(占 otto 侧失败 100%)。
|
|
318
|
+
*
|
|
319
|
+
* 注意重置判据是**原始 TCP chunk 到达**而非 SSE 事件产出,故服务端 keepalive 注释亦可
|
|
320
|
+
* 续命——这是有意行为(说明连接活着),不影响"首事件是否已产出"的阶段判定。
|
|
321
|
+
*/
|
|
322
|
+
firstTokenIdleTimeout?: number;
|
|
293
323
|
signal?: AbortSignal;
|
|
294
324
|
proxy?: string;
|
|
295
325
|
/**
|
|
@@ -478,6 +508,20 @@ declare function probeImageDimensions(base64: string, mime: string): {
|
|
|
478
508
|
height: number;
|
|
479
509
|
} | undefined;
|
|
480
510
|
//#endregion
|
|
511
|
+
//#region src/intranet-probe.d.ts
|
|
512
|
+
/**
|
|
513
|
+
* 探测 `OTTO_INTRANET_PROBE_URLS` 候选地址中是否有任意一个可达(HEAD 请求,命中即停)。
|
|
514
|
+
*
|
|
515
|
+
* 未配置探测地址(公网源码缺省场景)时不发起任何网络请求,直接返回 `false`——避免公网
|
|
516
|
+
* 用户启动时产生不必要的网络往返或超时等待。
|
|
517
|
+
*
|
|
518
|
+
* 结果按 `CACHE_TTL_MS` 缓存于进程内存——两处消费方(Setup Wizard 显示判据 + 模型可用性
|
|
519
|
+
* 闸)短时间内重复调用不会重复发起探测请求。
|
|
520
|
+
*/
|
|
521
|
+
declare function isIntranetReachable(force?: boolean): Promise<boolean>;
|
|
522
|
+
/** 测试专用:清空进程内缓存,避免用例间相互污染。 */
|
|
523
|
+
declare function resetIntranetReachabilityCache(): void;
|
|
524
|
+
//#endregion
|
|
481
525
|
//#region src/startup-trace.d.ts
|
|
482
526
|
/**
|
|
483
527
|
* startup-trace.ts —— 启动相位打点(RFC-150 D7/M0)。
|
|
@@ -650,5 +694,5 @@ declare function releaseFileLockSync(dir: string, key: string, options?: Pick<Fi
|
|
|
650
694
|
*/
|
|
651
695
|
declare function waitForFileLockReleaseSync(dir: string, key: string, options?: Pick<FileLockOptions, 'timeoutMs' | 'prefix'>): boolean;
|
|
652
696
|
//#endregion
|
|
653
|
-
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, 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, safeStringify, scoreSubsequence, setDefaultProxy, setLogLevel, splitFrontmatter, startLoopbackServer, stream, sweepStaleProjectOverflowLogs, sweepStaleTempLogs, toTruncationMeta, traceStartupPhase, traceStartupPhaseSync, truncateHead, truncateLine, truncateTail, waitForFileLockRelease, waitForFileLockReleaseSync };
|
|
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 };
|
|
654
698
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
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}from"@x-otto/env";import{PassThrough as
|
|
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
|
|
3
|
-
`),o=a.length;if(a.length<=n&&i<=r)return
|
|
4
|
-
`),truncated:!0,truncatedBy:l,totalLines:o,totalBytes:i,lastLinePartial:!1,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:s.length,outputBytes:c})}function
|
|
5
|
-
`),o=a.length;if(o<=n&&i<=r)return
|
|
6
|
-
`),truncated:!0,truncatedBy:l,totalLines:o,totalBytes:i,lastLinePartial:u,firstLineExceedsLimit:!1,options:{maxLines:n,maxBytes:r},outputLines:s.length,outputBytes:c})}function
|
|
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(`
|
|
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
|
+
`),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
|
+
`),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
|
+
`),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">
|
|
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
|
-
</svg>`}function
|
|
9
|
+
</svg>`}function Lt(){return`<svg viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
10
10
|
<circle cx="26" cy="26" r="24" fill="var(--gray-3)" stroke="var(--gray-5)" stroke-width="2"/>
|
|
11
11
|
<path d="M19 19l14 14M33 19l-14 14" stroke="var(--gray-9)" stroke-width="2.8" stroke-linecap="round"/>
|
|
12
|
-
</svg>`}function
|
|
12
|
+
</svg>`}function H(e){return e.replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]??e)}function Rt(e,t,n,r){let i=e===`success`?It():Lt();return`<!doctype html>
|
|
13
13
|
<html lang="en">
|
|
14
14
|
<head>
|
|
15
15
|
<meta charset="utf-8">
|
|
16
16
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
17
|
-
<title>${
|
|
17
|
+
<title>${H(t)}</title>
|
|
18
18
|
<style>
|
|
19
19
|
:root {
|
|
20
20
|
--gray-1:#FFFFFF;--gray-2:#F5F6FA;--gray-3:#EEF0F9;
|
|
@@ -75,16 +75,16 @@ import{n as e,t}from"./event-bus-CABu09lC.js";import{createRequire as n}from"nod
|
|
|
75
75
|
</head>
|
|
76
76
|
<body>
|
|
77
77
|
<main class="page" aria-labelledby="title">
|
|
78
|
-
${
|
|
78
|
+
${Ft()}
|
|
79
79
|
<section class="card">
|
|
80
80
|
<div class="status-icon">${i}</div>
|
|
81
81
|
<p class="kicker">${e===`success`?`Authentication`:`Error`}</p>
|
|
82
|
-
<h1 id="title">${
|
|
83
|
-
<p class="desc">${
|
|
82
|
+
<h1 id="title">${H(t)}</h1>
|
|
83
|
+
<p class="desc">${H(n)}</p>
|
|
84
84
|
<div class="separator"></div>
|
|
85
|
-
<p class="footer">${
|
|
85
|
+
<p class="footer">${H(r)}</p>
|
|
86
86
|
</section>
|
|
87
87
|
</main>
|
|
88
88
|
</body>
|
|
89
|
-
</html>`}const
|
|
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
|
|
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};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x-otto/shared",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.3",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"tag": "alpha"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@x-otto/env": "0.1.0-alpha.
|
|
26
|
+
"@x-otto/env": "0.1.0-alpha.3",
|
|
27
27
|
"eventsource-parser": "3.0.6",
|
|
28
28
|
"jsonc-parser": "3.3.1",
|
|
29
29
|
"mime-types": "3.0.2",
|