@oonacode/win32-x64 0.3.200 → 0.3.201

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/oona.exe CHANGED
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/oona.exe
3
- size: 111896064 bytes
4
- sha256: e1c1e79cfd958c3a000b522936ea14a7941b14dd9acf89093779977761a5bf29
3
+ size: 111898112 bytes
4
+ sha256: 4068529ad714a3df1ab3dc385c1956c787774f5764cf73746ea8f8dd41255ecd
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "oonacode",
3
- "version": "0.3.200",
3
+ "version": "0.3.201",
4
4
  "channel": "stable",
5
5
  "platform": "win32",
6
6
  "arch": "x64",
7
7
  "mode": "bun",
8
8
  "launcherRuntime": "bun 1.4.1",
9
- "commit": "43006efd",
10
- "builtAt": "2026-10-02T20:50:39.8856110Z",
9
+ "commit": "375d21a5",
10
+ "builtAt": "2026-10-03T01:21:19.5747058Z",
11
11
  "engine": "engine-store",
12
12
  "engineVersion": "0.3.280",
13
13
  "siteOrigin": "https://oonacode.oonak.ai",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oonacode/win32-x64",
3
- "version": "0.3.200",
3
+ "version": "0.3.201",
4
4
  "description": "OonaCode native binaries for Windows x64: oona.exe (CLI + headless host service), the pinned oonaclaude.exe engine sidecar, local web UI assets. Installed automatically as an optional dependency of `oonacode`.",
5
5
  "license": "UNLICENSED",
6
6
  "homepage": "https://oonacode.oonak.ai",
package/registry.json CHANGED
@@ -1240,33 +1240,10 @@
1240
1240
  "header": "authorization-bearer"
1241
1241
  },
1242
1242
  "models": [
1243
- {
1244
- "id": "gemini-3.1-pro-high",
1245
- "displayName": "Gemini 3.1 Pro High (Antigravity)",
1246
- "contextWindow": 1048576,
1247
- "maxOutputTokens": 65536,
1248
- "supportsTools": true,
1249
- "supportsThinking": true,
1250
- "supportsVision": true,
1251
- "inputPricePerM": 4,
1252
- "outputPricePerM": 18,
1253
- "notes": "Gemini 3.1 Pro at Antigravity's HIGH thinking level (the level is in the id, so no thinkingLevel is sent). Cost = Google's own Gemini API list price for gemini-3.1-pro-preview (ai.google.dev/gemini-api/docs/pricing, updated 2026-10-01): $2 in / $0.20 cached / $12 out up to a 200k-token prompt, $4 / $0.40 / $18 above. This file carries the TOP tier; the cheaper one is `models.price_tier_rule` (migration 0156). The wire id follows Antigravity's naming and is to be confirmed against the account's fetchAvailableModels list, which the admin sign-in writes into the credential's note."
1254
- },
1255
- {
1256
- "id": "gemini-3.1-pro-low",
1257
- "displayName": "Gemini 3.1 Pro Low (Antigravity)",
1258
- "contextWindow": 1048576,
1259
- "maxOutputTokens": 65536,
1260
- "supportsTools": true,
1261
- "supportsThinking": true,
1262
- "supportsVision": true,
1263
- "inputPricePerM": 4,
1264
- "outputPricePerM": 18,
1265
- "notes": "Gemini 3.1 Pro at Antigravity's LOW thinking level. Same Google list price as the High id (gemini-3.1-pro-preview, tiered at a 200k-token prompt — migration 0156); fewer thinking tokens is the whole difference."
1266
- },
1267
1243
  {
1268
1244
  "id": "gemini-3.8-flash",
1269
1245
  "displayName": "Gemini 3.8 Flash (Antigravity)",
1246
+ "upstreamId": "gemini-3.8-flash-{effort:high}",
1270
1247
  "contextWindow": 1048576,
1271
1248
  "maxOutputTokens": 65536,
1272
1249
  "supportsTools": true,
@@ -1274,56 +1251,23 @@
1274
1251
  "supportsVision": true,
1275
1252
  "inputPricePerM": 0.75,
1276
1253
  "outputPricePerM": 3.75,
1277
- "notes": "Antigravity's default model (the google-antigravity SDK's DEFAULT_MODEL, docs/antigravity.md section 3). Cost = Google's Gemini API list price for gemini-3.8-flash: $0.75 in / $0.075 cached / $3.75 out per 1M through 2026-12-31, DOUBLING to $1.50 / $0.15 / $7.50 from 2027-01-01 (ai.google.dev/gemini-api/docs/pricing, updated 2026-10-01) — move the cost cells on the model page then."
1278
- },
1279
- {
1280
- "id": "claude-sonnet-4-6",
1281
- "displayName": "Claude Sonnet 4.6 (Antigravity)",
1282
- "contextWindow": 1000000,
1283
- "maxOutputTokens": 64000,
1284
- "supportsTools": true,
1285
- "supportsThinking": false,
1286
- "supportsVision": true,
1287
- "inputPricePerM": 3,
1288
- "outputPricePerM": 15,
1289
- "notes": "Claude Sonnet 4.6 hosted by Google and reached through Antigravity's Code Assist backend in the Gemini request shape. Cost = ANTHROPIC's own list price for Sonnet 4.6 ($3 in / $0.30 cache read / $3.75 5-minute write / $15 out, 1M context at standard rates — platform.claude.com/docs/en/about-claude/pricing, read 2026-10-02): Google publishes no Antigravity price for it."
1254
+ "notes": "Google lists one model per level — gemini-3.8-flash-high, -medium and -low (fetchAvailableModels, 2026-10-03: 1,048,576 context / 65,536 output each); OonaCode shows ONE model and the chat’s effort picker fills the level (upstreamId template; xhigh and max read as high; no effort = high). Cost = Google’s Gemini API list price for gemini-3.8-flash: $0.75 in / $0.075 cached / $3.75 out per 1M through 2026-12-31, DOUBLING to $1.50 / $0.15 / $7.50 from 2027-01-01 (ai.google.dev/gemini-api/docs/pricing, updated 2026-10-01) — move the cost cells on the model page then."
1290
1255
  },
1291
1256
  {
1292
- "id": "claude-sonnet-4-6-thinking",
1293
- "displayName": "Claude Sonnet 4.6 Thinking (Antigravity)",
1294
- "contextWindow": 1000000,
1295
- "maxOutputTokens": 64000,
1296
- "supportsTools": true,
1297
- "supportsThinking": true,
1298
- "supportsVision": true,
1299
- "inputPricePerM": 3,
1300
- "outputPricePerM": 15,
1301
- "notes": "Claude Sonnet 4.6 with extended thinking, through Antigravity. The thinking budget is sent as thinkingConfig.thinkingBudget; Claude's signed thinking comes back as thought parts and is echoed with its signature (the translator carries it in the Anthropic thinking block). Cost = Anthropic's list price for Sonnet 4.6."
1302
- },
1303
- {
1304
- "id": "claude-opus-4-6-thinking",
1305
- "displayName": "Claude Opus 4.6 Thinking (Antigravity)",
1306
- "contextWindow": 1000000,
1307
- "maxOutputTokens": 128000,
1257
+ "id": "gemini-3.7-flash",
1258
+ "displayName": "Gemini 3.7 Flash (Antigravity)",
1259
+ "upstreamId": "gemini-3.7-flash-{effort:high}",
1260
+ "contextWindow": 1048576,
1261
+ "maxOutputTokens": 65536,
1308
1262
  "supportsTools": true,
1309
1263
  "supportsThinking": true,
1310
1264
  "supportsVision": true,
1311
- "inputPricePerM": 5,
1312
- "outputPricePerM": 25,
1313
- "notes": "Claude Opus 4.6 with extended thinking, through Antigravity. Cost = ANTHROPIC's list price for Opus 4.6 ($5 in / $0.50 cache read / $6.25 5-minute write / $25 out, 1M context at standard rates — read 2026-10-02)."
1314
- },
1315
- {
1316
- "id": "gpt-oss-120b-medium",
1317
- "displayName": "GPT-OSS 120B (Antigravity)",
1318
- "contextWindow": 400000,
1319
- "maxOutputTokens": 32768,
1320
- "supportsTools": true,
1321
- "supportsThinking": true,
1322
- "supportsVision": false,
1323
- "notes": "OpenAI's open-weight GPT-OSS 120B, hosted by Google, at Antigravity's medium reasoning level (in the id). NO PRICE: Google's Vertex AI list price for gpt-oss-120b could not be read on 2026-10-02, so the row is left unpriced and the pool refuses it (pool_model_unpriced) until the owner sets its cost on the model page. The 400K window is the one docs/antigravity.md section 3 records."
1265
+ "inputPricePerM": 0.75,
1266
+ "outputPricePerM": 3.75,
1267
+ "notes": "Google lists one model per level — gemini-3.7-flash-high, -medium and -low (fetchAvailableModels, 2026-10-03: 1,048,576 context / 65,536 output each); OonaCode shows ONE model and the chat’s effort picker fills the level (upstreamId template; xhigh and max read as high; no effort = high). Cost = Google’s Gemini API list price for gemini-3.7-flash: $0.75 in / $0.075 cached / $3.75 out per 1M through 2026-12-31, DOUBLING to $1.50 / $0.15 / $7.50 from 2027-01-01 (ai.google.dev/gemini-api/docs/pricing, updated 2026-10-01) — move the cost cells on the model page then."
1324
1268
  }
1325
1269
  ],
1326
- "defaultModel": "gemini-3.1-pro-high",
1270
+ "defaultModel": "gemini-3.8-flash",
1327
1271
  "capabilities": {
1328
1272
  "streaming": true,
1329
1273
  "tools": true,
@@ -1374,9 +1318,7 @@
1374
1318
  "operatorOnly": true,
1375
1319
  "baseUrl": "https://daily-cloudcode-pa.googleapis.com",
1376
1320
  "extraHeaders": {
1377
- "user-agent": "antigravity/2.19.1 windows/amd64",
1378
- "x-goog-api-client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
1379
- "client-metadata": "{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}"
1321
+ "user-agent": "antigravity/cli/1.2.15 (aidev_client; os_type=windows; arch=amd64; cl=992008527; auth_method=consumer)"
1380
1322
  },
1381
1323
  "loopbackLogin": {
1382
1324
  "type": "google-loopback",
@@ -1395,9 +1337,10 @@
1395
1337
  "userinfoUrl": "https://www.googleapis.com/oauth2/v2/userinfo",
1396
1338
  "signInLabel": "Sign in with Google (Antigravity)"
1397
1339
  },
1398
- "notes": "The operator's Antigravity subscription (Google AI Pro / Ultra or the free tier). The base URL is the daily Code Assist channel the installed Antigravity 2.19.1 talks to (docs/antigravity.md section 1); prod is https://cloudcode-pa.googleapis.com — the row's base URL decides, so a credential can be pointed there. The identity headers are Antigravity's (user-agent with its version — bump it with Antigravity — and the Code Assist client metadata the Antigravity-compatible clients send). Scopes: the six the language server carries minus `aicode`, which the public Antigravity sign-in integrations do not request; add it here if Google ever refuses a Code Assist call for want of it."
1340
+ "notes": "The operator’s Antigravity account. The base URL is the daily Code Assist channel Antigravity itself talks to (its language server runs with --cloud_code_endpoint https://daily-cloudcode-pa.googleapis.com; prod is https://cloudcode-pa.googleapis.com — the row’s base URL decides). The ONE identity header is the user-agent Google’s own agy CLI sends (1.2.15, recorded again on 2026-10-03 after it updated; docs/antigravity.md section 12) — bump its version with Antigravity’s. Scopes: the six the language server carries minus `aicode`, which the public Antigravity sign-in integrations do not request; add it here if Google ever refuses a Code Assist call for want of it."
1399
1341
  }
1400
- ]
1342
+ ],
1343
+ "effortLevels": ["low", "medium", "high"]
1401
1344
  }
1402
1345
  ]
1403
1346
  }
@@ -74,7 +74,7 @@ Error generating stack: `+e.message+`
74
74
 
75
75
  Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function da(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,o[e.defId]=e.def)}e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:ma(t,`input`,e.processors),output:ma(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function fa(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return fa(r.element,n);if(r.type===`set`)return fa(r.valueType,n);if(r.type===`lazy`)return fa(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`)return fa(r.innerType,n);if(r.type===`intersection`)return fa(r.left,n)||fa(r.right,n);if(r.type===`record`||r.type===`map`)return fa(r.keyType,n)||fa(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:fa(r.in,n)||fa(r.out,n);if(r.type===`object`){for(let e in r.shape)if(fa(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(fa(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(fa(e,n))return!0;return!!(r.rest&&fa(r.rest,n))}return!1}var pa=(e,t={})=>n=>{let r=ca({...n,processors:t});return la(e,r),ua(r,e),da(r,e)},ma=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=ca({...i??{},target:a,io:t,processors:n});return la(e,o),ua(o,e),da(o,e)},ha={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},ga=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=ha[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},_a=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;i.type=typeof s==`string`&&s.includes(`int`)?`integer`:`number`;let d=typeof u==`number`&&u>=(a??-1/0),f=typeof l==`number`&&l<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;d?p?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l:typeof o==`number`&&(i.maximum=o),typeof c==`number`&&(i.multipleOf=c)},va=(e,t,n,r)=>{n.type=`boolean`},ya=(e,t,n,r)=>{n.not={}},ba=(e,t,n,r)=>{let i=e._zod.def,a=Ge(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},xa=(e,t,n,r)=>{let i=e._zod.def,a=[];for(let e of i.values)if(e===void 0){if(t.unrepresentable===`throw`)throw Error("Literal `undefined` cannot be represented in JSON Schema")}else if(typeof e==`bigint`){if(t.unrepresentable===`throw`)throw Error(`BigInt literals cannot be represented in JSON Schema`);a.push(Number(e))}else a.push(e);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},Sa=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Ca=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},wa=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=la(a.element,t,{...r,path:[...r.path,`items`]})},Ta=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=la(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=la(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Ea=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>la(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Da=(e,t,n,r)=>{let i=e._zod.def,a=la(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=la(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},Oa=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=o._zod.bag?.patterns;if(a.mode===`loose`&&s&&s.size>0){let e=la(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)i.patternProperties[t.source]=e}else(t.target===`draft-07`||t.target===`draft-2020-12`)&&(i.propertyNames=la(a.keyType,t,{...r,path:[...r.path,`propertyNames`]})),i.additionalProperties=la(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]});let c=o._zod.values;if(c){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e)}},ka=(e,t,n,r)=>{let i=e._zod.def,a=la(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},Aa=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},ja=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},Ma=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},Na=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},Pa=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;la(o,t,r);let s=t.seen.get(e);s.ref=o},Fa=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},Ia=(e,t,n,r)=>{let i=e._zod.def;la(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},La=B(`ZodISODateTime`,(e,t)=>{rr.init(e,t),lo.init(e,t)});function Ra(e){return ki(La,e)}var za=B(`ZodISODate`,(e,t)=>{ir.init(e,t),lo.init(e,t)});function Ba(e){return Ai(za,e)}var Va=B(`ZodISOTime`,(e,t)=>{ar.init(e,t),lo.init(e,t)});function Ha(e){return ji(Va,e)}var Ua=B(`ZodISODuration`,(e,t)=>{or.init(e,t),lo.init(e,t)});function Wa(e){return Mi(Ua,e)}var Ga=B(`ZodError`,(e,t)=>{Ot.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>jt(e,t)},flatten:{value:t=>At(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Ke,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Ke,2)}},isEmpty:{get(){return e.issues.length===0}}})},{Parent:Error}),Ka=Mt(Ga),qa=Nt(Ga),Ja=Pt(Ga),Ya=It(Ga),Xa=Rt(Ga),Za=zt(Ga),Qa=Bt(Ga),$a=Vt(Ga),eo=Ht(Ga),to=Ut(Ga),no=Wt(Ga),ro=Gt(Ga),io=new WeakMap;function ao(e,t,n){let r=Object.getPrototypeOf(e),i=io.get(r);if(i||(i=new Set,io.set(r,i)),!i.has(t)){i.add(t);for(let e in n){let t=n[e];Object.defineProperty(r,e,{configurable:!0,enumerable:!1,get(){let n=t.bind(this);return Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:n}),n},set(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,enumerable:!0,value:t})}})}}}var oo=B(`ZodType`,(e,t)=>(Un.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:ma(e,`input`),output:ma(e,`output`)}}),e.toJSONSchema=pa(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,"_def",{value:t}),e.parse=(t,n)=>Ka(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>Ja(e,t,n),e.parseAsync=async(t,n)=>qa(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>Ya(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Xa(e,t,n),e.decode=(t,n)=>Za(e,t,n),e.encodeAsync=async(t,n)=>Qa(e,t,n),e.decodeAsync=async(t,n)=>$a(e,t,n),e.safeEncode=(t,n)=>eo(e,t,n),e.safeDecode=(t,n)=>to(e,t,n),e.safeEncodeAsync=async(t,n)=>no(e,t,n),e.safeDecodeAsync=async(t,n)=>ro(e,t,n),ao(e,`ZodType`,{check(...e){let t=this.def;return this.clone(et(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return ut(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(Cs(e,t))},superRefine(e,t){return this.check(ws(e,t))},overwrite(e){return this.check(Qi(e))},optional(){return as(this)},exactOptional(){return ss(this)},nullable(){return ls(this)},nullish(){return as(ls(this))},nonoptional(e){return hs(this,e)},array(){return Vo(this)},or(e){return Go([this,e])},and(e){return Yo(this,e)},transform(e){return ys(this,rs(e))},default(e){return ds(this,e)},prefault(e){return ps(this,e)},catch(e){return _s(this,e)},pipe(e){return ys(this,e)},readonly(){return xs(this)},describe(e){let t=this.clone();return ai.add(t,{description:e}),t},meta(...e){if(e.length===0)return ai.get(this);let t=this.clone();return ai.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e){return e(this)}}),Object.defineProperty(e,"description",{get(){return ai.get(e)?.description},configurable:!0}),e)),so=B(`_ZodString`,(e,t)=>{Wn.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ga(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,ao(e,`_ZodString`,{regex(...e){return this.check(Ki(...e))},includes(...e){return this.check(Yi(...e))},startsWith(...e){return this.check(Xi(...e))},endsWith(...e){return this.check(Zi(...e))},min(...e){return this.check(Wi(...e))},max(...e){return this.check(Ui(...e))},length(...e){return this.check(Gi(...e))},nonempty(...e){return this.check(Wi(1,...e))},lowercase(e){return this.check(qi(e))},uppercase(e){return this.check(Ji(e))},trim(){return this.check(ea())},normalize(...e){return this.check($i(...e))},toLowerCase(){return this.check(ta())},toUpperCase(){return this.check(na())},slugify(){return this.check(ra())}})}),co=B(`ZodString`,(e,t)=>{Wn.init(e,t),so.init(e,t),e.email=t=>e.check(si(uo,t)),e.url=t=>e.check(pi(mo,t)),e.jwt=t=>e.check(Oi(ko,t)),e.emoji=t=>e.check(mi(ho,t)),e.guid=t=>e.check(ci(fo,t)),e.uuid=t=>e.check(li(po,t)),e.uuidv4=t=>e.check(ui(po,t)),e.uuidv6=t=>e.check(di(po,t)),e.uuidv7=t=>e.check(fi(po,t)),e.nanoid=t=>e.check(hi(go,t)),e.guid=t=>e.check(ci(fo,t)),e.cuid=t=>e.check(gi(_o,t)),e.cuid2=t=>e.check(_i(vo,t)),e.ulid=t=>e.check(vi(yo,t)),e.base64=t=>e.check(Ti(Eo,t)),e.base64url=t=>e.check(Ei(Do,t)),e.xid=t=>e.check(yi(bo,t)),e.ksuid=t=>e.check(bi(xo,t)),e.ipv4=t=>e.check(xi(So,t)),e.ipv6=t=>e.check(Si(Co,t)),e.cidrv4=t=>e.check(Ci(wo,t)),e.cidrv6=t=>e.check(wi(To,t)),e.e164=t=>e.check(Di(Oo,t)),e.datetime=t=>e.check(Ra(t)),e.date=t=>e.check(Ba(t)),e.time=t=>e.check(Ha(t)),e.duration=t=>e.check(Wa(t))});function H(e){return oi(co,e)}var lo=B(`ZodStringFormat`,(e,t)=>{Gn.init(e,t),so.init(e,t)}),uo=B(`ZodEmail`,(e,t)=>{Jn.init(e,t),lo.init(e,t)}),fo=B(`ZodGUID`,(e,t)=>{Kn.init(e,t),lo.init(e,t)}),po=B(`ZodUUID`,(e,t)=>{qn.init(e,t),lo.init(e,t)}),mo=B(`ZodURL`,(e,t)=>{Yn.init(e,t),lo.init(e,t)}),ho=B(`ZodEmoji`,(e,t)=>{Xn.init(e,t),lo.init(e,t)}),go=B(`ZodNanoID`,(e,t)=>{Zn.init(e,t),lo.init(e,t)}),_o=B(`ZodCUID`,(e,t)=>{Qn.init(e,t),lo.init(e,t)}),vo=B(`ZodCUID2`,(e,t)=>{$n.init(e,t),lo.init(e,t)}),yo=B(`ZodULID`,(e,t)=>{er.init(e,t),lo.init(e,t)}),bo=B(`ZodXID`,(e,t)=>{tr.init(e,t),lo.init(e,t)}),xo=B(`ZodKSUID`,(e,t)=>{nr.init(e,t),lo.init(e,t)}),So=B(`ZodIPv4`,(e,t)=>{sr.init(e,t),lo.init(e,t)}),Co=B(`ZodIPv6`,(e,t)=>{cr.init(e,t),lo.init(e,t)}),wo=B(`ZodCIDRv4`,(e,t)=>{lr.init(e,t),lo.init(e,t)}),To=B(`ZodCIDRv6`,(e,t)=>{ur.init(e,t),lo.init(e,t)}),Eo=B(`ZodBase64`,(e,t)=>{fr.init(e,t),lo.init(e,t)}),Do=B(`ZodBase64URL`,(e,t)=>{mr.init(e,t),lo.init(e,t)}),Oo=B(`ZodE164`,(e,t)=>{hr.init(e,t),lo.init(e,t)}),ko=B(`ZodJWT`,(e,t)=>{_r.init(e,t),lo.init(e,t)}),Ao=B(`ZodNumber`,(e,t)=>{vr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_a(e,t,n,r),ao(e,`ZodNumber`,{gt(e,t){return this.check(Bi(e,t))},gte(e,t){return this.check(Vi(e,t))},min(e,t){return this.check(Vi(e,t))},lt(e,t){return this.check(Ri(e,t))},lte(e,t){return this.check(zi(e,t))},max(e,t){return this.check(zi(e,t))},int(e){return this.check(No(e))},safe(e){return this.check(No(e))},positive(e){return this.check(Bi(0,e))},nonnegative(e){return this.check(Vi(0,e))},negative(e){return this.check(Ri(0,e))},nonpositive(e){return this.check(zi(0,e))},multipleOf(e,t){return this.check(Hi(e,t))},step(e,t){return this.check(Hi(e,t))},finite(){return this}});let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function jo(e){return Ni(Ao,e)}var Mo=B(`ZodNumberFormat`,(e,t)=>{yr.init(e,t),Ao.init(e,t)});function No(e){return Pi(Mo,e)}var Po=B(`ZodBoolean`,(e,t)=>{br.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>va(e,t,n,r)});function Fo(e){return Fi(Po,e)}var Io=B(`ZodUnknown`,(e,t)=>{xr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Lo(){return Ii(Io)}var Ro=B(`ZodNever`,(e,t)=>{Sr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ya(e,t,n,r)});function zo(e){return Li(Ro,e)}var Bo=B(`ZodArray`,(e,t)=>{wr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wa(e,t,n,r),e.element=t.element,ao(e,`ZodArray`,{min(e,t){return this.check(Wi(e,t))},nonempty(e){return this.check(Wi(1,e))},max(e,t){return this.check(Ui(e,t))},length(e,t){return this.check(Gi(e,t))},unwrap(){return this.element}})});function Vo(e,t){return ia(Bo,e,t)}var Ho=B(`ZodObject`,(e,t)=>{kr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ta(e,t,n,r),Qe(e,`shape`,()=>t.shape),ao(e,`ZodObject`,{keyof(){return $o(Object.keys(this._zod.def.shape))},catchall(e){return this.clone({...this._zod.def,catchall:e})},passthrough(){return this.clone({...this._zod.def,catchall:Lo()})},loose(){return this.clone({...this._zod.def,catchall:Lo()})},strict(){return this.clone({...this._zod.def,catchall:zo()})},strip(){return this.clone({...this._zod.def,catchall:void 0})},extend(e){return ht(this,e)},safeExtend(e){return gt(this,e)},merge(e){return _t(this,e)},pick(e){return pt(this,e)},omit(e){return mt(this,e)},partial(...e){return vt(is,this,e[0])},required(...e){return yt(ms,this,e[0])}})});function Uo(e,t){return new Ho({type:`object`,shape:e??{},...V(t)})}var Wo=B(`ZodUnion`,(e,t)=>{jr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ea(e,t,n,r),e.options=t.options});function Go(e,t){return new Wo({type:`union`,options:e,...V(t)})}var Ko=B(`ZodDiscriminatedUnion`,(e,t)=>{Wo.init(e,t),Mr.init(e,t)});function qo(e,t,n){return new Ko({type:`union`,options:t,discriminator:e,...V(n)})}var Jo=B(`ZodIntersection`,(e,t)=>{Nr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Da(e,t,n,r)});function Yo(e,t){return new Jo({type:`intersection`,left:e,right:t})}var Xo=B(`ZodRecord`,(e,t)=>{Ir.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Oa(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function Zo(e,t,n){return!t||!t._zod?new Xo({type:`record`,keyType:H(),valueType:e,...V(t)}):new Xo({type:`record`,keyType:e,valueType:t,...V(n)})}var Qo=B(`ZodEnum`,(e,t)=>{Lr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ba(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new Qo({...t,checks:[],...V(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new Qo({...t,checks:[],...V(r),entries:i})}});function $o(e,t){return new Qo({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...V(t)})}var es=B(`ZodLiteral`,(e,t)=>{Rr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>xa(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function ts(e,t){return new es({type:`literal`,values:Array.isArray(e)?e:[e],...V(t)})}var ns=B(`ZodTransform`,(e,t)=>{zr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ca(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new He(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(Et(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(Et(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n.fallback=!0,n)):(n.value=i,n.fallback=!0,n)}});function rs(e){return new ns({type:`transform`,transform:e})}var is=B(`ZodOptional`,(e,t)=>{Vr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ia(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function as(e){return new is({type:`optional`,innerType:e})}var os=B(`ZodExactOptional`,(e,t)=>{Hr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ia(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ss(e){return new os({type:`optional`,innerType:e})}var cs=B(`ZodNullable`,(e,t)=>{Ur.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ka(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ls(e){return new cs({type:`nullable`,innerType:e})}var us=B(`ZodDefault`,(e,t)=>{Wr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ja(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function ds(e,t){return new us({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():st(t)}})}var fs=B(`ZodPrefault`,(e,t)=>{Kr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ma(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ps(e,t){return new fs({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():st(t)}})}var ms=B(`ZodNonOptional`,(e,t)=>{qr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Aa(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function hs(e,t){return new ms({type:`nonoptional`,innerType:e,...V(t)})}var gs=B(`ZodCatch`,(e,t)=>{Yr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Na(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function _s(e,t){return new gs({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}var vs=B(`ZodPipe`,(e,t)=>{Xr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pa(e,t,n,r),e.in=t.in,e.out=t.out});function ys(e,t){return new vs({type:`pipe`,in:e,out:t})}var bs=B(`ZodReadonly`,(e,t)=>{Qr.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fa(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function xs(e){return new bs({type:`readonly`,innerType:e})}var Ss=B(`ZodCustom`,(e,t)=>{ei.init(e,t),oo.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Sa(e,t,n,r)});function Cs(e,t={}){return aa(Ss,e,t)}function ws(e,t){return oa(e,t)}var Ts={artificial_analysis_intelligence_index:{label:`Intelligence index`,scale:`index`},artificial_analysis_coding_index:{label:`Coding index`,scale:`index`},artificial_analysis_math_index:{label:`Math index`,scale:`index`},gpqa:{label:`GPQA Diamond`,scale:`fraction`},hle:{label:`Humanity's Last Exam`,scale:`fraction`},lcr:{label:`Long-context reasoning`,scale:`fraction`},livecodebench:{label:`LiveCodeBench`,scale:`fraction`},scicode:{label:`SciCode`,scale:`fraction`},math_500:{label:`MATH-500`,scale:`fraction`},aime:{label:`AIME`,scale:`fraction`},aime_25:{label:`AIME 2025`,scale:`fraction`},ifbench:{label:`IFBench`,scale:`fraction`},mmlu_pro:{label:`MMLU Pro`,scale:`fraction`},tau2:{label:`τ²-bench (agentic)`,scale:`fraction`},tau_banking:{label:`τ-bench banking`,scale:`fraction`},terminalbench_hard:{label:`Terminal-Bench Hard`,scale:`fraction`},terminalbench_v2_1:{label:`Terminal-Bench 2.1`,scale:`fraction`}};function Es(e){return(e.credentialVariants??[]).filter(e=>!e.operatorOnly)}function Ds(e){let t=new Set(e.map(e=>e.definition.id));return e.filter(e=>!e.definition.clientGroup||e.definition.clientGroup===e.definition.id||!t.has(e.definition.clientGroup))}function Os(e,t){return e.filter(e=>e.definition.id===t||e.definition.clientGroup===t&&e.definition.id!==t)}function ks(e){return Ds(e).filter(e=>e.definition.enabled&&e.definition.credentialClass!==`none`&&e.definition.poolOnly!==!0&&T(e.definition.id)&&!D(e.definition.id))}function As(e){if(!e)return!1;try{let t=new URL(e).hostname.toLowerCase();return t===`127.0.0.1`||t===`localhost`||t===`::1`||t===`[::1]`}catch{return!1}}function js(e,t={}){let n=e.displayName,r=t.credentialClass??e.credentialClass,i=t.baseUrl??e.baseUrl;return e.id===`oonacode`?{kind:`pool`,badge:`via OonaCode`,detail:`Runs on OonaCode's own provider accounts, through the OonaCode gateway. Priced models are billed to your account in credits; free models cost nothing on any plan.`,viaGateway:!0}:e.route===`direct`?{kind:`subscription-direct`,badge:`direct to provider`,detail:`Your ${n} subscription runs straight from this PC to the provider — it never passes through the OonaCode gateway.`,viaGateway:!1}:r===`api_key`&&e.kind!==`anthropic-passthrough`?{kind:`own-key-translated`,badge:`direct to provider`,detail:`Your ${n} key stays on this PC: OonaCode translates the request here and calls ${n} from this machine. The gateway sees neither the key nor the traffic.`,viaGateway:!1}:As(i)?{kind:`local-server`,badge:`on this machine`,detail:`Runs against ${n} on this machine (${i}) — the request never leaves the PC.`,viaGateway:!1}:r===`api_key`&&e.kind===`anthropic-passthrough`&&e.directCapable===!0?{kind:`own-key-direct`,badge:`direct to provider`,detail:`Your ${n} key runs straight from this PC to ${n} — the OonaCode gateway is not in the path.`,viaGateway:!1}:{kind:`gateway`,badge:`via OonaCode`,detail:`Routed to ${n} through the OonaCode gateway.`,viaGateway:!0}}var Ms=qo(`type`,[Uo({type:ts(`oauth-device`),deviceAuthorizationUrl:H().url(),tokenUrl:H().url(),clientId:H().min(1),scopes:Vo(H().min(1)).min(1),signInLabel:H().min(1).optional(),referrer:H().min(1).optional()}),Uo({type:ts(`openai-device`),deviceAuthorizationUrl:H().url(),pollUrl:H().url(),tokenUrl:H().url(),verificationUri:H().url(),redirectUri:H().url(),clientId:H().min(1),signInLabel:H().min(1).optional()})]),Ns=Uo({type:ts(`google-loopback`),authorizationUrl:H().url(),tokenUrl:H().url(),redirectUri:H().url(),scopes:Vo(H().min(1)).min(1),clientIdSetting:H().min(1),clientSecretSetting:H().min(1),userinfoUrl:H().url().optional(),signInLabel:H().min(1).optional()}),Ps=Uo({id:H().min(1),displayName:H().min(1),upstreamId:H().min(1).optional(),servedBy:Vo(H().min(1)).optional(),subscriptionServedBy:Vo(H().min(1)).optional(),contextWindow:jo().int().positive().optional(),maxOutputTokens:jo().int().positive().optional(),supportsTools:Fo().optional(),supportsThinking:Fo().optional(),effortLevels:Vo($o(be)).optional(),helperModel:H().min(1).optional(),supportsVision:Fo().optional(),inputPricePerM:jo().nonnegative().optional(),outputPricePerM:jo().nonnegative().optional(),creditsPerM:Uo({input:jo().nonnegative(),output:jo().nonnegative(),maxInput:jo().nonnegative().optional(),maxOutput:jo().nonnegative().optional()}).optional(),notes:H().optional(),free:Fo().optional(),aaIntelligence:jo().optional(),aaCoding:jo().optional(),aaOutputTps:jo().optional(),aaTtft:jo().optional(),aa:Uo({fetchedAt:H(),creator:H().optional(),releaseDate:H().optional(),benchmarks:Zo(H(),jo()).optional()}).loose().optional()}).loose(),Fs=Uo({id:H().regex(/^[a-z0-9][a-z0-9-]{1,40}$/,`provider id must be lowercase kebab-case`),displayName:H().min(1),kind:$o([`anthropic-passthrough`,`openai-compatible`,`gemini`]),route:$o([`gateway`,`direct`]),credentialClass:$o([`api_key`,`subscription`,`none`]),baseUrl:H().url(),messagesPath:H().startsWith(`/`).optional(),modelsPath:H().startsWith(`/`).optional(),auth:Uo({header:$o([`x-api-key`,`authorization-bearer`,`api-key`,`none`]),extraHeaders:Zo(H(),H()).optional()}),models:Vo(Ps),defaultModel:H().min(1),modelAliases:Zo(H(),H()).optional(),helperModel:H().min(1).optional(),capabilities:Uo({streaming:Fo(),tools:Fo(),thinking:Fo(),vision:Fo(),countTokens:Fo(),promptCaching:Fo(),promptCacheTtlSec:jo().int().positive().optional()}),translate:Uo({maxTokensParam:$o([`max_tokens`,`max_completion_tokens`]).optional(),reasoningEffortFromBudget:Fo().optional(),reasoningContentField:H().nullable().optional(),supportsParallelToolCalls:Fo().optional(),systemRole:$o([`system`,`developer`]).optional(),streamIncludeUsage:Fo().optional(),wire:$o([`chat`,`responses`,`gemini-code-assist`]).optional()}).optional(),passthrough:Uo({stripCacheControl:Fo().optional(),cacheChain:Fo().optional(),toolSchemaRequiredArray:Fo().optional(),toolDescriptionRequired:Fo().optional(),allowedBetas:Vo(H()).optional(),anthropicVersion:H().optional()}).optional(),userBaseUrl:Fo().optional(),engineEnv:Zo(H(),H()).optional(),directCapable:Fo().optional(),subscriptionLogin:Ms.optional(),poolOnly:Fo().optional(),phase:Go([ts(1),ts(2)]),enabled:Fo(),docsUrl:H().url().optional(),notes:H().optional(),references:Vo(Uo({label:H().min(1),url:H().url(),kind:$o([`docs`,`pricing`,`models`,`console`,`status`,`keys`,`signup`,`other`]).optional()})).optional(),keyFormat:H().optional(),credentialVariants:Vo(Uo({id:H().min(1),label:H().min(1),header:$o([`x-api-key`,`authorization-bearer`,`api-key`,`none`]).optional(),extraHeaders:Zo(H(),H()).optional(),operatorOnly:Fo().optional(),requiresClaudeCodeIdentity:Fo().optional(),subscriptionLogin:Ms.optional(),loopbackLogin:Ns.optional(),claudeCodeShape:Uo({betas:H().min(1),userAgent:H().min(1),billingHeader:H().min(1),headers:Zo(H(),H()).optional()}).optional(),baseUrl:H().url().optional(),keyFormat:H().optional(),notes:H().optional()})).optional(),adminGroup:H().optional(),clientGroup:H().optional(),recordLabel:H().optional(),effortLevels:Vo($o(be)).optional()});Uo({version:jo().int().positive(),updatedAt:H(),providers:Vo(Fs)});function Is(e,t){return Ls(e,Ks(e,t))}function Ls(e,t){return e.models.find(e=>e.id===t)?.upstreamId??t}function Rs(e){return/^claude-/i.test(e)}function zs(e){return/^claude-.+-\d{8}$/i.test(e)?e.replace(/-\d{8}$/,``):null}function Bs(e){return e.replace(/\[1m\]$/i,``)}var Vs=new Set([`opus`,`sonnet`,`haiku`,`fable`]);function Hs(e){return Vs.has(e.toLowerCase())}function Us(e,t){let n=Bs(t);if(Hs(n)||e.models.some(e=>e.id===n))return null;let r=e.modelAliases;if(!r)return null;let i=zs(n);if(i!==null&&e.models.some(e=>e.id===i))return null;let a=r[n]??(i===null?void 0:r[i]);return a!==void 0&&e.models.some(e=>e.id===a)?a:null}function Ws(e,t){return{images:e.models.find(e=>e.id===t)?.supportsVision??e.capabilities.vision,documents:Rs(t)}}function Gs(e,t,n){let r=Ws(e,t),i=new Set;for(let e of n){let t=e?.type;(t===`image`||t===`document`)&&i.add(t)}let a=e.models.find(e=>e.id===t)?.displayName??t;return i.has(`image`)&&!r.images?`${a} cannot read images. Remove the image, or pick a model that can — the model details say which.`:i.has(`document`)&&!r.documents?`${a} cannot read PDF documents — only Anthropic's Claude models take a PDF. Attach it as text, or pick a Claude model.`:null}function Ks(e,t){if(!t)return e.defaultModel;if(e.models.some(e=>e.id===t))return t;let n=e.modelAliases?.[t];if(n)return n;let r=Us(e,t);if(r)return r;let i=t.toLowerCase(),a=i.includes(`haiku`)?`haiku`:i.includes(`opus`)?`opus`:i.includes(`sonnet`)?`sonnet`:i.includes(`fable`)?`fable`:null;if(a){if(e.modelAliases?.[a])return e.modelAliases[a];let t=e.models.find(e=>e.id.toLowerCase().includes(a));if(t)return t.id}return e.defaultModel}var qs={messages:`/v1/messages`,countTokens:`/v1/messages/count_tokens`,models:`/v1/models`,providerMessages:e=>`/p/${e}/v1/messages`,providerCountTokens:e=>`/p/${e}/v1/messages/count_tokens`,providerModels:e=>`/p/${e}/v1/models`,voiceTranslation:`/v1/oonacode/voice-translation`,health:`/api/health`,streamCheck:`/api/stream-check`,register:`/api/auth/register`,login:`/api/auth/login`,refresh:`/api/auth/refresh`,logout:`/api/auth/logout`,me:`/api/auth/me`,prelogin:`/api/auth/prelogin`,tokens:`/api/me/tokens`,token:e=>`/api/me/tokens/${e}`,tokenPurge:e=>`/api/me/tokens/${e}/purge`,tokenUsage:e=>`/api/me/tokens/${e}/usage`,providers:`/api/me/providers`,provider:e=>`/api/me/providers/${e}`,providerTest:e=>`/api/me/providers/${e}/test`,routing:`/api/me/routing`,usage:`/api/me/usage`,usageSession:e=>`/api/me/usage/sessions/${e}`,usageBreakdown:`/api/me/usage/breakdown`,devices:`/api/me/devices`,pushToken:`/api/me/push-token`,hostNotify:`/api/me/hosts/notify`,device:e=>`/api/me/devices/${e}`,hosts:`/api/me/hosts`,hostHeartbeat:`/api/me/hosts/heartbeat`,hostVaultUnlock:e=>`/api/me/hosts/${encodeURIComponent(e)}/vault-unlock`,host:e=>`/api/me/hosts/${encodeURIComponent(e)}`,vault:`/api/me/vault`,vaultEvents:`/api/me/vault/events`,registry:`/api/registry`,agentTools:`/api/agent-tools`,agentToolCalls:`/api/me/agent-tools/calls`,releasesLatest:`/api/releases/latest`,releasesHistory:`/api/releases`,team:`/api/me/team`,teamInvites:`/api/me/team/invites`,teamInvite:e=>`/api/me/team/invites/${e}`,teamInviteLookup:`/api/team/invites/lookup`,teamInviteDecline:`/api/team/invites/decline`,teamJoin:`/api/me/team/join`,teamInvitations:`/api/me/team/invitations`,teamInvitationAccept:e=>`/api/me/team/invitations/${e}/accept`,teamInvitationDecline:e=>`/api/me/team/invitations/${e}/decline`,teamMember:e=>`/api/me/team/members/${e}`,teamLeave:`/api/me/team/leave`,teamTransfer:`/api/me/team/transfer`,teamAudit:`/api/me/team/audit`,teamCheckout:`/api/me/team/checkout`,teamTopup:`/api/me/team/topup`,teamSeats:`/api/me/team/seats`,googleConfig:`/api/auth/google/config`,googleStart:`/api/auth/google/start`,googleCallback:`/api/auth/google/callback`,githubConfig:`/api/auth/github/config`,githubStart:`/api/auth/github/start`,githubCallback:`/api/auth/github/callback`,googleUnlink:`/api/me/google`,telegramConfig:`/api/auth/telegram/config`,telegramAuth:`/api/auth/telegram`,telegram:`/api/me/telegram`,telegramWebhook:`/api/webhooks/telegram`,passphraseSetup:`/api/auth/passphrase/setup`,passphraseRekey:`/api/me/passphrase/rekey`,recovery:`/api/me/recovery`,recoveryChallenge:`/api/auth/recovery/challenge`,recoveryConsume:`/api/auth/recovery/consume`,deviceApprovals:`/api/me/device-approvals`,deviceApproval:e=>`/api/me/device-approvals/${e}`,deviceApprovalApprove:e=>`/api/me/device-approvals/${e}/approve`,deviceApprovalDeny:e=>`/api/me/device-approvals/${e}/deny`,passwordResetRequest:`/api/auth/password-reset/request`,passwordResetConfirm:`/api/auth/password-reset/confirm`,vaultRekeyComplete:`/api/me/vault/rekey-complete`,vaultRekeyPending:`/api/me/vault/rekey-pending`,emailVerifySend:`/api/auth/email/verify/send`,emailVerifyConfirm:`/api/auth/email/verify/confirm`,emailVerifyWatch:`/api/auth/email/verify/watch`,twoFactor:`/api/me/2fa`,twoFactorEnroll:`/api/me/2fa/enroll`,twoFactorConfirm:`/api/me/2fa/confirm`,twoFactorDisable:`/api/me/2fa/disable`,twoFactorDisableRequest:`/api/me/2fa/disable/request`,twoFactorRecoveryCodes:`/api/me/2fa/recovery-codes`,twoFactorVerify:`/api/auth/2fa/verify`,deviceLinkStart:`/api/auth/device/start`,deviceLinkPoll:`/api/auth/device/poll`,deviceLinks:`/api/me/device-links`,deviceLink:e=>`/api/me/device-links/${e}`,deviceLinkApprove:e=>`/api/me/device-links/${e}/approve`,deviceLinkDeny:e=>`/api/me/device-links/${e}/deny`,hostLogs:`/api/me/hosts/logs`,errorReport:`/api/me/errors`,bugReports:`/api/me/bug-reports`,plans:`/api/plans`,myPlan:`/api/me/plan`,checkout:`/api/me/plan/checkout`,creditsTopup:`/api/me/credits/topup`,billing:`/api/me/billing`},Js=2048,Ys=16384,Xs=8e3,Zs=5242880,Qs=12582912;new Set(`BCDFGHJKLMNPQRSTVWXZ`.split(``));var $s=`discard-my-vault-and-history`,ec=`Anyone who can use this device can use your saved provider keys without your passphrase. Turn this off on shared or public computers. You can revoke it any time from Devices.`,tc={name:120,instructions:2e4,goal:2e3,repositories:50,repositoryUrl:500,memory:2e4,minIntervalFloor:1,minIntervalCeiling:10080},nc=`⏰ Scheduled task "`;function rc(e){if(!e.startsWith(nc))return null;let t=e.indexOf(`"
76
76
 
77
- `,18);return t<0?null:{title:e.slice(18,t),prompt:e.slice(t+3)}}Object.freeze({tengu_amber_sentinel:!0,tengu_groovy_eclipse:!0,tengu_humble_hammock:!0});var ic=[`mon`,`tue`,`wed`,`thu`,`fri`,`sat`,`sun`],ac=/^([01]\d|2[0-3]):[0-5]\d$/;Uo({tz:H().min(1),windows:Vo(Uo({from:H().regex(ac,`HH:MM`),to:H().regex(ac,`HH:MM`),days:Vo($o(ic)).optional(),kind:$o([`peak`,`offpeak`])})),offpeakDiscount:jo().nonnegative().max(1).optional()});var oc=[`priceInputCacheMissPeak`,`priceInputCacheMissOffpeak`,`priceInputCacheHitPeak`,`priceInputCacheHitOffpeak`,`priceCacheWritePeak`,`priceCacheWriteOffpeak`,`priceOutputPeak`,`priceOutputOffpeak`],sc=Uo({inputCacheMiss:jo().nonnegative(),inputCacheHit:jo().nonnegative().optional(),cacheWrite:jo().nonnegative().optional(),output:jo().nonnegative()});Uo({by:ts(`prompt_tokens`),tiers:Vo(Uo({upToPromptTokens:jo().int().positive().optional(),price:sc.optional(),cost:sc.optional()})).min(1),note:H().optional()}).superRefine((e,t)=>{let n=0;e.tiers.forEach((r,i)=>{!r.cost&&!r.price&&t.addIssue({code:`custom`,message:`a tier needs its cost (the provider’s rates; retail is cost × the record’s ratio)`,path:[`tiers`,i,`cost`]});let a=r.upToPromptTokens;if(a===void 0){i!==e.tiers.length-1&&t.addIssue({code:`custom`,message:`only the LAST tier may omit upToPromptTokens`,path:[`tiers`,i]});return}a<=n&&t.addIssue({code:`custom`,message:`tiers must ascend: ${a} does not exceed ${n}`,path:[`tiers`,i,`upToPromptTokens`]}),n=a})}),[...oc];var cc={realtime:`/v1/realtime`,translations:`/v1/realtime/translations`,live:`/v1/live/sessions`,speechStream:`/v1/audio/speech/stream`,transcriptionStream:`/v1/audio/transcriptions/stream`,clientSecrets:`/v1/realtime/client_secrets`,translationClientSecrets:`/v1/realtime/translations/client_secrets`};cc.realtime,cc.translations,cc.live,cc.speechStream,cc.transcriptionStream;var lc={oonacode:{hex:`#000000`,owner:`OonaCode`,d:`M0.72 12a11.28 11.28 0 1 0 22.56 0a11.28 11.28 0 1 0 -22.56 0ZM4.8 12a7.2 7.2 0 1 0 14.4 0a7.2 7.2 0 1 0 -14.4 0ZM7.44 12a4.56 4.56 0 1 0 9.12 0a4.56 4.56 0 1 0 -9.12 0Z`,fillRule:`evenodd`},anthropic:{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},"anthropic-subscription":{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},openai:{hex:`#000000`,owner:`OpenAI`,d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`},xai:{hex:`#000000`,owner:`xAI`,d:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`},deepseek:{hex:`#5786FE`,owner:`DeepSeek`,d:`M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45`},kimi:{hex:`#000000`,owner:`Moonshot`,d:`M21.765.351C22.998.351 24 1.353 24 2.586S22.998 4.82 21.765 4.82h-1.974c-.15 0-.26-.12-.26-.26V2.586A2.237 2.237 0 0 1 21.765.35M9.41 13.388l8.447-8.377c.16-.16.07-.471-.14-.471h-4.55s-.1.02-.14.06l-9.099 9.029c-.14.14-.35.02-.35-.21V4.81c0-.15-.1-.27-.221-.27H.22c-.12 0-.22.12-.22.27v18.57c0 .15.1.27.22.27h3.137c.12 0 .22-.12.22-.27v-3.79c0-.08.03-.16.08-.21l2.826-2.796c.07-.07.16-.08.241-.03l7.546 5.551a8.9 8.9 0 0 0 4.018 1.493c.12.01.23-.11.23-.27V19.76c0-.14-.08-.25-.19-.26a5.8 5.8 0 0 1-2.355-.942l-6.533-4.73c-.14-.09-.15-.32-.03-.441`},qwen:{hex:`#6950EF`,owner:`Alibaba`,d:`M23.919 14.545 20.817 9.17l1.47-2.544a.56.56 0 0 0 0-.566l-1.633-2.83a.57.57 0 0 0-.49-.283h-6.207L12.487.402a.57.57 0 0 0-.49-.284H8.732a.56.56 0 0 0-.49.284L5.139 5.775h-2.94a.56.56 0 0 0-.49.284L.077 8.887a.56.56 0 0 0 0 .567L3.18 14.83l-1.47 2.545a.56.56 0 0 0 0 .566l1.634 2.83a.57.57 0 0 0 .49.283h6.205l1.47 2.545a.57.57 0 0 0 .49.284h3.266a.57.57 0 0 0 .49-.284l3.104-5.375h2.94a.57.57 0 0 0 .49-.283l1.634-2.828a.55.55 0 0 0-.004-.568M8.733.686l1.634 2.828-1.634 2.828H21.8L20.164 9.17H7.425L5.63 6.06Zm1.306 19.801-6.205-.002 1.634-2.83h3.265L2.201 6.344h3.267q3.182 5.517 6.367 11.032zm10.124-5.66L18.53 12l-6.532 11.315-1.634-2.83c2.129-3.673 4.25-7.351 6.373-11.028h3.592l3.102 5.374z`},mimo:{hex:`#FF6900`,owner:`Xiaomi`,d:`M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z`}};function uc(e){return lc[e]??null}function dc(e){let t=e.replace(/\(.*?\)/g,` `).split(/[\s/_-]+/).filter(Boolean);return t.length===0?`?`:t.length===1?t[0].slice(0,2).toUpperCase():`${t[0][0]}${t[1][0]}`.toUpperCase()}var fc=9230,pc=1024,mc=65534,hc=`127.0.0.1`;Object.freeze({enabled:!1,port:fc,inspectMain:!1}),Object.freeze({port:null,listening:!1,fromCommandLine:!1,inspectPort:null,inspectProblem:null});function gc(e){return e+1}function _c(e){return typeof e==`number`&&Number.isInteger(e)}function vc(e){return!_c(e)||e<1024||e>65534?`The port must be a whole number from ${pc.toLocaleString(`en-US`)} to ${mc.toLocaleString(`en-US`)} (the main-process inspector takes the next one).`:null}function yc(e){return e.port!==null||e.inspectPort!==null}function bc(e,t){let n=e.enabled?e.port:null,r=e.enabled&&e.inspectMain?gc(e.port):null;return!t.fromCommandLine&&t.port!==n||t.inspectPort!==r}function xc(e){let t=[];return e.port!==null&&t.push(`${hc}:${e.port}`),e.inspectPort!==null&&t.push(`${hc}:${e.inspectPort}`),t.length===2?`${t[0]} (windows) and ${t[1]} (main process)`:e.inspectPort===null?t[0]??``:`${t[0]} (main process)`}var Sc=[`stable`,`dev`];function Cc(e){return typeof e==`string`&&Sc.includes(e)}function wc(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return Cc(t)?t:null}var Tc=[`win32`,`linux`,`darwin`],Ec=[`x64`,`arm64`];function Dc(e,t){let n=wc(e)??`stable`,r=[];return n!==`stable`&&r.push(`channel=${encodeURIComponent(n)}`),t&&Tc.includes(t.platform)&&(r.push(`platform=${t.platform}`),t.arch&&Ec.includes(t.arch)&&r.push(`arch=${t.arch}`)),r.length>0?`${qs.releasesLatest}?${r.join(`&`)}`:qs.releasesLatest}function Oc(e,t){let n=wc(t)??`stable`;return n===`stable`?e:`${e} (${n})`}var kc=5e4,Ac=6,jc=[`bg`,`surface`,`surface-2`,`surface-3`,`border`,`fg`,`fg-muted`,`fg-faint`,`accent`,`accent-fg`,`accent-soft`,`project`,`ok`,`ok-soft`,`warn`,`warn-soft`,`danger`,`danger-soft`,`think`,`think-soft`,`code-bg`,`user-bubble`],Mc={agentFinished:!1,permissionRequired:!0,errorOccurred:!0},Nc={autoAcceptPermissions:!1,showReasoningSummaries:!0,notifications:Mc,showAgentPicker:!0,transcriptWindowSize:500,openTabs:[],draftTabs:[],draftTitles:{},activeTab:null,editorLayout:null,remoteTabs:{},sessionPanelOpen:!1,explorerOpen:!1,sidebarWidth:288,sidebarPinned:!0,dismissedUpdateVersion:null,lastSeenReleaseNotes:null,claudeImportOffered:!1,claudeImportOffers:0,collapsedProjects:[],themeColors:{light:{},dark:{}},pinned:[],sidebarView:`recent`};function Pc(e){return Math.min(Math.max(typeof e==`number`&&Number.isFinite(e)?Math.floor(e):0,0),3)}function Fc(e){return Math.min(640,Math.max(200,typeof e==`number`&&Number.isFinite(e)?Math.round(e):288))}function Ic(e){return Math.min(kc,Math.max(100,typeof e==`number`&&Number.isFinite(e)?Math.round(e):500))}function Lc(e,t){return typeof e==`boolean`?e:t}function Rc(e){return typeof e==`string`&&e.length>0&&e.length<=64?e:null}function zc(e,t=50){if(!Array.isArray(e))return[];let n=[];for(let r of e)if(!(typeof r!=`string`||r.length===0||r.length>200)&&!n.includes(r)&&(n.push(r),n.length>=t))break;return n}function Bc(e,t=50){if(typeof e!=`object`||!e||Array.isArray(e))return{};let n={};for(let[r,i]of Object.entries(e))if(!(r.length===0||r.length>200)&&!(typeof i!=`string`||i.length===0||i.length>200)&&(n[r]=i,Object.keys(n).length>=t))break;return n}function Vc(e){if(typeof e!=`string`)return null;let t=e.trim();return/^#[0-9a-fA-F]{6}$/.test(t)?t.toLowerCase():null}function Hc(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(!jc.includes(n))continue;let e=Vc(r);e!==null&&(t[n]=e)}return t}function Uc(e){let t=typeof e==`object`&&e?e:{};return{light:Hc(t.light),dark:Hc(t.dark)}}function Wc(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let e=n.kind,r=n.id;if((e===`chat`||e===`project`)&&!(typeof r!=`string`||r.length===0||r.length>200)&&!t.some(t=>t.kind===e&&t.id===r)&&(t.push({kind:e,id:r}),t.length>=50))break}return t}function Gc(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return null;let n=e,r=new Set(t),i=new Set,a=0,o=(e,t)=>{if(t>Ac||typeof e!=`object`||!e)return null;let n=e,s=n.group;if(typeof s==`object`&&s&&!Array.isArray(s)){if(a>=8)return null;let e=s,t=[];for(let n of Array.isArray(e.tabs)?e.tabs:[])typeof n!=`string`||!r.has(n)||i.has(n)||(i.add(n),t.push(n));return t.length===0?null:(a+=1,{group:{tabs:t,active:(typeof e.active==`string`&&t.includes(e.active)?e.active:null)??t[t.length-1]}})}let c=n.split;if(c!==`row`&&c!==`column`)return null;let l=Array.isArray(n.children)?n.children:[],u=Array.isArray(n.sizes)?n.sizes:[],d=[],f=[];if(l.slice(0,8).forEach((e,n)=>{let r=o(e,t+1);if(!r)return;d.push(r);let i=u[n];f.push(typeof i==`number`&&Number.isFinite(i)&&i>0?i:0)}),d.length===0)return null;if(d.length===1)return d[0];let p=f.filter(e=>e>0),m=p.length>0?p.reduce((e,t)=>e+t,0)/p.length:1,h=f.map(e=>e>0?e:m),g=h.reduce((e,t)=>e+t,0);return{split:c,sizes:h.map(e=>e/g),children:d}},s=o(n.root,0);if(!s||a<2)return null;let c=n.focused;return{root:s,focused:typeof c==`number`&&Number.isInteger(c)&&c>=0&&c<a?c:0}}function Kc(e,t,n){return e.some(e=>e.kind===t&&e.id===n)}function qc(e,t,n,r){return r===Kc(e,t,n)?e:r?[...e.length>=50?e.slice(e.length-50+1):e,{kind:t,id:n}]:e.filter(e=>e.kind!==t||e.id!==n)}function Jc(e){let t=typeof e==`object`&&e?e:{},n=typeof t.notifications==`object`&&t.notifications!==null?t.notifications:{},r=zc(t.openTabs),i=zc(t.draftTabs).filter(e=>!r.includes(e)),a={};for(let[e,n]of Object.entries(Bc(t.draftTitles)))i.includes(e)&&(a[e]=n);let o=[...r,...i],s=t.activeTab,c=typeof s==`string`&&o.includes(s)?s:o[o.length-1]??null;return{autoAcceptPermissions:Lc(t.autoAcceptPermissions,Nc.autoAcceptPermissions),showReasoningSummaries:Lc(t.showReasoningSummaries,Nc.showReasoningSummaries),notifications:{agentFinished:Lc(n.agentFinished,Mc.agentFinished),permissionRequired:Lc(n.permissionRequired,Mc.permissionRequired),errorOccurred:Lc(n.errorOccurred,Mc.errorOccurred)},showAgentPicker:Lc(t.showAgentPicker,Nc.showAgentPicker),transcriptWindowSize:Ic(t.transcriptWindowSize),openTabs:r,draftTabs:i,draftTitles:a,activeTab:c,editorLayout:Gc(t.editorLayout,o),remoteTabs:Bc(t.remoteTabs),sessionPanelOpen:Lc(t.sessionPanelOpen,Nc.sessionPanelOpen),explorerOpen:Lc(t.explorerOpen,Nc.explorerOpen),sidebarWidth:Fc(t.sidebarWidth),sidebarPinned:Lc(t.sidebarPinned,Nc.sidebarPinned),dismissedUpdateVersion:Rc(t.dismissedUpdateVersion),lastSeenReleaseNotes:Rc(t.lastSeenReleaseNotes),claudeImportOffered:Lc(t.claudeImportOffered,Nc.claudeImportOffered),claudeImportOffers:Pc(t.claudeImportOffers),collapsedProjects:zc(t.collapsedProjects),themeColors:Uc(t.themeColors),pinned:Wc(t.pinned),sidebarView:t.sidebarView===`projects`?`projects`:`recent`}}new Set(Object.keys(Nc));var Yc=3650,Xc=[{version:`0.3.200`,date:`2026-10-03`,platforms:[`win32`],added:[`Everything OonaCode shows you is in credits, never in dollars: the model picker gives what an OonaCode pool model charges per 1M tokens in credits, and a chat’s spend, Usage, Conversations, Listen and the terminal all count credits. A chat on your own key or your own subscription says so instead of a price.`],fixed:[`Oonak Browser works on sites built from web components, Google’s own forms among them: it reads, finds, clicks and types inside them, where it used to answer “the page changed” or find nothing.`,`The model’s questions appear only in their own window: the chat no longer shows the question’s raw text while you answer, and afterwards keeps one line — “You answered 3 questions” — that opens to your answers.`]},{version:`0.3.200`,date:`2026-10-03`,platforms:[`linux`],added:[`Your chats now live only on the PC that runs them. Your phone, the website and your other PCs read a chat straight from its PC, through the same encrypted connection they use to continue it — OonaCode’s server no longer keeps any copy. While a PC is off or asleep its chats cannot be read from elsewhere; the window says so and they come back when it is online. Update OonaCode on each of your PCs: another device reads a PC’s chats only once that PC runs this version.`,`Everything OonaCode shows you is in credits, never in dollars: the model picker gives what an OonaCode pool model charges per 1M tokens in credits, and a chat’s spend, Usage, Conversations, Listen and the terminal all count credits. A chat on your own key or your own subscription says so instead of a price.`,`Listen has one button: Play. It writes a summary when the chat has none or has moved on, translates it once when you pick a new language, or just plays — saying only “Generating…” or “Translating…” while it works. A summary written in the last ten minutes is used for every language, so switching language never writes it again.`,`A morning briefing in View → What chats are about…: show the chats active in the last 24 hours, 3, 7, 10 or 30 days (or your own dates), tick the ones you want — or all — pick a language, a voice and a speed, and press Play. OonaCode reads each chat’s name and what it is about, one after another, with Next, Previous, Pause and Stop.`,`A chat can offer to move a task to a new chat. When a task deserves its own chat — a separate job, a chat that has grown long, work in another folder — the model proposes it with the first message written out; you can edit it, then Start new chat opens the new chat in a tab, sends the message and carries on there. Nothing starts without your yes.`,`Talk to other chats: a chat can now write to a chat whose switch is off. That chat’s switch stays off and it gets no new tools — it can only answer the chat that wrote to it. Finding a chat by name matches each word, in its name, project, folder and description, and spelling like “AI-control” or “aicontrol” no longer matters.`,`Oonak Browser acts like a person: every click, keystroke and scroll is a real input event, so sites that ignore scripted clicks now respond, and it works inside web components, Google’s own forms among them. Typing into a drop-down picks the option, and typing into an editor adds the text at its end.`,`Scheduled shows at a glance what will still run: paused tasks and one-time tasks that have already run are greyed out, with the day they will be removed — 10 days after their last change.`,`Settings → Developer → Allow debugging: opens a debugging port on this PC only, so a developer can look at and drive the app while fixing a problem with you. Off by default; while it is on, every window shows a red “Debugging on” badge.`],fixed:[`A chat keeps its Build / Plan / Ask first / Autonomous choice, and every device shows the same one. A chat set to “Ask first” now asks you before acting even when this PC answers prompts by itself.`,`A chat no longer ends up on a model nobody picked for it: a model the provider does not offer is refused instead of quietly switching the chat to the provider’s default, and Enter in the model picker no longer picks the row under the mouse pointer.`,`Chats talking to each other no longer ping-pong: a reply needs no answer, several messages from the same chat are read together in one turn, and a message card says “answer requested” until the answer has gone back, then “answered” with the time.`,`A tool you switch on while a chat is replying works for the message you send next, even mid-reply. After an update, a chat that had background tasks running shows one line saying how many stopped, instead of one card per task.`,`The model’s questions appear only in their own window: the chat no longer shows the question’s raw text while you answer, and afterwards keeps one line — “You answered 3 questions” — that opens to your answers.`,`A model your plan does not include now says “not in your plan”, instead of “Failed to authenticate … sign-in needed”.`,`A long message waiting in the queue no longer hides its “Send now” button: it is folded to a few lines, with Show all to read the rest.`,`The account window no longer stays on “offline · vault event stream responded 503” after a short server interruption.`]},{version:`0.3.199`,date:`2026-10-02`,platforms:[`win32`],added:[`Talk to other chats: a chat can now write to a chat whose switch is off. That chat’s switch stays off and it gets no new tools — it can only answer the chat that wrote to it. Finding a chat by name is smarter too: each word is matched, in its name, project, folder and description, and spelling like “AI-control” or “aicontrol” no longer matters.`,`Oonak Browser acts like a person: every click, keystroke and scroll is a real input event, so sites that ignore scripted clicks now respond. Typing into a drop-down picks the option, and typing into an editor adds the text at its end.`],fixed:[`A chat no longer ends up on a model nobody picked for it: a model the provider does not offer is refused instead of quietly switching the chat to the provider’s default, and Enter in the model picker no longer picks the row under the mouse pointer.`]},{version:`0.3.198`,date:`2026-10-01`,platforms:[`win32`],added:[`Listen has one button: Play. It writes a summary when the chat has none or has moved on, translates it once when you pick a new language, or just plays — saying only “Generating…” or “Translating…” while it works. A summary written in the last ten minutes is used for every language, so switching language never writes it again.`],fixed:[`A chat keeps its Build / Plan / Ask first / Autonomous choice, and every device shows the same one — the phone used to show “Ask first” for a Build chat. A chat set to “Ask first” now asks you before acting even when this PC answers prompts by itself.`,`Play in Listen is never greyed out for want of a voice: it gets the text ready and names the voice to install.`]},{version:`0.3.197`,date:`2026-10-01`,platforms:[`win32`],added:[`Oonak Browser, the browser your chats use, moves to version 151 by itself at its next use: a build with no Google services (no Safe Browsing warnings, push notifications or search suggestions). The download is checked against its fingerprint before anything is unpacked, and the old version is removed once no chat’s browser still runs from it.`],fixed:[`A model your plan does not include now says “not in your plan”, instead of “Failed to authenticate … sign-in needed”.`]},{version:`0.3.196`,date:`2026-10-01`,platforms:[`win32`],added:[`Your chats now live only on the PC that runs them. Your phone, the website and your other PCs read a chat straight from its PC, through the same encrypted connection they use to continue it — OonaCode’s server no longer keeps any copy. While a PC is off or asleep its chats cannot be read from elsewhere; the window says so and they come back when it is online. Update OonaCode on each of your PCs: another device reads a PC’s chats only once that PC runs this version.`],fixed:[`The account window no longer stays on “offline · vault event stream responded 503” after a short server interruption: the next sync that works clears it by itself.`]},{version:`0.3.195`,date:`2026-10-01`,platforms:[`win32`],added:[],fixed:[`Chats talking to each other no longer ping-pong. A message asks for an answer only when the chat really needs one; a reply needs no answer and is not answered with a new message; and several messages waiting from the same chat are read together in one turn. Fewer wake-ups, fewer tokens.`,`A message card says what is true: “answer requested” until the answer has gone back, then “answered” with the time — instead of an orange “reply expected” that never went away.`]},{version:`0.3.194`,date:`2026-10-01`,platforms:[`win32`],added:[`A chat can offer to move a task to a new chat. When a task deserves its own chat — a separate job, a chat that has grown long, work in another folder — the model proposes it with the first message written out; you can edit it, then Start new chat opens the new chat in a tab, sends the message and carries on there. Nothing starts without your yes.`,`Settings → Developer → Allow debugging: opens a debugging port on this PC only, so a developer can look at and drive the app while fixing a problem with you. Off by default; while it is on, every window shows a red “Debugging on” badge.`],fixed:[]},{version:`0.3.193`,date:`2026-10-01`,platforms:[`win32`],added:[],fixed:[`A tool you switch on while a chat is replying works for the message you send next, even mid-reply: that message now waits for the chat to restart with the new tool instead of reaching the model without it.`,`After an update, a chat that had background tasks running shows one line — “11 background tasks stopped — they were running when OonaCode restarted this chat” — instead of one card per task. Click it to see each one.`]},{version:`0.3.192`,date:`2026-09-30`,platforms:[`win32`],added:[`A morning briefing in View → What chats are about…: show the chats active in the last 24 hours, 3, 7, 10 or 30 days (or your own dates), tick the ones you want — or all — pick a language, a voice and a speed, and press Play. OonaCode reads each chat’s name and what it is about, one after another, with Next, Previous, Pause and Stop. Other languages are translated once and kept, so hearing the same briefing again costs nothing.`],fixed:[]},{version:`0.3.191`,date:`2026-09-30`,platforms:[`win32`],added:[`Scheduled shows at a glance what will still run: paused tasks and one-time tasks that have already run are greyed out, with the day they will be removed. They are deleted by themselves 10 days after their last change; resuming or editing a paused task gives it another 10 days.`],fixed:[]},{version:`0.3.190`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`A long message waiting in the queue no longer hides its “Send now” button: it is folded to a few lines, with Show all to read the rest.`]},{version:`0.3.189`,date:`2026-09-30`,platforms:[`linux`],added:[`Split views, like VS Code: drag a chat tab to the left, right, top or bottom of the chat area to open it beside the other one — a shaded area shows where it will land. Every chat on screen works on its own, with its own replies streaming and its own message box. Drag the divider to resize; Ctrl+\\ splits the current tab to the right, Ctrl+1, Ctrl+2… jump between views, and a tab’s menu has Split right, Split down and Move to other group.`,`Chats in windows of their own, like Chrome tabs: drag a tab out of the window, or choose “Move to new window” in its menu, and it opens in its own window; “Move to main window” brings it back. On Wayland desktops the new window opens at the usual place rather than under the pointer. Your split views and windows come back when you restart OonaCode.`,`Every language plays in Listen to a chat: each language picks the best voice on its own — OonaCode’s Armenian voices first, then your system’s voices, then eSpeak (install the espeak-ng package if your system has no voice for a language).`],fixed:[`Picking another language for a summary no longer needs a new summary: Play translates the one you have, keeps the translation, shows it and plays it.`,`“Summarise now” says “Up to date — nothing to summarise” while the chat has not changed, instead of seeming to do nothing.`]},{version:`0.3.188`,date:`2026-09-30`,platforms:[`win32`],added:[`Split views, like VS Code: drag a chat tab to the left, right, top or bottom of the chat area to open it beside the other one — a shaded area shows where it will land. Every chat on screen works on its own, with its own replies streaming and its own message box. Drag the divider to resize; Ctrl+\\ splits the current tab to the right, Ctrl+1, Ctrl+2… jump between views, and a tab’s menu has Split right, Split down and Move to other group.`,`Chats in windows of their own, like Chrome tabs: drag a tab out of the window, or choose “Move to new window” in its menu, and it opens in its own window. Drag it back onto the main window’s tabs, or choose “Move to main window”, to bring it back. Your split views and popped-out windows come back when you restart OonaCode.`],fixed:[]},{version:`0.3.187`,date:`2026-09-30`,platforms:[`win32`],added:[`Every language plays in Listen to a chat. Persian, Georgian, Ukrainian — and any language whose Windows voice is not installed — now speak with eSpeak, a free voice that comes with OonaCode (it sounds robotic, but it always works). Each language picks the best voice on its own: OonaCode’s Armenian voices first, then Windows’ own, then eSpeak.`],fixed:[`Picking another language for a summary no longer needs a new summary: Play translates the one you have, keeps the translation, shows it and plays it.`,`“Summarise now” says “Up to date — nothing to summarise” while the chat has not changed, instead of seeming to do nothing.`]},{version:`0.3.186`,date:`2026-09-30`,platforms:[`linux`],added:[`Listen to a chat: right-click a chat → Listen to this chat…, or the speaker button beside the chat’s title. The chat’s own model writes a short spoken summary — the goal, what was done, where it stands, what is left — and OonaCode reads it aloud on this PC, in the voice and at the speed you choose. Every summary is kept with its date, so you can play it again at any time; a new one is written only when the chat has moved on. Other languages are translated once and kept with the summary.`,`OonaCode brings two Armenian voices of its own, Astgh and Artsiv, and also speaks with your system’s voices through speech-dispatcher — install speech-dispatcher and espeak-ng for Persian, Russian and every other language; the Listen window names the packages for your distribution.`,`Listen to a chat from your phone: the OonaCode app’s 🔊 Listen reaches this PC’s summaries and plays them with the phone’s own voices. It needs this update on the PC and the next OonaCode app on the phone.`,`See where your credits go: Account → Usage. Pick the last 24 hours, 7, 30 or 90 days or your own dates, by hour or by day, for the coding agent or your API keys apart. A chart shows the credits over time by model or by what they were for, and the lists below give every model with its tokens and price, and every use — chat turns, a chat’s “about”, images, speech and the rest.`,`The chat list is laid out like the Claude desktop app: New, Projects, Scheduled, then your pinned chats and projects, then Today and Older. The old grouping by project is one click away — the small icon beside “Today”.`,`Projects opens a page of project cards — each with its goal, its chats and when it was last used — with search, sort and New project. Click a card to see that project’s chats, instructions and settings, and to start a new chat in it.`,`Scheduled shows every scheduled task from every chat on this PC in one place, with its next run, its chat, and pause, resume and delete. Pin any chat or project to the top of the list from its menu.`,`Claude Sonnet 5.5 is in the model picker — on the OonaCode pool and on your own Claude subscription — with a 1M-token context. It costs the same as Sonnet 5 per token and usually needs fewer tokens for the same work.`,`Type / at the start of a message to see the chat’s commands and skills, with what each does, in two titled sections. Type to narrow the list, then Enter or Tab. They work with every model, not only Claude.`,`Each chat has a Skills list beside Tools. Every skill starts off, so the model sees none of them and they cost nothing; switch one on to let the model use it by itself in that chat. Typing /name still runs any skill for one turn.`,`Your own skills: Settings → Skills lists the skills OonaCode gives every chat, and “Import from Claude Code…” copies the ones you choose from your Claude Code install — it only reads it, never changes it.`,`In the terminal app (oona), a command the chat’s engine knows — /context, /compact or a skill — now runs instead of answering “unknown command”.`,`Search in the Import window: find a chat by its name, its first or last message or its folder, or pick “Whole conversations” to search inside the chats themselves.`],fixed:[`Import chats shows every chat on this PC, grouped by the app it came from, with nothing folded away. Each row says whether it is new, already imported, moved on since, or deleted by you in OonaCode. Nothing is ticked when you open it yourself: search for a chat and tick it, or tick a whole group at once.`,`The message box fits a narrow chat: its buttons and pickers move onto a second line and the box grows to hold them — Stop and Queue no longer slip outside it.`,`Claude’s thoughts show their words again. Every “Thought” from Claude Opus, Sonnet and Fable came back empty — Anthropic leaves the text out unless it is asked for a summary, and now OonaCode asks. Only new replies change.`,`A chat’s “about” no longer starts in the middle of a sentence when the model wrote a long answer.`,`Commands that only duplicated OonaCode’s own controls or showed misleading numbers are gone from the / menu — /model, /usage, /autocompact, /output-style, /mcp, /list-agents and /reload-skills. Typed, they say why.`,`Skills you import or remove in Settings → Skills reach your chats by themselves, at each chat’s next message.`,`Claude Sonnet 5 is retired: a chat that was on it moves to Sonnet 5.5 at its next message.`,`The engine’s built-in keyboard-shortcuts helper is turned off: it would have edited your own Claude Code settings.`,`Typing /model in a chat updates the chat’s model and the model picker again, and command output such as /context reads the same while it arrives and after you reopen the chat.`,`A chat row’s ⋯ button shows only when you point at the row.`]},{version:`0.3.185`,date:`2026-09-30`,platforms:[`win32`],added:[`Listen to a chat from your phone: the OonaCode app’s 🔊 Listen reaches this PC’s summaries and plays them with the phone’s own voices. It needs this update on the PC and the next OonaCode app on the phone.`],fixed:[`Listening with a Windows voice no longer stops after the first sentence when the voice fails to say it has finished.`]},{version:`0.3.184`,date:`2026-09-30`,platforms:[`win32`],added:[`Listen to a chat: right-click a chat → Listen to this chat…, or the speaker button beside the chat’s title. The chat’s own model writes a short spoken summary — the goal, what was done, where it stands, what is left — and OonaCode reads it aloud on this PC, in the voice and at the speed you choose. Every summary is kept with its date, so you can play it again at any time; a new one is written only when the chat has moved on. Other languages are translated once and kept with the summary.`],fixed:[`A chat’s “about” no longer starts in the middle of a sentence when the model wrote a long answer.`]},{version:`0.3.183`,date:`2026-09-30`,platforms:[`win32`],added:[`See where your credits go: Account → Usage. Pick the last 24 hours, 7, 30 or 90 days or your own dates, by hour or by day, for the coding agent or your API keys apart. A chart shows the credits over time by model or by what they were for, and the lists below give every model with its tokens and price, and every use — chat turns, a chat’s “about”, images, speech and the rest.`],fixed:[]},{version:`0.3.182`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`Import chats shows every chat on this PC, grouped by the app it came from — Claude Code, the Claude app, Qwen Code, Cursor — with nothing folded away. Each row says whether it is new, already imported, moved on since, or deleted by you in OonaCode. Nothing is ticked when you open it yourself: search for a chat and tick it, or tick a whole group at once. The Import button says how many chats it will bring over.`]},{version:`0.3.181`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`The message box fits a narrow chat. In a small window, or with the side panels open, its buttons and pickers move onto a second line and the box grows to hold them — Stop and Queue no longer slip outside it, and the model and effort pickers keep their words readable.`]},{version:`0.3.180`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`Claude’s thoughts show their words again. Every “Thought” from Claude Opus, Sonnet and Fable came back empty — Anthropic leaves the text out unless it is asked for a summary, and now OonaCode asks. Other models were never affected. Only new replies change; older thoughts stay empty.`]},{version:`0.3.179`,date:`2026-09-29`,platforms:[`win32`],added:[],fixed:[`The / menu is easier to read: skills and commands in two titled sections, each with one short line — the full description shows when you point at it.`,`Commands that only duplicated OonaCode’s own controls or showed misleading numbers are gone from the / menu — /model (use the model picker), /usage (the engine’s own estimate, not your credits), /autocompact, /output-style, /mcp, /list-agents and /reload-skills. Typed, they say why.`,`Skills you import or remove in Settings → Skills reach your chats by themselves, at each chat’s next message.`]},{version:`0.3.178`,date:`2026-09-29`,platforms:[`win32`],added:[`The chat list is laid out like the Claude desktop app: New, Projects, Scheduled, then your pinned chats and projects, then Today and Older. The old grouping by project is one click away — the small icon beside “Today”.`,`Projects opens a page of project cards — each with its goal, its chats and when it was last used — with search, sort and New project. Click a card to see that project’s chats, instructions and settings, and to start a new chat in it.`,`Scheduled shows every scheduled task from every chat on this PC in one place, with its next run, its chat, and pause, resume and delete. A dot on it tells you when something is due soon.`,`Pin any chat or project to the top of the list from its menu.`],fixed:[`A chat row’s ⋯ button shows only when you point at the row.`]},{version:`0.3.177`,date:`2026-09-29`,platforms:[`win32`],added:[`Claude Sonnet 5.5 is in the model picker — on the OonaCode pool and on your own Claude subscription — with a 1M-token context. It costs the same as Sonnet 5 per token and usually needs fewer tokens for the same work.`],fixed:[`Claude Sonnet 5 is retired: a chat that was on it moves to Sonnet 5.5 at its next message, and the picker shows Sonnet 5.5.`]},{version:`0.3.176`,date:`2026-09-29`,platforms:[`win32`],added:[`Each chat has a Skills list beside Tools. Every skill starts off, so the model sees none of them and they cost nothing — about 1,400 tokens on every message until now. Switch one on to let the model use it by itself in that chat; the list shows what each one costs per message while on.`,`Typing /name still runs any skill for one turn, whether its switch is on or off.`],fixed:[`The engine’s built-in keyboard-shortcuts helper is turned off: it would have edited your own Claude Code settings.`]},{version:`0.3.175`,date:`2026-09-29`,platforms:[`win32`],added:[`Type / at the start of a message to see the chat’s commands and skills — the Claude Code engine’s own (/compact, /context, /review, /security-review, /init and more) and the skills in your project’s .claude folder — with what each does. Type to narrow the list, then Enter or Tab. They work with every model, not only Claude.`,`Your own skills: Settings → Skills lists the skills OonaCode gives every chat, and “Import from Claude Code…” copies the ones you choose from your Claude Code install — it only reads it, never changes it.`,`In the terminal app (oona), a command the chat’s engine knows — /context, /compact or a skill — now runs instead of answering “unknown command”.`],fixed:[`Typing /model in a chat updates the chat’s model and the model picker again.`,`Command output such as /context reads the same while it arrives and after you reopen the chat.`]},{version:`0.3.174`,date:`2026-09-28`,platforms:[`win32`],added:[`Search in the Import window. Type to find a chat by its name, its first or last message, or its folder — chats folded away as already imported or deleted here show up too when they match. Or open the search options and pick “Whole conversations” to search inside the chats themselves, with a few lines of each match under the chat. It only reads Claude Code, Cursor and the Claude app’s files, never changes them.`],fixed:[`Chats Claude Code switched to another model are answered by that model for real: OonaCode’s pool now serves the model the engine falls back to, and never answers a Claude request with another company’s model.`]},{version:`0.3.173`,date:`2026-09-28`,platforms:[`linux`],added:[`Every chat now has an “about”: a short note, written in the background by a cheap helper model of the chat’s own provider, saying what the chat works on. Your other chats read it — with each chat’s folder and when it was last active — when they look for the right chat to ask. See it, edit it or press Regenerate in the session info panel.`,`View → What chats are about… (and a sidebar button) lists every chat’s about and what writing them cost, with a switch to turn it off and “Generate for all chats now”. The switch and its numbers are also in Settings → This PC.`,`Your phone can now do from anywhere what this PC’s window does: switch each tool on or off per chat, see and control the conversations between your chats, read, edit and regenerate each chat’s “about”, and manage scheduled tasks. It needs this update on the PC and the next OonaCode app on the phone.`,`A chat can switch its own workspace. When the work belongs in another folder — a project you name that lives elsewhere, or a new project folder — the model proposes the switch and you answer Switch or Not now. It always asks you, even with “accept automatically” on, and the chat moves when its current step ends, with the conversation kept.`,`Right-click a chat tab → Delete (in red, under “Close all tabs”) deletes that chat after asking, just like Delete in the sidebar.`,`When Anthropic’s safeguards flag a chat and Claude Code moves it to another model for the rest of the run, the model box says so in red — for example “Opus 4.8 (safeguard)” — and the chat shows a notice at the switch. Picking a model takes the chat back to it at the next message.`],fixed:[`Typing in the message box while a chat is replying is no longer interrupted. With “accept automatically” on, an approval card flashed for an instant on some tool calls and took the cursor away from the box.`,`A permission card that appears while you are typing no longer takes the keyboard, so your next Space or Enter can never press Allow by accident.`,`“Send now” stays disabled and says “Sending now…” until the agent has taken the message — it can take a few seconds while the agent stops its current step, and a second press can no longer send it twice.`,`A message sent from your phone is confirmed by this PC, and the same message is never run twice when the phone sends it again after a lost connection.`,`File and folder names in a reply get their ▶, Open and Show in folder buttons only when they really exist on this PC. A bare file name is also looked for in the folder the reply named just before it.`,`A chat can no longer be moved into your home folder or the root folder through a link. Where /home is itself a link (Fedora Silverblue, Bazzite and similar systems), the home folder passed as an ordinary folder, and the chat would have loaded your own Claude Code settings as its project.`,`Signing in to your own Claude subscription inside the app works on Ubuntu 24.04, Debian, Linux Mint, Pop!_OS and Zorin OS again. There, a part of OonaCode built for newer systems did not load, and the sign-in fell back to a command you had to paste.`,"On Ubuntu, Linux Mint, Pop!_OS, Zorin OS and similar systems, `oona` now works in every new terminal right after you install or update. The installer used to leave it off your PATH until you logged out and back in; now it adds it for new terminals itself, and `oona uninstall` takes that line out again.",`Every way of uninstalling — “oona uninstall”, or the install command with --uninstall — now takes this PC off your account: keep your chats and they stay readable on your other devices; delete them and their copies go too. It never touches your Claude Code or the Claude app, and “oona uninstall” no longer gives up when the background service is stopped.`,`The installer now says at once when a system cannot run OonaCode — one older than Ubuntu 22.04, Debian 12 or RHEL 9, or one built on musl such as Alpine — instead of installing a copy that could not start. The .deb and .rpm tell apt and dnf the same.`]},{version:`0.3.172`,date:`2026-09-28`,platforms:[`win32`],added:[`When Anthropic’s safeguards flag a chat and Claude Code moves it to another model for the rest of the run, the model box says so in red — for example “Opus 4.8 (safeguard)” — and the chat shows a notice at the switch. Picking a model takes the chat back to it at the next message.`],fixed:[`Uninstalling from Settings → Apps now also takes this PC off your account, exactly like “oona uninstall”: keep your chats and they stay readable on your other devices; delete them and their copies go too.`,`“oona uninstall” no longer gives up when the background service is stopped.`,`The “Updating OonaCode…” window shows again on the newest Windows 11 versions (24H2 and later).`]},{version:`0.3.171`,date:`2026-09-28`,platforms:[`win32`],added:[`Oonak Browser now picks its own control port from a range no developer tool uses by default, so it can no longer take a port that Shopify CLI or a dev server wants. If a program needs a particular port kept free, or you want the browser on a specific one, just ask the chat.`],fixed:[`File and folder names in a reply get their ▶, Open and Show in folder buttons only when they really exist on this PC. A bare file name is also looked for in the folder the reply named just before it.`,`Uninstalling OonaCode from Settings → Apps now removes all of it — the app, the command line and its background service — and asks whether to keep your chats. Installing again afterwards no longer says it is already installed. Your Claude Code and Claude app are never touched.`,`“oona uninstall” works again on Windows 11.`,`A chat “about” you wrote yourself no longer shows “stale”.`]},{version:`0.3.170`,date:`2026-09-28`,platforms:[`win32`],added:[`Your phone can now do from anywhere what this PC’s window does: switch each tool on or off per chat, see and control the conversations between your chats, read, edit and regenerate each chat’s “about”, and manage scheduled tasks. It needs this update on the PC and the next OonaCode app on the phone.`],fixed:[`“Send now” stays disabled and says “Sending now…” until the agent has taken the message — it can take a few seconds while the agent stops its current step, and a second press can no longer send it twice.`,`A message sent from your phone is confirmed by this PC, and the same message is never run twice when the phone sends it again after a lost connection.`]},{version:`0.3.169`,date:`2026-09-28`,platforms:[`win32`],added:[`Every chat now has an “about”: a short note, written in the background by a cheap helper model of the chat’s own provider, saying what the chat works on. Your other chats read it — with each chat’s folder and when it was last active — when they look for the right chat to ask. See it, edit it or press Regenerate in the session info panel.`,`View → What chats are about… (and a sidebar button) lists every chat’s about and what writing them cost, with a switch to turn it off and “Generate for all chats now”. The switch and its numbers are also in Settings → This PC.`],fixed:[`A chat can no longer be moved into your user folder or a drive root through a link or junction that points there — its project settings would have been your own Claude Code settings.`]},{version:`0.3.167`,date:`2026-09-27`,platforms:[`win32`],added:[`A chat can switch its own workspace. When the work belongs in another folder — a project you name that lives elsewhere, or a new project folder — the model proposes the switch and you answer Switch or Not now. It always asks you, even with “accept automatically” on, and the chat moves when its current step ends, with the conversation kept.`],fixed:[]},{version:`0.3.166`,date:`2026-09-27`,platforms:[`win32`],added:[],fixed:[`Typing in the message box while a chat is replying is no longer interrupted. With “accept automatically” on, an approval card flashed for an instant on some tool calls and took the cursor away from the box.`,`A permission card that appears while you are typing no longer takes the keyboard, so your next Space or Enter can never press Allow by accident.`]},{version:`0.3.165`,date:`2026-09-27`,platforms:[`win32`],added:[`Right-click a chat tab → Delete (in red, under “Close all tabs”) deletes that chat after asking, just like Delete in the sidebar.`,`Chats now use Oonak Browser, in a window you can see, for everything that needs a web browser — not Chrome, Edge or a hidden script browser — unless you name another browser. It runs without a window (headless) only when you ask for that.`],fixed:[`After an update, the background service comes back by itself. An update could leave it unable to restart, and the app then showed “OonaCode could not start its host service” even though it went on to open normally.`]},{version:`0.3.164`,date:`2026-09-27`,platforms:[`win32`],added:[`Send now: a message you typed while the agent works has a Send now button while it waits. It stops what the agent is doing right now and sends your message immediately — the step that is running is cut. On the desktop and the phone.`,`Conversations → Map: see at a glance which chats are talking to each other. Each conversation is a hub with a line to each of its chats; working chats pulse; click a hub for its history or a chat to open it.`],fixed:[`A restart no longer signs this PC out when OonaCode’s stored key cannot be opened for a moment. OonaCode used to replace the key and lose your sign-in; it now keeps the key and signs you back in by itself as soon as it opens.`]},{version:`0.3.163`,date:`2026-09-27`,platforms:[`linux`],added:[`Send now: a message you typed while the agent works has a Send now button while it waits. It stops what the agent is doing right now and sends your message immediately — the step that is running is cut. On the desktop and the phone.`,`Conversations → Map: see at a glance which chats are talking to each other. Each conversation is a hub with a line to each of its chats; working chats pulse; click a hub for its history or a chat to open it.`],fixed:[`A restart no longer signs this PC out when its security chip is slow to open OonaCode’s stored key. After a system update and reboot, the chip on some machines refuses for a while; OonaCode used to replace the key and lose your sign-in. It now keeps the key and signs you back in by itself as soon as the chip opens it.`]},{version:`0.3.162`,date:`2026-09-27`,added:[],fixed:[`A chat switched to another model knows which model it is. After a switch from Claude to DeepSeek, the model used to keep saying it was Claude — the chat history and Claude Code’s own prompt told it so.`,`Oonak Browser is offered only where it can run. An older OonaCode no longer lists a browser tool it cannot use, so the model does not spend tokens working around it — update to get the browser.`]},{version:`0.3.161`,date:`2026-09-27`,added:[`Settings → This PC → “Replace pictures older than N days”: screenshots and pasted pictures in your chat history are replaced by a short note once they are older than a year (you choose the number, or 0 to keep them). The words of every chat stay; the database stops growing with pictures. It runs by itself.`],fixed:[`The model, Build/Plan/Ask and effort pickers under the message box now look like the dropdowns they are.`,`Switches that are off are easy to see in dark mode.`,`Error messages show what went wrong in words, without raw tags or a provider’s JSON.`,`The ✕ that removes an attachment or a reply is round.`,`Pressing Stop, or an update cutting a turn, no longer files an automatic bug report.`]},{version:`0.3.160`,date:`2026-09-27`,added:[`On Windows, the agent can use a real browser. Ask it to open a site, read a page, click, fill in a form or take a screenshot, and it does it in Oonak Browser, in a window you can see. The first time, OonaCode asks once to install the browser (about 210 MB); after that it opens straight away.`,`Each chat has its own browser profile, so a site you sign in to stays signed in for that chat. Switch the browser off for a chat in its Tools menu.`],fixed:[]},{version:`0.3.159`,date:`2026-09-27`,added:[],fixed:[`A chat reopened after an update no longer says “turn complete” the instant you send a message and then answer anyway. The engine’s own note about work that stopped during the update used to be taken for the end of your turn, with the whole earlier conversation’s tokens on the line.`,`A background task that stopped because OonaCode restarted now says so in plain words, instead of “Orphaned by a previous Claude Code process exit”.`]},{version:`0.3.158`,date:`2026-09-27`,added:[`Every thought in a chat shows how many words it has, so you can tell at a glance whether there is anything to read.`],fixed:[`A thought with nothing in it — some models return only a signature for their thinking — now says “Thought · empty” and no longer opens onto a blank box.`,`A command the agent was allowed to run no longer leaves an “Allowed Bash (automatically)” line under its own card: the card already shows the command and its result. Refusals are still shown.`]},{version:`0.3.157`,date:`2026-09-27`,added:[`On Linux, OonaCode has its own signed apt and dnf repositories. Install the app with apt (Debian, Ubuntu, Mint) or dnf (Fedora, RHEL, Rocky, Alma) — the commands are on the download page — and your package manager keeps it up to date with the rest of the system.`,`Every Linux release is signed with the OonaCode release key, and the one-line installer checks that signature before it installs anything.`],fixed:[`On Linux, the menu bar is drawn in the window in the app’s own colours, and it switches between light and dark with the app instead of keeping the desktop’s theme until a restart.`,`Upgrading the .rpm no longer removes the oonacode command, and removing it no longer leaves empty folders behind.`]},{version:`0.3.156`,date:`2026-09-27`,added:[`Chats can talk to each other. Turn on “Talk to other chats” in a chat’s Tools menu, and its agent can find your other chats that have it on, read them, and ask them for help — one chat or a whole group. A chat that is closed wakes up to answer; a busy one answers when it finishes. The reply comes back to the chat that asked.`,`The Conversations window (in the sidebar) shows every conversation between your chats: who said what to whom, what each answer cost, and buttons to pause, resume, close or stop them all. Each conversation has a budget — 20 messages and 1,000,000 new tokens by default — and pauses itself when it is used up, so chats can never talk forever.`,`Hover over any tool in a chat’s Tools menu to read what it does, how it works, what it costs and how to turn it off.`],fixed:[`A chat woken in the background — by a scheduled task or another chat — shows as working in the sidebar even when it is not open in a tab.`,`A scheduled task no longer slips into a chat at the same moment you send it a message; yours always goes first.`,`A message sent from the terminal no longer waits forever when a chat’s history cannot be resumed and the restart fails. It now says why.`,`Notes OonaCode writes into a chat — a model change, a conversation paused — are still there when you reopen it.`,`When every Claude seat in the OonaCode pool is taken, a new chat now says the model is busy and to try again in a few minutes or pick another model, instead of “Something went wrong on our side”.`,`On Linux, the app tells you it is updating while it swaps itself, so there is no need to start it again.`,`On Linux, removing the .deb or .rpm leaves nothing running and nothing failing at the next login, and the one-line installer checks for free disk space before it changes anything.`]},{version:`0.3.155`,date:`2026-09-27`,added:[`OonaCode runs on Linux. One command installs the command line, the background service and the desktop app: curl -fsSL https://oonacode.oonak.ai/install.sh | bash. The AppImage, .deb and .rpm are on the download page too.`,`On Linux the app lives in the system tray as it does on Windows, follows your desktop’s light or dark theme, and gets its own entry in the applications menu.`,`Uninstalling on Linux removes the desktop app along with the rest, and asks whether to keep your chats for a future install.`],fixed:[`A window no longer stays on “Unauthorized” after the background service restarts with a new key. It reconnects by itself.`]},{version:`0.3.154`,date:`2026-09-26`,added:[],fixed:[`A chat waiting on a long job no longer loses its watcher. OonaCode used to close a chat’s engine ten minutes after the model last spoke, which stopped any Monitor or background command it had left running. The engine now stays up while such work runs, up to 12 hours.`,`A chat moved into a project, or whose project you edit, now follows the project’s instructions from its next message. It used to keep the ones it started with.`]},{version:`0.3.153`,date:`2026-09-25`,added:[],fixed:[`A very long chat no longer answers “Prompt is too long” after OonaCode restarts or updates. The engine was judging the chat’s size by a figure left over from before the restart, and now gets an accurate one.`,`If a message is ever refused as too long before the model has started on it, OonaCode sends it again by itself with a shorter history. You see your message once and then the answer, not an error.`]},{version:`0.3.152`,date:`2026-09-25`,added:[],fixed:[`Uninstalling the app from Windows’ Apps list no longer stops the command-line OonaCode on the same PC from starting after a restart.`]},{version:`0.3.151`,date:`2026-09-25`,added:[`Files the agent names in a chat are clickable. Audio and video play right in the chat with a small player, pictures open as a preview, and in the app every file can be opened in its own program or shown in its folder.`,`Uninstalling the app asks whether to keep your chats on this PC. Keeping them means a new install signs in and continues every chat.`],fixed:[`Installing and updating no longer fail with “The operation has timed out” on PCs whose network drops the newer internet addresses, nor while our server restarts for an update.`]},{version:`0.3.150`,date:`2026-09-25`,added:[],fixed:[`The fix in 0.3.149 for long, sleeping turns now really reaches the agent: the Monitor tool and the block on long waits are on for every chat.`,`A chat compacted after a long pause no longer pays to cache a conversation it is about to replace, and the agent keeps each tool call in its history exactly as it wrote it — both as Claude Code does.`]},{version:`0.3.149`,date:`2026-09-25`,added:[`The agent can watch a long job with the Monitor tool, as Claude Code does, and is woken the moment the job finishes.`],fixed:[`Long chats no longer spend their time asleep. With no way to watch a background job, the agent had been polling it with waits of four to eight minutes. One chat spent more than three and a half hours of a day sleeping, and turns ran for hours while the model worked for a fraction of that. The agent now gets the same working rules as Claude Code, and long waits are blocked.`]},{version:`0.3.148`,date:`2026-09-25`,added:[],fixed:[`A scheduled task that could not be sent — the PC had just restarted, the vault was still locked, the server was not reachable yet — waits and tries again instead of switching itself off. Pausing, editing or deleting a task while its prompt is being sent is no longer undone, and a scheduled prompt no longer lands in a chat whose engine is still starting.`,`A chat on your own DeepSeek key, or one switched with a typed “/model opus”, is no longer shown as withdrawn and locked. “/model fable” picks Claude Fable instead of the default model.`,`Moving a chat to another model no longer lowers its saved effort level to what the old model offered, and a one-off “oona --effort” is no longer saved as the chat’s level.`,`After you pick another model for a locked chat and send, the chat no longer flashes the lock again while the engine starts; if the start fails, your pick is kept.`,`Coming back from a file tab no longer jumps the chat to an old reply or reopens the search bar.`,`The hidden sidebar slides away again when the pointer leaves the window past its edge, and the keyboard no longer tabs through it while it is hidden. Clicking ⓘ in Settings opens its note instead of closing it.`,`Subagents write their prompt cache for five minutes, as Claude Code does for its subscribers; the chat itself keeps the hour. Their cache writes cost less.`]},{version:`0.3.147`,date:`2026-09-25`,added:[`A chat’s scheduled tasks sit beside its subagents: a clock badge says how many are live and when the next one runs, and opens the list — each task’s schedule, its next and last run, Pause and Delete. The tasks run on this PC.`],fixed:[`A prompt the scheduler sends into a chat reads as a “Scheduled task” line, not as your own message waiting in the queue.`,`A chat whose model is no longer offered shows that model in red and waits for you to pick another; its history stays, and the old model is not in the list any more.`,`The effort list follows the server within minutes, without restarting the app. A chat set to a level that has been switched off moves to the nearest one — ultracode becomes xhigh. Chats on your own Claude subscription have an effort picker again.`]},{version:`0.3.146`,date:`2026-09-25`,added:[`A Tools menu beside the model picker: switch OonaCode’s own tools on or off for each chat — browser, desktop and window control, clipboard, screen capture, Office documents and run-as-administrator. Each tool costs the model only a short line until it is used, and the menu shows how much. The first tools are marked Demo while they are tested with every model: a demo tool answers what it would have done, and does nothing on your PC yet.`],fixed:[]},{version:`0.3.145`,date:`2026-09-25`,added:[],fixed:[`Every request of every chat, on every model, is about 3,200 tokens smaller: the engine’s own “auto memory” instructions are gone. OonaCode starts each engine in a fresh private folder and deletes it afterwards, so the notes the model was told to keep there were thrown away when the chat went idle — the model spent tool calls writing memories it would never read. A project’s memory is OonaCode’s own and stays.`,`The engine’s claude.ai Artifact tools are switched off everywhere OonaCode runs it — the app, the terminal, VS Code, the phone, Telegram and the agent API.`]},{version:`0.3.144`,date:`2026-09-25`,added:[],fixed:[`Long chats on Claude models in the OonaCode pool keep their cache for an hour, as Claude Code does for its subscribers. A pause of more than five minutes no longer re-sends the whole conversation at the full cache-write price, which in a large chat was the most expensive part of coming back to it.`,`The session panel’s Context shows how big the conversation is now, not the total of every request the chat ever made — a long chat read “10.7M / 1.0M tokens”.`,`The message box keeps the cursor after you send, so you can go straight on typing the next message.`,`A paid chat’s background work (titles, reading web pages) no longer goes to a free model of the same vendor.`]},{version:`0.3.143`,date:`2026-09-24`,added:[`Search inside your chats: open the search in the chat list, press the sliders button and choose Whole chats. It looks through every message of every chat on this PC, and you choose whose words — yours, the model’s, or both — plus, if you like, the tools’ commands and output and the subagents’ conversations. Results show each message with the words lit; a click opens the chat with its search on them.`,`More search options, for both kinds of search: one project only, a time window (today, 7 or 30 days), match case and whole words.`],fixed:[`While you search the chat list, projects with no matching chat are hidden too.`]},{version:`0.3.142`,date:`2026-09-24`,added:[],fixed:[`A reply you sent shows as the same small chip it had in the message box — “Reply to” and the first few words — instead of the whole quoted text; the full quote appears when you rest the pointer on it, and a click jumps to the message it answers.`,`The model now knows a reply points back into the conversation: it is told the quoted lines are from the chat history, not new input, and whose words they were — its own earlier reply, your earlier message, a file, or a tool’s output.`,`When the chat list is narrow, its buttons wrap onto a second line instead of spilling out of it.`]},{version:`0.3.141`,date:`2026-09-24`,added:[`The chat list on the left can be made wider or narrower: drag its right edge (double-click it for the usual width).`,`The chat list can hide: press the pin in its header, the button at the top left, or View → Sidebar (Ctrl+B). While hidden it slides in when the pointer reaches the left edge of the window, and slides away when you leave it.`,`Search in the chat list is a single magnifier now; click it and the search box opens across the top. Escape or × clears it.`],fixed:[`Opening OonaCode right after a restart no longer leaves the OonaCode pool models out of the model list: if they cannot be read yet, OonaCode asks again by itself a few seconds later and the list fills in.`,`The Artificial Analysis scores (intelligence, coding, speed and benchmarks) show on every model in the model list again — including the models of your own Claude and SuperGrok subscriptions, which never had them.`,`A chat’s details card no longer appears on top of its right-click menu.`]},{version:`0.3.140`,date:`2026-09-24`,added:[`Reply is tidier: the message you reply to shows as a small chip above the message box with its first few words, instead of filling the box. Click the chip — or the quote in a sent reply — to jump to that message; the × removes it.`,`Right-click a project in the sidebar for its settings: Project settings… opens Projects with that project already selected. The gear beside a project’s “+” does the same, and a chat filed in a project offers it in its own menu too.`,`Link GitHub. Under a project’s Repositories (and in Settings → Providers), link your GitHub account once: the agent’s git and gh then clone, pull and push your private repositories on every PC of yours. You type a short code on github.com; the token stays in your encrypted vault and never reaches the OonaCode server. Public repositories need nothing.`],fixed:[]},{version:`0.3.139`,date:`2026-09-24`,added:[`Every setting now says what it does, and resting the pointer on the ⓘ beside it tells you where in OonaCode it applies and what it does not do.`,`Export chats… is in the File menu (and on the sidebar in a browser window) instead of in Settings.`,`With Remote access turned off on a PC, your phone, Telegram, the website and your other PCs still show it — online or not — marked “remote access off”, and opening it tells you to turn Remote access back on in OonaCode on that PC.`],fixed:[`Turning Remote access off now tells your other devices at once. Before, the PC was already unreachable from them, but they could not say why.`,`The settings of This PC save the moment you change them — nothing is lost by closing the dialog.`,`Settings that did nothing, or repeated another one, are gone: the default permission mode (each chat’s Build / Plan / Ask first picker decides), the agent-picker switch, the Git Bash path, the engine path and the extra allowed origins. The server address is shown, not edited — signing in sets it.`]},{version:`0.3.138`,date:`2026-09-24`,added:[`Projects have settings now, like the Claude app’s: a goal, the repositories the project works on, what a new chat in it starts on (model, effort and folder), a project memory the agent keeps up to date, and whether its chats may schedule work — and how often at most. All of it is in Projects, and a Claude app project you import brings its own.`,`OonaCode has a scheduler. Ask the agent to do something later or on a repeat — “check the build every morning at nine” — and it schedules it on this PC; when it is due, the prompt arrives in the chat, even if the chat had gone quiet. The Projects dialog and the chat’s info panel list what is scheduled, where you can pause, resume or delete it.`],fixed:[`Saving a project’s instructions now reaches its chats at their next message, instead of waiting until the chat happened to restart.`]},{version:`0.3.137`,date:`2026-09-24`,added:[],fixed:[`After a PC restart the app could ask for a "host token" and sign you out: two copies of the OonaCode background service started at once and fought over your session. Only one ever runs now, and the app never shows the token page — if its service is replaced it reconnects by itself.`,`The unlock screen stays put until you unlock, and says what went wrong in place — a wrong password, or a connection it is re-establishing — instead of jumping to another page.`,`A message with a picture sent while the agent was working stayed “queued”, and removing it said it was already sent. It now shows as read the moment the agent takes it, and a reopened chat shows it with its picture.`,`In the model’s questions, typing your own answer now clears the options you had picked, and picking an option clears what you typed — the answer sent is exactly the one you chose. The same on the phone, in the terminal and in Telegram.`]},{version:`0.3.136`,date:`2026-09-24`,added:[`Every model now has its own housekeeper — the small, fast model of the same maker that writes a chat’s titles and reads the web pages it fetches. On the OonaCode pool a MiMo v2.6 Pro chat uses MiMo v2.6 Flash, a Qwen chat Qwen3.8 Flash, a GLM chat GLM-5.3 Flash and a GPT-5 chat GPT-5 mini, instead of doing that work on the big model itself. A free model keeps its own, so it stays free.`],fixed:[]},{version:`0.3.135`,date:`2026-09-24`,added:[],fixed:[`Claude models on the OonaCode pool — Opus 5.5, Opus 5, Sonnet 5 and Fable 5.1 — now use their whole 1M context. A long chat no longer stops to summarise itself every ~170k tokens, and its subagents get the same window.`,`Reading a web page is quick again in a Claude chat: pages are read by Claude Haiku, as in Claude Code, instead of a helper that took about a minute a page.`,`Changing a chat’s model now moves its subagents and background helpers to the new model too; before, they stayed on the old one until the app restarted.`,`MiMo v2.5 and v2.5 Pro chats now use their full 1M context too.`]},{version:`0.3.134`,date:`2026-09-23`,added:[],fixed:[`On the Android app, the model’s questions can be answered again. They come one at a time — “Question 2 of 3” — with Back, Next and Skip, and Answer sends them to your PC. The card used to show only the first question, hide the rest below it and wait for all of them, so it could not be sent.`]},{version:`0.3.133`,date:`2026-09-23`,added:[`Bring your Claude desktop app projects across: File → Import chats from other coding agents now lists every project the Claude app has opened on this PC. Each one arrives as an OonaCode project of the same name — its goal, instructions and what Claude noted about it become the project’s instructions — with its project chat and one chat per thread filed under it, ready to carry on.`,`A Claude Code chat you moved into a Claude app project is filed under that project here too.`,`A thread you never opened in the Claude app still comes across, with its task and every reply the project chat saw; open it once in the Claude app and import again for its whole conversation.`],fixed:[`Cursor chats appear in the import list again — they had been left out since September 10.`]},{version:`0.3.132`,date:`2026-09-23`,added:[`Reply to any part of a chat: select some text (or just right-click a block), choose Reply, and it is quoted in your message box — type your answer under it. A quote from a file the agent read names the file.`,`Right-click in a chat: copy what you selected, copy a whole reply or tool output, copy a code block or a link, find the selected words in the chat, or select a block.`,`Search in a chat opens the block its match is in — a folded tool card, a thought, a finished agent’s work — and scrolls to the words themselves.`,`Search matches are now bright orange, the current one strongest, so they stand out on code too.`,`The file viewer shows pictures (PNG, JPEG, GIF, WebP, SVG and more), plays audio and video, and shows Markdown formatted, with a switch to the source.`,`Right-click a file or folder in the explorer to copy its path or delete it.`],fixed:[`Moving a chat to another folder or project while it was working could delete the folder it was working in, start two agents at once, or send your next message to the old folder.`,`The working line no longer says a chat may be stuck while it waits for your approval or answer, or right after you send a message, and it counts time correctly (no more "4m 60s").`,`A date line no longer says "Today" for yesterday’s messages when the app stays open past midnight.`,"Installing with npm (`npm i -g oonacode`) installs this version again; earlier npm releases carried an old program.",`The What’s new window could open again on the next start, showing the same update a second time.`,`An older OonaCode window or VS Code extension no longer resets settings it does not know about, such as your theme colours or which project groups you folded.`,`A new install no longer opens with a list of changes; this window now appears only after an update.`,`The notification switch for permissions now says it also covers the agent’s questions.`]},{version:`0.3.131`,date:`2026-09-23`,added:[`Claude Opus 5.5 is here — the newest Opus, and cheaper to run than Opus 5. Choose it in the model picker, from the OonaCode pool or on your own Claude subscription. It runs on the newer Claude Code engine (2.1.280) that this update brings.`,`Every block in a chat shows its time at the bottom right, in your local time — hover it for the full date — and a date line marks where each day starts.`,`A running chat tells you how long the agent has been quiet, and after five minutes that it may be stuck and what to do.`,`After every update, OonaCode now opens this window to show you what changed.`],fixed:[`A reply that streamed in live had no time on it until the chat was opened again.`,`Chats open in tabs could fail to come back after a restart if a setting changed while they were being restored.`]}];function Zc(e,t){let n=e=>{let[t,...n]=e.trim().replace(/^v/,``).split(`-`);return{nums:(t??``).split(`.`).map(e=>Number.parseInt(e,10)||0),pre:n.length>0?n.join(`-`):null}},r=n(e),i=n(t);for(let e=0;e<Math.max(r.nums.length,i.nums.length);e++){let t=(r.nums[e]??0)-(i.nums[e]??0);if(t!==0)return t}return r.pre===i.pre?0:r.pre===null?1:i.pre===null?-1:Qc(r.pre,i.pre)}function Qc(e,t){let n=e.split(`.`),r=t.split(`.`);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e],i=r[e];if(t===i)continue;if(t===void 0)return-1;if(i===void 0)return 1;let a=/^\d+$/.test(t),o=/^\d+$/.test(i);if(a&&o){let e=Number(t)-Number(i);if(e!==0)return e;continue}return a===o?t<i?-1:1:a?-1:1}return 0}function $c(e,t,n=Xc,r=null){if(!e||e===`0.0.0`)return[];let i=n.filter(t=>Zc(t.version,e)<=0&&(!r||!t.platforms||t.platforms.includes(r)));return[...t===null?i.filter(t=>Zc(t.version,e)===0):i.filter(e=>Zc(e.version,t)>0)].sort((e,t)=>Zc(t.version,e.version))}function el(e,t,n,r=Xc,i=null){if(!e||e===`0.0.0`)return{record:null,show:[]};let a=null;for(let e of r)(a===null||Zc(e.version,a)>0)&&(a=e.version);let o=a!==null&&Zc(e,a)>0?a:e;return{record:t===null||Zc(o,t)>0?o:null,show:t===null&&!n?[]:$c(e,t,r,i)}}function tl(e,t){if(t==null)return[...e];if(t.length===0)return[];let n=new Set(t),r=e.filter(e=>n.has(e.id));return r.length>0?r:[...e]}var nl=`:free`;function rl(e){return e.endsWith(nl)}function il(e){return rl(e)?e.slice(0,-5):e}var al=`the user skipped the question`,ol=`(the user skipped this question)`;function sl(e){let t=e?.questions;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=e;if(typeof t.question!=`string`)continue;let r=Array.isArray(t.options)?t.options.map(e=>e&&typeof e==`object`?e:null).filter(e=>e!==null&&typeof e.label==`string`).map(e=>({label:e.label,...typeof e.description==`string`?{description:e.description}:{}})):[];n.push({question:t.question,header:typeof t.header==`string`?t.header:``,options:r,multiSelect:t.multiSelect===!0})}return n}function cl(e,t,n={},r=new Set){let i={};return e.forEach((e,a)=>{if(r.has(a)){i[e.question]=ol;return}let o=(n[a]??``).trim();i[e.question]=o||(t[a]??[]).join(`, `)}),i}function ll(e){let t=e.questions,n=t===1?`question`:`questions`,r=t===1?`the model’s question`:`the model’s questions`,i=t===1?`The model’s question was`:`The model’s questions were`;switch(e.outcome){case`answered`:{let r=e.answers?Object.values(e.answers):null,i=r?r.filter(e=>typeof e==`string`&&e!==``&&e!==`(the user skipped this question)`).length:t;return t>0&&i<t?`You answered ${i} of ${t} ${n}`:t===0?`You answered the model’s questions`:t===1?`You answered the model’s question`:`You answered ${t} ${n}`}case`skipped`:return`You skipped ${r}`;case`dismissed`:return`${i} dismissed`;case`unanswered`:return`${i} not answered — the turn ended`}}function ul(e){if(!e||typeof e!=`object`)return null;let t=e.answers;return t&&typeof t==`object`&&!Array.isArray(t)?t:null}var dl=[`win32`,`linux`,`darwin`],fl=[`demo`,`live`],pl=[`allow`,`ask`],ml=[`string`,`number`,`integer`,`boolean`,`array`,`object`];function hl(e){let t=e/1048576;return t>=100?`${Math.round(t)} MB`:t>=1?`${t.toFixed(1)} MB`:`${Math.max(1,Math.round(e/1024))} KB`}function gl(e){if(e.toolName!==`InstallToolPack`)return null;let t=e.input;return!t||typeof t!=`object`||typeof t.pack!=`string`||typeof t.name!=`string`||typeof t.version!=`string`||typeof t.sizeBytes!=`number`||typeof t.path!=`string`?null:{pack:t.pack,name:t.name,version:t.version,sizeBytes:t.sizeBytes,path:t.path}}function _l(e,t){let n=t?.[e.slug];return typeof n==`boolean`?n:e.defaultOn}function vl(e,t){return e.filter(e=>_l(e,t))}var yl={slug:48,name:80,entryTool:40,description:2e3,promptLine:1e3,details:8e3,actionDescription:1e3,params:30,paramName:48,paramDescription:400,enumValues:40,callArgKeys:20,callError:500,callBatch:100},bl=/^[A-Za-z0-9_-]+$/;function xl(e){return typeof e==`string`&&e.length>0&&e.length<=yl.entryTool&&bl.test(e)}function Sl(e){return Math.ceil(e.length/4)}function Cl(e){return Sl(`${e.entryTool} ${e.description}`)+55}function wl(e){return e.tokensPerRequest??Cl(e)+(e.promptLine?Sl(e.promptLine):0)}var Tl=Uo({type:$o(ml),required:Fo().optional(),enum:Vo(Go([H(),jo()])).optional(),description:H().optional()}),El=Uo({slug:H().min(1),description:H(),params:Zo(H(),Tl),permission:$o(pl),sort:jo()}),Dl=Uo({version:H(),url:H(),sha256:H(),sizeBytes:jo(),exe:H(),format:ts(`zip`)}),Ol=Uo({slug:H().min(1),name:H(),entryTool:H().refine(xl,`not a valid tool name`),description:H(),promptLine:H().nullable(),details:H().nullable().optional(),status:$o(fl),defaultOn:Fo(),sort:jo(),install:Dl.nullable(),actions:Vo(El)}).loose();Uo({platform:$o(dl),version:H(),packs:Vo(Ol),refreshMinutes:jo()});var kl=[`No answer needed.`,`"Talk to other chats" is off in this chat: this message is from another chat's agent, not the person, and you cannot message chats. Your final answer goes back to that chat by itself.`,`"Talk to other chats" is off in this chat: this message is from another chat's agent, not the person, and you cannot message chats. It asked for no answer, so nothing goes back.`,`Last hop of this chain: you cannot message chats in this turn; put what you have in your final answer.`];[`**Let this chat work together with your other chats.**`,``,`### What it does`,`- Finds your other chats on this PC and reads their recent messages.`,`- Sends one chat, or a group of chats, a message or a task.`,`- Brings their answers back to this chat, by itself.`,``,`### How it works`,`- A chat that is asleep is woken from its saved history. A busy one gets the message when its current turn ends, never in the middle of it.`,`- The other chat does the work with its own model, folder and tools. Its answer comes back here as a new message only when this chat asked for one.`,`- Several messages from one chat that wait for a busy chat are handed over together, in one turn, with one answer.`,`- Several chats can share one conversation (a group). An answer goes only to the chat that asked, so a group cannot multiply its own messages.`,`- A chat with this switch OFF can still be messaged by a chat that has it on. It does the work, and its final answer goes back to that chat when that chat asked for one. That is all it can do: it gets none of these tools, cannot message or read other chats, and its switch stays off.`,``,`### What it costs`,`- About 650 tokens on every request while it is on, read from the prompt cache. Nothing while it is off, even in a chat that is messaged.`,`- Every message makes the chat that receives it do a turn, which spends its own tokens.`,`- Switching it on or off in a chat that already has a conversation re-writes its prompt cache once.`,``,`### Safety limits`,`- Each conversation has a budget: 20 delivered messages and 1,000,000 new tokens by default (context read back from the prompt cache is not counted). Reaching either pauses the conversation, and the chats say so.`,`- A chain stops after 3 hops (a message caused by a message caused by a message).`,`- At most 5 messages between two chats and 20 from one chat in 10 minutes, and 10 waiting for any one chat. A chat cannot message itself.`,`- A conversation with no activity for 24 hours closes by itself.`,``,`### How to stop it`,`- Turn this switch off: the chat loses these tools, and what it sent and the answers it asked for pause. It still answers a chat that messages it.`,`- Or open the Conversations window and use Pause, Close or Stop all.`,``,`### Privacy`,`- Everything stays on your PC: the messages are kept in this PC's database, never on OonaCode's server.`,`- A message never grants anything. The other chat runs with its own permissions and asks you as usual.`,``,`Only a chat with this switch on can start a conversation; a chat with it off only answers.`].join(`
77
+ `,18);return t<0?null:{title:e.slice(18,t),prompt:e.slice(t+3)}}Object.freeze({tengu_amber_sentinel:!0,tengu_groovy_eclipse:!0,tengu_humble_hammock:!0});var ic=[`mon`,`tue`,`wed`,`thu`,`fri`,`sat`,`sun`],ac=/^([01]\d|2[0-3]):[0-5]\d$/;Uo({tz:H().min(1),windows:Vo(Uo({from:H().regex(ac,`HH:MM`),to:H().regex(ac,`HH:MM`),days:Vo($o(ic)).optional(),kind:$o([`peak`,`offpeak`])})),offpeakDiscount:jo().nonnegative().max(1).optional()});var oc=[`priceInputCacheMissPeak`,`priceInputCacheMissOffpeak`,`priceInputCacheHitPeak`,`priceInputCacheHitOffpeak`,`priceCacheWritePeak`,`priceCacheWriteOffpeak`,`priceOutputPeak`,`priceOutputOffpeak`],sc=Uo({inputCacheMiss:jo().nonnegative(),inputCacheHit:jo().nonnegative().optional(),cacheWrite:jo().nonnegative().optional(),output:jo().nonnegative()});Uo({by:ts(`prompt_tokens`),tiers:Vo(Uo({upToPromptTokens:jo().int().positive().optional(),price:sc.optional(),cost:sc.optional()})).min(1),note:H().optional()}).superRefine((e,t)=>{let n=0;e.tiers.forEach((r,i)=>{!r.cost&&!r.price&&t.addIssue({code:`custom`,message:`a tier needs its cost (the provider’s rates; retail is cost × the record’s ratio)`,path:[`tiers`,i,`cost`]});let a=r.upToPromptTokens;if(a===void 0){i!==e.tiers.length-1&&t.addIssue({code:`custom`,message:`only the LAST tier may omit upToPromptTokens`,path:[`tiers`,i]});return}a<=n&&t.addIssue({code:`custom`,message:`tiers must ascend: ${a} does not exceed ${n}`,path:[`tiers`,i,`upToPromptTokens`]}),n=a})}),[...oc];var cc={realtime:`/v1/realtime`,translations:`/v1/realtime/translations`,live:`/v1/live/sessions`,speechStream:`/v1/audio/speech/stream`,transcriptionStream:`/v1/audio/transcriptions/stream`,clientSecrets:`/v1/realtime/client_secrets`,translationClientSecrets:`/v1/realtime/translations/client_secrets`};cc.realtime,cc.translations,cc.live,cc.speechStream,cc.transcriptionStream;var lc={oonacode:{hex:`#000000`,owner:`OonaCode`,d:`M0.72 12a11.28 11.28 0 1 0 22.56 0a11.28 11.28 0 1 0 -22.56 0ZM4.8 12a7.2 7.2 0 1 0 14.4 0a7.2 7.2 0 1 0 -14.4 0ZM7.44 12a4.56 4.56 0 1 0 9.12 0a4.56 4.56 0 1 0 -9.12 0Z`,fillRule:`evenodd`},anthropic:{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},"anthropic-subscription":{hex:`#D97757`,owner:`Anthropic`,d:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`},openai:{hex:`#000000`,owner:`OpenAI`,d:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`},xai:{hex:`#000000`,owner:`xAI`,d:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`},deepseek:{hex:`#5786FE`,owner:`DeepSeek`,d:`M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45`},kimi:{hex:`#000000`,owner:`Moonshot`,d:`M21.765.351C22.998.351 24 1.353 24 2.586S22.998 4.82 21.765 4.82h-1.974c-.15 0-.26-.12-.26-.26V2.586A2.237 2.237 0 0 1 21.765.35M9.41 13.388l8.447-8.377c.16-.16.07-.471-.14-.471h-4.55s-.1.02-.14.06l-9.099 9.029c-.14.14-.35.02-.35-.21V4.81c0-.15-.1-.27-.221-.27H.22c-.12 0-.22.12-.22.27v18.57c0 .15.1.27.22.27h3.137c.12 0 .22-.12.22-.27v-3.79c0-.08.03-.16.08-.21l2.826-2.796c.07-.07.16-.08.241-.03l7.546 5.551a8.9 8.9 0 0 0 4.018 1.493c.12.01.23-.11.23-.27V19.76c0-.14-.08-.25-.19-.26a5.8 5.8 0 0 1-2.355-.942l-6.533-4.73c-.14-.09-.15-.32-.03-.441`},qwen:{hex:`#6950EF`,owner:`Alibaba`,d:`M23.919 14.545 20.817 9.17l1.47-2.544a.56.56 0 0 0 0-.566l-1.633-2.83a.57.57 0 0 0-.49-.283h-6.207L12.487.402a.57.57 0 0 0-.49-.284H8.732a.56.56 0 0 0-.49.284L5.139 5.775h-2.94a.56.56 0 0 0-.49.284L.077 8.887a.56.56 0 0 0 0 .567L3.18 14.83l-1.47 2.545a.56.56 0 0 0 0 .566l1.634 2.83a.57.57 0 0 0 .49.283h6.205l1.47 2.545a.57.57 0 0 0 .49.284h3.266a.57.57 0 0 0 .49-.284l3.104-5.375h2.94a.57.57 0 0 0 .49-.283l1.634-2.828a.55.55 0 0 0-.004-.568M8.733.686l1.634 2.828-1.634 2.828H21.8L20.164 9.17H7.425L5.63 6.06Zm1.306 19.801-6.205-.002 1.634-2.83h3.265L2.201 6.344h3.267q3.182 5.517 6.367 11.032zm10.124-5.66L18.53 12l-6.532 11.315-1.634-2.83c2.129-3.673 4.25-7.351 6.373-11.028h3.592l3.102 5.374z`},mimo:{hex:`#FF6900`,owner:`Xiaomi`,d:`M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z`}};function uc(e){return lc[e]??null}function dc(e){let t=e.replace(/\(.*?\)/g,` `).split(/[\s/_-]+/).filter(Boolean);return t.length===0?`?`:t.length===1?t[0].slice(0,2).toUpperCase():`${t[0][0]}${t[1][0]}`.toUpperCase()}var fc=9230,pc=1024,mc=65534,hc=`127.0.0.1`;Object.freeze({enabled:!1,port:fc,inspectMain:!1}),Object.freeze({port:null,listening:!1,fromCommandLine:!1,inspectPort:null,inspectProblem:null});function gc(e){return e+1}function _c(e){return typeof e==`number`&&Number.isInteger(e)}function vc(e){return!_c(e)||e<1024||e>65534?`The port must be a whole number from ${pc.toLocaleString(`en-US`)} to ${mc.toLocaleString(`en-US`)} (the main-process inspector takes the next one).`:null}function yc(e){return e.port!==null||e.inspectPort!==null}function bc(e,t){let n=e.enabled?e.port:null,r=e.enabled&&e.inspectMain?gc(e.port):null;return!t.fromCommandLine&&t.port!==n||t.inspectPort!==r}function xc(e){let t=[];return e.port!==null&&t.push(`${hc}:${e.port}`),e.inspectPort!==null&&t.push(`${hc}:${e.inspectPort}`),t.length===2?`${t[0]} (windows) and ${t[1]} (main process)`:e.inspectPort===null?t[0]??``:`${t[0]} (main process)`}var Sc=[`stable`,`dev`];function Cc(e){return typeof e==`string`&&Sc.includes(e)}function wc(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();return Cc(t)?t:null}var Tc=[`win32`,`linux`,`darwin`],Ec=[`x64`,`arm64`];function Dc(e,t){let n=wc(e)??`stable`,r=[];return n!==`stable`&&r.push(`channel=${encodeURIComponent(n)}`),t&&Tc.includes(t.platform)&&(r.push(`platform=${t.platform}`),t.arch&&Ec.includes(t.arch)&&r.push(`arch=${t.arch}`)),r.length>0?`${qs.releasesLatest}?${r.join(`&`)}`:qs.releasesLatest}function Oc(e,t){let n=wc(t)??`stable`;return n===`stable`?e:`${e} (${n})`}var kc=5e4,Ac=6,jc=[`bg`,`surface`,`surface-2`,`surface-3`,`border`,`fg`,`fg-muted`,`fg-faint`,`accent`,`accent-fg`,`accent-soft`,`project`,`ok`,`ok-soft`,`warn`,`warn-soft`,`danger`,`danger-soft`,`think`,`think-soft`,`code-bg`,`user-bubble`],Mc={agentFinished:!1,permissionRequired:!0,errorOccurred:!0},Nc={autoAcceptPermissions:!1,showReasoningSummaries:!0,notifications:Mc,showAgentPicker:!0,transcriptWindowSize:500,openTabs:[],draftTabs:[],draftTitles:{},activeTab:null,editorLayout:null,remoteTabs:{},sessionPanelOpen:!1,explorerOpen:!1,sidebarWidth:288,sidebarPinned:!0,dismissedUpdateVersion:null,lastSeenReleaseNotes:null,claudeImportOffered:!1,claudeImportOffers:0,collapsedProjects:[],themeColors:{light:{},dark:{}},pinned:[],sidebarView:`recent`};function Pc(e){return Math.min(Math.max(typeof e==`number`&&Number.isFinite(e)?Math.floor(e):0,0),3)}function Fc(e){return Math.min(640,Math.max(200,typeof e==`number`&&Number.isFinite(e)?Math.round(e):288))}function Ic(e){return Math.min(kc,Math.max(100,typeof e==`number`&&Number.isFinite(e)?Math.round(e):500))}function Lc(e,t){return typeof e==`boolean`?e:t}function Rc(e){return typeof e==`string`&&e.length>0&&e.length<=64?e:null}function zc(e,t=50){if(!Array.isArray(e))return[];let n=[];for(let r of e)if(!(typeof r!=`string`||r.length===0||r.length>200)&&!n.includes(r)&&(n.push(r),n.length>=t))break;return n}function Bc(e,t=50){if(typeof e!=`object`||!e||Array.isArray(e))return{};let n={};for(let[r,i]of Object.entries(e))if(!(r.length===0||r.length>200)&&!(typeof i!=`string`||i.length===0||i.length>200)&&(n[r]=i,Object.keys(n).length>=t))break;return n}function Vc(e){if(typeof e!=`string`)return null;let t=e.trim();return/^#[0-9a-fA-F]{6}$/.test(t)?t.toLowerCase():null}function Hc(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(!jc.includes(n))continue;let e=Vc(r);e!==null&&(t[n]=e)}return t}function Uc(e){let t=typeof e==`object`&&e?e:{};return{light:Hc(t.light),dark:Hc(t.dark)}}function Wc(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let e=n.kind,r=n.id;if((e===`chat`||e===`project`)&&!(typeof r!=`string`||r.length===0||r.length>200)&&!t.some(t=>t.kind===e&&t.id===r)&&(t.push({kind:e,id:r}),t.length>=50))break}return t}function Gc(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return null;let n=e,r=new Set(t),i=new Set,a=0,o=(e,t)=>{if(t>Ac||typeof e!=`object`||!e)return null;let n=e,s=n.group;if(typeof s==`object`&&s&&!Array.isArray(s)){if(a>=8)return null;let e=s,t=[];for(let n of Array.isArray(e.tabs)?e.tabs:[])typeof n!=`string`||!r.has(n)||i.has(n)||(i.add(n),t.push(n));return t.length===0?null:(a+=1,{group:{tabs:t,active:(typeof e.active==`string`&&t.includes(e.active)?e.active:null)??t[t.length-1]}})}let c=n.split;if(c!==`row`&&c!==`column`)return null;let l=Array.isArray(n.children)?n.children:[],u=Array.isArray(n.sizes)?n.sizes:[],d=[],f=[];if(l.slice(0,8).forEach((e,n)=>{let r=o(e,t+1);if(!r)return;d.push(r);let i=u[n];f.push(typeof i==`number`&&Number.isFinite(i)&&i>0?i:0)}),d.length===0)return null;if(d.length===1)return d[0];let p=f.filter(e=>e>0),m=p.length>0?p.reduce((e,t)=>e+t,0)/p.length:1,h=f.map(e=>e>0?e:m),g=h.reduce((e,t)=>e+t,0);return{split:c,sizes:h.map(e=>e/g),children:d}},s=o(n.root,0);if(!s||a<2)return null;let c=n.focused;return{root:s,focused:typeof c==`number`&&Number.isInteger(c)&&c>=0&&c<a?c:0}}function Kc(e,t,n){return e.some(e=>e.kind===t&&e.id===n)}function qc(e,t,n,r){return r===Kc(e,t,n)?e:r?[...e.length>=50?e.slice(e.length-50+1):e,{kind:t,id:n}]:e.filter(e=>e.kind!==t||e.id!==n)}function Jc(e){let t=typeof e==`object`&&e?e:{},n=typeof t.notifications==`object`&&t.notifications!==null?t.notifications:{},r=zc(t.openTabs),i=zc(t.draftTabs).filter(e=>!r.includes(e)),a={};for(let[e,n]of Object.entries(Bc(t.draftTitles)))i.includes(e)&&(a[e]=n);let o=[...r,...i],s=t.activeTab,c=typeof s==`string`&&o.includes(s)?s:o[o.length-1]??null;return{autoAcceptPermissions:Lc(t.autoAcceptPermissions,Nc.autoAcceptPermissions),showReasoningSummaries:Lc(t.showReasoningSummaries,Nc.showReasoningSummaries),notifications:{agentFinished:Lc(n.agentFinished,Mc.agentFinished),permissionRequired:Lc(n.permissionRequired,Mc.permissionRequired),errorOccurred:Lc(n.errorOccurred,Mc.errorOccurred)},showAgentPicker:Lc(t.showAgentPicker,Nc.showAgentPicker),transcriptWindowSize:Ic(t.transcriptWindowSize),openTabs:r,draftTabs:i,draftTitles:a,activeTab:c,editorLayout:Gc(t.editorLayout,o),remoteTabs:Bc(t.remoteTabs),sessionPanelOpen:Lc(t.sessionPanelOpen,Nc.sessionPanelOpen),explorerOpen:Lc(t.explorerOpen,Nc.explorerOpen),sidebarWidth:Fc(t.sidebarWidth),sidebarPinned:Lc(t.sidebarPinned,Nc.sidebarPinned),dismissedUpdateVersion:Rc(t.dismissedUpdateVersion),lastSeenReleaseNotes:Rc(t.lastSeenReleaseNotes),claudeImportOffered:Lc(t.claudeImportOffered,Nc.claudeImportOffered),claudeImportOffers:Pc(t.claudeImportOffers),collapsedProjects:zc(t.collapsedProjects),themeColors:Uc(t.themeColors),pinned:Wc(t.pinned),sidebarView:t.sidebarView===`projects`?`projects`:`recent`}}new Set(Object.keys(Nc));var Yc=3650,Xc=[{version:`0.3.201`,date:`2026-10-03`,added:[`The Tools menu lists only tools that work. Desktop control, Clipboard, Screen capture and Run as administrator were demos that never ran anything, and they are gone: the agent already reads and sets your clipboard, takes screenshots and asks Windows for administrator rights through its own commands.`],fixed:[`Oonak Browser keeps working when its window is behind other windows. A browser covered by the OonaCode window used to crawl, and some clicks and scrolls gave up after 30 seconds.`,`Oonak Browser no longer clicks a hidden copy of a link, or a link inside a closed menu, when a site has both a visible and a hidden one.`,`A message you send right after a reply failed no longer stays pinned above the box as “queued” once the agent has read it.`]},{version:`0.3.200`,date:`2026-10-03`,platforms:[`win32`],added:[`Everything OonaCode shows you is in credits, never in dollars: the model picker gives what an OonaCode pool model charges per 1M tokens in credits, and a chat’s spend, Usage, Conversations, Listen and the terminal all count credits. A chat on your own key or your own subscription says so instead of a price.`],fixed:[`Oonak Browser works on sites built from web components, Google’s own forms among them: it reads, finds, clicks and types inside them, where it used to answer “the page changed” or find nothing.`,`The model’s questions appear only in their own window: the chat no longer shows the question’s raw text while you answer, and afterwards keeps one line — “You answered 3 questions” — that opens to your answers.`]},{version:`0.3.200`,date:`2026-10-03`,platforms:[`linux`],added:[`Your chats now live only on the PC that runs them. Your phone, the website and your other PCs read a chat straight from its PC, through the same encrypted connection they use to continue it — OonaCode’s server no longer keeps any copy. While a PC is off or asleep its chats cannot be read from elsewhere; the window says so and they come back when it is online. Update OonaCode on each of your PCs: another device reads a PC’s chats only once that PC runs this version.`,`Everything OonaCode shows you is in credits, never in dollars: the model picker gives what an OonaCode pool model charges per 1M tokens in credits, and a chat’s spend, Usage, Conversations, Listen and the terminal all count credits. A chat on your own key or your own subscription says so instead of a price.`,`Listen has one button: Play. It writes a summary when the chat has none or has moved on, translates it once when you pick a new language, or just plays — saying only “Generating…” or “Translating…” while it works. A summary written in the last ten minutes is used for every language, so switching language never writes it again.`,`A morning briefing in View → What chats are about…: show the chats active in the last 24 hours, 3, 7, 10 or 30 days (or your own dates), tick the ones you want — or all — pick a language, a voice and a speed, and press Play. OonaCode reads each chat’s name and what it is about, one after another, with Next, Previous, Pause and Stop.`,`A chat can offer to move a task to a new chat. When a task deserves its own chat — a separate job, a chat that has grown long, work in another folder — the model proposes it with the first message written out; you can edit it, then Start new chat opens the new chat in a tab, sends the message and carries on there. Nothing starts without your yes.`,`Talk to other chats: a chat can now write to a chat whose switch is off. That chat’s switch stays off and it gets no new tools — it can only answer the chat that wrote to it. Finding a chat by name matches each word, in its name, project, folder and description, and spelling like “AI-control” or “aicontrol” no longer matters.`,`Oonak Browser acts like a person: every click, keystroke and scroll is a real input event, so sites that ignore scripted clicks now respond, and it works inside web components, Google’s own forms among them. Typing into a drop-down picks the option, and typing into an editor adds the text at its end.`,`Scheduled shows at a glance what will still run: paused tasks and one-time tasks that have already run are greyed out, with the day they will be removed — 10 days after their last change.`,`Settings → Developer → Allow debugging: opens a debugging port on this PC only, so a developer can look at and drive the app while fixing a problem with you. Off by default; while it is on, every window shows a red “Debugging on” badge.`],fixed:[`A chat keeps its Build / Plan / Ask first / Autonomous choice, and every device shows the same one. A chat set to “Ask first” now asks you before acting even when this PC answers prompts by itself.`,`A chat no longer ends up on a model nobody picked for it: a model the provider does not offer is refused instead of quietly switching the chat to the provider’s default, and Enter in the model picker no longer picks the row under the mouse pointer.`,`Chats talking to each other no longer ping-pong: a reply needs no answer, several messages from the same chat are read together in one turn, and a message card says “answer requested” until the answer has gone back, then “answered” with the time.`,`A tool you switch on while a chat is replying works for the message you send next, even mid-reply. After an update, a chat that had background tasks running shows one line saying how many stopped, instead of one card per task.`,`The model’s questions appear only in their own window: the chat no longer shows the question’s raw text while you answer, and afterwards keeps one line — “You answered 3 questions” — that opens to your answers.`,`A model your plan does not include now says “not in your plan”, instead of “Failed to authenticate … sign-in needed”.`,`A long message waiting in the queue no longer hides its “Send now” button: it is folded to a few lines, with Show all to read the rest.`,`The account window no longer stays on “offline · vault event stream responded 503” after a short server interruption.`]},{version:`0.3.199`,date:`2026-10-02`,platforms:[`win32`],added:[`Talk to other chats: a chat can now write to a chat whose switch is off. That chat’s switch stays off and it gets no new tools — it can only answer the chat that wrote to it. Finding a chat by name is smarter too: each word is matched, in its name, project, folder and description, and spelling like “AI-control” or “aicontrol” no longer matters.`,`Oonak Browser acts like a person: every click, keystroke and scroll is a real input event, so sites that ignore scripted clicks now respond. Typing into a drop-down picks the option, and typing into an editor adds the text at its end.`],fixed:[`A chat no longer ends up on a model nobody picked for it: a model the provider does not offer is refused instead of quietly switching the chat to the provider’s default, and Enter in the model picker no longer picks the row under the mouse pointer.`]},{version:`0.3.198`,date:`2026-10-01`,platforms:[`win32`],added:[`Listen has one button: Play. It writes a summary when the chat has none or has moved on, translates it once when you pick a new language, or just plays — saying only “Generating…” or “Translating…” while it works. A summary written in the last ten minutes is used for every language, so switching language never writes it again.`],fixed:[`A chat keeps its Build / Plan / Ask first / Autonomous choice, and every device shows the same one — the phone used to show “Ask first” for a Build chat. A chat set to “Ask first” now asks you before acting even when this PC answers prompts by itself.`,`Play in Listen is never greyed out for want of a voice: it gets the text ready and names the voice to install.`]},{version:`0.3.197`,date:`2026-10-01`,platforms:[`win32`],added:[`Oonak Browser, the browser your chats use, moves to version 151 by itself at its next use: a build with no Google services (no Safe Browsing warnings, push notifications or search suggestions). The download is checked against its fingerprint before anything is unpacked, and the old version is removed once no chat’s browser still runs from it.`],fixed:[`A model your plan does not include now says “not in your plan”, instead of “Failed to authenticate … sign-in needed”.`]},{version:`0.3.196`,date:`2026-10-01`,platforms:[`win32`],added:[`Your chats now live only on the PC that runs them. Your phone, the website and your other PCs read a chat straight from its PC, through the same encrypted connection they use to continue it — OonaCode’s server no longer keeps any copy. While a PC is off or asleep its chats cannot be read from elsewhere; the window says so and they come back when it is online. Update OonaCode on each of your PCs: another device reads a PC’s chats only once that PC runs this version.`],fixed:[`The account window no longer stays on “offline · vault event stream responded 503” after a short server interruption: the next sync that works clears it by itself.`]},{version:`0.3.195`,date:`2026-10-01`,platforms:[`win32`],added:[],fixed:[`Chats talking to each other no longer ping-pong. A message asks for an answer only when the chat really needs one; a reply needs no answer and is not answered with a new message; and several messages waiting from the same chat are read together in one turn. Fewer wake-ups, fewer tokens.`,`A message card says what is true: “answer requested” until the answer has gone back, then “answered” with the time — instead of an orange “reply expected” that never went away.`]},{version:`0.3.194`,date:`2026-10-01`,platforms:[`win32`],added:[`A chat can offer to move a task to a new chat. When a task deserves its own chat — a separate job, a chat that has grown long, work in another folder — the model proposes it with the first message written out; you can edit it, then Start new chat opens the new chat in a tab, sends the message and carries on there. Nothing starts without your yes.`,`Settings → Developer → Allow debugging: opens a debugging port on this PC only, so a developer can look at and drive the app while fixing a problem with you. Off by default; while it is on, every window shows a red “Debugging on” badge.`],fixed:[]},{version:`0.3.193`,date:`2026-10-01`,platforms:[`win32`],added:[],fixed:[`A tool you switch on while a chat is replying works for the message you send next, even mid-reply: that message now waits for the chat to restart with the new tool instead of reaching the model without it.`,`After an update, a chat that had background tasks running shows one line — “11 background tasks stopped — they were running when OonaCode restarted this chat” — instead of one card per task. Click it to see each one.`]},{version:`0.3.192`,date:`2026-09-30`,platforms:[`win32`],added:[`A morning briefing in View → What chats are about…: show the chats active in the last 24 hours, 3, 7, 10 or 30 days (or your own dates), tick the ones you want — or all — pick a language, a voice and a speed, and press Play. OonaCode reads each chat’s name and what it is about, one after another, with Next, Previous, Pause and Stop. Other languages are translated once and kept, so hearing the same briefing again costs nothing.`],fixed:[]},{version:`0.3.191`,date:`2026-09-30`,platforms:[`win32`],added:[`Scheduled shows at a glance what will still run: paused tasks and one-time tasks that have already run are greyed out, with the day they will be removed. They are deleted by themselves 10 days after their last change; resuming or editing a paused task gives it another 10 days.`],fixed:[]},{version:`0.3.190`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`A long message waiting in the queue no longer hides its “Send now” button: it is folded to a few lines, with Show all to read the rest.`]},{version:`0.3.189`,date:`2026-09-30`,platforms:[`linux`],added:[`Split views, like VS Code: drag a chat tab to the left, right, top or bottom of the chat area to open it beside the other one — a shaded area shows where it will land. Every chat on screen works on its own, with its own replies streaming and its own message box. Drag the divider to resize; Ctrl+\\ splits the current tab to the right, Ctrl+1, Ctrl+2… jump between views, and a tab’s menu has Split right, Split down and Move to other group.`,`Chats in windows of their own, like Chrome tabs: drag a tab out of the window, or choose “Move to new window” in its menu, and it opens in its own window; “Move to main window” brings it back. On Wayland desktops the new window opens at the usual place rather than under the pointer. Your split views and windows come back when you restart OonaCode.`,`Every language plays in Listen to a chat: each language picks the best voice on its own — OonaCode’s Armenian voices first, then your system’s voices, then eSpeak (install the espeak-ng package if your system has no voice for a language).`],fixed:[`Picking another language for a summary no longer needs a new summary: Play translates the one you have, keeps the translation, shows it and plays it.`,`“Summarise now” says “Up to date — nothing to summarise” while the chat has not changed, instead of seeming to do nothing.`]},{version:`0.3.188`,date:`2026-09-30`,platforms:[`win32`],added:[`Split views, like VS Code: drag a chat tab to the left, right, top or bottom of the chat area to open it beside the other one — a shaded area shows where it will land. Every chat on screen works on its own, with its own replies streaming and its own message box. Drag the divider to resize; Ctrl+\\ splits the current tab to the right, Ctrl+1, Ctrl+2… jump between views, and a tab’s menu has Split right, Split down and Move to other group.`,`Chats in windows of their own, like Chrome tabs: drag a tab out of the window, or choose “Move to new window” in its menu, and it opens in its own window. Drag it back onto the main window’s tabs, or choose “Move to main window”, to bring it back. Your split views and popped-out windows come back when you restart OonaCode.`],fixed:[]},{version:`0.3.187`,date:`2026-09-30`,platforms:[`win32`],added:[`Every language plays in Listen to a chat. Persian, Georgian, Ukrainian — and any language whose Windows voice is not installed — now speak with eSpeak, a free voice that comes with OonaCode (it sounds robotic, but it always works). Each language picks the best voice on its own: OonaCode’s Armenian voices first, then Windows’ own, then eSpeak.`],fixed:[`Picking another language for a summary no longer needs a new summary: Play translates the one you have, keeps the translation, shows it and plays it.`,`“Summarise now” says “Up to date — nothing to summarise” while the chat has not changed, instead of seeming to do nothing.`]},{version:`0.3.186`,date:`2026-09-30`,platforms:[`linux`],added:[`Listen to a chat: right-click a chat → Listen to this chat…, or the speaker button beside the chat’s title. The chat’s own model writes a short spoken summary — the goal, what was done, where it stands, what is left — and OonaCode reads it aloud on this PC, in the voice and at the speed you choose. Every summary is kept with its date, so you can play it again at any time; a new one is written only when the chat has moved on. Other languages are translated once and kept with the summary.`,`OonaCode brings two Armenian voices of its own, Astgh and Artsiv, and also speaks with your system’s voices through speech-dispatcher — install speech-dispatcher and espeak-ng for Persian, Russian and every other language; the Listen window names the packages for your distribution.`,`Listen to a chat from your phone: the OonaCode app’s 🔊 Listen reaches this PC’s summaries and plays them with the phone’s own voices. It needs this update on the PC and the next OonaCode app on the phone.`,`See where your credits go: Account → Usage. Pick the last 24 hours, 7, 30 or 90 days or your own dates, by hour or by day, for the coding agent or your API keys apart. A chart shows the credits over time by model or by what they were for, and the lists below give every model with its tokens and price, and every use — chat turns, a chat’s “about”, images, speech and the rest.`,`The chat list is laid out like the Claude desktop app: New, Projects, Scheduled, then your pinned chats and projects, then Today and Older. The old grouping by project is one click away — the small icon beside “Today”.`,`Projects opens a page of project cards — each with its goal, its chats and when it was last used — with search, sort and New project. Click a card to see that project’s chats, instructions and settings, and to start a new chat in it.`,`Scheduled shows every scheduled task from every chat on this PC in one place, with its next run, its chat, and pause, resume and delete. Pin any chat or project to the top of the list from its menu.`,`Claude Sonnet 5.5 is in the model picker — on the OonaCode pool and on your own Claude subscription — with a 1M-token context. It costs the same as Sonnet 5 per token and usually needs fewer tokens for the same work.`,`Type / at the start of a message to see the chat’s commands and skills, with what each does, in two titled sections. Type to narrow the list, then Enter or Tab. They work with every model, not only Claude.`,`Each chat has a Skills list beside Tools. Every skill starts off, so the model sees none of them and they cost nothing; switch one on to let the model use it by itself in that chat. Typing /name still runs any skill for one turn.`,`Your own skills: Settings → Skills lists the skills OonaCode gives every chat, and “Import from Claude Code…” copies the ones you choose from your Claude Code install — it only reads it, never changes it.`,`In the terminal app (oona), a command the chat’s engine knows — /context, /compact or a skill — now runs instead of answering “unknown command”.`,`Search in the Import window: find a chat by its name, its first or last message or its folder, or pick “Whole conversations” to search inside the chats themselves.`],fixed:[`Import chats shows every chat on this PC, grouped by the app it came from, with nothing folded away. Each row says whether it is new, already imported, moved on since, or deleted by you in OonaCode. Nothing is ticked when you open it yourself: search for a chat and tick it, or tick a whole group at once.`,`The message box fits a narrow chat: its buttons and pickers move onto a second line and the box grows to hold them — Stop and Queue no longer slip outside it.`,`Claude’s thoughts show their words again. Every “Thought” from Claude Opus, Sonnet and Fable came back empty — Anthropic leaves the text out unless it is asked for a summary, and now OonaCode asks. Only new replies change.`,`A chat’s “about” no longer starts in the middle of a sentence when the model wrote a long answer.`,`Commands that only duplicated OonaCode’s own controls or showed misleading numbers are gone from the / menu — /model, /usage, /autocompact, /output-style, /mcp, /list-agents and /reload-skills. Typed, they say why.`,`Skills you import or remove in Settings → Skills reach your chats by themselves, at each chat’s next message.`,`Claude Sonnet 5 is retired: a chat that was on it moves to Sonnet 5.5 at its next message.`,`The engine’s built-in keyboard-shortcuts helper is turned off: it would have edited your own Claude Code settings.`,`Typing /model in a chat updates the chat’s model and the model picker again, and command output such as /context reads the same while it arrives and after you reopen the chat.`,`A chat row’s ⋯ button shows only when you point at the row.`]},{version:`0.3.185`,date:`2026-09-30`,platforms:[`win32`],added:[`Listen to a chat from your phone: the OonaCode app’s 🔊 Listen reaches this PC’s summaries and plays them with the phone’s own voices. It needs this update on the PC and the next OonaCode app on the phone.`],fixed:[`Listening with a Windows voice no longer stops after the first sentence when the voice fails to say it has finished.`]},{version:`0.3.184`,date:`2026-09-30`,platforms:[`win32`],added:[`Listen to a chat: right-click a chat → Listen to this chat…, or the speaker button beside the chat’s title. The chat’s own model writes a short spoken summary — the goal, what was done, where it stands, what is left — and OonaCode reads it aloud on this PC, in the voice and at the speed you choose. Every summary is kept with its date, so you can play it again at any time; a new one is written only when the chat has moved on. Other languages are translated once and kept with the summary.`],fixed:[`A chat’s “about” no longer starts in the middle of a sentence when the model wrote a long answer.`]},{version:`0.3.183`,date:`2026-09-30`,platforms:[`win32`],added:[`See where your credits go: Account → Usage. Pick the last 24 hours, 7, 30 or 90 days or your own dates, by hour or by day, for the coding agent or your API keys apart. A chart shows the credits over time by model or by what they were for, and the lists below give every model with its tokens and price, and every use — chat turns, a chat’s “about”, images, speech and the rest.`],fixed:[]},{version:`0.3.182`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`Import chats shows every chat on this PC, grouped by the app it came from — Claude Code, the Claude app, Qwen Code, Cursor — with nothing folded away. Each row says whether it is new, already imported, moved on since, or deleted by you in OonaCode. Nothing is ticked when you open it yourself: search for a chat and tick it, or tick a whole group at once. The Import button says how many chats it will bring over.`]},{version:`0.3.181`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`The message box fits a narrow chat. In a small window, or with the side panels open, its buttons and pickers move onto a second line and the box grows to hold them — Stop and Queue no longer slip outside it, and the model and effort pickers keep their words readable.`]},{version:`0.3.180`,date:`2026-09-30`,platforms:[`win32`],added:[],fixed:[`Claude’s thoughts show their words again. Every “Thought” from Claude Opus, Sonnet and Fable came back empty — Anthropic leaves the text out unless it is asked for a summary, and now OonaCode asks. Other models were never affected. Only new replies change; older thoughts stay empty.`]},{version:`0.3.179`,date:`2026-09-29`,platforms:[`win32`],added:[],fixed:[`The / menu is easier to read: skills and commands in two titled sections, each with one short line — the full description shows when you point at it.`,`Commands that only duplicated OonaCode’s own controls or showed misleading numbers are gone from the / menu — /model (use the model picker), /usage (the engine’s own estimate, not your credits), /autocompact, /output-style, /mcp, /list-agents and /reload-skills. Typed, they say why.`,`Skills you import or remove in Settings → Skills reach your chats by themselves, at each chat’s next message.`]},{version:`0.3.178`,date:`2026-09-29`,platforms:[`win32`],added:[`The chat list is laid out like the Claude desktop app: New, Projects, Scheduled, then your pinned chats and projects, then Today and Older. The old grouping by project is one click away — the small icon beside “Today”.`,`Projects opens a page of project cards — each with its goal, its chats and when it was last used — with search, sort and New project. Click a card to see that project’s chats, instructions and settings, and to start a new chat in it.`,`Scheduled shows every scheduled task from every chat on this PC in one place, with its next run, its chat, and pause, resume and delete. A dot on it tells you when something is due soon.`,`Pin any chat or project to the top of the list from its menu.`],fixed:[`A chat row’s ⋯ button shows only when you point at the row.`]},{version:`0.3.177`,date:`2026-09-29`,platforms:[`win32`],added:[`Claude Sonnet 5.5 is in the model picker — on the OonaCode pool and on your own Claude subscription — with a 1M-token context. It costs the same as Sonnet 5 per token and usually needs fewer tokens for the same work.`],fixed:[`Claude Sonnet 5 is retired: a chat that was on it moves to Sonnet 5.5 at its next message, and the picker shows Sonnet 5.5.`]},{version:`0.3.176`,date:`2026-09-29`,platforms:[`win32`],added:[`Each chat has a Skills list beside Tools. Every skill starts off, so the model sees none of them and they cost nothing — about 1,400 tokens on every message until now. Switch one on to let the model use it by itself in that chat; the list shows what each one costs per message while on.`,`Typing /name still runs any skill for one turn, whether its switch is on or off.`],fixed:[`The engine’s built-in keyboard-shortcuts helper is turned off: it would have edited your own Claude Code settings.`]},{version:`0.3.175`,date:`2026-09-29`,platforms:[`win32`],added:[`Type / at the start of a message to see the chat’s commands and skills — the Claude Code engine’s own (/compact, /context, /review, /security-review, /init and more) and the skills in your project’s .claude folder — with what each does. Type to narrow the list, then Enter or Tab. They work with every model, not only Claude.`,`Your own skills: Settings → Skills lists the skills OonaCode gives every chat, and “Import from Claude Code…” copies the ones you choose from your Claude Code install — it only reads it, never changes it.`,`In the terminal app (oona), a command the chat’s engine knows — /context, /compact or a skill — now runs instead of answering “unknown command”.`],fixed:[`Typing /model in a chat updates the chat’s model and the model picker again.`,`Command output such as /context reads the same while it arrives and after you reopen the chat.`]},{version:`0.3.174`,date:`2026-09-28`,platforms:[`win32`],added:[`Search in the Import window. Type to find a chat by its name, its first or last message, or its folder — chats folded away as already imported or deleted here show up too when they match. Or open the search options and pick “Whole conversations” to search inside the chats themselves, with a few lines of each match under the chat. It only reads Claude Code, Cursor and the Claude app’s files, never changes them.`],fixed:[`Chats Claude Code switched to another model are answered by that model for real: OonaCode’s pool now serves the model the engine falls back to, and never answers a Claude request with another company’s model.`]},{version:`0.3.173`,date:`2026-09-28`,platforms:[`linux`],added:[`Every chat now has an “about”: a short note, written in the background by a cheap helper model of the chat’s own provider, saying what the chat works on. Your other chats read it — with each chat’s folder and when it was last active — when they look for the right chat to ask. See it, edit it or press Regenerate in the session info panel.`,`View → What chats are about… (and a sidebar button) lists every chat’s about and what writing them cost, with a switch to turn it off and “Generate for all chats now”. The switch and its numbers are also in Settings → This PC.`,`Your phone can now do from anywhere what this PC’s window does: switch each tool on or off per chat, see and control the conversations between your chats, read, edit and regenerate each chat’s “about”, and manage scheduled tasks. It needs this update on the PC and the next OonaCode app on the phone.`,`A chat can switch its own workspace. When the work belongs in another folder — a project you name that lives elsewhere, or a new project folder — the model proposes the switch and you answer Switch or Not now. It always asks you, even with “accept automatically” on, and the chat moves when its current step ends, with the conversation kept.`,`Right-click a chat tab → Delete (in red, under “Close all tabs”) deletes that chat after asking, just like Delete in the sidebar.`,`When Anthropic’s safeguards flag a chat and Claude Code moves it to another model for the rest of the run, the model box says so in red — for example “Opus 4.8 (safeguard)” — and the chat shows a notice at the switch. Picking a model takes the chat back to it at the next message.`],fixed:[`Typing in the message box while a chat is replying is no longer interrupted. With “accept automatically” on, an approval card flashed for an instant on some tool calls and took the cursor away from the box.`,`A permission card that appears while you are typing no longer takes the keyboard, so your next Space or Enter can never press Allow by accident.`,`“Send now” stays disabled and says “Sending now…” until the agent has taken the message — it can take a few seconds while the agent stops its current step, and a second press can no longer send it twice.`,`A message sent from your phone is confirmed by this PC, and the same message is never run twice when the phone sends it again after a lost connection.`,`File and folder names in a reply get their ▶, Open and Show in folder buttons only when they really exist on this PC. A bare file name is also looked for in the folder the reply named just before it.`,`A chat can no longer be moved into your home folder or the root folder through a link. Where /home is itself a link (Fedora Silverblue, Bazzite and similar systems), the home folder passed as an ordinary folder, and the chat would have loaded your own Claude Code settings as its project.`,`Signing in to your own Claude subscription inside the app works on Ubuntu 24.04, Debian, Linux Mint, Pop!_OS and Zorin OS again. There, a part of OonaCode built for newer systems did not load, and the sign-in fell back to a command you had to paste.`,"On Ubuntu, Linux Mint, Pop!_OS, Zorin OS and similar systems, `oona` now works in every new terminal right after you install or update. The installer used to leave it off your PATH until you logged out and back in; now it adds it for new terminals itself, and `oona uninstall` takes that line out again.",`Every way of uninstalling — “oona uninstall”, or the install command with --uninstall — now takes this PC off your account: keep your chats and they stay readable on your other devices; delete them and their copies go too. It never touches your Claude Code or the Claude app, and “oona uninstall” no longer gives up when the background service is stopped.`,`The installer now says at once when a system cannot run OonaCode — one older than Ubuntu 22.04, Debian 12 or RHEL 9, or one built on musl such as Alpine — instead of installing a copy that could not start. The .deb and .rpm tell apt and dnf the same.`]},{version:`0.3.172`,date:`2026-09-28`,platforms:[`win32`],added:[`When Anthropic’s safeguards flag a chat and Claude Code moves it to another model for the rest of the run, the model box says so in red — for example “Opus 4.8 (safeguard)” — and the chat shows a notice at the switch. Picking a model takes the chat back to it at the next message.`],fixed:[`Uninstalling from Settings → Apps now also takes this PC off your account, exactly like “oona uninstall”: keep your chats and they stay readable on your other devices; delete them and their copies go too.`,`“oona uninstall” no longer gives up when the background service is stopped.`,`The “Updating OonaCode…” window shows again on the newest Windows 11 versions (24H2 and later).`]},{version:`0.3.171`,date:`2026-09-28`,platforms:[`win32`],added:[`Oonak Browser now picks its own control port from a range no developer tool uses by default, so it can no longer take a port that Shopify CLI or a dev server wants. If a program needs a particular port kept free, or you want the browser on a specific one, just ask the chat.`],fixed:[`File and folder names in a reply get their ▶, Open and Show in folder buttons only when they really exist on this PC. A bare file name is also looked for in the folder the reply named just before it.`,`Uninstalling OonaCode from Settings → Apps now removes all of it — the app, the command line and its background service — and asks whether to keep your chats. Installing again afterwards no longer says it is already installed. Your Claude Code and Claude app are never touched.`,`“oona uninstall” works again on Windows 11.`,`A chat “about” you wrote yourself no longer shows “stale”.`]},{version:`0.3.170`,date:`2026-09-28`,platforms:[`win32`],added:[`Your phone can now do from anywhere what this PC’s window does: switch each tool on or off per chat, see and control the conversations between your chats, read, edit and regenerate each chat’s “about”, and manage scheduled tasks. It needs this update on the PC and the next OonaCode app on the phone.`],fixed:[`“Send now” stays disabled and says “Sending now…” until the agent has taken the message — it can take a few seconds while the agent stops its current step, and a second press can no longer send it twice.`,`A message sent from your phone is confirmed by this PC, and the same message is never run twice when the phone sends it again after a lost connection.`]},{version:`0.3.169`,date:`2026-09-28`,platforms:[`win32`],added:[`Every chat now has an “about”: a short note, written in the background by a cheap helper model of the chat’s own provider, saying what the chat works on. Your other chats read it — with each chat’s folder and when it was last active — when they look for the right chat to ask. See it, edit it or press Regenerate in the session info panel.`,`View → What chats are about… (and a sidebar button) lists every chat’s about and what writing them cost, with a switch to turn it off and “Generate for all chats now”. The switch and its numbers are also in Settings → This PC.`],fixed:[`A chat can no longer be moved into your user folder or a drive root through a link or junction that points there — its project settings would have been your own Claude Code settings.`]},{version:`0.3.167`,date:`2026-09-27`,platforms:[`win32`],added:[`A chat can switch its own workspace. When the work belongs in another folder — a project you name that lives elsewhere, or a new project folder — the model proposes the switch and you answer Switch or Not now. It always asks you, even with “accept automatically” on, and the chat moves when its current step ends, with the conversation kept.`],fixed:[]},{version:`0.3.166`,date:`2026-09-27`,platforms:[`win32`],added:[],fixed:[`Typing in the message box while a chat is replying is no longer interrupted. With “accept automatically” on, an approval card flashed for an instant on some tool calls and took the cursor away from the box.`,`A permission card that appears while you are typing no longer takes the keyboard, so your next Space or Enter can never press Allow by accident.`]},{version:`0.3.165`,date:`2026-09-27`,platforms:[`win32`],added:[`Right-click a chat tab → Delete (in red, under “Close all tabs”) deletes that chat after asking, just like Delete in the sidebar.`,`Chats now use Oonak Browser, in a window you can see, for everything that needs a web browser — not Chrome, Edge or a hidden script browser — unless you name another browser. It runs without a window (headless) only when you ask for that.`],fixed:[`After an update, the background service comes back by itself. An update could leave it unable to restart, and the app then showed “OonaCode could not start its host service” even though it went on to open normally.`]},{version:`0.3.164`,date:`2026-09-27`,platforms:[`win32`],added:[`Send now: a message you typed while the agent works has a Send now button while it waits. It stops what the agent is doing right now and sends your message immediately — the step that is running is cut. On the desktop and the phone.`,`Conversations → Map: see at a glance which chats are talking to each other. Each conversation is a hub with a line to each of its chats; working chats pulse; click a hub for its history or a chat to open it.`],fixed:[`A restart no longer signs this PC out when OonaCode’s stored key cannot be opened for a moment. OonaCode used to replace the key and lose your sign-in; it now keeps the key and signs you back in by itself as soon as it opens.`]},{version:`0.3.163`,date:`2026-09-27`,platforms:[`linux`],added:[`Send now: a message you typed while the agent works has a Send now button while it waits. It stops what the agent is doing right now and sends your message immediately — the step that is running is cut. On the desktop and the phone.`,`Conversations → Map: see at a glance which chats are talking to each other. Each conversation is a hub with a line to each of its chats; working chats pulse; click a hub for its history or a chat to open it.`],fixed:[`A restart no longer signs this PC out when its security chip is slow to open OonaCode’s stored key. After a system update and reboot, the chip on some machines refuses for a while; OonaCode used to replace the key and lose your sign-in. It now keeps the key and signs you back in by itself as soon as the chip opens it.`]},{version:`0.3.162`,date:`2026-09-27`,added:[],fixed:[`A chat switched to another model knows which model it is. After a switch from Claude to DeepSeek, the model used to keep saying it was Claude — the chat history and Claude Code’s own prompt told it so.`,`Oonak Browser is offered only where it can run. An older OonaCode no longer lists a browser tool it cannot use, so the model does not spend tokens working around it — update to get the browser.`]},{version:`0.3.161`,date:`2026-09-27`,added:[`Settings → This PC → “Replace pictures older than N days”: screenshots and pasted pictures in your chat history are replaced by a short note once they are older than a year (you choose the number, or 0 to keep them). The words of every chat stay; the database stops growing with pictures. It runs by itself.`],fixed:[`The model, Build/Plan/Ask and effort pickers under the message box now look like the dropdowns they are.`,`Switches that are off are easy to see in dark mode.`,`Error messages show what went wrong in words, without raw tags or a provider’s JSON.`,`The ✕ that removes an attachment or a reply is round.`,`Pressing Stop, or an update cutting a turn, no longer files an automatic bug report.`]},{version:`0.3.160`,date:`2026-09-27`,added:[`On Windows, the agent can use a real browser. Ask it to open a site, read a page, click, fill in a form or take a screenshot, and it does it in Oonak Browser, in a window you can see. The first time, OonaCode asks once to install the browser (about 210 MB); after that it opens straight away.`,`Each chat has its own browser profile, so a site you sign in to stays signed in for that chat. Switch the browser off for a chat in its Tools menu.`],fixed:[]},{version:`0.3.159`,date:`2026-09-27`,added:[],fixed:[`A chat reopened after an update no longer says “turn complete” the instant you send a message and then answer anyway. The engine’s own note about work that stopped during the update used to be taken for the end of your turn, with the whole earlier conversation’s tokens on the line.`,`A background task that stopped because OonaCode restarted now says so in plain words, instead of “Orphaned by a previous Claude Code process exit”.`]},{version:`0.3.158`,date:`2026-09-27`,added:[`Every thought in a chat shows how many words it has, so you can tell at a glance whether there is anything to read.`],fixed:[`A thought with nothing in it — some models return only a signature for their thinking — now says “Thought · empty” and no longer opens onto a blank box.`,`A command the agent was allowed to run no longer leaves an “Allowed Bash (automatically)” line under its own card: the card already shows the command and its result. Refusals are still shown.`]},{version:`0.3.157`,date:`2026-09-27`,added:[`On Linux, OonaCode has its own signed apt and dnf repositories. Install the app with apt (Debian, Ubuntu, Mint) or dnf (Fedora, RHEL, Rocky, Alma) — the commands are on the download page — and your package manager keeps it up to date with the rest of the system.`,`Every Linux release is signed with the OonaCode release key, and the one-line installer checks that signature before it installs anything.`],fixed:[`On Linux, the menu bar is drawn in the window in the app’s own colours, and it switches between light and dark with the app instead of keeping the desktop’s theme until a restart.`,`Upgrading the .rpm no longer removes the oonacode command, and removing it no longer leaves empty folders behind.`]},{version:`0.3.156`,date:`2026-09-27`,added:[`Chats can talk to each other. Turn on “Talk to other chats” in a chat’s Tools menu, and its agent can find your other chats that have it on, read them, and ask them for help — one chat or a whole group. A chat that is closed wakes up to answer; a busy one answers when it finishes. The reply comes back to the chat that asked.`,`The Conversations window (in the sidebar) shows every conversation between your chats: who said what to whom, what each answer cost, and buttons to pause, resume, close or stop them all. Each conversation has a budget — 20 messages and 1,000,000 new tokens by default — and pauses itself when it is used up, so chats can never talk forever.`,`Hover over any tool in a chat’s Tools menu to read what it does, how it works, what it costs and how to turn it off.`],fixed:[`A chat woken in the background — by a scheduled task or another chat — shows as working in the sidebar even when it is not open in a tab.`,`A scheduled task no longer slips into a chat at the same moment you send it a message; yours always goes first.`,`A message sent from the terminal no longer waits forever when a chat’s history cannot be resumed and the restart fails. It now says why.`,`Notes OonaCode writes into a chat — a model change, a conversation paused — are still there when you reopen it.`,`When every Claude seat in the OonaCode pool is taken, a new chat now says the model is busy and to try again in a few minutes or pick another model, instead of “Something went wrong on our side”.`,`On Linux, the app tells you it is updating while it swaps itself, so there is no need to start it again.`,`On Linux, removing the .deb or .rpm leaves nothing running and nothing failing at the next login, and the one-line installer checks for free disk space before it changes anything.`]},{version:`0.3.155`,date:`2026-09-27`,added:[`OonaCode runs on Linux. One command installs the command line, the background service and the desktop app: curl -fsSL https://oonacode.oonak.ai/install.sh | bash. The AppImage, .deb and .rpm are on the download page too.`,`On Linux the app lives in the system tray as it does on Windows, follows your desktop’s light or dark theme, and gets its own entry in the applications menu.`,`Uninstalling on Linux removes the desktop app along with the rest, and asks whether to keep your chats for a future install.`],fixed:[`A window no longer stays on “Unauthorized” after the background service restarts with a new key. It reconnects by itself.`]},{version:`0.3.154`,date:`2026-09-26`,added:[],fixed:[`A chat waiting on a long job no longer loses its watcher. OonaCode used to close a chat’s engine ten minutes after the model last spoke, which stopped any Monitor or background command it had left running. The engine now stays up while such work runs, up to 12 hours.`,`A chat moved into a project, or whose project you edit, now follows the project’s instructions from its next message. It used to keep the ones it started with.`]},{version:`0.3.153`,date:`2026-09-25`,added:[],fixed:[`A very long chat no longer answers “Prompt is too long” after OonaCode restarts or updates. The engine was judging the chat’s size by a figure left over from before the restart, and now gets an accurate one.`,`If a message is ever refused as too long before the model has started on it, OonaCode sends it again by itself with a shorter history. You see your message once and then the answer, not an error.`]},{version:`0.3.152`,date:`2026-09-25`,added:[],fixed:[`Uninstalling the app from Windows’ Apps list no longer stops the command-line OonaCode on the same PC from starting after a restart.`]},{version:`0.3.151`,date:`2026-09-25`,added:[`Files the agent names in a chat are clickable. Audio and video play right in the chat with a small player, pictures open as a preview, and in the app every file can be opened in its own program or shown in its folder.`,`Uninstalling the app asks whether to keep your chats on this PC. Keeping them means a new install signs in and continues every chat.`],fixed:[`Installing and updating no longer fail with “The operation has timed out” on PCs whose network drops the newer internet addresses, nor while our server restarts for an update.`]},{version:`0.3.150`,date:`2026-09-25`,added:[],fixed:[`The fix in 0.3.149 for long, sleeping turns now really reaches the agent: the Monitor tool and the block on long waits are on for every chat.`,`A chat compacted after a long pause no longer pays to cache a conversation it is about to replace, and the agent keeps each tool call in its history exactly as it wrote it — both as Claude Code does.`]},{version:`0.3.149`,date:`2026-09-25`,added:[`The agent can watch a long job with the Monitor tool, as Claude Code does, and is woken the moment the job finishes.`],fixed:[`Long chats no longer spend their time asleep. With no way to watch a background job, the agent had been polling it with waits of four to eight minutes. One chat spent more than three and a half hours of a day sleeping, and turns ran for hours while the model worked for a fraction of that. The agent now gets the same working rules as Claude Code, and long waits are blocked.`]},{version:`0.3.148`,date:`2026-09-25`,added:[],fixed:[`A scheduled task that could not be sent — the PC had just restarted, the vault was still locked, the server was not reachable yet — waits and tries again instead of switching itself off. Pausing, editing or deleting a task while its prompt is being sent is no longer undone, and a scheduled prompt no longer lands in a chat whose engine is still starting.`,`A chat on your own DeepSeek key, or one switched with a typed “/model opus”, is no longer shown as withdrawn and locked. “/model fable” picks Claude Fable instead of the default model.`,`Moving a chat to another model no longer lowers its saved effort level to what the old model offered, and a one-off “oona --effort” is no longer saved as the chat’s level.`,`After you pick another model for a locked chat and send, the chat no longer flashes the lock again while the engine starts; if the start fails, your pick is kept.`,`Coming back from a file tab no longer jumps the chat to an old reply or reopens the search bar.`,`The hidden sidebar slides away again when the pointer leaves the window past its edge, and the keyboard no longer tabs through it while it is hidden. Clicking ⓘ in Settings opens its note instead of closing it.`,`Subagents write their prompt cache for five minutes, as Claude Code does for its subscribers; the chat itself keeps the hour. Their cache writes cost less.`]},{version:`0.3.147`,date:`2026-09-25`,added:[`A chat’s scheduled tasks sit beside its subagents: a clock badge says how many are live and when the next one runs, and opens the list — each task’s schedule, its next and last run, Pause and Delete. The tasks run on this PC.`],fixed:[`A prompt the scheduler sends into a chat reads as a “Scheduled task” line, not as your own message waiting in the queue.`,`A chat whose model is no longer offered shows that model in red and waits for you to pick another; its history stays, and the old model is not in the list any more.`,`The effort list follows the server within minutes, without restarting the app. A chat set to a level that has been switched off moves to the nearest one — ultracode becomes xhigh. Chats on your own Claude subscription have an effort picker again.`]},{version:`0.3.146`,date:`2026-09-25`,added:[`A Tools menu beside the model picker: switch OonaCode’s own tools on or off for each chat — browser, desktop and window control, clipboard, screen capture, Office documents and run-as-administrator. Each tool costs the model only a short line until it is used, and the menu shows how much. The first tools are marked Demo while they are tested with every model: a demo tool answers what it would have done, and does nothing on your PC yet.`],fixed:[]},{version:`0.3.145`,date:`2026-09-25`,added:[],fixed:[`Every request of every chat, on every model, is about 3,200 tokens smaller: the engine’s own “auto memory” instructions are gone. OonaCode starts each engine in a fresh private folder and deletes it afterwards, so the notes the model was told to keep there were thrown away when the chat went idle — the model spent tool calls writing memories it would never read. A project’s memory is OonaCode’s own and stays.`,`The engine’s claude.ai Artifact tools are switched off everywhere OonaCode runs it — the app, the terminal, VS Code, the phone, Telegram and the agent API.`]},{version:`0.3.144`,date:`2026-09-25`,added:[],fixed:[`Long chats on Claude models in the OonaCode pool keep their cache for an hour, as Claude Code does for its subscribers. A pause of more than five minutes no longer re-sends the whole conversation at the full cache-write price, which in a large chat was the most expensive part of coming back to it.`,`The session panel’s Context shows how big the conversation is now, not the total of every request the chat ever made — a long chat read “10.7M / 1.0M tokens”.`,`The message box keeps the cursor after you send, so you can go straight on typing the next message.`,`A paid chat’s background work (titles, reading web pages) no longer goes to a free model of the same vendor.`]},{version:`0.3.143`,date:`2026-09-24`,added:[`Search inside your chats: open the search in the chat list, press the sliders button and choose Whole chats. It looks through every message of every chat on this PC, and you choose whose words — yours, the model’s, or both — plus, if you like, the tools’ commands and output and the subagents’ conversations. Results show each message with the words lit; a click opens the chat with its search on them.`,`More search options, for both kinds of search: one project only, a time window (today, 7 or 30 days), match case and whole words.`],fixed:[`While you search the chat list, projects with no matching chat are hidden too.`]},{version:`0.3.142`,date:`2026-09-24`,added:[],fixed:[`A reply you sent shows as the same small chip it had in the message box — “Reply to” and the first few words — instead of the whole quoted text; the full quote appears when you rest the pointer on it, and a click jumps to the message it answers.`,`The model now knows a reply points back into the conversation: it is told the quoted lines are from the chat history, not new input, and whose words they were — its own earlier reply, your earlier message, a file, or a tool’s output.`,`When the chat list is narrow, its buttons wrap onto a second line instead of spilling out of it.`]},{version:`0.3.141`,date:`2026-09-24`,added:[`The chat list on the left can be made wider or narrower: drag its right edge (double-click it for the usual width).`,`The chat list can hide: press the pin in its header, the button at the top left, or View → Sidebar (Ctrl+B). While hidden it slides in when the pointer reaches the left edge of the window, and slides away when you leave it.`,`Search in the chat list is a single magnifier now; click it and the search box opens across the top. Escape or × clears it.`],fixed:[`Opening OonaCode right after a restart no longer leaves the OonaCode pool models out of the model list: if they cannot be read yet, OonaCode asks again by itself a few seconds later and the list fills in.`,`The Artificial Analysis scores (intelligence, coding, speed and benchmarks) show on every model in the model list again — including the models of your own Claude and SuperGrok subscriptions, which never had them.`,`A chat’s details card no longer appears on top of its right-click menu.`]},{version:`0.3.140`,date:`2026-09-24`,added:[`Reply is tidier: the message you reply to shows as a small chip above the message box with its first few words, instead of filling the box. Click the chip — or the quote in a sent reply — to jump to that message; the × removes it.`,`Right-click a project in the sidebar for its settings: Project settings… opens Projects with that project already selected. The gear beside a project’s “+” does the same, and a chat filed in a project offers it in its own menu too.`,`Link GitHub. Under a project’s Repositories (and in Settings → Providers), link your GitHub account once: the agent’s git and gh then clone, pull and push your private repositories on every PC of yours. You type a short code on github.com; the token stays in your encrypted vault and never reaches the OonaCode server. Public repositories need nothing.`],fixed:[]},{version:`0.3.139`,date:`2026-09-24`,added:[`Every setting now says what it does, and resting the pointer on the ⓘ beside it tells you where in OonaCode it applies and what it does not do.`,`Export chats… is in the File menu (and on the sidebar in a browser window) instead of in Settings.`,`With Remote access turned off on a PC, your phone, Telegram, the website and your other PCs still show it — online or not — marked “remote access off”, and opening it tells you to turn Remote access back on in OonaCode on that PC.`],fixed:[`Turning Remote access off now tells your other devices at once. Before, the PC was already unreachable from them, but they could not say why.`,`The settings of This PC save the moment you change them — nothing is lost by closing the dialog.`,`Settings that did nothing, or repeated another one, are gone: the default permission mode (each chat’s Build / Plan / Ask first picker decides), the agent-picker switch, the Git Bash path, the engine path and the extra allowed origins. The server address is shown, not edited — signing in sets it.`]},{version:`0.3.138`,date:`2026-09-24`,added:[`Projects have settings now, like the Claude app’s: a goal, the repositories the project works on, what a new chat in it starts on (model, effort and folder), a project memory the agent keeps up to date, and whether its chats may schedule work — and how often at most. All of it is in Projects, and a Claude app project you import brings its own.`,`OonaCode has a scheduler. Ask the agent to do something later or on a repeat — “check the build every morning at nine” — and it schedules it on this PC; when it is due, the prompt arrives in the chat, even if the chat had gone quiet. The Projects dialog and the chat’s info panel list what is scheduled, where you can pause, resume or delete it.`],fixed:[`Saving a project’s instructions now reaches its chats at their next message, instead of waiting until the chat happened to restart.`]},{version:`0.3.137`,date:`2026-09-24`,added:[],fixed:[`After a PC restart the app could ask for a "host token" and sign you out: two copies of the OonaCode background service started at once and fought over your session. Only one ever runs now, and the app never shows the token page — if its service is replaced it reconnects by itself.`,`The unlock screen stays put until you unlock, and says what went wrong in place — a wrong password, or a connection it is re-establishing — instead of jumping to another page.`,`A message with a picture sent while the agent was working stayed “queued”, and removing it said it was already sent. It now shows as read the moment the agent takes it, and a reopened chat shows it with its picture.`,`In the model’s questions, typing your own answer now clears the options you had picked, and picking an option clears what you typed — the answer sent is exactly the one you chose. The same on the phone, in the terminal and in Telegram.`]},{version:`0.3.136`,date:`2026-09-24`,added:[`Every model now has its own housekeeper — the small, fast model of the same maker that writes a chat’s titles and reads the web pages it fetches. On the OonaCode pool a MiMo v2.6 Pro chat uses MiMo v2.6 Flash, a Qwen chat Qwen3.8 Flash, a GLM chat GLM-5.3 Flash and a GPT-5 chat GPT-5 mini, instead of doing that work on the big model itself. A free model keeps its own, so it stays free.`],fixed:[]},{version:`0.3.135`,date:`2026-09-24`,added:[],fixed:[`Claude models on the OonaCode pool — Opus 5.5, Opus 5, Sonnet 5 and Fable 5.1 — now use their whole 1M context. A long chat no longer stops to summarise itself every ~170k tokens, and its subagents get the same window.`,`Reading a web page is quick again in a Claude chat: pages are read by Claude Haiku, as in Claude Code, instead of a helper that took about a minute a page.`,`Changing a chat’s model now moves its subagents and background helpers to the new model too; before, they stayed on the old one until the app restarted.`,`MiMo v2.5 and v2.5 Pro chats now use their full 1M context too.`]},{version:`0.3.134`,date:`2026-09-23`,added:[],fixed:[`On the Android app, the model’s questions can be answered again. They come one at a time — “Question 2 of 3” — with Back, Next and Skip, and Answer sends them to your PC. The card used to show only the first question, hide the rest below it and wait for all of them, so it could not be sent.`]},{version:`0.3.133`,date:`2026-09-23`,added:[`Bring your Claude desktop app projects across: File → Import chats from other coding agents now lists every project the Claude app has opened on this PC. Each one arrives as an OonaCode project of the same name — its goal, instructions and what Claude noted about it become the project’s instructions — with its project chat and one chat per thread filed under it, ready to carry on.`,`A Claude Code chat you moved into a Claude app project is filed under that project here too.`,`A thread you never opened in the Claude app still comes across, with its task and every reply the project chat saw; open it once in the Claude app and import again for its whole conversation.`],fixed:[`Cursor chats appear in the import list again — they had been left out since September 10.`]},{version:`0.3.132`,date:`2026-09-23`,added:[`Reply to any part of a chat: select some text (or just right-click a block), choose Reply, and it is quoted in your message box — type your answer under it. A quote from a file the agent read names the file.`,`Right-click in a chat: copy what you selected, copy a whole reply or tool output, copy a code block or a link, find the selected words in the chat, or select a block.`,`Search in a chat opens the block its match is in — a folded tool card, a thought, a finished agent’s work — and scrolls to the words themselves.`,`Search matches are now bright orange, the current one strongest, so they stand out on code too.`,`The file viewer shows pictures (PNG, JPEG, GIF, WebP, SVG and more), plays audio and video, and shows Markdown formatted, with a switch to the source.`,`Right-click a file or folder in the explorer to copy its path or delete it.`],fixed:[`Moving a chat to another folder or project while it was working could delete the folder it was working in, start two agents at once, or send your next message to the old folder.`,`The working line no longer says a chat may be stuck while it waits for your approval or answer, or right after you send a message, and it counts time correctly (no more "4m 60s").`,`A date line no longer says "Today" for yesterday’s messages when the app stays open past midnight.`,"Installing with npm (`npm i -g oonacode`) installs this version again; earlier npm releases carried an old program.",`The What’s new window could open again on the next start, showing the same update a second time.`,`An older OonaCode window or VS Code extension no longer resets settings it does not know about, such as your theme colours or which project groups you folded.`,`A new install no longer opens with a list of changes; this window now appears only after an update.`,`The notification switch for permissions now says it also covers the agent’s questions.`]},{version:`0.3.131`,date:`2026-09-23`,added:[`Claude Opus 5.5 is here — the newest Opus, and cheaper to run than Opus 5. Choose it in the model picker, from the OonaCode pool or on your own Claude subscription. It runs on the newer Claude Code engine (2.1.280) that this update brings.`,`Every block in a chat shows its time at the bottom right, in your local time — hover it for the full date — and a date line marks where each day starts.`,`A running chat tells you how long the agent has been quiet, and after five minutes that it may be stuck and what to do.`,`After every update, OonaCode now opens this window to show you what changed.`],fixed:[`A reply that streamed in live had no time on it until the chat was opened again.`,`Chats open in tabs could fail to come back after a restart if a setting changed while they were being restored.`]}];function Zc(e,t){let n=e=>{let[t,...n]=e.trim().replace(/^v/,``).split(`-`);return{nums:(t??``).split(`.`).map(e=>Number.parseInt(e,10)||0),pre:n.length>0?n.join(`-`):null}},r=n(e),i=n(t);for(let e=0;e<Math.max(r.nums.length,i.nums.length);e++){let t=(r.nums[e]??0)-(i.nums[e]??0);if(t!==0)return t}return r.pre===i.pre?0:r.pre===null?1:i.pre===null?-1:Qc(r.pre,i.pre)}function Qc(e,t){let n=e.split(`.`),r=t.split(`.`);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e],i=r[e];if(t===i)continue;if(t===void 0)return-1;if(i===void 0)return 1;let a=/^\d+$/.test(t),o=/^\d+$/.test(i);if(a&&o){let e=Number(t)-Number(i);if(e!==0)return e;continue}return a===o?t<i?-1:1:a?-1:1}return 0}function $c(e,t,n=Xc,r=null){if(!e||e===`0.0.0`)return[];let i=n.filter(t=>Zc(t.version,e)<=0&&(!r||!t.platforms||t.platforms.includes(r)));return[...t===null?i.filter(t=>Zc(t.version,e)===0):i.filter(e=>Zc(e.version,t)>0)].sort((e,t)=>Zc(t.version,e.version))}function el(e,t,n,r=Xc,i=null){if(!e||e===`0.0.0`)return{record:null,show:[]};let a=null;for(let e of r)(a===null||Zc(e.version,a)>0)&&(a=e.version);let o=a!==null&&Zc(e,a)>0?a:e;return{record:t===null||Zc(o,t)>0?o:null,show:t===null&&!n?[]:$c(e,t,r,i)}}function tl(e,t){if(t==null)return[...e];if(t.length===0)return[];let n=new Set(t),r=e.filter(e=>n.has(e.id));return r.length>0?r:[...e]}var nl=`:free`;function rl(e){return e.endsWith(nl)}function il(e){return rl(e)?e.slice(0,-5):e}var al=`the user skipped the question`,ol=`(the user skipped this question)`;function sl(e){let t=e?.questions;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=e;if(typeof t.question!=`string`)continue;let r=Array.isArray(t.options)?t.options.map(e=>e&&typeof e==`object`?e:null).filter(e=>e!==null&&typeof e.label==`string`).map(e=>({label:e.label,...typeof e.description==`string`?{description:e.description}:{}})):[];n.push({question:t.question,header:typeof t.header==`string`?t.header:``,options:r,multiSelect:t.multiSelect===!0})}return n}function cl(e,t,n={},r=new Set){let i={};return e.forEach((e,a)=>{if(r.has(a)){i[e.question]=ol;return}let o=(n[a]??``).trim();i[e.question]=o||(t[a]??[]).join(`, `)}),i}function ll(e){let t=e.questions,n=t===1?`question`:`questions`,r=t===1?`the model’s question`:`the model’s questions`,i=t===1?`The model’s question was`:`The model’s questions were`;switch(e.outcome){case`answered`:{let r=e.answers?Object.values(e.answers):null,i=r?r.filter(e=>typeof e==`string`&&e!==``&&e!==`(the user skipped this question)`).length:t;return t>0&&i<t?`You answered ${i} of ${t} ${n}`:t===0?`You answered the model’s questions`:t===1?`You answered the model’s question`:`You answered ${t} ${n}`}case`skipped`:return`You skipped ${r}`;case`dismissed`:return`${i} dismissed`;case`unanswered`:return`${i} not answered — the turn ended`}}function ul(e){if(!e||typeof e!=`object`)return null;let t=e.answers;return t&&typeof t==`object`&&!Array.isArray(t)?t:null}var dl=[`win32`,`linux`,`darwin`],fl=[`demo`,`live`],pl=[`allow`,`ask`],ml=[`string`,`number`,`integer`,`boolean`,`array`,`object`];function hl(e){let t=e/1048576;return t>=100?`${Math.round(t)} MB`:t>=1?`${t.toFixed(1)} MB`:`${Math.max(1,Math.round(e/1024))} KB`}function gl(e){if(e.toolName!==`InstallToolPack`)return null;let t=e.input;return!t||typeof t!=`object`||typeof t.pack!=`string`||typeof t.name!=`string`||typeof t.version!=`string`||typeof t.sizeBytes!=`number`||typeof t.path!=`string`?null:{pack:t.pack,name:t.name,version:t.version,sizeBytes:t.sizeBytes,path:t.path}}function _l(e,t){let n=t?.[e.slug];return typeof n==`boolean`?n:e.defaultOn}function vl(e,t){return e.filter(e=>_l(e,t))}var yl={slug:48,name:80,entryTool:40,description:2e3,promptLine:1e3,details:8e3,actionDescription:1e3,params:30,paramName:48,paramDescription:400,enumValues:40,callArgKeys:20,callError:500,callBatch:100},bl=/^[A-Za-z0-9_-]+$/;function xl(e){return typeof e==`string`&&e.length>0&&e.length<=yl.entryTool&&bl.test(e)}function Sl(e){return Math.ceil(e.length/4)}function Cl(e){return Sl(`${e.entryTool} ${e.description}`)+55}function wl(e){return e.tokensPerRequest??Cl(e)+(e.promptLine?Sl(e.promptLine):0)}var Tl=Uo({type:$o(ml),required:Fo().optional(),enum:Vo(Go([H(),jo()])).optional(),description:H().optional()}),El=Uo({slug:H().min(1),description:H(),params:Zo(H(),Tl),permission:$o(pl),sort:jo()}),Dl=Uo({version:H(),url:H(),sha256:H(),sizeBytes:jo(),exe:H(),format:ts(`zip`)}),Ol=Uo({slug:H().min(1),name:H(),entryTool:H().refine(xl,`not a valid tool name`),description:H(),promptLine:H().nullable(),details:H().nullable().optional(),status:$o(fl),defaultOn:Fo(),sort:jo(),install:Dl.nullable(),actions:Vo(El)}).loose();Uo({platform:$o(dl),version:H(),packs:Vo(Ol),refreshMinutes:jo()});var kl=[`No answer needed.`,`"Talk to other chats" is off in this chat: this message is from another chat's agent, not the person, and you cannot message chats. Your final answer goes back to that chat by itself.`,`"Talk to other chats" is off in this chat: this message is from another chat's agent, not the person, and you cannot message chats. It asked for no answer, so nothing goes back.`,`Last hop of this chain: you cannot message chats in this turn; put what you have in your final answer.`];[`**Let this chat work together with your other chats.**`,``,`### What it does`,`- Finds your other chats on this PC and reads their recent messages.`,`- Sends one chat, or a group of chats, a message or a task.`,`- Brings their answers back to this chat, by itself.`,``,`### How it works`,`- A chat that is asleep is woken from its saved history. A busy one gets the message when its current turn ends, never in the middle of it.`,`- The other chat does the work with its own model, folder and tools. Its answer comes back here as a new message only when this chat asked for one.`,`- Several messages from one chat that wait for a busy chat are handed over together, in one turn, with one answer.`,`- Several chats can share one conversation (a group). An answer goes only to the chat that asked, so a group cannot multiply its own messages.`,`- A chat with this switch OFF can still be messaged by a chat that has it on. It does the work, and its final answer goes back to that chat when that chat asked for one. That is all it can do: it gets none of these tools, cannot message or read other chats, and its switch stays off.`,``,`### What it costs`,`- About 650 tokens on every request while it is on, read from the prompt cache. Nothing while it is off, even in a chat that is messaged.`,`- Every message makes the chat that receives it do a turn, which spends its own tokens.`,`- Switching it on or off in a chat that already has a conversation re-writes its prompt cache once.`,``,`### Safety limits`,`- Each conversation has a budget: 20 delivered messages and 1,000,000 new tokens by default (context read back from the prompt cache is not counted). Reaching either pauses the conversation, and the chats say so.`,`- A chain stops after 3 hops (a message caused by a message caused by a message).`,`- At most 5 messages between two chats and 20 from one chat in 10 minutes, and 10 waiting for any one chat. A chat cannot message itself.`,`- A conversation with no activity for 24 hours closes by itself.`,``,`### How to stop it`,`- Turn this switch off: the chat loses these tools, and what it sent and the answers it asked for pause. It still answers a chat that messages it.`,`- Or open the Conversations window and use Pause, Close or Stop all.`,``,`### Privacy`,`- Everything stays on your PC: the messages are kept in this PC's database, never on OonaCode's server.`,`- A message never grants anything. The other chat runs with its own permissions and asks you as usual.`,``,`Only a chat with this switch on can start a conversation; a chat with it off only answers.`].join(`
78
78
  `);var Al={hops:3,rateWindowMs:6e5,perPair:5,perSender:20,pendingPerTarget:10,idleCloseMs:864e5,messageChars:2e4,titleChars:80,conversationTitleChars:120,recipients:10,listChats:50,readMessages:50,budgetMessagesMax:1e4,budgetTokensMax:1e9},jl={message:`✉️ Message from chat "`,reply:`↩️ Reply from chat "`,continue:`↻ Continue the message from chat "`},Ml=`⚠ `,Nl=`<local-command-stdout>`,Pl=`</local-command-stdout>`,Fl=/^[A-Za-z0-9._:-]{1,128}$/;function Il(e){let t=(e??``).replace(/["“”]/g,`'`).replace(/\s+/g,` `).trim();if(!t)return`Untitled chat`;let n=Al.titleChars;return t.length>n?`${t.slice(0,n-1).trimEnd()}…`:t}function Ll(e){return Il(e.title?.trim()||e.firstPrompt?.trim()||`Chat ${e.id.slice(0,8)}`)}function Rl(e,t){let n=kl.filter(e=>t===`reply`||e!==`No answer needed.`),r=e;for(let e=!0;e;){e=!1;for(let t of n){if(r===t)return``;r.startsWith(`${t}\n\n`)&&(r=r.slice(t.length+2),e=!0)}}return r}var zl=/^\[conv:(\S+) chat:(\S+) host:(\S+) msg:(\S+?)(?: reply-to:(\S+?))?( reply expected)?\]$/;function Bl(e){if(typeof e!=`string`)return null;let t=e;t.startsWith(Nl)&&t.endsWith(Pl)&&(t=t.slice(22,t.length-23)),t=t.replace(/\r\n/g,`
79
79
  `);let n=t.indexOf(`
80
80
  `);if(n<0)return null;let r=t.slice(0,n),i=t.slice(n+1),a=i.indexOf(`
@@ -94,7 +94,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
94
94
  `)}var Ku=/([.!?…։؟。!?]+["'»”)]*)(\s+|$)/gu,qu=/([,;:،؛՝、,;]\s+)/u;function Ju(e,t=280){let n=[];for(let r of e.split(/\n+/)){let e=r.trim();if(!e)continue;let i=0,a=[];for(let t of e.matchAll(Ku)){let n=(t.index??0)+t[1].length;a.push(e.slice(i,n).trim()),i=n+(t[2]?.length??0)}i<e.length&&a.push(e.slice(i).trim());for(let e of a)if(e)for(let r of Yu(e,t)){let e=n[n.length-1];e!==void 0&&r.length<12&&e.length+r.length+1<=t?n[n.length-1]=`${e} ${r}`:n.push(r)}}return n}function Yu(e,t){if(e.length<=t)return[e];let n=[],r=``;for(let i of e.split(qu))if(i){if((r+i).length<=t){r+=i;continue}for(r.trim()&&n.push(r.trim()),r=i;r.length>t;){let e=r.lastIndexOf(` `,t),i=e>t/3?e:t;n.push(r.slice(0,i).trim()),r=r.slice(i)}}return r.trim()&&n.push(r.trim()),n}var Xu={version:2,drop:[`՛`,`՜`],numbers:{units:[`զրո`,`մեկ`,`երկու`,`երեք`,`չորս`,`հինգ`,`վեց`,`յոթ`,`ութ`,`ինը`],teens:[`տասը`,`տասնմեկ`,`տասներկու`,`տասներեք`,`տասնչորս`,`տասնհինգ`,`տասնվեց`,`տասնյոթ`,`տասնութ`,`տասնինը`],tens:[``,``,`քսան`,`երեսուն`,`քառասուն`,`հիսուն`,`վաթսուն`,`յոթանասուն`,`ութսուն`,`իննսուն`],hundred:`հարյուր`,thousand:`հազար`,million:`միլիոն`,ordinal_1_4:[``,`առաջին`,`երկրորդ`,`երրորդ`,`չորրորդ`],ordinal_suffix:`երորդ`,ordinal_marks:[`րդ`,`երորդ`]},latin:{visa:`վիզա`,mastercard:`մաստերքարդ`,paypal:`փեյփալ`,"wi-fi":`վայֆայ`,wifi:`վայֆայ`,bluetooth:`բլութութ`,usb:`յուէսբի`,gps:`ջիփիէս`,sms:`էսէմէս`,pdf:`փիդիէֆ`,qr:`քյուառ`,ok:`օքեյ`,online:`օնլայն`,offline:`օֆլայն`,email:`իմեյլ`,"e-mail":`իմեյլ`,iphone:`այֆոն`,android:`անդրոիդ`,windows:`վինդոուս`,google:`գուգլ`,facebook:`ֆեյսբուք`,youtube:`յութուբ`,instagram:`ինստագրամ`,telegram:`տելեգրամ`,whatsapp:`վաթսափ`,viber:`վայբեր`,zoom:`զում`,tiktok:`թիքթոք`,netflix:`նեթֆլիքս`,uber:`ուբեր`,apple:`էփլ`,samsung:`սամսունգ`,microsoft:`մայքրոսոֆթ`,arev:`Արև`,astgh:`Աստղ`,artsiv:`Արծիվ`},lexicon:[[`անգամ`,`անքամ`]]},Zu={oonacode:`ունակոդ`,claude:`քլոդ`,gemini:`ջեմինի`,github:`գիթհաբ`,linux:`լինուքս`,api:`էյփիայ`,app:`էփ`},Qu=/(?<![\p{L}\p{N}_])(\p{Nd}{1,3}(?:[ \u00A0]\p{Nd}{3})+|\p{Nd}+)(?:-([ա-և]+))?/gu,$u=/\p{Nd}/u,ed=/[A-Za-z][A-Za-z0-9]*(?:[-'][A-Za-z0-9]+)*/g;function td(e){return e&&e[0].toUpperCase()+e.slice(1)}function nd(e){let t=e.codePointAt(0);if(t>=48&&t<=57)return t-48;let n=t;for(;$u.test(String.fromCodePoint(n-1));)--n;return(t-n)%10}function rd(e,t){let n=Math.floor(e/100),r=e%100,i=[];if(n&&i.push(n===1?t.hundred:`${t.units[n]} ${t.hundred}`),r>=20){let e=r%10;i.push(t.tens[Math.floor(r/10)]+(e?t.units[e]:``))}else r>=10?i.push(t.teens[r-10]):(r||!i.length)&&i.push(t.units[r]);return i.join(` `)}function id(e,t){if(e.length>9)return Array.from(e,e=>t.units[Number(e)]).join(` `);let n=Number(e),r=Math.floor(n/1e6);n%=1e6;let i=Math.floor(n/1e3);n%=1e3;let a=[];return r&&a.push(`${rd(r,t)} ${t.million}`),i&&a.push(i===1?t.thousand:`${rd(i,t)} ${t.thousand}`),(n||!a.length)&&a.push(rd(n,t)),a.join(` `)}function ad(e,t){if(e.length===1&&e>=`1`&&e<=`4`)return t.ordinal_1_4[Number(e)];let n=id(e,t);return(n.endsWith(`ը`)?n.slice(0,-1):n)+t.ordinal_suffix}function od(e,t,n){if(n.ordinal_marks.includes(t))return ad(e,n);let r=id(e,n);return r.endsWith(`ինը`)?r=`${r.slice(0,-1)}ն`:r.endsWith(`ը`)&&(r=r.slice(0,-1)),r+t}function sd(e){let t=Xu,n=e;for(let e of t.drop)n=n.split(e).join(``);n=n.replace(Qu,(e,n,r)=>{let i=``;for(let e of n)e!==` `&&e!==`\xA0`&&(i+=String(nd(e)));return i=i.replace(/^0+(?=.)/,``),r?od(i,r,t.numbers):id(i,t.numbers)}),n=n.replace(ed,e=>{let n=e.toLowerCase();return Object.prototype.hasOwnProperty.call(t.latin,n)?t.latin[n]:e});for(let[e,r]of t.lexicon)n=n.split(e).join(r).split(td(e)).join(td(r));return n}function cd(e){let t=sd(e);return t=t.replace(ed,e=>{let t=e.toLowerCase();return Object.prototype.hasOwnProperty.call(Zu,t)?Zu[t]:e}),t}var ld=/[\u06F0-\u06F9]/g,ud=/[\u0660-\u0669]/g;function dd(e){return e.replace(ld,e=>String(e.charCodeAt(0)-1776)).replace(ud,e=>String(e.charCodeAt(0)-1632)).replace(/(\d)[\u066B](\d)/g,`$1.$2`).replace(/(\d)[\u066C](\d)/g,`$1$2`).replace(/\u066A/g,`%`).replace(/\u064A/g,`ی`).replace(/\u0643/g,`ک`).replace(/\u061F/g,`?`).replace(/\u060C/g,`,`).replace(/\u061B/g,`;`)}function fd(e,t){let n=t.toLowerCase().split(/[-_]/)[0];return n===`hy`?cd(e):n===`fa`?dd(e):e}function pd(e,t,n=Date.now()){let r=e?.summaries[0];if(!e||!r)return!0;if(t!==null&&t!==r.id&&e.summaries.some(e=>e.id===t)||!e.changedSinceNewest)return!1;let i=Date.parse(r.createdAt);return!(Number.isFinite(i)&&n-i<6e5)}function md(e){return[`en`,...e.translations.map(e=>e.language)]}function hd(e,t){return t===`en`?e.text:e.translations.find(e=>e.language===t)?.text??null}function gd(e){let t=Math.max(0,Math.round(e));return t<60?`${t} s`:`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`}function _d(e){if(e.credits!==null&&e.credits>0){let t=e.credits.toLocaleString(`en-US`,{maximumFractionDigits:2});return`${t} credit${t===`1`?``:`s`}`}return e.route===`subscription`?`your plan pays`:e.route===`own-key`?Zl(`own-key`):e.route===`pool`&&e.credits===0?`0 credits`:`not priced`}var vd={title:`Listen to this chat`,intro:e=>`A spoken summary of ${e} — its goal, what was done, where it stands and what is pending — written by the chat’s own model, in English. Other languages are translated once by ${Ou.label} on your OonaCode credits and kept with the summary.`,noSummaries:`No summary yet — Play writes one.`,changedSinceNewest:`The chat has moved on since the newest summary — Play writes a new one first.`,unchanged:e=>`Nothing has changed in the chat since the summary of ${e} — that one is used, and nothing was spent.`,generating:`Generating…`,translating:`Translating…`,heading:(e,t)=>t?`${e.name}${e.code===`en`?``:` — ${e.native}`}`:`English — not in ${e.name} yet: Play translates it once`,current:`current`,playerOnly:`Voice and speed only change how this device reads it — they cost nothing.`},yd={seq:0,conversationIds:null,sessionIds:null};function bd(e,t){return e.conversationIds===null||e.sessionIds===null||t.sessionId&&e.sessionIds.includes(t.sessionId)?!0:(t.conversationIds??[]).some(t=>e.conversationIds.includes(t))}function xd(e){let t=e.members.filter(e=>e.leftAt===null);return t.length>0?t:e.members}function Sd(e){if(e.title?.trim())return e.title.trim();let t=xd(e).map(e=>e.title);return t.length>0?t.join(` · `):`Conversation`}function Cd(e,t){return e.members.some(e=>e.sessionId===t&&e.leftAt===null)}function wd(e,t){return e.filter(e=>e.status!==`closed`&&Cd(e,t))}function Td(e){let t=e.filter(e=>e.status===`active`).length,n=e.length-t,r=e=>`conversation${e===1?``:`s`}`;return t>0?`${t} ${r(t)}${n>0?` · ${n} paused`:``}`:`${n} ${r(n)} · paused`}var Ed={active:`active`,paused:`paused`,closed:`closed`};function Dd(e){return e===`active`?`ok`:e===`paused`?`warn`:`neutral`}var Od={message:`Message`,reply:`Reply`,continue:`Continue`,notice:`Notice`},kd={pending:`Waiting to be delivered: the other chat gets it when its current turn ends, or is woken for it.`,sending:`Being handed to a chat on another PC.`,delivering:`Being handed to the other chat right now.`,delivered:`The other chat is working on it.`,answered:`The other chat finished its turn on it.`,failed:`The other chat could not finish it (stopped, or an error). The sender was told.`,cancelled:`Withdrawn before it was delivered, or the conversation closed.`,paused:`On hold: the conversation is paused, or the chat that started this exchange has "Talk to other chats" off.`};function Ad(e){switch(e){case`answered`:return`ok`;case`failed`:return`danger`;case`paused`:return`warn`;case`delivering`:case`delivered`:case`sending`:return`accent`;default:return`neutral`}}function jd(e){if(e.kind!==`notice`)return e.text;let t=Bl(e.text);return t?t.body?`${t.headline}\n\n${t.body}`:t.headline:e.text}function Md(e){return e?.status===`answered`?{label:`answered`,answeredAt:e.finishedAt,help:`This chat finished its turn on this message, and its final answer went back to the chat that asked. Nothing more is owed.`}:e?.status===`failed`||e?.status===`cancelled`?{label:`answer requested`,answeredAt:null,help:e.status===`failed`?`The chat that sent this asked for an answer, but this chat's turn on it did not finish (stopped, or an error). The sender was told.`:`The chat that sent this asked for an answer, but the message was withdrawn or its conversation closed.`}:{label:`answer requested`,answeredAt:null,help:`The chat that sent this asked for an answer: this chat's final answer to it goes back by itself when its turn ends.`}}function Nd(e){let t=new Map;for(let n of e??[])for(let e of n.answerRequests??[])t.set(e.messageId,e);return t}function Pd(e){return e.kind===`notice`||e.kind===`reply`||!e.expectsReply?null:e.status===`answered`?{text:`answered`,help:`The chat it went to finished its turn on it; its final answer went back as a reply.`}:e.status===`failed`||e.status===`cancelled`?{text:`not answered`,help:`It asked for an answer, but it was not answered: the turn on it failed, or it was withdrawn.`}:{text:`reply expected`,help:`The sender asked for an answer: the final answer of the turn on it will go back as a reply.`}}function Fd(e){return e.batchOf?`handed over in one turn with other messages from the same chat; that turn answered them all`:null}function Id(e){return e.kind!==`notice`&&(e.status===`pending`||e.status===`paused`)}function Ld(e,t){return!Number.isFinite(e)||!Number.isFinite(t)||t<=0?+(e>0):Math.max(0,Math.min(1,e/t))}function Rd(e){return e.length>400||e.split(`
95
95
  `).length>8}function zd(e,t){let n=(e,t,n)=>{let r=e.trim();if(!/^\d+$/.test(r))return`${n}: a whole number, please.`;let i=Number(r);return i<1?`${n}: at least 1.`:i>t?`${n}: at most ${t.toLocaleString()}.`:null};return n(e,Al.budgetMessagesMax,`Messages`)??n(t,Al.budgetTokensMax,`Tokens`)}function Bd(e){return Jl(e!=null&&e>0?e:0)}function Vd(e,t){return e.credits!==void 0&&e.credits>0?`${t} tokens · ${Jl(e.credits)}`:`${t} tokens`}var Hd={window:`Chats on this PC that have "Talk to other chats" switched on can send each other messages and tasks. Every conversation between them is listed here, with all it said and what it cost.`,stopAll:`Pauses every active conversation on this PC and stops any turn a message between chats is running right now. Nothing is deleted: resume each one when you want.`,status:`Active: messages are delivered. Paused: held until you resume it. Closed: finished — only its history is kept.`,pause:`Holds this conversation: messages waiting in it are not delivered until you resume it. A chat already working on one finishes that turn.`,resume:`Lets the messages waiting in this conversation be delivered again. Not possible while it is over its budget — raise the budget first.`,close:`Ends this conversation for good. Messages still waiting in it are withdrawn; its history stays here.`,budget:`The most this conversation may use before it pauses by itself: delivered messages, and new tokens (context read back from the prompt cache is not counted). A budget below what is used pauses it; raising it resumes one the budget paused.`,removeMember:`Takes this chat out of the conversation: nothing more is delivered to it here. A conversation left with fewer than two chats closes.`,withdraw:`Takes this message back before it is delivered. The other chat never sees it.`,history:`Every message, reply and notice in this conversation, oldest first: who sent it to whom, when, whether it was delivered and answered, and what the turn it caused used. A message not delivered yet can be withdrawn.`,cost:`The credits the OonaCode pool charged for the turns these messages caused, and their new tokens (input and output, not the context read back from the cache). A chat on your own key or plan is not billed in credits: only its tokens count.`,openChat:`Open this chat in a tab.`,listView:`Every conversation, with its controls and its whole history.`,mapView:`Which chats are talking to each other: every chat is a dot (blue and pulsing while it works), every conversation a hub with a line to each of its chats — dashed for a chat that left. Click a hub to see that conversation, a chat to open it.`,showClosed:`Also draw the conversations that are closed, faded.`};function Ud(e,t,n){return{...e??{},[t]:n}}function Wd(e,t){let n=vl(e,t);return{count:n.length,label:`Tools · ${n.length}`,title:n.length>0?`OonaCode tools on in this chat: ${n.map(e=>e.name).join(`, `)}`:`No OonaCode tools are on in this chat`}}function Gd(e){return e&&Object.keys(e).length>0?{toolPacks:{...e}}:{}}var Kd=`Switching a tool restarts this chat's agent; its next message re-reads the conversation once.`;function qd(e){return e.details?.trim()||null}function Jd(e){return e.description.trim()||`No details for this tool yet.`}var Yd=`A demo: its calls are checked and logged, but nothing runs on your PC yet.`;function Xd(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Zd(e){if(`at`in e)return`once, ${Xd(e.at)}`;if(`everyMinutes`in e){let t=e.everyMinutes;return t%1440==0?t===1440?`every day`:`every ${t/1440} days`:t%60==0?t===60?`every hour`:`every ${t/60} hours`:`every ${t} minutes`}return`cron ${e.cron}`}function Qd(e,t){return t?e?`next ${Xd(e)}`:`done`:e?`paused`:`done`}function $d(e){return`${e} is offline — its chats can be read while it is online.`}function ef(e,t,n){return n?`${e}::${n}::${t}`:`${e}::${t}`}function tf(e,t){return e===`oonacode`?-1:t}function nf(e){return e.filter(e=>e.definition.enabled&&e.configured&&e.definition.poolOnly!==!0&&T(e.definition.id)&&!D(e.definition.id)&&e.definition.models.length>0).map((e,t)=>({p:e,order:tf(e.definition.id,t)})).sort((e,t)=>e.order-t.order).map(e=>e.p)}function rf(e){let t=Es(e.definition);if(t.length<2)return[{variantId:null,suffix:``}];let n=new Set((e.credentials??[]).map(e=>e.variantId??`payg`)),r=t.filter(e=>n.has(e.id));return r.length<2?[{variantId:null,suffix:``}]:r.map(e=>({variantId:e.id,suffix:` ${af(e.id,e.label)}`}))}function af(e,t){return e===`token-plan`?`Subscription`:e===`payg`||e===`api-key`?`API`:t}function of(e,t){let n=nf(e),r=e=>{let t=e.definition.clientGroup,r=(t?n.find(e=>e.definition.id===t)?.definition:void 0)?.displayName??e.definition.displayName,i=n.filter(n=>(n.definition.clientGroup??n.definition.id)===(t??e.definition.id));return e.definition.recordLabel&&i.length>1?`${r} ${e.definition.recordLabel}`:r};return n.flatMap(n=>{let i=tl(n.definition.models,t?.[n.definition.id]),a=r(n);return rf(n).map(t=>({providerId:n.definition.id,variantId:t.variantId,label:`${a}${t.suffix}`,route:n.definition.route,models:i.map(r=>({providerId:n.definition.id,variantId:t.variantId,modelId:r.id,label:r.displayName||r.id,value:ef(n.definition.id,r.id,t.variantId),free:r.free===!0,details:{...r.aaIntelligence===void 0?{}:{intelligence:r.aaIntelligence},...r.aaCoding===void 0?{}:{coding:r.aaCoding},...r.aaOutputTps===void 0?{}:{outputTps:r.aaOutputTps},...r.aaTtft===void 0?{}:{ttft:r.aaTtft},...r.contextWindow===void 0?{}:{contextWindow:r.contextWindow},...r.maxOutputTokens===void 0?{}:{maxOutputTokens:r.maxOutputTokens},...r.supportsThinking===void 0?{}:{thinking:r.supportsThinking},...r.supportsVision===void 0?{}:{vision:r.supportsVision},...r.supportsTools===void 0?{}:{tools:r.supportsTools},...n.definition.id===`oonacode`?r.creditsPerM===void 0?r.free===!0?{creditsPerM:{input:0,output:0}}:{}:{creditsPerM:r.creditsPerM}:{},...r.notes===void 0?{}:{notes:r.notes},...r.aa===void 0?{}:{aa:r.aa},...r.servedBy===void 0?{}:{providers:r.servedBy.map(t=>{let n=e.find(e=>e.definition.id===t)?.definition,i=n?.displayName??t;if(!r.subscriptionServedBy?.includes(t))return i;let a=n?.credentialVariants?.find(e=>e.id===`token-plan`)?.label;return`${i} — ${a?a.replace(/\s*\(.*\)\s*$/,``):`subscription`}`})}}}))}))}).filter(e=>e.models.length>0)}function sf(e,t){if(!t.providerId||!t.model)return!1;let n=e.find(e=>e.definition.id===t.providerId)?.definition;if(!n||n.models.length===0)return!1;let r=Bs(t.model);if(n.models.some(e=>e.id===r||e.upstreamId===r)||n.modelAliases?.[r]!==void 0||Us(n,r)!==null)return!1;let i=r.toLowerCase();return!Hs(i)||n.modelAliases?.[i]===void 0&&!n.models.some(e=>e.id.toLowerCase().includes(i))}function cf(e,t){let n=of(e),r=n[0]??null,i=t.providerId??r?.providerId??null,a=t.variantId??(i?n.find(e=>e.providerId===i)?.variantId??null:r?.variantId??null);if(!i)return{providerId:null,variantId:a,modelId:t.model??null};let o=e.find(e=>e.definition.id===i)?.definition;return t.model?{providerId:i,variantId:a,modelId:(o?Us(o,t.model):null)??t.model}:{providerId:i,variantId:a,modelId:o?.defaultModel||n.find(e=>e.providerId===i)?.models[0]?.modelId||null}}function lf(e){return`Remote access is turned off on ${e}, so it cannot be reached from here. Turn it on in OonaCode on that PC — Settings → This PC → Remote access — then try again.`}function uf(e,t,n){switch(e){case`host_offline`:return $d(t);case`host_locked`:return`${t} is locked — unlock it to read its chats.`;case`host_remote_access_off`:return lf(t);case`host_outdated`:return`${t} runs an older OonaCode — update it there to read its chats from here.`;case`no_answer`:return`${t} did not answer — try again in a moment.`;case`relay_off`:return`Remote access is off on this PC — turn it on in Settings to reach your other PCs.`;case`vault_locked`:return`Unlock your vault to read the chats on your other PCs.`;case`logged_out`:return`Sign in to your OonaCode account to see your other PCs.`;case`gateway_unreachable`:return`Your account server is unreachable right now.`;default:return n??null}}function df(e){if(typeof e!=`string`)return null;let t=/^(?:Failed to authenticate\.\s*)?API Error\b:?\s*(?:(\d{3})(?!\d)\s*)?([\s\S]*)$/i.exec(e.trim());return t?{status:t[1]===void 0?null:Number(t[1]),message:(t[2]??``).trim()}:null}function ff(e){return typeof e!=`string`||e===``?!1:/prompt is too long|maximum context length|context[ _-]?length[ _-]?exceeded|input token count exceeds|too many (?:input )?tokens|exceeds? the (?:maximum|model's) context/i.test(e)}var pf=`chat too long for this model`;function mf(e){return typeof e!=`string`||e===``?!1:/safeguards? (?:have )?(?:flagged|blocked)/i.test(e)}var hf=`blocked by safeguards`;function gf(e){return typeof e!=`string`||e===``?!1:/\bnot included in (?:your|the [^.;]*?) plan\b/i.test(e)}var _f=`not in your plan`;function vf(e){return gf(e)?e.replace(/^\s*Failed to authenticate\.\s*/i,``):e}function yf(e,t){if(ff(t))return pf;if(mf(t))return hf;if(gf(t))return _f;switch(e){case 400:case 422:return`invalid request`;case 401:return`sign-in needed`;case 402:return`insufficient credits`;case 403:return`not allowed`;case 404:return`model not found`;case 408:case 504:return`timed out`;case 413:return`request too large`;case 429:return`rate limited`;default:return e!==null&&e>=500&&e<=599?`provider error`:`API error`}}var bf={error_max_turns:`max turns reached`,error_max_budget_usd:`budget reached`,error_during_execution:`error during execution`,error_max_structured_output_retries:`structured output failed`,interrupted:`interrupted`,success:`error`};function xf(e){if(!e.isError)return`turn complete`;let t=df(e.text);if(t)return yf(t.status,t.message);let n=bf[e.subtype];if(n!==void 0)return n;let r=e.subtype.replace(/_/g,` `).trim();return r===``?`error`:r}var Sf={authentication_failed:`sign-in needed`,billing_error:`billing problem`,rate_limit:`rate limited`,invalid_request:`invalid request`,server_error:`provider error`};function Cf(e,t){if(typeof e!=`string`)return null;let n=e.trim();if(n===``)return null;if(ff(t))return pf;if(mf(t))return hf;if(gf(t))return _f;let r=Sf[n];if(r!==void 0)return r;if(n===`unknown`){let e=df(t);return e?yf(e.status,e.message):ff(t)?pf:`error`}return n.replace(/_/g,` `)}var wf=`model_refusal_fallback`,Tf=`model_refusal_no_fallback`;function Ef(e){return typeof e==`string`&&e.trim()!==``?e.trim():null}function Df(e,t,n){return Ef(e[t])??Ef(e[n])}function Of(e){if(typeof e!=`object`||!e)return null;let t=e,n=t.subtype,r=n===`model_refusal_fallback`?`fallback`:n===`model_refusal_no_fallback`?`no_fallback`:t.kind===`fallback`||t.kind===`no_fallback`?t.kind:null;if(!r||t.type!==void 0&&t.type!==`system`)return null;let i=t.retracted_message_uuids??t.retractedMessageUuids??t.retractedUuids;return{kind:r,scope:t.scope===`local`?`local`:`session`,originalModel:Df(t,`original_model`,`originalModel`),fallbackModel:r===`fallback`?Df(t,`fallback_model`,`fallbackModel`):null,category:Df(t,`api_refusal_category`,`apiRefusalCategory`)??Ef(t.category),explanation:Df(t,`api_refusal_explanation`,`apiRefusalExplanation`)??Ef(t.explanation),text:typeof t.content==`string`?t.content.trim():Ef(t.text)??``,retractedUuids:Array.isArray(i)?i.filter(e=>typeof e==`string`):[]}}function kf(e,t){switch(t.type){case`notice`:return t.notice.kind!==`fallback`||t.notice.scope!==`session`?e:{notice:t.notice,at:t.at,live:t.live};case`engine_start`:case`model_change`:return null}}function Af(e,t){return!e||t.alive===!1||!e.live&&t.since!==null&&e.at!==null&&e.at<t.since?null:e}function jf(e){let t=Bs(e.trim()),n=t.slice(t.lastIndexOf(`/`)+1),r=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),i=n.split(`-`);if(i[0]?.toLowerCase()!==`claude`)return t;let a=i.slice(1).filter(e=>!/^\d{6,}$/.test(e)),o=a.filter(e=>!/^\d+$/.test(e)),s=a.filter(e=>/^\d+$/.test(e));return o.length!==1||s.length===0?t:`${r(o[0])} ${s.join(`.`)}`}function Mf(e,t=[]){let n=Bs(e.trim()),r=null;for(let e of t)for(let t of e.definition.models){if(t.id===n||Bs(t.id)===n)return t.displayName;r===null&&(t.upstreamId===n||il(t.id)===n)&&(r=t.displayName)}return r??jf(n)}function Nf(e){return`${e} (safeguard)`}function Pf(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function Ff(e,t){let n=typeof e==`object`&&e?e:{},r={input:Pf(n.input_tokens),cached:Pf(n.cache_read_input_tokens)+Pf(n.cache_creation_input_tokens),output:Pf(n.output_tokens)};if(r.input+r.cached+r.output>0||typeof t!=`object`||!t)return r;let i={input:0,cached:0,output:0};for(let e of Object.values(t)){if(typeof e!=`object`||!e)continue;let t=e;i.input+=Pf(t.inputTokens),i.cached+=Pf(t.cacheReadInputTokens)+Pf(t.cacheCreationInputTokens),i.output+=Pf(t.outputTokens)}return i}function If(e,t){switch(e){case`chat`:return t===`api`?`Messages API`:t===`all`?`Chat turns & Messages API`:`Chat turns`;case`agent-run`:return`Agent API runs`;case`about`:return`Chat "about" (session info)`;case`voice-summary`:return`Voice — summary`;case`voice-translation`:return`Voice — translation`;case`image`:return`Images`;case`video`:return`Video`;case`speech`:return`Speech (text to speech)`;case`transcription`:return`Transcription`;case`audio-translation`:return`Audio translation`;case`voice-design`:return`Custom voices`;case`realtime`:return`Realtime voice`;case`key-check`:return`Key checks`}}function Lf(e,t){switch(e){case`chat`:return t===`api`?`Calls to /v1/messages with your API keys.`:t===`all`?`Chats on the account’s PCs (subagents, titles and page reading included) and /v1/messages calls with its API keys.`:`Your chats — every model call a turn makes, subagents, titles and page reading included.`;case`agent-run`:return`Model calls made by agent-API runs in their sandboxes.`;case`about`:return`The short background summary each chat keeps for your other chats.`;case`voice-summary`:return`Spoken summaries of replies, written by the housekeeper model.`;case`voice-translation`:return`Translation of what was said, done on the server.`;case`image`:return`Images generated.`;case`video`:return`Videos generated.`;case`speech`:return`Text turned into speech.`;case`transcription`:return`Audio turned into text.`;case`audio-translation`:return`Audio translated into English text.`;case`voice-design`:return`Custom voices made or cloned.`;case`realtime`:return`Live voice sessions, billed by the slice.`;case`key-check`:return`Tests of a key you once added; not charged.`}}var Rf={maxRangeDays:366,maxHourlyRangeDays:31,defaultRangeDays:30,autoHourlyMaxHours:48},zf=`mcp__oonacode__switch_workspace`,Bf=`Switch workspace`;function Vf(e){if(e.toolName!==`SwitchWorkspace`)return null;let t=e.input;return!t||typeof t!=`object`||typeof t.from!=`string`||typeof t.to!=`string`?null:{from:t.from,to:t.to,create:t.create===!0}}function Hf(e){return`${e.from} → ${e.to}${e.create?` (new folder)`:``}`}var Uf=`mcp__oonacode__new_chat`,Wf=`New chat`,Gf={titleChars:120,reasonChars:500,promptChars:1e5};function Kf(e){return typeof e==`string`?e:null}function qf(e){if(e.toolName!==`NewChat`)return null;let t=e.input;if(!t||typeof t!=`object`)return null;let n=Kf(t.title),r=Kf(t.prompt),i=Kf(t.fromId);return n===null||r===null||i===null?null:{title:n,prompt:r,reason:Kf(t.reason)??``,folder:Kf(t.folder),model:Kf(t.model),providerId:Kf(t.providerId),effort:Kf(t.effort),project:Kf(t.project),fromId:i,fromTitle:Kf(t.fromTitle)??``}}function Jf(e,t){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1).trimEnd()}…`:n}function Yf(e){return`“${Jf(e.replace(/["“”]/g,`'`),Gf.titleChars)||`Untitled chat`}”`}function Xf(e){return e.folder??`a new workspace of its own`}function Zf(e){return`${e.model??`the default model`}${e.providerId?` (${e.providerId})`:``}${e.effort?` · effort ${e.effort}`:``}`}function Qf(e){return`${Yf(e.title)} · ${Xf(e)} · ${e.model??`default model`}`}var $f=`Started a new chat `,ep=/^Started a new chat “([^”\n]*)” for this task — chat ([0-9A-Za-z-]{8,64})$/;function tp(e){if(typeof e!=`string`)return null;let t=e.trim();if(t.startsWith(`<local-command-stdout>`)&&t.endsWith(`</local-command-stdout>`)&&(t=t.slice(22,t.length-23).trim()),!t.startsWith($f))return null;let n=ep.exec(t);return n?{title:n[1]??``,sessionId:n[2]}:null}function np(e,t,n=140){let r=gl({toolName:e,input:t});if(r){let e=`${r.name} ${r.version} (${hl(r.sizeBytes)}) → ${r.path}`;return e.length>n?`${e.slice(0,n)}…`:e}let i=Vf({toolName:e,input:t});if(i){let e=Hf(i);return e.length>n?`…${e.slice(e.length-n)}`:e}let a=qf({toolName:e,input:t});if(a){let e=Qf(a);return e.length>n?`${e.slice(0,n)}…`:e}let o=e===zf?Bf:e===Uf?Wf:e;if(e===Uf){let e=t?.title;if(typeof e==`string`&&e.trim()){let t=e.replace(/\s+/g,` `).trim();return`${o}: ${t.length>n?`${t.slice(0,n)}…`:t}`}}let s=t??{};for(let e of[`command`,`file_path`,`pattern`,`query`,`url`,`path`,`prompt`]){let t=s[e];if(typeof t==`string`&&t.trim().length>0){let e=t.replace(/\s+/g,` `).trim();return`${o}: ${e.length>n?`${e.slice(0,n)}…`:e}`}}return o}var rp={wav:{kind:`audio`,mime:`audio/wav`},mp3:{kind:`audio`,mime:`audio/mpeg`},ogg:{kind:`audio`,mime:`audio/ogg`},oga:{kind:`audio`,mime:`audio/ogg`},opus:{kind:`audio`,mime:`audio/ogg`},m4a:{kind:`audio`,mime:`audio/mp4`},aac:{kind:`audio`,mime:`audio/aac`},flac:{kind:`audio`,mime:`audio/flac`},weba:{kind:`audio`,mime:`audio/webm`},mp4:{kind:`video`,mime:`video/mp4`},m4v:{kind:`video`,mime:`video/mp4`},mov:{kind:`video`,mime:`video/mp4`},webm:{kind:`video`,mime:`video/webm`},mkv:{kind:`video`,mime:`video/x-matroska`},ogv:{kind:`video`,mime:`video/ogg`},png:{kind:`image`,mime:`image/png`},jpg:{kind:`image`,mime:`image/jpeg`},jpeg:{kind:`image`,mime:`image/jpeg`},gif:{kind:`image`,mime:`image/gif`},webp:{kind:`image`,mime:`image/webp`},bmp:{kind:`image`,mime:`image/bmp`},svg:{kind:`image`,mime:`image/svg+xml`},avif:{kind:`image`,mime:`image/avif`}};function ip(e){let t=Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`)),n=e.slice(t+1),r=n.lastIndexOf(`.`);return r<=0?``:n.slice(r+1).toLowerCase()}function ap(e){return rp[ip(e)]??null}var op=`oonacode`,sp=Object.freeze({doctor:`off`,"update-config":`off`,"fewer-permission-prompts":`off`,loop:`off`,insights:`off`,"team-onboarding":`off`,"auto-mode-setup":`off`,"keybindings-help":`off`}),cp=Object.freeze({model:{refusedBy:`app`,reason:`Use the model picker under the message box — the chat keeps the model you pick there.`},usage:{aliases:[`cost`,`stats`],refusedBy:`host`,reason:`It shows the engine's own estimate at list prices, not your OonaCode credits — see Credits used in the chat's Session info, and Credits and plan in the title bar.`,terminalReason:`It shows the engine's own estimate at list prices, not your OonaCode credits — /cost shows what this chat was charged.`},autocompact:{refusedBy:`host`,reason:`OonaCode sets the context window from the model's real size at every engine start — nothing to set here.`},"output-style":{refusedBy:`host`,reason:`A style set here is lost at the chat's next engine start — ask the chat to answer in the style you want.`},mcp:{refusedBy:`host`,reason:`OonaCode's tools are switched per chat in the Tools menu under the message box.`},"list-agents":{aliases:[`peers`],refusedBy:`host`,reason:`This chat's subagents are on the agents badge beside the model picker; chats talking to each other are in View → Conversations.`},"reload-skills":{refusedBy:`host`,reason:`OonaCode reloads skills by itself when you import or remove one in Settings → Skills.`}}),lp=`Needs a Claude account signed in to the engine — OonaCode runs the engine without one.`,up=`It reads or edits your own Claude Code install (~/.claude), which OonaCode never touches.`,dp=Object.freeze({clear:{availability:`not-in-oonacode`,reason:`It starts a new engine conversation that this chat would not follow — start a new chat (+) instead.`},fast:{availability:`not-in-oonacode`,reason:`The engine answers "Fast mode is not available in the Agent SDK".`},config:{availability:`not-in-oonacode`,reason:`Claude Code's terminal settings, written to a file OonaCode rebuilds at every engine start — OonaCode's own are in Settings.`},effort:{availability:`not-in-oonacode`,reason:`Use the effort picker under the message box — it is saved with the chat.`},rename:{availability:`not-in-oonacode`,reason:`Rename the chat from its tab or the sidebar — the engine's own title is not the chat's.`},color:{availability:`not-in-oonacode`,reason:`The terminal prompt bar's colour — it belongs to Claude Code's terminal.`},"reload-plugins":{availability:`not-in-oonacode`,reason:`OonaCode loads no plugins — import a plugin's skills in Settings → Skills instead.`},heapdump:{availability:`not-in-oonacode`,reason:`It writes the engine's memory dump to your Desktop — a Claude Code diagnostic.`},agents:{availability:`not-in-oonacode`,reason:`The engine removed this wizard — ask the chat to create a subagent in .claude/agents/.`},"__remote-workflow":{availability:`not-in-oonacode`,reason:`It runs only inside Anthropic's cloud sessions.`},"workflow-launch-exec":{availability:`not-in-oonacode`,reason:`It runs only inside Anthropic's cloud sessions.`},doctor:{availability:`not-in-oonacode`,reason:up},"update-config":{availability:`not-in-oonacode`,reason:up},"fewer-permission-prompts":{availability:`not-in-oonacode`,reason:up},"keybindings-help":{availability:`not-in-oonacode`,reason:up},loop:{availability:`not-in-oonacode`,reason:`It schedules through the engine's own cron, which OonaCode turns off — ask the chat to schedule a task; OonaCode's scheduler runs it.`},insights:{availability:`not-in-oonacode`,reason:`It analyses Claude Code's own session files; OonaCode keeps chats in its own database, so the report would be empty.`},"team-onboarding":{availability:`not-in-oonacode`,reason:`It reads usage from Claude Code's own session files, which OonaCode does not keep — there is nothing to read.`},"auto-mode-setup":{availability:`not-in-oonacode`,reason:`Auto mode is not one of OonaCode's postures (${j.map(e=>e.label).join(`, `)}).`},login:{availability:`needs-anthropic-account`,reason:lp},logout:{availability:`needs-anthropic-account`,reason:lp},upgrade:{availability:`needs-anthropic-account`,reason:lp},"extra-usage":{availability:`needs-anthropic-account`,reason:lp},"rate-limit-options":{availability:`needs-anthropic-account`,reason:lp},"privacy-settings":{availability:`needs-anthropic-account`,reason:lp},feedback:{availability:`needs-anthropic-account`,reason:lp},bug:{availability:`needs-anthropic-account`,reason:lp},"install-github-app":{availability:`needs-anthropic-account`,reason:lp},"install-slack-app":{availability:`needs-anthropic-account`,reason:lp},"remote-control":{availability:`needs-anthropic-account`,reason:lp},"remote-env":{availability:`needs-anthropic-account`,reason:lp},"web-setup":{availability:`needs-anthropic-account`,reason:lp},ultrareview:{availability:`needs-anthropic-account`,reason:lp},ultraplan:{availability:`needs-anthropic-account`,reason:lp},passes:{availability:`needs-anthropic-account`,reason:lp},teleport:{availability:`needs-anthropic-account`,reason:lp},...Object.fromEntries(Object.entries(cp).map(([e,t])=>[e,{availability:`not-in-oonacode`,reason:t.reason,...t.refusedBy===`app`?{refusedBy:`app`}:{},...t.terminalReason?{terminalReason:t.terminalReason}:{}}]))});Object.freeze({});function fp(e){let t=`${op}:`;return e.startsWith(t)&&e.length>t.length?e.slice(t.length):null}function pp(e){let t=/^\/([^\s/]*)$/.exec(e);return t?t[1]:null}function mp(e){let t=/^\/([A-Za-z0-9][\w:.-]*)(?:\s|$)/.exec(e.trimStart());return t?t[1]:null}function hp(e,t=`host`){let n=mp(e);if(n===null)return null;let r=dp[n]??dp[_p[n]??``];return!r||r.availability!==`not-in-oonacode`||r.refusedBy===`app`&&t!==`app`?null:{...r,command:n}}function gp(e){return e.refusedBy===`app`?`/${e.command} is not used here. ${e.reason}`:`/${e.command} is not available in OonaCode. ${e.reason}`}var _p=Object.freeze({reset:`clear`,new:`clear`,settings:`config`,name:`rename`,checkup:`doctor`,proactive:`loop`,...Object.fromEntries(Object.entries(cp).flatMap(([e,t])=>(t.aliases??[]).map(t=>[t,e])))});function vp(e){let t=!1,n=e.map(e=>{if(e.availability!==`ok`||e.source!==`builtin`&&e.source!==`skill`)return e;let n=dp[e.name];if(!n)return e;t=!0;let{note:r,...i}=e;return{...i,availability:n.availability,reason:n.reason}});return t?n:e}function yp(e,t,n=60){let r=t.trim().toLowerCase(),i=e=>[e.name,...e.aliases??[]].map(e=>e.toLowerCase()),a=e=>r.length>0&&i(e).includes(r),o=[[],[],[],[]];for(let t of e){if(t.availability!==`ok`&&!a(t))continue;let e=i(t);r.length===0?o[1].push(t):a(t)?o[0].push(t):e.some(e=>e.startsWith(r))?o[1].push(t):e.some(e=>e.includes(r))?o[2].push(t):t.description.toLowerCase().includes(r)&&o[3].push(t)}return o.flat().slice(0,n)}function bp(e,t){if(!/^\/\S+\s/.test(e))return null;let n=mp(e);return n===null?null:t.find(e=>e.name===n)??t.find(e=>e.aliases?.includes(n))??null}function xp(e){switch(e){case`skill`:return`skill`;case`user`:return`your skill`;case`project`:return`project`;case`plugin`:return`plugin`;case`mcp`:return`MCP`;case`other`:return`other`;default:return null}}var Sp=[`skills`,`commands`],Cp=Object.freeze({skills:`Skills`,commands:`Commands`});function wp(e){if(e.modelSkill!==void 0)return`skills`;switch(e.source){case`skill`:case`user`:case`project`:case`plugin`:return`skills`;default:return`commands`}}function Tp(e){let t={skills:[],commands:[]};for(let n of e)t[wp(n)].push(n);return t}var Ep=/(?:^|[\s(])(?:e\.g|i\.e|etc|vs|cf|incl|approx|fig)$/i;function Dp(e,t=90){let n=(e.split(/\n\s*\n/)[0]??``).replace(/\s+/g,` `).trim(),r=n,i=/[.!?](?=\s|$)|[。!?]/g;for(let e=i.exec(n);e!==null;e=i.exec(n)){let t=n.slice(0,e.index);if(!(e[0]===`.`&&Ep.test(t))){r=(e[0]!==`.`&&e[0]!==`。`?n.slice(0,e.index+1):t).trim();break}}if(r.length<=t)return r;let a=r.slice(0,t-1),o=a.lastIndexOf(` `);return`${(r[t-1]===` `||o<=t*.66?a:a.slice(0,o)).replace(/[\s,;:—–-]+$/,``)}…`}function Op(e){return typeof e==`string`&&/^[A-Za-z0-9][\w.:-]{0,127}$/.test(e)}function kp(e){if(!Array.isArray(e))return[];let t=new Set;for(let n of e)if(Op(n)&&!Object.hasOwn(sp,n)&&(t.add(n),t.size>=200))break;return[...t].sort((e,t)=>e.localeCompare(t))}function Ap(e,t,n){let r=new Set(e??[]);return n?r.add(t):r.delete(t),[...r].sort((e,t)=>e.localeCompare(t))}function jp(e,t){return(e??[]).includes(t)}function Mp(e,t){let n=new Set(t??[]);if(n.size===0)return 0;let r=408;for(let t of e)n.has(t.name)&&(r+=t.tokens);return r}function Np(e,t){let n=[...new Set(t??[])];return{count:n.length,label:`Skills · ${n.length}`,title:n.length>0?`The model may use on its own in this chat: ${n.map(t=>e?.find(e=>e.name===t)?.label??t).join(`, `)}`:`The model uses no skill on its own in this chat — type /name to use one once`}}function Pp(e){let t=kp(e??[]);return t.length>0?{modelSkills:t}:{}}var Fp=`Every skill is always in the / menu — type it to use it once. Switch one on to let the model reach for it by itself in this chat (it then costs its tokens on every message).`,Ip=`Switching a skill restarts this chat's agent: the skill list is part of the prompt, so its next message re-reads the conversation once.`,Lp=`The first skill switched on also brings back the engine's Skill tool (≈388 tokens per request).`;function Rp(e){switch(e){case`user`:return`Yours`;case`project`:return`Project`;case`plugin`:return`Plugin`;case`mcp`:return`MCP`;case`skill`:case`builtin`:return`Built in`;default:return`Other`}}function zp(e){switch(e){case`user`:return`One of your own skills — OonaCode's skills folder (Settings → Skills), on every chat of this PC.`;case`project`:return"This project's own — its `.claude/skills` (or `.claude/commands`) folder.";case`skill`:case`builtin`:return`Built into the coding engine OonaCode runs for every model.`;case`plugin`:return`From a plugin the engine loaded.`;case`mcp`:return`From an MCP server of this chat.`;default:return`Found by the engine in this chat’s configuration.`}}function Bp(e,t){let n=[];return e.description.trim()&&n.push(e.description.trim(),``),n.push(`**Where it comes from.** ${zp(e.source)}`,``),n.push(e.typeable?`**Once, by typing it.** Type \`/${e.label}\` (or pick it in the / menu) and the engine loads it for that message only — whether this switch is on or off, at no cost to any other message.`:`**It cannot be typed.** Its author made it for the model only, so the switch is the only way to use it.`,``),n.push(t?`**On in this chat.** The model sees its name and description on every message here and may load it by itself when it fits.`:`**Off in this chat.** The model is not told it exists here. Switch it on to let the model reach for it by itself.`,``),n.push(`**What it costs while on.** ≈${e.tokens.toLocaleString(`en-US`)} tokens on every request of this chat (and the engine's Skill tool, ≈388, for the first skill on). Switching restarts the chat's agent; its next message re-reads the conversation once.`),n.join(`
96
96
  `)}var Vp=/^[A-Za-z0-9][\w.:@+\-/]*(?:\[[0-9a-z]+\])?$/;function Hp(e){return e.length>0&&e.length<=200&&Vp.test(e)&&!e.endsWith(`/`)&&!e.includes(`//`)}function Up(e){let t=/^\/setcustommodel(?:\s+([\s\S]*))?$/i.exec(e.trim());if(!t)return null;let n=(t[1]??``).trim();return n===``||n.toLowerCase()===`off`?{kind:`off`}:/\s/.test(n)?{kind:`invalid`,reason:`one model id, with no spaces`}:Hp(n)?{kind:`set`,model:n}:{kind:`invalid`,reason:`'${n.slice(0,60)}' is not a model id`}}function Wp(e){let t=e.indexOf(`/`);return t<=0||t===e.length-1?null:{prefix:e.slice(0,t).toLowerCase(),model:e.slice(t+1)}}function Gp(e,t,n){let r={providerId:t.providerId,variantId:t.variantId??null},i=Wp(e);return!i||!n.includes(i.prefix)?{...r,model:e}:i.prefix===t.providerId?{...r,model:i.model}:t.providerId===`oonacode`?{...r,model:e}:{providerId:i.prefix,variantId:null,model:i.model}}function Kp(e){return`${e} (custom)`}var qp={complete:`/api/v1/account/vault/rekey-complete`,revoke:`/api/v1/account/vault/rekey-revoke`,deviceUnlock:`/api/v1/account/device-unlock`};function Jp(e){return e?.deviceUnlock??`off`}function Yp(e){if(!e?.loggedIn)return null;let t=e;if(t.vaultStatus!==`pending_rekey`)return null;let n=t.vaultRekeyPending??null;return{pending:n,canFinishHere:t.canFinishRekey===!0,trustedDevices:n?.trustedDevices.map(e=>e.label||e.name)??[],since:n?.since??null,from:Xp(n)}}function Xp(e){if(!e)return null;let t=e.requestedFrom.device?.trim()||null,n=e.requestedFrom.ip?.trim()||null;return t&&n?`${t} (${n})`:t??n}function Zp(e){if(!e)return`an unknown date`;let t=Date.parse(e);if(Number.isNaN(t))return`an unknown date`;try{return new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}catch{return new Date(t).toISOString()}}function Qp(e){let t=e.from?` from ${e.from}`:``;return`A password reset was started on ${Zp(e.since)}${t}. Your saved provider keys are still sealed under the old password.`}function $p(e){return e.trustedDevices.length===0?`No device with "keep me unlocked" is left, so nothing here holds the key from before the reset.`:`Open OonaCode on ${tm(e.trustedDevices)} to finish the reset — your saved keys are waiting there.`}var em=`Either way, your vault Recovery Key still works: sign in on the OonaCode website from any device and finish the reset there. Discarding is the last resort — it deletes your saved provider keys and that Recovery Key for good. Your chats stay on your PCs.`;function tm(e){return e.length<=1?e[0]??``:`${e.slice(0,-1).join(`, `)} or ${e[e.length-1]}`}function nm(e){return e.canFinishHere?`A password reset is waiting: this PC can move your vault to the new password.`:e.trustedDevices.length>0?`A password reset is waiting — your saved keys stay locked until it is finished on ${tm(e.trustedDevices)}.`:`A password reset is waiting and no PC holds the old key — finish it with your vault Recovery Key on the OonaCode website.`}var rm=class extends Error{code;status;details;constructor(e,t,n,r){super(n),this.name=`HostApiError`,this.code=e,this.status=t,this.details=r}get isUnauthorized(){return this.status===401||this.code===`unauthorized`}get isEmailNotVerified(){return this.code===`email_not_verified`}};function im(e){if(!e)return``;let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!=null&&r!==``&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}function am(e){return e.trim().replace(/\/+$/,``)}function om(e,t){let n=am(e.baseUrl),r=t??((e,t)=>fetch(e,t));async function i(t,i,a,o={}){let s={Authorization:`Bearer ${e.token}`,Accept:o.raw||o.bytes?`*/*`:`application/json`},c={method:t,headers:s,credentials:`omit`};o.signal&&(c.signal=o.signal),a!==void 0&&(s[`Content-Type`]=`application/json`,c.body=JSON.stringify(a));let l;try{l=await r(`${n}${i}`,c)}catch(e){throw new rm(`network`,0,`Cannot reach the host at ${n}: ${String(e?.message??e)}`)}if(!l.ok){let e=null,t=``;try{t=await l.text(),e=t?JSON.parse(t):null}catch{e=null}let n=e?.error?.code??(l.status===401?`unauthorized`:`internal`),r=e?.error?.message??(t||`${l.status} ${l.statusText}`);throw new rm(n,l.status,r,e?.error?.details)}if(o.bytes)return await l.arrayBuffer();if(o.raw)return await l.text();if(l.status===204)return;let u=await l.text();if(u)try{return JSON.parse(u)}catch{throw new rm(`parse`,l.status,`Host returned malformed JSON for ${t} ${i}`)}}let a=Le;return{health:()=>i(a.health,z.health),info:()=>i(a.info,z.info),listSessions:e=>i(a.listSessions,`${z.sessions}${im(e)}`),createSession:e=>i(a.createSession,z.sessions,e),getSession:e=>i(a.getSession,z.session(e)),updateSession:(e,t)=>i(a.updateSession,z.session(e),t),deleteSession:e=>i(a.deleteSession,z.session(e)),exportSessionsArchive:async t=>{let i=await r(`${n}${z.sessionsExportArchive}`,{method:`POST`,credentials:`omit`,headers:{Authorization:`Bearer ${e.token}`,Accept:`application/zip`,"Content-Type":`application/json`},body:JSON.stringify({password:t})});if(!i.ok){let e=await i.text().catch(()=>``),t=null;try{t=e?JSON.parse(e):null}catch{t=null}throw new rm(t?.error?.code??`internal`,i.status,t?.error?.message??e??`the export failed`)}return i.blob()},listEntries:(e,t)=>i(a.listEntries,`${z.sessionEntries(e)}${im(t)}`),listMessages:e=>i(a.listMessages,z.sessionMessages(e)),prompt:(e,t)=>i(a.prompt,z.sessionPrompt(e),{...t,stream:!1}),interrupt:e=>i(a.interrupt,z.sessionInterrupt(e),{}),cancelQueued:(e,t)=>i(a.cancelQueued,z.sessionQueued(e,t)),sendQueuedNow:(e,t)=>i(a.sendQueuedNow,z.sessionQueuedNow(e,t),{}),forkSession:(e,t)=>i(a.fork,z.sessionFork(e),t??{}),exportSession:(e,t)=>i(a.export,`${z.sessionExport(e)}${im(t)}`,void 0,{raw:!0}),listProjects:()=>i(a.listProjects,z.projects),listVaultProjects:()=>i(a.listVaultProjects,z.vaultProjects),createVaultProject:e=>i(a.createVaultProject,z.vaultProjects,e),updateVaultProject:(e,t)=>i(a.updateVaultProject,z.vaultProject(e),t),deleteVaultProject:e=>i(a.deleteVaultProject,z.vaultProject(e)),listScheduledTasks:(e={})=>{let t=new URLSearchParams;e.sessionId&&t.set(`sessionId`,e.sessionId),e.projectId&&t.set(`projectId`,e.projectId);let n=t.toString();return i(a.listScheduledTasks,n?`${z.scheduledTasks}?${n}`:z.scheduledTasks)},createScheduledTask:e=>i(a.createScheduledTask,z.scheduledTasks,e),updateScheduledTask:(e,t)=>i(a.updateScheduledTask,z.scheduledTask(e),t),deleteScheduledTask:e=>i(a.deleteScheduledTask,z.scheduledTask(e)),listConversations:(e={})=>i(a.listConversations,`${z.conversations}${im({sessionId:e.sessionId})}`),getConversation:e=>i(a.getConversation,z.conversation(encodeURIComponent(e))),conversationAction:(e,t,n)=>i(a.conversationAction,z.conversationAction(encodeURIComponent(e),t),n??{}),stopAllConversations:()=>i(a.stopAllConversations,z.conversationsStopAll,{}),cancelChatMessage:e=>i(a.cancelChatMessage,z.chatMessage(encodeURIComponent(e))),getChatAbout:e=>i(a.getChatAbout,z.sessionAbout(encodeURIComponent(e))),updateChatAbout:(e,t)=>i(a.updateChatAbout,z.sessionAbout(encodeURIComponent(e)),t),regenerateChatAbout:e=>i(a.regenerateChatAbout,z.sessionAboutRegenerate(encodeURIComponent(e)),{}),listChatAbouts:()=>i(a.listChatAbouts,z.chatAbouts),generateAllChatAbouts:()=>i(a.generateAllChatAbouts,z.chatAboutsGenerateAll,{}),stopGenerateAllChatAbouts:()=>i(a.stopGenerateAllChatAbouts,z.chatAboutsGenerateAllStop,{}),generateChatAbouts:e=>i(a.generateChatAbouts,z.chatAboutsGenerate,e),planChatAboutTranslations:e=>i(a.planChatAboutTranslations,z.chatAboutsTranslationPlan,e),translateChatAbout:(e,t)=>i(a.translateChatAbout,z.sessionAboutTranslation(encodeURIComponent(e)),t),listVoiceSummaries:e=>i(a.listVoiceSummaries,z.sessionVoiceSummaries(encodeURIComponent(e))),createVoiceSummary:(e,t)=>i(a.createVoiceSummary,z.sessionVoiceSummaries(encodeURIComponent(e)),t),deleteVoiceSummary:(e,t)=>i(a.deleteVoiceSummary,z.sessionVoiceSummary(encodeURIComponent(e),encodeURIComponent(t))),translateVoiceSummary:(e,t,n)=>i(a.translateVoiceSummary,z.sessionVoiceSummaryTranslations(encodeURIComponent(e),encodeURIComponent(t)),n),getGithubLink:()=>i(a.getGithubLink,z.githubLink),searchEntries:e=>i(a.searchEntries,`${z.sessionSearch}${im(e)}`),startGithubLink:()=>i(a.startGithubLink,z.githubLinkStart,{}),cancelGithubLink:()=>i(a.cancelGithubLink,z.githubLinkStart),unlinkGithub:()=>i(a.unlinkGithub,z.githubLink),scanClaudeSessions:()=>i(a.scanClaudeSessions,z.importClaude),importClaudeSessions:e=>i(a.importClaudeSessions,z.importClaude,e??{}),searchImportChats:(e,t)=>i(a.searchImportChats,`${z.importSearch}${im(e)}`,void 0,t?{signal:t}:{}),sessionLink:e=>i(a.sessionLink,z.sessionLink(e)),syncSessionDown:e=>i(a.syncSessionDown,z.sessionSyncDown(e),{}),inspectProject:e=>i(a.inspectProject,`${z.projectInspect}${im(e)}`),attachSessionProject:(e,t)=>i(a.attachSessionProject,z.sessionProject(e),t),listAgentTools:()=>i(`GET`,z.agentTools),listSessionCommands:e=>i(a.listSessionCommands,z.sessionCommands(encodeURIComponent(e))),listCommands:e=>i(a.listCommands,`${z.commands}${im(e)}`),listSessionChatSkills:e=>i(a.listSessionChatSkills,z.sessionModelSkills(encodeURIComponent(e))),listChatSkills:e=>i(a.listChatSkills,`${z.modelSkills}${im(e)}`),listSkills:()=>i(a.listSkills,z.skills),deleteSkill:e=>i(a.deleteSkill,z.skill(e)),scanClaudeSkills:()=>i(a.scanClaudeSkills,z.importClaudeSkills),importClaudeSkills:e=>i(a.importClaudeSkills,z.importClaudeSkills,e),listProviders:()=>i(a.listProviders,z.providers),setActiveProvider:e=>i(a.setActiveProvider,z.providersActive,e),testProvider:e=>i(a.providerTest,z.providerTest(e),{}),probeCredential:(e,t)=>i(a.providerProbe,z.providerProbe(e),t),listModels:e=>i(a.listModels,`${z.models}${im(e)}`),getSettings:()=>i(a.getSettings,z.settings),updateSettings:e=>i(a.updateSettings,z.settings,e),getAccount:()=>i(a.getAccount,z.account),login:e=>i(a.login,z.accountLogin,e),logout:()=>i(a.logout,z.accountLogout,{}),unlock:e=>i(a.unlock,z.accountUnlock,e),lock:()=>i(`POST`,z.accountLock,{reason:`user`}),plan:()=>i(`GET`,z.accountPlan),accountUsage:e=>i(`GET`,`${z.accountUsage}${im({...e})}`),remoteUnlockHost:(e,t)=>i(`POST`,z.hostVaultUnlock(e),{password:t}),resendVerification:e=>i(a.resendVerification,z.accountResendVerification,e),startAccountLink:e=>i(a.linkStart,z.accountLinkStart,e??{}),accountLinkStatus:()=>i(a.linkStatus,z.accountLinkStatus),cancelAccountLink:()=>i(a.linkCancel,z.accountLinkCancel,{}),completeVaultRekey:e=>i(`POST`,qp.complete,e),revokeVaultRekey:e=>i(`POST`,qp.revoke,e),setDeviceUnlock:e=>i(`POST`,qp.deviceUnlock,e),listCredentials:()=>i(a.listCredentials,z.credentials),addCredential:e=>i(a.addCredential,z.credentials,e),deleteCredential:e=>i(a.deleteCredential,z.credential(e)),testCredential:e=>i(a.credentialTest,z.credentialTest(e),{}),syncNow:()=>i(a.syncNow,z.syncNow,{}),claudeSubscriptionLogin:()=>i(a.claudeLogin,z.subscriptionClaudeLogin,{}),claudeSubscriptionStatus:()=>i(a.claudeStatus,z.subscriptionClaudeStatus),claudeLoginState:()=>i(a.claudeLoginState,z.subscriptionClaudeLoginState),claudeLoginCode:e=>i(a.claudeLoginCode,z.subscriptionClaudeLoginCode,e),claudeLoginCancel:()=>i(a.claudeLoginCancel,z.subscriptionClaudeLoginCancel,{}),oauthLoginStart:e=>i(a.oauthLogin,z.subscriptionOauthLogin(e),{}),oauthLoginState:e=>i(a.oauthLoginState,z.subscriptionOauthLoginState(e)),oauthLoginCancel:e=>i(a.oauthLoginCancel,z.subscriptionOauthLoginCancel(e),{}),doctor:()=>i(a.doctor,z.doctor),listHosts:()=>i(a.listHosts,z.hosts),listHostSessions:e=>i(a.listHostSessions,z.hostSessions(e)),deleteHostSession:(e,t)=>i(a.deleteHostSession,z.hostSession(e,t),{method:`DELETE`}),updateHost:(e,t)=>i(a.updateHost,z.host(e),t),listHostSessionEntries:(e,t,n)=>i(a.listHostSessionEntries,`${z.hostSessionEntries(e,t)}${im(n)}`),reportError:e=>i(a.errorReport,z.errorReport,e),sendBugReport:e=>i(a.bugReport,z.bugReport,e),listSessionFiles:(e,t)=>i(a.listSessionFiles,`${z.sessionFiles(e)}${im({path:t})}`),readSessionFile:(e,t)=>i(a.readSessionFile,`${z.sessionFile(e)}${im({path:t})}`,void 0,{raw:!0}),readSessionFileBytes:(e,t)=>i(a.readSessionFile,`${z.sessionFile(e)}${im({path:t})}`,void 0,{bytes:!0}),deleteSessionFile:(e,t)=>i(a.deleteSessionFile,`${z.sessionFile(e)}${im({path:t})}`),grantLocalFile:async(e,t)=>{let r=await i(a.grantLocalFile,z.sessionLocalFileGrant(e),{path:t});return{...r,url:/^https?:/i.test(r.url)?r.url:`${n}${r.url}`}},statLocalPaths:(e,t)=>i(a.statLocalPaths,z.sessionLocalFileStat(e),{paths:t})}}function sm(e){return e instanceof rm&&(e.status===404||e.status===501)}var cm=120;function lm(){return cm}function um(e){let t=e.batchMs??120,n=e.hiddenBatchMs??1e3,r=e.isHidden??(()=>!1),i=e.now??(()=>Date.now()),a=e.setTimeout??((e,t)=>setTimeout(e,t)),o=e.clearTimeout??(e=>clearTimeout(e)),s=[],c=null,l=-1/0,u=!1,d=()=>{if(c!==null&&(o(c),c=null),s.length===0)return;let t=s;s=[],l=i(),e.deliver(t)};return{push(o){if(u)return;if(s.push(o),!e.isStreamFrame(o)){d();return}let f=r()?n:t;if(f<=0){d();return}if(c!==null)return;let p=i()-l;if(p>=f){d();return}c=a(()=>{c=null,d()},f-p)},flush:d,dispose(){u=!0,c!==null&&o(c),c=null,s=[]}}}function dm(e,t,n){if((t.providerId??``)!==e.providerId||e.variantId!==void 0&&(t.variantId??null)!==(e.variantId??null)||!t.model)return!1;let r=Bs(t.model),i=Bs(e.model);if(r===i)return!0;let a=n.find(t=>t.definition.id===e.providerId)?.definition;return a!==void 0&&Is(a,i)===r}function fm(e){return e instanceof rm&&e.code===`email_not_verified`}function pm(e){if(!fm(e))return null;let t={error:{code:e.code,message:e.message,details:e.details}};return A(t)?t.error.details:null}function mm(e){let t=e.trim(),n=t.indexOf(`@`);return n<=0?`***`:`${t.slice(0,1)}***${t.slice(n)}`}function hm(e,t){return e===void 0||!Number.isFinite(e)||e<=0?t:t+Math.ceil(e)*1e3}function gm(e,t){return Math.max(0,Math.ceil((e.resendAt-t)/1e3))}function _m(e,t){if(!fm(e))return null;let n=t.now??Date.now(),r=pm(e),i=t.email.trim();return{email:i,displayEmail:r?.email||mm(i),verification:r?.verification??`pending`,registered:t.registered===!0,resendAt:hm(r?.resendAfterSec,n)}}function vm(e){let t=e.registered?`Account created. `:``;return e.verification===`unverified`?`${t}Confirm your email first — no link is outstanding for ${e.displayEmail}; send a new one.`:`${t}Confirm your email first — we sent a link to ${e.displayEmail}.`}var ym=`new-chat`,bm=`safeguard-fallback`,xm=`safeguard-no-fallback`;function Sm(e=null){return{sessionId:e,session:null,items:[],index:new Map,status:`idle`,activeTurnId:null,init:null,statusText:null,pendingPermissions:[],lastSeq:null,totals:{costUsd:0,inputTokens:0,cachedInputTokens:0,outputTokens:0,turns:0},turnCachedTokens:0,contextTokens:null,hydrated:!1,agentActivity:{},hasSubagentItems:!1,hasOptimisticUser:!1,lastLocalPromptId:null,lastFrameAt:null,lastLiveUuid:null,engineSince:null,safeguardFallback:null,subpathParents:{},seen:new Set,streams:{},nextId:1}}function Cm(e,t){let n=e.agentActivity[t.agentId],r={subpath:t.subpath,firstAt:n?Math.min(n.firstAt,t.at):t.at,at:n?Math.max(n.at,t.at):t.at,finished:t.finished,toolUses:(n?.toolUses??0)+t.toolUses};return{...e,agentActivity:{...e.agentActivity,[t.agentId]:r}}}function wm(e,t,n,r,i,a){let o=fh.exec(t)?.[2];if(!o)return e;let s=i&&Date.parse(i)||0;if(n!==`assistant`)return Cm(e,{agentId:o,subpath:t,at:s,finished:e.agentActivity[o]?.finished??!1,toolUses:0});let c=(Array.isArray(r)?r:[]).filter(e=>e.type===`tool_use`),l=c.length===0;return typeof a==`string`&&(l=a===`end_turn`||a===`stop_sequence`),c.some(e=>e.name===`StructuredOutput`)&&(l=!0),Cm(e,{agentId:o,subpath:t,at:s,finished:l,toolUses:c.length})}function Tm(e,t){switch(t.type){case`frame`:return km(e,t.frame,t.receivedAt);case`hydrate`:return ch(e,t.messages,t.session??null);case`entries`:return uh(e,t.entries);case`session`:return _h(e,t.session);case`local_prompt`:return yh(e,t);case`local_prompt_failed`:return bh(e,t.requestId);case`local_permission`:return sh(e,t.requestId,t.behavior,`local`);case`local_system`:{let n={kind:`system`,id:`sys:${e.nextId}`,uuid:null,parentToolUseId:null,turnId:null,timestamp:null,subtype:t.subtype,text:t.text};return Dh({...e,nextId:e.nextId+1},n)}case`model_picked`:return Em(e,{type:`model_change`});case`reset`:return Sm(e.sessionId)}}function Em(e,t){let n=kf(e.safeguardFallback,t);return n===e.safeguardFallback?e:{...e,safeguardFallback:n}}function Dm(e){return/^Set model to\s/.test(e)}function Om(e,t,n){let r=n.uuid?`sys:${n.uuid}`:`sys:${e.nextId}`;if(e.index.get(r)!==void 0)return e;let i=e;if(t.retractedUuids.length>0){let e=new Set(t.retractedUuids),n=new Set(i.items.filter(t=>t.uuid!==null&&e.has(t.uuid)).map(e=>e.id));n.size>0&&(i=kh(i,n))}let a={kind:`system`,id:r,uuid:n.uuid,parentToolUseId:n.parentToolUseId,turnId:n.turnId,timestamp:n.timestamp,subtype:t.kind===`fallback`?bm:xm,text:t.text,refusal:t,...t.kind===`no_fallback`?{refusalBefore:i.safeguardFallback?.notice??null}:{}};if(i=Dh(n.uuid?i:Mh(i),a),n.parentToolUseId!==null)return i;let o=n.timestamp?Date.parse(n.timestamp):NaN;return Em(i,{type:`notice`,notice:t,at:Number.isFinite(o)?o:null,live:n.live})}function km(e,t,n){let r=Pm(e,t,n);if(n===void 0||!jm(t,e,r))return r;let i=r.lastFrameAt;return i!==null&&n>=i&&n-i<1e3?r:{...r,lastFrameAt:n}}function Am(e){return e===`running`||e===`waiting_permission`}function jm(e,t,n){switch(e.type){case`agent`:return e.seq===null?e.message.type!==`system`||e.message.subtype!==`local_command`:!1;case`turn_started`:case`turn_finished`:case`prompt_delivered`:case`subagent_activity`:return!0;case`permission_request`:return n!==t;case`permission_resolved`:return!0;default:return!1}}function Mm(e){if(e.lastFrameAt!==null||!e.hydrated||!Am(e.status))return e;let t=e.engineSince??0;for(let n=e.items.length-1;n>=0;n--){let r=e.items[n].timestamp,i=r?Date.parse(r):NaN;if(Number.isFinite(i)){i>t&&(t=i);break}}for(let n of Object.values(e.agentActivity))n.at>t&&(t=n.at);return t>0?{...e,lastFrameAt:t}:e}function Nm(e,t,n){return t!==null||n===void 0||typeof e.timestamp==`string`?e:{...e,timestamp:new Date(n).toISOString()}}function Pm(e,t,n){switch(t.type){case`agent`:{if(t.seq!==null&&e.seen.has(`seq:${t.seq}`))return e;let r=Fm(e,Nm(t.message,t.seq,n),{turnId:t.turnId,receivedAt:n,live:t.seq===null});return t.seq!==null&&(r=jh(r,`seq:${t.seq}`),(r.lastSeq===null||t.seq>r.lastSeq)&&(r={...r,lastSeq:t.seq})),r}case`turn_started`:{let n=`turnstart:${t.turnId}`;if(e.seen.has(n))return e;let r=jh(e,n);if(r={...r,activeTurnId:t.turnId,status:`running`,statusText:null,turnCachedTokens:0},t.requestId){let e=r.items.findIndex(e=>e.kind===`user`&&e.requestId===t.requestId);if(e>=0){let n={...r.items[e],turnId:t.turnId,waiting:!1};r=e<r.items.length-1?Dh(kh(r,new Set([n.id])),n):Oh(r,e,n)}}return r}case`turn_finished`:return nh(e,t.result,t.turnId);case`prompt_delivered`:return Qm(e,t.text,t.deliveredAt,t.requestId);case`prompt_cancelled`:{let n=e.items.filter(e=>e.kind===`user`&&!e.failed&&(e.requestId===t.requestId||(e.waiting||e.optimistic)&&e.deliveredAt===null&&e.text===t.text));return kh(e,new Set(n.map(e=>e.id)))}case`subagent_activity`:return Cm(e,{agentId:t.agentId,subpath:t.subpath,at:Date.parse(t.at)||Date.now(),finished:t.finished,toolUses:t.toolUses});case`permission_request`:return oh(e,t.request,t.turnId,t.settled===!0);case`permission_resolved`:return sh(e,t.requestId,t.behavior,t.resolvedBy);case`session_state`:{let n=t.session;return _h((n.status===`idle`||n.status===`error`)&&e.pendingPermissions.length===0&&e.activeTurnId!==null?{...e,activeTurnId:null}:e,n)}case`error`:{if(t.code===`replay_truncated`||t.code===`replay_windowed`)return e;let r={kind:`error`,id:`err:${e.nextId}`,uuid:null,parentToolUseId:null,turnId:e.activeTurnId,timestamp:n===void 0?null:new Date(n).toISOString(),code:t.code,message:t.message,requestId:t.requestId??null};return Dh({...e,nextId:e.nextId+1},r)}default:return e}}function Fm(e,t,n){let r=typeof t.uuid==`string`?t.uuid:null,i=t.type===`stream_event`||t.type===`tool_progress`,a=r&&!i?`uuid:${r}`:null;if(i&&r!==null&&r===e.lastLiveUuid)return e;if(a&&e.seen.has(a))return t.type===`assistant`?Bm(e,t):e;let o=e;switch(t.type){case`system`:o=Im(e,t,n);break;case`stream_event`:o=Lm(e,t,n);break;case`assistant`:o=zm(e,t,n);break;case`user`:o=Ym(e,t,n);break;case`result`:o=th(e,t,n);break;case`tool_progress`:o=ih(e,t);break;case`auth_status`:o=ah(e,t,n);break;default:return e}return a?o=jh(o,a):i&&r!==null&&(o={...o,lastLiveUuid:r}),o}function Im(e,t,n){switch(t.subtype){case`init`:{let r={model:Lh(t.model),cwd:Lh(t.cwd),tools:Array.isArray(t.tools)?t.tools.filter(e=>typeof e==`string`):[],permissionMode:Lh(t.permissionMode),claudeCodeVersion:Lh(t.claude_code_version),apiKeySource:Lh(t.apiKeySource),sessionId:Lh(t.session_id),mcpServers:Array.isArray(t.mcp_servers)?t.mcp_servers:[]};return{...e,init:r,engineSince:n.receivedAt??Date.now()}}case wf:case Tf:{let r=Of(t);return r?Om(e,r,{uuid:Ph(t),parentToolUseId:Fh(t),turnId:n.turnId??e.activeTurnId,timestamp:Ih(t),live:n.live===!0}):e}case`compact_boundary`:{let r=t.compact_metadata??{},i={kind:`compact`,id:Nh(e,`compact`,t),uuid:Ph(t),parentToolUseId:Fh(t),turnId:n.turnId,timestamp:Ih(t),trigger:r.trigger===`manual`?`manual`:`auto`,preTokens:typeof r.pre_tokens==`number`?r.pre_tokens:0,postTokens:typeof r.post_tokens==`number`?r.post_tokens:null};return Dh(Mh(e),i)}case`status`:{let n=typeof t.status==`string`?t.status:null;return{...e,statusText:n}}case`task_notification`:{let r=ve({taskId:Lh(t.task_id)||null,toolUseId:Lh(t.tool_use_id)||null,status:Lh(t.status)||null,summary:Lh(t.summary)||null});if(Ch(e,r))return e;let i=Ph(t),a={kind:`user`,id:i?`u:${i}`:`i${e.nextId}`,uuid:i,parentToolUseId:Fh(t),turnId:n.turnId,timestamp:Ih(t),text:r,attachments:[],requestId:null,optimistic:!1,failed:!1,waiting:!1,deliveredAt:null,compactSummary:!1,taskNotification:!0,engineNote:!1};return e.index.get(a.id)===void 0?Dh(i?e:Mh(e),a):e}case`permission_denied`:{let n=Lh(t.tool_use_id),r=Lh(t.message);return Ah(e,n,e=>{let t=e.name===`AskUserQuestion`&&r===`the user skipped the question`;return{...e,status:t?`skipped`:`denied`,result:e.result??{content:r||`Permission denied`,isError:!t,structured:null}}})}case`rewind_boundary`:{let n={kind:`system`,id:`sys:${e.nextId}`,uuid:Ph(t),parentToolUseId:Fh(t),turnId:e.activeTurnId,timestamp:Ih(t),subtype:`rewind`,text:typeof t.content==`string`&&t.content.trim()?t.content.trim():`Rewound here — the conversation was taken back to this point and continued differently.`};return Dh({...e,nextId:e.nextId+1},n)}default:{let n=typeof t.content==`string`?t.content.trim():``,r=n?Gm(n):null;if(!r||r.subtype===`caveat`)return e;let i=r.subtype===`local-command`?Jm(n):null,a=r.subtype===`local-command`&&!i?tp(n):null,o={kind:`system`,id:`sys:${e.nextId}`,uuid:Ph(t),parentToolUseId:Fh(t),turnId:e.activeTurnId,timestamp:Ih(t),subtype:i?`chat-notice`:a?ym:r.subtype,text:r.text,...i?{chatMarker:i}:{},...a?{newChat:a}:{}},s=Dh({...e,nextId:e.nextId+1},o);return r.subtype===`local-command`&&Dm(r.text)?Em(s,{type:`model_change`}):s}}}function Lm(e,t,n){let r=t.event;if(!r||typeof r!=`object`)return e;let i=Fh(t),a=i??``,o=e.streams[a]??{messageId:null,model:null,blocks:{},unclaimed:[]};switch(r.type){case`message_start`:{let t=r.message,n={messageId:t?.id??null,model:t?.model??null,blocks:{},unclaimed:[]},i=e;for(let e of o.unclaimed)i=Rm(i,e);return{...i,streams:{...i.streams,[a]:n}}}case`content_block_start`:{let s=r.content_block,c=e,l;if(s.type===`text`)l={kind:`assistant`,id:`i${e.nextId}`,uuid:null,parentToolUseId:i,turnId:n.turnId,timestamp:Ih(t),text:s.text??``,streaming:!0,model:o.model,messageId:o.messageId,error:null,aborted:!1},c=Mh(c);else if(s.type===`thinking`||s.type===`redacted_thinking`)l={kind:`thinking`,id:`i${e.nextId}`,uuid:null,parentToolUseId:i,turnId:n.turnId,timestamp:Ih(t),text:s.type===`thinking`?s.thinking??``:``,streaming:!0,redacted:s.type===`redacted_thinking`},c=Mh(c);else if(s.type===`tool_use`){let c=s;if(e.index.get(c.id)!==void 0){let t={...o.blocks,[r.index]:c.id};return{...e,streams:{...e.streams,[a]:{...o,blocks:t}}}}let u=c.input&&Object.keys(c.input).length>0;l={kind:`tool`,id:c.id,uuid:null,parentToolUseId:i,turnId:n.turnId,timestamp:Ih(t),toolUseId:c.id,name:c.name,input:u?c.input:null,inputJson:u?JSON.stringify(c.input):``,status:`streaming`,result:null,startedAt:n.receivedAt??null,finishedAt:null,durationMs:null,elapsedSec:null,permissionRequestId:null,messageId:o.messageId}}else return e;c=Dh(c,l);let u={...o.blocks,[r.index]:l.id},d=[...o.unclaimed,l.id];return{...c,streams:{...c.streams,[a]:{...o,blocks:u,unclaimed:d}}}}case`content_block_delta`:{let t=o.blocks[r.index];if(!t)return e;let n=e.index.get(t);if(n===void 0)return e;let i=e.items[n],a=r.delta;return a.type===`text_delta`&&i.kind===`assistant`?Oh(e,n,{...i,text:i.text+a.text}):a.type===`thinking_delta`&&i.kind===`thinking`?Oh(e,n,{...i,text:i.text+a.thinking}):a.type===`input_json_delta`&&i.kind===`tool`?Oh(e,n,{...i,inputJson:i.inputJson+a.partial_json}):e}case`content_block_stop`:{let t=o.blocks[r.index];return t?Rm(e,t,n.receivedAt):e}case`message_delta`:case`message_stop`:case`ping`:return e;case`error`:{let a={kind:`error`,id:`err:${e.nextId}`,uuid:null,parentToolUseId:i,turnId:n.turnId,timestamp:Ih(t),code:r.error?.type??`stream_error`,message:r.error?.message??`stream error`,requestId:null};return Dh(Mh(e),a)}default:return e}}function Rm(e,t,n){let r=e.index.get(t);if(r===void 0)return e;let i=e.items[r];if(i.kind===`assistant`||i.kind===`thinking`)return i.streaming?Oh(e,r,{...i,streaming:!1}):e;if(i.kind===`tool`&&i.status===`streaming`){let t=i.input??Vh(i.inputJson);return Oh(e,r,{...i,input:t,status:`running`,startedAt:i.startedAt??n??null})}return e}function zm(e,t,n){let r=t.local_command_source;if(typeof r==`string`){let i=Gm(r.trim());if(i&&(i.subtype===`local-command`||i.subtype===`local-command-error`)){let r={kind:`system`,id:`sys:${e.nextId}`,uuid:Ph(t),parentToolUseId:Fh(t),turnId:n.turnId??e.activeTurnId,timestamp:Ih(t),subtype:i.subtype,text:i.text},a=Dh({...e,nextId:e.nextId+1},r);return i.subtype===`local-command`&&Dm(i.text)?Em(a,{type:`model_change`}):a}}let i=t.message??{},a=zh(i.content),o=Fh(t),s=o??``,c=Ph(t),l=Ih(t),u=typeof t.error==`string`?t.error:null,d=t.aborted===!0,f=e;{let e=Rh(i.usage?.cache_read_input_tokens)+Rh(i.usage?.cache_creation_input_tokens),n=`usage:${i.id??``}`;if(e>0&&i.id&&!f.seen.has(n)&&(f={...jh(f,n),turnCachedTokens:f.turnCachedTokens+e}),o===null&&t.isSidechain!==!0){let t=Rh(i.usage?.input_tokens)+e+Rh(i.usage?.output_tokens);t>0&&t!==f.contextTokens&&(f={...f,contextTokens:t})}}let p=f.streams[s];for(let e of a){let t=p?Vm(f,p,e):null;if(t){let n=f.index.get(t),r=f.items[n];f=Oh(f,n,Hm(r,e,{uuid:c,timestamp:l,model:i.model??null,messageId:i.id??null,errorText:u,aborted:d})),p={...p,unclaimed:p.unclaimed.filter(e=>e!==t)},f={...f,streams:{...f.streams,[s]:p}};continue}let r=Um(f,e,{uuid:c,timestamp:l,parentToolUseId:o,turnId:n.turnId,model:i.model??null,messageId:i.id??null,errorText:u,aborted:d,receivedAt:n.receivedAt});r&&(f=r)}if(a.length===0&&u){let e={kind:`error`,id:`err:${f.nextId}`,uuid:c,parentToolUseId:o,turnId:n.turnId,timestamp:l,code:`assistant_error`,message:u,requestId:null};f=Dh(Mh(f),e)}return f}function Bm(e,t){let n=Fh(t)??``,r=e.streams[n];if(!r||r.unclaimed.length===0)return e;let i=t.message??{},a=new Set,o=e,s=r;for(let e of zh(i.content)){let t=Vm(o,s,e);t&&(a.add(t),s={...s,unclaimed:s.unclaimed.filter(e=>e!==t)},o={...o,streams:{...o.streams,[n]:s}})}return kh(e,a)}function Vm(e,t,n){for(let r of t.unclaimed){let t=e.index.get(r);if(t===void 0)continue;let i=e.items[t];if(!i.uuid&&(n.type===`text`&&i.kind===`assistant`||(n.type===`thinking`||n.type===`redacted_thinking`)&&i.kind===`thinking`||n.type===`tool_use`&&i.kind===`tool`&&i.toolUseId===n.id))return r}return null}function Hm(e,t,n){if(e.kind===`assistant`&&t.type===`text`){let r=t.text??e.text;return{...e,uuid:n.uuid,timestamp:n.timestamp??e.timestamp,text:r.length>=e.text.length?r:e.text,streaming:!1,model:n.model??e.model,messageId:n.messageId??e.messageId,error:n.errorText,aborted:n.aborted}}if(e.kind===`thinking`){let r=t.type===`thinking`?t.thinking??e.text:e.text;return{...e,uuid:n.uuid,timestamp:n.timestamp??e.timestamp,text:r||e.text,streaming:!1}}if(e.kind===`tool`&&t.type===`tool_use`){let r=t,i=r.input&&Object.keys(r.input).length>0?r.input:e.input??Vh(e.inputJson);return{...e,uuid:n.uuid,timestamp:n.timestamp??e.timestamp,name:r.name??e.name,input:i,inputJson:e.inputJson||(i?JSON.stringify(i):``),status:e.status===`streaming`?`running`:e.status,messageId:n.messageId??e.messageId}}return e}function Um(e,t,n){let r={uuid:n.uuid,parentToolUseId:n.parentToolUseId,turnId:n.turnId,timestamp:n.timestamp};if(t.type===`text`){let i={kind:`assistant`,id:`i${e.nextId}`,...r,text:t.text??``,streaming:!1,model:n.model,messageId:n.messageId,error:n.errorText,aborted:n.aborted};return Dh(Mh(e),i)}if(t.type===`thinking`||t.type===`redacted_thinking`){let n={kind:`thinking`,id:`i${e.nextId}`,...r,text:t.type===`thinking`?t.thinking??``:``,streaming:!1,redacted:t.type===`redacted_thinking`};return Dh(Mh(e),n)}if(t.type===`tool_use`){let i=t,a=e.index.get(i.id);if(a!==void 0){let r=e.items[a];return Oh(e,a,Hm(r,t,n))}let o=i.input&&typeof i.input==`object`?i.input:null;return Dh(e,{kind:`tool`,id:i.id,...r,toolUseId:i.id,name:i.name,input:o,inputJson:o?JSON.stringify(o):``,status:`running`,result:null,startedAt:n.receivedAt??null,finishedAt:null,durationMs:null,elapsedSec:null,permissionRequestId:null,messageId:n.messageId})}return null}function Wm(e){return e.trim().replace(/\s+/g,` `)}function Gm(e){if(/^<local-command-caveat>/.test(e))return{subtype:`caveat`,text:``};let t=/^<local-command-(stdout|stderr)>([\s\S]*?)<\/local-command-\1>$/.exec(e);if(t){let e=t[2].replace(/\u001b\[[0-9;]*m/g,``).trim();return{subtype:t[1]===`stderr`?`local-command-error`:`local-command`,text:e}}let n=/<command-name>([^<]*)<\/command-name>/.exec(e);if(n&&/^<command-/.test(e)){let t=/<command-args>([^<]*)<\/command-args>/.exec(e)?.[1]?.trim()??``,r=n[1].trim(),i=fp(r.replace(/^\//,``));return{subtype:`command`,text:`${i===null?r:`/${i}`}${t?` `+t:``}`}}return null}function Km(e){let t=e.charCodeAt(0);return t===9993||t===8617||t===8635||t===9888}function qm(e){return Km(e)?Vl(e):[]}function Jm(e){if(!e.startsWith(`<local-command-stdout>`))return null;let t=Bl(e);return t?.kind===`notice`?t:null}function Ym(e,t,n){let r=t.message??{},i=Fh(t),a=Ph(t),o=Ih(t),s=t.isSynthetic===!0,c=e,l=[],u=[],d=!1;if(typeof r.content==`string`)l.push(r.content);else for(let e of zh(r.content))if(e.type===`text`)l.push(e.text??``);else if(e.type===`tool_result`){d=!0;let r=e;c=$m(c,r.tool_use_id,{content:r.content??``,isError:r.is_error===!0,structured:t.tool_use_result??null},n.receivedAt)}else(e.type===`image`||e.type===`document`)&&u.push(e);let f=fe(l.join(`
97
- `)).trim();if(ge(f)&&Ch(c,f))return c;let p=Gm(f);if(p?.subtype===`caveat`)return c;if(p){if(p.subtype===`command`&&i===null&&c.hasOptimisticUser){let e=Wm(p.text),t=c.items.find(t=>t.kind===`user`&&t.optimistic&&!t.failed&&Wm(t.text)===e);t&&(c=kh(c,new Set([t.id])))}let e=p.subtype===`local-command`?Jm(f):null,t=p.subtype===`local-command`&&!e?tp(f):null,n={kind:`system`,id:`sys:${c.nextId}`,uuid:a,parentToolUseId:i,turnId:c.activeTurnId,timestamp:o,subtype:e?`chat-notice`:t?ym:p.subtype,text:p.text,...e?{chatMarker:e}:{},...t?{newChat:t}:{}},r=Dh({...c,nextId:c.nextId+1},n);return p.subtype===`local-command`&&Dm(p.text)?Em(r,{type:`model_change`}):r}if(f.length===0&&u.length===0||d&&f.length===0||s&&d)return c;let m=i===null?qm(f):[],h=m[0]??null;if(i===null&&!s&&c.hasOptimisticUser&&h===null){let e=c.items.findIndex(e=>e.kind===`user`&&e.optimistic&&!e.failed&&e.text===f);if(e<0&&(c={...c,hasOptimisticUser:!1}),e>=0){let t=c.items[e],r={...t,uuid:a??t.uuid,timestamp:o??t.timestamp,optimistic:!1,turnId:t.turnId??n.turnId};return t.waiting&&e<c.items.length-1?Dh(kh(c,new Set([t.id])),{...r,waiting:!1}):Oh(c,e,r)}}let g=t.isMeta===!0||le(f)||s&&f.length>0&&!se(f),_=t.isCompactSummary===!0||R(f)||ge(f),v=rc(f),y={kind:`user`,id:a?`u:${a}`:`i${c.nextId}`,uuid:a,parentToolUseId:i,turnId:n.turnId,timestamp:o,text:f,attachments:u,requestId:null,optimistic:!1,failed:!1,waiting:!s&&!g&&!_&&v===null&&h===null&&i===null&&n.turnId!==null&&Xm(c,n.turnId),deliveredAt:null,compactSummary:t.isCompactSummary===!0||R(f),taskNotification:ge(f),engineNote:!R(f)&&!ge(f)&&g,...v?{scheduledTask:v.title}:{},...h?{chatMarker:h}:{},...m.length>1?{chatBatch:m}:{}};return c.index.get(y.id)===void 0?Dh(a?c:Mh(c),y):c}function Xm(e,t){if(e.status!==`running`)return!1;for(let n=e.items.length-1;n>=0;n--){let r=e.items[n];if((t===null||r.turnId===null||r.turnId===t)&&(r.kind===`assistant`||r.kind===`thinking`||r.kind===`tool`))return!0}return!1}function Zm(e){let t=-1;for(let n=e.items.length-1;n>=0;n--){let r=e.items[n];if(r.kind===`user`&&r.waiting){t=n;break}}if(t<0)return e;let n=e.items.map(e=>e.kind===`user`&&e.waiting?{...e,waiting:!1}:e);return{...e,items:n}}function Qm(e,t,n,r){let i=r!==void 0&&e.items.some(e=>e.kind===`user`&&!e.failed&&e.requestId===r);for(let a=e.items.length-1;a>=0;a--){let o=e.items[a];if(o.kind!==`user`||o.failed||o.chatMarker!==void 0||(i?o.requestId!==r:o.text!==t))continue;if(!o.optimistic&&!o.waiting&&o.deliveredAt!==null)return e;let s={...o,optimistic:!1,waiting:!1,deliveredAt:n??o.deliveredAt??new Date().toISOString()};return o.waiting&&a<e.items.length-1?Dh(kh(e,new Set([o.id])),s):Oh(e,a,s)}return e}function $m(e,t,n,r){let i=e.index.get(t);if(i===void 0)return Dh(e,{kind:`tool`,id:t,uuid:null,parentToolUseId:null,turnId:null,timestamp:null,toolUseId:t,name:`unknown`,input:null,inputJson:``,status:n.isError?`error`:`done`,result:n,startedAt:null,finishedAt:r??null,durationMs:null,elapsedSec:null,permissionRequestId:null,messageId:null});let a=e.items[i];if(a.result&&a.status!==`running`&&a.status!==`streaming`&&a.status!==`pending`)return e;let o=r??null,s=a.startedAt!==null&&o!==null?Math.max(0,o-a.startedAt):a.durationMs;return Oh(e,i,{...a,input:a.input??Vh(a.inputJson),result:eh(a.name,n)?{...n,isError:!1}:n,status:eh(a.name,n)?`skipped`:n.isError?`error`:`done`,finishedAt:o,durationMs:s})}function eh(e,t){return!t.isError||e!==`AskUserQuestion`?!1:typeof t.content==`string`&&t.content.includes(`the user skipped the question`)}function th(e,t,n){let r=Ff(t.usage,t.modelUsage),i=Array.isArray(t.permission_denials)?t.permission_denials:[],a=n.turnId;return rh(e,{kind:`result`,id:a?`result:${a}`:Ph(t)?`result:${Ph(t)}`:`result:${e.nextId}`,uuid:Ph(t),parentToolUseId:null,turnId:a,timestamp:Ih(t),subtype:typeof t.subtype==`string`?t.subtype:`success`,isError:t.is_error===!0||typeof t.result==`string`&&/^API Error\b/i.test(t.result.trim()),costUsd:Rh(t.total_cost_usd),durationMs:Rh(t.duration_ms),durationApiMs:typeof t.duration_api_ms==`number`?t.duration_api_ms:null,numTurns:Rh(t.num_turns),inputTokens:r.input,cachedInputTokens:r.cached||e.turnCachedTokens,outputTokens:r.output,text:typeof t.result==`string`?t.result:null,errors:Array.isArray(t.errors)?t.errors.map(String):[],stopReason:typeof t.stop_reason==`string`?t.stop_reason:null,structuredOutput:t.structured_output??null},new Set(i.map(e=>e.tool_use_id??``)),n.receivedAt)}function nh(e,t,n){e=Zm(e);let r=`result:${n}`,i=e.index.get(r),a={kind:`result`,id:r,uuid:i===void 0?null:e.items[i].uuid,parentToolUseId:null,turnId:n,timestamp:i===void 0?null:e.items[i].timestamp,subtype:t.subtype,isError:t.isError,costUsd:t.totalCostUsd,durationMs:t.durationMs,durationApiMs:i===void 0?null:e.items[i].durationApiMs,numTurns:t.numTurns,inputTokens:t.inputTokens,cachedInputTokens:t.cachedInputTokens??(i===void 0?void 0:e.items[i].cachedInputTokens)??e.turnCachedTokens,outputTokens:t.outputTokens,text:t.result,errors:t.errors??[],stopReason:t.stopReason,structuredOutput:t.structuredOutput??null};return rh(e,a,new Set,void 0)}function rh(e,t,n,r){let i=e,a=i.index.get(t.id),o=a!==void 0;i=a===void 0?Dh(Mh(i),t):Oh(i,a,t);let s=i.items.map(e=>{if((e.kind===`assistant`||e.kind===`thinking`)&&e.streaming)return{...e,streaming:!1};if(e.kind===`tool`&&e.result===null&&(e.status===`streaming`||e.status===`running`||e.status===`pending`)){let t=n.has(e.toolUseId)?`denied`:`cancelled`;return{...e,status:t,input:e.input??Vh(e.inputJson),finishedAt:r??null}}return e}),c=o?i.totals:{costUsd:i.totals.costUsd+t.costUsd,inputTokens:i.totals.inputTokens+t.inputTokens,cachedInputTokens:i.totals.cachedInputTokens+(t.cachedInputTokens??0),outputTokens:i.totals.outputTokens+t.outputTokens,turns:i.totals.turns+1};return{...i,items:s,totals:c,status:t.isError?`error`:`idle`,activeTurnId:null,statusText:null,streams:{},pendingPermissions:[]}}function ih(e,t){let n=Lh(t.tool_use_id),r=typeof t.elapsed_time_seconds==`number`?t.elapsed_time_seconds:null;return!n||r===null?e:Ah(e,n,e=>e.result?e:{...e,elapsedSec:r})}function ah(e,t,n){let r=Array.isArray(t.output)?t.output.map(String).join(`
97
+ `)).trim();if(ge(f)&&Ch(c,f))return c;let p=Gm(f);if(p?.subtype===`caveat`)return c;if(p){if(p.subtype===`command`&&i===null&&c.hasOptimisticUser){let e=Wm(p.text),t=c.items.find(t=>t.kind===`user`&&t.optimistic&&!t.failed&&Wm(t.text)===e);t&&(c=kh(c,new Set([t.id])))}let e=p.subtype===`local-command`?Jm(f):null,t=p.subtype===`local-command`&&!e?tp(f):null,n={kind:`system`,id:`sys:${c.nextId}`,uuid:a,parentToolUseId:i,turnId:c.activeTurnId,timestamp:o,subtype:e?`chat-notice`:t?ym:p.subtype,text:p.text,...e?{chatMarker:e}:{},...t?{newChat:t}:{}},r=Dh({...c,nextId:c.nextId+1},n);return p.subtype===`local-command`&&Dm(p.text)?Em(r,{type:`model_change`}):r}if(f.length===0&&u.length===0||d&&f.length===0||s&&d)return c;let m=i===null?qm(f):[],h=m[0]??null;if(i===null&&!s&&c.hasOptimisticUser&&h===null){let e=-1,t=!1;for(let n=0;n<c.items.length;n++){let r=c.items[n];if(!(r.kind!==`user`||!r.optimistic||r.failed)&&(t=!0,r.text===f)){e=n;break}}if(t||(c={...c,hasOptimisticUser:!1}),e>=0){let t=c.items[e],r={...t,uuid:a??t.uuid,timestamp:o??t.timestamp,optimistic:!1,turnId:t.turnId??n.turnId};return t.waiting&&e<c.items.length-1?Dh(kh(c,new Set([t.id])),{...r,waiting:!1}):Oh(c,e,r)}}let g=t.isMeta===!0||le(f)||s&&f.length>0&&!se(f),_=t.isCompactSummary===!0||R(f)||ge(f),v=rc(f),y={kind:`user`,id:a?`u:${a}`:`i${c.nextId}`,uuid:a,parentToolUseId:i,turnId:n.turnId,timestamp:o,text:f,attachments:u,requestId:null,optimistic:!1,failed:!1,waiting:!s&&!g&&!_&&v===null&&h===null&&i===null&&n.turnId!==null&&Xm(c,n.turnId),deliveredAt:null,compactSummary:t.isCompactSummary===!0||R(f),taskNotification:ge(f),engineNote:!R(f)&&!ge(f)&&g,...v?{scheduledTask:v.title}:{},...h?{chatMarker:h}:{},...m.length>1?{chatBatch:m}:{}};return c.index.get(y.id)===void 0?Dh(a?c:Mh(c),y):c}function Xm(e,t){if(e.status!==`running`)return!1;for(let n=e.items.length-1;n>=0;n--){let r=e.items[n];if((t===null||r.turnId===null||r.turnId===t)&&(r.kind===`assistant`||r.kind===`thinking`||r.kind===`tool`))return!0}return!1}function Zm(e){let t=-1;for(let n=e.items.length-1;n>=0;n--){let r=e.items[n];if(r.kind===`user`&&r.waiting){t=n;break}}if(t<0)return e;let n=e.items.map(e=>e.kind===`user`&&e.waiting?{...e,waiting:!1}:e);return{...e,items:n}}function Qm(e,t,n,r){let i=r!==void 0&&e.items.some(e=>e.kind===`user`&&!e.failed&&e.requestId===r);for(let a=e.items.length-1;a>=0;a--){let o=e.items[a];if(o.kind!==`user`||o.failed||o.chatMarker!==void 0||(i?o.requestId!==r:o.text!==t))continue;if(!o.optimistic&&!o.waiting&&o.deliveredAt!==null)return e;let s={...o,optimistic:!1,waiting:!1,deliveredAt:n??o.deliveredAt??new Date().toISOString()};return o.waiting&&a<e.items.length-1?Dh(kh(e,new Set([o.id])),s):Oh(e,a,s)}return e}function $m(e,t,n,r){let i=e.index.get(t);if(i===void 0)return Dh(e,{kind:`tool`,id:t,uuid:null,parentToolUseId:null,turnId:null,timestamp:null,toolUseId:t,name:`unknown`,input:null,inputJson:``,status:n.isError?`error`:`done`,result:n,startedAt:null,finishedAt:r??null,durationMs:null,elapsedSec:null,permissionRequestId:null,messageId:null});let a=e.items[i];if(a.result&&a.status!==`running`&&a.status!==`streaming`&&a.status!==`pending`)return e;let o=r??null,s=a.startedAt!==null&&o!==null?Math.max(0,o-a.startedAt):a.durationMs;return Oh(e,i,{...a,input:a.input??Vh(a.inputJson),result:eh(a.name,n)?{...n,isError:!1}:n,status:eh(a.name,n)?`skipped`:n.isError?`error`:`done`,finishedAt:o,durationMs:s})}function eh(e,t){return!t.isError||e!==`AskUserQuestion`?!1:typeof t.content==`string`&&t.content.includes(`the user skipped the question`)}function th(e,t,n){let r=Ff(t.usage,t.modelUsage),i=Array.isArray(t.permission_denials)?t.permission_denials:[],a=n.turnId;return rh(e,{kind:`result`,id:a?`result:${a}`:Ph(t)?`result:${Ph(t)}`:`result:${e.nextId}`,uuid:Ph(t),parentToolUseId:null,turnId:a,timestamp:Ih(t),subtype:typeof t.subtype==`string`?t.subtype:`success`,isError:t.is_error===!0||typeof t.result==`string`&&/^API Error\b/i.test(t.result.trim()),costUsd:Rh(t.total_cost_usd),durationMs:Rh(t.duration_ms),durationApiMs:typeof t.duration_api_ms==`number`?t.duration_api_ms:null,numTurns:Rh(t.num_turns),inputTokens:r.input,cachedInputTokens:r.cached||e.turnCachedTokens,outputTokens:r.output,text:typeof t.result==`string`?t.result:null,errors:Array.isArray(t.errors)?t.errors.map(String):[],stopReason:typeof t.stop_reason==`string`?t.stop_reason:null,structuredOutput:t.structured_output??null},new Set(i.map(e=>e.tool_use_id??``)),n.receivedAt)}function nh(e,t,n){e=Zm(e);let r=`result:${n}`,i=e.index.get(r),a={kind:`result`,id:r,uuid:i===void 0?null:e.items[i].uuid,parentToolUseId:null,turnId:n,timestamp:i===void 0?null:e.items[i].timestamp,subtype:t.subtype,isError:t.isError,costUsd:t.totalCostUsd,durationMs:t.durationMs,durationApiMs:i===void 0?null:e.items[i].durationApiMs,numTurns:t.numTurns,inputTokens:t.inputTokens,cachedInputTokens:t.cachedInputTokens??(i===void 0?void 0:e.items[i].cachedInputTokens)??e.turnCachedTokens,outputTokens:t.outputTokens,text:t.result,errors:t.errors??[],stopReason:t.stopReason,structuredOutput:t.structuredOutput??null};return rh(e,a,new Set,void 0)}function rh(e,t,n,r){let i=e,a=i.index.get(t.id),o=a!==void 0;i=a===void 0?Dh(Mh(i),t):Oh(i,a,t);let s=i.items.map(e=>{if((e.kind===`assistant`||e.kind===`thinking`)&&e.streaming)return{...e,streaming:!1};if(e.kind===`tool`&&e.result===null&&(e.status===`streaming`||e.status===`running`||e.status===`pending`)){let t=n.has(e.toolUseId)?`denied`:`cancelled`;return{...e,status:t,input:e.input??Vh(e.inputJson),finishedAt:r??null}}return e}),c=o?i.totals:{costUsd:i.totals.costUsd+t.costUsd,inputTokens:i.totals.inputTokens+t.inputTokens,cachedInputTokens:i.totals.cachedInputTokens+(t.cachedInputTokens??0),outputTokens:i.totals.outputTokens+t.outputTokens,turns:i.totals.turns+1};return{...i,items:s,totals:c,status:t.isError?`error`:`idle`,activeTurnId:null,statusText:null,streams:{},pendingPermissions:[]}}function ih(e,t){let n=Lh(t.tool_use_id),r=typeof t.elapsed_time_seconds==`number`?t.elapsed_time_seconds:null;return!n||r===null?e:Ah(e,n,e=>e.result?e:{...e,elapsedSec:r})}function ah(e,t,n){let r=Array.isArray(t.output)?t.output.map(String).join(`
98
98
  `):``,i=typeof t.error==`string`?t.error:null,a=i?`Authentication error: ${i}`:t.isAuthenticating?`Authenticating…\n${r}`.trim():r;if(!a)return e;let o={kind:`system`,id:`sys:${e.nextId}`,uuid:Ph(t),parentToolUseId:null,turnId:n.turnId,timestamp:Ih(t),subtype:`auth_status`,text:a};return Dh(Mh(e),o)}function oh(e,t,n,r=!1){let i=`perm:${t.requestId}`;if(e.index.get(i)!==void 0)return e;let a=e.index.get(t.toolUseId),o=a===void 0?void 0:e.items[a],s=Dh(e,{kind:`permission`,id:i,uuid:null,parentToolUseId:o?.kind===`tool`?o.parentToolUseId:null,turnId:n,timestamp:t.createdAt,request:t,status:r?`allowed`:`pending`,resolvedBy:r?`auto`:null});return s=Ah(s,t.toolUseId,e=>({...e,permissionRequestId:t.requestId,status:e.result?e.status:r?`running`:`pending`})),r?{...s,activeTurnId:s.activeTurnId??n}:{...s,pendingPermissions:[...s.pendingPermissions.filter(e=>e.requestId!==t.requestId),t],status:`waiting_permission`,activeTurnId:s.activeTurnId??n}}function sh(e,t,n,r){let i=`perm:${t}`,a=e.index.get(i),o=e,s=null;if(a!==void 0){let e=o.items[a];s=e.request.toolUseId,e.status===`pending`&&(o=Oh(o,a,{...e,status:n===`allow`?`allowed`:`denied`,resolvedBy:r}))}let c=o.pendingPermissions.filter(e=>e.requestId!==t);s&&(o=Ah(o,s,e=>e.result?e:{...e,status:n===`allow`?`running`:`denied`}));let l=c.length>0?`waiting_permission`:o.activeTurnId||o.status===`waiting_permission`?`running`:o.status;return{...o,pendingPermissions:c,status:l}}function ch(e,t,n){return Th(e,e=>lh(e,t,n))}function lh(e,t,n){let r=e;for(let e of t){let t=e.parentToolUseId;if(e.subpath&&(r=wm(r,e.subpath,e.role,e.content,e.timestamp)),e.subpath&&(t===null||r.index.get(t)===void 0)){let n=gh(r,e.subpath);r=n.state,t=n.parentToolUseId}let n={type:e.role===`assistant`?`assistant`:e.role===`user`?`user`:`system`,uuid:e.uuid,parent_tool_use_id:t,timestamp:e.timestamp??void 0};if(e.role===`system`){let t=typeof e.content==`string`?e.content:Bh(zh(e.content)),n=e.subtype===`model_refusal_fallback`||e.subtype===`model_refusal_no_fallback`?Of(e.refusal??{subtype:e.subtype,content:t}):null;if(n){if(r.seen.has(`uuid:${e.uuid}`))continue;r=jh(Om(r,n,{uuid:e.uuid,parentToolUseId:e.parentToolUseId,turnId:null,timestamp:e.timestamp,live:!1}),`uuid:${e.uuid}`);continue}if(!t||r.seen.has(`uuid:${e.uuid}`))continue;let i=Gm(t.trim());i?.subtype===`local-command`&&Dm(i.text)&&(r=Em(r,{type:`model_change`}));let a=Jm(t.trim()),o=a?null:tp(t.trim()),s={kind:`system`,id:`sys:${e.uuid}`,uuid:e.uuid,parentToolUseId:e.parentToolUseId,turnId:null,timestamp:e.timestamp,subtype:a?`chat-notice`:o?ym:e.subtype===`rewind_boundary`?`rewind`:`history`,text:a||o?Gm(t.trim())?.text??t:t,...a?{chatMarker:a}:{},...o?{newChat:o}:{}};r.index.get(s.id)===void 0&&(r=jh(Dh(r,s),`uuid:${e.uuid}`));continue}let i=e.role===`assistant`?{id:null,role:`assistant`,model:e.model,content:zh(e.content)}:{role:`user`,content:typeof e.content==`string`?e.content:zh(e.content)};r=Fm(r,{...n,message:i},{turnId:null,receivedAt:void 0})}return r={...r,hydrated:!0},r=n?_h(r,n):vh(r),Mm(r)}function uh(e,t){return Th(e,e=>dh(e,t))}function dh(e,t){let n=e;for(let e of t){let t=`seq:${e.seq}`;if(n.seen.has(t))continue;let r=e.entry,i=e.type||String(r.type??``);if(i===`attachment`){let t=me(r);if(t!==null){let i={type:`user`,uuid:e.uuid??(typeof r.uuid==`string`?r.uuid:void 0),parent_tool_use_id:null,timestamp:e.timestamp??void 0,message:{role:`user`,content:t.content}};n=Fm(n,i,{turnId:null,receivedAt:void 0}),typeof t.content!=`string`&&(n=Qm(n,t.text,t.timestamp))}}if(i===`queue-operation`){let e=pe(r);e&&(n=Qm(n,e.text,e.deliveredAt))}if(i===`user`||i===`assistant`||i===`system`||i===`result`){let t=r.parent_tool_use_id??null;if(e.subpath){let t=r.message;n=wm(n,e.subpath,i,t?.content,e.timestamp,t?.stop_reason)}if(e.subpath&&(t===null||n.index.get(t)===void 0)){let r=gh(n,e.subpath);n=r.state,t=r.parentToolUseId}let a={...r,type:i,uuid:e.uuid??(typeof r.uuid==`string`?r.uuid:void 0),parent_tool_use_id:t,timestamp:e.timestamp??void 0};n=Fm(n,a,{turnId:null,receivedAt:void 0})}n=jh(n,t),(n.lastSeq===null||e.seq>n.lastSeq)&&(n={...n,lastSeq:e.seq})}return Mm(vh({...n,hydrated:!0}))}var fh=/^subagents\/(?:workflows\/([^/]+)\/)?agent-(.+?)(?:\.jsonl)?$/;function ph(e){return`subagent:${e}`}function mh(e){return`subagent:workflows/${e}`}function hh(e,t,n,r){return{kind:`tool`,id:e,uuid:null,parentToolUseId:r,turnId:null,timestamp:null,toolUseId:e,name:t,input:{description:n},inputJson:``,status:`done`,result:null,startedAt:null,finishedAt:null,durationMs:null,elapsedSec:null,permissionRequestId:null,messageId:null}}function gh(e,t){if(!t)return{state:e,parentToolUseId:null};let n=e.subpathParents[t];if(n!==void 0&&e.index.get(n)!==void 0)return{state:e,parentToolUseId:n};let r=fh.exec(t);if(!r)return{state:e,parentToolUseId:null};let i=r[1]??null,a=r[2],o=(e,n)=>({state:wh?(e.subpathParents[t]=n,e):{...e,subpathParents:{...e.subpathParents,[t]:n}},parentToolUseId:n}),s=e.index.get(a);if(s!==void 0){let t=e.items[s];if(t?.kind===`tool`)return o(e,t.toolUseId)}if(i){for(let t of e.items)if(t.kind===`tool`&&t.name===`Workflow`&&t.result!==null&&Hh(t.result).includes(i))return o(e,t.toolUseId)}let c=ph(t);if(e.index.get(c)!==void 0)return o(e,c);let l=a.slice(0,8),u=e,d=null;i&&(d=mh(i),u.index.get(d)===void 0&&(u=Dh(u,hh(d,`Workflow`,`Workflow run ${i} (transcript)`,null))));let f=hh(c,`Agent`,i?`Agent ${l}`:`Agent ${l} (transcript)`,d);return o(Dh(u,f),c)}function _h(e,t){let n=e.pendingPermissions.length>0?`waiting_permission`:t.status,r=t.engineSince?Date.parse(t.engineSince):NaN,i=e.hydrated&&e.session!==null&&!Am(e.status)&&Am(n),a=e.session?.engineSince,o=t.engineSince,s=e.session!==null&&a!==void 0&&o!==void 0&&a!==o,c=Mm(vh({...e,session:t,sessionId:t.id,status:n,engineSince:Number.isFinite(r)?r:e.engineSince,...i?{lastFrameAt:null}:{},...s&&e.safeguardFallback?.live===!0?{safeguardFallback:kf(e.safeguardFallback,{type:`engine_start`})}:{}}));if(!i)return c;let l=Date.parse(t.updatedAt);return Number.isFinite(l)&&l>(c.lastFrameAt??0)?{...c,lastFrameAt:l}:c}function vh(e){if(e.activeTurnId!==null||e.status!==`idle`&&e.status!==`error`)return e;let t=!1,n=e.items.map(e=>(e.kind===`assistant`||e.kind===`thinking`)&&e.streaming?(t=!0,{...e,streaming:!1}):e.kind===`tool`&&e.result===null&&(e.status===`streaming`||e.status===`running`||e.status===`pending`)?(t=!0,{...e,status:`cancelled`,input:e.input??Vh(e.inputJson)}):e);return t?{...e,items:n}:e}function yh(e,t){let n=(t.attachments??[]).filter(e=>typeof e==`object`&&!!e&&typeof e.type==`string`),r={kind:`user`,id:`req:${t.requestId}`,uuid:null,parentToolUseId:null,turnId:null,timestamp:t.at??null,text:t.text,attachments:n,requestId:t.requestId,optimistic:!0,failed:!1,waiting:e.status===`running`,deliveredAt:null,compactSummary:!1,taskNotification:!1,engineNote:!1};if(e.index.get(r.id)!==void 0)return e;let i=new Set(e.items.filter(e=>e.kind===`user`&&e.failed&&e.text===t.text).map(e=>e.id)),a=!Am(e.status),o=t.at===void 0?NaN:Date.parse(t.at);return{...Dh(kh(e,i),r),status:`running`,statusText:null,hasOptimisticUser:!0,lastLocalPromptId:r.id,...a?{lastFrameAt:Number.isFinite(o)?o:null}:{}}}function bh(e,t){let n=e.index.get(`req:${t}`),r=e;if(n!==void 0){let t=e.items[n];t?.kind===`user`&&!t.failed&&(r=Oh(e,n,{...t,failed:!0}))}return r.activeTurnId!==null||r.status!==`running`&&r.status!==`waiting_permission`?r:{...r,status:`error`,statusText:null}}function xh(e,t){let n=new Map,r=new Map;for(let t of e){let e={item:t,children:[]};n.set(t.id,e),t.kind===`tool`&&r.set(t.toolUseId,e)}let i=[];for(let t of e){let e=n.get(t.id),a=t.parentToolUseId?r.get(t.parentToolUseId):void 0;a&&a!==e?a.children.push(e):i.push(e)}if(!t||t.length===0)return i;let a=new Map,o=e=>{for(let t of e)a.set(t.item.id,t),t.children.length>0&&o(t.children)};o(t);let s=new Map;for(let t=e.length-1;t>=0;t--){let r=n.get(e[t].id);for(let e=0;e<r.children.length;e++){let t=s.get(r.children[e]);t&&(r.children[e]=t)}let i=a.get(r.item.id);s.set(r,i&&Sh(i,r)?i:r)}let c=i.map(e=>s.get(e)??e);return c.length===t.length&&c.every((e,n)=>e===t[n])?t:c}function Sh(e,t){if(e.item!==t.item||e.children.length!==t.children.length)return!1;for(let n=0;n<t.children.length;n++)if(e.children[n]!==t.children[n])return!1;return!0}function Ch(e,t){let n=ye(t);if(!n.taskId)return!1;for(let t=e.items.length-1;t>=0;t--){let r=e.items[t];if(r.kind!==`user`||!r.taskNotification)continue;let i=ye(r.text);if(i.taskId===n.taskId&&(i.toolUseId??null)===(n.toolUseId??null))return!0}return!1}var wh=!1;function Th(e,t){if(wh)return t(e);wh=!0;try{return t({...e,items:e.items.slice(),index:new Map(e.index),seen:new Set(e.seen),subpathParents:{...e.subpathParents}})}finally{wh=!1}}var Eh=new Set([`Task`,`Agent`,`Workflow`]);function Dh(e,t){let n=e.hasSubagentItems||t.kind===`tool`&&Eh.has(t.name);if(wh)return e.items.push(t),e.index.set(t.id,e.items.length-1),e.hasSubagentItems=n,e;let r=[...e.items,t];return{...e,items:r,index:new Map(e.index).set(t.id,r.length-1),...n===e.hasSubagentItems?{}:{hasSubagentItems:n}}}function Oh(e,t,n){if(wh)return e.items[t]=n,e;let r=e.items.slice();return r[t]=n,{...e,items:r}}function kh(e,t){if(t.size===0)return e;let n=e.items.filter(e=>!t.has(e.id)),r=new Map;n.forEach((e,t)=>{r.set(e.id,t)});let i={};for(let[n,r]of Object.entries(e.streams)){let e={};for(let[n,i]of Object.entries(r.blocks))t.has(i)||(e[Number(n)]=i);i[n]={...r,blocks:e,unclaimed:r.unclaimed.filter(e=>!t.has(e))}}return{...e,items:n,index:r,streams:i}}function Ah(e,t,n){let r=e.index.get(t);if(r===void 0)return e;let i=e.items[r];if(!i||i.kind!==`tool`)return e;let a=n(i);return a===i?e:Oh(e,r,a)}function jh(e,t){return e.seen.has(t)?e:wh?(e.seen.add(t),e):{...e,seen:new Set(e.seen).add(t)}}function Mh(e){return{...e,nextId:e.nextId+1}}function Nh(e,t,n){let r=Ph(n);return r?`${t}:${r}`:`${t}:${e.nextId}`}function Ph(e){return typeof e.uuid==`string`&&e.uuid?e.uuid:null}function Fh(e){return typeof e.parent_tool_use_id==`string`&&e.parent_tool_use_id?e.parent_tool_use_id:null}function Ih(e){return typeof e.timestamp==`string`?e.timestamp:null}function Lh(e){return typeof e==`string`?e:``}function Rh(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function zh(e){return typeof e==`string`?e?[{type:`text`,text:e}]:[]:Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.type==`string`):[]}function Bh(e){return e.map(e=>e.type===`text`?e.text??``:``).filter(Boolean).join(`
99
99
  `)}function Vh(e){let t=e.trim();if(!t)return null;try{let e=JSON.parse(t);return typeof e==`object`&&e&&!Array.isArray(e)?e:null}catch{return null}}function Hh(e){return e?typeof e.content==`string`?e.content:e.content.map(e=>e.type===`text`?e.text??``:e.type===`image`?`[image]`:`[${e.type}]`).join(`
100
100
  `):``}function Uh(e){if(e==null||!Number.isFinite(e))return``;if(e<1e3)return`${Math.floor(e)}ms`;if(e<1e4)return`${(Math.floor(e/100)/10).toFixed(1)}s`;let t=Math.floor(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return n>0?`${n}h ${r}m`:`${r}m ${t%60}s`}function Wh(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e4?`${Math.round(e/1e3)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Gh(e,t=Date.now()){if(!e)return``;let n=Date.parse(e);if(!Number.isFinite(n))return``;let r=Math.max(0,t-n),i=Math.floor(r/1e3);if(i<45)return`just now`;let a=Math.floor(i/60);if(a<60)return`${a}m ago`;let o=Math.floor(a/60);if(o<24)return`${o}h ago`;let s=Math.floor(o/24);return s<30?`${s}d ago`:new Date(n).toLocaleDateString()}function Kh(e,t=Date.now()){if(e==null||!Number.isFinite(e)||e<=0)return``;let n=Math.floor(Math.max(0,t-e)/1e3);if(n<45)return`just now`;let r=(e,t)=>`${e} ${t}${e===1?``:`s`} ago`,i=Math.floor(n/60);if(i<60)return r(Math.max(1,i),`minute`);let a=Math.floor(i/60);if(a<24)return r(a,`hour`);let o=Math.floor(a/24);return o<30?r(o,`day`):new Date(e).toLocaleDateString()}function qh(e){if(!e)return;let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toLocaleString()}function Jh(e){if(!e)return``;let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):``}function Yh(e){let t=e.replace(/[\\/]+$/,``),n=t.split(/[\\/]/);return n[n.length-1]||t}function Xh(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function Zh(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function U(...e){return e.filter(Boolean).join(` `)}function Qh(e,t=6){let n=e.trim().split(/\s+/).filter(Boolean);return n.length<=t?n.join(` `):`${n.slice(0,t).join(` `)}…`}function $h(e){return e.title?.trim()||e.firstPrompt?.trim().replace(/\s+/g,` `)||`Session ${e.id.slice(0,8)}`}function eg(e){if(e instanceof Error)return e.message;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function tg(e,t=Date.now()){return{id:e,title:null,providerId:null,variantId:null,projectId:null,model:null,permissionMode:null,projectDir:null,createdAt:t}}function ng(e,t){if(!t)return e;let n={...e};return!e.model&&!e.providerId&&t.model&&(n.model=t.model,n.providerId=t.providerId??null,n.variantId=null),!e.effort&&t.effort&&(n.effort=t.effort),!e.projectDir&&t.cwd&&(n.projectDir=t.cwd),n}var rg=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function ig(e){return rg.test(e)}function ag(){let e=new Uint8Array(16),t=globalThis.crypto;if(t&&typeof t.getRandomValues==`function`)return t.getRandomValues(e),e;for(let t=0;t<e.length;t++)e[t]=Math.floor(Math.random()*256);return e}function og(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`){let t=e.randomUUID();if(ig(t))return t}let t=ag();t[6]=(t[6]??0)&15|64,t[8]=(t[8]??0)&63|128;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}function sg(e){return e.title?.trim()||`New chat`}function cg(e){let t=e.trim().replace(/\s+/g,` `).slice(0,500);return t.length>0?t:null}function lg(e,t){return typeof t==`string`&&e[t]!==void 0}var ug=`oonacode.uiPrefs`;function dg(e){if(!e)return null;try{let t=e.getItem(ug);return t?Jc(JSON.parse(t)):null}catch{return null}}function fg(e,t){if(e)try{e.setItem(ug,JSON.stringify(t))}catch{}}function pg(e,t){let n=t.notifications?{...e.notifications,...t.notifications}:e.notifications;return Jc({...e,...t,notifications:n})}function mg(e){let t=e;return!t||typeof t!=`object`?!1:t.status===400||t.status===422||t.code===`bad_request`}function hg(e){let{row:t,panel:n,viewport:r}=e,i=e.gap??6,a=e.margin??8,o=Math.max(0,Math.min(e.width??352,r.width-2*a)),s=Math.max(0,Math.min(e.maxHeight??448,r.height-2*a)),c=Math.min(e.height>0?e.height:200,s),l=Math.max(a,Math.min(t.top,r.height-a-c)),u=n.right+i;if(u+o<=r.width-a)return{left:u,top:l,width:o,maxHeight:s,side:`right`};let d=n.left-i-o;if(d>=a)return{left:d,top:l,width:o,maxHeight:s,side:`left`};let f=Math.max(a,Math.min(t.left,r.width-a-o)),p=r.height-a-(t.bottom+i),m=t.top-i-a;if(p>=c||p>=m)return{left:f,top:t.bottom+i,width:o,maxHeight:Math.max(0,Math.min(s,p)),side:`below`};let h=Math.max(0,Math.min(s,m));return{left:f,top:t.top-i-Math.min(c,h),width:o,maxHeight:h,side:`above`}}var gg={ids:[],activeId:null};function _g(e=[],t=null){let n=[];for(let t of e)t&&!n.includes(t)&&n.push(t);let r=n.slice(-20);return{ids:r,activeId:t&&r.includes(t)?t:r[r.length-1]??null}}function vg(e,t){return!e.ids.includes(t)||e.activeId===t?e:{ids:e.ids,activeId:t}}function yg(e,t){let n=e.ids.indexOf(t);if(n===-1)return e;let r=e.ids.filter(e=>e!==t);return e.activeId===t?{ids:r,activeId:r[n]??r[n-1]??null}:{ids:r,activeId:e.activeId}}function bg(e,t,n){if(t===n||t<0||t>=e.ids.length)return e;let r=Math.max(0,Math.min(e.ids.length-1,n));if(r===t)return e;let i=[...e.ids],[a]=i.splice(t,1);return a===void 0?e:(i.splice(r,0,a),{ids:i,activeId:e.activeId})}function xg(e,t){let n=t instanceof Set?t:new Set(t),r=e.ids.filter(e=>n.has(e));return r.length===e.ids.length?e:{ids:r,activeId:e.activeId&&r.includes(e.activeId)?e.activeId:r[r.length-1]??null}}function Sg(e,t){if(e.ids.length===0)return e;let n=e.activeId?e.ids.indexOf(e.activeId):-1,r=n===-1?0:n,i=e.ids.length,a=((r+t)%i+i)%i,o=e.ids[a];return o?vg(e,o):e}function Cg(e,t={},n={}){let r=[],i=[],a={},o={};for(let s of e.ids){let e=n[s];if(e){i.push(s),e.title&&(a[s]=e.title);continue}r.push(s);let c=t[s];c&&(o[s]=c)}return{openTabs:r,draftTabs:i,draftTitles:a,activeTab:e.activeId,remoteTabs:o}}function wg(e){let t=e?.remoteTabs;if(!t)return{};let n={};for(let[e,r]of Object.entries(t))typeof r==`string`&&r.length>0&&(n[e]=r);return n}function Tg(e){let t=e?.draftTabs??[],n=e?.draftTitles??{},r=[];for(let e of t){if(typeof e!=`string`||e.length===0)continue;let t=n[e];r.push({id:e,title:typeof t==`string`&&t.length>0?t:null})}return r}function Eg(e){return _g([...e.openTabs??[],...e.draftTabs??[]],e.activeTab??null)}function Dg(e,t){if(e.length!==t.length)return!0;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!0;return!1}function Og(e,t){for(let n of new Set([...Object.keys(e),...Object.keys(t)]))if(e[n]!==t[n])return!0;return!1}function kg(e,t,n,r={}){let i=Cg(e,n??{},r);return!!(Dg(t.openTabs??[],i.openTabs)||Dg(t.draftTabs??[],i.draftTabs)||Og(t.draftTitles??{},i.draftTitles)||(t.activeTab??null)!==e.activeId||n&&Og(t.remoteTabs??{},i.remoteTabs))}var Ag=.25,jg=`g1`;function Mg(e=gg){return{root:{type:`group`,id:jg},groups:{[jg]:e},focused:jg}}function Ng(e){let t=[],n=e=>{if(e.type===`group`)t.push(e.id);else for(let t of e.children)n(t)};return n(e.root),t}function Pg(e){let t=[];for(let n of Ng(e))t.push(...e.groups[n]?.ids??[]);return t}function Fg(e,t){for(let n of Ng(e))if(e.groups[n]?.ids.includes(t))return n;return null}function Ig(e){return e.groups[e.focused]??gg}function Lg(e){return{ids:Pg(e),activeId:Ig(e).activeId}}function Rg(e,t){if(e.activeId!==t.activeId||e.ids.length!==t.ids.length)return!1;for(let n=0;n<e.ids.length;n++)if(e.ids[n]!==t.ids[n])return!1;return!0}function zg(e){let t=[];for(let n of Ng(e)){let r=e.groups[n]?.activeId;r&&t.push(r)}return t}function Bg(e,t){let n=Ng(e);return n.length<2?null:n[(n.indexOf(t)+1)%n.length]??null}function Vg(e,t){let n=e.root;for(let e of t){if(n.type!==`split`)return null;let t=n.children[e];if(!t)return null;n=t}return n}function Hg(e,t=e.length){let n=Array.from({length:t},(t,n)=>{let r=e[n];return typeof r==`number`&&Number.isFinite(r)&&r>0?r:0}),r=n.reduce((e,t)=>e+t,0);if(t===0)return[];if(r<=0)return n.map(()=>1/t);let i=r/n.filter(e=>e>0).length,a=n.map(e=>e>0?e:i),o=a.reduce((e,t)=>e+t,0);return a.map(e=>e/o)}function Ug(e){if(e.type===`group`)return e;let t=[],n=[],r=Hg(e.sizes,e.children.length);return e.children.forEach((i,a)=>{let o=Ug(i);if(!o)return;let s=r[a]??0;o.type===`split`&&o.direction===e.direction?o.children.forEach((e,r)=>{t.push(e),n.push(s*(o.sizes[r]??0))}):(t.push(o),n.push(s))}),t.length===0?null:t.length===1?t[0]:{type:`split`,direction:e.direction,children:t,sizes:Hg(n)}}function Wg(e,t){if(e.type===`group`)return e.id===t?null:e;let n=[],r=[];return e.children.forEach((i,a)=>{let o=Wg(i,t);o&&(n.push(o),r.push(e.sizes[a]??0))}),n.length===0?null:Ug({type:`split`,direction:e.direction,children:n,sizes:r})}function Gg(e){let t=0;for(let n of Object.keys(e.groups)){let e=/^g(\d+)$/.exec(n);e&&(t=Math.max(t,Number(e[1])))}return`g${t+1}`}function Kg(e,t){let n=Ng(e);if(n.length<=1||!n.includes(t))return e;let r=n.indexOf(t),i=n.filter(e=>e!==t),a=Wg(e.root,t)??{type:`group`,id:i[0]},{[t]:o,...s}=e.groups;return{root:a,groups:s,focused:e.focused===t?n[r-1]??n[r+1]??i[0]:e.focused}}function qg(e,t,n){return e.groups[t]===n?e:{...e,groups:{...e.groups,[t]:n}}}function Jg(e,t){let n=e.groups[t];return n&&n.ids.length===0?Kg(e,t):e}function Yg(e,t,n,r){let i=r===`left`||r===`right`?`row`:`column`,a=r===`left`||r===`top`;if(e.type===`group`)return e.id===t?{type:`split`,direction:i,children:a?[n,e]:[e,n],sizes:[.5,.5]}:e;let o=e.children.findIndex(e=>e.type===`group`&&e.id===t);if(o>=0&&e.direction===i){let t=e.sizes[o]??1/e.children.length,r=[...e.children],i=[...e.sizes],s=a?o:o+1;return i[o]=t/2,r.splice(s,0,n),i.splice(s,0,t/2),{...e,children:r,sizes:i}}return{...e,children:e.children.map(e=>Yg(e,t,n,r))}}function Xg(e,t,n){let r=e;for(let e=0;e<40&&Pg(r).length>20;e++){let e=new Set(Ng(r).map(e=>r.groups[e]?.activeId??null).filter(Boolean)),i=r=>r.find(r=>r!==t&&r!==n&&!e.has(r)),a=i(r.groups[r.focused]?.ids??[]);if(!a){for(let e of Ng(r))if(a=i(r.groups[e]?.ids??[]),a)break}if(!a)break;r=t_(r,a)}return r}function Zg(e,t){return e.focused===t||!e.groups[t]?e:{...e,focused:t}}function Qg(e,t){let n=Ng(e)[t];return n?Zg(e,n):e}function $g(e,t){let n=Fg(e,t);if(!n)return e;let r=e.groups[n];return r.activeId===t&&e.focused===n?e:{...qg(e,n,vg(r,t)),focused:n}}function e_(e,t,n=e.focused){if(!t)return e;if(Fg(e,t))return $g(e,t);let r=e.groups[n]?n:e.focused,i=e.groups[r]??gg;return Xg({...qg(e,r,{ids:[...i.ids,t],activeId:t}),focused:r},t,i.activeId)}function t_(e,t){let n=Fg(e,t);return n?Jg(qg(e,n,yg(e.groups[n],t)),n):e}function n_(e,t,n,r){let i=e.groups[t];return i?qg(e,t,bg(i,n,r)):e}function r_(e,t){let n=e.groups[e.focused];return n?qg(e,e.focused,Sg(n,t)):e}function i_(e,t,n,r){let i=e.groups[n];if(!i)return e;let a=Fg(e,t);if(a===n){let a=i.ids.indexOf(t);return $g(Zg(r===void 0?e:n_(e,n,a,r>a?r-1:r),n),t)}let o=[...i.ids],s=r===void 0?o.length:Math.max(0,Math.min(o.length,r));o.splice(s,0,t);let c={...e,focused:n};return c=qg(c,n,{ids:o,activeId:t}),a&&(c=Jg(qg(c,a,yg(c.groups[a],t)),a)),a?c:Xg(c,t,i.activeId)}function a_(e,t,n,r){if(!e.groups[n])return e;let i=Fg(e,t);if(i===n&&e.groups[n].ids.length===1||Ng(e).length>=8)return e;let a=e;i&&(a=Jg(qg(a,i,yg(a.groups[i],t)),i));let o=Gg(a),s={root:Ug(Yg(a.root,n,{type:`group`,id:o},r))??a.root,groups:{...a.groups,[o]:{ids:[t],activeId:t}},focused:o};return i?s:Xg(s,t,null)}function o_(e,t,n){return e.groups[n.groupId]?n.zone===`center`?i_(e,t,n.groupId,n.index):a_(e,t,n.groupId,n.zone):e}function s_(e,t,n){return n.zone===`center`&&n.index===void 0?Fg(e,t)!==n.groupId:o_(e,t,n)!==e}function c_(e,t,n){let r=Vg(e,t);if(!r||r.type!==`split`)return e;let i=Hg(n,r.children.length);return i.every((e,t)=>Math.abs(e-(r.sizes[t]??0))<1e-6)?e:{...e,root:u_(e.root,t,{...r,sizes:i})}}function l_(e,t){let n=Vg(e,t);return!n||n.type!==`split`?e:c_(e,t,n.children.map(()=>1))}function u_(e,t,n){if(t.length===0)return n;if(e.type!==`split`)return e;let[r,...i]=t;return{...e,children:e.children.map((e,t)=>t===r?u_(e,i,n):e)}}function d_(e,t,n=null){let r=new Set(t),i=new Set,a=e;for(let t of Ng(e)){let e=a.groups[t],n=e.ids.filter(e=>!r.has(e)||i.has(e)?!1:(i.add(e),!0));if(n.length===e.ids.length)continue;let o=e.activeId&&n.includes(e.activeId)?e.activeId:n.at(-1)??null;a=qg(a,t,{ids:n,activeId:o})}for(let e of Ng(a))a=Jg(a,e);let o=t.filter(e=>!i.has(e));if(o.length>0){let e=a.groups[a.focused]??gg,t=[...e.ids,...o.filter((e,t)=>o.indexOf(e)===t)];a=qg(a,a.focused,{ids:t,activeId:e.activeId??t.at(-1)??null})}return n&&r.has(n)&&(a=$g(a,n)),a}function f_(e){if(e.type===`group`)return{width:380,height:240};let t=e.children.map(f_);return e.direction===`row`?{width:t.reduce((e,t)=>e+t.width,0),height:Math.max(0,...t.map(e=>e.height))}:{width:Math.max(0,...t.map(e=>e.width)),height:t.reduce((e,t)=>e+t.height,0)}}function p_(e,t,n){if(e.root.type===`group`)return!1;let r=f_(e.root);return t<r.width||n<r.height}function m_(e,t,n,r=Ag){if(e.width<=0||e.height<=0)return`center`;let i=(t-e.left)/e.width,a=(n-e.top)/e.height,o=[[`left`,i],[`right`,1-i],[`top`,a],[`bottom`,1-a]],s=o[0];for(let e of o)e[1]<s[1]&&(s=e);return s[1]<r?s[0]:`center`}function h_(e,t){for(let n=0;n<e.length;n++){let r=e[n];if(t<r.left+r.width/2)return n}return e.length}function g_(e){switch(e){case`left`:return{left:0,top:0,width:.5,height:1};case`right`:return{left:.5,top:0,width:.5,height:1};case`top`:return{left:0,top:0,width:1,height:.5};case`bottom`:return{left:0,top:.5,width:1,height:.5};default:return{left:0,top:0,width:1,height:1}}}function __(e){if(e.root.type===`group`)return null;let t=n=>{if(n.type===`group`){let t=e.groups[n.id]??gg;return{group:{tabs:[...t.ids],active:t.activeId}}}return{split:n.direction,sizes:n.sizes.map(e=>Math.round(e*1e4)/1e4),children:n.children.map(t)}};return{root:t(e.root),focused:Math.max(0,Ng(e).indexOf(e.focused))}}function v_(e,t){if(!e||!t)return!e&&!t;if(e.focused!==t.focused)return!1;let n=(e,t)=>{if(`group`in e||`group`in t){if(!(`group`in e)||!(`group`in t))return!1;let n=e.group,r=t.group;return n.active===r.active&&n.tabs.length===r.tabs.length&&n.tabs.every((e,t)=>e===r.tabs[t])}return e.split===t.split&&e.children.length===t.children.length&&e.children.every((e,r)=>n(e,t.children[r]))&&e.sizes.every((e,n)=>Math.abs(e-(t.sizes[n]??NaN))<.001)};return n(e.root,t.root)}function y_(e,t,n=null){let r=Mg();if(e&&typeof e==`object`&&e.root){let t={},n=0,i=(e,r)=>{if(r>8||!e||typeof e!=`object`)return null;if(`group`in e&&e.group&&Array.isArray(e.group.tabs)){if(n>=8)return null;n+=1;let r=`g${n}`,i=e.group.tabs.filter(e=>typeof e==`string`),a=typeof e.group.active==`string`&&i.includes(e.group.active)?e.group.active:i.at(-1)??null;return t[r]={ids:i,activeId:a},{type:`group`,id:r}}if(`split`in e&&(e.split===`row`||e.split===`column`)){let t=Array.isArray(e.children)?e.children:[],n=[],a=[];return t.forEach((t,o)=>{let s=i(t,r+1);s&&(n.push(s),a.push(Array.isArray(e.sizes)?e.sizes[o]??0:0))}),n.length===0?null:Ug({type:`split`,direction:e.split,children:n,sizes:a})}return null},a=i(e.root,0);if(a&&Object.keys(t).length>0){let n=[],i=e=>{e.type===`group`?n.push(e.id):e.children.forEach(i)};i(a),r={root:a,groups:t,focused:n[typeof e.focused==`number`&&Number.isInteger(e.focused)?e.focused:0]??n[0]}}}return d_(r,t,n)}function b_(e){return!e||e.text.length===0&&e.attachments.length===0&&(e.replies?.length??0)===0}function x_(e,t){if(!e||e.text!==t.text||e.attachments.length!==t.attachments.length)return!1;let n=e.replies??[],r=t.replies??[];return n.length!==r.length||!n.every((e,t)=>e===r[t])?!1:e.attachments.every((e,n)=>e===t.attachments[n])}function S_(e,t,n){if(b_(n)){if(e[t]===void 0)return e;let{[t]:n,...r}=e;return r}return x_(e[t],n)?e:{...e,[t]:n}}function C_(e,t){let n=Object.keys(e);if(n.length===0)return e;let r=new Set(t);if(n.every(e=>r.has(e)))return e;let i={};for(let t of n)r.has(t)&&(i[t]=e[t]);return i}var w_=new Map;function T_(e,t){return w_.set(e,t),()=>{w_.get(e)===t&&w_.delete(e)}}function E_(e){return w_.get(e)?.()??null}var D_=1e5,O_=50;function k_(e,t,n=null){let r=e.drafts[t],i=e.remoteTabs[t],a={id:t,kind:i?`remote`:r?`draft`:`session`};i&&(a.hostId=i.hostId,a.hostName=i.hostName),r&&(a.draft={title:r.title,providerId:r.providerId,model:r.model,variantId:r.variantId,permissionMode:r.permissionMode,...r.posture?{posture:r.posture}:{},projectDir:r.projectDir,projectId:r.projectId});let o=(n??e.unsent[t])?.text??``;o.length>0&&(a.unsentText=o.slice(0,D_));let s=e.files[t];if(s&&s.open.length>0){let e=s.open.slice(0,O_);a.files={open:e,active:s.active&&e.includes(s.active)?s.active:null}}return a}function A_(e){let{unsentText:t,files:n,...r}=e;return r}var j_=[`default`,`acceptEdits`,`plan`,`auto`,`dontAsk`,`bypassPermissions`];function M_(e,t=Date.now()){let n=e.draft??{},r=e=>typeof e==`string`&&e.length>0?e:null,i=r(n.permissionMode);return{...tg(e.id,t),title:r(n.title),providerId:r(n.providerId),model:r(n.model),variantId:r(n.variantId),permissionMode:i&&j_.includes(i)?i:null,...N(n.posture)?{posture:n.posture}:{},projectDir:r(n.projectDir),projectId:r(n.projectId)}}var N_=`application/x-oonacode-tab`,P_=null;function F_(e,t){if(P_={...t},e){e.effectAllowed=`move`;try{e.setData(N_,t.tabId)}catch{}}}function I_(){return P_}function L_(){let e=P_;return P_=null,e}function R_(e){if(P_)return!0;let t=e?.types;if(!t)return!1;for(let e=0;e<t.length;e++)if(t[e]===`application/x-oonacode-tab`)return!0;return!1}function z_(e,t){return e.clientX<0||e.clientY<0||e.clientX>t.innerWidth||e.clientY>t.innerHeight}function B_(e,t,n){let r=e.getAttribute(`data-editor-group`);if(!r)return null;let i=e.querySelector(`[data-tab-strip]`),a=i?.getBoundingClientRect();if(i&&a&&a.height>0&&n>=a.top&&n<=a.bottom)return{groupId:r,zone:`center`,index:h_(Array.from(i.querySelectorAll(`[data-tab-group="${H_(r)}"]`)).filter(e=>e.hasAttribute(`data-tab-id`)).map(e=>e.getBoundingClientRect()),t)};let o=e.querySelector(`[data-group-body]`)??e;return e.getAttribute(`data-compact`)===`true`?{groupId:r,zone:`center`}:{groupId:r,zone:m_(o.getBoundingClientRect(),t,n)}}function V_(e,t,n){let r=(typeof e.elementFromPoint==`function`?e.elementFromPoint(t,n):null)?.closest(`[data-editor-group]`)??null;return r?B_(r,t,n):null}function H_(e){return typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape(e):e.replace(/["\\]/g,`\\$&`)}function U_(e,t){return e?`From \`${e}\`:`:t===`assistant`?`From your earlier reply:`:t===`user`?`From my earlier message:`:t&&typeof t==`object`&&t.tool?`From the output of ${t.tool}:`:null}var W_=/^From (?:`[^`]+`|your earlier reply|my earlier message|the output of .+):$/,G_=`Replying to an earlier part of this conversation — the quoted lines are from the chat history above, not new input:`;function K_(e,t=null,n=null){let r=e.replace(/\r\n?/g,`
package/web-ui/index.html CHANGED
@@ -104,7 +104,7 @@
104
104
  }
105
105
  }
106
106
  </style>
107
- <script type="module" crossorigin src="./assets/index-DTT61snN.js"></script>
107
+ <script type="module" crossorigin src="./assets/index-hdhaYtyJ.js"></script>
108
108
  <link rel="stylesheet" crossorigin href="./assets/index-BGo-5zHi.css">
109
109
  </head>
110
110
  <body>