@integrity-labs/agt-cli 0.28.902 → 0.28.903
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 +5 -5
- package/dist/{chunk-BSFQVMNO.js → chunk-2LV6SJ7W.js} +2 -2
- package/dist/{chunk-5MATVCQ3.js → chunk-Q2GQY64J.js} +34 -34
- package/dist/chunk-Q2GQY64J.js.map +1 -0
- package/dist/{chunk-JULXOS6K.js → chunk-WL2PIPOM.js} +4 -4
- package/dist/{claude-pair-runtime-RSQD6NA4.js → claude-pair-runtime-UZPPOEIB.js} +2 -2
- package/dist/lib/manager-worker.js +14 -14
- package/dist/mcp/direct-chat-channel.js +33 -33
- package/dist/mcp/index.js +33 -33
- package/dist/mcp/origami.js +33 -33
- package/dist/mcp/slack-channel.js +33 -33
- package/dist/mcp/telegram-channel.js +33 -33
- package/dist/{persistent-session-4N3JK3P6.js → persistent-session-TPADZX4C.js} +3 -3
- package/dist/{responsiveness-probe-M67GFG47.js → responsiveness-probe-P2L74AKB.js} +3 -3
- package/dist/{session-auth-dead-Z7I2KPES.js → session-auth-dead-YKD22CHZ.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-5MATVCQ3.js.map +0 -1
- /package/dist/{chunk-BSFQVMNO.js.map → chunk-2LV6SJ7W.js.map} +0 -0
- /package/dist/{chunk-JULXOS6K.js.map → chunk-WL2PIPOM.js.map} +0 -0
- /package/dist/{claude-pair-runtime-RSQD6NA4.js.map → claude-pair-runtime-UZPPOEIB.js.map} +0 -0
- /package/dist/{persistent-session-4N3JK3P6.js.map → persistent-session-TPADZX4C.js.map} +0 -0
- /package/dist/{responsiveness-probe-M67GFG47.js.map → responsiveness-probe-P2L74AKB.js.map} +0 -0
- /package/dist/{session-auth-dead-Z7I2KPES.js.map → session-auth-dead-YKD22CHZ.js.map} +0 -0
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
parseEnvIntegrations,
|
|
17
17
|
shellQuote,
|
|
18
18
|
summarizeUnanswerablePane
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-2LV6SJ7W.js";
|
|
20
20
|
import {
|
|
21
21
|
BIND_FAILURE_QUARANTINE_THRESHOLD,
|
|
22
22
|
INTEGRATIONS_SECTION_END,
|
|
@@ -76,7 +76,7 @@ import {
|
|
|
76
76
|
sessionTranscriptDir,
|
|
77
77
|
worseConnectivityOutcome,
|
|
78
78
|
wrapScheduledTaskPrompt
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-Q2GQY64J.js";
|
|
80
80
|
import {
|
|
81
81
|
parsePsRows
|
|
82
82
|
} from "./chunk-XWVM4KPK.js";
|
|
@@ -6841,7 +6841,7 @@ function exchangeFailureKind(err) {
|
|
|
6841
6841
|
}
|
|
6842
6842
|
|
|
6843
6843
|
// src/lib/api-client.ts
|
|
6844
|
-
var agtCliVersion = true ? "0.28.
|
|
6844
|
+
var agtCliVersion = true ? "0.28.903" : "dev";
|
|
6845
6845
|
var lastConfigHash = null;
|
|
6846
6846
|
function setConfigHash(hash) {
|
|
6847
6847
|
lastConfigHash = hash && hash.length > 0 ? hash : null;
|
|
@@ -11451,4 +11451,4 @@ export {
|
|
|
11451
11451
|
managerInstallSystemUnitCommand,
|
|
11452
11452
|
managerUninstallSystemUnitCommand
|
|
11453
11453
|
};
|
|
11454
|
-
//# sourceMappingURL=chunk-
|
|
11454
|
+
//# sourceMappingURL=chunk-WL2PIPOM.js.map
|
|
@@ -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-
|
|
103
|
+
const { resolveClaudeBinary } = await import("./persistent-session-TPADZX4C.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-
|
|
376
|
+
//# sourceMappingURL=claude-pair-runtime-UZPPOEIB.js.map
|
|
@@ -63,7 +63,7 @@ import {
|
|
|
63
63
|
safeWriteJsonAtomic,
|
|
64
64
|
setConfigHash,
|
|
65
65
|
tripClass
|
|
66
|
-
} from "../chunk-
|
|
66
|
+
} from "../chunk-WL2PIPOM.js";
|
|
67
67
|
import {
|
|
68
68
|
getProjectDir as getProjectDir2,
|
|
69
69
|
getReadyTasks,
|
|
@@ -136,7 +136,7 @@ import {
|
|
|
136
136
|
takeZombieDetection,
|
|
137
137
|
toOpencodeModel,
|
|
138
138
|
writeEgressAllowlist
|
|
139
|
-
} from "../chunk-
|
|
139
|
+
} from "../chunk-2LV6SJ7W.js";
|
|
140
140
|
import {
|
|
141
141
|
ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
|
|
142
142
|
AnchorSessionClient,
|
|
@@ -231,7 +231,7 @@ import {
|
|
|
231
231
|
subagentActivityAgeSeconds,
|
|
232
232
|
sumTranscriptUsageInWindow,
|
|
233
233
|
transcriptActivityAgeSeconds
|
|
234
|
-
} from "../chunk-
|
|
234
|
+
} from "../chunk-Q2GQY64J.js";
|
|
235
235
|
import {
|
|
236
236
|
reapOrphanChannelMcps
|
|
237
237
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -13053,7 +13053,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
|
|
|
13053
13053
|
var dayRolloverInboundHold = /* @__PURE__ */ new Map();
|
|
13054
13054
|
var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
|
|
13055
13055
|
async function channelInboundActivityAgeSecondsFor(codeName) {
|
|
13056
|
-
const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-
|
|
13056
|
+
const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-P2L74AKB.js");
|
|
13057
13057
|
const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
|
|
13058
13058
|
if (newest === null) return null;
|
|
13059
13059
|
return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
|
|
@@ -13721,7 +13721,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
13721
13721
|
var lastVersionCheckAt = 0;
|
|
13722
13722
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
13723
13723
|
var lastResponsivenessProbeAt = 0;
|
|
13724
|
-
var agtCliVersion = true ? "0.28.
|
|
13724
|
+
var agtCliVersion = true ? "0.28.903" : "dev";
|
|
13725
13725
|
function resolveBrewPath(execFileSync2) {
|
|
13726
13726
|
try {
|
|
13727
13727
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -15311,7 +15311,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
15311
15311
|
if (codeNames.length === 0) return;
|
|
15312
15312
|
void (async () => {
|
|
15313
15313
|
try {
|
|
15314
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
15314
|
+
const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
|
|
15315
15315
|
await api.post("/host/heartbeat", {
|
|
15316
15316
|
host_id: hostId,
|
|
15317
15317
|
agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
|
|
@@ -15453,7 +15453,7 @@ async function pollCycleInner() {
|
|
|
15453
15453
|
}
|
|
15454
15454
|
try {
|
|
15455
15455
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
15456
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
15456
|
+
const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
|
|
15457
15457
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
15458
15458
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
|
|
15459
15459
|
let tailscaleHostname;
|
|
@@ -15622,7 +15622,7 @@ async function pollCycleInner() {
|
|
|
15622
15622
|
collectPanelessActivityProbes,
|
|
15623
15623
|
getResponsivenessIntervalMs,
|
|
15624
15624
|
occupancyQualificationClassifications
|
|
15625
|
-
} = await import("../responsiveness-probe-
|
|
15625
|
+
} = await import("../responsiveness-probe-P2L74AKB.js");
|
|
15626
15626
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
15627
15627
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
15628
15628
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -15739,7 +15739,7 @@ async function pollCycleInner() {
|
|
|
15739
15739
|
collectResponsivenessProbes,
|
|
15740
15740
|
livePendingInboundOldestAgeSeconds,
|
|
15741
15741
|
parkPendingInbound
|
|
15742
|
-
} = await import("../responsiveness-probe-
|
|
15742
|
+
} = await import("../responsiveness-probe-P2L74AKB.js");
|
|
15743
15743
|
const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
|
|
15744
15744
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
15745
15745
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -15895,7 +15895,7 @@ async function pollCycleInner() {
|
|
|
15895
15895
|
}
|
|
15896
15896
|
try {
|
|
15897
15897
|
const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
|
|
15898
|
-
const { probeSessionAuth } = await import("../session-auth-dead-
|
|
15898
|
+
const { probeSessionAuth } = await import("../session-auth-dead-YKD22CHZ.js");
|
|
15899
15899
|
const observations = [];
|
|
15900
15900
|
const pendingCacheCommits = [];
|
|
15901
15901
|
const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
|
|
@@ -20153,7 +20153,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
20153
20153
|
try {
|
|
20154
20154
|
const freshId = rotateSessionForWedge(codeName);
|
|
20155
20155
|
consecutiveWedgeCycles.delete(codeName);
|
|
20156
|
-
const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-
|
|
20156
|
+
const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-P2L74AKB.js");
|
|
20157
20157
|
const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
|
|
20158
20158
|
const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
|
|
20159
20159
|
const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
|
|
@@ -20196,7 +20196,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
20196
20196
|
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}`));
|
|
20197
20197
|
void (async () => {
|
|
20198
20198
|
try {
|
|
20199
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
20199
|
+
const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
|
|
20200
20200
|
await api.post("/host/heartbeat", {
|
|
20201
20201
|
host_id: hostId,
|
|
20202
20202
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
|
|
@@ -20247,7 +20247,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
20247
20247
|
}
|
|
20248
20248
|
try {
|
|
20249
20249
|
const hostId = await getHostId();
|
|
20250
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
20250
|
+
const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
|
|
20251
20251
|
await api.post("/host/heartbeat", {
|
|
20252
20252
|
host_id: hostId,
|
|
20253
20253
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
|
|
@@ -20889,7 +20889,7 @@ async function processClaudePairSessions(agents) {
|
|
|
20889
20889
|
killPairSession,
|
|
20890
20890
|
pairTmuxSession,
|
|
20891
20891
|
finalizeClaudePairOnboarding
|
|
20892
|
-
} = await import("../claude-pair-runtime-
|
|
20892
|
+
} = await import("../claude-pair-runtime-UZPPOEIB.js");
|
|
20893
20893
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
20894
20894
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
20895
20895
|
const killed = await killPairSession(pairTmuxSession(pairId));
|
|
@@ -33220,18 +33220,18 @@ var INTEGRATION_REGISTRY = [
|
|
|
33220
33220
|
// and migrations). "Deck Browser" makes the computer-use purpose obvious.
|
|
33221
33221
|
name: "Deck Browser",
|
|
33222
33222
|
category: "workspace-productivity",
|
|
33223
|
-
description: "Computer-use agents that operate any software through its real interface (no API required) and return schema-validated results. A higher-level alternative to Anchor Browser: Deck owns the auth lifecycle (encrypted credential vault, login, MFA, CAPTCHA) and provisions isolated desktop sessions on demand.
|
|
33223
|
+
description: "Computer-use agents that operate any software through its real interface (no API required) and return schema-validated results. A higher-level alternative to Anchor Browser: Deck owns the auth lifecycle (encrypted credential vault, login, MFA, CAPTCHA) and provisions isolated desktop sessions on demand. Ninjafy manages Deck access for you and gives each agent its own isolated Deck workspace, so there is no credential to enter.",
|
|
33224
33224
|
// Deck is REST-only (base https://api.deck.co/v2, Bearer `sk_live_` account
|
|
33225
33225
|
// key) — it ships NO MCP server, so unlike anchor-browser there is no
|
|
33226
33226
|
// `remoteMcp`/`nativeMcp` drop-in; the agent-facing tools are brokered
|
|
33227
33227
|
// server-side (deck-broker.ts). Deck is the first PREMIUM integration:
|
|
33228
|
-
//
|
|
33228
|
+
// Ninjafy owns ONE Deck account that every customer agent's runs bill back
|
|
33229
33229
|
// to (per-org charging is tracked in ENG-6920, not yet live), so the account
|
|
33230
33230
|
// key is a single platform-held secret (`DECK_ACCOUNT_KEY`), NOT a per-agent
|
|
33231
33231
|
// credential. Auth type is therefore `none` — customers never enter a key.
|
|
33232
33232
|
// Per-agent isolation is modelled on Deck's first-class resources: that one
|
|
33233
33233
|
// key provisions one Deck agent (`agt_`) + vault credential (`cred_`) per
|
|
33234
|
-
//
|
|
33234
|
+
// Ninjafy agent via POST /:id/provision-deck; the ids land in
|
|
33235
33235
|
// `agent_integrations.config` (deck_agent_id / deck_credential_id), so
|
|
33236
33236
|
// revocation + audit happen at the per-agent Deck-resource level without a
|
|
33237
33237
|
// distinct API key per agent (Deck exposes no key-minting admin API).
|
|
@@ -33244,7 +33244,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33244
33244
|
docs_url: "https://docs.deck.co/",
|
|
33245
33245
|
beta: true,
|
|
33246
33246
|
// ENG-6920: Deck is the first PREMIUM integration. Unlike the customer-auth
|
|
33247
|
-
// integrations, every Deck run bills back to
|
|
33247
|
+
// integrations, every Deck run bills back to Ninjafy's single account
|
|
33248
33248
|
// key, and Deck is usage-priced, so it is gated on a per-org opt-in and
|
|
33249
33249
|
// metered. ENG-7032: `meters` declares the billable operations; the priced
|
|
33250
33250
|
// rate card (integration_rate_cards) holds the amounts. Each event_type must
|
|
@@ -33267,11 +33267,11 @@ var INTEGRATION_REGISTRY = [
|
|
|
33267
33267
|
id: "browserbase",
|
|
33268
33268
|
name: "Browserbase",
|
|
33269
33269
|
category: "workspace-productivity",
|
|
33270
|
-
description: "A hosted browser your agents drive to operate real websites, behind residential proxies and staying signed in via a per-agent encrypted login profile. An operator logs an agent into a site once through a secure live view; every later session reuses that authenticated profile - no credential to enter and the agent never handles the login. A lower-level, self-driven alternative to Deck Browser:
|
|
33270
|
+
description: "A hosted browser your agents drive to operate real websites, behind residential proxies and staying signed in via a per-agent encrypted login profile. An operator logs an agent into a site once through a secure live view; every later session reuses that authenticated profile - no credential to enter and the agent never handles the login. A lower-level, self-driven alternative to Deck Browser: Ninjafy manages the Browserbase account for you and gives each agent its own isolated login profile.",
|
|
33271
33271
|
// Browserbase is REST-only (base https://api.browserbase.com/v1, `X-BB-API-Key`
|
|
33272
33272
|
// header - NOT Bearer) and ships NO MCP server, so the agent-facing tools are
|
|
33273
33273
|
// brokered server-side (browserbase-broker.ts). It is a PREMIUM integration on
|
|
33274
|
-
// the Deck model (ENG-7947):
|
|
33274
|
+
// the Deck model (ENG-7947): Ninjafy owns ONE Browserbase account that every
|
|
33275
33275
|
// customer agent's sessions bill back to, so the account key is a single
|
|
33276
33276
|
// platform-held secret (`BROWSERBASE_ACCOUNT_KEY`), NOT a per-agent credential.
|
|
33277
33277
|
// Auth type is `none` - customers never enter a key. Per-agent isolation is a
|
|
@@ -33290,7 +33290,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33290
33290
|
],
|
|
33291
33291
|
docs_url: "https://docs.browserbase.com/",
|
|
33292
33292
|
beta: true,
|
|
33293
|
-
// ENG-7947: PREMIUM, usage-priced. Every session bills back to
|
|
33293
|
+
// ENG-7947: PREMIUM, usage-priced. Every session bills back to Ninjafy's
|
|
33294
33294
|
// single account key as proxy data + session time, so it is gated on a per-org
|
|
33295
33295
|
// opt-in and metered. `meters` declares the billable operations; the priced
|
|
33296
33296
|
// rate card (integration_rate_cards) holds the amounts. Each event_type must
|
|
@@ -33328,11 +33328,11 @@ var INTEGRATION_REGISTRY = [
|
|
|
33328
33328
|
id: "elevenlabs",
|
|
33329
33329
|
name: "ElevenLabs",
|
|
33330
33330
|
category: "media",
|
|
33331
|
-
description: "Speech-to-text for inbound voice notes. When a teammate sends an agent a voice message (Slack, Telegram, etc.), the agent uploads the audio and gets back an accurate transcript via ElevenLabs Scribe, so a voice note is no longer a black box.
|
|
33331
|
+
description: "Speech-to-text for inbound voice notes. When a teammate sends an agent a voice message (Slack, Telegram, etc.), the agent uploads the audio and gets back an accurate transcript via ElevenLabs Scribe, so a voice note is no longer a black box. Ninjafy manages ElevenLabs access for you - there is no key to enter.",
|
|
33332
33332
|
// ElevenLabs is REST-only for our use (POST /v1/speech-to-text, `xi-api-key`
|
|
33333
33333
|
// header, NOT Bearer) — it ships no MCP server, so the agent-facing tools are
|
|
33334
33334
|
// brokered server-side (scribe-broker.ts). It is a PREMIUM integration on the
|
|
33335
|
-
// Deck model (ADR-0031, epic ENG-6920):
|
|
33335
|
+
// Deck model (ADR-0031, epic ENG-6920): Ninjafy owns ONE ElevenLabs account
|
|
33336
33336
|
// that every customer agent's transcriptions bill back to, so the account key
|
|
33337
33337
|
// is a single platform-held secret (`ELEVENLABS_ACCOUNT_KEY`), NOT a per-agent
|
|
33338
33338
|
// credential. Auth type is therefore `none` — customers never enter a key.
|
|
@@ -33381,7 +33381,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33381
33381
|
tts: { meterEventType: "tts" }
|
|
33382
33382
|
},
|
|
33383
33383
|
// ENG-7005 / ENG-7048: premium (billable). Both surfaces bill back to
|
|
33384
|
-
//
|
|
33384
|
+
// Ninjafy's single account key and are usage-priced, so the integration is
|
|
33385
33385
|
// gated on a per-org opt-in and metered. The two surfaces share the one
|
|
33386
33386
|
// `elevenlabs` definition (and so the one per-org monthly budget). Pricing
|
|
33387
33387
|
// amounts live in integration_rate_cards; this only declares the model.
|
|
@@ -33406,9 +33406,9 @@ var INTEGRATION_REGISTRY = [
|
|
|
33406
33406
|
id: "grok-voice",
|
|
33407
33407
|
name: "Grok Voice",
|
|
33408
33408
|
category: "media",
|
|
33409
|
-
description: "Real-time two-way voice for your agent, powered by xAI Grok. Speak to the agent and hear it reply.
|
|
33409
|
+
description: "Real-time two-way voice for your agent, powered by xAI Grok. Speak to the agent and hear it reply. Ninjafy manages Grok Voice access for you - there is no key to enter.",
|
|
33410
33410
|
// Grok Voice is a PREMIUM integration on the platform-key model (mirrors
|
|
33411
|
-
// ElevenLabs / ADR-0031):
|
|
33411
|
+
// ElevenLabs / ADR-0031): Ninjafy holds one xAI account key and every
|
|
33412
33412
|
// customer agent's voice minutes bill back to it, so auth_type is `none` -
|
|
33413
33413
|
// customers never enter a key. Enabling this integration (resolved via the
|
|
33414
33414
|
// agent/team/org scope chain) is what unlocks voice in Direct Chat; it
|
|
@@ -33431,7 +33431,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33431
33431
|
realtime: { meterEventType: "voice_session", listVoices: true },
|
|
33432
33432
|
stt: { meterEventType: "transcription" }
|
|
33433
33433
|
},
|
|
33434
|
-
// Premium (billable): voice minutes bill back to
|
|
33434
|
+
// Premium (billable): voice minutes bill back to Ninjafy's xAI account key,
|
|
33435
33435
|
// usage-priced and gated on a per-org opt-in. Pricing amounts live in
|
|
33436
33436
|
// integration_rate_cards; this only declares the model + meter.
|
|
33437
33437
|
premium: {
|
|
@@ -33482,8 +33482,8 @@ var INTEGRATION_REGISTRY = [
|
|
|
33482
33482
|
id: "image-gen",
|
|
33483
33483
|
name: "Image Generation",
|
|
33484
33484
|
category: "media",
|
|
33485
|
-
description: "AI image generation from a text prompt. An agent passes a prompt to generate_image and gets back a generated raster image, which it can deliver to a chat channel or embed on an Augmented Live page (ENG-7535).
|
|
33486
|
-
// No vendor key to enter:
|
|
33485
|
+
description: "AI image generation from a text prompt. An agent passes a prompt to generate_image and gets back a generated raster image, which it can deliver to a chat channel or embed on an Augmented Live page (ENG-7535). Ninjafy manages the model access for you - there is no key to enter. Generation runs through the Vercel AI Gateway (OpenAI gpt-image-2 today). It is a PREMIUM, usage-billed capability: gated on a per-org opt-in and a monthly USD budget, and metered per generated image.",
|
|
33486
|
+
// No vendor key to enter: Ninjafy owns the shared Vercel AI Gateway virtual
|
|
33487
33487
|
// key (AI_GATEWAY_API_KEY) that fronts the image providers, so auth is `none`
|
|
33488
33488
|
// (customers never enter a key), same as ElevenLabs.
|
|
33489
33489
|
supported_auth_types: ["none"],
|
|
@@ -33492,7 +33492,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33492
33492
|
],
|
|
33493
33493
|
docs_url: "https://platform.openai.com/docs/guides/images",
|
|
33494
33494
|
beta: true,
|
|
33495
|
-
// ENG-7472: premium (billable). Image gen bills back to
|
|
33495
|
+
// ENG-7472: premium (billable). Image gen bills back to Ninjafy's shared
|
|
33496
33496
|
// Vercel AI Gateway key and is usage-priced per generated image, so it is gated
|
|
33497
33497
|
// on a per-org opt-in (isOrgEntitledToPremium) + a per-org monthly USD budget,
|
|
33498
33498
|
// and metered on integration_usage_events. This budget is PER-ORG, distinct
|
|
@@ -33516,8 +33516,8 @@ var INTEGRATION_REGISTRY = [
|
|
|
33516
33516
|
id: "video-gen",
|
|
33517
33517
|
name: "Video Generation",
|
|
33518
33518
|
category: "media",
|
|
33519
|
-
description: "AI video generation from a text prompt or an input image. An agent passes a prompt (plus optionally image_url) to generate_video and gets back a short generated video with audio, which it can deliver to a chat channel.
|
|
33520
|
-
// Platform-key model (mirrors Grok Voice / ADR-0031):
|
|
33519
|
+
description: "AI video generation from a text prompt or an input image. An agent passes a prompt (plus optionally image_url) to generate_video and gets back a short generated video with audio, which it can deliver to a chat channel. Ninjafy manages the model access for you - there is no key to enter. Generation runs direct against xAI Grok Imagine: text-to-video on the base grok-imagine-video model, image-to-video on grok-imagine-video-1.5. It is a PREMIUM, usage-billed capability: gated on a per-org opt-in and a monthly USD budget, and metered per second of generated video.",
|
|
33520
|
+
// Platform-key model (mirrors Grok Voice / ADR-0031): Ninjafy holds one xAI
|
|
33521
33521
|
// account key (XAI_API_KEY) and every customer render bills back to it, so
|
|
33522
33522
|
// auth is `none` - customers never enter a key.
|
|
33523
33523
|
supported_auth_types: ["none"],
|
|
@@ -33526,7 +33526,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33526
33526
|
],
|
|
33527
33527
|
docs_url: "https://docs.x.ai/developers/model-capabilities/video/generation",
|
|
33528
33528
|
beta: true,
|
|
33529
|
-
// Premium (billable): renders bill back to
|
|
33529
|
+
// Premium (billable): renders bill back to Ninjafy's xAI account key,
|
|
33530
33530
|
// usage-priced per second of output video, so it is gated on a per-org opt-in
|
|
33531
33531
|
// (isOrgEntitledToPremium) + a per-org monthly USD budget, and metered on
|
|
33532
33532
|
// integration_usage_events. Pricing lives in integration_rate_cards; this only
|
|
@@ -33604,7 +33604,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
33604
33604
|
// under the MCP.
|
|
33605
33605
|
//
|
|
33606
33606
|
// Bring-your-own-key: generations bill to the customer's own Higgsfield
|
|
33607
|
-
// account, so an install is never metered by
|
|
33607
|
+
// account, so an install is never metered by Ninjafy.
|
|
33608
33608
|
//
|
|
33609
33609
|
// NOTE: this entry carries no `remoteMcp`, so it contributes nothing to
|
|
33610
33610
|
// `registryRemoteMcpKeys` and cannot prune the `higgsfield` key an older
|
|
@@ -34044,12 +34044,12 @@ var INTEGRATION_REGISTRY = [
|
|
|
34044
34044
|
beta: true,
|
|
34045
34045
|
capabilities: [
|
|
34046
34046
|
{ id: "augmented-support:read-diagnostics", name: "Read Diagnostics", description: "Read your own org's agents, hosts, integrations, alerts, flags, and audit log (projection only - never credentials or transcripts).", access: "read" },
|
|
34047
|
-
{ id: "augmented-support:file-requests", name: "File Requests", description: "File bug / feature / integration requests to
|
|
34047
|
+
{ id: "augmented-support:file-requests", name: "File Requests", description: "File bug / feature / integration requests to Ninjafy support.", access: "write" },
|
|
34048
34048
|
{ id: "augmented-support:propose-writes", name: "Propose Self-Remediation", description: "Propose creating an agent in your own org; executed only after a human approves a server-rendered diff.", access: "write" }
|
|
34049
34049
|
]
|
|
34050
34050
|
},
|
|
34051
34051
|
{
|
|
34052
|
-
// ENG-8332: the
|
|
34052
|
+
// ENG-8332: the Ninjafy HELP knowledge base, split out of
|
|
34053
34053
|
// `augmented-support` so an agent can be given the docs WITHOUT also being
|
|
34054
34054
|
// given a ticket-filing button, an agent-proposal button, and org-wide read
|
|
34055
34055
|
// of agents, hosts, integrations, alerts, flags and the audit log. That
|
|
@@ -34077,14 +34077,14 @@ var INTEGRATION_REGISTRY = [
|
|
|
34077
34077
|
// ENG-8804: Granted centrally (ENG-8542 auto-grant), never connected by a human.
|
|
34078
34078
|
platform_internal: true,
|
|
34079
34079
|
category: "knowledge",
|
|
34080
|
-
description: "The
|
|
34080
|
+
description: "The Ninjafy help knowledge base: search and read the shared, published product documentation (how-tos, common fixes, FAQs). Identical for every organization and org-neutral by design - it grants no view of your org's own state, and cannot file tickets or propose changes. Distinct from your organization's own knowledge store.",
|
|
34081
34081
|
supported_auth_types: ["none"],
|
|
34082
34082
|
beta: true,
|
|
34083
34083
|
capabilities: [
|
|
34084
34084
|
{
|
|
34085
34085
|
id: "augmented-help-kb:read",
|
|
34086
34086
|
name: "Read Help Docs",
|
|
34087
|
-
description: "Search and read published
|
|
34087
|
+
description: "Search and read published Ninjafy help articles (org-neutral product documentation). Read-only; no ticket filing, no agent proposals, no org-state reads.",
|
|
34088
34088
|
access: "read"
|
|
34089
34089
|
}
|
|
34090
34090
|
]
|
|
@@ -34097,7 +34097,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34097
34097
|
// ENG-7217: Firecrawl migrates from a customer-API-key stdio MCP
|
|
34098
34098
|
// (`npx firecrawl-mcp`, FIRECRAWL_API_KEY) to a PREMIUM, platform-managed
|
|
34099
34099
|
// integration on the Deck / ElevenLabs model (ADR-0031, epic ENG-6920):
|
|
34100
|
-
//
|
|
34100
|
+
// Ninjafy holds ONE Firecrawl account key (`FIRECRAWL_ACCOUNT_KEY`) that
|
|
34101
34101
|
// every customer agent's web-data calls bill back to. The agent-facing tools
|
|
34102
34102
|
// are brokered server-side (firecrawl-broker.ts, reusing the official
|
|
34103
34103
|
// @mendable/firecrawl-js SDK) rather than via the stdio MCP, so managed usage
|
|
@@ -34256,9 +34256,9 @@ var INTEGRATION_REGISTRY = [
|
|
|
34256
34256
|
id: "ayrshare",
|
|
34257
34257
|
name: "Ayrshare",
|
|
34258
34258
|
category: "social",
|
|
34259
|
-
description: "Read and report on your social media - post history, analytics, and connected-account status - across LinkedIn, Instagram, Facebook, TikTok, YouTube, Pinterest, and more.
|
|
34259
|
+
description: "Read and report on your social media - post history, analytics, and connected-account status - across LinkedIn, Instagram, Facebook, TikTok, YouTube, Pinterest, and more. Ninjafy manages Ayrshare access for you - there is no key to enter; connect your social accounts once. Publishing on your behalf ships in a later release.",
|
|
34260
34260
|
// ENG-7722 / ADR-0046: Ayrshare is a PREMIUM, platform-managed integration on
|
|
34261
|
-
// the Deck / Firecrawl model (ADR-0031, epic ENG-6920):
|
|
34261
|
+
// the Deck / Firecrawl model (ADR-0031, epic ENG-6920): Ninjafy owns ONE
|
|
34262
34262
|
// Business Plan account (`AYRSHARE_API_KEY`) and every customer agent's profile
|
|
34263
34263
|
// + posts bill back to it, so the key is a single platform-held secret, NOT a
|
|
34264
34264
|
// per-agent credential. Auth type is therefore `none` - customers never enter a
|
|
@@ -34293,7 +34293,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34293
34293
|
},
|
|
34294
34294
|
{
|
|
34295
34295
|
// ENG-7439: X Search is a PREMIUM, platform-managed integration on the
|
|
34296
|
-
// Deck / Firecrawl / ElevenLabs model (ADR-0031, epic ENG-6920):
|
|
34296
|
+
// Deck / Firecrawl / ElevenLabs model (ADR-0031, epic ENG-6920): Ninjafy
|
|
34297
34297
|
// holds ONE X (Twitter) developer app whose OAuth2 app-only bearer
|
|
34298
34298
|
// (X_APP_BEARER_TOKEN) every customer agent's search bills back to, so the
|
|
34299
34299
|
// key is a single platform-held secret, NOT a per-agent credential. Auth
|
|
@@ -34311,7 +34311,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34311
34311
|
id: "x-search",
|
|
34312
34312
|
name: "X Search",
|
|
34313
34313
|
category: "social",
|
|
34314
|
-
description: "Read-only X (Twitter) search: recent public posts by keyword, hashtag, author, or any X search operator - for sentiment sweeps, topic monitoring, and trend research.
|
|
34314
|
+
description: "Read-only X (Twitter) search: recent public posts by keyword, hashtag, author, or any X search operator - for sentiment sweeps, topic monitoring, and trend research. Ninjafy manages X access for you - there is no key to enter.",
|
|
34315
34315
|
supported_auth_types: ["none"],
|
|
34316
34316
|
capabilities: [
|
|
34317
34317
|
{ id: "x-search:read", name: "Search Posts", description: "Search recent public X posts (last ~7 days) via x_search_recent.", access: "read" }
|
|
@@ -34343,7 +34343,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34343
34343
|
// per definition, so an org can take Local Business Data without taking the
|
|
34344
34344
|
// pricier, more ToS-sensitive social scraping.
|
|
34345
34345
|
//
|
|
34346
|
-
//
|
|
34346
|
+
// Ninjafy holds ONE Apify account whose token (APIFY_API_TOKEN, read
|
|
34347
34347
|
// from SSM - the API Lambda env is at the 4KB cap) every customer run bills
|
|
34348
34348
|
// back to, so the key is a single platform-held secret, NOT a per-agent
|
|
34349
34349
|
// credential. Auth type is `none` - customers never enter a key. Tools run on
|
|
@@ -34365,7 +34365,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34365
34365
|
id: "social-scraping",
|
|
34366
34366
|
name: "Social Scraping",
|
|
34367
34367
|
category: "social",
|
|
34368
|
-
description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research.
|
|
34368
|
+
description: "Pull public posts and videos from TikTok, Instagram and YouTube - captions, media, engagement counts and URLs - for brand, competitor and campaign research. Ninjafy manages the scraping account for you; there is no key to enter.",
|
|
34369
34369
|
supported_auth_types: ["none"],
|
|
34370
34370
|
capabilities: [
|
|
34371
34371
|
{ 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" },
|
|
@@ -34411,7 +34411,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34411
34411
|
id: "local-business-data",
|
|
34412
34412
|
name: "Local Business Data",
|
|
34413
34413
|
category: "knowledge",
|
|
34414
|
-
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.
|
|
34414
|
+
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. Ninjafy manages the data account for you; there is no key to enter.",
|
|
34415
34415
|
supported_auth_types: ["none"],
|
|
34416
34416
|
capabilities: [
|
|
34417
34417
|
{ 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" },
|
|
@@ -34511,7 +34511,7 @@ var INTEGRATION_REGISTRY = [
|
|
|
34511
34511
|
// here rather than read from the rate card, which is a real drift
|
|
34512
34512
|
// hazard — so it is held by a test that reprices both from the migration
|
|
34513
34513
|
// and fails if they disagree, rather than by anyone remembering.
|
|
34514
|
-
description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by
|
|
34514
|
+
description: "Let an agent advise on a meeting while it is happening. Audio is transcribed on the Mac as usual; short passages are then checked by Ninjafy to decide when the agent should speak up, and the agent sees those moments in real time. Off until you turn it on. Billed per minute the advisor is armed \u2014 about $0.90 for a half-hour advised meeting (A$1.50 in Australian dollars); a meeting you record without arming the advisor costs nothing.",
|
|
34515
34515
|
access: "write",
|
|
34516
34516
|
requires_org_opt_in: true
|
|
34517
34517
|
}
|