@integrity-labs/agt-cli 0.28.424 → 0.28.425

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.
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-O7OCNB6B.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-37WNPBRA.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-PAP4BS3I.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-XN4JLRAB.js.map
@@ -45,7 +45,7 @@ import {
45
45
  resolveEffectivePinRaw,
46
46
  safeWriteJsonAtomic,
47
47
  setConfigHash
48
- } from "../chunk-2QBY2QVX.js";
48
+ } from "../chunk-M3L6HOYG.js";
49
49
  import {
50
50
  getProjectDir as getProjectDir2,
51
51
  getReadyTasks,
@@ -150,7 +150,7 @@ import {
150
150
  toOpencodeModel,
151
151
  transcriptActivityAgeSeconds,
152
152
  writeEgressAllowlist
153
- } from "../chunk-CWIWI2ZX.js";
153
+ } from "../chunk-PR3IJAMV.js";
154
154
  import {
155
155
  reapOrphanChannelMcps
156
156
  } from "../chunk-XWVM4KPK.js";
@@ -9479,7 +9479,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
9479
9479
  var lastVersionCheckAt = 0;
9480
9480
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
9481
9481
  var lastResponsivenessProbeAt = 0;
9482
- var agtCliVersion = true ? "0.28.424" : "dev";
9482
+ var agtCliVersion = true ? "0.28.425" : "dev";
9483
9483
  function resolveBrewPath(execFileSync2) {
9484
9484
  try {
9485
9485
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -10627,7 +10627,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
10627
10627
  if (codeNames.length === 0) return;
10628
10628
  void (async () => {
10629
10629
  try {
10630
- const { collectDiagnostics } = await import("../persistent-session-O7OCNB6B.js");
10630
+ const { collectDiagnostics } = await import("../persistent-session-37WNPBRA.js");
10631
10631
  await api.post("/host/heartbeat", {
10632
10632
  host_id: hostId,
10633
10633
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor)
@@ -10734,7 +10734,7 @@ async function pollCycle() {
10734
10734
  }
10735
10735
  try {
10736
10736
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
10737
- const { collectDiagnostics } = await import("../persistent-session-O7OCNB6B.js");
10737
+ const { collectDiagnostics } = await import("../persistent-session-37WNPBRA.js");
10738
10738
  const diagCodeNames = [...agentState.persistentSessionAgents];
10739
10739
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor) : void 0;
10740
10740
  let tailscaleHostname;
@@ -10848,7 +10848,7 @@ async function pollCycle() {
10848
10848
  collectResponsivenessProbes,
10849
10849
  collectPanelessActivityProbes,
10850
10850
  getResponsivenessIntervalMs
10851
- } = await import("../responsiveness-probe-R5FWKHPI.js");
10851
+ } = await import("../responsiveness-probe-GMIXR3TR.js");
10852
10852
  const probeIntervalMs = getResponsivenessIntervalMs();
10853
10853
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
10854
10854
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -10887,7 +10887,7 @@ async function pollCycle() {
10887
10887
  collectResponsivenessProbes,
10888
10888
  livePendingInboundOldestAgeSeconds,
10889
10889
  parkPendingInbound
10890
- } = await import("../responsiveness-probe-R5FWKHPI.js");
10890
+ } = await import("../responsiveness-probe-GMIXR3TR.js");
10891
10891
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
10892
10892
  const wedgeNow = /* @__PURE__ */ new Date();
10893
10893
  const liveAgents = agentState.persistentSessionAgents;
@@ -14198,7 +14198,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
14198
14198
  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}`));
14199
14199
  void (async () => {
14200
14200
  try {
14201
- const { collectDiagnostics } = await import("../persistent-session-O7OCNB6B.js");
14201
+ const { collectDiagnostics } = await import("../persistent-session-37WNPBRA.js");
14202
14202
  await api.post("/host/heartbeat", {
14203
14203
  host_id: hostId,
14204
14204
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
@@ -14248,7 +14248,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
14248
14248
  }
14249
14249
  try {
14250
14250
  const hostId = await getHostId();
14251
- const { collectDiagnostics } = await import("../persistent-session-O7OCNB6B.js");
14251
+ const { collectDiagnostics } = await import("../persistent-session-37WNPBRA.js");
14252
14252
  await api.post("/host/heartbeat", {
14253
14253
  host_id: hostId,
14254
14254
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
@@ -14701,7 +14701,7 @@ async function processClaudePairSessions(agents) {
14701
14701
  killPairSession,
14702
14702
  pairTmuxSession,
14703
14703
  finalizeClaudePairOnboarding
14704
- } = await import("../claude-pair-runtime-PAP4BS3I.js");
14704
+ } = await import("../claude-pair-runtime-XN4JLRAB.js");
14705
14705
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
14706
14706
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
14707
14707
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -33899,6 +33899,86 @@ var INTEGRATION_REGISTRY = [
33899
33899
  ]
33900
33900
  }
33901
33901
  },
33902
+ {
33903
+ // Social Scraping: a PREMIUM, platform-managed integration on the Deck /
33904
+ // Firecrawl / X-Search model (ADR-0031, epic ENG-6920; ADR-0053). Backed by
33905
+ // Apify, but deliberately NOT surfaced as an "Apify" integration - the
33906
+ // integration is what a customer picks, and Apify is a vendor, not a job.
33907
+ // Splitting by job also means opt-in, rate card and monthly budget are keyed
33908
+ // per definition, so an org can take Local Business Data without taking the
33909
+ // pricier, more ToS-sensitive social scraping.
33910
+ //
33911
+ // Augmented holds ONE Apify account whose token (APIFY_API_TOKEN, read
33912
+ // from SSM - the API Lambda env is at the 4KB cap) every customer run bills
33913
+ // back to, so the key is a single platform-held secret, NOT a per-agent
33914
+ // credential. Auth type is `none` - customers never enter a key. Tools run on
33915
+ // a brokered-REST lane (apify-brokers.ts) so each run is metered at one
33916
+ // chokepoint and gated on a per-org monthly USD cap + the per-org premium
33917
+ // opt-in.
33918
+ //
33919
+ // "PPE-only" is guaranteed by a curated allowlist: the broker only ever runs
33920
+ // Actors on it, so a rental / pay-per-usage Actor can never surprise-bill the
33921
+ // shared account. (Apify's x402 rail enforces PPE-only at the payment layer;
33922
+ // we are on the account-key rail - Option A in the spike.) See
33923
+ // docs/design/apify-premium-option-a-ppe-allowlist.md.
33924
+ //
33925
+ // No `installable` here on purpose: this is a seed integration
33926
+ // (integration-definitions.json), so the seed catalog already makes it
33927
+ // picker-visible. This registry entry exists ONLY to carry the `premium`
33928
+ // descriptor that `isPremiumDefinition` reads - which arms the per-org opt-in
33929
+ // gate, the priced acknowledgement modal, and the admin pricing tab.
33930
+ id: "social-scraping",
33931
+ name: "Social Scraping",
33932
+ category: "social",
33933
+ description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research. Augmented Team manages the scraping account for you; there is no key to enter.",
33934
+ supported_auth_types: ["none"],
33935
+ capabilities: [
33936
+ { id: "social-scraping:scrape", name: "Scrape Social Posts", description: "Scrape public TikTok, Instagram and YouTube content (social_scrape_tiktok, social_scrape_instagram, social_scrape_youtube).", access: "write" },
33937
+ { id: "social-scraping:status", name: "Check Scrape Runs", description: "Poll a running scrape for status + results (social_scrape_status).", access: "read" }
33938
+ ],
33939
+ docs_url: "https://docs.apify.com/api/v2",
33940
+ beta: true,
33941
+ // Premium (billable). The upstream pay-per-event cost is per-Actor and
33942
+ // VARIABLE (each Actor's creator sets its own event prices), unlike X-Search's
33943
+ // fixed per-post price. So we meter the ACTUAL cost charged to us for each
33944
+ // run, as a pass-through: `units` = the run's `usageTotalUsd` in whole US
33945
+ // cents (the physical unit `usd_cent`), and the rate card prices each cent at
33946
+ // a managed markup (1.5x USD). This keeps margin safe across cheap and
33947
+ // expensive scrapes alike. `event_type` must match what the broker writes to
33948
+ // integration_usage_events. Until the rate row is seeded a run prices at 0
33949
+ // (budget gate inert) - the rate-card migration ships in the same PR.
33950
+ premium: {
33951
+ pricing: "usage",
33952
+ note: "Billed per result on the upstream pay-per-event cost of each scrape, at a managed markup.",
33953
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33954
+ }
33955
+ },
33956
+ {
33957
+ // Local Business Data: the second Apify-backed premium integration (ADR-0053).
33958
+ // Same platform-held account, same pass-through metering model, but a separate
33959
+ // definition so its opt-in, rate card and monthly budget are independent of
33960
+ // Social Scraping's - see the note on that entry for why the split exists.
33961
+ //
33962
+ // Distinct from Firecrawl on purpose: Firecrawl covers generic web
33963
+ // scrape/crawl/search, and we deliberately do NOT ship an Apify-backed
33964
+ // duplicate of that. This is the local-places job Firecrawl does not do.
33965
+ id: "local-business-data",
33966
+ name: "Local Business Data",
33967
+ category: "knowledge",
33968
+ description: "Find local businesses on Google Maps and pull their public listing details - name, address, phone, website, category, rating and review count - for local market research, competitor lists and lead research. Augmented Team manages the data account for you; there is no key to enter.",
33969
+ supported_auth_types: ["none"],
33970
+ capabilities: [
33971
+ { id: "local-business-data:search", name: "Search Local Businesses", description: "Search Google Maps for businesses and return their public listing details (local_business_search).", access: "write" },
33972
+ { id: "local-business-data:status", name: "Check Searches", description: "Poll a running search for status + results (local_business_search_status).", access: "read" }
33973
+ ],
33974
+ docs_url: "https://docs.apify.com/api/v2",
33975
+ beta: true,
33976
+ premium: {
33977
+ pricing: "usage",
33978
+ note: "Billed per place returned on the upstream pay-per-event cost of each search, at a managed markup.",
33979
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33980
+ }
33981
+ },
33902
33982
  {
33903
33983
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
33904
33984
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -39538,6 +39538,86 @@ var INTEGRATION_REGISTRY = [
39538
39538
  ]
39539
39539
  }
39540
39540
  },
39541
+ {
39542
+ // Social Scraping: a PREMIUM, platform-managed integration on the Deck /
39543
+ // Firecrawl / X-Search model (ADR-0031, epic ENG-6920; ADR-0053). Backed by
39544
+ // Apify, but deliberately NOT surfaced as an "Apify" integration - the
39545
+ // integration is what a customer picks, and Apify is a vendor, not a job.
39546
+ // Splitting by job also means opt-in, rate card and monthly budget are keyed
39547
+ // per definition, so an org can take Local Business Data without taking the
39548
+ // pricier, more ToS-sensitive social scraping.
39549
+ //
39550
+ // Augmented holds ONE Apify account whose token (APIFY_API_TOKEN, read
39551
+ // from SSM - the API Lambda env is at the 4KB cap) every customer run bills
39552
+ // back to, so the key is a single platform-held secret, NOT a per-agent
39553
+ // credential. Auth type is `none` - customers never enter a key. Tools run on
39554
+ // a brokered-REST lane (apify-brokers.ts) so each run is metered at one
39555
+ // chokepoint and gated on a per-org monthly USD cap + the per-org premium
39556
+ // opt-in.
39557
+ //
39558
+ // "PPE-only" is guaranteed by a curated allowlist: the broker only ever runs
39559
+ // Actors on it, so a rental / pay-per-usage Actor can never surprise-bill the
39560
+ // shared account. (Apify's x402 rail enforces PPE-only at the payment layer;
39561
+ // we are on the account-key rail - Option A in the spike.) See
39562
+ // docs/design/apify-premium-option-a-ppe-allowlist.md.
39563
+ //
39564
+ // No `installable` here on purpose: this is a seed integration
39565
+ // (integration-definitions.json), so the seed catalog already makes it
39566
+ // picker-visible. This registry entry exists ONLY to carry the `premium`
39567
+ // descriptor that `isPremiumDefinition` reads - which arms the per-org opt-in
39568
+ // gate, the priced acknowledgement modal, and the admin pricing tab.
39569
+ id: "social-scraping",
39570
+ name: "Social Scraping",
39571
+ category: "social",
39572
+ description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research. Augmented Team manages the scraping account for you; there is no key to enter.",
39573
+ supported_auth_types: ["none"],
39574
+ capabilities: [
39575
+ { id: "social-scraping:scrape", name: "Scrape Social Posts", description: "Scrape public TikTok, Instagram and YouTube content (social_scrape_tiktok, social_scrape_instagram, social_scrape_youtube).", access: "write" },
39576
+ { id: "social-scraping:status", name: "Check Scrape Runs", description: "Poll a running scrape for status + results (social_scrape_status).", access: "read" }
39577
+ ],
39578
+ docs_url: "https://docs.apify.com/api/v2",
39579
+ beta: true,
39580
+ // Premium (billable). The upstream pay-per-event cost is per-Actor and
39581
+ // VARIABLE (each Actor's creator sets its own event prices), unlike X-Search's
39582
+ // fixed per-post price. So we meter the ACTUAL cost charged to us for each
39583
+ // run, as a pass-through: `units` = the run's `usageTotalUsd` in whole US
39584
+ // cents (the physical unit `usd_cent`), and the rate card prices each cent at
39585
+ // a managed markup (1.5x USD). This keeps margin safe across cheap and
39586
+ // expensive scrapes alike. `event_type` must match what the broker writes to
39587
+ // integration_usage_events. Until the rate row is seeded a run prices at 0
39588
+ // (budget gate inert) - the rate-card migration ships in the same PR.
39589
+ premium: {
39590
+ pricing: "usage",
39591
+ note: "Billed per result on the upstream pay-per-event cost of each scrape, at a managed markup.",
39592
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
39593
+ }
39594
+ },
39595
+ {
39596
+ // Local Business Data: the second Apify-backed premium integration (ADR-0053).
39597
+ // Same platform-held account, same pass-through metering model, but a separate
39598
+ // definition so its opt-in, rate card and monthly budget are independent of
39599
+ // Social Scraping's - see the note on that entry for why the split exists.
39600
+ //
39601
+ // Distinct from Firecrawl on purpose: Firecrawl covers generic web
39602
+ // scrape/crawl/search, and we deliberately do NOT ship an Apify-backed
39603
+ // duplicate of that. This is the local-places job Firecrawl does not do.
39604
+ id: "local-business-data",
39605
+ name: "Local Business Data",
39606
+ category: "knowledge",
39607
+ description: "Find local businesses on Google Maps and pull their public listing details - name, address, phone, website, category, rating and review count - for local market research, competitor lists and lead research. Augmented Team manages the data account for you; there is no key to enter.",
39608
+ supported_auth_types: ["none"],
39609
+ capabilities: [
39610
+ { id: "local-business-data:search", name: "Search Local Businesses", description: "Search Google Maps for businesses and return their public listing details (local_business_search).", access: "write" },
39611
+ { id: "local-business-data:status", name: "Check Searches", description: "Poll a running search for status + results (local_business_search_status).", access: "read" }
39612
+ ],
39613
+ docs_url: "https://docs.apify.com/api/v2",
39614
+ beta: true,
39615
+ premium: {
39616
+ pricing: "usage",
39617
+ note: "Billed per place returned on the upstream pay-per-event cost of each search, at a managed markup.",
39618
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
39619
+ }
39620
+ },
39541
39621
  {
39542
39622
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
39543
39623
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -33469,6 +33469,86 @@ var INTEGRATION_REGISTRY = [
33469
33469
  ]
33470
33470
  }
33471
33471
  },
33472
+ {
33473
+ // Social Scraping: a PREMIUM, platform-managed integration on the Deck /
33474
+ // Firecrawl / X-Search model (ADR-0031, epic ENG-6920; ADR-0053). Backed by
33475
+ // Apify, but deliberately NOT surfaced as an "Apify" integration - the
33476
+ // integration is what a customer picks, and Apify is a vendor, not a job.
33477
+ // Splitting by job also means opt-in, rate card and monthly budget are keyed
33478
+ // per definition, so an org can take Local Business Data without taking the
33479
+ // pricier, more ToS-sensitive social scraping.
33480
+ //
33481
+ // Augmented holds ONE Apify account whose token (APIFY_API_TOKEN, read
33482
+ // from SSM - the API Lambda env is at the 4KB cap) every customer run bills
33483
+ // back to, so the key is a single platform-held secret, NOT a per-agent
33484
+ // credential. Auth type is `none` - customers never enter a key. Tools run on
33485
+ // a brokered-REST lane (apify-brokers.ts) so each run is metered at one
33486
+ // chokepoint and gated on a per-org monthly USD cap + the per-org premium
33487
+ // opt-in.
33488
+ //
33489
+ // "PPE-only" is guaranteed by a curated allowlist: the broker only ever runs
33490
+ // Actors on it, so a rental / pay-per-usage Actor can never surprise-bill the
33491
+ // shared account. (Apify's x402 rail enforces PPE-only at the payment layer;
33492
+ // we are on the account-key rail - Option A in the spike.) See
33493
+ // docs/design/apify-premium-option-a-ppe-allowlist.md.
33494
+ //
33495
+ // No `installable` here on purpose: this is a seed integration
33496
+ // (integration-definitions.json), so the seed catalog already makes it
33497
+ // picker-visible. This registry entry exists ONLY to carry the `premium`
33498
+ // descriptor that `isPremiumDefinition` reads - which arms the per-org opt-in
33499
+ // gate, the priced acknowledgement modal, and the admin pricing tab.
33500
+ id: "social-scraping",
33501
+ name: "Social Scraping",
33502
+ category: "social",
33503
+ description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research. Augmented Team manages the scraping account for you; there is no key to enter.",
33504
+ supported_auth_types: ["none"],
33505
+ capabilities: [
33506
+ { id: "social-scraping:scrape", name: "Scrape Social Posts", description: "Scrape public TikTok, Instagram and YouTube content (social_scrape_tiktok, social_scrape_instagram, social_scrape_youtube).", access: "write" },
33507
+ { id: "social-scraping:status", name: "Check Scrape Runs", description: "Poll a running scrape for status + results (social_scrape_status).", access: "read" }
33508
+ ],
33509
+ docs_url: "https://docs.apify.com/api/v2",
33510
+ beta: true,
33511
+ // Premium (billable). The upstream pay-per-event cost is per-Actor and
33512
+ // VARIABLE (each Actor's creator sets its own event prices), unlike X-Search's
33513
+ // fixed per-post price. So we meter the ACTUAL cost charged to us for each
33514
+ // run, as a pass-through: `units` = the run's `usageTotalUsd` in whole US
33515
+ // cents (the physical unit `usd_cent`), and the rate card prices each cent at
33516
+ // a managed markup (1.5x USD). This keeps margin safe across cheap and
33517
+ // expensive scrapes alike. `event_type` must match what the broker writes to
33518
+ // integration_usage_events. Until the rate row is seeded a run prices at 0
33519
+ // (budget gate inert) - the rate-card migration ships in the same PR.
33520
+ premium: {
33521
+ pricing: "usage",
33522
+ note: "Billed per result on the upstream pay-per-event cost of each scrape, at a managed markup.",
33523
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33524
+ }
33525
+ },
33526
+ {
33527
+ // Local Business Data: the second Apify-backed premium integration (ADR-0053).
33528
+ // Same platform-held account, same pass-through metering model, but a separate
33529
+ // definition so its opt-in, rate card and monthly budget are independent of
33530
+ // Social Scraping's - see the note on that entry for why the split exists.
33531
+ //
33532
+ // Distinct from Firecrawl on purpose: Firecrawl covers generic web
33533
+ // scrape/crawl/search, and we deliberately do NOT ship an Apify-backed
33534
+ // duplicate of that. This is the local-places job Firecrawl does not do.
33535
+ id: "local-business-data",
33536
+ name: "Local Business Data",
33537
+ category: "knowledge",
33538
+ description: "Find local businesses on Google Maps and pull their public listing details - name, address, phone, website, category, rating and review count - for local market research, competitor lists and lead research. Augmented Team manages the data account for you; there is no key to enter.",
33539
+ supported_auth_types: ["none"],
33540
+ capabilities: [
33541
+ { id: "local-business-data:search", name: "Search Local Businesses", description: "Search Google Maps for businesses and return their public listing details (local_business_search).", access: "write" },
33542
+ { id: "local-business-data:status", name: "Check Searches", description: "Poll a running search for status + results (local_business_search_status).", access: "read" }
33543
+ ],
33544
+ docs_url: "https://docs.apify.com/api/v2",
33545
+ beta: true,
33546
+ premium: {
33547
+ pricing: "usage",
33548
+ note: "Billed per place returned on the upstream pay-per-event cost of each search, at a managed markup.",
33549
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33550
+ }
33551
+ },
33472
33552
  {
33473
33553
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
33474
33554
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -33771,6 +33771,86 @@ var INTEGRATION_REGISTRY = [
33771
33771
  ]
33772
33772
  }
33773
33773
  },
33774
+ {
33775
+ // Social Scraping: a PREMIUM, platform-managed integration on the Deck /
33776
+ // Firecrawl / X-Search model (ADR-0031, epic ENG-6920; ADR-0053). Backed by
33777
+ // Apify, but deliberately NOT surfaced as an "Apify" integration - the
33778
+ // integration is what a customer picks, and Apify is a vendor, not a job.
33779
+ // Splitting by job also means opt-in, rate card and monthly budget are keyed
33780
+ // per definition, so an org can take Local Business Data without taking the
33781
+ // pricier, more ToS-sensitive social scraping.
33782
+ //
33783
+ // Augmented holds ONE Apify account whose token (APIFY_API_TOKEN, read
33784
+ // from SSM - the API Lambda env is at the 4KB cap) every customer run bills
33785
+ // back to, so the key is a single platform-held secret, NOT a per-agent
33786
+ // credential. Auth type is `none` - customers never enter a key. Tools run on
33787
+ // a brokered-REST lane (apify-brokers.ts) so each run is metered at one
33788
+ // chokepoint and gated on a per-org monthly USD cap + the per-org premium
33789
+ // opt-in.
33790
+ //
33791
+ // "PPE-only" is guaranteed by a curated allowlist: the broker only ever runs
33792
+ // Actors on it, so a rental / pay-per-usage Actor can never surprise-bill the
33793
+ // shared account. (Apify's x402 rail enforces PPE-only at the payment layer;
33794
+ // we are on the account-key rail - Option A in the spike.) See
33795
+ // docs/design/apify-premium-option-a-ppe-allowlist.md.
33796
+ //
33797
+ // No `installable` here on purpose: this is a seed integration
33798
+ // (integration-definitions.json), so the seed catalog already makes it
33799
+ // picker-visible. This registry entry exists ONLY to carry the `premium`
33800
+ // descriptor that `isPremiumDefinition` reads - which arms the per-org opt-in
33801
+ // gate, the priced acknowledgement modal, and the admin pricing tab.
33802
+ id: "social-scraping",
33803
+ name: "Social Scraping",
33804
+ category: "social",
33805
+ description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research. Augmented Team manages the scraping account for you; there is no key to enter.",
33806
+ supported_auth_types: ["none"],
33807
+ capabilities: [
33808
+ { id: "social-scraping:scrape", name: "Scrape Social Posts", description: "Scrape public TikTok, Instagram and YouTube content (social_scrape_tiktok, social_scrape_instagram, social_scrape_youtube).", access: "write" },
33809
+ { id: "social-scraping:status", name: "Check Scrape Runs", description: "Poll a running scrape for status + results (social_scrape_status).", access: "read" }
33810
+ ],
33811
+ docs_url: "https://docs.apify.com/api/v2",
33812
+ beta: true,
33813
+ // Premium (billable). The upstream pay-per-event cost is per-Actor and
33814
+ // VARIABLE (each Actor's creator sets its own event prices), unlike X-Search's
33815
+ // fixed per-post price. So we meter the ACTUAL cost charged to us for each
33816
+ // run, as a pass-through: `units` = the run's `usageTotalUsd` in whole US
33817
+ // cents (the physical unit `usd_cent`), and the rate card prices each cent at
33818
+ // a managed markup (1.5x USD). This keeps margin safe across cheap and
33819
+ // expensive scrapes alike. `event_type` must match what the broker writes to
33820
+ // integration_usage_events. Until the rate row is seeded a run prices at 0
33821
+ // (budget gate inert) - the rate-card migration ships in the same PR.
33822
+ premium: {
33823
+ pricing: "usage",
33824
+ note: "Billed per result on the upstream pay-per-event cost of each scrape, at a managed markup.",
33825
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33826
+ }
33827
+ },
33828
+ {
33829
+ // Local Business Data: the second Apify-backed premium integration (ADR-0053).
33830
+ // Same platform-held account, same pass-through metering model, but a separate
33831
+ // definition so its opt-in, rate card and monthly budget are independent of
33832
+ // Social Scraping's - see the note on that entry for why the split exists.
33833
+ //
33834
+ // Distinct from Firecrawl on purpose: Firecrawl covers generic web
33835
+ // scrape/crawl/search, and we deliberately do NOT ship an Apify-backed
33836
+ // duplicate of that. This is the local-places job Firecrawl does not do.
33837
+ id: "local-business-data",
33838
+ name: "Local Business Data",
33839
+ category: "knowledge",
33840
+ description: "Find local businesses on Google Maps and pull their public listing details - name, address, phone, website, category, rating and review count - for local market research, competitor lists and lead research. Augmented Team manages the data account for you; there is no key to enter.",
33841
+ supported_auth_types: ["none"],
33842
+ capabilities: [
33843
+ { id: "local-business-data:search", name: "Search Local Businesses", description: "Search Google Maps for businesses and return their public listing details (local_business_search).", access: "write" },
33844
+ { id: "local-business-data:status", name: "Check Searches", description: "Poll a running search for status + results (local_business_search_status).", access: "read" }
33845
+ ],
33846
+ docs_url: "https://docs.apify.com/api/v2",
33847
+ beta: true,
33848
+ premium: {
33849
+ pricing: "usage",
33850
+ note: "Billed per place returned on the upstream pay-per-event cost of each search, at a managed markup.",
33851
+ meters: [{ event_type: "actor_run", unit: "usd_cent" }]
33852
+ }
33853
+ },
33774
33854
  {
33775
33855
  // Seed-catalog toolkit (composed by the ultimate-app-coder bundle). Registered
33776
33856
  // here only so the manager's ensureToolkitCli installs the binary via the
@@ -36,7 +36,7 @@ import {
36
36
  writeDirectChatSessionState,
37
37
  writeEgressAllowlist,
38
38
  writePersistentClaudeWrapper
39
- } from "./chunk-CWIWI2ZX.js";
39
+ } from "./chunk-PR3IJAMV.js";
40
40
  import "./chunk-XWVM4KPK.js";
41
41
  export {
42
42
  EGRESS_BASELINE_DOMAINS,
@@ -77,4 +77,4 @@ export {
77
77
  writeEgressAllowlist,
78
78
  writePersistentClaudeWrapper
79
79
  };
80
- //# sourceMappingURL=persistent-session-O7OCNB6B.js.map
80
+ //# sourceMappingURL=persistent-session-37WNPBRA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-CWIWI2ZX.js";
3
+ } from "./chunk-PR3IJAMV.js";
4
4
  import "./chunk-XWVM4KPK.js";
5
5
 
6
6
  // src/lib/responsiveness-probe.ts
@@ -471,4 +471,4 @@ export {
471
471
  readAndResetSlackReplyBindingClassifications,
472
472
  readAndResetSlackReplyTargetClassifications
473
473
  };
474
- //# sourceMappingURL=responsiveness-probe-R5FWKHPI.js.map
474
+ //# sourceMappingURL=responsiveness-probe-GMIXR3TR.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.424",
3
+ "version": "0.28.425",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {