@integrity-labs/agt-cli 0.28.772 → 0.28.773

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-NUVUR3PB.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-E4AHQHRA.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-Z7JFVKIY.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-5ULX4UVC.js.map
@@ -58,7 +58,7 @@ import {
58
58
  safeWriteJsonAtomic,
59
59
  setConfigHash,
60
60
  tripClass
61
- } from "../chunk-SBAX57SN.js";
61
+ } from "../chunk-UVA7VXG4.js";
62
62
  import {
63
63
  getProjectDir as getProjectDir2,
64
64
  getReadyTasks,
@@ -120,7 +120,7 @@ import {
120
120
  takeZombieDetection,
121
121
  toOpencodeModel,
122
122
  writeEgressAllowlist
123
- } from "../chunk-R6XGVTQS.js";
123
+ } from "../chunk-UL2W5NY6.js";
124
124
  import {
125
125
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
126
126
  AnchorSessionClient,
@@ -209,7 +209,7 @@ import {
209
209
  subagentActivityAgeSeconds,
210
210
  sumTranscriptUsageInWindow,
211
211
  transcriptActivityAgeSeconds
212
- } from "../chunk-UPSDSMNC.js";
212
+ } from "../chunk-75UAJFJJ.js";
213
213
  import {
214
214
  reapOrphanChannelMcps
215
215
  } from "../chunk-XWVM4KPK.js";
@@ -12870,7 +12870,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
12870
12870
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
12871
12871
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
12872
12872
  async function channelInboundActivityAgeSecondsFor(codeName) {
12873
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-J3D7MRIU.js");
12873
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-EN6IOLBG.js");
12874
12874
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
12875
12875
  if (newest === null) return null;
12876
12876
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13530,7 +13530,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13530
13530
  var lastVersionCheckAt = 0;
13531
13531
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13532
13532
  var lastResponsivenessProbeAt = 0;
13533
- var agtCliVersion = true ? "0.28.772" : "dev";
13533
+ var agtCliVersion = true ? "0.28.773" : "dev";
13534
13534
  function resolveBrewPath(execFileSync2) {
13535
13535
  try {
13536
13536
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15074,7 +15074,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15074
15074
  if (codeNames.length === 0) return;
15075
15075
  void (async () => {
15076
15076
  try {
15077
- const { collectDiagnostics } = await import("../persistent-session-NUVUR3PB.js");
15077
+ const { collectDiagnostics } = await import("../persistent-session-E4AHQHRA.js");
15078
15078
  await api.post("/host/heartbeat", {
15079
15079
  host_id: hostId,
15080
15080
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15215,7 +15215,7 @@ async function pollCycleInner() {
15215
15215
  }
15216
15216
  try {
15217
15217
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15218
- const { collectDiagnostics } = await import("../persistent-session-NUVUR3PB.js");
15218
+ const { collectDiagnostics } = await import("../persistent-session-E4AHQHRA.js");
15219
15219
  const diagCodeNames = [...agentState.persistentSessionAgents];
15220
15220
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15221
15221
  let tailscaleHostname;
@@ -15384,7 +15384,7 @@ async function pollCycleInner() {
15384
15384
  collectPanelessActivityProbes,
15385
15385
  getResponsivenessIntervalMs,
15386
15386
  occupancyQualificationClassifications
15387
- } = await import("../responsiveness-probe-J3D7MRIU.js");
15387
+ } = await import("../responsiveness-probe-EN6IOLBG.js");
15388
15388
  const probeIntervalMs = getResponsivenessIntervalMs();
15389
15389
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15390
15390
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15494,7 +15494,7 @@ async function pollCycleInner() {
15494
15494
  collectResponsivenessProbes,
15495
15495
  livePendingInboundOldestAgeSeconds,
15496
15496
  parkPendingInbound
15497
- } = await import("../responsiveness-probe-J3D7MRIU.js");
15497
+ } = await import("../responsiveness-probe-EN6IOLBG.js");
15498
15498
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15499
15499
  const wedgeNow = /* @__PURE__ */ new Date();
15500
15500
  const liveAgents = agentState.persistentSessionAgents;
@@ -15650,7 +15650,7 @@ async function pollCycleInner() {
15650
15650
  }
15651
15651
  try {
15652
15652
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
15653
- const { probeSessionAuth } = await import("../session-auth-dead-GKZNZKWI.js");
15653
+ const { probeSessionAuth } = await import("../session-auth-dead-LNYMXEHY.js");
15654
15654
  const observations = [];
15655
15655
  const pendingCacheCommits = [];
15656
15656
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -19690,7 +19690,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
19690
19690
  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}`));
19691
19691
  void (async () => {
19692
19692
  try {
19693
- const { collectDiagnostics } = await import("../persistent-session-NUVUR3PB.js");
19693
+ const { collectDiagnostics } = await import("../persistent-session-E4AHQHRA.js");
19694
19694
  await api.post("/host/heartbeat", {
19695
19695
  host_id: hostId,
19696
19696
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -19736,7 +19736,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
19736
19736
  }
19737
19737
  try {
19738
19738
  const hostId = await getHostId();
19739
- const { collectDiagnostics } = await import("../persistent-session-NUVUR3PB.js");
19739
+ const { collectDiagnostics } = await import("../persistent-session-E4AHQHRA.js");
19740
19740
  await api.post("/host/heartbeat", {
19741
19741
  host_id: hostId,
19742
19742
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20372,7 +20372,7 @@ async function processClaudePairSessions(agents) {
20372
20372
  killPairSession,
20373
20373
  pairTmuxSession,
20374
20374
  finalizeClaudePairOnboarding
20375
- } = await import("../claude-pair-runtime-Z7JFVKIY.js");
20375
+ } = await import("../claude-pair-runtime-5ULX4UVC.js");
20376
20376
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
20377
20377
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
20378
20378
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -46523,6 +46523,54 @@ server.tool(
46523
46523
  return { content: [{ type: "text", text: lines.join("\n") }] };
46524
46524
  }
46525
46525
  );
46526
+ server.tool(
46527
+ "rule_list",
46528
+ "List the standing rules currently in force for you \u2014 the short instructions your people have asked you to follow on EVERY turn, rendered into your instructions verbatim. Use this before adding a rule (so you know whether you are at the limit and what you would be replacing), and whenever someone asks what rules you are operating under. Rules are not task-specific and are not skills: a skill loads only when its description matches the task, a rule applies always.",
46529
+ {},
46530
+ async () => {
46531
+ const data = await apiGet(`/host/agent-rules?agent_id=${encodeURIComponent(AGT_AGENT_ID ?? "")}`);
46532
+ if (!data.ok) {
46533
+ return { content: [{ type: "text", text: "Could not read your standing rules." }], isError: true };
46534
+ }
46535
+ if (!data.rules.length) {
46536
+ return {
46537
+ content: [
46538
+ { type: "text", text: `No standing rules yet. You can hold up to ${data.max}, each up to ${data.max_chars} characters.` }
46539
+ ]
46540
+ };
46541
+ }
46542
+ const lines = data.rules.map((r) => `- ${r.text} (id: ${r.id})`).join("\n");
46543
+ return {
46544
+ content: [
46545
+ { type: "text", text: `${data.rules.length} of ${data.max} standing rules in force:
46546
+ ${lines}` }
46547
+ ]
46548
+ };
46549
+ }
46550
+ );
46551
+ server.tool(
46552
+ "rule_add",
46553
+ 'Turn a repeated instruction into a STANDING RULE that applies on every turn. Use when someone asks for the same thing more than once, or phrases it as a standing instruction ("always...", "every time...", "from now on..."). Propose it in plain language first and get a yes \u2014 never create one silently, and never make the person learn the word "skill" or "rule" to get it. Keep it SHORT: a rule is resident in your instructions on every single request, so if it needs more than a sentence it is really a skill (skill_create), which costs nothing until the task comes up. If you are already at the limit, pass replace_id with the id of the rule this one supersedes (rule_list shows the ids) \u2014 and tell the person what you dropped, in the same message. There is deliberately no way to remove a rule without adding one in its place: a rule that quietly stops applying is worse than one that was never made, because nobody notices.',
46554
+ {
46555
+ text: external_exports.string().describe("The rule, in the person's own words where possible. One sentence. It applies on every turn, so write it as a standing instruction rather than a task."),
46556
+ replace_id: external_exports.string().optional().describe("The id of an existing rule this one replaces (from rule_list). Required once you are at the limit. The person MUST be told which rule was dropped, in the same reply.")
46557
+ },
46558
+ async (params) => {
46559
+ const data = await apiPost("/host/agent-rules", {
46560
+ agent_id: AGT_AGENT_ID,
46561
+ text: params.text,
46562
+ ...params.replace_id ? { replace_id: params.replace_id } : {}
46563
+ });
46564
+ if (!data.ok) {
46565
+ return {
46566
+ content: [{ type: "text", text: data.message ?? "Could not save that rule." }],
46567
+ isError: true
46568
+ };
46569
+ }
46570
+ const said = data.evicted ? `Added the rule. To make room I dropped: "${data.evicted.text}". Tell the person BOTH of these, not just the addition.` : `Added the rule: "${data.rule?.text}".`;
46571
+ return { content: [{ type: "text", text: said }] };
46572
+ }
46573
+ );
46526
46574
  server.tool(
46527
46575
  "knowledge_add",
46528
46576
  'Save a new durable fact or learning to the knowledge base. Use when the user explicitly asks you to save/remember something, or when you discover information that will be useful on future runs (e.g. a tenant id, an API key name, a company policy). Do NOT use for tasks (use kanban_add) or trivial one-off answers. Defaults to TEAM scope; pass scope:"org" only when the user asks for organization/company-wide knowledge (visible to every team in the org). Returns the new entry id so you can target it with knowledge_update / knowledge_delete.',
@@ -47037,6 +47085,11 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
47037
47085
  "kanban_reopen",
47038
47086
  // ENG-9375: the READ path over a teammate's board (counts only).
47039
47087
  "kanban_peek",
47088
+ // ENG-9789: per-agent standing rules. No rule_remove by design — see the
47089
+ // registration below; an agent may only displace a rule by naming it while
47090
+ // adding another.
47091
+ "rule_list",
47092
+ "rule_add",
47040
47093
  // ENG-6953: agent + people directory lookup (always registered locally).
47041
47094
  "directory_lookup",
47042
47095
  "status_standup",
@@ -49,8 +49,8 @@ import {
49
49
  writeDirectChatSessionState,
50
50
  writeEgressAllowlist,
51
51
  writePersistentClaudeWrapper
52
- } from "./chunk-R6XGVTQS.js";
53
- import "./chunk-UPSDSMNC.js";
52
+ } from "./chunk-UL2W5NY6.js";
53
+ import "./chunk-75UAJFJJ.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-NUVUR3PB.js.map
107
+ //# sourceMappingURL=persistent-session-E4AHQHRA.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-R6XGVTQS.js";
4
- import "./chunk-UPSDSMNC.js";
3
+ } from "./chunk-UL2W5NY6.js";
4
+ import "./chunk-75UAJFJJ.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-J3D7MRIU.js.map
748
+ //# sourceMappingURL=responsiveness-probe-EN6IOLBG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-UPSDSMNC.js";
3
+ } from "./chunk-75UAJFJJ.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-GKZNZKWI.js.map
206
+ //# sourceMappingURL=session-auth-dead-LNYMXEHY.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.772",
3
+ "version": "0.28.773",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {