@integrity-labs/agt-cli 0.28.1162 → 0.28.1164

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.
Files changed (28) hide show
  1. package/dist/bin/agt.js +6 -6
  2. package/dist/{chunk-JMA2UNUS.js → chunk-6SIOI32E.js} +5 -5
  3. package/dist/{chunk-QRFACFSH.js → chunk-CHTG2VLG.js} +3 -3
  4. package/dist/{chunk-D55RMQTG.js → chunk-DR7PAO2Y.js} +2 -2
  5. package/dist/{chunk-D55RMQTG.js.map → chunk-DR7PAO2Y.js.map} +1 -1
  6. package/dist/{chunk-CXEP3UC7.js → chunk-J3LCXQGY.js} +2 -2
  7. package/dist/{chunk-3DISC7BU.js → chunk-WPNCOXIB.js} +2 -2
  8. package/dist/{claude-code-updater-DXLSLDHW.js → claude-code-updater-L7C3DZJ3.js} +3 -3
  9. package/dist/{claude-pair-runtime-BCZPQPWP.js → claude-pair-runtime-EQVMQMTF.js} +3 -3
  10. package/dist/lib/manager-worker.js +19 -19
  11. package/dist/mcp/direct-chat-channel.js +75 -21
  12. package/dist/mcp/index.js +1 -1
  13. package/dist/mcp/origami.js +1 -1
  14. package/dist/mcp/slack-channel.js +1 -1
  15. package/dist/mcp/telegram-channel.js +1 -1
  16. package/dist/{persistent-session-XCV7VQWS.js → persistent-session-BP3EXMFT.js} +4 -4
  17. package/dist/{responsiveness-probe-WZVS3U5H.js → responsiveness-probe-ASP2NY2K.js} +4 -4
  18. package/dist/{session-auth-dead-AR7G7XZZ.js → session-auth-dead-KR2CABKC.js} +3 -3
  19. package/package.json +1 -1
  20. /package/dist/{chunk-JMA2UNUS.js.map → chunk-6SIOI32E.js.map} +0 -0
  21. /package/dist/{chunk-QRFACFSH.js.map → chunk-CHTG2VLG.js.map} +0 -0
  22. /package/dist/{chunk-CXEP3UC7.js.map → chunk-J3LCXQGY.js.map} +0 -0
  23. /package/dist/{chunk-3DISC7BU.js.map → chunk-WPNCOXIB.js.map} +0 -0
  24. /package/dist/{claude-code-updater-DXLSLDHW.js.map → claude-code-updater-L7C3DZJ3.js.map} +0 -0
  25. /package/dist/{claude-pair-runtime-BCZPQPWP.js.map → claude-pair-runtime-EQVMQMTF.js.map} +0 -0
  26. /package/dist/{persistent-session-XCV7VQWS.js.map → persistent-session-BP3EXMFT.js.map} +0 -0
  27. /package/dist/{responsiveness-probe-WZVS3U5H.js.map → responsiveness-probe-ASP2NY2K.js.map} +0 -0
  28. /package/dist/{session-auth-dead-AR7G7XZZ.js.map → session-auth-dead-KR2CABKC.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  encodeClaudeProjectPath
3
- } from "./chunk-D55RMQTG.js";
3
+ } from "./chunk-DR7PAO2Y.js";
4
4
 
5
5
  // src/lib/daily-session.ts
6
6
  import { randomUUID } from "crypto";
@@ -235,4 +235,4 @@ export {
235
235
  peekCurrentSession,
236
236
  readDailySessionPin
237
237
  };
238
- //# sourceMappingURL=chunk-CXEP3UC7.js.map
238
+ //# sourceMappingURL=chunk-J3LCXQGY.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-XWVM4KPK.js";
5
5
  import {
6
6
  FORCED_UPDATE_HARD_DEADLINE_MS
7
- } from "./chunk-D55RMQTG.js";
7
+ } from "./chunk-DR7PAO2Y.js";
8
8
  import {
9
9
  effectiveClaudeJsonPath
10
10
  } from "./chunk-EL5MWGGH.js";
@@ -714,4 +714,4 @@ export {
714
714
  probeClaudeInstalls,
715
715
  maybeUpdateClaudeCode
716
716
  };
717
- //# sourceMappingURL=chunk-3DISC7BU.js.map
717
+ //# sourceMappingURL=chunk-WPNCOXIB.js.map
@@ -12,9 +12,9 @@ import {
12
12
  probeClaudeInstalls,
13
13
  readsAsNativeInstall,
14
14
  shouldRunClaudeCodeUpdater
15
- } from "./chunk-3DISC7BU.js";
15
+ } from "./chunk-WPNCOXIB.js";
16
16
  import "./chunk-XWVM4KPK.js";
17
- import "./chunk-D55RMQTG.js";
17
+ import "./chunk-DR7PAO2Y.js";
18
18
  import "./chunk-EL5MWGGH.js";
19
19
  import "./chunk-DGUM43GV.js";
20
20
  export {
@@ -32,4 +32,4 @@ export {
32
32
  readsAsNativeInstall,
33
33
  shouldRunClaudeCodeUpdater
34
34
  };
35
- //# sourceMappingURL=claude-code-updater-DXLSLDHW.js.map
35
+ //# sourceMappingURL=claude-code-updater-L7C3DZJ3.js.map
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  redactPaneFrame,
10
10
  sanitizeTerminalFrame
11
- } from "./chunk-D55RMQTG.js";
11
+ } from "./chunk-DR7PAO2Y.js";
12
12
  import {
13
13
  CLAUDE_CONFIG_DIR_ENV,
14
14
  claudeConfigDirFor,
@@ -321,7 +321,7 @@ async function spawnPairSession(session) {
321
321
  return { ok: true };
322
322
  } catch {
323
323
  }
324
- const { resolveClaudeBinary } = await import("./persistent-session-XCV7VQWS.js");
324
+ const { resolveClaudeBinary } = await import("./persistent-session-BP3EXMFT.js");
325
325
  const claudeBin = resolveClaudeBinary();
326
326
  const pairEnv = {
327
327
  ...process.env,
@@ -836,4 +836,4 @@ export {
836
836
  startClaudePair,
837
837
  submitClaudePairCode
838
838
  };
839
- //# sourceMappingURL=claude-pair-runtime-BCZPQPWP.js.map
839
+ //# sourceMappingURL=claude-pair-runtime-EQVMQMTF.js.map
@@ -77,7 +77,7 @@ import {
77
77
  setConfigHash,
78
78
  shellGuard,
79
79
  tripClass
80
- } from "../chunk-JMA2UNUS.js";
80
+ } from "../chunk-6SIOI32E.js";
81
81
  import {
82
82
  CLAUDE_CODE_SECURITY_FLOOR,
83
83
  SELF_UPDATE_TIMEOUTS,
@@ -90,7 +90,7 @@ import {
90
90
  runSafeCleanup,
91
91
  tightestDiskStat,
92
92
  withPackageCacheLock
93
- } from "../chunk-3DISC7BU.js";
93
+ } from "../chunk-WPNCOXIB.js";
94
94
  import {
95
95
  getProjectDir as getProjectDir2,
96
96
  getReadyTasks,
@@ -177,7 +177,7 @@ import {
177
177
  webFetchBaselineValue,
178
178
  webFetchRestartNeeded,
179
179
  writeEgressAllowlist
180
- } from "../chunk-QRFACFSH.js";
180
+ } from "../chunk-CHTG2VLG.js";
181
181
  import {
182
182
  isAgentIdle,
183
183
  isStaleForToday,
@@ -186,7 +186,7 @@ import {
186
186
  sessionTranscriptDir,
187
187
  subagentActivityAgeSeconds,
188
188
  transcriptActivityAgeSeconds
189
- } from "../chunk-CXEP3UC7.js";
189
+ } from "../chunk-J3LCXQGY.js";
190
190
  import {
191
191
  classifyUnanswerablePane,
192
192
  focusedConfirmDialogBlock,
@@ -304,7 +304,7 @@ import {
304
304
  serializeAccountEnforcementMarker,
305
305
  stabiliseResetInstant,
306
306
  sumTranscriptUsageInWindow
307
- } from "../chunk-D55RMQTG.js";
307
+ } from "../chunk-DR7PAO2Y.js";
308
308
  import {
309
309
  CLAUDE_CONFIG_DIR_ENV,
310
310
  claudeConfigDirFor,
@@ -15082,7 +15082,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
15082
15082
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
15083
15083
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
15084
15084
  async function channelInboundActivityAgeSecondsFor(codeName) {
15085
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-WZVS3U5H.js");
15085
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-ASP2NY2K.js");
15086
15086
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
15087
15087
  if (newest === null) return null;
15088
15088
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -15874,7 +15874,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
15874
15874
  var lastVersionCheckAt = 0;
15875
15875
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
15876
15876
  var lastResponsivenessProbeAt = 0;
15877
- var agtCliVersion = true ? "0.28.1162" : "dev";
15877
+ var agtCliVersion = true ? "0.28.1164" : "dev";
15878
15878
  function resolveBrewPath(execFileSync3) {
15879
15879
  try {
15880
15880
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -17674,7 +17674,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
17674
17674
  if (codeNames.length === 0) return;
17675
17675
  void (async () => {
17676
17676
  try {
17677
- const { collectDiagnostics } = await import("../persistent-session-XCV7VQWS.js");
17677
+ const { collectDiagnostics } = await import("../persistent-session-BP3EXMFT.js");
17678
17678
  await api.post("/host/heartbeat", {
17679
17679
  host_id: hostId,
17680
17680
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -17817,7 +17817,7 @@ async function pollCycleInner() {
17817
17817
  }
17818
17818
  try {
17819
17819
  const { detectHostSecurity } = await import("../host-security-KQYYZZVW.js");
17820
- const { collectDiagnostics } = await import("../persistent-session-XCV7VQWS.js");
17820
+ const { collectDiagnostics } = await import("../persistent-session-BP3EXMFT.js");
17821
17821
  const diagCodeNames = [...agentState.persistentSessionAgents];
17822
17822
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor) : void 0;
17823
17823
  let tailscaleHostname;
@@ -18017,7 +18017,7 @@ async function pollCycleInner() {
18017
18017
  setConfigHash(hbResp?.config_hash ?? null);
18018
18018
  try {
18019
18019
  const desiredClaudeCodeVersion = hbResp?.desired_claude_code_version?.trim();
18020
- const { maybeUpdateClaudeCode, shouldRunClaudeCodeUpdater } = await import("../claude-code-updater-DXLSLDHW.js");
18020
+ const { maybeUpdateClaudeCode, shouldRunClaudeCodeUpdater } = await import("../claude-code-updater-L7C3DZJ3.js");
18021
18021
  claudeUpdaterInFlight = true;
18022
18022
  if (desiredClaudeCodeVersion && (claudePairLoop.busy || claudePairingInProgress())) {
18023
18023
  log(
@@ -18049,7 +18049,7 @@ async function pollCycleInner() {
18049
18049
  collectPanelessActivityProbes,
18050
18050
  getResponsivenessIntervalMs,
18051
18051
  occupancyQualificationClassifications
18052
- } = await import("../responsiveness-probe-WZVS3U5H.js");
18052
+ } = await import("../responsiveness-probe-ASP2NY2K.js");
18053
18053
  const probeIntervalMs = getResponsivenessIntervalMs();
18054
18054
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
18055
18055
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -18166,7 +18166,7 @@ async function pollCycleInner() {
18166
18166
  collectResponsivenessProbes,
18167
18167
  livePendingInboundOldestAgeSeconds,
18168
18168
  parkPendingInbound
18169
- } = await import("../responsiveness-probe-WZVS3U5H.js");
18169
+ } = await import("../responsiveness-probe-ASP2NY2K.js");
18170
18170
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-M6AFZWNU.js");
18171
18171
  const wedgeNow = /* @__PURE__ */ new Date();
18172
18172
  const liveAgents = agentState.persistentSessionAgents;
@@ -18452,7 +18452,7 @@ async function pollCycleInner() {
18452
18452
  }
18453
18453
  }
18454
18454
  );
18455
- const { parkPendingInbound } = await import("../responsiveness-probe-WZVS3U5H.js");
18455
+ const { parkPendingInbound } = await import("../responsiveness-probe-ASP2NY2K.js");
18456
18456
  const { parked, deadLettered } = parkPendingInbound(codeName, new Date(fatalNowMs));
18457
18457
  paneFatalStreak.delete(codeName);
18458
18458
  paneFatalRestarts.set(codeName, [...history, fatalNowMs]);
@@ -18483,7 +18483,7 @@ async function pollCycleInner() {
18483
18483
  TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS,
18484
18484
  bindSourceEscalations
18485
18485
  } = await import("../transcript-mount-health-OHE6IVJV.js");
18486
- const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-XCV7VQWS.js");
18486
+ const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-BP3EXMFT.js");
18487
18487
  const mountConfig = resolveTranscriptMountConfig();
18488
18488
  const liveAgents = agentState.persistentSessionAgents;
18489
18489
  for (const tracked of [
@@ -18648,7 +18648,7 @@ async function pollCycleInner() {
18648
18648
  }
18649
18649
  try {
18650
18650
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-VR5QGP3J.js");
18651
- const { probeSessionAuth } = await import("../session-auth-dead-AR7G7XZZ.js");
18651
+ const { probeSessionAuth } = await import("../session-auth-dead-KR2CABKC.js");
18652
18652
  const observations = [];
18653
18653
  const pendingCacheCommits = [];
18654
18654
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -23316,7 +23316,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
23316
23316
  try {
23317
23317
  const freshId = rotateSessionForWedge(codeName);
23318
23318
  consecutiveWedgeCycles.delete(codeName);
23319
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-WZVS3U5H.js");
23319
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-ASP2NY2K.js");
23320
23320
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
23321
23321
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
23322
23322
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -23359,7 +23359,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
23359
23359
  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}`));
23360
23360
  void (async () => {
23361
23361
  try {
23362
- const { collectDiagnostics } = await import("../persistent-session-XCV7VQWS.js");
23362
+ const { collectDiagnostics } = await import("../persistent-session-BP3EXMFT.js");
23363
23363
  await api.post("/host/heartbeat", {
23364
23364
  host_id: hostId,
23365
23365
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -23410,7 +23410,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
23410
23410
  }
23411
23411
  try {
23412
23412
  const hostId = await getHostId();
23413
- const { collectDiagnostics } = await import("../persistent-session-XCV7VQWS.js");
23413
+ const { collectDiagnostics } = await import("../persistent-session-BP3EXMFT.js");
23414
23414
  await api.post("/host/heartbeat", {
23415
23415
  host_id: hostId,
23416
23416
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -24104,7 +24104,7 @@ async function processClaudePairSessions(agents) {
24104
24104
  snapshotPairConfig,
24105
24105
  // ENG-11659: result -> report body + the manager.log line that records it.
24106
24106
  planPairStartReport
24107
- } = await import("../claude-pair-runtime-BCZPQPWP.js");
24107
+ } = await import("../claude-pair-runtime-EQVMQMTF.js");
24108
24108
  const { resetClaudeSignin, describeSigninResetForLog, describeSigninResetFailure } = await import("../claude-signin-reset-EF3UO5IK.js");
24109
24109
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
24110
24110
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
@@ -19448,10 +19448,10 @@ var require_readdirp = __commonJS({
19448
19448
  }
19449
19449
  async _formatEntry(dirent, path) {
19450
19450
  let entry;
19451
- const basename2 = this._isDirent ? dirent.name : dirent;
19451
+ const basename3 = this._isDirent ? dirent.name : dirent;
19452
19452
  try {
19453
- const fullPath = (0, node_path_1.resolve)((0, node_path_1.join)(path, basename2));
19454
- entry = { path: (0, node_path_1.relative)(this._root, fullPath), fullPath, basename: basename2 };
19453
+ const fullPath = (0, node_path_1.resolve)((0, node_path_1.join)(path, basename3));
19454
+ entry = { path: (0, node_path_1.relative)(this._root, fullPath), fullPath, basename: basename3 };
19455
19455
  entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
19456
19456
  } catch (err) {
19457
19457
  this._onError(err);
@@ -20008,9 +20008,9 @@ var require_handler = __commonJS({
20008
20008
  _watchWithNodeFs(path, listener) {
20009
20009
  const opts = this.fsw.options;
20010
20010
  const directory = sysPath.dirname(path);
20011
- const basename2 = sysPath.basename(path);
20011
+ const basename3 = sysPath.basename(path);
20012
20012
  const parent = this.fsw._getWatchedDir(directory);
20013
- parent.add(basename2);
20013
+ parent.add(basename3);
20014
20014
  const absolutePath = sysPath.resolve(path);
20015
20015
  const options = {
20016
20016
  persistent: opts.persistent
@@ -20020,7 +20020,7 @@ var require_handler = __commonJS({
20020
20020
  let closer;
20021
20021
  if (opts.usePolling) {
20022
20022
  const enableBin = opts.interval !== opts.binaryInterval;
20023
- options.interval = enableBin && isBinaryPath(basename2) ? opts.binaryInterval : opts.interval;
20023
+ options.interval = enableBin && isBinaryPath(basename3) ? opts.binaryInterval : opts.interval;
20024
20024
  closer = setFsWatchFileListener(path, absolutePath, options, {
20025
20025
  listener,
20026
20026
  rawEmitter: this.fsw._emitRaw
@@ -20043,10 +20043,10 @@ var require_handler = __commonJS({
20043
20043
  return;
20044
20044
  }
20045
20045
  const dirname4 = sysPath.dirname(file);
20046
- const basename2 = sysPath.basename(file);
20046
+ const basename3 = sysPath.basename(file);
20047
20047
  const parent = this.fsw._getWatchedDir(dirname4);
20048
20048
  let prevStats = stats;
20049
- if (parent.has(basename2))
20049
+ if (parent.has(basename3))
20050
20050
  return;
20051
20051
  const listener = async (path, newStats) => {
20052
20052
  if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))
@@ -20071,9 +20071,9 @@ var require_handler = __commonJS({
20071
20071
  prevStats = newStats2;
20072
20072
  }
20073
20073
  } catch (error2) {
20074
- this.fsw._remove(dirname4, basename2);
20074
+ this.fsw._remove(dirname4, basename3);
20075
20075
  }
20076
- } else if (parent.has(basename2)) {
20076
+ } else if (parent.has(basename3)) {
20077
20077
  const at = newStats.atimeMs;
20078
20078
  const mt = newStats.mtimeMs;
20079
20079
  if (!at || at <= mt || mt !== prevStats.mtimeMs) {
@@ -45480,7 +45480,7 @@ var FLAG_REGISTRY = [
45480
45480
  },
45481
45481
  {
45482
45482
  key: "ninja-lists",
45483
- description: 'Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Lists" nav item, the /lists pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
45483
+ description: 'Apps, formerly Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Apps" nav item, the /apps pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
45484
45484
  flagType: "boolean",
45485
45485
  // PUBLIC (ADR-0022 §2): the nav shells read it via usePublicBooleanFlag and
45486
45486
  // the pages via getPublicBooleanFlagServer, so it is serialized to the
@@ -47584,6 +47584,16 @@ function probeAgentSessionCached(codeName, ttlMs = SESSION_PROBE_TTL_MS, now = D
47584
47584
  }
47585
47585
 
47586
47586
  // src/direct-chat-poll-guard.ts
47587
+ var SAFETY_NET_POLL_MS = 12e4;
47588
+ var DOORBELL_UNWATCHED_POLL_MS = 3e4;
47589
+ function safetyNetIntervalMs(doorbellWatchAttached) {
47590
+ return doorbellWatchAttached ? SAFETY_NET_POLL_MS : DOORBELL_UNWATCHED_POLL_MS;
47591
+ }
47592
+ function doorbellWatchLost(attachedId, currentId) {
47593
+ if (attachedId === null) return false;
47594
+ return currentId !== attachedId;
47595
+ }
47596
+ var POLL_STUCK_MS = 9e4;
47587
47597
  function evaluatePollGuard(state, nowMs, stuckMs) {
47588
47598
  if (!state.inFlight) return { run: true, stuck: false };
47589
47599
  if (state.leaseUntilMs != null && nowMs < state.leaseUntilMs) return { run: false, stuck: false };
@@ -47640,7 +47650,7 @@ function defaultIsPidAlive(pid) {
47640
47650
  }
47641
47651
  }
47642
47652
  function acquireMcpSpawnLock(args) {
47643
- const { agentDir, basename: basename2, options = {} } = args;
47653
+ const { agentDir, basename: basename3, options = {} } = args;
47644
47654
  if (!agentDir) return { kind: "no-agent-dir" };
47645
47655
  const isPidAlive = options.isPidAlive ?? defaultIsPidAlive;
47646
47656
  const selfPid = options.selfPid ?? process.pid;
@@ -47648,7 +47658,7 @@ function acquireMcpSpawnLock(args) {
47648
47658
  const nowMs = options.nowMs ?? (() => Date.now());
47649
47659
  const lockMtimeMs = options.lockMtimeMs ?? defaultLockMtimeMs;
47650
47660
  const staleMs = options.staleMs ?? STALE_LOCK_MS;
47651
- const path = join13(agentDir, basename2);
47661
+ const path = join13(agentDir, basename3);
47652
47662
  const existing = readLockHolder(path);
47653
47663
  if (existing) {
47654
47664
  if (existing.pid === selfPid) {
@@ -47728,7 +47738,7 @@ function readLockHolder(path) {
47728
47738
 
47729
47739
  // src/direct-chat-channel.ts
47730
47740
  import { homedir as homedir5 } from "os";
47731
- import { join as join17 } from "path";
47741
+ import { basename as basename2, join as join17 } from "path";
47732
47742
  import { randomUUID } from "crypto";
47733
47743
  import {
47734
47744
  watch,
@@ -55169,8 +55179,6 @@ var DOORBELL_ENABLED = resolveHostBooleanFlag({
55169
55179
  defaultValue: false
55170
55180
  });
55171
55181
  var DOORBELL_FILE = "direct-chat-doorbell";
55172
- var SAFETY_NET_POLL_MS = 3e4;
55173
- var POLL_STUCK_MS = 9e4;
55174
55182
  var pollGuard = { inFlight: false, inFlightSinceMs: null, leaseUntilMs: null };
55175
55183
  async function pollOnce(sinceMs) {
55176
55184
  const decision = evaluatePollGuard(pollGuard, Date.now(), POLL_STUCK_MS);
@@ -55193,8 +55201,40 @@ async function pollOnce(sinceMs) {
55193
55201
  }
55194
55202
  }
55195
55203
  var doorbellWatcher = null;
55204
+ function dirInode(path) {
55205
+ if (!path) return null;
55206
+ try {
55207
+ const st = statSync4(path);
55208
+ return `${st.dev}:${st.ino}`;
55209
+ } catch {
55210
+ return null;
55211
+ }
55212
+ }
55196
55213
  var safetyNetTimer = null;
55197
55214
  if (DOORBELL_ENABLED && DIRECT_CHAT_AGENT_DIR) {
55215
+ let safetyNetTick = function() {
55216
+ if (doorbellWatchAttached && doorbellWatchLost(watchedDirIno, dirInode(DIRECT_CHAT_AGENT_DIR))) {
55217
+ degradeDoorbell("the watched directory was removed or replaced");
55218
+ }
55219
+ void pollOnce(sinceMs);
55220
+ }, degradeDoorbell = function(reason) {
55221
+ if (!doorbellWatchAttached) return;
55222
+ doorbellWatchAttached = false;
55223
+ try {
55224
+ doorbellWatcher?.close();
55225
+ } catch {
55226
+ }
55227
+ doorbellWatcher = null;
55228
+ const fallbackMs = safetyNetIntervalMs(false);
55229
+ process.stderr.write(
55230
+ `direct-chat-channel: doorbell watch lost (${reason}) \u2014 falling back to safety-net poll every ${fallbackMs}ms
55231
+ `
55232
+ );
55233
+ if (safetyNetTimer) clearInterval(safetyNetTimer);
55234
+ safetyNetTimer = setInterval(safetyNetTick, fallbackMs);
55235
+ safetyNetTimer.unref?.();
55236
+ };
55237
+ safetyNetTick2 = safetyNetTick, degradeDoorbell2 = degradeDoorbell;
55198
55238
  try {
55199
55239
  mkdirSync7(DIRECT_CHAT_AGENT_DIR, { recursive: true });
55200
55240
  } catch {
@@ -55216,23 +55256,35 @@ if (DOORBELL_ENABLED && DIRECT_CHAT_AGENT_DIR) {
55216
55256
  resetDirectChatClaims(DIRECT_CHAT_CLAIMS_PATH);
55217
55257
  }
55218
55258
  let debounce = null;
55259
+ let doorbellWatchAttached = false;
55219
55260
  try {
55220
- doorbellWatcher = watch(DIRECT_CHAT_AGENT_DIR, (_event, filename) => {
55261
+ const watchedDirName = basename2(DIRECT_CHAT_AGENT_DIR);
55262
+ doorbellWatcher = watch(DIRECT_CHAT_AGENT_DIR, (event, filename) => {
55263
+ if (event === "rename" && filename === watchedDirName) {
55264
+ degradeDoorbell("the watched directory was removed");
55265
+ return;
55266
+ }
55221
55267
  if (filename !== DOORBELL_FILE) return;
55222
55268
  if (debounce) clearTimeout(debounce);
55223
55269
  debounce = setTimeout(() => {
55224
55270
  void pollOnce(sinceMs);
55225
55271
  }, 50);
55226
55272
  });
55273
+ doorbellWatchAttached = true;
55274
+ doorbellWatcher.on("error", (err) => {
55275
+ degradeDoorbell(`watcher error: ${err.message}`);
55276
+ });
55227
55277
  } catch (err) {
55228
55278
  process.stderr.write(
55229
- `direct-chat-channel: doorbell watch failed (${err.message}) \u2014 relying on safety-net poll
55279
+ `direct-chat-channel: doorbell watch failed (${err.message}) \u2014 relying on safety-net poll every ${safetyNetIntervalMs(false)}ms
55230
55280
  `
55231
55281
  );
55232
55282
  }
55283
+ const safetyNetMs = safetyNetIntervalMs(doorbellWatchAttached);
55284
+ const watchedDirIno = doorbellWatchAttached ? dirInode(DIRECT_CHAT_AGENT_DIR) : null;
55233
55285
  safetyNetTimer = setInterval(() => {
55234
- void pollOnce(sinceMs);
55235
- }, SAFETY_NET_POLL_MS);
55286
+ safetyNetTick();
55287
+ }, safetyNetMs);
55236
55288
  safetyNetTimer.unref?.();
55237
55289
  if (sessionState.fresh) {
55238
55290
  void runBacklogDrain({
@@ -55246,7 +55298,7 @@ if (DOORBELL_ENABLED && DIRECT_CHAT_AGENT_DIR) {
55246
55298
  });
55247
55299
  }
55248
55300
  process.stderr.write(
55249
- `direct-chat-channel: Started (agent=${AGT_AGENT_ID}, delivery=doorbell+pull, session=${sessionState.fresh ? "fresh\u2192backlog-drain (unscoped, retried)" : "resumed\u2192new-only"}, new_message_watermark_since=${sinceMs} \u2014 watching ${DOORBELL_FILE}, safety-net ${SAFETY_NET_POLL_MS}ms)
55301
+ `direct-chat-channel: Started (agent=${AGT_AGENT_ID}, delivery=doorbell+pull, session=${sessionState.fresh ? "fresh\u2192backlog-drain (unscoped, retried)" : "resumed\u2192new-only"}, new_message_watermark_since=${sinceMs} \u2014 watching ${DOORBELL_FILE}, safety-net ${safetyNetMs}ms)
55250
55302
  `
55251
55303
  );
55252
55304
  } else {
@@ -55255,6 +55307,8 @@ if (DOORBELL_ENABLED && DIRECT_CHAT_AGENT_DIR) {
55255
55307
  `
55256
55308
  );
55257
55309
  }
55310
+ var safetyNetTick2;
55311
+ var degradeDoorbell2;
55258
55312
  var progressTickTimer = null;
55259
55313
  if (PROGRESS_HEARTBEAT_PATH) {
55260
55314
  progressTickTimer = setInterval(() => {
package/dist/mcp/index.js CHANGED
@@ -31077,7 +31077,7 @@ var FLAG_REGISTRY = [
31077
31077
  },
31078
31078
  {
31079
31079
  key: "ninja-lists",
31080
- description: 'Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Lists" nav item, the /lists pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
31080
+ description: 'Apps, formerly Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Apps" nav item, the /apps pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
31081
31081
  flagType: "boolean",
31082
31082
  // PUBLIC (ADR-0022 §2): the nav shells read it via usePublicBooleanFlag and
31083
31083
  // the pages via getPublicBooleanFlagServer, so it is serialized to the
@@ -44986,7 +44986,7 @@ var FLAG_REGISTRY = [
44986
44986
  },
44987
44987
  {
44988
44988
  key: "ninja-lists",
44989
- description: 'Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Lists" nav item, the /lists pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
44989
+ description: 'Apps, formerly Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Apps" nav item, the /apps pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
44990
44990
  flagType: "boolean",
44991
44991
  // PUBLIC (ADR-0022 §2): the nav shells read it via usePublicBooleanFlag and
44992
44992
  // the pages via getPublicBooleanFlagServer, so it is serialized to the
@@ -39813,7 +39813,7 @@ var FLAG_REGISTRY = [
39813
39813
  },
39814
39814
  {
39815
39815
  key: "ninja-lists",
39816
- description: 'Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Lists" nav item, the /lists pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
39816
+ description: 'Apps, formerly Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Apps" nav item, the /apps pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
39817
39817
  flagType: "boolean",
39818
39818
  // PUBLIC (ADR-0022 §2): the nav shells read it via usePublicBooleanFlag and
39819
39819
  // the pages via getPublicBooleanFlagServer, so it is serialized to the
@@ -40024,7 +40024,7 @@ var FLAG_REGISTRY = [
40024
40024
  },
40025
40025
  {
40026
40026
  key: "ninja-lists",
40027
- description: 'Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Lists" nav item, the /lists pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
40027
+ description: 'Apps, formerly Ninja Lists (ADR-0120): small tables agents and people fill and review together. Gates the "Apps" nav item, the /apps pages AND the /ninja-lists API, per org. Unlike its siblings `projects-menu` / `ninjafy-notes-menu`, this is the whole feature\'s gate, not only its menu entry: the surface is unlaunched, so an org with the flag off gets 404 from the API rather than a hidden link to a working one.',
40028
40028
  flagType: "boolean",
40029
40029
  // PUBLIC (ADR-0022 §2): the nav shells read it via usePublicBooleanFlag and
40030
40030
  // the pages via getPublicBooleanFlagServer, so it is serialized to the
@@ -68,12 +68,12 @@ import {
68
68
  writeDirectChatSessionState,
69
69
  writeEgressAllowlist,
70
70
  writePersistentClaudeWrapper
71
- } from "./chunk-QRFACFSH.js";
72
- import "./chunk-CXEP3UC7.js";
71
+ } from "./chunk-CHTG2VLG.js";
72
+ import "./chunk-J3LCXQGY.js";
73
73
  import "./chunk-B6UYVEMD.js";
74
74
  import "./chunk-OAWK4OBN.js";
75
75
  import "./chunk-XWVM4KPK.js";
76
- import "./chunk-D55RMQTG.js";
76
+ import "./chunk-DR7PAO2Y.js";
77
77
  import "./chunk-EL5MWGGH.js";
78
78
  import "./chunk-DGUM43GV.js";
79
79
  export {
@@ -147,4 +147,4 @@ export {
147
147
  writeEgressAllowlist,
148
148
  writePersistentClaudeWrapper
149
149
  };
150
- //# sourceMappingURL=persistent-session-XCV7VQWS.js.map
150
+ //# sourceMappingURL=persistent-session-BP3EXMFT.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-QRFACFSH.js";
4
- import "./chunk-CXEP3UC7.js";
3
+ } from "./chunk-CHTG2VLG.js";
4
+ import "./chunk-J3LCXQGY.js";
5
5
  import "./chunk-B6UYVEMD.js";
6
6
  import "./chunk-OAWK4OBN.js";
7
7
  import "./chunk-XWVM4KPK.js";
8
- import "./chunk-D55RMQTG.js";
8
+ import "./chunk-DR7PAO2Y.js";
9
9
  import "./chunk-EL5MWGGH.js";
10
10
  import "./chunk-DGUM43GV.js";
11
11
 
@@ -804,4 +804,4 @@ export {
804
804
  readAndResetSlackReplyBindingClassifications,
805
805
  readAndResetSlackReplyTargetClassifications
806
806
  };
807
- //# sourceMappingURL=responsiveness-probe-WZVS3U5H.js.map
807
+ //# sourceMappingURL=responsiveness-probe-ASP2NY2K.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-CXEP3UC7.js";
4
- import "./chunk-D55RMQTG.js";
3
+ } from "./chunk-J3LCXQGY.js";
4
+ import "./chunk-DR7PAO2Y.js";
5
5
  import "./chunk-DGUM43GV.js";
6
6
 
7
7
  // src/lib/session-auth-dead.ts
@@ -205,4 +205,4 @@ export {
205
205
  decideSessionAuthState,
206
206
  probeSessionAuth
207
207
  };
208
- //# sourceMappingURL=session-auth-dead-AR7G7XZZ.js.map
208
+ //# sourceMappingURL=session-auth-dead-KR2CABKC.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.1162",
3
+ "version": "0.28.1164",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {