@integrity-labs/agt-cli 0.24.6 → 0.24.7

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.
@@ -8,7 +8,7 @@ import {
8
8
  parseDeliveryTarget,
9
9
  registerFramework,
10
10
  wrapScheduledTaskPrompt
11
- } from "./chunk-ECDTRQLA.js";
11
+ } from "./chunk-53TCAGCM.js";
12
12
 
13
13
  // ../../packages/core/dist/integrations/registry.js
14
14
  var INTEGRATION_REGISTRY = [
@@ -6710,4 +6710,4 @@ export {
6710
6710
  managerInstallSystemUnitCommand,
6711
6711
  managerUninstallSystemUnitCommand
6712
6712
  };
6713
- //# sourceMappingURL=chunk-VMHT2DM7.js.map
6713
+ //# sourceMappingURL=chunk-FK6BJWEC.js.map
@@ -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-JUJY46HW.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-XJYOPFIP.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-ZQAJOQPN.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-4F53C7RB.js.map
@@ -12,7 +12,7 @@ import {
12
12
  provisionOrientHook,
13
13
  provisionStopHook,
14
14
  requireHost
15
- } from "../chunk-VMHT2DM7.js";
15
+ } from "../chunk-FK6BJWEC.js";
16
16
  import {
17
17
  findTaskByTemplate,
18
18
  getProjectDir as getProjectDir2,
@@ -48,13 +48,15 @@ import {
48
48
  stopAllSessionsAndWait,
49
49
  stopPersistentSession,
50
50
  takeZombieDetection
51
- } from "../chunk-PNTLQKLO.js";
51
+ } from "../chunk-3A2PMQM4.js";
52
52
  import {
53
53
  KANBAN_CHECK_COMMAND,
54
54
  appendDmFooter,
55
+ attributeTranscriptUsageByRun,
55
56
  classifyOutput,
56
57
  extractFrontmatter,
57
58
  formatActorId,
59
+ formatRunMarker,
58
60
  getFramework,
59
61
  isEmptyTotals,
60
62
  isParseError,
@@ -66,7 +68,7 @@ import {
66
68
  resolveChannels,
67
69
  resolveDmTarget,
68
70
  wrapScheduledTaskPrompt
69
- } from "../chunk-ECDTRQLA.js";
71
+ } from "../chunk-53TCAGCM.js";
70
72
 
71
73
  // src/lib/manager-worker.ts
72
74
  import { createHash as createHash3 } from "crypto";
@@ -757,6 +759,7 @@ async function maybeReportTokenUsage(args) {
757
759
  return;
758
760
  }
759
761
  const pending = [];
762
+ const pendingRuns = [];
760
763
  for (const name of dirEntries) {
761
764
  if (!name.endsWith(".jsonl")) continue;
762
765
  const sessionId = name.slice(0, -".jsonl".length);
@@ -800,6 +803,18 @@ async function maybeReportTokenUsage(args) {
800
803
  }
801
804
  });
802
805
  }
806
+ for (const r of attributeTranscriptUsageByRun(content).perRunModel) {
807
+ if (r.runId === null || isEmptyTotals(r.totals)) continue;
808
+ pendingRuns.push({
809
+ run_id: r.runId,
810
+ model: r.model,
811
+ input_tokens: r.totals.inputTokens,
812
+ output_tokens: r.totals.outputTokens,
813
+ cache_creation_tokens: r.totals.cacheCreationTokens,
814
+ cache_read_tokens: r.totals.cacheReadTokens,
815
+ last_observed_at: parsed.lastObservedAt
816
+ });
817
+ }
803
818
  if (![...parsed.byModel.values()].some((t) => !isEmptyTotals(t))) {
804
819
  files.set(sessionId, fp);
805
820
  }
@@ -826,6 +841,19 @@ async function maybeReportTokenUsage(args) {
826
841
  log2(`[token-usage] POST failed for '${codeName}': ${err.message}`);
827
842
  }
828
843
  }
844
+ for (let i = 0; i < pendingRuns.length; i += MAX_ENTRIES_PER_POST) {
845
+ const batch = pendingRuns.slice(i, i + MAX_ENTRIES_PER_POST);
846
+ try {
847
+ await api2.post("/host/run-token-usage", {
848
+ agent_id: agentId,
849
+ framework: "claude-code",
850
+ source: "transcript_jsonl",
851
+ entries: batch
852
+ });
853
+ } catch (err) {
854
+ log2(`[token-usage] run-usage POST failed for '${codeName}': ${err.message}`);
855
+ }
856
+ }
829
857
  if (reported > 0) {
830
858
  log2(`[token-usage] reported ${reported} entr${reported === 1 ? "y" : "ies"} for '${codeName}'`);
831
859
  }
@@ -2666,6 +2694,7 @@ function stopPersistentSessionAndForgetMcpBaseline(codeName, breakerReason) {
2666
2694
  stopPersistentSession(codeName, log);
2667
2695
  runningMcpHashes.delete(codeName);
2668
2696
  runningMcpServerKeys.delete(codeName);
2697
+ closeInjectedRunIfOpen(codeName, "cancelled", `session stopped (${breakerReason ?? "deprovision"})`);
2669
2698
  if (breakerReason) {
2670
2699
  recordRestartForBreaker(codeName, breakerReason);
2671
2700
  }
@@ -2809,7 +2838,7 @@ var cachedFrameworkVersion = null;
2809
2838
  var lastVersionCheckAt = 0;
2810
2839
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
2811
2840
  var lastResponsivenessProbeAt = 0;
2812
- var agtCliVersion = true ? "0.24.6" : "dev";
2841
+ var agtCliVersion = true ? "0.24.7" : "dev";
2813
2842
  function resolveBrewPath(execFileSync4) {
2814
2843
  try {
2815
2844
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -3768,7 +3797,7 @@ async function pollCycle() {
3768
3797
  }
3769
3798
  try {
3770
3799
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
3771
- const { collectDiagnostics } = await import("../persistent-session-JUJY46HW.js");
3800
+ const { collectDiagnostics } = await import("../persistent-session-XJYOPFIP.js");
3772
3801
  const diagCodeNames = [...persistentSessionAgents];
3773
3802
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
3774
3803
  let tailscaleHostname;
@@ -3819,7 +3848,7 @@ async function pollCycle() {
3819
3848
  const {
3820
3849
  collectResponsivenessProbes,
3821
3850
  getResponsivenessIntervalMs
3822
- } = await import("../responsiveness-probe-XOEC7J5D.js");
3851
+ } = await import("../responsiveness-probe-EWZNGMTX.js");
3823
3852
  const probeIntervalMs = getResponsivenessIntervalMs();
3824
3853
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
3825
3854
  const probeCodeNames = [...persistentSessionAgents];
@@ -5095,7 +5124,9 @@ async function processAgent(agent, agentStates) {
5095
5124
  const actionableCount = hybridBoard.filter(
5096
5125
  (i) => HYBRID_ACTIONABLE_STATUSES.has(i.status)
5097
5126
  ).length;
5098
- void maybeInjectKanbanCheck(agent.code_name, actionableCount);
5127
+ void maybeInjectKanbanCheck(agent.code_name, agent.agent_id, actionableCount);
5128
+ } else {
5129
+ closeInjectedRunIfOpen(agent.code_name, "completed", "kanban board drained");
5099
5130
  }
5100
5131
  }
5101
5132
  if (agentFw === "claude-code" && sessionMode === "persistent") {
@@ -6678,13 +6709,23 @@ function hasHybridActionableItems(items) {
6678
6709
  return items.some((item) => HYBRID_ACTIONABLE_STATUSES.has(item.status));
6679
6710
  }
6680
6711
  var lastKanbanInjectAt = /* @__PURE__ */ new Map();
6712
+ var openInjectedRunByCode = /* @__PURE__ */ new Map();
6713
+ function isSlashCommand(command) {
6714
+ return command.trimStart().startsWith("/");
6715
+ }
6716
+ function closeInjectedRunIfOpen(codeName, outcome, outcomeMessage) {
6717
+ const runId = openInjectedRunByCode.get(codeName);
6718
+ if (!runId) return;
6719
+ openInjectedRunByCode.delete(codeName);
6720
+ void finishRun(runId, outcome, { outcomeMessage });
6721
+ }
6681
6722
  var KANBAN_HYBRID_DEBOUNCE_MS = (() => {
6682
6723
  const raw = process.env["AGT_KANBAN_HYBRID_DEBOUNCE_SECONDS"];
6683
6724
  const parsed = raw ? parseInt(raw, 10) : NaN;
6684
6725
  if (Number.isFinite(parsed) && parsed > 0) return Math.max(parsed, 10) * 1e3;
6685
6726
  return 6e4;
6686
6727
  })();
6687
- async function maybeInjectKanbanCheck(codeName, actionableCount) {
6728
+ async function maybeInjectKanbanCheck(codeName, agentId, actionableCount) {
6688
6729
  const lastAt = lastKanbanInjectAt.get(codeName) ?? 0;
6689
6730
  if (Date.now() - lastAt < KANBAN_HYBRID_DEBOUNCE_MS) {
6690
6731
  return;
@@ -6703,13 +6744,30 @@ async function maybeInjectKanbanCheck(codeName, actionableCount) {
6703
6744
  lastKanbanInjectAt.delete(codeName);
6704
6745
  return;
6705
6746
  }
6706
- const sent = sendToAgent(tmuxSession, KANBAN_CHECK_COMMAND);
6707
- if (sent) {
6747
+ closeInjectedRunIfOpen(codeName, "completed", "kanban inject superseded by next inject");
6748
+ const { run_id } = await startRun({
6749
+ agent_id: agentId,
6750
+ source_type: "kanban",
6751
+ metadata: { injected: "kanban-check", actionable_count: actionableCount }
6752
+ });
6753
+ let delivered;
6754
+ if (isSlashCommand(KANBAN_CHECK_COMMAND)) {
6755
+ delivered = sendToAgent(tmuxSession, KANBAN_CHECK_COMMAND);
6756
+ } else {
6757
+ const content = run_id ? `${KANBAN_CHECK_COMMAND}
6758
+ ${formatRunMarker(run_id)}` : KANBAN_CHECK_COMMAND;
6759
+ delivered = await injectMessage(codeName, "system", content, void 0, log);
6760
+ }
6761
+ if (delivered) {
6762
+ if (run_id) openInjectedRunByCode.set(codeName, run_id);
6708
6763
  log(
6709
- `[manager-worker] Injected kanban check for '${codeName}' (${actionableCount} actionable items)`
6764
+ `[manager-worker] Injected kanban check for '${codeName}' (${actionableCount} actionable items)${run_id ? ` run_id=${run_id}` : ""}`
6710
6765
  );
6711
6766
  } else {
6712
- log(`[manager-worker] kanban inject failed (tmux send) for '${codeName}'`);
6767
+ if (run_id) {
6768
+ void finishRun(run_id, "failed", { outcomeMessage: "kanban inject delivery failed" });
6769
+ }
6770
+ log(`[manager-worker] kanban inject failed for '${codeName}'`);
6713
6771
  }
6714
6772
  }
6715
6773
  function warnOnConflictingKanbanModes() {
@@ -7561,7 +7619,7 @@ async function processClaudePairSessions(agents) {
7561
7619
  killPairSession,
7562
7620
  pairTmuxSession,
7563
7621
  finalizeClaudePairOnboarding
7564
- } = await import("../claude-pair-runtime-ZQAJOQPN.js");
7622
+ } = await import("../claude-pair-runtime-4F53C7RB.js");
7565
7623
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
7566
7624
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
7567
7625
  const killed = await killPairSession(pairTmuxSession(pairId));