lody 0.97.2 → 0.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import * as path$1 from "path";
3
3
  import path__default$1, { posix, dirname, sep, isAbsolute as isAbsolute$1, relative, parse as parse$4, resolve as resolve$2 } from "path";
4
4
  import * as fs$1 from "node:fs";
5
- import fs__default, { createReadStream, existsSync, createWriteStream, rmSync, readdirSync, readFileSync, mkdirSync as mkdirSync$2, chmodSync, watch, promises as promises$1, realpathSync, unlinkSync as unlinkSync$1, accessSync as accessSync$1, constants as constants$9, writeSync } from "node:fs";
5
+ import fs__default, { createReadStream, existsSync, createWriteStream, realpathSync, rmSync, readdirSync, readFileSync, mkdirSync as mkdirSync$2, chmodSync, watch, promises as promises$1, unlinkSync as unlinkSync$1, accessSync as accessSync$1, constants as constants$9, writeSync } from "node:fs";
6
6
  import * as readline$1 from "node:readline";
7
7
  import readline__default, { createInterface } from "node:readline";
8
8
  import require$$5$4, { AsyncLocalStorage, AsyncResource } from "node:async_hooks";
@@ -37,7 +37,7 @@ import Qt__default, { readFile, readdir, rm, mkdir as mkdir$1, mkdtemp, chmod, w
37
37
  import zlib__default, { gzip, gunzip as gunzip$1, gunzipSync, brotliDecompressSync } from "node:zlib";
38
38
  import require$$1$7, { exec, execFile as execFile$1, spawn as spawn$2 } from "child_process";
39
39
  import { c as createPlanModeConfigOption, L as LODY_PLAN_MODE_CONFIG_ID } from "./chunks/plan-mode-BLOER-fv.js";
40
- import { D as DEEPSEEK_HARNESS_PERMISSION_MODES, a as DEEPSEEK_HARNESS_AGENT_PRESETS, A as ACP_EXTENSION_DSH_CAPABILITY_SOURCE_VERSION, c as createDeepSeekHarnessProfileFiles, b as DEEPSEEK_HARNESS_PROFILE_NAME, d as DEEPSEEK_HARNESS_PROFILE_FILENAMES, e as ACP_EXTENSION_DSH_QUERY_PATH_ENV, f as ACP_EXTENSION_DSH_SESSION_ROOT_ENV, g as createDeepSeekHarnessNpxSpecifiers, h as DEEPSEEK_HARNESS_DEFAULT_SESSION_COMPRESSION, i as DEEPSEEK_HARNESS_VERSION, j as DEEPSEEK_HARNESS_BASE_URL_ENV } from "./chunks/profile-DQaC7SJZ.js";
40
+ import { D as DEEPSEEK_HARNESS_PERMISSION_MODES, a as DEEPSEEK_HARNESS_AGENT_PRESETS, R as RequestError$1, C as ClientSideConnection, P as PROTOCOL_VERSION, A as ACP_EXTENSION_DSH_CAPABILITY_SOURCE_VERSION, c as createDeepSeekHarnessProfileFiles, b as DEEPSEEK_HARNESS_PROFILE_NAME, d as DEEPSEEK_HARNESS_PROFILE_FILENAMES, e as ACP_EXTENSION_DSH_QUERY_PATH_ENV, f as ACP_EXTENSION_DSH_SESSION_ROOT_ENV, g as createDeepSeekHarnessNpxSpecifiers, h as DEEPSEEK_HARNESS_DEFAULT_SESSION_COMPRESSION, i as DEEPSEEK_HARNESS_VERSION, j as DEEPSEEK_HARNESS_BASE_URL_ENV, n as ndJsonStream, k as client$2, m as methods$1 } from "./chunks/profile-BmD8b-zH.js";
41
41
  import { i as imports, _ as __wbg_set_wasm$1, r as rawWasm, L as LoroDoc, E as EphemeralStoreWasm, U as UndoManager, a as isValidContainerId, c as callPendingEvents$3, b as LoroTree, d as LoroText, e as LoroMovableList, f as LoroList, g as LoroMap, V as VersionVector, h as __vite__initWasm, j as decodeImportBlobMeta, __tla as __tla_0 } from "./chunks/loro_wasm_bg-Dz8BnaUI.js";
42
42
  import { performance as performance$1 } from "perf_hooks";
43
43
  import require$$0$a from "net";
@@ -64,9 +64,8 @@ import require$$1$6 from "node:dns";
64
64
  import { C as CodeCollabV2FileIndexRequestSchema, a as CodeCollabV2OpenTextRequestSchema, b as CodeCollabV2RefreshTextRequestSchema, c as CodeCollabV2SaveTextRequestSchema, d as CodeCollabV2OpenCurrentDiffRequestSchema, e as CodeCollabV2OpenAllChangesDiffRequestSchema, f as CodeCollabV2OpenTurnDiffRequestSchema, g as CodeCollabV2InitDirectoryRequestSchema, h as CodeCollabV2FileIndexSnapshotSchema, i as CodeCollabV2OpenTextOkSchema, j as CodeCollabV2RefreshTextResponseSchema, k as CodeCollabV2SaveTextResponseSchema, l as CodeCollabV2OpenCurrentDiffResponseSchema, m as CodeCollabV2OpenAllChangesDiffResponseSchema, n as CodeCollabV2OpenTurnDiffResponseSchema, o as CodeCollabV2InitDirectoryOkSchema, p as CodeCollabV2LspUnsupportedSchema, q as CodeCollabV2ErrorSchema, r as CodeCollabV2RpcContentEnvelopeSchema, s as deriveCodeCollabV2ContentKeyId, t as CodeCollabV2ErrorCodeSchema, u as CodeCollabV2RpcResponseSchema, v as deriveCodeCollabV2ContentKeyBytes, w as readCodeCollabFileIndexSignalFromFlock, x as writeCodeCollabFileIndexSignalToFlock, y as writeCodeCollabFileIndexToFlock, z as buildCodeCollabFileIndexState, A as CODE_COLLAB_V2_TEXT_LIMITS, B as CODE_COLLAB_V2_ALL_CHANGES_DIFF_LIMITS, D as computeAllChanges, E as codeCollabFileIndexStatesEqual, F as scanGitDirectoryEntries, G as closeDirectoryQuietly } from "./chunks/directory-handle-35P9qcGk.js";
65
65
  import { finished, pipeline } from "node:stream/promises";
66
66
  import { StringDecoder } from "node:string_decoder";
67
- import { p as packageJson } from "./chunks/package-CZY_YQI4.js";
68
- import { r as runtimeManifest } from "./chunks/runtime-manifest-DqfOlvSw.js";
69
- import { R as RequestError$1, C as ClientSideConnection, P as PROTOCOL_VERSION, n as ndJsonStream, c as client$2, m as methods$1 } from "./chunks/acp-DCoAUZc7.js";
67
+ import { p as packageJson } from "./chunks/package-BdifTDFO.js";
68
+ import { r as runtimeManifest } from "./chunks/runtime-manifest-DZsDOOW3.js";
70
69
  import { L as LODY_EXTENSION_METHODS, n as normalizeLodyExtensionMethod } from "./chunks/methods-CvEDMahD.js";
71
70
  import { AsyncLocalStorage as AsyncLocalStorage$1 } from "async_hooks";
72
71
  import { createRequire } from "module";
@@ -4326,7 +4325,7 @@ Upgrade Node, then re-run: npx lody@latest`;
4326
4325
  }
4327
4326
  const name$2 = "lody";
4328
4327
  const name$1 = "@lody/cli-cloud";
4329
- const version$a = "0.97.2";
4328
+ const version$a = "0.99.0";
4330
4329
  const type$2 = "module";
4331
4330
  const scripts = {
4332
4331
  "dev": "node dev.mjs",
@@ -16190,15 +16189,12 @@ Requirements:
16190
16189
  type: "idle"
16191
16190
  };
16192
16191
  },
16193
- running(activity, detail) {
16194
- return {
16192
+ running(activity) {
16193
+ return activity ? {
16195
16194
  type: "running",
16196
- ...activity !== void 0 ? {
16197
- activity
16198
- } : {},
16199
- ...detail !== void 0 ? {
16200
- detail
16201
- } : {}
16195
+ activity
16196
+ } : {
16197
+ type: "running"
16202
16198
  };
16203
16199
  },
16204
16200
  requestPermission() {
@@ -16612,12 +16608,12 @@ Requirements:
16612
16608
  {
16613
16609
  id: "cline",
16614
16610
  name: "Cline",
16615
- version: "3.0.61",
16611
+ version: "3.0.62",
16616
16612
  description: "Autonomous coding agent CLI - capable of creating/editing files, running commands, using the browser, and more",
16617
16613
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/cline.svg",
16618
16614
  distribution: {
16619
16615
  npx: {
16620
- package: "cline@3.0.61",
16616
+ package: "cline@3.0.62",
16621
16617
  args: [
16622
16618
  "--acp"
16623
16619
  ]
@@ -16627,12 +16623,12 @@ Requirements:
16627
16623
  {
16628
16624
  id: "codebuddy-code",
16629
16625
  name: "Codebuddy Code",
16630
- version: "2.150.0",
16626
+ version: "2.155.0",
16631
16627
  description: "Tencent Cloud's official intelligent coding tool",
16632
16628
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/codebuddy-code.svg",
16633
16629
  distribution: {
16634
16630
  npx: {
16635
- package: "@tencent-ai/codebuddy-code@2.150.0",
16631
+ package: "@tencent-ai/codebuddy-code@2.155.0",
16636
16632
  args: [
16637
16633
  "--acp"
16638
16634
  ]
@@ -16774,7 +16770,7 @@ Requirements:
16774
16770
  {
16775
16771
  id: "cursor",
16776
16772
  name: "Cursor",
16777
- version: "2026.09.10",
16773
+ version: "2026.09.15",
16778
16774
  description: "Cursor's coding agent",
16779
16775
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/cursor.svg",
16780
16776
  distribution: {
@@ -16804,48 +16800,48 @@ Requirements:
16804
16800
  {
16805
16801
  id: "devin",
16806
16802
  name: "Devin",
16807
- version: "3000.10.21",
16803
+ version: "3000.10.31",
16808
16804
  description: "Devin CLI coding agent by Cognition",
16809
16805
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/devin.svg",
16810
16806
  distribution: {
16811
16807
  binary: {
16812
16808
  "darwin-aarch64": {
16813
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-aarch64-apple-darwin.tar.gz",
16809
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-aarch64-apple-darwin.tar.gz",
16814
16810
  cmd: "./bin/devin",
16815
16811
  args: [
16816
16812
  "acp"
16817
16813
  ]
16818
16814
  },
16819
16815
  "darwin-x86_64": {
16820
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-x86_64-apple-darwin.tar.gz",
16816
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-x86_64-apple-darwin.tar.gz",
16821
16817
  cmd: "./bin/devin",
16822
16818
  args: [
16823
16819
  "acp"
16824
16820
  ]
16825
16821
  },
16826
16822
  "linux-aarch64": {
16827
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-aarch64-unknown-linux.tar.gz",
16823
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-aarch64-unknown-linux.tar.gz",
16828
16824
  cmd: "./bin/devin",
16829
16825
  args: [
16830
16826
  "acp"
16831
16827
  ]
16832
16828
  },
16833
16829
  "linux-x86_64": {
16834
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-x86_64-unknown-linux.tar.gz",
16830
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-x86_64-unknown-linux.tar.gz",
16835
16831
  cmd: "./bin/devin",
16836
16832
  args: [
16837
16833
  "acp"
16838
16834
  ]
16839
16835
  },
16840
16836
  "windows-aarch64": {
16841
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-aarch64-pc-windows.zip",
16837
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-aarch64-pc-windows.zip",
16842
16838
  cmd: "./bin\\devin.exe",
16843
16839
  args: [
16844
16840
  "acp"
16845
16841
  ]
16846
16842
  },
16847
16843
  "windows-x86_64": {
16848
- archive: "https://static.devin.ai/cli/3000.10.21/devin-3000.10.21-x86_64-pc-windows.zip",
16844
+ archive: "https://static.devin.ai/cli/3000.10.31/devin-3000.10.31-x86_64-pc-windows.zip",
16849
16845
  cmd: "./bin\\devin.exe",
16850
16846
  args: [
16851
16847
  "acp"
@@ -16857,12 +16853,12 @@ Requirements:
16857
16853
  {
16858
16854
  id: "dimcode",
16859
16855
  name: "DimCode",
16860
- version: "0.5.2",
16856
+ version: "0.5.6",
16861
16857
  description: "A coding agent that puts leading models at your command.",
16862
16858
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/dimcode.svg",
16863
16859
  distribution: {
16864
16860
  npx: {
16865
- package: "dimcode@0.5.2",
16861
+ package: "dimcode@0.5.6",
16866
16862
  args: [
16867
16863
  "acp"
16868
16864
  ]
@@ -16872,12 +16868,12 @@ Requirements:
16872
16868
  {
16873
16869
  id: "dirac",
16874
16870
  name: "Dirac",
16875
- version: "0.5.12",
16871
+ version: "0.5.13",
16876
16872
  description: "Reduces API costs by more than 50%, produces better and faster work. Uses Hash anchored parallel edits, AST manipulation and a whole lot of neat optimizations. Fully Open Source.",
16877
16873
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/dirac.svg",
16878
16874
  distribution: {
16879
16875
  npx: {
16880
- package: "dirac-cli@0.5.12",
16876
+ package: "dirac-cli@0.5.13",
16881
16877
  args: [
16882
16878
  "--acp"
16883
16879
  ]
@@ -16887,12 +16883,12 @@ Requirements:
16887
16883
  {
16888
16884
  id: "factory-droid",
16889
16885
  name: "Factory Droid",
16890
- version: "0.218.1",
16886
+ version: "0.223.0",
16891
16887
  description: "Factory Droid - AI coding agent powered by Factory AI",
16892
16888
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/factory-droid.svg",
16893
16889
  distribution: {
16894
16890
  npx: {
16895
- package: "droid@0.218.1",
16891
+ package: "droid@0.223.0",
16896
16892
  args: [
16897
16893
  "exec",
16898
16894
  "--output-format",
@@ -16926,12 +16922,12 @@ Requirements:
16926
16922
  {
16927
16923
  id: "gemini",
16928
16924
  name: "Gemini CLI",
16929
- version: "0.59.0",
16925
+ version: "0.60.0",
16930
16926
  description: "Google's official CLI for Gemini",
16931
16927
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/gemini.svg",
16932
16928
  distribution: {
16933
16929
  npx: {
16934
- package: "@google/gemini-cli@0.59.0",
16930
+ package: "@google/gemini-cli@0.60.0",
16935
16931
  args: [
16936
16932
  "--acp"
16937
16933
  ]
@@ -16941,12 +16937,12 @@ Requirements:
16941
16937
  {
16942
16938
  id: "github-copilot-cli",
16943
16939
  name: "GitHub Copilot",
16944
- version: "1.0.83",
16940
+ version: "1.0.86",
16945
16941
  description: "GitHub's AI pair programmer",
16946
16942
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/github-copilot-cli.svg",
16947
16943
  distribution: {
16948
16944
  npx: {
16949
- package: "@github/copilot@1.0.83",
16945
+ package: "@github/copilot@1.0.86",
16950
16946
  args: [
16951
16947
  "--acp"
16952
16948
  ]
@@ -16956,19 +16952,19 @@ Requirements:
16956
16952
  {
16957
16953
  id: "glm-acp-agent",
16958
16954
  name: "GLM Agent",
16959
- version: "1.8.0",
16955
+ version: "1.11.0",
16960
16956
  description: "ACP agent powered by Zhipu AI's GLM Coding Plan models (glm-5.1, glm-5-turbo, glm-4.7, glm-4.5-air). Supports streaming, tool calls, mid-session model switching, image input via Z.AI Coding Plan Vision MCP, and session load/fork/resume with on-disk persistence.",
16961
16957
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/glm-acp-agent.svg",
16962
16958
  distribution: {
16963
16959
  npx: {
16964
- package: "glm-acp-agent@1.8.0"
16960
+ package: "glm-acp-agent@1.11.0"
16965
16961
  }
16966
16962
  }
16967
16963
  },
16968
16964
  {
16969
16965
  id: "goose",
16970
16966
  name: "goose",
16971
- version: "1.50.0",
16967
+ version: "1.51.0",
16972
16968
  description: "A local, extensible, open source AI agent that automates engineering tasks",
16973
16969
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/goose.svg",
16974
16970
  distribution: {
@@ -16986,13 +16982,13 @@ Requirements:
16986
16982
  {
16987
16983
  id: "harn",
16988
16984
  name: "Harn",
16989
- version: "0.10.135",
16985
+ version: "0.10.139",
16990
16986
  description: "Harn runs .harn agent pipelines as a native ACP coding agent over stdio.",
16991
16987
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/harn.svg",
16992
16988
  distribution: {
16993
16989
  binary: {
16994
16990
  "darwin-aarch64": {
16995
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.135/harn-aarch64-apple-darwin.tar.gz",
16991
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.139/harn-aarch64-apple-darwin.tar.gz",
16996
16992
  cmd: "./harn",
16997
16993
  args: [
16998
16994
  "serve",
@@ -17000,7 +16996,7 @@ Requirements:
17000
16996
  ]
17001
16997
  },
17002
16998
  "darwin-x86_64": {
17003
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.135/harn-x86_64-apple-darwin.tar.gz",
16999
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.139/harn-x86_64-apple-darwin.tar.gz",
17004
17000
  cmd: "./harn",
17005
17001
  args: [
17006
17002
  "serve",
@@ -17008,7 +17004,7 @@ Requirements:
17008
17004
  ]
17009
17005
  },
17010
17006
  "linux-aarch64": {
17011
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.135/harn-aarch64-unknown-linux-gnu.tar.gz",
17007
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.139/harn-aarch64-unknown-linux-gnu.tar.gz",
17012
17008
  cmd: "./harn",
17013
17009
  args: [
17014
17010
  "serve",
@@ -17016,7 +17012,7 @@ Requirements:
17016
17012
  ]
17017
17013
  },
17018
17014
  "linux-x86_64": {
17019
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.135/harn-x86_64-unknown-linux-gnu.tar.gz",
17015
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.139/harn-x86_64-unknown-linux-gnu.tar.gz",
17020
17016
  cmd: "./harn",
17021
17017
  args: [
17022
17018
  "serve",
@@ -17024,7 +17020,7 @@ Requirements:
17024
17020
  ]
17025
17021
  },
17026
17022
  "windows-x86_64": {
17027
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.135/harn-x86_64-pc-windows-msvc.zip",
17023
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.139/harn-x86_64-pc-windows-msvc.zip",
17028
17024
  cmd: "harn.exe",
17029
17025
  args: [
17030
17026
  "serve",
@@ -17037,7 +17033,7 @@ Requirements:
17037
17033
  {
17038
17034
  id: "junie",
17039
17035
  name: "Junie",
17040
- version: "3218.3.0",
17036
+ version: "3331.4.0",
17041
17037
  description: "AI Coding Agent by JetBrains",
17042
17038
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/junie.svg",
17043
17039
  distribution: {
@@ -17055,47 +17051,47 @@ Requirements:
17055
17051
  {
17056
17052
  id: "kilo",
17057
17053
  name: "Kilo",
17058
- version: "7.6.2",
17054
+ version: "7.7.5",
17059
17055
  description: "The open source coding agent",
17060
17056
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/kilo.svg",
17061
17057
  distribution: {
17062
17058
  npx: {
17063
- package: "@kilocode/cli@7.6.2",
17059
+ package: "@kilocode/cli@7.7.5",
17064
17060
  args: [
17065
17061
  "acp"
17066
17062
  ]
17067
17063
  },
17068
17064
  binary: {
17069
17065
  "darwin-aarch64": {
17070
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.6.2/kilo-darwin-arm64.zip",
17066
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.7.5/kilo-darwin-arm64.zip",
17071
17067
  cmd: "./kilo",
17072
17068
  args: [
17073
17069
  "acp"
17074
17070
  ]
17075
17071
  },
17076
17072
  "darwin-x86_64": {
17077
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.6.2/kilo-darwin-x64.zip",
17073
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.7.5/kilo-darwin-x64.zip",
17078
17074
  cmd: "./kilo",
17079
17075
  args: [
17080
17076
  "acp"
17081
17077
  ]
17082
17078
  },
17083
17079
  "linux-aarch64": {
17084
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.6.2/kilo-linux-arm64.tar.gz",
17080
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.7.5/kilo-linux-arm64.tar.gz",
17085
17081
  cmd: "./kilo",
17086
17082
  args: [
17087
17083
  "acp"
17088
17084
  ]
17089
17085
  },
17090
17086
  "linux-x86_64": {
17091
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.6.2/kilo-linux-x64.tar.gz",
17087
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.7.5/kilo-linux-x64.tar.gz",
17092
17088
  cmd: "./kilo",
17093
17089
  args: [
17094
17090
  "acp"
17095
17091
  ]
17096
17092
  },
17097
17093
  "windows-x86_64": {
17098
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.6.2/kilo-windows-x64.zip",
17094
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.7.5/kilo-windows-x64.zip",
17099
17095
  cmd: "./kilo.exe",
17100
17096
  args: [
17101
17097
  "acp"
@@ -17107,13 +17103,13 @@ Requirements:
17107
17103
  {
17108
17104
  id: "kimchi",
17109
17105
  name: "Kimchi",
17110
- version: "1.1.18",
17106
+ version: "1.1.26",
17111
17107
  description: "Coding agent powered by multi-model orchestration",
17112
17108
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/kimchi.svg",
17113
17109
  distribution: {
17114
17110
  binary: {
17115
17111
  "darwin-aarch64": {
17116
- archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.18/kimchi_darwin_arm64.tar.gz",
17112
+ archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.26/kimchi_darwin_arm64.tar.gz",
17117
17113
  cmd: "./bin/kimchi",
17118
17114
  args: [
17119
17115
  "--mode",
@@ -17121,7 +17117,7 @@ Requirements:
17121
17117
  ]
17122
17118
  },
17123
17119
  "darwin-x86_64": {
17124
- archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.18/kimchi_darwin_amd64.tar.gz",
17120
+ archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.26/kimchi_darwin_amd64.tar.gz",
17125
17121
  cmd: "./bin/kimchi",
17126
17122
  args: [
17127
17123
  "--mode",
@@ -17129,7 +17125,7 @@ Requirements:
17129
17125
  ]
17130
17126
  },
17131
17127
  "linux-aarch64": {
17132
- archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.18/kimchi_linux_arm64.tar.gz",
17128
+ archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.26/kimchi_linux_arm64.tar.gz",
17133
17129
  cmd: "./bin/kimchi",
17134
17130
  args: [
17135
17131
  "--mode",
@@ -17137,7 +17133,7 @@ Requirements:
17137
17133
  ]
17138
17134
  },
17139
17135
  "linux-x86_64": {
17140
- archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.18/kimchi_linux_amd64.tar.gz",
17136
+ archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.26/kimchi_linux_amd64.tar.gz",
17141
17137
  cmd: "./bin/kimchi",
17142
17138
  args: [
17143
17139
  "--mode",
@@ -17145,7 +17141,7 @@ Requirements:
17145
17141
  ]
17146
17142
  },
17147
17143
  "windows-x86_64": {
17148
- archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.18/kimchi_windows_amd64.zip",
17144
+ archive: "https://github.com/getkimchi/kimchi/releases/download/v1.1.26/kimchi_windows_amd64.zip",
17149
17145
  cmd: "./bin/kimchi.exe",
17150
17146
  args: [
17151
17147
  "--mode",
@@ -17243,12 +17239,12 @@ Requirements:
17243
17239
  {
17244
17240
  id: "nova",
17245
17241
  name: "Nova",
17246
- version: "1.1.38",
17242
+ version: "1.1.45",
17247
17243
  description: "Nova by Compass AI - a fully-fledged software engineer at your command",
17248
17244
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/nova.svg",
17249
17245
  distribution: {
17250
17246
  npx: {
17251
- package: "@compass-ai/nova@1.1.38",
17247
+ package: "@compass-ai/nova@1.1.45",
17252
17248
  args: [
17253
17249
  "acp"
17254
17250
  ]
@@ -17258,7 +17254,7 @@ Requirements:
17258
17254
  {
17259
17255
  id: "opencode",
17260
17256
  name: "OpenCode",
17261
- version: "1.18.30",
17257
+ version: "1.18.31",
17262
17258
  description: "The open source coding agent",
17263
17259
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/opencode.svg",
17264
17260
  distribution: {
@@ -17344,12 +17340,12 @@ Requirements:
17344
17340
  {
17345
17341
  id: "qwen-code",
17346
17342
  name: "Qwen Code",
17347
- version: "0.23.3",
17343
+ version: "0.24.1",
17348
17344
  description: "Alibaba's Qwen coding assistant",
17349
17345
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/qwen-code.svg",
17350
17346
  distribution: {
17351
17347
  npx: {
17352
- package: "@qwen-code/qwen-code@0.23.3",
17348
+ package: "@qwen-code/qwen-code@0.24.1",
17353
17349
  args: [
17354
17350
  "--acp",
17355
17351
  "--experimental-skills"
@@ -17374,36 +17370,36 @@ Requirements:
17374
17370
  {
17375
17371
  id: "sigit",
17376
17372
  name: "siGit Code",
17377
- version: "1.5.8",
17373
+ version: "1.5.10",
17378
17374
  description: "Local-first coding agent. Runs entirely on your machine with optional on-device LLM inference via Onde.",
17379
17375
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/sigit.svg",
17380
17376
  distribution: {
17381
17377
  npx: {
17382
- package: "@smbcloud/sigit@1.5.8"
17378
+ package: "@smbcloud/sigit@1.5.10"
17383
17379
  },
17384
17380
  binary: {
17385
17381
  "darwin-aarch64": {
17386
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-macos-arm64.tar.gz",
17382
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-macos-arm64.tar.gz",
17387
17383
  cmd: "./sigit"
17388
17384
  },
17389
17385
  "darwin-x86_64": {
17390
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-macos-amd64.tar.gz",
17386
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-macos-amd64.tar.gz",
17391
17387
  cmd: "./sigit"
17392
17388
  },
17393
17389
  "linux-aarch64": {
17394
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-linux-arm64",
17390
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-linux-arm64",
17395
17391
  cmd: "./sigit-linux-arm64"
17396
17392
  },
17397
17393
  "linux-x86_64": {
17398
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-linux-amd64",
17394
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-linux-amd64",
17399
17395
  cmd: "./sigit-linux-amd64"
17400
17396
  },
17401
17397
  "windows-aarch64": {
17402
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-win-arm64.exe",
17398
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-win-arm64.exe",
17403
17399
  cmd: "./sigit-win-arm64.exe"
17404
17400
  },
17405
17401
  "windows-x86_64": {
17406
- archive: "https://github.com/getsigit/sigit/releases/download/v1.5.8/sigit-win-amd64.exe",
17402
+ archive: "https://github.com/getsigit/sigit/releases/download/v1.5.10/sigit-win-amd64.exe",
17407
17403
  cmd: "./sigit-win-amd64.exe"
17408
17404
  }
17409
17405
  }
@@ -19740,6 +19736,7 @@ ${outputTail}` : blockTail.output;
19740
19736
  if (lody) {
19741
19737
  const parsed = parseLodyElicitationPermissionMeta(lody);
19742
19738
  if (parsed) return parsed;
19739
+ if (isRecord$b(lody.elicitation) && lody.elicitation.version === 1) return null;
19743
19740
  }
19744
19741
  const claudeCode = getClaudeCodeMeta(meta);
19745
19742
  if (claudeCode) {
@@ -19777,6 +19774,8 @@ ${outputTail}` : blockTail.output;
19777
19774
  return null;
19778
19775
  }
19779
19776
  if (!Array.isArray(rawQuestion.options)) return null;
19777
+ const note = rawQuestion.note;
19778
+ if (note !== void 0 && (!isRecord$b(note) || typeof note.fieldId !== "string" || !note.fieldId.trim() || note.title !== void 0 && typeof note.title !== "string" || note.description !== void 0 && typeof note.description !== "string" || note.isSecret !== void 0 && typeof note.isSecret !== "boolean")) return null;
19780
19779
  const options = [];
19781
19780
  for (const rawOption of rawQuestion.options) {
19782
19781
  if (!isRecord$b(rawOption) || typeof rawOption.label !== "string") return null;
@@ -19798,15 +19797,40 @@ ${outputTail}` : blockTail.output;
19798
19797
  header: rawQuestion.header,
19799
19798
  options,
19800
19799
  multiSelect: rawQuestion.multiSelect === true,
19801
- ...rawQuestion.allowCustomAnswer === true ? {
19802
- allowCustomAnswer: true
19800
+ ...typeof rawQuestion.allowCustomAnswer === "boolean" ? {
19801
+ allowCustomAnswer: rawQuestion.allowCustomAnswer
19803
19802
  } : {},
19804
19803
  ...rawQuestion.isSecret === true ? {
19805
19804
  isSecret: true
19805
+ } : {},
19806
+ ...isRecord$b(note) ? {
19807
+ note: {
19808
+ fieldId: note.fieldId,
19809
+ ...typeof note.title === "string" ? {
19810
+ title: note.title
19811
+ } : {},
19812
+ ...typeof note.description === "string" ? {
19813
+ description: note.description
19814
+ } : {},
19815
+ ...note.isSecret === true ? {
19816
+ isSecret: true
19817
+ } : {}
19818
+ }
19806
19819
  } : {}
19807
19820
  });
19808
19821
  }
19809
- return questions;
19822
+ return hasValidNoteKeys(questions) ? questions : null;
19823
+ }
19824
+ function hasValidNoteKeys(questions) {
19825
+ if (!questions.some((question) => question.note)) return true;
19826
+ const used = new Set(questions.map((question) => question.id));
19827
+ if (used.size !== questions.length || questions.some((question) => !question.id?.trim())) return false;
19828
+ for (const question of questions) {
19829
+ if (!question.note) continue;
19830
+ if (!question.note.fieldId.trim() || used.has(question.note.fieldId)) return false;
19831
+ used.add(question.note.fieldId);
19832
+ }
19833
+ return true;
19810
19834
  }
19811
19835
  function parseClaudeAskUserQuestionPermissionMeta(claudeCode) {
19812
19836
  const raw2 = claudeCode.askUserQuestion;
@@ -19942,7 +19966,7 @@ ${outputTail}` : blockTail.output;
19942
19966
  return elicitation && isRecord$b(elicitation.answers) ? elicitation.answers : null;
19943
19967
  };
19944
19968
  function extractAskUserQuestionAnswersFromOutcome(meta, outcome) {
19945
- if (!outcome || !isRecord$b(outcome._meta)) return null;
19969
+ if (!outcome || !isRecord$b(outcome._meta) || !hasValidNoteKeys(meta.questions)) return null;
19946
19970
  const answerSources = [
19947
19971
  {
19948
19972
  source: "lody",
@@ -19959,8 +19983,12 @@ ${outputTail}` : blockTail.output;
19959
19983
  ];
19960
19984
  const answerSource = answerSources.find(({ answers }) => answers !== null);
19961
19985
  if (!answerSource?.answers) return null;
19962
- const result = {};
19986
+ const result = /* @__PURE__ */ Object.create(null);
19963
19987
  for (const [index, question] of meta.questions.entries()) {
19988
+ if (question.note && answerSource.source === "lody") {
19989
+ const note = answerSource.answers[question.note.fieldId];
19990
+ if (typeof note === "string" && note.trim()) result[question.note.fieldId] = note;
19991
+ }
19964
19992
  const key2 = getAskUserQuestionAnswerKey(meta.questions, index);
19965
19993
  const sourceKey = answerSource.source === "claude" ? getAskUserQuestionAnswerKey(meta.questions.map(({ id: _id, ...item }) => item), index) : key2;
19966
19994
  const raw2 = answerSource.answers[sourceKey];
@@ -20030,20 +20058,37 @@ ${outputTail}` : blockTail.output;
20030
20058
  const entries = Object.entries(schema2.properties);
20031
20059
  const requestMeta = getLodyElicitationMeta(request2._meta);
20032
20060
  const customFieldKeyByQuestionId = /* @__PURE__ */ new Map();
20061
+ const noteFieldKeyByQuestionId = /* @__PURE__ */ new Map();
20062
+ const associatedFields = /* @__PURE__ */ new Set();
20033
20063
  for (const [key2, prop] of entries) {
20034
20064
  if (!isRecord$b(prop)) continue;
20065
+ const rawMeta = getLodyMeta(prop._meta)?.elicitation;
20066
+ if (isRecord$b(rawMeta) && rawMeta.noteFor !== void 0 && rawMeta.version !== 1) return null;
20035
20067
  const meta = getLodyElicitationMeta(prop._meta);
20036
- if (typeof meta?.customAnswerFor === "string" && meta.customAnswerFor.length > 0) {
20037
- customFieldKeyByQuestionId.set(meta.customAnswerFor, key2);
20038
- }
20039
- }
20040
- const isLodyForm = requestMeta !== null || customFieldKeyByQuestionId.size > 0;
20041
- const questionEntries = entries.filter(([, prop]) => {
20068
+ if (!meta || meta.noteFor === void 0 && meta.customAnswerFor === void 0) continue;
20069
+ if (meta.noteFor !== void 0 && meta.customAnswerFor !== void 0) return null;
20070
+ const target = meta.noteFor ?? meta.customAnswerFor;
20071
+ const fields = meta.noteFor !== void 0 ? noteFieldKeyByQuestionId : customFieldKeyByQuestionId;
20072
+ if (typeof target !== "string" || !target.trim() || !key2.trim() || key2 === target || !isFreeTextProperty(prop) || fields.has(target)) return null;
20073
+ if (meta.noteFor !== void 0 && Array.isArray(schema2.required) && schema2.required.includes(key2)) return null;
20074
+ fields.set(target, key2);
20075
+ associatedFields.add(key2);
20076
+ }
20077
+ const isLodyForm = requestMeta !== null || associatedFields.size > 0;
20078
+ const questionEntries = entries.filter(([key2, prop]) => {
20042
20079
  if (!isRecord$b(prop)) return false;
20043
- if (getLodyElicitationMeta(prop._meta)?.customAnswerFor) return false;
20080
+ if (associatedFields.has(key2)) return false;
20044
20081
  return isQuestionProperty(prop) || isLodyForm && isFreeTextProperty(prop);
20045
20082
  });
20046
20083
  if (questionEntries.length === 0) return null;
20084
+ const questionIds = new Set(questionEntries.map(([key2]) => key2));
20085
+ for (const target of [
20086
+ ...customFieldKeyByQuestionId.keys(),
20087
+ ...noteFieldKeyByQuestionId.keys()
20088
+ ]) {
20089
+ if (!questionIds.has(target)) return null;
20090
+ }
20091
+ if (associatedFields.size > 0 && questionEntries.some(([key2]) => !key2.trim())) return null;
20047
20092
  const singleQuestion = questionEntries.length === 1;
20048
20093
  const allowCustomAnswer = isLodyForm ? questionEntries.some(([key2, prop]) => isRecord$b(prop) && (getEnumOptionSource(prop) === null || customFieldKeyByQuestionId.has(key2))) : entries.some(([, prop]) => isFreeTextProperty(prop));
20049
20094
  const message = typeof request2.message === "string" ? request2.message : "";
@@ -20055,6 +20100,8 @@ ${outputTail}` : blockTail.output;
20055
20100
  const source = getEnumOptionSource(prop);
20056
20101
  const header = typeof prop.title === "string" ? prop.title : "";
20057
20102
  const description2 = typeof prop.description === "string" ? prop.description : "";
20103
+ const noteFieldId = noteFieldKeyByQuestionId.get(key2);
20104
+ const noteProp = noteFieldId === void 0 ? void 0 : schema2.properties[noteFieldId];
20058
20105
  const question = singleQuestion ? message || description2 || header : description2 || message || header;
20059
20106
  questions.push({
20060
20107
  ...isLodyForm ? {
@@ -20064,11 +20111,25 @@ ${outputTail}` : blockTail.output;
20064
20111
  header,
20065
20112
  options: source ? parseElicitationOptions(source) : [],
20066
20113
  multiSelect: isMultiSelectProperty(prop),
20067
- ...isLodyForm && (source === null || customFieldKeyByQuestionId.has(key2)) ? {
20068
- allowCustomAnswer: true
20114
+ ...isLodyForm ? {
20115
+ allowCustomAnswer: source === null || customFieldKeyByQuestionId.has(key2)
20069
20116
  } : {},
20070
20117
  ...isLodyForm && getLodyElicitationMeta(prop._meta)?.secret === true ? {
20071
20118
  isSecret: true
20119
+ } : {},
20120
+ ...noteFieldId !== void 0 && isRecord$b(noteProp) ? {
20121
+ note: {
20122
+ fieldId: noteFieldId,
20123
+ ...typeof noteProp.title === "string" ? {
20124
+ title: noteProp.title
20125
+ } : {},
20126
+ ...typeof noteProp.description === "string" ? {
20127
+ description: noteProp.description
20128
+ } : {},
20129
+ ...getLodyElicitationMeta(noteProp._meta)?.secret === true ? {
20130
+ isSecret: true
20131
+ } : {}
20132
+ }
20072
20133
  } : {}
20073
20134
  });
20074
20135
  fieldKeys.push(key2);
@@ -20107,15 +20168,18 @@ ${outputTail}` : blockTail.output;
20107
20168
  content: {}
20108
20169
  };
20109
20170
  }
20110
- const content = {};
20111
- elicitation.meta.questions.forEach((_question, index) => {
20171
+ const content = /* @__PURE__ */ Object.create(null);
20172
+ elicitation.meta.questions.forEach((question, index) => {
20173
+ if (question.note) {
20174
+ const note = answers[question.note.fieldId];
20175
+ if (typeof note === "string") content[question.note.fieldId] = note;
20176
+ }
20112
20177
  const fieldKey = elicitation.fieldKeys[index];
20113
20178
  if (!fieldKey) return;
20114
20179
  const value = answers[getAskUserQuestionAnswerKey(elicitation.meta.questions, index)];
20115
20180
  if (value === void 0) return;
20116
20181
  const customFieldKey = elicitation.customFieldKeys?.[index];
20117
- const selectedQuestion = elicitation.meta.questions[index];
20118
- const isCustomValue = typeof value === "string" && selectedQuestion !== void 0 && selectedQuestion.options.length > 0 && !selectedQuestion.options.some((option2) => option2.label === value);
20182
+ const isCustomValue = typeof value === "string" && question.options.length > 0 && !question.options.some((option2) => option2.label === value);
20119
20183
  content[isCustomValue && customFieldKey ? customFieldKey : fieldKey] = value;
20120
20184
  });
20121
20185
  return {
@@ -22504,6 +22568,7 @@ ${tailedOutput}` : null;
22504
22568
  const LODY_PRESENCE_CHANNEL = "presence";
22505
22569
  const LODY_PRESENCE_TTL_MS = 9e4;
22506
22570
  const LODY_PRESENCE_HEARTBEAT_MS = 3e4;
22571
+ const LODY_PRESENCE_DETAIL_MAX_LENGTH = 280;
22507
22572
  const omitNullValues = (value) => {
22508
22573
  if (typeof value !== "object" || value === null || Array.isArray(value)) return value;
22509
22574
  const out = {};
@@ -22518,8 +22583,7 @@ ${tailedOutput}` : null;
22518
22583
  type: literal$1("running"),
22519
22584
  activity: _enum$1([
22520
22585
  "image_generation"
22521
- ]).optional(),
22522
- detail: string$1().min(1).max(280).optional()
22586
+ ]).optional()
22523
22587
  }),
22524
22588
  object$1({
22525
22589
  type: literal$1("requestPermission")
@@ -22532,7 +22596,7 @@ ${tailedOutput}` : null;
22532
22596
  "acp",
22533
22597
  "resuming"
22534
22598
  ]).optional(),
22535
- detail: string$1().optional()
22599
+ detail: string$1().max(LODY_PRESENCE_DETAIL_MAX_LENGTH).optional()
22536
22600
  })
22537
22601
  ]));
22538
22602
  const PresenceInstanceIdSchema = string$1().min(1).transform((value) => {
@@ -23353,7 +23417,8 @@ ${tailedOutput}` : null;
23353
23417
  "something to ask about each time. Skip it only when the user interrupts you or asks",
23354
23418
  "for something that overrides it \u2014 in that case say so instead of pushing silently."
23355
23419
  ].join(" ");
23356
- const CREATE_PR_BASE_PROMPT = "Create a PR for the current worktree (a regular PR, not a draft). Use `gh` from the current PATH and run GitHub-authenticated commands with elevated permissions. If authentication fails in the sandbox, retry with elevated permissions before asking the user to log in. Verify that the pushed commit matches the PR head, then report the PR URL.";
23420
+ const GH_AUTH_INSTRUCTION = "Use `gh` from the current PATH. `gh` signs in with the GitHub login saved on this machine, which sandboxed commands usually cannot read, so run the `gh` commands that talk to GitHub outside the sandbox (request approval if your tool requires it). Ask the user to log in only if authentication still fails there. Verify that the pushed commit matches the PR head, then report the PR URL.";
23421
+ const CREATE_PR_BASE_PROMPT = `Create a PR for the current worktree (a regular PR, not a draft). ${GH_AUTH_INSTRUCTION}`;
23357
23422
  const withPrBranchUpkeep = (basePrompt, upkeep) => `${basePrompt}
23358
23423
 
23359
23424
  ${upkeep}`;
@@ -65740,8 +65805,35 @@ ${this.stack.split("\n").slice(1).join("\n")}` : this.toString();
65740
65805
  }
65741
65806
  return [];
65742
65807
  }
65808
+ const settleContextCompactionMarkers = (items2) => {
65809
+ let lastMarkerIndex = -1;
65810
+ for (let i2 = items2.length - 1; i2 >= 0; i2--) {
65811
+ const item = items2[i2];
65812
+ if (item?.type === "tool_call" && item.activityKind === "context_compaction") {
65813
+ lastMarkerIndex = i2;
65814
+ break;
65815
+ }
65816
+ }
65817
+ if (lastMarkerIndex < 0) return void 0;
65818
+ let changed = false;
65819
+ const settled = [];
65820
+ for (let i2 = 0; i2 < items2.length; i2++) {
65821
+ const item = items2[i2];
65822
+ if (!item) continue;
65823
+ if (item.type !== "tool_call" || item.activityKind !== "context_compaction" || item.status !== "pending" && item.status !== "in_progress") {
65824
+ settled.push(item);
65825
+ continue;
65826
+ }
65827
+ changed = true;
65828
+ if (i2 === lastMarkerIndex) settled.push({
65829
+ ...item,
65830
+ status: "failed"
65831
+ });
65832
+ }
65833
+ return changed ? settled : void 0;
65834
+ };
65743
65835
  const markAssistantTurnFinished = (history, options) => {
65744
- const { turnId, endedAt, permissionWaitMs, settleContextCompactionAsFailed } = options;
65836
+ const { turnId, endedAt, permissionWaitMs } = options;
65745
65837
  for (let i2 = history.length - 1; i2 >= 0; i2--) {
65746
65838
  const entry = history[i2];
65747
65839
  if (entry && entry.role === "assistant" && (!turnId || entry.id === turnId)) {
@@ -65755,19 +65847,9 @@ ${this.stack.split("\n").slice(1).join("\n")}` : this.toString();
65755
65847
  };
65756
65848
  }
65757
65849
  }
65758
- if (settleContextCompactionAsFailed && entry.items) {
65759
- let changed = false;
65760
- const items2 = entry.items.map((item) => {
65761
- if (item.type !== "tool_call" || item.activityKind !== "context_compaction" || item.status !== "pending" && item.status !== "in_progress") {
65762
- return item;
65763
- }
65764
- changed = true;
65765
- return {
65766
- ...item,
65767
- status: "failed"
65768
- };
65769
- });
65770
- if (changed) entry.items = items2;
65850
+ if (entry.items) {
65851
+ const settled = settleContextCompactionMarkers(entry.items);
65852
+ if (settled) entry.items = settled;
65771
65853
  }
65772
65854
  if (entry.finished === true && !options.force) break;
65773
65855
  entry.finished = true;
@@ -66619,6 +66701,18 @@ ${this.stack.split("\n").slice(1).join("\n")}` : this.toString();
66619
66701
  state: "invalid"
66620
66702
  };
66621
66703
  };
66704
+ const readField = (value, key2) => {
66705
+ if (isContainer(value)) return value.kind() === "Map" ? value.get(key2) : void 0;
66706
+ return value && typeof value === "object" && !Array.isArray(value) ? value[key2] : void 0;
66707
+ };
66708
+ const readString$1 = (value) => {
66709
+ if (typeof value === "string") return value;
66710
+ return isContainer(value) && value.kind() === "Text" ? value.toString() : void 0;
66711
+ };
66712
+ const readLength = (value) => {
66713
+ if (Array.isArray(value)) return value.length;
66714
+ return isContainer(value) && value.kind() === "List" ? value.length : 0;
66715
+ };
66622
66716
  function createLoroSessionData(options) {
66623
66717
  const { sessionId, doc } = options;
66624
66718
  const writer = options.writer ?? createHistoryWriter(doc);
@@ -66811,6 +66905,20 @@ ${this.stack.split("\n").slice(1).join("\n")}` : this.toString();
66811
66905
  count() {
66812
66906
  return list2.length;
66813
66907
  },
66908
+ readModelSummaryAt(position) {
66909
+ if (position < 0 || position >= list2.length) return void 0;
66910
+ const value = list2.get(position);
66911
+ const model = readField(value, "modelInfo");
66912
+ return {
66913
+ role: readString$1(readField(value, "role")),
66914
+ modelInfo: {
66915
+ modelId: readString$1(readField(model, "modelId")),
66916
+ name: readString$1(readField(model, "name"))
66917
+ },
66918
+ itemCount: readLength(readField(value, "items")),
66919
+ planCount: readLength(readField(value, "plan"))
66920
+ };
66921
+ },
66814
66922
  readAt(position) {
66815
66923
  return readSlot(list2, position);
66816
66924
  },
@@ -83572,6 +83680,7 @@ ${val.stack}`;
83572
83680
  machineKey = null;
83573
83681
  sessionKeys = /* @__PURE__ */ new Map();
83574
83682
  machineHeartbeatSeq = 0;
83683
+ heartbeatDeliveryProbe = null;
83575
83684
  sessionPresenceSeq = 0;
83576
83685
  started = false;
83577
83686
  stopped = false;
@@ -83797,7 +83906,54 @@ ${val.stack}`;
83797
83906
  updatedAt: getServerNow()
83798
83907
  };
83799
83908
  this.writeLocalOrigin(this.machineKey, state2);
83800
- this.options.logger.debug(`[${this.options.workspaceId}] Loro presence machine heartbeat written (seq=${seq2} updatedAt=${state2.updatedAt})`);
83909
+ this.options.logger.debug(`[${this.options.workspaceId}] Loro presence machine heartbeat written (seq=${seq2} updatedAt=${state2.updatedAt})${this.describePresenceWriteQueue()}`);
83910
+ this.observeHeartbeatDelivery(seq2, state2.updatedAt);
83911
+ }
83912
+ describePresenceWriteQueue() {
83913
+ const subscription = this.subscription;
83914
+ if (!subscription) return "";
83915
+ const parts2 = [
83916
+ `queued=${subscription.pendingLocalCount}`,
83917
+ `room=${subscription.status}`
83918
+ ];
83919
+ const { lastLocalAppendAtMs } = subscription;
83920
+ if (lastLocalAppendAtMs !== void 0) {
83921
+ parts2.push(`sinceLastAppendMs=${Math.max(0, Date.now() - lastLocalAppendAtMs)}`);
83922
+ }
83923
+ const { lastWriteError } = subscription;
83924
+ if (lastWriteError) {
83925
+ parts2.push(`writeError=${lastWriteError.code}`, `writeErrorRetryable=${lastWriteError.retryable}`);
83926
+ }
83927
+ const unacked = this.heartbeatDeliveryProbe;
83928
+ if (unacked) {
83929
+ parts2.push(`unackedHeartbeatSeq=${unacked.seq}`, `unackedForMs=${Math.max(0, getServerNow() - unacked.enqueuedAtMs)}`);
83930
+ }
83931
+ return ` ${parts2.join(" ")}`;
83932
+ }
83933
+ observeHeartbeatDelivery(seq2, enqueuedAtMs) {
83934
+ const subscription = this.subscription;
83935
+ if (!subscription || this.heartbeatDeliveryProbe) return;
83936
+ const queuedAhead = Math.max(0, subscription.pendingLocalCount - 1);
83937
+ const probe = {
83938
+ seq: seq2,
83939
+ enqueuedAtMs
83940
+ };
83941
+ this.heartbeatDeliveryProbe = probe;
83942
+ void subscription.waitUntilSynced().then(() => {
83943
+ const ageAtSendMs = Math.max(0, getServerNow() - enqueuedAtMs);
83944
+ const detail = `[${this.options.workspaceId}] Loro presence machine heartbeat delivered (seq=${seq2} queuedAhead=${queuedAhead} ageAtSendMs=${ageAtSendMs})`;
83945
+ if (ageAtSendMs >= LODY_PRESENCE_TTL_MS) {
83946
+ this.options.logger.warn(`${detail}: older than the ${LODY_PRESENCE_TTL_MS}ms freshness window on arrival, so readers still report this machine offline`);
83947
+ return;
83948
+ }
83949
+ this.options.logger.debug(detail);
83950
+ }).catch((error2) => {
83951
+ this.options.logger.debug(`[${this.options.workspaceId}] Loro presence machine heartbeat delivery unobserved (seq=${seq2} queuedAhead=${queuedAhead}): ${formatErrorMessage(error2)}`);
83952
+ }).finally(() => {
83953
+ if (this.heartbeatDeliveryProbe === probe) {
83954
+ this.heartbeatDeliveryProbe = null;
83955
+ }
83956
+ });
83801
83957
  }
83802
83958
  setSessionPresence(args2) {
83803
83959
  if (this.stopped) return;
@@ -84105,6 +84261,73 @@ ${val.stack}`;
84105
84261
  }
84106
84262
  };
84107
84263
  };
84264
+ function projectAssistantModel(entry) {
84265
+ if (!entry.items?.length && !entry.plan?.length) return void 0;
84266
+ const value = entry.modelInfo;
84267
+ const model = value && typeof value === "object" && !Array.isArray(value) ? value : {};
84268
+ const modelId = typeof model.modelId === "string" ? model.modelId.trim() : "";
84269
+ const name2 = typeof model.name === "string" ? model.name.trim() : "";
84270
+ return {
84271
+ ...modelId ? {
84272
+ modelId
84273
+ } : {},
84274
+ ...name2 ? {
84275
+ name: name2
84276
+ } : {}
84277
+ };
84278
+ }
84279
+ function latestSessionModelFromReader(history) {
84280
+ for (let index = history.count() - 1; index >= 0; index--) {
84281
+ const summary2 = history.readModelSummaryAt(index);
84282
+ if (summary2?.role !== "assistant") continue;
84283
+ const model = projectAssistantModel({
84284
+ modelInfo: summary2.modelInfo,
84285
+ items: {
84286
+ length: summary2.itemCount
84287
+ },
84288
+ plan: {
84289
+ length: summary2.planCount
84290
+ }
84291
+ });
84292
+ if (model !== void 0) return model;
84293
+ }
84294
+ return null;
84295
+ }
84296
+ function attachSessionModelSummary(source, publish2, onError) {
84297
+ let disposed = false;
84298
+ let running2;
84299
+ let dirty = false;
84300
+ const sync2 = () => {
84301
+ dirty = true;
84302
+ if (running2 || disposed) return running2 ?? Promise.resolve();
84303
+ running2 = Promise.resolve().then(async () => {
84304
+ while (dirty) {
84305
+ if (disposed) break;
84306
+ dirty = false;
84307
+ const model = source.latestModel();
84308
+ await publish2(model, () => !disposed);
84309
+ }
84310
+ }).catch(onError).finally(() => {
84311
+ running2 = void 0;
84312
+ if (dirty && !disposed) void sync2();
84313
+ });
84314
+ return running2;
84315
+ };
84316
+ const unsubscribe = source.subscribe(() => {
84317
+ void sync2();
84318
+ });
84319
+ return {
84320
+ sync: sync2,
84321
+ flush: async () => {
84322
+ await sync2();
84323
+ for (let pending2 = running2; pending2; pending2 = running2) await pending2;
84324
+ },
84325
+ dispose: () => {
84326
+ disposed = true;
84327
+ unsubscribe();
84328
+ }
84329
+ };
84330
+ }
84108
84331
  const STREAMS_TRANSPORT_ID = "streams";
84109
84332
  const isRecoverableStreamsRoomStatus = (status) => status === "disconnected" || status === "error";
84110
84333
  function streamsRoomBinding(sub) {
@@ -107853,6 +108076,7 @@ ${value}`;
107853
108076
  detachDocRoomStatusListener = null;
107854
108077
  docRoomStatusListeners = /* @__PURE__ */ new Set();
107855
108078
  historyAutoReadHandle = null;
108079
+ modelSummary = null;
107856
108080
  destroyed = false;
107857
108081
  sessionDataInstance = null;
107858
108082
  get isDestroyed() {
@@ -107861,6 +108085,8 @@ ${value}`;
107861
108085
  remoteSyncReady = Promise.resolve();
107862
108086
  roomId = "";
107863
108087
  composeSessionData(doc, initialState) {
108088
+ this.modelSummary?.dispose();
108089
+ this.modelSummary = null;
107864
108090
  this.historyAutoReadHandle?.dispose();
107865
108091
  this.historyAutoReadHandle = null;
107866
108092
  this.mirror?.dispose();
@@ -107908,6 +108134,30 @@ ${value}`;
107908
108134
  if (this.historyAutoReadHandle) return;
107909
108135
  this.historyAutoReadHandle = attachAutoMarkLatestUserHistoryAsRead(this.sessionData, (id2) => this.agentWrites.markTurnSeen(id2));
107910
108136
  }
108137
+ attachModelSummary() {
108138
+ if (this.modelSummary) return;
108139
+ this.modelSummary = attachSessionModelSummary({
108140
+ subscribe: (listener) => {
108141
+ const observation = this.sessionData.history.observe(() => listener());
108142
+ return () => observation.unsubscribe();
108143
+ },
108144
+ latestModel: () => latestSessionModelFromReader(this.sessionData.history)
108145
+ }, async (lastModel, active2) => {
108146
+ const current2 = await this.repo.getDocMeta(this.roomId);
108147
+ const meta = current2?.meta;
108148
+ if (!active2() || !current2 || isLoroRepoDocDeleted(current2) || meta?.id !== this.sessionId) return false;
108149
+ if (JSON.stringify(meta.lastModel) !== JSON.stringify(lastModel)) {
108150
+ await this.repo.upsertDocMeta(this.roomId, {
108151
+ lastModel
108152
+ });
108153
+ }
108154
+ return true;
108155
+ }, () => this.logger.warn(`[${this.sessionId}] Failed to publish model summary; retry on next history change`));
108156
+ if (this.sessionData.history.count() > 0) void this.modelSummary.sync();
108157
+ }
108158
+ async syncModelSummary() {
108159
+ await this.modelSummary?.flush();
108160
+ }
107911
108161
  get sessionData() {
107912
108162
  if (!this.sessionDataInstance) throw new Error("SessionDocument not initialized");
107913
108163
  return this.sessionDataInstance;
@@ -107934,6 +108184,7 @@ ${value}`;
107934
108184
  this.composeSessionData(this.handle.doc);
107935
108185
  if (!options.skipAutoRead) {
107936
108186
  this.attachAutoRead();
108187
+ this.attachModelSummary();
107937
108188
  await this.markLatestUserHistoryAsSeenIfNeeded();
107938
108189
  }
107939
108190
  this.remoteSyncReady = this.startDocRoomSync();
@@ -107999,6 +108250,7 @@ ${value}`;
107999
108250
  this.detachDocRoomStatusListener = null;
108000
108251
  this.composeSessionData(this.handle.doc, initialState);
108001
108252
  this.attachAutoRead();
108253
+ this.attachModelSummary();
108002
108254
  }
108003
108255
  async startDocRoomSync() {
108004
108256
  const MAX_JOIN_RETRIES = 8;
@@ -108646,7 +108898,10 @@ ${value}`;
108646
108898
  if (!this.mirror) {
108647
108899
  return;
108648
108900
  }
108901
+ await this.modelSummary?.flush();
108649
108902
  this.destroyed = true;
108903
+ this.modelSummary?.dispose();
108904
+ this.modelSummary = null;
108650
108905
  this.historyAutoReadHandle?.dispose();
108651
108906
  this.historyAutoReadHandle = null;
108652
108907
  const status = await this.getStatus();
@@ -118253,7 +118508,7 @@ ${value}`;
118253
118508
  highWaterMark
118254
118509
  }));
118255
118510
  }
118256
- const version$8 = "1.10.1";
118511
+ const version$8 = "1.12.0";
118257
118512
  const dependencies$1 = {
118258
118513
  "@openai/codex": "^0.154.0"
118259
118514
  };
@@ -118402,12 +118657,12 @@ ${value}`;
118402
118657
  version: version$3,
118403
118658
  artifacts
118404
118659
  };
118405
- const version$2 = "0.39.1-lody.f255222661c9";
118660
+ const version$2 = "2.0.0-lody.604d581e5552";
118406
118661
  const minNodeVersion$1 = "22.19.0";
118407
118662
  const artifact$1 = {
118408
- "fileName": "lody-kimi-code-0.39.1-lody.f255222661c9-a4bfb622023ceaf2.tar.zst",
118409
- "sha256": "a4bfb622023ceaf249faecf8da8508ee400af242de2d4590b72d64e95a0bbbb8",
118410
- "size": 3335953,
118663
+ "fileName": "lody-kimi-code-2.0.0-lody.604d581e5552-89c4a571d63be816.tar.zst",
118664
+ "sha256": "89c4a571d63be816cacbd42f63e0930b55081f8d955032c87d187fe5be72affe",
118665
+ "size": 3276949,
118411
118666
  "compression": "zstd",
118412
118667
  "cmd": "package/dist/main.mjs"
118413
118668
  };
@@ -118419,9 +118674,9 @@ ${value}`;
118419
118674
  const version$1 = "0.1.0-lody.d91f9db0c6dc";
118420
118675
  const minNodeVersion = "22.19.0";
118421
118676
  const artifact = {
118422
- "fileName": "lody-pi-0.1.0-lody.d91f9db0c6dc-3a2e0030b4b2e926.tar.zst",
118423
- "sha256": "3a2e0030b4b2e926ca10f8cdc55799cef84125837cc6f5863281cbaa3b63b929",
118424
- "size": 39451286,
118677
+ "fileName": "lody-pi-0.1.0-lody.d91f9db0c6dc-a77777e554326765.tar.zst",
118678
+ "sha256": "a77777e554326765defdaee121971979814a59c6e936be325468e4eff7f3437e",
118679
+ "size": 39451191,
118425
118680
  "compression": "zstd",
118426
118681
  "cmd": "package/dist/index.js"
118427
118682
  };
@@ -118431,6 +118686,7 @@ ${value}`;
118431
118686
  artifact
118432
118687
  };
118433
118688
  const COMPLETE_MARKER$1 = ".lody-complete";
118689
+ const MANAGED_RUNTIME_PROGRESS_MIN_INTERVAL_MS = 500;
118434
118690
  function managedRuntimeAbortError(signal) {
118435
118691
  return signal.reason instanceof Error ? signal.reason : new DOMException("Managed runtime extraction was cancelled", "AbortError");
118436
118692
  }
@@ -118655,57 +118911,57 @@ ${value}`;
118655
118911
  platforms: {
118656
118912
  "darwin-arm64": {
118657
118913
  fileName: `xai-official-grok-darwin-arm64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118658
- sha256: "82ffbd254fb76ae5e6be651342e902184a024f78bbe1cf6c8f48854d9f9b1594",
118659
- size: 46850248,
118914
+ sha256: "70aababd9c901d91f3565e19f7f389a8670c05ad819e41c2946d775f8ecee8e6",
118915
+ size: 50707087,
118660
118916
  compression: "zstd",
118661
118917
  cmd: "grok",
118662
- executableSha256: "8669e0fdadceec25b8c159c355f427ffbd82583525d774b6ab1522197ea83b80",
118663
- executableSize: 133486016
118918
+ executableSha256: "9cd26b579840f0f5c9148a8059ad651904c08b41b7f2ef0b4ec04b9ba898844e",
118919
+ executableSize: 143016096
118664
118920
  },
118665
118921
  "darwin-x64": {
118666
118922
  fileName: `xai-official-grok-darwin-x64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118667
- sha256: "4f48fbc4280a033da3e763e4c19585014917677d9e5c4c8405d2f80f9d21ed7a",
118668
- size: 51374009,
118923
+ sha256: "cfd7f9165f06808e766088571c7e29ee3afcb4a33af6eb5e1bec704712a2b1b1",
118924
+ size: 55658803,
118669
118925
  compression: "zstd",
118670
118926
  cmd: "grok",
118671
- executableSha256: "8eacec87f5ecdb9259c6d812d12ce9e2d405b1526e36ae9d7fc81ec31dbd74d6",
118672
- executableSize: 149694528
118927
+ executableSha256: "4125f6a9a7524396430f8904a0855100d12a921fcfca4f4380853a39f4ff1d03",
118928
+ executableSize: 160175824
118673
118929
  },
118674
118930
  "linux-arm64": {
118675
118931
  fileName: `xai-official-grok-linux-arm64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118676
- sha256: "676d6795d6e558adb9749f002d9dadc950acc2c5effee839cb9e1f47f8480b03",
118677
- size: 50397485,
118932
+ sha256: "c1af4513ad7bc0e9d7d4f59540e0a76f7f57f38f1940bc17c9886824532e485a",
118933
+ size: 52918676,
118678
118934
  compression: "zstd",
118679
118935
  cmd: "grok",
118680
- executableSha256: "b926fc5308374396e260e7efbd6107231a8dae13c084ddaf0fe89b7ebb3edd25",
118681
- executableSize: 135641288
118936
+ executableSha256: "39ab87666877d64ef3a40aa60fbe0c3b6a6acd7001b78fe60e2c76bb6cfc4a94",
118937
+ executableSize: 136090504
118682
118938
  },
118683
118939
  "linux-x64": {
118684
118940
  fileName: `xai-official-grok-linux-x64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118685
- sha256: "358061308ca5c06832d62c079644f51ef355d820d94a9ca11513c09fb4160049",
118686
- size: 54001005,
118941
+ sha256: "565d2463ca2411bdcfe84a6a0dc5e388ed1347004e5e9e6cbb800339a4d5ca5b",
118942
+ size: 55948155,
118687
118943
  compression: "zstd",
118688
118944
  cmd: "grok",
118689
- executableSha256: "edf79521581bb5e6b95abef848491a6a742e860da3e237ebe86a280d30dce4c1",
118690
- executableSize: 166079904
118945
+ executableSha256: "be5905e107d2b8b5f3c142d21ecfe4c8fd32a913d2fd551b788707930c4dc80d",
118946
+ executableSize: 163035648
118691
118947
  },
118692
118948
  "win32-arm64": {
118693
118949
  fileName: `xai-official-grok-win32-arm64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118694
- sha256: "243aaca666d4375980905c30b5a33e5b0c9a82e9e2c9bc3fd5b6cdf47819e9ad",
118695
- size: 45479753,
118950
+ sha256: "d8b9ef499ce54510c49c1104d0f42ec6573828f4a10f019d8ba4518831eaa7c5",
118951
+ size: 49392602,
118696
118952
  compression: "zstd",
118697
118953
  cmd: "grok.exe",
118698
- executableSha256: "7325ad53988f9c5ca2a35e79b83280441e64d132a9046a947fd14ebb22f48db0",
118699
- executableSize: 121991168
118954
+ executableSha256: "2a633b50420838ba0b31bdbaf9137f4ee8726f1ce4d8e9af21b11af1579909b7",
118955
+ executableSize: 130797568
118700
118956
  },
118701
118957
  "win32-x64": {
118702
118958
  fileName: `xai-official-grok-win32-x64-${GROK_BUILD_RUNTIME_VERSION}.tar.zst`,
118703
- sha256: "e5a50bceb2caba7bef83ef7581b50c4f4db480174a2ed44c4785f77dd9520214",
118704
- size: 48377036,
118959
+ sha256: "353d0f9a88cb88f341983da031026a13b9a80ffb2cc43596945b80e1aa5121aa",
118960
+ size: 52683977,
118705
118961
  compression: "zstd",
118706
118962
  cmd: "grok.exe",
118707
- executableSha256: "6caf906d6ef968004b5ff33422c84e33d51a1cd7b4ee5acd19ff695aaa92672e",
118708
- executableSize: 140801024
118963
+ executableSha256: "c5035f11c15e939cd02e61134b6622c92c09ae522932ace725e3cee0ff2b434c",
118964
+ executableSize: 151283712
118709
118965
  }
118710
118966
  }
118711
118967
  }
@@ -118927,7 +119183,7 @@ ${value}`;
118927
119183
  const installation = await this.readInstallation(name2, definition.version, platformArch);
118928
119184
  if (!installation) return null;
118929
119185
  if (installation.metadata.command !== archive.cmd || installation.metadata.archiveSha256 !== archive.sha256 || installation.metadata.archiveSize !== archive.size || installation.metadata.minNodeVersion !== definition.minNodeVersion) {
118930
- throw new ManagedRuntimeError(`Managed runtime cache metadata does not match the current definition for ${name2}/${definition.version}/${platformArch}`);
119186
+ return null;
118931
119187
  }
118932
119188
  return installation;
118933
119189
  }
@@ -119019,9 +119275,13 @@ ${value}`;
119019
119275
  async listAvailableUpdates() {
119020
119276
  const updates = [];
119021
119277
  for (const name2 of MANAGED_RUNTIME_NAMES) {
119022
- const status = await this.getRuntimeStatus(name2);
119023
- if (status.kind === "installed" && status.updateAvailable) {
119024
- updates.push(name2);
119278
+ try {
119279
+ const status = await this.getRuntimeStatus(name2);
119280
+ if (status.kind === "installed" && status.updateAvailable) {
119281
+ updates.push(name2);
119282
+ }
119283
+ } catch (error2) {
119284
+ this.warnCacheMaintenanceFailure(name2, "update scan", error2);
119025
119285
  }
119026
119286
  }
119027
119287
  return updates;
@@ -119051,7 +119311,17 @@ ${value}`;
119051
119311
  }
119052
119312
  async prepareCache() {
119053
119313
  for (const name2 of MANAGED_RUNTIME_NAMES) {
119054
- await this.pruneSupersededVersions(name2);
119314
+ try {
119315
+ await this.pruneSupersededVersions(name2);
119316
+ } catch (error2) {
119317
+ this.warnCacheMaintenanceFailure(name2, "startup cache cleanup", error2);
119318
+ }
119319
+ }
119320
+ }
119321
+ warnCacheMaintenanceFailure(name2, operation, error2) {
119322
+ try {
119323
+ getLogger("managed-runtime").warn(`Skipping failed ${operation} for ${name2}: ${formatErrorWithCauses(error2)}`);
119324
+ } catch {
119055
119325
  }
119056
119326
  }
119057
119327
  async ensureCurrentRuntime(name2, options = {}) {
@@ -119448,15 +119718,13 @@ ${value}`;
119448
119718
  throw new ManagedRuntimeError(`Failed to download managed runtime ${url} (HTTP ${response2.status})`);
119449
119719
  }
119450
119720
  let downloadedBytes = offset2;
119451
- let lastPercent = -1;
119452
119721
  let lastEmitAtMs = 0;
119453
119722
  const emitDownloadProgress = (force = false) => {
119454
119723
  const percent = getDownloadPercent(downloadedBytes, archive.size);
119455
119724
  const nowMs2 = Date.now();
119456
- if (!force && percent === lastPercent && nowMs2 - lastEmitAtMs < 500) {
119725
+ if (!force && nowMs2 - lastEmitAtMs < MANAGED_RUNTIME_PROGRESS_MIN_INTERVAL_MS) {
119457
119726
  return;
119458
119727
  }
119459
- lastPercent = percent ?? -1;
119460
119728
  lastEmitAtMs = nowMs2;
119461
119729
  this.emitProgress(progressKey, {
119462
119730
  runtimeName: name2,
@@ -129418,21 +129686,6 @@ ${incoming}`).output;
129418
129686
  ])
129419
129687
  });
129420
129688
  const IMAGE_GENERATION_REVISED_PROMPT_PREFIX = "Revised prompt: ";
129421
- const MAX_LIVE_REASONING_LABEL_LENGTH = 280;
129422
- const latestCodexReasoningSummaryLine = (text) => {
129423
- for (const rawLine of text.split(/\r?\n/u).reverse()) {
129424
- let line3 = rawLine.trim();
129425
- if (!line3 || line3.startsWith("<!--")) continue;
129426
- line3 = line3.replace(/^#+\s*/u, "").trim();
129427
- if (line3.startsWith("**")) {
129428
- const closing = line3.indexOf("**", 2);
129429
- if (closing < 0) continue;
129430
- line3 = `${line3.slice(2, closing)}${line3.slice(closing + 2)}`.trim();
129431
- }
129432
- if (line3) return line3.slice(0, MAX_LIVE_REASONING_LABEL_LENGTH);
129433
- }
129434
- return null;
129435
- };
129436
129689
  function isRecord$2(value) {
129437
129690
  return typeof value === "object" && value !== null;
129438
129691
  }
@@ -129546,8 +129799,6 @@ ${incoming}`).output;
129546
129799
  agentMcpCapabilities;
129547
129800
  configOptions = [];
129548
129801
  configOptionsListeners = /* @__PURE__ */ new Set();
129549
- codexReasoningMessageId = null;
129550
- codexReasoningText = "";
129551
129802
  configOptionValues;
129552
129803
  legacySessionModelState = null;
129553
129804
  currentModel;
@@ -129802,40 +130053,9 @@ ${incoming}`).output;
129802
130053
  if (this.handleImageGenerationNotification(notification)) {
129803
130054
  return;
129804
130055
  }
129805
- if (this.handleCodexLiveReasoning(notification)) {
129806
- return;
129807
- }
129808
130056
  this.options.onUpdateMessage(notification);
129809
130057
  return;
129810
130058
  }
129811
- handleCodexLiveReasoning(notification) {
129812
- if (!this.isCodexAgent()) return false;
129813
- const { update: update2 } = notification;
129814
- if (update2.sessionUpdate === "agent_thought_chunk") {
129815
- if (update2.content.type !== "text") return true;
129816
- const messageId = update2.messageId ?? "__current__";
129817
- if (this.codexReasoningMessageId !== messageId) {
129818
- this.codexReasoningMessageId = messageId;
129819
- this.codexReasoningText = "";
129820
- }
129821
- this.codexReasoningText += update2.content.text;
129822
- this.options.onLiveReasoningStatus?.(latestCodexReasoningSummaryLine(this.codexReasoningText));
129823
- return true;
129824
- }
129825
- switch (update2.sessionUpdate) {
129826
- case "agent_message_chunk":
129827
- case "tool_call":
129828
- case "tool_call_update":
129829
- case "plan":
129830
- if (this.codexReasoningMessageId !== null) {
129831
- this.codexReasoningMessageId = null;
129832
- this.codexReasoningText = "";
129833
- this.options.onLiveReasoningStatus?.(null);
129834
- }
129835
- break;
129836
- }
129837
- return false;
129838
- }
129839
130059
  handleGoalSessionInfoUpdate(notification) {
129840
130060
  if (notification.update.sessionUpdate !== "session_info_update") {
129841
130061
  return;
@@ -130113,7 +130333,15 @@ ${incoming}`).output;
130113
130333
  async readTextFile(params) {
130114
130334
  this.ensureSessionMatch(params.sessionId);
130115
130335
  const resolvedPath = this.resolvePath(params.path);
130116
- const content = await promises.readFile(resolvedPath, "utf8");
130336
+ let content;
130337
+ try {
130338
+ content = await promises.readFile(resolvedPath, "utf8");
130339
+ } catch (error2) {
130340
+ if (error2 instanceof Error && "code" in error2 && error2.code === "ENOENT") {
130341
+ throw RequestError$1.resourceNotFound(resolvedPath);
130342
+ }
130343
+ throw error2;
130344
+ }
130117
130345
  const sliced = sliceTextByLines(content, params.line ?? null, params.limit ?? null);
130118
130346
  return {
130119
130347
  content: sliced
@@ -130546,9 +130774,15 @@ ${incoming}`).output;
130546
130774
  elicitation: {
130547
130775
  form: {}
130548
130776
  },
130549
- ...devinClientCapabilitiesMeta !== void 0 ? {
130550
- _meta: devinClientCapabilitiesMeta
130551
- } : {}
130777
+ _meta: {
130778
+ ...devinClientCapabilitiesMeta,
130779
+ lody: {
130780
+ elicitation: {
130781
+ version: 1,
130782
+ answerNotes: true
130783
+ }
130784
+ }
130785
+ }
130552
130786
  }
130553
130787
  }), startupAbort), this.logger, "connection.initialize", this.options.sessionId, ACP_INIT_TIMEOUT_MS$1);
130554
130788
  } catch (error2) {
@@ -134870,6 +135104,47 @@ ${error2.message}` : execaMessage;
134870
135104
  const ZSTD_SESSION_ARTIFACT = "session.jsonl.zstd";
134871
135105
  const DSH_NODE_EXECUTABLE_ENV = "LODY_DSH_NODE_EXECUTABLE";
134872
135106
  const DSH_NODE_ARGS_ENV = "LODY_DSH_NODE_ARGS";
135107
+ function resolveDeepSeekHarnessSpawn(options) {
135108
+ const { command: command2, args: args2, env: env2, workdir } = options;
135109
+ if ((options.platform ?? process.platform) !== "win32" || command2 !== "npx" || !env2[DSH_NODE_EXECUTABLE_ENV]) {
135110
+ return {
135111
+ command: command2,
135112
+ args: args2
135113
+ };
135114
+ }
135115
+ const envValue = (name2) => {
135116
+ const key2 = Object.keys(env2).sort().find((candidate) => candidate.toLowerCase() === name2);
135117
+ return key2 ? env2[key2] : void 0;
135118
+ };
135119
+ const directories = [
135120
+ workdir,
135121
+ ...(envValue("path") ?? "").split(";")
135122
+ ];
135123
+ const extensions = (envValue("pathext") ?? ".COM;.EXE;.BAT;.CMD").split(";");
135124
+ for (const directory of directories) {
135125
+ if (!directory) continue;
135126
+ for (const extension2 of extensions) {
135127
+ const executable = resolve$1(workdir, directory.replace(/^"|"$/g, ""), `npx${extension2.toLowerCase()}`);
135128
+ if (!existsSync(executable)) continue;
135129
+ if (/\.(exe|com)$/i.test(extension2)) return {
135130
+ command: executable,
135131
+ args: args2
135132
+ };
135133
+ const entry = join$2(dirname$1(realpathSync(executable)), "node_modules", "npm", "bin", "npx-cli.js");
135134
+ if (!existsSync(entry)) {
135135
+ throw new Error(`Cannot launch DeepSeek Harness without cmd.exe: npm's npx-cli.js is missing beside ${executable}. Install Node.js with npm and retry.`);
135136
+ }
135137
+ return {
135138
+ command: process.execPath,
135139
+ args: [
135140
+ entry,
135141
+ ...args2
135142
+ ]
135143
+ };
135144
+ }
135145
+ }
135146
+ throw new Error("Cannot launch DeepSeek Harness: npx was not found on PATH. Install Node.js with npm and retry.");
135147
+ }
134873
135148
  function encodeBase64$1(value) {
134874
135149
  return Buffer.from(value, "utf8").toString("base64");
134875
135150
  }
@@ -136567,7 +136842,6 @@ ${fallbackStderrTail}` : errorMessage2;
136567
136842
  terminalEnabled: options.terminalEnabled,
136568
136843
  onStartupStage: options.onStartupStage,
136569
136844
  onUpdateMessage: options.onUpdateMessage,
136570
- onLiveReasoningStatus: options.onLiveReasoningStatus,
136571
136845
  onRequestPermission: options.onRequestPermission,
136572
136846
  onUsageUpdate: options.onUsageUpdate,
136573
136847
  onContextWindowUsageUpdate: options.onContextWindowUsageUpdate,
@@ -136652,7 +136926,13 @@ ${fallbackStderrTail}` : errorMessage2;
136652
136926
  args2 = args2 ?? launch.args;
136653
136927
  }
136654
136928
  const spawnFn = options.spawnImpl ?? spawn;
136655
- return spawnFn(command2, args2, {
136929
+ const executable = resolveDeepSeekHarnessSpawn({
136930
+ command: command2,
136931
+ args: args2,
136932
+ env: options.env,
136933
+ workdir: options.workdir
136934
+ });
136935
+ return spawnFn(executable.command, executable.args, {
136656
136936
  cwd: options.workdir,
136657
136937
  env: options.env,
136658
136938
  stdio: [
@@ -138355,7 +138635,7 @@ ${fallbackStderrTail}` : errorMessage2;
138355
138635
  const phaseToStatus = (phase, detail) => {
138356
138636
  switch (phase ?? "thinking") {
138357
138637
  case "thinking":
138358
- return SessionStatusFactory.running(void 0, detail);
138638
+ return SessionStatusFactory.running();
138359
138639
  case "initializing":
138360
138640
  return SessionStatusFactory.initializing(void 0, detail);
138361
138641
  case "git-clone":
@@ -143702,9 +143982,7 @@ ${withCauses}`;
143702
143982
  }
143703
143983
  if (runtime?.promptStarted) {
143704
143984
  yield* self2.ignoreWithWarning(options.sessionId, "Failed to settle context compaction after cancelled ACP prompt stopped", self2.tryPromise(async () => {
143705
- await self2.deps.turnFinalization.finalizeACPState(options.sessionId, options.turnId, {
143706
- settleContextCompactionAsFailed: true
143707
- });
143985
+ await self2.deps.turnFinalization.finalizeACPState(options.sessionId, options.turnId);
143708
143986
  await self2.persistTurnDiffsAndFlushUsage(options.sessionId, options.turnId);
143709
143987
  }));
143710
143988
  }
@@ -143798,9 +144076,7 @@ ${withCauses}`;
143798
144076
  if (options.userTurnId) {
143799
144077
  await this.markTurnFailed(options.sessionId, options.sessionDoc, options.userTurnId);
143800
144078
  }
143801
- await this.handleTurnError(options.sessionId, options.sessionDoc, options.error, {
143802
- providerPromptSettled: options.runtime.promptStarted && !options.runtime.promptInFlight
143803
- });
144079
+ await this.handleTurnError(options.sessionId, options.sessionDoc, options.error);
143804
144080
  await options.onUnhandledError?.(options.error);
143805
144081
  }
143806
144082
  async finalizeHaltedTurn(options) {
@@ -143846,12 +144122,10 @@ ${withCauses}`;
143846
144122
  onRetry: (attempt, maxAttempts) => this.deps.logger.debug(`Local project ${localProjectId} not visible in machine Flock yet; pulling machine Flock and retrying (attempt ${attempt}/${maxAttempts})`)
143847
144123
  });
143848
144124
  }
143849
- async handleTurnError(sessionId, sessionDoc, error2, options) {
144125
+ async handleTurnError(sessionId, sessionDoc, error2) {
143850
144126
  const acpError = error2 ? parseACPError(error2) : null;
143851
144127
  const providerDisconnected = error2 ? isAgentDisconnectedError(error2) : false;
143852
- await this.deps.turnFinalization.finalizeACPState(sessionId, this.currentTurnBySession.get(sessionId), {
143853
- settleContextCompactionAsFailed: options?.providerPromptSettled === true || acpError !== null || providerDisconnected
143854
- });
144128
+ await this.deps.turnFinalization.finalizeACPState(sessionId, this.currentTurnBySession.get(sessionId));
143855
144129
  await this.persistCodeCollabTurnDiffsAfterACPFinalization(sessionId, this.currentTurnBySession.get(sessionId));
143856
144130
  await this.deps.turnFinalization.flushSessionUsage(sessionId);
143857
144131
  if (error2) {
@@ -145612,8 +145886,7 @@ ${withCauses}`;
145612
145886
  kind: "finish-assistant",
145613
145887
  turnId,
145614
145888
  endedAt: getServerNow(),
145615
- force: true,
145616
- settleContextCompactionAsFailed: true
145889
+ force: true
145617
145890
  });
145618
145891
  await this.finalizeCancelledTurn({
145619
145892
  sessionId,
@@ -149266,9 +149539,15 @@ ${withCauses}`;
149266
149539
  }
149267
149540
  });
149268
149541
  this.deps.logger.error(`[${spec.sourceSessionId}] Worktree session fork failed: ${publicError.detail instanceof Error ? publicError.detail.message : String(publicError.detail ?? error2)}`);
149542
+ return;
149269
149543
  } finally {
149270
149544
  this.activeOperations.delete(operation.id);
149271
149545
  }
149546
+ try {
149547
+ await targetDoc.syncModelSummary();
149548
+ } catch {
149549
+ this.deps.logger.warn(`[${targetSessionId}] Failed to publish fork model summary`);
149550
+ }
149272
149551
  }
149273
149552
  }
149274
149553
  const lastUserIndex = (history) => {
@@ -173352,6 +173631,17 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
173352
173631
  }
173353
173632
  function buildLocalPreviewRequestHeaders(headers2, options) {
173354
173633
  const proxyHeaders = new Headers(stripLocalPreviewRequestHeaders(headers2));
173634
+ const fetchMode = proxyHeaders.get("sec-fetch-mode");
173635
+ if (fetchMode === "navigate" || fetchMode === "nested-navigate") {
173636
+ for (const name2 of [
173637
+ "sec-fetch-site",
173638
+ "sec-fetch-mode",
173639
+ "sec-fetch-dest",
173640
+ "sec-fetch-user"
173641
+ ]) {
173642
+ proxyHeaders.delete(name2);
173643
+ }
173644
+ }
173355
173645
  if (options) {
173356
173646
  const rewrittenReferer = rewriteLocalPreviewReferer(getHeaderValue(headers2, "referer") ?? "", {
173357
173647
  localOrigin: options.localOrigin,
@@ -176606,7 +176896,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
176606
176896
  applyAcpModeAndModel: async (session2, acpConfig, context2) => await this.applyAcpModeAndModel(session2, acpConfig, context2),
176607
176897
  createAssistantEntryForTurn: async (sessionId, sessionDoc, turnId, modelInfo, userTurnId) => await this.createAssistantEntryForTurn(sessionId, sessionDoc, turnId, modelInfo, userTurnId),
176608
176898
  turnFinalization: {
176609
- finalizeACPState: async (sessionId, turnId, options) => await this.finalizeACPState(sessionId, turnId, options),
176899
+ finalizeACPState: async (sessionId, turnId) => await this.finalizeACPState(sessionId, turnId),
176610
176900
  persistCodeCollabTurnDiffs: async (sessionId, turnId) => await this.persistCodeCollabTurnDiffs(sessionId, turnId),
176611
176901
  flushSessionUsage: async (sessionId) => await this.flushSessionUsage(sessionId),
176612
176902
  syncSessionBranchName: async (sessionId, session2) => await this.turnPostProcessingService.syncSessionBranchName(sessionId, session2),
@@ -178596,9 +178886,6 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
178596
178886
  this.sessionManager.on("onACPUpdateMessage", (sessionId, update2) => {
178597
178887
  this.enqueueACPUpdate(sessionId, update2);
178598
178888
  });
178599
- this.sessionManager.on("onCodexLiveReasoningStatus", (sessionId, label2) => {
178600
- this.setSessionActivePresencePhase(sessionId, "thinking", label2 ?? void 0);
178601
- });
178602
178889
  this.sessionManager.on("onWriteTextFile", (sessionId, event) => {
178603
178890
  this.trackCodeCollabEvidenceWrite(sessionId, this.collectCodeCollabWriteTextFileEvidence(sessionId, event));
178604
178891
  });
@@ -180033,7 +180320,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
180033
180320
  this.scheduleCodeCollabTurnRetry(sessionId, turnId);
180034
180321
  }
180035
180322
  }
180036
- async finalizeACPState(sessionId, turnId, options) {
180323
+ async finalizeACPState(sessionId, turnId) {
180037
180324
  if (!turnId || this.store.getTurnId(sessionId) === turnId) {
180038
180325
  await this.awaitTurnHistoryGate(sessionId);
180039
180326
  }
@@ -180057,8 +180344,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
180057
180344
  kind: "finish-assistant",
180058
180345
  turnId,
180059
180346
  endedAt,
180060
- permissionWaitMs,
180061
- settleContextCompactionAsFailed: options?.settleContextCompactionAsFailed
180347
+ permissionWaitMs
180062
180348
  });
180063
180349
  await sessionDoc.waitUntilSynced();
180064
180350
  } catch (error2) {
@@ -181960,6 +182246,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
181960
182246
  };
181961
182247
  }
181962
182248
  async handleAgentPermissionRequest(sessionId, requestId, request2, model, agentClient) {
182249
+ const permissionTurnId = this.store.getTurnId(sessionId);
181963
182250
  const isAskUserQuestionRequest = isAskUserQuestionPermissionRequest(request2);
181964
182251
  const askUserQuestionMeta = isAskUserQuestionRequest ? parseAskUserQuestionPermissionMeta(request2._meta) : null;
181965
182252
  const permissionTimeoutMs = typeof askUserQuestionMeta?.autoResolveAt === "number" ? Math.min(PERMISSION_REQUEST_TIMEOUT_MS, Math.max(0, askUserQuestionMeta.autoResolveAt - getServerNow())) : PERMISSION_REQUEST_TIMEOUT_MS;
@@ -182005,6 +182292,15 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
182005
182292
  let historyUserId;
182006
182293
  let permissionRequestPersisted = false;
182007
182294
  try {
182295
+ await this.awaitTurnHistoryGate(sessionId);
182296
+ await this.flushACPUpdatesNow(sessionId);
182297
+ if (this.deletedSessionIds.has(sessionId) || this.store.getTurnId(sessionId) !== permissionTurnId) {
182298
+ throw new Error("Permission owner changed while draining ACP history");
182299
+ }
182300
+ const acpState = this.store.get(sessionId);
182301
+ if (acpState.acpUpdateBuffer.length > 0 || acpState.acpFlushInFlight) {
182302
+ throw new Error("ACP history has not drained before permission persistence");
182303
+ }
182008
182304
  permissionRequestPersisted = await ensurePermissionRequestOnToolCall(doc, requestId, request2, model);
182009
182305
  await doc.setLastMessageAt();
182010
182306
  const meta = await doc.getMetaState();
@@ -183257,6 +183553,8 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
183257
183553
  case "session/preview-create":
183258
183554
  case "session/preview-revoke":
183259
183555
  return `session:${message.sessionId}:preview`;
183556
+ case "machine/acp-authenticate":
183557
+ return message.action === "start" ? "machine:acp-authenticate:start" : "machine:acp-authenticate:control";
183260
183558
  case "session/cancel":
183261
183559
  return null;
183262
183560
  default:
@@ -187316,7 +187614,13 @@ export PATH=${toSingleQuotedShellString(ghShimBinDir)}:"$PATH"
187316
187614
  let agentProcessHandle;
187317
187615
  try {
187318
187616
  callbacks.abortSignal?.throwIfAborted();
187319
- agentProcessHandle = await this.sandbox.spawn(callbacks.command, callbacks.args ?? [], {
187617
+ const executable = resolveDeepSeekHarnessSpawn({
187618
+ command: callbacks.command,
187619
+ args: callbacks.args ?? [],
187620
+ env: env2,
187621
+ workdir: this.getWorkdir()
187622
+ });
187623
+ agentProcessHandle = await this.sandbox.spawn(executable.command, executable.args, {
187320
187624
  cwd: this.getWorkdir(),
187321
187625
  env: env2,
187322
187626
  stdio: [
@@ -187405,7 +187709,6 @@ export PATH=${toSingleQuotedShellString(ghShimBinDir)}:"$PATH"
187405
187709
  forkSessionTurnId: callbacks.forkSessionTurnId,
187406
187710
  onStartupStage: callbacks.onStartupStage,
187407
187711
  onUpdateMessage: callbacks.onUpdateMessage,
187408
- onLiveReasoningStatus: callbacks.onLiveReasoningStatus,
187409
187712
  onRequestPermission: callbacks.onRequestPermission,
187410
187713
  onUsageUpdate: callbacks.onUsageUpdate,
187411
187714
  onContextWindowUsageUpdate: callbacks.onContextWindowUsageUpdate,
@@ -188752,9 +189055,6 @@ export PATH=${toSingleQuotedShellString(ghShimBinDir)}:"$PATH"
188752
189055
  onUpdateMessage: (update2) => {
188753
189056
  dispatchEvent(() => this.emit("onACPUpdateMessage", sessionId, update2));
188754
189057
  },
188755
- onLiveReasoningStatus: (label2) => {
188756
- dispatchEvent(() => this.emit("onCodexLiveReasoningStatus", sessionId, label2));
188757
- },
188758
189058
  onRequestPermission: (requestId, request2) => {
188759
189059
  if (options?.allowInteractiveRequest && !options.allowInteractiveRequest()) {
188760
189060
  return Promise.resolve({
@@ -224635,11 +224935,13 @@ ${page}${helpTipBottom}${choiceDescription}${ansiEscapes.cursorHide}`;
224635
224935
  }
224636
224936
  function toMachineListEntry(machine, onlineMachineIds) {
224637
224937
  const legacy2 = machine;
224938
+ const online = onlineMachineIds?.has(machine.id) === true;
224638
224939
  return {
224639
224940
  ...machine,
224640
224941
  acpCapabilities: legacy2.acpCapabilities,
224641
224942
  raceLimits: legacy2.raceLimits ?? {},
224642
- online: onlineMachineIds.has(machine.id)
224943
+ online,
224944
+ onlineStatus: onlineMachineIds === null ? "unknown" : online ? "online" : "offline"
224643
224945
  };
224644
224946
  }
224645
224947
  function isLegacyRateLimitEntryForCliType(key2, cliType) {
@@ -224764,7 +225066,7 @@ ${page}${helpTipBottom}${choiceDescription}${ansiEscapes.cursorHide}`;
224764
225066
  const row = [
224765
225067
  machine.id,
224766
225068
  machine.id === currentMachineId ? `${machine.name} (current)` : machine.name,
224767
- machine.online ? "online" : "offline",
225069
+ machine.onlineStatus,
224768
225070
  formatMachineCli(machine)
224769
225071
  ];
224770
225072
  if (includeAgents) {
@@ -224780,10 +225082,10 @@ ${page}${helpTipBottom}${choiceDescription}${ansiEscapes.cursorHide}`;
224780
225082
  await withWorkspaceManager$1(auth, workspace, "machine", async (manager) => {
224781
225083
  const onlineMachineIds = await manager.getOnlineMachineIds();
224782
225084
  if (onlineMachineIds === null) {
224783
- console.error("Warning: presence room unavailable; machine online status is unknown and shown as offline.");
225085
+ console.error('Warning: presence room unavailable; machine online status is unknown, reported as onlineStatus "unknown".');
224784
225086
  }
224785
225087
  const onlineIds = onlineMachineIds ?? /* @__PURE__ */ new Set();
224786
- let machines = sortMachineMetas((await listAliveDocMetas(manager, isMachineDocRoomId)).map((entry) => entry.meta), onlineIds, auth.machineId).map((machine) => toMachineListEntry(machine, onlineIds)).filter((machine) => !options.onlineOnly || machine.online);
225088
+ let machines = sortMachineMetas((await listAliveDocMetas(manager, isMachineDocRoomId)).map((entry) => entry.meta), onlineIds, auth.machineId).map((machine) => toMachineListEntry(machine, onlineMachineIds)).filter((machine) => !options.onlineOnly || machine.online);
224787
225089
  if (options.includeAgents === true) {
224788
225090
  machines = await attachAgentConfigsToMachines(manager.repo, workspace.id, machines);
224789
225091
  }
@@ -225561,7 +225863,7 @@ ${page}${helpTipBottom}${choiceDescription}${ansiEscapes.cursorHide}`;
225561
225863
  data = createReviewBundleSnapshot(bundle);
225562
225864
  }
225563
225865
  const { injectReviewSnapshot } = await import("./chunks/index-VoI6Ds2-.js");
225564
- const { resolveReviewViewerTemplate } = await import("./chunks/review-viewer-Dah28phN.js").then(async (m) => {
225866
+ const { resolveReviewViewerTemplate } = await import("./chunks/review-viewer-DDjD2VXi.js").then(async (m) => {
225565
225867
  await m.__tla;
225566
225868
  return m;
225567
225869
  });
@@ -245378,18 +245680,22 @@ ${prompt2}` : prompt2;
245378
245680
  }
245379
245681
  };
245380
245682
  };
245381
- const makeMachineOnlineLookupForMcp = (manager, ctx) => {
245683
+ const makeMachineLivenessLookupForMcp = (manager, ctx) => {
245382
245684
  let onlineMachineIds;
245383
245685
  return async (machineId) => {
245384
245686
  if (machineId === ctx.machineId) {
245385
- return true;
245687
+ return "online";
245386
245688
  }
245387
245689
  onlineMachineIds ??= manager.getOnlineMachineIds();
245388
- return (await onlineMachineIds)?.has(machineId) === true;
245690
+ const resolved = await onlineMachineIds;
245691
+ if (resolved === null) {
245692
+ return "unknown";
245693
+ }
245694
+ return resolved.has(machineId) ? "online" : "offline";
245389
245695
  };
245390
245696
  };
245391
- const assertMachineOnlineForSingleCommand = async (manager, machineId, ctx) => {
245392
- if (!await makeMachineOnlineLookupForMcp(manager, ctx)(machineId)) {
245697
+ const assertMachineNotOfflineForSingleCommand = async (manager, machineId, ctx) => {
245698
+ if (await makeMachineLivenessLookupForMcp(manager, ctx)(machineId) === "offline") {
245393
245699
  throw new LodyOperationStoreError("MACHINE_OFFLINE", `Target Machine is offline: ${machineId}`, true);
245394
245700
  }
245395
245701
  };
@@ -245551,8 +245857,12 @@ ${prompt2}` : prompt2;
245551
245857
  const delegatedRequester = toDelegatedSessionRequester(invoking.identity);
245552
245858
  const machineEntries = await listAliveDocMetas(manager, isMachineDocRoomId);
245553
245859
  const onlineMachineIds = await manager.getOnlineMachineIds();
245554
- const isMachineOnline = (machineId) => machineId === auth.machineId || onlineMachineIds?.has(machineId) === true;
245555
- const machineCandidates = selectMachineMetasForOptions(machineEntries.map((entry) => entry.meta), input2.machineId).filter((machine) => input2.machineId !== void 0 || isMachineOnline(machine.id));
245860
+ const machineLivenessOf = (machineId) => {
245861
+ if (machineId === auth.machineId) return "online";
245862
+ if (onlineMachineIds === null) return "unknown";
245863
+ return onlineMachineIds.has(machineId) ? "online" : "offline";
245864
+ };
245865
+ const machineCandidates = selectMachineMetasForOptions(machineEntries.map((entry) => entry.meta), input2.machineId).filter((machine) => input2.machineId !== void 0 || machineLivenessOf(machine.id) !== "offline");
245556
245866
  const machines = await filterAuthorizedMachinesForOptions(auth, workspaceId, machineCandidates, delegatedRequester);
245557
245867
  const selectedMachine = selectMachineForOptions(machines, input2.machineId, currentSession.machineId);
245558
245868
  await syncMachineFlockDocsForOptions(manager, workspaceId, [
@@ -245587,7 +245897,7 @@ ${prompt2}` : prompt2;
245587
245897
  return currentLocalProjectId !== void 0 && project.id === currentLocalProjectId;
245588
245898
  });
245589
245899
  const localProjects = (await filterAuthorizedLocalProjectsForOptions(auth, workspaceId, selectedMachine.id, localProjectCandidates, delegatedRequester)).slice(0, MAX_MCP_CREATE_OPTION_MATCHES);
245590
- const summarizedLocalProjects = await Promise.all(localProjects.map((project) => summarizeLocalProjectForOptions(auth, workspaceId, selectedMachine, project, requesterUserId, isMachineOnline(selectedMachine.id))));
245900
+ const summarizedLocalProjects = await Promise.all(localProjects.map((project) => summarizeLocalProjectForOptions(auth, workspaceId, selectedMachine, project, requesterUserId, machineLivenessOf(selectedMachine.id) !== "offline")));
245591
245901
  const repoQuery = normalizeCliValue(input2.repoQuery)?.toLowerCase();
245592
245902
  const repos = repoQuery ? (await listWorkspaceGitHubRepositoriesForCliToken({
245593
245903
  token: auth.token,
@@ -245605,7 +245915,8 @@ ${prompt2}` : prompt2;
245605
245915
  machines: machines.map((machine) => ({
245606
245916
  id: machine.id,
245607
245917
  name: machine.name,
245608
- online: isMachineOnline(machine.id),
245918
+ online: machineLivenessOf(machine.id) === "online",
245919
+ onlineStatus: machineLivenessOf(machine.id),
245609
245920
  canUse: true
245610
245921
  })),
245611
245922
  agentConfigs: agentConfigs.map((config2) => summarizeAgentConfig(config2, acpCapabilities[getAcpCapabilityCacheKey(config2.id)])),
@@ -245641,7 +245952,7 @@ ${prompt2}` : prompt2;
245641
245952
  return await withOperationStore((store) => store.snapshot(retry2));
245642
245953
  }
245643
245954
  const targetMachineId = resolved.input.machineId ?? currentSession.machineId;
245644
- await assertMachineOnlineForSingleCommand(manager, targetMachineId, ctx);
245955
+ await assertMachineNotOfflineForSingleCommand(manager, targetMachineId, ctx);
245645
245956
  const createOptions = buildMcpCreateOptions(resolved.input, ctx);
245646
245957
  bindMcpCreateContext(createOptions, invoking.identity, currentSession);
245647
245958
  bindAgentRoleCreateOptions(createOptions, resolved.role);
@@ -245760,7 +246071,7 @@ ${prompt2}` : prompt2;
245760
246071
  throw new LodyOperationStoreError("SESSION_NOT_FOUND", `Target Session not found: ${args2.sessionId}`, false);
245761
246072
  }
245762
246073
  assertDifferentMcpSession(currentSession, targetSession);
245763
- await assertMachineOnlineForSingleCommand(manager, targetSession.machineId, ctx);
246074
+ await assertMachineNotOfflineForSingleCommand(manager, targetSession.machineId, ctx);
245764
246075
  try {
245765
246076
  await validateSessionChatTarget({
245766
246077
  auth,
@@ -246000,7 +246311,7 @@ ${prompt2}` : prompt2;
246000
246311
  if (retry2) {
246001
246312
  return await withOperationStore((store) => store.snapshot(retry2));
246002
246313
  }
246003
- const isMachineOnline = makeMachineOnlineLookupForMcp(manager, ctx);
246314
+ const machineLiveness = makeMachineLivenessLookupForMcp(manager, ctx);
246004
246315
  const validatedItems = await mapWithConcurrency(expanded, 5, async (item, index) => {
246005
246316
  const label2 = item.label;
246006
246317
  if (!item.prompt) {
@@ -246031,7 +246342,7 @@ ${prompt2}` : prompt2;
246031
246342
  };
246032
246343
  }
246033
246344
  const targetMachineId = resolved.input.machineId ?? requester.machineId;
246034
- if (!await isMachineOnline(targetMachineId)) {
246345
+ if (await machineLiveness(targetMachineId) === "offline") {
246035
246346
  return {
246036
246347
  operationItem: batchFailure("MACHINE_OFFLINE", `Target Machine is offline: ${targetMachineId}`, true, label2),
246037
246348
  dispatchConfig: null
@@ -246166,7 +246477,7 @@ ${prompt2}` : prompt2;
246166
246477
  if (retry2) {
246167
246478
  return await withOperationStore((store) => store.snapshot(retry2));
246168
246479
  }
246169
- const isMachineOnline = makeMachineOnlineLookupForMcp(manager, ctx);
246480
+ const machineLiveness = makeMachineLivenessLookupForMcp(manager, ctx);
246170
246481
  const initialItems = await mapWithConcurrency(expanded, 5, async (item) => {
246171
246482
  if (!item.sessionId || !item.prompt) {
246172
246483
  return batchFailure("INVALID_ITEM", "Chat item requires sessionId and prompt.", false, item.label);
@@ -246178,7 +246489,7 @@ ${prompt2}` : prompt2;
246178
246489
  if (target.id === requester.id) {
246179
246490
  return batchFailure("INVALID_ITEM", "An MCP agent cannot chat its own active Session.", false, item.label);
246180
246491
  }
246181
- if (!await isMachineOnline(target.machineId)) {
246492
+ if (await machineLiveness(target.machineId) === "offline") {
246182
246493
  return batchFailure("MACHINE_OFFLINE", `Target Machine is offline: ${target.machineId}`, true, item.label);
246183
246494
  }
246184
246495
  try {