@datalayer/agent-runtimes 1.5.28 โ†’ 1.5.31

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 (38) hide show
  1. package/dist-embed/chunks/{ChatView-C0PWJ_wj.js โ†’ ChatView-C_NOLqwI.js} +3 -3
  2. package/dist-embed/datalayer-app-main.js +83 -83
  3. package/lib/apps/apps/appspec.d.ts +0 -5
  4. package/lib/apps/apps/appspec.js +1 -6
  5. package/lib/apps/apps/checks.js +13 -9
  6. package/lib/apps/embed/element.js +14 -3
  7. package/lib/apps/embed/embedConfig.d.ts +1 -1
  8. package/lib/apps/embed/embedConfig.js +1 -1
  9. package/lib/apps/embed/visitorApp.d.ts +9 -2
  10. package/lib/apps/embed/visitorApp.js +9 -2
  11. package/lib/apps/plugins/chat/ChatView.js +4 -1
  12. package/lib/chat/base/ChatBase.js +12 -3
  13. package/lib/runtimes/variants.d.ts +42 -37
  14. package/lib/runtimes/variants.js +109 -9
  15. package/lib/specs/appspecSchema.js +2 -2
  16. package/lib/specs/envvars.d.ts +4 -0
  17. package/lib/specs/envvars.js +44 -0
  18. package/lib/specs/harnesses.d.ts +22 -0
  19. package/lib/specs/harnesses.js +372 -0
  20. package/lib/specs/index.d.ts +1 -0
  21. package/lib/specs/index.js +1 -0
  22. package/lib/specs/voices.js +42 -0
  23. package/lib/types/agentspecs.d.ts +70 -1
  24. package/lib/voice/ComposerVoice.d.ts +10 -2
  25. package/lib/voice/ComposerVoice.js +10 -2
  26. package/lib/voice/HandsFree.d.ts +55 -0
  27. package/lib/voice/HandsFree.js +211 -0
  28. package/lib/voice/chatVoice.d.ts +2 -1
  29. package/lib/voice/chatVoice.js +5 -3
  30. package/lib/voice/handsFree.d.ts +58 -0
  31. package/lib/voice/handsFree.js +48 -0
  32. package/lib/voice/index.d.ts +10 -2
  33. package/lib/voice/index.js +2 -0
  34. package/package.json +1 -1
  35. package/scripts/codegen/generate_agents.py +56 -0
  36. package/scripts/codegen/generate_envvars.py +3 -2
  37. package/scripts/codegen/generate_harnesses.py +329 -0
  38. package/scripts/voice/measure.py +74 -0
@@ -15,6 +15,16 @@ export const ALPHAVANTAGE_API_KEY_SPEC_0_0_1 = {
15
15
  icon: 'key',
16
16
  emoji: '๐Ÿ”‘',
17
17
  };
18
+ export const ANTHROPIC_API_KEY_SPEC_0_0_1 = {
19
+ id: 'ANTHROPIC_API_KEY',
20
+ version: '0.0.1',
21
+ name: 'Anthropic API Key',
22
+ description: "API key for Anthropic's Claude API. Required by the Claude Code harness, and by any harness configured with Anthropic as its model provider; the person's own, never a Claude.ai subscription login.",
23
+ registrationUrl: 'https://platform.claude.com/settings/keys',
24
+ tags: ['authentication', 'api-key', 'anthropic', 'harness'],
25
+ icon: 'key',
26
+ emoji: '๐Ÿ”‘',
27
+ };
18
28
  export const EARTHDATA_PASSWORD_SPEC_0_0_1 = {
19
29
  id: 'EARTHDATA_PASSWORD',
20
30
  version: '0.0.1',
@@ -35,6 +45,16 @@ export const EARTHDATA_USERNAME_SPEC_0_0_1 = {
35
45
  icon: 'key',
36
46
  emoji: '๐Ÿ”‘',
37
47
  };
48
+ export const GEMINI_API_KEY_SPEC_0_0_1 = {
49
+ id: 'GEMINI_API_KEY',
50
+ version: '0.0.1',
51
+ name: 'Gemini API Key',
52
+ description: "API key for Google's Gemini API. Required by the Gemini CLI harness in place of a Google login; the person's own.",
53
+ registrationUrl: 'https://aistudio.google.com/apikey',
54
+ tags: ['authentication', 'api-key', 'google', 'harness'],
55
+ icon: 'key',
56
+ emoji: '๐Ÿ”‘',
57
+ };
38
58
  export const GITHUB_TOKEN_SPEC_0_0_1 = {
39
59
  id: 'GITHUB_TOKEN',
40
60
  version: '0.0.1',
@@ -92,6 +112,26 @@ export const KAGGLE_API_TOKEN_SPEC_0_0_1 = {
92
112
  icon: 'key',
93
113
  emoji: '๐Ÿ”‘',
94
114
  };
115
+ export const LLM_API_KEY_SPEC_0_0_1 = {
116
+ id: 'LLM_API_KEY',
117
+ version: '0.0.1',
118
+ name: 'OpenHands LLM API Key',
119
+ description: "The model provider's key the OpenHands CLI reads, with LLM_MODEL, when started with --override-with-envs. Required by the OpenHands harness; the person's own key at their provider.",
120
+ registrationUrl: 'https://docs.openhands.dev/openhands/usage/cli/installation',
121
+ tags: ['authentication', 'api-key', 'openhands', 'harness'],
122
+ icon: 'key',
123
+ emoji: '๐Ÿ”‘',
124
+ };
125
+ export const OPENAI_API_KEY_SPEC_0_0_1 = {
126
+ id: 'OPENAI_API_KEY',
127
+ version: '0.0.1',
128
+ name: 'OpenAI API Key',
129
+ description: "API key for OpenAI's API. Required by the Codex harness, which takes it in place of a ChatGPT login; the person's own.",
130
+ registrationUrl: 'https://platform.openai.com/api-keys',
131
+ tags: ['authentication', 'api-key', 'openai', 'harness'],
132
+ icon: 'key',
133
+ emoji: '๐Ÿ”‘',
134
+ };
95
135
  export const SLACK_BOT_TOKEN_SPEC_0_0_1 = {
96
136
  id: 'SLACK_BOT_TOKEN',
97
137
  version: '0.0.1',
@@ -136,13 +176,17 @@ export const TAVILY_API_KEY_SPEC_0_0_1 = {
136
176
  // ============================================================================
137
177
  export const ENVVAR_CATALOG = {
138
178
  ALPHAVANTAGE_API_KEY: ALPHAVANTAGE_API_KEY_SPEC_0_0_1,
179
+ ANTHROPIC_API_KEY: ANTHROPIC_API_KEY_SPEC_0_0_1,
139
180
  EARTHDATA_PASSWORD: EARTHDATA_PASSWORD_SPEC_0_0_1,
140
181
  EARTHDATA_USERNAME: EARTHDATA_USERNAME_SPEC_0_0_1,
182
+ GEMINI_API_KEY: GEMINI_API_KEY_SPEC_0_0_1,
141
183
  GITHUB_TOKEN: GITHUB_TOKEN_SPEC_0_0_1,
142
184
  GOOGLE_OAUTH_CLIENT_ID: GOOGLE_OAUTH_CLIENT_ID_SPEC_0_0_1,
143
185
  GOOGLE_OAUTH_CLIENT_SECRET: GOOGLE_OAUTH_CLIENT_SECRET_SPEC_0_0_1,
144
186
  HF_TOKEN: HF_TOKEN_SPEC_0_0_1,
145
187
  KAGGLE_API_TOKEN: KAGGLE_API_TOKEN_SPEC_0_0_1,
188
+ LLM_API_KEY: LLM_API_KEY_SPEC_0_0_1,
189
+ OPENAI_API_KEY: OPENAI_API_KEY_SPEC_0_0_1,
146
190
  SLACK_BOT_TOKEN: SLACK_BOT_TOKEN_SPEC_0_0_1,
147
191
  SLACK_CHANNEL_IDS: SLACK_CHANNEL_IDS_SPEC_0_0_1,
148
192
  SLACK_TEAM_ID: SLACK_TEAM_ID_SPEC_0_0_1,
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Harness Catalog.
3
+ *
4
+ * An agent program driven over the Agent Client Protocol (SHIELD.md SH-01).
5
+ *
6
+ * This file is AUTO-GENERATED from YAML specifications.
7
+ * DO NOT EDIT MANUALLY - run 'make specs' to regenerate.
8
+ */
9
+ import type { HarnessSpec } from '../types/agentspecs';
10
+ export declare const CLAUDE_CODE_HARNESS_0_0_1: HarnessSpec;
11
+ export declare const CODEX_HARNESS_0_0_1: HarnessSpec;
12
+ export declare const CUSTOM_HARNESS_0_0_1: HarnessSpec;
13
+ export declare const FAST_AGENT_HARNESS_0_0_1: HarnessSpec;
14
+ export declare const GEMINI_CLI_HARNESS_0_0_1: HarnessSpec;
15
+ export declare const GOOSE_HARNESS_0_0_1: HarnessSpec;
16
+ export declare const OPENCODE_HARNESS_0_0_1: HarnessSpec;
17
+ export declare const OPENHANDS_HARNESS_0_0_1: HarnessSpec;
18
+ export declare const HARNESS_CATALOGUE: Record<string, HarnessSpec>;
19
+ /** A harness by id. */
20
+ export declare function getHarness(harnessId: string): HarnessSpec | undefined;
21
+ /** Every harness of the catalogue. */
22
+ export declare function listHarnesses(): HarnessSpec[];
@@ -0,0 +1,372 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ export const CLAUDE_CODE_HARNESS_0_0_1 = {
6
+ id: 'claude-code',
7
+ version: '0.0.1',
8
+ name: 'Claude Code',
9
+ description: "Anthropic's coding agent, driven over ACP through the Agent Client Protocol project's adapter on the Claude Agent SDK.",
10
+ enabled: true,
11
+ tags: ['harness'],
12
+ docs: 'https://github.com/agentclientprotocol/claude-agent-acp',
13
+ acp: {
14
+ command: 'npx',
15
+ args: ['-y', '@agentclientprotocol/claude-agent-acp@0.91.0'],
16
+ protocolVersion: 1,
17
+ loadSession: true,
18
+ mcp: 'lend',
19
+ modes: ['default', 'plan', 'acceptEdits', 'bypassPermissions'],
20
+ env: {},
21
+ },
22
+ requires: {
23
+ secrets: ['ANTHROPIC_API_KEY'],
24
+ binaries: ['node', 'git'],
25
+ },
26
+ terms: {
27
+ servedToThirdParties: 'api_key_only',
28
+ licence: 'Apache-2.0 (adapter); Anthropic Commercial Terms of Service (the agent)',
29
+ },
30
+ skills: {
31
+ format: 'skill-md',
32
+ dir: '.claude/skills',
33
+ },
34
+ honours: {
35
+ model: true,
36
+ subagents: false,
37
+ },
38
+ instructionsFile: 'CLAUDE.md',
39
+ registered: {
40
+ adapter: '@agentclientprotocol/claude-agent-acp',
41
+ version: '0.91.0',
42
+ licenceSource: 'https://www.npmjs.com/package/@agentclientprotocol/claude-agent-acp',
43
+ termsSource: 'https://code.claude.com/docs/en/legal-and-compliance',
44
+ credential: "An Anthropic API key (ANTHROPIC_API_KEY), the person's own",
45
+ binaries: 'Node 22 (engines.node >=22 on npm), git',
46
+ note: "Anthropic's legal page (read 2026-10-15): running Claude Code in hosted sandboxes or agent infrastructure requires the Commercial Terms; each end user authenticates with their own API key or subscription; developers may not route requests through Free, Pro or Max plan credentials on behalf of their users, nor collect or intermediate Claude.ai credentials. So only API keys are taken; a subscription login is refused. The npm package moved from @zed-industries (0.23.1, March 2026) to @agentclientprotocol.",
47
+ },
48
+ };
49
+ export const CODEX_HARNESS_0_0_1 = {
50
+ id: 'codex',
51
+ version: '0.0.1',
52
+ name: 'Codex',
53
+ description: "OpenAI's coding agent, driven over ACP through the Agent Client Protocol project's adapter, which ships the Codex binary it drives.",
54
+ enabled: true,
55
+ tags: ['harness'],
56
+ docs: 'https://github.com/agentclientprotocol/codex-acp',
57
+ acp: {
58
+ command: 'npx',
59
+ args: ['-y', '@agentclientprotocol/codex-acp@2.2.2'],
60
+ protocolVersion: 1,
61
+ loadSession: true,
62
+ mcp: 'lend',
63
+ modes: ['read-only', 'workspace-write', 'agent', 'agent-full-access'],
64
+ env: { NO_BROWSER: '1' },
65
+ },
66
+ requires: {
67
+ secrets: ['OPENAI_API_KEY'],
68
+ binaries: ['node', 'git'],
69
+ },
70
+ terms: {
71
+ servedToThirdParties: 'api_key_only',
72
+ licence: 'Apache-2.0 (adapter); OpenAI Terms of Use (the agent)',
73
+ },
74
+ skills: {
75
+ format: 'skill-md',
76
+ dir: '.agents/skills',
77
+ },
78
+ honours: {
79
+ model: true,
80
+ subagents: false,
81
+ },
82
+ instructionsFile: 'AGENTS.md',
83
+ registered: {
84
+ adapter: '@agentclientprotocol/codex-acp',
85
+ version: '2.2.2',
86
+ licenceSource: 'https://www.npmjs.com/package/@agentclientprotocol/codex-acp',
87
+ termsSource: 'https://learn.chatgpt.com/docs/auth',
88
+ credential: "An OpenAI API key (OPENAI_API_KEY or CODEX_API_KEY), the person's own",
89
+ binaries: "Node 22 (as the Agent Client Protocol project's adapters; unstated on npm), git",
90
+ note: "Codex's authentication page (read 2026-10-15) recommends API keys for automation and device-code login for headless machines; a ChatGPT login needs a browser and is hidden with NO_BROWSER=1 in the adapter. Only API keys are taken; a ChatGPT login is refused. The Zed-scoped package was archived on 22 July 2026 and names this one.",
91
+ },
92
+ };
93
+ export const CUSTOM_HARNESS_0_0_1 = {
94
+ id: 'custom',
95
+ version: '0.0.1',
96
+ name: 'Custom harness',
97
+ description: "An organization's own ACP agent, its command named by the organization's own harness spec and never typed into a form.",
98
+ enabled: false,
99
+ tags: ['harness'],
100
+ docs: '',
101
+ requires: {
102
+ secrets: [],
103
+ binaries: [],
104
+ },
105
+ terms: {
106
+ servedToThirdParties: 'organizations_own',
107
+ licence: "The organization's own",
108
+ },
109
+ skills: {
110
+ format: 'none',
111
+ dir: '',
112
+ },
113
+ honours: {
114
+ model: false,
115
+ subagents: false,
116
+ },
117
+ instructionsFile: '',
118
+ registered: {
119
+ adapter: "The organization's own",
120
+ version: '0',
121
+ licenceSource: 'https://agentspecs.datalayer.tech/harnesses',
122
+ termsSource: 'https://agentspecs.datalayer.tech/harnesses',
123
+ credential: "The organization's own",
124
+ binaries: '',
125
+ note: "Not launchable from the shared catalogue; an organization's own harness spec names the command and answers for its terms.",
126
+ },
127
+ };
128
+ export const FAST_AGENT_HARNESS_0_0_1 = {
129
+ id: 'fast-agent',
130
+ version: '0.0.1',
131
+ name: 'fast-agent',
132
+ description: "llmindset's agent framework served over ACP; each agent it defines is a session mode, with any model provider it is configured with.",
133
+ enabled: true,
134
+ tags: ['harness', 'framework'],
135
+ docs: 'https://github.com/evalstate/fast-agent/blob/main/docs/docs/acp/index.md',
136
+ acp: {
137
+ command: 'uvx',
138
+ args: ['fast-agent-acp==0.10.45'],
139
+ protocolVersion: 1,
140
+ loadSession: true,
141
+ mcp: 'lend',
142
+ modes: [],
143
+ env: {},
144
+ },
145
+ requires: {
146
+ secrets: ['ANTHROPIC_API_KEY'],
147
+ binaries: ['uvx'],
148
+ },
149
+ terms: {
150
+ servedToThirdParties: 'permitted',
151
+ licence: 'Apache-2.0',
152
+ },
153
+ skills: {
154
+ format: 'skill-md',
155
+ dir: '.agents/skills',
156
+ },
157
+ honours: {
158
+ model: true,
159
+ subagents: false,
160
+ },
161
+ instructionsFile: 'AGENTS.md',
162
+ registered: {
163
+ adapter: 'fast-agent-acp',
164
+ version: '0.10.45',
165
+ licenceSource: 'https://pypi.org/project/fast-agent-acp/',
166
+ termsSource: 'https://github.com/evalstate/fast-agent/blob/main/LICENSE',
167
+ credential: "The provider's key fast-agent is given (ANTHROPIC_API_KEY, OPENAI_API_KEY or HF_TOKEN); ANTHROPIC_API_KEY declared",
168
+ binaries: 'uv (uvx), Python 3.12 to 3.15 (requires_python on PyPI)',
169
+ note: "A framework, not a coding agent (SHIELD ยง2.5): each agent it defines is an ACP mode; the client's MCP servers are attached; sessions are listed. Launched with uvx fast-agent-acp (docs/docs/acp/index.md); reads skills from .fast-agent/skills, .agents/skills and .claude/skills; its default prompt reads AGENTS.md.",
170
+ },
171
+ };
172
+ export const GEMINI_CLI_HARNESS_0_0_1 = {
173
+ id: 'gemini-cli',
174
+ version: '0.0.1',
175
+ name: 'Gemini CLI',
176
+ description: "Google's coding agent, which speaks ACP itself when started with --experimental-acp.",
177
+ enabled: true,
178
+ tags: ['harness'],
179
+ docs: 'https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/cli-reference.md',
180
+ acp: {
181
+ command: 'npx',
182
+ args: ['-y', '@google/gemini-cli@0.64.0', '--experimental-acp'],
183
+ protocolVersion: 1,
184
+ loadSession: false,
185
+ mcp: 'lend',
186
+ modes: ['default', 'auto_edit', 'yolo', 'plan'],
187
+ env: {},
188
+ },
189
+ requires: {
190
+ secrets: ['GEMINI_API_KEY'],
191
+ binaries: ['node', 'git'],
192
+ },
193
+ terms: {
194
+ servedToThirdParties: 'api_key_only',
195
+ licence: 'Apache-2.0 (the agent); Gemini API or Gemini Code Assist terms (the model)',
196
+ tierRestrictions: 'Gemini Code Assist Standard or Enterprise for a Google login (the individuals tier stopped being served on 18 June 2026); a Gemini API key otherwise',
197
+ },
198
+ skills: {
199
+ format: 'skill-md',
200
+ dir: '.gemini/skills',
201
+ },
202
+ honours: {
203
+ model: true,
204
+ subagents: false,
205
+ },
206
+ instructionsFile: 'GEMINI.md',
207
+ registered: {
208
+ adapter: '@google/gemini-cli',
209
+ version: '0.64.0',
210
+ licenceSource: 'https://www.npmjs.com/package/@google/gemini-cli',
211
+ termsSource: 'https://developers.google.com/gemini-code-assist/resources/privacy-notice-gemini-code-assist-individuals',
212
+ credential: "A Gemini API key (GEMINI_API_KEY), the person's own; or a Google login on a Code Assist Standard or Enterprise subscription",
213
+ binaries: 'Node 20 or later (engines.node >=20 on npm), git',
214
+ note: 'Google\'s notice (read 2026-10-15): "Starting June 18, 2026, Gemini Code Assist IDE extensions stopped serving requests for the Gemini Code Assist for individuals"; Standard and Enterprise follow a separate schedule. The ACP flag is --experimental-acp in the CLI reference (docs/cli/cli-reference.md).',
215
+ },
216
+ };
217
+ export const GOOSE_HARNESS_0_0_1 = {
218
+ id: 'goose',
219
+ version: '0.0.1',
220
+ name: 'goose',
221
+ 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.",
222
+ enabled: true,
223
+ tags: ['harness'],
224
+ docs: 'https://block.github.io/goose/docs/gdk/acp/',
225
+ acp: {
226
+ command: 'goose',
227
+ args: ['acp'],
228
+ protocolVersion: 1,
229
+ loadSession: false,
230
+ mcp: 'lend',
231
+ modes: [],
232
+ env: { GOOSE_PROVIDER: 'anthropic' },
233
+ },
234
+ requires: {
235
+ secrets: ['ANTHROPIC_API_KEY'],
236
+ binaries: ['goose@1.54.0', 'git'],
237
+ },
238
+ terms: {
239
+ servedToThirdParties: 'permitted',
240
+ licence: 'Apache-2.0',
241
+ },
242
+ skills: {
243
+ format: 'skill-md',
244
+ dir: '.agents/skills',
245
+ },
246
+ honours: {
247
+ model: true,
248
+ subagents: false,
249
+ },
250
+ instructionsFile: '.goosehints',
251
+ registered: {
252
+ adapter: 'goose',
253
+ version: '1.54.0',
254
+ licenceSource: 'https://github.com/aaif-goose/goose',
255
+ termsSource: 'https://github.com/aaif-goose/goose/blob/main/LICENSE',
256
+ credential: "The provider's key goose is configured with (GOOSE_PROVIDER); ANTHROPIC_API_KEY declared",
257
+ binaries: 'The goose CLI (release v1.54.0 of 8 October 2026), git',
258
+ note: "Open source under Apache-2.0, no vendor terms of its own; the model provider's terms apply to the key. Launched as goose acp (documentation/docs/gdk/acp/index.md).",
259
+ },
260
+ };
261
+ export const OPENCODE_HARNESS_0_0_1 = {
262
+ id: 'opencode',
263
+ version: '0.0.1',
264
+ name: 'OpenCode',
265
+ description: "Anomaly's open coding agent, which speaks ACP itself with opencode acp; any model provider it is configured with.",
266
+ enabled: true,
267
+ tags: ['harness'],
268
+ docs: 'https://opencode.ai/docs/acp/',
269
+ acp: {
270
+ command: 'npx',
271
+ args: ['-y', 'opencode-ai@1.19.0', 'acp'],
272
+ protocolVersion: 1,
273
+ loadSession: false,
274
+ mcp: 'lend',
275
+ modes: [],
276
+ env: {},
277
+ },
278
+ requires: {
279
+ secrets: ['ANTHROPIC_API_KEY'],
280
+ binaries: ['node', 'git'],
281
+ },
282
+ terms: {
283
+ servedToThirdParties: 'permitted',
284
+ licence: 'MIT',
285
+ },
286
+ skills: {
287
+ format: 'skill-md',
288
+ dir: '.opencode/skills',
289
+ },
290
+ honours: {
291
+ model: true,
292
+ subagents: false,
293
+ },
294
+ instructionsFile: 'AGENTS.md',
295
+ registered: {
296
+ adapter: 'opencode-ai',
297
+ version: '1.19.0',
298
+ licenceSource: 'https://www.npmjs.com/package/opencode-ai',
299
+ termsSource: 'https://github.com/anomalyco/opencode/blob/dev/LICENSE',
300
+ credential: "The provider's key OpenCode is configured with; ANTHROPIC_API_KEY declared",
301
+ binaries: 'Node (the opencode-ai package), git',
302
+ note: "Open source under MIT, no vendor terms of its own; the model provider's terms apply to the key. Launched as opencode acp (opencode.ai/docs/acp); reads skills from .opencode/skills, .claude/skills and .agents/skills.",
303
+ },
304
+ };
305
+ export const OPENHANDS_HARNESS_0_0_1 = {
306
+ id: 'openhands',
307
+ version: '0.0.1',
308
+ name: 'OpenHands',
309
+ description: 'The OpenHands CLI, which speaks ACP itself with openhands acp; any model provider it is configured with.',
310
+ enabled: true,
311
+ tags: ['harness'],
312
+ docs: 'https://docs.openhands.dev/openhands/usage/run-openhands/acp',
313
+ acp: {
314
+ command: 'uvx',
315
+ args: [
316
+ '--from',
317
+ 'openhands==1.16.0',
318
+ 'openhands',
319
+ 'acp',
320
+ '--override-with-envs',
321
+ ],
322
+ protocolVersion: 1,
323
+ loadSession: true,
324
+ mcp: 'lend',
325
+ modes: ['always-ask', 'always-approve', 'llm-approve'],
326
+ env: {},
327
+ },
328
+ requires: {
329
+ secrets: ['LLM_API_KEY'],
330
+ binaries: ['uvx', 'git'],
331
+ },
332
+ terms: {
333
+ servedToThirdParties: 'permitted',
334
+ licence: 'MIT',
335
+ },
336
+ skills: {
337
+ format: 'skill-md',
338
+ dir: '.agents/skills',
339
+ },
340
+ honours: {
341
+ model: true,
342
+ subagents: false,
343
+ },
344
+ instructionsFile: 'AGENTS.md',
345
+ registered: {
346
+ adapter: 'openhands',
347
+ version: '1.16.0',
348
+ licenceSource: 'https://pypi.org/project/openhands/',
349
+ termsSource: 'https://github.com/OpenHands/OpenHands-CLI/blob/main/LICENSE',
350
+ credential: "The provider's key OpenHands reads as LLM_API_KEY, with LLM_MODEL, under --override-with-envs",
351
+ binaries: 'uv (uvx), Python 3.12 or later, git',
352
+ note: "Open source under MIT, no vendor terms of its own; the model provider's terms apply to the key. Launched as openhands acp (OpenHands-CLI README; docs.openhands.dev's ACP page); resumes with --resume; reads skills from .agents/skills (.openhands/skills is legacy).",
353
+ },
354
+ };
355
+ export const HARNESS_CATALOGUE = {
356
+ 'claude-code': CLAUDE_CODE_HARNESS_0_0_1,
357
+ codex: CODEX_HARNESS_0_0_1,
358
+ custom: CUSTOM_HARNESS_0_0_1,
359
+ 'fast-agent': FAST_AGENT_HARNESS_0_0_1,
360
+ 'gemini-cli': GEMINI_CLI_HARNESS_0_0_1,
361
+ goose: GOOSE_HARNESS_0_0_1,
362
+ opencode: OPENCODE_HARNESS_0_0_1,
363
+ openhands: OPENHANDS_HARNESS_0_0_1,
364
+ };
365
+ /** A harness by id. */
366
+ export function getHarness(harnessId) {
367
+ return HARNESS_CATALOGUE[harnessId];
368
+ }
369
+ /** Every harness of the catalogue. */
370
+ export function listHarnesses() {
371
+ return Object.values(HARNESS_CATALOGUE);
372
+ }
@@ -24,6 +24,7 @@ export * from './uiRenderers';
24
24
  export * from './protocols';
25
25
  export * from './frames';
26
26
  export * from './cogs';
27
+ export * from './harnesses';
27
28
  export * from './guards';
28
29
  export * from './gates';
29
30
  export * from './tracks';
@@ -28,6 +28,7 @@ export * from './uiRenderers';
28
28
  export * from './protocols';
29
29
  export * from './frames';
30
30
  export * from './cogs';
31
+ export * from './harnesses';
31
32
  export * from './guards';
32
33
  export * from './gates';
33
34
  export * from './tracks';
@@ -375,6 +375,48 @@ export const SPEECH_MODEL_CATALOGUE = {
375
375
  },
376
376
  ],
377
377
  },
378
+ 'whisper-small': {
379
+ id: 'whisper-small',
380
+ version: '0.0.1',
381
+ name: 'Whisper Small',
382
+ description: "Speech to text on Datalayer's servers for short spoken turns, on CPU: OpenAI's Whisper small (244M parameters, 99 languages), converted to CTranslate2 and run by faster-whisper, its weights quantized to 8 bits when loaded. About four times faster than large-v3-turbo; on the fixtures it hears English as well (3.3% against 2.4%) and French less well (16.1% against 2.6%). Recordings longer than a turn go to large-v3-turbo.",
383
+ provider: 'openai',
384
+ task: 'stt',
385
+ engine: 'faster-whisper',
386
+ dtype: 'float16',
387
+ languages: ['en', 'fr', 'es', 'it', 'pt', 'de', 'nl', 'ja', 'zh', 'hi'],
388
+ where: ['server'],
389
+ streaming: false,
390
+ licence: {
391
+ weights: 'MIT',
392
+ code: 'MIT',
393
+ },
394
+ attribution: '',
395
+ upstream: 'https://huggingface.co/openai/whisper-small',
396
+ revision: '536b0662742c02347bc0e980a01041f333bce120',
397
+ files: [
398
+ {
399
+ path: 'config.json',
400
+ sha256: 'b55496ac7940a7ae47d2c01eab40edfd8701feec1229d9cce3b40014383fb828',
401
+ size: 2370,
402
+ },
403
+ {
404
+ path: 'tokenizer.json',
405
+ sha256: 'fb7b63191e9bb045082c79fd742a3106a12c99513ab30df4a0d47fa6cb6fd0ab',
406
+ size: 2203239,
407
+ },
408
+ {
409
+ path: 'vocabulary.txt',
410
+ sha256: '34ce3fe1c5041027b3f8d42912270993f986dbc4bb34cf27f951e34a1e453913',
411
+ size: 459861,
412
+ },
413
+ {
414
+ path: 'model.bin',
415
+ sha256: '3e305921506d8872816023e4c273e75d2419fb89b24da97b4fe7bce14170d671',
416
+ size: 483546902,
417
+ },
418
+ ],
419
+ },
378
420
  };
379
421
  /** Whether a voice speaks a language: `fr` and `fr-FR` are spoken by a `fr-FR` voice. */
380
422
  export function voiceSpeaks(voice, language) {
@@ -204,6 +204,75 @@ export interface ProtocolSpec {
204
204
  /** The Appspec block it configures, if any: refused unless `protocols` lists it. */
205
205
  appspecBlock?: 'pap' | 'pact' | 'a2a' | 'signed_fetch';
206
206
  }
207
+ /** How a harness is launched and driven over ACP (SHIELD.md ยง3.1). */
208
+ export interface HarnessAcpSpec {
209
+ /** The executable, as the runtime image has it. */
210
+ command: string;
211
+ /** Its arguments, the adapter's version pinned among them. */
212
+ args: string[];
213
+ protocolVersion: number;
214
+ /** Whether it answers `session/load`. */
215
+ loadSession: boolean;
216
+ /** `lend`: the Shield lends MCP servers through the gateway; `own`; or `none`. */
217
+ mcp: 'lend' | 'own' | 'none';
218
+ /** The session modes it advertises, as it names them. */
219
+ modes: string[];
220
+ /** Plain variables the launch needs, never a secret. */
221
+ env: Record<string, string>;
222
+ }
223
+ /**
224
+ * An agent program driven over the Agent Client Protocol
225
+ * (`agentspecs/harnesses`, SHIELD.md SH-01). An agent spec's `harness:` names
226
+ * one beside `pydantic-ai` and `vercel-ai`; the Datalayer runtime serves it
227
+ * through its ACP adapter, `ACPAgent` (SHIELD SH-10), never the browser.
228
+ */
229
+ export interface HarnessSpec {
230
+ /** What `harness:` names (e.g. 'claude-code'). */
231
+ id: string;
232
+ version: string;
233
+ name: string;
234
+ description: string;
235
+ /** Whether the shared catalogue offers it: `custom` is not. */
236
+ enabled: boolean;
237
+ tags: string[];
238
+ /** Where its ACP use is documented. */
239
+ docs: string;
240
+ /** Absent only on `custom`, whose command an organization's own spec names. */
241
+ acp?: HarnessAcpSpec;
242
+ /** What it needs in the pod: secrets as ids of the env-vars catalogue, executables. */
243
+ requires: {
244
+ secrets: string[];
245
+ binaries: string[];
246
+ };
247
+ /** The terms it is served under, as the register says them (ยง3.3). */
248
+ terms: {
249
+ servedToThirdParties: 'api_key_only' | 'permitted' | 'refused' | 'organizations_own';
250
+ licence: string;
251
+ tierRestrictions?: string;
252
+ };
253
+ /** Where the Shield writes an application's skills for it (ยง4.10). */
254
+ skills: {
255
+ format: 'skill-md' | 'none';
256
+ dir: string;
257
+ };
258
+ /** What of an agent spec it can honour; the rest is refused at load. */
259
+ honours: {
260
+ model: boolean;
261
+ subagents: boolean;
262
+ };
263
+ /** The workspace file it reads its instructions from. */
264
+ instructionsFile: string;
265
+ /** The register's line: what was checked, and where. */
266
+ registered: {
267
+ adapter: string;
268
+ version: string;
269
+ licenceSource: string;
270
+ termsSource: string;
271
+ credential: string;
272
+ binaries: string;
273
+ note: string;
274
+ };
275
+ }
207
276
  /** A check a Frame requires of the output of work done under it. */
208
277
  export interface FrameGuardSpec {
209
278
  id: string;
@@ -958,7 +1027,7 @@ export interface AppPageSpec {
958
1027
  export interface AppVoiceSpec {
959
1028
  enabled: boolean;
960
1029
  /** `hands_free` (VO-12) is refused until it is built. */
961
- input: 'off' | 'push_to_talk';
1030
+ input: 'off' | 'push_to_talk' | 'hands_free';
962
1031
  output: 'off' | 'on_request' | 'always';
963
1032
  voice: string;
964
1033
  language: string;
@@ -7,7 +7,9 @@
7
7
  * person to edit and send โ€” or sent at once with *Send what I say*. While
8
8
  * the words are still being heard the host is told (`onInterimChange`), to
9
9
  * grey them until they are final (VO-11). Beside the microphone, the
10
- * person's voice menu (`VoiceMenu`, VO-30).
10
+ * person's voice menu (`VoiceMenu`, VO-30). Where the application's voice
11
+ * says `hands_free`, *Talk with it* too (`HandsFree`, VO-12, VO-13): a turn
12
+ * is sent by itself and the agent's answer may be spoken over.
11
13
  *
12
14
  * @module voice/ComposerVoice
13
15
  */
@@ -29,6 +31,12 @@ export interface ComposerVoiceProps {
29
31
  speaking?: boolean;
30
32
  /** Stops the agent's voice, also when the microphone opens (VO-13). */
31
33
  onStopSpeaking?: () => void;
34
+ /** The agent is answering: a run is in progress (hands-free, VO-12). */
35
+ running?: boolean;
36
+ /** Stops the run while the answer is still being written (barge-in, VO-13). */
37
+ onStopRun?: () => void;
38
+ /** The answer being written was spoken over: marked in the conversation (VO-13). */
39
+ onInterrupted?: () => void;
32
40
  /**
33
41
  * The words in the box are still being heard (`true`), or final
34
42
  * (`false`): the host greys them until they are (VO-11).
@@ -42,5 +50,5 @@ export interface ComposerVoiceProps {
42
50
  }
43
51
  /** Whether something rides on a run as a spoken message's metadata (VO-27). */
44
52
  export declare function spokenOf(value: unknown): SpokenMetadata | undefined;
45
- export declare function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled, speaking, onStopSpeaking, onInterimChange, answers, }: ComposerVoiceProps): JSX.Element | null;
53
+ export declare function ComposerVoice({ voice, input, setInput, onSpoken, send, disabled, speaking, onStopSpeaking, running, onStopRun, onInterrupted, onInterimChange, answers, }: ComposerVoiceProps): JSX.Element | null;
46
54
  export default ComposerVoice;