chivgent 1.0.1 → 1.1.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/README.md +115 -131
- package/README.zh-CN.md +103 -817
- package/dist/agent.d.ts +16 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +95 -43
- package/dist/agent.js.map +1 -1
- package/dist/auth/oauth.d.ts +51 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +444 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/cli-options.d.ts +11 -6
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +46 -4
- package/dist/cli-options.js.map +1 -1
- package/dist/cli-runtime.d.ts +9 -0
- package/dist/cli-runtime.d.ts.map +1 -1
- package/dist/cli-runtime.js +32 -6
- package/dist/cli-runtime.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +129 -34
- package/dist/cli.js.map +1 -1
- package/dist/context/context-manager.d.ts +21 -0
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +199 -35
- package/dist/context/context-manager.js.map +1 -1
- package/dist/evals/tools.d.ts.map +1 -1
- package/dist/evals/tools.js +4 -2
- package/dist/evals/tools.js.map +1 -1
- package/dist/events.d.ts +5 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/permissions.d.ts +45 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +97 -0
- package/dist/permissions.js.map +1 -0
- package/dist/prompts.d.ts +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +1 -0
- package/dist/prompts.js.map +1 -1
- package/dist/providers/client.d.ts +1 -1
- package/dist/providers/client.d.ts.map +1 -1
- package/dist/providers/client.js +19 -1
- package/dist/providers/client.js.map +1 -1
- package/dist/providers/definitions.d.ts +2 -0
- package/dist/providers/definitions.d.ts.map +1 -1
- package/dist/providers/definitions.js +3 -1
- package/dist/providers/definitions.js.map +1 -1
- package/dist/providers/interactive.d.ts +4 -0
- package/dist/providers/interactive.d.ts.map +1 -1
- package/dist/providers/interactive.js +86 -2
- package/dist/providers/interactive.js.map +1 -1
- package/dist/providers/oauth-client.d.ts +14 -0
- package/dist/providers/oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth-client.js +52 -0
- package/dist/providers/oauth-client.js.map +1 -0
- package/dist/providers/openai-compatible-chat.d.ts +1 -0
- package/dist/providers/openai-compatible-chat.d.ts.map +1 -1
- package/dist/providers/openai-compatible-chat.js +1 -0
- package/dist/providers/openai-compatible-chat.js.map +1 -1
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +72 -10
- package/dist/providers/openai.js.map +1 -1
- package/dist/remote/repl.d.ts.map +1 -1
- package/dist/remote/repl.js +9 -0
- package/dist/remote/repl.js.map +1 -1
- package/dist/repl.d.ts +43 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +303 -21
- package/dist/repl.js.map +1 -1
- package/dist/runtime/desktop-runtime.d.ts +23 -0
- package/dist/runtime/desktop-runtime.d.ts.map +1 -0
- package/dist/runtime/desktop-runtime.js +63 -0
- package/dist/runtime/desktop-runtime.js.map +1 -0
- package/dist/session-store.d.ts +22 -1
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +80 -1
- package/dist/session-store.js.map +1 -1
- package/dist/session.d.ts +21 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +110 -4
- package/dist/session.js.map +1 -1
- package/dist/shell/approval.d.ts +2 -2
- package/dist/shell/approval.d.ts.map +1 -1
- package/dist/shell/approval.js +2 -2
- package/dist/shell/approval.js.map +1 -1
- package/dist/shell/docker.d.ts +2 -0
- package/dist/shell/docker.d.ts.map +1 -1
- package/dist/shell/docker.js +17 -3
- package/dist/shell/docker.js.map +1 -1
- package/dist/shell/factory.d.ts +9 -0
- package/dist/shell/factory.d.ts.map +1 -0
- package/dist/shell/factory.js +13 -0
- package/dist/shell/factory.js.map +1 -0
- package/dist/shell/local.d.ts +4 -0
- package/dist/shell/local.d.ts.map +1 -1
- package/dist/shell/local.js +16 -1
- package/dist/shell/local.js.map +1 -1
- package/dist/shell/native.d.ts +15 -0
- package/dist/shell/native.d.ts.map +1 -0
- package/dist/shell/native.js +99 -0
- package/dist/shell/native.js.map +1 -0
- package/dist/shell/types.d.ts +1 -0
- package/dist/shell/types.d.ts.map +1 -1
- package/dist/tools/bash.d.ts +19 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +30 -11
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +1 -1
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/parallel.d.ts +2 -0
- package/dist/tools/parallel.d.ts.map +1 -1
- package/dist/tools/parallel.js +8 -0
- package/dist/tools/parallel.js.map +1 -1
- package/dist/tools/write-file.d.ts.map +1 -1
- package/dist/tools/write-file.js +1 -1
- package/dist/tools/write-file.js.map +1 -1
- package/dist/transcript-hash.d.ts +4 -0
- package/dist/transcript-hash.d.ts.map +1 -0
- package/dist/transcript-hash.js +6 -0
- package/dist/transcript-hash.js.map +1 -0
- package/dist/tui/activity.d.ts +1 -1
- package/dist/tui/activity.d.ts.map +1 -1
- package/dist/tui/activity.js +2 -2
- package/dist/tui/activity.js.map +1 -1
- package/dist/tui/editor-input.d.ts +8 -0
- package/dist/tui/editor-input.d.ts.map +1 -1
- package/dist/tui/editor-input.js +122 -18
- package/dist/tui/editor-input.js.map +1 -1
- package/dist/tui/editor.d.ts +11 -1
- package/dist/tui/editor.d.ts.map +1 -1
- package/dist/tui/editor.js +77 -29
- package/dist/tui/editor.js.map +1 -1
- package/dist/tui/live.d.ts +2 -0
- package/dist/tui/live.d.ts.map +1 -1
- package/dist/tui/live.js +5 -0
- package/dist/tui/live.js.map +1 -1
- package/dist/tui/selection.d.ts +24 -0
- package/dist/tui/selection.d.ts.map +1 -0
- package/dist/tui/selection.js +19 -0
- package/dist/tui/selection.js.map +1 -0
- package/dist/tui/slash.js +1 -1
- package/dist/tui/slash.js.map +1 -1
- package/dist/tui/welcome.d.ts +2 -2
- package/dist/tui/welcome.d.ts.map +1 -1
- package/dist/tui/welcome.js +14 -23
- package/dist/tui/welcome.js.map +1 -1
- package/dist/workspace/paths.d.ts.map +1 -1
- package/dist/workspace/paths.js +4 -0
- package/dist/workspace/paths.js.map +1 -1
- package/dist/workspace/types.d.ts +2 -2
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/dist/workspace.d.ts +2 -2
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +2 -2
- package/dist/workspace.js.map +1 -1
- package/package.json +6 -2
package/dist/cli-options.js
CHANGED
|
@@ -4,6 +4,7 @@ const packageMetadata = require("../package.json");
|
|
|
4
4
|
export const VERSION = typeof packageMetadata.version === "string" ? packageMetadata.version : "0.0.0";
|
|
5
5
|
import { defaultProviderRegistry, ProviderRegistry, } from "./providers/registry.js";
|
|
6
6
|
import { DEFAULT_CONTEXT_WINDOW } from "./context/context-manager.js";
|
|
7
|
+
import { parsePermissionMode } from "./permissions.js";
|
|
7
8
|
export const DEFAULT_MAX_TURNS = 8;
|
|
8
9
|
/**
|
|
9
10
|
* Editing costs turns that reading does not: the model reads, edits, then
|
|
@@ -30,7 +31,11 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
30
31
|
let allowWrites = false;
|
|
31
32
|
let allowShell = false;
|
|
32
33
|
let approveAllShell = false;
|
|
34
|
+
let shellBackend = "auto";
|
|
35
|
+
let shellNetwork = false;
|
|
36
|
+
let permissionMode;
|
|
33
37
|
let tui = false;
|
|
38
|
+
let simple = false;
|
|
34
39
|
let extensions = true;
|
|
35
40
|
let serve = false;
|
|
36
41
|
let connect;
|
|
@@ -79,6 +84,9 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
79
84
|
else if (argument === "--tui") {
|
|
80
85
|
tui = true;
|
|
81
86
|
}
|
|
87
|
+
else if (argument === "--simple") {
|
|
88
|
+
simple = true;
|
|
89
|
+
}
|
|
82
90
|
else if (argument === "--quiet" || argument === "-q") {
|
|
83
91
|
quiet = true;
|
|
84
92
|
}
|
|
@@ -107,6 +115,20 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
107
115
|
else if (argument === "--approve-all-shell") {
|
|
108
116
|
approveAllShell = true;
|
|
109
117
|
}
|
|
118
|
+
else if (argument === "--shell-backend") {
|
|
119
|
+
const value = readOptionValue(argv, index, "--shell-backend");
|
|
120
|
+
if (value !== "auto" && value !== "native" && value !== "docker")
|
|
121
|
+
throw new TypeError("--shell-backend must be auto, native, or docker.");
|
|
122
|
+
shellBackend = value;
|
|
123
|
+
index += 1;
|
|
124
|
+
}
|
|
125
|
+
else if (argument === "--shell-network") {
|
|
126
|
+
shellNetwork = true;
|
|
127
|
+
}
|
|
128
|
+
else if (argument === "--permission-mode") {
|
|
129
|
+
permissionMode = parsePermissionMode(readOptionValue(argv, index, "--permission-mode"));
|
|
130
|
+
index += 1;
|
|
131
|
+
}
|
|
110
132
|
else if (argument === "--serve") {
|
|
111
133
|
serve = true;
|
|
112
134
|
}
|
|
@@ -147,6 +169,18 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
147
169
|
if (approveAllShell && !allowShell) {
|
|
148
170
|
throw new TypeError("--approve-all-shell requires --allow-shell.");
|
|
149
171
|
}
|
|
172
|
+
if (tui && simple) {
|
|
173
|
+
throw new TypeError("--tui and --simple cannot be used together.");
|
|
174
|
+
}
|
|
175
|
+
if (permissionMode !== undefined && (allowWrites || allowShell || approveAllShell || shellNetwork)) {
|
|
176
|
+
throw new TypeError("--permission-mode cannot be combined with --allow-writes, --allow-shell, --approve-all-shell, or --shell-network; select the complete policy mode instead.");
|
|
177
|
+
}
|
|
178
|
+
if (permissionMode !== undefined && connect !== undefined) {
|
|
179
|
+
throw new TypeError("--permission-mode applies to local sessions and cannot be used with --connect.");
|
|
180
|
+
}
|
|
181
|
+
if (permissionMode !== undefined && serve) {
|
|
182
|
+
throw new TypeError("--permission-mode cannot be used with --serve because served sessions do not have an interactive approval channel.");
|
|
183
|
+
}
|
|
150
184
|
const definition = registry.get(provider);
|
|
151
185
|
const model = requestedModel ||
|
|
152
186
|
firstEnvironmentValue(environment, definition.modelEnvKeys) ||
|
|
@@ -158,7 +192,7 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
158
192
|
provider,
|
|
159
193
|
...(model === undefined ? {} : { model }),
|
|
160
194
|
...(baseURL === undefined ? {} : { baseURL }),
|
|
161
|
-
maxTurns: (allowWrites || allowShell) && !maxTurnsExplicit
|
|
195
|
+
maxTurns: (allowWrites || allowShell || permissionMode !== undefined) && !maxTurnsExplicit
|
|
162
196
|
? DEFAULT_WRITE_MAX_TURNS
|
|
163
197
|
: maxTurns,
|
|
164
198
|
stream,
|
|
@@ -171,7 +205,11 @@ export function parseCliArgs(argv, environment, registry = defaultProviderRegist
|
|
|
171
205
|
allowWrites,
|
|
172
206
|
allowShell,
|
|
173
207
|
approveAllShell,
|
|
208
|
+
shellBackend,
|
|
209
|
+
shellNetwork,
|
|
210
|
+
...(permissionMode === undefined ? {} : { permissionMode }),
|
|
174
211
|
tui,
|
|
212
|
+
simple,
|
|
175
213
|
extensions,
|
|
176
214
|
serve,
|
|
177
215
|
...(connect === undefined ? {} : { connect }),
|
|
@@ -199,16 +237,20 @@ Options:
|
|
|
199
237
|
--api-key KEY API key for this run; prefer an environment variable
|
|
200
238
|
--max-turns N Tool-calling turn limit (default: ${DEFAULT_MAX_TURNS}, ${DEFAULT_WRITE_MAX_TURNS} with --allow-writes or --allow-shell)
|
|
201
239
|
--no-stream Wait for the full answer instead of streaming tokens
|
|
202
|
-
--tui
|
|
240
|
+
--tui Explicitly request the rich interface (default in local TTY sessions)
|
|
241
|
+
--simple Use the simple append-only interface
|
|
203
242
|
-q, --quiet Hide tool activity on stderr
|
|
204
243
|
--json Write the run as JSON lines instead of rendered text
|
|
205
244
|
-c, --continue Resume the most recent session for this workspace
|
|
206
245
|
--resume ID Resume a specific session
|
|
207
246
|
--sessions List recorded sessions and exit
|
|
208
247
|
--allow-writes Let the agent create and change files (default: read-only)
|
|
209
|
-
--allow-shell Expose bash inside
|
|
248
|
+
--allow-shell Expose bash inside a native macOS sandbox or Docker (network denied).
|
|
210
249
|
Interactive commands require individual confirmation.
|
|
211
|
-
--
|
|
250
|
+
--shell-backend MODE auto, native, or docker (default: auto; macOS uses native).
|
|
251
|
+
--shell-network Allow shell network access (explicit opt-in for either backend).
|
|
252
|
+
--permission-mode MODE ask-first, workspace, or unrestricted (network enabled).
|
|
253
|
+
--approve-all-shell Explicitly approve all shell commands this session;
|
|
212
254
|
use only with --allow-shell when individual prompts are unavailable.
|
|
213
255
|
--serve Expose this session on a local socket and keep running
|
|
214
256
|
--connect TARGET Attach to a served session, by id or socket path
|
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;AAElF,OAAO,EACL,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../src/cli-options.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-runtime.d.ts
CHANGED
|
@@ -2,8 +2,11 @@ import type { CliOptions } from "./cli-options.js";
|
|
|
2
2
|
import type { ExtensionRegistry } from "./extensions/registry.js";
|
|
3
3
|
import type { LLMClient } from "./llm.js";
|
|
4
4
|
import type { Message } from "./messages.js";
|
|
5
|
+
import type { AppliedCompaction } from "./context/context-manager.js";
|
|
6
|
+
import type { UsageTotal } from "./providers/usage.js";
|
|
5
7
|
import { AgentSession } from "./session.js";
|
|
6
8
|
import { ShellApprovalGate } from "./shell/approval.js";
|
|
9
|
+
import { type PermissionPolicy } from "./permissions.js";
|
|
7
10
|
import type { SessionStore } from "./session-store.js";
|
|
8
11
|
interface LocalSessionConfig {
|
|
9
12
|
readonly options: CliOptions;
|
|
@@ -13,10 +16,16 @@ interface LocalSessionConfig {
|
|
|
13
16
|
readonly restored: {
|
|
14
17
|
readonly id?: string;
|
|
15
18
|
readonly messages?: readonly Message[];
|
|
19
|
+
readonly compaction?: AppliedCompaction;
|
|
20
|
+
readonly promptCount?: number;
|
|
21
|
+
readonly usage?: UsageTotal;
|
|
22
|
+
readonly title?: string;
|
|
23
|
+
readonly planMode?: boolean;
|
|
16
24
|
readonly resumed: boolean;
|
|
17
25
|
};
|
|
18
26
|
readonly store?: SessionStore;
|
|
19
27
|
readonly shellApproval?: ShellApprovalGate;
|
|
28
|
+
readonly permissionPolicy?: PermissionPolicy;
|
|
20
29
|
}
|
|
21
30
|
/** Assemble the local agent once; cli.ts handles only process and UI lifecycle. */
|
|
22
31
|
export declare function createLocalSession(config: LocalSessionConfig): AgentSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-runtime.d.ts","sourceRoot":"","sources":["../src/cli-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-runtime.d.ts","sourceRoot":"","sources":["../src/cli-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWvD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;QACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAwE3E"}
|
package/dist/cli-runtime.js
CHANGED
|
@@ -4,6 +4,8 @@ import { ScopedProjectInstructions } from "./context/project-instructions.js";
|
|
|
4
4
|
import { SHELL_SYSTEM_PROMPT, SYSTEM_PROMPT, WRITE_SYSTEM_PROMPT } from "./prompts.js";
|
|
5
5
|
import { AgentSession } from "./session.js";
|
|
6
6
|
import { ShellApprovalGate } from "./shell/approval.js";
|
|
7
|
+
import { PermissionWorkspace } from "./permissions.js";
|
|
8
|
+
import { createShellOperations } from "./shell/factory.js";
|
|
7
9
|
import { BashTool } from "./tools/bash.js";
|
|
8
10
|
import { ApplyPatchTool } from "./tools/apply-patch.js";
|
|
9
11
|
import { EditFileTool } from "./tools/edit-file.js";
|
|
@@ -17,10 +19,15 @@ import { LocalWorkspace } from "./workspace.js";
|
|
|
17
19
|
export function createLocalSession(config) {
|
|
18
20
|
const { options, cwd, llm, extensions, restored, store } = config;
|
|
19
21
|
const prompt = [SYSTEM_PROMPT];
|
|
20
|
-
|
|
22
|
+
const modernPolicy = config.permissionPolicy !== undefined;
|
|
23
|
+
const allowWrites = modernPolicy || options.allowWrites;
|
|
24
|
+
const allowShell = modernPolicy || options.allowShell;
|
|
25
|
+
if (allowWrites)
|
|
21
26
|
prompt.push(WRITE_SYSTEM_PROMPT);
|
|
22
|
-
if (
|
|
27
|
+
if (allowShell)
|
|
23
28
|
prompt.push(SHELL_SYSTEM_PROMPT);
|
|
29
|
+
if (modernPolicy)
|
|
30
|
+
prompt.push(`A process-local permission policy governs file changes, shell commands, and extension tools; its mode can change during the conversation and is not restored from a saved session. For files or network outside the workspace, request bash with scope "host" and explain why in justification; this asks for one-command broad host access. Never retry denied actions using another tool.`);
|
|
24
31
|
prompt.push(...(extensions?.systemPromptContributions ?? []));
|
|
25
32
|
const contextManager = new ContextManager({
|
|
26
33
|
contextWindow: options.contextWindow,
|
|
@@ -40,14 +47,28 @@ export function createLocalSession(config) {
|
|
|
40
47
|
new SearchTextTool(),
|
|
41
48
|
new ReadFileTool(),
|
|
42
49
|
new UpdatePlanTool(),
|
|
43
|
-
...(
|
|
44
|
-
...(
|
|
50
|
+
...(allowWrites ? [new WriteFileTool(), new EditFileTool(), new ApplyPatchTool()] : []),
|
|
51
|
+
...(allowShell ? [new BashTool({
|
|
45
52
|
cwd,
|
|
46
|
-
|
|
53
|
+
allowWrites,
|
|
54
|
+
allowNetwork: modernPolicy ? config.permissionPolicy.shellNetwork : options.shellNetwork,
|
|
55
|
+
backend: options.shellBackend,
|
|
56
|
+
...(modernPolicy ? {
|
|
57
|
+
operationsForCall: (scope = "workspace") => createShellOperations({ backend: options.shellBackend, allowWrites: true, allowNetwork: scope === "host" || config.permissionPolicy.shellNetwork, allowHostAccess: scope === "host" }),
|
|
58
|
+
defaultScopeForCall: () => config.permissionPolicy.mode === "unrestricted" ? "host" : "workspace",
|
|
59
|
+
} : {}),
|
|
60
|
+
approve: modernPolicy
|
|
61
|
+
? (command, signal, context) => config.permissionPolicy.authorizeShell(command, context?.startsWith("Expanded host access") ? "host" : "workspace", signal, context)
|
|
62
|
+
: (command, signal, context) => config.shellApproval?.approve(command, signal, context) ?? Promise.resolve(false),
|
|
47
63
|
})] : []),
|
|
48
64
|
...(extensions?.registeredTools ?? []).map((entry) => entry.tool),
|
|
49
65
|
],
|
|
50
|
-
workspace: new LocalWorkspace(cwd, { allowWrites: options.allowWrites }),
|
|
66
|
+
workspace: modernPolicy ? new PermissionWorkspace(cwd, config.permissionPolicy) : new LocalWorkspace(cwd, { allowWrites: options.allowWrites }),
|
|
67
|
+
...(modernPolicy && extensions !== undefined ? {
|
|
68
|
+
authorizeToolCall: (name, args, signal) => extensions.registeredTools.some((entry) => entry.tool.name === name)
|
|
69
|
+
? config.permissionPolicy.authorizeExtension(name, args, signal)
|
|
70
|
+
: Promise.resolve(true),
|
|
71
|
+
} : {}),
|
|
51
72
|
streaming: options.stream,
|
|
52
73
|
contextManager,
|
|
53
74
|
projectInstructions: new ScopedProjectInstructions(cwd, Math.min(16_384, options.contextWindow)),
|
|
@@ -58,6 +79,11 @@ export function createLocalSession(config) {
|
|
|
58
79
|
resumed: restored.resumed,
|
|
59
80
|
...(restored.id === undefined ? {} : { id: restored.id }),
|
|
60
81
|
...(restored.messages === undefined ? {} : { messages: restored.messages }),
|
|
82
|
+
...(options.compaction && restored.compaction !== undefined ? { compaction: restored.compaction } : {}),
|
|
83
|
+
...(restored.promptCount === undefined ? {} : { promptCount: restored.promptCount }),
|
|
84
|
+
...(restored.usage === undefined ? {} : { usage: restored.usage }),
|
|
85
|
+
...(restored.title === undefined ? {} : { title: restored.title }),
|
|
86
|
+
planMode: restored.planMode ?? false,
|
|
61
87
|
...(store === undefined ? {} : { store }),
|
|
62
88
|
});
|
|
63
89
|
}
|
package/dist/cli-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-runtime.js","sourceRoot":"","sources":["../src/cli-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-runtime.js","sourceRoot":"","sources":["../src/cli-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA8KA,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkQnE"}
|
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from "node:process";
|
|
3
|
+
import { realpathSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
3
6
|
import { helpText, parseCliArgs, VERSION, } from "./cli-options.js";
|
|
4
7
|
import { createEventRenderer, createJsonEventWriter } from "./render.js";
|
|
5
8
|
import { welcome } from "./tui/welcome.js";
|
|
9
|
+
import { fitLine, fitLineTail, terminalText, displayWidth } from "./tui/text.js";
|
|
6
10
|
import { createLiveRegion, terminalWidth } from "./tui/live.js";
|
|
11
|
+
import { terminalColorEnabled, useTui } from "./tui/selection.js";
|
|
7
12
|
import { runRepl } from "./repl.js";
|
|
8
13
|
import { AgentSession } from "./session.js";
|
|
9
14
|
import { createLocalSession } from "./cli-runtime.js";
|
|
@@ -11,6 +16,7 @@ import { defaultSessionHome, FileSessionStore, } from "./session-store.js";
|
|
|
11
16
|
import { killTrackedChildren } from "./shell/process.js";
|
|
12
17
|
import { killTrackedDockerContainers } from "./shell/docker.js";
|
|
13
18
|
import { ShellApprovalGate } from "./shell/approval.js";
|
|
19
|
+
import { initialPermissionMode, PermissionPolicy } from "./permissions.js";
|
|
14
20
|
import { decideTrust } from "./extensions/decide-trust.js";
|
|
15
21
|
import { discoverExtensions } from "./extensions/discover.js";
|
|
16
22
|
import { loadExtensions } from "./extensions/loader.js";
|
|
@@ -68,6 +74,9 @@ function tuiRefusal(options, interactive) {
|
|
|
68
74
|
if (process.stdin.isTTY !== true || process.stderr.isTTY !== true) {
|
|
69
75
|
return "--tui needs a terminal on both stdin and stderr.";
|
|
70
76
|
}
|
|
77
|
+
if (process.env.TERM === "dumb") {
|
|
78
|
+
return "--tui cannot run with TERM=dumb; remove --tui or unset TERM.";
|
|
79
|
+
}
|
|
71
80
|
return undefined;
|
|
72
81
|
}
|
|
73
82
|
/** Check project trust before importing any extension code. */
|
|
@@ -117,7 +126,7 @@ function ignoreBrokenPipe(stream) {
|
|
|
117
126
|
process.exit(0);
|
|
118
127
|
});
|
|
119
128
|
}
|
|
120
|
-
async function main(argv) {
|
|
129
|
+
export async function main(argv) {
|
|
121
130
|
ignoreBrokenPipe(process.stdout);
|
|
122
131
|
ignoreBrokenPipe(process.stderr);
|
|
123
132
|
if (argv[0] === "update") {
|
|
@@ -164,6 +173,18 @@ async function main(argv) {
|
|
|
164
173
|
process.stderr.write("Missing prompt. Run chivgent --help for usage.\n");
|
|
165
174
|
return 1;
|
|
166
175
|
}
|
|
176
|
+
const richTui = useTui({
|
|
177
|
+
explicit: options.tui,
|
|
178
|
+
simple: options.simple,
|
|
179
|
+
interactive,
|
|
180
|
+
stdinIsTTY: process.stdin.isTTY === true,
|
|
181
|
+
stdoutIsTTY: process.stdout.isTTY === true,
|
|
182
|
+
stderrIsTTY: process.stderr.isTTY === true,
|
|
183
|
+
json: options.json,
|
|
184
|
+
serve: options.serve,
|
|
185
|
+
connect: options.connect !== undefined,
|
|
186
|
+
term: process.env.TERM,
|
|
187
|
+
});
|
|
167
188
|
if (options.tui) {
|
|
168
189
|
// Refused rather than quietly ignored: a switch that silently does nothing
|
|
169
190
|
// makes a mistyped command look like it worked.
|
|
@@ -191,17 +212,29 @@ async function main(argv) {
|
|
|
191
212
|
process.stderr.write(`${restored}\n`);
|
|
192
213
|
return 1;
|
|
193
214
|
}
|
|
194
|
-
|
|
215
|
+
const initialMode = initialPermissionMode({
|
|
216
|
+
interactive,
|
|
217
|
+
tui: richTui,
|
|
218
|
+
permissionMode: options.permissionMode,
|
|
219
|
+
allowWrites: options.allowWrites,
|
|
220
|
+
allowShell: options.allowShell,
|
|
221
|
+
approveAllShell: options.approveAllShell,
|
|
222
|
+
shellNetwork: options.shellNetwork,
|
|
223
|
+
});
|
|
224
|
+
const permissionPolicy = initialMode === undefined ? undefined : new PermissionPolicy(initialMode);
|
|
225
|
+
if (options.allowShell || permissionPolicy !== undefined) {
|
|
195
226
|
installShellCleanup();
|
|
196
227
|
}
|
|
197
|
-
const shellApproval = options.allowShell
|
|
228
|
+
const shellApproval = options.allowShell || permissionPolicy !== undefined
|
|
198
229
|
? new ShellApprovalGate(options.approveAllShell)
|
|
199
230
|
: undefined;
|
|
231
|
+
permissionPolicy?.setApproval((action, signal, context) => shellApproval?.approve(action, signal, context) ?? Promise.resolve(false));
|
|
200
232
|
const session = createLocalSession({
|
|
201
233
|
options,
|
|
202
234
|
cwd,
|
|
203
235
|
llm,
|
|
204
236
|
...(shellApproval === undefined ? {} : { shellApproval }),
|
|
237
|
+
...(permissionPolicy === undefined ? {} : { permissionPolicy }),
|
|
205
238
|
...(registry === undefined ? {} : { extensions: registry }),
|
|
206
239
|
restored,
|
|
207
240
|
...(store === undefined ? {} : { store }),
|
|
@@ -209,18 +242,18 @@ async function main(argv) {
|
|
|
209
242
|
// In TUI mode the live region *is* the renderer: it owns both the region and
|
|
210
243
|
// the transcript it flushes to scrollback, so attaching the append-only
|
|
211
244
|
// renderer as well would print every answer twice.
|
|
212
|
-
const liveRegion =
|
|
245
|
+
const liveRegion = richTui
|
|
213
246
|
? createLiveRegion({
|
|
214
247
|
stream: process.stderr,
|
|
215
248
|
width: () => terminalWidth(process.stderr),
|
|
216
249
|
height: () => process.stderr.rows || 24,
|
|
217
250
|
answerStream: process.stdout,
|
|
218
251
|
markdown: process.stdout.isTTY === true && process.env.TERM !== "dumb",
|
|
219
|
-
color: process.stderr.isTTY === true
|
|
252
|
+
color: terminalColorEnabled(process.stderr.isTTY === true, process.env),
|
|
220
253
|
})
|
|
221
254
|
: undefined;
|
|
222
|
-
|
|
223
|
-
?
|
|
255
|
+
const renderer = options.json
|
|
256
|
+
? undefined
|
|
224
257
|
: (liveRegion?.listener ??
|
|
225
258
|
createEventRenderer({ stdout: process.stdout, stderr: process.stderr }, {
|
|
226
259
|
stream: options.stream,
|
|
@@ -228,16 +261,27 @@ async function main(argv) {
|
|
|
228
261
|
// A progress line rewrites itself with a carriage return, which is
|
|
229
262
|
// only meaningful on a terminal; piped stderr keeps one line per event.
|
|
230
263
|
showToolProgress: !options.quiet && process.stderr.isTTY === true,
|
|
231
|
-
color: process.stderr.isTTY === true,
|
|
232
|
-
}))
|
|
264
|
+
color: terminalColorEnabled(process.stderr.isTTY === true, process.env),
|
|
265
|
+
}));
|
|
266
|
+
let detachSession = () => undefined;
|
|
267
|
+
let hasAttachedSession = false;
|
|
268
|
+
const attachSession = (target) => {
|
|
269
|
+
detachSession();
|
|
270
|
+
if (hasAttachedSession)
|
|
271
|
+
liveRegion?.reset();
|
|
272
|
+
const detachRender = target.subscribe(options.json
|
|
273
|
+
? createJsonEventWriter(process.stdout, target.header())
|
|
274
|
+
: renderer);
|
|
275
|
+
const detachExtensions = registry === undefined ? undefined : target.subscribe(registry.eventListener);
|
|
276
|
+
detachSession = () => { detachRender(); detachExtensions?.(); };
|
|
277
|
+
hasAttachedSession = true;
|
|
278
|
+
};
|
|
279
|
+
attachSession(session);
|
|
233
280
|
if (liveRegion !== undefined) {
|
|
234
281
|
// A resize reflows what is on screen, so the diff baseline no longer
|
|
235
282
|
// describes it. This is the one moment a full repaint is correct.
|
|
236
283
|
process.stderr.on("resize", liveRegion.resized);
|
|
237
284
|
}
|
|
238
|
-
if (registry !== undefined) {
|
|
239
|
-
session.subscribe(registry.eventListener);
|
|
240
|
-
}
|
|
241
285
|
if (options.serve) {
|
|
242
286
|
return serveSession(options, session);
|
|
243
287
|
}
|
|
@@ -247,18 +291,50 @@ async function main(argv) {
|
|
|
247
291
|
return await runRepl({
|
|
248
292
|
session,
|
|
249
293
|
...(shellApproval === undefined ? {} : { shellApproval }),
|
|
294
|
+
...(permissionPolicy === undefined ? {} : { permissionPolicy }),
|
|
250
295
|
...(liveRegion === undefined ? {} : { liveRegion }),
|
|
251
296
|
signIn: providerControl,
|
|
252
297
|
providers: providerControl,
|
|
298
|
+
compactionEnabled: options.compaction,
|
|
299
|
+
providerName: options.provider,
|
|
300
|
+
modelName: options.model,
|
|
301
|
+
permissions: [
|
|
302
|
+
...(options.permissionMode === undefined ? [] : [`mode:${options.permissionMode}`]),
|
|
303
|
+
...(options.allowWrites ? ["file-write"] : []),
|
|
304
|
+
...(options.allowShell ? ["shell"] : []),
|
|
305
|
+
...(options.shellNetwork ? ["network"] : []),
|
|
306
|
+
],
|
|
307
|
+
sessionOptions: store === undefined ? undefined : {
|
|
308
|
+
list: async () => (await store.list({ cwd })).map(({ id, title }) => ({ id, ...(title === undefined ? {} : { title }) })),
|
|
309
|
+
create: async (title) => {
|
|
310
|
+
await store.flush?.();
|
|
311
|
+
const next = createLocalSession({ options, cwd, llm, ...(shellApproval === undefined ? {} : { shellApproval }), ...(permissionPolicy === undefined ? {} : { permissionPolicy }), ...(registry === undefined ? {} : { extensions: registry }), restored: { resumed: false }, store });
|
|
312
|
+
await next.initialize();
|
|
313
|
+
if (title)
|
|
314
|
+
await next.rename(title);
|
|
315
|
+
attachSession(next);
|
|
316
|
+
return next;
|
|
317
|
+
},
|
|
318
|
+
resume: async (id) => {
|
|
319
|
+
await store.flush?.();
|
|
320
|
+
const record = await store.read(id);
|
|
321
|
+
if (record === undefined || record.header.cwd !== cwd)
|
|
322
|
+
return undefined;
|
|
323
|
+
const next = createLocalSession({ options, cwd, llm, ...(shellApproval === undefined ? {} : { shellApproval }), ...(permissionPolicy === undefined ? {} : { permissionPolicy }), ...(registry === undefined ? {} : { extensions: registry }), restored: { id, messages: record.messages, compaction: record.compaction, promptCount: record.promptCount, usage: record.usage, title: record.title, planMode: record.planMode, resumed: true }, store });
|
|
324
|
+
attachSession(next);
|
|
325
|
+
return next;
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
sessionFileForSession: store === undefined ? undefined : (current) => store.location(current.id),
|
|
253
329
|
input: process.stdin,
|
|
254
330
|
// In JSON mode stdout carries the event stream and nothing else:
|
|
255
331
|
// readline writes its prompt and echo to the same stream it is given,
|
|
256
332
|
// which would otherwise prefix the first event with escape codes.
|
|
257
|
-
output: options.json ||
|
|
258
|
-
tui:
|
|
259
|
-
inlineComposer:
|
|
333
|
+
output: options.json || richTui ? process.stderr : process.stdout,
|
|
334
|
+
tui: richTui,
|
|
335
|
+
inlineComposer: richTui,
|
|
260
336
|
stderr: process.stderr,
|
|
261
|
-
banner:
|
|
337
|
+
banner: richTui ? welcome({
|
|
262
338
|
version: VERSION,
|
|
263
339
|
provider: options.provider,
|
|
264
340
|
model: options.model ?? "unknown model",
|
|
@@ -269,8 +345,8 @@ async function main(argv) {
|
|
|
269
345
|
: options.provider === "openai-compatible" && options.baseURL === undefined
|
|
270
346
|
? { setupIssue: "base-url" } : {}),
|
|
271
347
|
width: terminalWidth(process.stderr),
|
|
272
|
-
color: process.stderr.isTTY === true
|
|
273
|
-
}) : banner(options,
|
|
348
|
+
color: terminalColorEnabled(process.stderr.isTTY === true, process.env),
|
|
349
|
+
}) : banner(options, cwd, restored.resumed, signedOutMessage),
|
|
274
350
|
...(store === undefined ? {} : { sessionFile: store.location(session.id) }),
|
|
275
351
|
...(registry === undefined
|
|
276
352
|
? {}
|
|
@@ -503,7 +579,7 @@ async function restoreSession(options, store, cwd) {
|
|
|
503
579
|
if (transcript === undefined) {
|
|
504
580
|
return `Unknown session: ${id}`;
|
|
505
581
|
}
|
|
506
|
-
return { id, messages: transcript.messages, resumed: true };
|
|
582
|
+
return { id, messages: transcript.messages, compaction: transcript.compaction, promptCount: transcript.promptCount, usage: transcript.usage, title: transcript.title, planMode: transcript.planMode, resumed: true };
|
|
507
583
|
}
|
|
508
584
|
async function listSessions(store, cwd) {
|
|
509
585
|
const sessions = await store.list({ cwd });
|
|
@@ -513,15 +589,22 @@ async function listSessions(store, cwd) {
|
|
|
513
589
|
}
|
|
514
590
|
for (const summary of sessions) {
|
|
515
591
|
const prompt = summary.lastPrompt ?? "";
|
|
516
|
-
process.stdout.write(`${summary.id} ${summary.updatedAt} ${summary.promptCount} prompt(s) ${prompt.split("\n", 1)[0] ?? ""}\n`);
|
|
592
|
+
process.stdout.write(`${summary.id} ${summary.updatedAt} ${summary.promptCount} prompt(s) ${summary.title ? `${summary.title} ` : ""}${prompt.split("\n", 1)[0] ?? ""}\n`);
|
|
517
593
|
}
|
|
518
594
|
return 0;
|
|
519
595
|
}
|
|
520
|
-
function banner(options,
|
|
521
|
-
const
|
|
596
|
+
function banner(options, cwd, resumed, signedOutMessage) {
|
|
597
|
+
const width = terminalWidth(process.stdout);
|
|
598
|
+
const model = terminalText(options.model ?? "unknown model");
|
|
599
|
+
const provider = terminalText(options.provider);
|
|
600
|
+
const cleanCwd = terminalText(cwd);
|
|
601
|
+
const prefix = `${provider} · ${model} · `;
|
|
602
|
+
const detailsWidth = Math.max(1, width - 2);
|
|
603
|
+
const availablePathWidth = detailsWidth - Math.min(displayWidth(prefix), detailsWidth - 1);
|
|
604
|
+
const pathWidth = Math.min(detailsWidth - 1, Math.max(9, availablePathWidth));
|
|
522
605
|
const lines = [
|
|
523
|
-
|
|
524
|
-
`${
|
|
606
|
+
`◆ chivgent v${VERSION}${resumed ? " · resumed" : ""}`,
|
|
607
|
+
`${fitLine(prefix, detailsWidth - pathWidth)}${fitLineTail(cleanCwd, pathWidth)}`,
|
|
525
608
|
];
|
|
526
609
|
if (signedOutMessage !== undefined) {
|
|
527
610
|
// First thing on screen, because nothing else works until it is dealt
|
|
@@ -529,7 +612,7 @@ function banner(options, sessionId, resumed, signedOutMessage) {
|
|
|
529
612
|
// it has nobody to ask tells you to start chivgent, which you just did.
|
|
530
613
|
lines.push("", `No API key for ${options.provider} yet.`, "Run /login to store one, or leave and set an environment variable.");
|
|
531
614
|
}
|
|
532
|
-
lines.push("
|
|
615
|
+
lines.push("");
|
|
533
616
|
return lines.join("\n");
|
|
534
617
|
}
|
|
535
618
|
/** Reads a prompt piped into stdin, so `cat question.txt | chivgent` works. */
|
|
@@ -544,13 +627,25 @@ async function readPipedPrompt() {
|
|
|
544
627
|
}
|
|
545
628
|
return contents.trim().length === 0 ? undefined : contents.trim();
|
|
546
629
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
}
|
|
630
|
+
const cliEntry = process.argv[1] === undefined
|
|
631
|
+
? undefined
|
|
632
|
+
: (() => {
|
|
633
|
+
try {
|
|
634
|
+
return realpathSync(resolve(process.argv[1]));
|
|
635
|
+
}
|
|
636
|
+
catch {
|
|
637
|
+
return resolve(process.argv[1]);
|
|
638
|
+
}
|
|
639
|
+
})();
|
|
640
|
+
if (cliEntry === fileURLToPath(import.meta.url)) {
|
|
641
|
+
main(process.argv.slice(2))
|
|
642
|
+
.then((exitCode) => {
|
|
643
|
+
process.exitCode = exitCode;
|
|
644
|
+
})
|
|
645
|
+
.catch((error) => {
|
|
646
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
647
|
+
process.stderr.write(`CLI error: ${message}\n`);
|
|
648
|
+
process.exitCode = 1;
|
|
649
|
+
});
|
|
650
|
+
}
|
|
556
651
|
//# sourceMappingURL=cli.js.map
|