omo-ai 5.0.0 → 5.0.1
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/bin/lib/launcher.js +2 -2
- package/bin/lib/package-paths.js +5 -0
- package/bin/lib/provider-map.json +1 -1
- package/package.json +2 -2
- package/plugin/CHANGELOG.md +22 -0
- package/plugin/extensions/memory-run-supervisor.mjs +1 -1
- package/plugin/extensions/omo-init-deep-advisor.js +2 -2
- package/plugin/extensions/omo-member.js +1 -1
- package/plugin/extensions/omo-task.js +2 -2
- package/plugin/extensions/omo.js +2 -2
- package/plugin/package.json +1 -1
- package/plugin/runtime/agent-toolkit-sdk/sdk.js +2 -2
- package/plugin/runtime/ast-grep-mcp/manifest.json +1 -1
- package/plugin/runtime/category-coverage/index.js +2 -2
- package/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
package/bin/lib/launcher.js
CHANGED
|
@@ -8,7 +8,7 @@ import { runDoctor } from "./doctor.js"
|
|
|
8
8
|
import { ensureEnginePrepared } from "./engine-prepare.js"
|
|
9
9
|
import { migrateLegacyBunGlobalManifest } from "./legacy-bun-global-migration.js"
|
|
10
10
|
import { adoptLegacyFlatState, canonicalAgentDir } from "./agent-dir.js"
|
|
11
|
-
import { nearestNodeBin, packageManifest, packageRoot, readJson, releaseChannel, resolveSenpi, updateTarget } from "./package-paths.js"
|
|
11
|
+
import { nearestNodeBin, packageManifest, packageRoot, readJson, releaseBanner, releaseChannel, resolveSenpi, updateTarget } from "./package-paths.js"
|
|
12
12
|
import { runSelfUpdate } from "./self-update.js"
|
|
13
13
|
import { detectHarnesses } from "./setup-detect.js"
|
|
14
14
|
import { readSetupSuggestionCache, spawnSetupSuggestionRefresh } from "./setup-detect-cache.js"
|
|
@@ -245,7 +245,7 @@ export async function runLauncher(args = process.argv.slice(2)) {
|
|
|
245
245
|
return
|
|
246
246
|
}
|
|
247
247
|
if (isInteractiveDefault(args)) {
|
|
248
|
-
console.error(
|
|
248
|
+
console.error(releaseBanner())
|
|
249
249
|
if (process.stdout.isTTY === true && setupSuggestionForLaunch()) {
|
|
250
250
|
console.error("omo: sibling credentials detected; run `omo setup` to review them")
|
|
251
251
|
}
|
package/bin/lib/package-paths.js
CHANGED
|
@@ -19,6 +19,11 @@ export function releaseChannel(version = packageManifest().version) {
|
|
|
19
19
|
return typeof version === "string" && version.includes("-") ? "beta" : "latest"
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/** The startup banner line: a prerelease names its beta channel, a stable release does not. */
|
|
23
|
+
export function releaseBanner(version = packageManifest().version) {
|
|
24
|
+
return releaseChannel(version) === "beta" ? `omo (omo-ai beta ${version})` : `omo (omo-ai ${version})`
|
|
25
|
+
}
|
|
26
|
+
|
|
22
27
|
/** The package spec that installs this build's channel: `omo-ai@beta` or the bare `omo-ai`. */
|
|
23
28
|
export function channelPackageSpec(version = packageManifest().version) {
|
|
24
29
|
return releaseChannel(version) === "beta" ? "omo-ai@beta" : "omo-ai"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "Derived from @code-yeongyu/senpi 2026.9.
|
|
2
|
+
"_comment": "Derived from @code-yeongyu/senpi 2026.9.27 builtinProviders(). builtinProviderIds and oauthProviderIds are the engine registry verbatim; providers maps a source harness id onto the omo provider that serves the same endpoint; oauthLogins maps a source OAuth id onto the omo provider to run /login for. Re-derive all four whenever the senpi pin changes.",
|
|
3
3
|
"builtinProviderIds": [
|
|
4
4
|
"alibaba-token-plan",
|
|
5
5
|
"amazon-bedrock",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omo-ai",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OmO Native - the standalone omo command with the OMO extension built in: bun add -g omo-ai",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@babel/parser": "8.0.4",
|
|
21
|
-
"@code-yeongyu/senpi": "2026.9.
|
|
21
|
+
"@code-yeongyu/senpi": "2026.9.27"
|
|
22
22
|
},
|
|
23
23
|
"repository": {
|
|
24
24
|
"type": "git",
|
package/plugin/CHANGELOG.md
CHANGED
|
@@ -7,12 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [5.0.1] - 2026-09-27
|
|
11
|
+
|
|
12
|
+
A patch release for problems people hit on 5.0.0. `omo update` installs it, or run:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bun add -g omo-ai
|
|
16
|
+
```
|
|
17
|
+
|
|
10
18
|
### Changed
|
|
11
19
|
|
|
20
|
+
**OmO Native moves to senpi 2026.9.27.** ([#8906](https://github.com/code-yeongyu/oh-my-openagent/issues/8906), [senpi#2157](https://github.com/code-yeongyu/senpi/issues/2157)) The fixes below come with it. npm, pnpm and Yarn installs now run on Bun when Bun 1.4.0 or newer is installed, the way `bun add -g` installs already did; set `OMO_RUNTIME=node` to stay on Node.js. When OmO Native does start on Node.js, it says once per version how to move to Bun.
|
|
21
|
+
|
|
12
22
|
**A local `omo` install now tells you to update with bun.** The launcher that `oh-my-openagent install` writes for a local checkout answered `omo update` with `npm i -g omo-ai`; it now prints `bun add -g omo-ai` (`omo-ai@beta` on a prerelease build), like every other install instruction. Installs from npm keep getting the npm command from `omo update`.
|
|
13
23
|
|
|
24
|
+
**`writing` leads with Claude Opus 5.5 at `low` and no longer runs on Claude Fable 5.1.** ([#8907](https://github.com/code-yeongyu/oh-my-openagent/issues/8907)) The builtin `writing` chain is now `claude-opus-5-5` (low), then `claude-opus-4-6` (max), on both OmO Native and the OpenCode edition, with the same Claude providers as before. It stays Claude-only: with neither model connected the category is unavailable instead of falling back to another family, so a setup whose only Claude model is Fable 5.1 no longer offers `writing` unless you pin `categories.writing.model`. A `writing` entry in your own config still wins over the default.
|
|
25
|
+
|
|
14
26
|
### Fixed
|
|
15
27
|
|
|
28
|
+
**Extensions load on Bun 1.3.x again.** ([senpi#2164](https://github.com/code-yeongyu/senpi/issues/2164), reported by @odurif0) An extension that declared its package directory as the entry (`"pi": { "extensions": ["."] }`) or depended on a package that requires a JSON file (ajv does) failed with `Cannot find module 'file:/…'`. Both load now.
|
|
29
|
+
|
|
30
|
+
**Session titles work on models that cannot turn reasoning off.** ([senpi#2163](https://github.com/code-yeongyu/senpi/issues/2163), [senpi#1239](https://github.com/code-yeongyu/senpi/issues/1239), reported by @jtoronto and @VXNCXNX) Z.ai GLM 5.3 and other mandatory-reasoning models rejected the title request with `Reasoning is mandatory for this endpoint and cannot be disabled. (HTTP 400)`. The title request now asks for the lowest reasoning level the model supports, and a title that still fails is written to `logs/session.log` instead of showing an error. Thanks to @ImStillBlue, whose [senpi#1266](https://github.com/code-yeongyu/senpi/pull/1266) took the first shot at this fix.
|
|
31
|
+
|
|
32
|
+
**One rejected image no longer breaks the rest of a session.** ([senpi#2170](https://github.com/code-yeongyu/senpi/issues/2170)) After a provider rejected an image, every later turn failed, text-only ones too. The rejected image is now replaced by a note naming its file, and the next message goes through, also after a restart. The read tool also finds a file whose path is wrapped in quotes, like the one Windows Explorer's "Copy as path" produces.
|
|
33
|
+
|
|
34
|
+
**A stable build no longer calls itself beta.** ([#8901](https://github.com/code-yeongyu/oh-my-openagent/issues/8901)) The 5.0.0 startup banner printed `omo (omo-ai beta 5.0.0)`. Both the npm launcher and the compiled binary now take the channel from the version, so 5.0.1 prints `omo (omo-ai 5.0.1)`.
|
|
35
|
+
|
|
36
|
+
**A terminal session's output no longer picks up a stray line break** when another session is spawned at the same moment. ([senpi#2161](https://github.com/code-yeongyu/senpi/issues/2161))
|
|
37
|
+
|
|
16
38
|
**An expired Claude login no longer breaks the first headless or desktop turn.** With no `model_profile` set, OmO Native starts on the Recommended ladder, and a Claude subscription whose saved login can no longer be refreshed still counted as connected: the session was pinned to Claude Opus 5.5, every turn failed on the refresh, and the retry walked only other Claude models before giving up, even when another provider on the ladder (for example Z.ai GLM 5.3) was connected. A model profile now resolves a rung's credentials the way its first turn would before picking it: a login that cannot be refreshed drops that provider and the walk moves on; a provider with several accounts stays eligible while any of them (the pinned one, when an account is pinned) resolves, unless rotation is turned off for it (`credentials.rotation: false` in `models.json`, or a runtime API key), in which case only its default credential counts; a model whose own request configuration fails to resolve drops only that model. The start notice names what was skipped and how to recover on that surface: the desktop points at Provider authentication settings, a headless run at an interactive session's `/login <provider>`. A literal `provider/model` pin in `model_profile` is still applied as written. The resolution runs once per attempted account at session start, sequentially, so a rejected login can add up to the provider's refresh timeout before the next rung is picked.
|
|
17
39
|
|
|
18
40
|
**A delegated task no longer retries a provider that already rejected your credentials.** When a subagent's turn failed because a provider refused the key (for example an OpenCode Go key whose subscription lapsed, carried over by `omo setup`) or an OAuth login could not be refreshed, the task retried the next model on the same provider, which failed the same way. It now skips the rest of that provider and moves to the next provider in the category, or, when none is left, reports the error with how to re-authenticate that provider (Provider authentication settings on the desktop, `/login <provider>` in an interactive session). This covers subagents running as separate processes (the default on macOS and Linux); an in-process subagent still walks its chain inside the engine.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// omo:
|
|
2
|
+
// omo:SxAF827YJcDO0Yp6-ULsQbYfwbyqz74P2IEYU2ZkFQM:JP635pDLM0iUC-ojQJEN4onwPVNicwkc7_8GFsBcFnk
|
|
3
3
|
import{spawn as t}from"node:child_process";import*as e from"node:fs";import*as r from"node:fs/promises";function n(t){if(t instanceof Error&&"code"in t)return"string"==typeof t.code?t.code:void 0}async function i(t){for(let e=0;;e+=1)try{return await t()}catch(t){if("EINTR"!==n(t)||e>=128)throw t}}function o(t){for(let e=0;;e+=1)try{return t()}catch(t){if("EINTR"!==n(t)||e>=128)throw t}}import{Buffer as a}from"node:buffer";import{constants as s}from"node:fs";function l(t){return"number"==typeof t?0!==(t&s.O_EXCL):"string"==typeof t&&t.toLowerCase().includes("x")}function c(t){return"function"==typeof t}function u(t){return(...e)=>i(async()=>t(...e))}function d(t){return(...e)=>o(()=>t(...e))}function f(t,e){let r="async"===e?u:d,n=new Map;return new Proxy(t,{get(t,e){if(n.has(e))return n.get(e);let i=Reflect.get(t,e);if(!c(i))return i;let o=r(i),a=Reflect.get(i,"native");return c(a)&&Object.assign(o,{native:r(a)}),n.set(e,o),o}})}var p=new Set(["stat","sync","datasync","chmod","chown","utimes","truncate"]);var m=f(r,"async"),w=f(e,"sync"),{access:h,chmod:y,copyFile:v,cp:g,link:E,lstat:b,mkdir:S,mkdtemp:I,readFile:_,readdir:x,realpath:N,rename:O,rm:k,rmdir:P,stat:T,unlink:R}=m,{accessSync:M,chmodSync:A,fsyncSync:$,linkSync:D,lstatSync:C,mkdirSync:L,readFileSync:U,readdirSync:j,realpathSync:F,statSync:q,unlinkSync:B,writeFileSync:G,writeSync:J}=w,{constants:H,watch:V}=e,Y=async(...t)=>{let e=()=>r.open(...t);return function(t){return new Proxy(t,{get(t,e){let r=Reflect.get(t,e);if(!c(r))return r;let o=e=>Reflect.apply(r,t,[...e]);return"close"===e||e===Symbol.asyncDispose?(...t)=>{let e=o(t);return e instanceof Promise?e.catch(t=>{if("EINTR"!==n(t))throw t}):e}:"string"==typeof e&&p.has(e)?(...t)=>{let e=o(t);return e instanceof Promise?e.catch(e=>{if("EINTR"!==n(e))throw e;return i(async()=>o(t))}):e}:(...t)=>o(t)}})}(await(l(t[1]??"r")?e():i(e)))},z=(t,r,n)=>function(t,e,r,n){return l(r)?t(e,r,n):o(()=>t(e,r,n))}(e.openSync,t,r,n??void 0);function K(t){try{e.closeSync(t)}catch(t){if("EINTR"!==n(t))throw t}}function X(t){try{return o(()=>e.statSync(t)),!0}catch{return!1}}import{join as Z}from"node:path";import{fileURLToPath as W}from"node:url";import{randomUUID as Q}from"node:crypto";import{dirname as tt}from"node:path";async function et(t){return JSON.parse(await _(t,"utf8"))}async function rt(t,e,r=384){let n=`${t}.tmp-${process.pid}-${Q()}`,i=await Y(n,"wx",r),o=!1;try{try{await i.writeFile(`${JSON.stringify(e,null,2)}\n`,"utf8"),await i.sync()}finally{await i.close()}await O(n,t),o=!0,await async function(t){try{let e=await Y(t,"r");try{await e.sync()}finally{await e.close()}}catch(t){let e=t instanceof Error&&"code"in t?t.code:void 0;if("win32"!==process.platform||!["EISDIR","EPERM"].includes(String(e)))throw t}}(tt(t))}finally{o||await it(n)}}async function nt(t,e){let r=await et(t);await rt(t,{...r,...e})}async function it(t){try{await R(t)}catch(t){if(!(t instanceof Error&&"code"in t&&"ENOENT"===t.code))throw t}}import{spawn as ot,spawnSync as at}from"node:child_process";import{execFile as st}from"node:child_process";var lt=null;function ct(){return lt??=async function(){if("darwin"!==process.platform)return null;try{let{dlopen:t,FFIType:e}=await(import("bun:ffi")),r=t("/usr/lib/libSystem.B.dylib",{proc_pidinfo:{args:[e.i32,e.i32,e.u64,e.ptr,e.i32],returns:e.i32}});return(t,e,n,i,o)=>Number(r.symbols.proc_pidinfo(t,e,n,i,o))}catch{return null}}(),lt}var ut=null;async function dt(t){if("win32"!==process.platform)return null;if(!Number.isSafeInteger(t)||t<=0)return null;ut??=async function(){if("win32"!==process.platform)return null;try{let{dlopen:t,FFIType:e}=await(import("bun:ffi"));return t("kernel32.dll",{OpenProcess:{args:[e.u32,e.i32,e.u32],returns:e.ptr},GetProcessTimes:{args:[e.ptr,e.ptr,e.ptr,e.ptr,e.ptr],returns:e.i32},CloseHandle:{args:[e.ptr],returns:e.i32}}).symbols}catch{return null}}();let e=await ut;if(null===e)return null;let r=e.OpenProcess(4096,0,t);if(null===r||0===r||0n===r)return null;try{let t=new BigUint64Array(1),n=e.GetProcessTimes(r,t,new BigUint64Array(1),new BigUint64Array(1),new BigUint64Array(1)),i=t[0]??0n;return 0===n||0n===i?null:i}finally{e.CloseHandle(r)}}async function ft(t,e){return await new Promise(r=>{st(t,e,{encoding:"utf8",timeout:2e3,windowsHide:!0},(t,e)=>{if(null!==t)return void r(null);let n=e.trim();r(n.length>0?n:null)})})}var pt=function(t,e){let r;return n=>n!==e?t(n):(r??=t(n).then(t=>(null===t&&(r=void 0),t),t=>{throw r=void 0,t}),r)}(async function(t){if("linux"===process.platform)return await async function(t){try{let e=await _(`/proc/${t}/stat`,"utf8"),r=e.lastIndexOf(")");if(r<0)return null;let n=e.slice(r+2).trim().split(/\s+/)[19];return void 0===n?null:`linux-proc-start-ticks:${n}`}catch{return null}}(t);if("darwin"===process.platform||"freebsd"===process.platform){if("dead"===wt(t))return null;let e=await async function(t){if("darwin"!==process.platform)return null;if(!Number.isSafeInteger(t)||t<=0)return null;let e=await ct();if(null===e)return null;let r=new Uint8Array(136),n=0;try{n=e(t,3,0n,r,136)}catch{return null}if(136!==n)return null;let i=new DataView(r.buffer,r.byteOffset,r.byteLength),o=Number(i.getBigUint64(120,!0));return o>0?o:null}(t);if(null!==e)return`proc-start-epoch:${e}`;let r=await ft("/bin/ps",["-o","lstart=","-p",String(t)]);return null===r?null:`ps-lstart:${r.replace(/\s+/g," ")}`}return"win32"===process.platform?await async function(t){if("dead"===wt(t))return null;let e=await dt(t);if(null!==e)return`win32-creation-filetime:${e}`;let r=await ft("powershell.exe",["-NoProfile","-Command",`(Get-Process -Id ${t} -ErrorAction SilentlyContinue).StartTime.ToUniversalTime().ToString('o')`]);return null===r?null:`win32-creation-date:${r}`}(t):null},process.pid);function mt(t){let e=t.indexOf(":");return e<=0?null:t.slice(0,e)}function wt(t){try{return process.kill(t,0),"alive"}catch(t){let e=function(t){if(t instanceof Error&&"code"in t)return"string"==typeof t.code?t.code:void 0}(t);return"ESRCH"===e?"dead":"EPERM"===e?"alive":"unknown"}}function ht(){return"1"===process.env.OMO_MEMORY_SUPERVISOR_ALLOW_TEST_SEAMS}function yt(){if(ht()){let t=process.env.OMO_MEMORY_SUPERVISOR_PLATFORM;if("posix"===t||"win32"===t)return t}return"win32"===process.platform?"win32":"posix"}function vt(t,e){let r=ht()?process.env.OMO_MEMORY_SUPERVISOR_CLOCK_PATH:void 0;if(void 0===r){let r=setTimeout(e,Math.max(0,t-Date.now()));return()=>clearTimeout(r)}let n=!1,i=()=>{if(n)return;let i=Et(r);!Number.isFinite(i)||i<t||(n=!0,o?.close(),clearInterval(a),e())};if(Et(r)>=t)return n=!0,e(),()=>{};let o=V(r,i),a=setInterval(i,gt);return i(),()=>{n||(n=!0,o.close(),clearInterval(a))}}var gt=25;function Et(t){let e=j(t).map(t=>/^(\d+)-(-?\d+(?:\.\d+)?)$/.exec(t)).filter(t=>null!==t).sort((t,e)=>Number(t[1])-Number(e[1])).at(-1);return void 0===e?Number.NaN:Number(e[2])}function bt(t,e){if(!ht())return;let r=process.env.OMO_MEMORY_SUPERVISOR_TASKKILL_RUN_DIR;void 0!==r&&G(`${r}/${t}-${process.pid}.json`,`${JSON.stringify({targetPid:e})}\n`,"utf8")}function St(t){if(!ht())return;let e=process.env[t];if(void 0===e)return;let r=JSON.parse(e);if(!Array.isArray(r)||!r.every(t=>"string"==typeof t)||0===r.length)throw TypeError(`${t} must be a non-empty string array`);return r}function It(t,e,r){let[n,...i]=t;if(void 0===n)throw TypeError("termination command is required");if(r){let t=at(n,[...i,...e],{env:process.env,stdio:"ignore",windowsHide:!0});if(void 0!==t.error)throw t.error;return}ot(n,[...i,...e],{env:process.env,stdio:"ignore",windowsHide:!0}).once("error",t=>process.stderr.write(`${t.message}\n`))}function _t(t,e){bt(`posix-${e}`,t);let r=St("OMO_MEMORY_SUPERVISOR_POSIX_SIGNAL_COMMAND");if(void 0===r)try{process.kill(-t,e)}catch(t){if(!(t instanceof Error&&"code"in t&&"ESRCH"===t.code))throw t}else It(r,["--signal-group",String(t),e],!1)}function xt(t){void 0!==t&&bt("win32-graceful",t)}function Nt(t,e){"win32"===t?(xt(e.pid),e.kill()):void 0!==e.pid&&_t(e.pid,"SIGTERM")}function Ot(t,e,r=!1){void 0!==e&&("win32"===t?function(t,e){It(St("OMO_MEMORY_SUPERVISOR_TASKKILL_COMMAND")??["taskkill"],["/pid",String(t),"/T","/F"],e)}(e,r):_t(e,"SIGKILL"))}async function kt(t){return await pt(t)}import{join as Pt}from"node:path";var Tt=new Set(["providermodelnotfounderror","ratelimiterror","modelunavailableerror","providerconnectionerror","authenticationerror"]),Rt=new Set(["quotaexceedederror","insufficientcreditserror","freeusagelimiterror"]),Mt=new Set(["messageabortederror","permissiondeniederror","contextlengtherror","timeouterror","validationerror","syntaxerror","usererror"]),At=["rate_limit","rate limit","usage_limit_reached","usage limit has been reached","quota","all credentials for model","cooling down","exhausted your capacity","not found","unavailable","insufficient","too many requests","over limit","overloaded","bad gateway","bad request","unknown provider","provider not found","model_not_supported","model not supported","model is not supported","connection error","network error","timeout","service unavailable","internal_server_error","free usage","usage exceeded","credit","balance","temporarily unavailable","try again","请稍后重试","503","502","504","429","529","selected provider is forbidden","provider is forbidden","频率限制","请求过于频繁","暂时不可用","服务不可用","server_error","an error occurred while processing","upstream request failed"],$t=["quota will reset after","quota exceeded","free usage limit","billing limit","billing hard limit","monthly limit","plan limit","subscription quota","subscription limit","payment required","out of credits","credits exhausted","insufficient credits","insufficient balance","credit balance","usage limit for this month","exhausted your capacity","daily call limit","daily limit","usage limit reached for","in arrears","fair use policy","recharge and try","使用上限","额度不足","余额不足","已耗尽"],Dt=["rate limit","cooling down","credentials for model"];function Ct(t){if(t.name){let e=t.name.toLowerCase();if(Mt.has(e))return!1;if(Rt.has(e))return!1;if(Tt.has(e))return!0}let e=t.message?.toLowerCase()??"";return!$t.some(t=>e.includes(t))&&(!(!(r=e).includes("retrying in")||!Dt.some(t=>r.includes(t)))||(null!=t.statusCode&&(429===t.statusCode||503===t.statusCode||529===t.statusCode)||At.some(t=>e.includes(t))));var r}var Lt=[/prompt is too long/i,/request_too_large/i,/input is too long for requested model/i,/exceeds the context window/i,/exceeds (?:the )?(?:model'?s )?maximum context length(?: of [\d,]+ tokens?|\s*\([\d,]+\))/i,/input token count.*exceeds the maximum/i,/maximum prompt length is \d+/i,/reduce the length of the messages/i,/maximum context length is \d+ tokens/i,/exceeds (?:the )?maximum allowed input length of [\d,]+ tokens?/i,/input \(\d+ tokens\) is longer than the model'?s context length \d+ tokens/i,/exceeds the limit of \d+/i,/exceeds the available context size/i,/greater than the context length/i,/context window exceeds limit/i,/exceeded model token limit/i,/too large for model with \d+ maximum context length/i,/prompt has [\d,]+ tokens?, but the configured context size is [\d,]+ tokens?/i,/prompt too long; exceeded (?:max )?context length/i,/range of input length should be/i,/model_context_window_exceeded/i,/context[_ ]length[_ ]exceeded/i,/too many tokens/i,/token limit exceeded/i,/^4(?:00|13)\s*(?:status code)?\s*\(no body\)/i,/(?:request[ _])?(?:body|entity|payload)[_ ]too[_ ]large/i,/Request payload is \d+ (?:bytes, over the \d+ byte|tokens, over the \d+ token) limit Kiro accepts\./i,/Model context limit reached\. Conversation size exceeds model capacity\./i],Ut=[/^(Throttling error|Service unavailable):/i,/rate limit/i,/too many requests/i];var jt=/^Error: Model "([^"]+)" not found\. Use --list-models to see available models\.$/m,Ft=/^(?:Error:\s*)?No API key found for\s+([^\s.]+)/m,qt=/(?:^|\s)(\d{3})\s*:/;function Bt(t){if(t.timedOut||0===t.code)return;let e=`${t.stderr}\n${t.stdout}`,r=jt.exec(e)?.[1];if(void 0!==r)return{kind:"model_not_visible",id:r};let n=Ft.exec(e)?.[1];if(void 0!==n)return{kind:"auth_missing",provider:n};let i=function(t){for(let e of[t.stderr,t.stdout]){let t=e.split("\n").map(t=>t.trim()).find(t=>t.length>0);if(void 0!==t)return t.slice(0,200)}return}(t);if(void 0===i)return;if(o=i,!Ut.some(t=>t.test(o))&&Lt.some(t=>t.test(o)))return{kind:"context_overflow",detail:i};var o;let a=Number.parseInt(qt.exec(i)?.[1]??"",10);return Ct({message:i,...Number.isNaN(a)?{}:{statusCode:a}})?{kind:"provider_unavailable",detail:i}:void 0}import{randomUUID as Gt}from"node:crypto";import{dirname as Jt,join as Ht}from"node:path";import{randomUUID as Vt}from"node:crypto";import{hostname as Yt}from"node:os";import zt from"node:path";import Kt from"node:path";var Xt=new Set;function Zt(t){Xt.add(t)}function Wt(t){Xt.delete(t)}var Qt=/\.candidate-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function te(t){if(t instanceof Error&&"code"in t)return"string"==typeof t.code?t.code:void 0}function ee(t,e){try{t.onFailure?.(e)}catch{}}function re(t){if("win32"!==process.platform)return!1;let e=te(t);return"EBUSY"===e||"EPERM"===e||"EACCES"===e}import{randomUUID as ne}from"node:crypto";import{hostname as ie}from"node:os";function oe(t){return"string"==typeof t&&t.length>0}function ae(t){let e;try{e=JSON.parse(t)}catch{return null}if("object"!=typeof e||null===e||Array.isArray(e))return null;let r=e;return!Number.isInteger(r.pid)||Number(r.pid)<=0?null:oe(r.process_start)&&oe(r.hostname)&&oe(r.nonce)?!oe(r.created_at)||Number.isNaN(Date.parse(r.created_at))?null:oe(r.purpose)&&(void 0===r.run_id||oe(r.run_id))?{pid:Number(r.pid),process_start:r.process_start,hostname:r.hostname,nonce:r.nonce,created_at:r.created_at,purpose:r.purpose,...void 0===r.run_id?{}:{run_id:r.run_id}}:null:null}async function se(t,e={}){if(0===t.length)throw Error("lock purpose must not be empty");let r=await pt(process.pid);return{pid:process.pid,process_start:r??"unavailable",hostname:ie(),nonce:ne(),created_at:(new Date).toISOString(),purpose:t,...void 0===e.runId?{}:{run_id:e.runId}}}class le extends Error{lockPath;owner;retriable=!0;constructor(t,e){super(`Lock is held: ${t}`),this.lockPath=t,this.owner=e,this.name="LockContentionError"}}function ce(t){if(t instanceof Error&&"code"in t)return"string"==typeof t.code?t.code:void 0}function ue(t,e){if(void 0!==e)return e(t);if("win32"!==process.platform)return!1;let r=ce(t);return"EBUSY"===r||"EPERM"===r||"EACCES"===r}async function de(t){for(let e=0;e<3;e+=1)try{return await(he.unlink??R)(t),Wt(t),!0}catch(r){if("ENOENT"===ce(r))return Wt(t),!0;if(!ue(r,he.isSharingError))throw Zt(t),ye(zt.dirname(t)),r;if(e+1===3)return Zt(t),ye(zt.dirname(t)),!1}return!1}function fe(t,e){return e?.throwIfAborted(),new Promise((r,n)=>{let i=setTimeout(a,t),o=()=>a(e?.reason??new DOMException("The operation was aborted","AbortError"));function a(t){clearTimeout(i),e?.removeEventListener("abort",o),void 0===t?r():n(t)}e?.addEventListener("abort",o,{once:!0})})}async function pe(t){try{let e=await _(t,"utf8");return{raw:e,record:ae(e)}}catch(t){let e=ce(t);if("ENOENT"===e)return null;if("\\"===zt.sep&&"EPERM"===e)return{raw:"",record:null};throw t}}async function me(t,e){await S(zt.dirname(t),{recursive:!0,mode:448});let{candidatePath:r,handle:n}=await async function(t){for(let e=0;;e+=1){let r=`${t}.candidate-${Vt()}`;try{return{candidatePath:r,handle:await Y(r,"wx",384)}}catch(n){if(await de(r)||ye(zt.dirname(t)),"EINTR"!==ce(n)||e>=128)throw n}}}(t);try{try{await async function(t,e,r,n){let o="string"==typeof e?a.from(e,r??"utf8"):e,s=0;for(;s<o.length;){n?.throwIfAborted();let{bytesWritten:e}=await i(()=>t.write(o,s));if(e<=0)throw Error(`fs write made no progress at offset ${s}`);s+=e}}(n,`${JSON.stringify(e)}\n`,"utf8"),await n.sync()}finally{await n.close()}try{return await E(r,t),!0}catch(t){if(function(t){let e=ce(t);return"EEXIST"===e||"ENOENT"===e}(t))return!1;throw t}}finally{await de(r)||ye(zt.dirname(t))}}var we=new Set,he={};function ye(t){we.delete(t)}async function ve(t){if(t.hostname!==Yt())return!1;let e=wt(t.pid);if("dead"===e)return!0;if("unknown"===e)return!1;let r=await pt(t.pid);return null!==r&&"unavailable"!==t.process_start&&function(t,e){let r=mt(t);return null!==r&&r===mt(e)&&t!==e}(t.process_start,r)}async function ge(t){let e=await pe(t);if(null===e||null===e.record||!await ve(e.record))return!1;let r=`${t}.reaping-${Vt()}`;try{await O(t,r)}catch(t){if("ENOENT"===ce(t))return!1;if(ue(t))return!1;throw t}let n=await pe(r);if(null!==n&&n.raw===e.raw)return await R(r),!0;try{await E(r,t)}catch(t){if("EEXIST"!==ce(t))throw t}return await R(r),!1}async function Ee(t,e,r){if(null===e.record||!await ve(e.record))return!1;let n=`${t}.recovery`,i={...r,nonce:Vt(),created_at:(new Date).toISOString(),purpose:`${r.purpose}:recovery`};for(let t=0;!await me(n,i);t+=1)if(t>0||!await ge(n))return!1;try{let r=await pe(t);if(null===r)return!0;if(r.raw!==e.raw||null===r.record)return!1;if(!await ve(r.record))return!1;let o=await pe(n);return null!==o&&o.record?.nonce===i.nonce&&(await R(t),!0)}finally{await Se(n,i)}}async function be(t,e,r={}){let n=r.waitTimeoutMs??0,i=r.retryDelayMs??25;if(n<0||i<=0)throw Error("lock wait options must be positive");let o=zt.dirname(t);we.has(o)||(we.add(o),await async function(t,e=Date.now,r={}){let n;try{n=await x(t)}catch(e){if("ENOENT"===te(e)){for(let e of Xt)Kt.dirname(e)===t&&Wt(e);return 0}throw e}let i=0;for(let o of n){if(!Qt.test(o))continue;let n=Kt.join(t,o);try{let t=await T(n);if(!Xt.has(n)&&e()-t.mtimeMs<=36e5)continue;let o=!1;for(let t=0;t<3;t+=1)try{await(r.unlink??R)(n),Wt(n),o=!0;break}catch(e){if("ENOENT"===te(e)){Wt(n),o=!0;break}if(!(r.isSharingError?.(e)??re(e)))throw e;t+1===3&&ee(r,n)}o&&(i+=1)}catch(t){"ENOENT"===te(t)&&Wt(n),ee(r,n)}}return i}(o,Date.now,{...void 0===he.unlink?{}:{unlink:he.unlink},...void 0===he.isSharingError?{}:{isSharingError:he.isSharingError},onFailure:()=>ye(o)}).catch(()=>{ye(o)}));let a=Date.now()+n;for(;;){r.signal?.throwIfAborted();let n=await pe(t);if(null===n){if(await me(t,e))return;if(r.signal?.throwIfAborted(),n=await pe(t),null===n)continue}if(!await Ee(t,n,e)){if(r.signal?.throwIfAborted(),Date.now()>=a)throw new le(t,n.record);await fe(Math.min(i,Math.max(1,a-Date.now())),r.signal)}}}async function Se(t,e){let r=await pe(t);if(null===r||r.record?.nonce!==e.nonce)return!1;try{return await R(t),!0}catch(t){if("ENOENT"===ce(t))return!1;throw t}}async function Ie(t,e,r,n){await be(t,e,n);try{return await r()}finally{await Se(t,e)}}Promise.resolve();var _e=[["\\bAKIA[0-9A-Z]{16}\\b",""],["\\b(?:bearer|token|api[_-]?key|secret|password|passwd|pwd)\\s*[=:]\\s*\\S{1,256}","i"],["\\bAuthorization\\s*:\\s*Bearer\\s+\\S{1,256}","i"],["\\bsk-(?:proj-)?[-_A-Za-z0-9]+\\b",""],["\\b(?:ghp|github_pat|glpat|xox[baprs])-[-_A-Za-z0-9]+\\b",""]];_e.map(([t,e])=>new RegExp(t,e)),_e.map(([t,e])=>new RegExp(t,`${e}g`));new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});import{dirname as xe}from"node:path";import{fileURLToPath as Ne}from"node:url";xe(Ne(import.meta.url));import{dirname as Oe}from"node:path";import{fileURLToPath as ke}from"node:url";Oe(ke(import.meta.url)),new Date(0).toISOString();import{dirname as Pe}from"node:path";import{fileURLToPath as Te}from"node:url";Pe(Te(import.meta.url));function Re(t){return Ht(t,"terminal-claim.json")}function Me(t,e,r){return t.runId===e.runId&&t.attempt===e.attempt&&(void 0===r||t.kind===r)}function Ae(t,e){let r=`${t}.${process.pid}.${Gt()}.candidate`;!function(t,e){let r=z(t,"wx",384);try{G(r,`${JSON.stringify(e,null,2)}\n`,"utf8"),$(r)}finally{K(r)}}(r,e);try{D(r,t)}catch(t){if("EEXIST"===je(t))return!1;throw t}finally{Ce(r)}return function(t){let e;try{e=z(t,"r")}catch(t){if("win32"===process.platform&&["EISDIR","EPERM"].includes(je(t)??""))return;throw t}try{$(e)}catch(t){if("win32"!==process.platform||!["EPERM","EACCES","EINVAL"].includes(je(t)??""))throw t}finally{K(e)}}(Jt(t)),!0}function $e(t){let e;try{e=U(t,"utf8")}catch(t){if("ENOENT"===je(t))return;throw t}try{return{raw:e,claim:Ue(JSON.parse(e))}}catch{return{raw:e,claim:void 0}}}async function De(t,e,r,n,i,o){let a=await se("reflection-finalize",{runId:i.runId});return Ie(Ht(t,"terminal-claim-recovery.lock"),a,async()=>{let t=$e(e);if(void 0!==t){if(t.raw!==r.raw)return t.claim;if("invalid"===n){if(void 0!==t.claim)return t.claim}else{if(void 0===t.claim)return;if("publish"!==t.claim.kind||!Le(t.claim,o))return t.claim}Ce(e)}},{waitTimeoutMs:Number.POSITIVE_INFINITY})}function Ce(t){try{B(t)}catch(t){if("ENOENT"!==je(t))throw t}}function Le(t,e){return"dead"===(e.getPidLiveness??wt)(t.claimantPid)}function Ue(t){if(!function(t){return null!==t&&"object"==typeof t&&!Array.isArray(t)}(t)||1!==t.version||"publish"!==t.kind&&"abandon"!==t.kind||"string"!=typeof t.runId||!Number.isInteger(t.attempt)||!Number.isInteger(t.claimantPid)||Number(t.claimantPid)<=0)throw TypeError("Invalid run terminal claim");return{version:1,kind:t.kind,runId:t.runId,attempt:Number(t.attempt),claimantPid:Number(t.claimantPid)}}function je(t){return t instanceof Error&&"code"in t?String(t.code):void 0}import{join as Fe}from"node:path";async function qe(t,e,r){let n={runId:e.runId,attempt:e.attempt??1},i=await async function(t,e,r,n={},i=process.pid){let o=Re(t),a={version:1,kind:r,runId:e.runId,attempt:e.attempt,claimantPid:i},s=0;for(;;){if(Ae(o,a))return a;let i=$e(o);if(void 0===i)continue;let l=i.claim;if(void 0===l){if(s>0)throw TypeError("Invalid run terminal claim");s+=1,await(n.beforeRecovery?.("invalid"));let r=await De(t,o,i,"invalid",e,n);if(void 0!==r)return r;continue}if(Me(l,e,r))return l;if("publish"!==l.kind||!Le(l,n))return l;await(n.beforeRecovery?.("dead-publish"));let c=await De(t,o,i,"dead-publish",e,n);if(void 0!==c)return c}}(t,n,"publish");Me(i,n,"publish")&&(await rt(Pt(t,"publishing.json"),{version:1,...n,finishedAt:r.finishedAt}),await async function(t,e,r,n=Ie,i=se){let o=await i("reflection-finalize",{runId:e});return n(Fe(t,"terminalization.lock"),o,r,{waitTimeoutMs:Number.POSITIVE_INFINITY})}(t,e.runId,async()=>{if(X(Pt(t,"final.json"))||X(Pt(t,"abandoned.json")))return;if(!Me(function(t){return Ue(JSON.parse(U(Re(t),"utf8")))}(t),n,"publish"))return;let i=void 0!==Bt({code:r.childExit.code,stdout:U(e.stdoutPath,"utf8"),stderr:U(e.stderrPath,"utf8"),timedOut:r.timedOut});i&&void 0!==e.nextAttempt&&await nt(Pt(t,"ledger.json"),{attempt:e.nextAttempt.attempt,model:e.nextAttempt.model,...void 0===e.nextAttempt.thinking?{thinking:void 0}:{thinking:e.nextAttempt.thinking},launching:!0,pid:void 0,processStart:void 0,childPid:void 0,childProcessStart:void 0}),await rt(Pt(t,"outcome.json"),r),i&&await it(Re(t))}))}function Be(t){try{J(3,`${JSON.stringify(t)}\n`)}catch(t){if(!(t instanceof Error&&"code"in t&&["EPIPE","EBADF"].includes(String(t.code))))throw t}}var Ge=process.argv.slice(2);try{if("--child-bootstrap"===Ge[0]){if(void 0===Ge[1])throw TypeError("run directory is required");await async function(e){if(!await async function(){for await(let t of process.stdin)if(Buffer.byteLength(t)>0)return!0;return!1}())return;let r=await et(Z(e,"launch.json")),n=yt(),i=t(r.command,[...r.args],{cwd:r.cwd,env:r.env,detached:!1,stdio:["ignore","inherit","inherit"],windowsHide:!0});Be({code:i.pid??null,signal:"MODEL_PID"});let o=()=>{"win32"!==n&&"win32"!==process.platform||i.kill()};process.on("SIGTERM",o),process.on("SIGINT",o);let a=vt(r.hardDeadlineAt,()=>{"win32"===n?Nt(n,i):_t(process.pid,"SIGTERM")}),s=vt(r.hardDeadlineAt+r.terminationGraceMs,()=>{Ot(n,process.pid)});Be(await new Promise(t=>{let e=!1;i.once("error",()=>{e||(e=!0,t({code:null,signal:null}))}),i.once("close",(r,n)=>{e||(e=!0,t({code:r,signal:n}))})}).finally(()=>{a(),s()}))}(Ge[1])}else{if(void 0===Ge[0])throw TypeError("run directory is required");await async function(e){let r=Z(e,"launch.json"),n=Z(e,"ledger.json"),i=await et(r),o=yt();await nt(n,{launching:!1,pid:process.pid,processStart:await kt(process.pid)});let a,s=z(i.stdoutPath,"w"),l=z(i.stderrPath,"w"),c=t(process.execPath,[W(import.meta.url),"--child-bootstrap",e],{env:process.env,detached:!0,stdio:["pipe",s,l,"pipe"],windowsHide:!0}),u=c.pid,d="",f=c.stdio[3];null!=f&&"setEncoding"in f&&(f.setEncoding("utf8"),f.on("data",t=>{d+=t;for(let t of d.split("\n"))try{let e=JSON.parse(t);"MODEL_PID"===e.signal&&"number"==typeof e.code&&(a=e.code)}catch(t){if(!(t instanceof SyntaxError))throw t}}));let p=(t=!1)=>{try{Ot(o,u,t)}catch(t){process.stderr.write(`${t instanceof Error?t.message:String(t)}\n`)}};if(process.once("exit",()=>p(!0)),process.once("SIGTERM",()=>{p(),u=void 0,process.exit(143)}),process.once("SIGINT",()=>{p(),u=void 0,process.exit(130)}),void 0===c.pid)throw Error("child bootstrap did not receive a pid");await nt(n,{childPid:c.pid,childProcessStart:await kt(c.pid)}),c.stdin?.end("1\n");let m,w=!1,h=Promise.resolve();"win32"===o&&(h=new Promise(t=>{m=t}));let y=vt(i.hardDeadlineAt,()=>{w=!0,"win32"===o?xt(c.pid):Nt(o,c)}),v=vt(i.hardDeadlineAt+i.terminationGraceMs,()=>{Ot(o,a??u),m?.()}),g=await new Promise((t,e)=>{let r=!1;c.once("error",t=>{r||(r=!0,e(t))}),c.once("close",(e,n)=>{r||(r=!0,t({code:e,signal:n}))})}),E=function(t){let e=t.trim().split("\n").at(-1);if(void 0!==e&&0!==e.length)try{let t=JSON.parse(e),r="number"==typeof t.code||null===t.code?t.code:void 0,n="string"==typeof t.signal||null===t.signal?t.signal:void 0;return void 0===r||void 0===n||"MODEL_PID"===n?void 0:{code:r,signal:n}}catch{return}}(d);"win32"===o&&w&&void 0===E&&await h,y(),v(),u=void 0,K(s),K(l);let b=function(){let t=ht()?process.env.OMO_MEMORY_SUPERVISOR_CLOCK_PATH:void 0;return void 0===t?Date.now():Et(t)}(),S=(new Date).toISOString(),I={version:1,runId:i.runId,attempt:i.attempt,finishedAt:S,childExit:E??g,timedOut:w||Number.isFinite(b)&&b>=i.hardDeadlineAt};await qe(e,i,I),await it(r),process.exit(0)}(Ge[0])}}catch(t){process.stderr.write(`${t instanceof Error?t.stack??t.message:String(t)}\n`),process.exitCode=1}
|