@integrity-labs/agt-cli 0.28.351 → 0.28.352

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.
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-KFR2GLKC.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-WMQO3QKU.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-NUGUTMMT.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-KO2HWC7E.js.map
@@ -45,8 +45,9 @@ import {
45
45
  requireHost,
46
46
  resolveEffectivePinRaw,
47
47
  safeWriteJsonAtomic,
48
- setConfigHash
49
- } from "../chunk-F2TH5XVJ.js";
48
+ setConfigHash,
49
+ toOpencodeModel
50
+ } from "../chunk-BERN3B42.js";
50
51
  import {
51
52
  getProjectDir as getProjectDir2,
52
53
  getReadyTasks,
@@ -137,7 +138,7 @@ import {
137
138
  takeZombieDetection,
138
139
  transcriptActivityAgeSeconds,
139
140
  writeEgressAllowlist
140
- } from "../chunk-OEJ35WXL.js";
141
+ } from "../chunk-ZALWFOHO.js";
141
142
  import {
142
143
  reapOrphanChannelMcps
143
144
  } from "../chunk-XWVM4KPK.js";
@@ -1250,12 +1251,25 @@ function parseResumeHealthResponse(raw) {
1250
1251
  // src/lib/model-change-respawn.ts
1251
1252
  function shouldRespawnForModelChange(input) {
1252
1253
  const { previousModel, primaryModel, framework, sessionHealthy } = input;
1253
- if (framework !== "claude-code") return false;
1254
+ if (framework !== "claude-code" && framework !== "opencode") return false;
1254
1255
  if (!sessionHealthy) return false;
1255
1256
  if (!previousModel) return false;
1256
1257
  if (!primaryModel) return false;
1257
1258
  return previousModel !== primaryModel;
1258
1259
  }
1260
+ function decideOpencodeModelRestart(input) {
1261
+ const { previousModel, primaryModel, provisionedModel, onDiskModel, sessionHealthy } = input;
1262
+ if (onDiskModel !== provisionedModel) {
1263
+ return { restart: false, recordModel: false };
1264
+ }
1265
+ const restart = shouldRespawnForModelChange({
1266
+ previousModel,
1267
+ primaryModel,
1268
+ framework: "opencode",
1269
+ sessionHealthy
1270
+ });
1271
+ return { restart, recordModel: true };
1272
+ }
1259
1273
 
1260
1274
  // src/lib/connectivity-probe-runner.ts
1261
1275
  var DEFAULT_INTERVAL_MS = 60 * 60 * 1e3;
@@ -5577,6 +5591,15 @@ function opencodeTmuxSession(codeName) {
5577
5591
  function opencodePaneLogPath(codeName) {
5578
5592
  return join20(homedir10(), ".augmented", codeName, "opencode-serve.log");
5579
5593
  }
5594
+ function readProvisionedOpencodeModel(agentDir) {
5595
+ try {
5596
+ const raw = readFileSync16(join20(agentDir, "provision", "opencode.json"), "utf-8");
5597
+ const parsed = JSON.parse(raw);
5598
+ return typeof parsed.model === "string" ? parsed.model : null;
5599
+ } catch {
5600
+ return null;
5601
+ }
5602
+ }
5580
5603
  function baseUrlFor(port) {
5581
5604
  return `http://127.0.0.1:${port}`;
5582
5605
  }
@@ -5737,6 +5760,21 @@ function getBridge(codeName, port, password) {
5737
5760
  bridges.set(codeName, { port, password, bridge });
5738
5761
  return bridge;
5739
5762
  }
5763
+ function stopOpencodeSession(codeName, log2) {
5764
+ const tmuxSession = opencodeTmuxSession(codeName);
5765
+ try {
5766
+ execSync(`tmux kill-session -t ${tmuxSession} 2>/dev/null`, { stdio: "ignore" });
5767
+ log2(`[opencode-session] stopped '${tmuxSession}' for '${codeName}'`);
5768
+ } catch {
5769
+ }
5770
+ bridges.delete(codeName);
5771
+ const session = sessions.get(codeName);
5772
+ if (session) {
5773
+ session.status = "stopped";
5774
+ session.port = null;
5775
+ session.password = null;
5776
+ }
5777
+ }
5740
5778
  function stripUndefined(env) {
5741
5779
  const out = {};
5742
5780
  for (const [k, v] of Object.entries(env)) if (v !== void 0) out[k] = v;
@@ -9304,7 +9342,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
9304
9342
  var lastVersionCheckAt = 0;
9305
9343
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
9306
9344
  var lastResponsivenessProbeAt = 0;
9307
- var agtCliVersion = true ? "0.28.351" : "dev";
9345
+ var agtCliVersion = true ? "0.28.352" : "dev";
9308
9346
  function resolveBrewPath(execFileSync2) {
9309
9347
  try {
9310
9348
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -10323,7 +10361,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
10323
10361
  if (codeNames.length === 0) return;
10324
10362
  void (async () => {
10325
10363
  try {
10326
- const { collectDiagnostics } = await import("../persistent-session-KFR2GLKC.js");
10364
+ const { collectDiagnostics } = await import("../persistent-session-WMQO3QKU.js");
10327
10365
  await api.post("/host/heartbeat", {
10328
10366
  host_id: hostId,
10329
10367
  agent_diagnostics: collectDiagnostics(codeNames)
@@ -10422,7 +10460,7 @@ async function pollCycle() {
10422
10460
  }
10423
10461
  try {
10424
10462
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
10425
- const { collectDiagnostics } = await import("../persistent-session-KFR2GLKC.js");
10463
+ const { collectDiagnostics } = await import("../persistent-session-WMQO3QKU.js");
10426
10464
  const diagCodeNames = [...agentState.persistentSessionAgents];
10427
10465
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
10428
10466
  let tailscaleHostname;
@@ -10577,7 +10615,7 @@ async function pollCycle() {
10577
10615
  const {
10578
10616
  collectResponsivenessProbes,
10579
10617
  getResponsivenessIntervalMs
10580
- } = await import("../responsiveness-probe-PFPXYTL2.js");
10618
+ } = await import("../responsiveness-probe-TCTSHDH3.js");
10581
10619
  const probeIntervalMs = getResponsivenessIntervalMs();
10582
10620
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
10583
10621
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -10609,7 +10647,7 @@ async function pollCycle() {
10609
10647
  collectResponsivenessProbes,
10610
10648
  livePendingInboundOldestAgeSeconds,
10611
10649
  parkPendingInbound
10612
- } = await import("../responsiveness-probe-PFPXYTL2.js");
10650
+ } = await import("../responsiveness-probe-TCTSHDH3.js");
10613
10651
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-HYOOQV4A.js");
10614
10652
  const wedgeNow = /* @__PURE__ */ new Date();
10615
10653
  const liveAgents = agentState.persistentSessionAgents;
@@ -11584,6 +11622,28 @@ async function processAgent(agent, agentStates) {
11584
11622
  }
11585
11623
  }
11586
11624
  agentState.knownModels.set(agent.agent_id, primaryModel);
11625
+ } else if (primaryModel && frameworkId === "opencode") {
11626
+ const previousModel = agentState.knownModels.get(agent.agent_id);
11627
+ const provisionedModel = toOpencodeModel(primaryModel);
11628
+ const onDiskModel = readProvisionedOpencodeModel(getFramework("opencode").getAgentDir(agent.code_name));
11629
+ const { restart, recordModel } = decideOpencodeModelRestart({
11630
+ previousModel,
11631
+ primaryModel,
11632
+ provisionedModel,
11633
+ onDiskModel,
11634
+ sessionHealthy: isOpencodeSessionHealthy(agent.code_name)
11635
+ });
11636
+ if (restart) {
11637
+ log(
11638
+ `[hot-reload] opencode model changed for '${agent.code_name}': ${previousModel} -> ${primaryModel} - restarting serve`
11639
+ );
11640
+ stopOpencodeSession(agent.code_name, log);
11641
+ } else if (previousModel && previousModel !== primaryModel && onDiskModel !== provisionedModel) {
11642
+ log(
11643
+ `[hot-reload] opencode model change for '${agent.code_name}' deferred: opencode.json shows '${onDiskModel}' not '${provisionedModel}' (provision not yet applied) - retrying next poll`
11644
+ );
11645
+ }
11646
+ if (recordModel) agentState.knownModels.set(agent.agent_id, primaryModel);
11587
11647
  }
11588
11648
  let lastDriftCheckAt = now;
11589
11649
  const written = agentState.writtenHashes.get(agent.agent_id);
@@ -13723,7 +13783,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
13723
13783
  void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
13724
13784
  void (async () => {
13725
13785
  try {
13726
- const { collectDiagnostics } = await import("../persistent-session-KFR2GLKC.js");
13786
+ const { collectDiagnostics } = await import("../persistent-session-WMQO3QKU.js");
13727
13787
  await api.post("/host/heartbeat", {
13728
13788
  host_id: hostId,
13729
13789
  agent_diagnostics: collectDiagnostics([codeName])
@@ -13773,7 +13833,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
13773
13833
  }
13774
13834
  try {
13775
13835
  const hostId = await getHostId();
13776
- const { collectDiagnostics } = await import("../persistent-session-KFR2GLKC.js");
13836
+ const { collectDiagnostics } = await import("../persistent-session-WMQO3QKU.js");
13777
13837
  await api.post("/host/heartbeat", {
13778
13838
  host_id: hostId,
13779
13839
  agent_diagnostics: collectDiagnostics([codeName])
@@ -14271,7 +14331,7 @@ async function processClaudePairSessions(agents) {
14271
14331
  killPairSession,
14272
14332
  pairTmuxSession,
14273
14333
  finalizeClaudePairOnboarding
14274
- } = await import("../claude-pair-runtime-NUGUTMMT.js");
14334
+ } = await import("../claude-pair-runtime-KO2HWC7E.js");
14275
14335
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
14276
14336
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
14277
14337
  const killed = await killPairSession(pairTmuxSession(pairId));