@agent-native/core 0.49.2 → 0.49.3
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/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +1 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +11 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/model-config.d.ts +2 -2
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +2 -6
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +3 -2
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +3 -2
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +117 -33
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +20 -0
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +256 -40
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +2 -2
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +5 -5
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +0 -7
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/blocks/library/annotation-rail.d.ts +14 -0
- package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
- package/dist/client/blocks/library/annotation-rail.js +64 -2
- package/dist/client/blocks/library/annotation-rail.js.map +1 -1
- package/dist/client/use-chat-models.d.ts.map +1 -1
- package/dist/client/use-chat-models.js +0 -5
- package/dist/client/use-chat-models.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +3 -2
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +3 -2
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/mcp/connect-route.d.ts +2 -0
- package/dist/mcp/connect-route.d.ts.map +1 -1
- package/dist/mcp/connect-route.js +3 -0
- package/dist/mcp/connect-route.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/evals.d.ts.map +1 -1
- package/dist/observability/evals.js +5 -3
- package/dist/observability/evals.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +6 -3
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +5 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +7 -2
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +14 -4
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/complete-text.d.ts.map +1 -1
- package/dist/server/complete-text.js +3 -2
- package/dist/server/complete-text.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +2 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +1 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +7 -6
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +3 -2
- package/dist/triggers/dispatcher.js.map +1 -1
- package/docs/content/external-agents.md +1 -1
- package/docs/content/plan-plugin.md +2 -2
- package/docs/content/pr-visual-recap.md +12 -4
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +7 -6
package/dist/cli/connect.js
CHANGED
|
@@ -52,6 +52,13 @@ const CANONICAL_SERVER_NAME_BY_MCP_URL = {
|
|
|
52
52
|
"https://design.agent-native.com/_agent-native/mcp": "agent-native-design",
|
|
53
53
|
"https://context-xray.agent-native.com/_agent-native/mcp": "agent-native-context-xray",
|
|
54
54
|
};
|
|
55
|
+
const LEGACY_SERVER_NAMES_BY_MCP_URL = {
|
|
56
|
+
"https://plan.agent-native.com/_agent-native/mcp": [
|
|
57
|
+
"agent-native-plan",
|
|
58
|
+
"agent-native-plans",
|
|
59
|
+
"agent-native-visual-plans",
|
|
60
|
+
],
|
|
61
|
+
};
|
|
55
62
|
const CONNECT_PROFILES_VERSION = 1;
|
|
56
63
|
const DEFAULT_DEV_GATEWAY = "http://127.0.0.1:8080";
|
|
57
64
|
const MCP_FULL_CATALOG_HEADER = "X-Agent-Native-MCP-Full-Catalog";
|
|
@@ -360,8 +367,25 @@ function appSlugFromUrl(url) {
|
|
|
360
367
|
}
|
|
361
368
|
}
|
|
362
369
|
function defaultServerName(url) {
|
|
370
|
+
const canonical = canonicalServerNameForMcpUrl(mcpUrlForBaseUrl(url));
|
|
371
|
+
if (canonical)
|
|
372
|
+
return canonical;
|
|
363
373
|
return `${SERVER_NAME_PREFIX}-${appSlugFromUrl(url)}`;
|
|
364
374
|
}
|
|
375
|
+
function canonicalServerNameForMcpUrl(mcpUrl) {
|
|
376
|
+
const key = canonicalMcpUrl(mcpUrl);
|
|
377
|
+
return key ? CANONICAL_SERVER_NAME_BY_MCP_URL[key] : undefined;
|
|
378
|
+
}
|
|
379
|
+
function reconnectServerNameForMcpUrl(mcpUrl, serverName) {
|
|
380
|
+
const key = canonicalMcpUrl(mcpUrl);
|
|
381
|
+
if (!key || !serverName)
|
|
382
|
+
return serverName;
|
|
383
|
+
const canonical = CANONICAL_SERVER_NAME_BY_MCP_URL[key];
|
|
384
|
+
if (!canonical || serverName === canonical)
|
|
385
|
+
return serverName;
|
|
386
|
+
const legacyNames = LEGACY_SERVER_NAMES_BY_MCP_URL[key] ?? [];
|
|
387
|
+
return legacyNames.includes(serverName) ? canonical : serverName;
|
|
388
|
+
}
|
|
365
389
|
// ---------------------------------------------------------------------------
|
|
366
390
|
// Browser open (mirrors workspace-dev.ts openBrowser)
|
|
367
391
|
// ---------------------------------------------------------------------------
|
|
@@ -1167,8 +1191,16 @@ function distinctReconnectEntries(entries) {
|
|
|
1167
1191
|
}
|
|
1168
1192
|
return out;
|
|
1169
1193
|
}
|
|
1170
|
-
function
|
|
1171
|
-
return
|
|
1194
|
+
function uniqueClients(entries) {
|
|
1195
|
+
return [...new Set(entries.map((entry) => entry.client))];
|
|
1196
|
+
}
|
|
1197
|
+
function preferredReconnectEntry(url, entries) {
|
|
1198
|
+
const canonicalName = CANONICAL_SERVER_NAME_BY_MCP_URL[url];
|
|
1199
|
+
return ((canonicalName
|
|
1200
|
+
? entries.find((entry) => entry.serverName === canonicalName)
|
|
1201
|
+
: undefined) ??
|
|
1202
|
+
entries.find((entry) => !entry.serverName.startsWith("agent-native-")) ??
|
|
1203
|
+
entries[0]);
|
|
1172
1204
|
}
|
|
1173
1205
|
/**
|
|
1174
1206
|
* Return true when `url` is an agent-native MCP endpoint.
|
|
@@ -1193,20 +1225,51 @@ async function resolveReconnectTarget(parsed, clients, deps) {
|
|
|
1193
1225
|
if (parsed.url) {
|
|
1194
1226
|
const normalizedUrl = normalizeUrl(parsed.url);
|
|
1195
1227
|
const mcpUrl = mcpUrlForBaseUrl(normalizedUrl);
|
|
1228
|
+
const matches = distinctReconnectEntries(entries.filter((entry) => sameMcpUrl(entry.url, mcpUrl)));
|
|
1229
|
+
if (matches.length === 0) {
|
|
1230
|
+
logErr(` No existing Agent Native MCP entry found for ${mcpUrl}.`);
|
|
1231
|
+
logErr(" First-time setup still uses: npx @agent-native/core@latest connect <url> --client <client>");
|
|
1232
|
+
return null;
|
|
1233
|
+
}
|
|
1196
1234
|
if (parsed.name) {
|
|
1197
|
-
|
|
1235
|
+
const namedMatches = matches.filter((entry) => entry.serverName === parsed.name);
|
|
1236
|
+
if (namedMatches.length === 0) {
|
|
1237
|
+
logErr(` No existing MCP entry named "${parsed.name}" found for ${mcpUrl}.`);
|
|
1238
|
+
logErr(" Re-run without --name to use the existing entry name.");
|
|
1239
|
+
return null;
|
|
1240
|
+
}
|
|
1241
|
+
return {
|
|
1242
|
+
rawUrl: parsed.url,
|
|
1243
|
+
serverName: parsed.name,
|
|
1244
|
+
clients: uniqueClients(namedMatches),
|
|
1245
|
+
};
|
|
1198
1246
|
}
|
|
1199
|
-
const
|
|
1200
|
-
const
|
|
1201
|
-
if (
|
|
1202
|
-
|
|
1247
|
+
const key = canonicalMcpUrl(mcpUrl) ?? mcpUrl;
|
|
1248
|
+
const preferred = preferredReconnectEntry(key, matches);
|
|
1249
|
+
if (preferred) {
|
|
1250
|
+
const names = [...new Set(matches.map((entry) => entry.serverName))];
|
|
1251
|
+
if (names.length > 1) {
|
|
1252
|
+
logOut(` Found duplicate MCP entries for ${mcpUrl}: ${names.join(", ")}.`);
|
|
1253
|
+
logOut(` Reconnecting "${preferred.serverName}" and removing the duplicate names.`);
|
|
1254
|
+
}
|
|
1255
|
+
return {
|
|
1256
|
+
rawUrl: parsed.url,
|
|
1257
|
+
serverName: reconnectServerNameForMcpUrl(mcpUrl, preferred.serverName) ??
|
|
1258
|
+
preferred.serverName,
|
|
1259
|
+
clients: uniqueClients(matches),
|
|
1260
|
+
};
|
|
1203
1261
|
}
|
|
1262
|
+
const names = [...new Set(matches.map((entry) => entry.serverName))];
|
|
1204
1263
|
if (names.length > 1) {
|
|
1205
1264
|
logErr(` Found multiple MCP entries for ${mcpUrl}: ${names.join(", ")}.`);
|
|
1206
1265
|
logErr(" Re-run with --name <serverName> to choose one.");
|
|
1207
1266
|
return null;
|
|
1208
1267
|
}
|
|
1209
|
-
return {
|
|
1268
|
+
return {
|
|
1269
|
+
rawUrl: parsed.url,
|
|
1270
|
+
serverName: names[0],
|
|
1271
|
+
clients: uniqueClients(matches),
|
|
1272
|
+
};
|
|
1210
1273
|
}
|
|
1211
1274
|
// No URL provided: scan all configs for agent-native MCP entries by URL
|
|
1212
1275
|
// pattern, not by server name prefix. This finds the canonical "plan" entry
|
|
@@ -1234,13 +1297,13 @@ async function resolveReconnectTarget(parsed, clients, deps) {
|
|
|
1234
1297
|
// Fall back to any entry whose name doesn't start with "agent-native-"
|
|
1235
1298
|
// (short canonical names like "plan"), then bucket[0].
|
|
1236
1299
|
const [url, bucket] = [...byUrl.entries()][0];
|
|
1237
|
-
const
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
:
|
|
1241
|
-
|
|
1242
|
-
bucket
|
|
1243
|
-
|
|
1300
|
+
const preferred = preferredReconnectEntry(url, bucket) ?? bucket[0];
|
|
1301
|
+
return {
|
|
1302
|
+
rawUrl: preferred.url,
|
|
1303
|
+
serverName: reconnectServerNameForMcpUrl(preferred.url, preferred.serverName) ??
|
|
1304
|
+
preferred.serverName,
|
|
1305
|
+
clients: uniqueClients(bucket),
|
|
1306
|
+
};
|
|
1244
1307
|
}
|
|
1245
1308
|
// Multiple distinct URLs: pick interactively when TTY, else list with hints.
|
|
1246
1309
|
const urlList = [...byUrl.keys()];
|
|
@@ -1261,10 +1324,18 @@ async function resolveReconnectTarget(parsed, clients, deps) {
|
|
|
1261
1324
|
clack.cancel("Cancelled.");
|
|
1262
1325
|
return null;
|
|
1263
1326
|
}
|
|
1264
|
-
const
|
|
1265
|
-
|
|
1327
|
+
const bucket = byUrl.get(result);
|
|
1328
|
+
const chosen = bucket
|
|
1329
|
+
? (preferredReconnectEntry(result, bucket) ?? bucket[0])
|
|
1330
|
+
: undefined;
|
|
1331
|
+
if (!chosen || !bucket)
|
|
1266
1332
|
return null;
|
|
1267
|
-
return {
|
|
1333
|
+
return {
|
|
1334
|
+
rawUrl: chosen.url,
|
|
1335
|
+
serverName: reconnectServerNameForMcpUrl(chosen.url, chosen.serverName) ??
|
|
1336
|
+
chosen.serverName,
|
|
1337
|
+
clients: uniqueClients(bucket),
|
|
1338
|
+
};
|
|
1268
1339
|
}
|
|
1269
1340
|
logErr(" Found multiple Agent Native MCP entries:");
|
|
1270
1341
|
for (const [u, bucket] of byUrl) {
|
|
@@ -1274,7 +1345,7 @@ async function resolveReconnectTarget(parsed, clients, deps) {
|
|
|
1274
1345
|
for (const u of urlList) {
|
|
1275
1346
|
// Strip the MCP path suffix for a cleaner reconnect URL suggestion.
|
|
1276
1347
|
const baseUrl = u.replace(/\/_agent-native\/mcp$/, "");
|
|
1277
|
-
logErr(` npx @agent-native/core@latest reconnect ${baseUrl}`);
|
|
1348
|
+
logErr(` npx -y @agent-native/core@latest reconnect ${baseUrl}`);
|
|
1278
1349
|
}
|
|
1279
1350
|
return null;
|
|
1280
1351
|
}
|
|
@@ -1287,9 +1358,10 @@ async function reconnectOne(parsed, clients, deps) {
|
|
|
1287
1358
|
url: target.rawUrl,
|
|
1288
1359
|
name: target.serverName ?? parsed.name,
|
|
1289
1360
|
};
|
|
1361
|
+
const effectiveClients = target.clients?.length ? target.clients : clients;
|
|
1290
1362
|
logOut("");
|
|
1291
1363
|
logOut(` Reconnecting${effectiveParsed.name ? ` "${effectiveParsed.name}"` : ""}...`);
|
|
1292
|
-
const res = await connectOne(target.rawUrl, effectiveParsed,
|
|
1364
|
+
const res = await connectOne(target.rawUrl, effectiveParsed, effectiveClients, deps);
|
|
1293
1365
|
return res.ok;
|
|
1294
1366
|
}
|
|
1295
1367
|
async function connectOne(rawUrl, parsed, clients, deps) {
|
|
@@ -1330,7 +1402,11 @@ async function connectOne(rawUrl, parsed, clients, deps) {
|
|
|
1330
1402
|
return { ok: false };
|
|
1331
1403
|
token = grant.token;
|
|
1332
1404
|
mcpUrl = grant.mcpUrl;
|
|
1333
|
-
serverName =
|
|
1405
|
+
serverName =
|
|
1406
|
+
parsed.name ??
|
|
1407
|
+
reconnectServerNameForMcpUrl(grant.mcpUrl, grant.serverName) ??
|
|
1408
|
+
grant.serverName ??
|
|
1409
|
+
defaultServerName(baseUrl);
|
|
1334
1410
|
headers = grant.headers;
|
|
1335
1411
|
}
|
|
1336
1412
|
if (oauthClients.length > 0 && !parsed.token) {
|
|
@@ -1625,12 +1701,14 @@ Usage:
|
|
|
1625
1701
|
org-visible. Org owner/admin only. Printed once; nothing is written
|
|
1626
1702
|
to local MCP configs.
|
|
1627
1703
|
|
|
1628
|
-
npx @agent-native/core@latest reconnect [<url>] [--client <c>] [--scope user|project]
|
|
1629
|
-
npx @agent-native/core@latest connect reconnect [<url>] [--client <c>] [--scope user|project]
|
|
1704
|
+
npx -y @agent-native/core@latest reconnect [<url>] [--client <c>] [--scope user|project]
|
|
1705
|
+
npx -y @agent-native/core@latest connect reconnect [<url>] [--client <c>] [--scope user|project]
|
|
1630
1706
|
Re-authenticate an existing MCP entry without reinstalling apps/skills.
|
|
1631
1707
|
With a URL, it reuses the existing server name for that MCP URL when
|
|
1632
|
-
possible
|
|
1633
|
-
|
|
1708
|
+
possible, reconnecting only clients that already have that entry. Pass
|
|
1709
|
+
--client to limit which configs it searches. Without a URL, it reconnects
|
|
1710
|
+
the only matching Agent Native entry in local client configs. Use --name
|
|
1711
|
+
for custom server names.
|
|
1634
1712
|
|
|
1635
1713
|
npx @agent-native/core@latest connect --all [--client <c>] [--scope user|project]
|
|
1636
1714
|
Connect every first-party hosted app as separate MCP resources.
|
|
@@ -1661,14 +1739,20 @@ export async function runConnect(args, deps = {}) {
|
|
|
1661
1739
|
const parsed = parseConnectArgs(args);
|
|
1662
1740
|
try {
|
|
1663
1741
|
if (parsed.mode) {
|
|
1664
|
-
|
|
1665
|
-
if (
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1742
|
+
let ok;
|
|
1743
|
+
if (parsed.mode === "reconnect" || parsed.mode === "reauth") {
|
|
1744
|
+
const clients = resolveClients(parsed.client);
|
|
1745
|
+
ok = await reconnectOne(parsed, clients, deps);
|
|
1746
|
+
}
|
|
1747
|
+
else {
|
|
1748
|
+
const clients = await resolveConnectClients(parsed, deps);
|
|
1749
|
+
if (!clients)
|
|
1750
|
+
return;
|
|
1751
|
+
ok =
|
|
1752
|
+
parsed.mode === "dev"
|
|
1753
|
+
? await connectDevProfile(parsed, clients, deps)
|
|
1754
|
+
: await connectProdProfile(parsed, clients, deps);
|
|
1755
|
+
}
|
|
1672
1756
|
if (!ok)
|
|
1673
1757
|
process.exitCode = 1;
|
|
1674
1758
|
return;
|