@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.
Files changed (154) hide show
  1. package/bin/karis.js +2 -0
  2. package/dist/commands/brand/customize.d.ts +11 -0
  3. package/dist/commands/brand/customize.d.ts.map +1 -0
  4. package/dist/commands/brand/customize.js +115 -0
  5. package/dist/commands/brand/customize.js.map +1 -0
  6. package/dist/commands/brand/info.d.ts +3 -0
  7. package/dist/commands/brand/info.d.ts.map +1 -0
  8. package/dist/commands/brand/info.js +14 -0
  9. package/dist/commands/brand/info.js.map +1 -0
  10. package/dist/commands/brand/init.d.ts +7 -0
  11. package/dist/commands/brand/init.d.ts.map +1 -0
  12. package/dist/commands/brand/init.js +133 -0
  13. package/dist/commands/brand/init.js.map +1 -0
  14. package/dist/commands/brand/list.d.ts +4 -0
  15. package/dist/commands/brand/list.d.ts.map +1 -0
  16. package/dist/commands/brand/list.js +46 -0
  17. package/dist/commands/brand/list.js.map +1 -0
  18. package/dist/commands/brand/refresh.d.ts +7 -0
  19. package/dist/commands/brand/refresh.d.ts.map +1 -0
  20. package/dist/commands/brand/refresh.js +63 -0
  21. package/dist/commands/brand/refresh.js.map +1 -0
  22. package/dist/commands/brand/select.d.ts +6 -0
  23. package/dist/commands/brand/select.d.ts.map +1 -0
  24. package/dist/commands/brand/select.js +104 -0
  25. package/dist/commands/brand/select.js.map +1 -0
  26. package/dist/commands/brand/show.d.ts +4 -0
  27. package/dist/commands/brand/show.d.ts.map +1 -0
  28. package/dist/commands/brand/show.js +122 -0
  29. package/dist/commands/brand/show.js.map +1 -0
  30. package/dist/commands/capabilities.d.ts +3 -0
  31. package/dist/commands/capabilities.d.ts.map +1 -0
  32. package/dist/commands/capabilities.js +103 -0
  33. package/dist/commands/capabilities.js.map +1 -0
  34. package/dist/commands/chat.d.ts +3 -0
  35. package/dist/commands/chat.d.ts.map +1 -0
  36. package/dist/commands/chat.js +336 -0
  37. package/dist/commands/chat.js.map +1 -0
  38. package/dist/commands/config.d.ts +3 -0
  39. package/dist/commands/config.d.ts.map +1 -0
  40. package/dist/commands/config.js +91 -0
  41. package/dist/commands/config.js.map +1 -0
  42. package/dist/commands/doctor.d.ts +3 -0
  43. package/dist/commands/doctor.d.ts.map +1 -0
  44. package/dist/commands/doctor.js +148 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/geo.d.ts +3 -0
  47. package/dist/commands/geo.d.ts.map +1 -0
  48. package/dist/commands/geo.js +22 -0
  49. package/dist/commands/geo.js.map +1 -0
  50. package/dist/commands/login.d.ts +8 -0
  51. package/dist/commands/login.d.ts.map +1 -0
  52. package/dist/commands/login.js +173 -0
  53. package/dist/commands/login.js.map +1 -0
  54. package/dist/commands/memory.d.ts +3 -0
  55. package/dist/commands/memory.d.ts.map +1 -0
  56. package/dist/commands/memory.js +19 -0
  57. package/dist/commands/memory.js.map +1 -0
  58. package/dist/commands/reddit.d.ts +3 -0
  59. package/dist/commands/reddit.d.ts.map +1 -0
  60. package/dist/commands/reddit.js +61 -0
  61. package/dist/commands/reddit.js.map +1 -0
  62. package/dist/commands/schedule.d.ts +3 -0
  63. package/dist/commands/schedule.d.ts.map +1 -0
  64. package/dist/commands/schedule.js +15 -0
  65. package/dist/commands/schedule.js.map +1 -0
  66. package/dist/commands/setup.d.ts +11 -0
  67. package/dist/commands/setup.d.ts.map +1 -0
  68. package/dist/commands/setup.js +303 -0
  69. package/dist/commands/setup.js.map +1 -0
  70. package/dist/commands/show.d.ts +3 -0
  71. package/dist/commands/show.d.ts.map +1 -0
  72. package/dist/commands/show.js +46 -0
  73. package/dist/commands/show.js.map +1 -0
  74. package/dist/commands/tools.d.ts +3 -0
  75. package/dist/commands/tools.d.ts.map +1 -0
  76. package/dist/commands/tools.js +139 -0
  77. package/dist/commands/tools.js.map +1 -0
  78. package/dist/commands/web.d.ts +3 -0
  79. package/dist/commands/web.d.ts.map +1 -0
  80. package/dist/commands/web.js +29 -0
  81. package/dist/commands/web.js.map +1 -0
  82. package/dist/commands/x.d.ts +3 -0
  83. package/dist/commands/x.d.ts.map +1 -0
  84. package/dist/commands/x.js +29 -0
  85. package/dist/commands/x.js.map +1 -0
  86. package/dist/commands/youtube.d.ts +3 -0
  87. package/dist/commands/youtube.d.ts.map +1 -0
  88. package/dist/commands/youtube.js +16 -0
  89. package/dist/commands/youtube.js.map +1 -0
  90. package/dist/core/agent-factory.d.ts +20 -0
  91. package/dist/core/agent-factory.d.ts.map +1 -0
  92. package/dist/core/agent-factory.js +26 -0
  93. package/dist/core/agent-factory.js.map +1 -0
  94. package/dist/core/agent-interface.d.ts +68 -0
  95. package/dist/core/agent-interface.d.ts.map +1 -0
  96. package/dist/core/agent-interface.js +5 -0
  97. package/dist/core/agent-interface.js.map +1 -0
  98. package/dist/core/browser-bridge.d.ts +19 -0
  99. package/dist/core/browser-bridge.d.ts.map +1 -0
  100. package/dist/core/browser-bridge.js +56 -0
  101. package/dist/core/browser-bridge.js.map +1 -0
  102. package/dist/core/cli-context.d.ts +19 -0
  103. package/dist/core/cli-context.d.ts.map +1 -0
  104. package/dist/core/cli-context.js +43 -0
  105. package/dist/core/cli-context.js.map +1 -0
  106. package/dist/core/client.d.ts +219 -0
  107. package/dist/core/client.d.ts.map +1 -0
  108. package/dist/core/client.js +638 -0
  109. package/dist/core/client.js.map +1 -0
  110. package/dist/core/errors.d.ts +18 -0
  111. package/dist/core/errors.d.ts.map +1 -0
  112. package/dist/core/errors.js +107 -0
  113. package/dist/core/errors.js.map +1 -0
  114. package/dist/core/remote-agent.d.ts +36 -0
  115. package/dist/core/remote-agent.d.ts.map +1 -0
  116. package/dist/core/remote-agent.js +195 -0
  117. package/dist/core/remote-agent.js.map +1 -0
  118. package/dist/index.d.ts +2 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +178 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/utils/agent-helper.d.ts +14 -0
  123. package/dist/utils/agent-helper.d.ts.map +1 -0
  124. package/dist/utils/agent-helper.js +54 -0
  125. package/dist/utils/agent-helper.js.map +1 -0
  126. package/dist/utils/config.d.ts +26 -0
  127. package/dist/utils/config.d.ts.map +1 -0
  128. package/dist/utils/config.js +93 -0
  129. package/dist/utils/config.js.map +1 -0
  130. package/dist/utils/form-prompt.d.ts +15 -0
  131. package/dist/utils/form-prompt.d.ts.map +1 -0
  132. package/dist/utils/form-prompt.js +153 -0
  133. package/dist/utils/form-prompt.js.map +1 -0
  134. package/dist/utils/formatter.d.ts +7 -0
  135. package/dist/utils/formatter.d.ts.map +1 -0
  136. package/dist/utils/formatter.js +132 -0
  137. package/dist/utils/formatter.js.map +1 -0
  138. package/dist/utils/index-cache.d.ts +10 -0
  139. package/dist/utils/index-cache.d.ts.map +1 -0
  140. package/dist/utils/index-cache.js +22 -0
  141. package/dist/utils/index-cache.js.map +1 -0
  142. package/dist/utils/interactive.d.ts +19 -0
  143. package/dist/utils/interactive.d.ts.map +1 -0
  144. package/dist/utils/interactive.js +73 -0
  145. package/dist/utils/interactive.js.map +1 -0
  146. package/dist/utils/output.d.ts +41 -0
  147. package/dist/utils/output.d.ts.map +1 -0
  148. package/dist/utils/output.js +259 -0
  149. package/dist/utils/output.js.map +1 -0
  150. package/dist/utils/run-command.d.ts +2 -0
  151. package/dist/utils/run-command.d.ts.map +1 -0
  152. package/dist/utils/run-command.js +12 -0
  153. package/dist/utils/run-command.js.map +1 -0
  154. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerGeoCommand(program: Command): void;
3
+ //# sourceMappingURL=geo.d.ts.map
@@ -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;">&#10003; You can close this tab and return to the terminal.</p>'
90
+ : `<p style="color:#ef4444;font-size:1.2em;">&#10007; ${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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMemoryCommand(program: Command): void;
3
+ //# sourceMappingURL=memory.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerRedditCommand(program: Command): void;
3
+ //# sourceMappingURL=reddit.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerScheduleCommand(program: Command): void;
3
+ //# sourceMappingURL=schedule.d.ts.map
@@ -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