@theia/ai-ide 1.77.0-next.29 → 1.77.0-next.37
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/task-context-file-storage-service.d.ts.map +1 -1
- package/lib/browser/task-context-file-storage-service.js +1 -2
- package/lib/browser/task-context-file-storage-service.js.map +1 -1
- package/lib/browser/task-context-file-storage-service.spec.d.ts +2 -0
- package/lib/browser/task-context-file-storage-service.spec.d.ts.map +1 -0
- package/lib/browser/task-context-file-storage-service.spec.js +111 -0
- package/lib/browser/task-context-file-storage-service.spec.js.map +1 -0
- package/package.json +25 -26
- package/src/browser/task-context-file-storage-service.spec.ts +125 -0
- package/src/browser/task-context-file-storage-service.ts +3 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-context-file-storage-service.d.ts","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AACtH,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AAGrG,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"task-context-file-storage-service.d.ts","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AACtH,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AAGrG,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAQ,iBAAiB,EAAE,GAAG,EAAe,MAAM,aAAa,CAAC;AAChH,OAAO,EAAE,aAAa,EAAQ,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAkB,MAAM,oCAAoC,CAAC;AAIhF,qBACa,6BAA8B,YAAW,yBAAyB;IACvC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,0BAA0B,CAAC;IACxE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC3D,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAGvE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,gBAAuB;IAC5D,QAAQ,CAAC,WAAW,oCAAiC;IAErD,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9C,SAAS,CAAC,kBAAkB,IAAI,GAAG,GAAG,SAAS;IAU/C,SAAS,CAAC,IAAI,IAAI,IAAI;IAItB,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnC;cAEe,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAUvC,SAAS,CAAC,wBAAwB,CAAC,EAAE,oBAAoB,CAAC;cAC1C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;cAgB7B,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnE,SAAS,CAAC,oBAAoB,IAAI,IAAI;IAItC,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;cAYhC,aAAa,CAAC,eAAe,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;cAOlD,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5C,MAAM,IAAI,OAAO,EAAE;IAIb,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAiBrD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlD,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE;IAK3G,SAAS,CAAC,QAAQ,GAAI,WAAW,OAAO,KAAG,SAAS,IAAI,eAAe,CACsE;IAEvI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOhD"}
|
|
@@ -24,7 +24,6 @@ const core_1 = require("@theia/core");
|
|
|
24
24
|
const browser_1 = require("@theia/core/lib/browser");
|
|
25
25
|
const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
|
|
26
26
|
const browser_2 = require("@theia/workspace/lib/browser");
|
|
27
|
-
const yaml = require("js-yaml");
|
|
28
27
|
const workspace_preferences_1 = require("../common/workspace-preferences");
|
|
29
28
|
const buffer_1 = require("@theia/core/lib/common/buffer");
|
|
30
29
|
let TaskContextFileStorageService = class TaskContextFileStorageService {
|
|
@@ -145,7 +144,7 @@ let TaskContextFileStorageService = class TaskContextFileStorageService {
|
|
|
145
144
|
};
|
|
146
145
|
const derivedName = label.trim().replace(/[^\p{L}\p{N}]/ug, '-').replace(/^-+|-+$/g, '');
|
|
147
146
|
const filename = (derivedName.length > 32 ? derivedName.slice(0, derivedName.indexOf('-', 32)) : derivedName) + '.md';
|
|
148
|
-
const content =
|
|
147
|
+
const content = (0, frontmatter_1.serializeFrontmatter)(frontmatter, summary.summary);
|
|
149
148
|
const uri = storageLocation.resolve(filename);
|
|
150
149
|
summary.uri = uri;
|
|
151
150
|
await this.fileService.writeFile(uri, buffer_1.BinaryBuffer.fromString(content));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-context-file-storage-service.js","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAGhF,0GAAqG;AACrG,
|
|
1
|
+
{"version":3,"file":"task-context-file-storage-service.js","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-context-file-storage-service.spec.d.ts","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view and others.
|
|
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 jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
19
|
+
const disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
|
+
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
21
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
22
|
+
const chai_1 = require("chai");
|
|
23
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
24
|
+
const core_1 = require("@theia/core");
|
|
25
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
26
|
+
const ai_core_1 = require("@theia/ai-core");
|
|
27
|
+
const task_context_storage_service_1 = require("@theia/ai-chat/lib/browser/task-context-storage-service");
|
|
28
|
+
const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
|
|
29
|
+
const browser_2 = require("@theia/workspace/lib/browser");
|
|
30
|
+
const task_context_file_storage_service_1 = require("./task-context-file-storage-service");
|
|
31
|
+
disableJSDOM();
|
|
32
|
+
const workspaceRoot = new core_1.URI('file:///workspace');
|
|
33
|
+
const storageLocation = workspaceRoot.resolve('.prompts/task-contexts');
|
|
34
|
+
describe('TaskContextFileStorageService', () => {
|
|
35
|
+
let files;
|
|
36
|
+
let container;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
files = new Map();
|
|
39
|
+
container = new inversify_1.Container();
|
|
40
|
+
container.bind(file_service_1.FileService).toConstantValue({
|
|
41
|
+
watch: () => core_1.Disposable.NULL,
|
|
42
|
+
onDidFilesChange: () => core_1.Disposable.NULL,
|
|
43
|
+
resolve: async (uri) => ({
|
|
44
|
+
children: [...files.keys()].map(key => new core_1.URI(key)).filter(resource => uri.isEqualOrParent(resource)).map(resource => ({ resource }))
|
|
45
|
+
}),
|
|
46
|
+
read: async (uri) => {
|
|
47
|
+
const value = files.get(uri.toString());
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
throw new Error(`No file at ${uri}`);
|
|
50
|
+
}
|
|
51
|
+
return { value };
|
|
52
|
+
},
|
|
53
|
+
writeFile: async (uri, content) => {
|
|
54
|
+
files.set(uri.toString(), content.toString());
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
container.bind(browser_2.WorkspaceService).toConstantValue({
|
|
58
|
+
opened: true,
|
|
59
|
+
ready: Promise.resolve(),
|
|
60
|
+
tryGetRoots: () => [{ resource: workspaceRoot }]
|
|
61
|
+
});
|
|
62
|
+
container.bind(core_1.PreferenceService).toConstantValue({
|
|
63
|
+
ready: Promise.resolve(),
|
|
64
|
+
inspect: () => ({ defaultValue: '.prompts/task-contexts' }),
|
|
65
|
+
onPreferenceChanged: () => core_1.Disposable.NULL
|
|
66
|
+
});
|
|
67
|
+
container.bind(core_1.ILogger).toConstantValue({ error: () => { } });
|
|
68
|
+
container.bind(browser_1.OpenerService).toConstantValue({});
|
|
69
|
+
container.bind(ai_core_1.AIVariableResourceResolver).toConstantValue({});
|
|
70
|
+
container.bind(task_context_storage_service_1.InMemoryTaskContextStorage).toSelf().inSingletonScope();
|
|
71
|
+
container.bind(task_context_file_storage_service_1.TaskContextFileStorageService).toSelf().inSingletonScope();
|
|
72
|
+
});
|
|
73
|
+
/** Creates the service and waits for its startup scan to load the files already in the storage location. */
|
|
74
|
+
const loadStoredFiles = async () => {
|
|
75
|
+
const service = container.get(task_context_file_storage_service_1.TaskContextFileStorageService);
|
|
76
|
+
await core_1.Event.toPromise(service.onDidChange);
|
|
77
|
+
return service;
|
|
78
|
+
};
|
|
79
|
+
it('writes the metadata as standard frontmatter', async () => {
|
|
80
|
+
const service = container.get(task_context_file_storage_service_1.TaskContextFileStorageService);
|
|
81
|
+
await service.store({ id: 'task-1', sessionId: 'session-1', label: 'Fix the build', summary: '# Plan\n\nDo it.' });
|
|
82
|
+
const content = files.get(storageLocation.resolve('Fix-the-build.md').toString());
|
|
83
|
+
(0, chai_1.expect)(content).to.not.be.undefined;
|
|
84
|
+
const lines = content.split('\n');
|
|
85
|
+
(0, chai_1.expect)(lines[0]).to.equal('---');
|
|
86
|
+
(0, chai_1.expect)(lines).to.include.members(['id: task-1', 'sessionId: session-1', 'label: Fix the build']);
|
|
87
|
+
(0, chai_1.expect)(content).to.match(/\n---\n# Plan\n\nDo it\.$/);
|
|
88
|
+
});
|
|
89
|
+
it('reads back the body without the frontmatter', async () => {
|
|
90
|
+
const service = container.get(task_context_file_storage_service_1.TaskContextFileStorageService);
|
|
91
|
+
await service.store({ id: 'task-1', label: 'Fix the build', summary: '# Plan\n\nDo it.' });
|
|
92
|
+
const summary = await service.get('task-1');
|
|
93
|
+
(0, chai_1.expect)(summary?.summary).to.equal('# Plan\n\nDo it.');
|
|
94
|
+
(0, chai_1.expect)(summary?.label).to.equal('Fix the build');
|
|
95
|
+
});
|
|
96
|
+
it('still reads files written without the opening separator', async () => {
|
|
97
|
+
files.set(storageLocation.resolve('legacy.md').toString(), 'id: legacy-task\nlabel: Legacy task\n---\n# Legacy plan');
|
|
98
|
+
const service = await loadStoredFiles();
|
|
99
|
+
const summary = await service.get('legacy-task');
|
|
100
|
+
(0, chai_1.expect)(summary?.label).to.equal('Legacy task');
|
|
101
|
+
(0, chai_1.expect)(summary?.summary).to.equal('# Legacy plan');
|
|
102
|
+
});
|
|
103
|
+
it('still reads files written without the opening separator and with CRLF line endings', async () => {
|
|
104
|
+
files.set(storageLocation.resolve('legacy.md').toString(), 'id: legacy-task\r\nlabel: Legacy task\r\n---\r\n# Legacy plan\r\n\r\nDo it.');
|
|
105
|
+
const service = await loadStoredFiles();
|
|
106
|
+
const summary = await service.get('legacy-task');
|
|
107
|
+
(0, chai_1.expect)(summary?.label).to.equal('Legacy task');
|
|
108
|
+
(0, chai_1.expect)(summary?.summary).to.equal('# Legacy plan\r\n\r\nDo it.');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=task-context-file-storage-service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-context-file-storage-service.spec.js","sourceRoot":"","sources":["../../src/browser/task-context-file-storage-service.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-ide",
|
|
3
|
-
"version": "1.77.0-next.
|
|
3
|
+
"version": "1.77.0-next.37+29045502ffe",
|
|
4
4
|
"description": "AI IDE Agents Extension",
|
|
5
5
|
"license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -15,30 +15,29 @@
|
|
|
15
15
|
"theia-extension"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@theia/ai-chat": "1.77.0-next.
|
|
19
|
-
"@theia/ai-chat-ui": "1.77.0-next.
|
|
20
|
-
"@theia/ai-core": "1.77.0-next.
|
|
21
|
-
"@theia/ai-core-ui": "1.77.0-next.
|
|
22
|
-
"@theia/ai-mcp": "1.77.0-next.
|
|
23
|
-
"@theia/ai-terminal": "1.77.0-next.
|
|
24
|
-
"@theia/core": "1.77.0-next.
|
|
25
|
-
"@theia/debug": "1.77.0-next.
|
|
26
|
-
"@theia/editor": "1.77.0-next.
|
|
27
|
-
"@theia/file-search": "1.77.0-next.
|
|
28
|
-
"@theia/filesystem": "1.77.0-next.
|
|
29
|
-
"@theia/getting-started": "1.77.0-next.
|
|
30
|
-
"@theia/markers": "1.77.0-next.
|
|
31
|
-
"@theia/monaco": "1.77.0-next.
|
|
32
|
-
"@theia/navigator": "1.77.0-next.
|
|
33
|
-
"@theia/preferences": "1.77.0-next.
|
|
34
|
-
"@theia/scm": "1.77.0-next.
|
|
35
|
-
"@theia/search-in-workspace": "1.77.0-next.
|
|
36
|
-
"@theia/task": "1.77.0-next.
|
|
37
|
-
"@theia/terminal": "1.77.0-next.
|
|
38
|
-
"@theia/workspace": "1.77.0-next.
|
|
18
|
+
"@theia/ai-chat": "1.77.0-next.37+29045502ffe",
|
|
19
|
+
"@theia/ai-chat-ui": "1.77.0-next.37+29045502ffe",
|
|
20
|
+
"@theia/ai-core": "1.77.0-next.37+29045502ffe",
|
|
21
|
+
"@theia/ai-core-ui": "1.77.0-next.37+29045502ffe",
|
|
22
|
+
"@theia/ai-mcp": "1.77.0-next.37+29045502ffe",
|
|
23
|
+
"@theia/ai-terminal": "1.77.0-next.37+29045502ffe",
|
|
24
|
+
"@theia/core": "1.77.0-next.37+29045502ffe",
|
|
25
|
+
"@theia/debug": "1.77.0-next.37+29045502ffe",
|
|
26
|
+
"@theia/editor": "1.77.0-next.37+29045502ffe",
|
|
27
|
+
"@theia/file-search": "1.77.0-next.37+29045502ffe",
|
|
28
|
+
"@theia/filesystem": "1.77.0-next.37+29045502ffe",
|
|
29
|
+
"@theia/getting-started": "1.77.0-next.37+29045502ffe",
|
|
30
|
+
"@theia/markers": "1.77.0-next.37+29045502ffe",
|
|
31
|
+
"@theia/monaco": "1.77.0-next.37+29045502ffe",
|
|
32
|
+
"@theia/navigator": "1.77.0-next.37+29045502ffe",
|
|
33
|
+
"@theia/preferences": "1.77.0-next.37+29045502ffe",
|
|
34
|
+
"@theia/scm": "1.77.0-next.37+29045502ffe",
|
|
35
|
+
"@theia/search-in-workspace": "1.77.0-next.37+29045502ffe",
|
|
36
|
+
"@theia/task": "1.77.0-next.37+29045502ffe",
|
|
37
|
+
"@theia/terminal": "1.77.0-next.37+29045502ffe",
|
|
38
|
+
"@theia/workspace": "1.77.0-next.37+29045502ffe",
|
|
39
39
|
"date-fns": "^4.4.0",
|
|
40
40
|
"ignore": "^6.0.2",
|
|
41
|
-
"js-yaml": "^4.3.2",
|
|
42
41
|
"minimatch": "^10.2.6",
|
|
43
42
|
"puppeteer-core": "^25.1.0",
|
|
44
43
|
"simple-git": "^3.36.0"
|
|
@@ -47,8 +46,8 @@
|
|
|
47
46
|
"access": "public"
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
|
-
"@theia/cli": "1.77.0-next.
|
|
51
|
-
"@theia/test": "1.77.0-next.
|
|
49
|
+
"@theia/cli": "1.77.0-next.37+29045502ffe",
|
|
50
|
+
"@theia/test": "1.77.0-next.37+29045502ffe"
|
|
52
51
|
},
|
|
53
52
|
"theiaExtensions": [
|
|
54
53
|
{
|
|
@@ -72,5 +71,5 @@
|
|
|
72
71
|
"nyc": {
|
|
73
72
|
"extends": "../../configs/nyc.json"
|
|
74
73
|
},
|
|
75
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "29045502ffe2bd1ecd5c655b40f37f0d0bc0c4ad"
|
|
76
75
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom';
|
|
18
|
+
const disableJSDOM = enableJSDOM();
|
|
19
|
+
import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider';
|
|
20
|
+
FrontendApplicationConfigProvider.set({});
|
|
21
|
+
import { expect } from 'chai';
|
|
22
|
+
import { Container } from '@theia/core/shared/inversify';
|
|
23
|
+
import { Disposable, Event, ILogger, PreferenceService, URI } from '@theia/core';
|
|
24
|
+
import { OpenerService } from '@theia/core/lib/browser';
|
|
25
|
+
import { BinaryBuffer } from '@theia/core/lib/common/buffer';
|
|
26
|
+
import { AIVariableResourceResolver } from '@theia/ai-core';
|
|
27
|
+
import { InMemoryTaskContextStorage } from '@theia/ai-chat/lib/browser/task-context-storage-service';
|
|
28
|
+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
29
|
+
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
30
|
+
import { TaskContextFileStorageService } from './task-context-file-storage-service';
|
|
31
|
+
disableJSDOM();
|
|
32
|
+
|
|
33
|
+
const workspaceRoot = new URI('file:///workspace');
|
|
34
|
+
const storageLocation = workspaceRoot.resolve('.prompts/task-contexts');
|
|
35
|
+
|
|
36
|
+
describe('TaskContextFileStorageService', () => {
|
|
37
|
+
|
|
38
|
+
let files: Map<string, string>;
|
|
39
|
+
let container: Container;
|
|
40
|
+
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
files = new Map();
|
|
43
|
+
container = new Container();
|
|
44
|
+
container.bind(FileService).toConstantValue({
|
|
45
|
+
watch: () => Disposable.NULL,
|
|
46
|
+
onDidFilesChange: () => Disposable.NULL,
|
|
47
|
+
resolve: async (uri: URI) => ({
|
|
48
|
+
children: [...files.keys()].map(key => new URI(key)).filter(resource => uri.isEqualOrParent(resource)).map(resource => ({ resource }))
|
|
49
|
+
}),
|
|
50
|
+
read: async (uri: URI) => {
|
|
51
|
+
const value = files.get(uri.toString());
|
|
52
|
+
if (value === undefined) {
|
|
53
|
+
throw new Error(`No file at ${uri}`);
|
|
54
|
+
}
|
|
55
|
+
return { value };
|
|
56
|
+
},
|
|
57
|
+
writeFile: async (uri: URI, content: BinaryBuffer) => {
|
|
58
|
+
files.set(uri.toString(), content.toString());
|
|
59
|
+
}
|
|
60
|
+
} as unknown as FileService);
|
|
61
|
+
container.bind(WorkspaceService).toConstantValue({
|
|
62
|
+
opened: true,
|
|
63
|
+
ready: Promise.resolve(),
|
|
64
|
+
tryGetRoots: () => [{ resource: workspaceRoot }]
|
|
65
|
+
} as unknown as WorkspaceService);
|
|
66
|
+
container.bind(PreferenceService).toConstantValue({
|
|
67
|
+
ready: Promise.resolve(),
|
|
68
|
+
inspect: () => ({ defaultValue: '.prompts/task-contexts' }),
|
|
69
|
+
onPreferenceChanged: () => Disposable.NULL
|
|
70
|
+
} as unknown as PreferenceService);
|
|
71
|
+
container.bind(ILogger).toConstantValue({ error: () => { } } as unknown as ILogger);
|
|
72
|
+
container.bind(OpenerService).toConstantValue({} as OpenerService);
|
|
73
|
+
container.bind(AIVariableResourceResolver).toConstantValue({} as AIVariableResourceResolver);
|
|
74
|
+
container.bind(InMemoryTaskContextStorage).toSelf().inSingletonScope();
|
|
75
|
+
container.bind(TaskContextFileStorageService).toSelf().inSingletonScope();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/** Creates the service and waits for its startup scan to load the files already in the storage location. */
|
|
79
|
+
const loadStoredFiles = async (): Promise<TaskContextFileStorageService> => {
|
|
80
|
+
const service = container.get(TaskContextFileStorageService);
|
|
81
|
+
await Event.toPromise(service.onDidChange);
|
|
82
|
+
return service;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
it('writes the metadata as standard frontmatter', async () => {
|
|
86
|
+
const service = container.get(TaskContextFileStorageService);
|
|
87
|
+
await service.store({ id: 'task-1', sessionId: 'session-1', label: 'Fix the build', summary: '# Plan\n\nDo it.' });
|
|
88
|
+
|
|
89
|
+
const content = files.get(storageLocation.resolve('Fix-the-build.md').toString());
|
|
90
|
+
expect(content).to.not.be.undefined;
|
|
91
|
+
const lines = content!.split('\n');
|
|
92
|
+
expect(lines[0]).to.equal('---');
|
|
93
|
+
expect(lines).to.include.members(['id: task-1', 'sessionId: session-1', 'label: Fix the build']);
|
|
94
|
+
expect(content).to.match(/\n---\n# Plan\n\nDo it\.$/);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('reads back the body without the frontmatter', async () => {
|
|
98
|
+
const service = container.get(TaskContextFileStorageService);
|
|
99
|
+
await service.store({ id: 'task-1', label: 'Fix the build', summary: '# Plan\n\nDo it.' });
|
|
100
|
+
|
|
101
|
+
const summary = await service.get('task-1');
|
|
102
|
+
expect(summary?.summary).to.equal('# Plan\n\nDo it.');
|
|
103
|
+
expect(summary?.label).to.equal('Fix the build');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('still reads files written without the opening separator', async () => {
|
|
107
|
+
files.set(storageLocation.resolve('legacy.md').toString(), 'id: legacy-task\nlabel: Legacy task\n---\n# Legacy plan');
|
|
108
|
+
|
|
109
|
+
const service = await loadStoredFiles();
|
|
110
|
+
|
|
111
|
+
const summary = await service.get('legacy-task');
|
|
112
|
+
expect(summary?.label).to.equal('Legacy task');
|
|
113
|
+
expect(summary?.summary).to.equal('# Legacy plan');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('still reads files written without the opening separator and with CRLF line endings', async () => {
|
|
117
|
+
files.set(storageLocation.resolve('legacy.md').toString(), 'id: legacy-task\r\nlabel: Legacy task\r\n---\r\n# Legacy plan\r\n\r\nDo it.');
|
|
118
|
+
|
|
119
|
+
const service = await loadStoredFiles();
|
|
120
|
+
|
|
121
|
+
const summary = await service.get('legacy-task');
|
|
122
|
+
expect(summary?.label).to.equal('Legacy task');
|
|
123
|
+
expect(summary?.summary).to.equal('# Legacy plan\r\n\r\nDo it.');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -16,13 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
import { Summary, SummaryMetadata, TaskContextStorageService } from '@theia/ai-chat/lib/browser/task-context-service';
|
|
18
18
|
import { InMemoryTaskContextStorage } from '@theia/ai-chat/lib/browser/task-context-storage-service';
|
|
19
|
-
import { parseFrontmatter } from '@theia/ai-core/lib/common/frontmatter';
|
|
19
|
+
import { parseFrontmatter, serializeFrontmatter } from '@theia/ai-core/lib/common/frontmatter';
|
|
20
20
|
import { inject, injectable, postConstruct, named } from '@theia/core/shared/inversify';
|
|
21
|
-
import { DisposableCollection,
|
|
21
|
+
import { DisposableCollection, Emitter, ILogger, Path, PreferenceService, URI, unreachable } from '@theia/core';
|
|
22
22
|
import { OpenerService, open } from '@theia/core/lib/browser';
|
|
23
23
|
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
24
24
|
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
25
|
-
import * as yaml from 'js-yaml';
|
|
26
25
|
import { FileChange, FileChangeType } from '@theia/filesystem/lib/common/files';
|
|
27
26
|
import { TASK_CONTEXT_STORAGE_DIRECTORY_PREF } from '../common/workspace-preferences';
|
|
28
27
|
import { BinaryBuffer } from '@theia/core/lib/common/buffer';
|
|
@@ -160,7 +159,7 @@ export class TaskContextFileStorageService implements TaskContextStorageService
|
|
|
160
159
|
};
|
|
161
160
|
const derivedName = label.trim().replace(/[^\p{L}\p{N}]/ug, '-').replace(/^-+|-+$/g, '');
|
|
162
161
|
const filename = (derivedName.length > 32 ? derivedName.slice(0, derivedName.indexOf('-', 32)) : derivedName) + '.md';
|
|
163
|
-
const content =
|
|
162
|
+
const content = serializeFrontmatter(frontmatter, summary.summary);
|
|
164
163
|
const uri = storageLocation.resolve(filename);
|
|
165
164
|
summary.uri = uri;
|
|
166
165
|
await this.fileService.writeFile(uri, BinaryBuffer.fromString(content));
|