@integrity-labs/agt-cli 0.28.678 → 0.28.679

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/bin/agt.js CHANGED
@@ -40,10 +40,10 @@ import {
40
40
  success,
41
41
  table,
42
42
  warn
43
- } from "../chunk-3PCP5NT2.js";
43
+ } from "../chunk-CLNFPTVG.js";
44
44
  import {
45
45
  readDirectChatSessionState
46
- } from "../chunk-LTOGVWUR.js";
46
+ } from "../chunk-HLJKOJVJ.js";
47
47
  import {
48
48
  AnchorSessionClient,
49
49
  CHANNEL_REGISTRY,
@@ -73,7 +73,7 @@ import {
73
73
  requiredMcpWildcard,
74
74
  resolveChannels,
75
75
  serializeManifestForSlackCli
76
- } from "../chunk-5DHJE2G7.js";
76
+ } from "../chunk-GDT7JHV6.js";
77
77
  import "../chunk-XWVM4KPK.js";
78
78
 
79
79
  // src/bin/agt.ts
@@ -4909,7 +4909,7 @@ import { execFileSync, execSync } from "child_process";
4909
4909
  import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
4910
4910
  import chalk18 from "chalk";
4911
4911
  import ora16 from "ora";
4912
- var cliVersion = true ? "0.28.678" : "dev";
4912
+ var cliVersion = true ? "0.28.679" : "dev";
4913
4913
  async function fetchLatestVersion() {
4914
4914
  const host2 = getHost();
4915
4915
  if (!host2) return null;
@@ -6089,7 +6089,7 @@ function handleError(err) {
6089
6089
  }
6090
6090
 
6091
6091
  // src/bin/agt.ts
6092
- var cliVersion2 = true ? "0.28.678" : "dev";
6092
+ var cliVersion2 = true ? "0.28.679" : "dev";
6093
6093
  var program = new Command();
6094
6094
  program.name("agt").description("Augmented CLI \u2014 agent provisioning and management").version(cliVersion2).option("--json", "Emit machine-readable JSON output (suppress spinners and colors)").option("--skip-update-check", "Skip the automatic update check on startup");
6095
6095
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -12,7 +12,7 @@ import {
12
12
  parseEnvFileEntries,
13
13
  parseEnvIntegrations,
14
14
  shellQuote
15
- } from "./chunk-LTOGVWUR.js";
15
+ } from "./chunk-HLJKOJVJ.js";
16
16
  import {
17
17
  BIND_FAILURE_QUARANTINE_THRESHOLD,
18
18
  INTEGRATIONS_SECTION_END,
@@ -59,7 +59,7 @@ import {
59
59
  resolveConnectivityProbe,
60
60
  worseConnectivityOutcome,
61
61
  wrapScheduledTaskPrompt
62
- } from "./chunk-5DHJE2G7.js";
62
+ } from "./chunk-GDT7JHV6.js";
63
63
  import {
64
64
  parsePsRows
65
65
  } from "./chunk-XWVM4KPK.js";
@@ -6445,7 +6445,7 @@ function exchangeFailureKind(err) {
6445
6445
  }
6446
6446
 
6447
6447
  // src/lib/api-client.ts
6448
- var agtCliVersion = true ? "0.28.678" : "dev";
6448
+ var agtCliVersion = true ? "0.28.679" : "dev";
6449
6449
  var lastConfigHash = null;
6450
6450
  function setConfigHash(hash) {
6451
6451
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -10187,4 +10187,4 @@ export {
10187
10187
  managerInstallSystemUnitCommand,
10188
10188
  managerUninstallSystemUnitCommand
10189
10189
  };
10190
- //# sourceMappingURL=chunk-3PCP5NT2.js.map
10190
+ //# sourceMappingURL=chunk-CLNFPTVG.js.map
@@ -12546,4 +12546,4 @@ export {
12546
12546
  minutesSinceLocalMidnight,
12547
12547
  peekCurrentSession
12548
12548
  };
12549
- //# sourceMappingURL=chunk-5DHJE2G7.js.map
12549
+ //# sourceMappingURL=chunk-GDT7JHV6.js.map
@@ -17,7 +17,7 @@ import {
17
17
  rotateDailySession,
18
18
  sessionFileExists,
19
19
  todayLocalIso
20
- } from "./chunk-5DHJE2G7.js";
20
+ } from "./chunk-GDT7JHV6.js";
21
21
  import {
22
22
  reapOrphanChannelMcps
23
23
  } from "./chunk-XWVM4KPK.js";
@@ -4531,4 +4531,4 @@ export {
4531
4531
  stopAllSessionsAndWait,
4532
4532
  getProjectDir
4533
4533
  };
4534
- //# sourceMappingURL=chunk-LTOGVWUR.js.map
4534
+ //# sourceMappingURL=chunk-HLJKOJVJ.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-EZEYH3PM.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-GQZQWMJU.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-X6CWJNW2.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-5UDCBIB7.js.map
@@ -55,7 +55,7 @@ import {
55
55
  setConfigHash,
56
56
  setSecretFileTmpfsBacking,
57
57
  tripClass
58
- } from "../chunk-3PCP5NT2.js";
58
+ } from "../chunk-CLNFPTVG.js";
59
59
  import {
60
60
  getProjectDir as getProjectDir2,
61
61
  getReadyTasks,
@@ -113,7 +113,7 @@ import {
113
113
  takeZombieDetection,
114
114
  toOpencodeModel,
115
115
  writeEgressAllowlist
116
- } from "../chunk-LTOGVWUR.js";
116
+ } from "../chunk-HLJKOJVJ.js";
117
117
  import {
118
118
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
119
119
  AnchorSessionClient,
@@ -194,7 +194,7 @@ import {
194
194
  subagentActivityAgeSeconds,
195
195
  sumTranscriptUsageInWindow,
196
196
  transcriptActivityAgeSeconds
197
- } from "../chunk-5DHJE2G7.js";
197
+ } from "../chunk-GDT7JHV6.js";
198
198
  import {
199
199
  reapOrphanChannelMcps
200
200
  } from "../chunk-XWVM4KPK.js";
@@ -11712,7 +11712,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11712
11712
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11713
11713
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11714
11714
  async function channelInboundActivityAgeSecondsFor(codeName) {
11715
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-VS6GODYP.js");
11715
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-QKKOHDHF.js");
11716
11716
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
11717
11717
  if (newest === null) return null;
11718
11718
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12360,7 +12360,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12360
12360
  var lastVersionCheckAt = 0;
12361
12361
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12362
12362
  var lastResponsivenessProbeAt = 0;
12363
- var agtCliVersion = true ? "0.28.678" : "dev";
12363
+ var agtCliVersion = true ? "0.28.679" : "dev";
12364
12364
  function resolveBrewPath(execFileSync3) {
12365
12365
  try {
12366
12366
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13821,7 +13821,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13821
13821
  if (codeNames.length === 0) return;
13822
13822
  void (async () => {
13823
13823
  try {
13824
- const { collectDiagnostics } = await import("../persistent-session-EZEYH3PM.js");
13824
+ const { collectDiagnostics } = await import("../persistent-session-GQZQWMJU.js");
13825
13825
  await api.post("/host/heartbeat", {
13826
13826
  host_id: hostId,
13827
13827
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13938,7 +13938,7 @@ async function pollCycleInner() {
13938
13938
  }
13939
13939
  try {
13940
13940
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13941
- const { collectDiagnostics } = await import("../persistent-session-EZEYH3PM.js");
13941
+ const { collectDiagnostics } = await import("../persistent-session-GQZQWMJU.js");
13942
13942
  const diagCodeNames = [...agentState.persistentSessionAgents];
13943
13943
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13944
13944
  let tailscaleHostname;
@@ -14090,7 +14090,7 @@ async function pollCycleInner() {
14090
14090
  collectPanelessActivityProbes,
14091
14091
  getResponsivenessIntervalMs,
14092
14092
  occupancyQualificationClassifications
14093
- } = await import("../responsiveness-probe-VS6GODYP.js");
14093
+ } = await import("../responsiveness-probe-QKKOHDHF.js");
14094
14094
  const probeIntervalMs = getResponsivenessIntervalMs();
14095
14095
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
14096
14096
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -14200,7 +14200,7 @@ async function pollCycleInner() {
14200
14200
  collectResponsivenessProbes,
14201
14201
  livePendingInboundOldestAgeSeconds,
14202
14202
  parkPendingInbound
14203
- } = await import("../responsiveness-probe-VS6GODYP.js");
14203
+ } = await import("../responsiveness-probe-QKKOHDHF.js");
14204
14204
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
14205
14205
  const wedgeNow = /* @__PURE__ */ new Date();
14206
14206
  const liveAgents = agentState.persistentSessionAgents;
@@ -14356,7 +14356,7 @@ async function pollCycleInner() {
14356
14356
  }
14357
14357
  try {
14358
14358
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
14359
- const { probeSessionAuth } = await import("../session-auth-dead-7U24PZZS.js");
14359
+ const { probeSessionAuth } = await import("../session-auth-dead-CUEBDRZU.js");
14360
14360
  const observations = [];
14361
14361
  const pendingCacheCommits = [];
14362
14362
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -18117,7 +18117,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
18117
18117
  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}`));
18118
18118
  void (async () => {
18119
18119
  try {
18120
- const { collectDiagnostics } = await import("../persistent-session-EZEYH3PM.js");
18120
+ const { collectDiagnostics } = await import("../persistent-session-GQZQWMJU.js");
18121
18121
  await api.post("/host/heartbeat", {
18122
18122
  host_id: hostId,
18123
18123
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18168,7 +18168,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
18168
18168
  }
18169
18169
  try {
18170
18170
  const hostId = await getHostId();
18171
- const { collectDiagnostics } = await import("../persistent-session-EZEYH3PM.js");
18171
+ const { collectDiagnostics } = await import("../persistent-session-GQZQWMJU.js");
18172
18172
  await api.post("/host/heartbeat", {
18173
18173
  host_id: hostId,
18174
18174
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18800,7 +18800,7 @@ async function processClaudePairSessions(agents) {
18800
18800
  killPairSession,
18801
18801
  pairTmuxSession,
18802
18802
  finalizeClaudePairOnboarding
18803
- } = await import("../claude-pair-runtime-X6CWJNW2.js");
18803
+ } = await import("../claude-pair-runtime-5UDCBIB7.js");
18804
18804
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
18805
18805
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
18806
18806
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -37038,6 +37038,30 @@ var BLOCKED_ON_ME_SECTION_NOTE = "_Another agent has PARKED its own work until y
37038
37038
  var HUMAN_ASSIGNED_SECTION_HEADING = "Assigned to a person (not yours to action)";
37039
37039
  var HUMAN_ASSIGNED_SECTION_NOTE = "_These belong to a person, not to you. You cannot move, note or complete them \u2014 every kanban write is refused. If the work is finished (or was never really theirs), use `kanban_recall` to pull the card back onto your board, then close it as normal._";
37040
37040
 
37041
+ // src/kanban-peek-render.ts
37042
+ var PEEK_RENDER_COLUMNS = [
37043
+ ["in_progress", "in progress"],
37044
+ ["todo", "todo"],
37045
+ ["backlog", "backlog"],
37046
+ ["waiting", "waiting"],
37047
+ ["needs_attention", "needs attention"]
37048
+ ];
37049
+ function formatPeekAge(ageHours) {
37050
+ if (!Number.isFinite(ageHours) || ageHours <= 0) return "<1h";
37051
+ if (ageHours < 48) return `${Math.floor(ageHours)}h`;
37052
+ return `${Math.floor(ageHours / 24)}d`;
37053
+ }
37054
+ function renderKanbanPeek(data, fallbackTeam) {
37055
+ const parts = PEEK_RENDER_COLUMNS.map(([key, label]) => {
37056
+ const count = data[key];
37057
+ const oldest = data.oldest?.[key];
37058
+ const age = oldest === void 0 ? "" : ` (oldest ${formatPeekAge(oldest.age_hours)}, id ${oldest.card_id})`;
37059
+ return `${label}: ${count}${age}`;
37060
+ });
37061
+ const where = data.cross_team ? ` on team ${data.target_team ?? fallbackTeam ?? "?"}` : "";
37062
+ return `${data.target_agent}${where} \u2014 ${parts.join(" \xB7 ")}`;
37063
+ }
37064
+
37041
37065
  // src/kanban-person-waiting-kind.ts
37042
37066
  function isPersonWaitingKindMcp(kind) {
37043
37067
  if (kind === void 0 || kind === null || kind === "") return true;
@@ -44570,6 +44594,64 @@ server.tool(
44570
44594
  }
44571
44595
  }
44572
44596
  );
44597
+ server.tool(
44598
+ "kanban_peek",
44599
+ "Look at ANOTHER agent's board WITHOUT seeing what is on it: how many cards sit in each column, and how long the oldest card in each column has been sitting there. Use it before routing work with kanban_assign, to tell an agent that is genuinely free from one that is buried, and to spot a board where something has been rotting for days. You get NUMBERS ONLY \u2014 no titles, descriptions, results or notes ever cross between agents, so this tells you the SHAPE of their queue, never its content. A deep board is not automatically a problem and an empty one is not automatically fine: the age of the oldest card is usually the more useful of the two. By default the target must be an agent on your OWN team; pass `target_team` to peek across teams in your organization, which works only where your org has enabled cross-team assignment and a peer grant links the teams \u2014 otherwise it reads as not-found, exactly like kanban_assign. Don't know the agent's code_name? Call directory_lookup first.",
44600
+ {
44601
+ target_agent: external_exports.string().describe(
44602
+ "The agent whose board you want to size up: their agent code_name (kebab-case) or agent UUID. On your own team unless target_team is also set."
44603
+ ),
44604
+ target_team: external_exports.string().trim().min(1).optional().describe(
44605
+ "Optional: the slug (or UUID) of ANOTHER team in your organization, to peek across teams. Omit for a teammate on your own team. Requires the org to have cross-team assignment enabled and a peer grant; otherwise the target reads as not-found."
44606
+ )
44607
+ },
44608
+ async (params) => {
44609
+ try {
44610
+ const data = await apiPost(
44611
+ "/host/kanban/peek",
44612
+ {
44613
+ agent_id: AGT_AGENT_ID,
44614
+ target_agent: params.target_agent,
44615
+ // Only sent when peeking across teams — the route branches on its
44616
+ // presence, so omit it for the same-team path (identical contract to
44617
+ // kanban_assign). The schema rejects empty strings, so a present value
44618
+ // is always meaningful; check presence, not truthiness.
44619
+ ...params.target_team !== void 0 ? { target_team: params.target_team } : {}
44620
+ },
44621
+ false,
44622
+ 15e3,
44623
+ "kanban_peek",
44624
+ // Genuinely read-only: a timeout or transport error here can never have
44625
+ // committed anything, and saying so keeps the retry decision obvious.
44626
+ true
44627
+ );
44628
+ return {
44629
+ content: [
44630
+ {
44631
+ type: "text",
44632
+ // Rendering lives in a sibling module so it is reachable by a test —
44633
+ // importing this file boots the stdio server, so anything inline
44634
+ // here is checked exactly once, on the day it is written.
44635
+ text: renderKanbanPeek(data, params.target_team)
44636
+ }
44637
+ ]
44638
+ };
44639
+ } catch (err) {
44640
+ const msg = err instanceof Error ? err.message : String(err);
44641
+ const notFound = /returned 404/.test(msg);
44642
+ const notFoundText = params.target_team ? `Could not peek: no agent "${params.target_agent}" reachable on team "${params.target_team}". Check the team slug and agent code_name, and note cross-team access only works when your org has enabled it and a peer grant links the teams.` : `Could not peek: no agent "${params.target_agent}" found on your team. Check the code_name and make sure they're a teammate on the same team.`;
44643
+ return {
44644
+ content: [
44645
+ {
44646
+ type: "text",
44647
+ text: notFound ? notFoundText : `Could not peek at ${params.target_agent}: ${msg}`
44648
+ }
44649
+ ],
44650
+ isError: true
44651
+ };
44652
+ }
44653
+ }
44654
+ );
44573
44655
  server.tool(
44574
44656
  "kanban_reassign",
44575
44657
  "Move an EXISTING kanban card to ANOTHER agent\u2019s board, preserving its id, history, comments, priority and status. Use this to re-home a task you already have (e.g. you picked up a card but it\u2019s really another specialist\u2019s job) - it removes the card from the current board and places the same card on the target agent\u2019s board. This is different from kanban_assign, which CREATES a new card. The card must currently live on your team. To move across teams in your organization, also pass `target_team` (same cross-team rules as kanban_assign). Don\u2019t know the agent code_name or team slug? Call directory_lookup first.",
@@ -46357,6 +46439,8 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
46357
46439
  "kanban_recall",
46358
46440
  // ENG-9050: the return path for delegated work.
46359
46441
  "kanban_reopen",
46442
+ // ENG-9375: the READ path over a teammate's board (counts only).
46443
+ "kanban_peek",
46360
46444
  // ENG-6953: agent + people directory lookup (always registered locally).
46361
46445
  "directory_lookup",
46362
46446
  "status_standup",
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-LTOGVWUR.js";
47
- import "./chunk-5DHJE2G7.js";
46
+ } from "./chunk-HLJKOJVJ.js";
47
+ import "./chunk-GDT7JHV6.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-EZEYH3PM.js.map
95
+ //# sourceMappingURL=persistent-session-GQZQWMJU.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-LTOGVWUR.js";
4
- import "./chunk-5DHJE2G7.js";
3
+ } from "./chunk-HLJKOJVJ.js";
4
+ import "./chunk-GDT7JHV6.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -727,4 +727,4 @@ export {
727
727
  readAndResetSlackReplyBindingClassifications,
728
728
  readAndResetSlackReplyTargetClassifications
729
729
  };
730
- //# sourceMappingURL=responsiveness-probe-VS6GODYP.js.map
730
+ //# sourceMappingURL=responsiveness-probe-QKKOHDHF.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-5DHJE2G7.js";
3
+ } from "./chunk-GDT7JHV6.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-7U24PZZS.js.map
206
+ //# sourceMappingURL=session-auth-dead-CUEBDRZU.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.678",
3
+ "version": "0.28.679",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {