@integrity-labs/agt-cli 0.28.700 → 0.28.702

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.
@@ -17,7 +17,7 @@ import {
17
17
  rotateDailySession,
18
18
  sessionFileExists,
19
19
  todayLocalIso
20
- } from "./chunk-QRQE2MVT.js";
20
+ } from "./chunk-DX3REH6Z.js";
21
21
  import {
22
22
  reapOrphanChannelMcps
23
23
  } from "./chunk-XWVM4KPK.js";
@@ -4531,4 +4531,4 @@ export {
4531
4531
  stopAllSessionsAndWait,
4532
4532
  getProjectDir
4533
4533
  };
4534
- //# sourceMappingURL=chunk-GE2FIKUX.js.map
4534
+ //# sourceMappingURL=chunk-JWFVVQ5R.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-7XILEFLF.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-V72ISHD4.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-NVLSNWWS.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-OVV6MBU5.js.map
@@ -54,7 +54,7 @@ import {
54
54
  safeWriteJsonAtomic,
55
55
  setConfigHash,
56
56
  tripClass
57
- } from "../chunk-MZWFZIN2.js";
57
+ } from "../chunk-324RU37E.js";
58
58
  import {
59
59
  getProjectDir as getProjectDir2,
60
60
  getReadyTasks,
@@ -112,7 +112,7 @@ import {
112
112
  takeZombieDetection,
113
113
  toOpencodeModel,
114
114
  writeEgressAllowlist
115
- } from "../chunk-GE2FIKUX.js";
115
+ } from "../chunk-JWFVVQ5R.js";
116
116
  import {
117
117
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
118
118
  AnchorSessionClient,
@@ -197,7 +197,7 @@ import {
197
197
  subagentActivityAgeSeconds,
198
198
  sumTranscriptUsageInWindow,
199
199
  transcriptActivityAgeSeconds
200
- } from "../chunk-QRQE2MVT.js";
200
+ } from "../chunk-DX3REH6Z.js";
201
201
  import {
202
202
  reapOrphanChannelMcps
203
203
  } from "../chunk-XWVM4KPK.js";
@@ -11892,7 +11892,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11892
11892
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11893
11893
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11894
11894
  async function channelInboundActivityAgeSecondsFor(codeName) {
11895
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-ZU33A2GB.js");
11895
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-BW5AHMES.js");
11896
11896
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
11897
11897
  if (newest === null) return null;
11898
11898
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12540,7 +12540,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12540
12540
  var lastVersionCheckAt = 0;
12541
12541
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12542
12542
  var lastResponsivenessProbeAt = 0;
12543
- var agtCliVersion = true ? "0.28.700" : "dev";
12543
+ var agtCliVersion = true ? "0.28.702" : "dev";
12544
12544
  function resolveBrewPath(execFileSync3) {
12545
12545
  try {
12546
12546
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -14041,7 +14041,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
14041
14041
  if (codeNames.length === 0) return;
14042
14042
  void (async () => {
14043
14043
  try {
14044
- const { collectDiagnostics } = await import("../persistent-session-7XILEFLF.js");
14044
+ const { collectDiagnostics } = await import("../persistent-session-V72ISHD4.js");
14045
14045
  await api.post("/host/heartbeat", {
14046
14046
  host_id: hostId,
14047
14047
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -14159,7 +14159,7 @@ async function pollCycleInner() {
14159
14159
  }
14160
14160
  try {
14161
14161
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
14162
- const { collectDiagnostics } = await import("../persistent-session-7XILEFLF.js");
14162
+ const { collectDiagnostics } = await import("../persistent-session-V72ISHD4.js");
14163
14163
  const diagCodeNames = [...agentState.persistentSessionAgents];
14164
14164
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
14165
14165
  let tailscaleHostname;
@@ -14311,7 +14311,7 @@ async function pollCycleInner() {
14311
14311
  collectPanelessActivityProbes,
14312
14312
  getResponsivenessIntervalMs,
14313
14313
  occupancyQualificationClassifications
14314
- } = await import("../responsiveness-probe-ZU33A2GB.js");
14314
+ } = await import("../responsiveness-probe-BW5AHMES.js");
14315
14315
  const probeIntervalMs = getResponsivenessIntervalMs();
14316
14316
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
14317
14317
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -14421,7 +14421,7 @@ async function pollCycleInner() {
14421
14421
  collectResponsivenessProbes,
14422
14422
  livePendingInboundOldestAgeSeconds,
14423
14423
  parkPendingInbound
14424
- } = await import("../responsiveness-probe-ZU33A2GB.js");
14424
+ } = await import("../responsiveness-probe-BW5AHMES.js");
14425
14425
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
14426
14426
  const wedgeNow = /* @__PURE__ */ new Date();
14427
14427
  const liveAgents = agentState.persistentSessionAgents;
@@ -14577,7 +14577,7 @@ async function pollCycleInner() {
14577
14577
  }
14578
14578
  try {
14579
14579
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
14580
- const { probeSessionAuth } = await import("../session-auth-dead-ODQB4UPP.js");
14580
+ const { probeSessionAuth } = await import("../session-auth-dead-H5IVXY2C.js");
14581
14581
  const observations = [];
14582
14582
  const pendingCacheCommits = [];
14583
14583
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -18337,7 +18337,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
18337
18337
  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}`));
18338
18338
  void (async () => {
18339
18339
  try {
18340
- const { collectDiagnostics } = await import("../persistent-session-7XILEFLF.js");
18340
+ const { collectDiagnostics } = await import("../persistent-session-V72ISHD4.js");
18341
18341
  await api.post("/host/heartbeat", {
18342
18342
  host_id: hostId,
18343
18343
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18388,7 +18388,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
18388
18388
  }
18389
18389
  try {
18390
18390
  const hostId = await getHostId();
18391
- const { collectDiagnostics } = await import("../persistent-session-7XILEFLF.js");
18391
+ const { collectDiagnostics } = await import("../persistent-session-V72ISHD4.js");
18392
18392
  await api.post("/host/heartbeat", {
18393
18393
  host_id: hostId,
18394
18394
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -19020,7 +19020,7 @@ async function processClaudePairSessions(agents) {
19020
19020
  killPairSession,
19021
19021
  pairTmuxSession,
19022
19022
  finalizeClaudePairOnboarding
19023
- } = await import("../claude-pair-runtime-NVLSNWWS.js");
19023
+ } = await import("../claude-pair-runtime-OVV6MBU5.js");
19024
19024
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
19025
19025
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
19026
19026
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -34140,15 +34140,45 @@ var INTEGRATION_REGISTRY = [
34140
34140
  // `live-meeting-advisor` in FLAG_REGISTRY, which is a staff control.
34141
34141
  id: "ninjafy-notes:live-advise",
34142
34142
  name: "Live Meeting Advice",
34143
- description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed.",
34143
+ // ENG-9278: THE PRICE IS QUOTED PER MEETING, NEVER PER HOUR. Nobody arms
34144
+ // an advisor for "an hour" — they arm it for a meeting — and the hourly
34145
+ // figure reads as a subscription for something billed only while it
34146
+ // runs. Both currencies are stated outright because the sub-dollar line
34147
+ // is USD-only; a spot conversion of either would not be a clean quote in
34148
+ // the other.
34149
+ //
34150
+ // These two figures are the rate card's ($0.03 USD / $0.05 AUD per armed
34151
+ // minute, migration 20260827000001) multiplied by thirty. They are prose
34152
+ // here rather than read from the rate card, which is a real drift
34153
+ // hazard — so it is held by a test that reprices both from the migration
34154
+ // and fails if they disagree, rather than by anyone remembering.
34155
+ description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
34144
34156
  access: "write",
34145
34157
  requires_org_opt_in: true
34146
34158
  }
34147
34159
  ],
34148
34160
  beta: true,
34161
+ // ENG-9278: STILL `included`, and the meter does not change that.
34162
+ //
34163
+ // Ninja Notes acquired its first metered path — live advising — and the
34164
+ // obvious move was to flip this to `usage`. It is refused. `pricing` drives
34165
+ // the org admin's acknowledgement modal, where `usage` renders as "manages
34166
+ // and bills by usage"; saying that to the many orgs who record notes and
34167
+ // never arm an advisor would be a false statement in a consent dialog, which
34168
+ // is the exact harm the `included` case was added to prevent, inverted.
34169
+ //
34170
+ // Notes really are included. The one metered thing is a capability with its
34171
+ // own org opt-in and its own price in its own description, which is where
34172
+ // the consent for it actually happens.
34173
+ //
34174
+ // The cost of this choice is that the rate card is not rendered on the
34175
+ // premium surface (that reads definition-level meters, and only for
34176
+ // `pricing: 'usage'`), so the price is prose in two places. Pricing the
34177
+ // CAPABILITY instead — meters on the capability descriptor, read by the
34178
+ // premium surface — is the structurally right answer and the follow-up.
34149
34179
  premium: {
34150
34180
  pricing: "included",
34151
- 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."
34181
+ note: "Notes are included in your plan. Transcription runs on your own Mac and no platform summariser runs, so nothing is metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other. Live meeting advising is the one exception: it is turned on separately, and billed per minute the advisor is armed."
34152
34182
  }
34153
34183
  },
34154
34184
  {
package/dist/mcp/index.js CHANGED
@@ -41540,15 +41540,45 @@ var INTEGRATION_REGISTRY = [
41540
41540
  // `live-meeting-advisor` in FLAG_REGISTRY, which is a staff control.
41541
41541
  id: "ninjafy-notes:live-advise",
41542
41542
  name: "Live Meeting Advice",
41543
- description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed.",
41543
+ // ENG-9278: THE PRICE IS QUOTED PER MEETING, NEVER PER HOUR. Nobody arms
41544
+ // an advisor for "an hour" — they arm it for a meeting — and the hourly
41545
+ // figure reads as a subscription for something billed only while it
41546
+ // runs. Both currencies are stated outright because the sub-dollar line
41547
+ // is USD-only; a spot conversion of either would not be a clean quote in
41548
+ // the other.
41549
+ //
41550
+ // These two figures are the rate card's ($0.03 USD / $0.05 AUD per armed
41551
+ // minute, migration 20260827000001) multiplied by thirty. They are prose
41552
+ // here rather than read from the rate card, which is a real drift
41553
+ // hazard — so it is held by a test that reprices both from the migration
41554
+ // and fails if they disagree, rather than by anyone remembering.
41555
+ description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
41544
41556
  access: "write",
41545
41557
  requires_org_opt_in: true
41546
41558
  }
41547
41559
  ],
41548
41560
  beta: true,
41561
+ // ENG-9278: STILL `included`, and the meter does not change that.
41562
+ //
41563
+ // Ninja Notes acquired its first metered path — live advising — and the
41564
+ // obvious move was to flip this to `usage`. It is refused. `pricing` drives
41565
+ // the org admin's acknowledgement modal, where `usage` renders as "manages
41566
+ // and bills by usage"; saying that to the many orgs who record notes and
41567
+ // never arm an advisor would be a false statement in a consent dialog, which
41568
+ // is the exact harm the `included` case was added to prevent, inverted.
41569
+ //
41570
+ // Notes really are included. The one metered thing is a capability with its
41571
+ // own org opt-in and its own price in its own description, which is where
41572
+ // the consent for it actually happens.
41573
+ //
41574
+ // The cost of this choice is that the rate card is not rendered on the
41575
+ // premium surface (that reads definition-level meters, and only for
41576
+ // `pricing: 'usage'`), so the price is prose in two places. Pricing the
41577
+ // CAPABILITY instead — meters on the capability descriptor, read by the
41578
+ // premium surface — is the structurally right answer and the follow-up.
41549
41579
  premium: {
41550
41580
  pricing: "included",
41551
- 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."
41581
+ note: "Notes are included in your plan. Transcription runs on your own Mac and no platform summariser runs, so nothing is metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other. Live meeting advising is the one exception: it is turned on separately, and billed per minute the advisor is armed."
41552
41582
  }
41553
41583
  },
41554
41584
  {
@@ -47032,19 +47062,23 @@ async function resolveArtefactText(url) {
47032
47062
  url
47033
47063
  });
47034
47064
  const a = data.artefact;
47065
+ const nextStep = a.owned_by_caller ? "Use this id with artefacts_get, artefacts_download, or artefacts_assign_project." : a.content_url ? "Published by another agent in your organisation, so artefacts_get and artefacts_download will NOT resolve it. Read the page by fetching the content URL above." : "Published by another agent in your organisation AND gated behind a viewer password or email prompt, so its content is not readable from here. Ask the agent that published it.";
47035
47066
  return [
47036
47067
  `Resolved to artefact ${a.id}`,
47037
47068
  `Slug: ${a.publisher_resource_id}`,
47038
47069
  a.title ? `Title: ${a.title}` : null,
47039
- `Kind: ${a.kind} [${a.status}]`,
47070
+ `Kind: ${a.kind} [${a.status}]${a.gated ? " [gated]" : ""}`,
47040
47071
  a.project_id ? `Project: ${a.project_id}` : null,
47041
- a.live_url ? `URL: ${a.live_url}` : null,
47042
- "Use this id with artefacts_get, artefacts_download, or artefacts_assign_project."
47072
+ a.live_url ? `Shell URL: ${a.live_url}` : null,
47073
+ // Named "content" and explained inline, because the entire failure this
47074
+ // fixes was a reader assuming the page URL was the page.
47075
+ a.content_url ? `Content URL: ${a.content_url} <- fetch THIS to read the page. The shell URL above only loads it.` : null,
47076
+ nextStep
47043
47077
  ].filter((s) => s !== null).join("\n");
47044
47078
  }
47045
47079
  server.tool(
47046
47080
  "artefacts_resolve",
47047
- "Resolve an Augmented Live URL (e.g. https://live.augmented.team/<slug>) or a bare slug to the internal artefact id, so you can act on a link someone shared. Returns the id plus title, kind, status, and project. Only resolves your own published artefacts.",
47081
+ "Resolve an Augmented Live URL (e.g. https://live.augmented.team/<slug>) or a bare slug to the internal artefact id, so you can act on a link someone shared. Returns the id plus title, kind, status, project, and the CONTENT url. Resolves any published artefact in your ORGANISATION, not just your own - so a link a teammate or a human shared with you works. Note the shell/content split: the page URL serves a wrapper that loads the body from the content URL, so fetch the content URL to read what is on the page. The content-returning tools (artefacts_get, artefacts_download, artefacts_get_source_chunk) remain limited to artefacts YOU published.",
47048
47082
  {
47049
47083
  url: external_exports.string().min(1).describe("An Augmented Live URL or the bare slug from one (the last path segment)")
47050
47084
  },
@@ -40348,15 +40348,45 @@ var INTEGRATION_REGISTRY = [
40348
40348
  // `live-meeting-advisor` in FLAG_REGISTRY, which is a staff control.
40349
40349
  id: "ninjafy-notes:live-advise",
40350
40350
  name: "Live Meeting Advice",
40351
- description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed.",
40351
+ // ENG-9278: THE PRICE IS QUOTED PER MEETING, NEVER PER HOUR. Nobody arms
40352
+ // an advisor for "an hour" — they arm it for a meeting — and the hourly
40353
+ // figure reads as a subscription for something billed only while it
40354
+ // runs. Both currencies are stated outright because the sub-dollar line
40355
+ // is USD-only; a spot conversion of either would not be a clean quote in
40356
+ // the other.
40357
+ //
40358
+ // These two figures are the rate card's ($0.03 USD / $0.05 AUD per armed
40359
+ // minute, migration 20260827000001) multiplied by thirty. They are prose
40360
+ // here rather than read from the rate card, which is a real drift
40361
+ // hazard — so it is held by a test that reprices both from the migration
40362
+ // and fails if they disagree, rather than by anyone remembering.
40363
+ description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
40352
40364
  access: "write",
40353
40365
  requires_org_opt_in: true
40354
40366
  }
40355
40367
  ],
40356
40368
  beta: true,
40369
+ // ENG-9278: STILL `included`, and the meter does not change that.
40370
+ //
40371
+ // Ninja Notes acquired its first metered path — live advising — and the
40372
+ // obvious move was to flip this to `usage`. It is refused. `pricing` drives
40373
+ // the org admin's acknowledgement modal, where `usage` renders as "manages
40374
+ // and bills by usage"; saying that to the many orgs who record notes and
40375
+ // never arm an advisor would be a false statement in a consent dialog, which
40376
+ // is the exact harm the `included` case was added to prevent, inverted.
40377
+ //
40378
+ // Notes really are included. The one metered thing is a capability with its
40379
+ // own org opt-in and its own price in its own description, which is where
40380
+ // the consent for it actually happens.
40381
+ //
40382
+ // The cost of this choice is that the rate card is not rendered on the
40383
+ // premium surface (that reads definition-level meters, and only for
40384
+ // `pricing: 'usage'`), so the price is prose in two places. Pricing the
40385
+ // CAPABILITY instead — meters on the capability descriptor, read by the
40386
+ // premium surface — is the structurally right answer and the follow-up.
40357
40387
  premium: {
40358
40388
  pricing: "included",
40359
- 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."
40389
+ note: "Notes are included in your plan. Transcription runs on your own Mac and no platform summariser runs, so nothing is metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other. Live meeting advising is the one exception: it is turned on separately, and billed per minute the advisor is armed."
40360
40390
  }
40361
40391
  },
40362
40392
  {
@@ -34404,15 +34404,45 @@ var INTEGRATION_REGISTRY = [
34404
34404
  // `live-meeting-advisor` in FLAG_REGISTRY, which is a staff control.
34405
34405
  id: "ninjafy-notes:live-advise",
34406
34406
  name: "Live Meeting Advice",
34407
- description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed.",
34407
+ // ENG-9278: THE PRICE IS QUOTED PER MEETING, NEVER PER HOUR. Nobody arms
34408
+ // an advisor for "an hour" — they arm it for a meeting — and the hourly
34409
+ // figure reads as a subscription for something billed only while it
34410
+ // runs. Both currencies are stated outright because the sub-dollar line
34411
+ // is USD-only; a spot conversion of either would not be a clean quote in
34412
+ // the other.
34413
+ //
34414
+ // These two figures are the rate card's ($0.03 USD / $0.05 AUD per armed
34415
+ // minute, migration 20260827000001) multiplied by thirty. They are prose
34416
+ // here rather than read from the rate card, which is a real drift
34417
+ // hazard — so it is held by a test that reprices both from the migration
34418
+ // and fails if they disagree, rather than by anyone remembering.
34419
+ description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
34408
34420
  access: "write",
34409
34421
  requires_org_opt_in: true
34410
34422
  }
34411
34423
  ],
34412
34424
  beta: true,
34425
+ // ENG-9278: STILL `included`, and the meter does not change that.
34426
+ //
34427
+ // Ninja Notes acquired its first metered path — live advising — and the
34428
+ // obvious move was to flip this to `usage`. It is refused. `pricing` drives
34429
+ // the org admin's acknowledgement modal, where `usage` renders as "manages
34430
+ // and bills by usage"; saying that to the many orgs who record notes and
34431
+ // never arm an advisor would be a false statement in a consent dialog, which
34432
+ // is the exact harm the `included` case was added to prevent, inverted.
34433
+ //
34434
+ // Notes really are included. The one metered thing is a capability with its
34435
+ // own org opt-in and its own price in its own description, which is where
34436
+ // the consent for it actually happens.
34437
+ //
34438
+ // The cost of this choice is that the rate card is not rendered on the
34439
+ // premium surface (that reads definition-level meters, and only for
34440
+ // `pricing: 'usage'`), so the price is prose in two places. Pricing the
34441
+ // CAPABILITY instead — meters on the capability descriptor, read by the
34442
+ // premium surface — is the structurally right answer and the follow-up.
34413
34443
  premium: {
34414
34444
  pricing: "included",
34415
- 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."
34445
+ note: "Notes are included in your plan. Transcription runs on your own Mac and no platform summariser runs, so nothing is metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other. Live meeting advising is the one exception: it is turned on separately, and billed per minute the advisor is armed."
34416
34446
  }
34417
34447
  },
34418
34448
  {
@@ -34560,15 +34560,45 @@ var INTEGRATION_REGISTRY = [
34560
34560
  // `live-meeting-advisor` in FLAG_REGISTRY, which is a staff control.
34561
34561
  id: "ninjafy-notes:live-advise",
34562
34562
  name: "Live Meeting Advice",
34563
- description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed.",
34563
+ // ENG-9278: THE PRICE IS QUOTED PER MEETING, NEVER PER HOUR. Nobody arms
34564
+ // an advisor for "an hour" — they arm it for a meeting — and the hourly
34565
+ // figure reads as a subscription for something billed only while it
34566
+ // runs. Both currencies are stated outright because the sub-dollar line
34567
+ // is USD-only; a spot conversion of either would not be a clean quote in
34568
+ // the other.
34569
+ //
34570
+ // These two figures are the rate card's ($0.03 USD / $0.05 AUD per armed
34571
+ // minute, migration 20260827000001) multiplied by thirty. They are prose
34572
+ // here rather than read from the rate card, which is a real drift
34573
+ // hazard — so it is held by a test that reprices both from the migration
34574
+ // and fails if they disagree, rather than by anyone remembering.
34575
+ description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Augmented Team to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
34564
34576
  access: "write",
34565
34577
  requires_org_opt_in: true
34566
34578
  }
34567
34579
  ],
34568
34580
  beta: true,
34581
+ // ENG-9278: STILL `included`, and the meter does not change that.
34582
+ //
34583
+ // Ninja Notes acquired its first metered path — live advising — and the
34584
+ // obvious move was to flip this to `usage`. It is refused. `pricing` drives
34585
+ // the org admin's acknowledgement modal, where `usage` renders as "manages
34586
+ // and bills by usage"; saying that to the many orgs who record notes and
34587
+ // never arm an advisor would be a false statement in a consent dialog, which
34588
+ // is the exact harm the `included` case was added to prevent, inverted.
34589
+ //
34590
+ // Notes really are included. The one metered thing is a capability with its
34591
+ // own org opt-in and its own price in its own description, which is where
34592
+ // the consent for it actually happens.
34593
+ //
34594
+ // The cost of this choice is that the rate card is not rendered on the
34595
+ // premium surface (that reads definition-level meters, and only for
34596
+ // `pricing: 'usage'`), so the price is prose in two places. Pricing the
34597
+ // CAPABILITY instead — meters on the capability descriptor, read by the
34598
+ // premium surface — is the structurally right answer and the follow-up.
34569
34599
  premium: {
34570
34600
  pricing: "included",
34571
- 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."
34601
+ note: "Notes are included in your plan. Transcription runs on your own Mac and no platform summariser runs, so nothing is metered per note \u2014 the agent turn that reads it is billed as agent-hours like any other. Live meeting advising is the one exception: it is turned on separately, and billed per minute the advisor is armed."
34572
34602
  }
34573
34603
  },
34574
34604
  {
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-GE2FIKUX.js";
47
- import "./chunk-QRQE2MVT.js";
46
+ } from "./chunk-JWFVVQ5R.js";
47
+ import "./chunk-DX3REH6Z.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-7XILEFLF.js.map
95
+ //# sourceMappingURL=persistent-session-V72ISHD4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-GE2FIKUX.js";
4
- import "./chunk-QRQE2MVT.js";
3
+ } from "./chunk-JWFVVQ5R.js";
4
+ import "./chunk-DX3REH6Z.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -745,4 +745,4 @@ export {
745
745
  readAndResetSlackReplyBindingClassifications,
746
746
  readAndResetSlackReplyTargetClassifications
747
747
  };
748
- //# sourceMappingURL=responsiveness-probe-ZU33A2GB.js.map
748
+ //# sourceMappingURL=responsiveness-probe-BW5AHMES.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-QRQE2MVT.js";
3
+ } from "./chunk-DX3REH6Z.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-ODQB4UPP.js.map
206
+ //# sourceMappingURL=session-auth-dead-H5IVXY2C.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.700",
3
+ "version": "0.28.702",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {