@wrongstack/plugins 0.295.1 → 0.296.2
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/accessibility-auditor.js +12 -1
- package/dist/branch-guard.js +13 -2
- package/dist/commit-validator/index.d.ts.map +1 -1
- package/dist/commit-validator.js +18 -1
- package/dist/dead-code-detector/index.d.ts.map +1 -1
- package/dist/dead-code-detector.js +4 -1
- package/dist/diff-summary.js +12 -1
- package/dist/doc-sync-guard.js +12 -1
- package/dist/git-autocommit/index.d.ts +12 -0
- package/dist/git-autocommit/index.d.ts.map +1 -1
- package/dist/git-autocommit.js +58 -4
- package/dist/import-organizer.js +12 -1
- package/dist/index.js +149 -47
- package/dist/injection-shield/index.d.ts +16 -0
- package/dist/injection-shield/index.d.ts.map +1 -1
- package/dist/injection-shield.js +12 -4
- package/dist/lint-gate.js +12 -1
- package/dist/migration-planner.js +12 -1
- package/dist/pr-drafter/index.d.ts.map +1 -1
- package/dist/pr-drafter.js +20 -1
- package/dist/runtime/handles.d.ts +46 -0
- package/dist/runtime/handles.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime.js +18 -0
- package/dist/secret-scanner/index.d.ts.map +1 -1
- package/dist/secret-scanner.js +19 -2
- package/dist/session-recap/index.d.ts.map +1 -1
- package/dist/session-recap.js +18 -1
- package/dist/smart-rename/index.d.ts +2 -0
- package/dist/smart-rename/index.d.ts.map +1 -1
- package/dist/smart-rename.js +16 -2
- package/dist/spec-linker/index.d.ts.map +1 -1
- package/dist/spec-linker.js +19 -2
- package/dist/template-engine/index.d.ts.map +1 -1
- package/dist/template-engine.js +15 -1
- package/dist/test-coverage-gate.js +12 -1
- package/dist/test-runner-gate.js +12 -1
- package/dist/todo-listener.js +12 -1
- package/dist/token-budget/index.d.ts.map +1 -1
- package/dist/token-budget.js +31 -19
- package/dist/type-gate/index.d.ts.map +1 -1
- package/dist/type-gate.js +12 -1
- package/package.json +3 -3
package/dist/runtime.js
CHANGED
|
@@ -292,6 +292,22 @@ function safeJsonStringify(value, indent) {
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
// src/runtime/handles.ts
|
|
296
|
+
function releaseHandle(off) {
|
|
297
|
+
if (off) {
|
|
298
|
+
try {
|
|
299
|
+
off();
|
|
300
|
+
} catch {
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
function releaseHandles(state, keys) {
|
|
306
|
+
for (const key of keys) {
|
|
307
|
+
state[key] = releaseHandle(state[key]);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
295
311
|
// src/runtime/index.ts
|
|
296
312
|
var META_CHARS = /["'`;&|<>\r\n]/;
|
|
297
313
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
@@ -606,6 +622,8 @@ export {
|
|
|
606
622
|
matchesExtension,
|
|
607
623
|
parseLlmJsonObject,
|
|
608
624
|
probeRunner,
|
|
625
|
+
releaseHandle,
|
|
626
|
+
releaseHandles,
|
|
609
627
|
resolveExecInvocation,
|
|
610
628
|
resolveFirstNodeBin,
|
|
611
629
|
resolveNodeBin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secret-scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secret-scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAymBrD,QAAA,MAAM,MAAM,EAAE,MAgOb,CAAC;eAEa,MAAM"}
|
package/dist/secret-scanner.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
// src/runtime/local-bin.ts
|
|
2
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
3
|
+
|
|
4
|
+
// src/runtime/handles.ts
|
|
5
|
+
function releaseHandle(off) {
|
|
6
|
+
if (off) {
|
|
7
|
+
try {
|
|
8
|
+
off();
|
|
9
|
+
} catch {
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/runtime/index.ts
|
|
16
|
+
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
17
|
+
|
|
1
18
|
// src/runtime/credential-patterns.ts
|
|
2
19
|
var CREDENTIAL_PATTERNS = [
|
|
3
20
|
// LLM provider keys
|
|
@@ -435,8 +452,8 @@ var plugin = {
|
|
|
435
452
|
state.leakCount = 0;
|
|
436
453
|
state.lastBlock = null;
|
|
437
454
|
state.lastLeak = null;
|
|
438
|
-
state.hookUnregister =
|
|
439
|
-
state.postHookUnregister =
|
|
455
|
+
state.hookUnregister = releaseHandle(state.hookUnregister);
|
|
456
|
+
state.postHookUnregister = releaseHandle(state.postHookUnregister);
|
|
440
457
|
const cfg = readConfig(api.config.extensions?.["secret-scanner"]);
|
|
441
458
|
PATTERNS = [...BASE_PATTERNS];
|
|
442
459
|
for (const cp of cfg.customPatterns) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-recap/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session-recap/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA6MrD,QAAA,MAAM,MAAM,EAAE,MA4Yb,CAAC;eAEa,MAAM"}
|
package/dist/session-recap.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
// src/runtime/local-bin.ts
|
|
2
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
3
|
+
|
|
4
|
+
// src/runtime/handles.ts
|
|
5
|
+
function releaseHandle(off) {
|
|
6
|
+
if (off) {
|
|
7
|
+
try {
|
|
8
|
+
off();
|
|
9
|
+
} catch {
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/runtime/index.ts
|
|
16
|
+
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
17
|
+
|
|
1
18
|
// src/session-recap/index.ts
|
|
2
19
|
var state = {
|
|
3
20
|
recapsPublished: 0,
|
|
@@ -155,7 +172,7 @@ var plugin = {
|
|
|
155
172
|
state.commitCount = 0;
|
|
156
173
|
state.startedAt = null;
|
|
157
174
|
state.lastActivityAt = null;
|
|
158
|
-
state.stopHookUnregister =
|
|
175
|
+
state.stopHookUnregister = releaseHandle(state.stopHookUnregister);
|
|
159
176
|
for (const off of state.eventUnsubscribers) {
|
|
160
177
|
try {
|
|
161
178
|
off();
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
* @public
|
|
20
20
|
*/
|
|
21
21
|
import type { Plugin } from '@wrongstack/core/types';
|
|
22
|
+
/** True when `name` is something this tool may safely substitute. */
|
|
23
|
+
export declare function isIdentifier(name: string): boolean;
|
|
22
24
|
declare const plugin: Plugin;
|
|
23
25
|
export default plugin;
|
|
24
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smart-rename/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smart-rename/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAkFrD,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAmCD,QAAA,MAAM,MAAM,EAAE,MAgJb,CAAC;eAEa,MAAM"}
|
package/dist/smart-rename.js
CHANGED
|
@@ -38,8 +38,15 @@ function relativePath(p) {
|
|
|
38
38
|
function escapeRegex(s) {
|
|
39
39
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
40
40
|
}
|
|
41
|
+
var IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
42
|
+
function isIdentifier(name) {
|
|
43
|
+
return IDENTIFIER_RE.test(name);
|
|
44
|
+
}
|
|
41
45
|
function renameInContent(content, oldName, newName) {
|
|
42
|
-
const re = new RegExp(
|
|
46
|
+
const re = new RegExp(
|
|
47
|
+
`(?<![A-Za-z0-9_$])${escapeRegex(oldName)}(?![A-Za-z0-9_$])`,
|
|
48
|
+
"g"
|
|
49
|
+
);
|
|
43
50
|
let replacements = 0;
|
|
44
51
|
const preview = content.replace(re, () => {
|
|
45
52
|
replacements++;
|
|
@@ -101,6 +108,12 @@ var plugin = {
|
|
|
101
108
|
if (!newName || typeof newName !== "string" || newName.length === 0) {
|
|
102
109
|
return { ok: false, error: "newName is required" };
|
|
103
110
|
}
|
|
111
|
+
if (!isIdentifier(oldName)) {
|
|
112
|
+
return { ok: false, error: `oldName "${oldName}" is not a valid identifier` };
|
|
113
|
+
}
|
|
114
|
+
if (!isIdentifier(newName)) {
|
|
115
|
+
return { ok: false, error: `newName "${newName}" is not a valid identifier` };
|
|
116
|
+
}
|
|
104
117
|
if (!withinProject(rawPath)) {
|
|
105
118
|
return { ok: false, error: "path is outside the project root" };
|
|
106
119
|
}
|
|
@@ -166,5 +179,6 @@ var plugin = {
|
|
|
166
179
|
};
|
|
167
180
|
var smart_rename_default = plugin;
|
|
168
181
|
export {
|
|
169
|
-
smart_rename_default as default
|
|
182
|
+
smart_rename_default as default,
|
|
183
|
+
isIdentifier
|
|
170
184
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec-linker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spec-linker/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAyPrD,QAAA,MAAM,MAAM,EAAE,MAuOb,CAAC;eAEa,MAAM"}
|
package/dist/spec-linker.js
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
// src/spec-linker/index.ts
|
|
2
2
|
import * as fs from "node:fs/promises";
|
|
3
3
|
|
|
4
|
+
// src/runtime/local-bin.ts
|
|
5
|
+
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
6
|
+
|
|
7
|
+
// src/runtime/handles.ts
|
|
8
|
+
function releaseHandle(off) {
|
|
9
|
+
if (off) {
|
|
10
|
+
try {
|
|
11
|
+
off();
|
|
12
|
+
} catch {
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/runtime/index.ts
|
|
19
|
+
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
20
|
+
|
|
4
21
|
// src/manifest/index.ts
|
|
5
22
|
var OFFICIAL_PLUGIN_NAMES = [
|
|
6
23
|
"agent-handoff",
|
|
@@ -330,8 +347,8 @@ var plugin = {
|
|
|
330
347
|
state.skippedNonMd = 0;
|
|
331
348
|
state.readErrorCount = 0;
|
|
332
349
|
state.autoFixApplied = 0;
|
|
333
|
-
state.postHookUnregister =
|
|
334
|
-
state.preHookUnregister =
|
|
350
|
+
state.postHookUnregister = releaseHandle(state.postHookUnregister);
|
|
351
|
+
state.preHookUnregister = releaseHandle(state.preHookUnregister);
|
|
335
352
|
const cfg = readConfig(api.config.extensions?.["spec-linker"]);
|
|
336
353
|
const postHook = async (input) => {
|
|
337
354
|
if (!cfg.enabled) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template-engine/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA0IrD,QAAA,MAAM,MAAM,EAAE,MA+Sb,CAAC;eAEa,MAAM"}
|
package/dist/template-engine.js
CHANGED
|
@@ -8,6 +8,17 @@ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
|
8
8
|
// src/runtime/local-bin.ts
|
|
9
9
|
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
10
10
|
|
|
11
|
+
// src/runtime/handles.ts
|
|
12
|
+
function releaseHandle(off) {
|
|
13
|
+
if (off) {
|
|
14
|
+
try {
|
|
15
|
+
off();
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
11
22
|
// src/runtime/index.ts
|
|
12
23
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
13
24
|
function hasLeadingDash(arg) {
|
|
@@ -28,6 +39,7 @@ function withinProject(p) {
|
|
|
28
39
|
// src/template-engine/index.ts
|
|
29
40
|
var API_VERSION = "^0.1.10";
|
|
30
41
|
var templates = /* @__PURE__ */ new Map();
|
|
42
|
+
var contributorUnregister = null;
|
|
31
43
|
function expandTemplate(template, variables) {
|
|
32
44
|
let result = template;
|
|
33
45
|
result = result.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
@@ -300,7 +312,8 @@ var plugin = {
|
|
|
300
312
|
};
|
|
301
313
|
}
|
|
302
314
|
});
|
|
303
|
-
|
|
315
|
+
contributorUnregister = releaseHandle(contributorUnregister);
|
|
316
|
+
contributorUnregister = api.registerSystemPromptContributor(async () => [
|
|
304
317
|
{
|
|
305
318
|
type: "text",
|
|
306
319
|
text: `Template engine available:
|
|
@@ -315,6 +328,7 @@ var plugin = {
|
|
|
315
328
|
teardown(api) {
|
|
316
329
|
const count = templates.size;
|
|
317
330
|
templates.clear();
|
|
331
|
+
contributorUnregister = releaseHandle(contributorUnregister);
|
|
318
332
|
api.log.info("template-engine: teardown complete", { cleared: count });
|
|
319
333
|
},
|
|
320
334
|
async health() {
|
|
@@ -7,6 +7,17 @@ import { basename, extname, isAbsolute, relative, resolve } from "node:path";
|
|
|
7
7
|
// src/runtime/local-bin.ts
|
|
8
8
|
import { buildWin32CmdShimInvocation, resolveWin32Command } from "@wrongstack/tools/win32";
|
|
9
9
|
|
|
10
|
+
// src/runtime/handles.ts
|
|
11
|
+
function releaseHandle(off) {
|
|
12
|
+
if (off) {
|
|
13
|
+
try {
|
|
14
|
+
off();
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
10
21
|
// src/runtime/index.ts
|
|
11
22
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
12
23
|
function hasLeadingDash(arg) {
|
|
@@ -135,7 +146,7 @@ var plugin = {
|
|
|
135
146
|
state.skippedCount = 0;
|
|
136
147
|
state.lastOverallPct = null;
|
|
137
148
|
state.lastResult = null;
|
|
138
|
-
state.hookUnregister =
|
|
149
|
+
state.hookUnregister = releaseHandle(state.hookUnregister);
|
|
139
150
|
const cfg = readConfig(api.config.extensions?.["test-coverage-gate"]);
|
|
140
151
|
const hook = (input) => {
|
|
141
152
|
if (!cfg.enabled) return;
|
package/dist/test-runner-gate.js
CHANGED
|
@@ -104,6 +104,17 @@ var BoundedMap = class {
|
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
106
|
|
|
107
|
+
// src/runtime/handles.ts
|
|
108
|
+
function releaseHandle(off) {
|
|
109
|
+
if (off) {
|
|
110
|
+
try {
|
|
111
|
+
off();
|
|
112
|
+
} catch {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
107
118
|
// src/runtime/index.ts
|
|
108
119
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
109
120
|
function hasLeadingDash(arg) {
|
|
@@ -451,7 +462,7 @@ var plugin = {
|
|
|
451
462
|
state.errorCount = 0;
|
|
452
463
|
state.extensionSkippedCount = 0;
|
|
453
464
|
state.cachedSkipCount = 0;
|
|
454
|
-
state.hookUnregister =
|
|
465
|
+
state.hookUnregister = releaseHandle(state.hookUnregister);
|
|
455
466
|
state.lastResult = null;
|
|
456
467
|
lastPassedHash.clear();
|
|
457
468
|
const cfg = readConfig(api.config.extensions?.["test-runner-gate"]);
|
package/dist/todo-listener.js
CHANGED
|
@@ -24,6 +24,17 @@ function safeJsonStringify(value, indent) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
// src/runtime/handles.ts
|
|
28
|
+
function releaseHandle(off) {
|
|
29
|
+
if (off) {
|
|
30
|
+
try {
|
|
31
|
+
off();
|
|
32
|
+
} catch {
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
27
38
|
// src/runtime/index.ts
|
|
28
39
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
29
40
|
|
|
@@ -100,7 +111,7 @@ var plugin = {
|
|
|
100
111
|
state.lastMessageId = null;
|
|
101
112
|
state.lastPayloadHash = "";
|
|
102
113
|
state.lastBroadcastAt = 0;
|
|
103
|
-
state.hookUnregister =
|
|
114
|
+
state.hookUnregister = releaseHandle(state.hookUnregister);
|
|
104
115
|
const cfg = readConfig(api.config.extensions?.["todo-listener"]);
|
|
105
116
|
const mailbox = api.mailbox;
|
|
106
117
|
const hook = async (input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-budget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-budget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AA8HrD,QAAA,MAAM,MAAM,EAAE,MAyQb,CAAC;eAEa,MAAM"}
|
package/dist/token-budget.js
CHANGED
|
@@ -34,16 +34,36 @@ function modelMatches(pattern, model) {
|
|
|
34
34
|
}
|
|
35
35
|
return model.toLowerCase() === pattern.toLowerCase();
|
|
36
36
|
}
|
|
37
|
+
function readBoundedNumber(value, min, max, fallback) {
|
|
38
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
|
|
39
|
+
if (value < min || value > max) return fallback;
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
37
42
|
function readConfig(raw) {
|
|
38
43
|
if (!raw || typeof raw !== "object") return { ...DEFAULTS };
|
|
39
44
|
const r = raw;
|
|
45
|
+
const warnPercent = readBoundedNumber(r["warnPercent"], 1, 100, DEFAULTS.warnPercent);
|
|
46
|
+
const stopPercent = readBoundedNumber(r["stopPercent"], 1, 100, DEFAULTS.stopPercent);
|
|
40
47
|
return {
|
|
41
|
-
limit:
|
|
42
|
-
warnPercent
|
|
43
|
-
|
|
48
|
+
limit: readBoundedNumber(r["limit"], 0, Number.MAX_SAFE_INTEGER, DEFAULTS.limit),
|
|
49
|
+
warnPercent,
|
|
50
|
+
// A warn threshold above the stop threshold can never fire — the run
|
|
51
|
+
// stops first. Clamp so the pair always describes a reachable window.
|
|
52
|
+
stopPercent: Math.max(stopPercent, warnPercent),
|
|
44
53
|
model: typeof r["model"] === "string" ? r["model"] : ""
|
|
45
54
|
};
|
|
46
55
|
}
|
|
56
|
+
function clearRegistrations() {
|
|
57
|
+
for (const key of ["hookUnregister", "postHookUnregister"]) {
|
|
58
|
+
const off = state[key];
|
|
59
|
+
if (!off) continue;
|
|
60
|
+
try {
|
|
61
|
+
off();
|
|
62
|
+
} catch {
|
|
63
|
+
}
|
|
64
|
+
state[key] = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
47
67
|
var plugin = {
|
|
48
68
|
name: "token-budget",
|
|
49
69
|
version: "0.1.0",
|
|
@@ -90,9 +110,8 @@ var plugin = {
|
|
|
90
110
|
state.stopFired = false;
|
|
91
111
|
state.warnContextInjected = false;
|
|
92
112
|
state.stopContextInjected = false;
|
|
93
|
-
state.hookUnregister = null;
|
|
94
|
-
state.postHookUnregister = null;
|
|
95
113
|
state.lastRequest = null;
|
|
114
|
+
clearRegistrations();
|
|
96
115
|
const cfg = readConfig(api.config.extensions?.["token-budget"]);
|
|
97
116
|
api.onEvent("provider.response", (payload) => {
|
|
98
117
|
const p = payload;
|
|
@@ -189,6 +208,12 @@ var plugin = {
|
|
|
189
208
|
remaining,
|
|
190
209
|
percent,
|
|
191
210
|
requestCount: state.requestCount,
|
|
211
|
+
// The EFFECTIVE thresholds, after out-of-range values fall back to
|
|
212
|
+
// the defaults and warn/stop are ordered. Without these the user
|
|
213
|
+
// cannot tell that a rejected or clamped setting is not in force.
|
|
214
|
+
warnPercent: cfg.warnPercent,
|
|
215
|
+
stopPercent: cfg.stopPercent,
|
|
216
|
+
model: cfg.model === "" ? null : cfg.model,
|
|
192
217
|
breakdown: {
|
|
193
218
|
prompt: state.totalPromptTokens,
|
|
194
219
|
completion: state.totalCompletionTokens
|
|
@@ -207,20 +232,7 @@ var plugin = {
|
|
|
207
232
|
});
|
|
208
233
|
},
|
|
209
234
|
teardown(api) {
|
|
210
|
-
|
|
211
|
-
try {
|
|
212
|
-
state.hookUnregister();
|
|
213
|
-
} catch {
|
|
214
|
-
}
|
|
215
|
-
state.hookUnregister = null;
|
|
216
|
-
}
|
|
217
|
-
if (state.postHookUnregister) {
|
|
218
|
-
try {
|
|
219
|
-
state.postHookUnregister();
|
|
220
|
-
} catch {
|
|
221
|
-
}
|
|
222
|
-
state.postHookUnregister = null;
|
|
223
|
-
}
|
|
235
|
+
clearRegistrations();
|
|
224
236
|
const final = {
|
|
225
237
|
totalTokens: state.totalTokens,
|
|
226
238
|
requestCount: state.requestCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/type-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/type-gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAgOrD,QAAA,MAAM,MAAM,EAAE,MAkOb,CAAC;eAEa,MAAM"}
|
package/dist/type-gate.js
CHANGED
|
@@ -65,6 +65,17 @@ function resolveNodeBin(packageName, binName, cwd, extraArgs = []) {
|
|
|
65
65
|
return resolved === null ? null : { ...resolved, args: [resolved.entry, ...extraArgs] };
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// src/runtime/handles.ts
|
|
69
|
+
function releaseHandle(off) {
|
|
70
|
+
if (off) {
|
|
71
|
+
try {
|
|
72
|
+
off();
|
|
73
|
+
} catch {
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
68
79
|
// src/runtime/index.ts
|
|
69
80
|
var META_CHARS = /["'`;&|<>\r\n]/;
|
|
70
81
|
var MAX_BUFFER_BYTES = 16 * 1024 * 1024;
|
|
@@ -439,7 +450,7 @@ var plugin = {
|
|
|
439
450
|
state.errorCount = 0;
|
|
440
451
|
state.skippedCount = 0;
|
|
441
452
|
state.lastResult = null;
|
|
442
|
-
state.hookUnregister =
|
|
453
|
+
state.hookUnregister = releaseHandle(state.hookUnregister);
|
|
443
454
|
const cfg = readConfig(api.config.extensions?.["type-gate"]);
|
|
444
455
|
const hook = async (input) => {
|
|
445
456
|
if (!cfg.enabled) return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/plugins",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.296.2",
|
|
4
4
|
"description": "Official WrongStack collection of focused plugins for code quality, security, observability, planning, and agent coordination",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ECOSTACK TECHNOLOGY OÜ",
|
|
@@ -294,8 +294,8 @@
|
|
|
294
294
|
"vitest": "^4.1.10"
|
|
295
295
|
},
|
|
296
296
|
"dependencies": {
|
|
297
|
-
"@wrongstack/core": "0.
|
|
298
|
-
"@wrongstack/tools": "0.
|
|
297
|
+
"@wrongstack/core": "0.296.2",
|
|
298
|
+
"@wrongstack/tools": "0.296.2"
|
|
299
299
|
},
|
|
300
300
|
"scripts": {
|
|
301
301
|
"build": "node ../../scripts/build-package.mjs",
|