hoolix 0.0.1 → 0.0.3

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 (67) hide show
  1. package/README.md +31 -1
  2. package/dist/commands/approvals.d.ts +2 -0
  3. package/dist/commands/approvals.d.ts.map +1 -0
  4. package/dist/commands/approvals.js +65 -0
  5. package/dist/commands/approvals.js.map +1 -0
  6. package/dist/commands/completion.d.ts.map +1 -1
  7. package/dist/commands/completion.js +123 -2
  8. package/dist/commands/completion.js.map +1 -1
  9. package/dist/commands/connect.d.ts.map +1 -1
  10. package/dist/commands/connect.js +8 -0
  11. package/dist/commands/connect.js.map +1 -1
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +44 -1
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/gateway.d.ts +2 -0
  16. package/dist/commands/gateway.d.ts.map +1 -0
  17. package/dist/commands/gateway.js +237 -0
  18. package/dist/commands/gateway.js.map +1 -0
  19. package/dist/commands/list.d.ts.map +1 -1
  20. package/dist/commands/list.js +22 -3
  21. package/dist/commands/list.js.map +1 -1
  22. package/dist/commands/profile.d.ts +2 -0
  23. package/dist/commands/profile.d.ts.map +1 -0
  24. package/dist/commands/profile.js +169 -0
  25. package/dist/commands/profile.js.map +1 -0
  26. package/dist/core/approvals.d.ts +67 -0
  27. package/dist/core/approvals.d.ts.map +1 -0
  28. package/dist/core/approvals.js +104 -0
  29. package/dist/core/approvals.js.map +1 -0
  30. package/dist/core/gateways.d.ts +62 -0
  31. package/dist/core/gateways.d.ts.map +1 -0
  32. package/dist/core/gateways.js +115 -0
  33. package/dist/core/gateways.js.map +1 -0
  34. package/dist/core/paths.d.ts +9 -0
  35. package/dist/core/paths.d.ts.map +1 -1
  36. package/dist/core/paths.js +27 -0
  37. package/dist/core/paths.js.map +1 -1
  38. package/dist/core/policy.d.ts +20 -0
  39. package/dist/core/policy.d.ts.map +1 -0
  40. package/dist/core/policy.js +95 -0
  41. package/dist/core/policy.js.map +1 -0
  42. package/dist/core/profiles.d.ts +141 -0
  43. package/dist/core/profiles.d.ts.map +1 -0
  44. package/dist/core/profiles.js +159 -0
  45. package/dist/core/profiles.js.map +1 -0
  46. package/dist/core/version.d.ts +1 -1
  47. package/dist/core/version.js +1 -1
  48. package/dist/index.js +38 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/mcp/gateway-host.d.ts +8 -0
  51. package/dist/mcp/gateway-host.d.ts.map +1 -0
  52. package/dist/mcp/gateway-host.js +447 -0
  53. package/dist/mcp/gateway-host.js.map +1 -0
  54. package/dist/mcp/proxy-host.d.ts.map +1 -1
  55. package/dist/mcp/proxy-host.js +3 -2
  56. package/dist/mcp/proxy-host.js.map +1 -1
  57. package/dist/process/manager.d.ts +17 -1
  58. package/dist/process/manager.d.ts.map +1 -1
  59. package/dist/process/manager.js +105 -1
  60. package/dist/process/manager.js.map +1 -1
  61. package/dist/tui/index.d.ts.map +1 -1
  62. package/dist/tui/index.js +223 -32
  63. package/dist/tui/index.js.map +1 -1
  64. package/dist/ui/help.d.ts.map +1 -1
  65. package/dist/ui/help.js +10 -0
  66. package/dist/ui/help.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,237 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ import { createGateway, getGateway, listGateways } from '../core/gateways.js';
4
+ import { getProfile } from '../core/profiles.js';
5
+ import { serverManager } from '../process/manager.js';
6
+ import { logger } from '../core/logger.js';
7
+ import { ALL_CLIENTS, copyToClipboard, detectPreferredClient, getClientSteps, getConfigPath } from './connect.js';
8
+ import { printTitle, printSection, printDetails, printCommand, printJson, printTable, ui } from '../ui/format.js';
9
+ function parseIncludes(args) {
10
+ const includes = [];
11
+ for (let i = 0; i < args.length; i++) {
12
+ if (args[i] === '--include' && args[i + 1])
13
+ includes.push(args[i + 1]);
14
+ }
15
+ return includes;
16
+ }
17
+ function getPortArg(args) {
18
+ const idx = args.indexOf('--port');
19
+ return idx !== -1 ? parseInt(args[idx + 1] || '0', 10) || undefined : undefined;
20
+ }
21
+ function valueFor(args, flag) {
22
+ const idx = args.indexOf(flag);
23
+ return idx !== -1 ? args[idx + 1] : undefined;
24
+ }
25
+ function buildHttpEntry(authKey, port, profile) {
26
+ return {
27
+ type: 'streamable-http',
28
+ url: `http://127.0.0.1:${port}/mcp`,
29
+ headers: { Authorization: `Bearer ${authKey}`, ...(profile ? { 'X-Hoolix-Profile': profile } : {}) },
30
+ };
31
+ }
32
+ function buildPayload(client, slug, entry, isProject) {
33
+ if (client === 'vscode' && isProject) {
34
+ return { key: 'servers', payload: { servers: { [slug]: entry } } };
35
+ }
36
+ return { key: 'mcpServers', payload: { mcpServers: { [slug]: entry } } };
37
+ }
38
+ async function writeClientConfig(client, key, payload, isProject) {
39
+ const cfgPath = getConfigPath(client, { projectCwd: isProject ? process.cwd() : undefined });
40
+ if (!cfgPath)
41
+ return null;
42
+ let existing = {};
43
+ if (await fs.pathExists(cfgPath)) {
44
+ try {
45
+ existing = await fs.readJson(cfgPath);
46
+ }
47
+ catch {
48
+ existing = {};
49
+ }
50
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
51
+ await fs.copy(cfgPath, `${cfgPath}.${ts}.bak`).catch(() => { });
52
+ }
53
+ if (!existing[key] || typeof existing[key] !== 'object')
54
+ existing[key] = {};
55
+ existing[key] = { ...existing[key], ...(payload[key] ?? {}) };
56
+ await fs.ensureDir(path.dirname(cfgPath));
57
+ await fs.writeJson(cfgPath, existing, { spaces: 2 });
58
+ return cfgPath;
59
+ }
60
+ export async function cmdGateway(args, json) {
61
+ const sub = args[1] || 'list';
62
+ if (sub === 'create') {
63
+ const name = args[2];
64
+ const includes = parseIncludes(args);
65
+ if (!name || includes.length === 0) {
66
+ if (json)
67
+ printJson({ ok: false, error: 'Usage: hoolix gateway create <name> --include <server-slug> ...' });
68
+ else
69
+ logger.error('Usage: hoolix gateway create <name> --include <server-slug> --include <server-slug>');
70
+ process.exit(1);
71
+ }
72
+ try {
73
+ const gateway = await createGateway(name, includes);
74
+ if (json) {
75
+ printJson({ ok: true, gateway, next: [`hoolix gateway start ${gateway.slug}`, `hoolix gateway connect ${gateway.slug} --client codex`] });
76
+ return;
77
+ }
78
+ printTitle('Gateway created', `"${gateway.name}" aggregates ${gateway.backends.length} MCP server(s).`);
79
+ printDetails([
80
+ ['Slug', gateway.slug],
81
+ ['Backends', gateway.backends.map((backend) => `${backend.namespace}=${backend.slug}`).join(', ')],
82
+ ['Auth', 'generated'],
83
+ ]);
84
+ console.log('');
85
+ printSection('Next steps');
86
+ printCommand(`hoolix gateway start ${gateway.slug}`);
87
+ printCommand(`hoolix gateway connect ${gateway.slug} --client codex`);
88
+ }
89
+ catch (e) {
90
+ const message = e instanceof Error ? e.message : String(e);
91
+ if (json)
92
+ printJson({ ok: false, error: message });
93
+ else
94
+ logger.error(message);
95
+ process.exit(1);
96
+ }
97
+ return;
98
+ }
99
+ if (sub === 'list') {
100
+ const gateways = await listGateways();
101
+ const rows = await Promise.all(gateways.map(async (gateway) => {
102
+ const status = await serverManager.getGatewayStatus(gateway.slug);
103
+ return {
104
+ Name: gateway.name,
105
+ Slug: gateway.slug,
106
+ Status: status.running && status.port ? `gateway:${status.port}` : 'stopped',
107
+ Backends: gateway.backends.map((backend) => backend.namespace).join(', '),
108
+ Created: gateway.createdAt.slice(0, 10),
109
+ };
110
+ }));
111
+ if (json) {
112
+ printJson(await Promise.all(gateways.map(async (gateway) => ({ ...gateway, status: await serverManager.getGatewayStatus(gateway.slug) }))));
113
+ return;
114
+ }
115
+ if (gateways.length === 0) {
116
+ printTitle('Gateways', 'No unified MCP gateways yet.');
117
+ printCommand('hoolix gateway create my-tools --include github --include filesystem --include brave-search');
118
+ printCommand('hoolix install github-api --name github --yes');
119
+ return;
120
+ }
121
+ printTitle('Gateways', `${gateways.length} unified gateway${gateways.length === 1 ? '' : 's'}`);
122
+ printTable(rows);
123
+ return;
124
+ }
125
+ if (sub === 'start') {
126
+ const slug = args[2];
127
+ if (!slug) {
128
+ if (json)
129
+ printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway start <name>.' });
130
+ else
131
+ logger.error('Usage: hoolix gateway start <name> [--port N]');
132
+ process.exit(1);
133
+ }
134
+ const gateway = await getGateway(slug);
135
+ const port = getPortArg(args);
136
+ const started = await serverManager.startGateway(gateway.slug, { port, authKey: gateway.authKey });
137
+ if (json) {
138
+ printJson({
139
+ ok: true,
140
+ gateway: gateway.slug,
141
+ mode: 'gateway',
142
+ port: started.port,
143
+ pid: started.pid,
144
+ url: `http://127.0.0.1:${started.port}/mcp`,
145
+ mcpServers: { [gateway.slug]: buildHttpEntry(gateway.authKey, started.port) },
146
+ });
147
+ return;
148
+ }
149
+ printTitle('Gateway running', `"${gateway.name}" is one MCP endpoint for ${gateway.backends.length} server(s).`);
150
+ printDetails([
151
+ ['URL', `http://127.0.0.1:${started.port}/mcp`],
152
+ ['Auth', `Authorization: Bearer ${gateway.authKey}`],
153
+ ['Backends', gateway.backends.map((backend) => `${backend.namespace}.${backend.slug}`).join(', ')],
154
+ ['PID', started.pid],
155
+ ]);
156
+ console.log('');
157
+ printCommand(`hoolix gateway connect ${gateway.slug} --client codex`);
158
+ return;
159
+ }
160
+ if (sub === 'stop') {
161
+ const slug = args[2];
162
+ if (!slug) {
163
+ if (json)
164
+ printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway stop <name>.' });
165
+ else
166
+ logger.error('Usage: hoolix gateway stop <name>');
167
+ process.exit(1);
168
+ }
169
+ const stopped = await serverManager.stopGateway(slug);
170
+ if (json)
171
+ printJson({ ok: true, gateway: slug, stopped });
172
+ else if (stopped)
173
+ logger.success(`Stopped gateway ${slug}`);
174
+ else
175
+ logger.info(`Gateway ${slug} was not running.`);
176
+ return;
177
+ }
178
+ if (sub === 'connect') {
179
+ const slug = args[2];
180
+ if (!slug) {
181
+ if (json)
182
+ printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway connect <name> --client codex.' });
183
+ else
184
+ logger.error('Usage: hoolix gateway connect <name> --client <client>');
185
+ process.exit(1);
186
+ }
187
+ const gateway = await getGateway(slug);
188
+ const status = await serverManager.getGatewayStatus(gateway.slug);
189
+ const port = status.port || getPortArg(args);
190
+ if (!port) {
191
+ if (json)
192
+ printJson({ ok: false, error: `Gateway "${gateway.slug}" is not running. Next: hoolix gateway start ${gateway.slug}.` });
193
+ else
194
+ logger.error(`Gateway "${gateway.slug}" is not running. Next: hoolix gateway start ${gateway.slug}.`);
195
+ process.exit(1);
196
+ }
197
+ const clientIdx = args.indexOf('--client');
198
+ let client = (clientIdx !== -1 ? args[clientIdx + 1] : undefined);
199
+ if (!client || !ALL_CLIENTS.includes(client))
200
+ client = json ? 'generic' : detectPreferredClient();
201
+ const profileName = valueFor(args, '--profile');
202
+ const profile = profileName ? await getProfile(profileName) : null;
203
+ const isProject = args.includes('--project');
204
+ const isDryRun = args.includes('--dry-run');
205
+ const entry = buildHttpEntry(profile?.authKey ?? gateway.authKey, port, profile?.slug);
206
+ const { key, payload } = buildPayload(client, gateway.slug, entry, isProject);
207
+ if (json) {
208
+ printJson({ ...payload, transport: 'http', gateway: gateway.slug, client, profile: profile?.slug ?? null });
209
+ return;
210
+ }
211
+ const cfgPath = isDryRun ? null : await writeClientConfig(client, key, payload, isProject);
212
+ printTitle('Gateway connect ready', `"${gateway.name}" → ${client}${profile ? ` (${profile.slug})` : ''}`);
213
+ printSection('MCP config snippet');
214
+ const entryStr = JSON.stringify(payload, null, 2);
215
+ console.log(entryStr);
216
+ console.log('');
217
+ if (cfgPath)
218
+ console.log(` ${ui.success('✓')} Merged into ${cfgPath}`);
219
+ else if (isDryRun)
220
+ console.log(` ${ui.warning('○')} Dry run — no files written.`);
221
+ else
222
+ console.log(` ${ui.muted('Manual config for this client; no safe auto-write path.')}`);
223
+ console.log('');
224
+ printSection(`Next steps for ${client}`);
225
+ getClientSteps(client, 'http').forEach((step, i) => console.log(` ${i + 1}. ${step}`));
226
+ console.log('');
227
+ if (copyToClipboard(entryStr))
228
+ console.log(` ${ui.success('✓')} Snippet copied to clipboard.`);
229
+ return;
230
+ }
231
+ if (json)
232
+ printJson({ ok: false, error: `Unknown gateway command "${sub}". Next: use create, list, start, stop, or connect.` });
233
+ else
234
+ logger.error(`Unknown gateway command "${sub}". Next: run hoolix gateway list.`);
235
+ process.exit(1);
236
+ }
237
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAMA,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0F1D"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G1D"}
@@ -1,19 +1,22 @@
1
1
  import { validateServerState } from '../core/registry.js';
2
2
  import { getServerSourceLabel, listRegisteredServers } from '../app/services/servers.js';
3
3
  import { serverManager } from '../process/manager.js';
4
+ import { listGateways } from '../core/gateways.js';
4
5
  import { logger } from '../core/logger.js';
5
6
  import { printTitle, printSection, printCommand, printTable, printJson, truncate, getFreshness, formatDate, ui } from '../ui/format.js';
6
7
  export async function cmdList(json) {
7
8
  const servers = await listRegisteredServers();
9
+ const gateways = await listGateways();
8
10
  if (json) {
9
- printJson(servers);
11
+ printJson({ servers, gateways: await Promise.all(gateways.map(async (gateway) => ({ ...gateway, status: await serverManager.getGatewayStatus(gateway.slug) }))) });
10
12
  return;
11
13
  }
12
- if (servers.length === 0) {
13
- printTitle('Servers', 'No MCP servers registered yet.');
14
+ if (servers.length === 0 && gateways.length === 0) {
15
+ printTitle('Servers + Gateways', 'No MCP servers or unified gateways registered yet.');
14
16
  printSection('Create your first server');
15
17
  printCommand('hoolix install filesystem /Users/jay/projects --yes');
16
18
  printCommand('hoolix install github-api --yes');
19
+ printCommand('hoolix gateway create my-tools --include github --include filesystem');
17
20
  printCommand('hoolix create "My Docs" --url https://example.com/docs/llms.txt');
18
21
  printCommand('hoolix templates list');
19
22
  console.log('');
@@ -68,6 +71,22 @@ export async function cmdList(json) {
68
71
  });
69
72
  printTable(rows);
70
73
  console.log('');
74
+ if (gateways.length > 0) {
75
+ const gatewayRows = await Promise.all(gateways.map(async (gateway) => {
76
+ const st = await serverManager.getGatewayStatus(gateway.slug);
77
+ return {
78
+ Name: gateway.name,
79
+ Slug: gateway.slug,
80
+ Kind: 'gateway',
81
+ Status: st.running && st.port ? `gateway:${st.port}` : 'stopped',
82
+ Backends: gateway.backends.map((backend) => backend.namespace).join(', '),
83
+ Created: formatDate(gateway.createdAt),
84
+ };
85
+ }));
86
+ printSection('Unified gateways');
87
+ printTable(gatewayRows);
88
+ console.log('');
89
+ }
71
90
  const proxyRunning = Object.values(statusMap).filter((s) => s.running && s.mode === 'proxy');
72
91
  if (proxyRunning.length > 0) {
73
92
  console.log(` ${ui.success('●')} ${proxyRunning.length} mcp-server(s) running in proxy mode. Use ${ui.accent('hoolix connect <slug>')} for HTTP config.`);
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAExI,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa;IACzC,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnK,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,UAAU,CAAC,oBAAoB,EAAE,oDAAoD,CAAC,CAAC;QACvF,YAAY,CAAC,0BAA0B,CAAC,CAAC;QACzC,YAAY,CAAC,qDAAqD,CAAC,CAAC;QACpE,YAAY,CAAC,iCAAiC,CAAC,CAAC;QAChD,YAAY,CAAC,sEAAsE,CAAC,CAAC;QACrF,YAAY,CAAC,iEAAiE,CAAC,CAAC;QAChF,YAAY,CAAC,uBAAuB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,UAAU,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,yBAAyB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnG,sEAAsE;IACtE,MAAM,cAAc,GAAG,OAAO;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,CAAC,UAAU,KAAK,YAAY,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAuE,EAAE,CAAC;IACzF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAI,CAAS,CAAC,UAAU,KAAK,YAAY,CAAC;QAC3D,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,cAAsB,CAAC;QAC3B,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAClD,cAAc,GAAG,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;iBAAM,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC;gBACvB,cAAc,GAAG,SAAS,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,gBAAgB,GAAG,WAAW;YAClC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,YAAY,CAAC;YAC9C,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAElG,OAAO;YACL,IAAI,EAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,EAAO,CAAC,CAAC,IAAI;YACjB,IAAI,EAAO,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU;YAClD,MAAM,EAAK,cAAc;YACzB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO;YACpE,MAAM,EAAK,gBAAgB;YAC3B,OAAO,EAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACnE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;gBAChE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;aACvC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACjC,UAAU,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC7F,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,6CAA6C,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;QAC3J,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,wEAAwE;QACxE,IAAK,CAAS,CAAC,UAAU,KAAK,YAAY;YAAE,SAAS;QACrD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,CAAC,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdProfile(args: string[], json: boolean): Promise<void>;
2
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AA8CA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoH7E"}
@@ -0,0 +1,169 @@
1
+ import { createProfile, deleteProfile, getProfile, listProfiles, maskProfile, saveProfile, expandIncludes } from '../core/profiles.js';
2
+ import { logger } from '../core/logger.js';
3
+ import { printTitle, printSection, printDetails, printCommand, printJson, printTable } from '../ui/format.js';
4
+ function valuesFor(args, flag) {
5
+ const values = [];
6
+ for (let i = 0; i < args.length; i++) {
7
+ if (args[i] === flag && args[i + 1])
8
+ values.push(args[i + 1]);
9
+ }
10
+ return values;
11
+ }
12
+ function valueFor(args, flag) {
13
+ const idx = args.indexOf(flag);
14
+ return idx !== -1 ? args[idx + 1] : undefined;
15
+ }
16
+ function parseApproval(value) {
17
+ if (value === 'read-only')
18
+ return value;
19
+ if (value === 'always' || value === 'always-approve')
20
+ return 'always';
21
+ return 'writes';
22
+ }
23
+ function splitCsv(values) {
24
+ return values.flatMap((value) => value.split(',').map((part) => part.trim()).filter(Boolean));
25
+ }
26
+ function parseRules(values) {
27
+ return splitCsv(values).map((value) => {
28
+ const [match, effectRaw] = value.includes('=')
29
+ ? value.split('=', 2)
30
+ : value.split(':', 2);
31
+ const effect = effectRaw === 'deny' || effectRaw === 'approve' ? effectRaw : 'allow';
32
+ return { match: match.trim(), effect };
33
+ }).filter((rule) => rule.match);
34
+ }
35
+ function parseSandbox(args) {
36
+ return {
37
+ filesystemRoots: splitCsv(valuesFor(args, '--fs-root')),
38
+ blockedPaths: splitCsv(valuesFor(args, '--block-path')),
39
+ allowedDomains: splitCsv(valuesFor(args, '--allow-domain')),
40
+ blockedDomains: splitCsv(valuesFor(args, '--block-domain')),
41
+ };
42
+ }
43
+ export async function cmdProfile(args, json) {
44
+ const sub = args[1] || 'list';
45
+ if (sub === 'create') {
46
+ const name = args[2];
47
+ if (!name) {
48
+ if (json)
49
+ printJson({ ok: false, error: 'Missing profile name. Next: hoolix profile create codex --include github,filesystem --approval writes.' });
50
+ else
51
+ logger.error('Usage: hoolix profile create <name> --include github,filesystem --approval writes');
52
+ process.exit(1);
53
+ }
54
+ try {
55
+ const profile = await createProfile({
56
+ name,
57
+ includes: splitCsv(valuesFor(args, '--include')),
58
+ gateways: splitCsv(valuesFor(args, '--gateway')),
59
+ approvalMode: parseApproval(valueFor(args, '--approval')),
60
+ sandbox: parseSandbox(args),
61
+ });
62
+ const rules = parseRules(valuesFor(args, '--rule'));
63
+ const saved = rules.length > 0 ? await saveProfile({ ...profile, policy: { ...profile.policy, rules: [...profile.policy.rules, ...rules] } }) : profile;
64
+ if (json) {
65
+ printJson({ ok: true, profile: maskProfile(saved), next: [`hoolix gateway connect <gateway> --client codex --profile ${saved.slug}`] });
66
+ return;
67
+ }
68
+ printTitle('Profile created', `"${saved.name}" will identify one MCP client or agent.`);
69
+ printDetails([
70
+ ['Slug', saved.slug],
71
+ ['Allowed tools', saved.allowedTools.join(', ')],
72
+ ['Gateways', saved.allowedGateways.length ? saved.allowedGateways.join(', ') : 'any'],
73
+ ['Approval', saved.approvalMode],
74
+ ['Rules', String(saved.policy.rules.length)],
75
+ ]);
76
+ console.log('');
77
+ printSection('Next steps');
78
+ printCommand(`hoolix gateway connect my-tools --client codex --profile ${saved.slug}`);
79
+ printCommand('hoolix approvals list');
80
+ }
81
+ catch (e) {
82
+ const message = e instanceof Error ? e.message : String(e);
83
+ if (json)
84
+ printJson({ ok: false, error: message });
85
+ else
86
+ logger.error(message);
87
+ process.exit(1);
88
+ }
89
+ return;
90
+ }
91
+ if (sub === 'list') {
92
+ const profiles = await listProfiles();
93
+ if (json) {
94
+ printJson(profiles.map(maskProfile));
95
+ return;
96
+ }
97
+ if (profiles.length === 0) {
98
+ printTitle('Profiles', 'No client profiles yet.');
99
+ printCommand('hoolix profile create codex --include github,filesystem --approval writes');
100
+ return;
101
+ }
102
+ printTitle('Profiles', `${profiles.length} profile${profiles.length === 1 ? '' : 's'}`);
103
+ printTable(profiles.map((profile) => ({
104
+ Name: profile.name,
105
+ Slug: profile.slug,
106
+ Approval: profile.approvalMode,
107
+ Tools: profile.allowedTools.join(', '),
108
+ Gateways: profile.allowedGateways.length ? profile.allowedGateways.join(', ') : 'any',
109
+ Rules: String(profile.policy.rules.length),
110
+ })));
111
+ return;
112
+ }
113
+ if (sub === 'edit') {
114
+ const slug = args[2];
115
+ if (!slug) {
116
+ if (json)
117
+ printJson({ ok: false, error: 'Missing profile name. Next: hoolix profile edit codex --approval always.' });
118
+ else
119
+ logger.error('Usage: hoolix profile edit <name> [--include ...] [--approval ...] [--rule pattern=effect]');
120
+ process.exit(1);
121
+ }
122
+ const current = await getProfile(slug);
123
+ const includes = splitCsv(valuesFor(args, '--include'));
124
+ const gateways = splitCsv(valuesFor(args, '--gateway'));
125
+ const rules = parseRules(valuesFor(args, '--rule'));
126
+ const approval = valueFor(args, '--approval');
127
+ const sandbox = parseSandbox(args);
128
+ const updated = await saveProfile({
129
+ ...current,
130
+ allowedTools: includes.length ? expandIncludes(includes) : current.allowedTools,
131
+ allowedGateways: gateways.length ? gateways : current.allowedGateways,
132
+ approvalMode: approval ? parseApproval(approval) : current.approvalMode,
133
+ policy: rules.length ? { ...current.policy, rules: [...current.policy.rules, ...rules] } : current.policy,
134
+ sandbox: {
135
+ filesystemRoots: sandbox.filesystemRoots?.length ? sandbox.filesystemRoots : current.sandbox.filesystemRoots,
136
+ blockedPaths: sandbox.blockedPaths?.length ? sandbox.blockedPaths : current.sandbox.blockedPaths,
137
+ allowedDomains: sandbox.allowedDomains?.length ? sandbox.allowedDomains : current.sandbox.allowedDomains,
138
+ blockedDomains: sandbox.blockedDomains?.length ? sandbox.blockedDomains : current.sandbox.blockedDomains,
139
+ },
140
+ });
141
+ if (json)
142
+ printJson({ ok: true, profile: maskProfile(updated) });
143
+ else
144
+ logger.success(`Updated profile ${updated.slug}`);
145
+ return;
146
+ }
147
+ if (sub === 'delete') {
148
+ const slug = args[2];
149
+ if (!slug) {
150
+ if (json)
151
+ printJson({ ok: false, error: 'Missing profile name. Next: hoolix profile delete codex.' });
152
+ else
153
+ logger.error('Usage: hoolix profile delete <name>');
154
+ process.exit(1);
155
+ }
156
+ await deleteProfile(slug);
157
+ if (json)
158
+ printJson({ ok: true, profile: slug, deleted: true });
159
+ else
160
+ logger.success(`Deleted profile ${slug}`);
161
+ return;
162
+ }
163
+ if (json)
164
+ printJson({ ok: false, error: `Unknown profile command "${sub}". Next: use create, list, edit, or delete.` });
165
+ else
166
+ logger.error(`Unknown profile command "${sub}". Next: run hoolix profile list.`);
167
+ process.exit(1);
168
+ }
169
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ export declare const ApprovalStatusSchema: z.ZodEnum<["pending", "approved", "denied", "consumed"]>;
3
+ export declare const ApprovalRecordSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ status: z.ZodEnum<["pending", "approved", "denied", "consumed"]>;
6
+ gateway: z.ZodString;
7
+ profile: z.ZodString;
8
+ toolName: z.ZodString;
9
+ backend: z.ZodOptional<z.ZodString>;
10
+ argumentsPreview: z.ZodString;
11
+ argumentsHash: z.ZodString;
12
+ createdAt: z.ZodString;
13
+ decidedAt: z.ZodOptional<z.ZodString>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ status: "pending" | "approved" | "denied" | "consumed";
16
+ id: string;
17
+ createdAt: string;
18
+ toolName: string;
19
+ profile: string;
20
+ gateway: string;
21
+ argumentsPreview: string;
22
+ argumentsHash: string;
23
+ backend?: string | undefined;
24
+ decidedAt?: string | undefined;
25
+ }, {
26
+ status: "pending" | "approved" | "denied" | "consumed";
27
+ id: string;
28
+ createdAt: string;
29
+ toolName: string;
30
+ profile: string;
31
+ gateway: string;
32
+ argumentsPreview: string;
33
+ argumentsHash: string;
34
+ backend?: string | undefined;
35
+ decidedAt?: string | undefined;
36
+ }>;
37
+ export type ApprovalRecord = z.infer<typeof ApprovalRecordSchema>;
38
+ export interface ApprovalStore {
39
+ version: string;
40
+ approvals: ApprovalRecord[];
41
+ }
42
+ export declare function listApprovals(status?: ApprovalRecord['status']): Promise<ApprovalRecord[]>;
43
+ export declare function listPendingApprovals(): Promise<ApprovalRecord[]>;
44
+ export declare function queueApproval(input: {
45
+ gateway: string;
46
+ profile: string;
47
+ toolName: string;
48
+ backend?: string;
49
+ argumentsPreview: string;
50
+ argumentsHash: string;
51
+ }): Promise<ApprovalRecord>;
52
+ export declare function decideApproval(id: string, status: 'approved' | 'denied'): Promise<ApprovalRecord>;
53
+ export declare function consumeMatchingApproval(input: {
54
+ gateway: string;
55
+ profile: string;
56
+ toolName: string;
57
+ argumentsHash: string;
58
+ }): Promise<ApprovalRecord | null>;
59
+ export declare function findDeniedMatchingApproval(input: {
60
+ gateway: string;
61
+ profile: string;
62
+ toolName: string;
63
+ argumentsHash: string;
64
+ }): Promise<ApprovalRecord | null>;
65
+ export declare function previewArgs(value: unknown): string;
66
+ export declare function hashArgs(value: unknown): Promise<string>;
67
+ //# sourceMappingURL=approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/core/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB,0DAAwD,CAAC;AAE1F,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAmBD,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAIhG;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAEtE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,cAAc,CAAC,CAyB1B;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAQvG;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAcjC;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CASjC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGlD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG9D"}