@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
package/dist/agent/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,IAAI,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,30 +7,17 @@
|
|
|
7
7
|
* a {@link ModelTier} and a concrete gateway slug, deterministically and without
|
|
8
8
|
* an extra LLM round-trip — encoding the CLAUDE.md operating-model table in code.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* they are duplicated here only so the standalone `oxagen` bin stays lean and
|
|
14
|
-
* does not pull in @oxagen/billing (Stripe et al.). Keep them in sync.
|
|
10
|
+
* Dollar costs come from the baked-in rate card in {@link ./rate-card.ts} — the
|
|
11
|
+
* single place model prices live in the CLI. This module re-exports the pricing
|
|
12
|
+
* helpers so existing imports keep working, but does not own a second copy.
|
|
15
13
|
*/
|
|
16
14
|
import type { ModelTier } from "./fleet/types.js";
|
|
17
15
|
import type { UsageTotals } from "./fleet/types.js";
|
|
16
|
+
import { estimateCostUsd, rateFor, formatUsd } from "./rate-card.js";
|
|
17
|
+
export { estimateCostUsd, rateFor, formatUsd };
|
|
18
18
|
export declare const TIERS: ModelTier[];
|
|
19
19
|
/** Human label for a tier, for the agents screen and `--explain` output. */
|
|
20
20
|
export declare function tierLabel(tier: ModelTier): string;
|
|
21
|
-
interface Rate {
|
|
22
|
-
inputPer1M: number;
|
|
23
|
-
outputPer1M: number;
|
|
24
|
-
}
|
|
25
|
-
/** Resolve a gateway slug (e.g. "anthropic/claude-opus-4.8") to its token rate. */
|
|
26
|
-
export declare function rateFor(model: string): Rate;
|
|
27
|
-
/** Estimated provider cost in USD for a token usage on a given model. */
|
|
28
|
-
export declare function estimateCostUsd(model: string, usage: {
|
|
29
|
-
inputTokens?: number;
|
|
30
|
-
outputTokens?: number;
|
|
31
|
-
}): number;
|
|
32
|
-
/** Format a USD amount compactly for the TUI ("$0.0042", "$1.20", "<$0.0001"). */
|
|
33
|
-
export declare function formatUsd(usd: number): string;
|
|
34
21
|
/** Add a per-call usage into a running total, pricing it on the call's model. */
|
|
35
22
|
export declare function accumulateUsage(total: UsageTotals, model: string, usage: {
|
|
36
23
|
inputTokens?: number;
|
|
@@ -75,5 +62,4 @@ export declare function routeModel(signals: TaskSignals, override?: string): Rou
|
|
|
75
62
|
export declare function tierForSlug(model: string): ModelTier;
|
|
76
63
|
/** Concrete slug for a tier (exported for the planner and orchestrator). */
|
|
77
64
|
export declare function modelForTier(tier: ModelTier): string;
|
|
78
|
-
export {};
|
|
79
65
|
//# sourceMappingURL=model-router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/agent/model-router.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/agent/model-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAc/C,eAAO,MAAM,KAAK,EAAE,SAAS,EAAoC,CAAC;AAElE,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEjD;AAMD,iFAAiF;AACjF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,WAAW,CAMb;AAID,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;CACnB;AAiBD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAyChE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAMf;AAUD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQpD;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { readConfig } from "../lib/config.js";
|
|
2
|
+
import { estimateCostUsd, rateFor, formatUsd } from "./rate-card.js";
|
|
3
|
+
// Re-exported so call sites that import pricing from the router keep working.
|
|
4
|
+
// The authoritative definitions live in ./rate-card.ts.
|
|
5
|
+
export { estimateCostUsd, rateFor, formatUsd };
|
|
2
6
|
/** A tier's concrete gateway slug, overridable per-env to track gateway drift. */
|
|
3
7
|
function tierSlug(tier) {
|
|
4
8
|
switch (tier) {
|
|
@@ -15,44 +19,9 @@ export const TIERS = ["fast", "balanced", "precise"];
|
|
|
15
19
|
export function tierLabel(tier) {
|
|
16
20
|
return tier === "fast" ? "Haiku" : tier === "balanced" ? "Sonnet" : "Opus";
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
{ prefix: "claude-haiku", rate: { inputPer1M: 1.0, outputPer1M: 5.0 } },
|
|
22
|
-
{ prefix: "gpt-5", rate: { inputPer1M: 1.25, outputPer1M: 10.0 } },
|
|
23
|
-
{ prefix: "gpt-4o-mini", rate: { inputPer1M: 0.15, outputPer1M: 0.6 } },
|
|
24
|
-
{ prefix: "gpt-4o", rate: { inputPer1M: 2.5, outputPer1M: 10.0 } },
|
|
25
|
-
{ prefix: "gemini", rate: { inputPer1M: 1.25, outputPer1M: 5.0 } },
|
|
26
|
-
];
|
|
27
|
-
const FALLBACK_RATE = { inputPer1M: 3.0, outputPer1M: 15.0 }; // Sonnet — never zero-charge.
|
|
28
|
-
/** Resolve a gateway slug (e.g. "anthropic/claude-opus-4.8") to its token rate. */
|
|
29
|
-
export function rateFor(model) {
|
|
30
|
-
// Drop the "vendor/" prefix and dotted version so "anthropic/claude-opus-4.8"
|
|
31
|
-
// matches the "claude-opus" family. Normalize dots→dashes for prefix tests.
|
|
32
|
-
const family = model.split("/").pop() ?? model;
|
|
33
|
-
for (const { prefix, rate } of RATES) {
|
|
34
|
-
if (family.startsWith(prefix))
|
|
35
|
-
return rate;
|
|
36
|
-
}
|
|
37
|
-
return FALLBACK_RATE;
|
|
38
|
-
}
|
|
39
|
-
/** Estimated provider cost in USD for a token usage on a given model. */
|
|
40
|
-
export function estimateCostUsd(model, usage) {
|
|
41
|
-
const rate = rateFor(model);
|
|
42
|
-
const inCost = ((usage.inputTokens ?? 0) / 1_000_000) * rate.inputPer1M;
|
|
43
|
-
const outCost = ((usage.outputTokens ?? 0) / 1_000_000) * rate.outputPer1M;
|
|
44
|
-
return inCost + outCost;
|
|
45
|
-
}
|
|
46
|
-
/** Format a USD amount compactly for the TUI ("$0.0042", "$1.20", "<$0.0001"). */
|
|
47
|
-
export function formatUsd(usd) {
|
|
48
|
-
if (usd === 0)
|
|
49
|
-
return "$0";
|
|
50
|
-
if (usd < 0.0001)
|
|
51
|
-
return "<$0.0001";
|
|
52
|
-
if (usd < 1)
|
|
53
|
-
return `$${usd.toFixed(4)}`;
|
|
54
|
-
return `$${usd.toFixed(2)}`;
|
|
55
|
-
}
|
|
22
|
+
// ── Usage accumulation ───────────────────────────────────────────────────────
|
|
23
|
+
// Pricing helpers (rateFor / estimateCostUsd / formatUsd) come from the rate
|
|
24
|
+
// card; this only composes them into a running per-turn total.
|
|
56
25
|
/** Add a per-call usage into a running total, pricing it on the call's model. */
|
|
57
26
|
export function accumulateUsage(total, model, usage) {
|
|
58
27
|
return {
|
|
@@ -125,13 +94,21 @@ export function routeModel(signals, override) {
|
|
|
125
94
|
}
|
|
126
95
|
return classifyTier(signals);
|
|
127
96
|
}
|
|
97
|
+
// Slug fragments that classify an arbitrary gateway model into a tier, across
|
|
98
|
+
// vendors (Anthropic, OpenAI, Google, DeepSeek, Mistral). SMALL is checked first
|
|
99
|
+
// so a cheap variant of a frontier family (e.g. `gpt-5-mini`, `o3-mini`,
|
|
100
|
+
// `gemini-3.5-flash`) is never mislabelled as precise.
|
|
101
|
+
const SMALL_MARKER = /\b(mini|nano|flash|lite|small|nemo)\b|\b\d{1,3}b\b/;
|
|
102
|
+
const PRECISE_MARKER = /\b(opus|codex|pro|large|o1|o3|deepseek-v4|deepseek-r1|magistral-medium)\b/;
|
|
128
103
|
/** Best-effort tier label for an arbitrary slug (for display of pinned models). */
|
|
129
104
|
export function tierForSlug(model) {
|
|
130
|
-
const family = model.split("/").pop() ?? model;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (family.startsWith("claude-haiku") || family.includes("mini") || family.includes("flash"))
|
|
105
|
+
const family = (model.split("/").pop() ?? model).toLowerCase();
|
|
106
|
+
// Cheap/small variants win first — every vendor marks them the same way.
|
|
107
|
+
if (family.startsWith("claude-haiku") || SMALL_MARKER.test(family))
|
|
134
108
|
return "fast";
|
|
109
|
+
// Frontier / high-capability families across vendors → precise.
|
|
110
|
+
if (family.startsWith("claude-opus") || family.startsWith("gpt-5") || PRECISE_MARKER.test(family))
|
|
111
|
+
return "precise";
|
|
135
112
|
return "balanced";
|
|
136
113
|
}
|
|
137
114
|
/** Concrete slug for a tier (exported for the planner and orchestrator). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/agent/model-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/agent/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** The tools that can change the host. Read/search tools are never gated. */
|
|
2
|
+
export declare const MUTATING_TOOLS: readonly ["write_file", "edit_file", "bash"];
|
|
3
|
+
export type MutatingTool = (typeof MUTATING_TOOLS)[number];
|
|
4
|
+
export declare function isMutatingTool(name: string): name is MutatingTool;
|
|
5
|
+
/**
|
|
6
|
+
* Session permission posture.
|
|
7
|
+
* - `readonly` — mutating tools are withheld entirely (enforced in buildTools).
|
|
8
|
+
* - `ask` — every mutating call is approved/denied (default).
|
|
9
|
+
* - `acceptEdits`— file writes/edits auto-allowed; shell commands still ask.
|
|
10
|
+
* - `bypass` — everything allowed, no prompts (explicit, dangerous opt-out).
|
|
11
|
+
*/
|
|
12
|
+
export type PermissionMode = "readonly" | "ask" | "acceptEdits" | "bypass";
|
|
13
|
+
export type RuleDecision = "allow" | "ask" | "deny";
|
|
14
|
+
/**
|
|
15
|
+
* A user/project rule. `tool` matches a tool name (or "*"); `pattern` is a glob
|
|
16
|
+
* matched against the call's path (file tools) or the command string (bash).
|
|
17
|
+
* Rules are evaluated in order — the first match wins.
|
|
18
|
+
*/
|
|
19
|
+
export interface PermissionRule {
|
|
20
|
+
tool?: string;
|
|
21
|
+
pattern?: string;
|
|
22
|
+
decision: RuleDecision;
|
|
23
|
+
}
|
|
24
|
+
/** A normalized, tool-agnostic description of a single mutating call. */
|
|
25
|
+
export interface PermissionRequest {
|
|
26
|
+
tool: MutatingTool;
|
|
27
|
+
/** Resolved absolute path for file tools (undefined for bash). */
|
|
28
|
+
path?: string;
|
|
29
|
+
/** The shell command for bash (undefined for file tools). */
|
|
30
|
+
command?: string;
|
|
31
|
+
cwd: string;
|
|
32
|
+
}
|
|
33
|
+
/** What the broker hands the human when it must ask. */
|
|
34
|
+
export interface ApprovalRequest extends PermissionRequest {
|
|
35
|
+
/** One-line, human-readable summary of what will happen. */
|
|
36
|
+
summary: string;
|
|
37
|
+
/** Why approval is required (denylist hit, outside workspace, mode policy). */
|
|
38
|
+
reason: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ApprovalResponse {
|
|
41
|
+
decision: "allow" | "deny";
|
|
42
|
+
/**
|
|
43
|
+
* When true, the broker records a session rule so identical future calls are
|
|
44
|
+
* auto-resolved the same way without re-prompting.
|
|
45
|
+
*/
|
|
46
|
+
remember?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export type Approver = (req: ApprovalRequest) => Promise<ApprovalResponse>;
|
|
49
|
+
export type PermissionDecision = {
|
|
50
|
+
decision: "allow";
|
|
51
|
+
reason: string;
|
|
52
|
+
} | {
|
|
53
|
+
decision: "deny";
|
|
54
|
+
reason: string;
|
|
55
|
+
};
|
|
56
|
+
export interface BrokerOptions {
|
|
57
|
+
mode: PermissionMode;
|
|
58
|
+
cwd: string;
|
|
59
|
+
/** Project/user rules, evaluated before mode defaults. */
|
|
60
|
+
rules?: PermissionRule[];
|
|
61
|
+
/** Interactive prompt. Absent ⇒ non-interactive (every `ask` becomes `deny`). */
|
|
62
|
+
approver?: Approver;
|
|
63
|
+
}
|
|
64
|
+
/** True when an absolute path is not inside (or equal to) the workspace root. */
|
|
65
|
+
export declare function isOutsideWorkspace(cwd: string, absPath: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* The broker. Stateful only in that it accumulates session rules the human
|
|
68
|
+
* chooses to "remember"; everything else is a pure function of the request and
|
|
69
|
+
* the configured rules/mode.
|
|
70
|
+
*/
|
|
71
|
+
export declare class PermissionBroker {
|
|
72
|
+
private mode;
|
|
73
|
+
private readonly cwd;
|
|
74
|
+
private readonly approver?;
|
|
75
|
+
private readonly baseRules;
|
|
76
|
+
private readonly sessionRules;
|
|
77
|
+
constructor(opts: BrokerOptions);
|
|
78
|
+
get currentMode(): PermissionMode;
|
|
79
|
+
/** Switch posture mid-session (drives the REPL `/mode` command). */
|
|
80
|
+
setMode(mode: PermissionMode): void;
|
|
81
|
+
/** Rules in precedence order: remembered session rules first, then configured. */
|
|
82
|
+
private rules;
|
|
83
|
+
/** Record a rule so an identical future call resolves the same way silently. */
|
|
84
|
+
private remember;
|
|
85
|
+
/**
|
|
86
|
+
* Decide whether a mutating call may proceed. Never throws; an absent approver
|
|
87
|
+
* on an `ask` resolves to `deny` (fail closed). Returns the decision plus a
|
|
88
|
+
* human-readable reason (surfaced in the trace / tool result).
|
|
89
|
+
*/
|
|
90
|
+
check(req: PermissionRequest): Promise<PermissionDecision>;
|
|
91
|
+
private ask;
|
|
92
|
+
}
|
|
93
|
+
/** Map a CLI flag set to a {@link PermissionMode}. `readonly` wins; then bypass. */
|
|
94
|
+
export declare function resolveMode(opts: {
|
|
95
|
+
readOnly?: boolean;
|
|
96
|
+
acceptEdits?: boolean;
|
|
97
|
+
bypass?: boolean;
|
|
98
|
+
}): PermissionMode;
|
|
99
|
+
/** Parse a user-supplied mode string to a {@link PermissionMode} (or undefined). */
|
|
100
|
+
export declare function parseModeArg(s: string): PermissionMode | undefined;
|
|
101
|
+
/** Build a normalized {@link PermissionRequest} from a raw tool call. */
|
|
102
|
+
export declare function toRequest(tool: string, input: unknown, cwd: string): PermissionRequest | null;
|
|
103
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The permission broker — the safety layer between the model and the host.
|
|
3
|
+
*
|
|
4
|
+
* Oxagen's coding tools (`write_file`, `edit_file`, `bash`) mutate the user's
|
|
5
|
+
* filesystem and run arbitrary shell commands. Until now they executed with no
|
|
6
|
+
* gate other than `--readonly` (which simply withholds them). That is fine for a
|
|
7
|
+
* developer dogfooding their own repo, but it blocks every unattended / shared /
|
|
8
|
+
* CI use case and offers no protection against a destructive command.
|
|
9
|
+
*
|
|
10
|
+
* This module adds a deterministic decision layer that every mutating tool call
|
|
11
|
+
* is routed through before it runs. It is intentionally framework-agnostic: the
|
|
12
|
+
* broker decides `allow` / `deny`, and the *interactive* part (asking the human)
|
|
13
|
+
* is a pluggable async {@link Approver} the REPL supplies. Non-interactive
|
|
14
|
+
* callers (one-shot, CI) simply omit the approver and get the mode's safe
|
|
15
|
+
* default.
|
|
16
|
+
*
|
|
17
|
+
* Decision order for a mutating call (most → least decisive):
|
|
18
|
+
* 1. `bypass` mode → allow (the user explicitly opted out of the safety layer).
|
|
19
|
+
* 2. First matching explicit rule (project/user/session) → allow | ask | deny.
|
|
20
|
+
* 3. A catastrophic command pattern → forced to `ask` (never silently allowed).
|
|
21
|
+
* 4. A write/edit outside the workspace root → forced to `ask`.
|
|
22
|
+
* 5. Mode default: `acceptEdits` auto-allows file edits (bash still asks);
|
|
23
|
+
* `ask` asks for everything.
|
|
24
|
+
* 6. Resolve an `ask`: call the approver if present; otherwise `deny`.
|
|
25
|
+
*/
|
|
26
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
27
|
+
/** The tools that can change the host. Read/search tools are never gated. */
|
|
28
|
+
export const MUTATING_TOOLS = ["write_file", "edit_file", "bash"];
|
|
29
|
+
export function isMutatingTool(name) {
|
|
30
|
+
return MUTATING_TOOLS.includes(name);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Commands that can irreversibly destroy data or compromise the machine. A match
|
|
34
|
+
* never silently passes — it is forced to `ask` even under `acceptEdits`, so the
|
|
35
|
+
* human always sees it. (In `bypass` mode the user has opted out entirely.)
|
|
36
|
+
*/
|
|
37
|
+
const DANGEROUS_COMMAND = [
|
|
38
|
+
/\brm\s+(-[a-z]*\s+)*-[a-z]*r[a-z]*f|\brm\s+(-[a-z]*\s+)*-[a-z]*f[a-z]*r/i, // rm -rf / -fr
|
|
39
|
+
/\brm\s+-[a-z]*\s+\/(\s|$)/i, // rm -… /
|
|
40
|
+
/\b(mkfs|fdisk|parted)\b/i,
|
|
41
|
+
/\bdd\b[^|]*\bof=\/dev\//i,
|
|
42
|
+
/[>|]\s*\/dev\/(sd|nvme|disk|hd)/i,
|
|
43
|
+
/:\(\)\s*\{.*\};\s*:/, // fork bomb
|
|
44
|
+
/\bchmod\s+-R\s+777\s+\//i,
|
|
45
|
+
/\b(curl|wget)\b[^|&;]*\|\s*(sudo\s+)?(sh|bash|zsh)\b/i, // curl … | sh
|
|
46
|
+
/\bgit\s+push\b[^&;]*--force\b[^&;]*\b(origin\s+)?(main|master)\b/i,
|
|
47
|
+
/\bsudo\s+rm\b/i,
|
|
48
|
+
/\b(shutdown|reboot|halt)\b/i,
|
|
49
|
+
];
|
|
50
|
+
function matchesDangerous(command) {
|
|
51
|
+
return DANGEROUS_COMMAND.some((re) => re.test(command));
|
|
52
|
+
}
|
|
53
|
+
/** Minimal glob → RegExp (mirrors the tools' matcher): `**` any, `*` segment, `?` one. */
|
|
54
|
+
function globToRegExp(pattern) {
|
|
55
|
+
let re = "";
|
|
56
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
57
|
+
const c = pattern[i];
|
|
58
|
+
if (c === "*") {
|
|
59
|
+
if (pattern[i + 1] === "*") {
|
|
60
|
+
re += ".*";
|
|
61
|
+
i++;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
re += "[^/]*";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (c === "?") {
|
|
68
|
+
re += "[^/]";
|
|
69
|
+
}
|
|
70
|
+
else if (".+^${}()|[]\\".includes(c)) {
|
|
71
|
+
re += "\\" + c;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
re += c;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return new RegExp("^" + re + "$");
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The string a rule's `pattern` is tested against. File rules match the path
|
|
81
|
+
* *relative to the workspace root* (so `src/**` works regardless of where the
|
|
82
|
+
* repo lives); bash rules match the raw command string.
|
|
83
|
+
*/
|
|
84
|
+
function subjectOf(req, cwd) {
|
|
85
|
+
if (req.tool === "bash")
|
|
86
|
+
return req.command ?? "";
|
|
87
|
+
return req.path ? relative(cwd, req.path) : "";
|
|
88
|
+
}
|
|
89
|
+
function ruleMatches(rule, req, cwd) {
|
|
90
|
+
if (rule.tool && rule.tool !== "*" && rule.tool !== req.tool)
|
|
91
|
+
return false;
|
|
92
|
+
if (rule.pattern) {
|
|
93
|
+
const subject = subjectOf(req, cwd);
|
|
94
|
+
// A command rule matches as a prefix or a glob; a path rule as a glob.
|
|
95
|
+
if (req.tool === "bash") {
|
|
96
|
+
if (!subject.startsWith(rule.pattern) && !globToRegExp(rule.pattern).test(subject))
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
else if (!globToRegExp(rule.pattern).test(subject)) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
/** True when an absolute path is not inside (or equal to) the workspace root. */
|
|
106
|
+
export function isOutsideWorkspace(cwd, absPath) {
|
|
107
|
+
const rel = relative(resolve(cwd), resolve(absPath));
|
|
108
|
+
return rel === ".." || rel.startsWith(".." + "/") || isAbsolute(rel);
|
|
109
|
+
}
|
|
110
|
+
function summarize(req) {
|
|
111
|
+
if (req.tool === "bash")
|
|
112
|
+
return `Run: ${req.command ?? ""}`;
|
|
113
|
+
const verb = req.tool === "write_file" ? "Write" : "Edit";
|
|
114
|
+
const shown = req.path ? relative(req.cwd, req.path) || req.path : "(unknown path)";
|
|
115
|
+
return `${verb} ${shown}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The broker. Stateful only in that it accumulates session rules the human
|
|
119
|
+
* chooses to "remember"; everything else is a pure function of the request and
|
|
120
|
+
* the configured rules/mode.
|
|
121
|
+
*/
|
|
122
|
+
export class PermissionBroker {
|
|
123
|
+
mode;
|
|
124
|
+
cwd;
|
|
125
|
+
approver;
|
|
126
|
+
baseRules;
|
|
127
|
+
sessionRules = [];
|
|
128
|
+
constructor(opts) {
|
|
129
|
+
this.mode = opts.mode;
|
|
130
|
+
this.cwd = resolve(opts.cwd);
|
|
131
|
+
this.approver = opts.approver;
|
|
132
|
+
this.baseRules = opts.rules ?? [];
|
|
133
|
+
}
|
|
134
|
+
get currentMode() {
|
|
135
|
+
return this.mode;
|
|
136
|
+
}
|
|
137
|
+
/** Switch posture mid-session (drives the REPL `/mode` command). */
|
|
138
|
+
setMode(mode) {
|
|
139
|
+
this.mode = mode;
|
|
140
|
+
}
|
|
141
|
+
/** Rules in precedence order: remembered session rules first, then configured. */
|
|
142
|
+
rules() {
|
|
143
|
+
return [...this.sessionRules, ...this.baseRules];
|
|
144
|
+
}
|
|
145
|
+
/** Record a rule so an identical future call resolves the same way silently. */
|
|
146
|
+
remember(req, decision) {
|
|
147
|
+
const pattern = req.tool === "bash" ? (req.command ?? "") : (req.path ? relative(this.cwd, req.path) : undefined);
|
|
148
|
+
this.sessionRules.unshift({ tool: req.tool, pattern, decision });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Decide whether a mutating call may proceed. Never throws; an absent approver
|
|
152
|
+
* on an `ask` resolves to `deny` (fail closed). Returns the decision plus a
|
|
153
|
+
* human-readable reason (surfaced in the trace / tool result).
|
|
154
|
+
*/
|
|
155
|
+
async check(req) {
|
|
156
|
+
// 1. Explicit opt-out — the user has accepted full responsibility.
|
|
157
|
+
if (this.mode === "bypass")
|
|
158
|
+
return { decision: "allow", reason: "bypass mode" };
|
|
159
|
+
// 2. Base decision: first matching rule, else the mode default.
|
|
160
|
+
let decision;
|
|
161
|
+
let reason;
|
|
162
|
+
const rule = this.rules().find((r) => ruleMatches(r, req, this.cwd));
|
|
163
|
+
if (rule) {
|
|
164
|
+
decision = rule.decision;
|
|
165
|
+
reason = `matched ${rule.decision} rule`;
|
|
166
|
+
}
|
|
167
|
+
else if (this.mode === "acceptEdits" && req.tool !== "bash") {
|
|
168
|
+
decision = "allow";
|
|
169
|
+
reason = "acceptEdits: file change auto-approved";
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
decision = "ask";
|
|
173
|
+
reason = this.mode === "acceptEdits" ? "shell command needs approval" : "approval required";
|
|
174
|
+
}
|
|
175
|
+
// 3. Safety escalations downgrade an `allow` to `ask` so a catastrophic
|
|
176
|
+
// command or a write outside the workspace is never run silently — even
|
|
177
|
+
// when a broad allow rule would otherwise pass it. An explicit `deny`
|
|
178
|
+
// still denies; bypass already returned above.
|
|
179
|
+
if (decision === "allow") {
|
|
180
|
+
if (req.tool === "bash" && req.command && matchesDangerous(req.command)) {
|
|
181
|
+
decision = "ask";
|
|
182
|
+
reason = "command matches a dangerous pattern";
|
|
183
|
+
}
|
|
184
|
+
else if (req.tool !== "bash" && req.path && isOutsideWorkspace(this.cwd, req.path)) {
|
|
185
|
+
decision = "ask";
|
|
186
|
+
reason = "writes outside the workspace root";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (decision === "allow")
|
|
190
|
+
return { decision: "allow", reason };
|
|
191
|
+
if (decision === "deny")
|
|
192
|
+
return { decision: "deny", reason };
|
|
193
|
+
return this.ask(req, reason);
|
|
194
|
+
}
|
|
195
|
+
async ask(req, reason) {
|
|
196
|
+
if (!this.approver) {
|
|
197
|
+
// Fail closed: no human available to approve.
|
|
198
|
+
return { decision: "deny", reason: `${reason} (no approver — denied)` };
|
|
199
|
+
}
|
|
200
|
+
const response = await this.approver({ ...req, summary: summarize(req), reason });
|
|
201
|
+
if (response.remember)
|
|
202
|
+
this.remember(req, response.decision);
|
|
203
|
+
return {
|
|
204
|
+
decision: response.decision,
|
|
205
|
+
reason: response.decision === "allow" ? `approved (${reason})` : `denied by user (${reason})`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Map a CLI flag set to a {@link PermissionMode}. `readonly` wins; then bypass. */
|
|
210
|
+
export function resolveMode(opts) {
|
|
211
|
+
if (opts.readOnly)
|
|
212
|
+
return "readonly";
|
|
213
|
+
if (opts.bypass)
|
|
214
|
+
return "bypass";
|
|
215
|
+
if (opts.acceptEdits)
|
|
216
|
+
return "acceptEdits";
|
|
217
|
+
return "ask";
|
|
218
|
+
}
|
|
219
|
+
/** Accepted spellings for the `--mode` flag and the `/mode` command. */
|
|
220
|
+
const MODE_ALIASES = {
|
|
221
|
+
ask: "ask",
|
|
222
|
+
"auto-edit": "acceptEdits",
|
|
223
|
+
"accept-edits": "acceptEdits",
|
|
224
|
+
acceptedits: "acceptEdits",
|
|
225
|
+
bypass: "bypass",
|
|
226
|
+
readonly: "readonly",
|
|
227
|
+
"read-only": "readonly",
|
|
228
|
+
};
|
|
229
|
+
/** Parse a user-supplied mode string to a {@link PermissionMode} (or undefined). */
|
|
230
|
+
export function parseModeArg(s) {
|
|
231
|
+
return MODE_ALIASES[s.trim().toLowerCase()];
|
|
232
|
+
}
|
|
233
|
+
/** Build a normalized {@link PermissionRequest} from a raw tool call. */
|
|
234
|
+
export function toRequest(tool, input, cwd) {
|
|
235
|
+
if (!isMutatingTool(tool))
|
|
236
|
+
return null;
|
|
237
|
+
const obj = (input ?? {});
|
|
238
|
+
if (tool === "bash") {
|
|
239
|
+
return { tool, command: typeof obj.command === "string" ? obj.command : "", cwd };
|
|
240
|
+
}
|
|
241
|
+
const p = typeof obj.path === "string" ? obj.path : "";
|
|
242
|
+
const abs = p ? (isAbsolute(p) ? p : resolve(cwd, p)) : "";
|
|
243
|
+
return { tool, path: abs, cwd };
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/pipeline.d.ts
CHANGED
|
@@ -8,10 +8,12 @@
|
|
|
8
8
|
* context to pull and a noise-removed rewrite.
|
|
9
9
|
* 2. ENHANCE — the code graph + recalled lessons are injected, grounding the
|
|
10
10
|
* agent in the real files/symbols involved.
|
|
11
|
-
* 3. ROUTE — the
|
|
12
|
-
*
|
|
11
|
+
* 3. ROUTE — the Haiku evaluator's chosen tier selects the worker model
|
|
12
|
+
* (cheapest tier for the job); a one-way deterministic safety floor only
|
|
13
|
+
* prevents under-spending on high-stakes domains.
|
|
13
14
|
* 4. EXECUTE — the coding agent runs the local tool loop.
|
|
14
|
-
* 5. JUDGE — a DIFFERENT model
|
|
15
|
+
* 5. JUDGE — a DIFFERENT model (default: the most powerful OpenAI model)
|
|
16
|
+
* checks whether the work is actually complete.
|
|
15
17
|
* 6. REVISE — if it isn't, the agent is sent back with the judge's findings,
|
|
16
18
|
* then re-judged, up to a bounded number of rounds.
|
|
17
19
|
*
|
|
@@ -25,6 +27,7 @@ import { MissingGatewayKeyError } from "./env.js";
|
|
|
25
27
|
import type { ProjectContext } from "./project-context.js";
|
|
26
28
|
import type { SessionMemory } from "./memory.js";
|
|
27
29
|
import type { FleetMemory } from "./fleet/memory.js";
|
|
30
|
+
import type { PermissionBroker } from "./permissions.js";
|
|
28
31
|
import type { StageEvent, TurnTrace } from "./trace.js";
|
|
29
32
|
export { MissingGatewayKeyError };
|
|
30
33
|
export interface RunTurnOptions {
|
|
@@ -42,6 +45,8 @@ export interface RunTurnOptions {
|
|
|
42
45
|
projectContext?: ProjectContext;
|
|
43
46
|
/** Read-only mode: no file mutation, and the auto-revise loop is disabled. */
|
|
44
47
|
readOnly?: boolean;
|
|
48
|
+
/** Permission broker gating mutating tools (absent ⇒ ungated). */
|
|
49
|
+
broker?: PermissionBroker;
|
|
45
50
|
/** Episodic session memory (recalled before, written after). */
|
|
46
51
|
memory?: SessionMemory | null;
|
|
47
52
|
/** Fleet memory for recalling/recording weighted lessons. */
|
|
@@ -50,6 +55,11 @@ export interface RunTurnOptions {
|
|
|
50
55
|
maxReviseRounds?: number;
|
|
51
56
|
/** Skip the eval/enhance/judge pipeline and run the bare agent. */
|
|
52
57
|
bare?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Capture full per-phase telemetry (timing, per-model token/cost breakdown,
|
|
60
|
+
* tool calls + results, the injected context) onto the trace, for `/verbose`.
|
|
61
|
+
*/
|
|
62
|
+
verbose?: boolean;
|
|
53
63
|
/** Abort the turn (e.g. user hit Ctrl-C / Esc). */
|
|
54
64
|
signal?: AbortSignal;
|
|
55
65
|
/** Live stage events for the UI. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/agent/pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/agent/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,OAAO,EAAoB,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAYpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAKV,UAAU,EAEV,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAelC,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,gEAAgE;IAChE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,+DAA+D;IAC/D,KAAK,EAAE,SAAS,CAAC;CAClB;AAmBD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAgL1E"}
|