@a5c-ai/agent-catalog 5.0.1-staging.686c8b317 → 5.0.1-staging.69cb593ea

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.
@@ -27,12 +27,12 @@ const atlas_1 = require("@a5c-ai/atlas");
27
27
  // Record adaptation: Atlas `_kind` -> agent-catalog `kind`
28
28
  // ---------------------------------------------------------------------------
29
29
  const AGENT_CATALOG_KINDS = new Set([
30
- "AgentProduct", "AgentVersion", "Capability", "CapabilitySupport",
30
+ "AdapterModel", "AgentProduct", "AgentVersion", "Capability", "CapabilitySupport",
31
31
  "CiSurface", "Claim", "DiscoverySignal", "EvidenceSource",
32
32
  "HookMapping", "HookSurface", "LifecycleSemantics", "Modality",
33
33
  "ModelFamily", "ModelProviderProduct", "ModelProviderVersion", "ModelVersion",
34
34
  "PackageSurface", "PathDescriptor", "PluginArtifact", "PluginTarget",
35
- "ProcessDescriptor", "SessionSemantics", "TransportProtocol", "TransportRuntime",
35
+ "ProcessDescriptor", "ProviderTranslation", "SessionSemantics", "TransportProtocol", "TransportRuntime",
36
36
  ]);
37
37
  function isAgentCatalogRecord(record) {
38
38
  return AGENT_CATALOG_KINDS.has(record._kind);
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EAIpB,WAAW,EACX,cAAc,EAEd,aAAa,EAGb,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAGlB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACf,MAAM,UAAU,CAAC;AA0xBlB,UAAU,qBAAqB;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxD,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAChD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC1D,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;CAC5B;AA2FD,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AAED,wBAAgB,mBAAmB,IAAI,qBAAqB,CAK3D;AAoDD,eAAO,MAAM,cAAc,eAA8D,CAAC;AAC1F,eAAO,MAAM,eAAe,gBAA+D,CAAC;AAC5F,eAAO,MAAM,QAAQ,kBAAwD,CAAC;AAC9E,eAAO,MAAM,MAAM,eAAsD,CAAC;AAC1E,eAAO,MAAM,SAAS,wBAAyD,CAAC;AAChF,eAAO,MAAM,MAAM,gBAAsD,CAAC;AAC1E,eAAO,MAAM,UAAU,uBAA0D,CAAC;AAClF,eAAO,MAAM,YAAY,wBAA4D,CAAC;AACtF,eAAO,MAAM,UAAU,sBAA0D,CAAC;AAClF,eAAO,MAAM,KAAK,kBAAqD,CAAC;AACxE,eAAO,MAAM,eAAe,iBAA8D,CAAC;AAC3F,eAAO,MAAM,iBAAiB,mBAAgE,CAAC;AAC/F,eAAO,MAAM,SAAS,qBAAyD,CAAC;AAChF,eAAO,MAAM,oBAAoB,qBAAkE,CAAC;AACpG,eAAO,MAAM,MAAM,gBAAsD,CAAC;AAC1E,eAAO,MAAM,eAAe,0BAA8D,CAAC;AAC3F,eAAO,MAAM,oBAAoB,qCAAmE,CAAC;AACrG,eAAO,MAAM,yBAAyB,yBAAsE,CAAC;AAC7G,eAAO,MAAM,iBAAiB,yCAAiE,CAAC;AAChG,eAAO,MAAM,cAAc,qBAA6D,CAAC;AACzF,eAAO,MAAM,cAAc,0BAA6D,CAAC;AACzF,eAAO,MAAM,qBAAqB,uBAAoE,CAAC;AACvG,eAAO,MAAM,aAAa,cAA6D,CAAC"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EAIpB,WAAW,EAEX,cAAc,EAEd,aAAa,EAKb,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAGlB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EAEb,mBAAmB,EACnB,cAAc,EACf,MAAM,UAAU,CAAC;AAq3BlB,UAAU,qBAAqB;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxD,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAChD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC1D,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;CAC5B;AA2FD,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AAED,wBAAgB,mBAAmB,IAAI,qBAAqB,CAK3D;AAoDD,eAAO,MAAM,cAAc,eAA8D,CAAC;AAC1F,eAAO,MAAM,eAAe,gBAA+D,CAAC;AAC5F,eAAO,MAAM,QAAQ,kBAAwD,CAAC;AAC9E,eAAO,MAAM,MAAM,eAAsD,CAAC;AAC1E,eAAO,MAAM,SAAS,wBAAyD,CAAC;AAChF,eAAO,MAAM,MAAM,gBAAsD,CAAC;AAC1E,eAAO,MAAM,UAAU,uBAA0D,CAAC;AAClF,eAAO,MAAM,YAAY,wBAA4D,CAAC;AACtF,eAAO,MAAM,UAAU,sBAA0D,CAAC;AAClF,eAAO,MAAM,KAAK,kBAAqD,CAAC;AACxE,eAAO,MAAM,eAAe,iBAA8D,CAAC;AAC3F,eAAO,MAAM,iBAAiB,mBAAgE,CAAC;AAC/F,eAAO,MAAM,SAAS,qBAAyD,CAAC;AAChF,eAAO,MAAM,oBAAoB,qBAAkE,CAAC;AACpG,eAAO,MAAM,MAAM,gBAAsD,CAAC;AAC1E,eAAO,MAAM,eAAe,0BAA8D,CAAC;AAC3F,eAAO,MAAM,oBAAoB,qCAAmE,CAAC;AACrG,eAAO,MAAM,yBAAyB,yBAAsE,CAAC;AAC7G,eAAO,MAAM,iBAAiB,yCAAiE,CAAC;AAChG,eAAO,MAAM,cAAc,qBAA6D,CAAC;AACzF,eAAO,MAAM,cAAc,0BAA6D,CAAC;AACzF,eAAO,MAAM,qBAAqB,uBAAoE,CAAC;AACvG,eAAO,MAAM,aAAa,cAA6D,CAAC"}
package/dist/data.js CHANGED
@@ -121,6 +121,7 @@ function toTransportDescriptor(node) {
121
121
  persistentSession: Boolean(node.persistentSession),
122
122
  stdinInjection: Boolean(node.stdinInjection),
123
123
  blockingStopHook: Boolean(node.blockingStopHook),
124
+ codecCapabilities: parseCodecCapabilities(node.codecCapabilities),
124
125
  evidenceIds: nodeEvidenceIds(node),
125
126
  };
