@oxagen/cli 0.6.0 → 0.6.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/dist/agent/__tests__/judge.test.js +11 -6
- package/dist/agent/__tests__/judge.test.js.map +1 -1
- package/dist/agent/__tests__/loop-errors.test.js +32 -1
- package/dist/agent/__tests__/loop-errors.test.js.map +1 -1
- package/dist/agent/__tests__/loop-gating.test.d.ts +2 -0
- package/dist/agent/__tests__/loop-gating.test.d.ts.map +1 -0
- package/dist/agent/__tests__/loop-gating.test.js +94 -0
- package/dist/agent/__tests__/loop-gating.test.js.map +1 -0
- package/dist/agent/__tests__/model-router.test.js +16 -0
- package/dist/agent/__tests__/model-router.test.js.map +1 -1
- package/dist/agent/__tests__/permissions.test.d.ts +2 -0
- package/dist/agent/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/agent/__tests__/permissions.test.js +206 -0
- package/dist/agent/__tests__/permissions.test.js.map +1 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.d.ts +2 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.d.ts.map +1 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.js +158 -0
- package/dist/agent/__tests__/pipeline-telemetry.test.js.map +1 -0
- package/dist/agent/__tests__/pipeline.test.js +12 -3
- package/dist/agent/__tests__/pipeline.test.js.map +1 -1
- package/dist/agent/__tests__/rate-card.test.d.ts +2 -0
- package/dist/agent/__tests__/rate-card.test.d.ts.map +1 -0
- package/dist/agent/__tests__/rate-card.test.js +69 -0
- package/dist/agent/__tests__/rate-card.test.js.map +1 -0
- package/dist/agent/__tests__/system-prompt.test.d.ts +2 -0
- package/dist/agent/__tests__/system-prompt.test.d.ts.map +1 -0
- package/dist/agent/__tests__/system-prompt.test.js +29 -0
- package/dist/agent/__tests__/system-prompt.test.js.map +1 -0
- package/dist/agent/__tests__/trace-format-verbose.test.d.ts +2 -0
- package/dist/agent/__tests__/trace-format-verbose.test.d.ts.map +1 -0
- package/dist/agent/__tests__/trace-format-verbose.test.js +93 -0
- package/dist/agent/__tests__/trace-format-verbose.test.js.map +1 -0
- package/dist/agent/__tests__/verbose-log.test.d.ts +2 -0
- package/dist/agent/__tests__/verbose-log.test.d.ts.map +1 -0
- package/dist/agent/__tests__/verbose-log.test.js +69 -0
- package/dist/agent/__tests__/verbose-log.test.js.map +1 -0
- package/dist/agent/evaluator.d.ts.map +1 -1
- package/dist/agent/evaluator.js +8 -4
- package/dist/agent/evaluator.js.map +1 -1
- package/dist/agent/fleet/orchestrator.d.ts +5 -0
- package/dist/agent/fleet/orchestrator.d.ts.map +1 -1
- package/dist/agent/fleet/orchestrator.js +3 -0
- package/dist/agent/fleet/orchestrator.js.map +1 -1
- package/dist/agent/fleet/types.d.ts +2 -0
- package/dist/agent/fleet/types.d.ts.map +1 -1
- package/dist/agent/judge.d.ts +11 -3
- package/dist/agent/judge.d.ts.map +1 -1
- package/dist/agent/judge.js +15 -3
- package/dist/agent/judge.js.map +1 -1
- package/dist/agent/loop.d.ts +35 -0
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +147 -48
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/model-router.d.ts +5 -19
- package/dist/agent/model-router.d.ts.map +1 -1
- package/dist/agent/model-router.js +19 -42
- package/dist/agent/model-router.js.map +1 -1
- package/dist/agent/permissions.d.ts +103 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +245 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/pipeline.d.ts +13 -3
- package/dist/agent/pipeline.d.ts.map +1 -1
- package/dist/agent/pipeline.js +66 -15
- package/dist/agent/pipeline.js.map +1 -1
- package/dist/agent/planner.d.ts +3 -0
- package/dist/agent/planner.d.ts.map +1 -1
- package/dist/agent/planner.js +14 -1
- package/dist/agent/planner.js.map +1 -1
- package/dist/agent/prompt-enhancer.d.ts +9 -0
- package/dist/agent/prompt-enhancer.d.ts.map +1 -1
- package/dist/agent/prompt-enhancer.js +23 -1
- package/dist/agent/prompt-enhancer.js.map +1 -1
- package/dist/agent/rate-card.d.ts +77 -0
- package/dist/agent/rate-card.d.ts.map +1 -0
- package/dist/agent/rate-card.js +99 -0
- package/dist/agent/rate-card.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +5 -0
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +13 -4
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tools.d.ts +8 -4
- package/dist/agent/tools.d.ts.map +1 -1
- package/dist/agent/tools.js +35 -4
- package/dist/agent/tools.js.map +1 -1
- package/dist/agent/trace-format.d.ts +7 -0
- package/dist/agent/trace-format.d.ts.map +1 -1
- package/dist/agent/trace-format.js +114 -0
- package/dist/agent/trace-format.js.map +1 -1
- package/dist/agent/trace.d.ts +59 -0
- package/dist/agent/trace.d.ts.map +1 -1
- package/dist/agent/verbose-log.d.ts +8 -0
- package/dist/agent/verbose-log.d.ts.map +1 -0
- package/dist/agent/verbose-log.js +53 -0
- package/dist/agent/verbose-log.js.map +1 -0
- package/dist/agents/__tests__/loader.test.d.ts +2 -0
- package/dist/agents/__tests__/loader.test.d.ts.map +1 -0
- package/dist/agents/__tests__/loader.test.js +88 -0
- package/dist/agents/__tests__/loader.test.js.map +1 -0
- package/dist/agents/__tests__/tools.test.d.ts +2 -0
- package/dist/agents/__tests__/tools.test.d.ts.map +1 -0
- package/dist/agents/__tests__/tools.test.js +40 -0
- package/dist/agents/__tests__/tools.test.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/loader.d.ts +25 -0
- package/dist/agents/loader.d.ts.map +1 -0
- package/dist/agents/loader.js +133 -0
- package/dist/agents/loader.js.map +1 -0
- package/dist/agents/tools.d.ts +14 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +21 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/types.d.ts +27 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +11 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/write.d.ts +10 -0
- package/dist/agents/write.d.ts.map +1 -0
- package/dist/agents/write.js +28 -0
- package/dist/agents/write.js.map +1 -0
- package/dist/commands/__tests__/agent.test.d.ts +2 -0
- package/dist/commands/__tests__/agent.test.d.ts.map +1 -0
- package/dist/commands/__tests__/agent.test.js +82 -0
- package/dist/commands/__tests__/agent.test.js.map +1 -0
- package/dist/commands/__tests__/command.test.d.ts +2 -0
- package/dist/commands/__tests__/command.test.d.ts.map +1 -0
- package/dist/commands/__tests__/command.test.js +73 -0
- package/dist/commands/__tests__/command.test.js.map +1 -0
- package/dist/commands/__tests__/cost.test.d.ts +2 -0
- package/dist/commands/__tests__/cost.test.d.ts.map +1 -0
- package/dist/commands/__tests__/cost.test.js +139 -0
- package/dist/commands/__tests__/cost.test.js.map +1 -0
- package/dist/commands/__tests__/graph.pull.test.d.ts +2 -0
- package/dist/commands/__tests__/graph.pull.test.d.ts.map +1 -0
- package/dist/commands/__tests__/graph.pull.test.js +259 -0
- package/dist/commands/__tests__/graph.pull.test.js.map +1 -0
- package/dist/commands/__tests__/mcp.test.d.ts +2 -0
- package/dist/commands/__tests__/mcp.test.d.ts.map +1 -0
- package/dist/commands/__tests__/mcp.test.js +88 -0
- package/dist/commands/__tests__/mcp.test.js.map +1 -0
- package/dist/commands/__tests__/rules.test.d.ts +2 -0
- package/dist/commands/__tests__/rules.test.d.ts.map +1 -0
- package/dist/commands/__tests__/rules.test.js +95 -0
- package/dist/commands/__tests__/rules.test.js.map +1 -0
- package/dist/commands/__tests__/settings.test.d.ts +2 -0
- package/dist/commands/__tests__/settings.test.d.ts.map +1 -0
- package/dist/commands/__tests__/settings.test.js +83 -0
- package/dist/commands/__tests__/settings.test.js.map +1 -0
- package/dist/commands/agent.d.ts +15 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +58 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/command.d.ts +17 -0
- package/dist/commands/command.d.ts.map +1 -0
- package/dist/commands/command.js +74 -0
- package/dist/commands/command.js.map +1 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/cost.d.ts +10 -0
- package/dist/commands/cost.d.ts.map +1 -0
- package/dist/commands/cost.js +140 -0
- package/dist/commands/cost.js.map +1 -0
- package/dist/commands/graph.pull.d.ts +15 -0
- package/dist/commands/graph.pull.d.ts.map +1 -0
- package/dist/commands/graph.pull.js +137 -0
- package/dist/commands/graph.pull.js.map +1 -0
- package/dist/commands/graph.status.d.ts +10 -0
- package/dist/commands/graph.status.d.ts.map +1 -0
- package/dist/commands/graph.status.js +75 -0
- package/dist/commands/graph.status.js.map +1 -0
- package/dist/commands/mcp.d.ts +18 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +183 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/rules.d.ts +19 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +96 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/settings.d.ts +10 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +117 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/index.js +297 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/mcp/__tests__/client.test.d.ts +2 -0
- package/dist/mcp/__tests__/client.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/client.test.js +101 -0
- package/dist/mcp/__tests__/client.test.js.map +1 -0
- package/dist/mcp/client.d.ts +89 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +201 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/repl/__tests__/components.test.js +50 -1
- package/dist/repl/__tests__/components.test.js.map +1 -1
- package/dist/repl/components.d.ts +18 -1
- package/dist/repl/components.d.ts.map +1 -1
- package/dist/repl/components.js +32 -2
- package/dist/repl/components.js.map +1 -1
- package/dist/repl/interactive.d.ts +5 -0
- package/dist/repl/interactive.d.ts.map +1 -1
- package/dist/repl/interactive.js +124 -11
- package/dist/repl/interactive.js.map +1 -1
- package/dist/repl/one-shot.d.ts +16 -0
- package/dist/repl/one-shot.d.ts.map +1 -1
- package/dist/repl/one-shot.js +71 -1
- package/dist/repl/one-shot.js.map +1 -1
- package/dist/rules/__tests__/enforce.test.d.ts +2 -0
- package/dist/rules/__tests__/enforce.test.d.ts.map +1 -0
- package/dist/rules/__tests__/enforce.test.js +58 -0
- package/dist/rules/__tests__/enforce.test.js.map +1 -0
- package/dist/rules/__tests__/loader.test.d.ts +2 -0
- package/dist/rules/__tests__/loader.test.d.ts.map +1 -0
- package/dist/rules/__tests__/loader.test.js +54 -0
- package/dist/rules/__tests__/loader.test.js.map +1 -0
- package/dist/rules/enforce.d.ts +23 -0
- package/dist/rules/enforce.d.ts.map +1 -0
- package/dist/rules/enforce.js +36 -0
- package/dist/rules/enforce.js.map +1 -0
- package/dist/rules/index.d.ts +10 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +4 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/loader.d.ts +10 -0
- package/dist/rules/loader.d.ts.map +1 -0
- package/dist/rules/loader.js +77 -0
- package/dist/rules/loader.js.map +1 -0
- package/dist/rules/types.d.ts +39 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +16 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/write.d.ts +10 -0
- package/dist/rules/write.d.ts.map +1 -0
- package/dist/rules/write.js +28 -0
- package/dist/rules/write.js.map +1 -0
- package/dist/settings/__tests__/gate.test.d.ts +2 -0
- package/dist/settings/__tests__/gate.test.d.ts.map +1 -0
- package/dist/settings/__tests__/gate.test.js +137 -0
- package/dist/settings/__tests__/gate.test.js.map +1 -0
- package/dist/settings/__tests__/hooks.test.d.ts +2 -0
- package/dist/settings/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/settings/__tests__/hooks.test.js +103 -0
- package/dist/settings/__tests__/hooks.test.js.map +1 -0
- package/dist/settings/__tests__/mcp-write.test.d.ts +2 -0
- package/dist/settings/__tests__/mcp-write.test.d.ts.map +1 -0
- package/dist/settings/__tests__/mcp-write.test.js +77 -0
- package/dist/settings/__tests__/mcp-write.test.js.map +1 -0
- package/dist/settings/__tests__/permissions-gate.test.d.ts +2 -0
- package/dist/settings/__tests__/permissions-gate.test.d.ts.map +1 -0
- package/dist/settings/__tests__/permissions-gate.test.js +75 -0
- package/dist/settings/__tests__/permissions-gate.test.js.map +1 -0
- package/dist/settings/__tests__/resolve.test.d.ts +2 -0
- package/dist/settings/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/settings/__tests__/resolve.test.js +109 -0
- package/dist/settings/__tests__/resolve.test.js.map +1 -0
- package/dist/settings/__tests__/runtime.test.d.ts +2 -0
- package/dist/settings/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/settings/__tests__/runtime.test.js +72 -0
- package/dist/settings/__tests__/runtime.test.js.map +1 -0
- package/dist/settings/__tests__/schema.test.d.ts +2 -0
- package/dist/settings/__tests__/schema.test.d.ts.map +1 -0
- package/dist/settings/__tests__/schema.test.js +55 -0
- package/dist/settings/__tests__/schema.test.js.map +1 -0
- package/dist/settings/__tests__/write.test.d.ts +2 -0
- package/dist/settings/__tests__/write.test.d.ts.map +1 -0
- package/dist/settings/__tests__/write.test.js +61 -0
- package/dist/settings/__tests__/write.test.js.map +1 -0
- package/dist/settings/gate.d.ts +34 -0
- package/dist/settings/gate.d.ts.map +1 -0
- package/dist/settings/gate.js +50 -0
- package/dist/settings/gate.js.map +1 -0
- package/dist/settings/hooks.d.ts +26 -0
- package/dist/settings/hooks.d.ts.map +1 -0
- package/dist/settings/hooks.js +115 -0
- package/dist/settings/hooks.js.map +1 -0
- package/dist/settings/index.d.ts +23 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +23 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/mcp-write.d.ts +41 -0
- package/dist/settings/mcp-write.d.ts.map +1 -0
- package/dist/settings/mcp-write.js +61 -0
- package/dist/settings/mcp-write.js.map +1 -0
- package/dist/settings/permissions-gate.d.ts +19 -0
- package/dist/settings/permissions-gate.d.ts.map +1 -0
- package/dist/settings/permissions-gate.js +103 -0
- package/dist/settings/permissions-gate.js.map +1 -0
- package/dist/settings/resolve.d.ts +37 -0
- package/dist/settings/resolve.d.ts.map +1 -0
- package/dist/settings/resolve.js +169 -0
- package/dist/settings/resolve.js.map +1 -0
- package/dist/settings/runtime.d.ts +28 -0
- package/dist/settings/runtime.d.ts.map +1 -0
- package/dist/settings/runtime.js +45 -0
- package/dist/settings/runtime.js.map +1 -0
- package/dist/settings/schema.d.ts +1387 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +146 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/settings/write.d.ts +37 -0
- package/dist/settings/write.d.ts.map +1 -0
- package/dist/settings/write.js +85 -0
- package/dist/settings/write.js.map +1 -0
- package/dist/slash/__tests__/expand.test.d.ts +2 -0
- package/dist/slash/__tests__/expand.test.d.ts.map +1 -0
- package/dist/slash/__tests__/expand.test.js +44 -0
- package/dist/slash/__tests__/expand.test.js.map +1 -0
- package/dist/slash/__tests__/loader.test.d.ts +2 -0
- package/dist/slash/__tests__/loader.test.d.ts.map +1 -0
- package/dist/slash/__tests__/loader.test.js +48 -0
- package/dist/slash/__tests__/loader.test.js.map +1 -0
- package/dist/slash/expand.d.ts +32 -0
- package/dist/slash/expand.d.ts.map +1 -0
- package/dist/slash/expand.js +48 -0
- package/dist/slash/expand.js.map +1 -0
- package/dist/slash/index.d.ts +11 -0
- package/dist/slash/index.d.ts.map +1 -0
- package/dist/slash/index.js +4 -0
- package/dist/slash/index.js.map +1 -0
- package/dist/slash/loader.d.ts +10 -0
- package/dist/slash/loader.d.ts.map +1 -0
- package/dist/slash/loader.js +64 -0
- package/dist/slash/loader.js.map +1 -0
- package/dist/slash/types.d.ts +24 -0
- package/dist/slash/types.d.ts.map +1 -0
- package/dist/slash/types.js +11 -0
- package/dist/slash/types.js.map +1 -0
- package/dist/slash/write.d.ts +10 -0
- package/dist/slash/write.d.ts.map +1 -0
- package/dist/slash/write.js +26 -0
- package/dist/slash/write.js.map +1 -0
- package/dist/tui/fleet-view/index.d.ts.map +1 -1
- package/dist/tui/fleet-view/index.js +5 -1
- package/dist/tui/fleet-view/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verbose structured-log stream.
|
|
3
|
+
*
|
|
4
|
+
* When a session runs in `/verbose` mode, every turn's full {@link TurnTrace} is
|
|
5
|
+
* appended — one JSON object per line (JSONL) — to a per-project log under
|
|
6
|
+
* `~/.config/oxagen/verbose/<project>.jsonl`. Unlike the trace *store* (which is
|
|
7
|
+
* capped at the latest 100 turns for `/replay`), this stream is append-only and
|
|
8
|
+
* complete: it is the machine-readable record you analyze to prove the agent is
|
|
9
|
+
* fast, cheap, and self-improving — feed it to `jq`, a notebook, or a dashboard.
|
|
10
|
+
*
|
|
11
|
+
* Writes are best-effort: a failed log write must never break a turn.
|
|
12
|
+
*/
|
|
13
|
+
import { appendFileSync, mkdirSync, existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { basename, dirname, join } from "node:path";
|
|
16
|
+
function projectKey(cwd) {
|
|
17
|
+
return basename(cwd) || "default";
|
|
18
|
+
}
|
|
19
|
+
/** Path of the JSONL verbose log for a working directory. */
|
|
20
|
+
export function verboseLogPath(cwd) {
|
|
21
|
+
return join(homedir(), ".config", "oxagen", "verbose", `${projectKey(cwd)}.jsonl`);
|
|
22
|
+
}
|
|
23
|
+
/** Append one turn's trace to the verbose JSONL stream. Best-effort. */
|
|
24
|
+
export function appendVerboseLog(cwd, trace) {
|
|
25
|
+
const path = verboseLogPath(cwd);
|
|
26
|
+
try {
|
|
27
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
28
|
+
appendFileSync(path, JSON.stringify(trace) + "\n", "utf8");
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* logging is best-effort — never break a turn over it */
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Read every record from the verbose JSONL stream (skipping malformed lines). */
|
|
35
|
+
export function readVerboseLog(cwd) {
|
|
36
|
+
const path = verboseLogPath(cwd);
|
|
37
|
+
if (!existsSync(path))
|
|
38
|
+
return [];
|
|
39
|
+
const out = [];
|
|
40
|
+
for (const line of readFileSync(path, "utf8").split("\n")) {
|
|
41
|
+
const trimmed = line.trim();
|
|
42
|
+
if (!trimmed)
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
out.push(JSON.parse(trimmed));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* skip a corrupt/partial line rather than failing the whole read */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=verbose-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verbose-log.js","sourceRoot":"","sources":["../../src/agent/verbose-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGpD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACpC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,KAAgB;IAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../src/agents/__tests__/loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { loadAgents, getAgent, parseFrontmatter } from "../loader.js";
|
|
6
|
+
import { clearSettingsCache } from "../../settings/resolve.js";
|
|
7
|
+
let dir;
|
|
8
|
+
let userDir;
|
|
9
|
+
let userSettings;
|
|
10
|
+
function writeAgent(rel, body) {
|
|
11
|
+
const path = join(dir, rel);
|
|
12
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
13
|
+
writeFileSync(path, body, "utf8");
|
|
14
|
+
}
|
|
15
|
+
function load() {
|
|
16
|
+
return loadAgents({
|
|
17
|
+
cwd: dir,
|
|
18
|
+
userAgentsDir: userDir,
|
|
19
|
+
settingsOptions: { userSettingsPath: userSettings },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
dir = mkdtempSync(join(tmpdir(), "oxagen-agents-"));
|
|
24
|
+
userDir = join(dir, "user-agents");
|
|
25
|
+
userSettings = join(dir, "user-settings.json");
|
|
26
|
+
clearSettingsCache();
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
rmSync(dir, { recursive: true, force: true });
|
|
30
|
+
clearSettingsCache();
|
|
31
|
+
});
|
|
32
|
+
describe("parseFrontmatter", () => {
|
|
33
|
+
it("splits frontmatter and body", () => {
|
|
34
|
+
const { data, body } = parseFrontmatter("---\nname: x\ndescription: hi\n---\nThe prompt.");
|
|
35
|
+
expect(data["name"]).toBe("x");
|
|
36
|
+
expect(data["description"]).toBe("hi");
|
|
37
|
+
expect(body).toBe("The prompt.");
|
|
38
|
+
});
|
|
39
|
+
it("treats content without frontmatter as all body", () => {
|
|
40
|
+
expect(parseFrontmatter("just a prompt").body).toBe("just a prompt");
|
|
41
|
+
});
|
|
42
|
+
it("strips quotes from values", () => {
|
|
43
|
+
expect(parseFrontmatter('---\nmodel: "a/b"\n---\nx').data["model"]).toBe("a/b");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("loadAgents", () => {
|
|
47
|
+
it("loads an agent from .oxagen/agents and parses frontmatter + tools", () => {
|
|
48
|
+
writeAgent(".oxagen/agents/reviewer.md", "---\nname: reviewer\ndescription: Reviews code\ntools: Read, Grep\nmodel: a/b\n---\nYou review code.");
|
|
49
|
+
const agent = load().get("reviewer");
|
|
50
|
+
expect(agent?.description).toBe("Reviews code");
|
|
51
|
+
expect(agent?.tools).toEqual(["Read", "Grep"]);
|
|
52
|
+
expect(agent?.model).toBe("a/b");
|
|
53
|
+
expect(agent?.systemPrompt).toBe("You review code.");
|
|
54
|
+
});
|
|
55
|
+
it("parses a bracketed tools list", () => {
|
|
56
|
+
writeAgent(".oxagen/agents/a.md", "---\ntools: [Read, Bash]\n---\nbody");
|
|
57
|
+
expect(load().get("a")?.tools).toEqual(["Read", "Bash"]);
|
|
58
|
+
});
|
|
59
|
+
it("defaults the name to the filename and tools to undefined", () => {
|
|
60
|
+
writeAgent(".oxagen/agents/helper.md", "---\ndescription: d\n---\nbody");
|
|
61
|
+
const a = load().get("helper");
|
|
62
|
+
expect(a?.name).toBe("helper");
|
|
63
|
+
expect(a?.tools).toBeUndefined();
|
|
64
|
+
});
|
|
65
|
+
it(".oxagen overrides .claude overrides user, and settings.agents overrides files", () => {
|
|
66
|
+
mkdirSync(userDir, { recursive: true });
|
|
67
|
+
writeFileSync(join(userDir, "r.md"), "---\nname: r\n---\nuser version");
|
|
68
|
+
writeAgent(".claude/agents/r.md", "---\nname: r\n---\nclaude version");
|
|
69
|
+
expect(load().get("r")?.systemPrompt).toBe("claude version");
|
|
70
|
+
writeAgent(".oxagen/agents/r.md", "---\nname: r\n---\noxagen version");
|
|
71
|
+
expect(load().get("r")?.systemPrompt).toBe("oxagen version");
|
|
72
|
+
writeFileSync(userSettings, JSON.stringify({ agents: { r: { prompt: "inline version" } } }));
|
|
73
|
+
clearSettingsCache();
|
|
74
|
+
const a = load().get("r");
|
|
75
|
+
expect(a?.systemPrompt).toBe("inline version");
|
|
76
|
+
expect(a?.source).toBe("settings.json");
|
|
77
|
+
});
|
|
78
|
+
it("ignores files with no name or no body", () => {
|
|
79
|
+
writeAgent(".oxagen/agents/empty.md", "---\nname: empty\n---\n");
|
|
80
|
+
expect(load().has("empty")).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
it("getAgent returns one agent or null", () => {
|
|
83
|
+
writeAgent(".oxagen/agents/solo.md", "---\nname: solo\n---\nbody");
|
|
84
|
+
expect(getAgent("solo", { cwd: dir, userAgentsDir: userDir, settingsOptions: { userSettingsPath: userSettings } })?.name).toBe("solo");
|
|
85
|
+
expect(getAgent("nope", { cwd: dir, userAgentsDir: userDir, settingsOptions: { userSettingsPath: userSettings } })).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/agents/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../../src/agents/__tests__/tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { toolAllowedForAgent, filterToolsForAgent } from "../tools.js";
|
|
5
|
+
describe("toolAllowedForAgent", () => {
|
|
6
|
+
it("inherits everything when the allowlist is undefined", () => {
|
|
7
|
+
expect(toolAllowedForAgent("bash", undefined)).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
it("matches local tools by canonical name", () => {
|
|
10
|
+
// Read covers read_file/grep/glob/list_dir/code_graph
|
|
11
|
+
expect(toolAllowedForAgent("read_file", ["Read"])).toBe(true);
|
|
12
|
+
expect(toolAllowedForAgent("grep", ["Read"])).toBe(true);
|
|
13
|
+
expect(toolAllowedForAgent("bash", ["Read"])).toBe(false);
|
|
14
|
+
expect(toolAllowedForAgent("bash", ["Bash"])).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("matches the raw tool name too", () => {
|
|
17
|
+
expect(toolAllowedForAgent("write_file", ["write_file"])).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("globs MCP tool names", () => {
|
|
20
|
+
expect(toolAllowedForAgent("mcp__github__create_issue", ["mcp__github__*"])).toBe(true);
|
|
21
|
+
expect(toolAllowedForAgent("mcp__other__x", ["mcp__github__*"])).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("filterToolsForAgent", () => {
|
|
25
|
+
const make = () => ({
|
|
26
|
+
read_file: tool({ description: "", inputSchema: z.object({}), execute: async () => "" }),
|
|
27
|
+
bash: tool({ description: "", inputSchema: z.object({}), execute: async () => "" }),
|
|
28
|
+
mcp__github__create_issue: tool({ description: "", inputSchema: z.object({}), execute: async () => "" }),
|
|
29
|
+
});
|
|
30
|
+
it("returns the same set when no allowlist", () => {
|
|
31
|
+
const t = make();
|
|
32
|
+
expect(filterToolsForAgent(t, undefined)).toBe(t);
|
|
33
|
+
});
|
|
34
|
+
it("keeps only allowed tools", () => {
|
|
35
|
+
const filtered = filterToolsForAgent(make(), ["Read", "mcp__github__*"]);
|
|
36
|
+
expect(Object.keys(filtered).sort()).toEqual(["mcp__github__create_issue", "read_file"]);
|
|
37
|
+
expect(filtered).not.toHaveProperty("bash");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/agents/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module agents — Named agent definitions for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* Reusable personas (system prompt + tool allowlist + model) loaded from
|
|
5
|
+
* markdown or settings.json, dispatched by the fleet planner or run directly
|
|
6
|
+
* with `--agent <name>`.
|
|
7
|
+
*/
|
|
8
|
+
export type { AgentDefinition } from "./types.js";
|
|
9
|
+
export { loadAgents, getAgent, parseFrontmatter, type LoadAgentsOptions } from "./loader.js";
|
|
10
|
+
export { filterToolsForAgent, toolAllowedForAgent } from "./tools.js";
|
|
11
|
+
export { scaffoldAgent } from "./write.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAA0B,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ResolveSettingsOptions } from "../settings/resolve.js";
|
|
2
|
+
import type { AgentDefinition } from "./types.js";
|
|
3
|
+
export interface LoadAgentsOptions {
|
|
4
|
+
/** Project root (where `.oxagen`/`.claude` live). Defaults to process.cwd(). */
|
|
5
|
+
cwd?: string;
|
|
6
|
+
/** Override the user agents dir (testing). */
|
|
7
|
+
userAgentsDir?: string;
|
|
8
|
+
/** Resolver overrides so inline `settings.agents` is read from the same place (testing). */
|
|
9
|
+
settingsOptions?: ResolveSettingsOptions;
|
|
10
|
+
}
|
|
11
|
+
interface Frontmatter {
|
|
12
|
+
data: Record<string, string>;
|
|
13
|
+
body: string;
|
|
14
|
+
}
|
|
15
|
+
/** Split `---\n…\n---\nbody` into single-line key/value frontmatter + body. */
|
|
16
|
+
export declare function parseFrontmatter(raw: string): Frontmatter;
|
|
17
|
+
/**
|
|
18
|
+
* Load every agent definition visible from `cwd`, merged by name across sources.
|
|
19
|
+
* Returns the registry keyed by agent name.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadAgents(opts?: LoadAgentsOptions): Map<string, AgentDefinition>;
|
|
22
|
+
/** Resolve one agent by name (or null). Convenience over {@link loadAgents}. */
|
|
23
|
+
export declare function getAgent(name: string, opts?: LoadAgentsOptions): AgentDefinition | null;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/agents/loader.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAgB,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAwBzD;AAgDD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA6BrF;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,eAAe,GAAG,IAAI,CAE3F"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loader.ts — Discover and parse named agent definitions.
|
|
3
|
+
*
|
|
4
|
+
* Sources, lowest → highest precedence (later overrides an earlier one by name):
|
|
5
|
+
* 1. ~/.config/oxagen/agents/*.md (user)
|
|
6
|
+
* 2. <project>/.claude/agents/*.md (Claude Code interop)
|
|
7
|
+
* 3. <project>/.oxagen/agents/*.md (oxagen project agents)
|
|
8
|
+
* 4. settings.json `agents` (inline map) (project/local, via the resolver)
|
|
9
|
+
*
|
|
10
|
+
* Each markdown file has YAML-ish frontmatter (name/description/tools/model) and
|
|
11
|
+
* a body that becomes the system prompt. We parse the small, single-line subset
|
|
12
|
+
* Claude Code's agent files use — no YAML dependency.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
15
|
+
import { join, basename } from "node:path";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { loadSettings } from "../settings/resolve.js";
|
|
18
|
+
/** Split `---\n…\n---\nbody` into single-line key/value frontmatter + body. */
|
|
19
|
+
export function parseFrontmatter(raw) {
|
|
20
|
+
const text = raw.replace(/^/, "");
|
|
21
|
+
if (!text.startsWith("---"))
|
|
22
|
+
return { data: {}, body: text.trim() };
|
|
23
|
+
const end = text.indexOf("\n---", 3);
|
|
24
|
+
if (end === -1)
|
|
25
|
+
return { data: {}, body: text.trim() };
|
|
26
|
+
const header = text.slice(3, end).trim();
|
|
27
|
+
const body = text.slice(end + 4).replace(/^\r?\n/, "").trim();
|
|
28
|
+
const data = {};
|
|
29
|
+
for (const line of header.split("\n")) {
|
|
30
|
+
const trimmed = line.trim();
|
|
31
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
32
|
+
continue;
|
|
33
|
+
const colon = trimmed.indexOf(":");
|
|
34
|
+
if (colon === -1)
|
|
35
|
+
continue;
|
|
36
|
+
const key = trimmed.slice(0, colon).trim();
|
|
37
|
+
let value = trimmed.slice(colon + 1).trim();
|
|
38
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
39
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
40
|
+
value = value.slice(1, -1);
|
|
41
|
+
}
|
|
42
|
+
if (key)
|
|
43
|
+
data[key] = value;
|
|
44
|
+
}
|
|
45
|
+
return { data, body };
|
|
46
|
+
}
|
|
47
|
+
/** Parse a `tools:` value: `a, b` or `[a, b]` → ["a","b"]; empty → undefined. */
|
|
48
|
+
function parseToolList(value) {
|
|
49
|
+
if (value === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
const inner = value.trim().replace(/^\[/, "").replace(/\]$/, "");
|
|
52
|
+
const list = inner
|
|
53
|
+
.split(",")
|
|
54
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
return list.length > 0 ? list : undefined;
|
|
57
|
+
}
|
|
58
|
+
function defFromMarkdown(path) {
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = readFileSync(path, "utf8");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const { data, body } = parseFrontmatter(raw);
|
|
67
|
+
const name = data["name"] || basename(path).replace(/\.md$/, "");
|
|
68
|
+
const description = data["description"] ?? "";
|
|
69
|
+
if (!name || !body.trim())
|
|
70
|
+
return null; // a usable agent needs a name and a prompt
|
|
71
|
+
return {
|
|
72
|
+
name,
|
|
73
|
+
description,
|
|
74
|
+
systemPrompt: body,
|
|
75
|
+
tools: parseToolList(data["tools"]),
|
|
76
|
+
model: data["model"] || undefined,
|
|
77
|
+
source: path,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function loadDir(dir, into) {
|
|
81
|
+
if (!existsSync(dir))
|
|
82
|
+
return;
|
|
83
|
+
let files;
|
|
84
|
+
try {
|
|
85
|
+
files = readdirSync(dir).filter((f) => f.endsWith(".md"));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
for (const file of files.sort()) {
|
|
91
|
+
const def = defFromMarkdown(join(dir, file));
|
|
92
|
+
if (def)
|
|
93
|
+
into.set(def.name, def);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Load every agent definition visible from `cwd`, merged by name across sources.
|
|
98
|
+
* Returns the registry keyed by agent name.
|
|
99
|
+
*/
|
|
100
|
+
export function loadAgents(opts = {}) {
|
|
101
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
102
|
+
const userDir = opts.userAgentsDir ?? join(homedir(), ".config", "oxagen", "agents");
|
|
103
|
+
const registry = new Map();
|
|
104
|
+
loadDir(userDir, registry);
|
|
105
|
+
loadDir(join(cwd, ".claude", "agents"), registry);
|
|
106
|
+
loadDir(join(cwd, ".oxagen", "agents"), registry);
|
|
107
|
+
// Inline definitions in settings.json (highest precedence).
|
|
108
|
+
const settings = loadSettings({ cwd, ...opts.settingsOptions, noCache: true }).settings;
|
|
109
|
+
const inline = settings.agents;
|
|
110
|
+
if (inline && typeof inline === "object") {
|
|
111
|
+
for (const [name, value] of Object.entries(inline)) {
|
|
112
|
+
if (!value || typeof value !== "object")
|
|
113
|
+
continue;
|
|
114
|
+
const v = value;
|
|
115
|
+
if (!v.prompt)
|
|
116
|
+
continue;
|
|
117
|
+
registry.set(name, {
|
|
118
|
+
name,
|
|
119
|
+
description: v.description ?? "",
|
|
120
|
+
systemPrompt: v.prompt,
|
|
121
|
+
tools: Array.isArray(v.tools) && v.tools.length > 0 ? v.tools : undefined,
|
|
122
|
+
model: v.model,
|
|
123
|
+
source: "settings.json",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return registry;
|
|
128
|
+
}
|
|
129
|
+
/** Resolve one agent by name (or null). Convenience over {@link loadAgents}. */
|
|
130
|
+
export function getAgent(name, opts = {}) {
|
|
131
|
+
return loadAgents(opts).get(name) ?? null;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/agents/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tools.ts — Restrict a tool set to an agent's allowlist.
|
|
3
|
+
*
|
|
4
|
+
* An agent's `tools` list uses permission syntax (`Read`, `Bash`,
|
|
5
|
+
* `mcp__github__*`). A tool survives if any allowlist entry glob-matches either
|
|
6
|
+
* its raw name (`read_file`, `mcp__github__create_issue`) or its canonical
|
|
7
|
+
* permission name (`Read`, `Bash`). An undefined allowlist inherits everything.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolSet } from "ai";
|
|
10
|
+
/** True when `toolName` is permitted by the agent's allowlist. */
|
|
11
|
+
export declare function toolAllowedForAgent(toolName: string, allow: string[] | undefined): boolean;
|
|
12
|
+
/** Return the subset of `tools` an agent is allowed to use. */
|
|
13
|
+
export declare function filterToolsForAgent(tools: ToolSet, allow: string[] | undefined): ToolSet;
|
|
14
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/agents/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAIlC,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAI1F;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAOxF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { matchGlob } from "@oxagen/mcp-config/permissions";
|
|
2
|
+
import { canonicalToolName } from "../settings/permissions-gate.js";
|
|
3
|
+
/** True when `toolName` is permitted by the agent's allowlist. */
|
|
4
|
+
export function toolAllowedForAgent(toolName, allow) {
|
|
5
|
+
if (!allow)
|
|
6
|
+
return true;
|
|
7
|
+
const canonical = canonicalToolName(toolName);
|
|
8
|
+
return allow.some((entry) => matchGlob(entry, toolName) || matchGlob(entry, canonical));
|
|
9
|
+
}
|
|
10
|
+
/** Return the subset of `tools` an agent is allowed to use. */
|
|
11
|
+
export function filterToolsForAgent(tools, allow) {
|
|
12
|
+
if (!allow)
|
|
13
|
+
return tools;
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const [name, t] of Object.entries(tools)) {
|
|
16
|
+
if (toolAllowedForAgent(name, allow))
|
|
17
|
+
out[name] = t;
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/agents/tools.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAA2B;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,KAA2B;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* types.ts — The shape of a named agent definition.
|
|
3
|
+
*
|
|
4
|
+
* An agent is a reusable persona: a system prompt, an optional tool allowlist,
|
|
5
|
+
* and an optional model. Defined in markdown (`.oxagen/agents/<name>.md`,
|
|
6
|
+
* `.claude/agents/*.md` for Claude Code interop, or `~/.config/oxagen/agents/`)
|
|
7
|
+
* or inline in `settings.json` under `agents`. The fleet planner dispatches a
|
|
8
|
+
* task to an agent by name; `--agent <name>` runs a single turn as one.
|
|
9
|
+
*/
|
|
10
|
+
export interface AgentDefinition {
|
|
11
|
+
/** Unique name; how the agent is referenced and dispatched. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** What the agent is for — shown in `agent list` and given to the planner. */
|
|
14
|
+
description: string;
|
|
15
|
+
/** The agent's system prompt (the markdown body, or inline `prompt`). */
|
|
16
|
+
systemPrompt: string;
|
|
17
|
+
/**
|
|
18
|
+
* Tool allowlist in permission syntax (`Read`, `Bash`, `mcp__github__*`).
|
|
19
|
+
* `undefined` means inherit every available tool.
|
|
20
|
+
*/
|
|
21
|
+
tools?: string[];
|
|
22
|
+
/** Gateway model slug override for this agent. */
|
|
23
|
+
model?: string;
|
|
24
|
+
/** Where the definition came from (file path or "settings.json"). */
|
|
25
|
+
source: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* types.ts — The shape of a named agent definition.
|
|
3
|
+
*
|
|
4
|
+
* An agent is a reusable persona: a system prompt, an optional tool allowlist,
|
|
5
|
+
* and an optional model. Defined in markdown (`.oxagen/agents/<name>.md`,
|
|
6
|
+
* `.claude/agents/*.md` for Claude Code interop, or `~/.config/oxagen/agents/`)
|
|
7
|
+
* or inline in `settings.json` under `agents`. The fleet planner dispatches a
|
|
8
|
+
* task to an agent by name; `--agent <name>` runs a single turn as one.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/agents/write.ts"],"names":[],"mappings":"AAmBA,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB,CAOA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* write.ts — Scaffold a new agent definition file for `oxagen agent new`.
|
|
3
|
+
*/
|
|
4
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
5
|
+
import { join, dirname } from "node:path";
|
|
6
|
+
const TEMPLATE = (name) => `---
|
|
7
|
+
name: ${name}
|
|
8
|
+
description: Describe when this agent should be used (the planner reads this).
|
|
9
|
+
tools: Read, Grep, Glob, Bash
|
|
10
|
+
model: anthropic/claude-sonnet-4.6
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
You are the ${name} agent.
|
|
14
|
+
|
|
15
|
+
Describe the agent's role, what it should focus on, and how it should behave.
|
|
16
|
+
This whole body becomes the agent's system prompt.
|
|
17
|
+
`;
|
|
18
|
+
/** Write a starter agent markdown file to `.oxagen/agents/<name>.md`. */
|
|
19
|
+
export function scaffoldAgent(opts) {
|
|
20
|
+
const dir = opts.dir ?? join(opts.cwd ?? process.cwd(), ".oxagen", "agents");
|
|
21
|
+
const path = join(dir, `${opts.name}.md`);
|
|
22
|
+
if (existsSync(path))
|
|
23
|
+
return { path, created: false };
|
|
24
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
25
|
+
writeFileSync(path, TEMPLATE(opts.name), "utf8");
|
|
26
|
+
return { path, created: true };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/agents/write.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;QAC3B,IAAI;;;;;;cAME,IAAI;;;;CAIjB,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,IAAkD;IAI9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/agent.test.ts"],"names":[],"mappings":""}
|