@integrity-labs/agt-cli 0.28.650 → 0.28.651

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-2JT7HIFF.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-DVZESZDD.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-ENRW5IDG.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-U52EA7NZ.js.map
@@ -55,7 +55,7 @@ import {
55
55
  safeWriteJsonAtomic,
56
56
  setConfigHash,
57
57
  tripClass
58
- } from "../chunk-5DXWVKCZ.js";
58
+ } from "../chunk-EXMRWMXQ.js";
59
59
  import {
60
60
  getProjectDir as getProjectDir2,
61
61
  getReadyTasks,
@@ -111,7 +111,7 @@ import {
111
111
  takeZombieDetection,
112
112
  toOpencodeModel,
113
113
  writeEgressAllowlist
114
- } from "../chunk-CSLG2XMX.js";
114
+ } from "../chunk-EUXCRRZU.js";
115
115
  import {
116
116
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
117
117
  AnchorSessionClient,
@@ -192,7 +192,7 @@ import {
192
192
  subagentActivityAgeSeconds,
193
193
  sumTranscriptUsageInWindow,
194
194
  transcriptActivityAgeSeconds
195
- } from "../chunk-ZAZKEL4Y.js";
195
+ } from "../chunk-V5MUX3GI.js";
196
196
  import {
197
197
  reapOrphanChannelMcps
198
198
  } from "../chunk-XWVM4KPK.js";
