@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,23 @@
1
+ /**
2
+ * Twig Renderer — Render Drupal templates with proper Twig filters.
3
+ *
4
+ * Uses twig-drupal-filters to provide Drupal's custom Twig filters:
5
+ * |t, |trans, |clean_class, |safe_join, |render, |without, |placeholder, etc.
6
+ *
7
+ * This replaces string concatenation for generating .html.twig files,
8
+ * producing templates that Drupal developers will recognize as correct.
9
+ */
10
+ /**
11
+ * Render a Twig template string with Drupal filters available.
12
+ */
13
+ export declare function renderTwigTemplate(template: string, context?: Record<string, unknown>): string;
14
+ /**
15
+ * Generate a Drupal module's default template file.
16
+ * Uses real Twig syntax with Drupal filters.
17
+ */
18
+ export declare function generateAgentTemplate(agentName: string, machineName: string): string;
19
+ /**
20
+ * Generate a Drupal config schema YAML for an agent settings form.
21
+ */
22
+ export declare function generateConfigSchema(machineName: string): string;
23
+ //# sourceMappingURL=twig-renderer.d.ts.map
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Twig Renderer — Render Drupal templates with proper Twig filters.
3
+ *
4
+ * Uses twig-drupal-filters to provide Drupal's custom Twig filters:
5
+ * |t, |trans, |clean_class, |safe_join, |render, |without, |placeholder, etc.
6
+ *
7
+ * This replaces string concatenation for generating .html.twig files,
8
+ * producing templates that Drupal developers will recognize as correct.
9
+ */
10
+ import Twig from 'twig';
11
+ // Register Drupal filters
12
+ let filtersRegistered = false;
13
+ function ensureFiltersRegistered() {
14
+ if (filtersRegistered)
15
+ return;
16
+ try {
17
+ // twig-drupal-filters registers itself onto the Twig instance
18
+ require('twig-drupal-filters')(Twig);
19
+ filtersRegistered = true;
20
+ }
21
+ catch {
22
+ // Fallback: register minimal filters if twig-drupal-filters fails
23
+ const twigInstance = Twig;
24
+ if (twigInstance.extendFilter) {
25
+ twigInstance.extendFilter('t', (val) => val);
26
+ twigInstance.extendFilter('trans', (val) => val);
27
+ twigInstance.extendFilter('clean_class', (val) => val.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase());
28
+ twigInstance.extendFilter('render', (val) => val);
29
+ filtersRegistered = true;
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Render a Twig template string with Drupal filters available.
35
+ */
36
+ export function renderTwigTemplate(template, context = {}) {
37
+ ensureFiltersRegistered();
38
+ const twigTemplate = Twig.twig({ data: template });
39
+ return twigTemplate.render(context);
40
+ }
41
+ /**
42
+ * Generate a Drupal module's default template file.
43
+ * Uses real Twig syntax with Drupal filters.
44
+ */
45
+ export function generateAgentTemplate(agentName, machineName) {
46
+ return `{#
47
+ /**
48
+ * @file
49
+ * Default theme implementation for ${agentName} agent display.
50
+ *
51
+ * Available variables:
52
+ * - agent: The OSSA agent entity.
53
+ * - content: The rendered content fields.
54
+ * - attributes: HTML attributes for the containing element.
55
+ *
56
+ * @see template_preprocess_${machineName}()
57
+ *
58
+ * @ingroup themeable
59
+ */
60
+ #}
61
+ <article{{ attributes.addClass('${machineName}') }}>
62
+ {% if label %}
63
+ <h2{{ title_attributes }}>
64
+ <a href="{{ url }}" rel="bookmark">{{ label }}</a>
65
+ </h2>
66
+ {% endif %}
67
+
68
+ <div{{ content_attributes.addClass('${machineName}__content') }}>
69
+ {% if content.field_trust_tier %}
70
+ <div class="{{ '${machineName}__trust-tier'|clean_class }}">
71
+ {{ content.field_trust_tier }}
72
+ </div>
73
+ {% endif %}
74
+
75
+ {{ content|without('field_trust_tier') }}
76
+ </div>
77
+ </article>
78
+ `;
79
+ }
80
+ /**
81
+ * Generate a Drupal config schema YAML for an agent settings form.
82
+ */
83
+ export function generateConfigSchema(machineName) {
84
+ return `${machineName}.settings:
85
+ type: config_object
86
+ label: '${machineName} settings'
87
+ mapping:
88
+ enabled:
89
+ type: boolean
90
+ label: 'Enable agent'
91
+ trust_tier:
92
+ type: string
93
+ label: 'Trust tier'
94
+ api_endpoint:
95
+ type: string
96
+ label: 'API endpoint URL'
97
+ `;
98
+ }
99
+ //# sourceMappingURL=twig-renderer.js.map
@@ -604,7 +604,8 @@ export interface WorkflowContext {
604
604
  const extensions = manifest.extensions?.gitlab;
605
605
  return JSON.stringify({
606
606
  url: extensions?.webhook?.url ||
607
- extensions?.webhook?.url || `http://localhost:8080/webhook/${agentName}`,
607
+ extensions?.webhook?.url ||
608
+ `http://localhost:8080/webhook/${agentName}`,
608
609
  token: '${WEBHOOK_SECRET}',
609
610
  enable_ssl_verification: extensions?.webhook?.ssl_verification ?? false,
610
611
  push_events: false,
@@ -105,12 +105,12 @@ export class OpenAIAgentsAdapter extends BaseAdapter {
105
105
  metadata: {
106
106
  name: 'platform-assistant',
107
107
  version: '1.0.0',
108
- description: 'BlueFly Platform Assistant with Drupal MCP tools',
108
+ description: 'Agent Platform Assistant with Drupal MCP tools',
109
109
  },
110
110
  spec: {
111
111
  role: 'assistant',
112
112
  personality: {
113
- system_prompt: 'You are the BlueFly Platform Assistant. Use MCP tools to manage content and query data on the Drupal agent platform.',
113
+ system_prompt: 'You are the Agent Platform Assistant. Use MCP tools to manage content and query data on the Drupal agent platform.',
114
114
  },
115
115
  llm: {
116
116
  provider: 'openai',
package/dist/api/index.js CHANGED
@@ -29,7 +29,8 @@ export function createApp(opts) {
29
29
  // Routes
30
30
  app.use('/', healthRouter());
31
31
  app.use('/api/v1/manifests', manifestsRouter());
32
- app.use('/api/v1/wizard', wizardRouter());
32
+ // Agent builder routes (canonical path per OWNERSHIP.md + BIBLE_OSSA_AGENT_BUILDER.md)
33
+ app.use('/api/agent-builder', wizardRouter());
33
34
  app.use('/api/v1/export', exportRouter());
34
35
  app.use('/api/v1/convert', convertRouter());
35
36
  app.use('/api/v1/skills', skillsRouter());
@@ -18,7 +18,9 @@ export function mcpRouter() {
18
18
  try {
19
19
  const { source, directory = '.' } = req.body;
20
20
  if (!source) {
21
- res.status(400).json({ error: 'source is required (e.g. claude-desktop, cursor)' });
21
+ res
22
+ .status(400)
23
+ .json({ error: 'source is required (e.g. claude-desktop, cursor)' });
22
24
  return;
23
25
  }
24
26
  const result = await service.sync(source, directory);
@@ -23,7 +23,9 @@ export function wizardRouter() {
23
23
  router.get('/definitions', (req, res) => {
24
24
  const parsed = DefinitionsQuerySchema.safeParse(req.query);
25
25
  if (!parsed.success) {
26
- res.status(400).json({ error: 'Invalid query', details: parsed.error.flatten() });
26
+ res
27
+ .status(400)
28
+ .json({ error: 'Invalid query', details: parsed.error.flatten() });
27
29
  return;
28
30
  }
29
31
  const steps = service.getStepDefinitions(parsed.data.kind, parsed.data.mode);
@@ -288,7 +288,7 @@ let DiscoverTypeCommand = class DiscoverTypeCommand {
288
288
  createManifestFromContext(name, type, context) {
289
289
  const capabilities = this.typeDetector.suggestCapabilitiesForType(type);
290
290
  return {
291
- apiVersion: 'ossa.bluefly.io/v1',
291
+ apiVersion: 'ossa/v0.5.1',
292
292
  kind: 'Agent',
293
293
  metadata: {
294
294
  name,
@@ -108,8 +108,10 @@ agentCardCommand
108
108
  agentCardCommand
109
109
  .command('validate')
110
110
  .argument('<file>', 'Path to agent-card.json to validate')
111
- .description('Validate an agent-card.json against the OSSA schema')
112
- .action(async (filePath) => {
111
+ .option('--schema-version <version>', 'Schema version to validate against: "v0.4" (OSSA legacy) or "1.0" (Agent Card v1.0 spec)', 'v0.4')
112
+ .description('Validate an agent-card.json against the OSSA schema or Agent Card v1.0 spec.\n' +
113
+ 'Use --schema-version 1.0 to validate against the interoperability Agent Card v1.0 spec.')
114
+ .action(async (filePath, opts) => {
113
115
  try {
114
116
  const fullPath = path.resolve(filePath);
115
117
  if (!fs.existsSync(fullPath)) {
@@ -125,10 +127,19 @@ agentCardCommand
125
127
  console.error(chalk.red('✗ Invalid JSON'));
126
128
  process.exit(1);
127
129
  }
128
- // Load schema
129
- const schemaPath = path.resolve(__dirname, '../../../spec/v0.4/agent-card.schema.json');
130
+ // Resolve schema path based on --schema-version
131
+ let schemaPath;
132
+ let schemaLabel;
133
+ if (opts.schemaVersion === '1.0') {
134
+ schemaPath = path.resolve(__dirname, '../../../spec/v1/agent-card.schema.json');
135
+ schemaLabel = 'Agent Card v1.0';
136
+ }
137
+ else {
138
+ schemaPath = path.resolve(__dirname, '../../../spec/v0.4/agent-card.schema.json');
139
+ schemaLabel = 'OSSA Agent Card v0.4';
140
+ }
130
141
  if (!fs.existsSync(schemaPath)) {
131
- console.error(chalk.red('✗ Agent card schema not found at spec/v0.4/agent-card.schema.json'));
142
+ console.error(chalk.red(`✗ Schema not found: ${schemaPath}`));
132
143
  process.exit(1);
133
144
  }
134
145
  const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
@@ -136,14 +147,30 @@ agentCardCommand
136
147
  addFormats(ajv);
137
148
  const validate = ajv.compile(schema);
138
149
  if (validate(card)) {
139
- console.log(chalk.green('✓ Agent card is valid'));
150
+ console.log(chalk.green(`✓ Agent card is valid (${schemaLabel})`));
140
151
  const c = card;
141
- console.log(chalk.gray(` Name: ${c.name}`));
142
- console.log(chalk.gray(` URI: ${c.uri}`));
143
- console.log(chalk.gray(` Version: ${c.version} (OSSA ${c.ossaVersion})`));
152
+ if (opts.schemaVersion === '1.0') {
153
+ // Agent Card v1.0 fields
154
+ console.log(chalk.gray(` Name: ${c.name}`));
155
+ console.log(chalk.gray(` humanReadableId: ${c.humanReadableId}`));
156
+ console.log(chalk.gray(` agentVersion: ${c.agentVersion}`));
157
+ console.log(chalk.gray(` url: ${c.url}`));
158
+ const schemes = Array.isArray(c.authSchemes)
159
+ ? c.authSchemes.map((s) => s.scheme).join(', ')
160
+ : '—';
161
+ console.log(chalk.gray(` authSchemes: ${schemes}`));
162
+ const skillCount = Array.isArray(c.skills) ? c.skills.length : 0;
163
+ console.log(chalk.gray(` skills: ${skillCount} defined`));
164
+ }
165
+ else {
166
+ // Legacy OSSA v0.4 fields
167
+ console.log(chalk.gray(` Name: ${c.name}`));
168
+ console.log(chalk.gray(` URI: ${c.uri}`));
169
+ console.log(chalk.gray(` Version: ${c.version} (OSSA ${c.ossaVersion})`));
170
+ }
144
171
  }
145
172
  else {
146
- console.error(chalk.red('✗ Agent card validation failed:'));
173
+ console.error(chalk.red(`✗ Agent card validation failed (${schemaLabel}):`));
147
174
  for (const error of validate.errors || []) {
148
175
  console.error(chalk.red(` ${error.instancePath} ${error.message}`));
149
176
  }
@@ -2,9 +2,9 @@
2
2
  * OSSA Agents Sync Command
3
3
  *
4
4
  * Syncs platform agents between locations:
5
- * NAS: /Volumes/AgentPlatform/.agents/platform-agents/
5
+ * Remote: $OSSA_AGENTS_SOURCE (e.g. a NAS or network share)
6
6
  * Local: ~/.agents/platform-agents/
7
- * Oracle: /opt/agent-platform/.agents/platform-agents/ (via SSH)
7
+ * Server: $OSSA_ORACLE_HOST (any remote host, via SSH)
8
8
  *
9
9
  * Also scans project .agents/ folders and builds a unified registry.
10
10
  *
@@ -2,9 +2,9 @@
2
2
  * OSSA Agents Sync Command
3
3
  *
4
4
  * Syncs platform agents between locations:
5
- * NAS: /Volumes/AgentPlatform/.agents/platform-agents/
5
+ * Remote: $OSSA_AGENTS_SOURCE (e.g. a NAS or network share)
6
6
  * Local: ~/.agents/platform-agents/
7
- * Oracle: /opt/agent-platform/.agents/platform-agents/ (via SSH)
7
+ * Server: $OSSA_ORACLE_HOST (any remote host, via SSH)
8
8
  *
9
9
  * Also scans project .agents/ folders and builds a unified registry.
10
10
  *
@@ -19,9 +19,11 @@ import chalk from 'chalk';
19
19
  import * as fs from 'fs';
20
20
  import * as path from 'path';
21
21
  import * as os from 'os';
22
- const NAS_AGENTS_PATH = '/Volumes/AgentPlatform/.agents/platform-agents';
22
+ const NAS_AGENTS_PATH = process.env.OSSA_AGENTS_SOURCE ||
23
+ path.join(os.homedir(), '.agents', 'remote');
23
24
  const LOCAL_AGENTS_PATH = path.join(os.homedir(), '.agents', 'platform-agents');
24
- const ORACLE_AGENTS_PATH = '/opt/agent-platform/.agents/platform-agents';
25
+ const ORACLE_HOST = process.env.OSSA_ORACLE_HOST || '';
26
+ const ORACLE_AGENTS_PATH = process.env.OSSA_ORACLE_PATH || '/opt/ossa/.agents/platform-agents';
25
27
  function copyDirRecursive(src, dest, stats) {
26
28
  if (!fs.existsSync(src))
27
29
  return;
@@ -87,26 +89,28 @@ function scanAgentsDir(agentsPath) {
87
89
  }
88
90
  export const agentsSyncCommand = new Command('agents-sync')
89
91
  .description('Sync platform agents between NAS, local, and Oracle')
90
- .option('--source <path>', 'Source agents directory', NAS_AGENTS_PATH)
91
- .option('--target <target>', 'Target: "local" (default), "oracle", or a path', 'local')
92
- .option('--scan', 'Scan all WORKING_DEMOs projects for .agents/ folders')
92
+ .option('--source <path>', 'Source agents directory (overrides OSSA_AGENTS_SOURCE env var)', NAS_AGENTS_PATH)
93
+ .option('--target <target>', 'Target: "local" (default), "server", or a path', 'local')
94
+ .option('--scan', 'Scan all $OSSA_PROJECTS_DIR projects for .agents/ folders')
93
95
  .option('--publish <url>', 'Publish all agents to a DUADP node')
94
96
  .option('--dry-run', 'Show what would be synced without doing it')
95
97
  .option('--json', 'Output as JSON')
96
98
  .action(async (options) => {
97
99
  // Scan mode — find all .agents/ across projects
98
100
  if (options.scan) {
99
- const workingDemos = path.join(os.homedir(), 'Sites', 'blueflyio', 'WORKING_DEMOs');
100
- if (!fs.existsSync(workingDemos)) {
101
- console.error(chalk.red(`Not found: ${workingDemos}`));
101
+ const projectsDir = process.env.OSSA_PROJECTS_DIR ||
102
+ path.join(os.homedir(), '.agents', 'projects');
103
+ if (!fs.existsSync(projectsDir)) {
104
+ console.error(chalk.red(`Projects directory not found: ${projectsDir}`));
105
+ console.error(chalk.yellow('Set OSSA_PROJECTS_DIR to your projects root directory.'));
102
106
  process.exit(1);
103
107
  }
104
- const projects = fs.readdirSync(workingDemos, { withFileTypes: true });
108
+ const projects = fs.readdirSync(projectsDir, { withFileTypes: true });
105
109
  const allAgents = {};
106
110
  for (const project of projects) {
107
111
  if (!project.isDirectory())
108
112
  continue;
109
- const projectPath = path.join(workingDemos, project.name);
113
+ const projectPath = path.join(projectsDir, project.name);
110
114
  // Check .agents/
111
115
  const dotAgents = path.join(projectPath, '.agents');
112
116
  if (fs.existsSync(dotAgents)) {
@@ -167,18 +171,24 @@ export const agentsSyncCommand = new Command('agents-sync')
167
171
  case 'local':
168
172
  destPath = LOCAL_AGENTS_PATH;
169
173
  break;
170
- case 'oracle':
171
- // For Oracle, we'd need SSH — show the rsync command instead
172
- console.log(chalk.cyan('Oracle sync requires rsync over SSH:'));
173
- console.log(chalk.white(` rsync -avz --delete ${sourcePath}/ ubuntu@oracle-platform.tailcf98b3.ts.net:${ORACLE_AGENTS_PATH}/`));
174
+ case 'server':
175
+ case 'oracle': {
176
+ // For remote servers, show the rsync command instead of executing it
177
+ if (!ORACLE_HOST) {
178
+ console.error(chalk.red('Set OSSA_ORACLE_HOST to your remote server hostname.'));
179
+ process.exit(1);
180
+ }
181
+ console.log(chalk.cyan('Remote server sync via rsync over SSH:'));
182
+ console.log(chalk.white(` rsync -avz --delete ${sourcePath}/ ${ORACLE_HOST}:${ORACLE_AGENTS_PATH}/`));
174
183
  process.exit(0);
175
184
  break;
185
+ }
176
186
  default:
177
187
  destPath = options.target;
178
188
  }
179
189
  if (!fs.existsSync(sourcePath)) {
180
190
  console.error(chalk.red(`Source not found: ${sourcePath}`));
181
- console.error(chalk.yellow('Is the NAS mounted at /Volumes/AgentPlatform/?'));
191
+ console.error(chalk.yellow('Is the remote source directory accessible? Set OSSA_AGENTS_SOURCE to override.'));
182
192
  process.exit(1);
183
193
  }
184
194
  if (options.dryRun) {
@@ -19,7 +19,7 @@ export class CatalogConfig {
19
19
  this.duoOutputPath =
20
20
  process.env.GITLAB_DUO_OUTPUT_PATH || './.gitlab/duo/agents';
21
21
  this.gitlabTokenPath =
22
- process.env.GITLAB_TOKEN_PATH || path.join(home, '.tokens/gitlab');
22
+ process.env.GITLAB_TOKEN_PATH || path.join(home, '.config', 'gitlab', 'token');
23
23
  this.ossaNamespace = process.env.OSSA_NAMESPACE || 'bluefly';
24
24
  this.gitlabApiUrl =
25
25
  process.env.GITLAB_API_URL || 'https://gitlab.com/api/v4';
@@ -10,9 +10,9 @@ import * as yaml from 'yaml';
10
10
  import { z } from 'zod';
11
11
  import { ValidateOptionsSchema } from './schemas.js';
12
12
  import { CatalogConfig } from './config.js';
13
- // OSSA v0.3.x manifest schema (simplified)
13
+ // OSSA manifest schema — accepts v0.3.x through v0.5.x (use API_VERSION from version.ts for generation)
14
14
  const OssaManifestSchema = z.object({
15
- apiVersion: z.string().regex(/^ossa\/v0\.3/),
15
+ apiVersion: z.string().regex(/^ossa\/v0\.[3-9]/),
16
16
  kind: z.enum(['Agent', 'Worker', 'Orchestrator']),
17
17
  metadata: z.object({
18
18
  name: z.string().min(1),
@@ -73,7 +73,7 @@ configCommand
73
73
  });
74
74
  configCommand.addHelpText('after', `
75
75
  Known keys (you can set any key; these are commonly used):
76
- SKILLS_PATH Directory for skills add/list (e.g. /Volumes/AgentPlatform/services/marketplace/skills)
76
+ SKILLS_PATH Directory for skills add/list (e.g. /path/to/your/skills)
77
77
  BLUEFLY_SKILLS_MARKETPLACE Set to 1 to prefer marketplace skills path in MCP
78
78
  BLUEFLY_SKILLS_CATALOG Path to marketplace-skills-catalog.json
79
79
  BLUEFLY_SKILLS_PATH Alias for skills path
@@ -84,7 +84,7 @@ Known keys (you can set any key; these are commonly used):
84
84
  GITLAB_TOKEN GitLab token (prefer env for secrets)
85
85
 
86
86
  Examples:
87
- ossa config set SKILLS_PATH /Volumes/AgentPlatform/services/marketplace/skills
87
+ ossa config set SKILLS_PATH /path/to/your/skills
88
88
  ossa config get SKILLS_PATH
89
89
  ossa config list
90
90
  ossa config unset SKILLS_PATH
@@ -145,7 +145,11 @@ export const daemonCommand = new Command('daemon')
145
145
  }
146
146
  const session = pairingService.pair(code, origin);
147
147
  if (!session) {
148
- await auditLog.log({ action: 'pair', origin, result: 'failure' });
148
+ await auditLog.log({
149
+ action: 'pair',
150
+ origin,
151
+ result: 'failure',
152
+ });
149
153
  error(res, 401, 'Invalid or expired pairing code');
150
154
  return;
151
155
  }
@@ -187,7 +191,8 @@ export const daemonCommand = new Command('daemon')
187
191
  const files = fileWatcher.getFileTree();
188
192
  const manifests = [];
189
193
  for (const file of files) {
190
- if (file.path.endsWith('.ossa.yaml') || file.path.endsWith('.ossa.yml')) {
194
+ if (file.path.endsWith('.ossa.yaml') ||
195
+ file.path.endsWith('.ossa.yml')) {
191
196
  try {
192
197
  const abs = path.join(workspaceRoot, file.path);
193
198
  const manifest = await manifestRepo.load(abs);
@@ -208,7 +213,10 @@ export const daemonCommand = new Command('daemon')
208
213
  }
209
214
  // GET /workspace/files
210
215
  if (pathname === '/workspace/files' && method === 'GET') {
211
- json(res, 200, { root: workspaceRoot, entries: fileWatcher.getFileTree() });
216
+ json(res, 200, {
217
+ root: workspaceRoot,
218
+ entries: fileWatcher.getFileTree(),
219
+ });
212
220
  return;
213
221
  }
214
222
  // PUT /workspace/files/:path
@@ -244,7 +252,11 @@ export const daemonCommand = new Command('daemon')
244
252
  path: filePath,
245
253
  result: 'success',
246
254
  });
247
- json(res, 200, { path: filePath, written: true, validated: false });
255
+ json(res, 200, {
256
+ path: filePath,
257
+ written: true,
258
+ validated: false,
259
+ });
248
260
  return;
249
261
  }
250
262
  // GET /skills
@@ -261,7 +273,10 @@ export const daemonCommand = new Command('daemon')
261
273
  else {
262
274
  skills = await skillAggregator.loadAll();
263
275
  }
264
- json(res, 200, { skills, sources: skillAggregator.getSourceStatus() });
276
+ json(res, 200, {
277
+ skills,
278
+ sources: skillAggregator.getSourceStatus(),
279
+ });
265
280
  return;
266
281
  }
267
282
  // POST /skills/install
@@ -273,7 +288,11 @@ export const daemonCommand = new Command('daemon')
273
288
  path: body?.name,
274
289
  result: 'success',
275
290
  });
276
- json(res, 200, { installed: true, path: body?.targetPath || '.', files: [] });
291
+ json(res, 200, {
292
+ installed: true,
293
+ path: body?.targetPath || '.',
294
+ files: [],
295
+ });
277
296
  return;
278
297
  }
279
298
  // POST /execute
@@ -315,11 +334,16 @@ export const daemonCommand = new Command('daemon')
315
334
  result: 'success',
316
335
  });
317
336
  }
318
- json(res, cancelled ? 200 : 404, { cancelled, executionId: execGetMatch[1] });
337
+ json(res, cancelled ? 200 : 404, {
338
+ cancelled,
339
+ executionId: execGetMatch[1],
340
+ });
319
341
  return;
320
342
  }
321
343
  // SSE endpoints — pass token from Authorization header
322
- const token = req.headers['authorization']?.slice(7) || parsedUrl.query?.token || '';
344
+ const token = req.headers['authorization']?.slice(7) ||
345
+ parsedUrl.query?.token ||
346
+ '';
323
347
  if (pathname.startsWith('/sse/execution/') && method === 'GET') {
324
348
  const execId = pathname.split('/').pop() || '';
325
349
  sseEndpoints.streamExecution(execId, res, token);
@@ -4,7 +4,7 @@
4
4
  * Usage:
5
5
  * ossa discover [query]
6
6
  * ossa discover "machine learning" --capability nlp
7
- * ossa discover --org blueflyio --min-trust 0.8
7
+ * ossa discover --org <your-org> --min-trust 0.8
8
8
  * ossa discover --json
9
9
  */
10
10
  import { Command } from 'commander';
@@ -4,7 +4,7 @@
4
4
  * Usage:
5
5
  * ossa discover [query]
6
6
  * ossa discover "machine learning" --capability nlp
7
- * ossa discover --org blueflyio --min-trust 0.8
7
+ * ossa discover --org <your-org> --min-trust 0.8
8
8
  * ossa discover --json
9
9
  */
10
10
  import { DuadpClient } from '@bluefly/duadp';
@@ -18,9 +18,13 @@ import { addRegistryOptions, resolveRegistryUrl, } from '../utils/standard-optio
18
18
  class AgentProtocolClient {
19
19
  client;
20
20
  constructor(config) {
21
- const baseUrl = config?.baseUrl || process.env.OSSA_REGISTRY_URL || 'https://uadp.blueflyagents.com';
21
+ const baseUrl = config?.baseUrl ||
22
+ process.env.OSSA_REGISTRY_URL ||
23
+ 'https://uadp.blueflyagents.com';
22
24
  this.client = new DuadpClient(baseUrl, {
23
- token: config?.apiKey || process.env.AGENT_PROTOCOL_TOKEN || process.env.GITLAB_PRIVATE_TOKEN,
25
+ token: config?.apiKey ||
26
+ process.env.AGENT_PROTOCOL_TOKEN ||
27
+ process.env.GITLAB_PRIVATE_TOKEN,
24
28
  });
25
29
  }
26
30
  /**
@@ -33,10 +37,11 @@ class AgentProtocolClient {
33
37
  limit: filters?.limit,
34
38
  });
35
39
  // Map UADP OssaAgent to AgentSearchResult
36
- return response.data.map((agent) => {
40
+ return response.data
41
+ .map((agent) => {
37
42
  // Handle variations in agent schema mapping
38
43
  const capabilities = agent.spec?.capabilities || [];
39
- const mappedCapabilities = capabilities.map((c) => typeof c === 'string' ? c : (c.name || 'unknown'));
44
+ const mappedCapabilities = capabilities.map((c) => typeof c === 'string' ? c : c.name || 'unknown');
40
45
  // Map Tier 1 to 4 to a trust score 0-1
41
46
  let trustLevel = 0.5;
42
47
  const tier = agent.security?.tier;
@@ -49,7 +54,8 @@ class AgentProtocolClient {
49
54
  else if (tier === 'tier_1_read')
50
55
  trustLevel = 0.4;
51
56
  return {
52
- gaid: agent.metadata?.catalog?.catalog_id || `uadp://${this.client.nodeInfo?.node_id || 'remote'}/${agent.metadata?.name}`,
57
+ gaid: agent.metadata?.catalog?.catalog_id ||
58
+ `uadp://${this.client.nodeInfo?.node_id || 'remote'}/${agent.metadata?.name}`,
53
59
  name: agent.metadata?.name || 'unknown',
54
60
  organization: agent.metadata?.identity?.namespace || 'community',
55
61
  capabilities: mappedCapabilities,
@@ -58,12 +64,14 @@ class AgentProtocolClient {
58
64
  description: agent.metadata?.description || '',
59
65
  verified: !!agent.metadata?.identity?.publisher?.pgp_key,
60
66
  };
61
- }).filter((a) => {
67
+ })
68
+ .filter((a) => {
62
69
  if (filters?.minTrust && (a.trustLevel || 0) < filters.minTrust)
63
70
  return false;
64
71
  if (filters?.org && a.organization !== filters.org)
65
72
  return false;
66
- if (filters?.capability && !a.capabilities.includes(filters.capability))
73
+ if (filters?.capability &&
74
+ !a.capabilities.includes(filters.capability))
67
75
  return false;
68
76
  return true;
69
77
  });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * OSSA Execution Economics Command
3
+ * Manage portable execution profiles and reusable context packs
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const executionProfileCommand: Command;
7
+ export declare const contextPackCommand: Command;
8
+ export declare const taskCommand: Command;
9
+ //# sourceMappingURL=economics.command.d.ts.map