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.
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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: "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
17924
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
168812
|
-
|
|
168813
|
-
|
|
168814
|
-
|
|
168815
|
-
|
|
168816
|
-
|
|
168817
|
-
|
|
168818
|
-
|
|
168819
|
-
|
|
168820
|
-
|
|
168821
|
-
|
|
168822
|
-
|
|
168823
|
-
|
|
168824
|
-
|
|
168825
|
-
|
|
168826
|
-
|
|
168827
|
-
|
|
168828
|
-
|
|
168829
|
-
|
|
168830
|
-
|
|
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
|
-
|
|
168841
|
-
|
|
168842
|
-
|
|
168843
|
-
|
|
168844
|
-
|
|
168845
|
-
|
|
168846
|
-
|
|
168847
|
-
|
|
168848
|
-
|
|
168849
|
-
|
|
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
|
-
|
|
168853
|
-
|
|
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
|
-
|
|
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
|
|
168945
|
-
const
|
|
168946
|
-
|
|
168947
|
-
|
|
168948
|
-
|
|
168949
|
-
|
|
168950
|
-
|
|
168951
|
-
|
|
168952
|
-
|
|
168953
|
-
|
|
168954
|
-
|
|
168955
|
-
|
|
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
|
-
|
|
168973
|
-
|
|
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-
|
|
220646
|
+
const { resolveReviewViewerTemplate } = await import("./chunks/review-viewer-D1hRLw2L.js").then(async (m) => {
|
|
220315
220647
|
await m.__tla;
|
|
220316
220648
|
return m;
|
|
220317
220649
|
});
|