synthos 0.7.1 → 0.8.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 (263) hide show
  1. package/README.md +215 -65
  2. package/default-pages/application.json +1 -0
  3. package/default-pages/json_tools.json +1 -1
  4. package/default-pages/oregon_trail.html +321 -0
  5. package/default-pages/oregon_trail.json +12 -0
  6. package/default-pages/sidebar_page.json +1 -0
  7. package/default-pages/solar_explorer.html +10 -18
  8. package/default-pages/solar_explorer.json +2 -2
  9. package/default-pages/two-panel_page.json +1 -0
  10. package/default-pages/us_map.html +192 -0
  11. package/default-pages/us_map.json +12 -0
  12. package/default-pages/us_map_1850.html +325 -0
  13. package/default-pages/us_map_1850.json +12 -0
  14. package/default-pages/western_cities_1850.html +526 -0
  15. package/default-pages/western_cities_1850.json +12 -0
  16. package/default-themes/{nebula-dawn.css → nebula-dawn.v2.css} +24 -0
  17. package/default-themes/{nebula-dusk.css → nebula-dusk.v2.css} +24 -0
  18. package/dist/agents/a2a/a2aProvider.d.ts +3 -0
  19. package/dist/agents/a2a/a2aProvider.d.ts.map +1 -0
  20. package/dist/agents/a2a/a2aProvider.js +126 -0
  21. package/dist/agents/a2a/a2aProvider.js.map +1 -0
  22. package/dist/agents/discovery.d.ts +30 -0
  23. package/dist/agents/discovery.d.ts.map +1 -0
  24. package/dist/agents/discovery.js +52 -0
  25. package/dist/agents/discovery.js.map +1 -0
  26. package/dist/agents/index.d.ts +7 -0
  27. package/dist/agents/index.d.ts.map +1 -0
  28. package/dist/agents/index.js +19 -0
  29. package/dist/agents/index.js.map +1 -0
  30. package/dist/agents/openclaw/gatewayManager.d.ts +113 -0
  31. package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -0
  32. package/dist/agents/openclaw/gatewayManager.js +470 -0
  33. package/dist/agents/openclaw/gatewayManager.js.map +1 -0
  34. package/dist/agents/openclaw/openclawProvider.d.ts +3 -0
  35. package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -0
  36. package/dist/agents/openclaw/openclawProvider.js +239 -0
  37. package/dist/agents/openclaw/openclawProvider.js.map +1 -0
  38. package/dist/agents/openclaw/sshTunnelManager.d.ts +23 -0
  39. package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -0
  40. package/dist/agents/openclaw/sshTunnelManager.js +340 -0
  41. package/dist/agents/openclaw/sshTunnelManager.js.map +1 -0
  42. package/dist/agents/types.d.ts +64 -0
  43. package/dist/agents/types.d.ts.map +1 -0
  44. package/dist/agents/types.js +6 -0
  45. package/dist/agents/types.js.map +1 -0
  46. package/dist/connectors/airtable/connector.json +27 -0
  47. package/dist/connectors/alpha-vantage/connector.json +26 -0
  48. package/dist/connectors/brave-search/connector.json +26 -0
  49. package/dist/connectors/cloudinary/connector.json +27 -0
  50. package/dist/connectors/deepl/connector.json +28 -0
  51. package/dist/connectors/elevenlabs/connector.json +30 -0
  52. package/dist/connectors/giphy/connector.json +27 -0
  53. package/dist/connectors/github/connector.json +29 -0
  54. package/dist/connectors/huggingface/connector.json +27 -0
  55. package/dist/connectors/imgur/connector.json +29 -0
  56. package/dist/connectors/index.d.ts +1 -1
  57. package/dist/connectors/index.d.ts.map +1 -1
  58. package/dist/connectors/instagram/connector.json +43 -0
  59. package/dist/connectors/jira/connector.json +28 -0
  60. package/dist/connectors/mapbox/connector.json +26 -0
  61. package/dist/connectors/nasa/connector.json +27 -0
  62. package/dist/connectors/newsapi/connector.json +27 -0
  63. package/dist/connectors/notion/connector.json +28 -0
  64. package/dist/connectors/open-exchange-rates/connector.json +27 -0
  65. package/dist/connectors/openweathermap/connector.json +26 -0
  66. package/dist/connectors/pexels/connector.json +27 -0
  67. package/dist/connectors/registry.d.ts.map +1 -1
  68. package/dist/connectors/registry.js +42 -96
  69. package/dist/connectors/registry.js.map +1 -1
  70. package/dist/connectors/resend/connector.json +29 -0
  71. package/dist/connectors/rss2json/connector.json +27 -0
  72. package/dist/connectors/sendgrid/connector.json +27 -0
  73. package/dist/connectors/spoonacular/connector.json +28 -0
  74. package/dist/connectors/stability-ai/connector.json +27 -0
  75. package/dist/connectors/twilio/connector.json +28 -0
  76. package/dist/connectors/types.d.ts +23 -0
  77. package/dist/connectors/types.d.ts.map +1 -1
  78. package/dist/connectors/unsplash/connector.json +27 -0
  79. package/dist/connectors/wolfram-alpha/connector.json +26 -0
  80. package/dist/connectors/youtube-data/connector.json +30 -0
  81. package/dist/files.d.ts +1 -0
  82. package/dist/files.d.ts.map +1 -1
  83. package/dist/files.js +16 -1
  84. package/dist/files.js.map +1 -1
  85. package/dist/init.d.ts.map +1 -1
  86. package/dist/init.js +28 -0
  87. package/dist/init.js.map +1 -1
  88. package/dist/migrations.d.ts +3 -2
  89. package/dist/migrations.d.ts.map +1 -1
  90. package/dist/migrations.js +122 -138
  91. package/dist/migrations.js.map +1 -1
  92. package/dist/models/anthropic.d.ts +22 -0
  93. package/dist/models/anthropic.d.ts.map +1 -0
  94. package/dist/models/anthropic.js +76 -0
  95. package/dist/models/anthropic.js.map +1 -0
  96. package/dist/models/chainOfThought.d.ts +12 -0
  97. package/dist/models/chainOfThought.d.ts.map +1 -0
  98. package/dist/models/chainOfThought.js +45 -0
  99. package/dist/models/chainOfThought.js.map +1 -0
  100. package/dist/models/fireworksai.d.ts +30 -0
  101. package/dist/models/fireworksai.d.ts.map +1 -0
  102. package/dist/models/fireworksai.js +133 -0
  103. package/dist/models/fireworksai.js.map +1 -0
  104. package/dist/models/index.d.ts +7 -1
  105. package/dist/models/index.d.ts.map +1 -1
  106. package/dist/models/index.js +19 -1
  107. package/dist/models/index.js.map +1 -1
  108. package/dist/models/logCompletePrompt.d.ts +3 -0
  109. package/dist/models/logCompletePrompt.d.ts.map +1 -0
  110. package/dist/models/logCompletePrompt.js +23 -0
  111. package/dist/models/logCompletePrompt.js.map +1 -0
  112. package/dist/models/openai.d.ts +24 -0
  113. package/dist/models/openai.d.ts.map +1 -0
  114. package/dist/models/openai.js +80 -0
  115. package/dist/models/openai.js.map +1 -0
  116. package/dist/models/providers.d.ts +1 -0
  117. package/dist/models/providers.d.ts.map +1 -1
  118. package/dist/models/providers.js +12 -4
  119. package/dist/models/providers.js.map +1 -1
  120. package/dist/models/types.d.ts +34 -2
  121. package/dist/models/types.d.ts.map +1 -1
  122. package/dist/models/types.js +16 -0
  123. package/dist/models/types.js.map +1 -1
  124. package/dist/models/utils.d.ts +6 -0
  125. package/dist/models/utils.d.ts.map +1 -0
  126. package/dist/models/utils.js +21 -0
  127. package/dist/models/utils.js.map +1 -0
  128. package/dist/scripts.d.ts +2 -1
  129. package/dist/scripts.d.ts.map +1 -1
  130. package/dist/scripts.js +4 -3
  131. package/dist/scripts.js.map +1 -1
  132. package/dist/service/createCompletePrompt.d.ts +1 -1
  133. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  134. package/dist/service/createCompletePrompt.js +9 -6
  135. package/dist/service/createCompletePrompt.js.map +1 -1
  136. package/dist/service/generateImage.d.ts +1 -1
  137. package/dist/service/generateImage.d.ts.map +1 -1
  138. package/dist/service/generateImage.js +3 -3
  139. package/dist/service/generateImage.js.map +1 -1
  140. package/dist/service/server.d.ts.map +1 -1
  141. package/dist/service/server.js +3 -0
  142. package/dist/service/server.js.map +1 -1
  143. package/dist/service/transformPage.d.ts +4 -2
  144. package/dist/service/transformPage.d.ts.map +1 -1
  145. package/dist/service/transformPage.js +74 -6
  146. package/dist/service/transformPage.js.map +1 -1
  147. package/dist/service/useAgentRoutes.d.ts +4 -0
  148. package/dist/service/useAgentRoutes.d.ts.map +1 -0
  149. package/dist/service/useAgentRoutes.js +389 -0
  150. package/dist/service/useAgentRoutes.js.map +1 -0
  151. package/dist/service/useApiRoutes.d.ts.map +1 -1
  152. package/dist/service/useApiRoutes.js +157 -16
  153. package/dist/service/useApiRoutes.js.map +1 -1
  154. package/dist/service/useConnectorRoutes.d.ts.map +1 -1
  155. package/dist/service/useConnectorRoutes.js +14 -3
  156. package/dist/service/useConnectorRoutes.js.map +1 -1
  157. package/dist/service/useGatewayRoutes.d.ts +4 -0
  158. package/dist/service/useGatewayRoutes.d.ts.map +1 -0
  159. package/dist/service/useGatewayRoutes.js +168 -0
  160. package/dist/service/useGatewayRoutes.js.map +1 -0
  161. package/dist/service/usePageRoutes.d.ts.map +1 -1
  162. package/dist/service/usePageRoutes.js +16 -5
  163. package/dist/service/usePageRoutes.js.map +1 -1
  164. package/dist/settings.d.ts +2 -1
  165. package/dist/settings.d.ts.map +1 -1
  166. package/dist/settings.js +4 -8
  167. package/dist/settings.js.map +1 -1
  168. package/dist/themes.d.ts +14 -0
  169. package/dist/themes.d.ts.map +1 -1
  170. package/dist/themes.js +86 -13
  171. package/dist/themes.js.map +1 -1
  172. package/package.json +10 -5
  173. package/page-scripts/helpers-v2.js +222 -0
  174. package/page-scripts/page-v2.js +656 -0
  175. package/required-pages/builder.html +1 -27
  176. package/required-pages/pages.html +745 -22
  177. package/required-pages/settings.html +819 -21
  178. package/required-pages/synthos_apis.html +56 -1
  179. package/src/agents/a2a/a2aProvider.ts +110 -0
  180. package/src/agents/discovery.ts +74 -0
  181. package/src/agents/index.ts +6 -0
  182. package/src/agents/openclaw/gatewayManager.ts +559 -0
  183. package/src/agents/openclaw/openclawProvider.ts +261 -0
  184. package/src/agents/openclaw/sshTunnelManager.ts +385 -0
  185. package/src/agents/types.ts +82 -0
  186. package/src/connectors/airtable/connector.json +27 -0
  187. package/src/connectors/alpha-vantage/connector.json +26 -0
  188. package/src/connectors/brave-search/connector.json +26 -0
  189. package/src/connectors/cloudinary/connector.json +27 -0
  190. package/src/connectors/deepl/connector.json +28 -0
  191. package/src/connectors/elevenlabs/connector.json +30 -0
  192. package/src/connectors/giphy/connector.json +27 -0
  193. package/src/connectors/github/connector.json +29 -0
  194. package/src/connectors/huggingface/connector.json +27 -0
  195. package/src/connectors/imgur/connector.json +29 -0
  196. package/src/connectors/index.ts +2 -0
  197. package/src/connectors/instagram/connector.json +43 -0
  198. package/src/connectors/jira/connector.json +28 -0
  199. package/src/connectors/mapbox/connector.json +26 -0
  200. package/src/connectors/nasa/connector.json +27 -0
  201. package/src/connectors/newsapi/connector.json +27 -0
  202. package/src/connectors/notion/connector.json +28 -0
  203. package/src/connectors/open-exchange-rates/connector.json +27 -0
  204. package/src/connectors/openweathermap/connector.json +26 -0
  205. package/src/connectors/pexels/connector.json +27 -0
  206. package/src/connectors/registry.ts +21 -97
  207. package/src/connectors/resend/connector.json +29 -0
  208. package/src/connectors/rss2json/connector.json +27 -0
  209. package/src/connectors/sendgrid/connector.json +27 -0
  210. package/src/connectors/spoonacular/connector.json +28 -0
  211. package/src/connectors/stability-ai/connector.json +27 -0
  212. package/src/connectors/twilio/connector.json +28 -0
  213. package/src/connectors/types.ts +25 -0
  214. package/src/connectors/unsplash/connector.json +27 -0
  215. package/src/connectors/wolfram-alpha/connector.json +26 -0
  216. package/src/connectors/youtube-data/connector.json +30 -0
  217. package/src/files.ts +14 -0
  218. package/src/init.ts +27 -0
  219. package/src/migrations.ts +121 -138
  220. package/src/models/anthropic.ts +89 -0
  221. package/src/models/chainOfThought.ts +56 -0
  222. package/src/models/fireworksai.ts +136 -0
  223. package/src/models/index.ts +7 -1
  224. package/src/models/logCompletePrompt.ts +25 -0
  225. package/src/models/openai.ts +90 -0
  226. package/src/models/providers.ts +12 -3
  227. package/src/models/types.ts +67 -2
  228. package/src/models/utils.ts +16 -0
  229. package/src/scripts.ts +2 -2
  230. package/src/service/createCompletePrompt.ts +3 -1
  231. package/src/service/generateImage.ts +2 -2
  232. package/src/service/server.ts +4 -0
  233. package/src/service/transformPage.ts +81 -8
  234. package/src/service/useAgentRoutes.ts +423 -0
  235. package/src/service/useApiRoutes.ts +173 -18
  236. package/src/service/useConnectorRoutes.ts +14 -3
  237. package/src/service/usePageRoutes.ts +20 -6
  238. package/src/settings.ts +6 -10
  239. package/src/themes.ts +84 -12
  240. package/tests/README.md +12 -0
  241. package/tests/anthropic.spec.ts +84 -0
  242. package/tests/chainOfThought.spec.ts +108 -0
  243. package/tests/ensureScripts.spec.ts +82 -0
  244. package/tests/files.spec.ts +233 -0
  245. package/tests/fireworksai.spec.ts +92 -0
  246. package/tests/logCompletePrompt.spec.ts +74 -0
  247. package/tests/migrations.spec.ts +169 -0
  248. package/tests/openai.spec.ts +71 -0
  249. package/tests/pages.spec.ts +328 -0
  250. package/tests/providers.spec.ts +144 -0
  251. package/tests/scripts.spec.ts +209 -0
  252. package/tests/transformPage.spec.ts +931 -0
  253. package/tests/types.spec.ts +23 -0
  254. package/default-pages/app_builder.json +0 -1
  255. package/default-pages/sidebar_builder.json +0 -1
  256. package/default-pages/two-panel_builder.json +0 -1
  257. package/images/home.png +0 -0
  258. package/images/page-management.png +0 -0
  259. package/images/settings.png +0 -0
  260. package/images/synthos-square.png +0 -0
  261. /package/default-pages/{app_builder.html → application.html} +0 -0
  262. /package/default-pages/{sidebar_builder.html → sidebar_page.html} +0 -0
  263. /package/default-pages/{two-panel_builder.html → two-panel_page.html} +0 -0
@@ -0,0 +1,222 @@
1
+ (function() {
2
+ if (window.__synthOSHelpers) return;
3
+ window.__synthOSHelpers = true;
4
+
5
+ function _json(method, url, body) {
6
+ var opts = {
7
+ method: method,
8
+ headers: { 'Content-Type': 'application/json' }
9
+ };
10
+ if (body !== undefined) {
11
+ opts.body = JSON.stringify(body);
12
+ }
13
+ return fetch(url, opts).then(function(res) {
14
+ var ct = res.headers.get('content-type') || '';
15
+ var isJson = ct.indexOf('application/json') !== -1;
16
+ return (isJson ? res.json() : res.text()).then(function(data) {
17
+ if (!res.ok) {
18
+ if (res.status === 404 && isJson && data && data.error === 'table_not_found') {
19
+ return null; // for data.get, return null if the table or row is not found instead of throwing an error
20
+ }
21
+ var err = new Error(isJson && data && data.error ? data.error : data);
22
+ err.status = res.status;
23
+ throw err;
24
+ }
25
+ return data;
26
+ });
27
+ });
28
+ }
29
+
30
+ function _pageName() {
31
+ return (window.pageInfo && window.pageInfo.name) || 'default';
32
+ }
33
+
34
+ window.synthos = {
35
+ data: {
36
+ list: function(table, opts) {
37
+ var url = '/api/data/' + encodeURIComponent(_pageName()) + '/' + encodeURIComponent(table);
38
+ if (opts && typeof opts.limit === 'number') {
39
+ url += '?limit=' + opts.limit;
40
+ if (typeof opts.offset === 'number') {
41
+ url += '&offset=' + opts.offset;
42
+ }
43
+ }
44
+ return _json('GET', url) || [];
45
+ },
46
+ get: function(table, id) {
47
+ return _json('GET', '/api/data/' + encodeURIComponent(_pageName()) + '/' + encodeURIComponent(table) + '/' + encodeURIComponent(id)) || null;
48
+ },
49
+ save: function(table, row) {
50
+ return _json('POST', '/api/data/' + encodeURIComponent(_pageName()) + '/' + encodeURIComponent(table), row);
51
+ },
52
+ remove: function(table, id) {
53
+ return _json('DELETE', '/api/data/' + encodeURIComponent(_pageName()) + '/' + encodeURIComponent(table) + '/' + encodeURIComponent(id));
54
+ }
55
+ },
56
+
57
+ generate: {
58
+ image: function(opts) {
59
+ return _json('POST', '/api/generate/image', opts);
60
+ },
61
+ completion: function(opts) {
62
+ return _json('POST', '/api/generate/completion', opts);
63
+ }
64
+ },
65
+
66
+ scripts: {
67
+ run: function(id, variables) {
68
+ return _json('POST', '/api/scripts/' + encodeURIComponent(id), variables || {});
69
+ }
70
+ },
71
+
72
+ pages: {
73
+ list: function() {
74
+ return _json('GET', '/api/pages');
75
+ },
76
+ get: function(name) {
77
+ return _json('GET', '/api/pages/' + encodeURIComponent(name));
78
+ },
79
+ update: function(name, metadata) {
80
+ return _json('POST', '/api/pages/' + encodeURIComponent(name), metadata);
81
+ },
82
+ remove: function(name) {
83
+ return _json('DELETE', '/api/pages/' + encodeURIComponent(name));
84
+ }
85
+ },
86
+
87
+ search: {
88
+ web: function(query, opts) {
89
+ var body = { query: query };
90
+ if (opts) {
91
+ if (opts.count) body.count = opts.count;
92
+ if (opts.country) body.country = opts.country;
93
+ if (opts.freshness) body.freshness = opts.freshness;
94
+ }
95
+ return _json('POST', '/api/search/web', body);
96
+ }
97
+ },
98
+
99
+ connectors: {
100
+ call: function(connector, method, path, opts) {
101
+ var body = { connector: connector, method: method, path: path };
102
+ if (opts) {
103
+ if (opts.headers) body.headers = opts.headers;
104
+ if (opts.body) body.body = opts.body;
105
+ if (opts.query) body.query = opts.query;
106
+ }
107
+ return _json('POST', '/api/connectors', body);
108
+ },
109
+ list: function(opts) {
110
+ var url = '/api/connectors';
111
+ var params = [];
112
+ if (opts) {
113
+ if (opts.category) params.push('category=' + encodeURIComponent(opts.category));
114
+ if (opts.id) params.push('id=' + encodeURIComponent(opts.id));
115
+ }
116
+ if (params.length) url += '?' + params.join('&');
117
+ return _json('GET', url);
118
+ }
119
+ },
120
+
121
+ agents: {
122
+ list: function(opts) {
123
+ var url = '/api/agents';
124
+ var params = [];
125
+ if (opts) {
126
+ if (typeof opts.enabled === 'boolean') params.push('enabled=' + opts.enabled);
127
+ if (opts.provider) params.push('provider=' + encodeURIComponent(opts.provider));
128
+ }
129
+ if (params.length) url += '?' + params.join('&');
130
+ return _json('GET', url);
131
+ },
132
+ send: function(agentId, message, attachments) {
133
+ var body = { message: message };
134
+ if (attachments) body.attachments = attachments;
135
+ return _json('POST', '/api/agents/' + encodeURIComponent(agentId) + '/send', body);
136
+ },
137
+ sendStream: function(agentId, message, onEventOrOpts, attachments) {
138
+ // Supports two calling conventions:
139
+ // sendStream(id, msg, onEvent) — positional callback
140
+ // sendStream(id, msg, onEvent, attachments) — positional callback + attachments
141
+ // sendStream(id, msg, { onEvent, attachments }) — options object
142
+ var onEvent, atts;
143
+ if (typeof onEventOrOpts === 'function') {
144
+ onEvent = onEventOrOpts;
145
+ atts = attachments;
146
+ } else if (onEventOrOpts && typeof onEventOrOpts === 'object') {
147
+ onEvent = onEventOrOpts.onEvent;
148
+ atts = onEventOrOpts.attachments;
149
+ }
150
+ var body = { message: message };
151
+ if (atts) body.attachments = atts;
152
+ // Uses fetch + streaming reader for SSE-style streaming
153
+ var aborted = false;
154
+ var controller = new AbortController();
155
+ fetch('/api/agents/' + encodeURIComponent(agentId) + '/stream', {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/json' },
158
+ body: JSON.stringify(body),
159
+ signal: controller.signal
160
+ }).then(function(res) {
161
+ var reader = res.body.getReader();
162
+ var decoder = new TextDecoder();
163
+ var buffer = '';
164
+ function pump() {
165
+ return reader.read().then(function(result) {
166
+ if (result.done || aborted) return;
167
+ buffer += decoder.decode(result.value, { stream: true });
168
+ var lines = buffer.split('\n');
169
+ buffer = lines.pop() || '';
170
+ for (var i = 0; i < lines.length; i++) {
171
+ var line = lines[i];
172
+ if (line.indexOf('data: ') === 0) {
173
+ var data = line.substring(6);
174
+ if (data === '[DONE]') return;
175
+ try {
176
+ var event = JSON.parse(data);
177
+ if (onEvent) onEvent(event);
178
+ } catch(e) { /* skip malformed lines */ }
179
+ }
180
+ }
181
+ return pump();
182
+ });
183
+ }
184
+ return pump();
185
+ }).catch(function(err) {
186
+ if (!aborted && onEvent) onEvent({ kind: 'error', data: err.message });
187
+ });
188
+ return { close: function() { aborted = true; controller.abort(); } };
189
+ },
190
+ chat: {
191
+ send: function(agentId, message, attachments) {
192
+ return window.synthos.agents.send(agentId, message, attachments);
193
+ },
194
+ sendStream: function(agentId, message, onEventOrOpts, attachments) {
195
+ return window.synthos.agents.sendStream(agentId, message, onEventOrOpts, attachments);
196
+ },
197
+ history: function(agentId) {
198
+ return _json('POST', '/api/agents/' + encodeURIComponent(agentId) + '/chat/history', {}).then(function(res) {
199
+ return res.messages || [];
200
+ });
201
+ },
202
+ abort: function(agentId) {
203
+ return _json('POST', '/api/agents/' + encodeURIComponent(agentId) + '/chat/abort', {});
204
+ },
205
+ clear: function(agentId) {
206
+ return _json('POST', '/api/agents/' + encodeURIComponent(agentId) + '/chat/clear', {});
207
+ }
208
+ },
209
+ isEnabled: function(agentId) {
210
+ return _json('GET', '/api/agents?enabled=true').then(function(agents) {
211
+ return agents.some(function(a) { return a.id === agentId; });
212
+ });
213
+ },
214
+ getCapabilities: function(agentId) {
215
+ return _json('GET', '/api/agents').then(function(agents) {
216
+ var agent = agents.find(function(a) { return a.id === agentId; });
217
+ return agent ? (agent.capabilities || {}) : null;
218
+ });
219
+ }
220
+ }
221
+ };
222
+ })();