126
127
  }
@@ -265,21 +266,14 @@ function agentPluginTargetIds(agentNodeId) {
265
266
  .map((node) => valueAsString(node.targetId))
266
267
  .filter(Boolean);
267
268
  }
268
- function matchesAgentId(nodeAgentId, targetAgentId, targetAliases) {
269
+ function matchesAgentId(nodeAgentId, targetAgentId) {
269
270
  if (nodeAgentId === targetAgentId)
270
271
  return true;
271
272
  // Handle "agent:codex" matching "codex"
272
- const nodeSlug = nodeAgentId.startsWith("agent:") ? nodeAgentId.slice("agent:".length) : nodeAgentId;
273
- const targetSlug = targetAgentId.startsWith("agent:") ? targetAgentId.slice("agent:".length) : targetAgentId;
274
- if (nodeSlug === targetSlug)
273
+ if (nodeAgentId.startsWith("agent:") && nodeAgentId.slice("agent:".length) === targetAgentId)
274
+ return true;
275
+ if (targetAgentId.startsWith("agent:") && targetAgentId.slice("agent:".length) === nodeAgentId)
275
276
  return true;
276
- // Handle host renames via aliases (e.g. agentId "gemini" with alias "gemini-cli")
277
- if (targetAliases) {
278
- for (const alias of targetAliases) {
279
- if (nodeSlug === alias)
280
- return true;
281
- }
282
- }
283
277
  return false;
284
278
  }
285
279
  function agentSessionNuanceIds(agentNodeId) {
@@ -288,14 +282,13 @@ function agentSessionNuanceIds(agentNodeId) {
288
282
  .filter(Boolean);
289
283
  if (edgeBased.length > 0)
290
284
  return edgeBased;
291
- // Fallback: find SessionSemantics nodes whose agentId matches (including aliases)
285
+ // Fallback: find SessionSemantics nodes whose agentId matches
292
286
  const agentNode = (0, atlas_bridge_1.getNodeById)(agentNodeId);
293
287
  const agentId = valueAsString(agentNode?.agentId);
294
288
  if (!agentId)
295
289
  return [];
296
- const aliases = stringArray(agentNode?.aliases);
297
290
  return (0, atlas_bridge_1.listNodesByKind)("SessionSemantics")
298
- .filter((node) => matchesAgentId(valueAsString(node.agentId), agentId, aliases))
291
+ .filter((node) => matchesAgentId(valueAsString(node.agentId), agentId))
299
292
  .map((node) => valueAsString(node.sessionSemanticsId))
300
293
  .filter(Boolean);
301
294
  }
@@ -305,16 +298,15 @@ function agentLifecycleNuanceIds(agentNodeId) {
305
298
  .filter(Boolean);
306
299
  if (edgeBased.length > 0)
307
300
  return edgeBased;
308
- // Fallback: find LifecycleSemantics nodes whose agentId and versionRange match (including aliases)
301
+ // Fallback: find LifecycleSemantics nodes whose agentId and versionRange match
309
302
  const agentNode = (0, atlas_bridge_1.getNodeById)(agentNodeId);
310
303
  const agentId = valueAsString(agentNode?.agentId);
311
304
  const agentVersionRange = valueAsString(agentNode?.versionRange);
312
305
  if (!agentId)
313
306
  return [];
314
- const aliases = stringArray(agentNode?.aliases);
315
307
  return (0, atlas_bridge_1.listNodesByKind)("LifecycleSemantics")
316
308
  .filter((node) => {
317
- if (!matchesAgentId(valueAsString(node.agentId), agentId, aliases))
309
+ if (!matchesAgentId(valueAsString(node.agentId), agentId))
318
310
  return false;
319
311
  // If agent has a specific version range, match lifecycle nodes with same or broader range
320
312
  if (agentVersionRange) {
@@ -327,6 +319,110 @@ function agentLifecycleNuanceIds(agentNodeId) {
327
319
  .map((node) => valueAsString(node.lifecycleSemanticsId))
328
320
  .filter(Boolean);
329
321
  }
322
+ function toHookSupportLevel(value) {
323
+ const normalized = valueAsString(value);
324
+ if (normalized === 'native' || normalized === 'emulated')
325
+ return normalized;
326
+ return 'unsupported';
327
+ }
328
+ function parseHookSupportMap(value) {
329
+ const obj = (value && typeof value === 'object') ? value : {};
330
+ return {
331
+ sessionStart: toHookSupportLevel(obj.sessionStart),
332
+ stop: toHookSupportLevel(obj.stop),
333
+ userPromptSubmit: toHookSupportLevel(obj.userPromptSubmit),
334
+ preToolUse: toHookSupportLevel(obj.preToolUse),
335
+ sessionEnd: toHookSupportLevel(obj.sessionEnd),
336
+ };
337
+ }
338
+ function parsePartialHookSupportMap(value) {
339
+ const obj = (value && typeof value === 'object') ? value : {};
340
+ const result = {};
341
+ if (obj.sessionStart != null)
342
+ result.sessionStart = toHookSupportLevel(obj.sessionStart);
343
+ if (obj.stop != null)
344
+ result.stop = toHookSupportLevel(obj.stop);
345
+ if (obj.userPromptSubmit != null)
346
+ result.userPromptSubmit = toHookSupportLevel(obj.userPromptSubmit);
347
+ if (obj.preToolUse != null)
348
+ result.preToolUse = toHookSupportLevel(obj.preToolUse);
349
+ if (obj.sessionEnd != null)
350
+ result.sessionEnd = toHookSupportLevel(obj.sessionEnd);
351
+ return result;
352
+ }
353
+ function parseHookSupport(value) {
354
+ if (!value || typeof value !== 'object')
355
+ return undefined;
356
+ const obj = value;
357
+ if (!obj.interactive || typeof obj.interactive !== 'object')
358
+ return undefined;
359
+ return {
360
+ interactive: parseHookSupportMap(obj.interactive),
361
+ nonInteractive: parsePartialHookSupportMap(obj.nonInteractive),
362
+ };
363
+ }
364
+ function parseBridgeCapabilities(value) {
365
+ if (!value || typeof value !== 'object')
366
+ return undefined;
367
+ const obj = value;
368
+ return {
369
+ interactiveBridge: Boolean(obj.interactiveBridge),
370
+ sessionResume: Boolean(obj.sessionResume),
371
+ positionalPrompt: Boolean(obj.positionalPrompt),
372
+ };
373
+ }
374
+ function parseAdapterMetadata(value) {
375
+ if (!value || typeof value !== 'object')
376
+ return undefined;
377
+ const obj = value;
378
+ return {
379
+ installCommands: Array.isArray(obj.installCommands) ? obj.installCommands.map((c) => {
380
+ const cmd = c;
381
+ return { type: valueAsString(cmd.type), command: valueAsString(cmd.command) };
382
+ }) : undefined,
383
+ authMethods: Array.isArray(obj.authMethods) ? obj.authMethods.map((m) => {
384
+ const method = m;
385
+ return {
386
+ type: valueAsString(method.type),
387
+ name: valueAsString(method.name),
388
+ envVars: Array.isArray(method.envVars) ? method.envVars.map(String) : undefined,
389
+ };
390
+ }) : undefined,
391
+ authFiles: Array.isArray(obj.authFiles) ? obj.authFiles.map(String) : undefined,
392
+ hostEnvSignals: Array.isArray(obj.hostEnvSignals) ? obj.hostEnvSignals.map(String) : undefined,
393
+ sessionDir: valueAsString(obj.sessionDir) || undefined,
394
+ sessionPersistence: (['file', 'sqlite', 'none'].includes(valueAsString(obj.sessionPersistence)) ? valueAsString(obj.sessionPersistence) : undefined),
395
+ automationEnv: obj.automationEnv && typeof obj.automationEnv === 'object' ? Object.fromEntries(Object.entries(obj.automationEnv).map(([k, v]) => [k, String(v)])) : undefined,
396
+ approvalModes: Array.isArray(obj.approvalModes) ? obj.approvalModes.map(String) : undefined,
397
+ capabilityFlags: obj.capabilityFlags && typeof obj.capabilityFlags === 'object' ? obj.capabilityFlags : undefined,
398
+ runtimeHooks: obj.runtimeHooks && typeof obj.runtimeHooks === 'object' ? obj.runtimeHooks : undefined,
399
+ configSchema: obj.configSchema && typeof obj.configSchema === 'object' ? {
400
+ configFormat: valueAsString(obj.configSchema.configFormat) || undefined,
401
+ configFilePaths: Array.isArray(obj.configSchema.configFilePaths) ? obj.configSchema.configFilePaths.map(String) : undefined,
402
+ projectConfigFilePaths: Array.isArray(obj.configSchema.projectConfigFilePaths) ? obj.configSchema.projectConfigFilePaths.map(String) : undefined,
403
+ } : undefined,
404
+ displayName: valueAsString(obj.displayName) || undefined,
405
+ defaultModelId: valueAsString(obj.defaultModelId) || undefined,
406
+ };
407
+ }
408
+ function parseToolSchemaFormat(value) {
409
+ const normalized = valueAsString(value);
410
+ if (normalized === "openai" || normalized === "anthropic" || normalized === "google")
411
+ return normalized;
412
+ return "none";
413
+ }
414
+ function parseCodecCapabilities(value) {
415
+ if (!value || typeof value !== 'object')
416
+ return undefined;
417
+ const obj = value;
418
+ return {
419
+ supportsTools: obj.supportsTools === true || obj.supportsTools === "true",
420
+ supportsStreaming: obj.supportsStreaming === true || obj.supportsStreaming === "true",
421
+ supportsTokenCounting: obj.supportsTokenCounting === true || obj.supportsTokenCounting === "true",
422
+ costTracking: obj.costTracking === true || obj.costTracking === "true",
423
+ toolSchemaFormat: parseToolSchemaFormat(obj.toolSchemaFormat),
424
+ };
425
+ }
330
426
  function toAgentVersion(node) {
331
427
  return {
332
428
  agentId: valueAsString(node.agentId),
@@ -350,6 +446,15 @@ function toAgentVersion(node) {
350
446
  sessionNuanceIds: agentSessionNuanceIds(node.id),
351
447
  lifecycleNuanceIds: agentLifecycleNuanceIds(node.id),
352
448
  evidenceIds: nodeEvidenceIds(node),
449
+ interactiveSignals: node.interactiveSignals != null ? {
450
+ turnCompletePattern: valueAsString(node.interactiveSignals?.turnCompletePattern) || undefined,
451
+ exitOnNonInteractive: node.interactiveSignals?.exitOnNonInteractive === true ? true : undefined,
452
+ nonInteractiveMode: valueAsString(node.interactiveSignals?.nonInteractiveMode) || undefined,
453
+ interactiveMode: valueAsString(node.interactiveSignals?.interactiveMode),
454
+ } : undefined,
455
+ hookSupport: parseHookSupport(node.hookSupport),
456
+ bridgeCapabilities: parseBridgeCapabilities(node.bridgeCapabilities),
457
+ adapterMetadata: parseAdapterMetadata(node.adapterMetadata),
353
458
  };
354
459
  }
355
460
  function evidenceIdFromNode(node) {
@@ -418,25 +523,16 @@ function synthesizeClaimsFromEvidenceRefs(node) {
418
523
  });
419
524
  }
420
525
  if (webIds.length > 0) {
421
- // Look for existing Claim nodes matching web evidence IDs
422
- // Prefer claims whose claimId contains the support node's capability ID
423
- const capabilityId = valueAsString(node.capabilityId);
424
- const allWebClaims = (0, atlas_bridge_1.listNodesByKind)("Claim").filter((claimNode) => {
526
+ // Look for an existing Claim node matching a web evidence ID
527
+ const matchedWebClaim = (0, atlas_bridge_1.listNodesByKind)("Claim").find((claimNode) => {
425
528
  const claimEvidenceIds = stringArray(claimNode.evidenceIds);
426
529
  return claimEvidenceIds.some((id) => webIds.includes(id)) && valueAsString(claimNode.provenanceKind) !== "repo-observation";
427
530
  });
428
- // Sort: prefer claims whose claimId contains the capabilityId (more specific)
429
- const sortedWebClaims = [...allWebClaims].sort((a, b) => {
430
- const aSpecific = valueAsString(a.claimId).includes(capabilityId) ? 1 : 0;
431
- const bSpecific = valueAsString(b.claimId).includes(capabilityId) ? 1 : 0;
432
- return bSpecific - aSpecific;
433
- });
434
- const matchedWebClaim = sortedWebClaims[0];
435
531
  if (matchedWebClaim) {
436
532
  const claim = toClaimRecord(matchedWebClaim);
437
- // Ensure partial/inferred vendor claims always have unresolved gaps
533
+ // Ensure partial vendor claims always have unresolved gaps
438
534
  if (claim.evidenceStrength !== "corroborated" && claim.unresolvedGaps.length === 0) {
439
- claim.unresolvedGaps = [`Vendor evidence for ${capabilityId} has not been fully corroborated.`];
535
+ claim.unresolvedGaps = [`Vendor evidence for ${valueAsString(node.capabilityId)} has not been fully corroborated.`];
440
536
  }
441
537
  claims.push(claim);
442
538
  }
@@ -637,6 +733,7 @@ const BABYSITTER_PLUGIN_TARGETS = new Set([
637
733
  "plugin-target:claude-code", "plugin-target:codex", "plugin-target:cursor",
638
734
  "plugin-target:gemini-cli", "plugin-target:copilot-cli", "plugin-target:pi",
639
735
  "plugin-target:omp", "plugin-target:opencode", "plugin-target:openclaw",
736
+ "plugin-target:hermes",
640
737
  ]);
641
738
  // Atlas uses different IDs for some targets
642
739
  const TARGET_ID_ALIASES = {