@integrity-labs/agt-cli 0.28.599 → 0.28.601

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.
@@ -16,7 +16,7 @@ import {
16
16
  rotateDailySession,
17
17
  sessionFileExists,
18
18
  todayLocalIso
19
- } from "./chunk-6EBAJFLZ.js";
19
+ } from "./chunk-V2WCVFDA.js";
20
20
  import {
21
21
  reapOrphanChannelMcps
22
22
  } from "./chunk-XWVM4KPK.js";
@@ -4349,4 +4349,4 @@ export {
4349
4349
  stopAllSessionsAndWait,
4350
4350
  getProjectDir
4351
4351
  };
4352
- //# sourceMappingURL=chunk-4E3L4U34.js.map
4352
+ //# sourceMappingURL=chunk-XTLKPF2A.js.map
@@ -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-5VAAQJQA.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-4E3TSALP.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-7CNOVI5H.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-I5EA2L7Z.js.map
@@ -53,7 +53,7 @@ import {
53
53
  safeWriteJsonAtomic,
54
54
  setConfigHash,
55
55
  tripClass
56
- } from "../chunk-MQCSDRD3.js";
56
+ } from "../chunk-IXRVFTBR.js";
57
57
  import {
58
58
  getProjectDir as getProjectDir2,
59
59
  getReadyTasks,
@@ -109,7 +109,7 @@ import {
109
109
  takeZombieDetection,
110
110
  toOpencodeModel,
111
111
  writeEgressAllowlist
112
- } from "../chunk-4E3L4U34.js";
112
+ } from "../chunk-XTLKPF2A.js";
113
113
  import {
114
114
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
115
115
  AnchorSessionClient,
@@ -186,7 +186,7 @@ import {
186
186
  subagentActivityAgeSeconds,
187
187
  sumTranscriptUsageInWindow,
188
188
  transcriptActivityAgeSeconds
189
- } from "../chunk-6EBAJFLZ.js";
189
+ } from "../chunk-V2WCVFDA.js";
190
190
  import {
191
191
  reapOrphanChannelMcps
192
192
  } from "../chunk-XWVM4KPK.js";
@@ -11880,7 +11880,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
11880
11880
  var lastVersionCheckAt = 0;
11881
11881
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
11882
11882
  var lastResponsivenessProbeAt = 0;
11883
- var agtCliVersion = true ? "0.28.599" : "dev";
11883
+ var agtCliVersion = true ? "0.28.601" : "dev";
11884
11884
  function resolveBrewPath(execFileSync3) {
11885
11885
  try {
11886
11886
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13187,7 +13187,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13187
13187
  if (codeNames.length === 0) return;
13188
13188
  void (async () => {
13189
13189
  try {
13190
- const { collectDiagnostics } = await import("../persistent-session-5VAAQJQA.js");
13190
+ const { collectDiagnostics } = await import("../persistent-session-4E3TSALP.js");
13191
13191
  await api.post("/host/heartbeat", {
13192
13192
  host_id: hostId,
13193
13193
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13295,7 +13295,7 @@ async function pollCycle() {
13295
13295
  }
13296
13296
  try {
13297
13297
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13298
- const { collectDiagnostics } = await import("../persistent-session-5VAAQJQA.js");
13298
+ const { collectDiagnostics } = await import("../persistent-session-4E3TSALP.js");
13299
13299
  const diagCodeNames = [...agentState.persistentSessionAgents];
13300
13300
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13301
13301
  let tailscaleHostname;
@@ -13418,7 +13418,7 @@ async function pollCycle() {
13418
13418
  collectPanelessActivityProbes,
13419
13419
  getResponsivenessIntervalMs,
13420
13420
  occupancyQualificationClassifications
13421
- } = await import("../responsiveness-probe-AZKD6KEV.js");
13421
+ } = await import("../responsiveness-probe-QLHKSMVN.js");
13422
13422
  const probeIntervalMs = getResponsivenessIntervalMs();
13423
13423
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13424
13424
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13509,7 +13509,7 @@ async function pollCycle() {
13509
13509
  collectResponsivenessProbes,
13510
13510
  livePendingInboundOldestAgeSeconds,
13511
13511
  parkPendingInbound
13512
- } = await import("../responsiveness-probe-AZKD6KEV.js");
13512
+ } = await import("../responsiveness-probe-QLHKSMVN.js");
13513
13513
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13514
13514
  const wedgeNow = /* @__PURE__ */ new Date();
13515
13515
  const liveAgents = agentState.persistentSessionAgents;
@@ -13665,7 +13665,7 @@ async function pollCycle() {
13665
13665
  }
13666
13666
  try {
13667
13667
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
13668
- const { probeSessionAuth } = await import("../session-auth-dead-5VN6KL6H.js");
13668
+ const { probeSessionAuth } = await import("../session-auth-dead-UVNMIC5M.js");
13669
13669
  const observations = [];
13670
13670
  const pendingCacheCommits = [];
13671
13671
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17093,7 +17093,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17093
17093
  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}`));
17094
17094
  void (async () => {
17095
17095
  try {
17096
- const { collectDiagnostics } = await import("../persistent-session-5VAAQJQA.js");
17096
+ const { collectDiagnostics } = await import("../persistent-session-4E3TSALP.js");
17097
17097
  await api.post("/host/heartbeat", {
17098
17098
  host_id: hostId,
17099
17099
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17144,7 +17144,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17144
17144
  }
17145
17145
  try {
17146
17146
  const hostId = await getHostId();
17147
- const { collectDiagnostics } = await import("../persistent-session-5VAAQJQA.js");
17147
+ const { collectDiagnostics } = await import("../persistent-session-4E3TSALP.js");
17148
17148
  await api.post("/host/heartbeat", {
17149
17149
  host_id: hostId,
17150
17150
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17740,7 +17740,7 @@ async function processClaudePairSessions(agents) {
17740
17740
  killPairSession,
17741
17741
  pairTmuxSession,
17742
17742
  finalizeClaudePairOnboarding
17743
- } = await import("../claude-pair-runtime-7CNOVI5H.js");
17743
+ } = await import("../claude-pair-runtime-I5EA2L7Z.js");
17744
17744
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
17745
17745
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
17746
17746
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -33772,6 +33772,65 @@ var INTEGRATION_REGISTRY = [
33772
33772
  }]
33773
33773
  }
33774
33774
  },
33775
+ {
33776
+ // Ninjafy Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
33777
+ // delivered to an agent as a tag-granted note the agent reads and summarises.
33778
+ //
33779
+ // No `installable` here, on purpose: ninjafy-notes is a Direct-HTTP SEED
33780
+ // integration (integration-definitions.json), so the seed catalog already
33781
+ // makes it picker-visible. This registry entry exists ONLY to carry the
33782
+ // `premium` descriptor that `isPremiumDefinition` reads — which arms the
33783
+ // per-org opt-in gate and the acknowledgement modal.
33784
+ //
33785
+ // PREMIUM BY ENTITLEMENT, WITH NO METER AND NO RATE CARD (ADR-0063 Decision
33786
+ // 9). Every other premium in this registry is priced because it costs the
33787
+ // platform something per call — a vendor bill, a model call, compute. Notes
33788
+ // costs S3 bytes: speech-to-text runs on the user's Mac, the platform never
33789
+ // summarises (Decision 3 gives that job to the agent, whose context is the
33790
+ // entire value), and a 45-minute meeting is tens of KB of text. The revenue
33791
+ // is the entitlement plus agent-hours — reading and summarising a note burns
33792
+ // the agent's turn, which is already billed, so metering the note as well
33793
+ // would charge for the same work twice through two mechanisms.
33794
+ //
33795
+ // What would change this: a per-note platform-side model call. The concrete
33796
+ // trigger is an AGENTLESS integration destination — "send this meeting
33797
+ // straight to Notion" has no agent to summarise it, so the platform must,
33798
+ // and that call is a real marginal cost. Expect a rate card WITH that slice,
33799
+ // scoped to that path, not applied to every note.
33800
+ //
33801
+ // ADR-0063 Decision 9 cites `agt-live` as the precedent for
33802
+ // entitlement-without-a-rate-card. It is not one: agt-live has no entry in
33803
+ // this registry at all, so `isPremiumDefinition('agt-live')` is false and it
33804
+ // is free on this axis. Its premium tier is `plans.live_premium` via
33805
+ // `getPlanForOrg` (ADR-0043) — a plan-tier entitlement enforced at the
33806
+ // CloudFront edge, a different mechanism that shares a word. Notes is the
33807
+ // first integration to need `pricing: 'included'`, which is why that value
33808
+ // now exists.
33809
+ id: "ninjafy-notes",
33810
+ name: "Ninjafy Notes",
33811
+ category: "workspace-productivity",
33812
+ description: "Meeting notes captured on your Mac and sent to an agent. Ninjafy Notes records and transcribes a meeting on-device \u2014 the audio never leaves your machine \u2014 then hands the transcript to the agents you choose, which read it with your organization's context and write their own summary. Notes are private by default; sending one to an agent is the only thing that grants access.",
33813
+ supported_auth_types: ["none"],
33814
+ capabilities: [
33815
+ {
33816
+ id: "ninjafy-notes:read",
33817
+ name: "Read Notes",
33818
+ description: "List and read the meeting notes this agent has been sent (ninjafy_notes_list, ninjafy_notes_read).",
33819
+ access: "read"
33820
+ },
33821
+ {
33822
+ id: "ninjafy-notes:write-summary",
33823
+ name: "Write Summaries",
33824
+ description: "Write or revise this agent's own summary of a note it was sent (ninjafy_notes_write_summary).",
33825
+ access: "write"
33826
+ }
33827
+ ],
33828
+ beta: true,
33829
+ premium: {
33830
+ pricing: "included",
33831
+ note: "Included in your plan. Transcription runs on your own Mac and no platform summariser runs, so there is nothing metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other."
33832
+ }
33833
+ },
33775
33834
  {
33776
33835
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
33777
33836
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -33964,7 +34023,7 @@ var ONBOARDING_REPLY_TIMEOUT_MS = 24 * 60 * 6e4;
33964
34023
  // ../core/dist/auth/oauth-principal.js
33965
34024
  var NOTES_WRITE_SCOPE = "notes:write";
33966
34025
  var USER_PRINCIPAL_SCOPE_LABELS = {
33967
- [NOTES_WRITE_SCOPE]: "Create meeting notes as you, and read the notes you own"
34026
+ [NOTES_WRITE_SCOPE]: "Create meeting notes as you, read the notes you own, and see the names of your organizations and agents so you can choose where a note goes"
33968
34027
  };
33969
34028
 
33970
34029
  // ../core/dist/inbound-lanes/index.js
@@ -34789,6 +34848,20 @@ registerTriggerSource(videoRenderTriggerAdapter);
34789
34848
 
34790
34849
  // ../core/dist/feature-flags/registry.js
34791
34850
  var FLAG_REGISTRY = [
34851
+ {
34852
+ key: "at-rest-v2-writes",
34853
+ description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
34854
+ flagType: "boolean",
34855
+ // Declared safe value is `false` = v1 writes, the pre-ADR-0061 behaviour. A
34856
+ // flag-read error must never arm v2 on its own (fail-safe = keep writing v1).
34857
+ defaultValue: false,
34858
+ // Deliberately NOT public (a server/process gate, never read client-side) and
34859
+ // NO envVar (the consumers — API + webapp + cron bootstraps — evaluate the
34860
+ // flag directly; a bare AGT_*_ENABLED env gate would trip check-new-env-gates.sh).
34861
+ // Sensitive: arming changes the durable at-rest ciphertext format fleet-wide, a
34862
+ // deliberate staged security flip, so mutations require explicit confirmation.
34863
+ sensitive: true
34864
+ },
34792
34865
  {
34793
34866
  key: "opencode-host-wizard",
34794
34867
  description: "Show a framework selector (Claude Code | opencode) in the new-host wizard, plus the opencode auth mode (xAI/Grok, per-agent minted keys). Off = the wizard only creates Claude Code hosts (opencode host creation stays CLI/programmatic). Additive UI gate; ships dark. The backend mint + claude_auth_mode=xai are enabled separately.",
@@ -40110,6 +40110,65 @@ var INTEGRATION_REGISTRY = [
40110
40110
  }]
40111
40111
  }
40112
40112
  },
40113
+ {
40114
+ // Ninjafy Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
40115
+ // delivered to an agent as a tag-granted note the agent reads and summarises.
40116
+ //
40117
+ // No `installable` here, on purpose: ninjafy-notes is a Direct-HTTP SEED
40118
+ // integration (integration-definitions.json), so the seed catalog already
40119
+ // makes it picker-visible. This registry entry exists ONLY to carry the
40120
+ // `premium` descriptor that `isPremiumDefinition` reads — which arms the
40121
+ // per-org opt-in gate and the acknowledgement modal.
40122
+ //
40123
+ // PREMIUM BY ENTITLEMENT, WITH NO METER AND NO RATE CARD (ADR-0063 Decision
40124
+ // 9). Every other premium in this registry is priced because it costs the
40125
+ // platform something per call — a vendor bill, a model call, compute. Notes
40126
+ // costs S3 bytes: speech-to-text runs on the user's Mac, the platform never
40127
+ // summarises (Decision 3 gives that job to the agent, whose context is the
40128
+ // entire value), and a 45-minute meeting is tens of KB of text. The revenue
40129
+ // is the entitlement plus agent-hours — reading and summarising a note burns
40130
+ // the agent's turn, which is already billed, so metering the note as well
40131
+ // would charge for the same work twice through two mechanisms.
40132
+ //
40133
+ // What would change this: a per-note platform-side model call. The concrete
40134
+ // trigger is an AGENTLESS integration destination — "send this meeting
40135
+ // straight to Notion" has no agent to summarise it, so the platform must,
40136
+ // and that call is a real marginal cost. Expect a rate card WITH that slice,
40137
+ // scoped to that path, not applied to every note.
40138
+ //
40139
+ // ADR-0063 Decision 9 cites `agt-live` as the precedent for
40140
+ // entitlement-without-a-rate-card. It is not one: agt-live has no entry in
40141
+ // this registry at all, so `isPremiumDefinition('agt-live')` is false and it
40142
+ // is free on this axis. Its premium tier is `plans.live_premium` via
40143
+ // `getPlanForOrg` (ADR-0043) — a plan-tier entitlement enforced at the
40144
+ // CloudFront edge, a different mechanism that shares a word. Notes is the
40145
+ // first integration to need `pricing: 'included'`, which is why that value
40146
+ // now exists.
40147
+ id: "ninjafy-notes",
40148
+ name: "Ninjafy Notes",
40149
+ category: "workspace-productivity",
40150
+ description: "Meeting notes captured on your Mac and sent to an agent. Ninjafy Notes records and transcribes a meeting on-device \u2014 the audio never leaves your machine \u2014 then hands the transcript to the agents you choose, which read it with your organization's context and write their own summary. Notes are private by default; sending one to an agent is the only thing that grants access.",
40151
+ supported_auth_types: ["none"],
40152
+ capabilities: [
40153
+ {
40154
+ id: "ninjafy-notes:read",
40155
+ name: "Read Notes",
40156
+ description: "List and read the meeting notes this agent has been sent (ninjafy_notes_list, ninjafy_notes_read).",
40157
+ access: "read"
40158
+ },
40159
+ {
40160
+ id: "ninjafy-notes:write-summary",
40161
+ name: "Write Summaries",
40162
+ description: "Write or revise this agent's own summary of a note it was sent (ninjafy_notes_write_summary).",
40163
+ access: "write"
40164
+ }
40165
+ ],
40166
+ beta: true,
40167
+ premium: {
40168
+ pricing: "included",
40169
+ note: "Included in your plan. Transcription runs on your own Mac and no platform summariser runs, so there is nothing metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other."
40170
+ }
40171
+ },
40113
40172
  {
40114
40173
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
40115
40174
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -40246,7 +40305,7 @@ var ONBOARDING_REPLY_TIMEOUT_MS = 24 * 60 * 6e4;
40246
40305
  // ../core/dist/auth/oauth-principal.js
40247
40306
  var NOTES_WRITE_SCOPE = "notes:write";
40248
40307
  var USER_PRINCIPAL_SCOPE_LABELS = {
40249
- [NOTES_WRITE_SCOPE]: "Create meeting notes as you, and read the notes you own"
40308
+ [NOTES_WRITE_SCOPE]: "Create meeting notes as you, read the notes you own, and see the names of your organizations and agents so you can choose where a note goes"
40250
40309
  };
40251
40310
 
40252
40311
  // ../core/dist/inbound-lanes/index.js
@@ -40680,6 +40739,20 @@ registerTriggerSource(videoRenderTriggerAdapter);
40680
40739
 
40681
40740
  // ../core/dist/feature-flags/registry.js
40682
40741
  var FLAG_REGISTRY = [
40742
+ {
40743
+ key: "at-rest-v2-writes",
40744
+ description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
40745
+ flagType: "boolean",
40746
+ // Declared safe value is `false` = v1 writes, the pre-ADR-0061 behaviour. A
40747
+ // flag-read error must never arm v2 on its own (fail-safe = keep writing v1).
40748
+ defaultValue: false,
40749
+ // Deliberately NOT public (a server/process gate, never read client-side) and
40750
+ // NO envVar (the consumers — API + webapp + cron bootstraps — evaluate the
40751
+ // flag directly; a bare AGT_*_ENABLED env gate would trip check-new-env-gates.sh).
40752
+ // Sensitive: arming changes the durable at-rest ciphertext format fleet-wide, a
40753
+ // deliberate staged security flip, so mutations require explicit confirmation.
40754
+ sensitive: true
40755
+ },
40683
40756
  {
40684
40757
  key: "opencode-host-wizard",
40685
40758
  description: "Show a framework selector (Claude Code | opencode) in the new-host wizard, plus the opencode auth mode (xAI/Grok, per-agent minted keys). Off = the wizard only creates Claude Code hosts (opencode host creation stays CLI/programmatic). Additive UI gate; ships dark. The backend mint + claude_auth_mode=xai are enabled separately.",
@@ -34161,6 +34161,65 @@ var INTEGRATION_REGISTRY = [
34161
34161
  }]
34162
34162
  }
34163
34163
  },
34164
+ {
34165
+ // Ninjafy Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
34166
+ // delivered to an agent as a tag-granted note the agent reads and summarises.
34167
+ //
34168
+ // No `installable` here, on purpose: ninjafy-notes is a Direct-HTTP SEED
34169
+ // integration (integration-definitions.json), so the seed catalog already
34170
+ // makes it picker-visible. This registry entry exists ONLY to carry the
34171
+ // `premium` descriptor that `isPremiumDefinition` reads — which arms the
34172
+ // per-org opt-in gate and the acknowledgement modal.
34173
+ //
34174
+ // PREMIUM BY ENTITLEMENT, WITH NO METER AND NO RATE CARD (ADR-0063 Decision
34175
+ // 9). Every other premium in this registry is priced because it costs the
34176
+ // platform something per call — a vendor bill, a model call, compute. Notes
34177
+ // costs S3 bytes: speech-to-text runs on the user's Mac, the platform never
34178
+ // summarises (Decision 3 gives that job to the agent, whose context is the
34179
+ // entire value), and a 45-minute meeting is tens of KB of text. The revenue
34180
+ // is the entitlement plus agent-hours — reading and summarising a note burns
34181
+ // the agent's turn, which is already billed, so metering the note as well
34182
+ // would charge for the same work twice through two mechanisms.
34183
+ //
34184
+ // What would change this: a per-note platform-side model call. The concrete
34185
+ // trigger is an AGENTLESS integration destination — "send this meeting
34186
+ // straight to Notion" has no agent to summarise it, so the platform must,
34187
+ // and that call is a real marginal cost. Expect a rate card WITH that slice,
34188
+ // scoped to that path, not applied to every note.
34189
+ //
34190
+ // ADR-0063 Decision 9 cites `agt-live` as the precedent for
34191
+ // entitlement-without-a-rate-card. It is not one: agt-live has no entry in
34192
+ // this registry at all, so `isPremiumDefinition('agt-live')` is false and it
34193
+ // is free on this axis. Its premium tier is `plans.live_premium` via
34194
+ // `getPlanForOrg` (ADR-0043) — a plan-tier entitlement enforced at the
34195
+ // CloudFront edge, a different mechanism that shares a word. Notes is the
34196
+ // first integration to need `pricing: 'included'`, which is why that value
34197
+ // now exists.
34198
+ id: "ninjafy-notes",
34199
+ name: "Ninjafy Notes",
34200
+ category: "workspace-productivity",
34201
+ description: "Meeting notes captured on your Mac and sent to an agent. Ninjafy Notes records and transcribes a meeting on-device \u2014 the audio never leaves your machine \u2014 then hands the transcript to the agents you choose, which read it with your organization's context and write their own summary. Notes are private by default; sending one to an agent is the only thing that grants access.",
34202
+ supported_auth_types: ["none"],
34203
+ capabilities: [
34204
+ {
34205
+ id: "ninjafy-notes:read",
34206
+ name: "Read Notes",
34207
+ description: "List and read the meeting notes this agent has been sent (ninjafy_notes_list, ninjafy_notes_read).",
34208
+ access: "read"
34209
+ },
34210
+ {
34211
+ id: "ninjafy-notes:write-summary",
34212
+ name: "Write Summaries",
34213
+ description: "Write or revise this agent's own summary of a note it was sent (ninjafy_notes_write_summary).",
34214
+ access: "write"
34215
+ }
34216
+ ],
34217
+ beta: true,
34218
+ premium: {
34219
+ pricing: "included",
34220
+ note: "Included in your plan. Transcription runs on your own Mac and no platform summariser runs, so there is nothing metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other."
34221
+ }
34222
+ },
34164
34223
  {
34165
34224
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
34166
34225
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -34297,7 +34356,7 @@ var ONBOARDING_REPLY_TIMEOUT_MS = 24 * 60 * 6e4;
34297
34356
  // ../core/dist/auth/oauth-principal.js
34298
34357
  var NOTES_WRITE_SCOPE = "notes:write";
34299
34358
  var USER_PRINCIPAL_SCOPE_LABELS = {
34300
- [NOTES_WRITE_SCOPE]: "Create meeting notes as you, and read the notes you own"
34359
+ [NOTES_WRITE_SCOPE]: "Create meeting notes as you, read the notes you own, and see the names of your organizations and agents so you can choose where a note goes"
34301
34360
  };
34302
34361
 
34303
34362
  // ../core/dist/inbound-lanes/index.js
@@ -35125,6 +35184,20 @@ registerTriggerSource(videoRenderTriggerAdapter);
35125
35184
 
35126
35185
  // ../core/dist/feature-flags/registry.js
35127
35186
  var FLAG_REGISTRY = [
35187
+ {
35188
+ key: "at-rest-v2-writes",
35189
+ description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
35190
+ flagType: "boolean",
35191
+ // Declared safe value is `false` = v1 writes, the pre-ADR-0061 behaviour. A
35192
+ // flag-read error must never arm v2 on its own (fail-safe = keep writing v1).
35193
+ defaultValue: false,
35194
+ // Deliberately NOT public (a server/process gate, never read client-side) and
35195
+ // NO envVar (the consumers — API + webapp + cron bootstraps — evaluate the
35196
+ // flag directly; a bare AGT_*_ENABLED env gate would trip check-new-env-gates.sh).
35197
+ // Sensitive: arming changes the durable at-rest ciphertext format fleet-wide, a
35198
+ // deliberate staged security flip, so mutations require explicit confirmation.
35199
+ sensitive: true
35200
+ },
35128
35201
  {
35129
35202
  key: "opencode-host-wizard",
35130
35203
  description: "Show a framework selector (Claude Code | opencode) in the new-host wizard, plus the opencode auth mode (xAI/Grok, per-agent minted keys). Off = the wizard only creates Claude Code hosts (opencode host creation stays CLI/programmatic). Additive UI gate; ships dark. The backend mint + claude_auth_mode=xai are enabled separately.",
@@ -34320,6 +34320,65 @@ var INTEGRATION_REGISTRY = [
34320
34320
  }]
34321
34321
  }
34322
34322
  },
34323
+ {
34324
+ // Ninjafy Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
34325
+ // delivered to an agent as a tag-granted note the agent reads and summarises.
34326
+ //
34327
+ // No `installable` here, on purpose: ninjafy-notes is a Direct-HTTP SEED
34328
+ // integration (integration-definitions.json), so the seed catalog already
34329
+ // makes it picker-visible. This registry entry exists ONLY to carry the
34330
+ // `premium` descriptor that `isPremiumDefinition` reads — which arms the
34331
+ // per-org opt-in gate and the acknowledgement modal.
34332
+ //
34333
+ // PREMIUM BY ENTITLEMENT, WITH NO METER AND NO RATE CARD (ADR-0063 Decision
34334
+ // 9). Every other premium in this registry is priced because it costs the
34335
+ // platform something per call — a vendor bill, a model call, compute. Notes
34336
+ // costs S3 bytes: speech-to-text runs on the user's Mac, the platform never
34337
+ // summarises (Decision 3 gives that job to the agent, whose context is the
34338
+ // entire value), and a 45-minute meeting is tens of KB of text. The revenue
34339
+ // is the entitlement plus agent-hours — reading and summarising a note burns
34340
+ // the agent's turn, which is already billed, so metering the note as well
34341
+ // would charge for the same work twice through two mechanisms.
34342
+ //
34343
+ // What would change this: a per-note platform-side model call. The concrete
34344
+ // trigger is an AGENTLESS integration destination — "send this meeting
34345
+ // straight to Notion" has no agent to summarise it, so the platform must,
34346
+ // and that call is a real marginal cost. Expect a rate card WITH that slice,
34347
+ // scoped to that path, not applied to every note.
34348
+ //
34349
+ // ADR-0063 Decision 9 cites `agt-live` as the precedent for
34350
+ // entitlement-without-a-rate-card. It is not one: agt-live has no entry in
34351
+ // this registry at all, so `isPremiumDefinition('agt-live')` is false and it
34352
+ // is free on this axis. Its premium tier is `plans.live_premium` via
34353
+ // `getPlanForOrg` (ADR-0043) — a plan-tier entitlement enforced at the
34354
+ // CloudFront edge, a different mechanism that shares a word. Notes is the
34355
+ // first integration to need `pricing: 'included'`, which is why that value
34356
+ // now exists.
34357
+ id: "ninjafy-notes",
34358
+ name: "Ninjafy Notes",
34359
+ category: "workspace-productivity",
34360
+ description: "Meeting notes captured on your Mac and sent to an agent. Ninjafy Notes records and transcribes a meeting on-device \u2014 the audio never leaves your machine \u2014 then hands the transcript to the agents you choose, which read it with your organization's context and write their own summary. Notes are private by default; sending one to an agent is the only thing that grants access.",
34361
+ supported_auth_types: ["none"],
34362
+ capabilities: [
34363
+ {
34364
+ id: "ninjafy-notes:read",
34365
+ name: "Read Notes",
34366
+ description: "List and read the meeting notes this agent has been sent (ninjafy_notes_list, ninjafy_notes_read).",
34367
+ access: "read"
34368
+ },
34369
+ {
34370
+ id: "ninjafy-notes:write-summary",
34371
+ name: "Write Summaries",
34372
+ description: "Write or revise this agent's own summary of a note it was sent (ninjafy_notes_write_summary).",
34373
+ access: "write"
34374
+ }
34375
+ ],
34376
+ beta: true,
34377
+ premium: {
34378
+ pricing: "included",
34379
+ note: "Included in your plan. Transcription runs on your own Mac and no platform summariser runs, so there is nothing metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other."
34380
+ }
34381
+ },
34323
34382
  {
34324
34383
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
34325
34384
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -34456,7 +34515,7 @@ var ONBOARDING_REPLY_TIMEOUT_MS = 24 * 60 * 6e4;
34456
34515
  // ../core/dist/auth/oauth-principal.js
34457
34516
  var NOTES_WRITE_SCOPE = "notes:write";
34458
34517
  var USER_PRINCIPAL_SCOPE_LABELS = {
34459
- [NOTES_WRITE_SCOPE]: "Create meeting notes as you, and read the notes you own"
34518
+ [NOTES_WRITE_SCOPE]: "Create meeting notes as you, read the notes you own, and see the names of your organizations and agents so you can choose where a note goes"
34460
34519
  };
34461
34520
 
34462
34521
  // ../core/dist/inbound-lanes/index.js
@@ -35284,6 +35343,20 @@ registerTriggerSource(videoRenderTriggerAdapter);
35284
35343
 
35285
35344
  // ../core/dist/feature-flags/registry.js
35286
35345
  var FLAG_REGISTRY = [
35346
+ {
35347
+ key: "at-rest-v2-writes",
35348
+ description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
35349
+ flagType: "boolean",
35350
+ // Declared safe value is `false` = v1 writes, the pre-ADR-0061 behaviour. A
35351
+ // flag-read error must never arm v2 on its own (fail-safe = keep writing v1).
35352
+ defaultValue: false,
35353
+ // Deliberately NOT public (a server/process gate, never read client-side) and
35354
+ // NO envVar (the consumers — API + webapp + cron bootstraps — evaluate the
35355
+ // flag directly; a bare AGT_*_ENABLED env gate would trip check-new-env-gates.sh).
35356
+ // Sensitive: arming changes the durable at-rest ciphertext format fleet-wide, a
35357
+ // deliberate staged security flip, so mutations require explicit confirmation.
35358
+ sensitive: true
35359
+ },
35287
35360
  {
35288
35361
  key: "opencode-host-wizard",
35289
35362
  description: "Show a framework selector (Claude Code | opencode) in the new-host wizard, plus the opencode auth mode (xAI/Grok, per-agent minted keys). Off = the wizard only creates Claude Code hosts (opencode host creation stays CLI/programmatic). Additive UI gate; ships dark. The backend mint + claude_auth_mode=xai are enabled separately.",
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-4E3L4U34.js";
47
- import "./chunk-6EBAJFLZ.js";
46
+ } from "./chunk-XTLKPF2A.js";
47
+ import "./chunk-V2WCVFDA.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-5VAAQJQA.js.map
95
+ //# sourceMappingURL=persistent-session-4E3TSALP.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-4E3L4U34.js";
4
- import "./chunk-6EBAJFLZ.js";
3
+ } from "./chunk-XTLKPF2A.js";
4
+ import "./chunk-V2WCVFDA.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -690,4 +690,4 @@ export {
690
690
  readAndResetSlackReplyBindingClassifications,
691
691
  readAndResetSlackReplyTargetClassifications
692
692
  };
693
- //# sourceMappingURL=responsiveness-probe-AZKD6KEV.js.map
693
+ //# sourceMappingURL=responsiveness-probe-QLHKSMVN.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-6EBAJFLZ.js";
3
+ } from "./chunk-V2WCVFDA.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-5VN6KL6H.js.map
206
+ //# sourceMappingURL=session-auth-dead-UVNMIC5M.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.599",
3
+ "version": "0.28.601",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {