Ferrell Synthetic Intelligence commited on
Commit
69ba4eb
·
1 Parent(s): 4ed7180

Add managed TypeScript LSP support

Browse files
README.md CHANGED
@@ -51,6 +51,8 @@ The local CaseFile workflow in the UI creates a private case, imports local evid
51
 
52
  The Community Hub provides an offline cache for projects, issues, discussions, and marketplace metadata. Sync remains disabled until an encrypted transport is explicitly configured.
53
 
 
 
54
  ## Status
55
 
56
  This is a pre-production engineering release. The Liquid checkpoint is not included until its exact artifact, license, checksum, and evaluation are confirmed. The Qwen weight is downloaded separately from its official repository and should be verified before offline use.
 
51
 
52
  The Community Hub provides an offline cache for projects, issues, discussions, and marketplace metadata. Sync remains disabled until an encrypted transport is explicitly configured.
53
 
54
+ The daemon now owns an allowlisted LSP registry. TypeScript language intelligence is available through `languages/manifest.json`; models remain responsible for proposals, not syntax or semantic truth.
55
+
56
  ## Status
57
 
58
  This is a pre-production engineering release. The Liquid checkpoint is not included until its exact artifact, license, checksum, and evaluation are confirmed. The Qwen weight is downloaded separately from its official repository and should be verified before offline use.
daemon/lsp-manager.mjs ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawn } from 'node:child_process';
4
+
5
+ export class LspManager {
6
+ constructor({ manifestPath, workspace, spawnProcess = spawn } = {}) {
7
+ this.manifestPath = manifestPath;
8
+ this.workspace = workspace;
9
+ this.spawnProcess = spawnProcess;
10
+ this.servers = new Map();
11
+ this.processes = new Map();
12
+ }
13
+
14
+ async load() {
15
+ const manifest = JSON.parse(await fs.readFile(this.manifestPath, 'utf8'));
16
+ this.servers = new Map(manifest.servers.map(server => [server.id, server]));
17
+ return manifest;
18
+ }
19
+
20
+ status() {
21
+ return [...this.servers.values()].map(server => ({
22
+ id: server.id,
23
+ name: server.name,
24
+ languages: server.languages,
25
+ status: this.processes.has(server.id) ? 'running' : server.status
26
+ }));
27
+ }
28
+
29
+ async start(id) {
30
+ const server = this.servers.get(id);
31
+ if (!server) throw new Error('language server is not allowlisted');
32
+ if (this.processes.has(id)) return { id, status: 'running' };
33
+ const command = path.resolve(this.workspace, server.command);
34
+ await fs.access(command).catch(() => { throw new Error(`language server is unavailable: ${command}`); });
35
+ const child = this.spawnProcess(command, server.args, { cwd: this.workspace, stdio: ['pipe', 'pipe', 'pipe'] });
36
+ this.processes.set(id, child);
37
+ child.once('exit', () => this.processes.delete(id));
38
+ return { id, status: 'starting', languages: server.languages };
39
+ }
40
+
41
+ async stop(id) {
42
+ const child = this.processes.get(id);
43
+ if (!child) return { id, status: 'stopped' };
44
+ child.kill('SIGTERM');
45
+ this.processes.delete(id);
46
+ return { id, status: 'stopped' };
47
+ }
48
+ }
daemon/server.mjs CHANGED
@@ -4,6 +4,7 @@ import { promises as fs } from 'node:fs';
4
  import path from 'node:path';
5
  import { ModelManager } from './model-manager.mjs';
6
  import { CommunityStore } from '../community/store.mjs';
 
7
 
8
  const HOST = '127.0.0.1';
9
  const PORT = Number(process.env.AIDE_DAEMON_PORT || 4777);
@@ -14,6 +15,8 @@ const modelManager = new ModelManager({ manifestPath: MANIFEST, modelDir: MODEL_
14
  await modelManager.load().catch(() => {});
15
  const communityStore = new CommunityStore(path.join(WORKSPACE, 'community', 'store.json'));
16
  await communityStore.load().catch(() => {});
 
 
17
 
18
  function json(response, status, body) {
19
  const payload = JSON.stringify(body);
@@ -75,6 +78,15 @@ const server = http.createServer(async (request, response) => {
75
  if (request.method === 'GET' && request.url === '/api/community') {
76
  return json(response, 200, communityStore.list());
77
  }
 
 
 
 
 
 
 
 
 
78
  if (request.method === 'POST' && request.url === '/api/community/items') {
79
  const input = await body(request);
80
  return json(response, 201, { item: await communityStore.add(input.type, input.item) });
 
4
  import path from 'node:path';
5
  import { ModelManager } from './model-manager.mjs';
6
  import { CommunityStore } from '../community/store.mjs';
7
+ import { LspManager } from './lsp-manager.mjs';
8
 
9
  const HOST = '127.0.0.1';
10
  const PORT = Number(process.env.AIDE_DAEMON_PORT || 4777);
 
15
  await modelManager.load().catch(() => {});
16
  const communityStore = new CommunityStore(path.join(WORKSPACE, 'community', 'store.json'));
17
  await communityStore.load().catch(() => {});
18
+ const lspManager = new LspManager({ manifestPath: path.join(WORKSPACE, 'languages', 'manifest.json'), workspace: WORKSPACE });
19
+ await lspManager.load().catch(() => {});
20
 
21
  function json(response, status, body) {
22
  const payload = JSON.stringify(body);
 
78
  if (request.method === 'GET' && request.url === '/api/community') {
79
  return json(response, 200, communityStore.list());
80
  }
81
+ if (request.method === 'GET' && request.url === '/api/lsp/status') {
82
+ return json(response, 200, { servers: lspManager.status() });
83
+ }
84
+ if (request.method === 'POST' && request.url === '/api/lsp/start') {
85
+ return json(response, 200, await lspManager.start((await body(request)).id));
86
+ }
87
+ if (request.method === 'POST' && request.url === '/api/lsp/stop') {
88
+ return json(response, 200, await lspManager.stop((await body(request)).id));
89
+ }
90
  if (request.method === 'POST' && request.url === '/api/community/items') {
91
  const input = await body(request);
92
  return json(response, 201, { item: await communityStore.add(input.type, input.item) });
daemon/test-lsp-manager.mjs ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtemp, writeFile, mkdir } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { LspManager } from './lsp-manager.mjs';
6
+
7
+ const root = await mkdtemp(path.join(tmpdir(), 'aide-lsp-'));
8
+ await mkdir(path.join(root, 'node_modules', '.bin'), { recursive: true });
9
+ await writeFile(path.join(root, 'languages.json'), JSON.stringify({ servers: [{ id: 'ts', name: 'TS', command: 'node_modules/.bin/tsserver', args: [], languages: ['typescript'], status: 'available' }] }));
10
+ await writeFile(path.join(root, 'node_modules', '.bin', 'tsserver'), '');
11
+ const manager = new LspManager({ manifestPath: path.join(root, 'languages.json'), workspace: root, spawnProcess: () => ({ once() {}, kill() {} }) });
12
+ await manager.load();
13
+ assert.equal(manager.status()[0].status, 'available');
14
+ assert.deepEqual(await manager.start('ts'), { id: 'ts', status: 'starting', languages: ['typescript'] });
15
+ await assert.rejects(manager.start('unknown'), /not allowlisted/);
16
+ console.log('lsp manager test passed');
languages/manifest.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": "1.0",
3
+ "servers": [
4
+ {
5
+ "id": "typescript",
6
+ "name": "TypeScript Language Server",
7
+ "command": "node_modules/.bin/typescript-language-server",
8
+ "args": ["--stdio"],
9
+ "languages": ["javascript", "javascriptreact", "typescript", "typescriptreact"],
10
+ "protocol": "LSP",
11
+ "status": "available"
12
+ }
13
+ ]
14
+ }
package-lock.json ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "aide-sovereign-workbench",
3
+ "version": "0.1.0-preflight",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "aide-sovereign-workbench",
9
+ "version": "0.1.0-preflight",
10
+ "license": "Apache-2.0",
11
+ "dependencies": {
12
+ "typescript": "^7.0.2",
13
+ "typescript-language-server": "^5.3.0"
14
+ },
15
+ "engines": {
16
+ "node": ">=20"
17
+ }
18
+ },
19
+ "node_modules/@typescript/typescript-aix-ppc64": {
20
+ "version": "7.0.2",
21
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz",
22
+ "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==",
23
+ "cpu": [
24
+ "ppc64"
25
+ ],
26
+ "license": "Apache-2.0",
27
+ "optional": true,
28
+ "os": [
29
+ "aix"
30
+ ],
31
+ "engines": {
32
+ "node": ">=16.20.0"
33
+ }
34
+ },
35
+ "node_modules/@typescript/typescript-darwin-arm64": {
36
+ "version": "7.0.2",
37
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz",
38
+ "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==",
39
+ "cpu": [
40
+ "arm64"
41
+ ],
42
+ "license": "Apache-2.0",
43
+ "optional": true,
44
+ "os": [
45
+ "darwin"
46
+ ],
47
+ "engines": {
48
+ "node": ">=16.20.0"
49
+ }
50
+ },
51
+ "node_modules/@typescript/typescript-darwin-x64": {
52
+ "version": "7.0.2",
53
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz",
54
+ "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==",
55
+ "cpu": [
56
+ "x64"
57
+ ],
58
+ "license": "Apache-2.0",
59
+ "optional": true,
60
+ "os": [
61
+ "darwin"
62
+ ],
63
+ "engines": {
64
+ "node": ">=16.20.0"
65
+ }
66
+ },
67
+ "node_modules/@typescript/typescript-freebsd-arm64": {
68
+ "version": "7.0.2",
69
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz",
70
+ "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==",
71
+ "cpu": [
72
+ "arm64"
73
+ ],
74
+ "license": "Apache-2.0",
75
+ "optional": true,
76
+ "os": [
77
+ "freebsd"
78
+ ],
79
+ "engines": {
80
+ "node": ">=16.20.0"
81
+ }
82
+ },
83
+ "node_modules/@typescript/typescript-freebsd-x64": {
84
+ "version": "7.0.2",
85
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz",
86
+ "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==",
87
+ "cpu": [
88
+ "x64"
89
+ ],
90
+ "license": "Apache-2.0",
91
+ "optional": true,
92
+ "os": [
93
+ "freebsd"
94
+ ],
95
+ "engines": {
96
+ "node": ">=16.20.0"
97
+ }
98
+ },
99
+ "node_modules/@typescript/typescript-linux-arm": {
100
+ "version": "7.0.2",
101
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz",
102
+ "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==",
103
+ "cpu": [
104
+ "arm"
105
+ ],
106
+ "license": "Apache-2.0",
107
+ "optional": true,
108
+ "os": [
109
+ "linux"
110
+ ],
111
+ "engines": {
112
+ "node": ">=16.20.0"
113
+ }
114
+ },
115
+ "node_modules/@typescript/typescript-linux-arm64": {
116
+ "version": "7.0.2",
117
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz",
118
+ "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==",
119
+ "cpu": [
120
+ "arm64"
121
+ ],
122
+ "license": "Apache-2.0",
123
+ "optional": true,
124
+ "os": [
125
+ "linux"
126
+ ],
127
+ "engines": {
128
+ "node": ">=16.20.0"
129
+ }
130
+ },
131
+ "node_modules/@typescript/typescript-linux-loong64": {
132
+ "version": "7.0.2",
133
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz",
134
+ "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==",
135
+ "cpu": [
136
+ "loong64"
137
+ ],
138
+ "license": "Apache-2.0",
139
+ "optional": true,
140
+ "os": [
141
+ "linux"
142
+ ],
143
+ "engines": {
144
+ "node": ">=16.20.0"
145
+ }
146
+ },
147
+ "node_modules/@typescript/typescript-linux-mips64el": {
148
+ "version": "7.0.2",
149
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz",
150
+ "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==",
151
+ "cpu": [
152
+ "mips64el"
153
+ ],
154
+ "license": "Apache-2.0",
155
+ "optional": true,
156
+ "os": [
157
+ "linux"
158
+ ],
159
+ "engines": {
160
+ "node": ">=16.20.0"
161
+ }
162
+ },
163
+ "node_modules/@typescript/typescript-linux-ppc64": {
164
+ "version": "7.0.2",
165
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz",
166
+ "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==",
167
+ "cpu": [
168
+ "ppc64"
169
+ ],
170
+ "license": "Apache-2.0",
171
+ "optional": true,
172
+ "os": [
173
+ "linux"
174
+ ],
175
+ "engines": {
176
+ "node": ">=16.20.0"
177
+ }
178
+ },
179
+ "node_modules/@typescript/typescript-linux-riscv64": {
180
+ "version": "7.0.2",
181
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz",
182
+ "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==",
183
+ "cpu": [
184
+ "riscv64"
185
+ ],
186
+ "license": "Apache-2.0",
187
+ "optional": true,
188
+ "os": [
189
+ "linux"
190
+ ],
191
+ "engines": {
192
+ "node": ">=16.20.0"
193
+ }
194
+ },
195
+ "node_modules/@typescript/typescript-linux-s390x": {
196
+ "version": "7.0.2",
197
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz",
198
+ "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==",
199
+ "cpu": [
200
+ "s390x"
201
+ ],
202
+ "license": "Apache-2.0",
203
+ "optional": true,
204
+ "os": [
205
+ "linux"
206
+ ],
207
+ "engines": {
208
+ "node": ">=16.20.0"
209
+ }
210
+ },
211
+ "node_modules/@typescript/typescript-linux-x64": {
212
+ "version": "7.0.2",
213
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz",
214
+ "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==",
215
+ "cpu": [
216
+ "x64"
217
+ ],
218
+ "license": "Apache-2.0",
219
+ "optional": true,
220
+ "os": [
221
+ "linux"
222
+ ],
223
+ "engines": {
224
+ "node": ">=16.20.0"
225
+ }
226
+ },
227
+ "node_modules/@typescript/typescript-netbsd-arm64": {
228
+ "version": "7.0.2",
229
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz",
230
+ "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==",
231
+ "cpu": [
232
+ "arm64"
233
+ ],
234
+ "license": "Apache-2.0",
235
+ "optional": true,
236
+ "os": [
237
+ "netbsd"
238
+ ],
239
+ "engines": {
240
+ "node": ">=16.20.0"
241
+ }
242
+ },
243
+ "node_modules/@typescript/typescript-netbsd-x64": {
244
+ "version": "7.0.2",
245
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz",
246
+ "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==",
247
+ "cpu": [
248
+ "x64"
249
+ ],
250
+ "license": "Apache-2.0",
251
+ "optional": true,
252
+ "os": [
253
+ "netbsd"
254
+ ],
255
+ "engines": {
256
+ "node": ">=16.20.0"
257
+ }
258
+ },
259
+ "node_modules/@typescript/typescript-openbsd-arm64": {
260
+ "version": "7.0.2",
261
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz",
262
+ "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==",
263
+ "cpu": [
264
+ "arm64"
265
+ ],
266
+ "license": "Apache-2.0",
267
+ "optional": true,
268
+ "os": [
269
+ "openbsd"
270
+ ],
271
+ "engines": {
272
+ "node": ">=16.20.0"
273
+ }
274
+ },
275
+ "node_modules/@typescript/typescript-openbsd-x64": {
276
+ "version": "7.0.2",
277
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz",
278
+ "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==",
279
+ "cpu": [
280
+ "x64"
281
+ ],
282
+ "license": "Apache-2.0",
283
+ "optional": true,
284
+ "os": [
285
+ "openbsd"
286
+ ],
287
+ "engines": {
288
+ "node": ">=16.20.0"
289
+ }
290
+ },
291
+ "node_modules/@typescript/typescript-sunos-x64": {
292
+ "version": "7.0.2",
293
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz",
294
+ "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==",
295
+ "cpu": [
296
+ "x64"
297
+ ],
298
+ "license": "Apache-2.0",
299
+ "optional": true,
300
+ "os": [
301
+ "sunos"
302
+ ],
303
+ "engines": {
304
+ "node": ">=16.20.0"
305
+ }
306
+ },
307
+ "node_modules/@typescript/typescript-win32-arm64": {
308
+ "version": "7.0.2",
309
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz",
310
+ "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==",
311
+ "cpu": [
312
+ "arm64"
313
+ ],
314
+ "license": "Apache-2.0",
315
+ "optional": true,
316
+ "os": [
317
+ "win32"
318
+ ],
319
+ "engines": {
320
+ "node": ">=16.20.0"
321
+ }
322
+ },
323
+ "node_modules/@typescript/typescript-win32-x64": {
324
+ "version": "7.0.2",
325
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz",
326
+ "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==",
327
+ "cpu": [
328
+ "x64"
329
+ ],
330
+ "license": "Apache-2.0",
331
+ "optional": true,
332
+ "os": [
333
+ "win32"
334
+ ],
335
+ "engines": {
336
+ "node": ">=16.20.0"
337
+ }
338
+ },
339
+ "node_modules/typescript": {
340
+ "version": "7.0.2",
341
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz",
342
+ "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==",
343
+ "license": "Apache-2.0",
344
+ "bin": {
345
+ "tsc": "bin/tsc"
346
+ },
347
+ "engines": {
348
+ "node": ">=16.20.0"
349
+ },
350
+ "optionalDependencies": {
351
+ "@typescript/typescript-aix-ppc64": "7.0.2",
352
+ "@typescript/typescript-darwin-arm64": "7.0.2",
353
+ "@typescript/typescript-darwin-x64": "7.0.2",
354
+ "@typescript/typescript-freebsd-arm64": "7.0.2",
355
+ "@typescript/typescript-freebsd-x64": "7.0.2",
356
+ "@typescript/typescript-linux-arm": "7.0.2",
357
+ "@typescript/typescript-linux-arm64": "7.0.2",
358
+ "@typescript/typescript-linux-loong64": "7.0.2",
359
+ "@typescript/typescript-linux-mips64el": "7.0.2",
360
+ "@typescript/typescript-linux-ppc64": "7.0.2",
361
+ "@typescript/typescript-linux-riscv64": "7.0.2",
362
+ "@typescript/typescript-linux-s390x": "7.0.2",
363
+ "@typescript/typescript-linux-x64": "7.0.2",
364
+ "@typescript/typescript-netbsd-arm64": "7.0.2",
365
+ "@typescript/typescript-netbsd-x64": "7.0.2",
366
+ "@typescript/typescript-openbsd-arm64": "7.0.2",
367
+ "@typescript/typescript-openbsd-x64": "7.0.2",
368
+ "@typescript/typescript-sunos-x64": "7.0.2",
369
+ "@typescript/typescript-win32-arm64": "7.0.2",
370
+ "@typescript/typescript-win32-x64": "7.0.2"
371
+ }
372
+ },
373
+ "node_modules/typescript-language-server": {
374
+ "version": "5.3.0",
375
+ "resolved": "https://registry.npmjs.org/typescript-language-server/-/typescript-language-server-5.3.0.tgz",
376
+ "integrity": "sha512-5puofxZHgFdAYtfNpmwCAvgtaYgg8wrUnH30m7Ze3QuguId5RNRadKASpOpyDxTyUdAF51FjhTdjntLw/EuWcQ==",
377
+ "license": "Apache-2.0",
378
+ "bin": {
379
+ "typescript-language-server": "lib/cli.mjs"
380
+ },
381
+ "engines": {
382
+ "node": ">=20"
383
+ }
384
+ }
385
+ }
386
+ }
package.json CHANGED
@@ -5,12 +5,16 @@
5
  "description": "Local-first sovereign development workbench",
6
  "type": "module",
7
  "scripts": {
8
- "test": "node tests/smoke.mjs && node harness/test-orchestrator.mjs && node daemon/test-model-manager.mjs && node daemon/test-community-store.mjs",
9
  "check": "node --check app.js && node --check daemon/server.mjs && node --check harness/orchestrator.mjs && node --check harness/checks.mjs",
10
  "veritas": "node harness/run-veritas.mjs"
11
  },
12
  "engines": {
13
  "node": ">=20"
14
  },
15
- "license": "Apache-2.0"
 
 
 
 
16
  }
 
5
  "description": "Local-first sovereign development workbench",
6
  "type": "module",
7
  "scripts": {
8
+ "test": "node tests/smoke.mjs && node harness/test-orchestrator.mjs && node daemon/test-model-manager.mjs && node daemon/test-community-store.mjs && node daemon/test-lsp-manager.mjs",
9
  "check": "node --check app.js && node --check daemon/server.mjs && node --check harness/orchestrator.mjs && node --check harness/checks.mjs",
10
  "veritas": "node harness/run-veritas.mjs"
11
  },
12
  "engines": {
13
  "node": ">=20"
14
  },
15
+ "license": "Apache-2.0",
16
+ "dependencies": {
17
+ "typescript": "^7.0.2",
18
+ "typescript-language-server": "^5.3.0"
19
+ }
20
  }