@nexrall/code-core 1.4.71 → 1.4.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agentRegistry.d.ts.map +1 -1
- package/dist/agent/agentRegistry.js +28 -10
- package/dist/agent/agentTypes.d.ts.map +1 -1
- package/dist/agent/agentTypes.js +159 -48
- package/dist/agent/askOnce.d.ts.map +1 -1
- package/dist/agent/askOnce.js +14 -5
- package/dist/agent/backgroundAgents.d.ts.map +1 -1
- package/dist/agent/backgroundAgents.js +22 -8
- package/dist/agent/claimEvidence.d.ts.map +1 -1
- package/dist/agent/claimEvidence.js +2 -1
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +31 -10
- package/dist/agent/crossProcessLock.d.ts.map +1 -1
- package/dist/agent/crossProcessLock.js +14 -6
- package/dist/agent/editCompleteness.d.ts.map +1 -1
- package/dist/agent/fileLocks.d.ts.map +1 -1
- package/dist/agent/fileLocks.js +14 -5
- package/dist/agent/flaky.d.ts.map +1 -1
- package/dist/agent/hooks.d.ts.map +1 -1
- package/dist/agent/hooks.js +284 -75
- package/dist/agent/iterationPolicy.d.ts.map +1 -1
- package/dist/agent/iterationPolicy.js +26 -23
- package/dist/agent/lifecycleHost.d.ts.map +1 -1
- package/dist/agent/lifecycleHost.js +35 -11
- package/dist/agent/loop.d.ts +22 -4
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +238 -51
- package/dist/agent/memory.d.ts.map +1 -1
- package/dist/agent/memory.js +13 -7
- package/dist/agent/modelCatalogue.d.ts.map +1 -1
- package/dist/agent/modelCatalogue.js +4 -1
- package/dist/agent/nestedInstructions.d.ts +122 -0
- package/dist/agent/nestedInstructions.d.ts.map +1 -0
- package/dist/agent/nestedInstructions.js +696 -0
- package/dist/agent/peerRegistry.d.ts.map +1 -1
- package/dist/agent/peerRegistry.js +44 -6
- package/dist/agent/peerTransport.d.ts.map +1 -1
- package/dist/agent/peerTransport.js +18 -6
- package/dist/agent/planMode.d.ts.map +1 -1
- package/dist/agent/planMode.js +194 -41
- package/dist/agent/readDedupe.d.ts.map +1 -1
- package/dist/agent/readDedupe.js +3 -1
- package/dist/agent/securityLint.d.ts.map +1 -1
- package/dist/agent/sharedTasks.d.ts.map +1 -1
- package/dist/agent/sharedTasks.js +20 -5
- package/dist/agent/skills.d.ts +79 -0
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +403 -14
- package/dist/agent/subAgentBudget.d.ts.map +1 -1
- package/dist/agent/subTask.d.ts.map +1 -1
- package/dist/agent/subTask.js +87 -37
- package/dist/agent/subTaskSupport.d.ts.map +1 -1
- package/dist/agent/subTaskSupport.js +43 -14
- package/dist/agent/testIntegrity.d.ts.map +1 -1
- package/dist/agent/testIntegrity.js +4 -2
- package/dist/agent/toolDescriptions.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.d.ts.map +1 -1
- package/dist/agent/toolPrefetch.js +15 -11
- package/dist/agent/trust.d.ts.map +1 -1
- package/dist/agent/trust.js +6 -2
- package/dist/agent/worktree.d.ts.map +1 -1
- package/dist/agent/worktree.js +70 -16
- package/dist/agent/worktreeEnforcement.d.ts.map +1 -1
- package/dist/agent/worktreeEnforcement.js +9 -4
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +64 -31
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/checkpoint/manager.d.ts.map +1 -1
- package/dist/checkpoint/manager.js +22 -7
- package/dist/commands/loader.d.ts.map +1 -1
- package/dist/commands/loader.js +6 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/mcp/client.d.ts +42 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +89 -24
- package/dist/mcp/httpClient.d.ts +24 -1
- package/dist/mcp/httpClient.d.ts.map +1 -1
- package/dist/mcp/httpClient.js +80 -14
- package/dist/mcp/instructions.d.ts +11 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +42 -0
- package/dist/mcp/manager.d.ts +35 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +135 -24
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +48 -14
- package/dist/mcp/sseClient.d.ts +9 -1
- package/dist/mcp/sseClient.d.ts.map +1 -1
- package/dist/mcp/sseClient.js +43 -10
- package/dist/mcp/stats.d.ts.map +1 -1
- package/dist/permissions/bashClassify.d.ts.map +1 -1
- package/dist/permissions/bashClassify.js +25 -3
- package/dist/permissions/destructive.d.ts.map +1 -1
- package/dist/permissions/destructive.js +7 -2
- package/dist/permissions/destructiveTokens.d.ts.map +1 -1
- package/dist/permissions/destructiveTokens.js +104 -24
- package/dist/permissions/modePolicy.d.ts.map +1 -1
- package/dist/permissions/modePolicy.js +40 -17
- package/dist/permissions/rules.d.ts.map +1 -1
- package/dist/permissions/rules.js +7 -5
- package/dist/plugins/data.d.ts.map +1 -1
- package/dist/plugins/data.js +6 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +18 -7
- package/dist/plugins/installer.d.ts.map +1 -1
- package/dist/plugins/installer.js +17 -10
- package/dist/plugins/sources.d.ts.map +1 -1
- package/dist/plugins/sources.js +9 -3
- package/dist/tools/executor.d.ts.map +1 -1
- package/dist/tools/executor.js +454 -168
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +5 -1
- package/dist/tools/symbols.d.ts.map +1 -1
- package/dist/tools/symbols.js +30 -8
- package/dist/tools/tsLangService.d.ts.map +1 -1
- package/dist/tools/tsLangService.js +12 -4
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/miniYaml.d.ts.map +1 -1
- package/dist/util/miniYaml.js +3 -1
- package/package.json +1 -1
|
@@ -31,10 +31,18 @@ function tokenize(src) {
|
|
|
31
31
|
let word = '';
|
|
32
32
|
let has = false;
|
|
33
33
|
let q = null;
|
|
34
|
-
const pushWord = () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
const pushWord = () => {
|
|
35
|
+
if (has)
|
|
36
|
+
cur.push(word);
|
|
37
|
+
word = '';
|
|
38
|
+
has = false;
|
|
39
|
+
};
|
|
40
|
+
const pushCmd = () => {
|
|
41
|
+
pushWord();
|
|
42
|
+
if (cur.length)
|
|
43
|
+
cmds.push(cur);
|
|
44
|
+
cur = [];
|
|
45
|
+
};
|
|
38
46
|
for (let i = 0; i < src.length; i++) {
|
|
39
47
|
const ch = src[i];
|
|
40
48
|
if (q === "'") {
|
|
@@ -108,9 +116,34 @@ function has(args, long, short) {
|
|
|
108
116
|
const BROAD = new Set(['.', './', '*', './*', ':/', ':/', '..', '../', '/', '~', '~/', '$HOME', '${HOME}', '.*']);
|
|
109
117
|
/** Directories that are regenerated by a build/install and are routine to delete. */
|
|
110
118
|
const DISPOSABLE = new Set([
|
|
111
|
-
'node_modules',
|
|
112
|
-
'
|
|
113
|
-
'
|
|
119
|
+
'node_modules',
|
|
120
|
+
'dist',
|
|
121
|
+
'build',
|
|
122
|
+
'out',
|
|
123
|
+
'.next',
|
|
124
|
+
'.nuxt',
|
|
125
|
+
'.svelte-kit',
|
|
126
|
+
'.turbo',
|
|
127
|
+
'.cache',
|
|
128
|
+
'.parcel-cache',
|
|
129
|
+
'coverage',
|
|
130
|
+
'.nyc_output',
|
|
131
|
+
'target',
|
|
132
|
+
'__pycache__',
|
|
133
|
+
'.pytest_cache',
|
|
134
|
+
'.mypy_cache',
|
|
135
|
+
'.ruff_cache',
|
|
136
|
+
'.tox',
|
|
137
|
+
'venv',
|
|
138
|
+
'.venv',
|
|
139
|
+
'.gradle',
|
|
140
|
+
'.dart_tool',
|
|
141
|
+
'tmp',
|
|
142
|
+
'.tmp',
|
|
143
|
+
'.vite',
|
|
144
|
+
'.angular',
|
|
145
|
+
'.expo',
|
|
146
|
+
'DerivedData',
|
|
114
147
|
]);
|
|
115
148
|
const SCRATCH_PREFIXES = ['/tmp/', '/private/tmp/', '/var/folders/', '/private/var/folders/'];
|
|
116
149
|
function isDisposableTarget(raw) {
|
|
@@ -164,8 +197,7 @@ function checkGit(argsIn) {
|
|
|
164
197
|
}
|
|
165
198
|
return null;
|
|
166
199
|
case 'branch':
|
|
167
|
-
if (args.some((a) => /^-[A-Za-z]*D/.test(a)) ||
|
|
168
|
-
((has(args, '--delete', 'd')) && has(args, '--force', 'f'))) {
|
|
200
|
+
if (args.some((a) => /^-[A-Za-z]*D/.test(a)) || (has(args, '--delete', 'd') && has(args, '--force', 'f'))) {
|
|
169
201
|
return hit('git-history', 'force-deletes a git branch');
|
|
170
202
|
}
|
|
171
203
|
return null;
|
|
@@ -242,7 +274,8 @@ function checkFind(args) {
|
|
|
242
274
|
if (args.includes('-delete'))
|
|
243
275
|
return hit('filesystem', 'find -delete removes every match');
|
|
244
276
|
for (let i = 0; i < args.length - 1; i++) {
|
|
245
|
-
if ((args[i] === '-exec' || args[i] === '-execdir' || args[i] === '-ok') &&
|
|
277
|
+
if ((args[i] === '-exec' || args[i] === '-execdir' || args[i] === '-ok') &&
|
|
278
|
+
['rm', 'shred', 'unlink'].includes(base(args[i + 1]))) {
|
|
246
279
|
return hit('filesystem', 'find -exec rm removes every match');
|
|
247
280
|
}
|
|
248
281
|
}
|
|
@@ -251,16 +284,21 @@ function checkFind(args) {
|
|
|
251
284
|
/** Judge one already-unwrapped command. `recurse` re-enters the string classifier. */
|
|
252
285
|
function judge(bin, args) {
|
|
253
286
|
switch (bin) {
|
|
254
|
-
case 'git':
|
|
287
|
+
case 'git':
|
|
288
|
+
return checkGit(args);
|
|
255
289
|
case 'rm':
|
|
256
|
-
case 'unlink':
|
|
257
|
-
|
|
290
|
+
case 'unlink':
|
|
291
|
+
return checkRm(args);
|
|
292
|
+
case 'find':
|
|
293
|
+
return checkFind(args);
|
|
258
294
|
case 'rsync':
|
|
259
295
|
if (args.some((a) => a === '--del' || /^--delete(?:-[a-z]+)?$/.test(a)))
|
|
260
296
|
return hit('filesystem', 'rsync --delete removes destination files that are absent from the source');
|
|
261
297
|
return null;
|
|
262
|
-
case 'truncate':
|
|
263
|
-
|
|
298
|
+
case 'truncate':
|
|
299
|
+
return hit('filesystem', 'truncate cuts a file (contents lost)');
|
|
300
|
+
case 'shred':
|
|
301
|
+
return hit('filesystem', 'shred irrecoverably overwrites a file');
|
|
264
302
|
case 'dd':
|
|
265
303
|
if (args.some((a) => /^of=\/dev\//.test(a)))
|
|
266
304
|
return hit('filesystem', 'dd writing to a device (overwrites the disk)');
|
|
@@ -280,7 +318,8 @@ function judge(bin, args) {
|
|
|
280
318
|
case 'terraform':
|
|
281
319
|
case 'tofu':
|
|
282
320
|
case 'terragrunt':
|
|
283
|
-
if (args.includes('destroy') ||
|
|
321
|
+
if (args.includes('destroy') ||
|
|
322
|
+
(args.includes('apply') && (args.includes('-destroy') || args.includes('-auto-approve')))) {
|
|
284
323
|
return hit('infra', 'destroys or applies Terraform-managed infrastructure without a plan review');
|
|
285
324
|
}
|
|
286
325
|
return null;
|
|
@@ -357,12 +396,13 @@ function judge(bin, args) {
|
|
|
357
396
|
const rest = a.slice(a[0] === 'container' ? 2 : 1);
|
|
358
397
|
if (verb === 'rm' && has(rest, '--force', 'f') && rest.some((x) => x.startsWith('$')))
|
|
359
398
|
return hit('container', 'force-removes many containers at once');
|
|
360
|
-
if (a[0] === 'compose' && rest.includes('down') &&
|
|
399
|
+
if (a[0] === 'compose' && rest.includes('down') && has(rest, '--volumes', 'v'))
|
|
361
400
|
return hit('container', 'docker compose down with -v (deletes named volumes)');
|
|
362
401
|
return null;
|
|
363
402
|
}
|
|
364
403
|
case 'dropdb':
|
|
365
|
-
case 'dropuser':
|
|
404
|
+
case 'dropuser':
|
|
405
|
+
return hit('database', 'drops a Postgres database or role');
|
|
366
406
|
default:
|
|
367
407
|
if (bin.startsWith('mkfs'))
|
|
368
408
|
return hit('filesystem', 'mkfs formats a filesystem (destroys its contents)');
|
|
@@ -374,7 +414,19 @@ function judge(bin, args) {
|
|
|
374
414
|
* `recurse` classifies a nested command STRING (bash -c "…", ssh host "…", eval …).
|
|
375
415
|
*/
|
|
376
416
|
const DB_BINS = new Set([
|
|
377
|
-
'psql',
|
|
417
|
+
'psql',
|
|
418
|
+
'mysql',
|
|
419
|
+
'mariadb',
|
|
420
|
+
'mongo',
|
|
421
|
+
'mongosh',
|
|
422
|
+
'sqlite3',
|
|
423
|
+
'cockroach',
|
|
424
|
+
'clickhouse-client',
|
|
425
|
+
'pgcli',
|
|
426
|
+
'mycli',
|
|
427
|
+
'usql',
|
|
428
|
+
'sqlcmd',
|
|
429
|
+
'redis-cli',
|
|
378
430
|
]);
|
|
379
431
|
function classifyTokens(tokens, recurse, rawSql) {
|
|
380
432
|
let t = tokens.slice();
|
|
@@ -385,15 +437,20 @@ function classifyTokens(tokens, recurse, rawSql) {
|
|
|
385
437
|
return null;
|
|
386
438
|
// A bare redirect with no command (`> file`, `: > file`, `true > file`) truncates the file.
|
|
387
439
|
{
|
|
388
|
-
const r = /^>(?![>&])/.test(t[0])
|
|
440
|
+
const r = /^>(?![>&])/.test(t[0])
|
|
441
|
+
? t
|
|
442
|
+
: (t[0] === ':' || t[0] === 'true') && /^>(?![>&])/.test(t[1] ?? '')
|
|
443
|
+
? t.slice(1)
|
|
444
|
+
: null;
|
|
389
445
|
if (r) {
|
|
390
446
|
const target = r[0].length > 1 ? r[0].slice(1) : (r[1] ?? '');
|
|
391
447
|
if (target.startsWith('/dev/'))
|
|
392
448
|
return null;
|
|
393
449
|
const m = hit('filesystem', 'a bare `>` redirect truncates the file (contents lost)');
|
|
394
450
|
// Scratch/relative targets only: no `$var`, `~`, `..`; absolute paths must be under a temp dir.
|
|
395
|
-
const scratch = target !== '' &&
|
|
396
|
-
|
|
451
|
+
const scratch = target !== '' &&
|
|
452
|
+
!/[$`~]|(^|\/)\.\.(\/|$)/.test(target) &&
|
|
453
|
+
(!target.startsWith('/') || /^\/(?:private\/)?(?:tmp|var\/folders)\//.test(target));
|
|
397
454
|
if (scratch)
|
|
398
455
|
m.lowRisk = true;
|
|
399
456
|
return m;
|
|
@@ -443,12 +500,35 @@ function classifyTokens(tokens, recurse, rawSql) {
|
|
|
443
500
|
if (bin === 'eval')
|
|
444
501
|
return recurse(args.join(' '));
|
|
445
502
|
if (bin === 'ssh') {
|
|
446
|
-
const a = dropOpts(args, new Set([
|
|
503
|
+
const a = dropOpts(args, new Set([
|
|
504
|
+
'-p',
|
|
505
|
+
'-i',
|
|
506
|
+
'-l',
|
|
507
|
+
'-o',
|
|
508
|
+
'-F',
|
|
509
|
+
'-J',
|
|
510
|
+
'-L',
|
|
511
|
+
'-R',
|
|
512
|
+
'-D',
|
|
513
|
+
'-b',
|
|
514
|
+
'-c',
|
|
515
|
+
'-E',
|
|
516
|
+
'-e',
|
|
517
|
+
'-I',
|
|
518
|
+
'-m',
|
|
519
|
+
'-O',
|
|
520
|
+
'-Q',
|
|
521
|
+
'-S',
|
|
522
|
+
'-w',
|
|
523
|
+
'-W',
|
|
524
|
+
]));
|
|
447
525
|
return a.length > 1 ? recurse(a.slice(1).join(' ')) : null;
|
|
448
526
|
}
|
|
449
527
|
if (bin === 'docker' || bin === 'podman' || bin === 'docker-compose') {
|
|
450
528
|
const a0 = bin === 'docker-compose' ? ['compose', ...args] : dropOpts(args, new Set(['-H', '--host', '--context', '-c']));
|
|
451
|
-
const isExec = a0[0] === 'exec' ||
|
|
529
|
+
const isExec = a0[0] === 'exec' ||
|
|
530
|
+
(a0[0] === 'compose' &&
|
|
531
|
+
dropOpts(a0.slice(1), new Set(['-f', '-p', '--project-name', '--file', '--profile']))[0] === 'exec');
|
|
452
532
|
if (isExec) {
|
|
453
533
|
const afterVerb = a0[0] === 'exec'
|
|
454
534
|
? a0.slice(1)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modePolicy.d.ts","sourceRoot":"","sources":["../../src/permissions/modePolicy.ts"],"names":[],"mappings":"AAsBA,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D,kDAAkD;AAClD,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"modePolicy.d.ts","sourceRoot":"","sources":["../../src/permissions/modePolicy.ts"],"names":[],"mappings":"AAsBA,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D,kDAAkD;AAClD,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,aAyB1B,CAAC;AAEH,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,aAS3B,CAAC;AAEH,oEAAoE;AACpE,eAAO,MAAM,iBAAiB,aAAqD,CAAC;AAEpF,sCAAsC;AACtC,eAAO,MAAM,UAAU,aAAsD,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA6DvD;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAWzD;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAKtD"}
|
|
@@ -25,27 +25,44 @@ const planMode_1 = require("../agent/planMode");
|
|
|
25
25
|
* hitting `task` specifically instead of the read-only tools it was written for.
|
|
26
26
|
*/
|
|
27
27
|
exports.READ_ONLY_TOOLS = new Set([
|
|
28
|
-
'read_file',
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'
|
|
28
|
+
'read_file',
|
|
29
|
+
'list_directory',
|
|
30
|
+
'search_files',
|
|
31
|
+
'glob',
|
|
32
|
+
'grep',
|
|
33
|
+
'fetch_url',
|
|
34
|
+
'web_search',
|
|
35
|
+
'bash_output',
|
|
36
|
+
'kill_shell',
|
|
37
|
+
'todo_read',
|
|
38
|
+
'todo_write',
|
|
39
|
+
'cron_list',
|
|
40
|
+
'mcp_list_resources',
|
|
41
|
+
'mcp_read_resource',
|
|
33
42
|
'memory_read',
|
|
34
43
|
'use_skill',
|
|
35
44
|
'notebook_read',
|
|
36
|
-
'get_diagnostics',
|
|
37
|
-
'
|
|
45
|
+
'get_diagnostics',
|
|
46
|
+
'go_to_definition',
|
|
47
|
+
'find_references',
|
|
48
|
+
'get_symbols',
|
|
49
|
+
'get_workspace_symbols',
|
|
50
|
+
'get_hover',
|
|
38
51
|
'task',
|
|
39
52
|
]);
|
|
40
53
|
/** Tools that write to the filesystem. */
|
|
41
54
|
exports.FILE_WRITE_TOOLS = new Set([
|
|
42
|
-
'write_file',
|
|
43
|
-
'
|
|
55
|
+
'write_file',
|
|
56
|
+
'create_file',
|
|
57
|
+
'edit_file',
|
|
58
|
+
'multi_edit',
|
|
59
|
+
'notebook_edit',
|
|
60
|
+
'write_docx',
|
|
61
|
+
'write_xlsx',
|
|
62
|
+
'write_pptx',
|
|
44
63
|
]);
|
|
45
64
|
/** Tools that move/delete files — riskier than an in-place edit. */
|
|
46
|
-
exports.FILE_MUTATE_TOOLS = new Set([
|
|
47
|
-
'delete_file', 'move_file', 'copy_file',
|
|
48
|
-
]);
|
|
65
|
+
exports.FILE_MUTATE_TOOLS = new Set(['delete_file', 'move_file', 'copy_file']);
|
|
49
66
|
/** Tools that run a shell command. */
|
|
50
67
|
exports.BASH_TOOLS = new Set(['bash', 'run_command', 'execute_command']);
|
|
51
68
|
/**
|
|
@@ -138,15 +155,21 @@ function decide(req) {
|
|
|
138
155
|
/** Human-readable one-liner for the footer / status bar. */
|
|
139
156
|
function describeMode(mode) {
|
|
140
157
|
switch (mode) {
|
|
141
|
-
case 'plan':
|
|
142
|
-
|
|
143
|
-
case '
|
|
144
|
-
|
|
158
|
+
case 'plan':
|
|
159
|
+
return 'plan — read-only, produces a plan for approval';
|
|
160
|
+
case 'ask':
|
|
161
|
+
return 'ask — approves reads; asks before edits and commands';
|
|
162
|
+
case 'edit':
|
|
163
|
+
return 'edit — edits files freely; asks before shell commands';
|
|
164
|
+
case 'auto':
|
|
165
|
+
return 'auto — runs every tool on its own; still confirms irreversible actions';
|
|
145
166
|
}
|
|
146
167
|
}
|
|
147
168
|
/** Normalise arbitrary input to a known mode, defaulting to the safe middle. */
|
|
148
169
|
function parseMode(raw) {
|
|
149
|
-
const s = String(raw ?? '')
|
|
170
|
+
const s = String(raw ?? '')
|
|
171
|
+
.trim()
|
|
172
|
+
.toLowerCase();
|
|
150
173
|
return s === 'plan' || s === 'ask' || s === 'edit' || s === 'auto' ? s : 'ask';
|
|
151
174
|
}
|
|
152
175
|
//# sourceMappingURL=modePolicy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/permissions/rules.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AA6BD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAEjE;AAQD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAE5E;AACD,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA8B5D;AAqJD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,GACd,kBAAkB,GAAG,IAAI,CAK3B"}
|
|
@@ -76,8 +76,12 @@ function setSessionRules(r) {
|
|
|
76
76
|
// its permission rules ADD to theirs. Held here, with the rules above, because core's own gates
|
|
77
77
|
// call loadSettings() directly.
|
|
78
78
|
let sessionSettings = null;
|
|
79
|
-
function setSessionSettings(obj) {
|
|
80
|
-
|
|
79
|
+
function setSessionSettings(obj) {
|
|
80
|
+
sessionSettings = obj;
|
|
81
|
+
}
|
|
82
|
+
function getSessionSettings() {
|
|
83
|
+
return sessionSettings;
|
|
84
|
+
}
|
|
81
85
|
function loadSettings(workDir) {
|
|
82
86
|
const tiers = [
|
|
83
87
|
managedSettingsPath(),
|
|
@@ -234,9 +238,7 @@ function ruleMatches(rule, tool, input, workDir, opts) {
|
|
|
234
238
|
WebFetch: ['fetch_url'],
|
|
235
239
|
Image: ['generate_image', 'stock_photo'],
|
|
236
240
|
};
|
|
237
|
-
const matchesTool = ruleTool === tool ||
|
|
238
|
-
ruleTool === '*' ||
|
|
239
|
-
(aliases[ruleTool]?.includes(tool) ?? false);
|
|
241
|
+
const matchesTool = ruleTool === tool || ruleTool === '*' || (aliases[ruleTool]?.includes(tool) ?? false);
|
|
240
242
|
if (!matchesTool)
|
|
241
243
|
return false;
|
|
242
244
|
// Chaining guard for ALLOW rules on bash: a patterned allow rule (prefix or
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/plugins/data.ts"],"names":[],"mappings":"AAwBA,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/plugins/data.ts"],"names":[],"mappings":"AAwBA,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAO,GAAG,MAAM,CAuBtE;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAStD"}
|
package/dist/plugins/data.js
CHANGED
|
@@ -81,7 +81,9 @@ function ensurePluginDataDir(name) {
|
|
|
81
81
|
try {
|
|
82
82
|
fs.mkdirSync(dir, { recursive: true });
|
|
83
83
|
}
|
|
84
|
-
catch {
|
|
84
|
+
catch {
|
|
85
|
+
/* unwritable home: the plugin will see the path and fail its own write */
|
|
86
|
+
}
|
|
85
87
|
return dir;
|
|
86
88
|
}
|
|
87
89
|
/** True when the plugin has data on disk from earlier runs. */
|
|
@@ -119,7 +121,9 @@ function pluginDataSize(name, maxEntries = 5000) {
|
|
|
119
121
|
else
|
|
120
122
|
total += fs.statSync(full).size;
|
|
121
123
|
}
|
|
122
|
-
catch {
|
|
124
|
+
catch {
|
|
125
|
+
/* unreadable entry — skip it, size is an estimate */
|
|
126
|
+
}
|
|
123
127
|
}
|
|
124
128
|
};
|
|
125
129
|
walk(pluginDataDir(name));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAuCA,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAWtE;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,eAAe,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAuCA,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAWtE;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,eAAe,GAAG,MAAM,GAAG,IAAI,CAUhG;AA+CD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAKzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAM7G;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,EAAE,CAWjG;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAoBtE;AAeD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzE"}
|
package/dist/plugins/index.js
CHANGED
|
@@ -105,7 +105,9 @@ function resolvePluginFile(dir, kind) {
|
|
|
105
105
|
if (fs.statSync(full).isFile())
|
|
106
106
|
return full;
|
|
107
107
|
}
|
|
108
|
-
catch {
|
|
108
|
+
catch {
|
|
109
|
+
/* try the next candidate */
|
|
110
|
+
}
|
|
109
111
|
}
|
|
110
112
|
return null;
|
|
111
113
|
}
|
|
@@ -149,7 +151,14 @@ function scanRoot(root, scope, into) {
|
|
|
149
151
|
const name = meta.name || entry.name;
|
|
150
152
|
if (into.has(name))
|
|
151
153
|
continue; // project scope scanned first — it wins
|
|
152
|
-
into.set(name, {
|
|
154
|
+
into.set(name, {
|
|
155
|
+
name,
|
|
156
|
+
version: meta.version,
|
|
157
|
+
description: meta.description,
|
|
158
|
+
dir,
|
|
159
|
+
scope,
|
|
160
|
+
disabled: isPluginDisabled(dir),
|
|
161
|
+
});
|
|
153
162
|
}
|
|
154
163
|
}
|
|
155
164
|
/**
|
|
@@ -225,7 +234,9 @@ function pluginHooks(workDir) {
|
|
|
225
234
|
merged[phase] = [...(merged[phase] ?? []), ...entries.map((e) => stampPlugin(e, p.name))];
|
|
226
235
|
}
|
|
227
236
|
}
|
|
228
|
-
catch {
|
|
237
|
+
catch {
|
|
238
|
+
/* no hooks.json or malformed — skip */
|
|
239
|
+
}
|
|
229
240
|
}
|
|
230
241
|
return merged;
|
|
231
242
|
}
|
|
@@ -266,7 +277,9 @@ function pluginMcpServers(workDir) {
|
|
|
266
277
|
merged[name] = withPluginDataEnv(cfg, p.name);
|
|
267
278
|
}
|
|
268
279
|
}
|
|
269
|
-
catch {
|
|
280
|
+
catch {
|
|
281
|
+
/* no mcp.json — skip */
|
|
282
|
+
}
|
|
270
283
|
}
|
|
271
284
|
return merged;
|
|
272
285
|
}
|
|
@@ -278,9 +291,7 @@ function withPluginDataEnv(cfg, plugin) {
|
|
|
278
291
|
// Only a stdio server spawns a process. An http/sse server never reads our env.
|
|
279
292
|
if (typeof c.command !== 'string' || !c.command)
|
|
280
293
|
return cfg;
|
|
281
|
-
const env = c.env && typeof c.env === 'object' && !Array.isArray(c.env)
|
|
282
|
-
? c.env
|
|
283
|
-
: {};
|
|
294
|
+
const env = c.env && typeof c.env === 'object' && !Array.isArray(c.env) ? c.env : {};
|
|
284
295
|
if (typeof env.NEXRALL_PLUGIN_DATA === 'string')
|
|
285
296
|
return cfg;
|
|
286
297
|
return { ...c, env: { ...env, NEXRALL_PLUGIN_DATA: (0, data_1.pluginDataDir)(plugin) } };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/plugins/installer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/plugins/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -114,8 +114,9 @@ async function getRegistryPlugin(name) {
|
|
|
114
114
|
}
|
|
115
115
|
/** Fire-and-forget install counter. Never throws, never blocks an install. */
|
|
116
116
|
function reportInstall(name) {
|
|
117
|
-
fetch(`${client_1.API_BASE}/api/code/plugins/${encodeURIComponent(name)}/installed`, { method: 'POST' })
|
|
118
|
-
|
|
117
|
+
fetch(`${client_1.API_BASE}/api/code/plugins/${encodeURIComponent(name)}/installed`, { method: 'POST' }).catch(() => {
|
|
118
|
+
/* telemetry only */
|
|
119
|
+
});
|
|
119
120
|
}
|
|
120
121
|
// ─── Source parsing ───────────────────────────────────────────────────────────
|
|
121
122
|
/** Parse a user-supplied plugin spec into a structured source. Throws on junk. */
|
|
@@ -166,7 +167,10 @@ function parsePluginSource(spec) {
|
|
|
166
167
|
// ─── Inspection (safety surface) ──────────────────────────────────────────────
|
|
167
168
|
function listMd(dir) {
|
|
168
169
|
try {
|
|
169
|
-
return fs
|
|
170
|
+
return fs
|
|
171
|
+
.readdirSync(dir)
|
|
172
|
+
.filter((f) => f.endsWith('.md'))
|
|
173
|
+
.map((f) => f.replace(/\.md$/, ''));
|
|
170
174
|
}
|
|
171
175
|
catch {
|
|
172
176
|
return [];
|
|
@@ -195,7 +199,9 @@ function inspectPluginDir(dir) {
|
|
|
195
199
|
description: typeof j.description === 'string' ? j.description : undefined,
|
|
196
200
|
};
|
|
197
201
|
}
|
|
198
|
-
catch {
|
|
202
|
+
catch {
|
|
203
|
+
/* optional */
|
|
204
|
+
}
|
|
199
205
|
}
|
|
200
206
|
return {
|
|
201
207
|
commands: listMd(path.join(dir, 'commands')),
|
|
@@ -622,7 +628,9 @@ async function installPlugin(spec, opts = {}) {
|
|
|
622
628
|
try {
|
|
623
629
|
fs.rmSync(d, { recursive: true, force: true });
|
|
624
630
|
}
|
|
625
|
-
catch {
|
|
631
|
+
catch {
|
|
632
|
+
/* best effort */
|
|
633
|
+
}
|
|
626
634
|
}
|
|
627
635
|
throw err;
|
|
628
636
|
}
|
|
@@ -742,10 +750,7 @@ function planPluginPrune(opts = {}) {
|
|
|
742
750
|
for (const r of byName.get(n) ?? []) {
|
|
743
751
|
// Union of the receipt (what was installed) and the manifest as it stands now
|
|
744
752
|
// (a hand-edited manifest must not lead to pruning something it still names).
|
|
745
|
-
const deps = new Set([
|
|
746
|
-
...(r.receipt?.dependencies ?? []),
|
|
747
|
-
...parsePluginDependencies(r.dir).map((d) => d.name),
|
|
748
|
-
]);
|
|
753
|
+
const deps = new Set([...(r.receipt?.dependencies ?? []), ...parsePluginDependencies(r.dir).map((d) => d.name)]);
|
|
749
754
|
for (const d of deps)
|
|
750
755
|
if (!needed.has(d))
|
|
751
756
|
stack.push(d);
|
|
@@ -778,7 +783,9 @@ function prunePlugins(plan, opts = {}) {
|
|
|
778
783
|
if (!opts.keepData)
|
|
779
784
|
(0, data_1.removePluginData)(o.name);
|
|
780
785
|
}
|
|
781
|
-
catch {
|
|
786
|
+
catch {
|
|
787
|
+
/* locked directory, permissions — leave it and report the rest */
|
|
788
|
+
}
|
|
782
789
|
}
|
|
783
790
|
return removed;
|
|
784
791
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/plugins/sources.ts"],"names":[],"mappings":"AA0CA,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/plugins/sources.ts"],"names":[],"mappings":"AA0CA,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;CACd;AA2DD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,cAAc,EAAE,CAS9G;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,GAAG,IAAI,CAMvD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAE,GAAG,IAA8B,GAAG,OAAO,CAgB1G;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,cAAc,GAAG,IAAI,CAGvB;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYlF;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIjF"}
|
package/dist/plugins/sources.js
CHANGED
|
@@ -147,10 +147,16 @@ function allowedSourcePatterns() {
|
|
|
147
147
|
function isSourceAllowed(spec, patterns = allowedSourcePatterns()) {
|
|
148
148
|
if (!patterns)
|
|
149
149
|
return true;
|
|
150
|
-
const cleaned = spec
|
|
150
|
+
const cleaned = spec
|
|
151
|
+
.trim()
|
|
152
|
+
.replace(/^https?:\/\/(?:www\.)?github\.com\//i, '')
|
|
153
|
+
.replace(/\.git$/, '');
|
|
151
154
|
const base = cleaned.split('#')[0].split('/').slice(0, 2).join('/').toLowerCase();
|
|
152
155
|
return patterns.some((p) => {
|
|
153
|
-
const pat = p
|
|
156
|
+
const pat = p
|
|
157
|
+
.trim()
|
|
158
|
+
.toLowerCase()
|
|
159
|
+
.replace(/^https?:\/\/(?:www\.)?github\.com\//i, '');
|
|
154
160
|
if (pat === '*')
|
|
155
161
|
return true;
|
|
156
162
|
if (pat.endsWith('/*'))
|
|
@@ -169,7 +175,7 @@ function writeDeclaredSource(file, name, spec) {
|
|
|
169
175
|
throw new Error(`Invalid source name "${name}". Use letters, numbers, dot, dash or underscore.`);
|
|
170
176
|
}
|
|
171
177
|
const obj = readJson(file) ?? {};
|
|
172
|
-
const existing =
|
|
178
|
+
const existing = obj.pluginSources && typeof obj.pluginSources === 'object' && !Array.isArray(obj.pluginSources)
|
|
173
179
|
? obj.pluginSources
|
|
174
180
|
: {};
|
|
175
181
|
obj.pluginSources = { ...existing, [name]: spec };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/tools/executor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/tools/executor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAyuCtE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAmB,GAAG,MAAM,CAgBpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AACD,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,aAAa,CAAC,CAmDxB;AAw1CD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuCnD;AAq8BD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAClC,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAMlC,QAAQ,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,UAAU,CAAC,CAmCrB"}
|