@karis-ai/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.
- package/bin/karis.js +2 -0
- package/dist/commands/brand/customize.d.ts +11 -0
- package/dist/commands/brand/customize.d.ts.map +1 -0
- package/dist/commands/brand/customize.js +115 -0
- package/dist/commands/brand/customize.js.map +1 -0
- package/dist/commands/brand/info.d.ts +3 -0
- package/dist/commands/brand/info.d.ts.map +1 -0
- package/dist/commands/brand/info.js +14 -0
- package/dist/commands/brand/info.js.map +1 -0
- package/dist/commands/brand/init.d.ts +7 -0
- package/dist/commands/brand/init.d.ts.map +1 -0
- package/dist/commands/brand/init.js +133 -0
- package/dist/commands/brand/init.js.map +1 -0
- package/dist/commands/brand/list.d.ts +4 -0
- package/dist/commands/brand/list.d.ts.map +1 -0
- package/dist/commands/brand/list.js +46 -0
- package/dist/commands/brand/list.js.map +1 -0
- package/dist/commands/brand/refresh.d.ts +7 -0
- package/dist/commands/brand/refresh.d.ts.map +1 -0
- package/dist/commands/brand/refresh.js +63 -0
- package/dist/commands/brand/refresh.js.map +1 -0
- package/dist/commands/brand/select.d.ts +6 -0
- package/dist/commands/brand/select.d.ts.map +1 -0
- package/dist/commands/brand/select.js +104 -0
- package/dist/commands/brand/select.js.map +1 -0
- package/dist/commands/brand/show.d.ts +4 -0
- package/dist/commands/brand/show.d.ts.map +1 -0
- package/dist/commands/brand/show.js +122 -0
- package/dist/commands/brand/show.js.map +1 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +103 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +336 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +91 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +148 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/geo.d.ts +3 -0
- package/dist/commands/geo.d.ts.map +1 -0
- package/dist/commands/geo.js +22 -0
- package/dist/commands/geo.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +173 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +19 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/reddit.d.ts +3 -0
- package/dist/commands/reddit.d.ts.map +1 -0
- package/dist/commands/reddit.js +61 -0
- package/dist/commands/reddit.js.map +1 -0
- package/dist/commands/schedule.d.ts +3 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +15 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/setup.d.ts +11 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +303 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/show.d.ts +3 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +46 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +139 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +29 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/commands/x.d.ts +3 -0
- package/dist/commands/x.d.ts.map +1 -0
- package/dist/commands/x.js +29 -0
- package/dist/commands/x.js.map +1 -0
- package/dist/commands/youtube.d.ts +3 -0
- package/dist/commands/youtube.d.ts.map +1 -0
- package/dist/commands/youtube.js +16 -0
- package/dist/commands/youtube.js.map +1 -0
- package/dist/core/agent-factory.d.ts +20 -0
- package/dist/core/agent-factory.d.ts.map +1 -0
- package/dist/core/agent-factory.js +26 -0
- package/dist/core/agent-factory.js.map +1 -0
- package/dist/core/agent-interface.d.ts +68 -0
- package/dist/core/agent-interface.d.ts.map +1 -0
- package/dist/core/agent-interface.js +5 -0
- package/dist/core/agent-interface.js.map +1 -0
- package/dist/core/browser-bridge.d.ts +19 -0
- package/dist/core/browser-bridge.d.ts.map +1 -0
- package/dist/core/browser-bridge.js +56 -0
- package/dist/core/browser-bridge.js.map +1 -0
- package/dist/core/cli-context.d.ts +19 -0
- package/dist/core/cli-context.d.ts.map +1 -0
- package/dist/core/cli-context.js +43 -0
- package/dist/core/cli-context.js.map +1 -0
- package/dist/core/client.d.ts +219 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +638 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +107 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/remote-agent.d.ts +36 -0
- package/dist/core/remote-agent.d.ts.map +1 -0
- package/dist/core/remote-agent.js +195 -0
- package/dist/core/remote-agent.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +178 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/agent-helper.d.ts +14 -0
- package/dist/utils/agent-helper.d.ts.map +1 -0
- package/dist/utils/agent-helper.js +54 -0
- package/dist/utils/agent-helper.js.map +1 -0
- package/dist/utils/config.d.ts +26 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +93 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/form-prompt.d.ts +15 -0
- package/dist/utils/form-prompt.d.ts.map +1 -0
- package/dist/utils/form-prompt.js +153 -0
- package/dist/utils/form-prompt.js.map +1 -0
- package/dist/utils/formatter.d.ts +7 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +132 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/index-cache.d.ts +10 -0
- package/dist/utils/index-cache.d.ts.map +1 -0
- package/dist/utils/index-cache.js +22 -0
- package/dist/utils/index-cache.js.map +1 -0
- package/dist/utils/interactive.d.ts +19 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +73 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/output.d.ts +41 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +259 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/run-command.d.ts +2 -0
- package/dist/utils/run-command.d.ts.map +1 -0
- package/dist/utils/run-command.js +12 -0
- package/dist/utils/run-command.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getConfigValue, setConfigValue, listConfig, maskValue, loadResolvedConfig, SUPPORTED_CONFIG_KEYS, } from '../utils/config.js';
|
|
3
|
+
import { success, section, printCommandResult } from '../utils/output.js';
|
|
4
|
+
import { createInvalidArgumentError } from '../core/errors.js';
|
|
5
|
+
import { runCommand } from '../utils/run-command.js';
|
|
6
|
+
import { isTextOutput } from '../core/cli-context.js';
|
|
7
|
+
export function registerConfigCommand(program) {
|
|
8
|
+
const configCmd = program
|
|
9
|
+
.command('config')
|
|
10
|
+
.description('Manage API keys and settings');
|
|
11
|
+
configCmd
|
|
12
|
+
.command('set <key> <value>')
|
|
13
|
+
.description('Set a config value (supported: api-key, base-url)')
|
|
14
|
+
.action(runCommand(async (key, value) => {
|
|
15
|
+
if (!isSupportedConfigKey(key)) {
|
|
16
|
+
throw createInvalidArgumentError(`Unsupported config key: ${key}. Supported keys: ${SUPPORTED_CONFIG_KEYS.join(', ')}.`);
|
|
17
|
+
}
|
|
18
|
+
await setConfigValue(key, value);
|
|
19
|
+
if (isTextOutput()) {
|
|
20
|
+
console.log(success(`Set ${chalk.bold(key)} = ${maskValue(key, value)}`));
|
|
21
|
+
}
|
|
22
|
+
printCommandResult({
|
|
23
|
+
key,
|
|
24
|
+
value: maskValue(key, value),
|
|
25
|
+
});
|
|
26
|
+
}));
|
|
27
|
+
configCmd
|
|
28
|
+
.command('get <key>')
|
|
29
|
+
.description('Get a config value')
|
|
30
|
+
.action(runCommand(async (key) => {
|
|
31
|
+
if (!isSupportedConfigKey(key)) {
|
|
32
|
+
throw createInvalidArgumentError(`Unsupported config key: ${key}. Supported keys: ${SUPPORTED_CONFIG_KEYS.join(', ')}.`);
|
|
33
|
+
}
|
|
34
|
+
const value = await getConfigValue(key);
|
|
35
|
+
if (value === undefined) {
|
|
36
|
+
throw createInvalidArgumentError(`Key ${chalk.bold(key)} is not set.`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
if (isTextOutput()) {
|
|
40
|
+
console.log(`${chalk.bold(key)} = ${maskValue(key, value)}`);
|
|
41
|
+
}
|
|
42
|
+
printCommandResult({ key, value: maskValue(key, value) });
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
45
|
+
configCmd
|
|
46
|
+
.command('list')
|
|
47
|
+
.description('List all config values')
|
|
48
|
+
.action(runCommand(async () => {
|
|
49
|
+
const config = await listConfig();
|
|
50
|
+
const resolved = await loadResolvedConfig();
|
|
51
|
+
const entries = Object.entries(config).filter((entry) => entry[1] !== undefined && isSupportedConfigKey(entry[0]));
|
|
52
|
+
if (entries.length === 0) {
|
|
53
|
+
if (isTextOutput()) {
|
|
54
|
+
console.log(chalk.dim('No config values set.'));
|
|
55
|
+
console.log();
|
|
56
|
+
console.log(chalk.dim('Get started:'));
|
|
57
|
+
console.log(` ${chalk.cyan('npx karis config set api-key sk-ka-...')}`);
|
|
58
|
+
console.log(` ${chalk.cyan('npx karis config set base-url https://api.karis.im')}`);
|
|
59
|
+
}
|
|
60
|
+
printCommandResult({
|
|
61
|
+
config: {},
|
|
62
|
+
resolved: maskResolvedConfig(resolved),
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (isTextOutput()) {
|
|
67
|
+
section('Karis Config');
|
|
68
|
+
for (const [key, value] of entries) {
|
|
69
|
+
console.log(` ${chalk.bold(key)}: ${maskValue(key, value)}`);
|
|
70
|
+
}
|
|
71
|
+
console.log();
|
|
72
|
+
}
|
|
73
|
+
printCommandResult({
|
|
74
|
+
config: Object.fromEntries(entries.map(([key, value]) => [key, maskValue(key, value)])),
|
|
75
|
+
resolved: maskResolvedConfig(resolved),
|
|
76
|
+
});
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
function maskResolvedConfig(resolved) {
|
|
80
|
+
return {
|
|
81
|
+
apiKey: {
|
|
82
|
+
...resolved.apiKey,
|
|
83
|
+
value: resolved.apiKey.value ? maskValue('api-key', resolved.apiKey.value) : undefined,
|
|
84
|
+
},
|
|
85
|
+
apiUrl: resolved.apiUrl,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function isSupportedConfigKey(key) {
|
|
89
|
+
return SUPPORTED_CONFIG_KEYS.includes(key);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D5D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadResolvedConfig, maskValue } from '../utils/config.js';
|
|
3
|
+
import { KarisClient } from '../core/client.js';
|
|
4
|
+
import { printCommandResult } from '../utils/output.js';
|
|
5
|
+
import { runCommand } from '../utils/run-command.js';
|
|
6
|
+
import { isTextOutput } from '../core/cli-context.js';
|
|
7
|
+
export function registerDoctorCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('doctor')
|
|
10
|
+
.description('Check if everything is set up correctly')
|
|
11
|
+
.action(runCommand(async () => {
|
|
12
|
+
const resolved = await loadResolvedConfig();
|
|
13
|
+
const checks = [];
|
|
14
|
+
checks.push({
|
|
15
|
+
id: 'config.api-url',
|
|
16
|
+
status: 'pass',
|
|
17
|
+
message: `Using API URL from ${resolved.apiUrl.source}`,
|
|
18
|
+
details: { value: resolved.apiUrl.value },
|
|
19
|
+
});
|
|
20
|
+
checks.push({
|
|
21
|
+
id: 'config.api-key',
|
|
22
|
+
status: resolved.apiKey.value ? 'pass' : 'fail',
|
|
23
|
+
message: resolved.apiKey.value
|
|
24
|
+
? `API key configured via ${resolved.apiKey.source}`
|
|
25
|
+
: 'API key is not configured',
|
|
26
|
+
details: resolved.apiKey.value
|
|
27
|
+
? { masked: maskValue('api-key', resolved.apiKey.value) }
|
|
28
|
+
: undefined,
|
|
29
|
+
});
|
|
30
|
+
checks.push({
|
|
31
|
+
id: 'runtime.adapter',
|
|
32
|
+
status: 'pass',
|
|
33
|
+
message: 'CLI is configured to use Karis Platform remote runtime',
|
|
34
|
+
});
|
|
35
|
+
checks.push(await checkConnectivity(resolved.apiUrl.value || 'https://api.karis.im'));
|
|
36
|
+
if (resolved.apiKey.value) {
|
|
37
|
+
const client = await KarisClient.create();
|
|
38
|
+
checks.push(await checkAuth(client));
|
|
39
|
+
checks.push(await checkBrand(client));
|
|
40
|
+
}
|
|
41
|
+
const hasFailure = checks.some((check) => check.status === 'fail');
|
|
42
|
+
if (isTextOutput()) {
|
|
43
|
+
printDoctorText(checks);
|
|
44
|
+
}
|
|
45
|
+
printCommandResult({
|
|
46
|
+
checks,
|
|
47
|
+
summary: {
|
|
48
|
+
total: checks.length,
|
|
49
|
+
passed: checks.filter((check) => check.status === 'pass').length,
|
|
50
|
+
warnings: checks.filter((check) => check.status === 'warn').length,
|
|
51
|
+
failed: checks.filter((check) => check.status === 'fail').length,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
if (hasFailure) {
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
async function checkConnectivity(apiUrl) {
|
|
60
|
+
try {
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timer = setTimeout(() => controller.abort(), 5000);
|
|
63
|
+
const response = await fetch(apiUrl, { method: 'HEAD', signal: controller.signal });
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
return {
|
|
66
|
+
id: 'connectivity.api-url',
|
|
67
|
+
status: 'pass',
|
|
68
|
+
message: 'API URL is reachable',
|
|
69
|
+
details: {
|
|
70
|
+
api_url: apiUrl,
|
|
71
|
+
status: response.status,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return {
|
|
77
|
+
id: 'connectivity.api-url',
|
|
78
|
+
status: 'fail',
|
|
79
|
+
message: error instanceof Error ? `API URL is not reachable: ${error.message}` : 'API URL is not reachable',
|
|
80
|
+
details: { api_url: apiUrl },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function checkAuth(client) {
|
|
85
|
+
try {
|
|
86
|
+
const info = await client.verifyKey();
|
|
87
|
+
return {
|
|
88
|
+
id: 'auth.api-key',
|
|
89
|
+
status: 'pass',
|
|
90
|
+
message: `API key is valid (${info.name})`,
|
|
91
|
+
details: {
|
|
92
|
+
expires_at: info.expires_at,
|
|
93
|
+
key_prefix: info.key_prefix,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
id: 'auth.api-key',
|
|
100
|
+
status: 'fail',
|
|
101
|
+
message: error instanceof Error ? error.message : 'API key verification failed',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function checkBrand(client) {
|
|
106
|
+
try {
|
|
107
|
+
const brand = await client.getBrand();
|
|
108
|
+
if (!brand) {
|
|
109
|
+
return {
|
|
110
|
+
id: 'brand.profile',
|
|
111
|
+
status: 'warn',
|
|
112
|
+
message: 'No brand profile found for the current account',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
id: 'brand.profile',
|
|
117
|
+
status: 'pass',
|
|
118
|
+
message: `Brand profile available: ${brand.name || brand.domain}`,
|
|
119
|
+
details: {
|
|
120
|
+
domain: brand.domain,
|
|
121
|
+
claimed: brand.claimed,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return {
|
|
127
|
+
id: 'brand.profile',
|
|
128
|
+
status: 'fail',
|
|
129
|
+
message: error instanceof Error ? error.message : 'Unable to read brand profile',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function printDoctorText(checks) {
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(chalk.bold('Karis Doctor'));
|
|
136
|
+
console.log(chalk.dim('────────────────────────────────────────'));
|
|
137
|
+
console.log();
|
|
138
|
+
for (const check of checks) {
|
|
139
|
+
const marker = check.status === 'pass'
|
|
140
|
+
? chalk.green('PASS')
|
|
141
|
+
: check.status === 'warn'
|
|
142
|
+
? chalk.yellow('WARN')
|
|
143
|
+
: chalk.red('FAIL');
|
|
144
|
+
console.log(`${marker} ${check.id} ${check.message}`);
|
|
145
|
+
}
|
|
146
|
+
console.log();
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../../src/commands/geo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBzD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { KarisClient } from '../core/client.js';
|
|
2
|
+
import { renderToolResult } from '../utils/formatter.js';
|
|
3
|
+
import { runCommand } from '../utils/run-command.js';
|
|
4
|
+
export function registerGeoCommand(program) {
|
|
5
|
+
const geo = program.command('geo').description('GEO (Generative Engine Optimization) data');
|
|
6
|
+
geo
|
|
7
|
+
.command('data')
|
|
8
|
+
.description('Get brand visibility metrics from AI search engines')
|
|
9
|
+
.option('--domain <domain>', 'Brand domain (e.g. cursor.com)')
|
|
10
|
+
.option('--time-range <range>', 'Time window: 7d, 14d, or 30d (default: 7d)')
|
|
11
|
+
.action(runCommand(async (options) => {
|
|
12
|
+
const args = {};
|
|
13
|
+
if (options.domain)
|
|
14
|
+
args.domain = options.domain;
|
|
15
|
+
if (options.timeRange)
|
|
16
|
+
args.time_range = options.timeRange;
|
|
17
|
+
const client = await KarisClient.create();
|
|
18
|
+
const result = await client.toolDirect('get_geo_data', args);
|
|
19
|
+
renderToolResult(result);
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=geo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.js","sourceRoot":"","sources":["../../src/commands/geo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAE5F,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,sBAAsB,EAAE,4CAA4C,CAAC;SAC5E,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC7D,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Start a localhost HTTP server, open the browser to the CLI auth page,
|
|
4
|
+
* and wait for the callback with the API key.
|
|
5
|
+
*/
|
|
6
|
+
export declare function browserLogin(apiUrl: string): Promise<string>;
|
|
7
|
+
export declare function registerLoginCommand(program: Command): void;
|
|
8
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuElE;AA6BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgE3D"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { setConfigValue, loadResolvedConfig } from '../utils/config.js';
|
|
6
|
+
import { isTextOutput } from '../core/cli-context.js';
|
|
7
|
+
import { printCommandResult } from '../utils/output.js';
|
|
8
|
+
import { runCommand } from '../utils/run-command.js';
|
|
9
|
+
import { KarisClient } from '../core/client.js';
|
|
10
|
+
const LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
|
|
11
|
+
function deriveAppUrl(apiUrl) {
|
|
12
|
+
if (apiUrl.includes('api-staging'))
|
|
13
|
+
return 'https://app-staging.karis.im';
|
|
14
|
+
if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {
|
|
15
|
+
const port = new URL(apiUrl).port || '8000';
|
|
16
|
+
return `http://localhost:${port === '8000' ? '3000' : port}`;
|
|
17
|
+
}
|
|
18
|
+
return 'https://app.karis.im';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Start a localhost HTTP server, open the browser to the CLI auth page,
|
|
22
|
+
* and wait for the callback with the API key.
|
|
23
|
+
*/
|
|
24
|
+
export async function browserLogin(apiUrl) {
|
|
25
|
+
const state = crypto.randomBytes(16).toString('hex');
|
|
26
|
+
const appUrl = deriveAppUrl(apiUrl);
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const server = http.createServer((req, res) => {
|
|
29
|
+
const url = new URL(req.url, `http://localhost`);
|
|
30
|
+
if (url.pathname !== '/callback') {
|
|
31
|
+
res.writeHead(404);
|
|
32
|
+
res.end('Not found');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const key = url.searchParams.get('key');
|
|
36
|
+
const returnedState = url.searchParams.get('state');
|
|
37
|
+
const error = url.searchParams.get('error');
|
|
38
|
+
if (error) {
|
|
39
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
40
|
+
res.end(resultPage(false, error));
|
|
41
|
+
server.close();
|
|
42
|
+
reject(new Error(`Authorization failed: ${error}`));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (returnedState !== state) {
|
|
46
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
47
|
+
res.end(resultPage(false, 'State mismatch — possible CSRF attack.'));
|
|
48
|
+
server.close();
|
|
49
|
+
reject(new Error('State mismatch'));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!key) {
|
|
53
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
54
|
+
res.end(resultPage(false, 'No API key received.'));
|
|
55
|
+
server.close();
|
|
56
|
+
reject(new Error('No API key in callback'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
60
|
+
res.end(resultPage(true));
|
|
61
|
+
server.close();
|
|
62
|
+
resolve(key);
|
|
63
|
+
});
|
|
64
|
+
server.listen(0, '127.0.0.1', async () => {
|
|
65
|
+
const addr = server.address();
|
|
66
|
+
const port = typeof addr === 'object' && addr ? addr.port : 0;
|
|
67
|
+
const authUrl = `${appUrl}/cli/auth?port=${port}&state=${state}`;
|
|
68
|
+
try {
|
|
69
|
+
const openModule = await import('open');
|
|
70
|
+
await openModule.default(authUrl);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
if (isTextOutput()) {
|
|
74
|
+
console.log(chalk.yellow(`\n Could not open browser. Please visit:`));
|
|
75
|
+
console.log(chalk.cyan(` ${authUrl}\n`));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const timeout = setTimeout(() => {
|
|
80
|
+
server.close();
|
|
81
|
+
reject(new Error('Login timed out. Please try again.'));
|
|
82
|
+
}, LOGIN_TIMEOUT_MS);
|
|
83
|
+
server.on('close', () => clearTimeout(timeout));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function resultPage(success, errorMessage) {
|
|
87
|
+
const title = success ? 'Logged in to Karis' : 'Login failed';
|
|
88
|
+
const body = success
|
|
89
|
+
? '<p style="color:#22c55e;font-size:1.2em;">✓ You can close this tab and return to the terminal.</p>'
|
|
90
|
+
: `<p style="color:#ef4444;font-size:1.2em;">✗ ${errorMessage || 'Unknown error'}</p>`;
|
|
91
|
+
return `<!DOCTYPE html>
|
|
92
|
+
<html><head><meta charset="utf-8"><title>${title}</title>
|
|
93
|
+
<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#09090b;color:#fafafa;}
|
|
94
|
+
.card{text-align:center;padding:3rem;border-radius:1rem;background:#18181b;max-width:400px;}</style>
|
|
95
|
+
</head><body><div class="card"><h2>${title}</h2>${body}</div></body></html>`;
|
|
96
|
+
}
|
|
97
|
+
async function tryExistingKey(apiUrl) {
|
|
98
|
+
const resolved = await loadResolvedConfig();
|
|
99
|
+
const existingKey = resolved.apiKey.value;
|
|
100
|
+
if (!existingKey)
|
|
101
|
+
return { valid: false };
|
|
102
|
+
try {
|
|
103
|
+
const client = new KarisClient({ apiKey: existingKey, apiUrl });
|
|
104
|
+
const info = await client.verifyKey();
|
|
105
|
+
return { valid: true, name: info.name || info.key_prefix || '' };
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return { valid: false };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function registerLoginCommand(program) {
|
|
112
|
+
program
|
|
113
|
+
.command('login')
|
|
114
|
+
.description('Log in to Karis via browser')
|
|
115
|
+
.option('--force', 'Re-login even if already authenticated')
|
|
116
|
+
.action(runCommand(async (options) => {
|
|
117
|
+
const resolved = await loadResolvedConfig();
|
|
118
|
+
const apiUrl = resolved.apiUrl.value || 'https://api.karis.im';
|
|
119
|
+
if (isTextOutput()) {
|
|
120
|
+
console.log();
|
|
121
|
+
console.log(chalk.bold('Log in to Karis'));
|
|
122
|
+
console.log();
|
|
123
|
+
}
|
|
124
|
+
if (!options.force) {
|
|
125
|
+
const existing = await tryExistingKey(apiUrl);
|
|
126
|
+
if (existing.valid) {
|
|
127
|
+
if (isTextOutput()) {
|
|
128
|
+
const label = existing.name ? ` (key: ${existing.name})` : '';
|
|
129
|
+
console.log(chalk.green(` Already logged in${label}`));
|
|
130
|
+
console.log(chalk.dim(` Use ${chalk.cyan('karis login --force')} to re-authenticate.`));
|
|
131
|
+
console.log();
|
|
132
|
+
}
|
|
133
|
+
printCommandResult({ action: 'login', success: true, already_authenticated: true, key_name: existing.name });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const spinner = isTextOutput() ? ora('Opening browser...').start() : undefined;
|
|
138
|
+
let apiKey;
|
|
139
|
+
try {
|
|
140
|
+
if (spinner)
|
|
141
|
+
spinner.text = 'Waiting for authorization...';
|
|
142
|
+
apiKey = await browserLogin(apiUrl);
|
|
143
|
+
if (spinner)
|
|
144
|
+
spinner.succeed('Authorized');
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (spinner)
|
|
148
|
+
spinner.fail('Login failed');
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
await setConfigValue('api-key', apiKey);
|
|
152
|
+
let userName = '';
|
|
153
|
+
try {
|
|
154
|
+
const client = new KarisClient({ apiKey, apiUrl });
|
|
155
|
+
const info = await client.verifyKey();
|
|
156
|
+
userName = info.name || '';
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// non-critical
|
|
160
|
+
}
|
|
161
|
+
if (isTextOutput()) {
|
|
162
|
+
const label = userName ? ` (key: ${userName})` : '';
|
|
163
|
+
console.log(chalk.green(` API key saved${label}`));
|
|
164
|
+
console.log();
|
|
165
|
+
}
|
|
166
|
+
printCommandResult({
|
|
167
|
+
action: 'login',
|
|
168
|
+
success: true,
|
|
169
|
+
key_name: userName || undefined,
|
|
170
|
+
});
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { KarisClient } from '../core/client.js';
|
|
2
|
+
import { renderToolResult } from '../utils/formatter.js';
|
|
3
|
+
import { runCommand } from '../utils/run-command.js';
|
|
4
|
+
export function registerMemoryCommand(program) {
|
|
5
|
+
const memory = program.command('memory').description('Agent memory (saved facts)');
|
|
6
|
+
memory
|
|
7
|
+
.command('recall')
|
|
8
|
+
.description('Search or browse saved facts')
|
|
9
|
+
.argument('[query]', 'Optional keyword search')
|
|
10
|
+
.action(runCommand(async (query) => {
|
|
11
|
+
const args = {};
|
|
12
|
+
if (query)
|
|
13
|
+
args.query = query;
|
|
14
|
+
const client = await KarisClient.create();
|
|
15
|
+
const result = await client.toolDirect('memory_recall', args);
|
|
16
|
+
renderToolResult(result);
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAEnF,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;SAC9C,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;QAC1C,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC9D,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit.d.ts","sourceRoot":"","sources":["../../src/commands/reddit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD5D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { KarisClient } from '../core/client.js';
|
|
2
|
+
import { renderToolResult } from '../utils/formatter.js';
|
|
3
|
+
import { runCommand } from '../utils/run-command.js';
|
|
4
|
+
export function registerRedditCommand(program) {
|
|
5
|
+
const reddit = program.command('reddit').description('Reddit search and data');
|
|
6
|
+
reddit
|
|
7
|
+
.command('search')
|
|
8
|
+
.description('Search Reddit for posts')
|
|
9
|
+
.argument('<query>', 'Search query')
|
|
10
|
+
.option('--subreddit <name>', 'Limit to a subreddit (without r/)')
|
|
11
|
+
.action(runCommand(async (query, options) => {
|
|
12
|
+
const args = { query };
|
|
13
|
+
if (options.subreddit)
|
|
14
|
+
args.subreddit = options.subreddit;
|
|
15
|
+
const client = await KarisClient.create();
|
|
16
|
+
const result = await client.toolDirect('search_reddit', args);
|
|
17
|
+
renderToolResult(result);
|
|
18
|
+
}));
|
|
19
|
+
reddit
|
|
20
|
+
.command('posts')
|
|
21
|
+
.description('Browse a subreddit by sort order')
|
|
22
|
+
.argument('<subreddit>', 'Subreddit name (without r/)')
|
|
23
|
+
.option('--sort <order>', 'hot | new | top | rising (default: hot)')
|
|
24
|
+
.option('--time-filter <range>', 'For top: hour | day | week | month | year | all')
|
|
25
|
+
.option('--limit <n>', 'Number of posts, 1-50 (default: 10)', parseInt)
|
|
26
|
+
.action(runCommand(async (subreddit, options) => {
|
|
27
|
+
const args = { subreddit };
|
|
28
|
+
if (options.sort)
|
|
29
|
+
args.sort = options.sort;
|
|
30
|
+
if (options.timeFilter)
|
|
31
|
+
args.time_filter = options.timeFilter;
|
|
32
|
+
if (options.limit)
|
|
33
|
+
args.limit = options.limit;
|
|
34
|
+
const client = await KarisClient.create();
|
|
35
|
+
const result = await client.toolDirect('get_reddit_posts', args);
|
|
36
|
+
renderToolResult(result);
|
|
37
|
+
}));
|
|
38
|
+
reddit
|
|
39
|
+
.command('comments')
|
|
40
|
+
.description('Get the comment tree for a post')
|
|
41
|
+
.argument('<post_id>', 'Reddit post ID')
|
|
42
|
+
.option('--limit <n>', 'Max comments (default: 30)', parseInt)
|
|
43
|
+
.action(runCommand(async (postId, options) => {
|
|
44
|
+
const args = { post_id: postId };
|
|
45
|
+
if (options.limit)
|
|
46
|
+
args.limit = options.limit;
|
|
47
|
+
const client = await KarisClient.create();
|
|
48
|
+
const result = await client.toolDirect('get_reddit_comments', args);
|
|
49
|
+
renderToolResult(result);
|
|
50
|
+
}));
|
|
51
|
+
reddit
|
|
52
|
+
.command('rules')
|
|
53
|
+
.description('Get a subreddit\'s posting rules')
|
|
54
|
+
.argument('<subreddit>', 'Subreddit name (without r/)')
|
|
55
|
+
.action(runCommand(async (subreddit) => {
|
|
56
|
+
const client = await KarisClient.create();
|
|
57
|
+
const result = await client.toolDirect('get_subreddit_rules', { subreddit });
|
|
58
|
+
renderToolResult(result);
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=reddit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/commands/reddit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAW9D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { KarisClient } from '../core/client.js';
|
|
2
|
+
import { renderToolResult } from '../utils/formatter.js';
|
|
3
|
+
import { runCommand } from '../utils/run-command.js';
|
|
4
|
+
export function registerScheduleCommand(program) {
|
|
5
|
+
const schedule = program.command('schedule').description('Scheduled tasks');
|
|
6
|
+
schedule
|
|
7
|
+
.command('list')
|
|
8
|
+
.description('List all scheduled tasks')
|
|
9
|
+
.action(runCommand(async () => {
|
|
10
|
+
const client = await KarisClient.create();
|
|
11
|
+
const result = await client.toolDirect('list_schedules', {});
|
|
12
|
+
renderToolResult(result);
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=schedule.js.map
|