@hipp0/cli 0.1.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 (49) hide show
  1. package/dist/cli-helpers.d.ts +14 -0
  2. package/dist/cli-helpers.d.ts.map +1 -0
  3. package/dist/cli-helpers.js +194 -0
  4. package/dist/cli-helpers.js.map +1 -0
  5. package/dist/commands/agents.d.ts +3 -0
  6. package/dist/commands/agents.d.ts.map +1 -0
  7. package/dist/commands/agents.js +50 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/compile.d.ts +3 -0
  10. package/dist/commands/compile.d.ts.map +1 -0
  11. package/dist/commands/compile.js +49 -0
  12. package/dist/commands/compile.js.map +1 -0
  13. package/dist/commands/decisions.d.ts +3 -0
  14. package/dist/commands/decisions.d.ts.map +1 -0
  15. package/dist/commands/decisions.js +206 -0
  16. package/dist/commands/decisions.js.map +1 -0
  17. package/dist/commands/distill.d.ts +3 -0
  18. package/dist/commands/distill.d.ts.map +1 -0
  19. package/dist/commands/distill.js +54 -0
  20. package/dist/commands/distill.js.map +1 -0
  21. package/dist/commands/export-import.d.ts +3 -0
  22. package/dist/commands/export-import.d.ts.map +1 -0
  23. package/dist/commands/export-import.js +109 -0
  24. package/dist/commands/export-import.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +157 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/notifications.d.ts +3 -0
  30. package/dist/commands/notifications.d.ts.map +1 -0
  31. package/dist/commands/notifications.js +96 -0
  32. package/dist/commands/notifications.js.map +1 -0
  33. package/dist/commands/server.d.ts +7 -0
  34. package/dist/commands/server.d.ts.map +1 -0
  35. package/dist/commands/server.js +203 -0
  36. package/dist/commands/server.js.map +1 -0
  37. package/dist/commands/shortcuts.d.ts +11 -0
  38. package/dist/commands/shortcuts.d.ts.map +1 -0
  39. package/dist/commands/shortcuts.js +163 -0
  40. package/dist/commands/shortcuts.js.map +1 -0
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +46 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/decigraph-cli.d.ts +3 -0
  46. package/dist/decigraph-cli.d.ts.map +1 -0
  47. package/dist/decigraph-cli.js +34 -0
  48. package/dist/decigraph-cli.js.map +1 -0
  49. package/package.json +36 -0
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { readFileSync, existsSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ import { getClient, getProjectId, handleError, formatDecision } from '../cli-helpers.js';
6
+ export function registerDistillCommand(program) {
7
+ program
8
+ .command('distill <file>')
9
+ .description('Extract decisions from a conversation file')
10
+ .option('-a, --agent <name>', 'Agent name for attribution')
11
+ .option('--session', 'Also create a session summary')
12
+ .action(async (file, opts) => {
13
+ const client = getClient();
14
+ const projectId = getProjectId();
15
+ const filePath = resolve(file);
16
+ if (!existsSync(filePath)) {
17
+ console.error(chalk.red(`File not found: ${filePath}`));
18
+ process.exit(1);
19
+ }
20
+ const conversationText = readFileSync(filePath, 'utf-8');
21
+ if (!conversationText.trim()) {
22
+ console.error(chalk.red('File is empty'));
23
+ process.exit(1);
24
+ }
25
+ const spinner = ora(`Distilling decisions from ${chalk.bold(file)}...`).start();
26
+ try {
27
+ const result = opts.session
28
+ ? await client.distillSession(projectId, {
29
+ conversation_text: conversationText,
30
+ agent_name: opts.agent ?? 'cli',
31
+ })
32
+ : await client.distill(projectId, {
33
+ conversation_text: conversationText,
34
+ agent_name: opts.agent,
35
+ });
36
+ spinner.succeed(chalk.green(`Extracted ${result.decisions_extracted} decision(s)`));
37
+ if (result.decisions.length === 0) {
38
+ console.warn(chalk.dim(' No decisions were found in the conversation.'));
39
+ return;
40
+ }
41
+ result.decisions.forEach((d, i) => formatDecision(d, i));
42
+ if (result.session_summary) {
43
+ console.warn(`\n${chalk.bold('Session Summary Created:')}`);
44
+ console.warn(` ${chalk.dim('ID:')} ${chalk.cyan(result.session_summary.id)}`);
45
+ console.warn(` ${chalk.dim('Topic:')} ${result.session_summary.topic}`);
46
+ console.warn(` ${chalk.dim('Date:')} ${result.session_summary.session_date}`);
47
+ }
48
+ }
49
+ catch (err) {
50
+ handleError(err, spinner);
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=distill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../src/commands/distill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerExportImportCommands(program: Command): void;
3
+ //# sourceMappingURL=export-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import.d.ts","sourceRoot":"","sources":["../../src/commands/export-import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0HnE"}
@@ -0,0 +1,109 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { readFileSync, existsSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ import { getClient, getProjectId, handleError } from '../cli-helpers.js';
6
+ export function registerExportImportCommands(program) {
7
+ // hipp0 export
8
+ program
9
+ .command('export')
10
+ .description('Export a project as JSON (writes to stdout)')
11
+ .option('-p, --project <id>', 'Project ID (defaults to HIPP0_PROJECT_ID)')
12
+ .action(async (opts) => {
13
+ const client = getClient();
14
+ const projectId = opts.project ?? getProjectId();
15
+ const spinner = ora('Exporting project...').start();
16
+ try {
17
+ const baseUrl = process.env.HIPP0_API_URL ?? 'http://localhost:3000';
18
+ const apiKey = process.env.HIPP0_API_KEY;
19
+ const headers = { 'Content-Type': 'application/json' };
20
+ if (apiKey)
21
+ headers['Authorization'] = `Bearer ${apiKey}`;
22
+ const res = await fetch(`${baseUrl}/api/projects/${projectId}/export`, { headers });
23
+ if (!res.ok) {
24
+ const text = await res.text();
25
+ throw new Error(`Export failed (${res.status}): ${text}`);
26
+ }
27
+ const data = await res.json();
28
+ spinner.stop();
29
+ // Write JSON to stdout (not stderr) so it can be piped to file
30
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
31
+ console.error(chalk.green(`\nExported: ${data.decisions?.length ?? 0} decisions, ${data.agents?.length ?? 0} agents`));
32
+ }
33
+ catch (err) {
34
+ handleError(err, spinner);
35
+ }
36
+ });
37
+ // hipp0 import
38
+ program
39
+ .command('import [file]')
40
+ .description('Import a project from a JSON export file (or stdin)')
41
+ .action(async (file) => {
42
+ const spinner = ora('Importing project...').start();
43
+ try {
44
+ let jsonText;
45
+ if (file) {
46
+ const filePath = resolve(file);
47
+ if (!existsSync(filePath)) {
48
+ spinner.fail();
49
+ console.error(chalk.red(`File not found: ${filePath}`));
50
+ process.exit(1);
51
+ }
52
+ jsonText = readFileSync(filePath, 'utf-8');
53
+ }
54
+ else {
55
+ // Read from stdin
56
+ const chunks = [];
57
+ for await (const chunk of process.stdin) {
58
+ chunks.push(chunk);
59
+ }
60
+ jsonText = Buffer.concat(chunks).toString('utf-8');
61
+ }
62
+ if (!jsonText.trim()) {
63
+ spinner.fail();
64
+ console.error(chalk.red('Empty input'));
65
+ process.exit(1);
66
+ }
67
+ let data;
68
+ try {
69
+ data = JSON.parse(jsonText);
70
+ }
71
+ catch {
72
+ spinner.fail();
73
+ console.error(chalk.red('Invalid JSON'));
74
+ process.exit(1);
75
+ }
76
+ const baseUrl = process.env.HIPP0_API_URL ?? 'http://localhost:3000';
77
+ const apiKey = process.env.HIPP0_API_KEY;
78
+ const headers = { 'Content-Type': 'application/json' };
79
+ if (apiKey)
80
+ headers['Authorization'] = `Bearer ${apiKey}`;
81
+ const res = await fetch(`${baseUrl}/api/projects/import`, {
82
+ method: 'POST',
83
+ headers,
84
+ body: JSON.stringify(data),
85
+ });
86
+ if (!res.ok) {
87
+ const text = await res.text();
88
+ throw new Error(`Import failed (${res.status}): ${text}`);
89
+ }
90
+ const result = (await res.json());
91
+ spinner.succeed(chalk.green(`Imported as "${result.project_name}"`));
92
+ console.error(` Project ID: ${chalk.cyan(result.project_id)}`);
93
+ console.error(` Agents: ${result.agents_imported}`);
94
+ console.error(` Decisions: ${result.decisions_imported}`);
95
+ console.error(` Edges: ${result.edges_imported}`);
96
+ console.error(` Conflicts: ${result.contradictions_imported}`);
97
+ if (result.warnings.length > 0) {
98
+ console.error(chalk.yellow(`\n Warnings:`));
99
+ for (const w of result.warnings) {
100
+ console.error(chalk.yellow(` - ${w}`));
101
+ }
102
+ }
103
+ }
104
+ catch (err) {
105
+ handleError(err, spinner);
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=export-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../src/commands/export-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuFzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuG1D"}
@@ -0,0 +1,157 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs';
5
+ import { spawn } from 'node:child_process';
6
+ import { createRequire } from 'node:module';
7
+ import { getClient, prompt, handleError } from '../cli-helpers.js';
8
+ const _require = createRequire(import.meta.url);
9
+ /**
10
+ * Generate a Hipp0-style API key: "h0_local_" + 16 random characters.
11
+ */
12
+ function generateApiKey() {
13
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
14
+ const { randomUUID } = crypto;
15
+ // Use the UUID entropy but reformat as a shorter key.
16
+ const uuid = randomUUID().replace(/-/g, '');
17
+ // Take 16 hex chars and map them to the alphanumeric set.
18
+ const raw = uuid.slice(0, 16);
19
+ const mapped = raw
20
+ .split('')
21
+ .map((ch) => chars[parseInt(ch, 16) % chars.length])
22
+ .join('');
23
+ return `h0_local_${mapped}`;
24
+ }
25
+ /**
26
+ * Spawn the Hipp0 server as a detached background process and write a PID
27
+ * file so that `hipp0 stop` can terminate it later.
28
+ */
29
+ function spawnServer(dir, sqlitePath, apiKey, port) {
30
+ return new Promise((resolve, reject) => {
31
+ // Locate the server entry-point relative to this CLI package.
32
+ let serverEntry;
33
+ try {
34
+ // When installed via npm both packages land next to each other.
35
+ serverEntry = _require.resolve('@hipp0/server');
36
+ }
37
+ catch {
38
+ // Fallback for monorepo / development usage.
39
+ serverEntry = path.resolve(path.dirname(_require.resolve('@hipp0/cli/package.json')), '..', 'server', 'dist', 'index.js');
40
+ }
41
+ const child = spawn(process.execPath, [serverEntry], {
42
+ detached: true,
43
+ stdio: 'ignore',
44
+ env: {
45
+ ...process.env,
46
+ PORT: String(port),
47
+ HOST: '127.0.0.1',
48
+ HIPP0_SQLITE_PATH: sqlitePath,
49
+ HIPP0_API_KEY: apiKey,
50
+ },
51
+ cwd: dir,
52
+ });
53
+ child.on('error', reject);
54
+ child.unref();
55
+ // Write PID file so `hipp0 stop` can signal the process.
56
+ const pid = child.pid;
57
+ if (pid === undefined) {
58
+ reject(new Error('Failed to obtain server PID'));
59
+ return;
60
+ }
61
+ const pidFile = path.join(dir, '.hipp0.pid');
62
+ fs.writeFileSync(pidFile, String(pid), 'utf-8');
63
+ resolve(pid);
64
+ });
65
+ }
66
+ export function registerInitCommand(program) {
67
+ program
68
+ .command('init [name]')
69
+ .description('Create a new Hipp0 project (or initialise a local server if no API URL is set)')
70
+ .option('-d, --description <desc>', 'Project description')
71
+ .option('-p, --port <port>', 'Port for the local server', '3100')
72
+ .action(async (name, opts) => {
73
+ const apiUrl = process.env.HIPP0_API_URL;
74
+ // ------------------------------------------------------------------
75
+ // Remote-API mode: HIPP0_API_URL is set → existing behaviour
76
+ // ------------------------------------------------------------------
77
+ if (apiUrl) {
78
+ const client = getClient();
79
+ const projectName = name ?? (await prompt(chalk.bold('Project name: ')));
80
+ if (!projectName) {
81
+ console.error(chalk.red('Project name is required'));
82
+ process.exit(1);
83
+ }
84
+ const description = opts?.description ?? (await prompt(chalk.dim('Description (optional): ')));
85
+ const spinner = ora('Creating project...').start();
86
+ try {
87
+ const project = await client.createProject({
88
+ name: projectName,
89
+ description: description || undefined,
90
+ });
91
+ spinner.succeed(chalk.green(`Project created!`));
92
+ console.warn(`\n ${chalk.bold('Name:')} ${project.name}`);
93
+ console.warn(` ${chalk.bold('ID:')} ${chalk.cyan(project.id)}`);
94
+ if (project.description)
95
+ console.warn(` ${chalk.bold('Desc:')} ${project.description}`);
96
+ console.warn(`\n${chalk.dim('Set the following environment variable to use this project:')}`);
97
+ console.warn(chalk.yellow(` export HIPP0_PROJECT_ID="${project.id}"`));
98
+ }
99
+ catch (err) {
100
+ handleError(err, spinner);
101
+ }
102
+ return;
103
+ }
104
+ // ------------------------------------------------------------------
105
+ // Local SQLite mode: no HIPP0_API_URL → zero-infrastructure setup
106
+ // ------------------------------------------------------------------
107
+ const port = parseInt(opts?.port ?? '3100', 10);
108
+ // Determine working directory.
109
+ let dir;
110
+ if (name) {
111
+ dir = path.resolve(process.cwd(), name);
112
+ if (!fs.existsSync(dir)) {
113
+ fs.mkdirSync(dir, { recursive: true });
114
+ console.warn(chalk.dim(`Created directory: ${dir}`));
115
+ }
116
+ }
117
+ else {
118
+ dir = process.cwd();
119
+ }
120
+ const sqlitePath = path.join(dir, 'hipp0.db');
121
+ const apiKey = generateApiKey();
122
+ const spinner = ora('Initialising local Hipp0…').start();
123
+ try {
124
+ // Initialise the SQLite database (runs migrations via the adapter).
125
+ const { initDb, closeDb } = await import('@hipp0/core/db/index.js');
126
+ const db = await initDb({ dialect: 'sqlite', sqlitePath });
127
+ // Verify it's reachable.
128
+ await db.query('SELECT 1 AS ok');
129
+ // Close the handle here — the server process will re-open it.
130
+ await closeDb();
131
+ spinner.text = 'Starting server…';
132
+ // Start the server as a background process.
133
+ await spawnServer(dir, sqlitePath, apiKey, port);
134
+ // Give the server a moment to bind to the port before printing the
135
+ // success banner.
136
+ await new Promise((r) => setTimeout(r, 800));
137
+ spinner.succeed(chalk.green('✓ Hipp0 is running!'));
138
+ const relativePath = path.relative(process.cwd(), sqlitePath) || './hipp0.db';
139
+ console.warn('');
140
+ console.warn(` ${chalk.bold('API:')} http://localhost:${port}`);
141
+ console.warn(` ${chalk.bold('Dashboard:')} http://localhost:${port}/dashboard`);
142
+ console.warn(` ${chalk.bold('Database:')} ${relativePath}`);
143
+ console.warn(` ${chalk.bold('API Key:')} ${chalk.cyan(apiKey)}`);
144
+ console.warn('');
145
+ console.warn(chalk.dim(' Open the dashboard to set up your first project.'));
146
+ console.warn('');
147
+ console.warn(chalk.dim(` To stop the server run: hipp0 stop`));
148
+ if (name) {
149
+ console.warn(chalk.dim(` To use this project, cd into: ${name}`));
150
+ }
151
+ }
152
+ catch (err) {
153
+ handleError(err, spinner);
154
+ }
155
+ });
156
+ }
157
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerNotificationCommands(program: Command): void;
3
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiHnE"}
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { getClient, handleError, formatNotification } from '../cli-helpers.js';
4
+ export function registerNotificationCommands(program) {
5
+ program
6
+ .command('notifications')
7
+ .description('Show unread notifications for an agent')
8
+ .option('-a, --agent <id>', 'Agent ID')
9
+ .option('--all', 'Show all notifications including read')
10
+ .action(async (opts) => {
11
+ const client = getClient();
12
+ const agentId = opts.agent ?? process.env.HIPP0_AGENT_ID;
13
+ if (!agentId) {
14
+ console.error(chalk.red('Error: --agent <id> or HIPP0_AGENT_ID environment variable is required'));
15
+ process.exit(1);
16
+ }
17
+ const spinner = ora('Fetching notifications...').start();
18
+ try {
19
+ const items = await client.getNotifications(agentId, !opts.all);
20
+ spinner.stop();
21
+ if (items.length === 0) {
22
+ const label = opts.all ? 'notifications' : 'unread notifications';
23
+ console.warn(chalk.dim(`\n No ${label} found.`));
24
+ return;
25
+ }
26
+ const unreadCount = items.filter((n) => !n.read_at).length;
27
+ console.warn(chalk.bold(`\n ${items.length} notification(s) (${unreadCount} unread):`));
28
+ items.forEach(formatNotification);
29
+ console.warn('');
30
+ }
31
+ catch (err) {
32
+ handleError(err, spinner);
33
+ }
34
+ });
35
+ program
36
+ .command('feedback')
37
+ .description('Record feedback on a decision')
38
+ .requiredOption('-a, --agent <id>', 'Agent ID')
39
+ .requiredOption('-d, --decision <id>', 'Decision ID')
40
+ .requiredOption('--useful <bool>', 'Was the decision useful? (true|false)')
41
+ .option('-s, --signal <signal>', 'Usage signal (referenced|ignored|contradicted|built_upon)')
42
+ .action(async (opts) => {
43
+ const client = getClient();
44
+ const spinner = ora('Recording feedback...').start();
45
+ try {
46
+ await client.recordFeedback({
47
+ agent_id: opts.agent,
48
+ decision_id: opts.decision,
49
+ was_useful: opts.useful === 'true',
50
+ usage_signal: opts.signal,
51
+ });
52
+ spinner.succeed(chalk.green('Feedback recorded'));
53
+ }
54
+ catch (err) {
55
+ handleError(err, spinner);
56
+ }
57
+ });
58
+ program
59
+ .command('contradictions')
60
+ .description('Show unresolved contradictions for the project')
61
+ .option('-s, --status <status>', 'Filter by status (unresolved|resolved|dismissed)', 'unresolved')
62
+ .action(async (opts) => {
63
+ const client = getClient();
64
+ const projectId = process.env.HIPP0_PROJECT_ID;
65
+ if (!projectId) {
66
+ console.error(chalk.red('Error: HIPP0_PROJECT_ID environment variable is not set.'));
67
+ process.exit(1);
68
+ }
69
+ const spinner = ora('Fetching contradictions...').start();
70
+ try {
71
+ const items = await client.getContradictions(projectId, (opts.status ?? 'unresolved'));
72
+ spinner.stop();
73
+ if (items.length === 0) {
74
+ console.warn(chalk.green(`\n No ${opts.status ?? 'unresolved'} contradictions found.`));
75
+ return;
76
+ }
77
+ console.warn(chalk.bold(`\n ${items.length} contradiction(s):`));
78
+ for (const c of items) {
79
+ console.warn(`\n ${chalk.red('⚡')} ${chalk.bold(c.id)}`);
80
+ console.warn(` ${chalk.dim('Decision A:')} ${c.decision_a_id}`);
81
+ console.warn(` ${chalk.dim('Decision B:')} ${c.decision_b_id}`);
82
+ console.warn(` ${chalk.dim('Similarity:')} ${(c.similarity_score * 100).toFixed(1)}%`);
83
+ if (c.conflict_description) {
84
+ console.warn(` ${chalk.dim('Description:')} ${c.conflict_description}`);
85
+ }
86
+ console.warn(` ${chalk.dim('Status:')} ${c.status}`);
87
+ console.warn(` ${chalk.dim('Detected:')} ${new Date(c.detected_at).toLocaleString()}`);
88
+ }
89
+ console.warn('');
90
+ }
91
+ catch (err) {
92
+ handleError(err, spinner);
93
+ }
94
+ });
95
+ }
96
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * hipp0 start — start the Hipp0 server using hipp0.db in the current dir.
3
+ * hipp0 stop — send SIGTERM to the server recorded in .hipp0.pid.
4
+ */
5
+ import type { Command } from 'commander';
6
+ export declare function registerServerCommands(program: Command): void;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsHzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0H7D"}