@integrity-labs/agt-cli 0.28.507 → 0.28.509

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.
@@ -32955,29 +32955,44 @@ var INTEGRATION_REGISTRY = [
32955
32955
  id: "vercel",
32956
32956
  name: "Vercel",
32957
32957
  category: "infrastructure",
32958
- description: "Check on Vercel app deployments \u2014 status, build/runtime logs \u2014 and search Vercel documentation. Remote streamable-HTTP MCP at https://mcp.vercel.com.",
32959
- // Same OAuth pattern as Granola/Higgsfield: Claude Code brokers the
32960
- // browser sign-in at runtime; nothing for the manager API to provision.
32961
- supported_auth_types: ["none"],
32958
+ description: "Check on Vercel app deployments \u2014 what's live, deployment status, and build logs \u2014 through Vercel's REST API with your own API token.",
32959
+ // ENG-8421: api_key, NOT the host-brokered MCP this used to be.
32960
+ //
32961
+ // Vercel MCP (`https://mcp.vercel.com`) is not completable from the
32962
+ // console, and that is a vendor constraint rather than a gap in our
32963
+ // plumbing. Established empirically 2026-08-03: Dynamic Client
32964
+ // Registration REJECTS an https redirect (`invalid_redirect_uri` — "not
32965
+ // approved for use by this authorization server") and ACCEPTS only
32966
+ // localhost; the device-code grant, the one flow needing no redirect, is
32967
+ // refused to DCR clients (`unauthorized_client`). So the only client
32968
+ // Vercel permits is a local one redirecting to its own ephemeral port —
32969
+ // i.e. Claude Code on the agent's host, driven by an operator running
32970
+ // `/mcp` in tmux. No console work can remove that step.
32971
+ //
32972
+ // The REST API has none of those constraints: plain bearer auth
32973
+ // (unauthenticated → `{"code":"forbidden","missingToken":true}`, bogus
32974
+ // bearer → `{"invalidToken":true}`), so a token the customer creates in
32975
+ // their own Vercel dashboard works directly. That makes this an ordinary
32976
+ // paste-a-key integration, and it means WE hold the credential — so it can
32977
+ // be stored, rotated, revoked and audited, none of which was true when the
32978
+ // grant lived in Claude Code's `~/.claude.json` on the host.
32979
+ //
32980
+ // Tools are declared as data on `integration_definitions.metadata.tools`
32981
+ // and dispatch through the existing Direct HTTP broker (the v0 pattern) —
32982
+ // there is deliberately no bespoke Vercel client and no bespoke broker.
32983
+ supported_auth_types: ["api_key"],
32962
32984
  capabilities: [
32963
- { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build/runtime logs.", access: "read" },
32964
- { id: "vercel:search-docs", name: "Search Documentation", description: "Search Vercel platform documentation.", access: "read" }
32985
+ { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build logs.", access: "read" }
32965
32986
  ],
32966
- docs_url: "https://vercel.com/docs/agent-resources/vercel-mcp",
32967
- // Beta until the headless OAuth flow (and Vercel's OAuth-client allowlist,
32968
- // which is vendor-side and outside our control) is verified end-to-end.
32969
- beta: true,
32970
- // No `auth`/`headers` — host-brokered OAuth (Claude Code authenticates
32971
- // directly with Vercel; nothing for us to inject). Declaring this here
32972
- // (rather than a hardcoded buildMcpJson/writeIntegrations branch, the
32973
- // pre-ENG-8035 Higgsfield-era pattern) lets the generic remote-MCP loop
32974
- // render the `.mcp.json` entry AND enrolls 'vercel' in the
32975
- // `registryRemoteMcpKeys` prune universe automatically, so an uninstall
32976
- // actually removes the entry instead of leaving it stale.
32977
- remoteMcp: {
32978
- type: "http",
32979
- url: "https://mcp.vercel.com"
32980
- }
32987
+ docs_url: "https://vercel.com/docs/rest-api",
32988
+ // Beta until the REST tool surface has been exercised against a real
32989
+ // customer token. (The previous reason "until the headless OAuth flow is
32990
+ // verified end-to-end" — is void: there is no OAuth flow any more.)
32991
+ beta: true
32992
+ // NO `remoteMcp`. See the tombstone in the claudecode adapter's prune
32993
+ // universe: dropping this field also drops `vercel` from
32994
+ // `registryRemoteMcpKeys`, which would strand the `.mcp.json` entry on
32995
+ // every host that installed the MCP variant.
32981
32996
  },
32982
32997
  {
32983
32998
  id: "qmd",
@@ -35502,6 +35517,54 @@ var FLAG_REGISTRY = [
35502
35517
  // Turning this on lets agents originate proposals that create customer
35503
35518
  // infrastructure once approved — same posture as augmented-support-writes.
35504
35519
  sensitive: true
35520
+ },
35521
+ {
35522
+ key: "github-broker-credentials",
35523
+ description: "Deliver GitHub App installation tokens to `git` and the `gh` CLI through the broker credential endpoint at USE time, instead of materializing them into the agent process environment at spawn (ENG-8344). A GitHub App installation token has a ~1h TTL, so the spawn-frozen GITHUB_ACCESS_TOKEN / GITHUB_TOKEN pair rotates hourly; the wrapper sources `.env.integrations` exactly once, so the only way a running agent sees the new value is a full session respawn (measured: 6 agents, ~144 kills/day). ENG-8343 stopped those kills landing mid-turn; this removes them. ON: `POST /host/agent-integrations` stops minting the installation token into the payload for auth_type=github_app rows (so computeIntegrationsHash stops seeing a rotating value) and marks the row credential_delivery=broker; the claudecode adapter then writes a git credential helper + a `gh` shim that fetch a fresh token per use from POST /host/agent-integrations/github/credential (ENG-8264 name addressing). OFF (default): byte-for-byte today's behaviour - the token is minted into the payload and materialized as GITHUB_ACCESS_TOKEN / GITHUB_TOKEN, no helper, no shim. NOTE the scope of the security claim: this removes the token from the agent's ENVIRONMENT, which is what stops the respawns. It does NOT make the token unreachable by a determined agent - the agent can invoke the helper itself. Strictly better than today, not a sandbox. Evaluated API-side only, per agent, in POST /host/agent-integrations; no host-side envVar. The host does not read this flag - it keys off the resulting credential_delivery marker on the row - so there is deliberately no host override that could put the token back on its own. Roll back from the flag.",
35524
+ flagType: "boolean",
35525
+ // Declared safe value is `false` = today's env delivery. Fail-safe direction:
35526
+ // a flag-DB read error must never strip `git`/`gh` credentials off a live
35527
+ // agent, which is what the ON path does when its host has no helper writer.
35528
+ defaultValue: false,
35529
+ // Flipping ON changes how every GitHub App agent on the scope authenticates
35530
+ // `git push` / `gh`. A bad flip takes those away, so it is a deliberate,
35531
+ // confirmed action (ADR-0022 §4).
35532
+ sensitive: true,
35533
+ // Set even though the flag is evaluated centrally, because `since` is a
35534
+ // REACH threshold ("a host this old has no consumer code for the flag") and
35535
+ // that is exactly the hazard here: the host does not read the flag, but it
35536
+ // does need the claudecode adapter's helper/shim writer and the wrapper PATH
35537
+ // prepend. On a host too old for those, the API would stop shipping the
35538
+ // token and NOTHING would replace it. Without `since` the flip-reach modal
35539
+ // reports FULL reach and hides that.
35540
+ //
35541
+ // DELIBERATE UNREACHABLE PLACEHOLDER - NOT A REAL THRESHOLD YET.
35542
+ // The sibling entries in this registry (`slack-hot-thread-guard` 0.28.339,
35543
+ // `slack-scheduled-channel-guard` 0.28.421) are BISECTED from published npm
35544
+ // artifacts, which is only possible AFTER this merges and publishes. A
35545
+ // pre-merge guess cannot be right, and the two directions are not
35546
+ // symmetric:
35547
+ // - too HIGH -> hosts classify `stale`, the modal over-warns. Annoying.
35548
+ // - too LOW -> hosts classify `honors` while carrying NO helper writer,
35549
+ // the modal promises full reach, and a flip strips `git`/
35550
+ // `gh` credentials with nothing replacing them. Outage.
35551
+ // So this is pinned ABOVE every published release on purpose: it classifies
35552
+ // EVERY host as `stale`, so the modal reports no reach rather than reach it
35553
+ // has no basis for. That is the intended pre-bisect state.
35554
+ //
35555
+ // BUT `since` IS ADVISORY, NOT A GUARD. It is read in exactly one place -
35556
+ // `computeFlagReach` behind GET /admin/reach, which renders the flip-reach
35557
+ // modal. `evaluate.ts` never reads it and neither does the override write
35558
+ // path. The placeholder therefore changes what an operator is TOLD; it does
35559
+ // not stop a flip on an under-`since` host. What actually holds the line
35560
+ // here is `defaultValue: false` plus `sensitive: true` plus the runbook.
35561
+ //
35562
+ // BEFORE THIS FLAG IS FLIPPED ANYWHERE: bisect the published dist for the
35563
+ // first agt-cli whose claudecode adapter writes agt-bin/ and whose wrapper
35564
+ // prepends it, then replace this with that exact version. The rollout
35565
+ // runbook gates on it. Leaving the placeholder in place is safe (nothing
35566
+ // flips); shipping a guessed number is not.
35567
+ since: "0.29.0"
35505
35568
  }
35506
35569
  ];
35507
35570
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -39282,29 +39282,44 @@ var INTEGRATION_REGISTRY = [
39282
39282
  id: "vercel",
39283
39283
  name: "Vercel",
39284
39284
  category: "infrastructure",
39285
- description: "Check on Vercel app deployments \u2014 status, build/runtime logs \u2014 and search Vercel documentation. Remote streamable-HTTP MCP at https://mcp.vercel.com.",
39286
- // Same OAuth pattern as Granola/Higgsfield: Claude Code brokers the
39287
- // browser sign-in at runtime; nothing for the manager API to provision.
39288
- supported_auth_types: ["none"],
39285
+ description: "Check on Vercel app deployments \u2014 what's live, deployment status, and build logs \u2014 through Vercel's REST API with your own API token.",
39286
+ // ENG-8421: api_key, NOT the host-brokered MCP this used to be.
39287
+ //
39288
+ // Vercel MCP (`https://mcp.vercel.com`) is not completable from the
39289
+ // console, and that is a vendor constraint rather than a gap in our
39290
+ // plumbing. Established empirically 2026-08-03: Dynamic Client
39291
+ // Registration REJECTS an https redirect (`invalid_redirect_uri` — "not
39292
+ // approved for use by this authorization server") and ACCEPTS only
39293
+ // localhost; the device-code grant, the one flow needing no redirect, is
39294
+ // refused to DCR clients (`unauthorized_client`). So the only client
39295
+ // Vercel permits is a local one redirecting to its own ephemeral port —
39296
+ // i.e. Claude Code on the agent's host, driven by an operator running
39297
+ // `/mcp` in tmux. No console work can remove that step.
39298
+ //
39299
+ // The REST API has none of those constraints: plain bearer auth
39300
+ // (unauthenticated → `{"code":"forbidden","missingToken":true}`, bogus
39301
+ // bearer → `{"invalidToken":true}`), so a token the customer creates in
39302
+ // their own Vercel dashboard works directly. That makes this an ordinary
39303
+ // paste-a-key integration, and it means WE hold the credential — so it can
39304
+ // be stored, rotated, revoked and audited, none of which was true when the
39305
+ // grant lived in Claude Code's `~/.claude.json` on the host.
39306
+ //
39307
+ // Tools are declared as data on `integration_definitions.metadata.tools`
39308
+ // and dispatch through the existing Direct HTTP broker (the v0 pattern) —
39309
+ // there is deliberately no bespoke Vercel client and no bespoke broker.
39310
+ supported_auth_types: ["api_key"],
39289
39311
  capabilities: [
39290
- { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build/runtime logs.", access: "read" },
39291
- { id: "vercel:search-docs", name: "Search Documentation", description: "Search Vercel platform documentation.", access: "read" }
39312
+ { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build logs.", access: "read" }
39292
39313
  ],
39293
- docs_url: "https://vercel.com/docs/agent-resources/vercel-mcp",
39294
- // Beta until the headless OAuth flow (and Vercel's OAuth-client allowlist,
39295
- // which is vendor-side and outside our control) is verified end-to-end.
39296
- beta: true,
39297
- // No `auth`/`headers` — host-brokered OAuth (Claude Code authenticates
39298
- // directly with Vercel; nothing for us to inject). Declaring this here
39299
- // (rather than a hardcoded buildMcpJson/writeIntegrations branch, the
39300
- // pre-ENG-8035 Higgsfield-era pattern) lets the generic remote-MCP loop
39301
- // render the `.mcp.json` entry AND enrolls 'vercel' in the
39302
- // `registryRemoteMcpKeys` prune universe automatically, so an uninstall
39303
- // actually removes the entry instead of leaving it stale.
39304
- remoteMcp: {
39305
- type: "http",
39306
- url: "https://mcp.vercel.com"
39307
- }
39314
+ docs_url: "https://vercel.com/docs/rest-api",
39315
+ // Beta until the REST tool surface has been exercised against a real
39316
+ // customer token. (The previous reason "until the headless OAuth flow is
39317
+ // verified end-to-end" — is void: there is no OAuth flow any more.)
39318
+ beta: true
39319
+ // NO `remoteMcp`. See the tombstone in the claudecode adapter's prune
39320
+ // universe: dropping this field also drops `vercel` from
39321
+ // `registryRemoteMcpKeys`, which would strand the `.mcp.json` entry on
39322
+ // every host that installed the MCP variant.
39308
39323
  },
39309
39324
  {
39310
39325
  id: "qmd",
@@ -41393,6 +41408,54 @@ var FLAG_REGISTRY = [
41393
41408
  // Turning this on lets agents originate proposals that create customer
41394
41409
  // infrastructure once approved — same posture as augmented-support-writes.
41395
41410
  sensitive: true
41411
+ },
41412
+ {
41413
+ key: "github-broker-credentials",
41414
+ description: "Deliver GitHub App installation tokens to `git` and the `gh` CLI through the broker credential endpoint at USE time, instead of materializing them into the agent process environment at spawn (ENG-8344). A GitHub App installation token has a ~1h TTL, so the spawn-frozen GITHUB_ACCESS_TOKEN / GITHUB_TOKEN pair rotates hourly; the wrapper sources `.env.integrations` exactly once, so the only way a running agent sees the new value is a full session respawn (measured: 6 agents, ~144 kills/day). ENG-8343 stopped those kills landing mid-turn; this removes them. ON: `POST /host/agent-integrations` stops minting the installation token into the payload for auth_type=github_app rows (so computeIntegrationsHash stops seeing a rotating value) and marks the row credential_delivery=broker; the claudecode adapter then writes a git credential helper + a `gh` shim that fetch a fresh token per use from POST /host/agent-integrations/github/credential (ENG-8264 name addressing). OFF (default): byte-for-byte today's behaviour - the token is minted into the payload and materialized as GITHUB_ACCESS_TOKEN / GITHUB_TOKEN, no helper, no shim. NOTE the scope of the security claim: this removes the token from the agent's ENVIRONMENT, which is what stops the respawns. It does NOT make the token unreachable by a determined agent - the agent can invoke the helper itself. Strictly better than today, not a sandbox. Evaluated API-side only, per agent, in POST /host/agent-integrations; no host-side envVar. The host does not read this flag - it keys off the resulting credential_delivery marker on the row - so there is deliberately no host override that could put the token back on its own. Roll back from the flag.",
41415
+ flagType: "boolean",
41416
+ // Declared safe value is `false` = today's env delivery. Fail-safe direction:
41417
+ // a flag-DB read error must never strip `git`/`gh` credentials off a live
41418
+ // agent, which is what the ON path does when its host has no helper writer.
41419
+ defaultValue: false,
41420
+ // Flipping ON changes how every GitHub App agent on the scope authenticates
41421
+ // `git push` / `gh`. A bad flip takes those away, so it is a deliberate,
41422
+ // confirmed action (ADR-0022 §4).
41423
+ sensitive: true,
41424
+ // Set even though the flag is evaluated centrally, because `since` is a
41425
+ // REACH threshold ("a host this old has no consumer code for the flag") and
41426
+ // that is exactly the hazard here: the host does not read the flag, but it
41427
+ // does need the claudecode adapter's helper/shim writer and the wrapper PATH
41428
+ // prepend. On a host too old for those, the API would stop shipping the
41429
+ // token and NOTHING would replace it. Without `since` the flip-reach modal
41430
+ // reports FULL reach and hides that.
41431
+ //
41432
+ // DELIBERATE UNREACHABLE PLACEHOLDER - NOT A REAL THRESHOLD YET.
41433
+ // The sibling entries in this registry (`slack-hot-thread-guard` 0.28.339,
41434
+ // `slack-scheduled-channel-guard` 0.28.421) are BISECTED from published npm
41435
+ // artifacts, which is only possible AFTER this merges and publishes. A
41436
+ // pre-merge guess cannot be right, and the two directions are not
41437
+ // symmetric:
41438
+ // - too HIGH -> hosts classify `stale`, the modal over-warns. Annoying.
41439
+ // - too LOW -> hosts classify `honors` while carrying NO helper writer,
41440
+ // the modal promises full reach, and a flip strips `git`/
41441
+ // `gh` credentials with nothing replacing them. Outage.
41442
+ // So this is pinned ABOVE every published release on purpose: it classifies
41443
+ // EVERY host as `stale`, so the modal reports no reach rather than reach it
41444
+ // has no basis for. That is the intended pre-bisect state.
41445
+ //
41446
+ // BUT `since` IS ADVISORY, NOT A GUARD. It is read in exactly one place -
41447
+ // `computeFlagReach` behind GET /admin/reach, which renders the flip-reach
41448
+ // modal. `evaluate.ts` never reads it and neither does the override write
41449
+ // path. The placeholder therefore changes what an operator is TOLD; it does
41450
+ // not stop a flip on an under-`since` host. What actually holds the line
41451
+ // here is `defaultValue: false` plus `sensitive: true` plus the runbook.
41452
+ //
41453
+ // BEFORE THIS FLAG IS FLIPPED ANYWHERE: bisect the published dist for the
41454
+ // first agt-cli whose claudecode adapter writes agt-bin/ and whose wrapper
41455
+ // prepends it, then replace this with that exact version. The rollout
41456
+ // runbook gates on it. Leaving the placeholder in place is safe (nothing
41457
+ // flips); shipping a guessed number is not.
41458
+ since: "0.29.0"
41396
41459
  }
41397
41460
  ];
41398
41461
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -33177,29 +33177,44 @@ var INTEGRATION_REGISTRY = [
33177
33177
  id: "vercel",
33178
33178
  name: "Vercel",
33179
33179
  category: "infrastructure",
33180
- description: "Check on Vercel app deployments \u2014 status, build/runtime logs \u2014 and search Vercel documentation. Remote streamable-HTTP MCP at https://mcp.vercel.com.",
33181
- // Same OAuth pattern as Granola/Higgsfield: Claude Code brokers the
33182
- // browser sign-in at runtime; nothing for the manager API to provision.
33183
- supported_auth_types: ["none"],
33180
+ description: "Check on Vercel app deployments \u2014 what's live, deployment status, and build logs \u2014 through Vercel's REST API with your own API token.",
33181
+ // ENG-8421: api_key, NOT the host-brokered MCP this used to be.
33182
+ //
33183
+ // Vercel MCP (`https://mcp.vercel.com`) is not completable from the
33184
+ // console, and that is a vendor constraint rather than a gap in our
33185
+ // plumbing. Established empirically 2026-08-03: Dynamic Client
33186
+ // Registration REJECTS an https redirect (`invalid_redirect_uri` — "not
33187
+ // approved for use by this authorization server") and ACCEPTS only
33188
+ // localhost; the device-code grant, the one flow needing no redirect, is
33189
+ // refused to DCR clients (`unauthorized_client`). So the only client
33190
+ // Vercel permits is a local one redirecting to its own ephemeral port —
33191
+ // i.e. Claude Code on the agent's host, driven by an operator running
33192
+ // `/mcp` in tmux. No console work can remove that step.
33193
+ //
33194
+ // The REST API has none of those constraints: plain bearer auth
33195
+ // (unauthenticated → `{"code":"forbidden","missingToken":true}`, bogus
33196
+ // bearer → `{"invalidToken":true}`), so a token the customer creates in
33197
+ // their own Vercel dashboard works directly. That makes this an ordinary
33198
+ // paste-a-key integration, and it means WE hold the credential — so it can
33199
+ // be stored, rotated, revoked and audited, none of which was true when the
33200
+ // grant lived in Claude Code's `~/.claude.json` on the host.
33201
+ //
33202
+ // Tools are declared as data on `integration_definitions.metadata.tools`
33203
+ // and dispatch through the existing Direct HTTP broker (the v0 pattern) —
33204
+ // there is deliberately no bespoke Vercel client and no bespoke broker.
33205
+ supported_auth_types: ["api_key"],
33184
33206
  capabilities: [
33185
- { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build/runtime logs.", access: "read" },
33186
- { id: "vercel:search-docs", name: "Search Documentation", description: "Search Vercel platform documentation.", access: "read" }
33207
+ { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build logs.", access: "read" }
33187
33208
  ],
33188
- docs_url: "https://vercel.com/docs/agent-resources/vercel-mcp",
33189
- // Beta until the headless OAuth flow (and Vercel's OAuth-client allowlist,
33190
- // which is vendor-side and outside our control) is verified end-to-end.
33191
- beta: true,
33192
- // No `auth`/`headers` — host-brokered OAuth (Claude Code authenticates
33193
- // directly with Vercel; nothing for us to inject). Declaring this here
33194
- // (rather than a hardcoded buildMcpJson/writeIntegrations branch, the
33195
- // pre-ENG-8035 Higgsfield-era pattern) lets the generic remote-MCP loop
33196
- // render the `.mcp.json` entry AND enrolls 'vercel' in the
33197
- // `registryRemoteMcpKeys` prune universe automatically, so an uninstall
33198
- // actually removes the entry instead of leaving it stale.
33199
- remoteMcp: {
33200
- type: "http",
33201
- url: "https://mcp.vercel.com"
33202
- }
33209
+ docs_url: "https://vercel.com/docs/rest-api",
33210
+ // Beta until the REST tool surface has been exercised against a real
33211
+ // customer token. (The previous reason "until the headless OAuth flow is
33212
+ // verified end-to-end" — is void: there is no OAuth flow any more.)
33213
+ beta: true
33214
+ // NO `remoteMcp`. See the tombstone in the claudecode adapter's prune
33215
+ // universe: dropping this field also drops `vercel` from
33216
+ // `registryRemoteMcpKeys`, which would strand the `.mcp.json` entry on
33217
+ // every host that installed the MCP variant.
33203
33218
  },
33204
33219
  {
33205
33220
  id: "qmd",
@@ -35671,6 +35686,54 @@ var FLAG_REGISTRY = [
35671
35686
  // Turning this on lets agents originate proposals that create customer
35672
35687
  // infrastructure once approved — same posture as augmented-support-writes.
35673
35688
  sensitive: true
35689
+ },
35690
+ {
35691
+ key: "github-broker-credentials",
35692
+ description: "Deliver GitHub App installation tokens to `git` and the `gh` CLI through the broker credential endpoint at USE time, instead of materializing them into the agent process environment at spawn (ENG-8344). A GitHub App installation token has a ~1h TTL, so the spawn-frozen GITHUB_ACCESS_TOKEN / GITHUB_TOKEN pair rotates hourly; the wrapper sources `.env.integrations` exactly once, so the only way a running agent sees the new value is a full session respawn (measured: 6 agents, ~144 kills/day). ENG-8343 stopped those kills landing mid-turn; this removes them. ON: `POST /host/agent-integrations` stops minting the installation token into the payload for auth_type=github_app rows (so computeIntegrationsHash stops seeing a rotating value) and marks the row credential_delivery=broker; the claudecode adapter then writes a git credential helper + a `gh` shim that fetch a fresh token per use from POST /host/agent-integrations/github/credential (ENG-8264 name addressing). OFF (default): byte-for-byte today's behaviour - the token is minted into the payload and materialized as GITHUB_ACCESS_TOKEN / GITHUB_TOKEN, no helper, no shim. NOTE the scope of the security claim: this removes the token from the agent's ENVIRONMENT, which is what stops the respawns. It does NOT make the token unreachable by a determined agent - the agent can invoke the helper itself. Strictly better than today, not a sandbox. Evaluated API-side only, per agent, in POST /host/agent-integrations; no host-side envVar. The host does not read this flag - it keys off the resulting credential_delivery marker on the row - so there is deliberately no host override that could put the token back on its own. Roll back from the flag.",
35693
+ flagType: "boolean",
35694
+ // Declared safe value is `false` = today's env delivery. Fail-safe direction:
35695
+ // a flag-DB read error must never strip `git`/`gh` credentials off a live
35696
+ // agent, which is what the ON path does when its host has no helper writer.
35697
+ defaultValue: false,
35698
+ // Flipping ON changes how every GitHub App agent on the scope authenticates
35699
+ // `git push` / `gh`. A bad flip takes those away, so it is a deliberate,
35700
+ // confirmed action (ADR-0022 §4).
35701
+ sensitive: true,
35702
+ // Set even though the flag is evaluated centrally, because `since` is a
35703
+ // REACH threshold ("a host this old has no consumer code for the flag") and
35704
+ // that is exactly the hazard here: the host does not read the flag, but it
35705
+ // does need the claudecode adapter's helper/shim writer and the wrapper PATH
35706
+ // prepend. On a host too old for those, the API would stop shipping the
35707
+ // token and NOTHING would replace it. Without `since` the flip-reach modal
35708
+ // reports FULL reach and hides that.
35709
+ //
35710
+ // DELIBERATE UNREACHABLE PLACEHOLDER - NOT A REAL THRESHOLD YET.
35711
+ // The sibling entries in this registry (`slack-hot-thread-guard` 0.28.339,
35712
+ // `slack-scheduled-channel-guard` 0.28.421) are BISECTED from published npm
35713
+ // artifacts, which is only possible AFTER this merges and publishes. A
35714
+ // pre-merge guess cannot be right, and the two directions are not
35715
+ // symmetric:
35716
+ // - too HIGH -> hosts classify `stale`, the modal over-warns. Annoying.
35717
+ // - too LOW -> hosts classify `honors` while carrying NO helper writer,
35718
+ // the modal promises full reach, and a flip strips `git`/
35719
+ // `gh` credentials with nothing replacing them. Outage.
35720
+ // So this is pinned ABOVE every published release on purpose: it classifies
35721
+ // EVERY host as `stale`, so the modal reports no reach rather than reach it
35722
+ // has no basis for. That is the intended pre-bisect state.
35723
+ //
35724
+ // BUT `since` IS ADVISORY, NOT A GUARD. It is read in exactly one place -
35725
+ // `computeFlagReach` behind GET /admin/reach, which renders the flip-reach
35726
+ // modal. `evaluate.ts` never reads it and neither does the override write
35727
+ // path. The placeholder therefore changes what an operator is TOLD; it does
35728
+ // not stop a flip on an under-`since` host. What actually holds the line
35729
+ // here is `defaultValue: false` plus `sensitive: true` plus the runbook.
35730
+ //
35731
+ // BEFORE THIS FLAG IS FLIPPED ANYWHERE: bisect the published dist for the
35732
+ // first agt-cli whose claudecode adapter writes agt-bin/ and whose wrapper
35733
+ // prepends it, then replace this with that exact version. The rollout
35734
+ // runbook gates on it. Leaving the placeholder in place is safe (nothing
35735
+ // flips); shipping a guessed number is not.
35736
+ since: "0.29.0"
35674
35737
  }
35675
35738
  ];
35676
35739
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -33503,29 +33503,44 @@ var INTEGRATION_REGISTRY = [
33503
33503
  id: "vercel",
33504
33504
  name: "Vercel",
33505
33505
  category: "infrastructure",
33506
- description: "Check on Vercel app deployments \u2014 status, build/runtime logs \u2014 and search Vercel documentation. Remote streamable-HTTP MCP at https://mcp.vercel.com.",
33507
- // Same OAuth pattern as Granola/Higgsfield: Claude Code brokers the
33508
- // browser sign-in at runtime; nothing for the manager API to provision.
33509
- supported_auth_types: ["none"],
33506
+ description: "Check on Vercel app deployments \u2014 what's live, deployment status, and build logs \u2014 through Vercel's REST API with your own API token.",
33507
+ // ENG-8421: api_key, NOT the host-brokered MCP this used to be.
33508
+ //
33509
+ // Vercel MCP (`https://mcp.vercel.com`) is not completable from the
33510
+ // console, and that is a vendor constraint rather than a gap in our
33511
+ // plumbing. Established empirically 2026-08-03: Dynamic Client
33512
+ // Registration REJECTS an https redirect (`invalid_redirect_uri` — "not
33513
+ // approved for use by this authorization server") and ACCEPTS only
33514
+ // localhost; the device-code grant, the one flow needing no redirect, is
33515
+ // refused to DCR clients (`unauthorized_client`). So the only client
33516
+ // Vercel permits is a local one redirecting to its own ephemeral port —
33517
+ // i.e. Claude Code on the agent's host, driven by an operator running
33518
+ // `/mcp` in tmux. No console work can remove that step.
33519
+ //
33520
+ // The REST API has none of those constraints: plain bearer auth
33521
+ // (unauthenticated → `{"code":"forbidden","missingToken":true}`, bogus
33522
+ // bearer → `{"invalidToken":true}`), so a token the customer creates in
33523
+ // their own Vercel dashboard works directly. That makes this an ordinary
33524
+ // paste-a-key integration, and it means WE hold the credential — so it can
33525
+ // be stored, rotated, revoked and audited, none of which was true when the
33526
+ // grant lived in Claude Code's `~/.claude.json` on the host.
33527
+ //
33528
+ // Tools are declared as data on `integration_definitions.metadata.tools`
33529
+ // and dispatch through the existing Direct HTTP broker (the v0 pattern) —
33530
+ // there is deliberately no bespoke Vercel client and no bespoke broker.
33531
+ supported_auth_types: ["api_key"],
33510
33532
  capabilities: [
33511
- { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build/runtime logs.", access: "read" },
33512
- { id: "vercel:search-docs", name: "Search Documentation", description: "Search Vercel platform documentation.", access: "read" }
33533
+ { id: "vercel:read-deployments", name: "Read Deployments", description: "List teams/projects, check deployment status, and read build logs.", access: "read" }
33513
33534
  ],
33514
- docs_url: "https://vercel.com/docs/agent-resources/vercel-mcp",
33515
- // Beta until the headless OAuth flow (and Vercel's OAuth-client allowlist,
33516
- // which is vendor-side and outside our control) is verified end-to-end.
33517
- beta: true,
33518
- // No `auth`/`headers` — host-brokered OAuth (Claude Code authenticates
33519
- // directly with Vercel; nothing for us to inject). Declaring this here
33520
- // (rather than a hardcoded buildMcpJson/writeIntegrations branch, the
33521
- // pre-ENG-8035 Higgsfield-era pattern) lets the generic remote-MCP loop
33522
- // render the `.mcp.json` entry AND enrolls 'vercel' in the
33523
- // `registryRemoteMcpKeys` prune universe automatically, so an uninstall
33524
- // actually removes the entry instead of leaving it stale.
33525
- remoteMcp: {
33526
- type: "http",
33527
- url: "https://mcp.vercel.com"
33528
- }
33535
+ docs_url: "https://vercel.com/docs/rest-api",
33536
+ // Beta until the REST tool surface has been exercised against a real
33537
+ // customer token. (The previous reason "until the headless OAuth flow is
33538
+ // verified end-to-end" — is void: there is no OAuth flow any more.)
33539
+ beta: true
33540
+ // NO `remoteMcp`. See the tombstone in the claudecode adapter's prune
33541
+ // universe: dropping this field also drops `vercel` from
33542
+ // `registryRemoteMcpKeys`, which would strand the `.mcp.json` entry on
33543
+ // every host that installed the MCP variant.
33529
33544
  },
33530
33545
  {
33531
33546
  id: "qmd",
@@ -35997,6 +36012,54 @@ var FLAG_REGISTRY = [
35997
36012
  // Turning this on lets agents originate proposals that create customer
35998
36013
  // infrastructure once approved — same posture as augmented-support-writes.
35999
36014
  sensitive: true
36015
+ },
36016
+ {
36017
+ key: "github-broker-credentials",
36018
+ description: "Deliver GitHub App installation tokens to `git` and the `gh` CLI through the broker credential endpoint at USE time, instead of materializing them into the agent process environment at spawn (ENG-8344). A GitHub App installation token has a ~1h TTL, so the spawn-frozen GITHUB_ACCESS_TOKEN / GITHUB_TOKEN pair rotates hourly; the wrapper sources `.env.integrations` exactly once, so the only way a running agent sees the new value is a full session respawn (measured: 6 agents, ~144 kills/day). ENG-8343 stopped those kills landing mid-turn; this removes them. ON: `POST /host/agent-integrations` stops minting the installation token into the payload for auth_type=github_app rows (so computeIntegrationsHash stops seeing a rotating value) and marks the row credential_delivery=broker; the claudecode adapter then writes a git credential helper + a `gh` shim that fetch a fresh token per use from POST /host/agent-integrations/github/credential (ENG-8264 name addressing). OFF (default): byte-for-byte today's behaviour - the token is minted into the payload and materialized as GITHUB_ACCESS_TOKEN / GITHUB_TOKEN, no helper, no shim. NOTE the scope of the security claim: this removes the token from the agent's ENVIRONMENT, which is what stops the respawns. It does NOT make the token unreachable by a determined agent - the agent can invoke the helper itself. Strictly better than today, not a sandbox. Evaluated API-side only, per agent, in POST /host/agent-integrations; no host-side envVar. The host does not read this flag - it keys off the resulting credential_delivery marker on the row - so there is deliberately no host override that could put the token back on its own. Roll back from the flag.",
36019
+ flagType: "boolean",
36020
+ // Declared safe value is `false` = today's env delivery. Fail-safe direction:
36021
+ // a flag-DB read error must never strip `git`/`gh` credentials off a live
36022
+ // agent, which is what the ON path does when its host has no helper writer.
36023
+ defaultValue: false,
36024
+ // Flipping ON changes how every GitHub App agent on the scope authenticates
36025
+ // `git push` / `gh`. A bad flip takes those away, so it is a deliberate,
36026
+ // confirmed action (ADR-0022 §4).
36027
+ sensitive: true,
36028
+ // Set even though the flag is evaluated centrally, because `since` is a
36029
+ // REACH threshold ("a host this old has no consumer code for the flag") and
36030
+ // that is exactly the hazard here: the host does not read the flag, but it
36031
+ // does need the claudecode adapter's helper/shim writer and the wrapper PATH
36032
+ // prepend. On a host too old for those, the API would stop shipping the
36033
+ // token and NOTHING would replace it. Without `since` the flip-reach modal
36034
+ // reports FULL reach and hides that.
36035
+ //
36036
+ // DELIBERATE UNREACHABLE PLACEHOLDER - NOT A REAL THRESHOLD YET.
36037
+ // The sibling entries in this registry (`slack-hot-thread-guard` 0.28.339,
36038
+ // `slack-scheduled-channel-guard` 0.28.421) are BISECTED from published npm
36039
+ // artifacts, which is only possible AFTER this merges and publishes. A
36040
+ // pre-merge guess cannot be right, and the two directions are not
36041
+ // symmetric:
36042
+ // - too HIGH -> hosts classify `stale`, the modal over-warns. Annoying.
36043
+ // - too LOW -> hosts classify `honors` while carrying NO helper writer,
36044
+ // the modal promises full reach, and a flip strips `git`/
36045
+ // `gh` credentials with nothing replacing them. Outage.
36046
+ // So this is pinned ABOVE every published release on purpose: it classifies
36047
+ // EVERY host as `stale`, so the modal reports no reach rather than reach it
36048
+ // has no basis for. That is the intended pre-bisect state.
36049
+ //
36050
+ // BUT `since` IS ADVISORY, NOT A GUARD. It is read in exactly one place -
36051
+ // `computeFlagReach` behind GET /admin/reach, which renders the flip-reach
36052
+ // modal. `evaluate.ts` never reads it and neither does the override write
36053
+ // path. The placeholder therefore changes what an operator is TOLD; it does
36054
+ // not stop a flip on an under-`since` host. What actually holds the line
36055
+ // here is `defaultValue: false` plus `sensitive: true` plus the runbook.
36056
+ //
36057
+ // BEFORE THIS FLAG IS FLIPPED ANYWHERE: bisect the published dist for the
36058
+ // first agt-cli whose claudecode adapter writes agt-bin/ and whose wrapper
36059
+ // prepends it, then replace this with that exact version. The rollout
36060
+ // runbook gates on it. Leaving the placeholder in place is safe (nothing
36061
+ // flips); shipping a guessed number is not.
36062
+ since: "0.29.0"
36000
36063
  }
36001
36064
  ];
36002
36065
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -37,7 +37,7 @@ import {
37
37
  writeDirectChatSessionState,
38
38
  writeEgressAllowlist,
39
39
  writePersistentClaudeWrapper
40
- } from "./chunk-4PRR22KH.js";
40
+ } from "./chunk-7U63M5R6.js";
41
41
  import "./chunk-XWVM4KPK.js";
42
42
  export {
43
43
  EGRESS_BASELINE_DOMAINS,
@@ -79,4 +79,4 @@ export {
79
79
  writeEgressAllowlist,
80
80
  writePersistentClaudeWrapper
81
81
  };
82
- //# sourceMappingURL=persistent-session-OMAAP4OU.js.map
82
+ //# sourceMappingURL=persistent-session-BDNW4K6M.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-4PRR22KH.js";
3
+ } from "./chunk-7U63M5R6.js";
4
4
  import "./chunk-XWVM4KPK.js";
5
5
 
6
6
  // src/lib/responsiveness-probe.ts
@@ -662,4 +662,4 @@ export {
662
662
  readAndResetSlackReplyBindingClassifications,
663
663
  readAndResetSlackReplyTargetClassifications
664
664
  };
665
- //# sourceMappingURL=responsiveness-probe-NRH2AQW6.js.map
665
+ //# sourceMappingURL=responsiveness-probe-KR73VA2S.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.507",
3
+ "version": "0.28.509",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {