@theia/ai-core 1.77.0-next.47 → 1.77.0-next.56
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 +15 -0
- package/lib/browser/ai-core-frontend-module.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 +5 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +5 -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/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/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-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 +1 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +1 -0
- package/lib/common/index.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/variable-service.spec.js +2 -1
- package/lib/common/variable-service.spec.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 +17 -0
- 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 +5 -0
- package/src/common/agents-md.ts +37 -0
- package/src/common/ai-variable-resource.ts +1 -1
- package/src/common/index.ts +1 -0
- package/src/common/prompt-service.ts +14 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Command, CommandContribution, CommandRegistry, DisposableCollection, ILogger, MessageService } from '@theia/core';
|
|
2
|
+
import { FrontendApplicationContribution, OpenerService } from '@theia/core/lib/browser';
|
|
3
|
+
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
|
4
|
+
import { WorkspaceTrustService } from '@theia/workspace/lib/browser/workspace-trust-service';
|
|
5
|
+
import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
|
|
6
|
+
import { WorkspaceStorageService } from '@theia/workspace/lib/browser/workspace-storage-service';
|
|
7
|
+
import { PromptFragmentCustomizationService } from '../common/prompt-service';
|
|
8
|
+
import { AgentsMdMigrationReport, AgentsMdMigrationService } from './agents-md-migration-service';
|
|
9
|
+
export declare const RERUN_AGENTS_MD_MIGRATION_COMMAND: Command;
|
|
10
|
+
/**
|
|
11
|
+
* Runs the `AGENTS.md` migration on startup and exposes it as a command.
|
|
12
|
+
*
|
|
13
|
+
* The migration writes into the workspace root, a file the user will see in source control, so
|
|
14
|
+
* unlike the silent `customAgents.yml` migration it always reports what it did. Migration is
|
|
15
|
+
* re-attempted when the workspace becomes trusted; roots added later are covered by the command.
|
|
16
|
+
*/
|
|
17
|
+
export declare class AgentsMdFrontendApplicationContribution implements FrontendApplicationContribution, CommandContribution {
|
|
18
|
+
protected readonly migrationService: AgentsMdMigrationService;
|
|
19
|
+
protected readonly workspaceTrustService: WorkspaceTrustService;
|
|
20
|
+
protected readonly workspaceService: WorkspaceService;
|
|
21
|
+
protected readonly storageService: WorkspaceStorageService;
|
|
22
|
+
protected readonly customizationService: PromptFragmentCustomizationService;
|
|
23
|
+
protected readonly appStateService: FrontendApplicationStateService;
|
|
24
|
+
protected readonly openerService: OpenerService;
|
|
25
|
+
protected readonly messageService?: MessageService;
|
|
26
|
+
protected readonly logger: ILogger;
|
|
27
|
+
/** In-flight run started by {@link onStart} or by the initial trust resolution. */
|
|
28
|
+
protected startupMigration: Promise<void> | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* How long the prompt customizations have to be stable before overrides are reported. The
|
|
31
|
+
* workspace template locations are configured only after the initial scan of the global ones, and
|
|
32
|
+
* each rescan fires several events; reporting on the first of them would show a notification for a
|
|
33
|
+
* state that is about to change.
|
|
34
|
+
*/
|
|
35
|
+
protected overrideWarningDelay: number;
|
|
36
|
+
protected overrideWarningTimer: ReturnType<typeof setTimeout> | undefined;
|
|
37
|
+
/** Set once the application and the workspace trust are ready, the earliest a report makes sense. */
|
|
38
|
+
protected overrideWarningEnabled: boolean;
|
|
39
|
+
protected overrideWarningUpdates: Promise<void>;
|
|
40
|
+
protected shownOverrideFingerprint: number | undefined;
|
|
41
|
+
protected readonly toDispose: DisposableCollection;
|
|
42
|
+
registerCommands(commands: CommandRegistry): void;
|
|
43
|
+
onStart(): void;
|
|
44
|
+
onStop(): void;
|
|
45
|
+
/**
|
|
46
|
+
* `onDidChangeWorkspaceTrust` fires for the *initial* trust resolution as well as for later
|
|
47
|
+
* transitions, and that resolution lands after `onStart` has already started a run and parked it
|
|
48
|
+
* on the same deferred. Both triggers therefore fire on an ordinary trusted startup. The service
|
|
49
|
+
* keeps them from migrating twice; this keeps the second one from reporting the result again.
|
|
50
|
+
*
|
|
51
|
+
* Deliberately an in-flight promise rather than a latch: a workspace that starts untrusted has
|
|
52
|
+
* nothing to migrate, and the run that matters is the one after the user grants trust.
|
|
53
|
+
*/
|
|
54
|
+
protected runStartupMigration(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* @param reportEmptyResult whether to tell the user when there was nothing to migrate. Only the
|
|
57
|
+
* command does: on startup the common case is that nothing is pending, and saying so every time
|
|
58
|
+
* would be noise.
|
|
59
|
+
*/
|
|
60
|
+
protected runMigration(reportEmptyResult: boolean): Promise<void>;
|
|
61
|
+
protected scheduleOverrideWarning(): void;
|
|
62
|
+
protected showOverrideWarning(): Promise<void>;
|
|
63
|
+
protected showMigrationSummary(reports: AgentsMdMigrationReport[], reportEmptyResult: boolean): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=agents-md-frontend-application-contribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-frontend-application-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/agents-md-frontend-application-contribution.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAO,MAAM,aAAa,CAAC;AAChI,OAAO,EAAE,+BAA+B,EAAE,aAAa,EAAQ,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAE,+BAA+B,EAAE,MAAM,oDAAoD,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wDAAwD,CAAC;AAEjG,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAA6D,MAAM,+BAA+B,CAAC;AAE7J,eAAO,MAAM,iCAAiC,EAAE,OAQ/C,CAAC;AAEF;;;;;;GAMG;AACH,qBACa,uCAAwC,YAAW,+BAA+B,EAAE,mBAAmB;IAGhH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;IAG9D,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAGhE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAGtD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,uBAAuB,CAAC;IAG3D,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;IAG5E,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,+BAA+B,CAAC;IAGpE,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAGhD,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAGnD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,mFAAmF;IACnF,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAEtD;;;;;OAKG;IACH,SAAS,CAAC,oBAAoB,SAAQ;IACtC,SAAS,CAAC,oBAAoB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAC;IAC1E,qGAAqG;IACrG,SAAS,CAAC,sBAAsB,UAAS;IACzC,SAAS,CAAC,sBAAsB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;IACpE,SAAS,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvD,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAE1D,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAMjD,OAAO,IAAI,IAAI;IAwBf,MAAM,IAAI,IAAI;IAKd;;;;;;;;OAQG;IACH,SAAS,CAAC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9C;;;;OAIG;cACa,YAAY,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,SAAS,CAAC,uBAAuB,IAAI,IAAI;cAgBzB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDpD,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,EAAE,EAAE,iBAAiB,EAAE,OAAO,GAAG,IAAI;CAwDvG"}
|
|
@@ -0,0 +1,269 @@
|
|
|
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.AgentsMdFrontendApplicationContribution = exports.RERUN_AGENTS_MD_MIGRATION_COMMAND = 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 browser_1 = require("@theia/core/lib/browser");
|
|
23
|
+
const frontend_application_state_1 = require("@theia/core/lib/browser/frontend-application-state");
|
|
24
|
+
const workspace_trust_service_1 = require("@theia/workspace/lib/browser/workspace-trust-service");
|
|
25
|
+
const workspace_service_1 = require("@theia/workspace/lib/browser/workspace-service");
|
|
26
|
+
const workspace_storage_service_1 = require("@theia/workspace/lib/browser/workspace-storage-service");
|
|
27
|
+
const hash_1 = require("@theia/core/lib/common/hash");
|
|
28
|
+
const prompt_service_1 = require("../common/prompt-service");
|
|
29
|
+
const agents_md_1 = require("../common/agents-md");
|
|
30
|
+
const agents_md_migration_service_1 = require("./agents-md-migration-service");
|
|
31
|
+
exports.RERUN_AGENTS_MD_MIGRATION_COMMAND = core_1.Command.toLocalizedCommand({
|
|
32
|
+
id: 'ai-core.agentsMd.rerunMigration',
|
|
33
|
+
label: 'Re-run AGENTS.md migration',
|
|
34
|
+
category: 'AI'
|
|
35
|
+
}, 'theia/ai/core/agentsMd/rerunMigration', 'theia/ai/core/category');
|
|
36
|
+
/**
|
|
37
|
+
* Runs the `AGENTS.md` migration on startup and exposes it as a command.
|
|
38
|
+
*
|
|
39
|
+
* The migration writes into the workspace root, a file the user will see in source control, so
|
|
40
|
+
* unlike the silent `customAgents.yml` migration it always reports what it did. Migration is
|
|
41
|
+
* re-attempted when the workspace becomes trusted; roots added later are covered by the command.
|
|
42
|
+
*/
|
|
43
|
+
let AgentsMdFrontendApplicationContribution = class AgentsMdFrontendApplicationContribution {
|
|
44
|
+
constructor() {
|
|
45
|
+
/**
|
|
46
|
+
* How long the prompt customizations have to be stable before overrides are reported. The
|
|
47
|
+
* workspace template locations are configured only after the initial scan of the global ones, and
|
|
48
|
+
* each rescan fires several events; reporting on the first of them would show a notification for a
|
|
49
|
+
* state that is about to change.
|
|
50
|
+
*/
|
|
51
|
+
this.overrideWarningDelay = 1000;
|
|
52
|
+
/** Set once the application and the workspace trust are ready, the earliest a report makes sense. */
|
|
53
|
+
this.overrideWarningEnabled = false;
|
|
54
|
+
this.overrideWarningUpdates = Promise.resolve();
|
|
55
|
+
this.toDispose = new core_1.DisposableCollection();
|
|
56
|
+
}
|
|
57
|
+
registerCommands(commands) {
|
|
58
|
+
commands.registerCommand(exports.RERUN_AGENTS_MD_MIGRATION_COMMAND, {
|
|
59
|
+
execute: () => this.runMigration(true)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
onStart() {
|
|
63
|
+
// Full configuration reloads publish their completed source maps via this event.
|
|
64
|
+
this.toDispose.push(this.customizationService.onDidChangeCustomAgents(() => this.scheduleOverrideWarning()));
|
|
65
|
+
this.toDispose.push(this.customizationService.onDidChangePromptFragmentCustomization(ids => {
|
|
66
|
+
if (ids.includes(agents_md_1.PROJECT_INFO_PROMPT_FRAGMENT_ID)) {
|
|
67
|
+
this.scheduleOverrideWarning();
|
|
68
|
+
}
|
|
69
|
+
}));
|
|
70
|
+
this.runStartupMigration();
|
|
71
|
+
this.toDispose.push(this.workspaceTrustService.onDidChangeWorkspaceTrust(trusted => {
|
|
72
|
+
if (trusted) {
|
|
73
|
+
this.runStartupMigration();
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
Promise.all([
|
|
77
|
+
this.appStateService.reachedState('ready'),
|
|
78
|
+
this.workspaceService.ready,
|
|
79
|
+
this.workspaceTrustService.getWorkspaceTrust()
|
|
80
|
+
]).then(() => {
|
|
81
|
+
this.overrideWarningEnabled = true;
|
|
82
|
+
this.scheduleOverrideWarning();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
onStop() {
|
|
86
|
+
clearTimeout(this.overrideWarningTimer);
|
|
87
|
+
this.toDispose.dispose();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* `onDidChangeWorkspaceTrust` fires for the *initial* trust resolution as well as for later
|
|
91
|
+
* transitions, and that resolution lands after `onStart` has already started a run and parked it
|
|
92
|
+
* on the same deferred. Both triggers therefore fire on an ordinary trusted startup. The service
|
|
93
|
+
* keeps them from migrating twice; this keeps the second one from reporting the result again.
|
|
94
|
+
*
|
|
95
|
+
* Deliberately an in-flight promise rather than a latch: a workspace that starts untrusted has
|
|
96
|
+
* nothing to migrate, and the run that matters is the one after the user grants trust.
|
|
97
|
+
*/
|
|
98
|
+
runStartupMigration() {
|
|
99
|
+
if (!this.startupMigration) {
|
|
100
|
+
this.startupMigration = this.runMigration(false).finally(() => {
|
|
101
|
+
this.startupMigration = undefined;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return this.startupMigration;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @param reportEmptyResult whether to tell the user when there was nothing to migrate. Only the
|
|
108
|
+
* command does: on startup the common case is that nothing is pending, and saying so every time
|
|
109
|
+
* would be noise.
|
|
110
|
+
*/
|
|
111
|
+
async runMigration(reportEmptyResult) {
|
|
112
|
+
try {
|
|
113
|
+
const reports = await this.migrationService.migrate();
|
|
114
|
+
if (reports.length === 0 && reportEmptyResult && !(await this.workspaceTrustService.getWorkspaceTrust())) {
|
|
115
|
+
// The migration skips untrusted workspaces, so "nothing to migrate" would be misleading.
|
|
116
|
+
this.messageService?.info(core_1.nls.localize('theia/ai/core/agentsMd/migrationResult/untrusted', 'AGENTS.md migration: the workspace is not trusted, so no project info was migrated.'));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.showMigrationSummary(reports, reportEmptyResult);
|
|
120
|
+
}
|
|
121
|
+
this.scheduleOverrideWarning();
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
this.logger.warn('AGENTS.md migration failed', e);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
scheduleOverrideWarning() {
|
|
128
|
+
if (!this.overrideWarningEnabled) {
|
|
129
|
+
// A check is scheduled as soon as it is.
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
clearTimeout(this.overrideWarningTimer);
|
|
133
|
+
this.overrideWarningTimer = setTimeout(() => {
|
|
134
|
+
this.overrideWarningTimer = undefined;
|
|
135
|
+
this.overrideWarningUpdates = this.overrideWarningUpdates.then(async () => {
|
|
136
|
+
// Migration can rename a local source while the initial template scan is still running.
|
|
137
|
+
await this.startupMigration;
|
|
138
|
+
await this.showOverrideWarning();
|
|
139
|
+
}).catch(error => this.logger.warn('Failed to report legacy project-info overrides', error));
|
|
140
|
+
}, this.overrideWarningDelay);
|
|
141
|
+
}
|
|
142
|
+
async showOverrideWarning() {
|
|
143
|
+
if (!this.messageService || !(await this.workspaceTrustService.getWorkspaceTrust())) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
await this.workspaceService.ready;
|
|
147
|
+
const roots = this.workspaceService.tryGetRoots();
|
|
148
|
+
if (roots.length === 0) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const localSources = new Set(roots.map(root => root.resource.resolve(agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH).toString()));
|
|
152
|
+
const sources = (this.customizationService.getPromptFragmentCustomizationSources?.(agents_md_1.PROJECT_INFO_PROMPT_FRAGMENT_ID) ?? [])
|
|
153
|
+
.filter(source => !localSources.has(source.uri.toString()))
|
|
154
|
+
.sort((left, right) => left.uri.toString().localeCompare(right.uri.toString()));
|
|
155
|
+
if (sources.length === 0) {
|
|
156
|
+
this.shownOverrideFingerprint = undefined;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// The active status is deliberately not part of it: it depends on which template locations
|
|
160
|
+
// are loaded, so it can differ between startups without anything the user would act on.
|
|
161
|
+
const fingerprint = (0, hash_1.hash)([
|
|
162
|
+
this.workspaceService.workspace?.resource.toString(),
|
|
163
|
+
roots.map(root => root.resource.toString()).sort(),
|
|
164
|
+
sources.map(source => [source.uri.toString(), source.template])
|
|
165
|
+
]);
|
|
166
|
+
const storageKey = 'ai-core.agentsMd.dismissedProjectInfoOverrides';
|
|
167
|
+
if (this.shownOverrideFingerprint === fingerprint || await this.storageService.getData(storageKey) === fingerprint) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.shownOverrideFingerprint = fingerprint;
|
|
171
|
+
// Notifications render Markdown and collapse newlines, so each path is a code span in a flat list.
|
|
172
|
+
const paths = sources.map(source => core_1.nls.localizeByDefault('{0} ({1})', `\`${source.uri.path.toString()}\``, source.active ? core_1.nls.localizeByDefault('Active') : core_1.nls.localize('theia/ai/core/agentsMd/inactiveOverride', 'Inactive'))).join(', ');
|
|
173
|
+
const message = core_1.nls.localize('theia/ai/core/agentsMd/legacyOverrides', 'These project-info prompt overrides are not migrated automatically and no longer reach the built-in agents that use AGENTS.md. '
|
|
174
|
+
+ 'Move the instructions you want to keep into the relevant project\'s AGENTS.md. '
|
|
175
|
+
+ 'They still apply to prompts that reference project-info: {0}', paths);
|
|
176
|
+
const openAction = core_1.nls.localize('theia/ai/core/agentsMd/openOverrideSources', 'Open Source Files');
|
|
177
|
+
this.messageService.warn(message, { timeout: 0 }, openAction).then(async (choice) => {
|
|
178
|
+
if (choice === openAction) {
|
|
179
|
+
for (const source of sources) {
|
|
180
|
+
await (0, browser_1.open)(this.openerService, source.uri);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
await this.storageService.setData(storageKey, fingerprint);
|
|
185
|
+
}
|
|
186
|
+
}).catch(error => this.logger.warn('Failed to handle legacy project-info override notification', error));
|
|
187
|
+
}
|
|
188
|
+
showMigrationSummary(reports, reportEmptyResult) {
|
|
189
|
+
if (!this.messageService) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (reports.length === 0) {
|
|
193
|
+
if (reportEmptyResult) {
|
|
194
|
+
this.messageService.info(core_1.nls.localize('theia/ai/core/agentsMd/migrationResult/empty', 'AGENTS.md migration: nothing to migrate.'));
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const migrated = reports.filter(report => report.migrated);
|
|
199
|
+
const alreadyPresent = reports.filter(report => report.alreadyPresent).length;
|
|
200
|
+
const failed = reports.filter(report => report.error).length;
|
|
201
|
+
const withPromptSyntax = reports.filter(report => report.containsPromptSyntax).length;
|
|
202
|
+
const notBackedUp = reports.filter(report => !report.error && !report.backedUp).length;
|
|
203
|
+
let message = core_1.nls.localize('theia/ai/core/agentsMd/migrationResult', 'AGENTS.md migration: {0} written, {1} skipped because an AGENTS.md already existed, {2} failed.', migrated.length, alreadyPresent, failed);
|
|
204
|
+
if (notBackedUp === 0) {
|
|
205
|
+
message += ' ' + core_1.nls.localize('theia/ai/core/agentsMd/migrationResult/backedUp', 'The previous project info was kept as `{0}`.', agents_md_migration_service_1.LEGACY_PROJECT_INFO_BACKUP_PATH);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Not cosmetic: while the legacy file is in place it overrides the built-in `project-info`
|
|
209
|
+
// fragment, so an AGENTS.md written next to it is never the one used.
|
|
210
|
+
message += ' ' + core_1.nls.localize('theia/ai/core/agentsMd/migrationResult/backupFailed', '{0} could not be renamed to `{1}`, so it is still in place and takes precedence over {2}. '
|
|
211
|
+
+ 'Rename or remove it to start using {2}.', agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH, agents_md_migration_service_1.LEGACY_PROJECT_INFO_BACKUP_PATH, agents_md_1.AGENTS_MD_FILE_NAME);
|
|
212
|
+
}
|
|
213
|
+
const openAction = migrated.length > 0 ? core_1.nls.localizeByDefault('Open') : undefined;
|
|
214
|
+
// Keep the result visible until dismissed: it announces a new file in the user's repository.
|
|
215
|
+
this.messageService.info(message, { timeout: 0 }, ...(openAction ? [openAction] : [])).then(choice => {
|
|
216
|
+
// Dismissing resolves to `undefined`, which must not be mistaken for the action when there is none.
|
|
217
|
+
if (openAction && choice === openAction) {
|
|
218
|
+
(0, browser_1.open)(this.openerService, migrated[0].root.resolve(agents_md_1.AGENTS_MD_FILE_NAME));
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
if (withPromptSyntax > 0) {
|
|
222
|
+
// A separate warning: appended to the summary it was easy to miss.
|
|
223
|
+
this.messageService.warn(core_1.nls.localize('theia/ai/core/agentsMd/migrationResult/promptSyntax', '{0} of the migrated files still contain prompt template syntax, which {1} no longer resolves. Review and remove it.', withPromptSyntax, agents_md_1.AGENTS_MD_FILE_NAME), { timeout: 0 });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
exports.AgentsMdFrontendApplicationContribution = AgentsMdFrontendApplicationContribution;
|
|
228
|
+
tslib_1.__decorate([
|
|
229
|
+
(0, inversify_1.inject)(agents_md_migration_service_1.AgentsMdMigrationService),
|
|
230
|
+
tslib_1.__metadata("design:type", agents_md_migration_service_1.AgentsMdMigrationService)
|
|
231
|
+
], AgentsMdFrontendApplicationContribution.prototype, "migrationService", void 0);
|
|
232
|
+
tslib_1.__decorate([
|
|
233
|
+
(0, inversify_1.inject)(workspace_trust_service_1.WorkspaceTrustService),
|
|
234
|
+
tslib_1.__metadata("design:type", workspace_trust_service_1.WorkspaceTrustService)
|
|
235
|
+
], AgentsMdFrontendApplicationContribution.prototype, "workspaceTrustService", void 0);
|
|
236
|
+
tslib_1.__decorate([
|
|
237
|
+
(0, inversify_1.inject)(workspace_service_1.WorkspaceService),
|
|
238
|
+
tslib_1.__metadata("design:type", workspace_service_1.WorkspaceService)
|
|
239
|
+
], AgentsMdFrontendApplicationContribution.prototype, "workspaceService", void 0);
|
|
240
|
+
tslib_1.__decorate([
|
|
241
|
+
(0, inversify_1.inject)(workspace_storage_service_1.WorkspaceStorageService),
|
|
242
|
+
tslib_1.__metadata("design:type", workspace_storage_service_1.WorkspaceStorageService)
|
|
243
|
+
], AgentsMdFrontendApplicationContribution.prototype, "storageService", void 0);
|
|
244
|
+
tslib_1.__decorate([
|
|
245
|
+
(0, inversify_1.inject)(prompt_service_1.PromptFragmentCustomizationService),
|
|
246
|
+
tslib_1.__metadata("design:type", Object)
|
|
247
|
+
], AgentsMdFrontendApplicationContribution.prototype, "customizationService", void 0);
|
|
248
|
+
tslib_1.__decorate([
|
|
249
|
+
(0, inversify_1.inject)(frontend_application_state_1.FrontendApplicationStateService),
|
|
250
|
+
tslib_1.__metadata("design:type", frontend_application_state_1.FrontendApplicationStateService)
|
|
251
|
+
], AgentsMdFrontendApplicationContribution.prototype, "appStateService", void 0);
|
|
252
|
+
tslib_1.__decorate([
|
|
253
|
+
(0, inversify_1.inject)(browser_1.OpenerService),
|
|
254
|
+
tslib_1.__metadata("design:type", Object)
|
|
255
|
+
], AgentsMdFrontendApplicationContribution.prototype, "openerService", void 0);
|
|
256
|
+
tslib_1.__decorate([
|
|
257
|
+
(0, inversify_1.inject)(core_1.MessageService),
|
|
258
|
+
(0, inversify_1.optional)(),
|
|
259
|
+
tslib_1.__metadata("design:type", core_1.MessageService)
|
|
260
|
+
], AgentsMdFrontendApplicationContribution.prototype, "messageService", void 0);
|
|
261
|
+
tslib_1.__decorate([
|
|
262
|
+
(0, inversify_1.inject)(core_1.ILogger),
|
|
263
|
+
(0, inversify_1.named)('ai-core:AgentsMdFrontendApplicationContribution'),
|
|
264
|
+
tslib_1.__metadata("design:type", Object)
|
|
265
|
+
], AgentsMdFrontendApplicationContribution.prototype, "logger", void 0);
|
|
266
|
+
exports.AgentsMdFrontendApplicationContribution = AgentsMdFrontendApplicationContribution = tslib_1.__decorate([
|
|
267
|
+
(0, inversify_1.injectable)()
|
|
268
|
+
], AgentsMdFrontendApplicationContribution);
|
|
269
|
+
//# sourceMappingURL=agents-md-frontend-application-contribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-frontend-application-contribution.js","sourceRoot":"","sources":["../../src/browser/agents-md-frontend-application-contribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-frontend-application-contribution.spec.d.ts","sourceRoot":"","sources":["../../src/browser/agents-md-frontend-application-contribution.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,225 @@
|
|
|
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
|
+
try {
|
|
23
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.get();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
27
|
+
}
|
|
28
|
+
const chai_1 = require("chai");
|
|
29
|
+
const sinon = tslib_1.__importStar(require("sinon"));
|
|
30
|
+
const core_1 = require("@theia/core");
|
|
31
|
+
const agents_md_frontend_application_contribution_1 = require("./agents-md-frontend-application-contribution");
|
|
32
|
+
const agents_md_migration_service_1 = require("./agents-md-migration-service");
|
|
33
|
+
disableJSDOM();
|
|
34
|
+
class TestContribution extends agents_md_frontend_application_contribution_1.AgentsMdFrontendApplicationContribution {
|
|
35
|
+
async checkOverrides() {
|
|
36
|
+
this.scheduleOverrideWarning();
|
|
37
|
+
await this.settleWarnings();
|
|
38
|
+
}
|
|
39
|
+
async settleWarnings() {
|
|
40
|
+
await this.startupMigration;
|
|
41
|
+
// Let the debounce timer, which has no delay in these tests, fire.
|
|
42
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
43
|
+
await this.overrideWarningUpdates;
|
|
44
|
+
// Allow the notification action's asynchronous handler to finish.
|
|
45
|
+
await Promise.resolve();
|
|
46
|
+
await Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
describe('AgentsMdFrontendApplicationContribution - legacy overrides', () => {
|
|
50
|
+
let sources;
|
|
51
|
+
let trusted;
|
|
52
|
+
let roots;
|
|
53
|
+
let stored;
|
|
54
|
+
let choice;
|
|
55
|
+
let contribution;
|
|
56
|
+
let warning;
|
|
57
|
+
let info;
|
|
58
|
+
let opener;
|
|
59
|
+
let writeStorage;
|
|
60
|
+
let migration;
|
|
61
|
+
let scanCompleted;
|
|
62
|
+
let fragmentsChanged;
|
|
63
|
+
let trustChanged;
|
|
64
|
+
function source(path, template = 'Instructions', active = true) {
|
|
65
|
+
return { uri: core_1.URI.fromFilePath(path), template, active };
|
|
66
|
+
}
|
|
67
|
+
function createContribution() {
|
|
68
|
+
const result = new TestContribution();
|
|
69
|
+
Object.assign(result, {
|
|
70
|
+
workspaceTrustService: { getWorkspaceTrust: async () => trusted, onDidChangeWorkspaceTrust: trustChanged.event },
|
|
71
|
+
workspaceService: { ready: Promise.resolve(), tryGetRoots: () => roots },
|
|
72
|
+
customizationService: {
|
|
73
|
+
getPromptFragmentCustomizationSources: () => sources,
|
|
74
|
+
onDidChangeCustomAgents: scanCompleted.event,
|
|
75
|
+
onDidChangePromptFragmentCustomization: fragmentsChanged.event
|
|
76
|
+
},
|
|
77
|
+
storageService: { getData: async () => stored, setData: writeStorage },
|
|
78
|
+
messageService: { warn: warning, info },
|
|
79
|
+
openerService: { getOpener: async () => ({ open: opener }) },
|
|
80
|
+
migrationService: { migrate: migration },
|
|
81
|
+
appStateService: { reachedState: async () => { } },
|
|
82
|
+
logger: { warn: sinon.stub() },
|
|
83
|
+
overrideWarningDelay: 0,
|
|
84
|
+
overrideWarningEnabled: true
|
|
85
|
+
});
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
beforeEach(() => {
|
|
89
|
+
sources = [];
|
|
90
|
+
trusted = true;
|
|
91
|
+
roots = [{ resource: core_1.URI.fromFilePath('/ws') }];
|
|
92
|
+
stored = undefined;
|
|
93
|
+
choice = undefined;
|
|
94
|
+
warning = sinon.stub().callsFake(async () => choice);
|
|
95
|
+
info = sinon.stub().resolves();
|
|
96
|
+
opener = sinon.stub().resolves();
|
|
97
|
+
writeStorage = sinon.stub().callsFake(async (_key, value) => { stored = value; });
|
|
98
|
+
migration = sinon.stub().resolves([]);
|
|
99
|
+
scanCompleted = new core_1.Emitter();
|
|
100
|
+
fragmentsChanged = new core_1.Emitter();
|
|
101
|
+
trustChanged = new core_1.Emitter();
|
|
102
|
+
contribution = createContribution();
|
|
103
|
+
});
|
|
104
|
+
afterEach(() => {
|
|
105
|
+
contribution.onStop();
|
|
106
|
+
scanCompleted.dispose();
|
|
107
|
+
fragmentsChanged.dispose();
|
|
108
|
+
trustChanged.dispose();
|
|
109
|
+
});
|
|
110
|
+
it('leaves canonical local files to the automatic migration in every root', async () => {
|
|
111
|
+
roots.push({ resource: core_1.URI.fromFilePath('/other') });
|
|
112
|
+
sources = [source(`/ws/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`), source(`/other/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`)];
|
|
113
|
+
await contribution.checkOverrides();
|
|
114
|
+
(0, chai_1.expect)(warning.called).to.be.false;
|
|
115
|
+
});
|
|
116
|
+
it('lists configured, shared and shadowed sources with their active status', async () => {
|
|
117
|
+
sources = [
|
|
118
|
+
source('/config/project-info.prompttemplate', 'Shared', false),
|
|
119
|
+
source('/ws/.my-prompts/project-info.prompttemplate'),
|
|
120
|
+
source(`/ws/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`)
|
|
121
|
+
];
|
|
122
|
+
await contribution.checkOverrides();
|
|
123
|
+
const message = warning.firstCall.args[0];
|
|
124
|
+
(0, chai_1.expect)(message).to.contain('`/config/project-info.prompttemplate` (Inactive), `/ws/.my-prompts/project-info.prompttemplate` (Active)');
|
|
125
|
+
(0, chai_1.expect)(message).not.to.contain('\n');
|
|
126
|
+
(0, chai_1.expect)(message).not.to.contain(`/ws/${agents_md_migration_service_1.LEGACY_PROJECT_INFO_PATH}`);
|
|
127
|
+
(0, chai_1.expect)(message).to.contain('still apply to prompts that reference project-info');
|
|
128
|
+
});
|
|
129
|
+
it('opens every reported source without treating opening as persistent dismissal', async () => {
|
|
130
|
+
sources = [source('/config/project-info.prompttemplate'), source('/ws/custom/project-info.prompttemplate')];
|
|
131
|
+
choice = 'Open Source Files';
|
|
132
|
+
await contribution.checkOverrides();
|
|
133
|
+
(0, chai_1.expect)(opener.args.map(args => args[0].path.toString())).to.deep.equal(sources.map(entry => entry.uri.path.toString()));
|
|
134
|
+
(0, chai_1.expect)(writeStorage.called).to.be.false;
|
|
135
|
+
});
|
|
136
|
+
it('remembers dismissal across restarts and ignores source ordering', async () => {
|
|
137
|
+
sources = [source('/config/project-info.prompttemplate'), source('/ws/custom/project-info.prompttemplate')];
|
|
138
|
+
await contribution.checkOverrides();
|
|
139
|
+
(0, chai_1.expect)(writeStorage.calledOnce).to.be.true;
|
|
140
|
+
sources.reverse();
|
|
141
|
+
contribution = createContribution();
|
|
142
|
+
await contribution.checkOverrides();
|
|
143
|
+
(0, chai_1.expect)(warning.calledOnce).to.be.true;
|
|
144
|
+
});
|
|
145
|
+
it('warns again when content or source paths change, but not for the active status alone', async () => {
|
|
146
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
147
|
+
await contribution.checkOverrides();
|
|
148
|
+
sources[0].template = 'Changed instructions';
|
|
149
|
+
await contribution.checkOverrides();
|
|
150
|
+
sources[0].uri = core_1.URI.fromFilePath('/config/other/project-info.prompttemplate');
|
|
151
|
+
await contribution.checkOverrides();
|
|
152
|
+
sources[0].active = false;
|
|
153
|
+
await contribution.checkOverrides();
|
|
154
|
+
(0, chai_1.expect)(warning.callCount).to.equal(3);
|
|
155
|
+
});
|
|
156
|
+
it('reports once for a burst of rescans', async () => {
|
|
157
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
158
|
+
contribution.onStart();
|
|
159
|
+
scanCompleted.fire();
|
|
160
|
+
sources[0].active = false;
|
|
161
|
+
fragmentsChanged.fire(['project-info']);
|
|
162
|
+
scanCompleted.fire();
|
|
163
|
+
await contribution.settleWarnings();
|
|
164
|
+
(0, chai_1.expect)(warning.calledOnce).to.be.true;
|
|
165
|
+
(0, chai_1.expect)(warning.firstCall.args[0]).to.contain('(Inactive)');
|
|
166
|
+
});
|
|
167
|
+
it('does not report anything before the application is ready', async () => {
|
|
168
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
169
|
+
contribution = createContribution();
|
|
170
|
+
Object.assign(contribution, { overrideWarningEnabled: false, appStateService: { reachedState: () => new Promise(() => { }) } });
|
|
171
|
+
contribution.onStart();
|
|
172
|
+
scanCompleted.fire();
|
|
173
|
+
await contribution.settleWarnings();
|
|
174
|
+
(0, chai_1.expect)(warning.called).to.be.false;
|
|
175
|
+
});
|
|
176
|
+
it('reports leftover prompt syntax in a warning of its own', async () => {
|
|
177
|
+
migration.resolves([{ root: core_1.URI.fromFilePath('/ws'), migrated: true, alreadyPresent: false, backedUp: true, containsPromptSyntax: true }]);
|
|
178
|
+
await contribution.runMigration(false);
|
|
179
|
+
(0, chai_1.expect)(info.firstCall.args[0]).not.to.contain('prompt template syntax');
|
|
180
|
+
(0, chai_1.expect)(warning.firstCall.args[0]).to.contain('prompt template syntax');
|
|
181
|
+
});
|
|
182
|
+
it('tells the user that an untrusted workspace was not migrated', async () => {
|
|
183
|
+
trusted = false;
|
|
184
|
+
await contribution.runMigration(true);
|
|
185
|
+
(0, chai_1.expect)(info.firstCall.args[0]).to.contain('not trusted');
|
|
186
|
+
});
|
|
187
|
+
it('does not show duplicates while a notification is pending', async () => {
|
|
188
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
189
|
+
warning.returns(new Promise(() => { }));
|
|
190
|
+
await contribution.checkOverrides();
|
|
191
|
+
await contribution.checkOverrides();
|
|
192
|
+
(0, chai_1.expect)(warning.calledOnce).to.be.true;
|
|
193
|
+
});
|
|
194
|
+
it('does not reuse dismissal in a different workspace', async () => {
|
|
195
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
196
|
+
await contribution.checkOverrides();
|
|
197
|
+
roots = [{ resource: core_1.URI.fromFilePath('/other') }];
|
|
198
|
+
await contribution.checkOverrides();
|
|
199
|
+
(0, chai_1.expect)(warning.calledTwice).to.be.true;
|
|
200
|
+
});
|
|
201
|
+
it('does not warn for an untrusted or empty workspace', async () => {
|
|
202
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
203
|
+
trusted = false;
|
|
204
|
+
await contribution.checkOverrides();
|
|
205
|
+
trusted = true;
|
|
206
|
+
roots = [];
|
|
207
|
+
await contribution.checkOverrides();
|
|
208
|
+
(0, chai_1.expect)(warning.called).to.be.false;
|
|
209
|
+
});
|
|
210
|
+
it('detects overrides when the initial template scan finishes after migration', async () => {
|
|
211
|
+
contribution.onStart();
|
|
212
|
+
await contribution.settleWarnings();
|
|
213
|
+
(0, chai_1.expect)(migration.calledOnce).to.be.true;
|
|
214
|
+
(0, chai_1.expect)(warning.called).to.be.false;
|
|
215
|
+
sources = [source('/config/project-info.prompttemplate')];
|
|
216
|
+
scanCompleted.fire();
|
|
217
|
+
await contribution.settleWarnings();
|
|
218
|
+
(0, chai_1.expect)(warning.calledOnce).to.be.true;
|
|
219
|
+
sources[0].template = 'Updated';
|
|
220
|
+
fragmentsChanged.fire(['project-info']);
|
|
221
|
+
await contribution.settleWarnings();
|
|
222
|
+
(0, chai_1.expect)(warning.calledTwice).to.be.true;
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=agents-md-frontend-application-contribution.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md-frontend-application-contribution.spec.js","sourceRoot":"","sources":["../../src/browser/agents-md-frontend-application-contribution.spec.ts"],"names":[],"mappings":"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"}
|