@kernlang/agon 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ {
2
+ "schemaVersion": 3,
3
+ "id": "minimax-coding-plan-minimax-m3",
4
+ "displayName": "MiniMax Coding Plan (minimax.io) — MiniMax-M3",
5
+ "isLocal": false,
6
+ "tier": "builtin",
7
+ "timeout": 180,
8
+
9
+ "exec": {
10
+ "args": []
11
+ },
12
+ "review": {
13
+ "args": []
14
+ },
15
+
16
+ "api": {
17
+ "baseUrl": "https://api.minimax.io/v1",
18
+ "apiKeyEnv": "MINIMAX_API_KEY",
19
+ "model": "MiniMax-M3",
20
+ "maxTokens": 16384,
21
+ "format": "openai"
22
+ },
23
+
24
+ "env": {
25
+ "MINIMAX_API_KEY": { "required": true }
26
+ }
27
+ }
@@ -12,9 +12,9 @@ import {
12
12
  repairOverbroadForbiddenLiterals,
13
13
  taskWantsRepositoryLinkCheck,
14
14
  validateFitnessCommandIntent
15
- } from "./chunk-RSS3RL6Z.js";
16
- import "./chunk-HVJTVOXT.js";
17
- import "./chunk-7PMMOQZ7.js";
15
+ } from "./chunk-H7KZ34VX.js";
16
+ import "./chunk-XOJPAFCJ.js";
17
+ import "./chunk-PFHGKBQT.js";
18
18
  import "./chunk-5QMVQPHY.js";
19
19
  export {
20
20
  extractFitnessCommandFromCesarOutput,
@@ -30,4 +30,4 @@ export {
30
30
  taskWantsRepositoryLinkCheck,
31
31
  validateFitnessCommandIntent
32
32
  };
33
- //# sourceMappingURL=forge-JWR2Z76K.js.map
33
+ //# sourceMappingURL=forge-6NV4WCMB.js.map
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  runAgentTeam,
14
14
  runReviewCore,
15
15
  selectReviewEngine
16
- } from "./chunk-LVW723TJ.js";
16
+ } from "./chunk-52VTWOLH.js";
17
17
  import {
18
18
  buildCheckpoint,
19
19
  createScoreboard,
@@ -27,7 +27,7 @@ import {
27
27
  scoreboardFailEngine,
28
28
  scoreboardFinishEngine,
29
29
  sessionResultStore
30
- } from "./chunk-RSS3RL6Z.js";
30
+ } from "./chunk-H7KZ34VX.js";
31
31
  import {
32
32
  ENGINE_COLORS,
33
33
  bold,
@@ -97,7 +97,7 @@ import {
97
97
  warn,
98
98
  yellow,
99
99
  yieldToInk
100
- } from "./chunk-HVJTVOXT.js";
100
+ } from "./chunk-XOJPAFCJ.js";
101
101
  import {
102
102
  CommandRegistry,
103
103
  DEFAULT_CONFIG,
@@ -165,6 +165,7 @@ import {
165
165
  headSha,
166
166
  hooksFailed,
167
167
  initExtensions,
168
+ installKernStackTraceMapper,
168
169
  listCesarPlans,
169
170
  listChatSessions,
170
171
  listPlans,
@@ -193,6 +194,7 @@ import {
193
194
  readOnlyDiff,
194
195
  registerBuiltinCommands,
195
196
  rehydrateSessionWorktree,
197
+ removeAuthKey,
196
198
  removeSessionWorktree,
197
199
  removeWorkspace,
198
200
  renderProvenanceJson,
@@ -227,7 +229,7 @@ import {
227
229
  worktreeRemoveBestEffort,
228
230
  writeProvenanceReport,
229
231
  writeRunStatus
230
- } from "./chunk-7PMMOQZ7.js";
232
+ } from "./chunk-PFHGKBQT.js";
231
233
  import {
232
234
  apiDispatch,
233
235
  apiStreamDispatch
@@ -3590,12 +3592,12 @@ async function interactiveAdd() {
3590
3592
  var providerCommand = defineCommand16({
3591
3593
  meta: {
3592
3594
  name: "provider",
3593
- description: "Add, remove, or list API providers"
3595
+ description: "Add, remove, or list API providers; connect/disconnect and manage API keys"
3594
3596
  },
3595
3597
  args: {
3596
3598
  action: {
3597
3599
  type: "positional",
3598
- description: "Action: add | remove | list | browse",
3600
+ description: "Action: add | remove | list | browse | login | logout | key",
3599
3601
  required: true
3600
3602
  }
3601
3603
  },
@@ -3730,12 +3732,55 @@ var providerCommand = defineCommand16({
3730
3732
  fail(`No stored credentials matching "${providerQuery}"`);
3731
3733
  break;
3732
3734
  }
3733
- const { removeAuthKey: removeKey } = await import("./src-U2AWRNRL.js");
3734
- removeKey(match.envVar);
3735
+ removeAuthKey(match.envVar);
3735
3736
  delete process.env[match.envVar];
3736
3737
  success(`Removed credentials for ${match.provider ?? match.envVar}`);
3737
3738
  break;
3738
3739
  }
3740
+ case "key": {
3741
+ loadAllAuthKeys();
3742
+ const sub = (extra[0] ?? "").toLowerCase();
3743
+ if (sub === "" || sub === "list") {
3744
+ const stored = listStoredProviders();
3745
+ header("Saved API keys");
3746
+ if (stored.length === 0) {
3747
+ info("No saved keys. Add one with: agon provider key set <ENV_VAR>");
3748
+ break;
3749
+ }
3750
+ table(["Env var", "Provider"], stored.map((s) => [green(s.envVar), s.provider ?? dim("\u2014")]));
3751
+ break;
3752
+ }
3753
+ const envVar = extra[1];
3754
+ if (!envVar || !/^[A-Za-z0-9_]+$/.test(envVar)) {
3755
+ fail("Usage: agon provider key set <ENV_VAR> | clear <ENV_VAR> | list");
3756
+ process.exit(1);
3757
+ }
3758
+ if (sub === "clear" || sub === "remove" || sub === "rm") {
3759
+ const inStore = listStoredProviders().some((s) => s.envVar === envVar);
3760
+ if (!inStore) {
3761
+ info(`${envVar} is not saved in the auth store${process.env[envVar] ? " (it is set via your shell environment \u2014 unset it there)." : "."}`);
3762
+ break;
3763
+ }
3764
+ removeAuthKey(envVar);
3765
+ delete process.env[envVar];
3766
+ success(`Cleared ${envVar} from ~/.agon/auth.json`);
3767
+ break;
3768
+ }
3769
+ if (sub === "set") {
3770
+ let value = extra.slice(2).join(" ");
3771
+ if (!value) value = await prompt(`Enter value for ${envVar}: `);
3772
+ if (!value) {
3773
+ fail("No value provided.");
3774
+ process.exit(1);
3775
+ }
3776
+ const existed = listStoredProviders().some((s) => s.envVar === envVar);
3777
+ setAuthKey(envVar, value, void 0);
3778
+ success(`${existed ? "Replaced" : "Saved"} ${envVar} in ~/.agon/auth.json`);
3779
+ break;
3780
+ }
3781
+ fail("Usage: agon provider key set <ENV_VAR> | clear <ENV_VAR> | list");
3782
+ process.exit(1);
3783
+ }
3739
3784
  case "browse": {
3740
3785
  header("Available Models \u2014 models.dev");
3741
3786
  info("Fetching...");
@@ -3791,9 +3836,11 @@ var providerCommand = defineCommand16({
3791
3836
  info("No providers connected yet.");
3792
3837
  }
3793
3838
  console.log("");
3794
- info("agon provider add \u2014 add model from registry");
3795
- info("agon provider login \u2014 connect a provider");
3796
- info("agon provider logout \u2014 disconnect a provider");
3839
+ info("agon provider add \u2014 add model from registry");
3840
+ info("agon provider login \u2014 connect a provider (set/overwrite its key)");
3841
+ info("agon provider logout \u2014 disconnect a provider (remove its key)");
3842
+ info("agon provider key set \u2014 set/replace a key: key set <ENV_VAR> <value>");
3843
+ info("agon provider key clear \u2014 remove a saved key: key clear <ENV_VAR>");
3797
3844
  break;
3798
3845
  }
3799
3846
  }
@@ -6654,7 +6701,7 @@ import { Box as Box13, Static as Static2, Text as Text13, render } from "ink";
6654
6701
  import { ScrollBox, AlternateScreen } from "@kernlang/terminal/runtime";
6655
6702
 
6656
6703
  // src/generated/signals/intent.ts
6657
- var SLASH_COMMANDS = [{ cmd: "/forge", desc: "<task> test with <cmd> [--hardened] \u2014 competitive code generation" }, { cmd: "/brainstorm", desc: "<question> \u2014 confidence-bidding answers" }, { cmd: "/tribunal", desc: "[mode] <question> \u2014 debate (adversarial|socratic|red-team|steelman|synthesis|postmortem)" }, { cmd: "/campfire", desc: "<topic> \u2014 think together, no competition" }, { cmd: "/think", desc: "<problem> [--strategy reflexion] [--steps 8] \u2014 sequential thinking, one engine" }, { cmd: "/council", desc: "<decision> \u2014 roundtable: every engine a role, top-rated chairs" }, { cmd: "/synthesis", desc: "<task> [--swaps 2] \u2014 engines draft, swap, improve; judge picks winner" }, { cmd: "/workspace", desc: "add|remove|list|switch \u2014 manage project repos" }, { cmd: "/ws", desc: " \u2014 list workspaces (shortcut)" }, { cmd: "/cesar", desc: "<engine> \u2014 set Cesar brain engine (e.g. /cesar codex)" }, { cmd: "/models", desc: " \u2014 browse & add provider models + CLI models" }, { cmd: "/tokens", desc: " \u2014 show token usage & costs" }, { cmd: "/engines", desc: " \u2014 select active engines" }, { cmd: "/leaderboard", desc: " \u2014 ELO rankings" }, { cmd: "/cesar-report", desc: " \u2014 Cesar routing calibration report" }, { cmd: "/cesar-hints", desc: "<task> \u2014 inspect Cesar routing hints for a prompt" }, { cmd: "/history", desc: "[id] \u2014 past forge runs" }, { cmd: "/config", desc: "[list|get|set] \u2014 settings" }, { cmd: "/plan", desc: "<task> or no args \u2014 plan mode or show plan" }, { cmd: "/auto", desc: "[on|off|toggle|status] or <task> \u2014 autonomous mode control" }, { cmd: "/plans", desc: " \u2014 list recent plans" }, { cmd: "/approve", desc: " \u2014 approve current plan" }, { cmd: "/retry", desc: " \u2014 retry failed plan step" }, { cmd: "/cancel", desc: " \u2014 cancel current plan" }, { cmd: "/apply", desc: "[path] [--force] \u2014 apply winning forge patch" }, { cmd: "/cp", desc: "[N] \u2014 copy code block N to clipboard" }, { cmd: "/img", desc: "<path> \u2014 attach image to next prompt" }, { cmd: "/flow", desc: " \u2014 log this session" }, { cmd: "/flows", desc: " \u2014 flow analytics dashboard" }, { cmd: "/chats", desc: "[id|resume <id>] \u2014 chat history or resume session" }, { cmd: "/build", desc: "<task> \u2014 agent builds in cwd (reads/edits/tests)" }, { cmd: "/goal", desc: '<intent> --queue <dir> --gate "<cmd>" [--push] \u2014 autonomous queue: build\u2192review(all)\u2192judge\u2192fix\u2192commit\u2192push per task (background job)' }, { cmd: "/conquer", desc: '<task> --gate "<cmd>" [--builder X] [-e a,b] \u2014 supervised-autonomous build: Cesar drives a builder CLI, convenes nero/tribunal/council on forks, stops at a human merge gate (background job)' }, { cmd: "/agent", desc: "<task> \u2014 autonomous agent loop (solo or shadow, auto-routed)" }, { cmd: "/agent-solo", desc: "<task> \u2014 force solo agent mode, no shadow worker" }, { cmd: "/speculate", desc: "<task> \u2014 parallel speculation: N engines race in worktrees, winner applied" }, { cmd: "/team-forge", desc: "[2v2|3v3] <task> test with <cmd> \u2014 team code competition" }, { cmd: "/team-tribunal", desc: "[2v2|3v3] [mode] <question> \u2014 team debate" }, { cmd: "/team-brainstorm", desc: "[2v2|3v3] <question> \u2014 team ideation" }, { cmd: "/pipeline", desc: "<task> [test with <cmd>] \u2014 build\u2192review\u2192fix loop" }, { cmd: "/review", desc: "[with <engine>] [<target>] \u2014 code review (uncommitted|branch:NAME|commit:SHA)" }, { cmd: "/provider", desc: "add|remove|list \u2014 manage API providers" }, { cmd: "/run", desc: "<cmd> \u2014 run shell command inline" }, { cmd: "/commit", desc: "[message] \u2014 stage & commit with auto-generated message" }, { cmd: "/status", desc: " \u2014 live engine telemetry snapshot" }, { cmd: "/doctor", desc: "[engines|harness] \u2014 diagnose engines, worktree, or Cesar harness" }, { cmd: "/harness-replay", desc: "[turnId] \u2014 replay Cesar tool timeline + approval ledger" }, { cmd: "/undo", desc: " \u2014 revert last patch or Cesar checkpoint" }, { cmd: "/checkpoints", desc: " \u2014 list recent file checkpoints" }, { cmd: "/jobs", desc: " \u2014 list running/completed jobs" }, { cmd: "/focus", desc: "<id> \u2014 switch to background job output" }, { cmd: "/explore", desc: " \u2014 toggle exploration mode (read-only)" }, { cmd: "/nero", desc: "[<decision>] \u2014 toggle Nero mode, or challenge a decision (top-rated critic)" }, { cmd: "/btw", desc: "<question> \u2014 ask something while engines work (side-channel)" }, { cmd: "/mcp", desc: "connect <name|url> | disconnect <name> | list \u2014 manage session MCP servers" }, { cmd: "/init", desc: " \u2014 create AGON.md config wizard" }, { cmd: "/create-skill", desc: "<name> \u2014 scaffold a new skill (.agon/skills/)" }, { cmd: "/clear", desc: " \u2014 reset session (saves chat, clears brain)" }, { cmd: "/clean", desc: " \u2014 alias for /clear" }, { cmd: "/extensions", desc: " \u2014 list installed extensions" }, { cmd: "/help", desc: " \u2014 show this help" }, { cmd: "/exit", desc: " \u2014 quit" }];
6704
+ var SLASH_COMMANDS = [{ cmd: "/forge", desc: "<task> test with <cmd> [--hardened] \u2014 competitive code generation" }, { cmd: "/brainstorm", desc: "<question> \u2014 confidence-bidding answers" }, { cmd: "/tribunal", desc: "[mode] <question> \u2014 debate (adversarial|socratic|red-team|steelman|synthesis|postmortem)" }, { cmd: "/campfire", desc: "<topic> \u2014 think together, no competition" }, { cmd: "/think", desc: "<problem> [--strategy reflexion] [--steps 8] \u2014 sequential thinking, one engine" }, { cmd: "/council", desc: "<decision> \u2014 roundtable: every engine a role, top-rated chairs" }, { cmd: "/synthesis", desc: "<task> [--swaps 2] \u2014 engines draft, swap, improve; judge picks winner" }, { cmd: "/workspace", desc: "add|remove|list|switch \u2014 manage project repos" }, { cmd: "/ws", desc: " \u2014 list workspaces (shortcut)" }, { cmd: "/cesar", desc: "<engine> \u2014 set Cesar brain engine (e.g. /cesar codex)" }, { cmd: "/models", desc: " \u2014 browse & add provider models + CLI models" }, { cmd: "/tokens", desc: " \u2014 show token usage & costs" }, { cmd: "/engines", desc: " \u2014 select active engines" }, { cmd: "/leaderboard", desc: " \u2014 ELO rankings" }, { cmd: "/cesar-report", desc: " \u2014 Cesar routing calibration report" }, { cmd: "/cesar-hints", desc: "<task> \u2014 inspect Cesar routing hints for a prompt" }, { cmd: "/history", desc: "[id] \u2014 past forge runs" }, { cmd: "/config", desc: "[list|get|set] \u2014 settings" }, { cmd: "/plan", desc: "<task> or no args \u2014 plan mode or show plan" }, { cmd: "/auto", desc: "[on|off|toggle|status] or <task> \u2014 autonomous mode control" }, { cmd: "/plans", desc: " \u2014 list recent plans" }, { cmd: "/approve", desc: " \u2014 approve current plan" }, { cmd: "/retry", desc: " \u2014 retry failed plan step" }, { cmd: "/cancel", desc: " \u2014 cancel current plan" }, { cmd: "/apply", desc: "[path] [--force] \u2014 apply winning forge patch" }, { cmd: "/cp", desc: "[N] \u2014 copy code block N to clipboard" }, { cmd: "/img", desc: "<path> \u2014 attach image to next prompt" }, { cmd: "/flow", desc: " \u2014 log this session" }, { cmd: "/flows", desc: " \u2014 flow analytics dashboard" }, { cmd: "/chats", desc: "[id|resume <id>] \u2014 chat history or resume session" }, { cmd: "/build", desc: "<task> \u2014 agent builds in cwd (reads/edits/tests)" }, { cmd: "/goal", desc: '<intent> --queue <dir> --gate "<cmd>" [--push] \u2014 autonomous queue: build\u2192review(all)\u2192judge\u2192fix\u2192commit\u2192push per task (background job)' }, { cmd: "/conquer", desc: '<task> --gate "<cmd>" [--builder X] [-e a,b] \u2014 supervised-autonomous build: Cesar drives a builder CLI, convenes nero/tribunal/council on forks, stops at a human merge gate (background job)' }, { cmd: "/agent", desc: "<task> \u2014 autonomous agent loop (solo or shadow, auto-routed)" }, { cmd: "/agent-solo", desc: "<task> \u2014 force solo agent mode, no shadow worker" }, { cmd: "/speculate", desc: "<task> \u2014 parallel speculation: N engines race in worktrees, winner applied" }, { cmd: "/team-forge", desc: "[2v2|3v3] <task> test with <cmd> \u2014 team code competition" }, { cmd: "/team-tribunal", desc: "[2v2|3v3] [mode] <question> \u2014 team debate" }, { cmd: "/team-brainstorm", desc: "[2v2|3v3] <question> \u2014 team ideation" }, { cmd: "/pipeline", desc: "<task> [test with <cmd>] \u2014 build\u2192review\u2192fix loop" }, { cmd: "/review", desc: "[with <engine>] [<target>] \u2014 code review (uncommitted|branch:NAME|commit:SHA)" }, { cmd: "/provider", desc: "add|remove|list|key \u2014 providers & keys (key set/clear/list)" }, { cmd: "/run", desc: "<cmd> \u2014 run shell command inline" }, { cmd: "/commit", desc: "[message] \u2014 stage & commit with auto-generated message" }, { cmd: "/status", desc: " \u2014 live engine telemetry snapshot" }, { cmd: "/doctor", desc: "[engines|harness] \u2014 diagnose engines, worktree, or Cesar harness" }, { cmd: "/harness-replay", desc: "[turnId] \u2014 replay Cesar tool timeline + approval ledger" }, { cmd: "/undo", desc: " \u2014 revert last patch or Cesar checkpoint" }, { cmd: "/checkpoints", desc: " \u2014 list recent file checkpoints" }, { cmd: "/jobs", desc: " \u2014 list running/completed jobs" }, { cmd: "/focus", desc: "<id> \u2014 switch to background job output" }, { cmd: "/explore", desc: " \u2014 toggle exploration mode (read-only)" }, { cmd: "/nero", desc: "[<decision>] \u2014 toggle Nero mode, or challenge a decision (top-rated critic)" }, { cmd: "/btw", desc: "<question> \u2014 ask something while engines work (side-channel)" }, { cmd: "/mcp", desc: "connect <name|url> | disconnect <name> | list \u2014 manage session MCP servers" }, { cmd: "/init", desc: " \u2014 create AGON.md config wizard" }, { cmd: "/create-skill", desc: "<name> \u2014 scaffold a new skill (.agon/skills/)" }, { cmd: "/clear", desc: " \u2014 reset session (saves chat, clears brain)" }, { cmd: "/clean", desc: " \u2014 alias for /clear" }, { cmd: "/extensions", desc: " \u2014 list installed extensions" }, { cmd: "/help", desc: " \u2014 show this help" }, { cmd: "/exit", desc: " \u2014 quit" }];
6658
6705
  var FITNESS_PATTERN = /\b(?:test with|test:|--test|fitness:)\s+(.+)/i;
6659
6706
  var LEADERBOARD_KEYWORDS = /\b(leaderboard|elo|rankings?)\b/i;
6660
6707
  var HISTORY_KEYWORDS = /\b(history|last runs?|recent)\b/i;
@@ -9329,7 +9376,7 @@ async function handlePlanShow(dispatch, ctx, planId) {
9329
9376
  savePlan(approved);
9330
9377
  dispatch({ type: "success", message: "Plan approved." });
9331
9378
  if (approved.action.type === "forge") {
9332
- const { handleForge: handleForge2 } = await import("./forge-JWR2Z76K.js");
9379
+ const { handleForge: handleForge2 } = await import("./forge-6NV4WCMB.js");
9333
9380
  await handleForge2(approved.action.task, approved.action.fitnessCmd ?? null, dispatch, ctx, approved, approved.action.hardened);
9334
9381
  } else {
9335
9382
  dispatch({ type: "info", message: "Run the build again to execute." });
@@ -9355,7 +9402,7 @@ async function handleApprove(dispatch, ctx) {
9355
9402
  savePlan(plan);
9356
9403
  dispatch({ type: "success", message: "Plan approved." });
9357
9404
  if (plan.action.type === "forge") {
9358
- const { handleForge: handleForge2 } = await import("./forge-JWR2Z76K.js");
9405
+ const { handleForge: handleForge2 } = await import("./forge-6NV4WCMB.js");
9359
9406
  await handleForge2(plan.action.task, plan.action.fitnessCmd ?? null, dispatch, ctx, plan, plan.action.hardened);
9360
9407
  } else {
9361
9408
  dispatch({ type: "info", message: "Run the build again to execute." });
@@ -9383,7 +9430,7 @@ async function handleRetry(dispatch, ctx) {
9383
9430
  plan = startPlan(plan);
9384
9431
  ctx.setCurrentPlan(plan);
9385
9432
  savePlan(plan);
9386
- const { handleForge: handleForge2 } = await import("./forge-JWR2Z76K.js");
9433
+ const { handleForge: handleForge2 } = await import("./forge-6NV4WCMB.js");
9387
9434
  await handleForge2(plan.action.task, plan.action.fitnessCmd ?? null, dispatch, ctx, plan, plan.action.hardened);
9388
9435
  } else {
9389
9436
  dispatch({ type: "info", message: "Plan reset to approved. Run the build again to execute." });
@@ -12090,6 +12137,34 @@ Summarize what the pipeline produced and take the next concrete step.` : `Pipeli
12090
12137
  }, cb.ctx));
12091
12138
  return true;
12092
12139
  }
12140
+ case "conquer": {
12141
+ const _cqTask = (result.task ?? "").trim();
12142
+ if (!_cqTask) {
12143
+ cb.dispatch({ type: "warning", message: "Conquer: missing task \u2014 nothing to run." });
12144
+ return false;
12145
+ }
12146
+ const _cqGate = typeof result.gate === "string" ? result.gate.trim() : "";
12147
+ if (!_cqGate) {
12148
+ cb.dispatch({ type: "warning", message: "Conquer: missing --gate (the done-spec). Tell Cesar the test/verify command that proves the build is done." });
12149
+ return false;
12150
+ }
12151
+ const _cqBuilder = typeof result.builder === "string" ? result.builder.trim() : "";
12152
+ const _cqArgs = ["conquer", _cqTask, "--gate", _cqGate];
12153
+ if (_cqBuilder) _cqArgs.push("--builder", _cqBuilder);
12154
+ if (Array.isArray(result.engines) && result.engines.length > 0) _cqArgs.push("-e", result.engines.join(","));
12155
+ if (typeof result.maxTurns === "number" && result.maxTurns > 0) _cqArgs.push("--max-turns", String(result.maxTurns));
12156
+ const _cqCmd = `agon ${_cqArgs.map((part) => JSON.stringify(part)).join(" ")}`;
12157
+ const _cqCwd = resolveWorkingDir();
12158
+ cb.dispatch({ type: "info", message: "Cesar \u2192 conquer" });
12159
+ cb.runAsJob("conquer", label, withThreadOutcome(_cqCwd, "conquer", label, async () => {
12160
+ cb.dispatch({ type: "info", message: `conquer: launched in the background \u2014 \`${_cqCmd}\`. Track with /jobs or /focus. Stops at a human merge gate \u2014 nothing auto-merges.` });
12161
+ const res = await spawnWithTimeout({ command: "agon", args: _cqArgs, cwd: _cqCwd, timeout: 24 * 60 * 60 * 1e3 });
12162
+ const tail = (res.stdout || "").slice(-4e3);
12163
+ if (tail.trim()) cb.dispatch({ type: "text", content: tail });
12164
+ if (res.exitCode !== 0) throw new Error((res.stderr || `agon conquer exited ${res.exitCode}`).slice(-1e3));
12165
+ }, cb.ctx));
12166
+ return true;
12167
+ }
12093
12168
  case "review":
12094
12169
  cb.dispatch({ type: "info", message: `Cesar \u2192 review${hardened ? " (hardened)" : ""}` });
12095
12170
  {
@@ -12328,7 +12403,7 @@ async function runCesarBrainFallback(input, cb, crashDel, priorDeterministic) {
12328
12403
  const cesarEngine = cesarEngineDef ?? cb.ctx.registry.get(cesarId);
12329
12404
  const { join: join47 } = await import("path");
12330
12405
  const { mkdirSync: mkdirSync29 } = await import("fs");
12331
- const { resolveWorkingDir: resolveWorkingDir3, RUNS_DIR: RUNS_DIR3, appendMessage: appendMessage3 } = await import("./src-U2AWRNRL.js");
12406
+ const { resolveWorkingDir: resolveWorkingDir3, RUNS_DIR: RUNS_DIR3, appendMessage: appendMessage3 } = await import("./src-4VOZ6GIN.js");
12332
12407
  const outDir = join47(RUNS_DIR3, `cesar-fallback-${Date.now()}`);
12333
12408
  mkdirSync29(outDir, { recursive: true });
12334
12409
  if (!_silentMode) cb.dispatch({ type: "warning", message: formatCesarRecoveryStatus("retry", cesarId, `log: ${outDir}`) });
@@ -12509,7 +12584,7 @@ ${historyContext}
12509
12584
  ` : ""}## USER MESSAGE
12510
12585
  ${input}`;
12511
12586
  try {
12512
- const { resolveWorkingDir: resolveWorkingDir3, RUNS_DIR: RUNS_DIR3, appendMessage: appendMessage3 } = await import("./src-U2AWRNRL.js");
12587
+ const { resolveWorkingDir: resolveWorkingDir3, RUNS_DIR: RUNS_DIR3, appendMessage: appendMessage3 } = await import("./src-4VOZ6GIN.js");
12513
12588
  const { join: join47 } = await import("path");
12514
12589
  const { mkdirSync: mkdirSync29 } = await import("fs");
12515
12590
  const actingEngine = cb.ctx.registry.get(actingCesar);
@@ -13069,6 +13144,14 @@ import "path";
13069
13144
  import { writeFileSync as writeFileSync9, mkdirSync as mkdirSync24, unlinkSync as unlinkSync3, readdirSync as readdirSync6, readFileSync as readFileSync11, existsSync as existsSync12 } from "fs";
13070
13145
  import { join as join38, resolve as resolve3 } from "path";
13071
13146
  import { homedir as homedir5 } from "os";
13147
+ function parseProviderKeyArgs(args) {
13148
+ const parts = String(args ?? "").trim().split(/\s+/).filter(Boolean);
13149
+ const sub = (parts[0] ?? "").toLowerCase();
13150
+ if (sub === "" || sub === "list") return { sub: "list" };
13151
+ if (sub === "set") return { sub: "set", envVar: parts[1], value: parts.slice(2).join(" ") || void 0 };
13152
+ if (sub === "clear" || sub === "remove" || sub === "rm") return { sub: "clear", envVar: parts[1] };
13153
+ return { sub: "help" };
13154
+ }
13072
13155
  function enginesDir2() {
13073
13156
  const override = process.env.AGON_HOME?.trim();
13074
13157
  const home = override ? resolve3(override) : join38(homedir5(), ".agon");
@@ -13158,6 +13241,47 @@ function handleProviderList(dispatch) {
13158
13241
  }
13159
13242
  dispatch({ type: "info", message: "Add: /provider add <id> <baseUrl> <API_KEY_ENV> <model>" });
13160
13243
  }
13244
+ function handleProviderKey(args, dispatch) {
13245
+ const cmd = parseProviderKeyArgs(args);
13246
+ if (cmd.sub === "help") {
13247
+ dispatch({ type: "info", message: "Usage: /provider key set <ENV_VAR> <value> | clear <ENV_VAR> | list" });
13248
+ dispatch({ type: "info", message: "Change a key: /provider key set MINIMAX_API_KEY <new-value>" });
13249
+ return;
13250
+ }
13251
+ if (cmd.sub === "list") {
13252
+ const stored = listStoredProviders();
13253
+ if (!stored.length) {
13254
+ dispatch({ type: "info", message: "No saved keys. Add one with /provider key set <ENV_VAR> <value>" });
13255
+ return;
13256
+ }
13257
+ dispatch({ type: "header", title: "Saved API keys" });
13258
+ dispatch({ type: "table", headers: ["Env var", "Provider"], rows: stored.map((s) => [s.envVar, s.provider ?? "\u2014"]) });
13259
+ return;
13260
+ }
13261
+ const envVar = cmd.envVar;
13262
+ if (!envVar || !/^[A-Za-z0-9_]+$/.test(envVar)) {
13263
+ dispatch({ type: "error", message: `Invalid env var name${envVar ? `: ${envVar}` : ""}. Example: MINIMAX_API_KEY` });
13264
+ return;
13265
+ }
13266
+ if (cmd.sub === "clear") {
13267
+ const inStore = listStoredProviders().some((s) => s.envVar === envVar);
13268
+ if (!inStore) {
13269
+ dispatch({ type: "info", message: `${envVar} is not saved in the auth store${process.env[envVar] ? " (it is set via your shell environment)." : "."}` });
13270
+ return;
13271
+ }
13272
+ removeAuthKey(envVar);
13273
+ delete process.env[envVar];
13274
+ dispatch({ type: "success", message: `Cleared ${envVar} from the auth store.` });
13275
+ return;
13276
+ }
13277
+ if (!cmd.value) {
13278
+ dispatch({ type: "error", message: `Usage: /provider key set ${envVar} <value>` });
13279
+ return;
13280
+ }
13281
+ const existed = listStoredProviders().some((s) => s.envVar === envVar);
13282
+ setAuthKey(envVar, cmd.value, void 0);
13283
+ dispatch({ type: "success", message: `${existed ? "Replaced" : "Saved"} ${envVar} in the auth store.` });
13284
+ }
13161
13285
  async function handleProvider(action, args, dispatch, ctx) {
13162
13286
  switch (action) {
13163
13287
  case "add":
@@ -13165,6 +13289,9 @@ async function handleProvider(action, args, dispatch, ctx) {
13165
13289
  case "remove":
13166
13290
  handleProviderRemove(dispatch, ctx, args.trim());
13167
13291
  return;
13292
+ case "key":
13293
+ handleProviderKey(args, dispatch);
13294
+ return;
13168
13295
  case "list":
13169
13296
  default:
13170
13297
  handleProviderList(dispatch);
@@ -13389,7 +13516,7 @@ async function dispatchSessionInfoIntent(intent, input, cb) {
13389
13516
  cb.setModelPickerTitle?.("Select model");
13390
13517
  cb.setModelPickerLoading(true);
13391
13518
  cb.setModelPickerOpen(true);
13392
- import("./src-U2AWRNRL.js").then(({ fetchModelsRegistry: fetchModelsRegistry2, buildModelEntries: buildModelEntries2, buildCliGroupsImmediate, refreshCliGroup }) => {
13519
+ import("./src-4VOZ6GIN.js").then(({ fetchModelsRegistry: fetchModelsRegistry2, buildModelEntries: buildModelEntries2, buildCliGroupsImmediate, refreshCliGroup, refreshCliGroupVersion }) => {
13393
13520
  let cliGroups = buildCliGroupsImmediate();
13394
13521
  cb.setModelPickerCliGroups?.(cliGroups);
13395
13522
  for (const g of cliGroups) {
@@ -13407,6 +13534,15 @@ async function dispatchSessionInfoIntent(intent, input, cb) {
13407
13534
  cb.setModelPickerCliGroups?.([...cliGroups]);
13408
13535
  }).catch(clearLoading);
13409
13536
  }
13537
+ for (const g of cliGroups) {
13538
+ if (!g.installed || g.loading || g.version) continue;
13539
+ refreshCliGroupVersion(g.engineId).then((v) => {
13540
+ if (!v) return;
13541
+ cliGroups = cliGroups.map((x) => x.engineId === g.engineId ? { ...x, version: v } : x);
13542
+ cb.setModelPickerCliGroups?.([...cliGroups]);
13543
+ }).catch(() => {
13544
+ });
13545
+ }
13410
13546
  fetchModelsRegistry2().then((reg) => {
13411
13547
  cb.setModelPickerEntries(buildModelEntries2(reg));
13412
13548
  cb.setModelPickerLoading(false);
@@ -13438,7 +13574,7 @@ async function dispatchSessionInfoIntent(intent, input, cb) {
13438
13574
  await handlePlanShow(cb.dispatch, cb.ctx, intent.planId);
13439
13575
  break;
13440
13576
  case "plan-task": {
13441
- const { createCesarPlan } = await import("./src-U2AWRNRL.js");
13577
+ const { createCesarPlan } = await import("./src-4VOZ6GIN.js");
13442
13578
  const cesarPlan = createCesarPlan(intent.task, []);
13443
13579
  cb.setActivePlan(cesarPlan);
13444
13580
  if (!cb.ctx.cesar) {
@@ -15822,18 +15958,12 @@ var PlanProposalView = React3.memo(function PlanProposalView2({ plan, markdown,
15822
15958
  /* @__PURE__ */ jsx3(RenderedSegments, { segments, borderColor: "", wrapWidth }),
15823
15959
  /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: thinBar }),
15824
15960
  committed ? /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Plan moved to history." }) : /* @__PURE__ */ jsxs3(Box3, { children: [
15825
- /* @__PURE__ */ jsx3(Text3, { color: "#fbbf24", bold: true, children: "Awaiting approval: " }),
15826
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "press " }),
15827
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "Y" }),
15828
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " to approve, " }),
15829
- /* @__PURE__ */ jsx3(Text3, { color: "#ef4444", bold: true, children: "N" }),
15830
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " to reject (or type " }),
15831
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "go" }),
15832
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " / " }),
15833
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "/approve" }),
15834
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " / " }),
15835
- /* @__PURE__ */ jsx3(Text3, { color: "#ef4444", bold: true, children: "/cancel" }),
15836
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: ")." })
15961
+ /* @__PURE__ */ jsx3(Text3, { color: "#fbbf24", bold: true, children: "Awaiting approval " }),
15962
+ /* @__PURE__ */ jsx3(Text3, { backgroundColor: "#166534", color: "#ffffff", bold: true, children: " Y " }),
15963
+ /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", children: " Approve & run " }),
15964
+ /* @__PURE__ */ jsx3(Text3, { backgroundColor: "#7f1d1d", color: "#ffffff", bold: true, children: " N " }),
15965
+ /* @__PURE__ */ jsx3(Text3, { color: "#ef4444", children: " Reject " }),
15966
+ /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "\u270E type to change it \xB7 /approve \xB7 /cancel" })
15837
15967
  ] })
15838
15968
  ] });
15839
15969
  }
@@ -15934,16 +16064,12 @@ var PlanProposalView = React3.memo(function PlanProposalView2({ plan, markdown,
15934
16064
  }),
15935
16065
  /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: thinBar }),
15936
16066
  committed ? /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Plan moved to history." }) : /* @__PURE__ */ jsxs3(Box3, { children: [
15937
- /* @__PURE__ */ jsx3(Text3, { color: "#fbbf24", bold: true, children: "Awaiting approval: " }),
15938
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "type " }),
15939
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "go" }),
15940
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: ", " }),
15941
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "yes" }),
15942
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: ", or " }),
15943
- /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", bold: true, children: "/approve" }),
15944
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " to execute. Type " }),
15945
- /* @__PURE__ */ jsx3(Text3, { color: "#ef4444", bold: true, children: "/cancel" }),
15946
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: " to reject." })
16067
+ /* @__PURE__ */ jsx3(Text3, { color: "#fbbf24", bold: true, children: "Awaiting approval " }),
16068
+ /* @__PURE__ */ jsx3(Text3, { backgroundColor: "#166534", color: "#ffffff", bold: true, children: " Y " }),
16069
+ /* @__PURE__ */ jsx3(Text3, { color: "#4ade80", children: " Approve & run " }),
16070
+ /* @__PURE__ */ jsx3(Text3, { backgroundColor: "#7f1d1d", color: "#ffffff", bold: true, children: " N " }),
16071
+ /* @__PURE__ */ jsx3(Text3, { color: "#ef4444", children: " Reject " }),
16072
+ /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "\u270E type to change it \xB7 /approve \xB7 /cancel" })
15947
16073
  ] })
15948
16074
  ] });
15949
16075
  });
@@ -17419,7 +17545,7 @@ function resolvePackageVersion(resolveSpecifier, wantName, fallback) {
17419
17545
  }
17420
17546
  return fallback;
17421
17547
  }
17422
- var VERSION = resolvePackageVersion(null, "@kernlang/agon", "0.1.1");
17548
+ var VERSION = resolvePackageVersion(null, "@kernlang/agon", "0.1.3");
17423
17549
  var KERN_VERSION = resolvePackageVersion("@kernlang/terminal/runtime", "@kernlang/terminal", "3.5.7");
17424
17550
 
17425
17551
  // src/generated/blocks/todo-list.tsx
@@ -23808,7 +23934,7 @@ function App() {
23808
23934
  setEnginePickerOpen(false);
23809
23935
  setModelPickerOpen(true);
23810
23936
  setModelPickerCliGroups([]);
23811
- import("./src-U2AWRNRL.js").then(({ fetchModelsRegistry: fetchModelsRegistry2, buildModelEntries: buildModelEntries2, buildCliGroupsImmediate, refreshCliGroup }) => {
23937
+ import("./src-4VOZ6GIN.js").then(({ fetchModelsRegistry: fetchModelsRegistry2, buildModelEntries: buildModelEntries2, buildCliGroupsImmediate, refreshCliGroup, refreshCliGroupVersion }) => {
23812
23938
  let cliGroups = buildCliGroupsImmediate();
23813
23939
  setModelPickerCliGroups(cliGroups);
23814
23940
  for (const g of cliGroups) {
@@ -23826,6 +23952,15 @@ function App() {
23826
23952
  setModelPickerCliGroups([...cliGroups]);
23827
23953
  }).catch(clearLoading);
23828
23954
  }
23955
+ for (const g of cliGroups) {
23956
+ if (!g.installed || g.loading || g.version) continue;
23957
+ refreshCliGroupVersion(g.engineId).then((v) => {
23958
+ if (!v) return;
23959
+ cliGroups = cliGroups.map((x) => x.engineId === g.engineId ? { ...x, version: v } : x);
23960
+ setModelPickerCliGroups([...cliGroups]);
23961
+ }).catch(() => {
23962
+ });
23963
+ }
23829
23964
  fetchModelsRegistry2().then((reg) => {
23830
23965
  setModelPickerEntries(buildModelEntries2(reg));
23831
23966
  setModelPickerLoading(false);
@@ -24691,6 +24826,11 @@ function App() {
24691
24826
  },
24692
24827
  onCancel: () => setEnginePickerOpen(false),
24693
24828
  onRemove: (engineId) => {
24829
+ let _keyEnv;
24830
+ try {
24831
+ _keyEnv = registry.get(engineId)?.api?.apiKeyEnv;
24832
+ } catch (_e) {
24833
+ }
24694
24834
  const engPath = join46(getAgonHome(), "engines", `${engineId}.json`);
24695
24835
  try {
24696
24836
  unlinkSync4(engPath);
@@ -24711,6 +24851,12 @@ function App() {
24711
24851
  setRegistryVersion((v) => v + 1);
24712
24852
  setSessionEngines((prev) => prev ? prev.filter((id) => id !== engineId) : null);
24713
24853
  dispatch({ type: "success", message: `Removed from Agon: ${engineId}. Restore with /engines restore ${engineId}.` });
24854
+ if (_keyEnv && getAuthKey(_keyEnv)) {
24855
+ const stillUsed = registry.list().some((e) => e?.api?.apiKeyEnv === _keyEnv);
24856
+ if (!stillUsed) {
24857
+ dispatch({ type: "info", message: `${_keyEnv} is no longer used by any engine \u2014 clear the saved key with /provider key clear ${_keyEnv}.` });
24858
+ }
24859
+ }
24714
24860
  },
24715
24861
  onSetModel: (engineId, model) => {
24716
24862
  const nextModels = { ...loadConfig().engineModels ?? {} };
@@ -24778,22 +24924,40 @@ function App() {
24778
24924
  return;
24779
24925
  }
24780
24926
  setModelPickerOpen(false);
24781
- const def = modelEntryToEngineDef(entry);
24782
- const dir = join46(getAgonHome(), "engines");
24783
- mkdirSync28(dir, { recursive: true });
24784
- writeFileSync13(join46(dir, `${def.id}.json`), JSON.stringify(def, null, 2) + "\n");
24785
- registry.register(def);
24786
- const nextSelected = Array.from(/* @__PURE__ */ new Set([...sessionEngines ?? registry.activeIds(config), def.id]));
24787
- const cfg = loadConfig();
24788
- const hidden = new Set(cfg.hiddenEngines ?? []);
24789
- hidden.delete(def.id);
24790
- setSessionEngines(nextSelected);
24791
- configSet("engineActivationMode", "explicit");
24792
- configSet("forgeEnabledEngines", nextSelected);
24793
- configSet("hiddenEngines", [...hidden]);
24794
- setRegistryVersion((v) => v + 1);
24795
- setConfigVersion((v) => v + 1);
24796
- dispatch({ type: "success", message: `Added: ${entry.providerName} \u2014 ${entry.modelName}` });
24927
+ void (async () => {
24928
+ const def = modelEntryToEngineDef(entry);
24929
+ const dir = join46(getAgonHome(), "engines");
24930
+ mkdirSync28(dir, { recursive: true });
24931
+ writeFileSync13(join46(dir, `${def.id}.json`), JSON.stringify(def, null, 2) + "\n");
24932
+ registry.register(def);
24933
+ const envVar = def.api?.apiKeyEnv;
24934
+ if (envVar && !getAuthKey(envVar)) {
24935
+ const key = await askQuestion(`Paste ${envVar} for ${entry.providerName} (Enter to skip):`);
24936
+ if (key && key.trim()) {
24937
+ setAuthKey(envVar, key.trim(), entry.providerName);
24938
+ dispatch({ type: "success", message: `Saved ${envVar} to auth store` });
24939
+ } else {
24940
+ dispatch({ type: "info", message: `No key saved \u2014 set ${envVar} before using ${entry.modelName}.` });
24941
+ }
24942
+ } else if (envVar) {
24943
+ const repl = await askQuestion(`${envVar} is already set. Paste a new key to replace it, or Enter to keep:`);
24944
+ if (repl && repl.trim()) {
24945
+ setAuthKey(envVar, repl.trim(), entry.providerName);
24946
+ dispatch({ type: "success", message: `Replaced ${envVar} in auth store` });
24947
+ }
24948
+ }
24949
+ const nextSelected = Array.from(/* @__PURE__ */ new Set([...sessionEngines ?? registry.activeIds(config), def.id]));
24950
+ const cfg = loadConfig();
24951
+ const hidden = new Set(cfg.hiddenEngines ?? []);
24952
+ hidden.delete(def.id);
24953
+ setSessionEngines(nextSelected);
24954
+ configSet("engineActivationMode", "explicit");
24955
+ configSet("forgeEnabledEngines", nextSelected);
24956
+ configSet("hiddenEngines", [...hidden]);
24957
+ setRegistryVersion((v) => v + 1);
24958
+ setConfigVersion((v) => v + 1);
24959
+ dispatch({ type: "success", message: `Added: ${entry.providerName} \u2014 ${entry.modelName}` });
24960
+ })();
24797
24961
  },
24798
24962
  onCancel: () => {
24799
24963
  const hadTarget = !!modelPickerTargetEngine;
@@ -25102,6 +25266,12 @@ async function runOnboarding() {
25102
25266
  }
25103
25267
 
25104
25268
  // src/index.ts
25269
+ try {
25270
+ if (!process.env.AGON_NO_STACK_TRACE_MAPPER) {
25271
+ installKernStackTraceMapper();
25272
+ }
25273
+ } catch {
25274
+ }
25105
25275
  loadAllAuthKeys();
25106
25276
  function consumeIsolationFlags() {
25107
25277
  const nextArgv = process.argv.slice(0, 2);
@@ -25212,7 +25382,7 @@ maybeNotifyIsolationMigration();
25212
25382
  var main = defineCommand30({
25213
25383
  meta: {
25214
25384
  name: "agon",
25215
- version: "0.1.0",
25385
+ version: "0.1.3",
25216
25386
  description: "Any AI can join. They compete. You ship."
25217
25387
  },
25218
25388
  subCommands: {