chivgent 0.7.0 → 0.9.0
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/README.md +96 -3
- package/README.zh-CN.md +88 -3
- package/dist/agent.d.ts +14 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +33 -1
- package/dist/agent.js.map +1 -1
- package/dist/auth/credentials.d.ts +26 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +29 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/env-credentials.d.ts +10 -0
- package/dist/auth/env-credentials.d.ts.map +1 -0
- package/dist/auth/env-credentials.js +18 -0
- package/dist/auth/env-credentials.js.map +1 -0
- package/dist/auth/file-credentials.d.ts +25 -0
- package/dist/auth/file-credentials.d.ts.map +1 -0
- package/dist/auth/file-credentials.js +94 -0
- package/dist/auth/file-credentials.js.map +1 -0
- package/dist/auth/runtime-credentials.d.ts +10 -0
- package/dist/auth/runtime-credentials.d.ts.map +1 -0
- package/dist/auth/runtime-credentials.js +15 -0
- package/dist/auth/runtime-credentials.js.map +1 -0
- package/dist/cli-options.d.ts +16 -9
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +72 -26
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +14 -42
- package/dist/cli.js.map +1 -1
- package/dist/context/compaction.d.ts +39 -0
- package/dist/context/compaction.d.ts.map +1 -0
- package/dist/context/compaction.js +141 -0
- package/dist/context/compaction.js.map +1 -0
- package/dist/context/context-manager.d.ts +72 -0
- package/dist/context/context-manager.d.ts.map +1 -0
- package/dist/context/context-manager.js +129 -0
- package/dist/context/context-manager.js.map +1 -0
- package/dist/context/token-estimator.d.ts +22 -0
- package/dist/context/token-estimator.d.ts.map +1 -0
- package/dist/context/token-estimator.js +43 -0
- package/dist/context/token-estimator.js.map +1 -0
- package/dist/providers/client.d.ts +7 -0
- package/dist/providers/client.d.ts.map +1 -0
- package/dist/providers/client.js +48 -0
- package/dist/providers/client.js.map +1 -0
- package/dist/providers/definitions.d.ts +25 -0
- package/dist/providers/definitions.d.ts.map +1 -0
- package/dist/providers/definitions.js +97 -0
- package/dist/providers/definitions.js.map +1 -0
- package/dist/providers/registry.d.ts +15 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +34 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/workspace/read.d.ts +2 -0
- package/dist/workspace/read.d.ts.map +1 -1
- package/dist/workspace/read.js +5 -1
- package/dist/workspace/read.js.map +1 -1
- package/dist/workspace/text.d.ts +15 -0
- package/dist/workspace/text.d.ts.map +1 -1
- package/dist/workspace/text.js +21 -2
- package/dist/workspace/text.js.map +1 -1
- package/dist/workspace/write.d.ts.map +1 -1
- package/dist/workspace/write.js +38 -11
- package/dist/workspace/write.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export class AuthFileError extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.name = "AuthFileError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function defaultAuthFile(environment = process.env) {
|
|
11
|
+
const configured = environment.CHIVGENT_HOME;
|
|
12
|
+
const home = configured !== undefined && configured.length > 0
|
|
13
|
+
? configured
|
|
14
|
+
: path.join(os.homedir(), ".chivgent");
|
|
15
|
+
return path.join(home, "auth.json");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Reads API keys from `<chivgent home>/auth.json`.
|
|
19
|
+
*
|
|
20
|
+
* The file deliberately supports only literal keys. Neither `$VAR` expansion
|
|
21
|
+
* nor `!command` substitution is accepted: letting a config file spawn a
|
|
22
|
+
* process is a large attack surface for a small convenience.
|
|
23
|
+
*/
|
|
24
|
+
export class FileCredentialSource {
|
|
25
|
+
filePath;
|
|
26
|
+
onWarning;
|
|
27
|
+
name = "auth file";
|
|
28
|
+
constructor(filePath = defaultAuthFile(), onWarning = () => undefined) {
|
|
29
|
+
this.filePath = filePath;
|
|
30
|
+
this.onWarning = onWarning;
|
|
31
|
+
}
|
|
32
|
+
async read(provider) {
|
|
33
|
+
let contents;
|
|
34
|
+
try {
|
|
35
|
+
await this.warnOnLoosePermissions();
|
|
36
|
+
contents = await readFile(this.filePath, "utf8");
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code === "ENOENT") {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
throw new AuthFileError(`Could not read the auth file at ${this.filePath}.`, { cause: error });
|
|
43
|
+
}
|
|
44
|
+
const entry = this.parse(contents)[provider.id];
|
|
45
|
+
if (entry === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return { apiKey: entry, origin: this.filePath };
|
|
49
|
+
}
|
|
50
|
+
parse(contents) {
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(contents);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new AuthFileError(`The auth file at ${this.filePath} is not valid JSON.`, { cause: error });
|
|
57
|
+
}
|
|
58
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
59
|
+
throw new AuthFileError(`The auth file at ${this.filePath} must contain a JSON object keyed by Provider id.`);
|
|
60
|
+
}
|
|
61
|
+
const keys = {};
|
|
62
|
+
for (const [providerId, value] of Object.entries(parsed)) {
|
|
63
|
+
const apiKey = readApiKey(value);
|
|
64
|
+
if (apiKey === undefined) {
|
|
65
|
+
throw new AuthFileError(`The auth file entry for "${providerId}" must be a string or {"type":"api_key","key":"..."}.`);
|
|
66
|
+
}
|
|
67
|
+
keys[providerId] = apiKey;
|
|
68
|
+
}
|
|
69
|
+
return keys;
|
|
70
|
+
}
|
|
71
|
+
async warnOnLoosePermissions() {
|
|
72
|
+
if (process.platform === "win32") {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const stats = await stat(this.filePath);
|
|
76
|
+
if ((stats.mode & 0o077) !== 0) {
|
|
77
|
+
this.onWarning(`The auth file at ${this.filePath} is readable by other users; run chmod 600 on it.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function readApiKey(value) {
|
|
82
|
+
if (typeof value === "string") {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const record = value;
|
|
89
|
+
if (record.type !== undefined && record.type !== "api_key") {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
return typeof record.key === "string" ? record.key : undefined;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-credentials.js","sourceRoot":"","sources":["../../src/auth/file-credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProviderDefinition } from "../providers/definitions.js";
|
|
2
|
+
import type { Credential, CredentialSource } from "./credentials.js";
|
|
3
|
+
/** A key supplied for this run only, typically through `--api-key`. */
|
|
4
|
+
export declare class RuntimeCredentialSource implements CredentialSource {
|
|
5
|
+
private readonly apiKey?;
|
|
6
|
+
readonly name = "runtime";
|
|
7
|
+
constructor(apiKey?: string | undefined);
|
|
8
|
+
read(_provider: ProviderDefinition): Promise<Credential | undefined>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=runtime-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-credentials.d.ts","sourceRoot":"","sources":["../../src/auth/runtime-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErE,uEAAuE;AACvE,qBAAa,uBAAwB,YAAW,gBAAgB;IAGlD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAFpC,QAAQ,CAAC,IAAI,aAAa;IAE1B,YAA6B,MAAM,CAAC,EAAE,MAAM,YAAA,EAAI;IAE1C,IAAI,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAKzE;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** A key supplied for this run only, typically through `--api-key`. */
|
|
2
|
+
export class RuntimeCredentialSource {
|
|
3
|
+
apiKey;
|
|
4
|
+
name = "runtime";
|
|
5
|
+
constructor(apiKey) {
|
|
6
|
+
this.apiKey = apiKey;
|
|
7
|
+
}
|
|
8
|
+
async read(_provider) {
|
|
9
|
+
if (this.apiKey === undefined || this.apiKey.length === 0) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return { apiKey: this.apiKey, origin: "--api-key" };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=runtime-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-credentials.js","sourceRoot":"","sources":["../../src/auth/runtime-credentials.ts"],"names":[],"mappings":"AAGA,uEAAuE;AACvE,MAAM,OAAO,uBAAuB;IAGL,MAAM;IAF1B,IAAI,GAAG,SAAS,CAAC;IAE1B,YAA6B,MAAe;sBAAf,MAAM;IAAY,CAAC;IAEhD,KAAK,CAAC,IAAI,CAAC,SAA6B;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC;CACF"}
|
package/dist/cli-options.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare const VERSION: string;
|
|
2
|
-
|
|
2
|
+
import { ProviderRegistry } from "./providers/registry.js";
|
|
3
|
+
/** A Provider id known to the registry. */
|
|
4
|
+
export type Provider = string;
|
|
3
5
|
export declare const DEFAULT_MAX_TURNS = 8;
|
|
4
6
|
/**
|
|
5
7
|
* Editing costs turns that reading does not: the model reads, edits, then
|
|
@@ -7,12 +9,11 @@ export declare const DEFAULT_MAX_TURNS = 8;
|
|
|
7
9
|
* raises the default unless --max-turns says otherwise.
|
|
8
10
|
*/
|
|
9
11
|
export declare const DEFAULT_WRITE_MAX_TURNS = 16;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
12
|
+
/**
|
|
13
|
+
* Provider-specific variables are declared by each Provider definition rather
|
|
14
|
+
* than listed here, so adding a Provider does not touch this module.
|
|
15
|
+
*/
|
|
16
|
+
export type CliEnvironment = NodeJS.ProcessEnv;
|
|
16
17
|
export interface CliOptions {
|
|
17
18
|
readonly prompt?: string;
|
|
18
19
|
readonly provider: Provider;
|
|
@@ -33,9 +34,15 @@ export interface CliOptions {
|
|
|
33
34
|
readonly listSessions: boolean;
|
|
34
35
|
/** Allow the agent to create and modify files in the workspace. */
|
|
35
36
|
readonly allowWrites: boolean;
|
|
37
|
+
/** API key supplied for this run only, overriding every other source. */
|
|
38
|
+
readonly apiKey?: string;
|
|
39
|
+
/** Token budget the context is kept inside. */
|
|
40
|
+
readonly contextWindow: number;
|
|
41
|
+
/** Summarise old history when the context approaches the window. */
|
|
42
|
+
readonly compaction: boolean;
|
|
36
43
|
readonly help: boolean;
|
|
37
44
|
readonly version: boolean;
|
|
38
45
|
}
|
|
39
|
-
export declare function parseCliArgs(argv: readonly string[], environment: CliEnvironment): CliOptions;
|
|
40
|
-
export declare function helpText(): string;
|
|
46
|
+
export declare function parseCliArgs(argv: readonly string[], environment: CliEnvironment, registry?: ProviderRegistry): CliOptions;
|
|
47
|
+
export declare function helpText(registry?: ProviderRegistry): string;
|
|
41
48
|
//# sourceMappingURL=cli-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAC6D,CAAC;AAElF,
|
|
1
|
+
{"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAC6D,CAAC;AAElF,OAAO,EAEL,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAGjC,2CAA2C;AAC3C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAI1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,EAAE,cAAc,EAC3B,QAAQ,GAAE,gBAA0C,GACnD,UAAU,CAqGZ;AAED,wBAAgB,QAAQ,CACtB,QAAQ,GAAE,gBAA0C,GACnD,MAAM,CAkCR"}
|
package/dist/cli-options.js
CHANGED
|
@@ -2,6 +2,8 @@ import { createRequire } from "node:module";
|
|
|
2
2
|
const require = createRequire(import.meta.url);
|
|
3
3
|
const packageMetadata = require("../package.json");
|
|
4
4
|
export const VERSION = typeof packageMetadata.version === "string" ? packageMetadata.version : "0.0.0";
|
|
5
|
+
import { defaultProviderRegistry, ProviderRegistry, } from "./providers/registry.js";
|
|
6
|
+
import { DEFAULT_CONTEXT_WINDOW } from "./context/context-manager.js";
|
|
5
7
|
export const DEFAULT_MAX_TURNS = 8;
|
|
6
8
|
/**
|
|
7
9
|
* Editing costs turns that reading does not: the model reads, edits, then
|
|
@@ -9,14 +11,14 @@ export const DEFAULT_MAX_TURNS = 8;
|
|
|
9
11
|
* raises the default unless --max-turns says otherwise.
|
|
10
12
|
*/
|
|
11
13
|
export const DEFAULT_WRITE_MAX_TURNS = 16;
|
|
14
|
+
const MIN_CONTEXT_WINDOW = 1_000;
|
|
12
15
|
const MAX_MAX_TURNS = 100;
|
|
13
|
-
|
|
14
|
-
openai: "gpt-5.6",
|
|
15
|
-
deepseek: "deepseek-v4-flash",
|
|
16
|
-
};
|
|
17
|
-
export function parseCliArgs(argv, environment) {
|
|
16
|
+
export function parseCliArgs(argv, environment, registry = defaultProviderRegistry) {
|
|
18
17
|
let provider = "openai";
|
|
19
18
|
let requestedModel;
|
|
19
|
+
let apiKey;
|
|
20
|
+
let contextWindow = DEFAULT_CONTEXT_WINDOW;
|
|
21
|
+
let compaction = true;
|
|
20
22
|
let maxTurns = DEFAULT_MAX_TURNS;
|
|
21
23
|
let stream = true;
|
|
22
24
|
let quiet = false;
|
|
@@ -40,13 +42,17 @@ export function parseCliArgs(argv, environment) {
|
|
|
40
42
|
}
|
|
41
43
|
else if (argument === "--provider") {
|
|
42
44
|
const value = readOptionValue(argv, index, "--provider");
|
|
43
|
-
provider = parseProvider(value);
|
|
45
|
+
provider = parseProvider(value, registry);
|
|
44
46
|
index += 1;
|
|
45
47
|
}
|
|
46
48
|
else if (argument === "--model") {
|
|
47
49
|
requestedModel = readOptionValue(argv, index, "--model");
|
|
48
50
|
index += 1;
|
|
49
51
|
}
|
|
52
|
+
else if (argument === "--api-key") {
|
|
53
|
+
apiKey = readOptionValue(argv, index, "--api-key");
|
|
54
|
+
index += 1;
|
|
55
|
+
}
|
|
50
56
|
else if (argument === "--max-turns") {
|
|
51
57
|
maxTurns = parseMaxTurns(readOptionValue(argv, index, "--max-turns"));
|
|
52
58
|
maxTurnsExplicit = true;
|
|
@@ -77,6 +83,13 @@ export function parseCliArgs(argv, environment) {
|
|
|
77
83
|
else if (argument === "--allow-writes") {
|
|
78
84
|
allowWrites = true;
|
|
79
85
|
}
|
|
86
|
+
else if (argument === "--context-window") {
|
|
87
|
+
contextWindow = parseContextWindow(readOptionValue(argv, index, "--context-window"));
|
|
88
|
+
index += 1;
|
|
89
|
+
}
|
|
90
|
+
else if (argument === "--no-compaction") {
|
|
91
|
+
compaction = false;
|
|
92
|
+
}
|
|
80
93
|
else if (argument?.startsWith("-")) {
|
|
81
94
|
throw new TypeError(`Unknown option: ${argument}`);
|
|
82
95
|
}
|
|
@@ -84,18 +97,17 @@ export function parseCliArgs(argv, environment) {
|
|
|
84
97
|
promptParts.push(argument);
|
|
85
98
|
}
|
|
86
99
|
}
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const
|
|
100
|
+
const definition = registry.get(provider);
|
|
101
|
+
const model = requestedModel ||
|
|
102
|
+
firstEnvironmentValue(environment, definition.modelEnvKeys) ||
|
|
103
|
+
definition.defaultModel;
|
|
104
|
+
const baseURL = firstEnvironmentValue(environment, definition.baseUrlEnvKeys) ||
|
|
105
|
+
definition.defaultBaseURL;
|
|
92
106
|
return {
|
|
93
107
|
...(promptParts.length === 0 ? {} : { prompt: promptParts.join(" ") }),
|
|
94
108
|
provider,
|
|
95
109
|
...(model === undefined ? {} : { model }),
|
|
96
|
-
...(
|
|
97
|
-
? { baseURL: environment.OPENAI_BASE_URL }
|
|
98
|
-
: {}),
|
|
110
|
+
...(baseURL === undefined ? {} : { baseURL }),
|
|
99
111
|
maxTurns: allowWrites && !maxTurnsExplicit ? DEFAULT_WRITE_MAX_TURNS : maxTurns,
|
|
100
112
|
stream,
|
|
101
113
|
quiet,
|
|
@@ -105,11 +117,14 @@ export function parseCliArgs(argv, environment) {
|
|
|
105
117
|
continueSession,
|
|
106
118
|
listSessions,
|
|
107
119
|
allowWrites,
|
|
120
|
+
...(apiKey === undefined ? {} : { apiKey }),
|
|
121
|
+
contextWindow,
|
|
122
|
+
compaction,
|
|
108
123
|
help,
|
|
109
124
|
version,
|
|
110
125
|
};
|
|
111
126
|
}
|
|
112
|
-
export function helpText() {
|
|
127
|
+
export function helpText(registry = defaultProviderRegistry) {
|
|
113
128
|
return `chivgent ${VERSION}
|
|
114
129
|
|
|
115
130
|
Usage:
|
|
@@ -117,8 +132,9 @@ Usage:
|
|
|
117
132
|
chivgent [options] Start an interactive session
|
|
118
133
|
|
|
119
134
|
Options:
|
|
120
|
-
--provider NAME
|
|
135
|
+
--provider NAME ${registry.ids().join(", ")} (default: openai)
|
|
121
136
|
--model MODEL Provider model override
|
|
137
|
+
--api-key KEY API key for this run; prefer an environment variable
|
|
122
138
|
--max-turns N Tool-calling turn limit (default: ${DEFAULT_MAX_TURNS}, ${DEFAULT_WRITE_MAX_TURNS} with --allow-writes)
|
|
123
139
|
--no-stream Wait for the full answer instead of streaming tokens
|
|
124
140
|
-q, --quiet Hide tool activity on stderr
|
|
@@ -127,19 +143,35 @@ Options:
|
|
|
127
143
|
--resume ID Resume a specific session
|
|
128
144
|
--sessions List recorded sessions and exit
|
|
129
145
|
--allow-writes Let the agent create and change files (default: read-only)
|
|
146
|
+
--context-window N Token budget for the context (default: ${DEFAULT_CONTEXT_WINDOW})
|
|
147
|
+
--no-compaction Send the whole transcript instead of summarising old turns
|
|
130
148
|
--no-session Do not record this run
|
|
131
149
|
-h, --help Show help
|
|
132
150
|
-v, --version Show version
|
|
133
151
|
|
|
152
|
+
API keys are resolved in this order, first match wins:
|
|
153
|
+
--api-key -> environment variable -> <CHIVGENT_HOME>/auth.json
|
|
154
|
+
|
|
155
|
+
Providers:
|
|
156
|
+
${describeProviders(registry)}
|
|
134
157
|
Environment:
|
|
135
|
-
OPENAI_API_KEY Required for openai and openai-compatible
|
|
136
|
-
OPENAI_MODEL OpenAI model (default: ${DEFAULT_MODELS.openai}); required for compatible
|
|
137
158
|
OPENAI_BASE_URL Required when --provider openai-compatible
|
|
138
|
-
|
|
139
|
-
DEEPSEEK_MODEL Optional DeepSeek model (default: ${DEFAULT_MODELS.deepseek})
|
|
140
|
-
CHIVGENT_HOME Session directory (default: ~/.chivgent)
|
|
159
|
+
CHIVGENT_HOME Session and auth directory (default: ~/.chivgent)
|
|
141
160
|
`;
|
|
142
161
|
}
|
|
162
|
+
function describeProviders(registry) {
|
|
163
|
+
const ids = registry.ids();
|
|
164
|
+
const width = Math.max(...ids.map((id) => id.length)) + 2;
|
|
165
|
+
return ids
|
|
166
|
+
.map((id) => {
|
|
167
|
+
const definition = registry.get(id);
|
|
168
|
+
const model = definition.defaultModel === undefined
|
|
169
|
+
? "model required"
|
|
170
|
+
: `default ${definition.defaultModel}`;
|
|
171
|
+
return ` ${id.padEnd(width)}${definition.envKeys.join(", ")} (${model})`;
|
|
172
|
+
})
|
|
173
|
+
.join("\n");
|
|
174
|
+
}
|
|
143
175
|
function readOptionValue(argv, index, option) {
|
|
144
176
|
const value = argv[index + 1];
|
|
145
177
|
if (value === undefined || value.startsWith("-")) {
|
|
@@ -147,6 +179,13 @@ function readOptionValue(argv, index, option) {
|
|
|
147
179
|
}
|
|
148
180
|
return value;
|
|
149
181
|
}
|
|
182
|
+
function parseContextWindow(value) {
|
|
183
|
+
const parsed = Number(value);
|
|
184
|
+
if (!Number.isSafeInteger(parsed) || parsed < MIN_CONTEXT_WINDOW) {
|
|
185
|
+
throw new TypeError(`--context-window must be an integer of at least ${MIN_CONTEXT_WINDOW}.`);
|
|
186
|
+
}
|
|
187
|
+
return parsed;
|
|
188
|
+
}
|
|
150
189
|
function parseMaxTurns(value) {
|
|
151
190
|
const parsed = Number(value);
|
|
152
191
|
if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > MAX_MAX_TURNS) {
|
|
@@ -154,12 +193,19 @@ function parseMaxTurns(value) {
|
|
|
154
193
|
}
|
|
155
194
|
return parsed;
|
|
156
195
|
}
|
|
157
|
-
function parseProvider(value) {
|
|
158
|
-
if (value
|
|
159
|
-
value
|
|
160
|
-
value !== "openai-compatible") {
|
|
161
|
-
throw new TypeError(`Unsupported provider: ${value}. Expected openai, deepseek, or openai-compatible.`);
|
|
196
|
+
function parseProvider(value, registry) {
|
|
197
|
+
if (!registry.has(value)) {
|
|
198
|
+
throw new TypeError(`Unsupported provider: ${value}. Expected one of ${registry.ids().join(", ")}.`);
|
|
162
199
|
}
|
|
163
200
|
return value;
|
|
164
201
|
}
|
|
202
|
+
function firstEnvironmentValue(environment, keys) {
|
|
203
|
+
for (const key of keys) {
|
|
204
|
+
const value = environment[key];
|
|
205
|
+
if (value !== undefined && value.length > 0) {
|
|
206
|
+
return value;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
165
211
|
//# sourceMappingURL=cli-options.js.map
|
package/dist/cli-options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAmC,CAAC;AAErF,MAAM,CAAC,MAAM,OAAO,GAClB,OAAO,eAAe,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
import { helpText, parseCliArgs, VERSION, } from "./cli-options.js";
|
|
4
|
-
import { DeepSeekChatClient } from "./providers/deepseek.js";
|
|
5
|
-
import { OpenAICompatibleChatClient } from "./providers/openai-compatible-chat.js";
|
|
6
|
-
import { OpenAIClient } from "./providers/openai.js";
|
|
7
4
|
import { createEventRenderer, createJsonEventWriter } from "./render.js";
|
|
8
5
|
import { runRepl } from "./repl.js";
|
|
9
|
-
import { RetryingLLMClient } from "./retry.js";
|
|
10
6
|
import { AgentSession } from "./session.js";
|
|
11
7
|
import { defaultSessionHome, FileSessionStore, } from "./session-store.js";
|
|
12
8
|
import { ListFilesTool } from "./tools/list-files.js";
|
|
@@ -15,6 +11,9 @@ import { SearchTextTool } from "./tools/search-text.js";
|
|
|
15
11
|
import { WriteFileTool } from "./tools/write-file.js";
|
|
16
12
|
import { EditFileTool } from "./tools/edit-file.js";
|
|
17
13
|
import { LocalWorkspace } from "./workspace.js";
|
|
14
|
+
import { createConfiguredClient } from "./providers/client.js";
|
|
15
|
+
import { ContextManager } from "./context/context-manager.js";
|
|
16
|
+
import { Compactor } from "./context/compaction.js";
|
|
18
17
|
const SYSTEM_PROMPT = `You are a coding assistant working inside a local project.
|
|
19
18
|
When the project structure or file path is unknown, use list_files first.
|
|
20
19
|
Use search_text to locate relevant definitions or references, then use read_file to verify the surrounding code.
|
|
@@ -69,7 +68,7 @@ async function main(argv) {
|
|
|
69
68
|
process.stderr.write("Missing prompt. Run chivgent --help for usage.\n");
|
|
70
69
|
return 1;
|
|
71
70
|
}
|
|
72
|
-
const llm = createConfiguredClient(options);
|
|
71
|
+
const llm = await createConfiguredClient(options);
|
|
73
72
|
if (typeof llm === "string") {
|
|
74
73
|
process.stderr.write(`${llm}\n`);
|
|
75
74
|
return 1;
|
|
@@ -84,6 +83,15 @@ async function main(argv) {
|
|
|
84
83
|
new SearchTextTool(),
|
|
85
84
|
new ReadFileTool(),
|
|
86
85
|
];
|
|
86
|
+
const contextManager = new ContextManager({
|
|
87
|
+
contextWindow: options.contextWindow,
|
|
88
|
+
...(options.compaction ? { compactor: new Compactor(llm) } : {}),
|
|
89
|
+
onCompaction: ({ droppedMessages, tokensBefore, tokensAfter }) => {
|
|
90
|
+
if (!options.quiet) {
|
|
91
|
+
process.stderr.write(`Compacted ${droppedMessages} earlier messages (~${tokensBefore} -> ~${tokensAfter} tokens).\n`);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
});
|
|
87
95
|
const agentOptions = {
|
|
88
96
|
systemPrompt: options.allowWrites
|
|
89
97
|
? `${SYSTEM_PROMPT}\n${WRITE_SYSTEM_PROMPT}`
|
|
@@ -95,6 +103,7 @@ async function main(argv) {
|
|
|
95
103
|
: readOnlyTools,
|
|
96
104
|
workspace: new LocalWorkspace(cwd, { allowWrites: options.allowWrites }),
|
|
97
105
|
streaming: options.stream,
|
|
106
|
+
contextManager,
|
|
98
107
|
};
|
|
99
108
|
const session = new AgentSession({
|
|
100
109
|
agent: agentOptions,
|
|
@@ -201,43 +210,6 @@ async function readPipedPrompt() {
|
|
|
201
210
|
}
|
|
202
211
|
return contents.trim().length === 0 ? undefined : contents.trim();
|
|
203
212
|
}
|
|
204
|
-
/** Returns the configured client, or the message explaining what is missing. */
|
|
205
|
-
function createConfiguredClient(options) {
|
|
206
|
-
if (options.model === undefined) {
|
|
207
|
-
return "OPENAI_MODEL or --model is required for openai-compatible.";
|
|
208
|
-
}
|
|
209
|
-
if (options.provider === "openai-compatible" && options.baseURL === undefined) {
|
|
210
|
-
return "OPENAI_BASE_URL is required for openai-compatible.";
|
|
211
|
-
}
|
|
212
|
-
const apiKeyName = options.provider === "deepseek" ? "DEEPSEEK_API_KEY" : "OPENAI_API_KEY";
|
|
213
|
-
const apiKey = process.env[apiKeyName];
|
|
214
|
-
if (apiKey === undefined || apiKey.length === 0) {
|
|
215
|
-
return `${apiKeyName} is not set.`;
|
|
216
|
-
}
|
|
217
|
-
return new RetryingLLMClient(createClient(options.provider, apiKey, options.model, options.baseURL), {
|
|
218
|
-
onRetry: ({ attempt, delayMs, reason }) => {
|
|
219
|
-
process.stderr.write(`Provider call failed (${reason}); retry ${attempt} in ${delayMs}ms.\n`);
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
function createClient(provider, apiKey, model, baseURL) {
|
|
224
|
-
switch (provider) {
|
|
225
|
-
case "openai":
|
|
226
|
-
return new OpenAIClient({ apiKey, model });
|
|
227
|
-
case "deepseek":
|
|
228
|
-
return new DeepSeekChatClient({ apiKey, model });
|
|
229
|
-
case "openai-compatible":
|
|
230
|
-
if (baseURL === undefined) {
|
|
231
|
-
throw new TypeError("OpenAI-compatible Provider requires a base URL.");
|
|
232
|
-
}
|
|
233
|
-
return new OpenAICompatibleChatClient({
|
|
234
|
-
apiKey,
|
|
235
|
-
baseURL,
|
|
236
|
-
model,
|
|
237
|
-
continuationTag: "openai-compatible-chat",
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
213
|
main(process.argv.slice(2))
|
|
242
214
|
.then((exitCode) => {
|
|
243
215
|
process.exitCode = exitCode;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,OAAO,GAGR,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { LLMClient } from "../llm.js";
|
|
2
|
+
import type { Message } from "../messages.js";
|
|
3
|
+
export interface CompactionState {
|
|
4
|
+
readonly summary: string;
|
|
5
|
+
/** Files the agent read, derived from tool calls rather than from prose. */
|
|
6
|
+
readonly readFiles: readonly string[];
|
|
7
|
+
/** Files the agent changed, derived from tool calls rather than from prose. */
|
|
8
|
+
readonly modifiedFiles: readonly string[];
|
|
9
|
+
readonly decisions: readonly string[];
|
|
10
|
+
readonly pendingTasks: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Which tool names touch which files.
|
|
14
|
+
*
|
|
15
|
+
* File lists are derived from the tool calls themselves instead of being
|
|
16
|
+
* summarised by the model. A summary can forget or invent a path; the calls
|
|
17
|
+
* cannot. For a coding agent this is the part of the history that most needs
|
|
18
|
+
* to survive compaction intact.
|
|
19
|
+
*/
|
|
20
|
+
export interface FileEffectMap {
|
|
21
|
+
readonly reads: readonly string[];
|
|
22
|
+
readonly mutates: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare const DEFAULT_FILE_EFFECTS: FileEffectMap;
|
|
25
|
+
export interface CompactorOptions {
|
|
26
|
+
readonly fileEffects?: FileEffectMap;
|
|
27
|
+
}
|
|
28
|
+
export declare class Compactor {
|
|
29
|
+
private readonly llm;
|
|
30
|
+
private readonly fileEffects;
|
|
31
|
+
constructor(llm: LLMClient, options?: CompactorOptions);
|
|
32
|
+
compact(messages: readonly Message[], signal?: AbortSignal): Promise<CompactionState>;
|
|
33
|
+
private summarise;
|
|
34
|
+
}
|
|
35
|
+
/** Falls back to the raw text when the model does not return usable JSON. */
|
|
36
|
+
export declare function parseSummary(content: string): Pick<CompactionState, "summary" | "decisions" | "pendingTasks">;
|
|
37
|
+
/** Renders compaction state as the single message that replaces the history. */
|
|
38
|
+
export declare function renderCompactionState(state: CompactionState): string;
|
|
39
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,eAAO,MAAM,oBAAoB,EAAE,aAGlC,CAAC;AAUF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;CACtC;AAED,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAE5C,YACmB,GAAG,EAAE,SAAS,EAC/B,OAAO,GAAE,gBAAqB,EAG/B;IAEK,OAAO,CACX,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC,CAI1B;YAEa,SAAS;CAYxB;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,GACd,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC,CAiCjE;AAsED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAiBpE"}
|