@pedroaugusto04/kb-cli 1.1.17 → 1.1.18

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
@@ -54,21 +54,23 @@ export class ApiClient {
54
54
  // If unauthorized, attempt token refresh if we have a refresh token
55
55
  if (response.status === 401 && !path.includes('auth/login') && !path.includes('auth/refresh')) {
56
56
  const config = loadConfig();
57
- if (config.cookies.kb_refresh_token) {
57
+ let refreshed = false;
58
+ if (config.cookies?.kb_refresh_token) {
58
59
  try {
59
60
  const refreshResponse = await this.request('/api/auth/refresh', { method: 'POST' });
60
61
  if (refreshResponse.ok) {
61
62
  // Token was refreshed (cookies saved automatically), retry original request
62
63
  response = await this.request(path, options);
63
- }
64
- else {
65
- clearConfigAuth();
64
+ refreshed = true;
66
65
  }
67
66
  }
68
67
  catch {
69
- clearConfigAuth();
68
+ // Ignore
70
69
  }
71
70
  }
71
+ if (!refreshed) {
72
+ clearConfigAuth();
73
+ }
72
74
  }
73
75
  if (!response.ok) {
74
76
  let body;
@@ -1 +1 @@
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 async createNote(body: any): Promise<any> {\n return this.fetch('/api/notes', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n\n async updateNote(id: string, body: any): Promise<any> {\n return this.fetch(`/api/notes/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n}\n\nexport const client = new ApiClient();\n\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 let refreshed = false;\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 refreshed = true;\n }\n } catch {\n // Ignore\n }\n }\n if (!refreshed) {\n clearConfigAuth();\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 async createNote(body: any): Promise<any> {\n return this.fetch('/api/notes', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n\n async updateNote(id: string, body: any): Promise<any> {\n return this.fetch(`/api/notes/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n }\n}\n\nexport const client = new ApiClient();\n\n"]}
@@ -26,14 +26,13 @@ export async function runInit() {
26
26
  console.log('\n' + pc.cyan('Google OAuth Instructions:'));
27
27
  console.log(`1. Open the following URL in your browser to log in:`);
28
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`);
29
+ console.log(`2. Once logged in, go to your Profile page and click "Reveal Connection Token".`);
30
+ console.log(`3. Copy the token and paste it below:\n`);
32
31
  const token = await password({
33
- message: 'Paste the kb_access_token cookie value:',
32
+ message: 'Paste your Connection Token:',
34
33
  validate: (value) => {
35
34
  if (!value || !value.trim())
36
- return 'Access token value is required';
35
+ return 'Connection Token is required';
37
36
  return;
38
37
  },
39
38
  });
@@ -41,11 +40,28 @@ export async function runInit() {
41
40
  outro(pc.red('Setup cancelled.'));
42
41
  return;
43
42
  }
44
- s.start('Validating Google access token...');
43
+ s.start('Validating Google Connection Token...');
44
+ const trimmed = token.trim();
45
+ let accessToken = trimmed;
46
+ let refreshToken = undefined;
47
+ if (trimmed.startsWith('kbc_')) {
48
+ try {
49
+ const payload = Buffer.from(trimmed.slice(4), 'base64').toString('utf8');
50
+ const parsed = JSON.parse(payload);
51
+ if (parsed.accessToken && parsed.refreshToken) {
52
+ accessToken = parsed.accessToken;
53
+ refreshToken = parsed.refreshToken;
54
+ }
55
+ }
56
+ catch {
57
+ // Fallback to raw token
58
+ }
59
+ }
45
60
  saveConfig({
46
61
  apiUrl,
47
62
  cookies: {
48
- kb_access_token: token.trim(),
63
+ kb_access_token: accessToken,
64
+ kb_refresh_token: refreshToken,
49
65
  },
50
66
  });
51
67
  }
@@ -1 +1 @@
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}/auth/google/start?returnTo=/knowledge-base/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"]}
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}/auth/google/start?returnTo=/knowledge-base/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, go to your Profile page and click \"Reveal Connection Token\".`);\n console.log(`3. Copy the token and paste it below:\\n`);\n\n const token = await password({\n message: 'Paste your Connection Token:',\n validate: (value) => {\n if (!value || !value.trim()) return 'Connection Token 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 Connection Token...');\n const trimmed = token.trim();\n let accessToken = trimmed;\n let refreshToken: string | undefined = undefined;\n\n if (trimmed.startsWith('kbc_')) {\n try {\n const payload = Buffer.from(trimmed.slice(4), 'base64').toString('utf8');\n const parsed = JSON.parse(payload);\n if (parsed.accessToken && parsed.refreshToken) {\n accessToken = parsed.accessToken;\n refreshToken = parsed.refreshToken;\n }\n } catch {\n // Fallback to raw token\n }\n }\n\n saveConfig({\n apiUrl,\n cookies: {\n kb_access_token: accessToken,\n kb_refresh_token: refreshToken,\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"]}
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pedroaugusto04/kb-cli",
3
- "version": "1.1.17",
3
+ "version": "1.1.18",
4
4
  "description": "CLI client for the Knowledge Base AI system",
5
5
  "type": "module",
6
6
  "bin": {