@chanl/cli 2.0.4 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/__tests__/agents.test.js +574 -0
  2. package/dist/__tests__/agents.test.js.map +1 -0
  3. package/dist/__tests__/auth.test.d.ts +2 -0
  4. package/dist/__tests__/auth.test.js +87 -0
  5. package/dist/__tests__/auth.test.js.map +1 -0
  6. package/dist/__tests__/calls.test.d.ts +2 -0
  7. package/dist/__tests__/calls.test.js +115 -0
  8. package/dist/__tests__/calls.test.js.map +1 -0
  9. package/dist/__tests__/chat.test.d.ts +2 -0
  10. package/dist/__tests__/chat.test.js +357 -0
  11. package/dist/__tests__/chat.test.js.map +1 -0
  12. package/dist/__tests__/cli-base.test.d.ts +2 -0
  13. package/dist/__tests__/cli-base.test.js +87 -0
  14. package/dist/__tests__/cli-base.test.js.map +1 -0
  15. package/dist/__tests__/cli-missing.test.d.ts +2 -0
  16. package/dist/__tests__/cli-missing.test.js +546 -0
  17. package/dist/__tests__/cli-missing.test.js.map +1 -0
  18. package/dist/__tests__/cli-p0-scenarios.test.d.ts +2 -0
  19. package/dist/__tests__/cli-p0-scenarios.test.js +123 -0
  20. package/dist/__tests__/cli-p0-scenarios.test.js.map +1 -0
  21. package/dist/__tests__/helpers.d.ts +234 -0
  22. package/dist/__tests__/helpers.js +314 -0
  23. package/dist/__tests__/helpers.js.map +1 -0
  24. package/dist/__tests__/mcp.test.d.ts +2 -0
  25. package/dist/__tests__/mcp.test.js +470 -0
  26. package/dist/__tests__/mcp.test.js.map +1 -0
  27. package/dist/__tests__/prompts.test.d.ts +2 -0
  28. package/dist/__tests__/prompts.test.js +227 -0
  29. package/dist/__tests__/prompts.test.js.map +1 -0
  30. package/dist/__tests__/scenarios.test.d.ts +2 -0
  31. package/dist/__tests__/scenarios.test.js +270 -0
  32. package/dist/__tests__/scenarios.test.js.map +1 -0
  33. package/dist/__tests__/tools.test.d.ts +2 -0
  34. package/dist/__tests__/tools.test.js +331 -0
  35. package/dist/__tests__/tools.test.js.map +1 -0
  36. package/dist/__tests__/toolsets.test.d.ts +2 -0
  37. package/dist/__tests__/toolsets.test.js +196 -0
  38. package/dist/__tests__/toolsets.test.js.map +1 -0
  39. package/dist/__tests__/workspaces.test.d.ts +2 -0
  40. package/dist/__tests__/workspaces.test.js +155 -0
  41. package/dist/__tests__/workspaces.test.js.map +1 -0
  42. package/dist/cli.js +8 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/commands/agents.js +194 -6
  45. package/dist/commands/agents.js.map +1 -1
  46. package/dist/commands/chat.js +2 -2
  47. package/dist/commands/chat.js.map +1 -1
  48. package/dist/commands/config.js +24 -2
  49. package/dist/commands/config.js.map +1 -1
  50. package/dist/commands/customers.d.ts +8 -0
  51. package/dist/commands/customers.js +289 -0
  52. package/dist/commands/customers.js.map +1 -0
  53. package/dist/commands/index.d.ts +3 -0
  54. package/dist/commands/index.js +7 -0
  55. package/dist/commands/index.js.map +1 -1
  56. package/dist/commands/memory.js +134 -1
  57. package/dist/commands/memory.js.map +1 -1
  58. package/dist/commands/messaging.d.ts +12 -0
  59. package/dist/commands/messaging.js +208 -0
  60. package/dist/commands/messaging.js.map +1 -0
  61. package/dist/commands/prompts.js +148 -1
  62. package/dist/commands/prompts.js.map +1 -1
  63. package/dist/commands/scenarios.js +121 -0
  64. package/dist/commands/scenarios.js.map +1 -1
  65. package/dist/commands/scorecards.js +3 -3
  66. package/dist/commands/scorecards.js.map +1 -1
  67. package/dist/commands/whatsapp.d.ts +8 -0
  68. package/dist/commands/whatsapp.js +332 -0
  69. package/dist/commands/whatsapp.js.map +1 -0
  70. package/dist/utils/config-store.d.ts +8 -0
  71. package/dist/utils/config-store.js +18 -1
  72. package/dist/utils/config-store.js.map +1 -1
  73. package/dist/utils/sdk-factory.js +15 -3
  74. package/dist/utils/sdk-factory.js.map +1 -1
  75. package/package.json +4 -4
  76. package/dist/__tests__/cli.test.js +0 -2308
  77. package/dist/__tests__/cli.test.js.map +0 -1
  78. /package/dist/__tests__/{cli.test.d.ts → agents.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/config-store.ts"],"sourcesContent":["import Conf from 'conf';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { existsSync, mkdirSync } from 'node:fs';\n\n/**\n * CLI configuration schema\n */\nexport interface ChanlCliConfig {\n apiKey?: string;\n jwtToken?: string;\n refreshToken?: string;\n baseUrl: string;\n workspaceId?: string;\n appUrl?: string;\n defaultFormat: 'table' | 'json';\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: ChanlCliConfig = {\n baseUrl: 'https://platform.chanl.ai',\n defaultFormat: 'table',\n};\n\n/**\n * Get the Chanl config directory path\n * Uses ~/.chanl/ for storing configuration\n */\nexport function getConfigDir(): string {\n return join(homedir(), '.chanl');\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n}\n\n/**\n * Config store using Conf library\n * Stores configuration in ~/.chanl/config.json\n */\nclass ConfigStore {\n private store: Conf<ChanlCliConfig>;\n\n constructor() {\n ensureConfigDir();\n this.store = new Conf<ChanlCliConfig>({\n projectName: 'chanl',\n cwd: getConfigDir(),\n configName: 'config',\n defaults: DEFAULT_CONFIG,\n schema: {\n apiKey: { type: 'string' },\n jwtToken: { type: 'string' },\n refreshToken: { type: 'string' },\n baseUrl: { type: 'string', default: DEFAULT_CONFIG.baseUrl },\n workspaceId: { type: 'string' },\n appUrl: { type: 'string' },\n defaultFormat: {\n type: 'string',\n enum: ['table', 'json'],\n default: 'table',\n },\n },\n });\n }\n\n /**\n * Get a configuration value\n * Supports dot notation for nested values\n */\n get<K extends keyof ChanlCliConfig>(key: K): ChanlCliConfig[K] {\n return this.store.get(key);\n }\n\n /**\n * Set a configuration value\n */\n set<K extends keyof ChanlCliConfig>(key: K, value: ChanlCliConfig[K]): void {\n this.store.set(key, value);\n }\n\n /**\n * Delete a configuration value\n */\n delete(key: keyof ChanlCliConfig): void {\n this.store.delete(key);\n }\n\n /**\n * Get all configuration values\n */\n getAll(): ChanlCliConfig {\n return this.store.store;\n }\n\n /**\n * Check if a key exists in the configuration\n */\n has(key: keyof ChanlCliConfig): boolean {\n return this.store.has(key);\n }\n\n /**\n * Clear all configuration\n */\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Get the path to the config file\n */\n getPath(): string {\n return this.store.path;\n }\n\n /**\n * Get API key with environment variable fallback\n * Priority: CHANL_API_KEY env var > config file\n */\n getApiKey(): string | undefined {\n return process.env['CHANL_API_KEY'] || this.get('apiKey');\n }\n\n /**\n * Get JWT token from config\n */\n getJwtToken(): string | undefined {\n return this.get('jwtToken');\n }\n\n /**\n * Get refresh token from config\n */\n getRefreshToken(): string | undefined {\n return this.get('refreshToken');\n }\n\n /**\n * Get base URL with environment variable fallback\n * Priority: CHANL_BASE_URL env var > config file > default\n */\n getBaseUrl(): string {\n return process.env['CHANL_BASE_URL'] || this.get('baseUrl');\n }\n\n /**\n * Get the app URL for browser-based flows (e.g., CLI auth)\n * Priority: CHANL_APP_URL env var > config file > derived from baseUrl\n */\n getAppUrl(): string {\n if (process.env['CHANL_APP_URL']) return process.env['CHANL_APP_URL'];\n const stored = this.get('appUrl');\n if (stored) return stored;\n\n // Derive from baseUrl — localhost auto-maps to local frontend\n const baseUrl = this.getBaseUrl();\n if (baseUrl.includes('localhost')) return 'http://localhost:3001';\n return 'https://app.chanl.ai';\n }\n\n /**\n * Get workspace ID with environment variable fallback\n * Priority: CHANL_WORKSPACE_ID env var > config file\n */\n getWorkspaceId(): string | undefined {\n return process.env['CHANL_WORKSPACE_ID'] || this.get('workspaceId');\n }\n\n /**\n * Check if user is authenticated (has API key or JWT token)\n */\n isAuthenticated(): boolean {\n return !!(this.getApiKey() || this.getJwtToken());\n }\n\n /**\n * Get the auth method in use\n */\n getAuthMethod(): 'api-key' | 'jwt' | null {\n if (this.getApiKey()) return 'api-key';\n if (this.getJwtToken()) return 'jwt';\n return null;\n }\n\n /**\n * Set API key in config\n */\n setApiKey(apiKey: string): void {\n this.set('apiKey', apiKey);\n }\n\n /**\n * Set JWT tokens in config (from browser login)\n */\n setJwtAuth(jwtToken: string, refreshToken: string): void {\n this.set('jwtToken', jwtToken);\n this.set('refreshToken', refreshToken);\n // Clear API key if switching to JWT auth\n this.delete('apiKey');\n }\n\n /**\n * Remove all auth credentials from config (logout)\n */\n clearAuth(): void {\n this.delete('apiKey');\n this.delete('jwtToken');\n this.delete('refreshToken');\n }\n\n /**\n * Remove API key from config (logout)\n */\n removeApiKey(): void {\n this.delete('apiKey');\n }\n\n /**\n * Set workspace ID in config\n */\n setWorkspaceId(workspaceId: string): void {\n this.set('workspaceId', workspaceId);\n }\n\n /**\n * Set base URL in config\n */\n setBaseUrl(baseUrl: string): void {\n this.set('baseUrl', baseUrl);\n }\n}\n\n// Export singleton instance\nexport const configStore = new ConfigStore();\n\n// Export class for testing purposes\nexport { ConfigStore };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/config-store.ts"],"sourcesContent":["import Conf from 'conf';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { existsSync, mkdirSync } from 'node:fs';\n\n/**\n * CLI configuration schema\n */\nexport interface ChanlCliConfig {\n apiKey?: string;\n jwtToken?: string;\n refreshToken?: string;\n baseUrl: string;\n /** Alias for baseUrl (e.g. local eval server URL). */\n server?: string;\n /** `local` rewrites `/api/v1` paths for OSS-style servers. */\n deployment?: 'local' | 'cloud';\n /** Override API prefix; use empty string for flat `/scenarios` routes. */\n apiPrefix?: string;\n workspaceId?: string;\n appUrl?: string;\n defaultFormat: 'table' | 'json';\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: ChanlCliConfig = {\n baseUrl: 'https://platform.chanl.ai',\n defaultFormat: 'table',\n};\n\n/**\n * Get the Chanl config directory path\n * Uses ~/.chanl/ for storing configuration\n */\nexport function getConfigDir(): string {\n return join(homedir(), '.chanl');\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n}\n\n/**\n * Config store using Conf library\n * Stores configuration in ~/.chanl/config.json\n */\nclass ConfigStore {\n private store: Conf<ChanlCliConfig>;\n\n constructor() {\n ensureConfigDir();\n this.store = new Conf<ChanlCliConfig>({\n projectName: 'chanl',\n cwd: getConfigDir(),\n configName: 'config',\n defaults: DEFAULT_CONFIG,\n schema: {\n apiKey: { type: 'string' },\n jwtToken: { type: 'string' },\n refreshToken: { type: 'string' },\n baseUrl: { type: 'string', default: DEFAULT_CONFIG.baseUrl },\n server: { type: 'string' },\n deployment: { type: 'string' },\n apiPrefix: { type: 'string' },\n workspaceId: { type: 'string' },\n appUrl: { type: 'string' },\n defaultFormat: {\n type: 'string',\n enum: ['table', 'json'],\n default: 'table',\n },\n },\n });\n }\n\n /**\n * Get a configuration value\n * Supports dot notation for nested values\n */\n get<K extends keyof ChanlCliConfig>(key: K): ChanlCliConfig[K] {\n return this.store.get(key);\n }\n\n /**\n * Set a configuration value\n */\n set<K extends keyof ChanlCliConfig>(key: K, value: ChanlCliConfig[K]): void {\n this.store.set(key, value);\n }\n\n /**\n * Delete a configuration value\n */\n delete(key: keyof ChanlCliConfig): void {\n this.store.delete(key);\n }\n\n /**\n * Get all configuration values\n */\n getAll(): ChanlCliConfig {\n return this.store.store;\n }\n\n /**\n * Check if a key exists in the configuration\n */\n has(key: keyof ChanlCliConfig): boolean {\n return this.store.has(key);\n }\n\n /**\n * Clear all configuration\n */\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Get the path to the config file\n */\n getPath(): string {\n return this.store.path;\n }\n\n /**\n * Get API key with environment variable fallback\n * Priority: CHANL_API_KEY env var > config file\n */\n getApiKey(): string | undefined {\n return process.env['CHANL_API_KEY'] || this.get('apiKey');\n }\n\n /**\n * Get JWT token from config\n */\n getJwtToken(): string | undefined {\n return this.get('jwtToken');\n }\n\n /**\n * Get refresh token from config\n */\n getRefreshToken(): string | undefined {\n return this.get('refreshToken');\n }\n\n /**\n * Get base URL with environment variable fallback\n * Priority: CHANL_BASE_URL env var > config file > default\n */\n getBaseUrl(): string {\n return (\n process.env['CHANL_BASE_URL'] ||\n this.get('server') ||\n this.get('baseUrl')\n );\n }\n\n getDeployment(): 'local' | 'cloud' | undefined {\n const d = process.env['CHANL_DEPLOYMENT'] || this.get('deployment');\n if (d === 'local' || d === 'cloud') return d;\n const base = this.getBaseUrl();\n if (\n base.includes('localhost:18005') ||\n base.includes('127.0.0.1:18005')\n ) {\n return 'local';\n }\n return undefined;\n }\n\n getApiPrefix(): string | undefined {\n const fromEnv = process.env['CHANL_API_PREFIX'];\n if (fromEnv !== undefined) return fromEnv;\n return this.get('apiPrefix') as string | undefined;\n }\n\n /**\n * Get the app URL for browser-based flows (e.g., CLI auth)\n * Priority: CHANL_APP_URL env var > config file > derived from baseUrl\n */\n getAppUrl(): string {\n if (process.env['CHANL_APP_URL']) return process.env['CHANL_APP_URL'];\n const stored = this.get('appUrl');\n if (stored) return stored;\n\n // Derive from baseUrl — localhost auto-maps to local frontend\n const baseUrl = this.getBaseUrl();\n if (baseUrl.includes('localhost')) return 'http://localhost:3001';\n return 'https://app.chanl.ai';\n }\n\n /**\n * Get workspace ID with environment variable fallback\n * Priority: CHANL_WORKSPACE_ID env var > config file\n */\n getWorkspaceId(): string | undefined {\n return process.env['CHANL_WORKSPACE_ID'] || this.get('workspaceId');\n }\n\n /**\n * Check if user is authenticated (has API key or JWT token)\n */\n isAuthenticated(): boolean {\n return !!(this.getApiKey() || this.getJwtToken());\n }\n\n /**\n * Get the auth method in use\n */\n getAuthMethod(): 'api-key' | 'jwt' | null {\n if (this.getApiKey()) return 'api-key';\n if (this.getJwtToken()) return 'jwt';\n return null;\n }\n\n /**\n * Set API key in config\n */\n setApiKey(apiKey: string): void {\n this.set('apiKey', apiKey);\n }\n\n /**\n * Set JWT tokens in config (from browser login)\n */\n setJwtAuth(jwtToken: string, refreshToken: string): void {\n this.set('jwtToken', jwtToken);\n this.set('refreshToken', refreshToken);\n // Clear API key if switching to JWT auth\n this.delete('apiKey');\n }\n\n /**\n * Remove all auth credentials from config (logout)\n */\n clearAuth(): void {\n this.delete('apiKey');\n this.delete('jwtToken');\n this.delete('refreshToken');\n }\n\n /**\n * Remove API key from config (logout)\n */\n removeApiKey(): void {\n this.delete('apiKey');\n }\n\n /**\n * Set workspace ID in config\n */\n setWorkspaceId(workspaceId: string): void {\n this.set('workspaceId', workspaceId);\n }\n\n /**\n * Set base URL in config\n */\n setBaseUrl(baseUrl: string): void {\n this.set('baseUrl', baseUrl);\n }\n}\n\n// Export singleton instance\nexport const configStore = new ConfigStore();\n\n// Export class for testing purposes\nexport { ConfigStore };\n"],"mappings":"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","names":[]}
@@ -10,13 +10,25 @@ function createSdk() {
10
10
  process.exitCode = 1;
11
11
  return null;
12
12
  }
13
+ const deployment = configStore.getDeployment();
14
+ const apiPrefix = configStore.getApiPrefix();
13
15
  if (apiKey) {
14
16
  if (apiKey.startsWith("eyJ")) {
15
- return new ChanlSDK({ jwtToken: apiKey, baseUrl });
17
+ return new ChanlSDK({
18
+ jwtToken: apiKey,
19
+ baseUrl,
20
+ deployment,
21
+ apiPrefix
22
+ });
16
23
  }
17
- return new ChanlSDK({ apiKey, baseUrl });
24
+ return new ChanlSDK({ apiKey, baseUrl, deployment, apiPrefix });
18
25
  }
19
- return new ChanlSDK({ jwtToken, baseUrl });
26
+ return new ChanlSDK({
27
+ jwtToken,
28
+ baseUrl,
29
+ deployment,
30
+ apiPrefix
31
+ });
20
32
  }
21
33
  function getWorkspaceId() {
22
34
  const workspaceId = configStore.getWorkspaceId();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/sdk-factory.ts"],"sourcesContent":["import { ChanlSDK } from '@chanl/sdk';\nimport { configStore } from './config-store.js';\nimport { printError } from './output.js';\n\n/**\n * Create an authenticated SDK instance from stored config.\n * Supports both API key and JWT token auth.\n * Returns null with error message if not authenticated.\n */\nexport function createSdk(): ChanlSDK | null {\n const apiKey = configStore.getApiKey();\n const jwtToken = configStore.getJwtToken();\n const baseUrl = configStore.getBaseUrl();\n\n if (!apiKey && !jwtToken) {\n printError('Not authenticated', \"Run 'chanl login' to authenticate\");\n process.exitCode = 1;\n return null;\n }\n\n if (apiKey) {\n // API key might be a JWT (legacy compat)\n if (apiKey.startsWith('eyJ')) {\n return new ChanlSDK({ jwtToken: apiKey, baseUrl });\n }\n return new ChanlSDK({ apiKey, baseUrl });\n }\n\n return new ChanlSDK({ jwtToken: jwtToken!, baseUrl });\n}\n\n/**\n * Get workspace ID from config, with error message if not set.\n * Returns null with error message if no workspace selected.\n */\nexport function getWorkspaceId(): string | null {\n const workspaceId = configStore.getWorkspaceId();\n\n if (!workspaceId) {\n printError('No workspace selected', \"Run 'chanl config set workspaceId <id>' to select a workspace\");\n process.exitCode = 1;\n return null;\n }\n\n return workspaceId;\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAOpB,SAAS,YAA6B;AAC3C,QAAM,SAAS,YAAY,UAAU;AACrC,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,UAAU,YAAY,WAAW;AAEvC,MAAI,CAAC,UAAU,CAAC,UAAU;AACxB,eAAW,qBAAqB,mCAAmC;AACnE,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AAEV,QAAI,OAAO,WAAW,KAAK,GAAG;AAC5B,aAAO,IAAI,SAAS,EAAE,UAAU,QAAQ,QAAQ,CAAC;AAAA,IACnD;AACA,WAAO,IAAI,SAAS,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACzC;AAEA,SAAO,IAAI,SAAS,EAAE,UAAqB,QAAQ,CAAC;AACtD;AAMO,SAAS,iBAAgC;AAC9C,QAAM,cAAc,YAAY,eAAe;AAE/C,MAAI,CAAC,aAAa;AAChB,eAAW,yBAAyB,+DAA+D;AACnG,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/sdk-factory.ts"],"sourcesContent":["import { ChanlSDK } from '@chanl/sdk';\nimport { configStore } from './config-store.js';\nimport { printError } from './output.js';\n\n/**\n * Create an authenticated SDK instance from stored config.\n * Supports both API key and JWT token auth.\n * Returns null with error message if not authenticated.\n */\nexport function createSdk(): ChanlSDK | null {\n const apiKey = configStore.getApiKey();\n const jwtToken = configStore.getJwtToken();\n const baseUrl = configStore.getBaseUrl();\n\n if (!apiKey && !jwtToken) {\n printError('Not authenticated', \"Run 'chanl login' to authenticate\");\n process.exitCode = 1;\n return null;\n }\n\n const deployment = configStore.getDeployment();\n const apiPrefix = configStore.getApiPrefix();\n\n if (apiKey) {\n // API key might be a JWT (legacy compat)\n if (apiKey.startsWith('eyJ')) {\n return new ChanlSDK({\n jwtToken: apiKey,\n baseUrl,\n deployment,\n apiPrefix,\n });\n }\n return new ChanlSDK({ apiKey, baseUrl, deployment, apiPrefix });\n }\n\n return new ChanlSDK({\n jwtToken: jwtToken!,\n baseUrl,\n deployment,\n apiPrefix,\n });\n}\n\n/**\n * Get workspace ID from config, with error message if not set.\n * Returns null with error message if no workspace selected.\n */\nexport function getWorkspaceId(): string | null {\n const workspaceId = configStore.getWorkspaceId();\n\n if (!workspaceId) {\n printError('No workspace selected', \"Run 'chanl config set workspaceId <id>' to select a workspace\");\n process.exitCode = 1;\n return null;\n }\n\n return workspaceId;\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAOpB,SAAS,YAA6B;AAC3C,QAAM,SAAS,YAAY,UAAU;AACrC,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,UAAU,YAAY,WAAW;AAEvC,MAAI,CAAC,UAAU,CAAC,UAAU;AACxB,eAAW,qBAAqB,mCAAmC;AACnE,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,YAAY,cAAc;AAC7C,QAAM,YAAY,YAAY,aAAa;AAE3C,MAAI,QAAQ;AAEV,QAAI,OAAO,WAAW,KAAK,GAAG;AAC5B,aAAO,IAAI,SAAS;AAAA,QAClB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,IAAI,SAAS,EAAE,QAAQ,SAAS,YAAY,UAAU,CAAC;AAAA,EAChE;AAEA,SAAO,IAAI,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAMO,SAAS,iBAAgC;AAC9C,QAAM,cAAc,YAAY,eAAe;AAE/C,MAAI,CAAC,aAAa;AAChB,eAAW,yBAAyB,+DAA+D;AACnG,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chanl/cli",
3
- "version": "2.0.4",
4
- "description": "Command-line interface for Chanl Analytics",
3
+ "version": "3.1.0",
4
+ "description": "Command-line interface for the Chanl AI platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "bin": {
@@ -21,11 +21,11 @@
21
21
  "keywords": [
22
22
  "chanl",
23
23
  "cli",
24
- "analytics",
24
+ "ai-agents",
25
25
  "api",
26
26
  "command-line"
27
27
  ],
28
- "author": "Chanl Analytics",
28
+ "author": "Chanl AI",
29
29
  "license": "MIT",
30
30
  "dependencies": {
31
31
  "@chanl/sdk": "*",