codebase-cli 2.0.0-pre.1 → 2.0.0-pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent.js +15 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/auth/flow.js +29 -17
- package/dist/auth/flow.js.map +1 -1
- package/dist/cli.js +37 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/builtins.js +228 -1
- package/dist/commands/builtins.js.map +1 -1
- package/dist/config/store.js +125 -0
- package/dist/config/store.js.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/headless/run.js +128 -20
- package/dist/headless/run.js.map +1 -1
- package/dist/permissions/store.js +101 -3
- package/dist/permissions/store.js.map +1 -1
- package/dist/tools/config.js +74 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/dispatch-agent.js +16 -0
- package/dist/tools/dispatch-agent.js.map +1 -1
- package/dist/tools/registry.js +4 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/ui/FirstRunSetup.js +26 -3
- package/dist/ui/FirstRunSetup.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { EMPTY_CONFIG } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Layered config loader. Reads three files in priority order (later
|
|
7
|
+
* overrides earlier) and returns one merged Config:
|
|
8
|
+
*
|
|
9
|
+
* 1. ~/.codebase/config.json — user defaults
|
|
10
|
+
* 2. <cwd>/.codebase/config.json — project (committed)
|
|
11
|
+
* 3. ~/.codebase/config.local.json — local overrides (gitignored)
|
|
12
|
+
*
|
|
13
|
+
* Merge semantics: object keys deep-merge. Arrays inside known
|
|
14
|
+
* additive keys (currently `permissions.allow` and `permissions.deny`)
|
|
15
|
+
* are concatenated and de-duplicated; arrays elsewhere are replaced.
|
|
16
|
+
*
|
|
17
|
+
* Missing files are silently empty. Malformed JSON throws ConfigError
|
|
18
|
+
* with the offending path so the user can fix it (we don't want to
|
|
19
|
+
* silently ignore typos in their settings).
|
|
20
|
+
*/
|
|
21
|
+
export class ConfigStore {
|
|
22
|
+
userPath;
|
|
23
|
+
projectPath;
|
|
24
|
+
localPath;
|
|
25
|
+
cached = null;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
const home = options.home ?? homedir();
|
|
28
|
+
const cwd = options.cwd ?? process.cwd();
|
|
29
|
+
this.userPath = join(home, ".codebase", "config.json");
|
|
30
|
+
this.projectPath = join(cwd, ".codebase", "config.json");
|
|
31
|
+
this.localPath = join(home, ".codebase", "config.local.json");
|
|
32
|
+
}
|
|
33
|
+
/** Resolved layered paths, in merge order (low → high priority). */
|
|
34
|
+
get sources() {
|
|
35
|
+
return [this.userPath, this.projectPath, this.localPath];
|
|
36
|
+
}
|
|
37
|
+
/** Force re-read on next load(). */
|
|
38
|
+
invalidate() {
|
|
39
|
+
this.cached = null;
|
|
40
|
+
}
|
|
41
|
+
load() {
|
|
42
|
+
if (this.cached)
|
|
43
|
+
return this.cached;
|
|
44
|
+
let merged = { ...EMPTY_CONFIG };
|
|
45
|
+
for (const path of this.sources) {
|
|
46
|
+
const layer = readLayer(path);
|
|
47
|
+
if (layer)
|
|
48
|
+
merged = mergeConfig(merged, layer);
|
|
49
|
+
}
|
|
50
|
+
this.cached = merged;
|
|
51
|
+
return merged;
|
|
52
|
+
}
|
|
53
|
+
/** Convenience: get the resolved permission allow patterns. */
|
|
54
|
+
allowPatterns() {
|
|
55
|
+
return this.load().permissions?.allow ?? [];
|
|
56
|
+
}
|
|
57
|
+
/** Convenience: get the resolved permission deny patterns. */
|
|
58
|
+
denyPatterns() {
|
|
59
|
+
return this.load().permissions?.deny ?? [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class ConfigError extends Error {
|
|
63
|
+
path;
|
|
64
|
+
constructor(message, path) {
|
|
65
|
+
super(message);
|
|
66
|
+
this.path = path;
|
|
67
|
+
this.name = "ConfigError";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function readLayer(path) {
|
|
71
|
+
if (!existsSync(path))
|
|
72
|
+
return null;
|
|
73
|
+
let raw;
|
|
74
|
+
try {
|
|
75
|
+
raw = readFileSync(path, "utf8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
let parsed;
|
|
81
|
+
try {
|
|
82
|
+
parsed = JSON.parse(raw);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
throw new ConfigError(`could not parse ${path} as JSON: ${err instanceof Error ? err.message : String(err)}`, path);
|
|
86
|
+
}
|
|
87
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
88
|
+
throw new ConfigError(`${path} must contain a JSON object at the top level`, path);
|
|
89
|
+
}
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Deep-merge two Configs. The right operand wins for scalars and
|
|
94
|
+
* non-array fields. For the additive arrays under `permissions`,
|
|
95
|
+
* concatenate + de-duplicate so users can layer rules without losing
|
|
96
|
+
* earlier-layer entries.
|
|
97
|
+
*/
|
|
98
|
+
export function mergeConfig(base, overlay) {
|
|
99
|
+
const out = { ...base };
|
|
100
|
+
for (const [key, value] of Object.entries(overlay)) {
|
|
101
|
+
if (key === "permissions" && isObject(value) && isObject(out.permissions)) {
|
|
102
|
+
out.permissions = mergePermissions(out.permissions, value);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
out[key] = value;
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
function mergePermissions(base, overlay) {
|
|
110
|
+
const merged = { ...base, ...overlay };
|
|
111
|
+
if (overlay.allow && base.allow) {
|
|
112
|
+
merged.allow = dedupe([...base.allow, ...overlay.allow]);
|
|
113
|
+
}
|
|
114
|
+
if (overlay.deny && base.deny) {
|
|
115
|
+
merged.deny = dedupe([...base.deny, ...overlay.deny]);
|
|
116
|
+
}
|
|
117
|
+
return merged;
|
|
118
|
+
}
|
|
119
|
+
function isObject(v) {
|
|
120
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
121
|
+
}
|
|
122
|
+
function dedupe(arr) {
|
|
123
|
+
return Array.from(new Set(arr));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/config/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,YAAY,GAAW,MAAM,CAAC,MAAM,CAAC,EAAE,CAAW,CAAC"}
|
package/dist/headless/run.js
CHANGED
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
import { createAgent } from "../agent/agent.js";
|
|
2
2
|
import { ConfigError } from "../agent/config.js";
|
|
3
|
+
const EMPTY_USAGE = {
|
|
4
|
+
input: 0,
|
|
5
|
+
output: 0,
|
|
6
|
+
cacheRead: 0,
|
|
7
|
+
cacheWrite: 0,
|
|
8
|
+
totalTokens: 0,
|
|
9
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
10
|
+
};
|
|
3
11
|
/**
|
|
4
|
-
* Run a single prompt without the TUI:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
12
|
+
* Run a single prompt without the TUI:
|
|
13
|
+
*
|
|
14
|
+
* • text (default) — assistant text to stdout, tool
|
|
15
|
+
* activity to stderr, plain text. Pipe-friendly:
|
|
16
|
+
* `codebase run "…" > out.md`.
|
|
17
|
+
* • stream-json — every AgentEvent as a JSONL line on stdout, in
|
|
18
|
+
* real time. Suitable for an upstream consumer
|
|
19
|
+
* (CI, IDE integration) that wants progress events.
|
|
20
|
+
* • json — buffer everything; on completion emit ONE JSON
|
|
21
|
+
* object with the final transcript + usage + exit
|
|
22
|
+
* metadata. Suitable for one-shot CI calls that
|
|
23
|
+
* just want the final answer + cost.
|
|
24
|
+
*
|
|
25
|
+
* In stream-json/json modes errors land in stdout as a structured
|
|
26
|
+
* event with `type: "error"` so consumers don't have to merge
|
|
27
|
+
* stdout+stderr. Setup errors (e.g. ConfigError before the loop
|
|
28
|
+
* starts) still go to stderr because they predate the JSON
|
|
29
|
+
* envelope.
|
|
8
30
|
*/
|
|
9
31
|
export async function runHeadless(opts) {
|
|
10
32
|
const out = opts.stdout ?? ((c) => process.stdout.write(c));
|
|
11
33
|
const err = opts.stderr ?? ((c) => process.stderr.write(c));
|
|
34
|
+
const format = opts.outputFormat ?? "text";
|
|
12
35
|
let bundle;
|
|
13
36
|
try {
|
|
14
37
|
bundle = createAgent({ resume: opts.resume });
|
|
@@ -18,15 +41,114 @@ export async function runHeadless(opts) {
|
|
|
18
41
|
err(`error: ${msg}\n`);
|
|
19
42
|
return 1;
|
|
20
43
|
}
|
|
21
|
-
|
|
44
|
+
const startedAt = Date.now();
|
|
22
45
|
let aborted = false;
|
|
23
46
|
let errored = false;
|
|
47
|
+
let errorMessage;
|
|
48
|
+
let totalUsage = { ...EMPTY_USAGE, cost: { ...EMPTY_USAGE.cost } };
|
|
49
|
+
// Always tap the event stream for usage accumulation, regardless of
|
|
50
|
+
// output format — pi-agent-core surfaces per-turn usage on
|
|
51
|
+
// message_end events; the JSON output reports the running total.
|
|
52
|
+
const usageUnsub = bundle.subscribe((event) => {
|
|
53
|
+
if (event.type !== "message_end")
|
|
54
|
+
return;
|
|
55
|
+
const candidate = event.message.usage;
|
|
56
|
+
if (candidate)
|
|
57
|
+
totalUsage = mergeUsage(totalUsage, candidate);
|
|
58
|
+
});
|
|
24
59
|
const onSigInt = () => {
|
|
25
60
|
aborted = true;
|
|
26
61
|
bundle.agent.abort();
|
|
27
62
|
};
|
|
28
63
|
process.on("SIGINT", onSigInt);
|
|
29
|
-
|
|
64
|
+
let unsubscribe;
|
|
65
|
+
if (format === "stream-json") {
|
|
66
|
+
unsubscribe = subscribeStreamJson(bundle, out);
|
|
67
|
+
}
|
|
68
|
+
else if (format === "json") {
|
|
69
|
+
unsubscribe = () => {
|
|
70
|
+
// JSON mode buffers via the agent's own state.messages; the
|
|
71
|
+
// subscribe handler is a no-op so we don't spam stderr.
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
unsubscribe = subscribeText(bundle, out, err);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await bundle.agent.prompt(opts.prompt);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
errored = true;
|
|
82
|
+
errorMessage = e instanceof Error ? e.message : String(e);
|
|
83
|
+
if (format === "stream-json") {
|
|
84
|
+
out(`${JSON.stringify({ type: "error", error: errorMessage, ts: Date.now() })}\n`);
|
|
85
|
+
}
|
|
86
|
+
else if (format !== "json") {
|
|
87
|
+
err(`agent error: ${errorMessage}\n`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
unsubscribe();
|
|
92
|
+
usageUnsub();
|
|
93
|
+
process.off("SIGINT", onSigInt);
|
|
94
|
+
}
|
|
95
|
+
const exitCode = aborted ? 130 : errored ? 1 : 0;
|
|
96
|
+
if (format === "json") {
|
|
97
|
+
const payload = buildJsonResult({
|
|
98
|
+
ok: !errored && !aborted,
|
|
99
|
+
exitCode,
|
|
100
|
+
error: errorMessage,
|
|
101
|
+
messages: bundle.agent.state.messages,
|
|
102
|
+
usage: totalUsage,
|
|
103
|
+
model: { provider: bundle.model.provider, id: bundle.model.id, name: bundle.model.name },
|
|
104
|
+
source: bundle.source,
|
|
105
|
+
durationMs: Date.now() - startedAt,
|
|
106
|
+
});
|
|
107
|
+
out(`${JSON.stringify(payload)}\n`);
|
|
108
|
+
}
|
|
109
|
+
return exitCode;
|
|
110
|
+
}
|
|
111
|
+
function mergeUsage(a, b) {
|
|
112
|
+
return {
|
|
113
|
+
input: a.input + b.input,
|
|
114
|
+
output: a.output + b.output,
|
|
115
|
+
cacheRead: a.cacheRead + b.cacheRead,
|
|
116
|
+
cacheWrite: a.cacheWrite + b.cacheWrite,
|
|
117
|
+
totalTokens: a.totalTokens + b.totalTokens,
|
|
118
|
+
cost: {
|
|
119
|
+
input: a.cost.input + b.cost.input,
|
|
120
|
+
output: a.cost.output + b.cost.output,
|
|
121
|
+
cacheRead: a.cost.cacheRead + b.cost.cacheRead,
|
|
122
|
+
cacheWrite: a.cost.cacheWrite + b.cost.cacheWrite,
|
|
123
|
+
total: a.cost.total + b.cost.total,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function buildJsonResult(input) {
|
|
128
|
+
const lastAssistant = [...input.messages].reverse().find((m) => m.role === "assistant");
|
|
129
|
+
return {
|
|
130
|
+
ok: input.ok,
|
|
131
|
+
exitCode: input.exitCode,
|
|
132
|
+
...(input.error ? { error: input.error } : {}),
|
|
133
|
+
model: input.model,
|
|
134
|
+
source: input.source,
|
|
135
|
+
durationMs: input.durationMs,
|
|
136
|
+
usage: input.usage,
|
|
137
|
+
messageCount: input.messages.length,
|
|
138
|
+
finalText: lastAssistant ? extractText(lastAssistant) : "",
|
|
139
|
+
messages: input.messages,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function subscribeStreamJson(bundle, out) {
|
|
143
|
+
return bundle.subscribe((event) => {
|
|
144
|
+
// One AgentEvent per line. Inject a timestamp so consumers can
|
|
145
|
+
// reason about latency without re-deriving from clock skew.
|
|
146
|
+
out(`${JSON.stringify({ ...event, ts: Date.now() })}\n`);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function subscribeText(bundle, out, err) {
|
|
150
|
+
let lastStreamLen = 0;
|
|
151
|
+
return bundle.subscribe((event) => {
|
|
30
152
|
switch (event.type) {
|
|
31
153
|
case "tool_execution_start":
|
|
32
154
|
err(`[${event.toolName}…]\n`);
|
|
@@ -59,20 +181,6 @@ export async function runHeadless(opts) {
|
|
|
59
181
|
return;
|
|
60
182
|
}
|
|
61
183
|
});
|
|
62
|
-
try {
|
|
63
|
-
await bundle.agent.prompt(opts.prompt);
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
errored = true;
|
|
67
|
-
err(`agent error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
unsubscribe();
|
|
71
|
-
process.off("SIGINT", onSigInt);
|
|
72
|
-
}
|
|
73
|
-
if (aborted)
|
|
74
|
-
return 130;
|
|
75
|
-
return errored ? 1 : 0;
|
|
76
184
|
}
|
|
77
185
|
function extractText(message) {
|
|
78
186
|
if (typeof message.content === "string")
|
package/dist/headless/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/headless/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/headless/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,80 @@
|
|
|
1
1
|
import { shellNeedsPermission } from "../tools/permission.js";
|
|
2
|
+
/**
|
|
3
|
+
* Convert a permission pattern's arg-glob portion into a regex.
|
|
4
|
+
* `*` → `.*`, `?` → `.`, everything else escaped. Anchored.
|
|
5
|
+
*/
|
|
6
|
+
function compileGlob(glob) {
|
|
7
|
+
const escaped = glob
|
|
8
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
9
|
+
.replace(/\*/g, ".*")
|
|
10
|
+
.replace(/\?/g, ".");
|
|
11
|
+
return new RegExp(`^${escaped}$`);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pull the "primary string arg" from a tool-call args object. This
|
|
15
|
+
* is the value users typically want to glob against — the shell
|
|
16
|
+
* command, the file path, the URL, etc. Falls back to the JSON
|
|
17
|
+
* stringification so unknown tools still match in some way.
|
|
18
|
+
*/
|
|
19
|
+
function primaryArgString(toolName, args) {
|
|
20
|
+
const a = (args ?? {});
|
|
21
|
+
const pick = (k) => (typeof a[k] === "string" ? a[k] : "");
|
|
22
|
+
switch (toolName) {
|
|
23
|
+
case "shell":
|
|
24
|
+
return pick("command") || pick("cmd");
|
|
25
|
+
case "read_file":
|
|
26
|
+
case "write_file":
|
|
27
|
+
case "edit_file":
|
|
28
|
+
case "multi_edit":
|
|
29
|
+
case "notebook_edit":
|
|
30
|
+
return pick("path") || pick("file_path");
|
|
31
|
+
case "list_files":
|
|
32
|
+
return pick("path");
|
|
33
|
+
case "glob":
|
|
34
|
+
case "grep":
|
|
35
|
+
return pick("pattern");
|
|
36
|
+
case "web_fetch":
|
|
37
|
+
return pick("url");
|
|
38
|
+
case "web_search":
|
|
39
|
+
return pick("query");
|
|
40
|
+
default:
|
|
41
|
+
try {
|
|
42
|
+
return JSON.stringify(args);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compile a config-supplied list of `tool` or `tool:glob` patterns.
|
|
51
|
+
* Returns a matcher closure; the closure returns true when the tool
|
|
52
|
+
* call matches any pattern in the list.
|
|
53
|
+
*/
|
|
54
|
+
function compileMatcher(patterns) {
|
|
55
|
+
if (patterns.length === 0)
|
|
56
|
+
return () => false;
|
|
57
|
+
const compiled = patterns.map((pattern) => {
|
|
58
|
+
const colonIdx = pattern.indexOf(":");
|
|
59
|
+
if (colonIdx < 0) {
|
|
60
|
+
return { tool: pattern, regex: null };
|
|
61
|
+
}
|
|
62
|
+
const tool = pattern.slice(0, colonIdx);
|
|
63
|
+
const glob = pattern.slice(colonIdx + 1);
|
|
64
|
+
return { tool, regex: compileGlob(glob) };
|
|
65
|
+
});
|
|
66
|
+
return (toolName, args) => {
|
|
67
|
+
for (const { tool, regex } of compiled) {
|
|
68
|
+
if (tool !== toolName)
|
|
69
|
+
continue;
|
|
70
|
+
if (!regex)
|
|
71
|
+
return true;
|
|
72
|
+
if (regex.test(primaryArgString(toolName, args)))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
2
78
|
/**
|
|
3
79
|
* Tools that never need a permission prompt. The full read-only set
|
|
4
80
|
* (audit-flagged "read-only allowlist" from permission.go) plus the task
|
|
@@ -26,14 +102,26 @@ const ALWAYS_ALLOWED = new Set([
|
|
|
26
102
|
// Memory tools are user-context, not destructive code edits — auto-allow.
|
|
27
103
|
"save_memory",
|
|
28
104
|
"read_memory",
|
|
105
|
+
// `config` is read-only.
|
|
106
|
+
"config",
|
|
29
107
|
]);
|
|
30
108
|
/**
|
|
31
109
|
* Per-agent-instance permission store. Used by the agent's
|
|
32
110
|
* beforeToolCall hook to decide whether to allow, prompt, or block.
|
|
33
111
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
112
|
+
* Decision order, highest priority first:
|
|
113
|
+
* 1. config-supplied deny patterns → block immediately
|
|
114
|
+
* 2. session-scoped "trust-all" response → allow
|
|
115
|
+
* 3. session-scoped "trust-tool" response → allow for that tool
|
|
116
|
+
* 4. built-in ALWAYS_ALLOWED read-only set → allow
|
|
117
|
+
* 5. config-supplied allow patterns → allow
|
|
118
|
+
* 6. shell-/git-branch-specific read heuristics → allow
|
|
119
|
+
* 7. otherwise → prompt the user
|
|
120
|
+
*
|
|
121
|
+
* Trust state from interactive responses is in-memory (session-only).
|
|
122
|
+
* Persisting it across sessions is what the config layer is for —
|
|
123
|
+
* users can promote a session-scoped trust to a config entry by
|
|
124
|
+
* editing ~/.codebase/config.json.
|
|
37
125
|
*/
|
|
38
126
|
export class PermissionStore {
|
|
39
127
|
trustAll = false;
|
|
@@ -41,9 +129,19 @@ export class PermissionStore {
|
|
|
41
129
|
queue = [];
|
|
42
130
|
listeners = new Set();
|
|
43
131
|
counter = 0;
|
|
132
|
+
matchAllow;
|
|
133
|
+
matchDeny;
|
|
134
|
+
constructor(options = {}) {
|
|
135
|
+
this.matchAllow = compileMatcher(options.allowPatterns ?? []);
|
|
136
|
+
this.matchDeny = compileMatcher(options.denyPatterns ?? []);
|
|
137
|
+
}
|
|
44
138
|
async evaluate(toolName, args) {
|
|
139
|
+
if (this.matchDeny(toolName, args))
|
|
140
|
+
return "block";
|
|
45
141
|
if (this.shouldAutoAllow(toolName, args))
|
|
46
142
|
return "allow";
|
|
143
|
+
if (this.matchAllow(toolName, args))
|
|
144
|
+
return "allow";
|
|
47
145
|
return new Promise((resolve) => {
|
|
48
146
|
const request = {
|
|
49
147
|
id: `perm-${++this.counter}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/permissions/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/permissions/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { ConfigStore } from "../config/store.js";
|
|
3
|
+
const Params = Type.Object({
|
|
4
|
+
path: Type.Optional(Type.String({
|
|
5
|
+
description: "Dotted path to read a single value (e.g. `permissions.allow`). Omit to return the whole merged config.",
|
|
6
|
+
})),
|
|
7
|
+
});
|
|
8
|
+
const DESCRIPTION = `Read the merged codebase-cli config (user defaults + project overrides + local overrides).
|
|
9
|
+
|
|
10
|
+
The config has three layers, merged later-wins for scalars, additive-merge for permission patterns:
|
|
11
|
+
1. ~/.codebase/config.json — user defaults
|
|
12
|
+
2. <cwd>/.codebase/config.json — project, committed
|
|
13
|
+
3. ~/.codebase/config.local.json — local override, gitignored
|
|
14
|
+
|
|
15
|
+
Useful for: checking which permission allowlists are active, reading user-set theme/model preferences, debugging why a tool was/wasn't auto-allowed.
|
|
16
|
+
|
|
17
|
+
This tool is read-only. To change config, edit the JSON files directly or ask the user to run a slash command.`;
|
|
18
|
+
export function createConfig(ctx) {
|
|
19
|
+
return {
|
|
20
|
+
name: "config",
|
|
21
|
+
label: "Config",
|
|
22
|
+
description: DESCRIPTION,
|
|
23
|
+
parameters: Params,
|
|
24
|
+
executionMode: "parallel",
|
|
25
|
+
execute: async (_toolCallId, params) => {
|
|
26
|
+
const store = new ConfigStore({ cwd: ctx.cwd });
|
|
27
|
+
const merged = store.load();
|
|
28
|
+
const value = params.path ? readPath(merged, params.path) : merged;
|
|
29
|
+
const formatted = JSON.stringify(value, null, 2);
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: "text",
|
|
34
|
+
text: params.path
|
|
35
|
+
? `${params.path}:\n${formatted}`
|
|
36
|
+
: `merged config (sources: ${store.sources.join(", ")}):\n${formatted}`,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
details: {
|
|
40
|
+
path: params.path,
|
|
41
|
+
sources: store.sources,
|
|
42
|
+
value,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a dotted path against an object. Missing intermediate keys
|
|
50
|
+
* yield `undefined`. Array indices via numeric segments are supported
|
|
51
|
+
* (`messages.3.content`).
|
|
52
|
+
*/
|
|
53
|
+
function readPath(obj, path) {
|
|
54
|
+
const segments = path.split(".").filter((s) => s.length > 0);
|
|
55
|
+
let current = obj;
|
|
56
|
+
for (const seg of segments) {
|
|
57
|
+
if (current === null || current === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (Array.isArray(current)) {
|
|
60
|
+
const idx = Number.parseInt(seg, 10);
|
|
61
|
+
if (Number.isNaN(idx))
|
|
62
|
+
return undefined;
|
|
63
|
+
current = current[idx];
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (typeof current === "object") {
|
|
67
|
+
current = current[seg];
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
return current;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tools/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,wGAAwG;KACzG,CAAC,CACF;CACD,CAAC,CAAC;AAUH,MAAM,WAAW,GAAG;;;;;;;;;+GAS2F,CAAC;AAEhH,MAAM,UAAU,YAAY,CAAC,GAAgB;IAC5C,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,MAAM;QAClB,aAAa,EAAE,UAAU;QACzB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM,CAAC,IAAI;4BAChB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,MAAM,SAAS,EAAE;4BACjC,CAAC,CAAC,2BAA2B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE;qBACxE;iBACD;gBACD,OAAO,EAAE;oBACR,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK;iBACL;aACD,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,GAAY,EAAE,IAAY;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,SAAS;QACV,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -58,6 +58,15 @@ export function createDispatchAgent(ctx) {
|
|
|
58
58
|
const toolsUsed = [];
|
|
59
59
|
let lastAssistantText = "";
|
|
60
60
|
let usage = EMPTY_USAGE;
|
|
61
|
+
let success = false;
|
|
62
|
+
await ctx.hooks?.dispatch("SubagentStart", {
|
|
63
|
+
event: "SubagentStart",
|
|
64
|
+
workingDir: ctx.cwd,
|
|
65
|
+
// dispatch_agent currently only ships a read-only subagent type;
|
|
66
|
+
// when planAgent / generalAgent variants land we'll surface them.
|
|
67
|
+
subagentType: "read-only",
|
|
68
|
+
subagentPrompt: params.task,
|
|
69
|
+
}, parentSignal);
|
|
61
70
|
const subagent = ctx.spawnSubagent({
|
|
62
71
|
systemPrompt: subagentSystemPrompt(params.task, ctx.cwd),
|
|
63
72
|
tools: buildSubagentTools(ctx),
|
|
@@ -90,6 +99,7 @@ export function createDispatchAgent(ctx) {
|
|
|
90
99
|
});
|
|
91
100
|
try {
|
|
92
101
|
await subagent.prompt(params.task);
|
|
102
|
+
success = true;
|
|
93
103
|
}
|
|
94
104
|
catch (err) {
|
|
95
105
|
if (parentSignal?.aborted)
|
|
@@ -103,6 +113,12 @@ export function createDispatchAgent(ctx) {
|
|
|
103
113
|
finally {
|
|
104
114
|
unsubscribe();
|
|
105
115
|
parentSignal?.removeEventListener("abort", onParentAbort);
|
|
116
|
+
await ctx.hooks?.dispatch("SubagentStop", {
|
|
117
|
+
event: "SubagentStop",
|
|
118
|
+
workingDir: ctx.cwd,
|
|
119
|
+
subagentType: "read-only",
|
|
120
|
+
subagentSuccess: success,
|
|
121
|
+
}, parentSignal);
|
|
106
122
|
}
|
|
107
123
|
const finalText = lastAssistantText || "(subagent completed without producing a summary)";
|
|
108
124
|
const summary = maxTurnsReached
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-agent.js","sourceRoot":"","sources":["../../src/tools/dispatch-agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,IAAI,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,IAAI;QACf,WAAW,EACV,4IAA4I;KAC7I,CAAC;IACF,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,OAAO,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,oCAAoC;KACjD,CAAC,CACF;CACD,CAAC,CAAC;AAYH,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,WAAW,GAAG;;;;;;;;;;;;;6JAayI,CAAC;AAE9J,MAAM,WAAW,GAAU;IAC1B,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;CACpE,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IACnD,OAAO;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,MAAM;QAClB,aAAa,EAAE,YAAY;QAC3B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE;YAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC;YACvD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,iBAAiB,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch-agent.js","sourceRoot":"","sources":["../../src/tools/dispatch-agent.ts"],"names":[],"mappings":"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"}
|