@integrity-labs/agt-cli 0.28.793 → 0.28.795

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-MEXNOIDP.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-QY4Q45VM.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-4HEEAXSO.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-FPLEFK4P.js.map
@@ -58,7 +58,7 @@ import {
58
58
  safeWriteJsonAtomic,
59
59
  setConfigHash,
60
60
  tripClass
61
- } from "../chunk-TYKVGDNI.js";
61
+ } from "../chunk-PHQQM44E.js";
62
62
  import {
63
63
  getProjectDir as getProjectDir2,
64
64
  getReadyTasks,
@@ -122,7 +122,7 @@ import {
122
122
  takeZombieDetection,
123
123
  toOpencodeModel,
124
124
  writeEgressAllowlist
125
- } from "../chunk-3T7VL4PY.js";
125
+ } from "../chunk-FWMZ2SLT.js";
126
126
  import {
127
127
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
128
128
  AnchorSessionClient,
@@ -214,7 +214,7 @@ import {
214
214
  subagentActivityAgeSeconds,
215
215
  sumTranscriptUsageInWindow,
216
216
  transcriptActivityAgeSeconds
217
- } from "../chunk-6DWVW3Y3.js";
217
+ } from "../chunk-UKFIAO43.js";
218
218
  import {
219
219
  reapOrphanChannelMcps
220
220
  } from "../chunk-XWVM4KPK.js";
@@ -12917,7 +12917,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
12917
12917
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
12918
12918
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
12919
12919
  async function channelInboundActivityAgeSecondsFor(codeName) {
12920
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-CK4Z2AYM.js");
12920
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-DCLY6FKF.js");
12921
12921
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
12922
12922
  if (newest === null) return null;
12923
12923
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13577,7 +13577,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13577
13577
  var lastVersionCheckAt = 0;
13578
13578
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13579
13579
  var lastResponsivenessProbeAt = 0;
13580
- var agtCliVersion = true ? "0.28.793" : "dev";
13580
+ var agtCliVersion = true ? "0.28.795" : "dev";
13581
13581
  function resolveBrewPath(execFileSync2) {
13582
13582
  try {
13583
13583
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15124,7 +15124,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15124
15124
  if (codeNames.length === 0) return;
15125
15125
  void (async () => {
15126
15126
  try {
15127
- const { collectDiagnostics } = await import("../persistent-session-MEXNOIDP.js");
15127
+ const { collectDiagnostics } = await import("../persistent-session-QY4Q45VM.js");
15128
15128
  await api.post("/host/heartbeat", {
15129
15129
  host_id: hostId,
15130
15130
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15265,7 +15265,7 @@ async function pollCycleInner() {
15265
15265
  }
15266
15266
  try {
15267
15267
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15268
- const { collectDiagnostics } = await import("../persistent-session-MEXNOIDP.js");
15268
+ const { collectDiagnostics } = await import("../persistent-session-QY4Q45VM.js");
15269
15269
  const diagCodeNames = [...agentState.persistentSessionAgents];
15270
15270
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15271
15271
  let tailscaleHostname;
@@ -15434,7 +15434,7 @@ async function pollCycleInner() {
15434
15434
  collectPanelessActivityProbes,
15435
15435
  getResponsivenessIntervalMs,
15436
15436
  occupancyQualificationClassifications
15437
- } = await import("../responsiveness-probe-CK4Z2AYM.js");
15437
+ } = await import("../responsiveness-probe-DCLY6FKF.js");
15438
15438
  const probeIntervalMs = getResponsivenessIntervalMs();
15439
15439
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15440
15440
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15551,7 +15551,7 @@ async function pollCycleInner() {
15551
15551
  collectResponsivenessProbes,
15552
15552
  livePendingInboundOldestAgeSeconds,
15553
15553
  parkPendingInbound
15554
- } = await import("../responsiveness-probe-CK4Z2AYM.js");
15554
+ } = await import("../responsiveness-probe-DCLY6FKF.js");
15555
15555
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15556
15556
  const wedgeNow = /* @__PURE__ */ new Date();
15557
15557
  const liveAgents = agentState.persistentSessionAgents;
@@ -15707,7 +15707,7 @@ async function pollCycleInner() {
15707
15707
  }
15708
15708
  try {
15709
15709
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
15710
- const { probeSessionAuth } = await import("../session-auth-dead-4GZDGAWS.js");
15710
+ const { probeSessionAuth } = await import("../session-auth-dead-NKW22VWF.js");
15711
15711
  const observations = [];
15712
15712
  const pendingCacheCommits = [];
15713
15713
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -19808,7 +19808,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
19808
19808
  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}`));
19809
19809
  void (async () => {
19810
19810
  try {
19811
- const { collectDiagnostics } = await import("../persistent-session-MEXNOIDP.js");
19811
+ const { collectDiagnostics } = await import("../persistent-session-QY4Q45VM.js");
19812
19812
  await api.post("/host/heartbeat", {
19813
19813
  host_id: hostId,
19814
19814
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -19854,7 +19854,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
19854
19854
  }
19855
19855
  try {
19856
19856
  const hostId = await getHostId();
19857
- const { collectDiagnostics } = await import("../persistent-session-MEXNOIDP.js");
19857
+ const { collectDiagnostics } = await import("../persistent-session-QY4Q45VM.js");
19858
19858
  await api.post("/host/heartbeat", {
19859
19859
  host_id: hostId,
19860
19860
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20490,7 +20490,7 @@ async function processClaudePairSessions(agents) {
20490
20490
  killPairSession,
20491
20491
  pairTmuxSession,
20492
20492
  finalizeClaudePairOnboarding
20493
- } = await import("../claude-pair-runtime-4HEEAXSO.js");
20493
+ } = await import("../claude-pair-runtime-FPLEFK4P.js");
20494
20494
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
20495
20495
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
20496
20496
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -46833,13 +46833,22 @@ server.tool(
46833
46833
  };
46834
46834
  }
46835
46835
  );
46836
+ var ROUTINE_CADENCE_GUESS = external_exports.enum(["hourly", "daily", "weekdays", "weekly", "unknown"]).describe(
46837
+ 'Best guess at the cadence the user asked for. Use "hourly" ONLY for once-per-hour - for hourly, `at` supplies only the MINUTE past the hour, and any hour in it is ignored. Anything SUB-hourly ("every 15 minutes", "every 5 minutes") cannot be proposed here: do not pick the nearest option, and do not omit cadence_guess either (that compiles to DAILY). Tell the person this surface cannot express it, and let them decide - a routine that fires 4x an hour less often than they asked, accepted because the card said something plausible, is worse than not proposing one.'
46838
+ );
46836
46839
  server.tool(
46837
46840
  "routine_propose",
46838
- "Propose a recurring ROUTINE the user just asked you to take on. The platform sends them an accept/decline offer; on acceptance it creates the routine and its schedule with full lifecycle (hand-back anytime, approval ramp). Prefer this over schedule_create for recurring responsibilities. If the user named a time, pass it as `at` - the reply tells you the schedule that was actually compiled, so check it matches what they asked for before you go quiet.",
46841
+ 'Propose a recurring ROUTINE the user just asked you to take on. The platform sends them an accept/decline offer; on acceptance it creates the routine and its schedule with full lifecycle (hand-back anytime, approval ramp). Prefer this over schedule_create for recurring responsibilities. If the user named a time, pass it as `at` - the reply tells you the schedule that was actually compiled, so check it matches what they asked for before you go quiet. For a routine with MORE THAN ONE cadence (e.g. "check hourly, but only report once a day"), use `schedules` instead of the flat cadence_guess/at/day_of_week - one entry per role, each with its own cadence.',
46839
46842
  {
46840
46843
  name: external_exports.string().describe('Short routine name (e.g. "Morning inbox summary")'),
46841
46844
  description: external_exports.string().describe("What the routine does, self-contained (this text is shown to the user and becomes the routine prompt basis)"),
46842
- cadence_guess: external_exports.enum(["daily", "weekdays", "weekly", "unknown"]).optional().describe("Best guess at the cadence the user asked for"),
46845
+ // ENG-9843: 'hourly' is here because nothing faster than daily could be
46846
+ // expressed, so every hourly routine was proposed wrong and retimed by hand
46847
+ // after acceptance - which inverts the accept card, the one moment a human
46848
+ // reviews what they are agreeing to.
46849
+ cadence_guess: ROUTINE_CADENCE_GUESS.optional().describe(
46850
+ ROUTINE_CADENCE_GUESS.description + " Omit this (and `at`/`day_of_week`) if you are sending `schedules` instead."
46851
+ ),
46843
46852
  // ENG-9393: the time and weekday used to be inexpressible here, so a
46844
46853
  // routine asked for at 08:00 was created at 09:00 and the requested time
46845
46854
  // survived only inside `description`, where nothing reads it.
@@ -46847,11 +46856,27 @@ server.tool(
46847
46856
  'The time of day it should run, as 24-hour "HH:MM" (e.g. "08:00", "16:30"). Defaults to 09:00. State it whenever the user named a time - writing the time in the description does NOT schedule it, the description is prose and nothing reads it.'
46848
46857
  ),
46849
46858
  timezone: external_exports.string().optional().describe(
46850
- `IANA timezone the time is in (e.g. "Australia/Melbourne"). Defaults to YOUR configured timezone, which is almost always what you want - pass this only when the routine must run on someone else's clock.`
46859
+ 'IANA timezone the time is in (e.g. "Australia/Melbourne"). Defaults to YOUR configured timezone, which is almost always what you want - pass this only when the routine must run on someone else\'s clock. Shared across every entry in `schedules` too - one routine, one clock.'
46851
46860
  ),
46852
- day_of_week: external_exports.number().int().min(0).max(6).optional().describe('For cadence_guess "weekly" only: 0 = Sunday .. 6 = Saturday. Defaults to Monday.')
46861
+ day_of_week: external_exports.number().int().min(0).max(6).optional().describe('For cadence_guess "weekly" only: 0 = Sunday .. 6 = Saturday. Defaults to Monday.'),
46862
+ // ENG-9843: a routine that needs more than one cadence - hourly execute
46863
+ // plus a once-a-day report is the canonical case. Mutually exclusive with
46864
+ // cadence_guess/at/day_of_week above (the route 400s if you send both);
46865
+ // put each schedule's own timing inside its entry here instead.
46866
+ schedules: external_exports.array(
46867
+ external_exports.object({
46868
+ role: external_exports.enum(["execute", "progress", "daily-report", "weekly-report"]).describe(
46869
+ '"execute" does the actual work and is REQUIRED, exactly once. "progress" / "daily-report" / "weekly-report" are cheap narrations of what execute already did - they do not redo the work, they report on it, so only add one if the user actually wants a separate check-in on a different cadence from the work itself.'
46870
+ ),
46871
+ cadence_guess: ROUTINE_CADENCE_GUESS.optional(),
46872
+ at: external_exports.string().optional().describe(`This entry's time of day, "HH:MM". Defaults to 09:00.`),
46873
+ day_of_week: external_exports.number().int().min(0).max(6).optional().describe(`This entry's weekday, for cadence_guess "weekly" only: 0 = Sunday .. 6 = Saturday.`)
46874
+ })
46875
+ ).optional().describe(
46876
+ 'A schedule per role, for a routine that runs on more than one cadence. Exactly one entry must have role "execute". Example: hourly execute plus a daily report at 17:00 - [{role:"execute", cadence_guess:"hourly"}, {role:"daily-report", cadence_guess:"daily", at:"17:00"}]. Omit entirely for a routine with one job on one cadence and use the flat cadence_guess/at/day_of_week instead - simpler, and what most routines want.'
46877
+ )
46853
46878
  },
46854
- async ({ name, description, cadence_guess, at, timezone, day_of_week }) => {
46879
+ async ({ name, description, cadence_guess, at, timezone, day_of_week, schedules }) => {
46855
46880
  let data;
46856
46881
  try {
46857
46882
  data = await apiPost("/host/routines/propose", {
@@ -46861,7 +46886,8 @@ server.tool(
46861
46886
  ...cadence_guess ? { cadence_guess } : {},
46862
46887
  ...at ? { at } : {},
46863
46888
  ...timezone ? { timezone } : {},
46864
- ...day_of_week !== void 0 ? { day_of_week } : {}
46889
+ ...day_of_week !== void 0 ? { day_of_week } : {},
46890
+ ...schedules ? { schedules } : {}
46865
46891
  });
46866
46892
  } catch (err) {
46867
46893
  return { content: [{ type: "text", text: `Could not propose: ${err.message}` }] };
@@ -49,8 +49,8 @@ import {
49
49
  writeDirectChatSessionState,
50
50
  writeEgressAllowlist,
51
51
  writePersistentClaudeWrapper
52
- } from "./chunk-3T7VL4PY.js";
53
- import "./chunk-6DWVW3Y3.js";
52
+ } from "./chunk-FWMZ2SLT.js";
53
+ import "./chunk-UKFIAO43.js";
54
54
  import "./chunk-XWVM4KPK.js";
55
55
  export {
56
56
  EGRESS_BASELINE_DOMAINS,
@@ -104,4 +104,4 @@ export {
104
104
  writeEgressAllowlist,
105
105
  writePersistentClaudeWrapper
106
106
  };
107
- //# sourceMappingURL=persistent-session-MEXNOIDP.js.map
107
+ //# sourceMappingURL=persistent-session-QY4Q45VM.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-3T7VL4PY.js";
4
- import "./chunk-6DWVW3Y3.js";
3
+ } from "./chunk-FWMZ2SLT.js";
4
+ import "./chunk-UKFIAO43.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -745,4 +745,4 @@ export {
745
745
  readAndResetSlackReplyBindingClassifications,
746
746
  readAndResetSlackReplyTargetClassifications
747
747
  };
748
- //# sourceMappingURL=responsiveness-probe-CK4Z2AYM.js.map
748
+ //# sourceMappingURL=responsiveness-probe-DCLY6FKF.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-6DWVW3Y3.js";
3
+ } from "./chunk-UKFIAO43.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-4GZDGAWS.js.map
206
+ //# sourceMappingURL=session-auth-dead-NKW22VWF.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.793",
3
+ "version": "0.28.795",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {