@theia/ai-core 1.77.0-next.7 → 1.77.0-next.71
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/lib/browser/agents-md-frontend-application-contribution.d.ts +65 -0
- package/lib/browser/agents-md-frontend-application-contribution.d.ts.map +1 -0
- package/lib/browser/agents-md-frontend-application-contribution.js +269 -0
- package/lib/browser/agents-md-frontend-application-contribution.js.map +1 -0
- package/lib/browser/agents-md-frontend-application-contribution.spec.d.ts +2 -0
- package/lib/browser/agents-md-frontend-application-contribution.spec.d.ts.map +1 -0
- package/lib/browser/agents-md-frontend-application-contribution.spec.js +225 -0
- package/lib/browser/agents-md-frontend-application-contribution.spec.js.map +1 -0
- package/lib/browser/agents-md-migration-service.d.ts +78 -0
- package/lib/browser/agents-md-migration-service.d.ts.map +1 -0
- package/lib/browser/agents-md-migration-service.js +195 -0
- package/lib/browser/agents-md-migration-service.js.map +1 -0
- package/lib/browser/agents-md-migration-service.spec.d.ts +2 -0
- package/lib/browser/agents-md-migration-service.spec.d.ts.map +1 -0
- package/lib/browser/agents-md-migration-service.spec.js +278 -0
- package/lib/browser/agents-md-migration-service.spec.js.map +1 -0
- package/lib/browser/agents-md-prompt-fragment-contribution.d.ts +13 -0
- package/lib/browser/agents-md-prompt-fragment-contribution.d.ts.map +1 -0
- package/lib/browser/agents-md-prompt-fragment-contribution.js +76 -0
- package/lib/browser/agents-md-prompt-fragment-contribution.js.map +1 -0
- package/lib/browser/agents-md-service.d.ts +58 -0
- package/lib/browser/agents-md-service.d.ts.map +1 -0
- package/lib/browser/agents-md-service.js +191 -0
- package/lib/browser/agents-md-service.js.map +1 -0
- package/lib/browser/agents-md-service.spec.d.ts +2 -0
- package/lib/browser/agents-md-service.spec.d.ts.map +1 -0
- package/lib/browser/agents-md-service.spec.js +220 -0
- package/lib/browser/agents-md-service.spec.js.map +1 -0
- package/lib/browser/agents-md-variable-contribution.d.ts +66 -0
- package/lib/browser/agents-md-variable-contribution.d.ts.map +1 -0
- package/lib/browser/agents-md-variable-contribution.js +169 -0
- package/lib/browser/agents-md-variable-contribution.js.map +1 -0
- package/lib/browser/agents-md-variable-contribution.spec.d.ts +2 -0
- package/lib/browser/agents-md-variable-contribution.spec.d.ts.map +1 -0
- package/lib/browser/agents-md-variable-contribution.spec.js +148 -0
- package/lib/browser/agents-md-variable-contribution.spec.js.map +1 -0
- package/lib/browser/ai-core-frontend-module.d.ts.map +1 -1
- package/lib/browser/ai-core-frontend-module.js +17 -0
- package/lib/browser/ai-core-frontend-module.js.map +1 -1
- package/lib/browser/file-variable-contribution.d.ts +2 -0
- package/lib/browser/file-variable-contribution.d.ts.map +1 -1
- package/lib/browser/file-variable-contribution.js +8 -23
- package/lib/browser/file-variable-contribution.js.map +1 -1
- package/lib/browser/file-variable-contribution.spec.d.ts +2 -0
- package/lib/browser/file-variable-contribution.spec.d.ts.map +1 -0
- package/lib/browser/file-variable-contribution.spec.js +98 -0
- package/lib/browser/file-variable-contribution.spec.js.map +1 -0
- package/lib/browser/frontend-language-model-service.d.ts.map +1 -1
- package/lib/browser/frontend-language-model-service.js +0 -8
- package/lib/browser/frontend-language-model-service.js.map +1 -1
- package/lib/browser/frontend-prompt-customization-service.d.ts +2 -1
- package/lib/browser/frontend-prompt-customization-service.d.ts.map +1 -1
- package/lib/browser/frontend-prompt-customization-service.js +10 -0
- package/lib/browser/frontend-prompt-customization-service.js.map +1 -1
- package/lib/browser/frontend-prompt-customization-service.spec.js +19 -1
- package/lib/browser/frontend-prompt-customization-service.spec.js.map +1 -1
- package/lib/browser/frontend-variable-service.js +1 -1
- package/lib/browser/frontend-variable-service.js.map +1 -1
- package/lib/browser/index.d.ts +6 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +6 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/prompt-variable-contribution.js +1 -1
- package/lib/browser/prompt-variable-contribution.js.map +1 -1
- package/lib/browser/prompt-variable-contribution.spec.js +2 -1
- package/lib/browser/prompt-variable-contribution.spec.js.map +1 -1
- package/lib/browser/prompttemplate-contribution.js +1 -1
- package/lib/browser/prompttemplate-contribution.js.map +1 -1
- package/lib/browser/reasoning-labels.d.ts +4 -0
- package/lib/browser/reasoning-labels.d.ts.map +1 -0
- package/lib/browser/reasoning-labels.js +41 -0
- package/lib/browser/reasoning-labels.js.map +1 -0
- package/lib/browser/reasoning-labels.spec.d.ts +2 -0
- package/lib/browser/reasoning-labels.spec.d.ts.map +1 -0
- package/lib/browser/reasoning-labels.spec.js +28 -0
- package/lib/browser/reasoning-labels.spec.js.map +1 -0
- package/lib/browser/skill-service.spec.js +2 -1
- package/lib/browser/skill-service.spec.js.map +1 -1
- package/lib/browser/skills-variable-contribution.spec.js +2 -1
- package/lib/browser/skills-variable-contribution.spec.js.map +1 -1
- package/lib/browser/theia-variable-contribution.js +3 -3
- package/lib/browser/theia-variable-contribution.js.map +1 -1
- package/lib/browser/workspace-relative-path-resolver.d.ts +20 -0
- package/lib/browser/workspace-relative-path-resolver.d.ts.map +1 -0
- package/lib/browser/workspace-relative-path-resolver.js +78 -0
- package/lib/browser/workspace-relative-path-resolver.js.map +1 -0
- package/lib/common/agents-md.d.ts +20 -0
- package/lib/common/agents-md.d.ts.map +1 -0
- package/lib/common/agents-md.js +38 -0
- package/lib/common/agents-md.js.map +1 -0
- package/lib/common/ai-core-preferences.d.ts.map +1 -1
- package/lib/common/ai-core-preferences.js +6 -3
- package/lib/common/ai-core-preferences.js.map +1 -1
- package/lib/common/ai-variable-resource.js +3 -3
- package/lib/common/ai-variable-resource.js.map +1 -1
- package/lib/common/capability-variable-contribution.js +1 -1
- package/lib/common/capability-variable-contribution.js.map +1 -1
- package/lib/common/index.d.ts +2 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +2 -0
- package/lib/common/index.js.map +1 -1
- package/lib/common/language-model-service.d.ts.map +1 -1
- package/lib/common/language-model-service.js +7 -0
- package/lib/common/language-model-service.js.map +1 -1
- package/lib/common/language-model-service.spec.js +21 -0
- package/lib/common/language-model-service.spec.js.map +1 -1
- package/lib/common/language-model.d.ts +10 -3
- package/lib/common/language-model.d.ts.map +1 -1
- package/lib/common/language-model.js +17 -4
- package/lib/common/language-model.js.map +1 -1
- package/lib/common/language-model.spec.js +18 -0
- package/lib/common/language-model.spec.js.map +1 -1
- package/lib/common/prompt-service.d.ts +12 -0
- package/lib/common/prompt-service.d.ts.map +1 -1
- package/lib/common/prompt-service.js.map +1 -1
- package/lib/common/prompt-service.spec.js +2 -1
- package/lib/common/prompt-service.spec.js.map +1 -1
- package/lib/common/tool-call-execution.d.ts +89 -0
- package/lib/common/tool-call-execution.d.ts.map +1 -0
- package/lib/common/tool-call-execution.js +67 -0
- package/lib/common/tool-call-execution.js.map +1 -0
- package/lib/common/tool-call-execution.spec.d.ts +2 -0
- package/lib/common/tool-call-execution.spec.d.ts.map +1 -0
- package/lib/common/tool-call-execution.spec.js +114 -0
- package/lib/common/tool-call-execution.spec.js.map +1 -0
- package/lib/common/tool-request-parameters.spec.d.ts +2 -0
- package/lib/common/tool-request-parameters.spec.d.ts.map +1 -0
- package/lib/common/tool-request-parameters.spec.js +62 -0
- package/lib/common/tool-request-parameters.spec.js.map +1 -0
- package/lib/common/variable-service.spec.js +2 -1
- package/lib/common/variable-service.spec.js.map +1 -1
- package/lib/node/ai-core-backend-module.d.ts.map +1 -1
- package/lib/node/ai-core-backend-module.js +2 -0
- package/lib/node/ai-core-backend-module.js.map +1 -1
- package/lib/node/model-snapshot-store.js +2 -2
- package/lib/node/model-snapshot-store.js.map +1 -1
- package/lib/node/proxy-util.js +2 -1
- package/lib/node/proxy-util.js.map +1 -1
- package/package.json +9 -9
- package/src/browser/agents-md-frontend-application-contribution.spec.ts +244 -0
- package/src/browser/agents-md-frontend-application-contribution.ts +291 -0
- package/src/browser/agents-md-migration-service.spec.ts +338 -0
- package/src/browser/agents-md-migration-service.ts +226 -0
- package/src/browser/agents-md-prompt-fragment-contribution.ts +73 -0
- package/src/browser/agents-md-service.spec.ts +258 -0
- package/src/browser/agents-md-service.ts +212 -0
- package/src/browser/agents-md-variable-contribution.spec.ts +180 -0
- package/src/browser/agents-md-variable-contribution.ts +182 -0
- package/src/browser/ai-core-frontend-module.ts +19 -0
- package/src/browser/file-variable-contribution.spec.ts +107 -0
- package/src/browser/file-variable-contribution.ts +8 -27
- package/src/browser/frontend-language-model-service.ts +1 -10
- package/src/browser/frontend-prompt-customization-service.spec.ts +24 -0
- package/src/browser/frontend-prompt-customization-service.ts +13 -1
- package/src/browser/index.ts +6 -0
- package/src/browser/reasoning-labels.spec.ts +28 -0
- package/src/browser/reasoning-labels.ts +41 -0
- package/src/browser/theia-variable-contribution.ts +3 -3
- package/src/browser/workspace-relative-path-resolver.ts +71 -0
- package/src/common/agents-md.ts +37 -0
- package/src/common/ai-core-preferences.ts +6 -3
- package/src/common/ai-variable-resource.ts +1 -1
- package/src/common/index.ts +2 -0
- package/src/common/language-model-service.spec.ts +23 -1
- package/src/common/language-model-service.ts +11 -1
- package/src/common/language-model.spec.ts +21 -0
- package/src/common/language-model.ts +26 -6
- package/src/common/prompt-service.ts +14 -0
- package/src/common/tool-call-execution.spec.ts +162 -0
- package/src/common/tool-call-execution.ts +161 -0
- package/src/common/tool-request-parameters.spec.ts +81 -0
- package/src/node/ai-core-backend-module.ts +5 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ILogger, URI } from '@theia/core';
|
|
2
|
+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
3
|
+
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
4
|
+
import { WorkspaceTrustService } from '@theia/workspace/lib/browser/workspace-trust-service';
|
|
5
|
+
import { AiConfigurationService } from '../common';
|
|
6
|
+
/** Workspace-relative location of the prompt fragment that `AGENTS.md` replaces. */
|
|
7
|
+
export declare const LEGACY_PROJECT_INFO_PATH = ".prompts/project-info.prompttemplate";
|
|
8
|
+
export declare const LEGACY_PROJECT_INFO_BACKUP_PATH = ".prompts/project-info.prompttemplate.bak";
|
|
9
|
+
/** Agent id before the retargeting to the `AGENTS.md` standard. */
|
|
10
|
+
export declare const LEGACY_PROJECT_INFO_AGENT_ID = "ProjectInfo";
|
|
11
|
+
export declare const AGENTS_MD_AGENT_ID = "AgentsMd";
|
|
12
|
+
/** Outcome of attempting to migrate one workspace root. Roots without a legacy file produce no report. */
|
|
13
|
+
export interface AgentsMdMigrationReport {
|
|
14
|
+
/** The workspace root this report belongs to. */
|
|
15
|
+
root: URI;
|
|
16
|
+
/** Whether `AGENTS.md` was written from the legacy file. */
|
|
17
|
+
migrated: boolean;
|
|
18
|
+
/** Whether an `AGENTS.md` was already present, so the legacy file was only backed up. */
|
|
19
|
+
alreadyPresent: boolean;
|
|
20
|
+
/** Whether the legacy file was renamed to `.bak`. */
|
|
21
|
+
backedUp: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Whether the migrated content still contains `{{...}}` or `~{...}` references. `AGENTS.md` is
|
|
24
|
+
* read as a plain file, never resolved as a prompt fragment, so those references are now inert.
|
|
25
|
+
*/
|
|
26
|
+
containsPromptSyntax: boolean;
|
|
27
|
+
/** Set when the root could not be migrated. */
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Migrates the legacy `.prompts/project-info.prompttemplate` prompt fragment to a root
|
|
32
|
+
* `AGENTS.md`, and carries the retargeted agent's settings over to its new id.
|
|
33
|
+
*
|
|
34
|
+
* Idempotent: once the legacy file has been renamed to `.bak` a re-run does nothing, and an
|
|
35
|
+
* `AGENTS.md` that already exists is never overwritten.
|
|
36
|
+
*/
|
|
37
|
+
export declare class AgentsMdMigrationService {
|
|
38
|
+
protected readonly fileService: FileService;
|
|
39
|
+
protected readonly workspaceService: WorkspaceService;
|
|
40
|
+
protected readonly workspaceTrustService: WorkspaceTrustService;
|
|
41
|
+
protected readonly aiConfigurationService: AiConfigurationService;
|
|
42
|
+
protected readonly logger: ILogger;
|
|
43
|
+
/**
|
|
44
|
+
* In-flight migration promise used to serialize {@link migrate} calls. Startup and the initial
|
|
45
|
+
* workspace-trust resolution both trigger a migration, and the `Re-run AGENTS.md migration`
|
|
46
|
+
* command can land on top of either; without this guard they race on the same legacy file, and
|
|
47
|
+
* whichever `createFile` loses throws because the write deliberately passes no `overwrite`.
|
|
48
|
+
*/
|
|
49
|
+
protected migrationInFlight: Promise<AgentsMdMigrationReport[]> | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Writes `AGENTS.md` for every workspace root that still has a legacy project-info fragment.
|
|
52
|
+
*
|
|
53
|
+
* Writing into the workspace requires trust; the agent settings rename does not, because it
|
|
54
|
+
* addresses user scope on both the read and the write side. Concurrent callers join the run
|
|
55
|
+
* already under way rather than starting a second one.
|
|
56
|
+
*/
|
|
57
|
+
migrate(): Promise<AgentsMdMigrationReport[]>;
|
|
58
|
+
protected doMigrate(): Promise<AgentsMdMigrationReport[]>;
|
|
59
|
+
protected migrateRoot(root: URI): Promise<AgentsMdMigrationReport | undefined>;
|
|
60
|
+
/**
|
|
61
|
+
* Carries the retargeted agent's settings from its former id to `AgentsMd`, including the prompt
|
|
62
|
+
* ids in `selectedVariants`. Does nothing once the new id is present.
|
|
63
|
+
*
|
|
64
|
+
* Reads and writes **user scope only**, explicitly. The effective value is merged across scopes
|
|
65
|
+
* and, while the workspace is untrusted, has its workspace and folder contributions suppressed,
|
|
66
|
+
* whereas a `update()` write lands in the narrowest scope the key is already defined in. Passing
|
|
67
|
+
* that merged value to `update()` would therefore rewrite a workspace-scoped
|
|
68
|
+
* `ai-features.agentSettings` with an object assembled from a different set of scopes, dropping
|
|
69
|
+
* every entry the read had suppressed. Addressing one scope on both sides is what makes this
|
|
70
|
+
* safe to run outside the trust gate.
|
|
71
|
+
*
|
|
72
|
+
* A `ProjectInfo` entry stored in workspace or folder scope is consequently left alone rather
|
|
73
|
+
* than renamed; it goes stale, which costs the user that agent's model assignment, and is the
|
|
74
|
+
* deliberate trade against touching a file the workspace owns.
|
|
75
|
+
*/
|
|
76
|
+
protected migrateAgentSettings(): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=agents-md-migration-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-migration-service.d.ts","sourceRoot":"","sources":["../../src/browser/agents-md-migration-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAc,MAAM,WAAW,CAAC;AAI/D,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,yCAAyC,CAAC;AAC/E,eAAO,MAAM,+BAA+B,6CAAoC,CAAC;AAEjF,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,gBAAgB,CAAC;AAC1D,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAW7C,0GAA0G;AAC1G,MAAM,WAAW,uBAAuB;IACpC,iDAAiD;IACjD,IAAI,EAAE,GAAG,CAAC;IACV,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,cAAc,EAAE,OAAO,CAAC;IACxB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBACa,wBAAwB;IAGjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAG5C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAGtD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAGhE,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAGlE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,uBAAuB,EAAE,CAAC,GAAG,SAAS,CAAC;IAE5E;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;cAUnC,SAAS,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;cAkB/C,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAkDpF;;;;;;;;;;;;;;;OAeG;cACa,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BxD"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.AgentsMdMigrationService = exports.AGENTS_MD_AGENT_ID = exports.LEGACY_PROJECT_INFO_AGENT_ID = exports.LEGACY_PROJECT_INFO_BACKUP_PATH = exports.LEGACY_PROJECT_INFO_PATH = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
|
+
const core_1 = require("@theia/core");
|
|
22
|
+
const preferences_1 = require("@theia/core/lib/common/preferences");
|
|
23
|
+
const buffer_1 = require("@theia/core/lib/common/buffer");
|
|
24
|
+
const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
|
|
25
|
+
const browser_1 = require("@theia/workspace/lib/browser");
|
|
26
|
+
const workspace_trust_service_1 = require("@theia/workspace/lib/browser/workspace-trust-service");
|
|
27
|
+
const common_1 = require("../common");
|
|
28
|
+
const agents_md_1 = require("../common/agents-md");
|
|
29
|
+
const ai_settings_service_1 = require("./ai-settings-service");
|
|
30
|
+
/** Workspace-relative location of the prompt fragment that `AGENTS.md` replaces. */
|
|
31
|
+
exports.LEGACY_PROJECT_INFO_PATH = '.prompts/project-info.prompttemplate';
|
|
32
|
+
exports.LEGACY_PROJECT_INFO_BACKUP_PATH = `${exports.LEGACY_PROJECT_INFO_PATH}.bak`;
|
|
33
|
+
/** Agent id before the retargeting to the `AGENTS.md` standard. */
|
|
34
|
+
exports.LEGACY_PROJECT_INFO_AGENT_ID = 'ProjectInfo';
|
|
35
|
+
exports.AGENTS_MD_AGENT_ID = 'AgentsMd';
|
|
36
|
+
/** Prompt ids of the retargeted agent, needed to keep `selectedVariants` pointing at the right prompts. */
|
|
37
|
+
const PROMPT_ID_RENAMES = [
|
|
38
|
+
['project-info-system', 'agents-md-system'],
|
|
39
|
+
['project-info-template', 'agents-md-template']
|
|
40
|
+
];
|
|
41
|
+
/** Matches the prompt fragment syntax that stops being resolved once content lives in `AGENTS.md`. */
|
|
42
|
+
const PROMPT_SYNTAX_PATTERN = /\{\{[^}]+\}\}|~\{[^}]+\}/;
|
|
43
|
+
/**
|
|
44
|
+
* Migrates the legacy `.prompts/project-info.prompttemplate` prompt fragment to a root
|
|
45
|
+
* `AGENTS.md`, and carries the retargeted agent's settings over to its new id.
|
|
46
|
+
*
|
|
47
|
+
* Idempotent: once the legacy file has been renamed to `.bak` a re-run does nothing, and an
|
|
48
|
+
* `AGENTS.md` that already exists is never overwritten.
|
|
49
|
+
*/
|
|
50
|
+
let AgentsMdMigrationService = class AgentsMdMigrationService {
|
|
51
|
+
/**
|
|
52
|
+
* Writes `AGENTS.md` for every workspace root that still has a legacy project-info fragment.
|
|
53
|
+
*
|
|
54
|
+
* Writing into the workspace requires trust; the agent settings rename does not, because it
|
|
55
|
+
* addresses user scope on both the read and the write side. Concurrent callers join the run
|
|
56
|
+
* already under way rather than starting a second one.
|
|
57
|
+
*/
|
|
58
|
+
async migrate() {
|
|
59
|
+
if (this.migrationInFlight) {
|
|
60
|
+
return this.migrationInFlight;
|
|
61
|
+
}
|
|
62
|
+
this.migrationInFlight = this.doMigrate().finally(() => {
|
|
63
|
+
this.migrationInFlight = undefined;
|
|
64
|
+
});
|
|
65
|
+
return this.migrationInFlight;
|
|
66
|
+
}
|
|
67
|
+
async doMigrate() {
|
|
68
|
+
await this.migrateAgentSettings();
|
|
69
|
+
if (!(await this.workspaceTrustService.getWorkspaceTrust())) {
|
|
70
|
+
this.logger.info('Skipping AGENTS.md migration: the workspace is not trusted');
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const reports = [];
|
|
74
|
+
for (const root of this.workspaceService.tryGetRoots()) {
|
|
75
|
+
const report = await this.migrateRoot(root.resource);
|
|
76
|
+
if (report) {
|
|
77
|
+
reports.push(report);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return reports;
|
|
81
|
+
}
|
|
82
|
+
async migrateRoot(root) {
|
|
83
|
+
const legacyURI = root.resolve(exports.LEGACY_PROJECT_INFO_PATH);
|
|
84
|
+
if (!(await this.fileService.exists(legacyURI))) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const report = {
|
|
88
|
+
root, migrated: false, alreadyPresent: false, backedUp: false, containsPromptSyntax: false
|
|
89
|
+
};
|
|
90
|
+
const targetURI = root.resolve(agents_md_1.AGENTS_MD_FILE_NAME);
|
|
91
|
+
try {
|
|
92
|
+
const content = (await this.fileService.read(legacyURI)).value;
|
|
93
|
+
if (!(await this.fileService.exists(targetURI))) {
|
|
94
|
+
await this.fileService.createFile(targetURI, buffer_1.BinaryBuffer.fromString(content));
|
|
95
|
+
report.migrated = true;
|
|
96
|
+
}
|
|
97
|
+
else if ((await this.fileService.read(targetURI)).value === content) {
|
|
98
|
+
// A previous run wrote AGENTS.md but was cut off before the backup, e.g. by the window
|
|
99
|
+
// reload that granting trust can trigger. Finish that run instead of reporting a skip.
|
|
100
|
+
report.migrated = true;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Never overwrite: an existing AGENTS.md is authoritative, and it is what every other
|
|
104
|
+
// tool reading the standard already sees.
|
|
105
|
+
report.alreadyPresent = true;
|
|
106
|
+
}
|
|
107
|
+
report.containsPromptSyntax = report.migrated && PROMPT_SYNTAX_PATTERN.test(content);
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
report.error = `${e?.message ?? e}`;
|
|
111
|
+
this.logger.warn(`Failed to migrate ${legacyURI.toString()} to ${targetURI.toString()}: ${report.error}`);
|
|
112
|
+
return report;
|
|
113
|
+
}
|
|
114
|
+
// Back up in both cases. While the legacy file exists it overrides the built-in `project-info`
|
|
115
|
+
// fragment, so leaving it in place would keep AGENTS.md from ever being used.
|
|
116
|
+
try {
|
|
117
|
+
await this.fileService.move(legacyURI, root.resolve(exports.LEGACY_PROJECT_INFO_BACKUP_PATH), { overwrite: true });
|
|
118
|
+
report.backedUp = true;
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
this.logger.warn(`Migrated ${legacyURI.toString()} but failed to back it up: ${e?.message ?? e}`);
|
|
122
|
+
}
|
|
123
|
+
if (report.containsPromptSyntax) {
|
|
124
|
+
this.logger.warn(`${targetURI.toString()} contains prompt fragment syntax ('{{...}}' or '~{...}') carried over from ` +
|
|
125
|
+
`${exports.LEGACY_PROJECT_INFO_PATH}. AGENTS.md is read as a plain file, so these references are no longer resolved.`);
|
|
126
|
+
}
|
|
127
|
+
return report;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Carries the retargeted agent's settings from its former id to `AgentsMd`, including the prompt
|
|
131
|
+
* ids in `selectedVariants`. Does nothing once the new id is present.
|
|
132
|
+
*
|
|
133
|
+
* Reads and writes **user scope only**, explicitly. The effective value is merged across scopes
|
|
134
|
+
* and, while the workspace is untrusted, has its workspace and folder contributions suppressed,
|
|
135
|
+
* whereas a `update()` write lands in the narrowest scope the key is already defined in. Passing
|
|
136
|
+
* that merged value to `update()` would therefore rewrite a workspace-scoped
|
|
137
|
+
* `ai-features.agentSettings` with an object assembled from a different set of scopes, dropping
|
|
138
|
+
* every entry the read had suppressed. Addressing one scope on both sides is what makes this
|
|
139
|
+
* safe to run outside the trust gate.
|
|
140
|
+
*
|
|
141
|
+
* A `ProjectInfo` entry stored in workspace or folder scope is consequently left alone rather
|
|
142
|
+
* than renamed; it goes stale, which costs the user that agent's model assignment, and is the
|
|
143
|
+
* deliberate trade against touching a file the workspace owns.
|
|
144
|
+
*/
|
|
145
|
+
async migrateAgentSettings() {
|
|
146
|
+
try {
|
|
147
|
+
await this.aiConfigurationService.ready;
|
|
148
|
+
// `inspect` is constrained to `JSONValue`, which `AISettings` does not structurally
|
|
149
|
+
// satisfy; the stored shape is the same one `get<AISettings>` returns elsewhere.
|
|
150
|
+
const inspection = this.aiConfigurationService.inspect(ai_settings_service_1.AISettingsServiceImpl.PREFERENCE_NAME);
|
|
151
|
+
const settings = inspection?.globalValue ?? {};
|
|
152
|
+
const legacy = settings[exports.LEGACY_PROJECT_INFO_AGENT_ID];
|
|
153
|
+
if (!legacy || settings[exports.AGENTS_MD_AGENT_ID]) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const selectedVariants = legacy.selectedVariants && Object.fromEntries(Object.entries(legacy.selectedVariants).map(([promptId, variantId]) => {
|
|
157
|
+
const rename = PROMPT_ID_RENAMES.find(([from]) => from === promptId);
|
|
158
|
+
return [rename ? rename[1] : promptId, variantId];
|
|
159
|
+
}));
|
|
160
|
+
const migrated = { ...settings, [exports.AGENTS_MD_AGENT_ID]: { ...legacy, ...(selectedVariants ? { selectedVariants } : {}) } };
|
|
161
|
+
delete migrated[exports.LEGACY_PROJECT_INFO_AGENT_ID];
|
|
162
|
+
await this.aiConfigurationService.set(ai_settings_service_1.AISettingsServiceImpl.PREFERENCE_NAME, migrated, preferences_1.PreferenceScope.User);
|
|
163
|
+
this.logger.info(`Migrated agent settings from '${exports.LEGACY_PROJECT_INFO_AGENT_ID}' to '${exports.AGENTS_MD_AGENT_ID}'`);
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
this.logger.warn(`Failed to migrate agent settings to '${exports.AGENTS_MD_AGENT_ID}': ${e?.message ?? e}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.AgentsMdMigrationService = AgentsMdMigrationService;
|
|
171
|
+
tslib_1.__decorate([
|
|
172
|
+
(0, inversify_1.inject)(file_service_1.FileService),
|
|
173
|
+
tslib_1.__metadata("design:type", file_service_1.FileService)
|
|
174
|
+
], AgentsMdMigrationService.prototype, "fileService", void 0);
|
|
175
|
+
tslib_1.__decorate([
|
|
176
|
+
(0, inversify_1.inject)(browser_1.WorkspaceService),
|
|
177
|
+
tslib_1.__metadata("design:type", browser_1.WorkspaceService)
|
|
178
|
+
], AgentsMdMigrationService.prototype, "workspaceService", void 0);
|
|
179
|
+
tslib_1.__decorate([
|
|
180
|
+
(0, inversify_1.inject)(workspace_trust_service_1.WorkspaceTrustService),
|
|
181
|
+
tslib_1.__metadata("design:type", workspace_trust_service_1.WorkspaceTrustService)
|
|
182
|
+
], AgentsMdMigrationService.prototype, "workspaceTrustService", void 0);
|
|
183
|
+
tslib_1.__decorate([
|
|
184
|
+
(0, inversify_1.inject)(common_1.AiConfigurationService),
|
|
185
|
+
tslib_1.__metadata("design:type", Object)
|
|
186
|
+
], AgentsMdMigrationService.prototype, "aiConfigurationService", void 0);
|
|
187
|
+
tslib_1.__decorate([
|
|
188
|
+
(0, inversify_1.inject)(core_1.ILogger),
|
|
189
|
+
(0, inversify_1.named)('ai-core:AgentsMdMigrationService'),
|
|
190
|
+
tslib_1.__metadata("design:type", Object)
|
|
191
|
+
], AgentsMdMigrationService.prototype, "logger", void 0);
|
|
192
|
+
exports.AgentsMdMigrationService = AgentsMdMigrationService = tslib_1.__decorate([
|
|
193
|
+
(0, inversify_1.injectable)()
|
|
194
|
+
], AgentsMdMigrationService);
|
|
195
|
+
//# sourceMappingURL=agents-md-migration-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-migration-service.js","sourceRoot":"","sources":["../../src/browser/agents-md-migration-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-migration-service.spec.d.ts","sourceRoot":"","sources":["../../src/browser/agents-md-migration-service.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const tslib_1 = require("tslib");
|
|
19
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
20
|
+
const disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
21
|
+
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
22
|
+
// Guarded: another spec in the same mocha process may already have set it, and `set` throws on a
|
|
23
|
+
// second call.
|
|
24
|
+
try {
|
|
25
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.get();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
29
|
+
}
|
|
30
|
+
const chai_1 = require("chai");
|
|
31
|
+
const sinon = tslib_1.__importStar(require("sinon"));
|
|
32
|
+
const core_1 = require("@theia/core");
|
|
33
|
+
const preferences_1 = require("@theia/core/lib/common/preferences");
|
|
34
|
+
const ai_settings_service_1 = require("./ai-settings-service");
|
|
35
|
+
const agents_md_migration_service_1 = require("./agents-md-migration-service");
|
|
36
|
+
disableJSDOM();
|
|
37
|
+
describe('AgentsMdMigrationService', () => {
|
|
38
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
39
|
+
let fileServiceMock;
|
|
40
|
+
let workspaceServiceMock;
|
|
41
|
+
let trustServiceMock;
|
|
42
|
+
let configurationServiceMock;
|
|
43
|
+
/** User-scope `ai-features.agentSettings`. */
|
|
44
|
+
let settings;
|
|
45
|
+
/** Workspace-scope `ai-features.agentSettings`, i.e. what `.theia/settings.json` holds. */
|
|
46
|
+
let workspaceScopedSettings;
|
|
47
|
+
let trusted;
|
|
48
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
49
|
+
const legacyPath = `/ws/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`;
|
|
50
|
+
/** What a trust-aware, scope-merging read returns: workspace scope wins, and is hidden while untrusted. */
|
|
51
|
+
function effectiveSettings() {
|
|
52
|
+
return { ...settings, ...(trusted ? workspaceScopedSettings : undefined) };
|
|
53
|
+
}
|
|
54
|
+
function createService() {
|
|
55
|
+
const service = new agents_md_migration_service_1.AgentsMdMigrationService();
|
|
56
|
+
service.fileService = fileServiceMock;
|
|
57
|
+
service.workspaceService = workspaceServiceMock;
|
|
58
|
+
service.workspaceTrustService = trustServiceMock;
|
|
59
|
+
service.aiConfigurationService = configurationServiceMock;
|
|
60
|
+
const loggerMock = sinon.createStubInstance(core_1.Logger);
|
|
61
|
+
service.logger = loggerMock;
|
|
62
|
+
return service;
|
|
63
|
+
}
|
|
64
|
+
function existing(...paths) {
|
|
65
|
+
fileServiceMock.exists.callsFake((uri) => Promise.resolve(paths.includes(uri.path.toString())));
|
|
66
|
+
}
|
|
67
|
+
function createdContent() {
|
|
68
|
+
return fileServiceMock.createFile.firstCall.args[1].toString();
|
|
69
|
+
}
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
settings = {};
|
|
72
|
+
workspaceScopedSettings = undefined;
|
|
73
|
+
fileServiceMock = {
|
|
74
|
+
exists: sinon.stub().resolves(false),
|
|
75
|
+
read: sinon.stub().resolves({ value: 'project conventions' }),
|
|
76
|
+
createFile: sinon.stub().resolves(undefined),
|
|
77
|
+
move: sinon.stub().resolves(undefined)
|
|
78
|
+
};
|
|
79
|
+
workspaceServiceMock = {
|
|
80
|
+
tryGetRoots: sinon.stub().returns([{ resource: new core_1.URI('file:///ws'), name: 'ws' }])
|
|
81
|
+
};
|
|
82
|
+
trusted = true;
|
|
83
|
+
trustServiceMock = { getWorkspaceTrust: sinon.stub().callsFake(() => Promise.resolve(trusted)) };
|
|
84
|
+
// Models the two properties that make the real service dangerous to call carelessly: reads
|
|
85
|
+
// are merged across scopes and suppress workspace scope while untrusted, and `update` writes
|
|
86
|
+
// to the narrowest scope the key is already defined in. A flat store cannot express either,
|
|
87
|
+
// which is why an earlier version of this suite could not fail on a scope mix-up.
|
|
88
|
+
configurationServiceMock = {
|
|
89
|
+
ready: Promise.resolve(),
|
|
90
|
+
get: sinon.stub().callsFake(() => effectiveSettings()),
|
|
91
|
+
inspect: sinon.stub().callsFake(() => ({
|
|
92
|
+
globalValue: settings,
|
|
93
|
+
workspaceValue: trusted ? workspaceScopedSettings : undefined,
|
|
94
|
+
value: effectiveSettings()
|
|
95
|
+
})),
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
update: sinon.stub().callsFake((_name, value) => {
|
|
98
|
+
if (workspaceScopedSettings) {
|
|
99
|
+
workspaceScopedSettings = value;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
settings = value;
|
|
103
|
+
}
|
|
104
|
+
return Promise.resolve();
|
|
105
|
+
}),
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
set: sinon.stub().callsFake((_name, value, scope) => {
|
|
108
|
+
if (scope === preferences_1.PreferenceScope.Workspace) {
|
|
109
|
+
workspaceScopedSettings = value;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
settings = value;
|
|
113
|
+
}
|
|
114
|
+
return Promise.resolve();
|
|
115
|
+
})
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
afterEach(() => sinon.restore());
|
|
119
|
+
describe('file migration', () => {
|
|
120
|
+
it('reports nothing when there is no legacy file', async () => {
|
|
121
|
+
(0, chai_1.expect)(await createService().migrate()).to.be.empty;
|
|
122
|
+
(0, chai_1.expect)(fileServiceMock.createFile.called).to.be.false;
|
|
123
|
+
});
|
|
124
|
+
it('writes AGENTS.md from the legacy file and backs the legacy file up', async () => {
|
|
125
|
+
existing(legacyPath);
|
|
126
|
+
const reports = await createService().migrate();
|
|
127
|
+
(0, chai_1.expect)(reports).to.have.lengthOf(1);
|
|
128
|
+
(0, chai_1.expect)(reports[0].migrated).to.be.true;
|
|
129
|
+
(0, chai_1.expect)(reports[0].backedUp).to.be.true;
|
|
130
|
+
(0, chai_1.expect)(fileServiceMock.createFile.firstCall.args[0].path.toString()).to.equal('/ws/AGENTS.md');
|
|
131
|
+
(0, chai_1.expect)(createdContent()).to.equal('project conventions');
|
|
132
|
+
(0, chai_1.expect)(fileServiceMock.move.firstCall.args[1].path.toString()).to.equal(`${legacyPath}.bak`);
|
|
133
|
+
});
|
|
134
|
+
it('never overwrites an existing AGENTS.md, but still retires the legacy file', async () => {
|
|
135
|
+
existing(legacyPath, '/ws/AGENTS.md');
|
|
136
|
+
fileServiceMock.read.callsFake((uri) => Promise.resolve({
|
|
137
|
+
value: uri.path.toString() === '/ws/AGENTS.md' ? 'own conventions' : 'project conventions'
|
|
138
|
+
}));
|
|
139
|
+
const reports = await createService().migrate();
|
|
140
|
+
(0, chai_1.expect)(reports[0].migrated).to.be.false;
|
|
141
|
+
(0, chai_1.expect)(reports[0].alreadyPresent).to.be.true;
|
|
142
|
+
(0, chai_1.expect)(reports[0].backedUp).to.be.true;
|
|
143
|
+
(0, chai_1.expect)(fileServiceMock.createFile.called).to.be.false;
|
|
144
|
+
});
|
|
145
|
+
it('finishes a run that was cut off after writing AGENTS.md', async () => {
|
|
146
|
+
existing(legacyPath, '/ws/AGENTS.md');
|
|
147
|
+
const reports = await createService().migrate();
|
|
148
|
+
(0, chai_1.expect)(reports[0].migrated).to.be.true;
|
|
149
|
+
(0, chai_1.expect)(reports[0].alreadyPresent).to.be.false;
|
|
150
|
+
(0, chai_1.expect)(reports[0].backedUp).to.be.true;
|
|
151
|
+
(0, chai_1.expect)(fileServiceMock.createFile.called).to.be.false;
|
|
152
|
+
});
|
|
153
|
+
it('is idempotent: a second run finds nothing once the legacy file is gone', async () => {
|
|
154
|
+
existing(legacyPath);
|
|
155
|
+
const service = createService();
|
|
156
|
+
await service.migrate();
|
|
157
|
+
existing('/ws/AGENTS.md', `${legacyPath}.bak`);
|
|
158
|
+
(0, chai_1.expect)(await service.migrate()).to.be.empty;
|
|
159
|
+
});
|
|
160
|
+
it('flags prompt template syntax that AGENTS.md no longer resolves', async () => {
|
|
161
|
+
existing(legacyPath);
|
|
162
|
+
fileServiceMock.read.resolves({ value: 'Read files with ~{getFileContent} and see {{contextFiles}}.' });
|
|
163
|
+
const reports = await createService().migrate();
|
|
164
|
+
(0, chai_1.expect)(reports[0].containsPromptSyntax).to.be.true;
|
|
165
|
+
// The content is still carried over verbatim; nothing is silently stripped.
|
|
166
|
+
(0, chai_1.expect)(createdContent()).to.equal('Read files with ~{getFileContent} and see {{contextFiles}}.');
|
|
167
|
+
});
|
|
168
|
+
it('does not flag plain content', async () => {
|
|
169
|
+
existing(legacyPath);
|
|
170
|
+
const reports = await createService().migrate();
|
|
171
|
+
(0, chai_1.expect)(reports[0].containsPromptSyntax).to.be.false;
|
|
172
|
+
});
|
|
173
|
+
it('reports the failure and leaves the legacy file alone when the write fails', async () => {
|
|
174
|
+
existing(legacyPath);
|
|
175
|
+
fileServiceMock.createFile.rejects(new Error('read-only'));
|
|
176
|
+
const reports = await createService().migrate();
|
|
177
|
+
(0, chai_1.expect)(reports[0].error).to.contain('read-only');
|
|
178
|
+
(0, chai_1.expect)(reports[0].migrated).to.be.false;
|
|
179
|
+
(0, chai_1.expect)(fileServiceMock.move.called).to.be.false;
|
|
180
|
+
});
|
|
181
|
+
it('migrates every workspace root that has a legacy file', async () => {
|
|
182
|
+
workspaceServiceMock.tryGetRoots.returns([
|
|
183
|
+
{ resource: new core_1.URI('file:///a'), name: 'a' },
|
|
184
|
+
{ resource: new core_1.URI('file:///b'), name: 'b' }
|
|
185
|
+
]);
|
|
186
|
+
existing(`/a/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`, `/b/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`);
|
|
187
|
+
const reports = await createService().migrate();
|
|
188
|
+
(0, chai_1.expect)(reports.map(report => report.migrated)).to.deep.equal([true, true]);
|
|
189
|
+
});
|
|
190
|
+
it('coalesces concurrent calls into a single migration', async () => {
|
|
191
|
+
// Startup and the initial workspace-trust resolution both trigger a migration. Without
|
|
192
|
+
// coalescing both reach `createFile`, and the loser throws because the write passes no
|
|
193
|
+
// `overwrite`, producing a phantom failure for a migration that in fact succeeded.
|
|
194
|
+
existing(legacyPath);
|
|
195
|
+
const service = createService();
|
|
196
|
+
const [first, second] = await Promise.all([service.migrate(), service.migrate()]);
|
|
197
|
+
(0, chai_1.expect)(fileServiceMock.createFile.callCount).to.equal(1);
|
|
198
|
+
(0, chai_1.expect)(fileServiceMock.move.callCount).to.equal(1);
|
|
199
|
+
(0, chai_1.expect)(second).to.equal(first);
|
|
200
|
+
(0, chai_1.expect)(first[0].error).to.be.undefined;
|
|
201
|
+
});
|
|
202
|
+
it('starts a fresh migration once the previous one has settled', async () => {
|
|
203
|
+
existing(legacyPath);
|
|
204
|
+
const service = createService();
|
|
205
|
+
await service.migrate();
|
|
206
|
+
await service.migrate();
|
|
207
|
+
(0, chai_1.expect)(fileServiceMock.createFile.callCount).to.equal(2);
|
|
208
|
+
});
|
|
209
|
+
it('reports the backup as not done when the rename fails', async () => {
|
|
210
|
+
existing(legacyPath);
|
|
211
|
+
fileServiceMock.move.rejects(new Error('read-only'));
|
|
212
|
+
const reports = await createService().migrate();
|
|
213
|
+
(0, chai_1.expect)(reports[0].migrated).to.be.true;
|
|
214
|
+
(0, chai_1.expect)(reports[0].backedUp).to.be.false;
|
|
215
|
+
});
|
|
216
|
+
it('writes nothing into an untrusted workspace', async () => {
|
|
217
|
+
existing(legacyPath);
|
|
218
|
+
trustServiceMock.getWorkspaceTrust.resolves(false);
|
|
219
|
+
(0, chai_1.expect)(await createService().migrate()).to.be.empty;
|
|
220
|
+
(0, chai_1.expect)(fileServiceMock.createFile.called).to.be.false;
|
|
221
|
+
(0, chai_1.expect)(fileServiceMock.move.called).to.be.false;
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe('agent settings migration', () => {
|
|
225
|
+
it('carries the settings over to the new agent id', async () => {
|
|
226
|
+
settings = { ProjectInfo: { enable: true, languageModelRequirements: [{ purpose: 'chat', identifier: 'my/model' }] } };
|
|
227
|
+
await createService().migrate();
|
|
228
|
+
(0, chai_1.expect)(settings.ProjectInfo).to.be.undefined;
|
|
229
|
+
(0, chai_1.expect)(settings.AgentsMd).to.deep.equal({ enable: true, languageModelRequirements: [{ purpose: 'chat', identifier: 'my/model' }] });
|
|
230
|
+
});
|
|
231
|
+
it('renames the prompt ids in selectedVariants', async () => {
|
|
232
|
+
settings = { ProjectInfo: { selectedVariants: { 'project-info-system': 'my-variant', 'other-prompt': 'keep' } } };
|
|
233
|
+
await createService().migrate();
|
|
234
|
+
(0, chai_1.expect)(settings.AgentsMd.selectedVariants).to.deep.equal({ 'agents-md-system': 'my-variant', 'other-prompt': 'keep' });
|
|
235
|
+
});
|
|
236
|
+
it('leaves other agents untouched', async () => {
|
|
237
|
+
settings = { ProjectInfo: { enable: false }, Coder: { enable: true } };
|
|
238
|
+
await createService().migrate();
|
|
239
|
+
(0, chai_1.expect)(settings.Coder).to.deep.equal({ enable: true });
|
|
240
|
+
});
|
|
241
|
+
it('does nothing when the new id is already configured', async () => {
|
|
242
|
+
settings = { ProjectInfo: { enable: false }, AgentsMd: { enable: true } };
|
|
243
|
+
await createService().migrate();
|
|
244
|
+
(0, chai_1.expect)(configurationServiceMock.set.called).to.be.false;
|
|
245
|
+
});
|
|
246
|
+
it('does nothing when there are no legacy settings', async () => {
|
|
247
|
+
await createService().migrate();
|
|
248
|
+
(0, chai_1.expect)(configurationServiceMock.set.called).to.be.false;
|
|
249
|
+
});
|
|
250
|
+
it('runs untrusted, and addresses user scope on both the read and the write', async () => {
|
|
251
|
+
settings = { ProjectInfo: { enable: true } };
|
|
252
|
+
trusted = false;
|
|
253
|
+
await createService().migrate();
|
|
254
|
+
(0, chai_1.expect)(settings.AgentsMd).to.deep.equal({ enable: true });
|
|
255
|
+
(0, chai_1.expect)(configurationServiceMock.set.firstCall.args[0]).to.equal(ai_settings_service_1.AISettingsServiceImpl.PREFERENCE_NAME);
|
|
256
|
+
(0, chai_1.expect)(configurationServiceMock.set.firstCall.args[2]).to.equal(preferences_1.PreferenceScope.User);
|
|
257
|
+
});
|
|
258
|
+
it('never rewrites workspace-scoped settings from a user-scope read while untrusted', async () => {
|
|
259
|
+
// The scenario the scope mix-up destroyed: a shared `.theia/settings.json` holding other
|
|
260
|
+
// agents, invisible to the read because the workspace is untrusted.
|
|
261
|
+
settings = { ProjectInfo: { enable: true } };
|
|
262
|
+
workspaceScopedSettings = { Coder: { enable: true }, Universal: { enable: false } };
|
|
263
|
+
trusted = false;
|
|
264
|
+
await createService().migrate();
|
|
265
|
+
(0, chai_1.expect)(workspaceScopedSettings).to.deep.equal({ Coder: { enable: true }, Universal: { enable: false } });
|
|
266
|
+
(0, chai_1.expect)(settings.AgentsMd).to.deep.equal({ enable: true });
|
|
267
|
+
(0, chai_1.expect)(settings.ProjectInfo).to.be.undefined;
|
|
268
|
+
});
|
|
269
|
+
it('leaves a workspace-scoped entry alone rather than promoting it into user scope', async () => {
|
|
270
|
+
workspaceScopedSettings = { Coder: { enable: true } };
|
|
271
|
+
settings = { ProjectInfo: { enable: true } };
|
|
272
|
+
await createService().migrate();
|
|
273
|
+
(0, chai_1.expect)(settings.Coder).to.be.undefined;
|
|
274
|
+
(0, chai_1.expect)(workspaceScopedSettings).to.deep.equal({ Coder: { enable: true } });
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=agents-md-migration-service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-migration-service.spec.js","sourceRoot":"","sources":["../../src/browser/agents-md-migration-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
|
|
2
|
+
import { PromptService } from '../common/prompt-service';
|
|
3
|
+
/**
|
|
4
|
+
* Registers the two built-in ways of consuming `AGENTS.md`.
|
|
5
|
+
*
|
|
6
|
+
* A workspace file customizing either fragment still takes precedence, so a workspace that has not
|
|
7
|
+
* been migrated yet keeps using its own `.prompts/project-info.prompttemplate`.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AgentsMdPromptFragmentContribution implements FrontendApplicationContribution {
|
|
10
|
+
protected readonly promptService: PromptService;
|
|
11
|
+
onStart(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=agents-md-prompt-fragment-contribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-prompt-fragment-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/agents-md-prompt-fragment-contribution.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgCzD;;;;;GAKG;AACH,qBACa,kCAAmC,YAAW,+BAA+B;IAGtF,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAEhD,OAAO,IAAI,IAAI;CAUlB"}
|