@contractspec/lib.ai-agent 7.0.10 → 8.0.0

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 (77) hide show
  1. package/README.md +45 -4
  2. package/dist/agent/agent-factory.d.ts +14 -3
  3. package/dist/agent/agent-factory.js +653 -113
  4. package/dist/agent/contract-spec-agent.d.ts +16 -2
  5. package/dist/agent/contract-spec-agent.js +649 -112
  6. package/dist/agent/index.js +660 -118
  7. package/dist/agent/json-runner.d.ts +1 -1
  8. package/dist/agent/json-runner.js +649 -112
  9. package/dist/agent/unified-agent.d.ts +2 -2
  10. package/dist/agent/unified-agent.js +660 -118
  11. package/dist/approval/index.js +6 -1
  12. package/dist/approval/workflow.js +5 -1
  13. package/dist/exporters/claude-agent-exporter.d.ts +1 -1
  14. package/dist/exporters/claude-agent-exporter.js +3 -51
  15. package/dist/exporters/index.js +8 -54
  16. package/dist/exporters/opencode-exporter.d.ts +1 -1
  17. package/dist/exporters/opencode-exporter.js +3 -51
  18. package/dist/exporters/types.d.ts +1 -1
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.js +3805 -71
  21. package/dist/interop/index.js +3 -51
  22. package/dist/interop/spec-consumer.d.ts +1 -1
  23. package/dist/interop/spec-consumer.js +3 -51
  24. package/dist/interop/tool-consumer.d.ts +1 -1
  25. package/dist/interop/types.d.ts +1 -1
  26. package/dist/knowledge/injector.d.ts +1 -1
  27. package/dist/node/agent/agent-factory.js +653 -113
  28. package/dist/node/agent/contract-spec-agent.js +649 -112
  29. package/dist/node/agent/index.js +660 -118
  30. package/dist/node/agent/json-runner.js +649 -112
  31. package/dist/node/agent/unified-agent.js +660 -118
  32. package/dist/node/approval/index.js +6 -1
  33. package/dist/node/approval/workflow.js +5 -1
  34. package/dist/node/exporters/claude-agent-exporter.js +3 -51
  35. package/dist/node/exporters/index.js +8 -54
  36. package/dist/node/exporters/opencode-exporter.js +3 -51
  37. package/dist/node/index.js +3805 -71
  38. package/dist/node/interop/index.js +3 -51
  39. package/dist/node/interop/spec-consumer.js +3 -51
  40. package/dist/node/providers/claude-agent-sdk/adapter.js +3 -51
  41. package/dist/node/providers/claude-agent-sdk/index.js +3 -51
  42. package/dist/node/providers/index.js +8 -53
  43. package/dist/node/providers/opencode-sdk/adapter.js +4 -51
  44. package/dist/node/providers/opencode-sdk/index.js +4 -51
  45. package/dist/node/telemetry/adapter.js +2 -0
  46. package/dist/node/telemetry/index.js +2 -0
  47. package/dist/providers/claude-agent-sdk/adapter.d.ts +1 -1
  48. package/dist/providers/claude-agent-sdk/adapter.js +3 -51
  49. package/dist/providers/claude-agent-sdk/index.js +3 -51
  50. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +1 -8
  51. package/dist/providers/index.js +8 -53
  52. package/dist/providers/opencode-sdk/adapter.d.ts +1 -13
  53. package/dist/providers/opencode-sdk/adapter.js +4 -51
  54. package/dist/providers/opencode-sdk/agent-bridge.d.ts +1 -10
  55. package/dist/providers/opencode-sdk/index.js +4 -51
  56. package/dist/providers/opencode-sdk/tool-bridge.d.ts +1 -4
  57. package/dist/providers/types.d.ts +1 -8
  58. package/dist/session/store.d.ts +2 -2
  59. package/dist/telemetry/adapter.d.ts +1 -0
  60. package/dist/telemetry/adapter.js +2 -0
  61. package/dist/telemetry/index.js +2 -0
  62. package/dist/tools/knowledge-tool.d.ts +1 -1
  63. package/dist/tools/mcp-server.d.ts +1 -1
  64. package/dist/tools/operation-tool-handler.d.ts +1 -1
  65. package/dist/tools/tool-adapter.d.ts +1 -1
  66. package/dist/types.d.ts +13 -0
  67. package/package.json +7 -43
  68. package/dist/node/spec/index.js +0 -2233
  69. package/dist/node/spec/registry.js +0 -2178
  70. package/dist/node/spec/spec.js +0 -2188
  71. package/dist/spec/index.d.ts +0 -2
  72. package/dist/spec/index.js +0 -2233
  73. package/dist/spec/registry.d.ts +0 -41
  74. package/dist/spec/registry.js +0 -2178
  75. package/dist/spec/spec.d.ts +0 -218
  76. package/dist/spec/spec.js +0 -2188
  77. package/dist/spec/spec.test.d.ts +0 -1
@@ -2131,56 +2131,6 @@ var init_i18n = __esm(() => {
2131
2131
  init_messages();
2132
2132
  });
2133
2133
 
2134
- // src/spec/spec.ts
2135
- function defineAgent(spec) {
2136
- const i18n = createAgentI18n(spec.locale);
2137
- if (!spec.meta?.key) {
2138
- throw new Error(i18n.t("error.agentKeyRequired"));
2139
- }
2140
- if (typeof spec.meta.version !== "string") {
2141
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2142
- }
2143
- if (!spec.instructions?.trim()) {
2144
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2145
- }
2146
- if (!spec.tools?.length) {
2147
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2148
- }
2149
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2150
- if (portRef !== undefined && portRef.trim().length === 0) {
2151
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2152
- }
2153
- }
2154
- const toolNames = new Set;
2155
- for (const tool of spec.tools) {
2156
- if (toolNames.has(tool.name)) {
2157
- throw new Error(i18n.t("error.agentDuplicateTool", {
2158
- key: spec.meta.key,
2159
- name: tool.name
2160
- }));
2161
- }
2162
- toolNames.add(tool.name);
2163
- if (tool.subagentRef && tool.operationRef) {
2164
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2165
- }
2166
- const outputRefCount = [
2167
- tool.outputPresentation,
2168
- tool.outputForm,
2169
- tool.outputDataView
2170
- ].filter(Boolean).length;
2171
- if (outputRefCount > 1) {
2172
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2173
- }
2174
- }
2175
- return Object.freeze(spec);
2176
- }
2177
- function agentKey(meta) {
2178
- return `${meta.key}.v${meta.version}`;
2179
- }
2180
- var init_spec = __esm(() => {
2181
- init_i18n();
2182
- });
2183
-
2184
2134
  // src/providers/claude-agent-sdk/tool-bridge.ts
2185
2135
  function specToolToClaudeAgentTool(tool, handler, context) {
2186
2136
  return {
@@ -2408,7 +2358,9 @@ var init_tool_bridge2 = __esm(() => {
2408
2358
  });
2409
2359
  // src/interop/spec-consumer.ts
2410
2360
  init_i18n();
2411
- init_spec();
2361
+ import {
2362
+ agentKey
2363
+ } from "@contractspec/lib.contracts-spec/agent";
2412
2364
 
2413
2365
  class ContractSpecConsumer {
2414
2366
  specs;
@@ -2131,59 +2131,11 @@ var init_i18n = __esm(() => {
2131
2131
  init_messages();
2132
2132
  });
2133
2133
 
2134
- // src/spec/spec.ts
2135
- function defineAgent(spec) {
2136
- const i18n = createAgentI18n(spec.locale);
2137
- if (!spec.meta?.key) {
2138
- throw new Error(i18n.t("error.agentKeyRequired"));
2139
- }
2140
- if (typeof spec.meta.version !== "string") {
2141
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2142
- }
2143
- if (!spec.instructions?.trim()) {
2144
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2145
- }
2146
- if (!spec.tools?.length) {
2147
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2148
- }
2149
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2150
- if (portRef !== undefined && portRef.trim().length === 0) {
2151
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2152
- }
2153
- }
2154
- const toolNames = new Set;
2155
- for (const tool of spec.tools) {
2156
- if (toolNames.has(tool.name)) {
2157
- throw new Error(i18n.t("error.agentDuplicateTool", {
2158
- key: spec.meta.key,
2159
- name: tool.name
2160
- }));
2161
- }
2162
- toolNames.add(tool.name);
2163
- if (tool.subagentRef && tool.operationRef) {
2164
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2165
- }
2166
- const outputRefCount = [
2167
- tool.outputPresentation,
2168
- tool.outputForm,
2169
- tool.outputDataView
2170
- ].filter(Boolean).length;
2171
- if (outputRefCount > 1) {
2172
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2173
- }
2174
- }
2175
- return Object.freeze(spec);
2176
- }
2177
- function agentKey(meta) {
2178
- return `${meta.key}.v${meta.version}`;
2179
- }
2180
- var init_spec = __esm(() => {
2181
- init_i18n();
2182
- });
2183
-
2184
2134
  // src/interop/spec-consumer.ts
2185
2135
  init_i18n();
2186
- init_spec();
2136
+ import {
2137
+ agentKey
2138
+ } from "@contractspec/lib.contracts-spec/agent";
2187
2139
 
2188
2140
  class ContractSpecConsumer {
2189
2141
  specs;
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/tools/mcp-client-helpers.ts
2239
2189
  import {
2240
2190
  Experimental_StdioMCPTransport as StdioClientTransport
@@ -2664,6 +2614,9 @@ var init_tool_bridge = __esm(() => {
2664
2614
 
2665
2615
  // src/providers/claude-agent-sdk/adapter.ts
2666
2616
  import { randomUUID } from "node:crypto";
2617
+ import {
2618
+ agentKey
2619
+ } from "@contractspec/lib.contracts-spec/agent";
2667
2620
 
2668
2621
  class ClaudeAgentSDKProvider {
2669
2622
  name = "claude-agent-sdk";
@@ -3019,7 +2972,6 @@ ${params.systemOverride}` : context.spec.instructions;
3019
2972
  var init_adapter = __esm(() => {
3020
2973
  init_i18n();
3021
2974
  init_injector();
3022
- init_spec();
3023
2975
  init_mcp_client();
3024
2976
  init_types();
3025
2977
  init_tool_bridge();
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/tools/mcp-client-helpers.ts
2239
2189
  import {
2240
2190
  Experimental_StdioMCPTransport as StdioClientTransport
@@ -2664,6 +2614,9 @@ var init_tool_bridge = __esm(() => {
2664
2614
 
2665
2615
  // src/providers/claude-agent-sdk/adapter.ts
2666
2616
  import { randomUUID } from "node:crypto";
2617
+ import {
2618
+ agentKey
2619
+ } from "@contractspec/lib.contracts-spec/agent";
2667
2620
 
2668
2621
  class ClaudeAgentSDKProvider {
2669
2622
  name = "claude-agent-sdk";
@@ -3019,7 +2972,6 @@ ${params.systemOverride}` : context.spec.instructions;
3019
2972
  var init_adapter = __esm(() => {
3020
2973
  init_i18n();
3021
2974
  init_injector();
3022
- init_spec();
3023
2975
  init_mcp_client();
3024
2976
  init_types();
3025
2977
  init_tool_bridge();
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/tools/mcp-client-helpers.ts
2239
2189
  import {
2240
2190
  Experimental_StdioMCPTransport as StdioClientTransport
@@ -2664,6 +2614,9 @@ var init_tool_bridge = __esm(() => {
2664
2614
 
2665
2615
  // src/providers/claude-agent-sdk/adapter.ts
2666
2616
  import { randomUUID } from "node:crypto";
2617
+ import {
2618
+ agentKey
2619
+ } from "@contractspec/lib.contracts-spec/agent";
2667
2620
 
2668
2621
  class ClaudeAgentSDKProvider {
2669
2622
  name = "claude-agent-sdk";
@@ -3019,7 +2972,6 @@ ${params.systemOverride}` : context.spec.instructions;
3019
2972
  var init_adapter = __esm(() => {
3020
2973
  init_i18n();
3021
2974
  init_injector();
3022
- init_spec();
3023
2975
  init_mcp_client();
3024
2976
  init_types();
3025
2977
  init_tool_bridge();
@@ -3342,6 +3294,10 @@ var init_agent_bridge = __esm(() => {
3342
3294
  });
3343
3295
 
3344
3296
  // src/providers/opencode-sdk/adapter.ts
3297
+ import {
3298
+ agentKey as agentKey2
3299
+ } from "@contractspec/lib.contracts-spec/agent";
3300
+
3345
3301
  class OpenCodeSDKProvider {
3346
3302
  name = "opencode-sdk";
3347
3303
  version = "1.0.0";
@@ -3392,7 +3348,7 @@ class OpenCodeSDKProvider {
3392
3348
  toolSet[tool.name] = specToolToExternalToolForOpenCode(tool);
3393
3349
  }
3394
3350
  const instructions = await injectStaticKnowledge(spec.instructions, spec.knowledge ?? [], undefined);
3395
- const contextId = `opencode-${agentKey(spec.meta)}-${Date.now()}`;
3351
+ const contextId = `opencode-${agentKey2(spec.meta)}-${Date.now()}`;
3396
3352
  const metadata = {
3397
3353
  sessionId: session.id,
3398
3354
  agentType: this.config.agentType ?? inferAgentType(spec),
@@ -3607,7 +3563,6 @@ ${params.systemOverride}` : context.spec.instructions;
3607
3563
  var init_adapter2 = __esm(() => {
3608
3564
  init_i18n();
3609
3565
  init_injector();
3610
- init_spec();
3611
3566
  init_types();
3612
3567
  init_agent_bridge();
3613
3568
  init_tool_bridge2();
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/providers/types.ts
2239
2189
  var ExternalProviderError, ProviderNotAvailableError, ProviderExecutionError, ContextCreationError;
2240
2190
  var init_types = __esm(() => {
@@ -2562,6 +2512,10 @@ var init_agent_bridge = __esm(() => {
2562
2512
  });
2563
2513
 
2564
2514
  // src/providers/opencode-sdk/adapter.ts
2515
+ import {
2516
+ agentKey
2517
+ } from "@contractspec/lib.contracts-spec/agent";
2518
+
2565
2519
  class OpenCodeSDKProvider {
2566
2520
  name = "opencode-sdk";
2567
2521
  version = "1.0.0";
@@ -2827,7 +2781,6 @@ ${params.systemOverride}` : context.spec.instructions;
2827
2781
  var init_adapter = __esm(() => {
2828
2782
  init_i18n();
2829
2783
  init_injector();
2830
- init_spec();
2831
2784
  init_types();
2832
2785
  init_agent_bridge();
2833
2786
  init_tool_bridge();
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/providers/types.ts
2239
2189
  var ExternalProviderError, ProviderNotAvailableError, ProviderExecutionError, ContextCreationError;
2240
2190
  var init_types = __esm(() => {
@@ -2562,6 +2512,10 @@ var init_agent_bridge = __esm(() => {
2562
2512
  });
2563
2513
 
2564
2514
  // src/providers/opencode-sdk/adapter.ts
2515
+ import {
2516
+ agentKey
2517
+ } from "@contractspec/lib.contracts-spec/agent";
2518
+
2565
2519
  class OpenCodeSDKProvider {
2566
2520
  name = "opencode-sdk";
2567
2521
  version = "1.0.0";
@@ -2827,7 +2781,6 @@ ${params.systemOverride}` : context.spec.instructions;
2827
2781
  var init_adapter = __esm(() => {
2828
2782
  init_i18n();
2829
2783
  init_injector();
2830
- init_spec();
2831
2784
  init_types();
2832
2785
  init_agent_bridge();
2833
2786
  init_tool_bridge();
@@ -83,6 +83,7 @@ async function trackAgentStep(collector, agentId, step, durationMs, context) {
83
83
  agentId,
84
84
  actorId: context?.actorId,
85
85
  tenantId: context?.tenantId,
86
+ workflowId: context?.workflowId,
86
87
  stepIndex: context?.stepIndex,
87
88
  toolName: toolCall.toolName,
88
89
  toolCallArgs: toolCall.input,
@@ -108,6 +109,7 @@ async function trackAgentStep(collector, agentId, step, durationMs, context) {
108
109
  agentId,
109
110
  actorId: context?.actorId,
110
111
  tenantId: context?.tenantId,
112
+ workflowId: context?.workflowId,
111
113
  stepIndex: context?.stepIndex,
112
114
  stepStartedAt: context?.stepStartedAt,
113
115
  finishReason: step.finishReason,
@@ -2198,6 +2198,7 @@ async function trackAgentStep(collector, agentId, step, durationMs, context) {
2198
2198
  agentId,
2199
2199
  actorId: context?.actorId,
2200
2200
  tenantId: context?.tenantId,
2201
+ workflowId: context?.workflowId,
2201
2202
  stepIndex: context?.stepIndex,
2202
2203
  toolName: toolCall.toolName,
2203
2204
  toolCallArgs: toolCall.input,
@@ -2223,6 +2224,7 @@ async function trackAgentStep(collector, agentId, step, durationMs, context) {
2223
2224
  agentId,
2224
2225
  actorId: context?.actorId,
2225
2226
  tenantId: context?.tenantId,
2227
+ workflowId: context?.workflowId,
2226
2228
  stepIndex: context?.stepIndex,
2227
2229
  stepStartedAt: context?.stepStartedAt,
2228
2230
  finishReason: step.finishReason,
@@ -10,7 +10,7 @@
10
10
  * This adapter wraps @anthropic-ai/claude-agent-sdk to work as a backend
11
11
  * for ContractSpec agents.
12
12
  */
13
- import type { AgentSpec } from '../../spec/spec';
13
+ import { type AgentSpec } from '@contractspec/lib.contracts-spec/agent';
14
14
  import type { ClaudeAgentSDKConfig, ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalStreamChunk } from '../types';
15
15
  /**
16
16
  * Claude Agent SDK Provider implementation.
@@ -2185,56 +2185,6 @@ var init_injector = __esm(() => {
2185
2185
  init_i18n();
2186
2186
  });
2187
2187
 
2188
- // src/spec/spec.ts
2189
- function defineAgent(spec) {
2190
- const i18n = createAgentI18n(spec.locale);
2191
- if (!spec.meta?.key) {
2192
- throw new Error(i18n.t("error.agentKeyRequired"));
2193
- }
2194
- if (typeof spec.meta.version !== "string") {
2195
- throw new Error(i18n.t("error.agentMissingVersion", { key: spec.meta.key }));
2196
- }
2197
- if (!spec.instructions?.trim()) {
2198
- throw new Error(i18n.t("error.agentRequiresInstructions", { key: spec.meta.key }));
2199
- }
2200
- if (!spec.tools?.length) {
2201
- throw new Error(i18n.t("error.agentRequiresTool", { key: spec.meta.key }));
2202
- }
2203
- for (const [portName, portRef] of Object.entries(spec.runtime?.ports ?? {})) {
2204
- if (portRef !== undefined && portRef.trim().length === 0) {
2205
- throw new Error(`Agent ${spec.meta.key} has invalid runtime config: port "${portName}" must not be empty`);
2206
- }
2207
- }
2208
- const toolNames = new Set;
2209
- for (const tool of spec.tools) {
2210
- if (toolNames.has(tool.name)) {
2211
- throw new Error(i18n.t("error.agentDuplicateTool", {
2212
- key: spec.meta.key,
2213
- name: tool.name
2214
- }));
2215
- }
2216
- toolNames.add(tool.name);
2217
- if (tool.subagentRef && tool.operationRef) {
2218
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" cannot have both subagentRef and operationRef. Use one.`);
2219
- }
2220
- const outputRefCount = [
2221
- tool.outputPresentation,
2222
- tool.outputForm,
2223
- tool.outputDataView
2224
- ].filter(Boolean).length;
2225
- if (outputRefCount > 1) {
2226
- throw new Error(`Agent ${spec.meta.key} tool "${tool.name}" has multiple output refs (outputPresentation, outputForm, outputDataView). Use at most one.`);
2227
- }
2228
- }
2229
- return Object.freeze(spec);
2230
- }
2231
- function agentKey(meta) {
2232
- return `${meta.key}.v${meta.version}`;
2233
- }
2234
- var init_spec = __esm(() => {
2235
- init_i18n();
2236
- });
2237
-
2238
2188
  // src/tools/mcp-client-helpers.ts
2239
2189
  import {
2240
2190
  Experimental_StdioMCPTransport as StdioClientTransport
@@ -2664,6 +2614,9 @@ var init_tool_bridge = __esm(() => {
2664
2614
 
2665
2615
  // src/providers/claude-agent-sdk/adapter.ts
2666
2616
  import { randomUUID } from "crypto";
2617
+ import {
2618
+ agentKey
2619
+ } from "@contractspec/lib.contracts-spec/agent";
2667
2620
 
2668
2621
  class ClaudeAgentSDKProvider {
2669
2622
  name = "claude-agent-sdk";
@@ -3019,7 +2972,6 @@ ${params.systemOverride}` : context.spec.instructions;
3019
2972
  var init_adapter = __esm(() => {
3020
2973
  init_i18n();
3021
2974
  init_injector();
3022
- init_spec();
3023
2975
  init_mcp_client();
3024
2976
  init_types();
3025
2977
  init_tool_bridge();