@pedroaugusto04/kb-cli 1.0.0 → 1.1.1
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/dist/client.js +15 -2
- package/dist/client.js.map +1 -1
- package/dist/commands/config.js +7 -6
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/init.js +70 -45
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logout.js +15 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/note.js +3 -3
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/repl.js +223 -56
- package/dist/commands/repl.js.map +1 -1
- package/dist/config.js +19 -4
- package/dist/config.js.map +1 -1
- package/dist/index.js +36 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -88,6 +88,14 @@ export class ApiClient {
|
|
|
88
88
|
body: JSON.stringify({ email, password }),
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
|
+
async logout() {
|
|
92
|
+
try {
|
|
93
|
+
await this.fetch('/api/auth/logout', { method: 'POST' });
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
clearConfigAuth();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
91
99
|
async ask(question, projectSlug) {
|
|
92
100
|
return this.fetch('/api/ask', {
|
|
93
101
|
method: 'POST',
|
|
@@ -95,8 +103,9 @@ export class ApiClient {
|
|
|
95
103
|
body: JSON.stringify({ question, projectSlug: projectSlug || undefined }),
|
|
96
104
|
});
|
|
97
105
|
}
|
|
98
|
-
async sendAgentMessage(text, media) {
|
|
106
|
+
async sendAgentMessage(text, media, projectSlug) {
|
|
99
107
|
const config = loadConfig();
|
|
108
|
+
const activeProject = projectSlug || config.defaultProjectSlug;
|
|
100
109
|
const payload = {
|
|
101
110
|
messageText: text,
|
|
102
111
|
senderId: 'cli-user',
|
|
@@ -104,7 +113,11 @@ export class ApiClient {
|
|
|
104
113
|
hasMedia: !!media,
|
|
105
114
|
media: media || {},
|
|
106
115
|
};
|
|
107
|
-
|
|
116
|
+
let url = `/api/conversation/agent?workspaceSlug=${encodeURIComponent(config.workspaceSlug)}`;
|
|
117
|
+
if (activeProject) {
|
|
118
|
+
url += `&projectSlug=${encodeURIComponent(activeProject)}`;
|
|
119
|
+
}
|
|
120
|
+
return this.fetch(url, {
|
|
108
121
|
method: 'POST',
|
|
109
122
|
headers: { 'Content-Type': 'application/json' },
|
|
110
123
|
body: JSON.stringify(payload),
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,OAAO,cAAe,SAAQ,KAAK;IACpB;IAAwC;IAA3D,YAAmB,MAAc,EAAE,OAAe,EAAS,IAAc;QACvE,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,WAAM,GAAN,MAAM,CAAQ;QAA0B,SAAI,GAAJ,IAAI,CAAU;QAEvE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,SAAS,cAAc,CAAC,aAAuB;IAC7C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,SAAS;IACZ,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,UAAuB,EAAE;QAC3D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QAE7E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACtE,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe;gBAAE,WAAW,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;YAC1G,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB;gBAAE,WAAW,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC7G,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3D,0CAA0C;QAC1C,mEAAmE;QACnE,MAAM,gBAAgB,GAAG,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,KAAK,UAAU;YAC1E,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;YACjC,CAAC,CAAC,EAAE,CAAC;QAEP,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;YACpD,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,UAAuB,EAAE;QACjD,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEjD,oEAAoE;QACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBACpF,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;wBACvB,4EAA4E;wBAC5E,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC/C,CAAC;yBAAM,CAAC;wBACN,eAAe,EAAE,CAAC;oBACpB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,eAAe,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,IAAS,CAAC;YACd,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,IAAI,cAAc,CACtB,QAAQ,CAAC,MAAM,EACf,IAAI,EAAE,OAAO,IAAI,8BAA8B,QAAQ,CAAC,MAAM,EAAE,EAChE,IAAI,CACL,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;QACzC,eAAe,EAAE,CAAC,CAAC,6BAA6B;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,eAAe,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,WAAoB;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,IAAI,SAAS,EAAE,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,KAAqF,EACrF,WAAoB;QAEpB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,WAAW,IAAI,MAAM,CAAC,kBAAkB,CAAC;QAC/D,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC,CAAC,KAAK;YACjB,KAAK,EAAE,KAAK,IAAI,EAAE;SACnB,CAAC;QACF,IAAI,GAAG,GAAG,yCAAyC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9F,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC","sourcesContent":["import { loadConfig, saveConfig, clearConfigAuth } from './config.js';\n\nexport class ApiClientError extends Error {\n constructor(public status: number, message: string, public body?: unknown) {\n super(message);\n this.name = 'ApiClientError';\n }\n}\n\nfunction parseSetCookie(cookieHeaders: string[]): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const header of cookieHeaders) {\n const parts = header.split(';')[0]?.trim().split('=') || [];\n if (parts[0] && parts[1] !== undefined) {\n cookies[parts[0]] = decodeURIComponent(parts[1]);\n }\n }\n return cookies;\n}\n\nexport class ApiClient {\n private async request(path: string, options: RequestInit = {}): Promise<Response> {\n const config = loadConfig();\n const url = `${config.apiUrl.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`;\n\n const headers = new Headers(options.headers || {});\n if (config.cookies.kb_access_token || config.cookies.kb_refresh_token) {\n const cookieParts: string[] = [];\n if (config.cookies.kb_access_token) cookieParts.push(`kb_access_token=${config.cookies.kb_access_token}`);\n if (config.cookies.kb_refresh_token) cookieParts.push(`kb_refresh_token=${config.cookies.kb_refresh_token}`);\n headers.set('Cookie', cookieParts.join('; '));\n }\n\n const response = await fetch(url, { ...options, headers });\n\n // Extract cookies from Set-Cookie headers\n // getSetCookie() is available in Node.js 18+ global fetch Response\n const setCookieHeaders = typeof response.headers.getSetCookie === 'function' \n ? response.headers.getSetCookie() \n : [];\n\n if (setCookieHeaders.length > 0) {\n const newCookies = parseSetCookie(setCookieHeaders);\n saveConfig({ cookies: newCookies });\n }\n\n return response;\n }\n\n async fetch(path: string, options: RequestInit = {}): Promise<any> {\n let response = await this.request(path, options);\n\n // If unauthorized, attempt token refresh if we have a refresh token\n if (response.status === 401 && !path.includes('auth/login') && !path.includes('auth/refresh')) {\n const config = loadConfig();\n if (config.cookies.kb_refresh_token) {\n try {\n const refreshResponse = await this.request('/api/auth/refresh', { method: 'POST' });\n if (refreshResponse.ok) {\n // Token was refreshed (cookies saved automatically), retry original request\n response = await this.request(path, options);\n } else {\n clearConfigAuth();\n }\n } catch {\n clearConfigAuth();\n }\n }\n }\n\n if (!response.ok) {\n let body: any;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new ApiClientError(\n response.status,\n body?.message || `Request failed with status ${response.status}`,\n body\n );\n }\n\n if (response.status === 204) {\n return null;\n }\n\n return response.json();\n }\n\n async login(email: string, password: string): Promise<any> {\n clearConfigAuth(); // Reset current auth cookies\n return this.fetch('/api/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n }\n\n async logout(): Promise<any> {\n try {\n await this.fetch('/api/auth/logout', { method: 'POST' });\n } finally {\n clearConfigAuth();\n }\n }\n\n async ask(question: string, projectSlug?: string): Promise<any> {\n return this.fetch('/api/ask', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ question, projectSlug: projectSlug || undefined }),\n });\n }\n\n async sendAgentMessage(\n text: string,\n media?: { fileName: string; mimeType: string; sizeBytes: number; dataBase64: string },\n projectSlug?: string\n ): Promise<any> {\n const config = loadConfig();\n const activeProject = projectSlug || config.defaultProjectSlug;\n const payload = {\n messageText: text,\n senderId: 'cli-user',\n chatId: 'cli-session',\n hasMedia: !!media,\n media: media || {},\n };\n let url = `/api/conversation/agent?workspaceSlug=${encodeURIComponent(config.workspaceSlug)}`;\n if (activeProject) {\n url += `&projectSlug=${encodeURIComponent(activeProject)}`;\n }\n return this.fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async listProjects(): Promise<any> {\n return this.fetch('/api/projects?limit=100');\n }\n\n async listWorkspaces(): Promise<any> {\n return this.fetch('/api/workspaces');\n }\n}\n\nexport const client = new ApiClient();\n"]}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import pc from 'picocolors';
|
|
2
2
|
import { loadConfig, saveConfig } from '../config.js';
|
|
3
|
-
const VALID_KEYS = ['
|
|
4
|
-
export function runConfigGet(key) {
|
|
3
|
+
const VALID_KEYS = ['workspaceSlug', 'defaultProjectSlug'];
|
|
4
|
+
export function runConfigGet(key, isRepl = false) {
|
|
5
5
|
const config = loadConfig();
|
|
6
6
|
if (!VALID_KEYS.includes(key)) {
|
|
7
7
|
console.error(pc.red(`Invalid configuration key. Valid keys are: ${VALID_KEYS.join(', ')}`));
|
|
8
|
+
if (isRepl)
|
|
9
|
+
return;
|
|
8
10
|
process.exit(1);
|
|
9
11
|
}
|
|
10
12
|
const val = config[key];
|
|
11
13
|
console.log(val);
|
|
12
14
|
}
|
|
13
|
-
export function runConfigSet(key, value) {
|
|
15
|
+
export function runConfigSet(key, value, isRepl = false) {
|
|
14
16
|
if (!VALID_KEYS.includes(key)) {
|
|
15
17
|
console.error(pc.red(`Invalid configuration key. Valid keys are: ${VALID_KEYS.join(', ')}`));
|
|
18
|
+
if (isRepl)
|
|
19
|
+
return;
|
|
16
20
|
process.exit(1);
|
|
17
21
|
}
|
|
18
22
|
let formattedValue = value.trim();
|
|
19
|
-
if (key === 'apiUrl') {
|
|
20
|
-
formattedValue = formattedValue.replace(/\/$/, '');
|
|
21
|
-
}
|
|
22
23
|
saveConfig({ [key]: formattedValue });
|
|
23
24
|
console.log(pc.green(`Updated configuration: ${key} = ${formattedValue}`));
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAItD,MAAM,UAAU,GAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAItD,MAAM,UAAU,GAAgB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;AAExE,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK;IACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7F,IAAI,MAAM;YAAE,OAAO;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAgB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK;IACrE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7F,IAAI,MAAM;YAAE,OAAO;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAElC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,GAAG,MAAM,cAAc,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3E,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AAC1H,CAAC","sourcesContent":["import pc from 'picocolors';\nimport { loadConfig, saveConfig } from '../config.js';\n\ntype ConfigKey = 'workspaceSlug' | 'defaultProjectSlug';\n\nconst VALID_KEYS: ConfigKey[] = ['workspaceSlug', 'defaultProjectSlug'];\n\nexport function runConfigGet(key: string, isRepl = false): void {\n const config = loadConfig();\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n console.error(pc.red(`Invalid configuration key. Valid keys are: ${VALID_KEYS.join(', ')}`));\n if (isRepl) return;\n process.exit(1);\n }\n const val = config[key as ConfigKey];\n console.log(val);\n}\n\nexport function runConfigSet(key: string, value: string, isRepl = false): void {\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n console.error(pc.red(`Invalid configuration key. Valid keys are: ${VALID_KEYS.join(', ')}`));\n if (isRepl) return;\n process.exit(1);\n }\n\n let formattedValue = value.trim();\n\n saveConfig({ [key]: formattedValue });\n console.log(pc.green(`Updated configuration: ${key} = ${formattedValue}`));\n}\n\nexport function runConfigList(): void {\n const config = loadConfig();\n console.log(pc.cyan('Current CLI Configuration:'));\n console.log(`${pc.bold('API URL:')} ${config.apiUrl}`);\n console.log(`${pc.bold('Workspace:')} ${config.workspaceSlug}`);\n console.log(`${pc.bold('Default Project:')} ${config.defaultProjectSlug}`);\n const hasAccessToken = !!config.cookies.kb_access_token;\n console.log(`${pc.bold('Authentication Status:')} ${hasAccessToken ? pc.green('Logged In') : pc.red('Not Logged In')}`);\n}\n"]}
|
package/dist/commands/init.js
CHANGED
|
@@ -4,58 +4,83 @@ import { saveConfig } from '../config.js';
|
|
|
4
4
|
import { ApiClient } from '../client.js';
|
|
5
5
|
export async function runInit() {
|
|
6
6
|
intro(pc.cyan('Knowledge Base (kb) CLI Setup'));
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (!value.startsWith('http://') && !value.startsWith('https://')) {
|
|
15
|
-
return 'URL must start with http:// or https://';
|
|
16
|
-
}
|
|
17
|
-
return;
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
if (isCancel(apiUrlInput)) {
|
|
21
|
-
outro(pc.red('Setup cancelled.'));
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const apiUrl = apiUrlInput.trim().replace(/\/$/, '');
|
|
25
|
-
const email = await text({
|
|
26
|
-
message: 'Enter your account email:',
|
|
27
|
-
validate: (value) => {
|
|
28
|
-
if (!value || !value.trim())
|
|
29
|
-
return 'Email is required';
|
|
30
|
-
if (!value.includes('@'))
|
|
31
|
-
return 'Enter a valid email address';
|
|
32
|
-
return;
|
|
33
|
-
},
|
|
7
|
+
const apiUrl = 'https://pedro-duarte.ddns.net/knowledge-base/api';
|
|
8
|
+
const authMethod = await select({
|
|
9
|
+
message: 'Select authentication method:',
|
|
10
|
+
options: [
|
|
11
|
+
{ value: 'google', label: '1 - Google OAuth (Browser Login)' },
|
|
12
|
+
{ value: 'email', label: '2 - Email & Password' },
|
|
13
|
+
],
|
|
34
14
|
});
|
|
35
|
-
if (isCancel(
|
|
15
|
+
if (isCancel(authMethod)) {
|
|
36
16
|
outro(pc.red('Setup cancelled.'));
|
|
37
17
|
return;
|
|
38
18
|
}
|
|
39
|
-
const userPassword = await password({
|
|
40
|
-
message: 'Enter your password:',
|
|
41
|
-
validate: (value) => {
|
|
42
|
-
if (!value)
|
|
43
|
-
return 'Password is required';
|
|
44
|
-
return;
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
if (isCancel(userPassword)) {
|
|
48
|
-
outro(pc.red('Setup cancelled.'));
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const s = spinner();
|
|
52
|
-
s.start('Connecting and authenticating...');
|
|
53
19
|
// Save temporary URL so ApiClient can use it for requests
|
|
54
|
-
saveConfig({ apiUrl });
|
|
20
|
+
saveConfig({ apiUrl, cookies: {} });
|
|
55
21
|
const client = new ApiClient();
|
|
22
|
+
const s = spinner();
|
|
56
23
|
try {
|
|
57
|
-
|
|
58
|
-
|
|
24
|
+
if (authMethod === 'google') {
|
|
25
|
+
const googleStartUrl = `${apiUrl}/api/auth/google/start?returnTo=/auth`;
|
|
26
|
+
console.log('\n' + pc.cyan('Google OAuth Instructions:'));
|
|
27
|
+
console.log(`1. Open the following URL in your browser to log in:`);
|
|
28
|
+
console.log(` ${pc.underline(pc.bold(pc.blue(googleStartUrl)))}`);
|
|
29
|
+
console.log(`2. Once logged in, open the Developer Tools (F12) in your browser.`);
|
|
30
|
+
console.log(`3. Under the Application tab (Storage -> Cookies), find the cookie named "${pc.bold('kb_access_token')}".`);
|
|
31
|
+
console.log(`4. Copy its value and paste it below:\n`);
|
|
32
|
+
const token = await password({
|
|
33
|
+
message: 'Paste the kb_access_token cookie value:',
|
|
34
|
+
validate: (value) => {
|
|
35
|
+
if (!value || !value.trim())
|
|
36
|
+
return 'Access token value is required';
|
|
37
|
+
return;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
if (isCancel(token)) {
|
|
41
|
+
outro(pc.red('Setup cancelled.'));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
s.start('Validating Google access token...');
|
|
45
|
+
saveConfig({
|
|
46
|
+
apiUrl,
|
|
47
|
+
cookies: {
|
|
48
|
+
kb_access_token: token.trim(),
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Email & Password login
|
|
54
|
+
const email = await text({
|
|
55
|
+
message: 'Enter your account email:',
|
|
56
|
+
validate: (value) => {
|
|
57
|
+
if (!value || !value.trim())
|
|
58
|
+
return 'Email is required';
|
|
59
|
+
if (!value.includes('@'))
|
|
60
|
+
return 'Enter a valid email address';
|
|
61
|
+
return;
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (isCancel(email)) {
|
|
65
|
+
outro(pc.red('Setup cancelled.'));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const userPassword = await password({
|
|
69
|
+
message: 'Enter your password:',
|
|
70
|
+
validate: (value) => {
|
|
71
|
+
if (!value)
|
|
72
|
+
return 'Password is required';
|
|
73
|
+
return;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
if (isCancel(userPassword)) {
|
|
77
|
+
outro(pc.red('Setup cancelled.'));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
s.start('Connecting and authenticating...');
|
|
81
|
+
await client.login(email.trim(), userPassword);
|
|
82
|
+
}
|
|
83
|
+
s.message('Fetching workspaces...');
|
|
59
84
|
const workspacesResult = await client.listWorkspaces();
|
|
60
85
|
s.stop(pc.green('Authenticated successfully!'));
|
|
61
86
|
let selectedWorkspace = 'default';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEhD,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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","sourcesContent":["import { intro, outro, text, password, select, spinner, isCancel } from '@clack/prompts';\nimport pc from 'picocolors';\nimport { saveConfig } from '../config.js';\nimport { ApiClient } from '../client.js';\n\nexport async function runInit(): Promise<void> {\n intro(pc.cyan('Knowledge Base (kb) CLI Setup'));\n\n const apiUrl = 'https://pedro-duarte.ddns.net/knowledge-base/api';\n\n const authMethod = await select({\n message: 'Select authentication method:',\n options: [\n { value: 'google', label: '1 - Google OAuth (Browser Login)' },\n { value: 'email', label: '2 - Email & Password' },\n ],\n });\n\n if (isCancel(authMethod)) {\n outro(pc.red('Setup cancelled.'));\n return;\n }\n\n // Save temporary URL so ApiClient can use it for requests\n saveConfig({ apiUrl, cookies: {} });\n const client = new ApiClient();\n const s = spinner();\n\n try {\n if (authMethod === 'google') {\n const googleStartUrl = `${apiUrl}/api/auth/google/start?returnTo=/auth`;\n console.log('\\n' + pc.cyan('Google OAuth Instructions:'));\n console.log(`1. Open the following URL in your browser to log in:`);\n console.log(` ${pc.underline(pc.bold(pc.blue(googleStartUrl)))}`);\n console.log(`2. Once logged in, open the Developer Tools (F12) in your browser.`);\n console.log(`3. Under the Application tab (Storage -> Cookies), find the cookie named \"${pc.bold('kb_access_token')}\".`);\n console.log(`4. Copy its value and paste it below:\\n`);\n\n const token = await password({\n message: 'Paste the kb_access_token cookie value:',\n validate: (value) => {\n if (!value || !value.trim()) return 'Access token value is required';\n return;\n },\n });\n\n if (isCancel(token)) {\n outro(pc.red('Setup cancelled.'));\n return;\n }\n\n s.start('Validating Google access token...');\n saveConfig({\n apiUrl,\n cookies: {\n kb_access_token: token.trim(),\n },\n });\n } else {\n // Email & Password login\n const email = await text({\n message: 'Enter your account email:',\n validate: (value) => {\n if (!value || !value.trim()) return 'Email is required';\n if (!value.includes('@')) return 'Enter a valid email address';\n return;\n },\n });\n\n if (isCancel(email)) {\n outro(pc.red('Setup cancelled.'));\n return;\n }\n\n const userPassword = await password({\n message: 'Enter your password:',\n validate: (value) => {\n if (!value) return 'Password is required';\n return;\n },\n });\n\n if (isCancel(userPassword)) {\n outro(pc.red('Setup cancelled.'));\n return;\n }\n\n s.start('Connecting and authenticating...');\n await client.login(email.trim(), userPassword);\n }\n\n s.message('Fetching workspaces...');\n const workspacesResult = await client.listWorkspaces();\n s.stop(pc.green('Authenticated successfully!'));\n\n let selectedWorkspace = 'default';\n if (workspacesResult && Array.isArray(workspacesResult.workspaces)) {\n const workspaces = workspacesResult.workspaces;\n if (workspaces.length > 1) {\n const workspaceSelection = await select({\n message: 'Select your default workspace:',\n options: workspaces.map((w: any) => ({\n value: w.workspaceSlug,\n label: w.displayName || w.workspaceSlug,\n })),\n });\n\n if (isCancel(workspaceSelection)) {\n outro(pc.red('Setup cancelled.'));\n return;\n }\n selectedWorkspace = String(workspaceSelection);\n } else if (workspaces.length === 1 && workspaces[0]) {\n selectedWorkspace = workspaces[0].workspaceSlug;\n }\n }\n\n saveConfig({\n apiUrl,\n workspaceSlug: selectedWorkspace,\n defaultProjectSlug: 'inbox',\n });\n\n outro(pc.green(`Setup complete! CLI initialized and ready in workspace \"${selectedWorkspace}\".`));\n } catch (error: any) {\n s.stop(pc.red('Authentication failed'));\n const errorMsg = error?.body?.message || error?.message || 'Unknown error';\n outro(pc.red(`Error: ${errorMsg}. Please check your credentials and URL, and run 'kb init' again.`));\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { clearConfigAuth } from '../config.js';
|
|
3
|
+
import { ApiClient } from '../client.js';
|
|
4
|
+
export async function runLogout() {
|
|
5
|
+
const client = new ApiClient();
|
|
6
|
+
try {
|
|
7
|
+
await client.logout();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
// Even if remote server call fails, we ensure the local config session is cleared
|
|
11
|
+
clearConfigAuth();
|
|
12
|
+
}
|
|
13
|
+
console.log(pc.green('Logged out successfully. Local session cleared.'));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,eAAe,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["import pc from 'picocolors';\nimport { clearConfigAuth } from '../config.js';\nimport { ApiClient } from '../client.js';\n\nexport async function runLogout(): Promise<void> {\n const client = new ApiClient();\n try {\n await client.logout();\n } catch (error) {\n // Even if remote server call fails, we ensure the local config session is cleared\n clearConfigAuth();\n }\n console.log(pc.green('Logged out successfully. Local session cleared.'));\n}\n"]}
|
package/dist/commands/note.js
CHANGED
|
@@ -56,7 +56,7 @@ export async function runNote(noteText, options) {
|
|
|
56
56
|
const s = spinner();
|
|
57
57
|
s.start('Sending message to agent...');
|
|
58
58
|
try {
|
|
59
|
-
let response = await client.sendAgentMessage(noteText, media);
|
|
59
|
+
let response = await client.sendAgentMessage(noteText, media, options.project);
|
|
60
60
|
// Clear media after first turn so we don't re-upload on subsequent clarification turns
|
|
61
61
|
media = undefined;
|
|
62
62
|
while (response) {
|
|
@@ -85,11 +85,11 @@ export async function runNote(noteText, options) {
|
|
|
85
85
|
});
|
|
86
86
|
if (isCancel(userReply)) {
|
|
87
87
|
s.start('Cancelling session...');
|
|
88
|
-
response = await client.sendAgentMessage('cancel');
|
|
88
|
+
response = await client.sendAgentMessage('cancel', undefined, options.project);
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
91
|
s.start('Sending reply...');
|
|
92
|
-
response = await client.sendAgentMessage(String(userReply));
|
|
92
|
+
response = await client.sendAgentMessage(String(userReply), undefined, options.project);
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
95
|
// Fallback for unexpected states
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEtD,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,GAAG,GAA2B;QAClC,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,oBAAoB;KAC5B,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { text as clackText, isCancel, spinner } from '@clack/prompts';\nimport { client, ApiClientError } from '../client.js';\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const map: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.json': 'application/json',\n '.csv': 'text/csv',\n '.log': 'text/plain',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.xml': 'text/xml',\n '.js': 'application/javascript',\n '.ts': 'application/typescript',\n '.html': 'text/html',\n '.css': 'text/css',\n '.py': 'text/x-python',\n '.sh': 'text/x-shellscript',\n };\n return map[ext] || 'application/octet-stream';\n}\n\nexport async function runNote(noteText: string, options: { file?: string; project?: string }): Promise<void> {\n let media: { fileName: string; mimeType: string; sizeBytes: number; dataBase64: string } | undefined;\n\n if (options.file) {\n const filePath = path.resolve(options.file);\n if (!fs.existsSync(filePath)) {\n console.error(pc.red(`Error: File not found at ${options.file}`));\n process.exit(1);\n }\n try {\n const stats = fs.statSync(filePath);\n const buffer = fs.readFileSync(filePath);\n media = {\n fileName: path.basename(filePath),\n mimeType: getMimeType(filePath),\n sizeBytes: stats.size,\n dataBase64: buffer.toString('base64'),\n };\n } catch (err: any) {\n console.error(pc.red(`Error reading file: ${err.message}`));\n process.exit(1);\n }\n }\n\n const s = spinner();\n s.start('Sending message to agent...');\n\n try {\n let response = await client.sendAgentMessage(noteText, media, options.project);\n \n // Clear media after first turn so we don't re-upload on subsequent clarification turns\n media = undefined;\n\n while (response) {\n const action = response.action;\n const replyText = response.replyText || '';\n\n if (action === 'submit') {\n s.stop(pc.green('Success!'));\n console.log('\\n' + pc.cyan(replyText) + '\\n');\n break;\n }\n\n if (action === 'cancel') {\n s.stop(pc.yellow('Cancelled'));\n console.log('\\n' + pc.yellow(replyText) + '\\n');\n break;\n }\n\n if (action === 'ask') {\n s.stop(pc.cyan('Clarification needed'));\n console.log('\\n' + pc.magenta('🤖 ' + replyText));\n\n const userReply = await clackText({\n message: 'Your reply:',\n validate: (val) => {\n if (!val || !val.trim()) return 'Reply cannot be empty. Type \"cancel\" to abort.';\n return;\n },\n });\n\n if (isCancel(userReply)) {\n s.start('Cancelling session...');\n response = await client.sendAgentMessage('cancel', undefined, options.project);\n continue;\n }\n\n s.start('Sending reply...');\n response = await client.sendAgentMessage(String(userReply), undefined, options.project);\n } else {\n // Fallback for unexpected states\n s.stop(pc.green('Response received'));\n console.log('\\n' + replyText + '\\n');\n break;\n }\n }\n } catch (error: any) {\n s.stop(pc.red('Error processing agent conversation'));\n if (error instanceof ApiClientError) {\n console.error(pc.red(`Error (${error.status}): ${(error.body as any)?.message || error.message}`));\n } else {\n console.error(pc.red(`Error: ${error.message || 'Failed to communicate with agent'}`));\n }\n process.exit(1);\n }\n}\n"]}
|
package/dist/commands/repl.js
CHANGED
|
@@ -3,94 +3,261 @@ import pc from 'picocolors';
|
|
|
3
3
|
import { runAsk } from './ask.js';
|
|
4
4
|
import { runNote } from './note.js';
|
|
5
5
|
import { runListProjects, runListWorkspaces } from './list.js';
|
|
6
|
+
import { runLogout } from './logout.js';
|
|
7
|
+
import { runConfigGet, runConfigSet, runConfigList } from './config.js';
|
|
6
8
|
import { loadConfig } from '../config.js';
|
|
7
|
-
const COMMANDS = [
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const COMMANDS = [
|
|
10
|
+
'/save ',
|
|
11
|
+
'/ask ',
|
|
12
|
+
'/logout',
|
|
13
|
+
'/exit',
|
|
14
|
+
'projects',
|
|
15
|
+
'workspaces',
|
|
16
|
+
'config list',
|
|
17
|
+
'config get ',
|
|
18
|
+
'config set ',
|
|
19
|
+
'help'
|
|
20
|
+
];
|
|
21
|
+
function readlineAutocompletePrompt(promptText, commands) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
let input = '';
|
|
24
|
+
let cursor = 0;
|
|
25
|
+
let selectedIndex = 0;
|
|
26
|
+
function getMatches(currentInput) {
|
|
27
|
+
const trimmed = currentInput.trim();
|
|
28
|
+
if (!trimmed)
|
|
29
|
+
return [];
|
|
30
|
+
return commands.filter((c) => c.startsWith(trimmed));
|
|
31
|
+
}
|
|
32
|
+
function cleanupOverlay(matches) {
|
|
33
|
+
if (matches.length > 0) {
|
|
34
|
+
readline.cursorTo(process.stdout, 0);
|
|
35
|
+
readline.clearLine(process.stdout, 0);
|
|
36
|
+
// Move cursor down to clear each suggestion line
|
|
37
|
+
for (let i = 0; i < matches.length; i++) {
|
|
38
|
+
process.stdout.write('\n');
|
|
39
|
+
readline.clearLine(process.stdout, 0);
|
|
40
|
+
}
|
|
41
|
+
// Return cursor to prompt line
|
|
42
|
+
readline.moveCursor(process.stdout, 0, -matches.length);
|
|
43
|
+
readline.clearScreenDown(process.stdout);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function render() {
|
|
47
|
+
const matches = getMatches(input);
|
|
48
|
+
// Clean prompt line
|
|
49
|
+
readline.cursorTo(process.stdout, 0);
|
|
50
|
+
readline.clearLine(process.stdout, 0);
|
|
51
|
+
// Write prompt and user input
|
|
52
|
+
process.stdout.write(promptText + input);
|
|
53
|
+
// Clear any remaining lines below
|
|
54
|
+
readline.clearScreenDown(process.stdout);
|
|
55
|
+
if (matches.length > 0) {
|
|
56
|
+
process.stdout.write('\n');
|
|
57
|
+
matches.forEach((match, index) => {
|
|
58
|
+
if (index === selectedIndex) {
|
|
59
|
+
// Glow blue selection bar
|
|
60
|
+
process.stdout.write(` ${pc.bgBlue(pc.white(pc.bold(` ❯ ${match.padEnd(16)} `)))}\n`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
process.stdout.write(` ${pc.cyan(match)}\n`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
// Return cursor back to prompt line
|
|
67
|
+
readline.moveCursor(process.stdout, 0, -(matches.length + 1));
|
|
68
|
+
}
|
|
69
|
+
// Restore cursor position inside input buffer
|
|
70
|
+
readline.cursorTo(process.stdout, promptText.length + cursor);
|
|
71
|
+
}
|
|
72
|
+
function onKeypress(str, key) {
|
|
73
|
+
const matches = getMatches(input);
|
|
74
|
+
if (key && key.ctrl && key.name === 'c') {
|
|
75
|
+
cleanupOverlay(matches);
|
|
76
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
77
|
+
process.stdin.setRawMode(false);
|
|
78
|
+
console.log();
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
81
|
+
if (key && (key.name === 'return' || key.name === 'enter')) {
|
|
82
|
+
if (matches.length > 0) {
|
|
83
|
+
const selectedMatch = matches[selectedIndex];
|
|
84
|
+
if (selectedMatch === '/save ' || selectedMatch === '/ask ') {
|
|
85
|
+
// Autofill command and let user continue typing note/question
|
|
86
|
+
cleanupOverlay(matches);
|
|
87
|
+
input = selectedMatch;
|
|
88
|
+
cursor = input.length;
|
|
89
|
+
selectedIndex = 0;
|
|
90
|
+
render();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Self-executing commands
|
|
94
|
+
cleanupOverlay(matches);
|
|
95
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
96
|
+
process.stdin.setRawMode(false);
|
|
97
|
+
console.log();
|
|
98
|
+
resolve(selectedMatch);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Normal text submission
|
|
102
|
+
cleanupOverlay(matches);
|
|
103
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
104
|
+
process.stdin.setRawMode(false);
|
|
105
|
+
console.log();
|
|
106
|
+
resolve(input);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (key && key.name === 'up') {
|
|
110
|
+
if (matches.length > 0) {
|
|
111
|
+
selectedIndex = (selectedIndex - 1 + matches.length) % matches.length;
|
|
112
|
+
}
|
|
113
|
+
render();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (key && key.name === 'down') {
|
|
117
|
+
if (matches.length > 0) {
|
|
118
|
+
selectedIndex = (selectedIndex + 1) % matches.length;
|
|
119
|
+
}
|
|
120
|
+
render();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (key && key.name === 'tab') {
|
|
124
|
+
if (matches.length > 0) {
|
|
125
|
+
const selectedMatch = matches[selectedIndex];
|
|
126
|
+
input = selectedMatch;
|
|
127
|
+
cursor = input.length;
|
|
128
|
+
selectedIndex = 0;
|
|
129
|
+
}
|
|
130
|
+
render();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (key && (key.name === 'backspace' || key.name === 'delete' || str === '\u007f' || str === '\b')) {
|
|
134
|
+
if (cursor > 0) {
|
|
135
|
+
// Clear current overlay matches before modifying input
|
|
136
|
+
cleanupOverlay(matches);
|
|
137
|
+
input = input.slice(0, cursor - 1) + input.slice(cursor);
|
|
138
|
+
cursor--;
|
|
139
|
+
selectedIndex = 0;
|
|
140
|
+
}
|
|
141
|
+
render();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (key && key.name === 'left') {
|
|
145
|
+
if (cursor > 0)
|
|
146
|
+
cursor--;
|
|
147
|
+
render();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (key && key.name === 'right') {
|
|
151
|
+
if (cursor < input.length)
|
|
152
|
+
cursor++;
|
|
153
|
+
render();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Handle normal printable characters
|
|
157
|
+
if (str && str.length === 1 && (!key || (!key.meta && !key.ctrl && key.name !== 'escape'))) {
|
|
158
|
+
cleanupOverlay(matches);
|
|
159
|
+
input = input.slice(0, cursor) + str + input.slice(cursor);
|
|
160
|
+
cursor += str.length;
|
|
161
|
+
selectedIndex = 0;
|
|
162
|
+
render();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
readline.emitKeypressEvents(process.stdin);
|
|
166
|
+
if (process.stdin.isTTY) {
|
|
167
|
+
process.stdin.setRawMode(true);
|
|
168
|
+
}
|
|
169
|
+
process.stdin.on('keypress', onKeypress);
|
|
170
|
+
render();
|
|
171
|
+
});
|
|
11
172
|
}
|
|
12
|
-
export function runRepl() {
|
|
173
|
+
export async function runRepl() {
|
|
13
174
|
const config = loadConfig();
|
|
14
175
|
console.log(pc.cyan('================================================'));
|
|
15
|
-
console.log(pc.cyan(` Knowledge Base Interactive Session
|
|
176
|
+
console.log(pc.cyan(` Knowledge Base Interactive Session `));
|
|
16
177
|
console.log(pc.cyan(` Active Workspace: ${pc.bold(config.workspaceSlug)}`));
|
|
17
178
|
console.log(pc.cyan(` Type ${pc.bold('/exit')} to quit, ${pc.bold('help')} for command list.`));
|
|
18
|
-
console.log(pc.cyan(` [TAB] to autocomplete commands
|
|
179
|
+
console.log(pc.cyan(` [TAB] or [UP/DOWN] to select autocomplete commands.`));
|
|
19
180
|
console.log(pc.cyan('================================================\n'));
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
completer,
|
|
24
|
-
});
|
|
25
|
-
rl.setPrompt(pc.magenta('kb> '));
|
|
26
|
-
rl.prompt();
|
|
27
|
-
rl.on('line', async (line) => {
|
|
181
|
+
while (true) {
|
|
182
|
+
const promptLabel = pc.magenta('kb> ');
|
|
183
|
+
const line = await readlineAutocompletePrompt(promptLabel, COMMANDS);
|
|
28
184
|
const trimmed = line.trim();
|
|
29
185
|
if (!trimmed) {
|
|
30
|
-
|
|
31
|
-
return;
|
|
186
|
+
continue;
|
|
32
187
|
}
|
|
33
188
|
if (trimmed === '/exit' || trimmed === 'exit' || trimmed === 'quit') {
|
|
34
189
|
console.log(pc.gray('Goodbye!'));
|
|
35
|
-
|
|
36
|
-
return;
|
|
190
|
+
process.exit(0);
|
|
37
191
|
}
|
|
38
192
|
if (trimmed === 'help') {
|
|
39
193
|
console.log(pc.cyan('\nAvailable Commands:'));
|
|
40
|
-
console.log(` ${pc.bold('/ask <question>')}
|
|
41
|
-
console.log(` ${pc.bold('/
|
|
42
|
-
console.log(` ${pc.bold('<any text>')}
|
|
43
|
-
console.log(` ${pc.bold('projects')}
|
|
44
|
-
console.log(` ${pc.bold('workspaces')}
|
|
45
|
-
console.log(` ${pc.bold('
|
|
46
|
-
|
|
47
|
-
|
|
194
|
+
console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);
|
|
195
|
+
console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);
|
|
196
|
+
console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);
|
|
197
|
+
console.log(` ${pc.bold('projects')} - List all projects in active workspace`);
|
|
198
|
+
console.log(` ${pc.bold('workspaces')} - List available workspaces`);
|
|
199
|
+
console.log(` ${pc.bold('config list')} - List all CLI config values`);
|
|
200
|
+
console.log(` ${pc.bold('config get <key>')} - Get a CLI config value`);
|
|
201
|
+
console.log(` ${pc.bold('config set <key> <val>')} - Set a CLI config value`);
|
|
202
|
+
console.log(` ${pc.bold('/logout')} - Log out of session`);
|
|
203
|
+
console.log(` ${pc.bold('/exit')} - Exit session\n`);
|
|
204
|
+
continue;
|
|
48
205
|
}
|
|
49
206
|
if (trimmed === 'projects') {
|
|
50
|
-
// Temporarily pause readline interface so output does not conflict
|
|
51
|
-
rl.pause();
|
|
52
207
|
await runListProjects();
|
|
53
|
-
|
|
54
|
-
rl.prompt();
|
|
55
|
-
return;
|
|
208
|
+
continue;
|
|
56
209
|
}
|
|
57
210
|
if (trimmed === 'workspaces') {
|
|
58
|
-
rl.pause();
|
|
59
211
|
await runListWorkspaces();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (trimmed === 'config' || trimmed === 'config list') {
|
|
215
|
+
runConfigList();
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (trimmed.startsWith('config get ')) {
|
|
219
|
+
const key = trimmed.substring(11).trim();
|
|
220
|
+
runConfigGet(key, true);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (trimmed.startsWith('config set ')) {
|
|
224
|
+
const parts = trimmed.substring(11).trim().split(/\s+/);
|
|
225
|
+
const key = parts[0] || '';
|
|
226
|
+
const value = parts.slice(1).join(' ');
|
|
227
|
+
if (!key || !value) {
|
|
228
|
+
console.log(pc.yellow('Usage: config set <key> <value>'));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
runConfigSet(key, value, true);
|
|
232
|
+
}
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (trimmed === '/logout') {
|
|
236
|
+
await runLogout();
|
|
237
|
+
console.log(pc.yellow('Exiting REPL session.'));
|
|
238
|
+
process.exit(0);
|
|
63
239
|
}
|
|
64
240
|
// Process Slash Commands
|
|
65
241
|
if (trimmed.startsWith('/ask ')) {
|
|
66
242
|
const question = trimmed.substring(5).trim();
|
|
67
|
-
rl.pause();
|
|
68
243
|
await runAsk(question, {});
|
|
69
|
-
|
|
70
|
-
rl.prompt();
|
|
71
|
-
return;
|
|
244
|
+
continue;
|
|
72
245
|
}
|
|
73
|
-
if (trimmed.startsWith('/
|
|
74
|
-
const note = trimmed.substring(
|
|
75
|
-
|
|
246
|
+
if (trimmed === '/save' || trimmed.startsWith('/save ')) {
|
|
247
|
+
const note = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';
|
|
248
|
+
if (!note) {
|
|
249
|
+
console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
76
252
|
await runNote(note, {});
|
|
77
|
-
|
|
78
|
-
rl.prompt();
|
|
79
|
-
return;
|
|
253
|
+
continue;
|
|
80
254
|
}
|
|
81
255
|
if (trimmed.startsWith('/')) {
|
|
82
256
|
console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));
|
|
83
|
-
|
|
84
|
-
return;
|
|
257
|
+
continue;
|
|
85
258
|
}
|
|
86
|
-
// Default
|
|
87
|
-
rl.pause();
|
|
259
|
+
// Default note creation shortcut
|
|
88
260
|
await runNote(trimmed, {});
|
|
89
|
-
|
|
90
|
-
rl.prompt();
|
|
91
|
-
});
|
|
92
|
-
rl.on('close', () => {
|
|
93
|
-
process.exit(0);
|
|
94
|
-
});
|
|
261
|
+
}
|
|
95
262
|
}
|
|
96
263
|
//# sourceMappingURL=repl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAE9E,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAE3E,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS;KACV,CAAC,CAAC;IAEH,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACjC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,qCAAqC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,iEAAiE,CAAC,CAAC;YACzG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACpE,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,mEAAmE;YACnE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,eAAe,EAAE,CAAC;YACxB,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,iBAAiB,EAAE,CAAC;YAC1B,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,OAAO,uCAAuC,CAAC,CAAC,CAAC;YACxF,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3B,EAAE,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import readline from 'node:readline';\nimport pc from 'picocolors';\nimport { runAsk } from './ask.js';\nimport { runNote } from './note.js';\nimport { runListProjects, runListWorkspaces } from './list.js';\nimport { loadConfig } from '../config.js';\n\nconst COMMANDS = ['/ask ', '/kb ', '/exit', 'projects', 'workspaces', 'help'];\n\nfunction completer(line: string) {\n const hits = COMMANDS.filter((c) => c.startsWith(line.trim()));\n return [hits.length ? hits : COMMANDS, line];\n}\n\nexport function runRepl(): void {\n const config = loadConfig();\n console.log(pc.cyan('================================================'));\n console.log(pc.cyan(` Knowledge Base Interactive Session (kb REPL) `));\n console.log(pc.cyan(` Active Workspace: ${pc.bold(config.workspaceSlug)}`));\n console.log(pc.cyan(` Type ${pc.bold('/exit')} to quit, ${pc.bold('help')} for command list.`));\n console.log(pc.cyan(` [TAB] to autocomplete commands. `));\n console.log(pc.cyan('================================================\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n completer,\n });\n\n rl.setPrompt(pc.magenta('kb> '));\n rl.prompt();\n\n rl.on('line', async (line) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === '/exit' || trimmed === 'exit' || trimmed === 'quit') {\n console.log(pc.gray('Goodbye!'));\n rl.close();\n return;\n }\n\n if (trimmed === 'help') {\n console.log(pc.cyan('\\nAvailable Commands:'));\n console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);\n console.log(` ${pc.bold('/kb <note>')} - Send a note to the agent`);\n console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /kb)`);\n console.log(` ${pc.bold('projects')} - List all projects in active workspace`);\n console.log(` ${pc.bold('workspaces')} - List available workspaces`);\n console.log(` ${pc.bold('/exit')} - Exit session\\n`);\n rl.prompt();\n return;\n }\n\n if (trimmed === 'projects') {\n // Temporarily pause readline interface so output does not conflict\n rl.pause();\n await runListProjects();\n rl.resume();\n rl.prompt();\n return;\n }\n\n if (trimmed === 'workspaces') {\n rl.pause();\n await runListWorkspaces();\n rl.resume();\n rl.prompt();\n return;\n }\n\n // Process Slash Commands\n if (trimmed.startsWith('/ask ')) {\n const question = trimmed.substring(5).trim();\n rl.pause();\n await runAsk(question, {});\n rl.resume();\n rl.prompt();\n return;\n }\n\n if (trimmed.startsWith('/kb ')) {\n const note = trimmed.substring(4).trim();\n rl.pause();\n await runNote(note, {});\n rl.resume();\n rl.prompt();\n return;\n }\n\n if (trimmed.startsWith('/')) {\n console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));\n rl.prompt();\n return;\n }\n\n // Default: treat as note text for agent\n rl.pause();\n await runNote(trimmed, {});\n rl.resume();\n rl.prompt();\n });\n\n rl.on('close', () => {\n process.exit(0);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/commands/repl.ts"],"names":[],"mappings":"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","sourcesContent":["import readline from 'node:readline';\nimport pc from 'picocolors';\nimport { runAsk } from './ask.js';\nimport { runNote } from './note.js';\nimport { runListProjects, runListWorkspaces } from './list.js';\nimport { runLogout } from './logout.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './config.js';\nimport { loadConfig } from '../config.js';\n\nconst COMMANDS = [\n '/save ',\n '/ask ',\n '/logout',\n '/exit',\n 'projects',\n 'workspaces',\n 'config list',\n 'config get ',\n 'config set ',\n 'help'\n];\n\nfunction readlineAutocompletePrompt(promptText: string, commands: string[]): Promise<string> {\n return new Promise((resolve) => {\n let input = '';\n let cursor = 0;\n let selectedIndex = 0;\n\n function getMatches(currentInput: string): string[] {\n const trimmed = currentInput.trim();\n if (!trimmed) return [];\n return commands.filter((c) => c.startsWith(trimmed));\n }\n\n function cleanupOverlay(matches: string[]) {\n if (matches.length > 0) {\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n // Move cursor down to clear each suggestion line\n for (let i = 0; i < matches.length; i++) {\n process.stdout.write('\\n');\n readline.clearLine(process.stdout, 0);\n }\n // Return cursor to prompt line\n readline.moveCursor(process.stdout, 0, -matches.length);\n readline.clearScreenDown(process.stdout);\n }\n }\n\n function render() {\n const matches = getMatches(input);\n\n // Clean prompt line\n readline.cursorTo(process.stdout, 0);\n readline.clearLine(process.stdout, 0);\n\n // Write prompt and user input\n process.stdout.write(promptText + input);\n\n // Clear any remaining lines below\n readline.clearScreenDown(process.stdout);\n\n if (matches.length > 0) {\n process.stdout.write('\\n');\n matches.forEach((match, index) => {\n if (index === selectedIndex) {\n // Glow blue selection bar\n process.stdout.write(` ${pc.bgBlue(pc.white(pc.bold(` ❯ ${match.padEnd(16)} `)))}\\n`);\n } else {\n process.stdout.write(` ${pc.cyan(match)}\\n`);\n }\n });\n\n // Return cursor back to prompt line\n readline.moveCursor(process.stdout, 0, -(matches.length + 1));\n }\n\n // Restore cursor position inside input buffer\n readline.cursorTo(process.stdout, promptText.length + cursor);\n }\n\n function onKeypress(str: string, key: any) {\n const matches = getMatches(input);\n\n if (key && key.ctrl && key.name === 'c') {\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n process.exit(0);\n }\n\n if (key && (key.name === 'return' || key.name === 'enter')) {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n \n if (selectedMatch === '/save ' || selectedMatch === '/ask ') {\n // Autofill command and let user continue typing note/question\n cleanupOverlay(matches);\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n render();\n return;\n }\n\n // Self-executing commands\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(selectedMatch);\n return;\n }\n\n // Normal text submission\n cleanupOverlay(matches);\n process.stdin.removeListener('keypress', onKeypress);\n process.stdin.setRawMode(false);\n console.log();\n resolve(input);\n return;\n }\n\n if (key && key.name === 'up') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex - 1 + matches.length) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'down') {\n if (matches.length > 0) {\n selectedIndex = (selectedIndex + 1) % matches.length;\n }\n render();\n return;\n }\n\n if (key && key.name === 'tab') {\n if (matches.length > 0) {\n const selectedMatch = matches[selectedIndex];\n input = selectedMatch;\n cursor = input.length;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && (key.name === 'backspace' || key.name === 'delete' || str === '\\u007f' || str === '\\b')) {\n if (cursor > 0) {\n // Clear current overlay matches before modifying input\n cleanupOverlay(matches);\n input = input.slice(0, cursor - 1) + input.slice(cursor);\n cursor--;\n selectedIndex = 0;\n }\n render();\n return;\n }\n\n if (key && key.name === 'left') {\n if (cursor > 0) cursor--;\n render();\n return;\n }\n\n if (key && key.name === 'right') {\n if (cursor < input.length) cursor++;\n render();\n return;\n }\n\n // Handle normal printable characters\n if (str && str.length === 1 && (!key || (!key.meta && !key.ctrl && key.name !== 'escape'))) {\n cleanupOverlay(matches);\n input = input.slice(0, cursor) + str + input.slice(cursor);\n cursor += str.length;\n selectedIndex = 0;\n render();\n }\n }\n\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.on('keypress', onKeypress);\n render();\n });\n}\n\nexport async function runRepl(): Promise<void> {\n const config = loadConfig();\n console.log(pc.cyan('================================================'));\n console.log(pc.cyan(` Knowledge Base Interactive Session `));\n console.log(pc.cyan(` Active Workspace: ${pc.bold(config.workspaceSlug)}`));\n console.log(pc.cyan(` Type ${pc.bold('/exit')} to quit, ${pc.bold('help')} for command list.`));\n console.log(pc.cyan(` [TAB] or [UP/DOWN] to select autocomplete commands.`));\n console.log(pc.cyan('================================================\\n'));\n\n while (true) {\n const promptLabel = pc.magenta('kb> ');\n const line = await readlineAutocompletePrompt(promptLabel, COMMANDS);\n const trimmed = line.trim();\n\n if (!trimmed) {\n continue;\n }\n\n if (trimmed === '/exit' || trimmed === 'exit' || trimmed === 'quit') {\n console.log(pc.gray('Goodbye!'));\n process.exit(0);\n }\n\n if (trimmed === 'help') {\n console.log(pc.cyan('\\nAvailable Commands:'));\n console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);\n console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);\n console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);\n console.log(` ${pc.bold('projects')} - List all projects in active workspace`);\n console.log(` ${pc.bold('workspaces')} - List available workspaces`);\n console.log(` ${pc.bold('config list')} - List all CLI config values`);\n console.log(` ${pc.bold('config get <key>')} - Get a CLI config value`);\n console.log(` ${pc.bold('config set <key> <val>')} - Set a CLI config value`);\n console.log(` ${pc.bold('/logout')} - Log out of session`);\n console.log(` ${pc.bold('/exit')} - Exit session\\n`);\n continue;\n }\n\n if (trimmed === 'projects') {\n await runListProjects();\n continue;\n }\n\n if (trimmed === 'workspaces') {\n await runListWorkspaces();\n continue;\n }\n\n if (trimmed === 'config' || trimmed === 'config list') {\n runConfigList();\n continue;\n }\n\n if (trimmed.startsWith('config get ')) {\n const key = trimmed.substring(11).trim();\n runConfigGet(key, true);\n continue;\n }\n\n if (trimmed.startsWith('config set ')) {\n const parts = trimmed.substring(11).trim().split(/\\s+/);\n const key = parts[0] || '';\n const value = parts.slice(1).join(' ');\n if (!key || !value) {\n console.log(pc.yellow('Usage: config set <key> <value>'));\n } else {\n runConfigSet(key, value, true);\n }\n continue;\n }\n\n if (trimmed === '/logout') {\n await runLogout();\n console.log(pc.yellow('Exiting REPL session.'));\n process.exit(0);\n }\n\n // Process Slash Commands\n if (trimmed.startsWith('/ask ')) {\n const question = trimmed.substring(5).trim();\n await runAsk(question, {});\n continue;\n }\n\n if (trimmed === '/save' || trimmed.startsWith('/save ')) {\n const note = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';\n if (!note) {\n console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));\n continue;\n }\n await runNote(note, {});\n continue;\n }\n\n if (trimmed.startsWith('/')) {\n console.log(pc.red(`Unknown command: ${trimmed}. Type 'help' for available commands.`));\n continue;\n }\n\n // Default note creation shortcut\n await runNote(trimmed, {});\n }\n}\n"]}
|
package/dist/config.js
CHANGED
|
@@ -43,7 +43,7 @@ const CONFIG_DIR = process.env.KB_CLI_CONFIG_DIR || path.join(os.homedir(), '.co
|
|
|
43
43
|
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
44
44
|
export function loadConfig() {
|
|
45
45
|
const defaults = {
|
|
46
|
-
apiUrl: process.env.KB_API_URL || process.env.KB_API_PUBLIC_BASE_URL || '
|
|
46
|
+
apiUrl: process.env.KB_API_URL || process.env.KB_API_PUBLIC_BASE_URL || 'https://pedro-duarte.ddns.net/knowledge-base/api',
|
|
47
47
|
workspaceSlug: process.env.KB_CLI_WORKSPACE || 'default',
|
|
48
48
|
defaultProjectSlug: process.env.KB_CLI_PROJECT || 'inbox',
|
|
49
49
|
cookies: {},
|
|
@@ -91,8 +91,23 @@ export function saveConfig(config) {
|
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
export function clearConfigAuth() {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
try {
|
|
95
|
+
const current = loadConfig();
|
|
96
|
+
const updated = {
|
|
97
|
+
...current,
|
|
98
|
+
cookies: {},
|
|
99
|
+
};
|
|
100
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
101
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2), 'utf8');
|
|
104
|
+
try {
|
|
105
|
+
fs.chmodSync(CONFIG_FILE, 0o600);
|
|
106
|
+
}
|
|
107
|
+
catch { }
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('Error clearing config auth:', error instanceof Error ? error.message : String(error));
|
|
111
|
+
}
|
|
97
112
|
}
|
|
98
113
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,oDAAoD;AACpD,SAAS,OAAO;IACd,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC;KACvC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAElD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACnC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;wBACd,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/C,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAE9C,oCAAoC;wBACpC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;4BAC7F,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACzC,CAAC;wBAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;4BACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,gCAAgC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,OAAO,EAAE,CAAC;AAYV,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAc;QAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\n// Custom .env loader to avoid external dependencies\nfunction loadEnv() {\n const searchPaths = [\n path.join(process.cwd(), '.env'),\n path.join(process.cwd(), '..', '.env'),\n ];\n\n for (const envPath of searchPaths) {\n if (fs.existsSync(envPath)) {\n try {\n const content = fs.readFileSync(envPath, 'utf8');\n const lines = content.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n \n const eqIdx = trimmed.indexOf('=');\n if (eqIdx > 0) {\n const key = trimmed.substring(0, eqIdx).trim();\n let val = trimmed.substring(eqIdx + 1).trim();\n \n // Remove wrapping quotes if present\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.substring(1, val.length - 1);\n }\n \n if (!process.env[key]) {\n process.env[key] = val;\n }\n }\n }\n break; // Stop at first found .env file\n } catch {\n // Continue if reading fails\n }\n }\n }\n}\n\n// Load environment variables\nloadEnv();\n\nexport interface CliConfig {\n apiUrl: string;\n workspaceSlug: string;\n defaultProjectSlug: string;\n cookies: {\n kb_access_token?: string;\n kb_refresh_token?: string;\n };\n}\n\nconst CONFIG_DIR = process.env.KB_CLI_CONFIG_DIR || path.join(os.homedir(), '.config', 'kb');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n\nexport function loadConfig(): CliConfig {\n const defaults: CliConfig = {\n apiUrl: process.env.KB_API_URL || process.env.KB_API_PUBLIC_BASE_URL || 'https://pedro-duarte.ddns.net/knowledge-base/api',\n workspaceSlug: process.env.KB_CLI_WORKSPACE || 'default',\n defaultProjectSlug: process.env.KB_CLI_PROJECT || 'inbox',\n cookies: {},\n };\n\n try {\n if (!fs.existsSync(CONFIG_FILE)) {\n return defaults;\n }\n const data = fs.readFileSync(CONFIG_FILE, 'utf8');\n const parsed = JSON.parse(data);\n return {\n ...defaults,\n ...parsed,\n cookies: parsed.cookies || {},\n };\n } catch {\n return defaults;\n }\n}\n\nexport function saveConfig(config: Partial<CliConfig>): void {\n try {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n const current = loadConfig();\n const updated = {\n ...current,\n ...config,\n cookies: {\n ...current.cookies,\n ...(config.cookies || {}),\n },\n };\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2), 'utf8');\n try {\n fs.chmodSync(CONFIG_FILE, 0o600);\n } catch {\n // Ignore failures to chmod on non-POSIX systems\n }\n } catch (error) {\n console.error('Error saving configuration:', error instanceof Error ? error.message : String(error));\n }\n}\n\nexport function clearConfigAuth(): void {\n try {\n const current = loadConfig();\n const updated = {\n ...current,\n cookies: {},\n };\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2), 'utf8');\n try {\n fs.chmodSync(CONFIG_FILE, 0o600);\n } catch {}\n } catch (error) {\n console.error('Error clearing config auth:', error instanceof Error ? error.message : String(error));\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import { runAsk } from './commands/ask.js';
|
|
|
7
7
|
import { runNote } from './commands/note.js';
|
|
8
8
|
import { runListProjects, runListWorkspaces } from './commands/list.js';
|
|
9
9
|
import { runRepl } from './commands/repl.js';
|
|
10
|
+
import { runLogout } from './commands/logout.js';
|
|
11
|
+
import { loadConfig } from './config.js';
|
|
10
12
|
const program = new Command();
|
|
11
13
|
program
|
|
12
14
|
.name('kb')
|
|
@@ -19,6 +21,13 @@ program
|
|
|
19
21
|
.action(async () => {
|
|
20
22
|
await runInit();
|
|
21
23
|
});
|
|
24
|
+
// logout command
|
|
25
|
+
program
|
|
26
|
+
.command('logout')
|
|
27
|
+
.description('Log out of your Knowledge Base account and clear local session')
|
|
28
|
+
.action(async () => {
|
|
29
|
+
await runLogout();
|
|
30
|
+
});
|
|
22
31
|
// config command
|
|
23
32
|
const configCmd = program
|
|
24
33
|
.command('config')
|
|
@@ -67,6 +76,7 @@ program
|
|
|
67
76
|
program
|
|
68
77
|
.argument('[note-text...]', 'Create a new note with the specified text')
|
|
69
78
|
.option('-f, --file <path>', 'Attach a file to the note')
|
|
79
|
+
.option('-p, --project <slug>', 'Specify project context')
|
|
70
80
|
.action(async (noteTextParts, options) => {
|
|
71
81
|
const noteText = Array.isArray(noteTextParts) ? noteTextParts.join(' ') : '';
|
|
72
82
|
// Check if stdin has piped data
|
|
@@ -92,14 +102,38 @@ program
|
|
|
92
102
|
}
|
|
93
103
|
else {
|
|
94
104
|
// No text and not piped: open REPL
|
|
95
|
-
runRepl();
|
|
105
|
+
await runRepl();
|
|
96
106
|
}
|
|
97
107
|
});
|
|
108
|
+
async function checkAuth() {
|
|
109
|
+
const config = loadConfig();
|
|
110
|
+
if (!config.cookies?.kb_access_token) {
|
|
111
|
+
console.log(pc.yellow('No active session found. You must log in first to use the CLI.'));
|
|
112
|
+
await runInit();
|
|
113
|
+
const newConfig = loadConfig();
|
|
114
|
+
if (!newConfig.cookies?.kb_access_token) {
|
|
115
|
+
console.error(pc.red('Authentication required. Exiting.'));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
98
120
|
// Handle argument parsing
|
|
99
121
|
async function main() {
|
|
122
|
+
const firstArg = process.argv[2];
|
|
123
|
+
// Skip auth check for init, logout, config, help, or version requests
|
|
124
|
+
if (firstArg !== 'init' &&
|
|
125
|
+
firstArg !== 'logout' &&
|
|
126
|
+
firstArg !== 'config' &&
|
|
127
|
+
firstArg !== '--help' &&
|
|
128
|
+
firstArg !== '-h' &&
|
|
129
|
+
firstArg !== 'help' &&
|
|
130
|
+
firstArg !== '--version' &&
|
|
131
|
+
firstArg !== '-V') {
|
|
132
|
+
await checkAuth();
|
|
133
|
+
}
|
|
100
134
|
// If run with no arguments at all, default to REPL (unless stdin is piped)
|
|
101
135
|
if (process.argv.length <= 2 && process.stdin.isTTY) {
|
|
102
|
-
runRepl();
|
|
136
|
+
await runRepl();
|
|
103
137
|
return;
|
|
104
138
|
}
|
|
105
139
|
await program.parseAsync(process.argv);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC,CAAC;AAEnD,SAAS;KACN,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;IACd,YAAY,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACrB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,GAAG,EAAE;IACX,aAAa,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,eAAe,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,iBAAiB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,0CAA0C;AAC1C,OAAO;KACJ,QAAQ,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;KACxD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7E,gCAAgC;IAChC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAErC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAElC,kBAAkB;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,SAAS,IAAI,KAAK,CAAC;QACrB,CAAC;QAED,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,QAAQ;gBAC3B,CAAC,CAAC,GAAG,QAAQ,OAAO,SAAS,EAAE;gBAC/B,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAC;QACzF,MAAM,OAAO,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,0BAA0B;AAC1B,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjC,sEAAsE;IACtE,IACE,QAAQ,KAAK,MAAM;QACnB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,QAAQ;QACrB,QAAQ,KAAK,IAAI;QACjB,QAAQ,KAAK,MAAM;QACnB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,IAAI,EACjB,CAAC;QACD,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAED,2EAA2E;IAC3E,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACpD,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { runInit } from './commands/init.js';\nimport { runConfigGet, runConfigSet, runConfigList } from './commands/config.js';\nimport { runAsk } from './commands/ask.js';\nimport { runNote } from './commands/note.js';\nimport { runListProjects, runListWorkspaces } from './commands/list.js';\nimport { runRepl } from './commands/repl.js';\nimport { runLogout } from './commands/logout.js';\nimport { loadConfig } from './config.js';\n\nconst program = new Command();\n\nprogram\n .name('kb')\n .description('Knowledge Base (kb) CLI tool')\n .version('1.0.0');\n\n// init command\nprogram\n .command('init')\n .description('Setup and authenticate the CLI with your Knowledge Base server')\n .action(async () => {\n await runInit();\n });\n\n// logout command\nprogram\n .command('logout')\n .description('Log out of your Knowledge Base account and clear local session')\n .action(async () => {\n await runLogout();\n });\n\n// config command\nconst configCmd = program\n .command('config')\n .description('View or modify CLI configuration');\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value (apiUrl, workspaceSlug, defaultProjectSlug)')\n .action((key) => {\n runConfigGet(key);\n });\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key, value) => {\n runConfigSet(key, value);\n });\n\nconfigCmd\n .command('list')\n .description('List current config values')\n .action(() => {\n runConfigList();\n });\n\n// ask command\nprogram\n .command('ask <question>')\n .description('Query your knowledge base with a question')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (question, options) => {\n await runAsk(question, options);\n });\n\n// projects command\nprogram\n .command('projects')\n .description('List all projects in the active workspace')\n .action(async () => {\n await runListProjects();\n });\n\n// workspaces command\nprogram\n .command('workspaces')\n .description('List all workspaces available')\n .action(async () => {\n await runListWorkspaces();\n });\n\n// catch-all text action for note creation\nprogram\n .argument('[note-text...]', 'Create a new note with the specified text')\n .option('-f, --file <path>', 'Attach a file to the note')\n .option('-p, --project <slug>', 'Specify project context')\n .action(async (noteTextParts, options) => {\n const noteText = Array.isArray(noteTextParts) ? noteTextParts.join(' ') : '';\n \n // Check if stdin has piped data\n const isPiped = !process.stdin.isTTY;\n\n if (isPiped) {\n let pipedData = '';\n process.stdin.setEncoding('utf8');\n \n // Read piped data\n for await (const chunk of process.stdin) {\n pipedData += chunk;\n }\n\n pipedData = pipedData.trim();\n\n if (pipedData) {\n const combinedText = noteText \n ? `${noteText}\\n\\n${pipedData}`\n : pipedData;\n await runNote(combinedText, options);\n return;\n }\n }\n\n if (noteText) {\n await runNote(noteText, options);\n } else {\n // No text and not piped: open REPL\n await runRepl();\n }\n });\n\nasync function checkAuth() {\n const config = loadConfig();\n if (!config.cookies?.kb_access_token) {\n console.log(pc.yellow('No active session found. You must log in first to use the CLI.'));\n await runInit();\n const newConfig = loadConfig();\n if (!newConfig.cookies?.kb_access_token) {\n console.error(pc.red('Authentication required. Exiting.'));\n process.exit(1);\n }\n }\n}\n\n// Handle argument parsing\nasync function main() {\n const firstArg = process.argv[2];\n \n // Skip auth check for init, logout, config, help, or version requests\n if (\n firstArg !== 'init' && \n firstArg !== 'logout' && \n firstArg !== 'config' && \n firstArg !== '--help' && \n firstArg !== '-h' && \n firstArg !== 'help' && \n firstArg !== '--version' && \n firstArg !== '-V'\n ) {\n await checkAuth();\n }\n\n // If run with no arguments at all, default to REPL (unless stdin is piped)\n if (process.argv.length <= 2 && process.stdin.isTTY) {\n await runRepl();\n return;\n }\n \n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n console.error(pc.red(`Fatal Error: ${err.message}`));\n process.exit(1);\n});\n"]}
|