@@ -11609,7 +11609,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11609
11609
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11610
11610
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11611
11611
  async function channelInboundActivityAgeSecondsFor(codeName) {
11612
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-5TOZHK3H.js");
11612
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-Q7SVASQS.js");
11613
11613
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
11614
11614
  if (newest === null) return null;
11615
11615
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12252,7 +12252,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12252
12252
  var lastVersionCheckAt = 0;
12253
12253
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12254
12254
  var lastResponsivenessProbeAt = 0;
12255
- var agtCliVersion = true ? "0.28.650" : "dev";
12255
+ var agtCliVersion = true ? "0.28.651" : "dev";
12256
12256
  function resolveBrewPath(execFileSync3) {
12257
12257
  try {
12258
12258
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13560,7 +13560,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13560
13560
  if (codeNames.length === 0) return;
13561
13561
  void (async () => {
13562
13562
  try {
13563
- const { collectDiagnostics } = await import("../persistent-session-2JT7HIFF.js");
13563
+ const { collectDiagnostics } = await import("../persistent-session-DVZESZDD.js");
13564
13564
  await api.post("/host/heartbeat", {
13565
13565
  host_id: hostId,
13566
13566
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13676,7 +13676,7 @@ async function pollCycleInner() {
13676
13676
  }
13677
13677
  try {
13678
13678
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13679
- const { collectDiagnostics } = await import("../persistent-session-2JT7HIFF.js");
13679
+ const { collectDiagnostics } = await import("../persistent-session-DVZESZDD.js");
13680
13680
  const diagCodeNames = [...agentState.persistentSessionAgents];
13681
13681
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13682
13682
  let tailscaleHostname;
@@ -13799,7 +13799,7 @@ async function pollCycleInner() {
13799
13799
  collectPanelessActivityProbes,
13800
13800
  getResponsivenessIntervalMs,
13801
13801
  occupancyQualificationClassifications
13802
- } = await import("../responsiveness-probe-5TOZHK3H.js");
13802
+ } = await import("../responsiveness-probe-Q7SVASQS.js");
13803
13803
  const probeIntervalMs = getResponsivenessIntervalMs();
13804
13804
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13805
13805
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13909,7 +13909,7 @@ async function pollCycleInner() {
13909
13909
  collectResponsivenessProbes,
13910
13910
  livePendingInboundOldestAgeSeconds,
13911
13911
  parkPendingInbound
13912
- } = await import("../responsiveness-probe-5TOZHK3H.js");
13912
+ } = await import("../responsiveness-probe-Q7SVASQS.js");
13913
13913
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13914
13914
  const wedgeNow = /* @__PURE__ */ new Date();
13915
13915
  const liveAgents = agentState.persistentSessionAgents;
@@ -14065,7 +14065,7 @@ async function pollCycleInner() {
14065
14065
  }
14066
14066
  try {
14067
14067
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
14068
- const { probeSessionAuth } = await import("../session-auth-dead-PFCVB7MZ.js");
14068
+ const { probeSessionAuth } = await import("../session-auth-dead-RV3Z64TM.js");
14069
14069
  const observations = [];
14070
14070
  const pendingCacheCommits = [];
14071
14071
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17698,7 +17698,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17698
17698
  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}`));
17699
17699
  void (async () => {
17700
17700
  try {
17701
- const { collectDiagnostics } = await import("../persistent-session-2JT7HIFF.js");
17701
+ const { collectDiagnostics } = await import("../persistent-session-DVZESZDD.js");
17702
17702
  await api.post("/host/heartbeat", {
17703
17703
  host_id: hostId,
17704
17704
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17749,7 +17749,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17749
17749
  }
17750
17750
  try {
17751
17751
  const hostId = await getHostId();
17752
- const { collectDiagnostics } = await import("../persistent-session-2JT7HIFF.js");
17752
+ const { collectDiagnostics } = await import("../persistent-session-DVZESZDD.js");
17753
17753
  await api.post("/host/heartbeat", {
17754
17754
  host_id: hostId,
17755
17755
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18346,7 +18346,7 @@ async function processClaudePairSessions(agents) {
18346
18346
  killPairSession,
18347
18347
  pairTmuxSession,
18348
18348
  finalizeClaudePairOnboarding
18349
- } = await import("../claude-pair-runtime-ENRW5IDG.js");
18349
+ } = await import("../claude-pair-runtime-U52EA7NZ.js");
18350
18350
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
18351
18351
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
18352
18352
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -32209,6 +32209,9 @@ var TIER_PATTERNS = [
32209
32209
  }
32210
32210
  ];
32211
32211
 
32212
+ // ../core/dist/integrations/pending-approval.js
32213
+ var PENDING_APPROVAL_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
32214
+
32212
32215
  // ../core/dist/integrations/augmented-live/markup.js
32213
32216
  var MARKUP_MARKER = "__augmentedLiveMarkup";
32214
32217
  var MARKUP_CONTROL_MARKER = "__augmentedLiveMarkupControl";
@@ -36354,18 +36357,22 @@ var FLAG_REGISTRY = [
36354
36357
  },
36355
36358
  {
36356
36359
  key: "ninjafy-brand",
36357
- description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates text, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: its only consumer is sidebar.tsx via usePublicBooleanFlag, which evaluates in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. Ships dark.',
36360
+ description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: EVERY consumer evaluates in the active-org cookie scope \u2014 sidebar.tsx and top-nav.tsx via usePublicBooleanFlag, and (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 so a host- or agent-scoped row is accepted by the table but never reached by the console. The THEME is resolved SERVER-side deliberately (ENG-8858): the client hook starts at its default and updates after an async GET /flags, so gating a palette on it paints Augmented and repaints \u2014 a full-page colour flash, not just the wordmark flash it already causes. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because getPublicBooleanFlagServer returns the default without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. Those surfaces follow only when the stage-wide default flips. Ships dark.',
36358
36361
  flagType: "boolean",
36359
36362
  // Declared safe value is `false`: the pre-rebrand brand. `false` is also the
36360
36363
  // fail-closed direction — if the flag DB is unreachable we must show the brand
36361
36364
  // that is currently live and contractually correct, never leak an unannounced
36362
36365
  // rebrand to every customer at once.
36363
36366
  defaultValue: false,
36364
- // Read CLIENT-SIDE: sidebar.tsx is a "use client" component and resolves this
36365
- // via usePublicBooleanFlag, so the key must be in the browser-exposed public
36366
- // map. Unlike onboarding-msteams-channel above there is no wrong-org hazard —
36367
- // the sidebar renders inside the active-org cookie's scope, which is exactly
36368
- // the org whose brand should be shown.
36367
+ // Read on BOTH sides, so the key must be in the browser-exposed public map:
36368
+ // sidebar.tsx and top-nav.tsx are "use client" and resolve it via
36369
+ // usePublicBooleanFlag for the WORDMARK, while (dashboard)/layout.tsx resolves
36370
+ // it server-side via getPublicBooleanFlagServer for the THEME (ENG-8858) a
36371
+ // palette cannot wait for an async client fetch without flashing. Dropping
36372
+ // `public` would break the two client readers, not just the server one.
36373
+ // Unlike onboarding-msteams-channel above there is no wrong-org hazard — every
36374
+ // reader evaluates inside the active-org cookie's scope, which is exactly the
36375
+ // org whose brand should be shown.
36369
36376
  public: true
36370
36377
  },
36371
36378
  {
package/dist/mcp/index.js CHANGED
@@ -39548,6 +39548,9 @@ var TIER_PATTERNS = [
39548
39548
  }
39549
39549
  ];
39550
39550
 
39551
+ // ../core/dist/integrations/pending-approval.js
39552
+ var PENDING_APPROVAL_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
39553
+
39551
39554
  // ../core/dist/integrations/augmented-live/markup.js
39552
39555
  var MARKUP_MARKER = "__augmentedLiveMarkup";
39553
39556
  var MARKUP_CONTROL_MARKER = "__augmentedLiveMarkupControl";
@@ -43244,18 +43247,22 @@ var FLAG_REGISTRY = [
43244
43247
  },
43245
43248
  {
43246
43249
  key: "ninjafy-brand",
43247
- description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates text, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: its only consumer is sidebar.tsx via usePublicBooleanFlag, which evaluates in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. Ships dark.',
43250
+ description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: EVERY consumer evaluates in the active-org cookie scope \u2014 sidebar.tsx and top-nav.tsx via usePublicBooleanFlag, and (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 so a host- or agent-scoped row is accepted by the table but never reached by the console. The THEME is resolved SERVER-side deliberately (ENG-8858): the client hook starts at its default and updates after an async GET /flags, so gating a palette on it paints Augmented and repaints \u2014 a full-page colour flash, not just the wordmark flash it already causes. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because getPublicBooleanFlagServer returns the default without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. Those surfaces follow only when the stage-wide default flips. Ships dark.',
43248
43251
  flagType: "boolean",
43249
43252
  // Declared safe value is `false`: the pre-rebrand brand. `false` is also the
43250
43253
  // fail-closed direction — if the flag DB is unreachable we must show the brand
43251
43254
  // that is currently live and contractually correct, never leak an unannounced
43252
43255
  // rebrand to every customer at once.
43253
43256
  defaultValue: false,
43254
- // Read CLIENT-SIDE: sidebar.tsx is a "use client" component and resolves this
43255
- // via usePublicBooleanFlag, so the key must be in the browser-exposed public
43256
- // map. Unlike onboarding-msteams-channel above there is no wrong-org hazard —
43257
- // the sidebar renders inside the active-org cookie's scope, which is exactly
43258
- // the org whose brand should be shown.
43257
+ // Read on BOTH sides, so the key must be in the browser-exposed public map:
43258
+ // sidebar.tsx and top-nav.tsx are "use client" and resolve it via
43259
+ // usePublicBooleanFlag for the WORDMARK, while (dashboard)/layout.tsx resolves
43260
+ // it server-side via getPublicBooleanFlagServer for the THEME (ENG-8858) a
43261
+ // palette cannot wait for an async client fetch without flashing. Dropping
43262
+ // `public` would break the two client readers, not just the server one.
43263
+ // Unlike onboarding-msteams-channel above there is no wrong-org hazard — every
43264
+ // reader evaluates inside the active-org cookie's scope, which is exactly the
43265
+ // org whose brand should be shown.
43259
43266
  public: true
43260
43267
  },
43261
43268
  {
@@ -38429,6 +38429,9 @@ var TIER_PATTERNS = [
38429
38429
  }
38430
38430
  ];
38431
38431
 
38432
+ // ../core/dist/integrations/pending-approval.js
38433
+ var PENDING_APPROVAL_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
38434
+
38432
38435
  // ../core/dist/integrations/augmented-live/markup.js
38433
38436
  var MARKUP_MARKER = "__augmentedLiveMarkup";
38434
38437
  var MARKUP_CONTROL_MARKER = "__augmentedLiveMarkupControl";
@@ -42104,18 +42107,22 @@ var FLAG_REGISTRY = [
42104
42107
  },
42105
42108
  {
42106
42109
  key: "ninjafy-brand",
42107
- description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates text, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: its only consumer is sidebar.tsx via usePublicBooleanFlag, which evaluates in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. Ships dark.',
42110
+ description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: EVERY consumer evaluates in the active-org cookie scope \u2014 sidebar.tsx and top-nav.tsx via usePublicBooleanFlag, and (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 so a host- or agent-scoped row is accepted by the table but never reached by the console. The THEME is resolved SERVER-side deliberately (ENG-8858): the client hook starts at its default and updates after an async GET /flags, so gating a palette on it paints Augmented and repaints \u2014 a full-page colour flash, not just the wordmark flash it already causes. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because getPublicBooleanFlagServer returns the default without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. Those surfaces follow only when the stage-wide default flips. Ships dark.',
42108
42111
  flagType: "boolean",
42109
42112
  // Declared safe value is `false`: the pre-rebrand brand. `false` is also the
42110
42113
  // fail-closed direction — if the flag DB is unreachable we must show the brand
42111
42114
  // that is currently live and contractually correct, never leak an unannounced
42112
42115
  // rebrand to every customer at once.
42113
42116
  defaultValue: false,
42114
- // Read CLIENT-SIDE: sidebar.tsx is a "use client" component and resolves this
42115
- // via usePublicBooleanFlag, so the key must be in the browser-exposed public
42116
- // map. Unlike onboarding-msteams-channel above there is no wrong-org hazard —
42117
- // the sidebar renders inside the active-org cookie's scope, which is exactly
42118
- // the org whose brand should be shown.
42117
+ // Read on BOTH sides, so the key must be in the browser-exposed public map:
42118
+ // sidebar.tsx and top-nav.tsx are "use client" and resolve it via
42119
+ // usePublicBooleanFlag for the WORDMARK, while (dashboard)/layout.tsx resolves
42120
+ // it server-side via getPublicBooleanFlagServer for the THEME (ENG-8858) a
42121
+ // palette cannot wait for an async client fetch without flashing. Dropping
42122
+ // `public` would break the two client readers, not just the server one.
42123
+ // Unlike onboarding-msteams-channel above there is no wrong-org hazard — every
42124
+ // reader evaluates inside the active-org cookie's scope, which is exactly the
42125
+ // org whose brand should be shown.
42119
42126
  public: true
42120
42127
  },
42121
42128
  {
@@ -32489,6 +32489,9 @@ var TIER_PATTERNS = [
32489
32489
  }
32490
32490
  ];
32491
32491
 
32492
+ // ../core/dist/integrations/pending-approval.js
32493
+ var PENDING_APPROVAL_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
32494
+
32492
32495
  // ../core/dist/integrations/augmented-live/markup.js
32493
32496
  var MARKUP_MARKER = "__augmentedLiveMarkup";
32494
32497
  var MARKUP_CONTROL_MARKER = "__augmentedLiveMarkupControl";
@@ -36587,18 +36590,22 @@ var FLAG_REGISTRY = [
36587
36590
  },
36588
36591
  {
36589
36592
  key: "ninjafy-brand",
36590
- description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates text, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: its only consumer is sidebar.tsx via usePublicBooleanFlag, which evaluates in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. Ships dark.',
36593
+ description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: EVERY consumer evaluates in the active-org cookie scope \u2014 sidebar.tsx and top-nav.tsx via usePublicBooleanFlag, and (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 so a host- or agent-scoped row is accepted by the table but never reached by the console. The THEME is resolved SERVER-side deliberately (ENG-8858): the client hook starts at its default and updates after an async GET /flags, so gating a palette on it paints Augmented and repaints \u2014 a full-page colour flash, not just the wordmark flash it already causes. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because getPublicBooleanFlagServer returns the default without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. Those surfaces follow only when the stage-wide default flips. Ships dark.',
36591
36594
  flagType: "boolean",
36592
36595
  // Declared safe value is `false`: the pre-rebrand brand. `false` is also the
36593
36596
  // fail-closed direction — if the flag DB is unreachable we must show the brand
36594
36597
  // that is currently live and contractually correct, never leak an unannounced
36595
36598
  // rebrand to every customer at once.
36596
36599
  defaultValue: false,
36597
- // Read CLIENT-SIDE: sidebar.tsx is a "use client" component and resolves this
36598
- // via usePublicBooleanFlag, so the key must be in the browser-exposed public
36599
- // map. Unlike onboarding-msteams-channel above there is no wrong-org hazard —
36600
- // the sidebar renders inside the active-org cookie's scope, which is exactly
36601
- // the org whose brand should be shown.
36600
+ // Read on BOTH sides, so the key must be in the browser-exposed public map:
36601
+ // sidebar.tsx and top-nav.tsx are "use client" and resolve it via
36602
+ // usePublicBooleanFlag for the WORDMARK, while (dashboard)/layout.tsx resolves
36603
+ // it server-side via getPublicBooleanFlagServer for the THEME (ENG-8858) a
36604
+ // palette cannot wait for an async client fetch without flashing. Dropping
36605
+ // `public` would break the two client readers, not just the server one.
36606
+ // Unlike onboarding-msteams-channel above there is no wrong-org hazard — every
36607
+ // reader evaluates inside the active-org cookie's scope, which is exactly the
36608
+ // org whose brand should be shown.
36602
36609
  public: true
36603
36610
  },
36604
36611
  {
@@ -32639,6 +32639,9 @@ var TIER_PATTERNS = [
32639
32639
  }
32640
32640
  ];
32641
32641
 
32642
+ // ../core/dist/integrations/pending-approval.js
32643
+ var PENDING_APPROVAL_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
32644
+
32642
32645
  // ../core/dist/integrations/augmented-live/markup.js
32643
32646
  var MARKUP_MARKER = "__augmentedLiveMarkup";
32644
32647
  var MARKUP_CONTROL_MARKER = "__augmentedLiveMarkupControl";
@@ -36731,18 +36734,22 @@ var FLAG_REGISTRY = [
36731
36734
  },
36732
36735
  {
36733
36736
  key: "ninjafy-brand",
36734
- description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates text, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: its only consumer is sidebar.tsx via usePublicBooleanFlag, which evaluates in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. Ships dark.',
36737
+ description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: EVERY consumer evaluates in the active-org cookie scope \u2014 sidebar.tsx and top-nav.tsx via usePublicBooleanFlag, and (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 so a host- or agent-scoped row is accepted by the table but never reached by the console. The THEME is resolved SERVER-side deliberately (ENG-8858): the client hook starts at its default and updates after an async GET /flags, so gating a palette on it paints Augmented and repaints \u2014 a full-page colour flash, not just the wordmark flash it already causes. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because getPublicBooleanFlagServer returns the default without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. Those surfaces follow only when the stage-wide default flips. Ships dark.',
36735
36738
  flagType: "boolean",
36736
36739
  // Declared safe value is `false`: the pre-rebrand brand. `false` is also the
36737
36740
  // fail-closed direction — if the flag DB is unreachable we must show the brand
36738
36741
  // that is currently live and contractually correct, never leak an unannounced
36739
36742
  // rebrand to every customer at once.
36740
36743
  defaultValue: false,
36741
- // Read CLIENT-SIDE: sidebar.tsx is a "use client" component and resolves this
36742
- // via usePublicBooleanFlag, so the key must be in the browser-exposed public
36743
- // map. Unlike onboarding-msteams-channel above there is no wrong-org hazard —
36744
- // the sidebar renders inside the active-org cookie's scope, which is exactly
36745
- // the org whose brand should be shown.
36744
+ // Read on BOTH sides, so the key must be in the browser-exposed public map:
36745
+ // sidebar.tsx and top-nav.tsx are "use client" and resolve it via
36746
+ // usePublicBooleanFlag for the WORDMARK, while (dashboard)/layout.tsx resolves
36747
+ // it server-side via getPublicBooleanFlagServer for the THEME (ENG-8858) a
36748
+ // palette cannot wait for an async client fetch without flashing. Dropping
36749
+ // `public` would break the two client readers, not just the server one.
36750
+ // Unlike onboarding-msteams-channel above there is no wrong-org hazard — every
36751
+ // reader evaluates inside the active-org cookie's scope, which is exactly the
36752
+ // org whose brand should be shown.
36746
36753
  public: true
36747
36754
  },
36748
36755
  {
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-CSLG2XMX.js";
47
- import "./chunk-ZAZKEL4Y.js";
46
+ } from "./chunk-EUXCRRZU.js";
47
+ import "./chunk-V5MUX3GI.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-2JT7HIFF.js.map
95
+ //# sourceMappingURL=persistent-session-DVZESZDD.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-CSLG2XMX.js";
4
- import "./chunk-ZAZKEL4Y.js";
3
+ } from "./chunk-EUXCRRZU.js";
4
+ import "./chunk-V5MUX3GI.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -727,4 +727,4 @@ export {
727
727
  readAndResetSlackReplyBindingClassifications,
728
728
  readAndResetSlackReplyTargetClassifications
729
729
  };
730
- //# sourceMappingURL=responsiveness-probe-5TOZHK3H.js.map
730
+ //# sourceMappingURL=responsiveness-probe-Q7SVASQS.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-ZAZKEL4Y.js";
3
+ } from "./chunk-V5MUX3GI.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-PFCVB7MZ.js.map
206
+ //# sourceMappingURL=session-auth-dead-RV3Z64TM.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.650",
3
+ "version": "0.28.651",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {