lody 0.87.0 → 0.88.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
@@ -4325,7 +4325,7 @@ Upgrade Node, then re-run: npx lody@latest`;
4325
4325
  }
4326
4326
  const name$2 = "lody";
4327
4327
  const name$1 = "@lody/cli-cloud";
4328
- const version$9 = "0.87.0";
4328
+ const version$9 = "0.88.0";
4329
4329
  const type$2 = "module";
4330
4330
  const scripts = {
4331
4331
  "dev": "node dev.mjs",
@@ -4664,7 +4664,7 @@ Upgrade Node, then re-run: npx lody@latest`;
4664
4664
  return "none";
4665
4665
  }
4666
4666
  const MODEL_THOUGHT_LEVEL_META_KEY = "lodyThoughtLevel";
4667
- const ACP_CAPABILITY_CACHE_VERSION = 5;
4667
+ const ACP_CAPABILITY_CACHE_VERSION = 6;
4668
4668
  const getAcpCapabilityCacheKey = (configId) => configId;
4669
4669
  const isBuiltinAgentType = (agentType) => BUILTIN_AGENTS.some((agent2) => agent2.agentType === agentType);
4670
4670
  const isManagedBuiltinAgentType = (agentType) => MANAGED_BUILTIN_RUNTIMES.some((runtime) => runtime.agentType === agentType);
@@ -6155,7 +6155,9 @@ Requirements:
6155
6155
  path2.add(value);
6156
6156
  }
6157
6157
  const keys2 = Object.keys(value);
6158
- const strippedValues = new Array(keys2.length);
6158
+ const strippedValues = Array.from({
6159
+ length: keys2.length
6160
+ });
6159
6161
  let changed = false;
6160
6162
  for (let i2 = 0; i2 < keys2.length; i2++) {
6161
6163
  const key2 = keys2[i2];
@@ -6459,7 +6461,7 @@ Requirements:
6459
6461
  function isContainerSchema(schema2) {
6460
6462
  return !!schema2 && (schema2.type === "loro-map" || schema2.type === "loro-list" || schema2.type === "loro-text" || schema2.type === "loro-movable-list" || schema2.type === "loro-tree");
6461
6463
  }
6462
- function validateSchema(schema2, value) {
6464
+ function validateSchema(schema2, value, options) {
6463
6465
  const errors2 = [];
6464
6466
  const actualType = schema2.type;
6465
6467
  if (schema2.options.required && (value === void 0 || value === null)) {
@@ -6474,7 +6476,8 @@ Requirements:
6474
6476
  valid: true
6475
6477
  };
6476
6478
  }
6477
- if (isSchemaValidated(schema2, value)) {
6479
+ const useCache = !options?.ignoreUnknownProperties;
6480
+ if (useCache && isSchemaValidated(schema2, value)) {
6478
6481
  return {
6479
6482
  valid: true
6480
6483
  };
@@ -6587,6 +6590,7 @@ Requirements:
6587
6590
  }
6588
6591
  for (const key2 in value) {
6589
6592
  if (!Object.prototype.hasOwnProperty.call(schema2.definition, key2)) {
6593
+ if (options?.ignoreUnknownProperties) continue;
6590
6594
  errors2.push(`Unknown property: ${key2}`);
6591
6595
  }
6592
6596
  }
@@ -6610,7 +6614,7 @@ Requirements:
6610
6614
  }
6611
6615
  }
6612
6616
  if (errors2.length === 0) {
6613
- markSchemaValidated(schema2, value);
6617
+ if (useCache) markSchemaValidated(schema2, value);
6614
6618
  return {
6615
6619
  valid: true
6616
6620
  };
@@ -9315,6 +9319,7 @@ Requirements:
9315
9319
  schema: options.schema,
9316
9320
  initialState: options.initialState || {},
9317
9321
  validateUpdates: options.validateUpdates !== false,
9322
+ ignoreUnknownProperties: options.ignoreUnknownProperties || false,
9318
9323
  debug: options.debug || false,
9319
9324
  checkStateConsistency: options.checkStateConsistency || false,
9320
9325
  inferOptions: options.inferOptions || {}
@@ -10473,7 +10478,9 @@ Requirements:
10473
10478
  }) : Object.assign({}, this.state, updater);
10474
10479
  hardenCidDescriptors(newState, this.state);
10475
10480
  if (this.options.validateUpdates) {
10476
- const validation2 = this.schema && validateSchema(this.schema, newState);
10481
+ const validation2 = this.schema && validateSchema(this.schema, newState, {
10482
+ ignoreUnknownProperties: this.options.ignoreUnknownProperties
10483
+ });
10477
10484
  if (validation2 && !validation2.valid) {
10478
10485
  const errorMessage2 = `State validation failed: ${validation2.errors?.join(", ")}`;
10479
10486
  throw new Error(errorMessage2);
@@ -10651,6 +10658,15 @@ Requirements:
10651
10658
  root[key2] = this.containerToMirrorState(container2, options);
10652
10659
  }
10653
10660
  }
10661
+ if (this.options.ignoreUnknownProperties) {
10662
+ const fullDocState = toNormalizedJson(this.doc);
10663
+ for (const key2 of Object.keys(fullDocState)) {
10664
+ if (Object.prototype.hasOwnProperty.call(rootSchema.definition, key2)) {
10665
+ continue;
10666
+ }
10667
+ root[key2] = fullDocState[key2];
10668
+ }
10669
+ }
10654
10670
  return root;
10655
10671
  }
10656
10672
  registerContainerWithRegistry(containerId, schemaType) {
@@ -13247,6 +13263,13 @@ Requirements:
13247
13263
  localProjectId: LocalProjectIdSchema,
13248
13264
  requestedByUserId: string$1().trim().min(1).optional()
13249
13265
  }).strict();
13266
+ const LocalProjectRemovalPreflightRequestSchema = object$1({
13267
+ type: literal$1("local-project/removal-preflight"),
13268
+ machineId: MachineIdSchema$1,
13269
+ workspaceId: WorkspaceIdSchema,
13270
+ localProjectId: LocalProjectIdSchema,
13271
+ requestedByUserId: string$1().trim().min(1).optional()
13272
+ }).strict();
13250
13273
  const LocalProjectListRequestSchema = object$1({
13251
13274
  type: literal$1("local-project/list"),
13252
13275
  machineId: MachineIdSchema$1
@@ -13386,6 +13409,7 @@ Requirements:
13386
13409
  LocalProjectListRootsRequestSchema,
13387
13410
  LocalProjectBrowseDirRequestSchema,
13388
13411
  LocalProjectDeleteRequestSchema,
13412
+ LocalProjectRemovalPreflightRequestSchema,
13389
13413
  LocalProjectListRequestSchema,
13390
13414
  LocalProjectGitStateRequestSchema,
13391
13415
  LocalProjectListFilesRequestSchema,
@@ -13552,6 +13576,19 @@ Requirements:
13552
13576
  status: literal$1("resolved"),
13553
13577
  catalog: LocalProjectHistoryCatalogResultSchema
13554
13578
  }).strict();
13579
+ const LocalProjectWorktreeCleanupItemSchema = object$1({
13580
+ sessionId: SessionIdSchema$1,
13581
+ title: string$1(),
13582
+ path: string$1()
13583
+ }).strict();
13584
+ const LocalProjectWorktreeCleanupFailureSchema = LocalProjectWorktreeCleanupItemSchema.extend({
13585
+ message: string$1()
13586
+ }).strict();
13587
+ const LocalProjectWorktreeCleanupPreflightResultSchema = object$1({
13588
+ clean: array$2(LocalProjectWorktreeCleanupItemSchema),
13589
+ dirty: array$2(LocalProjectWorktreeCleanupItemSchema),
13590
+ failed: array$2(LocalProjectWorktreeCleanupFailureSchema)
13591
+ }).strict();
13555
13592
  const LocalProjectControlErrorCodeSchema = _enum$1([
13556
13593
  "invalid_request",
13557
13594
  "machine_mismatch",
@@ -13572,6 +13609,7 @@ Requirements:
13572
13609
  "local-project/list-roots",
13573
13610
  "local-project/browse-dir",
13574
13611
  "local-project/delete",
13612
+ "local-project/removal-preflight",
13575
13613
  "local-project/list",
13576
13614
  "local-project/git-state",
13577
13615
  "local-project/list-files",
@@ -13635,6 +13673,11 @@ Requirements:
13635
13673
  workspaceIds: array$2(WorkspaceIdSchema)
13636
13674
  }).strict()
13637
13675
  }).strict(),
13676
+ object$1({
13677
+ ok: literal$1(true),
13678
+ type: literal$1("local-project/removal-preflight"),
13679
+ result: LocalProjectWorktreeCleanupPreflightResultSchema
13680
+ }).strict(),
13638
13681
  object$1({
13639
13682
  ok: literal$1(true),
13640
13683
  type: literal$1("local-project/list"),
@@ -14531,12 +14574,12 @@ Requirements:
14531
14574
  {
14532
14575
  id: "auggie",
14533
14576
  name: "Auggie CLI",
14534
- version: "0.35.0",
14577
+ version: "0.36.0",
14535
14578
  description: "Augment Code's powerful software agent, backed by industry-leading context engine",
14536
14579
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/auggie.svg",
14537
14580
  distribution: {
14538
14581
  npx: {
14539
- package: "@augmentcode/auggie@0.35.0",
14582
+ package: "@augmentcode/auggie@0.36.0",
14540
14583
  args: [
14541
14584
  "--acp"
14542
14585
  ],
@@ -14561,12 +14604,12 @@ Requirements:
14561
14604
  {
14562
14605
  id: "cline",
14563
14606
  name: "Cline",
14564
- version: "3.0.55",
14607
+ version: "3.0.60",
14565
14608
  description: "Autonomous coding agent CLI - capable of creating/editing files, running commands, using the browser, and more",
14566
14609
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/cline.svg",
14567
14610
  distribution: {
14568
14611
  npx: {
14569
- package: "cline@3.0.55",
14612
+ package: "cline@3.0.60",
14570
14613
  args: [
14571
14614
  "--acp"
14572
14615
  ]
@@ -14576,12 +14619,12 @@ Requirements:
14576
14619
  {
14577
14620
  id: "codebuddy-code",
14578
14621
  name: "Codebuddy Code",
14579
- version: "2.137.1",
14622
+ version: "2.140.0",
14580
14623
  description: "Tencent Cloud's official intelligent coding tool",
14581
14624
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/codebuddy-code.svg",
14582
14625
  distribution: {
14583
14626
  npx: {
14584
- package: "@tencent-ai/codebuddy-code@2.137.1",
14627
+ package: "@tencent-ai/codebuddy-code@2.140.0",
14585
14628
  args: [
14586
14629
  "--acp"
14587
14630
  ]
@@ -14753,48 +14796,48 @@ Requirements:
14753
14796
  {
14754
14797
  id: "devin",
14755
14798
  name: "Devin",
14756
- version: "3000.4.25",
14799
+ version: "3000.6.2",
14757
14800
  description: "Devin CLI coding agent by Cognition",
14758
14801
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/devin.svg",
14759
14802
  distribution: {
14760
14803
  binary: {
14761
14804
  "darwin-aarch64": {
14762
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-aarch64-apple-darwin.tar.gz",
14805
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-aarch64-apple-darwin.tar.gz",
14763
14806
  cmd: "./bin/devin",
14764
14807
  args: [
14765
14808
  "acp"
14766
14809
  ]
14767
14810
  },
14768
14811
  "darwin-x86_64": {
14769
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-x86_64-apple-darwin.tar.gz",
14812
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-x86_64-apple-darwin.tar.gz",
14770
14813
  cmd: "./bin/devin",
14771
14814
  args: [
14772
14815
  "acp"
14773
14816
  ]
14774
14817
  },
14775
14818
  "linux-aarch64": {
14776
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-aarch64-unknown-linux.tar.gz",
14819
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-aarch64-unknown-linux.tar.gz",
14777
14820
  cmd: "./bin/devin",
14778
14821
  args: [
14779
14822
  "acp"
14780
14823
  ]
14781
14824
  },
14782
14825
  "linux-x86_64": {
14783
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-x86_64-unknown-linux.tar.gz",
14826
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-x86_64-unknown-linux.tar.gz",
14784
14827
  cmd: "./bin/devin",
14785
14828
  args: [
14786
14829
  "acp"
14787
14830
  ]
14788
14831
  },
14789
14832
  "windows-aarch64": {
14790
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-aarch64-pc-windows.zip",
14833
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-aarch64-pc-windows.zip",
14791
14834
  cmd: "./bin\\devin.exe",
14792
14835
  args: [
14793
14836
  "acp"
14794
14837
  ]
14795
14838
  },
14796
14839
  "windows-x86_64": {
14797
- archive: "https://static.devin.ai/cli/3000.4.25/devin-3000.4.25-x86_64-pc-windows.zip",
14840
+ archive: "https://static.devin.ai/cli/3000.6.2/devin-3000.6.2-x86_64-pc-windows.zip",
14798
14841
  cmd: "./bin\\devin.exe",
14799
14842
  args: [
14800
14843
  "acp"
@@ -14806,12 +14849,12 @@ Requirements:
14806
14849
  {
14807
14850
  id: "dimcode",
14808
14851
  name: "DimCode",
14809
- version: "0.3.17",
14852
+ version: "0.3.21",
14810
14853
  description: "A coding agent that puts leading models at your command.",
14811
14854
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/dimcode.svg",
14812
14855
  distribution: {
14813
14856
  npx: {
14814
- package: "dimcode@0.3.17",
14857
+ package: "dimcode@0.3.21",
14815
14858
  args: [
14816
14859
  "acp"
14817
14860
  ]
@@ -14821,12 +14864,12 @@ Requirements:
14821
14864
  {
14822
14865
  id: "dirac",
14823
14866
  name: "Dirac",
14824
- version: "0.4.37",
14867
+ version: "0.5.1",
14825
14868
  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.",
14826
14869
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/dirac.svg",
14827
14870
  distribution: {
14828
14871
  npx: {
14829
- package: "dirac-cli@0.4.37",
14872
+ package: "dirac-cli@0.5.1",
14830
14873
  args: [
14831
14874
  "--acp"
14832
14875
  ]
@@ -14836,12 +14879,12 @@ Requirements:
14836
14879
  {
14837
14880
  id: "factory-droid",
14838
14881
  name: "Factory Droid",
14839
- version: "0.200.0",
14882
+ version: "0.205.1",
14840
14883
  description: "Factory Droid - AI coding agent powered by Factory AI",
14841
14884
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/factory-droid.svg",
14842
14885
  distribution: {
14843
14886
  npx: {
14844
- package: "droid@0.200.0",
14887
+ package: "droid@0.205.1",
14845
14888
  args: [
14846
14889
  "exec",
14847
14890
  "--output-format",
@@ -14875,12 +14918,12 @@ Requirements:
14875
14918
  {
14876
14919
  id: "gemini",
14877
14920
  name: "Gemini CLI",
14878
- version: "0.56.0",
14921
+ version: "0.57.0",
14879
14922
  description: "Google's official CLI for Gemini",
14880
14923
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/gemini.svg",
14881
14924
  distribution: {
14882
14925
  npx: {
14883
- package: "@google/gemini-cli@0.56.0",
14926
+ package: "@google/gemini-cli@0.57.0",
14884
14927
  args: [
14885
14928
  "--acp"
14886
14929
  ]
@@ -14890,12 +14933,12 @@ Requirements:
14890
14933
  {
14891
14934
  id: "github-copilot-cli",
14892
14935
  name: "GitHub Copilot",
14893
- version: "1.0.80",
14936
+ version: "1.0.81",
14894
14937
  description: "GitHub's AI pair programmer",
14895
14938
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/github-copilot-cli.svg",
14896
14939
  distribution: {
14897
14940
  npx: {
14898
- package: "@github/copilot@1.0.80",
14941
+ package: "@github/copilot@1.0.81",
14899
14942
  args: [
14900
14943
  "--acp"
14901
14944
  ]
@@ -14905,19 +14948,19 @@ Requirements:
14905
14948
  {
14906
14949
  id: "glm-acp-agent",
14907
14950
  name: "GLM Agent",
14908
- version: "1.6.0",
14951
+ version: "1.6.1",
14909
14952
  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.",
14910
14953
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/glm-acp-agent.svg",
14911
14954
  distribution: {
14912
14955
  npx: {
14913
- package: "glm-acp-agent@1.6.0"
14956
+ package: "glm-acp-agent@1.6.1"
14914
14957
  }
14915
14958
  }
14916
14959
  },
14917
14960
  {
14918
14961
  id: "goose",
14919
14962
  name: "goose",
14920
- version: "1.46.0",
14963
+ version: "1.48.0",
14921
14964
  description: "A local, extensible, open source AI agent that automates engineering tasks",
14922
14965
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/goose.svg",
14923
14966
  distribution: {
@@ -14935,13 +14978,13 @@ Requirements:
14935
14978
  {
14936
14979
  id: "harn",
14937
14980
  name: "Harn",
14938
- version: "0.10.108",
14981
+ version: "0.10.118",
14939
14982
  description: "Harn runs .harn agent pipelines as a native ACP coding agent over stdio.",
14940
14983
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/harn.svg",
14941
14984
  distribution: {
14942
14985
  binary: {
14943
14986
  "darwin-aarch64": {
14944
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.108/harn-aarch64-apple-darwin.tar.gz",
14987
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.118/harn-aarch64-apple-darwin.tar.gz",
14945
14988
  cmd: "./harn",
14946
14989
  args: [
14947
14990
  "serve",
@@ -14949,7 +14992,7 @@ Requirements:
14949
14992
  ]
14950
14993
  },
14951
14994
  "darwin-x86_64": {
14952
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.108/harn-x86_64-apple-darwin.tar.gz",
14995
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.118/harn-x86_64-apple-darwin.tar.gz",
14953
14996
  cmd: "./harn",
14954
14997
  args: [
14955
14998
  "serve",
@@ -14957,7 +15000,7 @@ Requirements:
14957
15000
  ]
14958
15001
  },
14959
15002
  "linux-aarch64": {
14960
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.108/harn-aarch64-unknown-linux-gnu.tar.gz",
15003
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.118/harn-aarch64-unknown-linux-gnu.tar.gz",
14961
15004
  cmd: "./harn",
14962
15005
  args: [
14963
15006
  "serve",
@@ -14965,7 +15008,7 @@ Requirements:
14965
15008
  ]
14966
15009
  },
14967
15010
  "linux-x86_64": {
14968
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.108/harn-x86_64-unknown-linux-gnu.tar.gz",
15011
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.118/harn-x86_64-unknown-linux-gnu.tar.gz",
14969
15012
  cmd: "./harn",
14970
15013
  args: [
14971
15014
  "serve",
@@ -14973,7 +15016,7 @@ Requirements:
14973
15016
  ]
14974
15017
  },
14975
15018
  "windows-x86_64": {
14976
- archive: "https://github.com/burin-labs/harn/releases/download/v0.10.108/harn-x86_64-pc-windows-msvc.zip",
15019
+ archive: "https://github.com/burin-labs/harn/releases/download/v0.10.118/harn-x86_64-pc-windows-msvc.zip",
14977
15020
  cmd: "harn.exe",
14978
15021
  args: [
14979
15022
  "serve",
@@ -14986,7 +15029,7 @@ Requirements:
14986
15029
  {
14987
15030
  id: "junie",
14988
15031
  name: "Junie",
14989
- version: "2913.6.0",
15032
+ version: "3032.2.0",
14990
15033
  description: "AI Coding Agent by JetBrains",
14991
15034
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/junie.svg",
14992
15035
  distribution: {
@@ -15004,47 +15047,47 @@ Requirements:
15004
15047
  {
15005
15048
  id: "kilo",
15006
15049
  name: "Kilo",
15007
- version: "7.4.23",
15050
+ version: "7.5.5",
15008
15051
  description: "The open source coding agent",
15009
15052
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/kilo.svg",
15010
15053
  distribution: {
15011
15054
  npx: {
15012
- package: "@kilocode/cli@7.4.23",
15055
+ package: "@kilocode/cli@7.5.5",
15013
15056
  args: [
15014
15057
  "acp"
15015
15058
  ]
15016
15059
  },
15017
15060
  binary: {
15018
15061
  "darwin-aarch64": {
15019
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.23/kilo-darwin-arm64.zip",
15062
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.5.5/kilo-darwin-arm64.zip",
15020
15063
  cmd: "./kilo",
15021
15064
  args: [
15022
15065
  "acp"
15023
15066
  ]
15024
15067
  },
15025
15068
  "darwin-x86_64": {
15026
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.23/kilo-darwin-x64.zip",
15069
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.5.5/kilo-darwin-x64.zip",
15027
15070
  cmd: "./kilo",
15028
15071
  args: [
15029
15072
  "acp"
15030
15073
  ]
15031
15074
  },
15032
15075
  "linux-aarch64": {
15033
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.23/kilo-linux-arm64.tar.gz",
15076
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.5.5/kilo-linux-arm64.tar.gz",
15034
15077
  cmd: "./kilo",
15035
15078
  args: [
15036
15079
  "acp"
15037
15080
  ]
15038
15081
  },
15039
15082
  "linux-x86_64": {
15040
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.23/kilo-linux-x64.tar.gz",
15083
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.5.5/kilo-linux-x64.tar.gz",
15041
15084
  cmd: "./kilo",
15042
15085
  args: [
15043
15086
  "acp"
15044
15087
  ]
15045
15088
  },
15046
15089
  "windows-x86_64": {
15047
- archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.23/kilo-windows-x64.zip",
15090
+ archive: "https://github.com/Kilo-Org/kilocode/releases/download/v7.5.5/kilo-windows-x64.zip",
15048
15091
  cmd: "./kilo.exe",
15049
15092
  args: [
15050
15093
  "acp"
@@ -15126,12 +15169,12 @@ Requirements:
15126
15169
  {
15127
15170
  id: "nova",
15128
15171
  name: "Nova",
15129
- version: "1.1.35",
15172
+ version: "1.1.37",
15130
15173
  description: "Nova by Compass AI - a fully-fledged software engineer at your command",
15131
15174
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/nova.svg",
15132
15175
  distribution: {
15133
15176
  npx: {
15134
- package: "@compass-ai/nova@1.1.35",
15177
+ package: "@compass-ai/nova@1.1.37",
15135
15178
  args: [
15136
15179
  "acp"
15137
15180
  ]
@@ -15141,7 +15184,7 @@ Requirements:
15141
15184
  {
15142
15185
  id: "opencode",
15143
15186
  name: "OpenCode",
15144
- version: "1.18.19",
15187
+ version: "1.18.23",
15145
15188
  description: "The open source coding agent",
15146
15189
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/opencode.svg",
15147
15190
  distribution: {
@@ -15239,12 +15282,12 @@ Requirements:
15239
15282
  {
15240
15283
  id: "qwen-code",
15241
15284
  name: "Qwen Code",
15242
- version: "0.21.15",
15285
+ version: "0.22.2",
15243
15286
  description: "Alibaba's Qwen coding assistant",
15244
15287
  icon: "https://cdn.agentclientprotocol.com/registry/v1/latest/qwen-code.svg",
15245
15288
  distribution: {
15246
15289
  npx: {
15247
- package: "@qwen-code/qwen-code@0.21.15",
15290
+ package: "@qwen-code/qwen-code@0.22.2",
15248
15291
  args: [
15249
15292
  "--acp",
15250
15293
  "--experimental-skills"
@@ -17920,14 +17963,29 @@ ${outputTail}` : blockTail.output;
17920
17963
  };
17921
17964
  function extractAskUserQuestionAnswersFromOutcome(meta, outcome) {
17922
17965
  if (!outcome || !isRecord$b(outcome._meta)) return null;
17923
- const rawAnswers = meta.source === "lody" ? getLodyOutcomeAnswers(outcome._meta) : meta.source === "codex" ? getCodexOutcomeAnswers(outcome._meta) : getClaudeOutcomeAnswers(outcome._meta);
17924
- if (!rawAnswers) return null;
17966
+ const answerSources = [
17967
+ {
17968
+ source: "lody",
17969
+ answers: getLodyOutcomeAnswers(outcome._meta)
17970
+ },
17971
+ {
17972
+ source: "codex",
17973
+ answers: getCodexOutcomeAnswers(outcome._meta)
17974
+ },
17975
+ {
17976
+ source: "claude",
17977
+ answers: getClaudeOutcomeAnswers(outcome._meta)
17978
+ }
17979
+ ];
17980
+ const answerSource = answerSources.find(({ answers }) => answers !== null);
17981
+ if (!answerSource?.answers) return null;
17925
17982
  const result = {};
17926
17983
  for (const [index, question] of meta.questions.entries()) {
17927
17984
  const key2 = getAskUserQuestionAnswerKey(meta.questions, index);
17928
- const raw2 = rawAnswers[key2];
17985
+ const sourceKey = answerSource.source === "claude" ? getAskUserQuestionAnswerKey(meta.questions.map(({ id: _id, ...item }) => item), index) : key2;
17986
+ const raw2 = answerSource.answers[sourceKey];
17929
17987
  if (raw2 === void 0) continue;
17930
- if (meta.source === "codex") {
17988
+ if (answerSource.source === "codex") {
17931
17989
  if (!isRecord$b(raw2)) continue;
17932
17990
  const inner = raw2.answers;
17933
17991
  if (!Array.isArray(inner)) continue;
@@ -20609,10 +20667,13 @@ ${tailedOutput}` : null;
20609
20667
  return parsed;
20610
20668
  };
20611
20669
  const MACHINE_PROTOCOL_CAPABILITIES = {
20670
+ localProjectRemoval: "localProjectRemoval",
20612
20671
  providerSetup: "providerSetup"
20613
20672
  };
20673
+ const LOCAL_PROJECT_REMOVAL_PROTOCOL_VERSION = 1;
20614
20674
  const PROVIDER_SETUP_PROTOCOL_VERSION = 1;
20615
20675
  const CURRENT_MACHINE_PROTOCOL_CAPABILITIES = {
20676
+ [MACHINE_PROTOCOL_CAPABILITIES.localProjectRemoval]: LOCAL_PROJECT_REMOVAL_PROTOCOL_VERSION,
20616
20677
  [MACHINE_PROTOCOL_CAPABILITIES.providerSetup]: PROVIDER_SETUP_PROTOCOL_VERSION
20617
20678
  };
20618
20679
  const isLoroRepoDocDeleted = (value) => {
@@ -23875,8 +23936,65 @@ ${context2.authorReply.trim()}
23875
23936
  }
23876
23937
  command2.requestedBy = value.requestedBy;
23877
23938
  }
23939
+ if (!isMissing(value.projectName)) {
23940
+ if (typeof value.projectName !== "string") return void 0;
23941
+ command2.projectName = value.projectName;
23942
+ }
23943
+ if (!isMissing(value.originalRootPath)) {
23944
+ if (typeof value.originalRootPath !== "string") return void 0;
23945
+ command2.originalRootPath = value.originalRootPath;
23946
+ }
23947
+ if (!isMissing(value.cleanupWorktrees)) {
23948
+ if (value.cleanupWorktrees !== true) return void 0;
23949
+ command2.cleanupWorktrees = true;
23950
+ }
23951
+ if (!isMissing(value.status)) {
23952
+ if (value.status !== "completed") return void 0;
23953
+ command2.status = "completed";
23954
+ }
23955
+ if (!isMissing(value.cleanupResult)) {
23956
+ const result = normalizeLocalProjectWorktreeCleanupResult(value.cleanupResult);
23957
+ if (!result) return void 0;
23958
+ command2.cleanupResult = result;
23959
+ }
23878
23960
  return command2;
23879
23961
  };
23962
+ const normalizeLocalProjectWorktreeCleanupItem = (value) => {
23963
+ if (!isRecord$8(value)) return void 0;
23964
+ if (typeof value.sessionId !== "string") return void 0;
23965
+ if (typeof value.title !== "string") return void 0;
23966
+ if (typeof value.path !== "string") return void 0;
23967
+ return {
23968
+ sessionId: value.sessionId,
23969
+ title: value.title,
23970
+ path: value.path
23971
+ };
23972
+ };
23973
+ const normalizeLocalProjectWorktreeCleanupResult = (value) => {
23974
+ if (!isRecord$8(value) || typeof value.completedAt !== "number") return void 0;
23975
+ if (!Array.isArray(value.deleted)) return void 0;
23976
+ if (!Array.isArray(value.skippedDirty)) return void 0;
23977
+ if (!Array.isArray(value.failed)) return void 0;
23978
+ const deleted = value.deleted.map(normalizeLocalProjectWorktreeCleanupItem);
23979
+ const skippedDirty = value.skippedDirty.map(normalizeLocalProjectWorktreeCleanupItem);
23980
+ const failed = value.failed.map((entry) => {
23981
+ const item = normalizeLocalProjectWorktreeCleanupItem(entry);
23982
+ if (!item || !isRecord$8(entry) || typeof entry.message !== "string") return void 0;
23983
+ return {
23984
+ ...item,
23985
+ message: entry.message
23986
+ };
23987
+ });
23988
+ if (deleted.includes(void 0)) return void 0;
23989
+ if (skippedDirty.includes(void 0)) return void 0;
23990
+ if (failed.includes(void 0)) return void 0;
23991
+ return {
23992
+ completedAt: value.completedAt,
23993
+ deleted,
23994
+ skippedDirty,
23995
+ failed
23996
+ };
23997
+ };
23880
23998
  const normalizeLocalProjectMeta = (value) => {
23881
23999
  if (!isRecord$8(value) || !isNonEmptyString$2(value.id) || !isNonEmptyString$2(value.name) || !isNonEmptyString$2(value.rootPath) || typeof value.createdAtMs !== "number") {
23882
24000
  return void 0;
@@ -74126,6 +74244,7 @@ ${val.stack}`;
74126
74244
  return repo;
74127
74245
  }
74128
74246
  async ready() {
74247
+ await this.syncRunner.ensureMetaLiveMonitor();
74129
74248
  if (this.metaPersister) {
74130
74249
  const version2 = this.metaFlock.version();
74131
74250
  this.metaPersister.start(version2);
@@ -104223,14 +104342,14 @@ ${value}`;
104223
104342
  }
104224
104343
  await this.machine.updateRateLimits(cliType, limits);
104225
104344
  }
104226
- async updateAcpCapabilities(machineId, configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, options = {}) {
104345
+ async updateAcpCapabilities(machineId, configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, acknowledgedSteer = false, options = {}) {
104227
104346
  options.signal?.throwIfAborted();
104228
104347
  if (!this.machine) {
104229
104348
  this.machine = this.createMachineDocument(machineId);
104230
104349
  await this.machine.init();
104231
104350
  }
104232
104351
  options.signal?.throwIfAborted();
104233
- await this.machine.updateAcpCapabilities(configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, options);
104352
+ await this.machine.updateAcpCapabilities(configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, acknowledgedSteer, options);
104234
104353
  }
104235
104354
  async getAcpCapabilities(machineId, configId) {
104236
104355
  if (!this.machine) {
@@ -104410,6 +104529,7 @@ ${value}`;
104410
104529
  this.mirror = new Mirror({
104411
104530
  doc: handle.doc,
104412
104531
  schema: sessionDocSchema,
104532
+ ignoreUnknownProperties: true,
104413
104533
  initialState: merged
104414
104534
  });
104415
104535
  this.historyAutoReadHandle = attachAutoMarkLatestUserHistoryAsRead(this.mirror);
@@ -105336,6 +105456,7 @@ ${value}`;
105336
105456
  configOptions: entry.configOptions,
105337
105457
  availableCommands: entry.availableCommands,
105338
105458
  sessionFork: entry.sessionFork,
105459
+ acknowledgedSteer: entry.acknowledgedSteer,
105339
105460
  sessionForkWorktree: entry.sessionForkWorktree
105340
105461
  });
105341
105462
  class MachineDocument {
@@ -105391,7 +105512,7 @@ ${value}`;
105391
105512
  }
105392
105513
  });
105393
105514
  }
105394
- async updateAcpCapabilities(configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, options = {}) {
105515
+ async updateAcpCapabilities(configId, cliType, agentType, modes, models, configOptions, availableCommands, sessionFork, sourceVersion, modelReasoningEfforts, acknowledgedSteer = false, options = {}) {
105395
105516
  options.signal?.throwIfAborted();
105396
105517
  const normalizedModes = modes.map((mode2) => ({
105397
105518
  id: mode2.id,
@@ -105414,6 +105535,7 @@ ${value}`;
105414
105535
  configOptions: configOptions?.length ? configOptions : void 0,
105415
105536
  availableCommands: availableCommands?.length ? availableCommands : void 0,
105416
105537
  sessionFork,
105538
+ acknowledgedSteer,
105417
105539
  sessionForkWorktree: sessionFork,
105418
105540
  modelReasoningEfforts: modelReasoningEfforts && Object.keys(modelReasoningEfforts).length > 0 ? modelReasoningEfforts : void 0,
105419
105541
  fetchedAt: getServerNow()
@@ -113545,6 +113667,7 @@ ${incoming}`).output;
113545
113667
  configOptions,
113546
113668
  availableCommands,
113547
113669
  sessionFork: lifecycleCapabilities.sessionFork === true,
113670
+ acknowledgedSteer: lifecycleCapabilities.acknowledgedSteer === true,
113548
113671
  ...modelReasoningEfforts ? {
113549
113672
  modelReasoningEfforts
113550
113673
  } : {}
@@ -114648,7 +114771,8 @@ ${incoming}`).output;
114648
114771
  const toolCallId = typeof params.toolCallId === "string" ? params.toolCallId : void 0;
114649
114772
  const requestId = randomUUID$1();
114650
114773
  const firstQuestion = elicitation.meta.questions[0];
114651
- const autoResolveAtEpochSeconds = typeof elicitation.autoResolutionMs === "number" && Number.isFinite(elicitation.autoResolutionMs) ? Math.floor((getServerNow() + Math.max(0, elicitation.autoResolutionMs)) / 1e3) : void 0;
114774
+ const autoResolveAt = typeof elicitation.autoResolutionMs === "number" && Number.isFinite(elicitation.autoResolutionMs) ? getServerNow() + Math.max(0, elicitation.autoResolutionMs) : void 0;
114775
+ const autoResolveAtEpochSeconds = autoResolveAt === void 0 ? void 0 : Math.floor(autoResolveAt / 1e3);
114652
114776
  const lodyElicitation = {
114653
114777
  version: 1,
114654
114778
  questions: elicitation.meta.questions,
@@ -114656,6 +114780,27 @@ ${incoming}`).output;
114656
114780
  autoResolveAtEpochSeconds
114657
114781
  } : {}
114658
114782
  };
114783
+ const legacyQuestionMeta = this.options.agentConfig?.agentType === "codex" ? {
114784
+ codex: {
114785
+ requestUserInput: {
114786
+ version: 1,
114787
+ allowCustomAnswer: elicitation.meta.allowCustomAnswer,
114788
+ questions: elicitation.meta.questions,
114789
+ ...autoResolveAt !== void 0 ? {
114790
+ autoResolveAt
114791
+ } : {}
114792
+ }
114793
+ }
114794
+ } : this.options.agentConfig?.agentType === "claude" ? {
114795
+ claudeCode: {
114796
+ requestType: "askUserQuestion",
114797
+ askUserQuestion: {
114798
+ version: 1,
114799
+ allowCustomAnswer: elicitation.meta.allowCustomAnswer,
114800
+ questions: elicitation.meta.questions
114801
+ }
114802
+ }
114803
+ } : {};
114659
114804
  const syntheticRequest = {
114660
114805
  sessionId,
114661
114806
  toolCall: {
@@ -114682,7 +114827,8 @@ ${incoming}`).output;
114682
114827
  _meta: {
114683
114828
  lody: {
114684
114829
  elicitation: lodyElicitation
114685
- }
114830
+ },
114831
+ ...legacyQuestionMeta
114686
114832
  }
114687
114833
  };
114688
114834
  this.logger.debug(`[${this.options.sessionId}] Bridging AskUserQuestion elicitation (toolCallId=${toolCallId ?? "<none>"}, questions=${elicitation.meta.questions.length})`);
@@ -129191,7 +129337,8 @@ ${fallbackStderrTail}` : errorMessage2;
129191
129337
  try {
129192
129338
  return {
129193
129339
  ...normalizeAcpSessionCapabilities(sessionResponse, {
129194
- sessionFork: client2.supportsSessionFork?.() === true
129340
+ sessionFork: client2.supportsSessionFork?.() === true,
129341
+ acknowledgedSteer: client2.supportsAcknowledgedSteer()
129195
129342
  }),
129196
129343
  capabilitySourceVersion
129197
129344
  };
@@ -131453,6 +131600,32 @@ path=/${options.repoFullName}.git
131453
131600
  isClean
131454
131601
  };
131455
131602
  }
131603
+ async inspectWorktree(sessionId) {
131604
+ return withRepoLock(this.repoId, async () => {
131605
+ assertSafeSessionId(sessionId);
131606
+ const worktreePath = this.getWorktreeHostPath(sessionId);
131607
+ if (!fs.existsSync(worktreePath)) {
131608
+ return {
131609
+ state: "missing",
131610
+ path: worktreePath
131611
+ };
131612
+ }
131613
+ try {
131614
+ const info = await this.getWorktreeInfo(sessionId);
131615
+ return {
131616
+ state: info.isClean ? "clean" : "dirty",
131617
+ path: worktreePath,
131618
+ info
131619
+ };
131620
+ } catch (error2) {
131621
+ return {
131622
+ state: "failed",
131623
+ path: worktreePath,
131624
+ message: error2 instanceof Error ? error2.message : String(error2)
131625
+ };
131626
+ }
131627
+ });
131628
+ }
131456
131629
  async removeWorktree(sessionId, force = false, branchName, options) {
131457
131630
  return withRepoLock(this.repoId, async () => {
131458
131631
  const resolvedBranchName = await this.removeWorktreeInternal(sessionId, {
@@ -131552,7 +131725,10 @@ path=/${options.repoFullName}.git
131552
131725
  ];
131553
131726
  if (options.force) args2.splice(2, 0, "--force");
131554
131727
  await this.runGit(args2, this.getGitAdminCwd());
131555
- } catch {
131728
+ } catch (error2) {
131729
+ if (!options.force) {
131730
+ throw error2;
131731
+ }
131556
131732
  this.logger.debug(`[${this.repoId}] git worktree remove failed, removing directory manually`);
131557
131733
  fs.rmSync(worktreePath, {
131558
131734
  recursive: true,
@@ -132895,6 +133071,9 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
132895
133071
  function shouldApplyMachineDeleteLocalProjectCommand(project, command2) {
132896
133072
  return project.createdAtMs <= command2.requestedAt;
132897
133073
  }
133074
+ function isSessionInLocalProjectRemovalScope(session2, target) {
133075
+ return session2.machineId === target.machineId && session2.project?.kind === "local" && session2.project.localProjectId === target.localProjectId;
133076
+ }
132898
133077
  function readLegacyMachineLocalProjects(machineMeta) {
132899
133078
  const localProjects = machineMeta?.localProjects;
132900
133079
  if (!localProjects || typeof localProjects !== "object") {
@@ -136258,7 +136437,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
136258
136437
  });
136259
136438
  const existing = await this.deps.workspaceDocument.getAcpCapabilities(this.deps.machineId, agentConfigId);
136260
136439
  const availableCommands = capabilities.availableCommands !== void 0 ? capabilities.availableCommands : existing?.sourceVersion === sourceVersion ? existing.availableCommands : void 0;
136261
- await this.deps.workspaceDocument.updateAcpCapabilities(this.deps.machineId, agentConfigId, config2.agentCliType, config2.agentType, capabilities.modes, capabilities.models, capabilities.configOptions, availableCommands, capabilities.sessionFork, sourceVersion, capabilities.modelReasoningEfforts);
136440
+ await this.deps.workspaceDocument.updateAcpCapabilities(this.deps.machineId, agentConfigId, config2.agentCliType, config2.agentType, capabilities.modes, capabilities.models, capabilities.configOptions, availableCommands, capabilities.sessionFork, sourceVersion, capabilities.modelReasoningEfforts, capabilities.acknowledgedSteer);
136262
136441
  })().catch((error2) => {
136263
136442
  this.deps.logger.debug(`[${session2.sessionId}] Failed to update ACP capabilities from created session: ${formatErrorMessage(error2)}`);
136264
136443
  });
@@ -136432,7 +136611,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
136432
136611
  options.signal?.throwIfAborted();
136433
136612
  await this.emitBuiltinRuntimeStatusForRefresh(message, options.onAcpBinaryProgress);
136434
136613
  options.signal?.throwIfAborted();
136435
- const { modes, models, configOptions, availableCommands, sessionFork, modelReasoningEfforts, capabilitySourceVersion } = await this.deps.fetchAcpCapabilities(message.cliType, message.agentType, message.env, message.customAcp, message.runtimeOverrides, {
136614
+ const { modes, models, configOptions, availableCommands, sessionFork, acknowledgedSteer, modelReasoningEfforts, capabilitySourceVersion } = await this.deps.fetchAcpCapabilities(message.cliType, message.agentType, message.env, message.customAcp, message.runtimeOverrides, {
136436
136615
  signal: options.signal,
136437
136616
  onManagedRuntimeProgress: (event) => {
136438
136617
  if (options.signal?.aborted) return;
@@ -136445,7 +136624,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
136445
136624
  agentType: message.agentType,
136446
136625
  customAcp: message.customAcp,
136447
136626
  runtimeOverrides: message.runtimeOverrides
136448
- }), modelReasoningEfforts, {
136627
+ }), modelReasoningEfforts, acknowledgedSteer, {
136449
136628
  signal: options.signal
136450
136629
  });
136451
136630
  return {
@@ -137254,18 +137433,21 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
137254
137433
  }
137255
137434
  }
137256
137435
  }
137257
- peekStashedRpcTurn(sessionId, meta) {
137436
+ peekStashedRpcTurn(sessionId, meta, history = []) {
137258
137437
  const stash = this.rpcTurnStash.get(sessionId);
137259
137438
  if (!stash) {
137260
137439
  return null;
137261
137440
  }
137262
137441
  const now2 = Date.now();
137263
137442
  for (const [userTurnId, stashed] of stash) {
137264
- const isTerminal2 = meta.lastHandledUserMsgId === userTurnId || this.deps.executionService.getTerminalUserTurnStatusWithoutEntry?.(sessionId, userTurnId) !== void 0;
137443
+ const isTerminal2 = meta.lastHandledUserMsgId === userTurnId || this.deps.executionService.getTerminalUserTurnStatusWithoutEntry?.(sessionId, userTurnId) !== void 0 || history.some((entry) => entry.id === userTurnId && entry.role === "user" && (entry.status === "handled" || entry.status === "failed" || entry.status === "canceled"));
137265
137444
  if (stashed.expiresAtMs <= now2 || isTerminal2) {
137266
137445
  stash.delete(userTurnId);
137267
137446
  continue;
137268
137447
  }
137448
+ if (userTurnId === meta.lastMissingHistoryUserMsgId) {
137449
+ continue;
137450
+ }
137269
137451
  this.turnSourceHints.set(`${sessionId}:${userTurnId}`, "rpc");
137270
137452
  return stashed.entry;
137271
137453
  }
@@ -138219,7 +138401,8 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
138219
138401
  if (!isActive()) {
138220
138402
  return null;
138221
138403
  }
138222
- this.deps.logger.debug(`[${sessionId}] Pending user turn metadata is visible but history is missing it; waiting up to ${SessionDispatchWatcher.HISTORY_SYNC_WAIT_TIMEOUT_MS / 1e3}s for history CRDT sync`);
138404
+ const pendingUserTurnId = getPendingUserTurnActivationId(meta);
138405
+ this.deps.logger.debug(`[${sessionId}] Pending user turn ${getPendingUserTurnActivationId(meta) ?? "unknown"} metadata is visible but history is missing it; waiting up to ${SessionDispatchWatcher.HISTORY_SYNC_WAIT_TIMEOUT_MS / 1e3}s for history CRDT sync (pendingUserMsgId=${pendingUserTurnId ?? "unknown"})`);
138223
138406
  return await new Promise((resolve2) => {
138224
138407
  let settled = false;
138225
138408
  let currentMeta = meta;
@@ -138349,7 +138532,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
138349
138532
  }
138350
138533
  };
138351
138534
  timer2 = SessionDispatchWatcher.setUnrefTimeout(() => {
138352
- this.deps.logger.warn(`[${sessionId}] User turn did not arrive in history after ${SessionDispatchWatcher.HISTORY_SYNC_WAIT_TIMEOUT_MS / 1e3}s; entering dispatch recovery`);
138535
+ this.deps.logger.warn(`[${sessionId}] User turn ${pendingUserTurnId ?? "unknown"} did not arrive in history after ${SessionDispatchWatcher.HISTORY_SYNC_WAIT_TIMEOUT_MS / 1e3}s; entering dispatch recovery`);
138353
138536
  finish(null);
138354
138537
  }, SessionDispatchWatcher.HISTORY_SYNC_WAIT_TIMEOUT_MS);
138355
138538
  progressTimer = setInterval(() => {
@@ -138359,7 +138542,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
138359
138542
  }
138360
138543
  return;
138361
138544
  }
138362
- this.deps.logger.warn(`[${sessionId}] Still waiting for pending user turn history sync (elapsed=${Date.now() - waitStartedAt}ms docRoom=${sessionDoc.getDocRoomStatus() ?? "unknown"})`);
138545
+ this.deps.logger.warn(`[${sessionId}] Still waiting for pending user turn history sync (pendingUserMsgId=${pendingUserTurnId ?? "unknown"} elapsed=${Date.now() - waitStartedAt}ms docRoom=${sessionDoc.getDocRoomStatus() ?? "unknown"})`);
138363
138546
  }, SessionDispatchWatcher.HISTORY_SYNC_PROGRESS_LOG_MS);
138364
138547
  progressTimer.unref?.();
138365
138548
  if (!isActive()) {
@@ -138437,7 +138620,9 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
138437
138620
  if (pendingUserMsgId) {
138438
138621
  recoveryPatch.lastMissingHistoryUserMsgId = pendingUserMsgId;
138439
138622
  }
138623
+ this.deps.logger.warn(`[${sessionId}] Marking missing-history recovery for user turn ${pendingUserMsgId ?? "unknown"} (message_delivery_failed)`);
138440
138624
  await this.deps.workspaceDocument.repo.upsertDocMeta?.(roomId, recoveryPatch);
138625
+ this.deps.logger.info(`[${sessionId}] Recorded missing-history recovery for user turn ${pendingUserMsgId ?? "unknown"}; the turn stays undispatchable until the user explicitly redelivers it`);
138441
138626
  if (this.deps.recordChatFailure) {
138442
138627
  try {
138443
138628
  await this.deps.recordChatFailure(sessionDoc, "message_delivery_failed", "The user message could not be delivered because its history payload did not sync to this machine. Please resend it after sync recovers.");
@@ -138477,7 +138662,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
138477
138662
  this.turnSourceHints.set(`${meta.id}:${promoted.id}`, "queue");
138478
138663
  return promoted;
138479
138664
  }
138480
- return this.peekStashedRpcTurn(meta.id, meta);
138665
+ return this.peekStashedRpcTurn(meta.id, meta, history);
138481
138666
  }
138482
138667
  async maybeRepairAlreadyHandledTurn(sessionDoc, meta, turn, history) {
138483
138668
  const sessionId = meta.id;
@@ -139876,6 +140061,7 @@ The postId is ${normalizedFeedbackPostId}. Use the feedback-progress-reporter sk
139876
140061
  string$1(),
139877
140062
  boolean()
139878
140063
  ])).optional(),
140064
+ taskToolsEnabled: boolean().optional(),
139879
140065
  inheritSessionDefaults: literal$1(false).optional()
139880
140066
  }).strict().nullable()).optional()
139881
140067
  }).strict();
@@ -151717,6 +151903,7 @@ ${part.truncated ? TRUNCATION_MARKER : ""}${part.content}`).join("\n\n");
151717
151903
  const mirror = new Mirror({
151718
151904
  doc: handle.doc,
151719
151905
  schema: taskDocSchema,
151906
+ ignoreUnknownProperties: true,
151720
151907
  ...options?.seedEmptyDocument ? {
151721
151908
  initialState: emptyTaskDocState(taskId)
151722
151909
  } : {}
@@ -166018,7 +166205,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
166018
166205
  "local-project/set-worktree-cleanup"
166019
166206
  ]);
166020
166207
  function isRemoteLocalProjectControlRequest(request2) {
166021
- return HISTORY_REQUEST_TYPES.has(request2.type) || SETUP_REQUEST_TYPES.has(request2.type);
166208
+ return request2.type === "local-project/removal-preflight" || HISTORY_REQUEST_TYPES.has(request2.type) || SETUP_REQUEST_TYPES.has(request2.type);
166022
166209
  }
166023
166210
  function precheckLocalProjectHistoryRequest(args2) {
166024
166211
  const { request: request2, expectedMachineId, expectedWorkspaceId } = args2;
@@ -166057,6 +166244,91 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
166057
166244
  requesterUserId
166058
166245
  };
166059
166246
  }
166247
+ function getTargetSessions(target) {
166248
+ return target.sessions.filter((session2) => session2.machineId === target.machineId && !session2.parentSessionId && session2.isWorktree === true && session2.project?.kind === "local" && session2.project.localProjectId === target.localProjectId);
166249
+ }
166250
+ function toCleanupItem(session2, path2) {
166251
+ return {
166252
+ sessionId: session2.id,
166253
+ title: session2.title?.trim() || session2.id,
166254
+ path: path2
166255
+ };
166256
+ }
166257
+ function getManager(target) {
166258
+ return getWorktreeManager({
166259
+ repoId: deriveRepoIdFromLocalProjectPath(target.originalRootPath),
166260
+ source: {
166261
+ kind: "local-shared",
166262
+ originalRootPath: target.originalRootPath
166263
+ },
166264
+ logger: target.logger
166265
+ });
166266
+ }
166267
+ async function preflightLocalProjectWorktreeRemoval(target) {
166268
+ const result = {
166269
+ clean: [],
166270
+ dirty: [],
166271
+ failed: []
166272
+ };
166273
+ const manager = getManager(target);
166274
+ for (const session2 of getTargetSessions(target)) {
166275
+ const inspection = await manager.inspectWorktree(session2.id);
166276
+ if (inspection.state === "missing") continue;
166277
+ const item = toCleanupItem(session2, inspection.path);
166278
+ if (inspection.state === "clean") result.clean.push(item);
166279
+ if (inspection.state === "dirty") result.dirty.push(item);
166280
+ if (inspection.state === "failed") {
166281
+ result.failed.push({
166282
+ ...item,
166283
+ message: inspection.message
166284
+ });
166285
+ }
166286
+ }
166287
+ return result;
166288
+ }
166289
+ async function cleanupLocalProjectWorktrees(target) {
166290
+ const result = {
166291
+ completedAt: getServerNow(),
166292
+ deleted: [],
166293
+ skippedDirty: [],
166294
+ failed: []
166295
+ };
166296
+ const manager = getManager(target);
166297
+ for (const session2 of getTargetSessions(target)) {
166298
+ const inspection = await manager.inspectWorktree(session2.id);
166299
+ if (inspection.state === "missing") continue;
166300
+ const item = toCleanupItem(session2, inspection.path);
166301
+ if (inspection.state === "dirty") {
166302
+ result.skippedDirty.push(item);
166303
+ continue;
166304
+ }
166305
+ if (inspection.state === "failed") {
166306
+ result.failed.push({
166307
+ ...item,
166308
+ message: inspection.message
166309
+ });
166310
+ continue;
166311
+ }
166312
+ try {
166313
+ await manager.removeWorktree(session2.id, false, session2.branchName, {
166314
+ baseBranchName: session2.baseBranch
166315
+ });
166316
+ result.deleted.push(item);
166317
+ } catch (error2) {
166318
+ const latest2 = await manager.inspectWorktree(session2.id);
166319
+ if (latest2.state === "dirty") {
166320
+ result.skippedDirty.push(toCleanupItem(session2, latest2.path));
166321
+ } else if (latest2.state !== "missing") {
166322
+ result.failed.push({
166323
+ ...item,
166324
+ message: formatErrorMessage(error2)
166325
+ });
166326
+ }
166327
+ }
166328
+ }
166329
+ result.completedAt = getServerNow();
166330
+ return result;
166331
+ }
166060
166332
  const SESSION_IMAGE_DOWNLOAD_RETRY_DELAYS_MS = [
166061
166333
  250,
166062
166334
  750,
@@ -168787,7 +169059,7 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
168787
169059
  }
168788
169060
  void this.processDeleteLocalProjectRequests();
168789
169061
  }
168790
- async archiveSessionResources(sessionId) {
169062
+ async archiveSessionResources(sessionId, options) {
168791
169063
  this.logger.debug(`[${sessionId}] Archiving session resources`);
168792
169064
  this.clearSessionActivePresence(sessionId);
168793
169065
  this.closeSessionTerminals?.(sessionId);
@@ -168808,55 +169080,58 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
168808
169080
  this.logger.debug(`[${sessionId}] Terminating active session`);
168809
169081
  await this.sessionManager.terminateSession(sessionId, true);
168810
169082
  }
168811
- const cleanupTarget = this.resolveWorktreeCleanupTarget({
168812
- sessionMeta,
168813
- machineMeta: archiveMachineMeta
168814
- });
168815
- if (cleanupTarget) {
168816
- const worktreeManager = getWorktreeManager(this.buildWorktreeManagerConfig(cleanupTarget));
168817
- const worktreePath = worktreeManager.getWorktreeHostPath(sessionId);
168818
- if (fs__default.existsSync(worktreePath)) {
168819
- const sessionDoc = await this.workspaceDocument.getOrCreateSessionDoc(sessionId);
168820
- await runWorktreeCleanup({
168821
- config: await resolveSessionWorktreeCleanupConfig({
168822
- token: this.token,
168823
- workspaceId: this.workspaceId,
168824
- machineId: this.machineId,
168825
- sessionId,
168826
- sessionMeta,
168827
- workspaceDocument: this.workspaceDocument,
168828
- logger: this.logger
168829
- }),
168830
- sessionId,
168831
- workspaceId: this.workspaceId,
168832
- workdir: worktreePath,
168833
- branch: cleanupTarget.branchName ?? sessionMeta?.branchName?.trim() ?? "",
168834
- repoFullName: sessionMeta?.project?.kind === "local" ? void 0 : sessionMeta?.repoFullName,
168835
- localProjectId: sessionMeta?.project?.kind === "local" ? sessionMeta.project.localProjectId : void 0,
168836
- logger: this.logger,
168837
- events: createWorktreeScriptHistoryRecorder({
168838
- sessionDoc,
169083
+ if (!options?.preserveWorktree) {
169084
+ const cleanupTarget = this.resolveWorktreeCleanupTarget({
169085
+ sessionMeta,
169086
+ machineMeta: archiveMachineMeta
169087
+ });
169088
+ if (cleanupTarget) {
169089
+ const worktreeManager = getWorktreeManager(this.buildWorktreeManagerConfig(cleanupTarget));
169090
+ const worktreePath = worktreeManager.getWorktreeHostPath(sessionId);
169091
+ if (fs__default.existsSync(worktreePath)) {
169092
+ const sessionDoc = await this.workspaceDocument.getOrCreateSessionDoc(sessionId);
169093
+ await runWorktreeCleanup({
169094
+ config: await resolveSessionWorktreeCleanupConfig({
169095
+ token: this.token,
169096
+ workspaceId: this.workspaceId,
169097
+ machineId: this.machineId,
169098
+ sessionId,
169099
+ sessionMeta,
169100
+ workspaceDocument: this.workspaceDocument,
169101
+ logger: this.logger
169102
+ }),
168839
169103
  sessionId,
168840
- phase: "cleanup",
168841
- logger: this.logger
168842
- })
168843
- });
168844
- }
168845
- try {
168846
- const archiveResult = await worktreeManager.archiveWorktree(sessionId);
168847
- if (archiveResult.branchName && archiveResult.branchName !== sessionMeta?.branchName?.trim()) {
168848
- await this.workspaceDocument.repo.upsertDocMeta(sessionRoomId, {
168849
- branchName: archiveResult.branchName
169104
+ workspaceId: this.workspaceId,
169105
+ workdir: worktreePath,
169106
+ branch: cleanupTarget.branchName ?? sessionMeta?.branchName?.trim() ?? "",
169107
+ repoFullName: sessionMeta?.project?.kind === "local" ? void 0 : sessionMeta?.repoFullName,
169108
+ localProjectId: sessionMeta?.project?.kind === "local" ? sessionMeta.project.localProjectId : void 0,
169109
+ logger: this.logger,
169110
+ events: createWorktreeScriptHistoryRecorder({
169111
+ sessionDoc,
169112
+ sessionId,
169113
+ phase: "cleanup",
169114
+ logger: this.logger
169115
+ })
168850
169116
  });
168851
169117
  }
168852
- } catch (error2) {
168853
- this.logger.debug(`[${sessionId}] Failed to archive worktree: ${formatErrorMessage(error2)}`);
169118
+ try {
169119
+ const archiveResult = await worktreeManager.archiveWorktree(sessionId);
169120
+ if (archiveResult.branchName && archiveResult.branchName !== sessionMeta?.branchName?.trim()) {
169121
+ await this.workspaceDocument.repo.upsertDocMeta(sessionRoomId, {
169122
+ branchName: archiveResult.branchName
169123
+ });
169124
+ }
169125
+ } catch (error2) {
169126
+ this.logger.debug(`[${sessionId}] Failed to archive worktree: ${formatErrorMessage(error2)}`);
169127
+ }
168854
169128
  }
168855
169129
  }
168856
169130
  await this.sessionManager.archiveSession(sessionId);
168857
169131
  this.logger.debug(`[${sessionId}] Session doc cleaned`);
168858
169132
  await this.workspaceDocument.repo.upsertDocMeta(sessionRoomId, {
168859
- isArchived: true
169133
+ isArchived: true,
169134
+ status: SessionStatusFactory.idle()
168860
169135
  });
168861
169136
  this.logger.debug(`[${sessionId}] Session meta archived`);
168862
169137
  this.store.get(sessionId).logger = null;
@@ -168916,14 +169191,28 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
168916
169191
  }
168917
169192
  this.logger.debug(`[local-project] Processing ${localProjectEntries.length} delete request(s)`);
168918
169193
  for (const [localProjectId, command2] of localProjectEntries) {
169194
+ if (command2.status === "completed") {
169195
+ continue;
169196
+ }
168919
169197
  if (this.deleteLocalProjectInFlight.has(localProjectId)) {
168920
169198
  this.logger.debug(`[local-project] ${localProjectId} already in progress`);
168921
169199
  continue;
168922
169200
  }
168923
169201
  this.deleteLocalProjectInFlight.add(localProjectId);
168924
169202
  try {
168925
- await this.deleteLocalProjectResources(localProjectId, command2);
168926
- await this.removeDeleteLocalProjectRequest(localProjectId);
169203
+ const cleanupResult = await this.deleteLocalProjectResources(localProjectId, command2);
169204
+ if (command2.cleanupWorktrees && cleanupResult) {
169205
+ await this.writeMachineFlockRow({
169206
+ key: machineFlockKeys.deleteLocalProjectCommand(localProjectId),
169207
+ value: {
169208
+ ...command2,
169209
+ status: "completed",
169210
+ cleanupResult
169211
+ }
169212
+ });
169213
+ } else {
169214
+ await this.removeDeleteLocalProjectRequest(localProjectId);
169215
+ }
168927
169216
  } catch (error2) {
168928
169217
  this.logger.error(`[local-project] Failed to delete ${localProjectId}: ${formatErrorMessage(error2)}`);
168929
169218
  } finally {
@@ -168941,56 +169230,68 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
168941
169230
  this.logger.debug(`[local-project] Failed to cleanup worktree setup for ${localProjectId}: ${formatErrorMessage(error2)}`);
168942
169231
  }
168943
169232
  }
168944
- async stopActiveLocalProjectSessions(localProjectId) {
168945
- const sessionIds = [
168946
- ...this.workspaceDocument.sessions.keys()
168947
- ];
168948
- if (sessionIds.length === 0) return;
168949
- let stoppedCount = 0;
168950
- for (const sessionId of sessionIds) {
168951
- try {
168952
- const sessionDoc = await this.workspaceDocument.getOrCreateSessionDoc(sessionId);
168953
- const meta = await sessionDoc.getMetaState();
168954
- if (!meta) continue;
168955
- if (meta.machineId !== this.machineId) continue;
168956
- if (meta.project?.kind !== "local") continue;
168957
- if (meta.project.localProjectId !== localProjectId) continue;
168958
- const hasRunningProcess = this.sessionManager.hasSession(sessionId);
168959
- if (!hasRunningProcess && !isActiveSessionStatus(meta.status)) continue;
168960
- this.clearSessionActivePresence(sessionId);
168961
- this.closeSessionTerminals?.(sessionId);
168962
- await this.finalizeACPState(sessionId);
168963
- if (hasRunningProcess) {
168964
- await this.sessionManager.terminateSession(sessionId, true);
168965
- }
168966
- await sessionDoc.setStatus(SessionStatusFactory.idle());
168967
- stoppedCount += 1;
168968
- } catch (error2) {
168969
- this.logger.debug(`[${sessionId}] Failed to stop active session before local project removal: ${formatErrorMessage(error2)}`);
168970
- }
169233
+ async archiveLocalProjectSessions(localProjectId) {
169234
+ const sessions = (await listAliveSessionMetas(this.workspaceDocument)).filter(({ meta }) => isSessionInLocalProjectRemovalScope(meta, {
169235
+ machineId: this.machineId,
169236
+ localProjectId
169237
+ }));
169238
+ if (sessions.length === 0) return;
169239
+ const rootSessions = sessions.filter(({ meta }) => meta.isArchived !== true && !meta.parentSessionId);
169240
+ const archivedRootSessionIds = new Set(rootSessions.map(({ meta }) => meta.id));
169241
+ for (const { meta } of rootSessions) {
169242
+ await this.archiveSessionResources(meta.id, {
169243
+ preserveWorktree: true
169244
+ });
168971
169245
  }
168972
- if (stoppedCount > 0) {
168973
- this.logger.debug(`[local-project] Stopped ${stoppedCount} active session(s) before removing ${localProjectId}`);
169246
+ for (const { roomId, meta } of sessions) {
169247
+ if (archivedRootSessionIds.has(meta.id)) continue;
169248
+ if (this.sessionManager.hasSession(meta.id)) {
169249
+ await this.archiveSessionResources(meta.id, {
169250
+ preserveWorktree: true
169251
+ });
169252
+ continue;
169253
+ }
169254
+ if (meta.isArchived === true) continue;
169255
+ await this.workspaceDocument.repo.upsertDocMeta(roomId, {
169256
+ isArchived: true,
169257
+ status: SessionStatusFactory.idle()
169258
+ });
168974
169259
  }
169260
+ this.logger.debug(`[local-project] Processed ${sessions.length} session(s) before removing ${localProjectId}`);
168975
169261
  }
168976
169262
  async deleteLocalProjectResources(localProjectId, command2) {
168977
169263
  const existingProject = await resolveWorkspaceLocalProject(this.workspaceDocument.repo, this.workspaceId, this.machineId, localProjectId);
168978
- if (!existingProject) {
169264
+ if (!existingProject && !command2.cleanupWorktrees) {
168979
169265
  this.logger.debug(`[local-project] ${localProjectId} already removed`);
168980
169266
  await this.cleanupLocalProjectWorktreeSetup(localProjectId);
168981
- return;
169267
+ return void 0;
168982
169268
  }
168983
- if (!shouldApplyMachineDeleteLocalProjectCommand(existingProject, command2)) {
169269
+ if (existingProject && !shouldApplyMachineDeleteLocalProjectCommand(existingProject, command2)) {
168984
169270
  this.logger.debug(`[local-project] Skipping stale delete request for ${localProjectId}; project was created after the request`);
168985
- return;
169271
+ return void 0;
169272
+ }
169273
+ await this.archiveLocalProjectSessions(localProjectId);
169274
+ let cleanupResult;
169275
+ const originalRootPath = existingProject?.rootPath ?? command2.originalRootPath;
169276
+ if (command2.cleanupWorktrees && originalRootPath) {
169277
+ const sessions = (await listAliveSessionMetas(this.workspaceDocument)).map(({ meta }) => meta);
169278
+ cleanupResult = await cleanupLocalProjectWorktrees({
169279
+ machineId: this.machineId,
169280
+ localProjectId,
169281
+ originalRootPath,
169282
+ sessions,
169283
+ logger: this.logger
169284
+ });
169285
+ }
169286
+ if (existingProject) {
169287
+ await removeMachineLocalProject(this.workspaceDocument.repo, this.workspaceId, this.machineId, localProjectId, void 0, {
169288
+ sync: this.workspaceDocument,
169289
+ reason: "local-project-delete-command"
169290
+ });
169291
+ this.logger.debug(`[local-project] Removed ${existingProject.name} (${existingProject.rootPath})`);
168986
169292
  }
168987
- await this.stopActiveLocalProjectSessions(localProjectId);
168988
- await removeMachineLocalProject(this.workspaceDocument.repo, this.workspaceId, this.machineId, localProjectId, void 0, {
168989
- sync: this.workspaceDocument,
168990
- reason: "local-project-delete-command"
168991
- });
168992
- this.logger.debug(`[local-project] Removed ${existingProject.name} (${existingProject.rootPath})`);
168993
169293
  await this.cleanupLocalProjectWorktreeSetup(localProjectId);
169294
+ return cleanupResult;
168994
169295
  }
168995
169296
  toDeleteRequestRecord(request2) {
168996
169297
  if (!request2 || typeof request2 !== "object") {
@@ -172723,6 +173024,20 @@ ${escapeHtmlScriptContent(VISUAL_ANNOTATION_INSPECTOR_BROWSER_SCRIPT)}
172723
173024
  return authorized.response;
172724
173025
  }
172725
173026
  const { rootPath } = authorized;
173027
+ if (request2.type === "local-project/removal-preflight") {
173028
+ const sessions = (await listAliveSessionMetas(this.workspaceDocument)).map(({ meta }) => meta);
173029
+ return {
173030
+ ok: true,
173031
+ type: "local-project/removal-preflight",
173032
+ result: await preflightLocalProjectWorktreeRemoval({
173033
+ machineId: this.machineId,
173034
+ localProjectId: request2.localProjectId,
173035
+ originalRootPath: rootPath,
173036
+ sessions,
173037
+ logger: this.logger
173038
+ })
173039
+ };
173040
+ }
172726
173041
  if (isLocalProjectWorktreeConfigRequest(request2)) {
172727
173042
  return await handleLocalProjectWorktreeConfigRequest(request2);
172728
173043
  }
@@ -181876,7 +182191,8 @@ export PATH=${toSingleQuotedShellString(ghShimBinDir)}:"$PATH"
181876
182191
  client2 = started.client;
181877
182192
  acpSessionId = started.acpSessionId;
181878
182193
  acpCapabilities = normalizeAcpSessionCapabilities(started.sessionResponse, {
181879
- sessionFork: started.client.supportsSessionFork()
182194
+ sessionFork: started.client.supportsSessionFork(),
182195
+ acknowledgedSteer: started.client.supportsAcknowledgedSteer()
181880
182196
  });
181881
182197
  } catch (error2) {
181882
182198
  if (error2 instanceof AcpStartupProcessExitError || error2 instanceof AcpStartupProcessError) {
@@ -191403,6 +191719,22 @@ ${trimmed2}${closing}`;
191403
191719
  }
191404
191720
  };
191405
191721
  }
191722
+ if (message.type === "local-project/removal-preflight") {
191723
+ const runtime = await this.resolveWorkspaceRuntime(message.workspaceId);
191724
+ const rootPath = await this.resolveWorkspaceProjectRootPath(runtime, message.localProjectId);
191725
+ const sessions = (await listAliveSessionMetas(runtime.lody.documentManager)).map(({ meta }) => meta);
191726
+ return {
191727
+ ok: true,
191728
+ type: "local-project/removal-preflight",
191729
+ result: await preflightLocalProjectWorktreeRemoval({
191730
+ machineId: this.machineId,
191731
+ localProjectId: message.localProjectId,
191732
+ originalRootPath: rootPath,
191733
+ sessions,
191734
+ logger: this.logger
191735
+ })
191736
+ };
191737
+ }
191406
191738
  if (message.type === "local-project/list") {
191407
191739
  return {
191408
191740
  ok: true,
@@ -220311,7 +220643,7 @@ ${page}${helpTipBottom}${choiceDescription}${ansiEscapes.cursorHide}`;
220311
220643
  data = createReviewBundleSnapshot(bundle);
220312
220644
  }
220313
220645
  const { injectReviewSnapshot } = await import("./chunks/index-VoI6Ds2-.js");
220314
- const { resolveReviewViewerTemplate } = await import("./chunks/review-viewer-BetqYmAc.js").then(async (m) => {
220646
+ const { resolveReviewViewerTemplate } = await import("./chunks/review-viewer-D1hRLw2L.js").then(async (m) => {
220315
220647
  await m.__tla;
220316
220648
  return m;
220317
220649
  });