@datalayer/agent-runtimes 1.5.86 → 1.5.87

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.
Files changed (75) hide show
  1. package/dist-embed/chunks/{DeckComponent-D4X-rpbh.js → DeckComponent-etBrFG87.js} +1 -1
  2. package/dist-embed/chunks/{DocumentView-Aird-zRf.js → DocumentView-LE7AJ2BO.js} +1 -1
  3. package/dist-embed/chunks/{EphemeralDocument-qnhIdhNh.js → EphemeralDocument-YiGgJGkL.js} +1 -1
  4. package/dist-embed/chunks/{ExcalidrawComponent-C33gsDzG.js → ExcalidrawComponent-C5J8Uqqj.js} +1 -1
  5. package/dist-embed/chunks/{ExcalidrawModal-DHCo94OE.js → ExcalidrawModal-D3cbhMgF.js} +1 -1
  6. package/dist-embed/chunks/{JupyterLexicalExtension-Cb2zt9Ki.js → JupyterLexicalExtension-BipHQ8U3.js} +7 -7
  7. package/dist-embed/chunks/{YouTubePlugin-C0a_9VKl.js → YouTubePlugin-BewlFg9c.js} +1 -1
  8. package/dist-embed/chunks/{ar-SA-G6X2FPQ2-DS3Xmdel.js → ar-SA-G6X2FPQ2-BgdfqrVp.js} +1 -1
  9. package/dist-embed/chunks/{az-AZ-76LH7QW2-DIApsK5M.js → az-AZ-76LH7QW2-xUMz4Jqu.js} +1 -1
  10. package/dist-embed/chunks/{bg-BG-XCXSNQG7-X-aS4Onm.js → bg-BG-XCXSNQG7-UR5Ld32v.js} +1 -1
  11. package/dist-embed/chunks/{bn-BD-2XOGV67Q-1YCe_Jnl.js → bn-BD-2XOGV67Q-CCNH7olK.js} +1 -1
  12. package/dist-embed/chunks/{ca-ES-6MX7JW3Y-D26sHSba.js → ca-ES-6MX7JW3Y-DaZb-gMN.js} +1 -1
  13. package/dist-embed/chunks/{cs-CZ-2BRQDIVT-B5pRYPPF.js → cs-CZ-2BRQDIVT-OaROtN46.js} +1 -1
  14. package/dist-embed/chunks/{da-DK-5WZEPLOC-BfajxBtH.js → da-DK-5WZEPLOC-DrcoMVce.js} +1 -1
  15. package/dist-embed/chunks/{de-DE-XR44H4JA-BovBXD5H.js → de-DE-XR44H4JA-b2_lYxS1.js} +1 -1
  16. package/dist-embed/chunks/{el-GR-BZB4AONW-rLXnfS2l.js → el-GR-BZB4AONW-BOT3RaFd.js} +1 -1
  17. package/dist-embed/chunks/{es-ES-U4NZUMDT-Do4MvuPW.js → es-ES-U4NZUMDT-BVlxd_yM.js} +1 -1
  18. package/dist-embed/chunks/{eu-ES-A7QVB2H4-CldbgpdZ.js → eu-ES-A7QVB2H4-BScAWOoO.js} +1 -1
  19. package/dist-embed/chunks/{fa-IR-HGAKTJCU-C988cp8F.js → fa-IR-HGAKTJCU-Kxnh8bHZ.js} +1 -1
  20. package/dist-embed/chunks/{fi-FI-Z5N7JZ37-BYmFVIh7.js → fi-FI-Z5N7JZ37-BOmDZi5v.js} +1 -1
  21. package/dist-embed/chunks/{fr-FR-RHASNOE6-D2Tarz3u.js → fr-FR-RHASNOE6-GOPhqKT4.js} +1 -1
  22. package/dist-embed/chunks/{gl-ES-HMX3MZ6V-BLuuMSHB.js → gl-ES-HMX3MZ6V-BRZS4fho.js} +1 -1
  23. package/dist-embed/chunks/{he-IL-6SHJWFNN-CyDIOeVd.js → he-IL-6SHJWFNN-MQEVUj2T.js} +1 -1
  24. package/dist-embed/chunks/{hi-IN-IWLTKZ5I-DKCduSTz.js → hi-IN-IWLTKZ5I-D_puNbt2.js} +1 -1
  25. package/dist-embed/chunks/{hu-HU-A5ZG7DT2-CFEUsNFV.js → hu-HU-A5ZG7DT2-VTn7BLHk.js} +1 -1
  26. package/dist-embed/chunks/{id-ID-SAP4L64H-DJgKxRp8.js → id-ID-SAP4L64H-DDpkcMxl.js} +1 -1
  27. package/dist-embed/chunks/{index-CaAB7eph.js → index-BnyTIBRs.js} +1 -1
  28. package/dist-embed/chunks/{index-BvYhxJ42.js → index-D4E_ai6G.js} +1 -1
  29. package/dist-embed/chunks/{it-IT-JPQ66NNP-CB1iVsAn.js → it-IT-JPQ66NNP-Dmm1oVBi.js} +1 -1
  30. package/dist-embed/chunks/{ja-JP-DBVTYXUO-BMEokiIe.js → ja-JP-DBVTYXUO-c8yMMjUO.js} +1 -1
  31. package/dist-embed/chunks/{kaa-6HZHGXH3-NDSx8vED.js → kaa-6HZHGXH3-Cr7KlyI3.js} +1 -1
  32. package/dist-embed/chunks/{kab-KAB-ZGHBKWFO-CDD0AUe8.js → kab-KAB-ZGHBKWFO-C5lvSze2.js} +1 -1
  33. package/dist-embed/chunks/{kk-KZ-P5N5QNE5-DiW940Xv.js → kk-KZ-P5N5QNE5-BWzl0srY.js} +1 -1
  34. package/dist-embed/chunks/{km-KH-HSX4SM5Z-D1yNJSuC.js → km-KH-HSX4SM5Z-D0hsReza.js} +1 -1
  35. package/dist-embed/chunks/{ko-KR-MTYHY66A-gxN7WKqI.js → ko-KR-MTYHY66A-BG6oRC2d.js} +1 -1
  36. package/dist-embed/chunks/{ku-TR-6OUDTVRD-AGx6lASh.js → ku-TR-6OUDTVRD-BcZeKYN4.js} +1 -1
  37. package/dist-embed/chunks/{lt-LT-XHIRWOB4-7aG3WRZ7.js → lt-LT-XHIRWOB4-CDMAwSRa.js} +1 -1
  38. package/dist-embed/chunks/{lv-LV-5QDEKY6T-kYU1Z9N2.js → lv-LV-5QDEKY6T-D2MZFbM-.js} +1 -1
  39. package/dist-embed/chunks/{mr-IN-CRQNXWMA-E1I_f_B2.js → mr-IN-CRQNXWMA-C4tnFlhM.js} +1 -1
  40. package/dist-embed/chunks/{my-MM-5M5IBNSE-BLvme-se.js → my-MM-5M5IBNSE-BeA-YSi-.js} +1 -1
  41. package/dist-embed/chunks/{nb-NO-T6EIAALU-CQe3vLx-.js → nb-NO-T6EIAALU-PoKJfg4d.js} +1 -1
  42. package/dist-embed/chunks/{nl-NL-IS3SIHDZ-DQ5lObK-.js → nl-NL-IS3SIHDZ-Cf4_wadm.js} +1 -1
  43. package/dist-embed/chunks/{nn-NO-6E72VCQL-JwOO_c6b.js → nn-NO-6E72VCQL-xgmyjeCA.js} +1 -1
  44. package/dist-embed/chunks/{oc-FR-POXYY2M6-OYZJk3Hj.js → oc-FR-POXYY2M6-CdWNnVCw.js} +1 -1
  45. package/dist-embed/chunks/{pa-IN-N4M65BXN-B7p6nOzS.js → pa-IN-N4M65BXN-QYWCqzud.js} +1 -1
  46. package/dist-embed/chunks/{percentages-BXMCSKIN-Cz9igCrb.js → percentages-BXMCSKIN-azlLrVPY.js} +3 -3
  47. package/dist-embed/chunks/{pl-PL-T2D74RX3-DiIfEp3O.js → pl-PL-T2D74RX3-CR9S6Ibc.js} +1 -1
  48. package/dist-embed/chunks/{pt-BR-5N22H2LF-7rqxomNz.js → pt-BR-5N22H2LF-BdXbK3ya.js} +1 -1
  49. package/dist-embed/chunks/{pt-PT-UZXXM6DQ-DE-uZxHk.js → pt-PT-UZXXM6DQ-2XA1j-L3.js} +1 -1
  50. package/dist-embed/chunks/{ro-RO-JPDTUUEW-BlMk-egr.js → ro-RO-JPDTUUEW-BtXn8ZEx.js} +1 -1
  51. package/dist-embed/chunks/{ru-RU-B4JR7IUQ-caVTslk_.js → ru-RU-B4JR7IUQ-CQX4iIyB.js} +1 -1
  52. package/dist-embed/chunks/{si-LK-N5RQ5JYF-DT4Sk0wC.js → si-LK-N5RQ5JYF-HKjZkrpb.js} +1 -1
  53. package/dist-embed/chunks/{sk-SK-C5VTKIMK-DS8_VUwQ.js → sk-SK-C5VTKIMK-D0qjylR3.js} +1 -1
  54. package/dist-embed/chunks/{sl-SI-NN7IZMDC-Dm37QL2T.js → sl-SI-NN7IZMDC-vxztaOUj.js} +1 -1
  55. package/dist-embed/chunks/{subset-shared.chunk-ByorZVMF.js → subset-shared.chunk-DEWjD_XG.js} +1 -1
  56. package/dist-embed/chunks/{subset-worker.chunk-CDbohCL0.js → subset-worker.chunk-DWTibNnY.js} +1 -1
  57. package/dist-embed/chunks/{sv-SE-XGPEYMSR-Ds2_OJfr.js → sv-SE-XGPEYMSR-N-SacX3h.js} +1 -1
  58. package/dist-embed/chunks/{ta-IN-2NMHFXQM-DalALtL3.js → ta-IN-2NMHFXQM-9GMEN3M3.js} +1 -1
  59. package/dist-embed/chunks/{th-TH-HPSO5L25-Db3wq-Mt.js → th-TH-HPSO5L25-CeESdLid.js} +1 -1
  60. package/dist-embed/chunks/{tr-TR-DEFEU3FU-BwZ2BWFh.js → tr-TR-DEFEU3FU-BjBigRhJ.js} +1 -1
  61. package/dist-embed/chunks/transformers.web-Br6X7w0a.js +42 -0
  62. package/dist-embed/chunks/{uk-UA-QMV73CPH-CvvKxEh4.js → uk-UA-QMV73CPH-v4nMobEN.js} +1 -1
  63. package/dist-embed/chunks/{vi-VN-M7AON7JQ-CWecJG5X.js → vi-VN-M7AON7JQ-D5thvMrO.js} +1 -1
  64. package/dist-embed/chunks/{zh-CN-LNUGB5OW-Bt8FQMA4.js → zh-CN-LNUGB5OW-Cn3ae1JT.js} +1 -1
  65. package/dist-embed/chunks/{zh-HK-E62DVLB3-D-aO7Cxy.js → zh-HK-E62DVLB3-OlNuka00.js} +1 -1
  66. package/dist-embed/chunks/{zh-TW-RAJ6MFWO-DhGr0I8R.js → zh-TW-RAJ6MFWO-DAwaB-Vu.js} +1 -1
  67. package/dist-embed/datalayer-app-main.js +6 -6
  68. package/lib/components/cards/ToolApprovalCard.js +5 -2
  69. package/lib/runtimes/variants.d.ts +10 -8
  70. package/lib/runtimes/variants.js +14 -9
  71. package/lib/specs/harnesses.js +11 -3
  72. package/lib/types/agentspecs.d.ts +2 -0
  73. package/package.json +1 -1
  74. package/scripts/codegen/generate_harnesses.py +2 -0
  75. package/dist-embed/chunks/transformers.web-CLaqP_Vm.js +0 -42
@@ -5,7 +5,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  */
6
6
  import { useState } from 'react';
7
7
  import { Button, Label, Text } from '@primer/react';
8
- import { Box } from '@datalayer/primer-addons';
8
+ import { Box, Card } from '@datalayer/primer-addons';
9
9
  import { CheckCircleIcon, ChevronDownIcon, EyeClosedIcon, EyeIcon, TrashIcon, XCircleIcon, } from '@primer/octicons-react';
10
10
  import { formatRelativeTime } from '@datalayer/core/lib/utils/index.js';
11
11
  export const TOOL_APPROVAL_STATUS_CONFIG = {
@@ -43,7 +43,10 @@ export function ToolApprovalCard({ approval, onApprove, onReject, onToggleRead,
43
43
  : approval.status === 'pending'
44
44
  ? ', review pending'
45
45
  : `, ${statusDescriptor}`;
46
- return (_jsx(Box, { p: 3, borderRadius: 2, border: "1px solid", borderColor: isRead ? 'transparent' : 'accent.muted', bg: isRead ? 'canvas.default' : 'accent.subtle', children: _jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 3, children: [_jsxs(Box, { flex: 1, minWidth: 0, children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, mb: 1, flexWrap: "wrap", children: [_jsx(Text, { sx: { fontWeight: 'bold', fontSize: 2 }, children: approval.toolName }), _jsx(Label, { variant: statusConfig.variant, children: statusConfig.label }), _jsx(Label, { variant: riskConfig.variant, children: riskConfig.label }), !isRead && _jsx(Label, { variant: "accent", children: "Unread" })] }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 0, display: 'block' }, children: ["Requested by ", approval.requestedBy, ' ', formatRelativeTime(approval.requestedAt), reviewSummary] }), _jsx(Box, { mt: 2, width: "100%", p: 2, borderRadius: 2, border: "1px solid", borderColor: "border.muted", bg: "canvas.subtle", children: _jsxs("details", { open: isDetailsExpanded, children: [_jsx("summary", { onClick: e => {
46
+ return (
47
+ // primer-addons' Card, as the other pages' rows: an unread request is the
48
+ // selected one (an accent border on an accent wash).
49
+ _jsx(Card, { border: true, shadow: "none", display: "block", p: 3, selected: !isRead, children: _jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 3, children: [_jsxs(Box, { flex: 1, minWidth: 0, children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, mb: 1, flexWrap: "wrap", children: [_jsx(Text, { sx: { fontWeight: 'bold', fontSize: 2 }, children: approval.toolName }), _jsx(Label, { variant: statusConfig.variant, children: statusConfig.label }), _jsx(Label, { variant: riskConfig.variant, children: riskConfig.label }), !isRead && _jsx(Label, { variant: "accent", children: "Unread" })] }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 0, display: 'block' }, children: ["Requested by ", approval.requestedBy, ' ', formatRelativeTime(approval.requestedAt), reviewSummary] }), _jsx(Box, { mt: 2, width: "100%", p: 2, borderRadius: 2, border: "1px solid", borderColor: "border.muted", bg: "canvas.subtle", children: _jsxs("details", { open: isDetailsExpanded, children: [_jsx("summary", { onClick: e => {
47
50
  e.preventDefault();
48
51
  setIsDetailsExpanded(prev => !prev);
49
52
  }, style: {
@@ -36,14 +36,16 @@ export declare const CUSTOM_HARNESS = "custom";
36
36
  * Why no variant runs an agent on this harness, in a sentence, or undefined
37
37
  * when one does.
38
38
  *
39
- * A harness of the catalogue (`agentspecs/harnesses`, SH-01) — Claude
40
- * Code, Codex, Gemini CLI, goose, OpenCode, OpenHands, fast-agent — is served
41
- * by the Datalayer runtime through its ACP adapter (`ACPAgent`, SH-10):
42
- * the runtime launches the harness as its subprocess, so the runtime's
43
- * locations run it and the browser, which has no process to launch, does not.
44
- * Two are refused: `custom`, which names no command in the shared catalogue
45
- * (an organization's own harness spec names it), and a harness neither built
46
- * in nor of the catalogue. Nothing runs such an agent in its place.
39
+ * A harness the catalogue offers (`agentspecs/harnesses`, SH-01) — Claude
40
+ * Code, Codex, OpenCode, Gemini CLI — is served by the Datalayer runtime
41
+ * through its ACP adapter (`ACPAgent`, SH-10): the runtime launches the
42
+ * harness as its subprocess, so the runtime's locations run it and the
43
+ * browser, which has no process to launch, does not. Three are refused:
44
+ * `custom`, which names no command in the shared catalogue (an
45
+ * organization's own harness spec names it), a harness the catalogue
46
+ * describes and does not offer (its `unavailable_because` is the sentence),
47
+ * and a harness neither built in nor of the catalogue. Nothing runs such an
48
+ * agent in its place.
47
49
  */
48
50
  export declare function unservedHarnessProblem(spec: Pick<Agentspec, 'id' | 'harness'>): string | undefined;
49
51
  /**
@@ -72,14 +72,16 @@ export const CUSTOM_HARNESS = 'custom';
72
72
  * Why no variant runs an agent on this harness, in a sentence, or undefined
73
73
  * when one does.
74
74
  *
75
- * A harness of the catalogue (`agentspecs/harnesses`, SH-01) — Claude
76
- * Code, Codex, Gemini CLI, goose, OpenCode, OpenHands, fast-agent — is served
77
- * by the Datalayer runtime through its ACP adapter (`ACPAgent`, SH-10):
78
- * the runtime launches the harness as its subprocess, so the runtime's
79
- * locations run it and the browser, which has no process to launch, does not.
80
- * Two are refused: `custom`, which names no command in the shared catalogue
81
- * (an organization's own harness spec names it), and a harness neither built
82
- * in nor of the catalogue. Nothing runs such an agent in its place.
75
+ * A harness the catalogue offers (`agentspecs/harnesses`, SH-01) — Claude
76
+ * Code, Codex, OpenCode, Gemini CLI — is served by the Datalayer runtime
77
+ * through its ACP adapter (`ACPAgent`, SH-10): the runtime launches the
78
+ * harness as its subprocess, so the runtime's locations run it and the
79
+ * browser, which has no process to launch, does not. Three are refused:
80
+ * `custom`, which names no command in the shared catalogue (an
81
+ * organization's own harness spec names it), a harness the catalogue
82
+ * describes and does not offer (its `unavailable_because` is the sentence),
83
+ * and a harness neither built in nor of the catalogue. Nothing runs such an
84
+ * agent in its place.
83
85
  */
84
86
  export function unservedHarnessProblem(spec) {
85
87
  const harness = spec.harness ?? '';
@@ -93,6 +95,9 @@ export function unservedHarnessProblem(spec) {
93
95
  if (harness === CUSTOM_HARNESS) {
94
96
  return `The agent “${spec.id}” runs on the harness “custom”, which names no command: an organization's own harness spec names it, and is never typed into a form.`;
95
97
  }
98
+ if (!catalogued.enabled) {
99
+ return `The agent “${spec.id}” runs on the harness “${harness}” (${catalogued.name}), which is not offered: ${catalogued.unavailable_because}`;
100
+ }
96
101
  return undefined;
97
102
  }
98
103
  /**
@@ -102,7 +107,7 @@ export function unservedHarnessProblem(spec) {
102
107
  export function isServedCatalogueHarness(harness) {
103
108
  return (harness !== CUSTOM_HARNESS &&
104
109
  !(harness in HARNESS_BY_SPEC_HARNESS) &&
105
- getHarness(harness) !== undefined);
110
+ getHarness(harness)?.enabled === true);
106
111
  }
107
112
  const VARIANT_BY_LEGACY_TARGET = {
108
113
  'backend-services': 'cloud-pydanticai',
@@ -8,6 +8,7 @@ export const CLAUDE_CODE_HARNESS_0_0_1 = {
8
8
  name: 'Claude Code',
9
9
  description: "Anthropic's coding agent, driven over ACP through the Agent Client Protocol project's adapter on the Claude Agent SDK.",
10
10
  enabled: true,
11
+ unavailable_because: '',
11
12
  tags: ['harness'],
12
13
  docs: 'https://github.com/agentclientprotocol/claude-agent-acp',
13
14
  acp: {
@@ -72,6 +73,7 @@ export const CODEX_HARNESS_0_0_1 = {
72
73
  name: 'Codex',
73
74
  description: "OpenAI's coding agent, driven over ACP through the Agent Client Protocol project's adapter, which ships the Codex binary it drives.",
74
75
  enabled: true,
76
+ unavailable_because: '',
75
77
  tags: ['harness'],
76
78
  docs: 'https://github.com/agentclientprotocol/codex-acp',
77
79
  acp: {
@@ -127,6 +129,7 @@ export const CUSTOM_HARNESS_0_0_1 = {
127
129
  name: 'Custom harness',
128
130
  description: "An organization's own ACP agent, its command named by the organization's own harness spec and never typed into a form.",
129
131
  enabled: false,
132
+ unavailable_because: '',
130
133
  tags: ['harness'],
131
134
  docs: '',
132
135
  requires: {
@@ -171,7 +174,8 @@ export const FAST_AGENT_HARNESS_0_0_1 = {
171
174
  version: '0.0.1',
172
175
  name: 'fast-agent',
173
176
  description: "llmindset's agent framework served over ACP; each agent it defines is a session mode, with any model provider it is configured with.",
174
- enabled: true,
177
+ enabled: false,
178
+ unavailable_because: 'the catalogue offers four harnesses today — Claude Code, Codex, OpenCode and Gemini CLI (28 October 2026); fast-agent is a framework served over ACP, not a coding agent, its adapter is a Python tool the runtime image does not carry, and it has not been drilled on Datalayer.',
175
179
  tags: ['harness', 'framework'],
176
180
  docs: 'https://github.com/evalstate/fast-agent/blob/main/docs/docs/acp/index.md',
177
181
  acp: {
@@ -227,6 +231,7 @@ export const GEMINI_CLI_HARNESS_0_0_1 = {
227
231
  name: 'Gemini CLI',
228
232
  description: "Google's coding agent, which speaks ACP itself when started with --experimental-acp.",
229
233
  enabled: true,
234
+ unavailable_because: '',
230
235
  tags: ['harness'],
231
236
  docs: 'https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/cli-reference.md',
232
237
  acp: {
@@ -282,7 +287,8 @@ export const GOOSE_HARNESS_0_0_1 = {
282
287
  version: '0.0.1',
283
288
  name: 'goose',
284
289
  description: "Block's open agent (now the Agentic AI Foundation's), which speaks ACP itself with goose acp; any model provider it is configured with.",
285
- enabled: true,
290
+ enabled: false,
291
+ unavailable_because: 'the catalogue offers four harnesses today — Claude Code, Codex, OpenCode and Gemini CLI (28 October 2026); goose is a binary of its own release, not an npm adapter, the runtime image does not carry it, and it has not been drilled on Datalayer.',
286
292
  tags: ['harness'],
287
293
  docs: 'https://block.github.io/goose/docs/gdk/acp/',
288
294
  acp: {
@@ -338,6 +344,7 @@ export const OPENCODE_HARNESS_0_0_1 = {
338
344
  name: 'OpenCode',
339
345
  description: "Anomaly's open coding agent, which speaks ACP itself with opencode acp; any model provider it is configured with.",
340
346
  enabled: true,
347
+ unavailable_because: '',
341
348
  tags: ['harness'],
342
349
  docs: 'https://opencode.ai/docs/acp/',
343
350
  acp: {
@@ -392,7 +399,8 @@ export const OPENHANDS_HARNESS_0_0_1 = {
392
399
  version: '0.0.1',
393
400
  name: 'OpenHands',
394
401
  description: 'The OpenHands CLI, which speaks ACP itself with openhands acp; any model provider it is configured with.',
395
- enabled: true,
402
+ enabled: false,
403
+ unavailable_because: "the catalogue offers four harnesses today — Claude Code, Codex, OpenCode and Gemini CLI (28 October 2026); OpenHands' adapter is a Python tool the runtime image does not carry, and it has not been drilled on Datalayer.",
396
404
  tags: ['harness'],
397
405
  docs: 'https://docs.openhands.dev/openhands/usage/run-openhands/acp',
398
406
  acp: {
@@ -409,6 +409,8 @@ export interface HarnessSpec {
409
409
  description: string;
410
410
  /** Whether the shared catalogue offers it: `custom` is not. */
411
411
  enabled: boolean;
412
+ /** Why it is not offered today, in a sentence said wherever it is named; set when `enabled` is false, and only then. */
413
+ unavailable_because: string;
412
414
  tags: string[];
413
415
  /** Where its ACP use is documented. */
414
416
  docs: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datalayer/agent-runtimes",
3
- "version": "1.5.86",
3
+ "version": "1.5.87",
4
4
  "type": "module",
5
5
  "workspaces": [
6
6
  ".",
@@ -184,6 +184,7 @@ def generate_python_code(specs: list[dict[str, Any]]) -> str:
184
184
  f" name={_s(spec['name'])},",
185
185
  f" description={_s(spec.get('description'))},",
186
186
  f" enabled={bool(spec.get('enabled', True))},",
187
+ f" unavailable_because={_s(spec.get('unavailable_because'))},",
187
188
  f" tags={json.dumps(list(spec.get('tags') or []))},",
188
189
  f" docs={_s(spec.get('docs'))},",
189
190
  ]
@@ -316,6 +317,7 @@ def generate_typescript_code(
316
317
  f" name: {_t(spec['name'])},",
317
318
  f" description: {_t(spec.get('description'))},",
318
319
  f" enabled: {json.dumps(bool(spec.get('enabled', True)))},",
320
+ f" unavailable_because: {_t(spec.get('unavailable_because'))},",
319
321
  f" tags: {json.dumps(list(spec.get('tags') or []))},",
320
322
  f" docs: {_t(spec.get('docs'))},",
321
323
  ]