@integrity-labs/agt-cli 0.28.1129 → 0.28.1130

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.
@@ -24,7 +24,7 @@ import {
24
24
  rotateDailySession,
25
25
  sessionFileExists,
26
26
  todayLocalIso
27
- } from "./chunk-JFABPA3Z.js";
27
+ } from "./chunk-KN4GAY5Z.js";
28
28
  import {
29
29
  classifyUnanswerablePane,
30
30
  findUsageLimitResetHint,
@@ -6114,4 +6114,4 @@ export {
6114
6114
  stopAllSessionsAndWait,
6115
6115
  getProjectDir
6116
6116
  };
6117
- //# sourceMappingURL=chunk-23GMWGOP.js.map
6117
+ //# sourceMappingURL=chunk-TRZ4SG77.js.map
@@ -269,7 +269,7 @@ async function spawnPairSession(session) {
269
269
  return { ok: true };
270
270
  } catch {
271
271
  }
272
- const { resolveClaudeBinary } = await import("./persistent-session-QSE66QYT.js");
272
+ const { resolveClaudeBinary } = await import("./persistent-session-YDKIHRCX.js");
273
273
  const claudeBin = resolveClaudeBinary();
274
274
  const pairEnv = {
275
275
  ...process.env,
@@ -739,4 +739,4 @@ export {
739
739
  startClaudePair,
740
740
  submitClaudePairCode
741
741
  };
742
- //# sourceMappingURL=claude-pair-runtime-LDJXKNWF.js.map
742
+ //# sourceMappingURL=claude-pair-runtime-WSUD7FHJ.js.map
@@ -76,7 +76,7 @@ import {
76
76
  setConfigHash,
77
77
  shellGuard,
78
78
  tripClass
79
- } from "../chunk-2YWHPXY7.js";
79
+ } from "../chunk-EEBMAG52.js";
80
80
  import {
81
81
  getProjectDir as getProjectDir2,
82
82
  getReadyTasks,
@@ -163,7 +163,7 @@ import {
163
163
  webFetchBaselineValue,
164
164
  webFetchRestartNeeded,
165
165
  writeEgressAllowlist
166
- } from "../chunk-23GMWGOP.js";
166
+ } from "../chunk-TRZ4SG77.js";
167
167
  import {
168
168
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
169
169
  AnchorSessionClient,
@@ -274,7 +274,7 @@ import {
274
274
  subagentActivityAgeSeconds,
275
275
  sumTranscriptUsageInWindow,
276
276
  transcriptActivityAgeSeconds
277
- } from "../chunk-JFABPA3Z.js";
277
+ } from "../chunk-KN4GAY5Z.js";
278
278
  import {
279
279
  classifyUnanswerablePane,
280
280
  focusedConfirmDialogBlock,
@@ -14491,7 +14491,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
14491
14491
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
14492
14492
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
14493
14493
  async function channelInboundActivityAgeSecondsFor(codeName) {
14494
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-NC4A3FCR.js");
14494
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-5LEQ4ZFE.js");
14495
14495
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
14496
14496
  if (newest === null) return null;
14497
14497
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -15249,7 +15249,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
15249
15249
  var lastVersionCheckAt = 0;
15250
15250
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
15251
15251
  var lastResponsivenessProbeAt = 0;
15252
- var agtCliVersion = true ? "0.28.1129" : "dev";
15252
+ var agtCliVersion = true ? "0.28.1130" : "dev";
15253
15253
  function resolveBrewPath(execFileSync3) {
15254
15254
  try {
15255
15255
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -16879,7 +16879,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
16879
16879
  if (codeNames.length === 0) return;
16880
16880
  void (async () => {
16881
16881
  try {
16882
- const { collectDiagnostics } = await import("../persistent-session-QSE66QYT.js");
16882
+ const { collectDiagnostics } = await import("../persistent-session-YDKIHRCX.js");
16883
16883
  await api.post("/host/heartbeat", {
16884
16884
  host_id: hostId,
16885
16885
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -17021,7 +17021,7 @@ async function pollCycleInner() {
17021
17021
  }
17022
17022
  try {
17023
17023
  const { detectHostSecurity } = await import("../host-security-KQYYZZVW.js");
17024
- const { collectDiagnostics } = await import("../persistent-session-QSE66QYT.js");
17024
+ const { collectDiagnostics } = await import("../persistent-session-YDKIHRCX.js");
17025
17025
  const diagCodeNames = [...agentState.persistentSessionAgents];
17026
17026
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor) : void 0;
17027
17027
  let tailscaleHostname;
@@ -17229,7 +17229,7 @@ async function pollCycleInner() {
17229
17229
  collectPanelessActivityProbes,
17230
17230
  getResponsivenessIntervalMs,
17231
17231
  occupancyQualificationClassifications
17232
- } = await import("../responsiveness-probe-NC4A3FCR.js");
17232
+ } = await import("../responsiveness-probe-5LEQ4ZFE.js");
17233
17233
  const probeIntervalMs = getResponsivenessIntervalMs();
17234
17234
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
17235
17235
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -17346,7 +17346,7 @@ async function pollCycleInner() {
17346
17346
  collectResponsivenessProbes,
17347
17347
  livePendingInboundOldestAgeSeconds,
17348
17348
  parkPendingInbound
17349
- } = await import("../responsiveness-probe-NC4A3FCR.js");
17349
+ } = await import("../responsiveness-probe-5LEQ4ZFE.js");
17350
17350
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-M6AFZWNU.js");
17351
17351
  const wedgeNow = /* @__PURE__ */ new Date();
17352
17352
  const liveAgents = agentState.persistentSessionAgents;
@@ -17632,7 +17632,7 @@ async function pollCycleInner() {
17632
17632
  }
17633
17633
  }
17634
17634
  );
17635
- const { parkPendingInbound } = await import("../responsiveness-probe-NC4A3FCR.js");
17635
+ const { parkPendingInbound } = await import("../responsiveness-probe-5LEQ4ZFE.js");
17636
17636
  const { parked, deadLettered } = parkPendingInbound(codeName, new Date(fatalNowMs));
17637
17637
  paneFatalStreak.delete(codeName);
17638
17638
  paneFatalRestarts.set(codeName, [...history, fatalNowMs]);
@@ -17663,7 +17663,7 @@ async function pollCycleInner() {
17663
17663
  TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS,
17664
17664
  bindSourceEscalations
17665
17665
  } = await import("../transcript-mount-health-OHE6IVJV.js");
17666
- const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-QSE66QYT.js");
17666
+ const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-YDKIHRCX.js");
17667
17667
  const mountConfig = resolveTranscriptMountConfig();
17668
17668
  const liveAgents = agentState.persistentSessionAgents;
17669
17669
  for (const tracked of [
@@ -17828,7 +17828,7 @@ async function pollCycleInner() {
17828
17828
  }
17829
17829
  try {
17830
17830
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-VR5QGP3J.js");
17831
- const { probeSessionAuth } = await import("../session-auth-dead-23ERZN4N.js");
17831
+ const { probeSessionAuth } = await import("../session-auth-dead-C3GYATAO.js");
17832
17832
  const observations = [];
17833
17833
  const pendingCacheCommits = [];
17834
17834
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -22423,7 +22423,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
22423
22423
  try {
22424
22424
  const freshId = rotateSessionForWedge(codeName);
22425
22425
  consecutiveWedgeCycles.delete(codeName);
22426
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-NC4A3FCR.js");
22426
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-5LEQ4ZFE.js");
22427
22427
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
22428
22428
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
22429
22429
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -22466,7 +22466,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
22466
22466
  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}`));
22467
22467
  void (async () => {
22468
22468
  try {
22469
- const { collectDiagnostics } = await import("../persistent-session-QSE66QYT.js");
22469
+ const { collectDiagnostics } = await import("../persistent-session-YDKIHRCX.js");
22470
22470
  await api.post("/host/heartbeat", {
22471
22471
  host_id: hostId,
22472
22472
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -22517,7 +22517,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
22517
22517
  }
22518
22518
  try {
22519
22519
  const hostId = await getHostId();
22520
- const { collectDiagnostics } = await import("../persistent-session-QSE66QYT.js");
22520
+ const { collectDiagnostics } = await import("../persistent-session-YDKIHRCX.js");
22521
22521
  await api.post("/host/heartbeat", {
22522
22522
  host_id: hostId,
22523
22523
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -23190,7 +23190,7 @@ async function processClaudePairSessions(agents) {
23190
23190
  // cannot take it for itself — by the time it runs, the write it is looking
23191
23191
  // for may already have happened.
23192
23192
  snapshotPairConfig
23193
- } = await import("../claude-pair-runtime-LDJXKNWF.js");
23193
+ } = await import("../claude-pair-runtime-WSUD7FHJ.js");
23194
23194
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
23195
23195
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
23196
23196
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -34314,6 +34314,78 @@ var INTEGRATION_REGISTRY = [
34314
34314
  },
34315
34315
  docs_url: "https://www.framer.com/developers/server-api-quick-start"
34316
34316
  },
34317
+ {
34318
+ // ENG-11540: FlutterFlow, through FlutterFlow's own CLI (`flutterflow ai`).
34319
+ //
34320
+ // WHAT "FLUTTERFLOW MCP" ACTUALLY IS. Not a hosted MCP endpoint. `flutterflow
34321
+ // ai init <dir>` creates a local workspace holding a vendored Dart SDK and an
34322
+ // MCP server registered in a workspace-root `.mcp.json`. The agent's own
34323
+ // `.mcp.json` is platform-rendered, so a workspace-local server is never seen
34324
+ // by the agent's session. The agent drives the same commands over Bash
34325
+ // instead, which is what FlutterFlow's own Claude Code plugin does
34326
+ // (github.com/FlutterFlow/flutterflow-claude) and is the same project state.
34327
+ //
34328
+ // HEADLESS, VERIFIED by running flutterflow_cli 0.0.41 on 2026-10-15: `init`
34329
+ // reads FF_API_KEY from the environment, takes the workspace positionally and
34330
+ // the project as `--project`, and never prompts when stdin is not a TTY. With
34331
+ // no key it fails fast ("API key is required") rather than hanging. A key
34332
+ // from the environment is never written to the CLI's credential store.
34333
+ // Neither `flutterflow --version` nor `flutterflow ai --version` works outside
34334
+ // a workspace, which is why the probe is central HTTP (connectivity-probe.ts).
34335
+ id: "flutterflow",
34336
+ name: "FlutterFlow",
34337
+ category: "code",
34338
+ description: "Build and edit FlutterFlow apps with the FlutterFlow CLI. Start with `flutterflow ai init <dir> --project <project-id>` (the key is already in FF_API_KEY), work inside that folder, inspect and validate before you run, and never read the folder's .flutterflow/.env (it holds the key). Never pass --yes to native-file unlock or lock, and ask a person before publish-library.",
34339
+ supported_auth_types: ["api_key"],
34340
+ // flutterflow_cli is 0.0.x and the AI SDK it downloads is versioned server-side.
34341
+ beta: true,
34342
+ installable: { category: "Code", authTypes: ["api_key"] },
34343
+ capabilities: [
34344
+ {
34345
+ id: "flutterflow:read-project",
34346
+ name: "Read Project",
34347
+ description: "Inspect, search and validate a FlutterFlow project: pages, components, resources, status and run history",
34348
+ access: "read"
34349
+ },
34350
+ {
34351
+ id: "flutterflow:edit-project",
34352
+ name: "Edit Project",
34353
+ description: "Push changes to a FlutterFlow project: pages, widgets, state, actions and theme",
34354
+ access: "write"
34355
+ },
34356
+ {
34357
+ id: "flutterflow:publish-library",
34358
+ name: "Publish Library",
34359
+ description: "Publish a new version of a FlutterFlow library that other projects depend on",
34360
+ access: "write"
34361
+ }
34362
+ ],
34363
+ cli_tool: {
34364
+ package: "flutterflow_cli",
34365
+ binary: "flutterflow",
34366
+ // `flutterflow ai` and the SDK it downloads both authenticate from this
34367
+ // (the legacy FLUTTERFLOW_API_TOKEN feeds only export-code/deploy-firebase).
34368
+ env_key: "FF_API_KEY",
34369
+ installer: "script",
34370
+ // The catalog is the trust boundary for this string (same contract as the
34371
+ // `gh` entry above). The CLI is a Dart pub package, and AL2023 has no Dart
34372
+ // rpm, so this installs Google's official SDK zip into a private prefix
34373
+ // (about 650 MB, which is why it is per-integration and not in the base
34374
+ // image) and puts a wrapper, not pub's shim, at /usr/local/bin/flutterflow.
34375
+ // pub's shim runs a bare `dart`, so a different Dart earlier on PATH would
34376
+ // reject the 3.13.5 snapshot; the wrapper pins our Dart for the CLI AND for
34377
+ // the `dart run` the downloaded SDK does. Re-runnable: a timed-out run
34378
+ // (180s) resumes from whatever finished. The SDK is unzipped into a
34379
+ // staging dir INSIDE the prefix and renamed into place last (CodeRabbit on
34380
+ // #7007): a run killed mid-unzip must never leave a partial dart-sdk that
34381
+ // passes the version check and then fails every retry. Staging on the same
34382
+ // filesystem is what makes the final `mv` a rename rather than a copy.
34383
+ // Versions pinned on purpose: bump
34384
+ // them together, after re-running the headless check above.
34385
+ script: `set -e; d=/usr/local/flutterflow; v=3.13.5; case "$(uname -m)" in x86_64) a=x64;; aarch64|arm64) a=arm64;; *) echo "flutterflow: unsupported architecture $(uname -m)" >&2; exit 1;; esac; if ! "$d/dart-sdk/bin/dart" --version 2>&1 | grep -q "version: $v "; then if ! command -v unzip >/dev/null 2>&1; then if command -v dnf >/dev/null 2>&1; then dnf install -y unzip; elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y unzip; else echo "flutterflow: unzip missing and no supported installer (need dnf or apt-get)" >&2; exit 1; fi; fi; mkdir -p "$d"; t=$(mktemp -d "$d/.stage.XXXXXX"); trap 'rm -rf "$t"' EXIT; curl -fsSL "https://storage.googleapis.com/dart-archive/channels/stable/release/$v/sdk/dartsdk-linux-$a-release.zip" -o "$t/dart.zip"; unzip -q "$t/dart.zip" -d "$t/x"; rm -rf "$d/dart-sdk"; mv "$t/x/dart-sdk" "$d/dart-sdk"; fi; PATH="$d/dart-sdk/bin:$PATH" PUB_CACHE="$d/pub-cache" "$d/dart-sdk/bin/dart" pub global activate flutterflow_cli 0.0.41; printf '#!/bin/sh\\nPATH="%s/dart-sdk/bin:$PATH" PUB_CACHE="%s/pub-cache" exec "%s/pub-cache/bin/flutterflow" "$@"\\n' "$d" "$d" "$d" > /usr/local/bin/flutterflow; chmod 755 /usr/local/bin/flutterflow`
34386
+ },
34387
+ docs_url: "https://docs.flutterflow.io/flutterflow-cli/build/"
34388
+ },
34317
34389
  {
34318
34390
  id: "v0",
34319
34391
  name: "v0 by Vercel",
@@ -38757,6 +38829,20 @@ var FLAG_REGISTRY = [
38757
38829
  // on for their own org. Only a platform admin can (PR #6522 review).
38758
38830
  platformAdminOnly: true
38759
38831
  },
38832
+ {
38833
+ key: "direct-chat-voice",
38834
+ description: "Show the microphone (voice) button in the web Direct Chat composer - the Direct Chat drawer and the agent-screen chat dock (ENG-11542). Off by default: voice set expectations it does not yet meet for customers, but the team still needs it for testing, so it is enabled per org rather than removed. Does not gate the mobile PWA voice switch or the server voice-session routes.",
38835
+ flagType: "boolean",
38836
+ // PUBLIC (ADR-0022 §2): read in the browser via usePublicBooleanFlag, so it
38837
+ // must be in the GET /flags map. No env override (UI rollout, not an
38838
+ // operator gate). Ships dark (default false).
38839
+ public: true,
38840
+ defaultValue: false,
38841
+ // Platform admin only: the point of the flag is keeping a not-ready feature
38842
+ // away from customers, so a customer org admin must not be able to switch
38843
+ // it back on for their own org.
38844
+ platformAdminOnly: true
38845
+ },
38760
38846
  {
38761
38847
  key: "platform-maintenance-mode",
38762
38848
  description: 'Platform-wide maintenance mode (ENG-6506; widened to modes by ENG-11436). off = normal operation (ships dark; channels behave exactly as today). tools-offline = every agent KEEPS conversing but every Augmented tool that WRITES to the control plane refuses with a reason, so nothing is created during a window whose database restore would discard it; reads are untouched. fleet-offline = the previous boolean-true behaviour AND the write gate: admitted human inbound gets a "we are offline for maintenance" notice instead of being dispatched, for whole-platform downtime such as DB upgrades. The modes are CUMULATIVE \u2014 fleet-offline gates writes too, because silencing channel inbound does not stop a /loop or a scheduled task filing work. Read host-side per inbound and per tool call from the flags cache (no MCP restart). (Proactive "back online" follow-up is the ENG-6508 fast-follow, not this flag.)',
package/dist/mcp/index.js CHANGED
@@ -26816,6 +26816,78 @@ var INTEGRATION_REGISTRY = [
26816
26816
  },
26817
26817
  docs_url: "https://www.framer.com/developers/server-api-quick-start"
26818
26818
  },
26819
+ {
26820
+ // ENG-11540: FlutterFlow, through FlutterFlow's own CLI (`flutterflow ai`).
26821
+ //
26822
+ // WHAT "FLUTTERFLOW MCP" ACTUALLY IS. Not a hosted MCP endpoint. `flutterflow
26823
+ // ai init <dir>` creates a local workspace holding a vendored Dart SDK and an
26824
+ // MCP server registered in a workspace-root `.mcp.json`. The agent's own
26825
+ // `.mcp.json` is platform-rendered, so a workspace-local server is never seen
26826
+ // by the agent's session. The agent drives the same commands over Bash
26827
+ // instead, which is what FlutterFlow's own Claude Code plugin does
26828
+ // (github.com/FlutterFlow/flutterflow-claude) and is the same project state.
26829
+ //
26830
+ // HEADLESS, VERIFIED by running flutterflow_cli 0.0.41 on 2026-10-15: `init`
26831
+ // reads FF_API_KEY from the environment, takes the workspace positionally and
26832
+ // the project as `--project`, and never prompts when stdin is not a TTY. With
26833
+ // no key it fails fast ("API key is required") rather than hanging. A key
26834
+ // from the environment is never written to the CLI's credential store.
26835
+ // Neither `flutterflow --version` nor `flutterflow ai --version` works outside
26836
+ // a workspace, which is why the probe is central HTTP (connectivity-probe.ts).
26837
+ id: "flutterflow",
26838
+ name: "FlutterFlow",
26839
+ category: "code",
26840
+ description: "Build and edit FlutterFlow apps with the FlutterFlow CLI. Start with `flutterflow ai init <dir> --project <project-id>` (the key is already in FF_API_KEY), work inside that folder, inspect and validate before you run, and never read the folder's .flutterflow/.env (it holds the key). Never pass --yes to native-file unlock or lock, and ask a person before publish-library.",
26841
+ supported_auth_types: ["api_key"],
26842
+ // flutterflow_cli is 0.0.x and the AI SDK it downloads is versioned server-side.
26843
+ beta: true,
26844
+ installable: { category: "Code", authTypes: ["api_key"] },
26845
+ capabilities: [
26846
+ {
26847
+ id: "flutterflow:read-project",
26848
+ name: "Read Project",
26849
+ description: "Inspect, search and validate a FlutterFlow project: pages, components, resources, status and run history",
26850
+ access: "read"
26851
+ },
26852
+ {
26853
+ id: "flutterflow:edit-project",
26854
+ name: "Edit Project",
26855
+ description: "Push changes to a FlutterFlow project: pages, widgets, state, actions and theme",
26856
+ access: "write"
26857
+ },
26858
+ {
26859
+ id: "flutterflow:publish-library",
26860
+ name: "Publish Library",
26861
+ description: "Publish a new version of a FlutterFlow library that other projects depend on",
26862
+ access: "write"
26863
+ }
26864
+ ],
26865
+ cli_tool: {
26866
+ package: "flutterflow_cli",
26867
+ binary: "flutterflow",
26868
+ // `flutterflow ai` and the SDK it downloads both authenticate from this
26869
+ // (the legacy FLUTTERFLOW_API_TOKEN feeds only export-code/deploy-firebase).
26870
+ env_key: "FF_API_KEY",
26871
+ installer: "script",
26872
+ // The catalog is the trust boundary for this string (same contract as the
26873
+ // `gh` entry above). The CLI is a Dart pub package, and AL2023 has no Dart
26874
+ // rpm, so this installs Google's official SDK zip into a private prefix
26875
+ // (about 650 MB, which is why it is per-integration and not in the base
26876
+ // image) and puts a wrapper, not pub's shim, at /usr/local/bin/flutterflow.
26877
+ // pub's shim runs a bare `dart`, so a different Dart earlier on PATH would
26878
+ // reject the 3.13.5 snapshot; the wrapper pins our Dart for the CLI AND for
26879
+ // the `dart run` the downloaded SDK does. Re-runnable: a timed-out run
26880
+ // (180s) resumes from whatever finished. The SDK is unzipped into a
26881
+ // staging dir INSIDE the prefix and renamed into place last (CodeRabbit on
26882
+ // #7007): a run killed mid-unzip must never leave a partial dart-sdk that
26883
+ // passes the version check and then fails every retry. Staging on the same
26884
+ // filesystem is what makes the final `mv` a rename rather than a copy.
26885
+ // Versions pinned on purpose: bump
26886
+ // them together, after re-running the headless check above.
26887
+ script: `set -e; d=/usr/local/flutterflow; v=3.13.5; case "$(uname -m)" in x86_64) a=x64;; aarch64|arm64) a=arm64;; *) echo "flutterflow: unsupported architecture $(uname -m)" >&2; exit 1;; esac; if ! "$d/dart-sdk/bin/dart" --version 2>&1 | grep -q "version: $v "; then if ! command -v unzip >/dev/null 2>&1; then if command -v dnf >/dev/null 2>&1; then dnf install -y unzip; elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y unzip; else echo "flutterflow: unzip missing and no supported installer (need dnf or apt-get)" >&2; exit 1; fi; fi; mkdir -p "$d"; t=$(mktemp -d "$d/.stage.XXXXXX"); trap 'rm -rf "$t"' EXIT; curl -fsSL "https://storage.googleapis.com/dart-archive/channels/stable/release/$v/sdk/dartsdk-linux-$a-release.zip" -o "$t/dart.zip"; unzip -q "$t/dart.zip" -d "$t/x"; rm -rf "$d/dart-sdk"; mv "$t/x/dart-sdk" "$d/dart-sdk"; fi; PATH="$d/dart-sdk/bin:$PATH" PUB_CACHE="$d/pub-cache" "$d/dart-sdk/bin/dart" pub global activate flutterflow_cli 0.0.41; printf '#!/bin/sh\\nPATH="%s/dart-sdk/bin:$PATH" PUB_CACHE="%s/pub-cache" exec "%s/pub-cache/bin/flutterflow" "$@"\\n' "$d" "$d" "$d" > /usr/local/bin/flutterflow; chmod 755 /usr/local/bin/flutterflow`
26888
+ },
26889
+ docs_url: "https://docs.flutterflow.io/flutterflow-cli/build/"
26890
+ },
26819
26891
  {
26820
26892
  id: "v0",
26821
26893
  name: "v0 by Vercel",
@@ -30840,6 +30912,20 @@ var FLAG_REGISTRY = [
30840
30912
  // on for their own org. Only a platform admin can (PR #6522 review).
30841
30913
  platformAdminOnly: true
30842
30914
  },
30915
+ {
30916
+ key: "direct-chat-voice",
30917
+ description: "Show the microphone (voice) button in the web Direct Chat composer - the Direct Chat drawer and the agent-screen chat dock (ENG-11542). Off by default: voice set expectations it does not yet meet for customers, but the team still needs it for testing, so it is enabled per org rather than removed. Does not gate the mobile PWA voice switch or the server voice-session routes.",
30918
+ flagType: "boolean",
30919
+ // PUBLIC (ADR-0022 §2): read in the browser via usePublicBooleanFlag, so it
30920
+ // must be in the GET /flags map. No env override (UI rollout, not an
30921
+ // operator gate). Ships dark (default false).
30922
+ public: true,
30923
+ defaultValue: false,
30924
+ // Platform admin only: the point of the flag is keeping a not-ready feature
30925
+ // away from customers, so a customer org admin must not be able to switch
30926
+ // it back on for their own org.
30927
+ platformAdminOnly: true
30928
+ },
30843
30929
  {
30844
30930
  key: "platform-maintenance-mode",
30845
30931
  description: 'Platform-wide maintenance mode (ENG-6506; widened to modes by ENG-11436). off = normal operation (ships dark; channels behave exactly as today). tools-offline = every agent KEEPS conversing but every Augmented tool that WRITES to the control plane refuses with a reason, so nothing is created during a window whose database restore would discard it; reads are untouched. fleet-offline = the previous boolean-true behaviour AND the write gate: admitted human inbound gets a "we are offline for maintenance" notice instead of being dispatched, for whole-platform downtime such as DB upgrades. The modes are CUMULATIVE \u2014 fleet-offline gates writes too, because silencing channel inbound does not stop a /loop or a scheduled task filing work. Read host-side per inbound and per tool call from the flags cache (no MCP restart). (Proactive "back online" follow-up is the ENG-6508 fast-follow, not this flag.)',
@@ -40948,6 +40948,78 @@ var INTEGRATION_REGISTRY = [
40948
40948
  },
40949
40949
  docs_url: "https://www.framer.com/developers/server-api-quick-start"
40950
40950
  },
40951
+ {
40952
+ // ENG-11540: FlutterFlow, through FlutterFlow's own CLI (`flutterflow ai`).
40953
+ //
40954
+ // WHAT "FLUTTERFLOW MCP" ACTUALLY IS. Not a hosted MCP endpoint. `flutterflow
40955
+ // ai init <dir>` creates a local workspace holding a vendored Dart SDK and an
40956
+ // MCP server registered in a workspace-root `.mcp.json`. The agent's own
40957
+ // `.mcp.json` is platform-rendered, so a workspace-local server is never seen
40958
+ // by the agent's session. The agent drives the same commands over Bash
40959
+ // instead, which is what FlutterFlow's own Claude Code plugin does
40960
+ // (github.com/FlutterFlow/flutterflow-claude) and is the same project state.
40961
+ //
40962
+ // HEADLESS, VERIFIED by running flutterflow_cli 0.0.41 on 2026-10-15: `init`
40963
+ // reads FF_API_KEY from the environment, takes the workspace positionally and
40964
+ // the project as `--project`, and never prompts when stdin is not a TTY. With
40965
+ // no key it fails fast ("API key is required") rather than hanging. A key
40966
+ // from the environment is never written to the CLI's credential store.
40967
+ // Neither `flutterflow --version` nor `flutterflow ai --version` works outside
40968
+ // a workspace, which is why the probe is central HTTP (connectivity-probe.ts).
40969
+ id: "flutterflow",
40970
+ name: "FlutterFlow",
40971
+ category: "code",
40972
+ description: "Build and edit FlutterFlow apps with the FlutterFlow CLI. Start with `flutterflow ai init <dir> --project <project-id>` (the key is already in FF_API_KEY), work inside that folder, inspect and validate before you run, and never read the folder's .flutterflow/.env (it holds the key). Never pass --yes to native-file unlock or lock, and ask a person before publish-library.",
40973
+ supported_auth_types: ["api_key"],
40974
+ // flutterflow_cli is 0.0.x and the AI SDK it downloads is versioned server-side.
40975
+ beta: true,
40976
+ installable: { category: "Code", authTypes: ["api_key"] },
40977
+ capabilities: [
40978
+ {
40979
+ id: "flutterflow:read-project",
40980
+ name: "Read Project",
40981
+ description: "Inspect, search and validate a FlutterFlow project: pages, components, resources, status and run history",
40982
+ access: "read"
40983
+ },
40984
+ {
40985
+ id: "flutterflow:edit-project",
40986
+ name: "Edit Project",
40987
+ description: "Push changes to a FlutterFlow project: pages, widgets, state, actions and theme",
40988
+ access: "write"
40989
+ },
40990
+ {
40991
+ id: "flutterflow:publish-library",
40992
+ name: "Publish Library",
40993
+ description: "Publish a new version of a FlutterFlow library that other projects depend on",
40994
+ access: "write"
40995
+ }
40996
+ ],
40997
+ cli_tool: {
40998
+ package: "flutterflow_cli",
40999
+ binary: "flutterflow",
41000
+ // `flutterflow ai` and the SDK it downloads both authenticate from this
41001
+ // (the legacy FLUTTERFLOW_API_TOKEN feeds only export-code/deploy-firebase).
41002
+ env_key: "FF_API_KEY",
41003
+ installer: "script",
41004
+ // The catalog is the trust boundary for this string (same contract as the
41005
+ // `gh` entry above). The CLI is a Dart pub package, and AL2023 has no Dart
41006
+ // rpm, so this installs Google's official SDK zip into a private prefix
41007
+ // (about 650 MB, which is why it is per-integration and not in the base
41008
+ // image) and puts a wrapper, not pub's shim, at /usr/local/bin/flutterflow.
41009
+ // pub's shim runs a bare `dart`, so a different Dart earlier on PATH would
41010
+ // reject the 3.13.5 snapshot; the wrapper pins our Dart for the CLI AND for
41011
+ // the `dart run` the downloaded SDK does. Re-runnable: a timed-out run
41012
+ // (180s) resumes from whatever finished. The SDK is unzipped into a
41013
+ // staging dir INSIDE the prefix and renamed into place last (CodeRabbit on
41014
+ // #7007): a run killed mid-unzip must never leave a partial dart-sdk that
41015
+ // passes the version check and then fails every retry. Staging on the same
41016
+ // filesystem is what makes the final `mv` a rename rather than a copy.
41017
+ // Versions pinned on purpose: bump
41018
+ // them together, after re-running the headless check above.
41019
+ script: `set -e; d=/usr/local/flutterflow; v=3.13.5; case "$(uname -m)" in x86_64) a=x64;; aarch64|arm64) a=arm64;; *) echo "flutterflow: unsupported architecture $(uname -m)" >&2; exit 1;; esac; if ! "$d/dart-sdk/bin/dart" --version 2>&1 | grep -q "version: $v "; then if ! command -v unzip >/dev/null 2>&1; then if command -v dnf >/dev/null 2>&1; then dnf install -y unzip; elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y unzip; else echo "flutterflow: unzip missing and no supported installer (need dnf or apt-get)" >&2; exit 1; fi; fi; mkdir -p "$d"; t=$(mktemp -d "$d/.stage.XXXXXX"); trap 'rm -rf "$t"' EXIT; curl -fsSL "https://storage.googleapis.com/dart-archive/channels/stable/release/$v/sdk/dartsdk-linux-$a-release.zip" -o "$t/dart.zip"; unzip -q "$t/dart.zip" -d "$t/x"; rm -rf "$d/dart-sdk"; mv "$t/x/dart-sdk" "$d/dart-sdk"; fi; PATH="$d/dart-sdk/bin:$PATH" PUB_CACHE="$d/pub-cache" "$d/dart-sdk/bin/dart" pub global activate flutterflow_cli 0.0.41; printf '#!/bin/sh\\nPATH="%s/dart-sdk/bin:$PATH" PUB_CACHE="%s/pub-cache" exec "%s/pub-cache/bin/flutterflow" "$@"\\n' "$d" "$d" "$d" > /usr/local/bin/flutterflow; chmod 755 /usr/local/bin/flutterflow`
41020
+ },
41021
+ docs_url: "https://docs.flutterflow.io/flutterflow-cli/build/"
41022
+ },
40951
41023
  {
40952
41024
  id: "v0",
40953
41025
  name: "v0 by Vercel",
@@ -44769,6 +44841,20 @@ var FLAG_REGISTRY = [
44769
44841
  // on for their own org. Only a platform admin can (PR #6522 review).
44770
44842
  platformAdminOnly: true
44771
44843
  },
44844
+ {
44845
+ key: "direct-chat-voice",
44846
+ description: "Show the microphone (voice) button in the web Direct Chat composer - the Direct Chat drawer and the agent-screen chat dock (ENG-11542). Off by default: voice set expectations it does not yet meet for customers, but the team still needs it for testing, so it is enabled per org rather than removed. Does not gate the mobile PWA voice switch or the server voice-session routes.",
44847
+ flagType: "boolean",
44848
+ // PUBLIC (ADR-0022 §2): read in the browser via usePublicBooleanFlag, so it
44849
+ // must be in the GET /flags map. No env override (UI rollout, not an
44850
+ // operator gate). Ships dark (default false).
44851
+ public: true,
44852
+ defaultValue: false,
44853
+ // Platform admin only: the point of the flag is keeping a not-ready feature
44854
+ // away from customers, so a customer org admin must not be able to switch
44855
+ // it back on for their own org.
44856
+ platformAdminOnly: true
44857
+ },
44772
44858
  {
44773
44859
  key: "platform-maintenance-mode",
44774
44860
  description: 'Platform-wide maintenance mode (ENG-6506; widened to modes by ENG-11436). off = normal operation (ships dark; channels behave exactly as today). tools-offline = every agent KEEPS conversing but every Augmented tool that WRITES to the control plane refuses with a reason, so nothing is created during a window whose database restore would discard it; reads are untouched. fleet-offline = the previous boolean-true behaviour AND the write gate: admitted human inbound gets a "we are offline for maintenance" notice instead of being dispatched, for whole-platform downtime such as DB upgrades. The modes are CUMULATIVE \u2014 fleet-offline gates writes too, because silencing channel inbound does not stop a /loop or a scheduled task filing work. Read host-side per inbound and per tool call from the flags cache (no MCP restart). (Proactive "back online" follow-up is the ENG-6508 fast-follow, not this flag.)',
@@ -35335,6 +35335,78 @@ var INTEGRATION_REGISTRY = [
35335
35335
  },
35336
35336
  docs_url: "https://www.framer.com/developers/server-api-quick-start"
35337
35337
  },
35338
+ {
35339
+ // ENG-11540: FlutterFlow, through FlutterFlow's own CLI (`flutterflow ai`).
35340
+ //
35341
+ // WHAT "FLUTTERFLOW MCP" ACTUALLY IS. Not a hosted MCP endpoint. `flutterflow
35342
+ // ai init <dir>` creates a local workspace holding a vendored Dart SDK and an
35343
+ // MCP server registered in a workspace-root `.mcp.json`. The agent's own
35344
+ // `.mcp.json` is platform-rendered, so a workspace-local server is never seen
35345
+ // by the agent's session. The agent drives the same commands over Bash
35346
+ // instead, which is what FlutterFlow's own Claude Code plugin does
35347
+ // (github.com/FlutterFlow/flutterflow-claude) and is the same project state.
35348
+ //
35349
+ // HEADLESS, VERIFIED by running flutterflow_cli 0.0.41 on 2026-10-15: `init`
35350
+ // reads FF_API_KEY from the environment, takes the workspace positionally and
35351
+ // the project as `--project`, and never prompts when stdin is not a TTY. With
35352
+ // no key it fails fast ("API key is required") rather than hanging. A key
35353
+ // from the environment is never written to the CLI's credential store.
35354
+ // Neither `flutterflow --version` nor `flutterflow ai --version` works outside
35355
+ // a workspace, which is why the probe is central HTTP (connectivity-probe.ts).
35356
+ id: "flutterflow",
35357
+ name: "FlutterFlow",
35358
+ category: "code",
35359
+ description: "Build and edit FlutterFlow apps with the FlutterFlow CLI. Start with `flutterflow ai init <dir> --project <project-id>` (the key is already in FF_API_KEY), work inside that folder, inspect and validate before you run, and never read the folder's .flutterflow/.env (it holds the key). Never pass --yes to native-file unlock or lock, and ask a person before publish-library.",
35360
+ supported_auth_types: ["api_key"],
35361
+ // flutterflow_cli is 0.0.x and the AI SDK it downloads is versioned server-side.
35362
+ beta: true,
35363
+ installable: { category: "Code", authTypes: ["api_key"] },
35364
+ capabilities: [
35365
+ {
35366
+ id: "flutterflow:read-project",
35367
+ name: "Read Project",
35368
+ description: "Inspect, search and validate a FlutterFlow project: pages, components, resources, status and run history",
35369
+ access: "read"
35370
+ },
35371
+ {
35372
+ id: "flutterflow:edit-project",
35373
+ name: "Edit Project",
35374
+ description: "Push changes to a FlutterFlow project: pages, widgets, state, actions and theme",
35375
+ access: "write"
35376
+ },
35377
+ {
35378
+ id: "flutterflow:publish-library",
35379
+ name: "Publish Library",
35380
+ description: "Publish a new version of a FlutterFlow library that other projects depend on",
35381
+ access: "write"
35382
+ }
35383
+ ],
35384
+ cli_tool: {
35385
+ package: "flutterflow_cli",
35386
+ binary: "flutterflow",
35387
+ // `flutterflow ai` and the SDK it downloads both authenticate from this
35388
+ // (the legacy FLUTTERFLOW_API_TOKEN feeds only export-code/deploy-firebase).
35389
+ env_key: "FF_API_KEY",
35390
+ installer: "script",
35391
+ // The catalog is the trust boundary for this string (same contract as the
35392
+ // `gh` entry above). The CLI is a Dart pub package, and AL2023 has no Dart
35393
+ // rpm, so this installs Google's official SDK zip into a private prefix
35394
+ // (about 650 MB, which is why it is per-integration and not in the base
35395
+ // image) and puts a wrapper, not pub's shim, at /usr/local/bin/flutterflow.
35396
+ // pub's shim runs a bare `dart`, so a different Dart earlier on PATH would
35397
+ // reject the 3.13.5 snapshot; the wrapper pins our Dart for the CLI AND for
35398
+ // the `dart run` the downloaded SDK does. Re-runnable: a timed-out run
35399
+ // (180s) resumes from whatever finished. The SDK is unzipped into a
35400
+ // staging dir INSIDE the prefix and renamed into place last (CodeRabbit on
35401
+ // #7007): a run killed mid-unzip must never leave a partial dart-sdk that
35402
+ // passes the version check and then fails every retry. Staging on the same
35403
+ // filesystem is what makes the final `mv` a rename rather than a copy.
35404
+ // Versions pinned on purpose: bump
35405
+ // them together, after re-running the headless check above.
35406
+ script: `set -e; d=/usr/local/flutterflow; v=3.13.5; case "$(uname -m)" in x86_64) a=x64;; aarch64|arm64) a=arm64;; *) echo "flutterflow: unsupported architecture $(uname -m)" >&2; exit 1;; esac; if ! "$d/dart-sdk/bin/dart" --version 2>&1 | grep -q "version: $v "; then if ! command -v unzip >/dev/null 2>&1; then if command -v dnf >/dev/null 2>&1; then dnf install -y unzip; elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y unzip; else echo "flutterflow: unzip missing and no supported installer (need dnf or apt-get)" >&2; exit 1; fi; fi; mkdir -p "$d"; t=$(mktemp -d "$d/.stage.XXXXXX"); trap 'rm -rf "$t"' EXIT; curl -fsSL "https://storage.googleapis.com/dart-archive/channels/stable/release/$v/sdk/dartsdk-linux-$a-release.zip" -o "$t/dart.zip"; unzip -q "$t/dart.zip" -d "$t/x"; rm -rf "$d/dart-sdk"; mv "$t/x/dart-sdk" "$d/dart-sdk"; fi; PATH="$d/dart-sdk/bin:$PATH" PUB_CACHE="$d/pub-cache" "$d/dart-sdk/bin/dart" pub global activate flutterflow_cli 0.0.41; printf '#!/bin/sh\\nPATH="%s/dart-sdk/bin:$PATH" PUB_CACHE="%s/pub-cache" exec "%s/pub-cache/bin/flutterflow" "$@"\\n' "$d" "$d" "$d" > /usr/local/bin/flutterflow; chmod 755 /usr/local/bin/flutterflow`
35407
+ },
35408
+ docs_url: "https://docs.flutterflow.io/flutterflow-cli/build/"
35409
+ },
35338
35410
  {
35339
35411
  id: "v0",
35340
35412
  name: "v0 by Vercel",
@@ -39578,6 +39650,20 @@ var FLAG_REGISTRY = [
39578
39650
  // on for their own org. Only a platform admin can (PR #6522 review).
39579
39651
  platformAdminOnly: true
39580
39652
  },
39653
+ {
39654
+ key: "direct-chat-voice",
39655
+ description: "Show the microphone (voice) button in the web Direct Chat composer - the Direct Chat drawer and the agent-screen chat dock (ENG-11542). Off by default: voice set expectations it does not yet meet for customers, but the team still needs it for testing, so it is enabled per org rather than removed. Does not gate the mobile PWA voice switch or the server voice-session routes.",
39656
+ flagType: "boolean",
39657
+ // PUBLIC (ADR-0022 §2): read in the browser via usePublicBooleanFlag, so it
39658
+ // must be in the GET /flags map. No env override (UI rollout, not an
39659
+ // operator gate). Ships dark (default false).
39660
+ public: true,
39661
+ defaultValue: false,
39662
+ // Platform admin only: the point of the flag is keeping a not-ready feature
39663
+ // away from customers, so a customer org admin must not be able to switch
39664
+ // it back on for their own org.
39665
+ platformAdminOnly: true
39666
+ },
39581
39667
  {
39582
39668
  key: "platform-maintenance-mode",
39583
39669
  description: 'Platform-wide maintenance mode (ENG-6506; widened to modes by ENG-11436). off = normal operation (ships dark; channels behave exactly as today). tools-offline = every agent KEEPS conversing but every Augmented tool that WRITES to the control plane refuses with a reason, so nothing is created during a window whose database restore would discard it; reads are untouched. fleet-offline = the previous boolean-true behaviour AND the write gate: admitted human inbound gets a "we are offline for maintenance" notice instead of being dispatched, for whole-platform downtime such as DB upgrades. The modes are CUMULATIVE \u2014 fleet-offline gates writes too, because silencing channel inbound does not stop a /loop or a scheduled task filing work. Read host-side per inbound and per tool call from the flags cache (no MCP restart). (Proactive "back online" follow-up is the ENG-6508 fast-follow, not this flag.)',