@integrity-labs/agt-cli 0.28.1003 → 0.28.1004

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.
@@ -23,7 +23,7 @@ import {
23
23
  rotateDailySession,
24
24
  sessionFileExists,
25
25
  todayLocalIso
26
- } from "./chunk-BMDLKZHZ.js";
26
+ } from "./chunk-532V7ZSC.js";
27
27
  import {
28
28
  classifyUnanswerablePane,
29
29
  findUsageLimitResetHint,
@@ -5776,4 +5776,4 @@ export {
5776
5776
  stopAllSessionsAndWait,
5777
5777
  getProjectDir
5778
5778
  };
5779
- //# sourceMappingURL=chunk-CXU7NLNR.js.map
5779
+ //# sourceMappingURL=chunk-HHBAQ6ZV.js.map
@@ -15,7 +15,7 @@ import {
15
15
  parseEnvFileEntries,
16
16
  parseEnvIntegrations,
17
17
  shellQuote
18
- } from "./chunk-CXU7NLNR.js";
18
+ } from "./chunk-HHBAQ6ZV.js";
19
19
  import {
20
20
  BIND_FAILURE_QUARANTINE_THRESHOLD,
21
21
  INTEGRATIONS_SECTION_END,
@@ -75,7 +75,7 @@ import {
75
75
  sessionTranscriptDir,
76
76
  worseConnectivityOutcome,
77
77
  wrapScheduledTaskPrompt
78
- } from "./chunk-BMDLKZHZ.js";
78
+ } from "./chunk-532V7ZSC.js";
79
79
  import {
80
80
  classifyUnanswerablePane,
81
81
  summarizeUnanswerablePane
@@ -6974,7 +6974,7 @@ function exchangeFailureKind(err) {
6974
6974
  }
6975
6975
 
6976
6976
  // src/lib/api-client.ts
6977
- var agtCliVersion = true ? "0.28.1003" : "dev";
6977
+ var agtCliVersion = true ? "0.28.1004" : "dev";
6978
6978
  var lastConfigHash = null;
6979
6979
  function setConfigHash(hash) {
6980
6980
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -11725,4 +11725,4 @@ export {
11725
11725
  managerInstallSystemUnitCommand,
11726
11726
  managerUninstallSystemUnitCommand
11727
11727
  };
11728
- //# sourceMappingURL=chunk-PU5DFL6O.js.map
11728
+ //# sourceMappingURL=chunk-N4PG4TAD.js.map
@@ -259,7 +259,7 @@ async function spawnPairSession(session) {
259
259
  return { ok: true };
260
260
  } catch {
261
261
  }
262
- const { resolveClaudeBinary } = await import("./persistent-session-CRF4B3SP.js");
262
+ const { resolveClaudeBinary } = await import("./persistent-session-JUGGNJSB.js");
263
263
  const claudeBin = resolveClaudeBinary();
264
264
  const pairEnv = {
265
265
  ...process.env,
@@ -581,4 +581,4 @@ export {
581
581
  startClaudePair,
582
582
  submitClaudePairCode
583
583
  };
584
- //# sourceMappingURL=claude-pair-runtime-QUYSD5OB.js.map
584
+ //# sourceMappingURL=claude-pair-runtime-EUYI3B4I.js.map
@@ -63,7 +63,7 @@ import {
63
63
  safeWriteJsonAtomic,
64
64
  setConfigHash,
65
65
  tripClass
66
- } from "../chunk-PU5DFL6O.js";
66
+ } from "../chunk-N4PG4TAD.js";
67
67
  import {
68
68
  getProjectDir as getProjectDir2,
69
69
  getReadyTasks,
@@ -141,7 +141,7 @@ import {
141
141
  takeZombieDetection,
142
142
  toOpencodeModel,
143
143
  writeEgressAllowlist
144
- } from "../chunk-CXU7NLNR.js";
144
+ } from "../chunk-HHBAQ6ZV.js";
145
145
  import {
146
146
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
147
147
  AnchorSessionClient,
@@ -240,7 +240,7 @@ import {
240
240
  subagentActivityAgeSeconds,
241
241
  sumTranscriptUsageInWindow,
242
242
  transcriptActivityAgeSeconds
243
- } from "../chunk-BMDLKZHZ.js";
243
+ } from "../chunk-532V7ZSC.js";
244
244
  import "../chunk-DHWNVVX4.js";
245
245
  import {
246
246
  reapOrphanChannelMcps
@@ -13311,7 +13311,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
13311
13311
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
13312
13312
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
13313
13313
  async function channelInboundActivityAgeSecondsFor(codeName) {
13314
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-4LTZNFRC.js");
13314
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-QLOVCTVA.js");
13315
13315
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
13316
13316
  if (newest === null) return null;
13317
13317
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -14054,7 +14054,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
14054
14054
  var lastVersionCheckAt = 0;
14055
14055
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
14056
14056
  var lastResponsivenessProbeAt = 0;
14057
- var agtCliVersion = true ? "0.28.1003" : "dev";
14057
+ var agtCliVersion = true ? "0.28.1004" : "dev";
14058
14058
  function resolveBrewPath(execFileSync2) {
14059
14059
  try {
14060
14060
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15670,7 +15670,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15670
15670
  if (codeNames.length === 0) return;
15671
15671
  void (async () => {
15672
15672
  try {
15673
- const { collectDiagnostics } = await import("../persistent-session-CRF4B3SP.js");
15673
+ const { collectDiagnostics } = await import("../persistent-session-JUGGNJSB.js");
15674
15674
  await api.post("/host/heartbeat", {
15675
15675
  host_id: hostId,
15676
15676
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15812,7 +15812,7 @@ async function pollCycleInner() {
15812
15812
  }
15813
15813
  try {
15814
15814
  const { detectHostSecurity } = await import("../host-security-KQYYZZVW.js");
15815
- const { collectDiagnostics } = await import("../persistent-session-CRF4B3SP.js");
15815
+ const { collectDiagnostics } = await import("../persistent-session-JUGGNJSB.js");
15816
15816
  const diagCodeNames = [...agentState.persistentSessionAgents];
15817
15817
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15818
15818
  let tailscaleHostname;
@@ -15988,7 +15988,7 @@ async function pollCycleInner() {
15988
15988
  collectPanelessActivityProbes,
15989
15989
  getResponsivenessIntervalMs,
15990
15990
  occupancyQualificationClassifications
15991
- } = await import("../responsiveness-probe-4LTZNFRC.js");
15991
+ } = await import("../responsiveness-probe-QLOVCTVA.js");
15992
15992
  const probeIntervalMs = getResponsivenessIntervalMs();
15993
15993
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15994
15994
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -16105,7 +16105,7 @@ async function pollCycleInner() {
16105
16105
  collectResponsivenessProbes,
16106
16106
  livePendingInboundOldestAgeSeconds,
16107
16107
  parkPendingInbound
16108
- } = await import("../responsiveness-probe-4LTZNFRC.js");
16108
+ } = await import("../responsiveness-probe-QLOVCTVA.js");
16109
16109
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-M6AFZWNU.js");
16110
16110
  const wedgeNow = /* @__PURE__ */ new Date();
16111
16111
  const liveAgents = agentState.persistentSessionAgents;
@@ -16261,7 +16261,7 @@ async function pollCycleInner() {
16261
16261
  }
16262
16262
  try {
16263
16263
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-VR5QGP3J.js");
16264
- const { probeSessionAuth } = await import("../session-auth-dead-ZZVXXEYG.js");
16264
+ const { probeSessionAuth } = await import("../session-auth-dead-7F2QBEAZ.js");
16265
16265
  const observations = [];
16266
16266
  const pendingCacheCommits = [];
16267
16267
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -20549,7 +20549,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20549
20549
  try {
20550
20550
  const freshId = rotateSessionForWedge(codeName);
20551
20551
  consecutiveWedgeCycles.delete(codeName);
20552
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-4LTZNFRC.js");
20552
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-QLOVCTVA.js");
20553
20553
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
20554
20554
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
20555
20555
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -20592,7 +20592,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20592
20592
  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}`));
20593
20593
  void (async () => {
20594
20594
  try {
20595
- const { collectDiagnostics } = await import("../persistent-session-CRF4B3SP.js");
20595
+ const { collectDiagnostics } = await import("../persistent-session-JUGGNJSB.js");
20596
20596
  await api.post("/host/heartbeat", {
20597
20597
  host_id: hostId,
20598
20598
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20643,7 +20643,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
20643
20643
  }
20644
20644
  try {
20645
20645
  const hostId = await getHostId();
20646
- const { collectDiagnostics } = await import("../persistent-session-CRF4B3SP.js");
20646
+ const { collectDiagnostics } = await import("../persistent-session-JUGGNJSB.js");
20647
20647
  await api.post("/host/heartbeat", {
20648
20648
  host_id: hostId,
20649
20649
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -21303,7 +21303,7 @@ async function processClaudePairSessions(agents) {
21303
21303
  killPairSession,
21304
21304
  pairTmuxSession,
21305
21305
  finalizeClaudePairOnboarding
21306
- } = await import("../claude-pair-runtime-QUYSD5OB.js");
21306
+ } = await import("../claude-pair-runtime-EUYI3B4I.js");
21307
21307
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
21308
21308
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
21309
21309
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -34746,6 +34746,52 @@ var INTEGRATION_REGISTRY = [
34746
34746
  }]
34747
34747
  }
34748
34748
  },
34749
+ {
34750
+ // ENG-10854 / ADR-0110. The POLICY half of the catalog definition: this
34751
+ // registry is what `isPremiumDefinition` reads, so the premium descriptor
34752
+ // here is what makes the per-org opt-in required at all. The CUSTOMER-FACING
34753
+ // half - the seeded `integration_definitions` row that the Add Integration
34754
+ // picker lists - is deliberately NOT in this change. `/integrations/installs`
34755
+ // reads the DB catalog with a status filter; this registry is not a listing.
34756
+ //
34757
+ // The order matters and is not bookkeeping: `isOrgEntitledToPremium` returns
34758
+ // TRUE for a definition it does not know as premium, because a free
34759
+ // integration has no opt-in concept. So a broker shipped ahead of this entry
34760
+ // would serve an org that had never opted in. The broker additionally fails
34761
+ // closed on `isPremiumDefinition` being false, so the two halves cannot come
34762
+ // apart in that direction either.
34763
+ id: "typed-evaluation",
34764
+ name: "Typed Evaluation",
34765
+ category: "knowledge",
34766
+ description: "Ask closed questions about a piece of text and get calibrated answers back \u2014 yes/no, pick-one, or a position on your own scale \u2014 with a probability for each. It never writes text and cannot answer outside the set of options you give it, which is what makes it safe to point at content you do not trust. Typical uses: is this message a repeat request, which category does this belong to, how urgent does this sound. Answers arrive in about half a second, so an agent can branch on one without spending a model turn.",
34767
+ // No customer credential exists: the call runs on Ninjafy's own gateway key.
34768
+ supported_auth_types: ["none"],
34769
+ capabilities: [
34770
+ {
34771
+ id: "typed-evaluation:evaluate",
34772
+ name: "Evaluate Text",
34773
+ description: "Ask closed questions about text the agent already holds and receive typed answers with probabilities (evaluate_text).",
34774
+ access: "read"
34775
+ }
34776
+ ],
34777
+ beta: true,
34778
+ // ENG-8842's `included`, and the reason is the consent dialog rather than
34779
+ // the price. `pricing` drives the org admin's acknowledgement modal, where
34780
+ // `usage` renders as "manages and bills by usage" and `monthly` as a
34781
+ // subscription. Both would be false statements here: a call costs about
34782
+ // $0.000076 and nothing is metered or billed, so the opt-in exists to record
34783
+ // a decision about a SUB-PROCESSOR, not about money.
34784
+ //
34785
+ // ADR-0110 Decision 11 keeps the door open deliberately: if a genuinely
34786
+ // high-volume capability arrives later - bulk classification of a customer's
34787
+ // own corpus - it is priced at THAT capability's grain and this definition
34788
+ // stays `included`. Ninja Notes is the precedent (ENG-9278): it acquired a
34789
+ // metered capability and did not flip.
34790
+ premium: {
34791
+ pricing: "included",
34792
+ note: "Typed evaluation is included in your plan \u2014 nothing is metered per question. Turning it on is a decision about data, not cost: the text an agent asks about is sent to Typesafe, through our own gateway, to be scored. It is never used to train a model and we store only the answers, never the text."
34793
+ }
34794
+ },
34749
34795
  {
34750
34796
  // Ninja Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
34751
34797
  // delivered to an agent as a tag-granted note the agent reads and summarises.
@@ -37264,6 +37310,33 @@ var FLAG_REGISTRY = [
37264
37310
  // "these hosts are unreadable". Both outlive this particular version.
37265
37311
  since: "0.28.667"
37266
37312
  },
37313
+ {
37314
+ // ADR-0110 Decision 5 (ENG-10854). Gates PLATFORM-INTERNAL consumers of the
37315
+ // typed evaluation capability - inbound triage, kanban classification,
37316
+ // memory-extraction sensitivity gating, and later the conversation
37317
+ // evaluator. Nobody "installs" those; they are ours, so they are gated
37318
+ // centrally.
37319
+ //
37320
+ // IT DOES NOT GATE THE AGENT TOOL, and that separation is the point. The
37321
+ // agent tool's gate is the customer's own premium opt-in plus a per-agent
37322
+ // install (Decision 4). Pointing this flag at the tool as well would give
37323
+ // it two masters and let a staff flag silently override a decision the
37324
+ // customer made about their own data reaching a sub-processor.
37325
+ //
37326
+ // Ships with no readers: the consumers land in later slices, and the flag
37327
+ // exists now so the first of them has a gate to be born behind rather than
37328
+ // acquiring one afterwards.
37329
+ key: "typed-evaluation",
37330
+ description: "ADR-0110: platform-internal consumers of the typed evaluation model (Jev, via our AI Gateway). OFF (default) = no internal consumer calls it; ON = consumers that have shipped may call, each still subject to the per-org quota, per-agent rate limit and audit row enforced in the broker. Does NOT gate the agent-facing tool, which is governed by the premium opt-in and a per-agent install instead. Customer orgs stay off until the Decision 9 vendor gates close (sub-processor listing with DPA coverage, the legal read on emotion inference, and a recorded disclosure).",
37331
+ flagType: "boolean",
37332
+ // Ships dark. Every consumer degrades to its current behaviour when off,
37333
+ // so the safe value and the no-op value are the same one.
37334
+ defaultValue: false,
37335
+ // Turning it on starts sending customer text to an external sub-processor
37336
+ // on paths the customer did not individually opt into, which is exactly the
37337
+ // class ADR-0022 section 4 reserves the confirmation for.
37338
+ sensitive: true
37339
+ },
37267
37340
  {
37268
37341
  key: "conversation-eval-backend",
37269
37342
  description: "Backend for host-side conversation-success scoring AND memory extraction (ENG-6581), which share one scorer: anthropic-api = Haiku via a direct Anthropic Messages API fetch (no subprocess); claude-p = Haiku via the `claude -p` subprocess (reuses the agent auth, effectively free under Max but a heavy spawn); local = an OpenAI-compatible loopback endpoint (transcript never leaves the host). Auth for the anthropic-api path comes from AGT_CONV_EVAL_ANTHROPIC_API_KEY (falls back to ANTHROPIC_API_KEY); with no key that path fails closed (eval disabled) rather than reverting to claude-p. Enum.",
package/dist/mcp/index.js CHANGED
@@ -27328,6 +27328,52 @@ var INTEGRATION_REGISTRY = [
27328
27328
  }]
27329
27329
  }
27330
27330
  },
27331
+ {
27332
+ // ENG-10854 / ADR-0110. The POLICY half of the catalog definition: this
27333
+ // registry is what `isPremiumDefinition` reads, so the premium descriptor
27334
+ // here is what makes the per-org opt-in required at all. The CUSTOMER-FACING
27335
+ // half - the seeded `integration_definitions` row that the Add Integration
27336
+ // picker lists - is deliberately NOT in this change. `/integrations/installs`
27337
+ // reads the DB catalog with a status filter; this registry is not a listing.
27338
+ //
27339
+ // The order matters and is not bookkeeping: `isOrgEntitledToPremium` returns
27340
+ // TRUE for a definition it does not know as premium, because a free
27341
+ // integration has no opt-in concept. So a broker shipped ahead of this entry
27342
+ // would serve an org that had never opted in. The broker additionally fails
27343
+ // closed on `isPremiumDefinition` being false, so the two halves cannot come
27344
+ // apart in that direction either.
27345
+ id: "typed-evaluation",
27346
+ name: "Typed Evaluation",
27347
+ category: "knowledge",
27348
+ description: "Ask closed questions about a piece of text and get calibrated answers back \u2014 yes/no, pick-one, or a position on your own scale \u2014 with a probability for each. It never writes text and cannot answer outside the set of options you give it, which is what makes it safe to point at content you do not trust. Typical uses: is this message a repeat request, which category does this belong to, how urgent does this sound. Answers arrive in about half a second, so an agent can branch on one without spending a model turn.",
27349
+ // No customer credential exists: the call runs on Ninjafy's own gateway key.
27350
+ supported_auth_types: ["none"],
27351
+ capabilities: [
27352
+ {
27353
+ id: "typed-evaluation:evaluate",
27354
+ name: "Evaluate Text",
27355
+ description: "Ask closed questions about text the agent already holds and receive typed answers with probabilities (evaluate_text).",
27356
+ access: "read"
27357
+ }
27358
+ ],
27359
+ beta: true,
27360
+ // ENG-8842's `included`, and the reason is the consent dialog rather than
27361
+ // the price. `pricing` drives the org admin's acknowledgement modal, where
27362
+ // `usage` renders as "manages and bills by usage" and `monthly` as a
27363
+ // subscription. Both would be false statements here: a call costs about
27364
+ // $0.000076 and nothing is metered or billed, so the opt-in exists to record
27365
+ // a decision about a SUB-PROCESSOR, not about money.
27366
+ //
27367
+ // ADR-0110 Decision 11 keeps the door open deliberately: if a genuinely
27368
+ // high-volume capability arrives later - bulk classification of a customer's
27369
+ // own corpus - it is priced at THAT capability's grain and this definition
27370
+ // stays `included`. Ninja Notes is the precedent (ENG-9278): it acquired a
27371
+ // metered capability and did not flip.
27372
+ premium: {
27373
+ pricing: "included",
27374
+ note: "Typed evaluation is included in your plan \u2014 nothing is metered per question. Turning it on is a decision about data, not cost: the text an agent asks about is sent to Typesafe, through our own gateway, to be scored. It is never used to train a model and we store only the answers, never the text."
27375
+ }
27376
+ },
27331
27377
  {
27332
27378
  // Ninja Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
27333
27379
  // delivered to an agent as a tag-granted note the agent reads and summarises.
@@ -29561,6 +29607,33 @@ var FLAG_REGISTRY = [
29561
29607
  // "these hosts are unreadable". Both outlive this particular version.
29562
29608
  since: "0.28.667"
29563
29609
  },
29610
+ {
29611
+ // ADR-0110 Decision 5 (ENG-10854). Gates PLATFORM-INTERNAL consumers of the
29612
+ // typed evaluation capability - inbound triage, kanban classification,
29613
+ // memory-extraction sensitivity gating, and later the conversation
29614
+ // evaluator. Nobody "installs" those; they are ours, so they are gated
29615
+ // centrally.
29616
+ //
29617
+ // IT DOES NOT GATE THE AGENT TOOL, and that separation is the point. The
29618
+ // agent tool's gate is the customer's own premium opt-in plus a per-agent
29619
+ // install (Decision 4). Pointing this flag at the tool as well would give
29620
+ // it two masters and let a staff flag silently override a decision the
29621
+ // customer made about their own data reaching a sub-processor.
29622
+ //
29623
+ // Ships with no readers: the consumers land in later slices, and the flag
29624
+ // exists now so the first of them has a gate to be born behind rather than
29625
+ // acquiring one afterwards.
29626
+ key: "typed-evaluation",
29627
+ description: "ADR-0110: platform-internal consumers of the typed evaluation model (Jev, via our AI Gateway). OFF (default) = no internal consumer calls it; ON = consumers that have shipped may call, each still subject to the per-org quota, per-agent rate limit and audit row enforced in the broker. Does NOT gate the agent-facing tool, which is governed by the premium opt-in and a per-agent install instead. Customer orgs stay off until the Decision 9 vendor gates close (sub-processor listing with DPA coverage, the legal read on emotion inference, and a recorded disclosure).",
29628
+ flagType: "boolean",
29629
+ // Ships dark. Every consumer degrades to its current behaviour when off,
29630
+ // so the safe value and the no-op value are the same one.
29631
+ defaultValue: false,
29632
+ // Turning it on starts sending customer text to an external sub-processor
29633
+ // on paths the customer did not individually opt into, which is exactly the
29634
+ // class ADR-0022 section 4 reserves the confirmation for.
29635
+ sensitive: true
29636
+ },
29564
29637
  {
29565
29638
  key: "conversation-eval-backend",
29566
29639
  description: "Backend for host-side conversation-success scoring AND memory extraction (ENG-6581), which share one scorer: anthropic-api = Haiku via a direct Anthropic Messages API fetch (no subprocess); claude-p = Haiku via the `claude -p` subprocess (reuses the agent auth, effectively free under Max but a heavy spawn); local = an OpenAI-compatible loopback endpoint (transcript never leaves the host). Auth for the anthropic-api path comes from AGT_CONV_EVAL_ANTHROPIC_API_KEY (falls back to ANTHROPIC_API_KEY); with no key that path fails closed (eval disabled) rather than reverting to claude-p. Enum.",
@@ -41479,6 +41479,52 @@ var INTEGRATION_REGISTRY = [
41479
41479
  }]
41480
41480
  }
41481
41481
  },
41482
+ {
41483
+ // ENG-10854 / ADR-0110. The POLICY half of the catalog definition: this
41484
+ // registry is what `isPremiumDefinition` reads, so the premium descriptor
41485
+ // here is what makes the per-org opt-in required at all. The CUSTOMER-FACING
41486
+ // half - the seeded `integration_definitions` row that the Add Integration
41487
+ // picker lists - is deliberately NOT in this change. `/integrations/installs`
41488
+ // reads the DB catalog with a status filter; this registry is not a listing.
41489
+ //
41490
+ // The order matters and is not bookkeeping: `isOrgEntitledToPremium` returns
41491
+ // TRUE for a definition it does not know as premium, because a free
41492
+ // integration has no opt-in concept. So a broker shipped ahead of this entry
41493
+ // would serve an org that had never opted in. The broker additionally fails
41494
+ // closed on `isPremiumDefinition` being false, so the two halves cannot come
41495
+ // apart in that direction either.
41496
+ id: "typed-evaluation",
41497
+ name: "Typed Evaluation",
41498
+ category: "knowledge",
41499
+ description: "Ask closed questions about a piece of text and get calibrated answers back \u2014 yes/no, pick-one, or a position on your own scale \u2014 with a probability for each. It never writes text and cannot answer outside the set of options you give it, which is what makes it safe to point at content you do not trust. Typical uses: is this message a repeat request, which category does this belong to, how urgent does this sound. Answers arrive in about half a second, so an agent can branch on one without spending a model turn.",
41500
+ // No customer credential exists: the call runs on Ninjafy's own gateway key.
41501
+ supported_auth_types: ["none"],
41502
+ capabilities: [
41503
+ {
41504
+ id: "typed-evaluation:evaluate",
41505
+ name: "Evaluate Text",
41506
+ description: "Ask closed questions about text the agent already holds and receive typed answers with probabilities (evaluate_text).",
41507
+ access: "read"
41508
+ }
41509
+ ],
41510
+ beta: true,
41511
+ // ENG-8842's `included`, and the reason is the consent dialog rather than
41512
+ // the price. `pricing` drives the org admin's acknowledgement modal, where
41513
+ // `usage` renders as "manages and bills by usage" and `monthly` as a
41514
+ // subscription. Both would be false statements here: a call costs about
41515
+ // $0.000076 and nothing is metered or billed, so the opt-in exists to record
41516
+ // a decision about a SUB-PROCESSOR, not about money.
41517
+ //
41518
+ // ADR-0110 Decision 11 keeps the door open deliberately: if a genuinely
41519
+ // high-volume capability arrives later - bulk classification of a customer's
41520
+ // own corpus - it is priced at THAT capability's grain and this definition
41521
+ // stays `included`. Ninja Notes is the precedent (ENG-9278): it acquired a
41522
+ // metered capability and did not flip.
41523
+ premium: {
41524
+ pricing: "included",
41525
+ note: "Typed evaluation is included in your plan \u2014 nothing is metered per question. Turning it on is a decision about data, not cost: the text an agent asks about is sent to Typesafe, through our own gateway, to be scored. It is never used to train a model and we store only the answers, never the text."
41526
+ }
41527
+ },
41482
41528
  {
41483
41529
  // Ninja Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
41484
41530
  // delivered to an agent as a tag-granted note the agent reads and summarises.
@@ -43509,6 +43555,33 @@ var FLAG_REGISTRY = [
43509
43555
  // "these hosts are unreadable". Both outlive this particular version.
43510
43556
  since: "0.28.667"
43511
43557
  },
43558
+ {
43559
+ // ADR-0110 Decision 5 (ENG-10854). Gates PLATFORM-INTERNAL consumers of the
43560
+ // typed evaluation capability - inbound triage, kanban classification,
43561
+ // memory-extraction sensitivity gating, and later the conversation
43562
+ // evaluator. Nobody "installs" those; they are ours, so they are gated
43563
+ // centrally.
43564
+ //
43565
+ // IT DOES NOT GATE THE AGENT TOOL, and that separation is the point. The
43566
+ // agent tool's gate is the customer's own premium opt-in plus a per-agent
43567
+ // install (Decision 4). Pointing this flag at the tool as well would give
43568
+ // it two masters and let a staff flag silently override a decision the
43569
+ // customer made about their own data reaching a sub-processor.
43570
+ //
43571
+ // Ships with no readers: the consumers land in later slices, and the flag
43572
+ // exists now so the first of them has a gate to be born behind rather than
43573
+ // acquiring one afterwards.
43574
+ key: "typed-evaluation",
43575
+ description: "ADR-0110: platform-internal consumers of the typed evaluation model (Jev, via our AI Gateway). OFF (default) = no internal consumer calls it; ON = consumers that have shipped may call, each still subject to the per-org quota, per-agent rate limit and audit row enforced in the broker. Does NOT gate the agent-facing tool, which is governed by the premium opt-in and a per-agent install instead. Customer orgs stay off until the Decision 9 vendor gates close (sub-processor listing with DPA coverage, the legal read on emotion inference, and a recorded disclosure).",
43576
+ flagType: "boolean",
43577
+ // Ships dark. Every consumer degrades to its current behaviour when off,
43578
+ // so the safe value and the no-op value are the same one.
43579
+ defaultValue: false,
43580
+ // Turning it on starts sending customer text to an external sub-processor
43581
+ // on paths the customer did not individually opt into, which is exactly the
43582
+ // class ADR-0022 section 4 reserves the confirmation for.
43583
+ sensitive: true
43584
+ },
43512
43585
  {
43513
43586
  key: "conversation-eval-backend",
43514
43587
  description: "Backend for host-side conversation-success scoring AND memory extraction (ENG-6581), which share one scorer: anthropic-api = Haiku via a direct Anthropic Messages API fetch (no subprocess); claude-p = Haiku via the `claude -p` subprocess (reuses the agent auth, effectively free under Max but a heavy spawn); local = an OpenAI-compatible loopback endpoint (transcript never leaves the host). Auth for the anthropic-api path comes from AGT_CONV_EVAL_ANTHROPIC_API_KEY (falls back to ANTHROPIC_API_KEY); with no key that path fails closed (eval disabled) rather than reverting to claude-p. Enum.",
@@ -35702,6 +35702,52 @@ var INTEGRATION_REGISTRY = [
35702
35702
  }]
35703
35703
  }
35704
35704
  },
35705
+ {
35706
+ // ENG-10854 / ADR-0110. The POLICY half of the catalog definition: this
35707
+ // registry is what `isPremiumDefinition` reads, so the premium descriptor
35708
+ // here is what makes the per-org opt-in required at all. The CUSTOMER-FACING
35709
+ // half - the seeded `integration_definitions` row that the Add Integration
35710
+ // picker lists - is deliberately NOT in this change. `/integrations/installs`
35711
+ // reads the DB catalog with a status filter; this registry is not a listing.
35712
+ //
35713
+ // The order matters and is not bookkeeping: `isOrgEntitledToPremium` returns
35714
+ // TRUE for a definition it does not know as premium, because a free
35715
+ // integration has no opt-in concept. So a broker shipped ahead of this entry
35716
+ // would serve an org that had never opted in. The broker additionally fails
35717
+ // closed on `isPremiumDefinition` being false, so the two halves cannot come
35718
+ // apart in that direction either.
35719
+ id: "typed-evaluation",
35720
+ name: "Typed Evaluation",
35721
+ category: "knowledge",
35722
+ description: "Ask closed questions about a piece of text and get calibrated answers back \u2014 yes/no, pick-one, or a position on your own scale \u2014 with a probability for each. It never writes text and cannot answer outside the set of options you give it, which is what makes it safe to point at content you do not trust. Typical uses: is this message a repeat request, which category does this belong to, how urgent does this sound. Answers arrive in about half a second, so an agent can branch on one without spending a model turn.",
35723
+ // No customer credential exists: the call runs on Ninjafy's own gateway key.
35724
+ supported_auth_types: ["none"],
35725
+ capabilities: [
35726
+ {
35727
+ id: "typed-evaluation:evaluate",
35728
+ name: "Evaluate Text",
35729
+ description: "Ask closed questions about text the agent already holds and receive typed answers with probabilities (evaluate_text).",
35730
+ access: "read"
35731
+ }
35732
+ ],
35733
+ beta: true,
35734
+ // ENG-8842's `included`, and the reason is the consent dialog rather than
35735
+ // the price. `pricing` drives the org admin's acknowledgement modal, where
35736
+ // `usage` renders as "manages and bills by usage" and `monthly` as a
35737
+ // subscription. Both would be false statements here: a call costs about
35738
+ // $0.000076 and nothing is metered or billed, so the opt-in exists to record
35739
+ // a decision about a SUB-PROCESSOR, not about money.
35740
+ //
35741
+ // ADR-0110 Decision 11 keeps the door open deliberately: if a genuinely
35742
+ // high-volume capability arrives later - bulk classification of a customer's
35743
+ // own corpus - it is priced at THAT capability's grain and this definition
35744
+ // stays `included`. Ninja Notes is the precedent (ENG-9278): it acquired a
35745
+ // metered capability and did not flip.
35746
+ premium: {
35747
+ pricing: "included",
35748
+ note: "Typed evaluation is included in your plan \u2014 nothing is metered per question. Turning it on is a decision about data, not cost: the text an agent asks about is sent to Typesafe, through our own gateway, to be scored. It is never used to train a model and we store only the answers, never the text."
35749
+ }
35750
+ },
35705
35751
  {
35706
35752
  // Ninja Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
35707
35753
  // delivered to an agent as a tag-granted note the agent reads and summarises.
@@ -38148,6 +38194,33 @@ var FLAG_REGISTRY = [
38148
38194
  // "these hosts are unreadable". Both outlive this particular version.
38149
38195
  since: "0.28.667"
38150
38196
  },
38197
+ {
38198
+ // ADR-0110 Decision 5 (ENG-10854). Gates PLATFORM-INTERNAL consumers of the
38199
+ // typed evaluation capability - inbound triage, kanban classification,
38200
+ // memory-extraction sensitivity gating, and later the conversation
38201
+ // evaluator. Nobody "installs" those; they are ours, so they are gated
38202
+ // centrally.
38203
+ //
38204
+ // IT DOES NOT GATE THE AGENT TOOL, and that separation is the point. The
38205
+ // agent tool's gate is the customer's own premium opt-in plus a per-agent
38206
+ // install (Decision 4). Pointing this flag at the tool as well would give
38207
+ // it two masters and let a staff flag silently override a decision the
38208
+ // customer made about their own data reaching a sub-processor.
38209
+ //
38210
+ // Ships with no readers: the consumers land in later slices, and the flag
38211
+ // exists now so the first of them has a gate to be born behind rather than
38212
+ // acquiring one afterwards.
38213
+ key: "typed-evaluation",
38214
+ description: "ADR-0110: platform-internal consumers of the typed evaluation model (Jev, via our AI Gateway). OFF (default) = no internal consumer calls it; ON = consumers that have shipped may call, each still subject to the per-org quota, per-agent rate limit and audit row enforced in the broker. Does NOT gate the agent-facing tool, which is governed by the premium opt-in and a per-agent install instead. Customer orgs stay off until the Decision 9 vendor gates close (sub-processor listing with DPA coverage, the legal read on emotion inference, and a recorded disclosure).",
38215
+ flagType: "boolean",
38216
+ // Ships dark. Every consumer degrades to its current behaviour when off,
38217
+ // so the safe value and the no-op value are the same one.
38218
+ defaultValue: false,
38219
+ // Turning it on starts sending customer text to an external sub-processor
38220
+ // on paths the customer did not individually opt into, which is exactly the
38221
+ // class ADR-0022 section 4 reserves the confirmation for.
38222
+ sensitive: true
38223
+ },
38151
38224
  {
38152
38225
  key: "conversation-eval-backend",
38153
38226
  description: "Backend for host-side conversation-success scoring AND memory extraction (ENG-6581), which share one scorer: anthropic-api = Haiku via a direct Anthropic Messages API fetch (no subprocess); claude-p = Haiku via the `claude -p` subprocess (reuses the agent auth, effectively free under Max but a heavy spawn); local = an OpenAI-compatible loopback endpoint (transcript never leaves the host). Auth for the anthropic-api path comes from AGT_CONV_EVAL_ANTHROPIC_API_KEY (falls back to ANTHROPIC_API_KEY); with no key that path fails closed (eval disabled) rather than reverting to claude-p. Enum.",
@@ -35716,6 +35716,52 @@ var INTEGRATION_REGISTRY = [
35716
35716
  }]
35717
35717
  }
35718
35718
  },
35719
+ {
35720
+ // ENG-10854 / ADR-0110. The POLICY half of the catalog definition: this
35721
+ // registry is what `isPremiumDefinition` reads, so the premium descriptor
35722
+ // here is what makes the per-org opt-in required at all. The CUSTOMER-FACING
35723
+ // half - the seeded `integration_definitions` row that the Add Integration
35724
+ // picker lists - is deliberately NOT in this change. `/integrations/installs`
35725
+ // reads the DB catalog with a status filter; this registry is not a listing.
35726
+ //
35727
+ // The order matters and is not bookkeeping: `isOrgEntitledToPremium` returns
35728
+ // TRUE for a definition it does not know as premium, because a free
35729
+ // integration has no opt-in concept. So a broker shipped ahead of this entry
35730
+ // would serve an org that had never opted in. The broker additionally fails
35731
+ // closed on `isPremiumDefinition` being false, so the two halves cannot come
35732
+ // apart in that direction either.
35733
+ id: "typed-evaluation",
35734
+ name: "Typed Evaluation",
35735
+ category: "knowledge",
35736
+ description: "Ask closed questions about a piece of text and get calibrated answers back \u2014 yes/no, pick-one, or a position on your own scale \u2014 with a probability for each. It never writes text and cannot answer outside the set of options you give it, which is what makes it safe to point at content you do not trust. Typical uses: is this message a repeat request, which category does this belong to, how urgent does this sound. Answers arrive in about half a second, so an agent can branch on one without spending a model turn.",
35737
+ // No customer credential exists: the call runs on Ninjafy's own gateway key.
35738
+ supported_auth_types: ["none"],
35739
+ capabilities: [
35740
+ {
35741
+ id: "typed-evaluation:evaluate",
35742
+ name: "Evaluate Text",
35743
+ description: "Ask closed questions about text the agent already holds and receive typed answers with probabilities (evaluate_text).",
35744
+ access: "read"
35745
+ }
35746
+ ],
35747
+ beta: true,
35748
+ // ENG-8842's `included`, and the reason is the consent dialog rather than
35749
+ // the price. `pricing` drives the org admin's acknowledgement modal, where
35750
+ // `usage` renders as "manages and bills by usage" and `monthly` as a
35751
+ // subscription. Both would be false statements here: a call costs about
35752
+ // $0.000076 and nothing is metered or billed, so the opt-in exists to record
35753
+ // a decision about a SUB-PROCESSOR, not about money.
35754
+ //
35755
+ // ADR-0110 Decision 11 keeps the door open deliberately: if a genuinely
35756
+ // high-volume capability arrives later - bulk classification of a customer's
35757
+ // own corpus - it is priced at THAT capability's grain and this definition
35758
+ // stays `included`. Ninja Notes is the precedent (ENG-9278): it acquired a
35759
+ // metered capability and did not flip.
35760
+ premium: {
35761
+ pricing: "included",
35762
+ note: "Typed evaluation is included in your plan \u2014 nothing is metered per question. Turning it on is a decision about data, not cost: the text an agent asks about is sent to Typesafe, through our own gateway, to be scored. It is never used to train a model and we store only the answers, never the text."
35763
+ }
35764
+ },
35719
35765
  {
35720
35766
  // Ninja Notes (ADR-0063, ENG-8842). Meeting capture on the user's own Mac,
35721
35767
  // delivered to an agent as a tag-granted note the agent reads and summarises.
@@ -38162,6 +38208,33 @@ var FLAG_REGISTRY = [
38162
38208
  // "these hosts are unreadable". Both outlive this particular version.
38163
38209
  since: "0.28.667"
38164
38210
  },
38211
+ {
38212
+ // ADR-0110 Decision 5 (ENG-10854). Gates PLATFORM-INTERNAL consumers of the
38213
+ // typed evaluation capability - inbound triage, kanban classification,
38214
+ // memory-extraction sensitivity gating, and later the conversation
38215
+ // evaluator. Nobody "installs" those; they are ours, so they are gated
38216
+ // centrally.
38217
+ //
38218
+ // IT DOES NOT GATE THE AGENT TOOL, and that separation is the point. The
38219
+ // agent tool's gate is the customer's own premium opt-in plus a per-agent
38220
+ // install (Decision 4). Pointing this flag at the tool as well would give
38221
+ // it two masters and let a staff flag silently override a decision the
38222
+ // customer made about their own data reaching a sub-processor.
38223
+ //
38224
+ // Ships with no readers: the consumers land in later slices, and the flag
38225
+ // exists now so the first of them has a gate to be born behind rather than
38226
+ // acquiring one afterwards.
38227
+ key: "typed-evaluation",
38228
+ description: "ADR-0110: platform-internal consumers of the typed evaluation model (Jev, via our AI Gateway). OFF (default) = no internal consumer calls it; ON = consumers that have shipped may call, each still subject to the per-org quota, per-agent rate limit and audit row enforced in the broker. Does NOT gate the agent-facing tool, which is governed by the premium opt-in and a per-agent install instead. Customer orgs stay off until the Decision 9 vendor gates close (sub-processor listing with DPA coverage, the legal read on emotion inference, and a recorded disclosure).",
38229
+ flagType: "boolean",
38230
+ // Ships dark. Every consumer degrades to its current behaviour when off,
38231
+ // so the safe value and the no-op value are the same one.
38232
+ defaultValue: false,
38233
+ // Turning it on starts sending customer text to an external sub-processor
38234
+ // on paths the customer did not individually opt into, which is exactly the
38235
+ // class ADR-0022 section 4 reserves the confirmation for.
38236
+ sensitive: true
38237
+ },
38165
38238
  {
38166
38239
  key: "conversation-eval-backend",
38167
38240
  description: "Backend for host-side conversation-success scoring AND memory extraction (ENG-6581), which share one scorer: anthropic-api = Haiku via a direct Anthropic Messages API fetch (no subprocess); claude-p = Haiku via the `claude -p` subprocess (reuses the agent auth, effectively free under Max but a heavy spawn); local = an OpenAI-compatible loopback endpoint (transcript never leaves the host). Auth for the anthropic-api path comes from AGT_CONV_EVAL_ANTHROPIC_API_KEY (falls back to ANTHROPIC_API_KEY); with no key that path fails closed (eval disabled) rather than reverting to claude-p. Enum.",