@bluefly/openstandardagents 0.4.9 → 0.5.1

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 (259) hide show
  1. package/.version.json +3 -3
  2. package/CHANGELOG.md +35 -4
  3. package/README.md +77 -62
  4. package/dist/.version.json +3 -3
  5. package/dist/adapters/a2a/a2a-protocol.js +4 -2
  6. package/dist/adapters/a2a/a2a-tool.js +4 -2
  7. package/dist/adapters/a2a/mcp-integration.d.ts +2 -1
  8. package/dist/adapters/a2a/mcp-integration.js +6 -3
  9. package/dist/adapters/browser/browser-exporter.d.ts +26 -0
  10. package/dist/adapters/browser/browser-exporter.js +73 -0
  11. package/dist/adapters/browser/browser-runner.d.ts +23 -0
  12. package/dist/adapters/browser/browser-runner.js +46 -0
  13. package/dist/adapters/browser/index.d.ts +9 -0
  14. package/dist/adapters/browser/index.js +9 -0
  15. package/dist/adapters/claude-code/adapter.js +2 -2
  16. package/dist/adapters/docker/generators.js +19 -19
  17. package/dist/adapters/docker/index.d.ts +2 -0
  18. package/dist/adapters/docker/index.js +2 -0
  19. package/dist/adapters/docker/openclaw-bridge.d.ts +57 -0
  20. package/dist/adapters/docker/openclaw-bridge.js +173 -0
  21. package/dist/adapters/drupal/generator.js +76 -76
  22. package/dist/adapters/drupal/index.d.ts +1 -0
  23. package/dist/adapters/drupal/index.js +2 -0
  24. package/dist/adapters/drupal/twig-renderer.d.ts +23 -0
  25. package/dist/adapters/drupal/twig-renderer.js +99 -0
  26. package/dist/adapters/gitlab/agent-generator.js +2 -1
  27. package/dist/adapters/openai-agents/adapter.js +2 -2
  28. package/dist/api/index.js +2 -1
  29. package/dist/api/routes/mcp.router.js +3 -1
  30. package/dist/api/routes/wizard.router.js +3 -1
  31. package/dist/cli/commands/agent/discover-type.command.js +1 -1
  32. package/dist/cli/commands/agent-card.command.js +37 -10
  33. package/dist/cli/commands/agents-sync.command.d.ts +2 -2
  34. package/dist/cli/commands/agents-sync.command.js +27 -17
  35. package/dist/cli/commands/catalog/config.js +1 -1
  36. package/dist/cli/commands/catalog/validate.command.js +2 -2
  37. package/dist/cli/commands/config.command.js +2 -2
  38. package/dist/cli/commands/daemon.command.js +32 -8
  39. package/dist/cli/commands/discover.d.ts +1 -1
  40. package/dist/cli/commands/discover.js +16 -8
  41. package/dist/cli/commands/economics.command.d.ts +9 -0
  42. package/dist/cli/commands/economics.command.js +113 -0
  43. package/dist/cli/commands/export.command.js +6 -3
  44. package/dist/cli/commands/mcp.command.js +3 -1
  45. package/dist/cli/commands/memory.command.d.ts +18 -0
  46. package/dist/cli/commands/memory.command.js +168 -0
  47. package/dist/cli/commands/publish.command.js +7 -4
  48. package/dist/cli/commands/serve-builder-routes.js +1 -1
  49. package/dist/cli/commands/usie-skills.command.d.ts +24 -0
  50. package/dist/cli/commands/usie-skills.command.js +297 -0
  51. package/dist/cli/commands/validate.command.js +8 -1
  52. package/dist/cli/commands/verify.d.ts +3 -3
  53. package/dist/cli/commands/verify.js +12 -6
  54. package/dist/cli/commands/workspace.command.d.ts +1 -0
  55. package/dist/cli/commands/workspace.command.js +28 -4
  56. package/dist/cli/index.js +12 -0
  57. package/dist/cli/schema-driven/schema-loader.js +5 -5
  58. package/dist/cli/workspace-validate.d.ts +23 -0
  59. package/dist/cli/workspace-validate.js +117 -0
  60. package/dist/data/platform-matrix.js +1 -4
  61. package/dist/generated/types.d.ts +97 -97
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.js +2 -0
  64. package/dist/mcp-server/index.js +658 -982
  65. package/dist/mesh/discovery-gkg.d.ts +26 -0
  66. package/dist/mesh/discovery-gkg.js +92 -0
  67. package/dist/messenger/Handler/AgentBatchHandler.js +3 -2
  68. package/dist/messenger/Handler/AgentExecutionHandler.js +6 -1
  69. package/dist/package.json +43 -14
  70. package/dist/sdks/shared/types.d.ts +1 -1
  71. package/dist/services/agent-card-generator.js +6 -2
  72. package/dist/services/daemon/audit-log.service.js +3 -1
  73. package/dist/services/daemon/execution.service.js +8 -4
  74. package/dist/services/daemon/fs-watcher.service.js +6 -7
  75. package/dist/services/daemon/pairing.service.js +2 -1
  76. package/dist/services/daemon/skill-aggregator.service.js +105 -21
  77. package/dist/services/daemon/sse-endpoints.js +1 -1
  78. package/dist/services/daemon/ws-server.js +10 -3
  79. package/dist/services/export/langchain/langchain-exporter.js +2 -2
  80. package/dist/services/export/langchain/memory-generator.js +2 -2
  81. package/dist/services/export/testing/test-generator.js +1 -1
  82. package/dist/services/governance/cedar-provider.js +12 -8
  83. package/dist/services/governance/cedar-validator.service.js +1 -1
  84. package/dist/services/mcp/bridge.service.js +40 -9
  85. package/dist/services/openapi-extensions-validation.d.ts +20 -0
  86. package/dist/services/openapi-extensions-validation.js +193 -0
  87. package/dist/services/release-automation/merge-request.service.d.ts +4 -4
  88. package/dist/services/release-automation/release-buttons.js +3 -3
  89. package/dist/services/release-automation/schemas/release.schema.d.ts +3 -3
  90. package/dist/services/runtime/openai.adapter.d.ts +46 -13
  91. package/dist/services/runtime/openai.adapter.js +169 -131
  92. package/dist/services/skill-registry.service.d.ts +1 -1
  93. package/dist/services/skills-pipeline/skills-research.service.js +47 -7
  94. package/dist/services/taxonomy-service.d.ts +3 -3
  95. package/dist/services/trust/trust.service.js +6 -4
  96. package/dist/services/validation-zod.service.js +3 -22
  97. package/dist/services/validators/index.d.ts +1 -0
  98. package/dist/services/validators/index.js +1 -0
  99. package/dist/services/validators/registry.d.ts +21 -0
  100. package/dist/services/validators/registry.js +42 -0
  101. package/dist/skills/test-skill/package.json +1 -1
  102. package/dist/spec/extensions/cognition.schema.json +87 -0
  103. package/dist/spec/extensions/role-manifest.md +188 -0
  104. package/dist/spec/layer4-economics/duadp-examples.json +44 -0
  105. package/dist/spec/v0.4/agent.schema.json +14 -0
  106. package/dist/spec/v0.4/extensions/mcp/README.md +1 -1
  107. package/dist/spec/v0.5/agent-builder-openapi.yaml +230 -0
  108. package/dist/spec/v0.5/agent.schema.json +34 -2
  109. package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  110. package/dist/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  111. package/dist/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  112. package/dist/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  113. package/dist/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  114. package/dist/spec/v0.5/memory-hierarchy.yaml +120 -0
  115. package/dist/spec/v0.5/role.schema.json +268 -0
  116. package/dist/spec/v1/agent-card.schema.json +254 -0
  117. package/dist/types/cognition.zod.d.ts +312 -0
  118. package/dist/types/cognition.zod.js +223 -0
  119. package/dist/types/identity.zod.d.ts +5 -5
  120. package/dist/types/index.d.ts +54 -6
  121. package/dist/types/index.js +6 -2
  122. package/dist/types/personality.zod.d.ts +3 -3
  123. package/dist/types/role.d.ts +126 -0
  124. package/dist/types/role.js +38 -0
  125. package/dist/utils/http-client.d.ts +22 -0
  126. package/dist/utils/http-client.js +51 -0
  127. package/dist/utils/index.d.ts +3 -0
  128. package/dist/utils/index.js +3 -0
  129. package/dist/utils/proxy-resolver.d.ts +36 -0
  130. package/dist/utils/proxy-resolver.js +59 -0
  131. package/dist/utils/user-agent.d.ts +11 -0
  132. package/dist/utils/user-agent.js +17 -0
  133. package/dist/validation/validator.js +1 -1
  134. package/dist/validation/version-compliance.js +1 -1
  135. package/examples/agents/01-customer-support-bot/agent.ossa.yaml +24 -31
  136. package/examples/agents/05-sales-assistant/agent.ossa.yaml +35 -23
  137. package/examples/agents/07-research-assistant/agent.ossa.yaml +27 -21
  138. package/examples/agents/10-meeting-assistant/agent.ossa.yaml +27 -35
  139. package/examples/agents/security-audit-agent.ossa.yaml +234 -0
  140. package/examples/agentscope/react-assistant/README.md +1 -1
  141. package/examples/agentscope/react-assistant/agent.ossa.yaml +37 -33
  142. package/examples/drupal/content-moderator.ossa.yaml +2 -2
  143. package/examples/drupal/drupal-contributor-agent/.eslintrc.json +58 -0
  144. package/examples/drupal/drupal-contributor-agent/.prettierrc.json +10 -0
  145. package/examples/drupal/drupal-contributor-agent/package.json +55 -0
  146. package/examples/drupal/drupal-contributor-agent/src/core/index.ts +10 -0
  147. package/examples/drupal/drupal-contributor-agent/src/index.ts +17 -0
  148. package/examples/drupal/drupal-contributor-agent/src/types/index.ts +180 -0
  149. package/examples/drupal/drupal-contributor-agent/tsconfig.json +36 -0
  150. package/examples/drupal/drupal-contributor.ossa.yaml +247 -0
  151. package/examples/export/langchain/production-agent-with-memory/README.md +1 -1
  152. package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +13 -23
  153. package/examples/export/langchain/production-agent-with-streaming/agent.ossa.yaml +1 -15
  154. package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +28 -29
  155. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  156. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  157. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  158. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  159. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  160. package/examples/getting-started/README.md +3 -3
  161. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  162. package/examples/gitlab-agents/gitlab-ci-agent.ossa.yaml +221 -0
  163. package/examples/hierarchical-agent.ossa.yaml +10 -53
  164. package/examples/kagent/ossa-kagent-anthropic.ossa.yaml +2 -25
  165. package/examples/kagent/ossa-kagent-mcp-tools.ossa.yaml +2 -30
  166. package/examples/kagent/ossa-kagent-multi-tool.ossa.yaml +2 -18
  167. package/examples/kagent/ossa-kagent-poc.ossa.yaml +2 -16
  168. package/examples/pipeline-agent.ossa.yaml +3 -3
  169. package/examples/platform-specific/claude-code-subagent.yaml +1 -1
  170. package/examples/platform-specific/cursor-coding-agent.yaml +1 -1
  171. package/examples/platform-specific/warp-terminal-agent.yaml +1 -1
  172. package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +24 -31
  173. package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +35 -23
  174. package/examples/production-ready/07-research-assistant/agent.ossa.yaml +27 -19
  175. package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +27 -35
  176. package/examples/roles/drupal-developer.role.yaml +37 -0
  177. package/examples/roles/platform-operator.role.yaml +28 -0
  178. package/examples/roles/security-auditor.role.yaml +27 -0
  179. package/examples/swarm-agent.ossa.yaml +13 -51
  180. package/examples/team-agent.ossa.yaml +12 -61
  181. package/examples/team-lead-teammate.ossa.yaml +12 -17
  182. package/openapi/agent-cognition-sessions.yaml +580 -0
  183. package/openapi/agent-communication.yaml +260 -212
  184. package/openapi/agent-crud.yaml +237 -207
  185. package/openapi/agent-discovery.yaml +119 -81
  186. package/openapi/agent-identity.yaml +219 -187
  187. package/openapi/agent-taxonomy.yaml +95 -38
  188. package/openapi/agents-md-service.yaml +103 -30
  189. package/openapi/cli/openapi.yaml +147 -40
  190. package/openapi/core/ossa-core-api.openapi.yaml +327 -271
  191. package/openapi/core/ossa-registry-api.openapi.yaml +299 -236
  192. package/openapi/core/ossa-registry.openapi.yaml +299 -159
  193. package/openapi/core/unified-agent-gateway.openapi.yaml +234 -170
  194. package/openapi/daemon-api.openapi.yaml +323 -181
  195. package/openapi/dev-cli/openapi.yaml +137 -113
  196. package/openapi/github-sync.yaml +62 -19
  197. package/openapi/marketplace-plugin.openapi.yaml +539 -466
  198. package/openapi/ossa-api.openapi.yaml +354 -213
  199. package/openapi/ossa-cli-enhancements.openapi.yaml +109 -90
  200. package/openapi/ossa-cli.yaml +260 -184
  201. package/openapi/protocols/sse-streams.yaml +66 -74
  202. package/openapi/protocols/websocket-events.yaml +61 -54
  203. package/openapi/reference-implementations/aiflow-bridge-api.openapi.yaml +37 -20
  204. package/openapi/reference-implementations/compliance-agent-api.openapi.yaml +35 -23
  205. package/openapi/reference-implementations/crewai-agent-api.openapi.yaml +29 -18
  206. package/openapi/reference-implementations/critic-agent-api.openapi.yaml +45 -19
  207. package/openapi/reference-implementations/document-analyzer-api.openapi.yaml +30 -24
  208. package/openapi/reference-implementations/drupal-agent-api.openapi.yaml +101 -50
  209. package/openapi/reference-implementations/getting-started-hello-world-api.openapi.yaml +33 -22
  210. package/openapi/reference-implementations/gitlab-ml-recommender-api.openapi.yaml +20 -16
  211. package/openapi/reference-implementations/governor-agent-api.openapi.yaml +41 -23
  212. package/openapi/reference-implementations/helm-generator.openapi.yaml +88 -46
  213. package/openapi/reference-implementations/integrator-agent-api.openapi.yaml +30 -20
  214. package/openapi/reference-implementations/judge-agent-api.openapi.yaml +22 -16
  215. package/openapi/reference-implementations/k8s-troubleshooter-api.openapi.yaml +32 -18
  216. package/openapi/reference-implementations/langchain-agent-api.openapi.yaml +32 -21
  217. package/openapi/reference-implementations/monitor-agent-api.openapi.yaml +34 -21
  218. package/openapi/reference-implementations/orchestrator-agent-api.openapi.yaml +49 -27
  219. package/openapi/reference-implementations/quickstart-support-agent-api.openapi.yaml +27 -19
  220. package/openapi/reference-implementations/self-evolving-ecosystem.openapi.yaml +427 -293
  221. package/openapi/reference-implementations/worker-agent-api.openapi.yaml +34 -23
  222. package/openapi/reference-implementations/workflow-orchestrator-api.openapi.yaml +35 -21
  223. package/openapi/release-automation.openapi.yaml +48 -14
  224. package/openapi/schemas/common/agent.yaml +30 -29
  225. package/openapi/schemas/common/economics.yaml +98 -0
  226. package/openapi/schemas/common/errors.yaml +13 -3
  227. package/openapi/schemas/common/metadata.yaml +22 -7
  228. package/openapi/schemas/common/pagination.yaml +18 -6
  229. package/openapi/schemas/common/security.yaml +13 -5
  230. package/openapi/schemas/index.yaml +49 -42
  231. package/openapi/uadp-asyncapi.yaml +5 -3
  232. package/openapi/uadp-openapi.yaml +243 -165
  233. package/openapi/version-management.openapi.yaml +142 -135
  234. package/package.json +43 -14
  235. package/spec/extensions/cognition.schema.json +87 -0
  236. package/spec/extensions/role-manifest.md +188 -0
  237. package/spec/layer4-economics/duadp-examples.json +44 -0
  238. package/spec/v0.4/agent.schema.json +14 -0
  239. package/spec/v0.4/extensions/mcp/README.md +1 -1
  240. package/spec/v0.5/agent-builder-openapi.yaml +230 -0
  241. package/spec/v0.5/agent.schema.json +34 -2
  242. package/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  243. package/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  244. package/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  245. package/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  246. package/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  247. package/spec/v0.5/memory-hierarchy.yaml +120 -0
  248. package/spec/v0.5/role.schema.json +268 -0
  249. package/spec/v1/agent-card.schema.json +254 -0
  250. package/dist/adapters/a2a/__tests__/mcp-integration.spec.d.ts +0 -5
  251. package/dist/adapters/a2a/__tests__/mcp-integration.spec.js +0 -268
  252. package/dist/adapters/a2a/__tests__/mcp-transport.spec.d.ts +0 -5
  253. package/dist/adapters/a2a/__tests__/mcp-transport.spec.js +0 -203
  254. package/dist/mcp-server/__tests__/mcp-server.spec.d.ts +0 -8
  255. package/dist/mcp-server/__tests__/mcp-server.spec.js +0 -557
  256. package/dist/validation/__tests__/error-codes.test.d.ts +0 -5
  257. package/dist/validation/__tests__/error-codes.test.js +0 -252
  258. package/dist/version-management/core/version-manager.test.d.ts +0 -2
  259. package/dist/version-management/core/version-manager.test.js +0 -210
@@ -0,0 +1,26 @@
1
+ import { AgentCard } from './types.js';
2
+ /**
3
+ * GKG Matchmaker Discovery Provider
4
+ *
5
+ * Replaces static registry discovery with semantic Contract Matchmaking via the Global Knowledge Graph.
6
+ * Resolves agents by their IO contracts (emits/consumes) and Execution Economics.
7
+ */
8
+ export declare class GkgMatchmaker {
9
+ private gkgEndpoint;
10
+ /**
11
+ * @param gkgEndpoint - GKG API base URL.
12
+ * Defaults to `OSSA_GKG_ENDPOINT` env var.
13
+ * Set this to your own GKG-compatible knowledge graph endpoint.
14
+ */
15
+ constructor(gkgEndpoint?: string);
16
+ /**
17
+ * Discover agents that satisfy a specific IO contract and economics profile.
18
+ */
19
+ discoverByContract(emitsSchema?: string, consumesSchema?: string, maxCostUsd?: number): Promise<AgentCard[]>;
20
+ /**
21
+ * Initiate a Lead Selection Market bid request for a task
22
+ */
23
+ requestMarketBids(taskContext: any, requiredContextPacks: string[]): Promise<any[]>;
24
+ private mapToAgentCard;
25
+ }
26
+ //# sourceMappingURL=discovery-gkg.d.ts.map
@@ -0,0 +1,92 @@
1
+ /**
2
+ * GKG Matchmaker Discovery Provider
3
+ *
4
+ * Replaces static registry discovery with semantic Contract Matchmaking via the Global Knowledge Graph.
5
+ * Resolves agents by their IO contracts (emits/consumes) and Execution Economics.
6
+ */
7
+ export class GkgMatchmaker {
8
+ gkgEndpoint;
9
+ /**
10
+ * @param gkgEndpoint - GKG API base URL.
11
+ * Defaults to `OSSA_GKG_ENDPOINT` env var.
12
+ * Set this to your own GKG-compatible knowledge graph endpoint.
13
+ */
14
+ constructor(gkgEndpoint) {
15
+ this.gkgEndpoint =
16
+ gkgEndpoint ??
17
+ process.env.OSSA_GKG_ENDPOINT ??
18
+ '';
19
+ if (!this.gkgEndpoint) {
20
+ throw new Error('GkgMatchmaker requires a GKG endpoint. ' +
21
+ 'Pass it to the constructor or set the OSSA_GKG_ENDPOINT environment variable.');
22
+ }
23
+ }
24
+ /**
25
+ * Discover agents that satisfy a specific IO contract and economics profile.
26
+ */
27
+ async discoverByContract(emitsSchema, consumesSchema, maxCostUsd) {
28
+ const query = {
29
+ type: 'agent',
30
+ has_capability: true,
31
+ filters: {
32
+ ...(emitsSchema && { 'extensions.statemesh.emits.schema': emitsSchema }),
33
+ ...(consumesSchema && { 'extensions.statemesh.consumes.schema': consumesSchema }),
34
+ ...(maxCostUsd && { 'economics.max_cost_usd': { $lte: maxCostUsd } })
35
+ }
36
+ };
37
+ try {
38
+ const response = await fetch(`${this.gkgEndpoint}/search/semantic`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json' },
41
+ body: JSON.stringify(query)
42
+ });
43
+ if (!response.ok) {
44
+ throw new Error(`GKG Semantic Search failed: ${response.statusText}`);
45
+ }
46
+ const results = await response.json();
47
+ return results.map((r) => this.mapToAgentCard(r));
48
+ }
49
+ catch (e) {
50
+ console.error('GKG Matchmaker discovery failed', e);
51
+ return [];
52
+ }
53
+ }
54
+ /**
55
+ * Initiate a Lead Selection Market bid request for a task
56
+ */
57
+ async requestMarketBids(taskContext, requiredContextPacks) {
58
+ try {
59
+ const response = await fetch(`${this.gkgEndpoint}/market/bids/request`, {
60
+ method: 'POST',
61
+ headers: { 'Content-Type': 'application/json' },
62
+ body: JSON.stringify({ taskContext, requiredContextPacks })
63
+ });
64
+ return await response.json();
65
+ }
66
+ catch (e) {
67
+ console.error('Failed to request market bids', e);
68
+ return [];
69
+ }
70
+ }
71
+ mapToAgentCard(raw) {
72
+ return {
73
+ uri: raw.uri || (raw.metadata?.name ? `did:web:${raw.metadata.name}` : undefined),
74
+ name: raw.metadata?.name || 'anonymous',
75
+ version: raw.metadata?.version || '1.0.0',
76
+ ossaVersion: raw.apiVersion || 'ossa/v0.5.1',
77
+ gaid: raw.gaid,
78
+ endpoints: raw.endpoints || {},
79
+ transport: raw.transport || ['http'],
80
+ authentication: raw.authentication || ['none'],
81
+ encryption: raw.encryption || { tlsRequired: true, minTlsVersion: '1.3' },
82
+ capabilities: raw.spec?.tools?.map((t) => t.name) || [],
83
+ status: raw.metadata?.status || 'healthy',
84
+ metadata: {
85
+ description: raw.metadata?.description,
86
+ author: raw.metadata?.author,
87
+ ...(raw.metadata || {})
88
+ }
89
+ };
90
+ }
91
+ }
92
+ //# sourceMappingURL=discovery-gkg.js.map
@@ -7,6 +7,7 @@
7
7
  * @package @bluefly/openstandardagents
8
8
  * @since 0.5.0
9
9
  */
10
+ import { trace } from '@opentelemetry/api';
10
11
  export class AgentBatchHandler {
11
12
  deps;
12
13
  constructor(deps) {
@@ -50,8 +51,8 @@ export class AgentBatchHandler {
50
51
  duration,
51
52
  },
52
53
  };
53
- // Store batch result
54
- const batchId = context.requestId ?? `batch-${Date.now()}`;
54
+ // Store batch result — prefer OTel traceId so the storage key correlates with distributed traces
55
+ const batchId = trace.getActiveSpan()?.spanContext().traceId ?? context.requestId ?? `batch-${Date.now()}`;
55
56
  await this.deps.resultStorage.store(batchId, batchResult);
56
57
  // Dispatch completion event
57
58
  await this.deps.eventDispatcher.dispatch('agent.batch.complete', {
@@ -8,6 +8,7 @@
8
8
  * @package @bluefly/openstandardagents
9
9
  * @since 0.5.0
10
10
  */
11
+ import { trace } from '@opentelemetry/api';
11
12
  export class AgentExecutionHandler {
12
13
  deps;
13
14
  constructor(deps) {
@@ -21,11 +22,15 @@ export class AgentExecutionHandler {
21
22
  const agentId = message.getAgentId();
22
23
  const input = message.getInput();
23
24
  const context = message.getContext();
25
+ const span = trace.getActiveSpan();
26
+ if (context.requestId) {
27
+ span?.setAttribute('request.id', context.requestId);
28
+ }
24
29
  this.deps.logger.info('Starting agent execution', {
25
30
  agentId,
26
31
  userId: context.userId,
27
32
  sessionId: context.sessionId,
28
- requestId: context.requestId,
33
+ requestId: span?.spanContext().traceId ?? context.requestId,
29
34
  });
30
35
  try {
31
36
  // Load agent manifest
package/dist/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "@bluefly/openstandardagents",
3
- "version": "0.4.9",
3
+ "version": "0.5.1",
4
4
  "exports": {
5
- "./schema": "./spec/v0.4/agent.schema.json",
5
+ "./schema": "./spec/v0.5/agent.schema.json",
6
6
  "./schema/v0.4": "./spec/v0.4/agent.schema.json",
7
7
  "./schema/v0.4.1": "./spec/v0.4/agent.schema.json",
8
+ "./schema/v0.5": "./spec/v0.5/agent.schema.json",
9
+ "./schema/v0.5.0": "./spec/v0.5/agent.schema.json",
8
10
  ".": {
9
11
  "types": "./dist/index.d.ts",
10
12
  "import": "./dist/index.js",
@@ -46,7 +48,7 @@
46
48
  "import": "./dist/services/agent-card-generator.js",
47
49
  "require": "./dist/services/agent-card-generator.js"
48
50
  },
49
- "./agent-card-schema": "./spec/v0.4/agent-card.schema.json",
51
+ "./agent-card-schema": "./spec/v0.5/agent-card.schema.json",
50
52
  "./sdk": {
51
53
  "types": "./dist/sdk.d.ts",
52
54
  "import": "./dist/sdk.js",
@@ -72,6 +74,11 @@
72
74
  "types": "./dist/services/trust/trust.service.d.ts",
73
75
  "import": "./dist/services/trust/trust.service.js",
74
76
  "require": "./dist/services/trust/trust.service.js"
77
+ },
78
+ "./workspace-validate": {
79
+ "types": "./dist/cli/workspace-validate.d.ts",
80
+ "import": "./dist/cli/workspace-validate.js",
81
+ "require": "./dist/cli/workspace-validate.js"
75
82
  }
76
83
  },
77
84
  "description": "OSSA - Open Standard for Software Agents. Infrastructure bridge between agent protocols (MCP, A2A) and deployment platforms. Define once in YAML, export to 9+ platforms (Docker, Kubernetes, LangChain, CrewAI, Claude Skills, etc.).",
@@ -150,8 +157,9 @@
150
157
  "build:assets": "cp -r spec dist/ && cp package.json .version.json dist/",
151
158
  "build:clean": "npm run clean && npm run build",
152
159
  "dev": "tsc --watch",
153
- "clean": "rm -rf dist coverage .tsbuildinfo",
160
+ "clean": "node -e \"const fs=require('node:fs'); ['dist','coverage','.tsbuildinfo'].forEach((p)=>fs.rmSync(p,{recursive:true,force:true}))\"",
154
161
  "// TESTING": "",
162
+ "pretest": "npm run build",
155
163
  "test": "jest",
156
164
  "test:unit": "jest tests/unit --forceExit",
157
165
  "test:integration": "jest tests/integration",
@@ -185,7 +193,7 @@
185
193
  "validate:sdk:python": "cd src/sdks/python && python -m pip install --quiet -e . && python -m pytest tests/ -v || true",
186
194
  "validate:schema": "npx ajv-cli compile -s $(node -p \"require('./.version.json').spec_path\")/$(node -p \"require('./.version.json').schema_file\") -r $(node -p \"require('./.version.json').spec_path\")/extensions/kagent/kagent.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/mcp/mcp.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/a2a/a2a.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/langchain/langchain.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/langgraph/langgraph.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/ag2/ag2.schema.json -r $(node -p \"require('./.version.json').spec_path\")/extensions/crewai/crewai.schema.json --strict=false --allow-union-types",
187
195
  "validate:manifest": "npx ajv-cli validate -s $(node -p \"require('./.version.json').spec_path\")/$(node -p \"require('./.version.json').schema_file\") --strict=false --allow-union-types -d",
188
- "validate:examples": "find examples \\( -name '*.ossa.yaml' -o -name '*.ossa.yml' \\) | grep -v 'swarm-to-ossa' | head -20 | xargs -I {} npm run validate:manifest -- {} || true",
196
+ "validate:examples": "tsx src/tools/validation/validate-examples.ts",
189
197
  "validate:versions": "tsx src/tools/validate-versions.ts",
190
198
  "fix:versions": "tsx src/tools/fix-versions.ts",
191
199
  "validate:power": "tsx src/tools/validation/validate-ossa.ts",
@@ -227,7 +235,7 @@
227
235
  "postinstall": "node bin/postinstall || true",
228
236
  "// RELEASE & PUBLISH": "",
229
237
  "prepublishOnly": "publint && npm run test:unit && npm run build",
230
- "validate:deps": "depcheck --ignore-dirs=examples --ignores='@anthropic-ai/claude-agent-sdk,@langchain/openai,@openai/agents,@temporalio/activity,@temporalio/workflow,pino-pretty,readline,@types/*,ts-jest,eslint*,prettier*,lefthook,jest*,vitest,semantic-release*,@semantic-release/*,keep-a-changelog,jest-junit,publint,conventional-changelog-conventionalcommits,ajv-cli,json-schema-to-typescript,json-schema-to-zod,ts-node,@playwright/test,@langchain/anthropic,@langchain/core,langchain'",
238
+ "validate:deps": "depcheck --ignore-dirs=examples --ignores='@anthropic-ai/claude-agent-sdk,@langchain/openai,@openai/agents,@temporalio/activity,@temporalio/workflow,pino-pretty,readline,@types/*,ts-jest,eslint*,prettier*,lefthook,jest*,vitest,semantic-release*,@semantic-release/*,keep-a-changelog,jest-junit,publint,conventional-changelog-conventionalcommits,ajv-cli,json-schema-to-typescript,json-schema-to-zod,ts-node,@playwright/test,@langchain/anthropic,@langchain/core,langchain,agent-browser,@ai-sdk/anthropic,@ai-sdk/google'",
231
239
  "validate:package": "publint",
232
240
  "publish:dry-run": "npm publish --dry-run",
233
241
  "release:check": "npm run typecheck && npm run test:unit && npm run validate:schema && publint",
@@ -235,9 +243,13 @@
235
243
  "release:semantic:dry": "npx semantic-release --dry-run"
236
244
  },
237
245
  "dependencies": {
246
+ "@ai-sdk/anthropic": "^3.0.58",
247
+ "@ai-sdk/google": "^3.0.43",
248
+ "@ai-sdk/openai": "^3.0.41",
238
249
  "@anthropic-ai/claude-agent-sdk": "^0.2.50",
239
250
  "@anthropic-ai/sdk": "^0.71.0",
240
251
  "@aws-sdk/client-bedrock-runtime": "^3.955.0",
252
+ "@better-openclaw/core": "^1.0.30",
241
253
  "@cedar-policy/cedar-wasm": "^4.9.1",
242
254
  "@gitbeaker/node": "^35.8.1",
243
255
  "@gitbeaker/rest": "^43.8.0",
@@ -245,10 +257,10 @@
245
257
  "@langchain/anthropic": "^0.3.10",
246
258
  "@langchain/core": "^0.3.29",
247
259
  "@langchain/openai": "^0.3.17",
248
- "@modelcontextprotocol/sdk": "^0.6.0",
260
+ "@modelcontextprotocol/sdk": "^1.27.1",
249
261
  "@noble/ed25519": "^2.3.0",
250
262
  "@octokit/rest": "^20.0.0",
251
- "@openai/agents": "^0.4.6",
263
+ "@openai/agents": "^0.7.1",
252
264
  "@opentelemetry/api": "^1.9.0",
253
265
  "@opentelemetry/exporter-jaeger": "^1.28.0",
254
266
  "@opentelemetry/exporter-logs-otlp-http": "^0.211.0",
@@ -261,11 +273,13 @@
261
273
  "@opentelemetry/sdk-metrics": "^2.5.0",
262
274
  "@opentelemetry/sdk-node": "^0.54.0",
263
275
  "@opentelemetry/sdk-trace-base": "^1.28.0",
264
- "@qdrant/js-client-rest": "^1.9.0",
276
+ "@qdrant/js-client-rest": "^1.17.0",
265
277
  "@temporalio/activity": "^1.11.3",
266
278
  "@temporalio/workflow": "^1.11.3",
267
279
  "@types/tar": "^6.1.13",
268
280
  "@types/ws": "^8.18.1",
281
+ "agent-browser": "^0.20.11",
282
+ "ai": "^6.0.116",
269
283
  "ajv": "^8.12.0",
270
284
  "ajv-formats": "^3.0.1",
271
285
  "axios": "^1.12.2",
@@ -291,18 +305,22 @@
291
305
  "pino": "^10.3.0",
292
306
  "pino-pretty": "^13.1.3",
293
307
  "prom-client": "^15.1.3",
308
+ "proxy-agent": "^7.0.0",
294
309
  "readline": "^1.3.0",
295
310
  "reflect-metadata": "^0.2.2",
296
311
  "semver": "^7.7.3",
297
- "tar": "^7.5.3",
298
- "uuid": "^11.0.5",
312
+ "tar": "^7.5.11",
313
+ "twig": "^2.0.0",
314
+ "twig-drupal-filters": "^3.2.0",
315
+ "universal-user-agent": "^7.0.3",
316
+ "uuid": "^11.1.0",
299
317
  "web-did-resolver": "^2.0.32",
300
318
  "ws": "^8.19.0",
301
319
  "yaml": "^2.3.0",
302
- "zod": "^4.1.11"
320
+ "zod": "^4.3.6"
303
321
  },
304
322
  "devDependencies": {
305
- "@bluefly/duadp": "^0.1.3",
323
+ "@bluefly/duadp": "^0.1.4",
306
324
  "@jest/globals": "^29.7.0",
307
325
  "@octokit/rest": "^22.0.1",
308
326
  "@semantic-release/changelog": "^6.0.3",
@@ -320,6 +338,7 @@
320
338
  "@types/pg": "^8.15.5",
321
339
  "@types/redis": "^4.0.10",
322
340
  "@types/semver": "^7.7.1",
341
+ "@types/twig": "^1.12.17",
323
342
  "@typescript-eslint/eslint-plugin": "^8.48.0",
324
343
  "@typescript-eslint/parser": "^8.48.0",
325
344
  "ajv-cli": "^5.0.0",
@@ -344,7 +363,7 @@
344
363
  "vitest": "^2.1.8"
345
364
  },
346
365
  "optionalDependencies": {
347
- "nodemailer": "^6.9.0"
366
+ "nodemailer": "^8.0.2"
348
367
  },
349
368
  "engines": {
350
369
  "node": ">=20.0.0",
@@ -353,5 +372,15 @@
353
372
  "volta": {
354
373
  "node": "22.19.0",
355
374
  "npm": "11.10.0"
375
+ },
376
+ "overrides": {
377
+ "@hono/node-server": "^1.19.10",
378
+ "express-rate-limit": "^8.2.2",
379
+ "hono": "^4.12.7",
380
+ "langsmith": "^0.4.6",
381
+ "fast-xml-parser": "^5.3.8",
382
+ "@langchain/anthropic": {
383
+ "fast-xml-parser": "^4.5.4"
384
+ }
356
385
  }
357
386
  }
@@ -29,8 +29,8 @@ export declare const StateConfigSchema: z.ZodObject<{
29
29
  enabled: z.ZodBoolean;
30
30
  type: z.ZodOptional<z.ZodEnum<{
31
31
  database: "database";
32
- memory: "memory";
33
32
  file: "file";
33
+ memory: "memory";
34
34
  }>>;
35
35
  provider: z.ZodOptional<z.ZodString>;
36
36
  }, z.core.$strip>;
@@ -88,8 +88,12 @@ export class AgentCardGenerator {
88
88
  name,
89
89
  version,
90
90
  ossaVersion: manifest.apiVersion || 'ossa/v0.4',
91
- ...(manifest.metadata?.identity?.uuid ? { uuid: manifest.metadata.identity.uuid } : {}),
92
- ...(manifest.metadata?.identity?.gaid ? { gaid: manifest.metadata.identity.gaid } : {}),
91
+ ...(manifest.metadata?.identity?.uuid
92
+ ? { uuid: manifest.metadata.identity.uuid }
93
+ : {}),
94
+ ...(manifest.metadata?.identity?.gaid
95
+ ? { gaid: manifest.metadata.identity.gaid }
96
+ : {}),
93
97
  // Taxonomy — what kind of agent
94
98
  ...(taxonomy ? { taxonomy } : {}),
95
99
  // Capabilities & tools
@@ -64,7 +64,9 @@ let AuditLogService = class AuditLogService {
64
64
  }
65
65
  catch (err) {
66
66
  // File doesn't exist yet or read error — return empty
67
- if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
67
+ if (err instanceof Error &&
68
+ 'code' in err &&
69
+ err.code === 'ENOENT') {
68
70
  return [];
69
71
  }
70
72
  process.stderr.write(`[audit-log] read failed: ${err instanceof Error ? err.message : String(err)}\n`);
@@ -38,14 +38,19 @@ try {
38
38
  const eqIdx = trimmed.indexOf('=');
39
39
  if (eqIdx > 0) {
40
40
  const key = trimmed.slice(0, eqIdx).trim();
41
- const val = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, '');
41
+ const val = trimmed
42
+ .slice(eqIdx + 1)
43
+ .trim()
44
+ .replace(/^["']|["']$/g, '');
42
45
  if (!process.env[key])
43
46
  process.env[key] = val;
44
47
  }
45
48
  }
46
49
  }
47
50
  }
48
- catch { /* .env loading is best-effort */ }
51
+ catch {
52
+ /* .env loading is best-effort */
53
+ }
49
54
  const MAX_CONCURRENT = 3;
50
55
  const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
51
56
  const SUPPORTED_RUNTIMES = [
@@ -117,8 +122,7 @@ let ExecutionService = class ExecutionService extends EventEmitter {
117
122
  }, timeout);
118
123
  this.timeoutTimers.set(executionId, timer);
119
124
  // Run asynchronously — don't block the caller
120
- this.runExecution(executionId, manifestPath, input, selectedRuntime, abortController.signal)
121
- .catch((err) => {
125
+ this.runExecution(executionId, manifestPath, input, selectedRuntime, abortController.signal).catch((err) => {
122
126
  // Safety net for unhandled errors
123
127
  logger.error({ err, executionId }, 'Unhandled execution error');
124
128
  });
@@ -22,11 +22,7 @@ const WATCH_PATTERNS = [
22
22
  '**/*.skill.yml',
23
23
  '**/SKILL.md',
24
24
  ];
25
- const IGNORED = [
26
- '**/node_modules/**',
27
- '**/dist/**',
28
- '**/.git/**',
29
- ];
25
+ const IGNORED = ['**/node_modules/**', '**/dist/**', '**/.git/**'];
30
26
  const DEBOUNCE_MS = 300;
31
27
  let FileWatcherService = class FileWatcherService {
32
28
  watcher = null;
@@ -101,7 +97,8 @@ let FileWatcherService = class FileWatcherService {
101
97
  isPathSafe(filePath) {
102
98
  const resolved = path.resolve(filePath);
103
99
  // Must be inside workspace root
104
- if (!resolved.startsWith(this.workspaceRoot + path.sep) && resolved !== this.workspaceRoot) {
100
+ if (!resolved.startsWith(this.workspaceRoot + path.sep) &&
101
+ resolved !== this.workspaceRoot) {
105
102
  return false;
106
103
  }
107
104
  // Get relative path and check each segment for dotfiles (except .ossa.yaml)
@@ -138,7 +135,9 @@ let FileWatcherService = class FileWatcherService {
138
135
  else {
139
136
  const fileStats = stats ?? this.safeStatSync(absolutePath);
140
137
  this.trackedFiles.set(relativePath, {
141
- modified: fileStats ? new Date(fileStats.mtime).toISOString() : new Date().toISOString(),
138
+ modified: fileStats
139
+ ? new Date(fileStats.mtime).toISOString()
140
+ : new Date().toISOString(),
142
141
  size: fileStats?.size ?? 0,
143
142
  });
144
143
  }
@@ -33,7 +33,8 @@ let PairingService = class PairingService {
33
33
  */
34
34
  getCurrentCode() {
35
35
  const now = Date.now();
36
- if (!this.currentCode || now - this.codeGeneratedAt >= CODE_ROTATION_INTERVAL_MS) {
36
+ if (!this.currentCode ||
37
+ now - this.codeGeneratedAt >= CODE_ROTATION_INTERVAL_MS) {
37
38
  this.currentCode = this.generateCode();
38
39
  this.codeGeneratedAt = now;
39
40
  }
@@ -22,18 +22,78 @@ import * as path from 'node:path';
22
22
  import { safeParseYAML } from '../../utils/yaml-parser.js';
23
23
  const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
24
24
  const BUILTIN_SKILLS = [
25
- { name: 'web-search', source: 'builtin', description: 'Search the web for information', tags: ['search', 'web'] },
26
- { name: 'code-review', source: 'builtin', description: 'Review code for quality, security, and best practices', tags: ['code', 'review', 'quality'] },
27
- { name: 'text-summary', source: 'builtin', description: 'Summarize text content into concise form', tags: ['text', 'summary', 'nlp'] },
28
- { name: 'data-analysis', source: 'builtin', description: 'Analyze structured and unstructured data', tags: ['data', 'analysis', 'statistics'] },
29
- { name: 'image-generation', source: 'builtin', description: 'Generate images from text descriptions', tags: ['image', 'generation', 'creative'] },
30
- { name: 'translation', source: 'builtin', description: 'Translate text between languages', tags: ['translation', 'language', 'nlp'] },
31
- { name: 'file-management', source: 'builtin', description: 'Read, write, and manage files in the workspace', tags: ['file', 'io', 'workspace'] },
32
- { name: 'api-integration', source: 'builtin', description: 'Integrate with external REST and GraphQL APIs', tags: ['api', 'integration', 'http'] },
33
- { name: 'database-query', source: 'builtin', description: 'Query and manage database connections', tags: ['database', 'sql', 'query'] },
34
- { name: 'monitoring', source: 'builtin', description: 'Monitor system health, metrics, and alerts', tags: ['monitoring', 'observability', 'health'] },
35
- { name: 'testing', source: 'builtin', description: 'Run and manage test suites', tags: ['testing', 'quality', 'ci'] },
36
- { name: 'documentation', source: 'builtin', description: 'Generate and maintain documentation', tags: ['docs', 'documentation', 'writing'] },
25
+ {
26
+ name: 'web-search',
27
+ source: 'builtin',
28
+ description: 'Search the web for information',
29
+ tags: ['search', 'web'],
30
+ },
31
+ {
32
+ name: 'code-review',
33
+ source: 'builtin',
34
+ description: 'Review code for quality, security, and best practices',
35
+ tags: ['code', 'review', 'quality'],
36
+ },
37
+ {
38
+ name: 'text-summary',
39
+ source: 'builtin',
40
+ description: 'Summarize text content into concise form',
41
+ tags: ['text', 'summary', 'nlp'],
42
+ },
43
+ {
44
+ name: 'data-analysis',
45
+ source: 'builtin',
46
+ description: 'Analyze structured and unstructured data',
47
+ tags: ['data', 'analysis', 'statistics'],
48
+ },
49
+ {
50
+ name: 'image-generation',
51
+ source: 'builtin',
52
+ description: 'Generate images from text descriptions',
53
+ tags: ['image', 'generation', 'creative'],
54
+ },
55
+ {
56
+ name: 'translation',
57
+ source: 'builtin',
58
+ description: 'Translate text between languages',
59
+ tags: ['translation', 'language', 'nlp'],
60
+ },
61
+ {
62
+ name: 'file-management',
63
+ source: 'builtin',
64
+ description: 'Read, write, and manage files in the workspace',
65
+ tags: ['file', 'io', 'workspace'],
66
+ },
67
+ {
68
+ name: 'api-integration',
69
+ source: 'builtin',
70
+ description: 'Integrate with external REST and GraphQL APIs',
71
+ tags: ['api', 'integration', 'http'],
72
+ },
73
+ {
74
+ name: 'database-query',
75
+ source: 'builtin',
76
+ description: 'Query and manage database connections',
77
+ tags: ['database', 'sql', 'query'],
78
+ },
79
+ {
80
+ name: 'monitoring',
81
+ source: 'builtin',
82
+ description: 'Monitor system health, metrics, and alerts',
83
+ tags: ['monitoring', 'observability', 'health'],
84
+ },
85
+ {
86
+ name: 'testing',
87
+ source: 'builtin',
88
+ description: 'Run and manage test suites',
89
+ tags: ['testing', 'quality', 'ci'],
90
+ },
91
+ {
92
+ name: 'documentation',
93
+ source: 'builtin',
94
+ description: 'Generate and maintain documentation',
95
+ tags: ['docs', 'documentation', 'writing'],
96
+ },
37
97
  ];
38
98
  let SkillAggregatorService = class SkillAggregatorService {
39
99
  cache = new Map();
@@ -152,7 +212,12 @@ let SkillAggregatorService = class SkillAggregatorService {
152
212
  // --- Private loaders ---
153
213
  async loadLocal() {
154
214
  const patterns = ['**/*.skill.yaml', '**/*.skill.yml', '**/SKILL.md'];
155
- const ignorePatterns = ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/coverage/**'];
215
+ const ignorePatterns = [
216
+ '**/node_modules/**',
217
+ '**/dist/**',
218
+ '**/.git/**',
219
+ '**/coverage/**',
220
+ ];
156
221
  const files = await fg(patterns, {
157
222
  cwd: this.workspacePath,
158
223
  ignore: ignorePatterns,
@@ -166,25 +231,39 @@ let SkillAggregatorService = class SkillAggregatorService {
166
231
  // SKILL.md — extract name from first heading, rest is description
167
232
  const lines = content.split('\n');
168
233
  const heading = lines.find((l) => l.startsWith('#'));
169
- const name = heading ? heading.replace(/^#+\s*/, '').trim() : path.basename(path.dirname(file));
234
+ const name = heading
235
+ ? heading.replace(/^#+\s*/, '').trim()
236
+ : path.basename(path.dirname(file));
170
237
  const description = lines
171
238
  .filter((l) => !l.startsWith('#') && l.trim())
172
239
  .slice(0, 3)
173
240
  .join(' ')
174
241
  .trim();
175
- skills.push({ name, source: 'local', description: description || 'Local skill', manifest: content });
242
+ skills.push({
243
+ name,
244
+ source: 'local',
245
+ description: description || 'Local skill',
246
+ manifest: content,
247
+ });
176
248
  }
177
249
  else {
178
250
  // YAML skill file
179
251
  const parsed = safeParseYAML(content);
180
252
  const meta = parsed?.metadata;
181
253
  skills.push({
182
- name: meta?.name || path.basename(file, path.extname(file)).replace('.skill', ''),
254
+ name: meta?.name ||
255
+ path.basename(file, path.extname(file)).replace('.skill', ''),
183
256
  source: 'local',
184
- description: meta?.description || parsed?.description || 'Local skill',
257
+ description: meta?.description ||
258
+ parsed?.description ||
259
+ 'Local skill',
185
260
  version: meta?.version || undefined,
186
- capabilities: Array.isArray(parsed?.capabilities) ? parsed.capabilities : undefined,
187
- tags: Array.isArray(parsed?.tags) ? parsed.tags : undefined,
261
+ capabilities: Array.isArray(parsed?.capabilities)
262
+ ? parsed.capabilities
263
+ : undefined,
264
+ tags: Array.isArray(parsed?.tags)
265
+ ? parsed.tags
266
+ : undefined,
188
267
  manifest: parsed,
189
268
  });
190
269
  }
@@ -201,7 +280,10 @@ let SkillAggregatorService = class SkillAggregatorService {
201
280
  async loadGitHub() {
202
281
  const url = 'https://api.github.com/repos/anthropics/skills/contents/';
203
282
  const response = await fetch(url, {
204
- headers: { Accept: 'application/vnd.github.v3+json', 'User-Agent': 'ossa-daemon' },
283
+ headers: {
284
+ Accept: 'application/vnd.github.v3+json',
285
+ 'User-Agent': 'ossa-daemon',
286
+ },
205
287
  signal: AbortSignal.timeout(10_000),
206
288
  });
207
289
  if (!response.ok) {
@@ -239,7 +321,9 @@ let SkillAggregatorService = class SkillAggregatorService {
239
321
  source: 'registry',
240
322
  description: item.description || 'Registry skill',
241
323
  version: item.version || undefined,
242
- capabilities: Array.isArray(item.capabilities) ? item.capabilities : undefined,
324
+ capabilities: Array.isArray(item.capabilities)
325
+ ? item.capabilities
326
+ : undefined,
243
327
  tags: Array.isArray(item.tags) ? item.tags : undefined,
244
328
  }));
245
329
  }
@@ -23,7 +23,7 @@ import { PairingService } from './pairing.service.js';
23
23
  const SSE_HEADERS = {
24
24
  'Content-Type': 'text/event-stream',
25
25
  'Cache-Control': 'no-cache',
26
- 'Connection': 'keep-alive',
26
+ Connection: 'keep-alive',
27
27
  };
28
28
  const STATUS_INTERVAL_MS = 5_000;
29
29
  let SSEEndpoints = class SSEEndpoints {