open-multi-agent-kit 0.94.1 → 0.95.1
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/CHANGELOG.md +49 -1
- package/README.md +100 -647
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +11 -11
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +27 -2
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +239 -56
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/context-budget-v2-cache-invalidation.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-invalidation.js +1 -1
- package/dist/core/context-budget-v2-cache-invalidation.js.map +1 -1
- package/dist/core/context-budget-v2-cache-provider.d.ts +5 -1
- package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-provider.js +37 -7
- package/dist/core/context-budget-v2-cache-provider.js.map +1 -1
- package/dist/core/context-budget-v2-cache-telemetry.d.ts +1 -1
- package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-telemetry.js +2 -1
- package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -1
- package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache.js +3 -0
- package/dist/core/context-budget-v2-cache.js.map +1 -1
- package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -1
- package/dist/core/context-budget-v2-plan-cache-keys.js +39 -5
- package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -1
- package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -1
- package/dist/core/context-budget-v2-representation-cache.js +4 -3
- package/dist/core/context-budget-v2-representation-cache.js.map +1 -1
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +4 -0
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +3 -0
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/github-repository.d.ts +3 -0
- package/dist/core/github-repository.d.ts.map +1 -0
- package/dist/core/github-repository.js +3 -0
- package/dist/core/github-repository.js.map +1 -0
- package/dist/core/headroom.d.ts.map +1 -1
- package/dist/core/headroom.js +7 -2
- package/dist/core/headroom.js.map +1 -1
- package/dist/core/model-registry.d.ts +3 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +9 -8
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/provider-usage.d.ts +48 -0
- package/dist/core/provider-usage.d.ts.map +1 -0
- package/dist/core/provider-usage.js +780 -0
- package/dist/core/provider-usage.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +10 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +8 -1
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +15 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills-catalog-cache.d.ts +1 -0
- package/dist/core/skills-catalog-cache.d.ts.map +1 -1
- package/dist/core/skills-catalog-cache.js +42 -11
- package/dist/core/skills-catalog-cache.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -4
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +5 -3
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-account-selector.d.ts +16 -0
- package/dist/modes/interactive/components/oauth-account-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-account-selector.js +61 -0
- package/dist/modes/interactive/components/oauth-account-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +25 -4
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.d.ts +21 -1
- package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.js +165 -6
- package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +89 -60
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +2 -2
- package/dist/utils/image-resize-core.js.map +1 -1
- package/docs/development.md +3 -2
- package/docs/providers.md +19 -4
- package/docs/settings.md +9 -20
- package/docs/usage.md +10 -10
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/agents/planner.md +1 -1
- package/examples/extensions/subagent/agents/reviewer.md +1 -1
- package/examples/extensions/subagent/agents/scout.md +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +24 -24
- package/package.json +6 -6
- package/dist/core/context-budget-compressors.d.ts +0 -50
- package/dist/core/context-budget-compressors.d.ts.map +0 -1
- package/dist/core/context-budget-compressors.js +0 -166
- package/dist/core/context-budget-compressors.js.map +0 -1
- package/dist/core/github-star-nudge.d.ts +0 -15
- package/dist/core/github-star-nudge.d.ts.map +0 -1
- package/dist/core/github-star-nudge.js +0 -21
- package/dist/core/github-star-nudge.js.map +0 -1
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-multi-agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.95.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "open-multi-agent-kit",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.95.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"omk-agent-core": "^0.
|
|
13
|
-
"omk-ai": "^0.
|
|
14
|
-
"omk-tui": "^0.
|
|
12
|
+
"omk-agent-core": "^0.95.1",
|
|
13
|
+
"omk-ai": "^0.95.1",
|
|
14
|
+
"omk-tui": "^0.95.1",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"chalk": "5.6.2",
|
|
17
17
|
"cross-spawn": "7.0.6",
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
"hosted-git-info": "9.0.3",
|
|
22
22
|
"ignore": "7.0.5",
|
|
23
23
|
"jiti": "2.7.0",
|
|
24
|
-
"minimatch": "10.2.
|
|
24
|
+
"minimatch": "10.2.6",
|
|
25
25
|
"proper-lockfile": "4.1.2",
|
|
26
26
|
"typebox": "1.1.38",
|
|
27
27
|
"undici": "8.5.0",
|
|
28
28
|
"yaml": "2.9.0",
|
|
29
|
-
"omk-adaptorch-wpl": "^0.
|
|
29
|
+
"omk-adaptorch-wpl": "^0.95.1"
|
|
30
30
|
},
|
|
31
31
|
"optionalDependencies": {
|
|
32
32
|
"@mariozechner/clipboard": "0.3.9"
|
|
@@ -960,15 +960,15 @@
|
|
|
960
960
|
"license": "MIT"
|
|
961
961
|
},
|
|
962
962
|
"node_modules/brace-expansion": {
|
|
963
|
-
"version": "5.0.
|
|
964
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.
|
|
965
|
-
"integrity": "sha512-
|
|
963
|
+
"version": "5.0.8",
|
|
964
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
|
|
965
|
+
"integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
|
|
966
966
|
"license": "MIT",
|
|
967
967
|
"dependencies": {
|
|
968
968
|
"balanced-match": "^4.0.2"
|
|
969
969
|
},
|
|
970
970
|
"engines": {
|
|
971
|
-
"node": "
|
|
971
|
+
"node": "20 || >=22"
|
|
972
972
|
}
|
|
973
973
|
},
|
|
974
974
|
"node_modules/buffer-equal-constant-time": {
|
|
@@ -1356,12 +1356,12 @@
|
|
|
1356
1356
|
}
|
|
1357
1357
|
},
|
|
1358
1358
|
"node_modules/minimatch": {
|
|
1359
|
-
"version": "10.2.
|
|
1360
|
-
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.
|
|
1361
|
-
"integrity": "sha512-
|
|
1359
|
+
"version": "10.2.6",
|
|
1360
|
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
|
|
1361
|
+
"integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
|
|
1362
1362
|
"license": "BlueOak-1.0.0",
|
|
1363
1363
|
"dependencies": {
|
|
1364
|
-
"brace-expansion": "^5.0.
|
|
1364
|
+
"brace-expansion": "^5.0.8"
|
|
1365
1365
|
},
|
|
1366
1366
|
"engines": {
|
|
1367
1367
|
"node": "18 || 20 || >=22"
|
|
@@ -1424,19 +1424,19 @@
|
|
|
1424
1424
|
}
|
|
1425
1425
|
},
|
|
1426
1426
|
"node_modules/omk-adaptorch-wpl": {
|
|
1427
|
-
"version": "0.
|
|
1428
|
-
"resolved": "https://registry.npmjs.org/omk-adaptorch-wpl/-/omk-adaptorch-wpl-0.
|
|
1427
|
+
"version": "0.95.1",
|
|
1428
|
+
"resolved": "https://registry.npmjs.org/omk-adaptorch-wpl/-/omk-adaptorch-wpl-0.95.1.tgz",
|
|
1429
1429
|
"license": "MIT",
|
|
1430
1430
|
"engines": {
|
|
1431
1431
|
"node": ">=22.19.0"
|
|
1432
1432
|
}
|
|
1433
1433
|
},
|
|
1434
1434
|
"node_modules/omk-agent-core": {
|
|
1435
|
-
"version": "0.
|
|
1436
|
-
"resolved": "https://registry.npmjs.org/omk-agent-core/-/omk-agent-core-0.
|
|
1435
|
+
"version": "0.95.1",
|
|
1436
|
+
"resolved": "https://registry.npmjs.org/omk-agent-core/-/omk-agent-core-0.95.1.tgz",
|
|
1437
1437
|
"license": "MIT",
|
|
1438
1438
|
"dependencies": {
|
|
1439
|
-
"omk-ai": "^0.
|
|
1439
|
+
"omk-ai": "^0.95.1",
|
|
1440
1440
|
"ignore": "7.0.5",
|
|
1441
1441
|
"typebox": "1.1.38",
|
|
1442
1442
|
"yaml": "2.9.0"
|
|
@@ -1446,8 +1446,8 @@
|
|
|
1446
1446
|
}
|
|
1447
1447
|
},
|
|
1448
1448
|
"node_modules/omk-ai": {
|
|
1449
|
-
"version": "0.
|
|
1450
|
-
"resolved": "https://registry.npmjs.org/omk-ai/-/omk-ai-0.
|
|
1449
|
+
"version": "0.95.1",
|
|
1450
|
+
"resolved": "https://registry.npmjs.org/omk-ai/-/omk-ai-0.95.1.tgz",
|
|
1451
1451
|
"license": "MIT",
|
|
1452
1452
|
"dependencies": {
|
|
1453
1453
|
"@anthropic-ai/sdk": "0.91.1",
|
|
@@ -1469,8 +1469,8 @@
|
|
|
1469
1469
|
}
|
|
1470
1470
|
},
|
|
1471
1471
|
"node_modules/omk-tui": {
|
|
1472
|
-
"version": "0.
|
|
1473
|
-
"resolved": "https://registry.npmjs.org/omk-tui/-/omk-tui-0.
|
|
1472
|
+
"version": "0.95.1",
|
|
1473
|
+
"resolved": "https://registry.npmjs.org/omk-tui/-/omk-tui-0.95.1.tgz",
|
|
1474
1474
|
"license": "MIT",
|
|
1475
1475
|
"dependencies": {
|
|
1476
1476
|
"get-east-asian-width": "1.6.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-multi-agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.95.1",
|
|
4
4
|
"description": "OMK (Open Multi-Agent Kit) coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"omkConfig": {
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"postinstall": "node ./scripts/link-workspace-deps.mjs"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"omk-agent-core": "^0.
|
|
48
|
-
"omk-ai": "^0.
|
|
49
|
-
"omk-tui": "^0.
|
|
47
|
+
"omk-agent-core": "^0.95.1",
|
|
48
|
+
"omk-ai": "^0.95.1",
|
|
49
|
+
"omk-tui": "^0.95.1",
|
|
50
50
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
51
51
|
"chalk": "5.6.2",
|
|
52
52
|
"cross-spawn": "7.0.6",
|
|
@@ -56,12 +56,12 @@
|
|
|
56
56
|
"hosted-git-info": "9.0.3",
|
|
57
57
|
"ignore": "7.0.5",
|
|
58
58
|
"jiti": "2.7.0",
|
|
59
|
-
"minimatch": "10.2.
|
|
59
|
+
"minimatch": "10.2.6",
|
|
60
60
|
"proper-lockfile": "4.1.2",
|
|
61
61
|
"typebox": "1.1.38",
|
|
62
62
|
"undici": "8.5.0",
|
|
63
63
|
"yaml": "2.9.0",
|
|
64
|
-
"omk-adaptorch-wpl": "^0.
|
|
64
|
+
"omk-adaptorch-wpl": "^0.95.1"
|
|
65
65
|
},
|
|
66
66
|
"overrides": {
|
|
67
67
|
"rimraf": "6.1.2",
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { type TokenCounterAdapter, type TokenCountResult } from "./context-budget-token-counter.ts";
|
|
2
|
-
export type ContextBudgetCompressorMode = "off" | "auto" | "headroom" | "llmlingua";
|
|
3
|
-
export type ContextBudgetCompressionMethod = "compressed" | "none";
|
|
4
|
-
export interface ContextCompressionRequest {
|
|
5
|
-
readonly text: string;
|
|
6
|
-
readonly targetTokens: number;
|
|
7
|
-
readonly modelId: string;
|
|
8
|
-
readonly timeoutMs?: number;
|
|
9
|
-
readonly maxOutputChars?: number;
|
|
10
|
-
}
|
|
11
|
-
export interface ContextCompressionResult {
|
|
12
|
-
readonly text: string;
|
|
13
|
-
readonly method: ContextBudgetCompressionMethod;
|
|
14
|
-
readonly adapterId: string;
|
|
15
|
-
readonly input: TokenCountResult;
|
|
16
|
-
readonly output: TokenCountResult;
|
|
17
|
-
readonly notes: readonly string[];
|
|
18
|
-
}
|
|
19
|
-
export interface ContextCompressorAdapter {
|
|
20
|
-
readonly id: string;
|
|
21
|
-
readonly priority: number;
|
|
22
|
-
isAvailable(): Promise<boolean>;
|
|
23
|
-
compress(request: ContextCompressionRequest): Promise<ContextCompressionResult>;
|
|
24
|
-
}
|
|
25
|
-
export interface CommandRunRequest {
|
|
26
|
-
readonly command: string;
|
|
27
|
-
readonly args: readonly string[];
|
|
28
|
-
readonly input: string;
|
|
29
|
-
readonly timeoutMs: number;
|
|
30
|
-
}
|
|
31
|
-
export interface CommandRunResult {
|
|
32
|
-
readonly exitCode: number | null;
|
|
33
|
-
readonly stdout: string;
|
|
34
|
-
readonly stderr: string;
|
|
35
|
-
readonly timedOut: boolean;
|
|
36
|
-
}
|
|
37
|
-
export interface CommandRunner {
|
|
38
|
-
run(request: CommandRunRequest): Promise<CommandRunResult>;
|
|
39
|
-
}
|
|
40
|
-
export interface CliCompressorOptions {
|
|
41
|
-
readonly command?: string;
|
|
42
|
-
readonly runner?: CommandRunner;
|
|
43
|
-
readonly tokenCounter?: TokenCounterAdapter;
|
|
44
|
-
}
|
|
45
|
-
export declare function createNodeCommandRunner(): CommandRunner;
|
|
46
|
-
export declare function createHeadroomCliCompressor(options?: CliCompressorOptions): ContextCompressorAdapter;
|
|
47
|
-
export declare function createLlmlinguaCliCompressor(options?: CliCompressorOptions): ContextCompressorAdapter;
|
|
48
|
-
export declare function createContextCompressorForMode(mode: ContextBudgetCompressorMode, options?: CliCompressorOptions): ContextCompressorAdapter | undefined;
|
|
49
|
-
export declare function createCompressorRegistry(adapters: readonly ContextCompressorAdapter[]): ContextCompressorAdapter;
|
|
50
|
-
//# sourceMappingURL=context-budget-compressors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-compressors.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-compressors.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,2BAA2B,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;AACpF,MAAM,MAAM,8BAA8B,GAAG,YAAY,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AAKD,wBAAgB,uBAAuB,IAAI,aAAa,CAqCvD;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,oBAAyB,GAAG,wBAAwB,CASxG;AAED,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,oBAAyB,GAAG,wBAAwB,CASzG;AAED,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,2BAA2B,EACjC,OAAO,GAAE,oBAAyB,GAChC,wBAAwB,GAAG,SAAS,CAWtC;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAAG,wBAAwB,CAwBhH","sourcesContent":["import { spawn } from \"node:child_process\";\nimport {\n\tcreateFallbackTokenCounter,\n\ttype TokenCounterAdapter,\n\ttype TokenCountResult,\n} from \"./context-budget-token-counter.ts\";\n\nexport type ContextBudgetCompressorMode = \"off\" | \"auto\" | \"headroom\" | \"llmlingua\";\nexport type ContextBudgetCompressionMethod = \"compressed\" | \"none\";\n\nexport interface ContextCompressionRequest {\n\treadonly text: string;\n\treadonly targetTokens: number;\n\treadonly modelId: string;\n\treadonly timeoutMs?: number;\n\treadonly maxOutputChars?: number;\n}\n\nexport interface ContextCompressionResult {\n\treadonly text: string;\n\treadonly method: ContextBudgetCompressionMethod;\n\treadonly adapterId: string;\n\treadonly input: TokenCountResult;\n\treadonly output: TokenCountResult;\n\treadonly notes: readonly string[];\n}\n\nexport interface ContextCompressorAdapter {\n\treadonly id: string;\n\treadonly priority: number;\n\tisAvailable(): Promise<boolean>;\n\tcompress(request: ContextCompressionRequest): Promise<ContextCompressionResult>;\n}\n\nexport interface CommandRunRequest {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly input: string;\n\treadonly timeoutMs: number;\n}\n\nexport interface CommandRunResult {\n\treadonly exitCode: number | null;\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly timedOut: boolean;\n}\n\nexport interface CommandRunner {\n\trun(request: CommandRunRequest): Promise<CommandRunResult>;\n}\n\nexport interface CliCompressorOptions {\n\treadonly command?: string;\n\treadonly runner?: CommandRunner;\n\treadonly tokenCounter?: TokenCounterAdapter;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 400_000;\n\nexport function createNodeCommandRunner(): CommandRunner {\n\treturn {\n\t\trun(request) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tconst child = spawn(request.command, [...request.args], { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\t\tlet stdout = \"\";\n\t\t\t\tlet stderr = \"\";\n\t\t\t\tlet settled = false;\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t\tresolve({ exitCode: null, stdout, stderr, timedOut: true });\n\t\t\t\t}, request.timeoutMs);\n\t\t\t\tchild.stdout.setEncoding(\"utf8\");\n\t\t\t\tchild.stderr.setEncoding(\"utf8\");\n\t\t\t\tchild.stdout.on(\"data\", (chunk: string) => {\n\t\t\t\t\tstdout += chunk;\n\t\t\t\t});\n\t\t\t\tchild.stderr.on(\"data\", (chunk: string) => {\n\t\t\t\t\tstderr += chunk;\n\t\t\t\t});\n\t\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve({ exitCode: null, stdout, stderr: error.message, timedOut: false });\n\t\t\t\t});\n\t\t\t\tchild.on(\"close\", (exitCode) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve({ exitCode, stdout, stderr, timedOut: false });\n\t\t\t\t});\n\t\t\t\tchild.stdin.end(request.input, \"utf8\");\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function createHeadroomCliCompressor(options: CliCompressorOptions = {}): ContextCompressorAdapter {\n\treturn createCliCompressor({\n\t\tid: \"headroom-cli\",\n\t\tpriority: 80,\n\t\tcommand: options.command ?? \"headroom\",\n\t\targs: (request) => [\"compress\", \"--target-tokens\", String(request.targetTokens), \"--model\", request.modelId],\n\t\trunner: options.runner,\n\t\ttokenCounter: options.tokenCounter,\n\t});\n}\n\nexport function createLlmlinguaCliCompressor(options: CliCompressorOptions = {}): ContextCompressorAdapter {\n\treturn createCliCompressor({\n\t\tid: \"llmlingua-cli\",\n\t\tpriority: 60,\n\t\tcommand: options.command ?? \"llmlingua\",\n\t\targs: (request) => [\"compress\", \"--target-tokens\", String(request.targetTokens), \"--model\", request.modelId],\n\t\trunner: options.runner,\n\t\ttokenCounter: options.tokenCounter,\n\t});\n}\n\nexport function createContextCompressorForMode(\n\tmode: ContextBudgetCompressorMode,\n\toptions: CliCompressorOptions = {},\n): ContextCompressorAdapter | undefined {\n\tif (mode === \"off\") {\n\t\treturn undefined;\n\t}\n\tif (mode === \"headroom\") {\n\t\treturn createHeadroomCliCompressor(options);\n\t}\n\tif (mode === \"llmlingua\") {\n\t\treturn createLlmlinguaCliCompressor(options);\n\t}\n\treturn createCompressorRegistry([createHeadroomCliCompressor(options), createLlmlinguaCliCompressor(options)]);\n}\n\nexport function createCompressorRegistry(adapters: readonly ContextCompressorAdapter[]): ContextCompressorAdapter {\n\tconst ordered = [...adapters].sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));\n\treturn {\n\t\tid: \"context-compressor-registry\",\n\t\tpriority: 100,\n\t\tisAvailable: async () => true,\n\t\tasync compress(request) {\n\t\t\tconst notes: string[] = [];\n\t\t\tfor (const adapter of ordered) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await adapter.isAvailable())) {\n\t\t\t\t\t\tnotes.push(`${adapter.id}:unavailable`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst result = await adapter.compress(request);\n\t\t\t\t\treturn { ...result, notes: [...notes, ...result.notes] };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : \"unknown compressor failure\";\n\t\t\t\t\tnotes.push(`${adapter.id}:failed:${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn createNoCompressionResult(request, createFallbackTokenCounter(), notes);\n\t\t},\n\t};\n}\n\ninterface CliCompressorInternalOptions {\n\treadonly id: string;\n\treadonly priority: number;\n\treadonly command: string;\n\treadonly args: (request: ContextCompressionRequest) => readonly string[];\n\treadonly runner?: CommandRunner;\n\treadonly tokenCounter?: TokenCounterAdapter;\n}\n\nfunction createCliCompressor(options: CliCompressorInternalOptions): ContextCompressorAdapter {\n\tconst runner = options.runner ?? createNodeCommandRunner();\n\tconst tokenCounter = options.tokenCounter ?? createFallbackTokenCounter();\n\treturn {\n\t\tid: options.id,\n\t\tpriority: options.priority,\n\t\tasync isAvailable() {\n\t\t\tconst result = await runner.run({\n\t\t\t\tcommand: options.command,\n\t\t\t\targs: [\"--version\"],\n\t\t\t\tinput: \"\",\n\t\t\t\ttimeoutMs: 3_000,\n\t\t\t});\n\t\t\treturn result.exitCode === 0 && !result.timedOut;\n\t\t},\n\t\tasync compress(request) {\n\t\t\tconst input = tokenCounter.countText(request.text, request.modelId);\n\t\t\tif (input.tokens <= request.targetTokens) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:already-within-budget`]);\n\t\t\t}\n\t\t\tconst timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\t\t\tconst result = await runner.run({\n\t\t\t\tcommand: options.command,\n\t\t\t\targs: options.args(request),\n\t\t\t\tinput: request.text,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t\tif (result.timedOut) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:timeout`]);\n\t\t\t}\n\t\t\tif (result.exitCode !== 0) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [\n\t\t\t\t\t`${options.id}:exit:${result.exitCode ?? \"null\"}`,\n\t\t\t\t]);\n\t\t\t}\n\t\t\tconst maxOutputChars = request.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;\n\t\t\tconst outputText = result.stdout.slice(0, maxOutputChars);\n\t\t\tif (outputText.trim().length === 0) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:empty-output`]);\n\t\t\t}\n\t\t\tconst output = tokenCounter.countText(outputText, request.modelId);\n\t\t\treturn {\n\t\t\t\ttext: outputText,\n\t\t\t\tmethod: \"compressed\",\n\t\t\t\tadapterId: options.id,\n\t\t\t\tinput,\n\t\t\t\toutput,\n\t\t\t\tnotes: outputText.length < result.stdout.length ? [`${options.id}:output-truncated`] : [`${options.id}:ok`],\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction createNoCompressionResult(\n\trequest: ContextCompressionRequest,\n\ttokenCounter: TokenCounterAdapter,\n\tnotes: readonly string[],\n): ContextCompressionResult {\n\tconst input = tokenCounter.countText(request.text, request.modelId);\n\treturn {\n\t\ttext: request.text,\n\t\tmethod: \"none\",\n\t\tadapterId: \"none\",\n\t\tinput,\n\t\toutput: input,\n\t\tnotes,\n\t};\n}\n"]}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { createFallbackTokenCounter, } from "./context-budget-token-counter.js";
|
|
3
|
-
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
4
|
-
const DEFAULT_MAX_OUTPUT_CHARS = 400_000;
|
|
5
|
-
export function createNodeCommandRunner() {
|
|
6
|
-
return {
|
|
7
|
-
run(request) {
|
|
8
|
-
return new Promise((resolve) => {
|
|
9
|
-
const child = spawn(request.command, [...request.args], { stdio: ["pipe", "pipe", "pipe"] });
|
|
10
|
-
let stdout = "";
|
|
11
|
-
let stderr = "";
|
|
12
|
-
let settled = false;
|
|
13
|
-
const timeout = setTimeout(() => {
|
|
14
|
-
settled = true;
|
|
15
|
-
child.kill("SIGTERM");
|
|
16
|
-
resolve({ exitCode: null, stdout, stderr, timedOut: true });
|
|
17
|
-
}, request.timeoutMs);
|
|
18
|
-
child.stdout.setEncoding("utf8");
|
|
19
|
-
child.stderr.setEncoding("utf8");
|
|
20
|
-
child.stdout.on("data", (chunk) => {
|
|
21
|
-
stdout += chunk;
|
|
22
|
-
});
|
|
23
|
-
child.stderr.on("data", (chunk) => {
|
|
24
|
-
stderr += chunk;
|
|
25
|
-
});
|
|
26
|
-
child.on("error", (error) => {
|
|
27
|
-
if (settled)
|
|
28
|
-
return;
|
|
29
|
-
settled = true;
|
|
30
|
-
clearTimeout(timeout);
|
|
31
|
-
resolve({ exitCode: null, stdout, stderr: error.message, timedOut: false });
|
|
32
|
-
});
|
|
33
|
-
child.on("close", (exitCode) => {
|
|
34
|
-
if (settled)
|
|
35
|
-
return;
|
|
36
|
-
settled = true;
|
|
37
|
-
clearTimeout(timeout);
|
|
38
|
-
resolve({ exitCode, stdout, stderr, timedOut: false });
|
|
39
|
-
});
|
|
40
|
-
child.stdin.end(request.input, "utf8");
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
export function createHeadroomCliCompressor(options = {}) {
|
|
46
|
-
return createCliCompressor({
|
|
47
|
-
id: "headroom-cli",
|
|
48
|
-
priority: 80,
|
|
49
|
-
command: options.command ?? "headroom",
|
|
50
|
-
args: (request) => ["compress", "--target-tokens", String(request.targetTokens), "--model", request.modelId],
|
|
51
|
-
runner: options.runner,
|
|
52
|
-
tokenCounter: options.tokenCounter,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
export function createLlmlinguaCliCompressor(options = {}) {
|
|
56
|
-
return createCliCompressor({
|
|
57
|
-
id: "llmlingua-cli",
|
|
58
|
-
priority: 60,
|
|
59
|
-
command: options.command ?? "llmlingua",
|
|
60
|
-
args: (request) => ["compress", "--target-tokens", String(request.targetTokens), "--model", request.modelId],
|
|
61
|
-
runner: options.runner,
|
|
62
|
-
tokenCounter: options.tokenCounter,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
export function createContextCompressorForMode(mode, options = {}) {
|
|
66
|
-
if (mode === "off") {
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
if (mode === "headroom") {
|
|
70
|
-
return createHeadroomCliCompressor(options);
|
|
71
|
-
}
|
|
72
|
-
if (mode === "llmlingua") {
|
|
73
|
-
return createLlmlinguaCliCompressor(options);
|
|
74
|
-
}
|
|
75
|
-
return createCompressorRegistry([createHeadroomCliCompressor(options), createLlmlinguaCliCompressor(options)]);
|
|
76
|
-
}
|
|
77
|
-
export function createCompressorRegistry(adapters) {
|
|
78
|
-
const ordered = [...adapters].sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));
|
|
79
|
-
return {
|
|
80
|
-
id: "context-compressor-registry",
|
|
81
|
-
priority: 100,
|
|
82
|
-
isAvailable: async () => true,
|
|
83
|
-
async compress(request) {
|
|
84
|
-
const notes = [];
|
|
85
|
-
for (const adapter of ordered) {
|
|
86
|
-
try {
|
|
87
|
-
if (!(await adapter.isAvailable())) {
|
|
88
|
-
notes.push(`${adapter.id}:unavailable`);
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
const result = await adapter.compress(request);
|
|
92
|
-
return { ...result, notes: [...notes, ...result.notes] };
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
const message = error instanceof Error ? error.message : "unknown compressor failure";
|
|
96
|
-
notes.push(`${adapter.id}:failed:${message}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return createNoCompressionResult(request, createFallbackTokenCounter(), notes);
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
function createCliCompressor(options) {
|
|
104
|
-
const runner = options.runner ?? createNodeCommandRunner();
|
|
105
|
-
const tokenCounter = options.tokenCounter ?? createFallbackTokenCounter();
|
|
106
|
-
return {
|
|
107
|
-
id: options.id,
|
|
108
|
-
priority: options.priority,
|
|
109
|
-
async isAvailable() {
|
|
110
|
-
const result = await runner.run({
|
|
111
|
-
command: options.command,
|
|
112
|
-
args: ["--version"],
|
|
113
|
-
input: "",
|
|
114
|
-
timeoutMs: 3_000,
|
|
115
|
-
});
|
|
116
|
-
return result.exitCode === 0 && !result.timedOut;
|
|
117
|
-
},
|
|
118
|
-
async compress(request) {
|
|
119
|
-
const input = tokenCounter.countText(request.text, request.modelId);
|
|
120
|
-
if (input.tokens <= request.targetTokens) {
|
|
121
|
-
return createNoCompressionResult(request, tokenCounter, [`${options.id}:already-within-budget`]);
|
|
122
|
-
}
|
|
123
|
-
const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
124
|
-
const result = await runner.run({
|
|
125
|
-
command: options.command,
|
|
126
|
-
args: options.args(request),
|
|
127
|
-
input: request.text,
|
|
128
|
-
timeoutMs,
|
|
129
|
-
});
|
|
130
|
-
if (result.timedOut) {
|
|
131
|
-
return createNoCompressionResult(request, tokenCounter, [`${options.id}:timeout`]);
|
|
132
|
-
}
|
|
133
|
-
if (result.exitCode !== 0) {
|
|
134
|
-
return createNoCompressionResult(request, tokenCounter, [
|
|
135
|
-
`${options.id}:exit:${result.exitCode ?? "null"}`,
|
|
136
|
-
]);
|
|
137
|
-
}
|
|
138
|
-
const maxOutputChars = request.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;
|
|
139
|
-
const outputText = result.stdout.slice(0, maxOutputChars);
|
|
140
|
-
if (outputText.trim().length === 0) {
|
|
141
|
-
return createNoCompressionResult(request, tokenCounter, [`${options.id}:empty-output`]);
|
|
142
|
-
}
|
|
143
|
-
const output = tokenCounter.countText(outputText, request.modelId);
|
|
144
|
-
return {
|
|
145
|
-
text: outputText,
|
|
146
|
-
method: "compressed",
|
|
147
|
-
adapterId: options.id,
|
|
148
|
-
input,
|
|
149
|
-
output,
|
|
150
|
-
notes: outputText.length < result.stdout.length ? [`${options.id}:output-truncated`] : [`${options.id}:ok`],
|
|
151
|
-
};
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
function createNoCompressionResult(request, tokenCounter, notes) {
|
|
156
|
-
const input = tokenCounter.countText(request.text, request.modelId);
|
|
157
|
-
return {
|
|
158
|
-
text: request.text,
|
|
159
|
-
method: "none",
|
|
160
|
-
adapterId: "none",
|
|
161
|
-
input,
|
|
162
|
-
output: input,
|
|
163
|
-
notes,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=context-budget-compressors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-compressors.js","sourceRoot":"","sources":["../../src/core/context-budget-compressors.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport {\n\tcreateFallbackTokenCounter,\n\ttype TokenCounterAdapter,\n\ttype TokenCountResult,\n} from \"./context-budget-token-counter.ts\";\n\nexport type ContextBudgetCompressorMode = \"off\" | \"auto\" | \"headroom\" | \"llmlingua\";\nexport type ContextBudgetCompressionMethod = \"compressed\" | \"none\";\n\nexport interface ContextCompressionRequest {\n\treadonly text: string;\n\treadonly targetTokens: number;\n\treadonly modelId: string;\n\treadonly timeoutMs?: number;\n\treadonly maxOutputChars?: number;\n}\n\nexport interface ContextCompressionResult {\n\treadonly text: string;\n\treadonly method: ContextBudgetCompressionMethod;\n\treadonly adapterId: string;\n\treadonly input: TokenCountResult;\n\treadonly output: TokenCountResult;\n\treadonly notes: readonly string[];\n}\n\nexport interface ContextCompressorAdapter {\n\treadonly id: string;\n\treadonly priority: number;\n\tisAvailable(): Promise<boolean>;\n\tcompress(request: ContextCompressionRequest): Promise<ContextCompressionResult>;\n}\n\nexport interface CommandRunRequest {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly input: string;\n\treadonly timeoutMs: number;\n}\n\nexport interface CommandRunResult {\n\treadonly exitCode: number | null;\n\treadonly stdout: string;\n\treadonly stderr: string;\n\treadonly timedOut: boolean;\n}\n\nexport interface CommandRunner {\n\trun(request: CommandRunRequest): Promise<CommandRunResult>;\n}\n\nexport interface CliCompressorOptions {\n\treadonly command?: string;\n\treadonly runner?: CommandRunner;\n\treadonly tokenCounter?: TokenCounterAdapter;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst DEFAULT_MAX_OUTPUT_CHARS = 400_000;\n\nexport function createNodeCommandRunner(): CommandRunner {\n\treturn {\n\t\trun(request) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tconst child = spawn(request.command, [...request.args], { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\t\tlet stdout = \"\";\n\t\t\t\tlet stderr = \"\";\n\t\t\t\tlet settled = false;\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t\tresolve({ exitCode: null, stdout, stderr, timedOut: true });\n\t\t\t\t}, request.timeoutMs);\n\t\t\t\tchild.stdout.setEncoding(\"utf8\");\n\t\t\t\tchild.stderr.setEncoding(\"utf8\");\n\t\t\t\tchild.stdout.on(\"data\", (chunk: string) => {\n\t\t\t\t\tstdout += chunk;\n\t\t\t\t});\n\t\t\t\tchild.stderr.on(\"data\", (chunk: string) => {\n\t\t\t\t\tstderr += chunk;\n\t\t\t\t});\n\t\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve({ exitCode: null, stdout, stderr: error.message, timedOut: false });\n\t\t\t\t});\n\t\t\t\tchild.on(\"close\", (exitCode) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve({ exitCode, stdout, stderr, timedOut: false });\n\t\t\t\t});\n\t\t\t\tchild.stdin.end(request.input, \"utf8\");\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function createHeadroomCliCompressor(options: CliCompressorOptions = {}): ContextCompressorAdapter {\n\treturn createCliCompressor({\n\t\tid: \"headroom-cli\",\n\t\tpriority: 80,\n\t\tcommand: options.command ?? \"headroom\",\n\t\targs: (request) => [\"compress\", \"--target-tokens\", String(request.targetTokens), \"--model\", request.modelId],\n\t\trunner: options.runner,\n\t\ttokenCounter: options.tokenCounter,\n\t});\n}\n\nexport function createLlmlinguaCliCompressor(options: CliCompressorOptions = {}): ContextCompressorAdapter {\n\treturn createCliCompressor({\n\t\tid: \"llmlingua-cli\",\n\t\tpriority: 60,\n\t\tcommand: options.command ?? \"llmlingua\",\n\t\targs: (request) => [\"compress\", \"--target-tokens\", String(request.targetTokens), \"--model\", request.modelId],\n\t\trunner: options.runner,\n\t\ttokenCounter: options.tokenCounter,\n\t});\n}\n\nexport function createContextCompressorForMode(\n\tmode: ContextBudgetCompressorMode,\n\toptions: CliCompressorOptions = {},\n): ContextCompressorAdapter | undefined {\n\tif (mode === \"off\") {\n\t\treturn undefined;\n\t}\n\tif (mode === \"headroom\") {\n\t\treturn createHeadroomCliCompressor(options);\n\t}\n\tif (mode === \"llmlingua\") {\n\t\treturn createLlmlinguaCliCompressor(options);\n\t}\n\treturn createCompressorRegistry([createHeadroomCliCompressor(options), createLlmlinguaCliCompressor(options)]);\n}\n\nexport function createCompressorRegistry(adapters: readonly ContextCompressorAdapter[]): ContextCompressorAdapter {\n\tconst ordered = [...adapters].sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));\n\treturn {\n\t\tid: \"context-compressor-registry\",\n\t\tpriority: 100,\n\t\tisAvailable: async () => true,\n\t\tasync compress(request) {\n\t\t\tconst notes: string[] = [];\n\t\t\tfor (const adapter of ordered) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await adapter.isAvailable())) {\n\t\t\t\t\t\tnotes.push(`${adapter.id}:unavailable`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst result = await adapter.compress(request);\n\t\t\t\t\treturn { ...result, notes: [...notes, ...result.notes] };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : \"unknown compressor failure\";\n\t\t\t\t\tnotes.push(`${adapter.id}:failed:${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn createNoCompressionResult(request, createFallbackTokenCounter(), notes);\n\t\t},\n\t};\n}\n\ninterface CliCompressorInternalOptions {\n\treadonly id: string;\n\treadonly priority: number;\n\treadonly command: string;\n\treadonly args: (request: ContextCompressionRequest) => readonly string[];\n\treadonly runner?: CommandRunner;\n\treadonly tokenCounter?: TokenCounterAdapter;\n}\n\nfunction createCliCompressor(options: CliCompressorInternalOptions): ContextCompressorAdapter {\n\tconst runner = options.runner ?? createNodeCommandRunner();\n\tconst tokenCounter = options.tokenCounter ?? createFallbackTokenCounter();\n\treturn {\n\t\tid: options.id,\n\t\tpriority: options.priority,\n\t\tasync isAvailable() {\n\t\t\tconst result = await runner.run({\n\t\t\t\tcommand: options.command,\n\t\t\t\targs: [\"--version\"],\n\t\t\t\tinput: \"\",\n\t\t\t\ttimeoutMs: 3_000,\n\t\t\t});\n\t\t\treturn result.exitCode === 0 && !result.timedOut;\n\t\t},\n\t\tasync compress(request) {\n\t\t\tconst input = tokenCounter.countText(request.text, request.modelId);\n\t\t\tif (input.tokens <= request.targetTokens) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:already-within-budget`]);\n\t\t\t}\n\t\t\tconst timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\t\t\tconst result = await runner.run({\n\t\t\t\tcommand: options.command,\n\t\t\t\targs: options.args(request),\n\t\t\t\tinput: request.text,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t\tif (result.timedOut) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:timeout`]);\n\t\t\t}\n\t\t\tif (result.exitCode !== 0) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [\n\t\t\t\t\t`${options.id}:exit:${result.exitCode ?? \"null\"}`,\n\t\t\t\t]);\n\t\t\t}\n\t\t\tconst maxOutputChars = request.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;\n\t\t\tconst outputText = result.stdout.slice(0, maxOutputChars);\n\t\t\tif (outputText.trim().length === 0) {\n\t\t\t\treturn createNoCompressionResult(request, tokenCounter, [`${options.id}:empty-output`]);\n\t\t\t}\n\t\t\tconst output = tokenCounter.countText(outputText, request.modelId);\n\t\t\treturn {\n\t\t\t\ttext: outputText,\n\t\t\t\tmethod: \"compressed\",\n\t\t\t\tadapterId: options.id,\n\t\t\t\tinput,\n\t\t\t\toutput,\n\t\t\t\tnotes: outputText.length < result.stdout.length ? [`${options.id}:output-truncated`] : [`${options.id}:ok`],\n\t\t\t};\n\t\t},\n\t};\n}\n\nfunction createNoCompressionResult(\n\trequest: ContextCompressionRequest,\n\ttokenCounter: TokenCounterAdapter,\n\tnotes: readonly string[],\n): ContextCompressionResult {\n\tconst input = tokenCounter.countText(request.text, request.modelId);\n\treturn {\n\t\ttext: request.text,\n\t\tmethod: \"none\",\n\t\tadapterId: \"none\",\n\t\tinput,\n\t\toutput: input,\n\t\tnotes,\n\t};\n}\n"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent GitHub star nudge for interactive startup.
|
|
3
|
-
* Unstarred installs keep getting reminded until the operator marks starred via /star.
|
|
4
|
-
*/
|
|
5
|
-
export declare const OMK_GITHUB_REPO_URL = "https://github.com/dmae97/omk";
|
|
6
|
-
export declare const OMK_GITHUB_STAR_URL = "https://github.com/dmae97/omk";
|
|
7
|
-
export interface GithubStarNudgeState {
|
|
8
|
-
/** True once the operator confirmed they starred (or already starred). */
|
|
9
|
-
readonly githubStarred?: boolean;
|
|
10
|
-
}
|
|
11
|
-
/** Show on every interactive startup until the operator marks starred. */
|
|
12
|
-
export declare function shouldShowGithubStarNudge(state: GithubStarNudgeState): boolean;
|
|
13
|
-
export declare function githubStarNudgeTitle(): string;
|
|
14
|
-
export declare function githubStarNudgeBody(): string;
|
|
15
|
-
//# sourceMappingURL=github-star-nudge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-star-nudge.d.ts","sourceRoot":"","sources":["../../src/core/github-star-nudge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,mBAAmB,kCAAkC,CAAC;AACnE,eAAO,MAAM,mBAAmB,kCAAkC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAE9E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C","sourcesContent":["/**\n * Persistent GitHub star nudge for interactive startup.\n * Unstarred installs keep getting reminded until the operator marks starred via /star.\n */\n\nexport const OMK_GITHUB_REPO_URL = \"https://github.com/dmae97/omk\";\nexport const OMK_GITHUB_STAR_URL = \"https://github.com/dmae97/omk\";\n\nexport interface GithubStarNudgeState {\n\t/** True once the operator confirmed they starred (or already starred). */\n\treadonly githubStarred?: boolean;\n}\n\n/** Show on every interactive startup until the operator marks starred. */\nexport function shouldShowGithubStarNudge(state: GithubStarNudgeState): boolean {\n\treturn state.githubStarred !== true;\n}\n\nexport function githubStarNudgeTitle(): string {\n\treturn \"Star OMK on GitHub\";\n}\n\nexport function githubStarNudgeBody(): string {\n\treturn [\n\t\t\"First install or still no star? Hit the star button — it keeps the project alive.\",\n\t\t`Repo: ${OMK_GITHUB_STAR_URL}`,\n\t\t\"After starring, run /star so this stops nagging. Until then it comes back every launch.\",\n\t].join(\"\\n\");\n}\n"]}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent GitHub star nudge for interactive startup.
|
|
3
|
-
* Unstarred installs keep getting reminded until the operator marks starred via /star.
|
|
4
|
-
*/
|
|
5
|
-
export const OMK_GITHUB_REPO_URL = "https://github.com/dmae97/omk";
|
|
6
|
-
export const OMK_GITHUB_STAR_URL = "https://github.com/dmae97/omk";
|
|
7
|
-
/** Show on every interactive startup until the operator marks starred. */
|
|
8
|
-
export function shouldShowGithubStarNudge(state) {
|
|
9
|
-
return state.githubStarred !== true;
|
|
10
|
-
}
|
|
11
|
-
export function githubStarNudgeTitle() {
|
|
12
|
-
return "Star OMK on GitHub";
|
|
13
|
-
}
|
|
14
|
-
export function githubStarNudgeBody() {
|
|
15
|
-
return [
|
|
16
|
-
"First install or still no star? Hit the star button — it keeps the project alive.",
|
|
17
|
-
`Repo: ${OMK_GITHUB_STAR_URL}`,
|
|
18
|
-
"After starring, run /star so this stops nagging. Until then it comes back every launch.",
|
|
19
|
-
].join("\n");
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=github-star-nudge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-star-nudge.js","sourceRoot":"","sources":["../../src/core/github-star-nudge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AAOnE,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB,CAAC,KAA2B,EAAW;IAC/E,OAAO,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;AAAA,CACpC;AAED,MAAM,UAAU,oBAAoB,GAAW;IAC9C,OAAO,oBAAoB,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,mBAAmB,GAAW;IAC7C,OAAO;QACN,qFAAmF;QACnF,SAAS,mBAAmB,EAAE;QAC9B,yFAAyF;KACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACb","sourcesContent":["/**\n * Persistent GitHub star nudge for interactive startup.\n * Unstarred installs keep getting reminded until the operator marks starred via /star.\n */\n\nexport const OMK_GITHUB_REPO_URL = \"https://github.com/dmae97/omk\";\nexport const OMK_GITHUB_STAR_URL = \"https://github.com/dmae97/omk\";\n\nexport interface GithubStarNudgeState {\n\t/** True once the operator confirmed they starred (or already starred). */\n\treadonly githubStarred?: boolean;\n}\n\n/** Show on every interactive startup until the operator marks starred. */\nexport function shouldShowGithubStarNudge(state: GithubStarNudgeState): boolean {\n\treturn state.githubStarred !== true;\n}\n\nexport function githubStarNudgeTitle(): string {\n\treturn \"Star OMK on GitHub\";\n}\n\nexport function githubStarNudgeBody(): string {\n\treturn [\n\t\t\"First install or still no star? Hit the star button — it keeps the project alive.\",\n\t\t`Repo: ${OMK_GITHUB_STAR_URL}`,\n\t\t\"After starring, run /star so this stops nagging. Until then it comes back every launch.\",\n\t].join(\"\\n\");\n}\n"]}
|