@integrity-labs/agt-cli 0.28.1128 → 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.
package/dist/bin/agt.js CHANGED
@@ -40,12 +40,12 @@ import {
40
40
  success,
41
41
  table,
42
42
  warn
43
- } from "../chunk-Q272XYOI.js";
43
+ } from "../chunk-EEBMAG52.js";
44
44
  import {
45
45
  getProjectDir,
46
46
  isSessionResumeDisabled,
47
47
  readDirectChatSessionState
48
- } from "../chunk-BUCSF5DF.js";
48
+ } from "../chunk-TRZ4SG77.js";
49
49
  import {
50
50
  AnchorSessionClient,
51
51
  CHANNEL_REGISTRY,
@@ -79,7 +79,7 @@ import {
79
79
  serializeManifestForSlackCli,
80
80
  sessionFileExists,
81
81
  sessionTranscriptDir
82
- } from "../chunk-EVYDMDOY.js";
82
+ } from "../chunk-KN4GAY5Z.js";
83
83
  import "../chunk-B6UYVEMD.js";
84
84
  import "../chunk-XWVM4KPK.js";
85
85
  import "../chunk-EL5MWGGH.js";
@@ -5474,7 +5474,7 @@ import { execFileSync, execSync } from "child_process";
5474
5474
  import { existsSync as existsSync11, realpathSync as realpathSync2 } from "fs";
5475
5475
  import chalk18 from "chalk";
5476
5476
  import ora16 from "ora";
5477
- var cliVersion = true ? "0.28.1128" : "dev";
5477
+ var cliVersion = true ? "0.28.1130" : "dev";
5478
5478
  async function fetchLatestVersion() {
5479
5479
  const host2 = getHost();
5480
5480
  if (!host2) return null;
@@ -6734,7 +6734,7 @@ function handleError(err) {
6734
6734
  }
6735
6735
 
6736
6736
  // src/bin/agt.ts
6737
- var cliVersion2 = true ? "0.28.1128" : "dev";
6737
+ var cliVersion2 = true ? "0.28.1130" : "dev";
6738
6738
  var program = new Command();
6739
6739
  program.name("agt").description("Augmented CLI \u2014 agent provisioning and management").version(cliVersion2).option("--json", "Emit machine-readable JSON output (suppress spinners and colors)").option("--skip-update-check", "Skip the automatic update check on startup");
6740
6740
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -16,7 +16,7 @@ import {
16
16
  parseEnvFileEntries,
17
17
  parseEnvIntegrations,
18
18
  shellQuote
19
- } from "./chunk-BUCSF5DF.js";
19
+ } from "./chunk-TRZ4SG77.js";
20
20
  import {
21
21
  BIND_FAILURE_QUARANTINE_THRESHOLD,
22
22
  INTEGRATIONS_SECTION_END,
@@ -79,7 +79,7 @@ import {
79
79
  sessionTranscriptDir,
80
80
  worseConnectivityOutcome,
81
81
  wrapScheduledTaskPrompt
82
- } from "./chunk-EVYDMDOY.js";
82
+ } from "./chunk-KN4GAY5Z.js";
83
83
  import {
84
84
  classifyUnanswerablePane,
85
85
  isConsumerTermsDialogVisible,
@@ -8076,7 +8076,7 @@ function exchangeFailureKind(err) {
8076
8076
  }
8077
8077
 
8078
8078
  // src/lib/api-client.ts
8079
- var agtCliVersion = true ? "0.28.1128" : "dev";
8079
+ var agtCliVersion = true ? "0.28.1130" : "dev";
8080
8080
  var lastConfigHash = null;
8081
8081
  function setConfigHash(hash) {
8082
8082
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -13227,4 +13227,4 @@ export {
13227
13227
  managerInstallSystemUnitCommand,
13228
13228
  managerUninstallSystemUnitCommand
13229
13229
  };
13230
- //# sourceMappingURL=chunk-Q272XYOI.js.map
13230
+ //# sourceMappingURL=chunk-EEBMAG52.js.map
@@ -2821,6 +2821,78 @@ var INTEGRATION_REGISTRY = [
2821
2821
  },
2822
2822
  docs_url: "https://www.framer.com/developers/server-api-quick-start"
2823
2823
  },
2824
+ {
2825
+ // ENG-11540: FlutterFlow, through FlutterFlow's own CLI (`flutterflow ai`).
2826
+ //
2827
+ // WHAT "FLUTTERFLOW MCP" ACTUALLY IS. Not a hosted MCP endpoint. `flutterflow
2828
+ // ai init <dir>` creates a local workspace holding a vendored Dart SDK and an
2829
+ // MCP server registered in a workspace-root `.mcp.json`. The agent's own
2830
+ // `.mcp.json` is platform-rendered, so a workspace-local server is never seen
2831
+ // by the agent's session. The agent drives the same commands over Bash
2832
+ // instead, which is what FlutterFlow's own Claude Code plugin does
2833
+ // (github.com/FlutterFlow/flutterflow-claude) and is the same project state.
2834
+ //
2835
+ // HEADLESS, VERIFIED by running flutterflow_cli 0.0.41 on 2026-10-15: `init`
2836
+ // reads FF_API_KEY from the environment, takes the workspace positionally and
2837
+ // the project as `--project`, and never prompts when stdin is not a TTY. With
2838
+ // no key it fails fast ("API key is required") rather than hanging. A key
2839
+ // from the environment is never written to the CLI's credential store.
2840
+ // Neither `flutterflow --version` nor `flutterflow ai --version` works outside
2841
+ // a workspace, which is why the probe is central HTTP (connectivity-probe.ts).
2842
+ id: "flutterflow",
2843
+ name: "FlutterFlow",
2844
+ category: "code",
2845
+ 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.",
2846
+ supported_auth_types: ["api_key"],
2847
+ // flutterflow_cli is 0.0.x and the AI SDK it downloads is versioned server-side.
2848
+ beta: true,
2849
+ installable: { category: "Code", authTypes: ["api_key"] },
2850
+ capabilities: [
2851
+ {
2852
+ id: "flutterflow:read-project",
2853
+ name: "Read Project",
2854
+ description: "Inspect, search and validate a FlutterFlow project: pages, components, resources, status and run history",
2855
+ access: "read"
2856
+ },
2857
+ {
2858
+ id: "flutterflow:edit-project",
2859
+ name: "Edit Project",
2860
+ description: "Push changes to a FlutterFlow project: pages, widgets, state, actions and theme",
2861
+ access: "write"
2862
+ },
2863
+ {
2864
+ id: "flutterflow:publish-library",
2865
+ name: "Publish Library",
2866
+ description: "Publish a new version of a FlutterFlow library that other projects depend on",
2867
+ access: "write"
2868
+ }
2869
+ ],
2870
+ cli_tool: {
2871
+ package: "flutterflow_cli",
2872
+ binary: "flutterflow",
2873
+ // `flutterflow ai` and the SDK it downloads both authenticate from this
2874
+ // (the legacy FLUTTERFLOW_API_TOKEN feeds only export-code/deploy-firebase).
2875
+ env_key: "FF_API_KEY",
2876
+ installer: "script",
2877
+ // The catalog is the trust boundary for this string (same contract as the
2878
+ // `gh` entry above). The CLI is a Dart pub package, and AL2023 has no Dart
2879
+ // rpm, so this installs Google's official SDK zip into a private prefix
2880
+ // (about 650 MB, which is why it is per-integration and not in the base
2881
+ // image) and puts a wrapper, not pub's shim, at /usr/local/bin/flutterflow.
2882
+ // pub's shim runs a bare `dart`, so a different Dart earlier on PATH would
2883
+ // reject the 3.13.5 snapshot; the wrapper pins our Dart for the CLI AND for
2884
+ // the `dart run` the downloaded SDK does. Re-runnable: a timed-out run
2885
+ // (180s) resumes from whatever finished. The SDK is unzipped into a
2886
+ // staging dir INSIDE the prefix and renamed into place last (CodeRabbit on
2887
+ // #7007): a run killed mid-unzip must never leave a partial dart-sdk that
2888
+ // passes the version check and then fails every retry. Staging on the same
2889
+ // filesystem is what makes the final `mv` a rename rather than a copy.
2890
+ // Versions pinned on purpose: bump
2891
+ // them together, after re-running the headless check above.
2892
+ 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`
2893
+ },
2894
+ docs_url: "https://docs.flutterflow.io/flutterflow-cli/build/"
2895
+ },
2824
2896
  {
2825
2897
  id: "v0",
2826
2898
  name: "v0 by Vercel",
@@ -7698,6 +7770,20 @@ var FLAG_REGISTRY = [
7698
7770
  // on for their own org. Only a platform admin can (PR #6522 review).
7699
7771
  platformAdminOnly: true
7700
7772
  },
7773
+ {
7774
+ key: "direct-chat-voice",
7775
+ 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.",
7776
+ flagType: "boolean",
7777
+ // PUBLIC (ADR-0022 §2): read in the browser via usePublicBooleanFlag, so it
7778
+ // must be in the GET /flags map. No env override (UI rollout, not an
7779
+ // operator gate). Ships dark (default false).
7780
+ public: true,
7781
+ defaultValue: false,
7782
+ // Platform admin only: the point of the flag is keeping a not-ready feature
7783
+ // away from customers, so a customer org admin must not be able to switch
7784
+ // it back on for their own org.
7785
+ platformAdminOnly: true
7786
+ },
7701
7787
  {
7702
7788
  key: "platform-maintenance-mode",
7703
7789
  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.)',
@@ -12287,7 +12373,14 @@ var HTTP_PROBE_PROVIDERS = /* @__PURE__ */ new Set([
12287
12373
  // the integration is read-only, so without a probe a dead key would surface
12288
12374
  // only as failed reports. Routes to `probeOmnisend` against
12289
12375
  // `GET /brands/current`, never the rate-capped analytics endpoints.
12290
- "omnisend"
12376
+ "omnisend",
12377
+ // ENG-11540: FlutterFlow, added with the integration. Without it the CLI
12378
+ // default (`flutterflow --version`) runs, and that exits 1 outside a
12379
+ // workspace, so every healthy install would read broken from its first probe.
12380
+ // A FlutterFlow API key never expires on its own; it dies when regenerated or
12381
+ // when the account leaves a paid plan, and only a call can tell. Routes to
12382
+ // `probeFlutterFlow`: the CLI's own `sdkWhoAmI` key check.
12383
+ "flutterflow"
12291
12384
  // ENG-6100: GitHub is deliberately NOT here. This set drives the ASYNC
12292
12385
  // connectivity monitor's routing, where github (source_type='native')
12293
12386
  // stays host-side (cli_command — `gh`, the credential the agent actually
@@ -13064,6 +13157,56 @@ async function probeOmnisend(creds, fetchImpl) {
13064
13157
  return networkOutcome(err, String(key));
13065
13158
  }
13066
13159
  }
13160
+ async function probeFlutterFlow(creds, fetchImpl) {
13161
+ const key = creds.api_key ?? creds.access_token;
13162
+ if (!key)
13163
+ return { status: "down", message: "No FlutterFlow API key present" };
13164
+ try {
13165
+ const res = await timedFetch(fetchImpl, "https://api.flutterflow.io/v1/l/sdkWhoAmI", {
13166
+ method: "POST",
13167
+ headers: {
13168
+ Authorization: `Bearer ${key}`,
13169
+ "Content-Type": "application/json",
13170
+ Accept: "application/json"
13171
+ },
13172
+ body: "{}",
13173
+ // CodeRabbit on #7007: the key rides in Authorization, and fetch forwards
13174
+ // it on a same-origin redirect. FlutterFlow's key check never redirects, so
13175
+ // a 3xx is a proxy or a moved endpoint, never a verdict on the key.
13176
+ redirect: "manual"
13177
+ });
13178
+ if (res.status >= 300 && res.status < 400) {
13179
+ return { status: "down", message: `FlutterFlow API redirected (${res.status}) - not a FlutterFlow API response` };
13180
+ }
13181
+ if (res.status === 401 || res.status === 403) {
13182
+ return {
13183
+ status: "down",
13184
+ cause: "auth_rejected",
13185
+ message: `FlutterFlow rejected the API key (${res.status}) - it was regenerated, mistyped, or the account is no longer on a paid plan`
13186
+ };
13187
+ }
13188
+ if (!res.ok) {
13189
+ const message = res.status === 429 ? rateLimitMessage("FlutterFlow", res.status) : `FlutterFlow API returned ${res.status}`;
13190
+ return { status: statusForHttp(res.status), cause: causeForHttp(res.status), message };
13191
+ }
13192
+ let body = null;
13193
+ try {
13194
+ body = await res.json();
13195
+ } catch {
13196
+ body = null;
13197
+ }
13198
+ if (body === null || typeof body !== "object" || !("success" in body)) {
13199
+ return { status: "down", message: "FlutterFlow returned 200 without a result - not a FlutterFlow API response" };
13200
+ }
13201
+ if (body.success !== true) {
13202
+ const reason = typeof body.reason === "string" && body.reason.trim() !== "" ? `: ${redactSecret(body.reason.trim(), key).slice(0, 200)}` : "";
13203
+ return { status: "down", cause: "auth_rejected", message: `FlutterFlow did not accept the API key${reason}` };
13204
+ }
13205
+ return { status: "ok", message: "Connected to FlutterFlow (API key accepted)" };
13206
+ } catch (err) {
13207
+ return networkOutcome(err, String(key));
13208
+ }
13209
+ }
13067
13210
  async function probeHttpProvider(definitionId, credentials, fetchImpl = fetch, config) {
13068
13211
  switch (definitionId) {
13069
13212
  case "storrito":
@@ -13088,6 +13231,8 @@ async function probeHttpProvider(definitionId, credentials, fetchImpl = fetch, c
13088
13231
  return probeProjectworks(credentials, fetchImpl);
13089
13232
  case "omnisend":
13090
13233
  return probeOmnisend(credentials, fetchImpl);
13234
+ case "flutterflow":
13235
+ return probeFlutterFlow(credentials, fetchImpl);
13091
13236
  case "google-workspace":
13092
13237
  return probeBearerJson("https://www.googleapis.com/oauth2/v2/userinfo", credentials, fetchImpl, (body) => {
13093
13238
  const info = body;
@@ -16865,4 +17010,4 @@ export {
16865
17010
  peekCurrentSession,
16866
17011
  readDailySessionPin
16867
17012
  };
16868
- //# sourceMappingURL=chunk-EVYDMDOY.js.map
17013
+ //# sourceMappingURL=chunk-KN4GAY5Z.js.map