@integrity-labs/agt-cli 0.28.1068 → 0.28.1069

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.
@@ -9,6 +9,7 @@ import {
9
9
  SEND_KEYS_ENTER_DELAY_MS,
10
10
  TMUX_BOOTSTRAP_HOLD_CMD,
11
11
  TMUX_BOOTSTRAP_SESSION_PREFIX,
12
+ TRANSCRIPT_BIND_SENTINEL,
12
13
  TRANSCRIPT_MASK_DIR_PREFIX,
13
14
  _internals,
14
15
  applyPaneAgentIdVerdict,
@@ -27,6 +28,7 @@ import {
27
28
  egressAllowlistHostPath,
28
29
  egressMode,
29
30
  ensureClaudeStateLayout,
31
+ ensureTranscriptBindSources,
30
32
  findForeignAgentIdsInMcpConfig,
31
33
  findMissingSpawnEnv,
32
34
  getLastFailureContext,
@@ -62,10 +64,11 @@ import {
62
64
  stopPersistentSession,
63
65
  takeZombieDetection,
64
66
  tmuxBootstrapSessionName,
67
+ transcriptBindSourcesFor,
65
68
  writeDirectChatSessionState,
66
69
  writeEgressAllowlist,
67
70
  writePersistentClaudeWrapper
68
- } from "./chunk-65F44JJJ.js";
71
+ } from "./chunk-FHUYRSCF.js";
69
72
  import "./chunk-CFJONCHN.js";
70
73
  import "./chunk-OCMJ5E6J.js";
71
74
  import "./chunk-XWVM4KPK.js";
@@ -82,6 +85,7 @@ export {
82
85
  SEND_KEYS_ENTER_DELAY_MS,
83
86
  TMUX_BOOTSTRAP_HOLD_CMD,
84
87
  TMUX_BOOTSTRAP_SESSION_PREFIX,
88
+ TRANSCRIPT_BIND_SENTINEL,
85
89
  TRANSCRIPT_MASK_DIR_PREFIX,
86
90
  _internals,
87
91
  applyPaneAgentIdVerdict,
@@ -100,6 +104,7 @@ export {
100
104
  egressAllowlistHostPath,
101
105
  egressMode,
102
106
  ensureClaudeStateLayout,
107
+ ensureTranscriptBindSources,
103
108
  findForeignAgentIdsInMcpConfig,
104
109
  findMissingSpawnEnv,
105
110
  getLastFailureContext,
@@ -135,8 +140,9 @@ export {
135
140
  stopPersistentSession,
136
141
  takeZombieDetection,
137
142
  tmuxBootstrapSessionName,
143
+ transcriptBindSourcesFor,
138
144
  writeDirectChatSessionState,
139
145
  writeEgressAllowlist,
140
146
  writePersistentClaudeWrapper
141
147
  };
142
- //# sourceMappingURL=persistent-session-VRAVB743.js.map
148
+ //# sourceMappingURL=persistent-session-52A2G7D7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-65F44JJJ.js";
3
+ } from "./chunk-FHUYRSCF.js";
4
4
  import "./chunk-CFJONCHN.js";
5
5
  import "./chunk-OCMJ5E6J.js";
6
6
  import "./chunk-XWVM4KPK.js";
@@ -802,4 +802,4 @@ export {
802
802
  readAndResetSlackReplyBindingClassifications,
803
803
  readAndResetSlackReplyTargetClassifications
804
804
  };
805
- //# sourceMappingURL=responsiveness-probe-QTYKXBH7.js.map
805
+ //# sourceMappingURL=responsiveness-probe-SJCP4V4X.js.map
@@ -0,0 +1,79 @@
1
+ import "./chunk-DGUM43GV.js";
2
+
3
+ // src/lib/transcript-mount-health.ts
4
+ import { join } from "path";
5
+ function probeContainerTranscriptMounts(args) {
6
+ const { pid, stat } = args;
7
+ if (pid === null || !Number.isInteger(pid) || pid <= 0) return { state: "unknown", reason: "no container pid" };
8
+ const root = `/proc/${pid}/root`;
9
+ try {
10
+ stat(root);
11
+ } catch (err) {
12
+ return { state: "unknown", reason: `cannot read ${root}: ${err.code ?? "error"}` };
13
+ }
14
+ for (const bind of args.binds) {
15
+ let seen;
16
+ try {
17
+ seen = stat(join(root, bind.containerPath));
18
+ } catch (err) {
19
+ const code = err.code;
20
+ if (code === "ENOENT") return { state: "orphaned", path: bind.containerPath, reason: "missing" };
21
+ return { state: "unknown", reason: `stat ${bind.containerPath}: ${code ?? "error"}` };
22
+ }
23
+ if (!seen.isDirectory()) return { state: "orphaned", path: bind.containerPath, reason: "not-a-directory" };
24
+ if (seen.nlink === 0) return { state: "orphaned", path: bind.containerPath, reason: "unlinked" };
25
+ let host = null;
26
+ try {
27
+ host = stat(bind.hostPath);
28
+ } catch {
29
+ host = null;
30
+ }
31
+ if (!host || host.dev !== seen.dev || host.ino !== seen.ino) {
32
+ return { state: "orphaned", path: bind.containerPath, reason: "diverged" };
33
+ }
34
+ }
35
+ return { state: "ok" };
36
+ }
37
+ var TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS = 20 * 60 * 1e3;
38
+ function resolveTranscriptMountConfig(env = process.env) {
39
+ const raw = (env.AGT_TRANSCRIPT_MOUNT_CHECK_MODE ?? "").trim().toLowerCase();
40
+ const mode = raw === "off" || raw === "shadow" || raw === "enforce" ? raw : "enforce";
41
+ return { mode, minCycles: 2, maxRestartsInWindow: 3, restartWindowMs: 6 * 60 * 60 * 1e3 };
42
+ }
43
+ function decideTranscriptMountAction(input, config) {
44
+ if (config.mode === "off" || input.verdict.state !== "orphaned") return "none";
45
+ if (input.consecutiveCycles < config.minCycles) return "none";
46
+ if (config.mode === "shadow") return "would-restart";
47
+ const inWindow = input.recentRestartsMs.filter((t) => input.nowMs - t < config.restartWindowMs).length;
48
+ return inWindow >= config.maxRestartsInWindow ? "give-up" : "restart";
49
+ }
50
+ function bindSourceEscalations(refused) {
51
+ const out = [];
52
+ const planted = refused.filter((r) => r.reason !== "error");
53
+ const io = refused.filter((r) => r.reason === "error");
54
+ if (planted.length > 0) {
55
+ const what = planted.map((r) => `${r.path} (${r.reason})`).join(", ");
56
+ out.push({
57
+ cause: "layout",
58
+ action: "blocked",
59
+ message: `Transcript bind source was replaced with something the manager will not follow: ${what}. Refused to write through it; it is unprotected against the Claude Code retention sweep until a human removes it.`
60
+ });
61
+ }
62
+ if (io.length > 0) {
63
+ const what = io.map((r) => `${r.detail ?? "error"} on ${r.path}`).join(", ");
64
+ out.push({
65
+ cause: "io",
66
+ action: "alert",
67
+ message: `Could not create or refresh the transcript bind source sentinel: ${what}. The agent is still running, but its bind source is unprotected against the Claude Code retention sweep; check disk space and permissions on the host.`
68
+ });
69
+ }
70
+ return out;
71
+ }
72
+ export {
73
+ TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS,
74
+ bindSourceEscalations,
75
+ decideTranscriptMountAction,
76
+ probeContainerTranscriptMounts,
77
+ resolveTranscriptMountConfig
78
+ };
79
+ //# sourceMappingURL=transcript-mount-health-OHE6IVJV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/transcript-mount-health.ts"],"sourcesContent":["/**\n * ENG-11277 — is a docker-isolated agent still writing its transcripts somewhere real?\n *\n * ## The incident\n *\n * Pedders host v8, 2026-10-02. After the host was re-paired onto a new Claude\n * account, marty, grace and sophie (all docker-isolated) started failing with\n *\n * Prompt is too long · automatic compaction failed: ENOENT: no such file or\n * directory, mkdir '/root/.claude/projects/-root--augmented-grace-project'\n * ⚠ Transcript writes are failing (ENOENT)\n *\n * while `/root/.claude/projects` existed on the host from any fresh shell, and a\n * respawn fixed it. The same banner hit ada on integritylabs-2 on 2026-09-24\n * with no account switch at all (ENG-10957), so the switch is not required.\n *\n * ## Why a path can exist and still ENOENT\n *\n * ENG-8854 gives every isolated agent two nested binds:\n *\n * host ~/.claude/projects/.agent-<agentId> -> container ~/.claude/projects\n * host ~/.claude/projects/<slug> -> container ~/.claude/projects/<slug>\n *\n * A bind pins the host DIRECTORY (its inode), not its path. If the host source\n * is unlinked while the container runs (rmdir'd, or rm -rf'd and recreated) the\n * container keeps a directory that no longer has a name anywhere. `mkdir` and\n * `open(O_CREAT)` inside an unlinked directory fail with exactly `ENOENT … mkdir\n * '<path>'` — and Claude Code writes the transcript and the compaction output\n * there, so both fail — while the same path resolves fine from the host, which\n * sees the new directory (or the untouched parent). Removing a mountpoint dir\n * from the host also detaches the nested bind inside the container (Linux >=\n * 3.18 unmounts on rmdir across namespaces), which leaves the slug path pointing\n * into the unlinked mask dir. Nothing on the host can repair a running\n * container's mounts; only a respawn rebinds them.\n *\n * ## Root cause (confirmed on v8)\n *\n * The mountpoint `.agent-<id>/<slug>` is EMPTY on the host (docker binds over\n * it) and the mask dir held nothing else. Claude Code's background\n * housekeeping (2.1.285 bundle; at most once per 24h, gated on\n * `<config>/.last-cleanup`; its only caller found is the interactive REPL's\n * first submit, so the sweeper is an interactive host-side `claude` sharing\n * `~/.claude` - the pair/login session, a human's shell) runs a projects sweep\n * over every directory under `~/.claude/projects`, `.agent-<id>` included:\n * - files directly in a project dir are unlinked by age only if the name is\n * on its transcript suffix list (.jsonl, .cast, .ccr-tip.json,\n * .precompact.json, .desktop-released.json, .dir-sync*.json + tmp forms);\n * any other name is skipped;\n * - a subdir whose name passes its session-name check (a path-safe,\n * LOWERCASE name with no ':' - which `-root--augmented-<agent>-project`\n * is) gets its known sidecar files aged out (tool-results/, mcp-tasks/,\n * subagents|workflows|remote-agents/, and named files such as\n * ccr-tip.json, custom-title.json, precompact.json) and is then rmdir'd\n * if empty, with NO age check; any other subdir is rmdir'd only if its\n * own lstat mtime is past `cleanupPeriodDays` (default 30);\n * - the project dir itself is then rmdir'd if empty, with NO age check.\n * So the first sweep that ran on v8 after the mountpoint existed removed it\n * and then the mask. On v8 the mask dir was absent on the host, the\n * container's projects dir read nlink 0, and `.last-cleanup` was stamped\n * 2026-10-02T04:24:12Z, the morning the host was re-paired (an interactive\n * `claude` on the host). `ensureTranscriptBindSources` keeps a sentinel\n * (`.agt-bind-source`, a name the sweep never unlinks) in each bind source, so\n * none of those rmdirs can succeed. This module is the backstop for whatever\n * removes a bind source anyway.\n *\n * ## What it checks, and why from inside\n *\n * Checking the HOST paths would miss the replace case (a recreated dir exists\n * and is healthy; the container is bound to the dead one). So the probe looks at\n * the CONTAINER's view through `/proc/<pid>/root`, which resolves inside the\n * container's mount namespace, and asks the kernel the one question that\n * matters: is the directory Claude writes into still linked (`nlink > 0`)?\n *\n * Pure apart from the injected `stat`, so the verdicts are unit-testable.\n */\n\nimport { join } from 'node:path';\n\nexport type TranscriptMountVerdict =\n | { state: 'ok' }\n /** The container's transcript dir is gone, unlinked, or no longer the host dir: writes go nowhere useful until respawn. */\n | { state: 'orphaned'; path: string; reason: 'missing' | 'unlinked' | 'not-a-directory' | 'diverged' }\n /** Could not look (no pid, /proc unreadable). Never a reason to act. */\n | { state: 'unknown'; reason: string };\n\nexport interface StatLike {\n isDirectory(): boolean;\n nlink: number;\n dev: number;\n ino: number;\n}\n\nexport type StatFn = (path: string) => StatLike;\n\n/** One bind: the path as the container sees it, and the host directory it must be. */\nexport interface TranscriptBind {\n containerPath: string;\n hostPath: string;\n}\n\n/**\n * Probe the container's view of its transcript binds.\n *\n * For each bind, the directory the container sees at `containerPath` (read\n * through `/proc/<pid>/root`) must be (1) present, (2) still linked, and (3) the\n * SAME directory as `hostPath` on the host (dev + inode). (3) is what catches a\n * source that was removed and recreated: the host path is healthy, the\n * container is bound to the dead one, and only an inode comparison tells them\n * apart. Order matters: pass the mask (parent) bind first, so an unlinked mask\n * root is reported as the cause even when the nested slug bind still resolves.\n */\nexport function probeContainerTranscriptMounts(args: {\n pid: number | null;\n binds: readonly TranscriptBind[];\n stat: StatFn;\n}): TranscriptMountVerdict {\n const { pid, stat } = args;\n if (pid === null || !Number.isInteger(pid) || pid <= 0) return { state: 'unknown', reason: 'no container pid' };\n const root = `/proc/${pid}/root`;\n // The pid itself must be readable, or a vanished process would read as\n // \"missing transcript dir\" and respawn a session that is merely restarting.\n try {\n stat(root);\n } catch (err) {\n return { state: 'unknown', reason: `cannot read ${root}: ${(err as NodeJS.ErrnoException).code ?? 'error'}` };\n }\n for (const bind of args.binds) {\n let seen: StatLike;\n try {\n seen = stat(join(root, bind.containerPath));\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return { state: 'orphaned', path: bind.containerPath, reason: 'missing' };\n return { state: 'unknown', reason: `stat ${bind.containerPath}: ${code ?? 'error'}` };\n }\n if (!seen.isDirectory()) return { state: 'orphaned', path: bind.containerPath, reason: 'not-a-directory' };\n if (seen.nlink === 0) return { state: 'orphaned', path: bind.containerPath, reason: 'unlinked' };\n let host: StatLike | null = null;\n try {\n host = stat(bind.hostPath);\n } catch {\n host = null; // host source gone: the container is on a dir nothing on the host reads\n }\n if (!host || host.dev !== seen.dev || host.ino !== seen.ino) {\n return { state: 'orphaned', path: bind.containerPath, reason: 'diverged' };\n }\n }\n return { state: 'ok' };\n}\n\n/**\n * How often a persisting critical transcript-mount condition (restart budget\n * spent, or a tampered bind source) is re-reported. Must stay under the\n * reaper-alert-sweeper's quiet window (AUGMENTED_REAPER_ALERT_QUIET_MINUTES,\n * default 30), or the alert auto-closes while the agent is still broken.\n */\nexport const TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS = 20 * 60 * 1000;\n\nexport type TranscriptMountMode = 'off' | 'shadow' | 'enforce';\n\nexport interface TranscriptMountConfig {\n mode: TranscriptMountMode;\n /** Consecutive orphaned verdicts before acting (a respawn mid-teardown can read oddly once). */\n minCycles: number;\n maxRestartsInWindow: number;\n restartWindowMs: number;\n}\n\n/**\n * AGT_TRANSCRIPT_MOUNT_CHECK_MODE off | shadow | enforce (default enforce).\n *\n * Enforce by default: the verdict is a kernel fact (the directory the agent\n * writes into has no name), not a heuristic, and the only remedy is a respawn.\n * Shadow is what every host had before this - three agents silently losing\n * transcripts for hours on v8. The restart budget bounds the downside.\n */\nexport function resolveTranscriptMountConfig(env: NodeJS.ProcessEnv = process.env): TranscriptMountConfig {\n const raw = (env.AGT_TRANSCRIPT_MOUNT_CHECK_MODE ?? '').trim().toLowerCase();\n const mode: TranscriptMountMode = raw === 'off' || raw === 'shadow' || raw === 'enforce' ? raw : 'enforce';\n return { mode, minCycles: 2, maxRestartsInWindow: 3, restartWindowMs: 6 * 60 * 60 * 1000 };\n}\n\nexport type TranscriptMountAction = 'none' | 'would-restart' | 'restart' | 'give-up';\n\nexport function decideTranscriptMountAction(\n input: {\n verdict: TranscriptMountVerdict;\n consecutiveCycles: number;\n recentRestartsMs: readonly number[];\n nowMs: number;\n },\n config: TranscriptMountConfig,\n): TranscriptMountAction {\n if (config.mode === 'off' || input.verdict.state !== 'orphaned') return 'none';\n if (input.consecutiveCycles < config.minCycles) return 'none';\n if (config.mode === 'shadow') return 'would-restart';\n const inWindow = input.recentRestartsMs.filter((t) => input.nowMs - t < config.restartWindowMs).length;\n return inWindow >= config.maxRestartsInWindow ? 'give-up' : 'restart';\n}\n\n/** Structural twin of persistent-session's TranscriptBindRefusal (kept here so this module stays pure). */\nexport interface BindSourceRefusal {\n path: string;\n reason: 'symlink' | 'not-a-directory' | 'not-a-regular-file' | 'error';\n detail?: string;\n}\n\nexport interface BindSourceEscalation {\n /** Escalation key and alert shape: `layout` = tampering (critical), `io` = host I/O (warning). */\n cause: 'layout' | 'io';\n action: 'blocked' | 'alert';\n message: string;\n}\n\n/**\n * Obi Wan 244fdbddc6ef: turn sentinel refusals into alerts that name the real\n * cause. A link / non-directory / non-regular file is something the agent\n * planted in a bind source it can write: refused, never followed, and a\n * respawn cannot fix it, so it is critical. An `error` is the HOST failing to\n * create or refresh the sentinel (EACCES, ENOSPC, EROFS, a dir that vanished\n * after mkdir): nothing was planted, and since this only runs while the\n * container's binds probe healthy, the agent is still working. What is lost is\n * the sentinel's protection against the retention sweep, so it is a warning\n * that points at disk and permissions. (A host that cannot create the bind\n * source at all fails the spawn or the probe, which page on their own.)\n */\nexport function bindSourceEscalations(refused: readonly BindSourceRefusal[]): BindSourceEscalation[] {\n const out: BindSourceEscalation[] = [];\n const planted = refused.filter((r) => r.reason !== 'error');\n const io = refused.filter((r) => r.reason === 'error');\n if (planted.length > 0) {\n const what = planted.map((r) => `${r.path} (${r.reason})`).join(', ');\n out.push({\n cause: 'layout',\n action: 'blocked',\n message:\n `Transcript bind source was replaced with something the manager will not follow: ${what}. ` +\n 'Refused to write through it; it is unprotected against the Claude Code retention sweep until a human removes it.',\n });\n }\n if (io.length > 0) {\n const what = io.map((r) => `${r.detail ?? 'error'} on ${r.path}`).join(', ');\n out.push({\n cause: 'io',\n action: 'alert',\n message:\n `Could not create or refresh the transcript bind source sentinel: ${what}. ` +\n 'The agent is still running, but its bind source is unprotected against the Claude Code retention sweep; ' +\n 'check disk space and permissions on the host.',\n });\n }\n return out;\n}\n"],"mappings":";;;AA4EA,SAAS,YAAY;AAmCd,SAAS,+BAA+B,MAIpB;AACzB,QAAM,EAAE,KAAK,KAAK,IAAI;AACtB,MAAI,QAAQ,QAAQ,CAAC,OAAO,UAAU,GAAG,KAAK,OAAO,EAAG,QAAO,EAAE,OAAO,WAAW,QAAQ,mBAAmB;AAC9G,QAAM,OAAO,SAAS,GAAG;AAGzB,MAAI;AACF,SAAK,IAAI;AAAA,EACX,SAAS,KAAK;AACZ,WAAO,EAAE,OAAO,WAAW,QAAQ,eAAe,IAAI,KAAM,IAA8B,QAAQ,OAAO,GAAG;AAAA,EAC9G;AACA,aAAW,QAAQ,KAAK,OAAO;AAC7B,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,KAAK,MAAM,KAAK,aAAa,CAAC;AAAA,IAC5C,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAU,QAAO,EAAE,OAAO,YAAY,MAAM,KAAK,eAAe,QAAQ,UAAU;AAC/F,aAAO,EAAE,OAAO,WAAW,QAAQ,QAAQ,KAAK,aAAa,KAAK,QAAQ,OAAO,GAAG;AAAA,IACtF;AACA,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO,EAAE,OAAO,YAAY,MAAM,KAAK,eAAe,QAAQ,kBAAkB;AACzG,QAAI,KAAK,UAAU,EAAG,QAAO,EAAE,OAAO,YAAY,MAAM,KAAK,eAAe,QAAQ,WAAW;AAC/F,QAAI,OAAwB;AAC5B,QAAI;AACF,aAAO,KAAK,KAAK,QAAQ;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ,KAAK,KAAK;AAC3D,aAAO,EAAE,OAAO,YAAY,MAAM,KAAK,eAAe,QAAQ,WAAW;AAAA,IAC3E;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAQO,IAAM,yCAAyC,KAAK,KAAK;AAoBzD,SAAS,6BAA6B,MAAyB,QAAQ,KAA4B;AACxG,QAAM,OAAO,IAAI,mCAAmC,IAAI,KAAK,EAAE,YAAY;AAC3E,QAAM,OAA4B,QAAQ,SAAS,QAAQ,YAAY,QAAQ,YAAY,MAAM;AACjG,SAAO,EAAE,MAAM,WAAW,GAAG,qBAAqB,GAAG,iBAAiB,IAAI,KAAK,KAAK,IAAK;AAC3F;AAIO,SAAS,4BACd,OAMA,QACuB;AACvB,MAAI,OAAO,SAAS,SAAS,MAAM,QAAQ,UAAU,WAAY,QAAO;AACxE,MAAI,MAAM,oBAAoB,OAAO,UAAW,QAAO;AACvD,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,WAAW,MAAM,iBAAiB,OAAO,CAAC,MAAM,MAAM,QAAQ,IAAI,OAAO,eAAe,EAAE;AAChG,SAAO,YAAY,OAAO,sBAAsB,YAAY;AAC9D;AA4BO,SAAS,sBAAsB,SAA+D;AACnG,QAAM,MAA8B,CAAC;AACrC,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AAC1D,QAAM,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AACrD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AACpE,QAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE,mFAAmF,IAAI;AAAA,IAE3F,CAAC;AAAA,EACH;AACA,MAAI,GAAG,SAAS,GAAG;AACjB,UAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,UAAU,OAAO,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAC3E,QAAI,KAAK;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SACE,oEAAoE,IAAI;AAAA,IAG5E,CAAC;AAAA,EACH;AACA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.1068",
3
+ "version": "0.28.1069",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {