@integrity-labs/agt-cli 0.28.483 → 0.28.485

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-IBMUPQZ2.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-CEGPLUHO.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-2XPTEGQR.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-STSHUESG.js.map
@@ -44,7 +44,7 @@ import {
44
44
  resolveEffectivePinRaw,
45
45
  safeWriteJsonAtomic,
46
46
  setConfigHash
47
- } from "../chunk-EGVOVL5P.js";
47
+ } from "../chunk-QFQTGSXQ.js";
48
48
  import {
49
49
  getProjectDir as getProjectDir2,
50
50
  getReadyTasks,
@@ -162,7 +162,7 @@ import {
162
162
  toOpencodeModel,
163
163
  transcriptActivityAgeSeconds,
164
164
  writeEgressAllowlist
165
- } from "../chunk-DNC5JGOV.js";
165
+ } from "../chunk-SRR5XVWJ.js";
166
166
  import {
167
167
  reapOrphanChannelMcps
168
168
  } from "../chunk-XWVM4KPK.js";
@@ -10064,7 +10064,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
10064
10064
  var lastVersionCheckAt = 0;
10065
10065
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
10066
10066
  var lastResponsivenessProbeAt = 0;
10067
- var agtCliVersion = true ? "0.28.483" : "dev";
10067
+ var agtCliVersion = true ? "0.28.485" : "dev";
10068
10068
  function resolveBrewPath(execFileSync2) {
10069
10069
  try {
10070
10070
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -11227,7 +11227,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
11227
11227
  if (codeNames.length === 0) return;
11228
11228
  void (async () => {
11229
11229
  try {
11230
- const { collectDiagnostics } = await import("../persistent-session-IBMUPQZ2.js");
11230
+ const { collectDiagnostics } = await import("../persistent-session-CEGPLUHO.js");
11231
11231
  await api.post("/host/heartbeat", {
11232
11232
  host_id: hostId,
11233
11233
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor)
@@ -11334,7 +11334,7 @@ async function pollCycle() {
11334
11334
  }
11335
11335
  try {
11336
11336
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
11337
- const { collectDiagnostics } = await import("../persistent-session-IBMUPQZ2.js");
11337
+ const { collectDiagnostics } = await import("../persistent-session-CEGPLUHO.js");
11338
11338
  const diagCodeNames = [...agentState.persistentSessionAgents];
11339
11339
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor) : void 0;
11340
11340
  let tailscaleHostname;
@@ -11448,7 +11448,7 @@ async function pollCycle() {
11448
11448
  collectResponsivenessProbes,
11449
11449
  collectPanelessActivityProbes,
11450
11450
  getResponsivenessIntervalMs
11451
- } = await import("../responsiveness-probe-QBLQIMZR.js");
11451
+ } = await import("../responsiveness-probe-RBLOTOHD.js");
11452
11452
  const probeIntervalMs = getResponsivenessIntervalMs();
11453
11453
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
11454
11454
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -11512,7 +11512,7 @@ async function pollCycle() {
11512
11512
  collectResponsivenessProbes,
11513
11513
  livePendingInboundOldestAgeSeconds,
11514
11514
  parkPendingInbound
11515
- } = await import("../responsiveness-probe-QBLQIMZR.js");
11515
+ } = await import("../responsiveness-probe-RBLOTOHD.js");
11516
11516
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
11517
11517
  const wedgeNow = /* @__PURE__ */ new Date();
11518
11518
  const liveAgents = agentState.persistentSessionAgents;
@@ -14988,7 +14988,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
14988
14988
  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}`));
14989
14989
  void (async () => {
14990
14990
  try {
14991
- const { collectDiagnostics } = await import("../persistent-session-IBMUPQZ2.js");
14991
+ const { collectDiagnostics } = await import("../persistent-session-CEGPLUHO.js");
14992
14992
  await api.post("/host/heartbeat", {
14993
14993
  host_id: hostId,
14994
14994
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
@@ -15038,7 +15038,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
15038
15038
  }
15039
15039
  try {
15040
15040
  const hostId = await getHostId();
15041
- const { collectDiagnostics } = await import("../persistent-session-IBMUPQZ2.js");
15041
+ const { collectDiagnostics } = await import("../persistent-session-CEGPLUHO.js");
15042
15042
  await api.post("/host/heartbeat", {
15043
15043
  host_id: hostId,
15044
15044
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
@@ -15496,7 +15496,7 @@ async function processClaudePairSessions(agents) {
15496
15496
  killPairSession,
15497
15497
  pairTmuxSession,
15498
15498
  finalizeClaudePairOnboarding
15499
- } = await import("../claude-pair-runtime-2XPTEGQR.js");
15499
+ } = await import("../claude-pair-runtime-STSHUESG.js");
15500
15500
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
15501
15501
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
15502
15502
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -30218,7 +30218,7 @@ function recordChannelDeflection(agentDir, channel, cause) {
30218
30218
  }
30219
30219
 
30220
30220
  // src/turn-failure-watch.ts
30221
- import { readFileSync as readFileSync9, readdirSync as readdirSync5, statSync as statSync2 } from "fs";
30221
+ import { readdirSync as readdirSync5, statSync as statSync2 } from "fs";
30222
30222
  import { join as join9 } from "path";
30223
30223
 
30224
30224
  // ../core/dist/types/integration.js
@@ -33208,18 +33208,27 @@ var INTEGRATION_REGISTRY = [
33208
33208
  id: "firecrawl",
33209
33209
  name: "Firecrawl",
33210
33210
  category: "knowledge",
33211
- description: "Web data for agents: scrape, map, crawl and search any website for clean structured data, plus scheduled change-detection monitors whose updates arrive in the agent's direct-chat. Augmented Team manages Firecrawl access for you - there is no key to enter.",
33211
+ description: "Web data for agents: scrape, map, crawl and search any website for clean structured data, plus scheduled change-detection monitors whose updates arrive in the agent's direct-chat. Connect via the platform-managed account, or bring your own Firecrawl API key.",
33212
33212
  // ENG-7217: Firecrawl migrates from a customer-API-key stdio MCP
33213
33213
  // (`npx firecrawl-mcp`, FIRECRAWL_API_KEY) to a PREMIUM, platform-managed
33214
33214
  // integration on the Deck / ElevenLabs model (ADR-0031, epic ENG-6920):
33215
33215
  // Augmented holds ONE Firecrawl account key (`FIRECRAWL_ACCOUNT_KEY`) that
33216
- // every customer agent's web-data calls bill back to, so the key is a single
33217
- // platform-held secret, NOT a per-agent credential. Auth type is therefore
33218
- // `none` - customers never enter a key. The agent-facing tools are brokered
33219
- // server-side (firecrawl-broker.ts, reusing the official @mendable/firecrawl-js
33220
- // SDK) rather than via the stdio MCP, so usage can be metered at the one
33221
- // control-plane chokepoint and gated on a per-org opt-in + monthly USD cap.
33222
- supported_auth_types: ["none"],
33216
+ // every customer agent's web-data calls bill back to. The agent-facing tools
33217
+ // are brokered server-side (firecrawl-broker.ts, reusing the official
33218
+ // @mendable/firecrawl-js SDK) rather than via the stdio MCP, so managed usage
33219
+ // is metered at the one control-plane chokepoint and gated on a per-org opt-in
33220
+ // + monthly USD cap.
33221
+ //
33222
+ // ENG-8304 / ADR-0055 (Phase 1b — Firecrawl is the BYO exemplar): `api_key` is
33223
+ // now also offered so a customer can bring their OWN Firecrawl key. A BYO
33224
+ // install (`credential_source='byo'`) authenticates with the customer's key
33225
+ // (stored encrypted on the install) and is NOT metered — its upstream cost is
33226
+ // on the customer's own Firecrawl bill. BYO is gated on the plan-tier
33227
+ // `byo_credentials` entitlement; managed stays the platform-key, billed path.
33228
+ // `api_key` is the BYO option; the connect UI offers it via the toolkit's
33229
+ // `auth_types` seed (Firecrawl surfaces through the premium list, not the
33230
+ // native `installable` picker — that descriptor is for non-premium natives).
33231
+ supported_auth_types: ["none", "api_key"],
33223
33232
  capabilities: [
33224
33233
  { id: "firecrawl:scrape", name: "Scrape Pages", description: "Fetch a single URL as clean markdown / structured data (firecrawl_scrape).", access: "write" },
33225
33234
  { id: "firecrawl:search", name: "Web Search", description: "Search the web and return ranked results, optionally scraped (firecrawl_search).", access: "write" },
@@ -35352,11 +35361,77 @@ function deriveBindFailureQuarantineThreshold(provisioningMax) {
35352
35361
  var MIN_PROVISIONING_MAX_FOR_QUARANTINE_ORDERING = BIND_FAILURE_QUARANTINE_THRESHOLD + 1;
35353
35362
 
35354
35363
  // src/rate-limit-watch.ts
35355
- import { readFileSync as readFileSync8, readdirSync as readdirSync4, statSync } from "fs";
35364
+ import { closeSync, fstatSync, openSync, readSync, readdirSync as readdirSync4, statSync } from "fs";
35356
35365
  import { homedir as homedir2 } from "os";
35357
35366
  import { join as join8 } from "path";
35358
35367
  var DEFAULT_WATCH_MS = 5e3;
35359
35368
  var DEFAULT_POLL_MS = 400;
35369
+ var INITIAL_TAIL_BYTES = 256 * 1024;
35370
+ var TAIL_WIDEN_FACTOR = 8;
35371
+ var TAIL_SKEW_TOLERANCE_MS = 5 * 6e4;
35372
+ function readClassifiableTail(path, sinceMs, opts) {
35373
+ let want = Math.max(1, opts?.initialBytes ?? INITIAL_TAIL_BYTES);
35374
+ for (; ; ) {
35375
+ const slice = readTailSlice(path, want);
35376
+ if (slice === null) return "";
35377
+ if (slice.fromStart) return slice.text;
35378
+ const oldest = oldestTimestampMs(slice.text);
35379
+ if (oldest !== null && oldest < sinceMs - TAIL_SKEW_TOLERANCE_MS) return slice.text;
35380
+ want *= TAIL_WIDEN_FACTOR;
35381
+ }
35382
+ }
35383
+ function readTailSlice(path, bytes) {
35384
+ let fd;
35385
+ try {
35386
+ fd = openSync(path, "r");
35387
+ } catch {
35388
+ return null;
35389
+ }
35390
+ try {
35391
+ const size = fstatSync(fd).size;
35392
+ const start = size > bytes ? size - bytes : 0;
35393
+ const len = size - start;
35394
+ if (len <= 0) return { text: "", fromStart: true };
35395
+ const buf = Buffer.allocUnsafe(len);
35396
+ let read = 0;
35397
+ while (read < len) {
35398
+ const n = readSync(fd, buf, read, len - read, start + read);
35399
+ if (n <= 0) break;
35400
+ read += n;
35401
+ }
35402
+ if (read < len) return null;
35403
+ let text = buf.subarray(0, read).toString("utf-8");
35404
+ if (start > 0) {
35405
+ const nl = text.indexOf("\n");
35406
+ text = nl === -1 ? "" : text.slice(nl + 1);
35407
+ }
35408
+ return { text, fromStart: start === 0 };
35409
+ } catch {
35410
+ return null;
35411
+ } finally {
35412
+ closeSync(fd);
35413
+ }
35414
+ }
35415
+ function oldestTimestampMs(text) {
35416
+ let idx = 0;
35417
+ while (idx < text.length) {
35418
+ const nl = text.indexOf("\n", idx);
35419
+ const line = (nl === -1 ? text.slice(idx) : text.slice(idx, nl)).trim();
35420
+ if (line) {
35421
+ try {
35422
+ const ts = JSON.parse(line).timestamp;
35423
+ if (typeof ts === "string") {
35424
+ const ms = new Date(ts).getTime();
35425
+ if (Number.isFinite(ms)) return ms;
35426
+ }
35427
+ } catch {
35428
+ }
35429
+ }
35430
+ if (nl === -1) break;
35431
+ idx = nl + 1;
35432
+ }
35433
+ return null;
35434
+ }
35360
35435
  function agentTranscriptDir(opts) {
35361
35436
  const cwd = opts?.cwd ?? process.cwd();
35362
35437
  const home = opts?.home ?? homedir2();
@@ -35380,12 +35455,10 @@ function classifyTranscriptSince(opts) {
35380
35455
  } catch {
35381
35456
  continue;
35382
35457
  }
35383
- let content;
35384
- try {
35385
- content = readFileSync8(path, "utf-8");
35386
- } catch {
35387
- continue;
35388
- }
35458
+ const content = readClassifiableTail(path, opts.sinceMs, {
35459
+ ...opts.initialTailBytes != null ? { initialBytes: opts.initialTailBytes } : {}
35460
+ });
35461
+ if (!content) continue;
35389
35462
  newest = pickNewerClassification(
35390
35463
  newest,
35391
35464
  classifyTranscriptRateLimit(content, opts.sinceMs, opts.nowMs, new Date(opts.nowMs))
@@ -35463,12 +35536,8 @@ function classifyTurnFailureSince(opts) {
35463
35536
  if (cached2 && cached2.fingerprint === fingerprint) {
35464
35537
  scan = cached2.scan;
35465
35538
  } else {
35466
- let content;
35467
- try {
35468
- content = readFileSync9(path, "utf-8");
35469
- } catch {
35470
- continue;
35471
- }
35539
+ const content = readClassifiableTail(path, opts.sinceMs);
35540
+ if (!content) continue;
35472
35541
  const analysis = analyzeTranscriptTurnFailure(content, opts.sinceMs, opts.nowMs);
35473
35542
  scan = {
35474
35543
  result: analysis.result,
@@ -35637,7 +35706,7 @@ async function fetchWithTimeout(input, init, timeoutMs, fetchImpl = fetch) {
35637
35706
  import {
35638
35707
  existsSync as existsSync5,
35639
35708
  mkdirSync as mkdirSync4,
35640
- readFileSync as readFileSync10,
35709
+ readFileSync as readFileSync8,
35641
35710
  renameSync as renameSync4,
35642
35711
  statSync as statSync3,
35643
35712
  unlinkSync as unlinkSync3,
@@ -35734,7 +35803,7 @@ function defaultLockMtimeMs(path) {
35734
35803
  function readLockHolder(path) {
35735
35804
  if (!existsSync5(path)) return null;
35736
35805
  try {
35737
- const raw = readFileSync10(path, "utf8");
35806
+ const raw = readFileSync8(path, "utf8");
35738
35807
  const parsed = JSON.parse(raw);
35739
35808
  const pid = typeof parsed.pid === "number" ? parsed.pid : Number(parsed.pid);
35740
35809
  if (!Number.isFinite(pid) || pid <= 0) return null;
@@ -35753,7 +35822,7 @@ import {
35753
35822
  watch,
35754
35823
  mkdirSync as mkdirSync5,
35755
35824
  writeFileSync as writeFileSync6,
35756
- readFileSync as readFileSync12,
35825
+ readFileSync as readFileSync10,
35757
35826
  readdirSync as readdirSync6,
35758
35827
  existsSync as existsSync6,
35759
35828
  renameSync as renameSync5,
@@ -36186,7 +36255,7 @@ function isMaintenanceModeActive(opts) {
36186
36255
  }
36187
36256
 
36188
36257
  // src/account-enforcement-notice.ts
36189
- import { readFileSync as readFileSync11 } from "fs";
36258
+ import { readFileSync as readFileSync9 } from "fs";
36190
36259
  import { homedir as homedir3 } from "os";
36191
36260
  import { join as join12 } from "path";
36192
36261
 
@@ -36213,7 +36282,7 @@ function readAccountEnforcementLevel(opts) {
36213
36282
  if (!path) return null;
36214
36283
  let raw;
36215
36284
  try {
36216
- raw = readFileSync11(path, "utf-8");
36285
+ raw = readFileSync9(path, "utf-8");
36217
36286
  } catch {
36218
36287
  return null;
36219
36288
  }
@@ -36352,7 +36421,7 @@ var directChatKanbanCardClient = createKanbanCardActiveClient({
36352
36421
  function readProgressHeartbeat() {
36353
36422
  if (!PROGRESS_HEARTBEAT_PATH || !existsSync6(PROGRESS_HEARTBEAT_PATH)) return null;
36354
36423
  try {
36355
- return parseProgressHeartbeat(readFileSync12(PROGRESS_HEARTBEAT_PATH, "utf-8"));
36424
+ return parseProgressHeartbeat(readFileSync10(PROGRESS_HEARTBEAT_PATH, "utf-8"));
36356
36425
  } catch {
36357
36426
  return null;
36358
36427
  }
@@ -37319,7 +37388,7 @@ function sweepAgedDirectChatMarkersNow(thresholdMs) {
37319
37388
  const now = Date.now();
37320
37389
  const res = sweepAgedDirectChatMarkers(DIRECT_CHAT_PENDING_INBOUND_DIR, {
37321
37390
  readdir: (dir) => readdirSync6(dir),
37322
- readFile: (p2) => readFileSync12(p2, "utf8"),
37391
+ readFile: (p2) => readFileSync10(p2, "utf8"),
37323
37392
  unlink: (p2) => {
37324
37393
  if (existsSync6(p2)) unlinkSync4(p2);
37325
37394
  },
@@ -37355,7 +37424,7 @@ function sanitizeRecoveryText(text) {
37355
37424
  }
37356
37425
  function directChatRecoveryDeps() {
37357
37426
  return {
37358
- readFile: (p2) => readFileSync12(p2, "utf-8"),
37427
+ readFile: (p2) => readFileSync10(p2, "utf-8"),
37359
37428
  renameFile: (from, to) => renameSync5(from, to),
37360
37429
  unlinkFile: (p2) => {
37361
37430
  if (existsSync6(p2)) unlinkSync4(p2);
@@ -39535,18 +39535,27 @@ var INTEGRATION_REGISTRY = [
39535
39535
  id: "firecrawl",
39536
39536
  name: "Firecrawl",
39537
39537
  category: "knowledge",
39538
- description: "Web data for agents: scrape, map, crawl and search any website for clean structured data, plus scheduled change-detection monitors whose updates arrive in the agent's direct-chat. Augmented Team manages Firecrawl access for you - there is no key to enter.",
39538
+ description: "Web data for agents: scrape, map, crawl and search any website for clean structured data, plus scheduled change-detection monitors whose updates arrive in the agent's direct-chat. Connect via the platform-managed account, or bring your own Firecrawl API key.",
39539
39539
  // ENG-7217: Firecrawl migrates from a customer-API-key stdio MCP
39540
39540
  // (`npx firecrawl-mcp`, FIRECRAWL_API_KEY) to a PREMIUM, platform-managed
39541
39541
  // integration on the Deck / ElevenLabs model (ADR-0031, epic ENG-6920):
39542
39542
  // Augmented holds ONE Firecrawl account key (`FIRECRAWL_ACCOUNT_KEY`) that
39543
- // every customer agent's web-data calls bill back to, so the key is a single
39544
- // platform-held secret, NOT a per-agent credential. Auth type is therefore
39545
- // `none` - customers never enter a key. The agent-facing tools are brokered
39546
- // server-side (firecrawl-broker.ts, reusing the official @mendable/firecrawl-js
39547
- // SDK) rather than via the stdio MCP, so usage can be metered at the one
39548
- // control-plane chokepoint and gated on a per-org opt-in + monthly USD cap.
39549
- supported_auth_types: ["none"],
39543
+ // every customer agent's web-data calls bill back to. The agent-facing tools
39544
+ // are brokered server-side (firecrawl-broker.ts, reusing the official
39545
+ // @mendable/firecrawl-js SDK) rather than via the stdio MCP, so managed usage
39546
+ // is metered at the one control-plane chokepoint and gated on a per-org opt-in
39547
+ // + monthly USD cap.
39548
+ //
39549
+ // ENG-8304 / ADR-0055 (Phase 1b — Firecrawl is the BYO exemplar): `api_key` is
39550
+ // now also offered so a customer can bring their OWN Firecrawl key. A BYO
39551
+ // install (`credential_source='byo'`) authenticates with the customer's key
39552
+ // (stored encrypted on the install) and is NOT metered — its upstream cost is
39553
+ // on the customer's own Firecrawl bill. BYO is gated on the plan-tier
39554
+ // `byo_credentials` entitlement; managed stays the platform-key, billed path.
39555
+ // `api_key` is the BYO option; the connect UI offers it via the toolkit's
39556
+ // `auth_types` seed (Firecrawl surfaces through the premium list, not the
39557
+ // native `installable` picker — that descriptor is for non-premium natives).
39558
+ supported_auth_types: ["none", "api_key"],
39550
39559
  capabilities: [
39551
39560
  { id: "firecrawl:scrape", name: "Scrape Pages", description: "Fetch a single URL as clean markdown / structured data (firecrawl_scrape).", access: "write" },
39552
39561
  { id: "firecrawl:search", name: "Web Search", description: "Search the web and return ranked results, optionally scraped (firecrawl_search).", access: "write" },