@pedroaugusto04/kb-cli 1.1.8 → 1.1.10

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 CHANGED
@@ -102,10 +102,15 @@ export class ApiClient {
102
102
  }
103
103
  }
104
104
  async ask(question, projectSlug) {
105
+ const config = loadConfig();
105
106
  return this.fetch('/api/ask', {
106
107
  method: 'POST',
107
108
  headers: { 'Content-Type': 'application/json' },
108
- body: JSON.stringify({ question, projectSlug: projectSlug || undefined }),
109
+ body: JSON.stringify({
110
+ question,
111
+ projectSlug: projectSlug || undefined,
112
+ workspaceSlug: config.workspaceSlug || undefined,
113
+ }),
109
114
  });
110
115
  }
111
116
  async sendAgentMessage(text, media, projectSlug) {
@@ -1 +1 @@
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,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QAEzD,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 apiBase = config.apiUrl.replace(/\\/$/, '');\n let cleanPath = path;\n if (apiBase.endsWith('/api') && path.startsWith('/api')) {\n cleanPath = path.substring(4);\n }\n const url = `${apiBase}/${cleanPath.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"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","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 apiBase = config.apiUrl.replace(/\\/$/, '');\n let cleanPath = path;\n if (apiBase.endsWith('/api') && path.startsWith('/api')) {\n cleanPath = path.substring(4);\n }\n const url = `${apiBase}/${cleanPath.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 const config = loadConfig();\n return this.fetch('/api/ask', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n question,\n projectSlug: projectSlug || undefined,\n workspaceSlug: config.workspaceSlug || undefined,\n }),\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"]}
@@ -3,7 +3,7 @@ import path from 'node:path';
3
3
  import pc from 'picocolors';
4
4
  import { text as clackText, isCancel, spinner } from '@clack/prompts';
5
5
  import { client, ApiClientError } from '../client.js';
6
- function getMimeType(filePath) {
6
+ function getMimeType(filePath, buffer) {
7
7
  const ext = path.extname(filePath).toLowerCase();
8
8
  const map = {
9
9
  '.png': 'image/png',
@@ -28,7 +28,22 @@ function getMimeType(filePath) {
28
28
  '.py': 'text/x-python',
29
29
  '.sh': 'text/x-shellscript',
30
30
  };
31
- return map[ext] || 'application/octet-stream';
31
+ if (map[ext])
32
+ return map[ext];
33
+ if (buffer) {
34
+ const limit = Math.min(buffer.length, 1024);
35
+ let isBinary = false;
36
+ for (let i = 0; i < limit; i++) {
37
+ if (buffer[i] === 0) {
38
+ isBinary = true;
39
+ break;
40
+ }
41
+ }
42
+ if (!isBinary) {
43
+ return 'text/plain';
44
+ }
45
+ }
46
+ return 'application/octet-stream';
32
47
  }
33
48
  export async function runNote(noteText, options) {
34
49
  let media;
@@ -43,7 +58,7 @@ export async function runNote(noteText, options) {
43
58
  const buffer = fs.readFileSync(filePath);
44
59
  media = {
45
60
  fileName: path.basename(filePath),
46
- mimeType: getMimeType(filePath),
61
+ mimeType: getMimeType(filePath, buffer),
47
62
  sizeBytes: stats.size,
48
63
  dataBase64: buffer.toString('base64'),
49
64
  };
@@ -1 +1 @@
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"]}
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,EAAE,MAAe;IACpD,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;IAEF,IAAI,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,OAA4C;IAC1F,IAAI,KAAgG,CAAC;IAErG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,KAAK,GAAG;gBACN,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjC,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACvC,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;aACtC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAE/E,uFAAuF;QACvF,KAAK,GAAG,SAAS,CAAC;QAElB,OAAO,QAAQ,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAE3C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9C,MAAM;YACR,CAAC;YAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;gBAChD,MAAM;YACR,CAAC;YAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;gBAElD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC;oBAChC,OAAO,EAAE,aAAa;oBACtB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;wBAChB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;4BAAE,OAAO,gDAAgD,CAAC;wBACjF,OAAO;oBACT,CAAC;iBACF,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACxB,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBACjC,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC/E,SAAS;gBACX,CAAC;gBAED,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC5B,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1F,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;gBACrC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,MAAM,MAAO,KAAK,CAAC,IAAY,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,IAAI,kCAAkC,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","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, buffer?: Buffer): 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 \n if (map[ext]) return map[ext];\n\n if (buffer) {\n const limit = Math.min(buffer.length, 1024);\n let isBinary = false;\n for (let i = 0; i < limit; i++) {\n if (buffer[i] === 0) {\n isBinary = true;\n break;\n }\n }\n if (!isBinary) {\n return 'text/plain';\n }\n }\n\n return '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, buffer),\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"]}
@@ -175,6 +175,26 @@ function readlineAutocompletePrompt(promptText, commands) {
175
175
  render();
176
176
  });
177
177
  }
178
+ function parseReplOptions(argsString) {
179
+ const options = {};
180
+ let text = argsString;
181
+ // Match -p/--project option
182
+ const projectRegex = /(?:-p|--project)(?:\s+|=)(?:'([^']+)'|"([^"]+)"|([^\s]+))/i;
183
+ let match;
184
+ while ((match = projectRegex.exec(text))) {
185
+ options.project = match[1] || match[2] || match[3];
186
+ text = text.replace(match[0], '').trim();
187
+ }
188
+ // Match -f/--file option
189
+ const fileRegex = /(?:-f|--file)(?:\s+|=)(?:'([^']+)'|"([^"]+)"|([^\s]+))/i;
190
+ while ((match = fileRegex.exec(text))) {
191
+ options.file = match[1] || match[2] || match[3];
192
+ text = text.replace(match[0], '').trim();
193
+ }
194
+ // Clean up multiple spaces
195
+ text = text.replace(/\s+/g, ' ').trim();
196
+ return { text, options };
197
+ }
178
198
  export async function runRepl() {
179
199
  const config = loadConfig();
180
200
  console.log(pc.cyan('================================================'));
@@ -195,10 +215,19 @@ export async function runRepl() {
195
215
  process.exit(0);
196
216
  }
197
217
  if (trimmed === 'help') {
198
- console.log(pc.cyan('\nAvailable Commands:'));
218
+ console.log(pc.cyan('\nInteractive Command List & Options:'));
199
219
  console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);
220
+ console.log(` ${pc.gray('Options:')}`);
221
+ console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context for the query`);
222
+ console.log(` ${pc.gray('Example:')} /ask -p platform How to deploy?\n`);
200
223
  console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);
224
+ console.log(` ${pc.gray('Options:')}`);
225
+ console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);
226
+ console.log(` ${pc.yellow('-f, --file <path>')} Attach a file to the note`);
227
+ console.log(` ${pc.gray('Example:')} /save -p inbox -f ./todo.txt review this file\n`);
201
228
  console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);
229
+ console.log(` ${pc.gray('Options:')} Supports same -p and -f options as /save`);
230
+ console.log(` ${pc.gray('Example:')} My note text -p platform\n`);
202
231
  console.log(` ${pc.bold('projects')} - List all projects in active workspace`);
203
232
  console.log(` ${pc.bold('workspaces')} - List available workspaces`);
204
233
  console.log(` ${pc.bold('config list')} - List all CLI config values`);
@@ -244,17 +273,19 @@ export async function runRepl() {
244
273
  }
245
274
  // Process Slash Commands
246
275
  if (trimmed.startsWith('/ask ')) {
247
- const question = trimmed.substring(5).trim();
248
- await runAsk(question, {});
276
+ const rawQuestion = trimmed.substring(5).trim();
277
+ const { text: question, options } = parseReplOptions(rawQuestion);
278
+ await runAsk(question, options);
249
279
  continue;
250
280
  }
251
281
  if (trimmed === '/save' || trimmed.startsWith('/save ')) {
252
- const note = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';
253
- if (!note) {
282
+ const rawNote = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';
283
+ if (!rawNote) {
254
284
  console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));
255
285
  continue;
256
286
  }
257
- await runNote(note, {});
287
+ const { text: note, options } = parseReplOptions(rawNote);
288
+ await runNote(note, options);
258
289
  continue;
259
290
  }
260
291
  if (trimmed.startsWith('/')) {
@@ -262,7 +293,8 @@ export async function runRepl() {
262
293
  continue;
263
294
  }
264
295
  // Default note creation shortcut
265
- await runNote(trimmed, {});
296
+ const { text: noteText, options } = parseReplOptions(trimmed);
297
+ await runNote(noteText, options);
266
298
  }
267
299
  }
268
300
  //# sourceMappingURL=repl.js.map
@@ -1 +1 @@
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 stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\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, stripAnsi(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 process.stdin.resume();\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"]}
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,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,QAAQ,GAAG;IACf,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,MAAM;CACP,CAAC;AAEF,SAAS,SAAS,CAAC,GAAW;IAC5B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,6EAA6E,EAAE,EAAE,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAkB,EAAE,QAAkB;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,SAAS,UAAU,CAAC,YAAoB;YACtC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,SAAS,cAAc,CAAC,OAAiB;YACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACrC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACtC,iDAAiD;gBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxC,CAAC;gBACD,+BAA+B;gBAC/B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxD,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,SAAS,MAAM;YACb,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAElC,oBAAoB;YACpB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAEtC,8BAA8B;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;YAEzC,kCAAkC;YAClC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEzC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC/B,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;wBAC5B,0BAA0B;wBAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,oCAAoC;gBACpC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,8CAA8C;YAC9C,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QAC3E,CAAC;QAED,SAAS,UAAU,CAAC,GAAW,EAAE,GAAQ;YACvC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAElC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;gBAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;oBAE7C,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;wBAC5D,8DAA8D;wBAC9D,cAAc,CAAC,OAAO,CAAC,CAAC;wBACxB,KAAK,GAAG,aAAa,CAAC;wBACtB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;wBACtB,aAAa,GAAG,CAAC,CAAC;wBAClB,MAAM,EAAE,CAAC;wBACT,OAAO;oBACT,CAAC;oBAED,0BAA0B;oBAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;oBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAChC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,aAAa,CAAC,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,yBAAyB;gBACzB,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;gBACxE,CAAC;gBACD,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;gBACvD,CAAC;gBACD,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC7C,KAAK,GAAG,aAAa,CAAC;oBACtB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBACtB,aAAa,GAAG,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC;gBACnG,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;oBACf,uDAAuD;oBACvD,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACzD,MAAM,EAAE,CAAC;oBACT,aAAa,GAAG,CAAC,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,IAAI,MAAM,GAAG,CAAC;oBAAE,MAAM,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM;oBAAE,MAAM,EAAE,CAAC;gBACpC,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,qCAAqC;YACrC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC3F,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;gBACrB,aAAa,GAAG,CAAC,CAAC;gBAClB,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,IAAI,IAAI,GAAG,UAAU,CAAC;IAEtB,4BAA4B;IAC5B,MAAM,YAAY,GAAG,4DAA4D,CAAC;IAClF,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,yDAAyD,CAAC;IAC5E,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAExC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,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,uDAAuD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAE3E,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,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,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,qCAAqC,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,yCAAyC,CAAC,CAAC;YACjG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,oCAAoC,CAAC,CAAC;YAE5E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,yCAAyC,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,gCAAgC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,kDAAkD,CAAC,CAAC;YAE1F,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,yEAAyE,CAAC,CAAC;YACjH,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,2CAA2C,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC;YAErE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,2DAA2D,CAAC,CAAC;YACjG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,oCAAoC,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,8BAA8B,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,eAAe,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,MAAM,iBAAiB,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YACtD,aAAa,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAClE,MAAM,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;gBAC5E,SAAS;YACX,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7B,SAAS;QACX,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,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,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 { 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 stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\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, stripAnsi(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 process.stdin.resume();\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\nfunction parseReplOptions(argsString: string): { text: string; options: { project?: string; file?: string } } {\n const options: { project?: string; file?: string } = {};\n let text = argsString;\n\n // Match -p/--project option\n const projectRegex = /(?:-p|--project)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n let match;\n while ((match = projectRegex.exec(text))) {\n options.project = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Match -f/--file option\n const fileRegex = /(?:-f|--file)(?:\\s+|=)(?:'([^']+)'|\"([^\"]+)\"|([^\\s]+))/i;\n while ((match = fileRegex.exec(text))) {\n options.file = match[1] || match[2] || match[3];\n text = text.replace(match[0], '').trim();\n }\n\n // Clean up multiple spaces\n text = text.replace(/\\s+/g, ' ').trim();\n\n return { text, options };\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('\\nInteractive Command List & Options:'));\n console.log(` ${pc.bold('/ask <question>')} - Query the knowledge base`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context for the query`);\n console.log(` ${pc.gray('Example:')} /ask -p platform How to deploy?\\n`);\n\n console.log(` ${pc.bold('/save <note>')} - Send a note to the agent`);\n console.log(` ${pc.gray('Options:')}`);\n console.log(` ${pc.yellow('-p, --project <slug>')} Specify project context`);\n console.log(` ${pc.yellow('-f, --file <path>')} Attach a file to the note`);\n console.log(` ${pc.gray('Example:')} /save -p inbox -f ./todo.txt review this file\\n`);\n\n console.log(` ${pc.bold('<any text>')} - Sends text directly to the agent (shortcut for /save)`);\n console.log(` ${pc.gray('Options:')} Supports same -p and -f options as /save`);\n console.log(` ${pc.gray('Example:')} My note text -p platform\\n`);\n\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 rawQuestion = trimmed.substring(5).trim();\n const { text: question, options } = parseReplOptions(rawQuestion);\n await runAsk(question, options);\n continue;\n }\n\n if (trimmed === '/save' || trimmed.startsWith('/save ')) {\n const rawNote = trimmed.startsWith('/save ') ? trimmed.substring(6).trim() : '';\n if (!rawNote) {\n console.log(pc.yellow('Please provide note text (e.g. /save My new note)'));\n continue;\n }\n const { text: note, options } = parseReplOptions(rawNote);\n await runNote(note, options);\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 const { text: noteText, options } = parseReplOptions(trimmed);\n await runNote(noteText, options);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pedroaugusto04/kb-cli",
3
- "version": "1.1.8",
3
+ "version": "1.1.10",
4
4
  "description": "CLI client for the Knowledge Base AI system",
5
5
  "type": "module",
6
6
  "bin": {