@edgible-team/cli 1.2.2 → 1.2.6

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 (64) hide show
  1. package/LICENSE +2 -0
  2. package/dist/client/api-client.d.ts +51 -0
  3. package/dist/client/api-client.d.ts.map +1 -1
  4. package/dist/client/api-client.js +65 -0
  5. package/dist/commands/agent/agent-handlers.d.ts +45 -0
  6. package/dist/commands/agent/agent-handlers.d.ts.map +1 -0
  7. package/dist/commands/agent/agent-handlers.js +1159 -0
  8. package/dist/commands/agent.d.ts.map +1 -1
  9. package/dist/commands/agent.js +13 -1137
  10. package/dist/commands/ai.d.ts.map +1 -1
  11. package/dist/commands/ai.js +66 -61
  12. package/dist/commands/application.d.ts.map +1 -1
  13. package/dist/commands/application.js +713 -94
  14. package/dist/config/app-config.d.ts +1 -1
  15. package/dist/config/app-config.js +2 -2
  16. package/dist/generated/compose-constants.d.ts +14 -0
  17. package/dist/generated/compose-constants.d.ts.map +1 -0
  18. package/dist/generated/compose-constants.js +22 -0
  19. package/dist/services/LocalAgentManager.d.ts.map +1 -1
  20. package/dist/services/LocalAgentManager.js +4 -2
  21. package/dist/services/application/ApplicationService.d.ts +41 -0
  22. package/dist/services/application/ApplicationService.d.ts.map +1 -1
  23. package/dist/services/application/ApplicationService.js +107 -0
  24. package/dist/services/auth/AuthService.js +8 -7
  25. package/dist/services/daemon/DaemonManagerFactory.d.ts +2 -0
  26. package/dist/services/daemon/DaemonManagerFactory.d.ts.map +1 -1
  27. package/dist/services/daemon/DaemonManagerFactory.js +14 -6
  28. package/dist/services/edgible.js +7 -7
  29. package/dist/types/AgentConfig.d.ts +13 -0
  30. package/dist/types/AgentConfig.d.ts.map +1 -1
  31. package/dist/types/ApiRequests.d.ts +8 -0
  32. package/dist/types/ApiRequests.d.ts.map +1 -1
  33. package/dist/types/Application.d.ts +6 -0
  34. package/dist/types/Application.d.ts.map +1 -1
  35. package/dist/types/CaddyJson.d.ts +43 -1
  36. package/dist/types/CaddyJson.d.ts.map +1 -1
  37. package/dist/types/models/ApplicationApiKey.d.ts +63 -0
  38. package/dist/types/models/ApplicationApiKey.d.ts.map +1 -0
  39. package/dist/types/models/ApplicationApiKey.js +5 -0
  40. package/dist/types/models/ApplicationAuthExchangeToken.d.ts +69 -0
  41. package/dist/types/models/ApplicationAuthExchangeToken.d.ts.map +1 -0
  42. package/dist/types/models/ApplicationAuthExchangeToken.js +5 -0
  43. package/dist/types/models/ApplicationAuthSession.d.ts +68 -0
  44. package/dist/types/models/ApplicationAuthSession.d.ts.map +1 -0
  45. package/dist/types/models/ApplicationAuthSession.js +5 -0
  46. package/dist/types/models/ApplicationData.d.ts +33 -0
  47. package/dist/types/models/ApplicationData.d.ts.map +1 -1
  48. package/dist/types/models/ApplicationShortCode.d.ts +79 -0
  49. package/dist/types/models/ApplicationShortCode.d.ts.map +1 -0
  50. package/dist/types/models/ApplicationShortCode.js +5 -0
  51. package/dist/types/route.d.ts +4 -0
  52. package/dist/types/route.d.ts.map +1 -1
  53. package/dist/types/validation/schemas.d.ts +21 -0
  54. package/dist/types/validation/schemas.d.ts.map +1 -1
  55. package/dist/types/validation/schemas.js +14 -1
  56. package/dist/utils/PlatformDetector.d.ts +2 -0
  57. package/dist/utils/PlatformDetector.d.ts.map +1 -1
  58. package/dist/utils/PlatformDetector.js +5 -34
  59. package/package.json +2 -2
  60. package/recipes/compose/open-webui/docker-compose.yml +26 -1
  61. package/dist/detection/tools.d.ts +0 -16
  62. package/dist/detection/tools.d.ts.map +0 -1
  63. package/dist/detection/tools.js +0 -305
  64. package/recipes/compose/open-webui/.env +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAioBtD"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAioBtD"}
@@ -50,6 +50,8 @@ const types_1 = require("../di/types");
50
50
  const SystemCapabilityDetector_1 = require("../detection/SystemCapabilityDetector");
51
51
  const DaemonManagerFactory_1 = require("../services/daemon/DaemonManagerFactory");
52
52
  const config_validator_1 = require("./utils/config-validator");
53
+ const compose_constants_1 = require("../generated/compose-constants");
54
+ const sudo_checker_1 = require("../utils/sudo-checker");
53
55
  function setupAiCommands(program) {
54
56
  const aiCommand = program
55
57
  .command('ai')
@@ -69,6 +71,10 @@ function setupAiCommands(program) {
69
71
  .option('--webui-deployment <type>', 'WebUI deployment: local or remote')
70
72
  .option('--no-interactive', 'Run in non-interactive mode')
71
73
  .action((0, command_wrapper_1.wrapCommand)(async (options) => {
74
+ if (!(0, sudo_checker_1.checkSudoPermissions)()) {
75
+ console.log(chalk_1.default.redBright("Please run this command with administrator priviledges (i.e. sudo)"));
76
+ return;
77
+ }
72
78
  const container = (0, container_1.getContainer)();
73
79
  const logger = container.get(types_1.TYPES.Logger);
74
80
  logger.info('Setting up Ollama AI service', { model: options.model, autoInstall: options.autoInstall });
@@ -293,7 +299,6 @@ function setupAiCommands(program) {
293
299
  .description('Stop AI services and optionally remove platform applications')
294
300
  .option('--stop-ollama', 'Also stop the Ollama service')
295
301
  .option('--remove-volumes', 'Remove data volumes (deletes all data)')
296
- .option('--remove-apps', 'Remove platform applications (Ollama API, Open WebUI)')
297
302
  .action((0, command_wrapper_1.wrapCommand)(async (options) => {
298
303
  const container = (0, container_1.getContainer)();
299
304
  const logger = container.get(types_1.TYPES.Logger);
@@ -324,42 +329,40 @@ function setupAiCommands(program) {
324
329
  }
325
330
  }
326
331
  // Optionally remove platform applications
327
- if (options.removeApps) {
328
- console.log(chalk_1.default.yellow('\nRemoving platform applications...\n'));
329
- try {
330
- (0, config_validator_1.validateConfig)(configRepository, {
331
- requireAuth: true,
332
- requireOrganization: true,
333
- });
334
- const applicationService = container.get(types_1.TYPES.ApplicationService);
335
- const applications = await applicationService.getApplications();
336
- // Find AI-related applications
337
- const ollamaApp = applications.find(app => app.name === 'ollama-api');
338
- const webUIApp = applications.find(app => app.name === 'open-webui');
339
- if (ollamaApp) {
340
- console.log(chalk_1.default.yellow(` Removing ollama-api (${ollamaApp.id})...`));
341
- await applicationService.deleteApplication(ollamaApp.id);
342
- console.log(chalk_1.default.green(' ✓ Removed ollama-api'));
343
- }
344
- if (webUIApp) {
345
- console.log(chalk_1.default.yellow(` Removing open-webui (${webUIApp.id})...`));
346
- await applicationService.deleteApplication(webUIApp.id);
347
- console.log(chalk_1.default.green(' ✓ Removed open-webui'));
348
- }
349
- if (!ollamaApp && !webUIApp) {
350
- console.log(chalk_1.default.gray(' No AI applications found\n'));
351
- }
352
- else {
353
- console.log(chalk_1.default.green('\n✓ Platform applications removed\n'));
354
- }
332
+ console.log(chalk_1.default.yellow('\nRemoving platform applications...\n'));
333
+ try {
334
+ (0, config_validator_1.validateConfig)(configRepository, {
335
+ requireAuth: true,
336
+ requireOrganization: true,
337
+ });
338
+ const applicationService = container.get(types_1.TYPES.ApplicationService);
339
+ const applications = await applicationService.getApplications();
340
+ // Find AI-related applications
341
+ const ollamaApp = applications.find(app => app.name === 'ollama-api');
342
+ const webUIApp = applications.find(app => app.name === 'open-webui');
343
+ if (ollamaApp) {
344
+ console.log(chalk_1.default.yellow(` Removing ollama-api (${ollamaApp.id})...`));
345
+ await applicationService.deleteApplication(ollamaApp.id);
346
+ console.log(chalk_1.default.green(' ✓ Removed ollama-api'));
355
347
  }
356
- catch (error) {
357
- if (error instanceof Error && error.message.includes('auth')) {
358
- console.log(chalk_1.default.yellow(' ⚠ Not logged in - skipping platform application removal\n'));
359
- }
360
- else {
361
- console.log(chalk_1.default.red(` ✗ Error removing applications: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
362
- }
348
+ if (webUIApp) {
349
+ console.log(chalk_1.default.yellow(` Removing open-webui (${webUIApp.id})...`));
350
+ await applicationService.deleteApplication(webUIApp.id);
351
+ console.log(chalk_1.default.green(' ✓ Removed open-webui'));
352
+ }
353
+ if (!ollamaApp && !webUIApp) {
354
+ console.log(chalk_1.default.gray(' No AI applications found\n'));
355
+ }
356
+ else {
357
+ console.log(chalk_1.default.green('\n✓ Platform applications removed\n'));
358
+ }
359
+ }
360
+ catch (error) {
361
+ if (error instanceof Error && error.message.includes('auth')) {
362
+ console.log(chalk_1.default.yellow(' ⚠ Not logged in - skipping platform application removal\n'));
363
+ }
364
+ else {
365
+ console.log(chalk_1.default.red(` ✗ Error removing applications: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
363
366
  }
364
367
  }
365
368
  console.log(chalk_1.default.green('✅ Teardown complete!\n'));
@@ -389,15 +392,15 @@ function setupAiCommands(program) {
389
392
  console.log(chalk_1.default.green(' ✓ Running'));
390
393
  // Check what address it's listening on
391
394
  try {
392
- const output = (0, child_process_1.execSync)('ss -tlnp 2>/dev/null | grep 11434 || netstat -tlnp 2>/dev/null | grep 11434', {
395
+ const output = (0, child_process_1.execSync)('ss -tlnp 2>/dev/null | grep 11435 || netstat -tlnp 2>/dev/null | grep 11435', {
393
396
  encoding: 'utf8',
394
397
  timeout: 2000
395
398
  });
396
- if (output.includes('0.0.0.0:11434') || output.includes('*:11434')) {
397
- console.log(chalk_1.default.gray(' Listening on: 0.0.0.0:11434 (accessible from network)'));
399
+ if (output.includes('0.0.0.0:11435') || output.includes('*:11435')) {
400
+ console.log(chalk_1.default.gray(' Listening on: 0.0.0.0:11435 (accessible from network)'));
398
401
  }
399
- else if (output.includes('127.0.0.1:11434')) {
400
- console.log(chalk_1.default.yellow(' Listening on: 127.0.0.1:11434 (localhost only)'));
402
+ else if (output.includes('127.0.0.1:11435')) {
403
+ console.log(chalk_1.default.yellow(' Listening on: 127.0.0.1:11435 (localhost only)'));
401
404
  }
402
405
  }
403
406
  catch {
@@ -887,7 +890,7 @@ async function setupPlatformIntegration(options) {
887
890
  // Step 7: Create Ollama API Application
888
891
  console.log(chalk_1.default.blue('Step 7: Creating Ollama API application...\n'));
889
892
  console.log(chalk_1.default.gray(` Device: ${deviceName} (${deviceId.substring(0, 8)}...)\n`));
890
- console.log(chalk_1.default.gray(` Gateway: Managed Gateway\n`));
893
+ console.log(chalk_1.default.gray(` Gateway: None (local/internal access only)\n`));
891
894
  console.log(chalk_1.default.gray(` Protocol: HTTPS\n`));
892
895
  const ollamaResult = await createOllamaApplication({
893
896
  modelName: ollamaModelName,
@@ -1001,19 +1004,18 @@ function displaySetupSummary(options) {
1001
1004
  console.log(chalk_1.default.blue('\n🎉 AI Setup Complete!\n'));
1002
1005
  console.log(chalk_1.default.white('📋 Summary:\n'));
1003
1006
  console.log(chalk_1.default.gray(` Model: ${ollamaModelName}`));
1004
- console.log(chalk_1.default.gray(` Ollama API: ${ollamaUrl}`));
1007
+ console.log(chalk_1.default.gray(` Ollama API: ${ollamaUrl} (local/internal only)`));
1005
1008
  if (webUIUrl) {
1006
- console.log(chalk_1.default.gray(` Open WebUI: ${webUIUrl}`));
1009
+ console.log(chalk_1.default.gray(` Open WebUI: ${webUIUrl} (public via managed gateway)`));
1007
1010
  }
1008
1011
  console.log(chalk_1.default.gray(` Device: ${deviceName} (${deviceId.substring(0, 8)}...)`));
1009
- console.log(chalk_1.default.gray(` Gateway: Managed Gateway`));
1010
1012
  if (createdOllamaApp || createdWebUIApp) {
1011
1013
  console.log(chalk_1.default.white('\n📱 Created Applications:\n'));
1012
1014
  if (createdOllamaApp) {
1013
- console.log(chalk_1.default.gray(` • ollama-api (${createdOllamaApp.id})`));
1015
+ console.log(chalk_1.default.gray(` • ollama-api (${createdOllamaApp.id}) - No gateway (local only)`));
1014
1016
  }
1015
1017
  if (createdWebUIApp) {
1016
- console.log(chalk_1.default.gray(` • open-webui (${createdWebUIApp.id})`));
1018
+ console.log(chalk_1.default.gray(` • open-webui (${createdWebUIApp.id}) - Managed gateway (public)`));
1017
1019
  }
1018
1020
  }
1019
1021
  console.log(chalk_1.default.white('\n🔧 Next Steps:\n'));
@@ -1866,8 +1868,8 @@ function parseGatewayIds(ids) {
1866
1868
  async function createOllamaApplication(config) {
1867
1869
  // Device ID is already provided from config (same device as agent)
1868
1870
  const ollamaDeviceId = config.deviceId;
1869
- // Always use managed gateway
1870
- const useManagedGateway = true;
1871
+ // No gateway - local/internal access only
1872
+ const useManagedGateway = false;
1871
1873
  // Build configuration for managed-process
1872
1874
  // Ollama should be installed and available in PATH on the device
1873
1875
  const configuration = {
@@ -1876,17 +1878,18 @@ async function createOllamaApplication(config) {
1876
1878
  OLLAMA_HOST: '0.0.0.0:11435',
1877
1879
  },
1878
1880
  };
1879
- // Create application as managed-process
1881
+ // Create application as managed-process without authentication
1880
1882
  const result = await config.applicationService.createApplicationProgrammatically({
1881
1883
  name: 'ollama-api',
1882
1884
  description: `Ollama AI API (${config.modelName}) - Managed Process`,
1883
1885
  port: 11435,
1884
1886
  protocol: 'https',
1885
1887
  deviceIds: [ollamaDeviceId],
1886
- gatewayIds: undefined, // Managed gateway
1887
- useManagedGateway: true,
1888
+ gatewayIds: [], // No gateway - local/internal access only
1889
+ useManagedGateway: false,
1888
1890
  subtype: 'managed-process',
1889
1891
  configuration,
1892
+ authModes: [], // No authentication required
1890
1893
  });
1891
1894
  return {
1892
1895
  app: result,
@@ -1899,29 +1902,31 @@ async function createOllamaApplication(config) {
1899
1902
  async function createOpenWebUIApplication(config) {
1900
1903
  // Always use the same device as Ollama (same device as agent)
1901
1904
  const webuiDeviceId = config.deviceId;
1902
- // Always use managed gateway
1905
+ // Use managed gateway for public access
1903
1906
  const useManagedGateway = true;
1904
1907
  // Create application
1905
1908
  // Note: Backend should configure OLLAMA_BASE_URL environment variable to ${config.ollamaUrl}
1906
1909
  // This URL should be the platform Ollama application URL (not localhost) for remote deployments
1907
- const composeDir = getComposeDirectory();
1908
- const composeFilePath = path.join(composeDir, 'docker-compose.yml');
1910
+ // Use generated base64 constant (no runtime file reading needed)
1911
+ const dockerComposePathValue = (0, compose_constants_1.getOpenWebUIComposeValue)();
1912
+ const envVars = {
1913
+ 'OLLAMA_BASE_URL': config.ollamaUrl
1914
+ };
1909
1915
  const result = await config.applicationService.createApplicationProgrammatically({
1910
1916
  name: 'open-webui',
1911
1917
  description: `Open WebUI - AI Chat Interface (OLLAMA_BASE_URL: ${config.ollamaUrl})`,
1912
1918
  port: 3200,
1913
1919
  protocol: 'https',
1914
1920
  deviceIds: [webuiDeviceId],
1915
- gatewayIds: undefined, // Managed gateway
1921
+ gatewayIds: undefined, // Managed gateway for public access
1916
1922
  useManagedGateway: true,
1917
1923
  subtype: 'docker-compose',
1918
1924
  configuration: {
1919
- 'dockerComposePath': composeFilePath,
1920
- 'env': {
1921
- 'OLLAMA_BASE_URL': config.ollamaUrl
1922
- },
1925
+ 'dockerComposePath': dockerComposePathValue, // base64:... constant
1926
+ 'env': envVars,
1923
1927
  'isWorking': true
1924
- }
1928
+ },
1929
+ requireOrgAuth: true // Enable authentication - X-Auth-Email header already passed by auth system
1925
1930
  });
1926
1931
  return {
1927
1932
  app: result,
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/commands/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+1C/D"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/commands/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmkE/D"}