opalserve 0.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +112 -116
  2. package/assets/logo.svg +54 -0
  3. package/dist/cli/commands/health.d.ts +4 -0
  4. package/dist/cli/commands/health.d.ts.map +1 -0
  5. package/dist/cli/commands/health.js +36 -0
  6. package/dist/cli/commands/health.js.map +1 -0
  7. package/dist/cli/commands/init.d.ts +2 -0
  8. package/dist/cli/commands/init.d.ts.map +1 -0
  9. package/dist/cli/commands/init.js +81 -0
  10. package/dist/cli/commands/init.js.map +1 -0
  11. package/dist/cli/commands/server.d.ts +10 -0
  12. package/dist/cli/commands/server.d.ts.map +1 -0
  13. package/dist/cli/commands/server.js +108 -0
  14. package/dist/cli/commands/server.js.map +1 -0
  15. package/dist/cli/commands/start.d.ts +6 -0
  16. package/dist/cli/commands/start.d.ts.map +1 -0
  17. package/dist/cli/commands/start.js +63 -0
  18. package/dist/cli/commands/start.js.map +1 -0
  19. package/dist/cli/commands/status.d.ts +2 -0
  20. package/dist/cli/commands/status.d.ts.map +1 -0
  21. package/dist/cli/commands/status.js +21 -0
  22. package/dist/cli/commands/status.js.map +1 -0
  23. package/dist/cli/commands/tools.d.ts +8 -0
  24. package/dist/cli/commands/tools.d.ts.map +1 -0
  25. package/dist/cli/commands/tools.js +28 -0
  26. package/dist/cli/commands/tools.js.map +1 -0
  27. package/dist/cli/index.d.ts +1 -1
  28. package/dist/cli/index.d.ts.map +1 -1
  29. package/dist/cli/index.js +82 -30
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/ui/banner.d.ts +8 -0
  32. package/dist/cli/ui/banner.d.ts.map +1 -0
  33. package/dist/cli/ui/banner.js +54 -0
  34. package/dist/cli/ui/banner.js.map +1 -0
  35. package/dist/cli/ui/prompts.d.ts +11 -0
  36. package/dist/cli/ui/prompts.d.ts.map +1 -0
  37. package/dist/cli/ui/prompts.js +74 -0
  38. package/dist/cli/ui/prompts.js.map +1 -0
  39. package/dist/cli/ui/table.d.ts +5 -0
  40. package/dist/cli/ui/table.d.ts.map +1 -0
  41. package/dist/cli/ui/table.js +103 -0
  42. package/dist/cli/ui/table.js.map +1 -0
  43. package/dist/config/defaults.d.ts +5 -0
  44. package/dist/config/defaults.d.ts.map +1 -0
  45. package/dist/config/defaults.js +18 -0
  46. package/dist/config/defaults.js.map +1 -0
  47. package/dist/config/loader.d.ts +4 -0
  48. package/dist/config/loader.d.ts.map +1 -0
  49. package/dist/config/loader.js +57 -0
  50. package/dist/config/loader.js.map +1 -0
  51. package/dist/config/schema.d.ts +2 -0
  52. package/dist/config/schema.d.ts.map +1 -0
  53. package/dist/config/schema.js +2 -0
  54. package/dist/config/schema.js.map +1 -0
  55. package/dist/core/discovery.d.ts +17 -0
  56. package/dist/core/discovery.d.ts.map +1 -0
  57. package/dist/core/discovery.js +31 -0
  58. package/dist/core/discovery.js.map +1 -0
  59. package/dist/core/proxy.d.ts +14 -0
  60. package/dist/core/proxy.d.ts.map +1 -0
  61. package/dist/core/proxy.js +36 -0
  62. package/dist/core/proxy.js.map +1 -0
  63. package/dist/core/registry.d.ts +28 -31
  64. package/dist/core/registry.d.ts.map +1 -1
  65. package/dist/core/registry.js +90 -234
  66. package/dist/core/registry.js.map +1 -1
  67. package/dist/core/server-manager.d.ts +18 -0
  68. package/dist/core/server-manager.d.ts.map +1 -0
  69. package/dist/core/server-manager.js +120 -0
  70. package/dist/core/server-manager.js.map +1 -0
  71. package/dist/index.d.ts +11 -12
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +14 -9
  74. package/dist/index.js.map +1 -1
  75. package/dist/server/app.d.ts +8 -0
  76. package/dist/server/app.d.ts.map +1 -0
  77. package/dist/server/app.js +35 -0
  78. package/dist/server/app.js.map +1 -0
  79. package/dist/server/mcp-gateway.d.ts +12 -0
  80. package/dist/server/mcp-gateway.d.ts.map +1 -0
  81. package/dist/server/mcp-gateway.js +91 -0
  82. package/dist/server/mcp-gateway.js.map +1 -0
  83. package/dist/server/routes/health.d.ts +4 -0
  84. package/dist/server/routes/health.d.ts.map +1 -0
  85. package/dist/server/routes/health.js +22 -0
  86. package/dist/server/routes/health.js.map +1 -0
  87. package/dist/server/routes/servers.d.ts +4 -0
  88. package/dist/server/routes/servers.d.ts.map +1 -0
  89. package/dist/server/routes/servers.js +47 -0
  90. package/dist/server/routes/servers.js.map +1 -0
  91. package/dist/server/routes/tools.d.ts +4 -0
  92. package/dist/server/routes/tools.d.ts.map +1 -0
  93. package/dist/server/routes/tools.js +44 -0
  94. package/dist/server/routes/tools.js.map +1 -0
  95. package/dist/storage/database.d.ts +41 -0
  96. package/dist/storage/database.d.ts.map +1 -0
  97. package/dist/storage/database.js +195 -0
  98. package/dist/storage/database.js.map +1 -0
  99. package/dist/storage/repositories/server-repo.d.ts +2 -0
  100. package/dist/storage/repositories/server-repo.d.ts.map +1 -0
  101. package/dist/storage/repositories/server-repo.js +3 -0
  102. package/dist/storage/repositories/server-repo.js.map +1 -0
  103. package/dist/storage/repositories/tool-repo.d.ts +2 -0
  104. package/dist/storage/repositories/tool-repo.d.ts.map +1 -0
  105. package/dist/storage/repositories/tool-repo.js +3 -0
  106. package/dist/storage/repositories/tool-repo.js.map +1 -0
  107. package/dist/types/index.d.ts +384 -591
  108. package/dist/types/index.d.ts.map +1 -1
  109. package/dist/types/index.js +44 -69
  110. package/dist/types/index.js.map +1 -1
  111. package/dist/utils/logger.d.ts +7 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +23 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/package.json +65 -56
  116. package/.env.example +0 -19
  117. package/config/servers.example.yaml +0 -67
  118. package/config/servers.yaml +0 -2
  119. package/dist/cli/discover.d.ts +0 -3
  120. package/dist/cli/discover.d.ts.map +0 -1
  121. package/dist/cli/discover.js +0 -160
  122. package/dist/cli/discover.js.map +0 -1
  123. package/dist/connectors/base.d.ts +0 -49
  124. package/dist/connectors/base.d.ts.map +0 -1
  125. package/dist/connectors/base.js +0 -45
  126. package/dist/connectors/base.js.map +0 -1
  127. package/dist/connectors/custom.d.ts +0 -19
  128. package/dist/connectors/custom.d.ts.map +0 -1
  129. package/dist/connectors/custom.js +0 -129
  130. package/dist/connectors/custom.js.map +0 -1
  131. package/dist/connectors/github.d.ts +0 -18
  132. package/dist/connectors/github.d.ts.map +0 -1
  133. package/dist/connectors/github.js +0 -188
  134. package/dist/connectors/github.js.map +0 -1
  135. package/dist/connectors/google-drive.d.ts +0 -18
  136. package/dist/connectors/google-drive.d.ts.map +0 -1
  137. package/dist/connectors/google-drive.js +0 -209
  138. package/dist/connectors/google-drive.js.map +0 -1
  139. package/dist/connectors/index.d.ts +0 -11
  140. package/dist/connectors/index.d.ts.map +0 -1
  141. package/dist/connectors/index.js +0 -76
  142. package/dist/connectors/index.js.map +0 -1
  143. package/dist/connectors/postgres.d.ts +0 -18
  144. package/dist/connectors/postgres.d.ts.map +0 -1
  145. package/dist/connectors/postgres.js +0 -140
  146. package/dist/connectors/postgres.js.map +0 -1
  147. package/dist/connectors/slack.d.ts +0 -18
  148. package/dist/connectors/slack.d.ts.map +0 -1
  149. package/dist/connectors/slack.js +0 -181
  150. package/dist/connectors/slack.js.map +0 -1
  151. package/dist/core/auth.d.ts +0 -26
  152. package/dist/core/auth.d.ts.map +0 -1
  153. package/dist/core/auth.js +0 -81
  154. package/dist/core/auth.js.map +0 -1
  155. package/dist/core/tokenizer.d.ts +0 -16
  156. package/dist/core/tokenizer.d.ts.map +0 -1
  157. package/dist/core/tokenizer.js +0 -29
  158. package/dist/core/tokenizer.js.map +0 -1
  159. package/dist/governance/audit.d.ts +0 -27
  160. package/dist/governance/audit.d.ts.map +0 -1
  161. package/dist/governance/audit.js +0 -149
  162. package/dist/governance/audit.js.map +0 -1
  163. package/dist/governance/index.d.ts +0 -5
  164. package/dist/governance/index.d.ts.map +0 -1
  165. package/dist/governance/index.js +0 -5
  166. package/dist/governance/index.js.map +0 -1
  167. package/dist/governance/policy.d.ts +0 -20
  168. package/dist/governance/policy.d.ts.map +0 -1
  169. package/dist/governance/policy.js +0 -162
  170. package/dist/governance/policy.js.map +0 -1
  171. package/dist/governance/rate-limiter.d.ts +0 -20
  172. package/dist/governance/rate-limiter.d.ts.map +0 -1
  173. package/dist/governance/rate-limiter.js +0 -73
  174. package/dist/governance/rate-limiter.js.map +0 -1
  175. package/dist/governance/types.d.ts +0 -246
  176. package/dist/governance/types.d.ts.map +0 -1
  177. package/dist/governance/types.js +0 -72
  178. package/dist/governance/types.js.map +0 -1
  179. package/dist/identity/access-control.d.ts +0 -15
  180. package/dist/identity/access-control.d.ts.map +0 -1
  181. package/dist/identity/access-control.js +0 -81
  182. package/dist/identity/access-control.js.map +0 -1
  183. package/dist/identity/index.d.ts +0 -4
  184. package/dist/identity/index.d.ts.map +0 -1
  185. package/dist/identity/index.js +0 -4
  186. package/dist/identity/index.js.map +0 -1
  187. package/dist/identity/manager.d.ts +0 -29
  188. package/dist/identity/manager.d.ts.map +0 -1
  189. package/dist/identity/manager.js +0 -167
  190. package/dist/identity/manager.js.map +0 -1
  191. package/dist/identity/types.d.ts +0 -237
  192. package/dist/identity/types.d.ts.map +0 -1
  193. package/dist/identity/types.js +0 -80
  194. package/dist/identity/types.js.map +0 -1
  195. package/dist/registry/server.d.ts +0 -14
  196. package/dist/registry/server.d.ts.map +0 -1
  197. package/dist/registry/server.js +0 -177
  198. package/dist/registry/server.js.map +0 -1
  199. package/dist/utils/config.d.ts +0 -29
  200. package/dist/utils/config.d.ts.map +0 -1
  201. package/dist/utils/config.js +0 -47
  202. package/dist/utils/config.js.map +0 -1
  203. package/dist/utils/index.d.ts +0 -7
  204. package/dist/utils/index.d.ts.map +0 -1
  205. package/dist/utils/index.js +0 -44
  206. package/dist/utils/index.js.map +0 -1
  207. package/dist/workflow/engine.d.ts +0 -18
  208. package/dist/workflow/engine.d.ts.map +0 -1
  209. package/dist/workflow/engine.js +0 -155
  210. package/dist/workflow/engine.js.map +0 -1
  211. package/dist/workflow/index.d.ts +0 -4
  212. package/dist/workflow/index.d.ts.map +0 -1
  213. package/dist/workflow/index.js +0 -4
  214. package/dist/workflow/index.js.map +0 -1
  215. package/dist/workflow/templates.d.ts +0 -4
  216. package/dist/workflow/templates.d.ts.map +0 -1
  217. package/dist/workflow/templates.js +0 -218
  218. package/dist/workflow/templates.js.map +0 -1
  219. package/dist/workflow/types.d.ts +0 -255
  220. package/dist/workflow/types.d.ts.map +0 -1
  221. package/dist/workflow/types.js +0 -48
  222. package/dist/workflow/types.js.map +0 -1
  223. package/eslint.config.js +0 -25
@@ -0,0 +1,63 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { OpalServeRegistry } from '../../core/registry.js';
4
+ import { startServer } from '../../server/app.js';
5
+ import { showMiniBanner, showSuccess, showError, showInfo } from '../ui/banner.js';
6
+ export async function startCommand(options) {
7
+ showMiniBanner();
8
+ const spinner = ora({ text: 'Loading configuration...', color: 'yellow' }).start();
9
+ try {
10
+ const registry = await OpalServeRegistry.create();
11
+ spinner.succeed('Configuration loaded');
12
+ // Connect servers
13
+ const servers = registry.config.servers.filter(s => s.enabled);
14
+ if (servers.length > 0) {
15
+ console.log('');
16
+ showInfo(`Connecting to ${servers.length} server(s)...`);
17
+ console.log('');
18
+ for (const server of servers) {
19
+ const serverSpinner = ora({
20
+ text: ` ${server.name}`,
21
+ color: 'cyan',
22
+ indent: 2,
23
+ }).start();
24
+ try {
25
+ await registry.addServer(server);
26
+ const status = registry.listServers().find(s => s.name === server.name);
27
+ serverSpinner.succeed(` ${chalk.white(server.name)} ${chalk.dim(`(${status?.toolCount || 0} tools)`)}`);
28
+ }
29
+ catch (error) {
30
+ const msg = error instanceof Error ? error.message : String(error);
31
+ serverSpinner.fail(` ${chalk.white(server.name)} ${chalk.red(msg)}`);
32
+ }
33
+ }
34
+ }
35
+ // Start HTTP API
36
+ const port = options.port ? parseInt(options.port, 10) : undefined;
37
+ const app = await startServer(registry, { port, host: options.host });
38
+ const address = app.addresses()[0];
39
+ console.log('');
40
+ showSuccess(`HTTP API listening on ${chalk.cyan(`http://${address.address}:${address.port}`)}`);
41
+ const toolCount = registry.listTools().length;
42
+ const serverCount = registry.listServers().filter(s => s.status === 'connected').length;
43
+ showInfo(`${chalk.bold(String(toolCount))} tools available across ${chalk.bold(String(serverCount))} server(s)`);
44
+ console.log(` ${chalk.dim('Press Ctrl+C to stop')}\n`);
45
+ // Graceful shutdown
46
+ const shutdown = async () => {
47
+ console.log('');
48
+ const stopSpinner = ora('Shutting down...').start();
49
+ await app.close();
50
+ await registry.stop();
51
+ stopSpinner.succeed('Stopped');
52
+ process.exit(0);
53
+ };
54
+ process.on('SIGINT', shutdown);
55
+ process.on('SIGTERM', shutdown);
56
+ }
57
+ catch (error) {
58
+ spinner.fail('Failed to start');
59
+ showError(error instanceof Error ? error.message : String(error));
60
+ process.exit(1);
61
+ }
62
+ }
63
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBnD"}
@@ -0,0 +1,21 @@
1
+ import chalk from 'chalk';
2
+ import { OpalServeRegistry } from '../../core/registry.js';
3
+ import { showMiniBanner } from '../ui/banner.js';
4
+ import { renderServerTable } from '../ui/table.js';
5
+ export async function statusCommand() {
6
+ showMiniBanner();
7
+ const registry = await OpalServeRegistry.create();
8
+ const servers = registry.listServers();
9
+ const tools = registry.listTools();
10
+ const connected = servers.filter(s => s.status === 'connected').length;
11
+ console.log(` ${chalk.bold('Status')}\n`);
12
+ console.log(` Servers: ${chalk.bold(String(servers.length))} registered, ${chalk.green(String(connected))} connected`);
13
+ console.log(` Tools: ${chalk.bold(String(tools.length))} available`);
14
+ console.log('');
15
+ if (servers.length > 0) {
16
+ console.log(renderServerTable(servers));
17
+ console.log('');
18
+ }
19
+ registry.getDatabase().close();
20
+ }
21
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,cAAc,EAAE,CAAC;IAEjB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,gBAAgB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;IACzH,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function toolsListCommand(options: {
2
+ server?: string;
3
+ }): Promise<void>;
4
+ export declare function toolsSearchCommand(query: string, options: {
5
+ limit?: string;
6
+ server?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tools.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlF;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAenH"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ import { OpalServeRegistry } from '../../core/registry.js';
3
+ import { showMiniBanner } from '../ui/banner.js';
4
+ import { renderToolList, renderSearchResults } from '../ui/table.js';
5
+ export async function toolsListCommand(options) {
6
+ showMiniBanner();
7
+ const registry = await OpalServeRegistry.create();
8
+ const serverFilter = options.server ? options.server.split(',') : undefined;
9
+ const tools = registry.listTools(serverFilter);
10
+ console.log(` ${chalk.bold('Available Tools')} ${chalk.dim(`(${tools.length})`)}`);
11
+ console.log(renderToolList(tools));
12
+ console.log('');
13
+ registry.getDatabase().close();
14
+ }
15
+ export async function toolsSearchCommand(query, options) {
16
+ showMiniBanner();
17
+ const registry = await OpalServeRegistry.create();
18
+ const serverFilter = options.server ? options.server.split(',') : undefined;
19
+ const results = registry.searchTools(query, {
20
+ limit: options.limit ? parseInt(options.limit, 10) : 10,
21
+ serverFilter,
22
+ });
23
+ console.log(` ${chalk.bold('Search results')} for "${chalk.cyan(query)}"\n`);
24
+ console.log(renderSearchResults(results));
25
+ console.log('');
26
+ registry.getDatabase().close();
27
+ }
28
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/cli/commands/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA4B;IACjE,cAAc,EAAE,CAAC;IAEjB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAA4C;IAClG,cAAc,EAAE,CAAC;IAEjB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,YAAY;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import 'dotenv/config';
2
+ export {};
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAIA,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
package/dist/cli/index.js CHANGED
@@ -1,33 +1,85 @@
1
1
  #!/usr/bin/env node
2
- import { RegistryServer } from '../registry/server.js';
3
- import 'dotenv/config';
4
- const config = {
5
- port: parseInt(process.env.PORT || '3000', 10),
6
- host: process.env.HOST || 'localhost',
7
- jwtSecret: process.env.JWT_SECRET || 'dev-secret-change-in-production',
8
- apiKey: process.env.API_KEY,
9
- maxToolsPerResponse: parseInt(process.env.MAX_TOOLS_PER_RESPONSE || '50', 10),
10
- contextTokenBudget: parseInt(process.env.CONTEXT_TOKEN_BUDGET || '128000', 10),
11
- enableAuth: process.env.ENABLE_AUTH === 'true',
12
- };
13
- const server = new RegistryServer(config);
14
- process.on('SIGINT', async () => {
15
- await server.stop();
16
- process.exit(0);
17
- });
18
- process.on('SIGTERM', async () => {
19
- await server.stop();
20
- process.exit(0);
21
- });
22
- console.log(`
23
- ╔══════════════════════════════════════════════════════════════╗
24
- ║ O P A L S E R V E ║
25
- ║ MCP Tool Registry & Discovery Hub ║
26
- ║ Enterprise Edition ║
27
- ╚══════════════════════════════════════════════════════════════╝
28
- `);
29
- server.start().catch((error) => {
30
- console.error('Failed to start server:', error);
31
- process.exit(1);
2
+ import { Command } from 'commander';
3
+ import { showBanner } from './ui/banner.js';
4
+ import { initCommand } from './commands/init.js';
5
+ import { startCommand } from './commands/start.js';
6
+ import { serverListCommand, serverAddCommand, serverRemoveCommand } from './commands/server.js';
7
+ import { toolsListCommand, toolsSearchCommand } from './commands/tools.js';
8
+ import { statusCommand } from './commands/status.js';
9
+ import { healthCommand } from './commands/health.js';
10
+ const program = new Command()
11
+ .name('opalserve')
12
+ .description('Local MCP tool registry and discovery hub')
13
+ .version('2.0.0')
14
+ .hook('preAction', (thisCommand) => {
15
+ // Show banner only for root-level commands, not subcommands help
16
+ if (thisCommand.args.length === 0 || !['--help', '-h'].includes(thisCommand.args[0])) {
17
+ // Banner is shown inside each command
18
+ }
32
19
  });
20
+ // --- Init ---
21
+ program
22
+ .command('init')
23
+ .description('Interactive setup wizard')
24
+ .action(initCommand);
25
+ // --- Start ---
26
+ program
27
+ .command('start')
28
+ .description('Start the registry server')
29
+ .option('-p, --port <port>', 'HTTP API port')
30
+ .option('-h, --host <host>', 'HTTP API host')
31
+ .option('-c, --config <path>', 'Config file path')
32
+ .action(startCommand);
33
+ // --- Status ---
34
+ program
35
+ .command('status')
36
+ .description('Show server status and tool counts')
37
+ .action(statusCommand);
38
+ // --- Server management ---
39
+ const serverCmd = program
40
+ .command('server')
41
+ .description('Manage MCP servers');
42
+ serverCmd
43
+ .command('list')
44
+ .description('List all registered servers')
45
+ .action(serverListCommand);
46
+ serverCmd
47
+ .command('add')
48
+ .description('Register a new MCP server')
49
+ .option('-n, --name <name>', 'Server name')
50
+ .option('-s, --stdio <command>', 'Stdio transport command (e.g., "npx -y @mcp/server")')
51
+ .option('-u, --url <url>', 'Remote server URL (for SSE/HTTP transport)')
52
+ .option('-t, --transport <type>', 'Transport type (sse or streamable-http)', 'sse')
53
+ .option('-e, --env <vars...>', 'Environment variables (KEY=VALUE)')
54
+ .action(serverAddCommand);
55
+ serverCmd
56
+ .command('remove <name>')
57
+ .description('Remove a registered server')
58
+ .action(serverRemoveCommand);
59
+ // --- Tools ---
60
+ const toolsCmd = program
61
+ .command('tools')
62
+ .description('Discover and search tools');
63
+ toolsCmd
64
+ .command('list')
65
+ .description('List all discovered tools')
66
+ .option('-s, --server <names>', 'Filter by server name(s), comma-separated')
67
+ .action(toolsListCommand);
68
+ toolsCmd
69
+ .command('search <query>')
70
+ .description('Search for tools')
71
+ .option('-l, --limit <n>', 'Max results', '10')
72
+ .option('-s, --server <names>', 'Filter by server name(s), comma-separated')
73
+ .action(toolsSearchCommand);
74
+ // --- Health ---
75
+ program
76
+ .command('health')
77
+ .description('Health check all servers')
78
+ .option('-s, --server <name>', 'Check specific server')
79
+ .action(healthCommand);
80
+ // Show banner on bare `opalserve` with no args
81
+ if (process.argv.length <= 2) {
82
+ showBanner();
83
+ }
84
+ program.parse();
33
85
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,eAAe,CAAC;AAEvB,MAAM,MAAM,GAAmB;IAC7B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC;IAC9C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW;IACrC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,iCAAiC;IACtE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;IAC3B,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,EAAE,EAAE,CAAC;IAC7E,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,QAAQ,EAAE,EAAE,CAAC;IAC9E,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM;CAC/C,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AAE1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC;;;;;;CAMX,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function showBanner(): void;
2
+ export declare function showMiniBanner(): void;
3
+ export declare function showBox(content: string, title?: string): void;
4
+ export declare function showSuccess(message: string): void;
5
+ export declare function showError(message: string): void;
6
+ export declare function showWarning(message: string): void;
7
+ export declare function showInfo(message: string): void;
8
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/banner.ts"],"names":[],"mappings":"AAoBA,wBAAgB,UAAU,IAAI,IAAI,CASjC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAS7D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C"}
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import gradient from 'gradient-string';
3
+ import boxen from 'boxen';
4
+ const ASCII_LOGO = `
5
+ ██████╗ ██████╗ █████╗ ██╗
6
+ ██╔═══██╗██╔══██╗██╔══██╗██║
7
+ ██║ ██║██████╔╝███████║██║
8
+ ██║ ██║██╔═══╝ ██╔══██║██║
9
+ ╚██████╔╝██║ ██║ ██║███████╗
10
+ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝
11
+ ███████╗███████╗██████╗ ██╗ ██╗███████╗
12
+ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝
13
+ ███████╗█████╗ ██████╔╝██║ ██║█████╗
14
+ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝
15
+ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗
16
+ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝`;
17
+ const opalGradient = gradient(['#F59E0B', '#F97316', '#EF4444', '#8B5CF6']);
18
+ export function showBanner() {
19
+ const banner = opalGradient.multiline(ASCII_LOGO);
20
+ const version = chalk.dim('v2.0.0');
21
+ const tagline = chalk.gray('Local MCP Tool Registry & Discovery Hub');
22
+ console.log('');
23
+ console.log(banner);
24
+ console.log(` ${tagline} ${version}`);
25
+ console.log('');
26
+ }
27
+ export function showMiniBanner() {
28
+ const title = opalGradient('OpalServe');
29
+ const version = chalk.dim('v2.0.0');
30
+ console.log(`\n ${title} ${version}\n`);
31
+ }
32
+ export function showBox(content, title) {
33
+ console.log(boxen(content, {
34
+ padding: 1,
35
+ margin: { top: 0, bottom: 1, left: 2, right: 2 },
36
+ borderStyle: 'round',
37
+ borderColor: '#F97316',
38
+ title,
39
+ titleAlignment: 'left',
40
+ }));
41
+ }
42
+ export function showSuccess(message) {
43
+ console.log(` ${chalk.green('✓')} ${message}`);
44
+ }
45
+ export function showError(message) {
46
+ console.log(` ${chalk.red('✗')} ${message}`);
47
+ }
48
+ export function showWarning(message) {
49
+ console.log(` ${chalk.yellow('!')} ${message}`);
50
+ }
51
+ export function showInfo(message) {
52
+ console.log(` ${chalk.blue('i')} ${message}`);
53
+ }
54
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/cli/ui/banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,GAAG;;;;;;;;;;;;6CAY0B,CAAC;AAE9C,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE5E,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,OAAO,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,KAAc;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QAChD,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,SAAS;QACtB,KAAK;QACL,cAAc,EAAE,MAAM;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function promptServerName(): Promise<string>;
2
+ export declare function promptTransportType(): Promise<'stdio' | 'sse' | 'streamable-http'>;
3
+ export declare function promptStdioCommand(): Promise<{
4
+ command: string;
5
+ args: string[];
6
+ }>;
7
+ export declare function promptUrl(): Promise<string>;
8
+ export declare function promptEnvVars(): Promise<Record<string, string>>;
9
+ export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
10
+ export declare function promptPort(): Promise<number>;
11
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/prompts.ts"],"names":[],"mappings":"AAEA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,GAAG,KAAK,GAAG,iBAAiB,CAAC,CASxF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAYvF;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAYjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoBrE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1F;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAUlD"}
@@ -0,0 +1,74 @@
1
+ import { input, select, confirm } from '@inquirer/prompts';
2
+ export async function promptServerName() {
3
+ return input({
4
+ message: 'Server name (lowercase, hyphens ok):',
5
+ validate: (val) => /^[a-z0-9-]+$/.test(val) || 'Must be lowercase alphanumeric with hyphens',
6
+ });
7
+ }
8
+ export async function promptTransportType() {
9
+ return select({
10
+ message: 'Transport type:',
11
+ choices: [
12
+ { value: 'stdio', name: 'stdio — Local process (most common)' },
13
+ { value: 'sse', name: 'SSE — Remote HTTP+SSE endpoint' },
14
+ { value: 'streamable-http', name: 'Streamable HTTP — Remote HTTP endpoint' },
15
+ ],
16
+ });
17
+ }
18
+ export async function promptStdioCommand() {
19
+ const command = await input({
20
+ message: 'Command to run:',
21
+ default: 'npx',
22
+ });
23
+ const argsStr = await input({
24
+ message: 'Arguments (space-separated):',
25
+ default: '-y @modelcontextprotocol/server-filesystem .',
26
+ });
27
+ return { command, args: argsStr.split(/\s+/).filter(Boolean) };
28
+ }
29
+ export async function promptUrl() {
30
+ return input({
31
+ message: 'Server URL:',
32
+ validate: (val) => {
33
+ try {
34
+ new URL(val);
35
+ return true;
36
+ }
37
+ catch {
38
+ return 'Must be a valid URL';
39
+ }
40
+ },
41
+ });
42
+ }
43
+ export async function promptEnvVars() {
44
+ const env = {};
45
+ let addMore = await confirm({
46
+ message: 'Add environment variables?',
47
+ default: false,
48
+ });
49
+ while (addMore) {
50
+ const name = await input({ message: 'Variable name:' });
51
+ const value = await input({ message: `Value for ${name}:` });
52
+ env[name] = value;
53
+ addMore = await confirm({
54
+ message: 'Add another variable?',
55
+ default: false,
56
+ });
57
+ }
58
+ return env;
59
+ }
60
+ export async function promptConfirm(message, defaultValue = true) {
61
+ return confirm({ message, default: defaultValue });
62
+ }
63
+ export async function promptPort() {
64
+ const portStr = await input({
65
+ message: 'HTTP API port:',
66
+ default: '3456',
67
+ validate: (val) => {
68
+ const n = parseInt(val, 10);
69
+ return (n >= 1 && n <= 65535) || 'Must be 1-65535';
70
+ },
71
+ });
72
+ return parseInt(portStr, 10);
73
+ }
74
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/cli/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ConnectedServer, IndexedTool, SearchResult } from '../../types/index.js';
2
+ export declare function renderServerTable(servers: ConnectedServer[]): string;
3
+ export declare function renderToolList(tools: IndexedTool[]): string;
4
+ export declare function renderSearchResults(results: SearchResult[]): string;
5
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/table.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAyBvF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAiCpE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAwB3D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CA2BnE"}
@@ -0,0 +1,103 @@
1
+ import chalk from 'chalk';
2
+ import Table from 'cli-table3';
3
+ const STATUS_COLORS = {
4
+ connected: chalk.green,
5
+ connecting: chalk.yellow,
6
+ disconnected: chalk.gray,
7
+ error: chalk.red,
8
+ };
9
+ function colorStatus(status) {
10
+ const colorFn = STATUS_COLORS[status] || chalk.white;
11
+ return colorFn(status);
12
+ }
13
+ function timeAgo(dateStr) {
14
+ const now = Date.now();
15
+ const then = new Date(dateStr).getTime();
16
+ const diffSec = Math.floor((now - then) / 1000);
17
+ if (diffSec < 60)
18
+ return `${diffSec}s ago`;
19
+ if (diffSec < 3600)
20
+ return `${Math.floor(diffSec / 60)}m ago`;
21
+ if (diffSec < 86400)
22
+ return `${Math.floor(diffSec / 3600)}h ago`;
23
+ return `${Math.floor(diffSec / 86400)}d ago`;
24
+ }
25
+ export function renderServerTable(servers) {
26
+ if (servers.length === 0) {
27
+ return chalk.gray(' No servers registered. Run `opalserve server add` to add one.');
28
+ }
29
+ const table = new Table({
30
+ head: [
31
+ chalk.bold('Name'),
32
+ chalk.bold('Transport'),
33
+ chalk.bold('Tools'),
34
+ chalk.bold('Status'),
35
+ chalk.bold('Last Seen'),
36
+ ],
37
+ style: { head: [], border: ['gray'] },
38
+ chars: {
39
+ 'top': '─', 'top-mid': '┬', 'top-left': '┌', 'top-right': '┐',
40
+ 'bottom': '─', 'bottom-mid': '┴', 'bottom-left': '└', 'bottom-right': '┘',
41
+ 'left': '│', 'left-mid': '├', 'mid': '─', 'mid-mid': '┼',
42
+ 'right': '│', 'right-mid': '┤', 'middle': '│',
43
+ },
44
+ });
45
+ for (const server of servers) {
46
+ table.push([
47
+ chalk.white(server.name),
48
+ chalk.dim(server.transport),
49
+ chalk.cyan(String(server.toolCount)),
50
+ colorStatus(server.status),
51
+ server.lastSeen ? chalk.dim(timeAgo(server.lastSeen)) : chalk.dim('never'),
52
+ ]);
53
+ }
54
+ return table.toString();
55
+ }
56
+ export function renderToolList(tools) {
57
+ if (tools.length === 0) {
58
+ return chalk.gray(' No tools discovered. Connect a server first.');
59
+ }
60
+ // Group by server
61
+ const grouped = new Map();
62
+ for (const tool of tools) {
63
+ const existing = grouped.get(tool.serverName) || [];
64
+ existing.push(tool);
65
+ grouped.set(tool.serverName, existing);
66
+ }
67
+ const lines = [];
68
+ for (const [serverName, serverTools] of grouped) {
69
+ lines.push(`\n ${chalk.bold.white(serverName)} ${chalk.dim(`(${serverTools.length} tools)`)}`);
70
+ for (const tool of serverTools) {
71
+ const name = chalk.cyan(tool.name.padEnd(26));
72
+ const desc = chalk.gray(tool.description || '');
73
+ lines.push(` ${name}${desc}`);
74
+ }
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ export function renderSearchResults(results) {
79
+ if (results.length === 0) {
80
+ return chalk.gray(' No results found.');
81
+ }
82
+ const table = new Table({
83
+ head: [
84
+ chalk.bold('Rank'),
85
+ chalk.bold('Tool'),
86
+ chalk.bold('Server'),
87
+ chalk.bold('Description'),
88
+ ],
89
+ style: { head: [], border: ['gray'] },
90
+ colWidths: [8, 28, 18, 44],
91
+ wordWrap: true,
92
+ });
93
+ results.forEach((result, index) => {
94
+ table.push([
95
+ chalk.yellow(`#${index + 1}`),
96
+ chalk.cyan(result.tool.name),
97
+ chalk.dim(result.tool.serverName),
98
+ chalk.gray(result.tool.description || ''),
99
+ ]);
100
+ });
101
+ return table.toString();
102
+ }
103
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/cli/ui/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { OpalServeConfig } from '../types/index.js';
2
+ export declare function getConfigDir(): string;
3
+ export declare function getDefaultDbPath(): string;
4
+ export declare function getDefaultConfig(): OpalServeConfig;
5
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CAOlD"}
@@ -0,0 +1,18 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ const OPALSERVE_DIR = join(homedir(), '.opalserve');
4
+ export function getConfigDir() {
5
+ return OPALSERVE_DIR;
6
+ }
7
+ export function getDefaultDbPath() {
8
+ return join(OPALSERVE_DIR, 'data.db');
9
+ }
10
+ export function getDefaultConfig() {
11
+ return {
12
+ servers: [],
13
+ gateway: { port: 3456, host: '127.0.0.1' },
14
+ storage: { path: '' },
15
+ logging: { level: 'info' },
16
+ };
17
+ }
18
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACrB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KAC3B,CAAC;AACJ,CAAC"}