berget 2.2.6 → 2.2.7

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 (144) hide show
  1. package/.github/workflows/publish.yml +6 -6
  2. package/.github/workflows/test.yml +11 -5
  3. package/.husky/pre-commit +1 -0
  4. package/.prettierignore +15 -0
  5. package/.prettierrc +5 -3
  6. package/CONTRIBUTING.md +38 -0
  7. package/README.md +2 -148
  8. package/dist/index.js +21 -21
  9. package/dist/package.json +28 -2
  10. package/dist/src/agents/app.js +28 -0
  11. package/dist/src/agents/backend.js +25 -0
  12. package/dist/src/agents/devops.js +34 -0
  13. package/dist/src/agents/frontend.js +25 -0
  14. package/dist/src/agents/fullstack.js +25 -0
  15. package/dist/src/agents/index.js +61 -0
  16. package/dist/src/agents/quality.js +70 -0
  17. package/dist/src/agents/security.js +26 -0
  18. package/dist/src/agents/types.js +2 -0
  19. package/dist/src/client.js +54 -62
  20. package/dist/src/commands/api-keys.js +132 -140
  21. package/dist/src/commands/auth.js +9 -9
  22. package/dist/src/commands/autocomplete.js +9 -9
  23. package/dist/src/commands/billing.js +7 -9
  24. package/dist/src/commands/chat.js +90 -92
  25. package/dist/src/commands/clusters.js +12 -12
  26. package/dist/src/commands/code/__tests__/auth-sync.test.js +348 -0
  27. package/dist/src/commands/code/__tests__/fake-api-key-service.js +23 -0
  28. package/dist/src/commands/code/__tests__/fake-auth-service.js +55 -0
  29. package/dist/src/commands/code/__tests__/fake-command-runner.js +5 -7
  30. package/dist/src/commands/code/__tests__/fake-file-store.js +9 -0
  31. package/dist/src/commands/code/__tests__/fake-prompter.js +60 -18
  32. package/dist/src/commands/code/__tests__/setup-flow.test.js +374 -107
  33. package/dist/src/commands/code/adapters/clack-prompter.js +10 -0
  34. package/dist/src/commands/code/adapters/fs-file-store.js +8 -3
  35. package/dist/src/commands/code/adapters/spawn-command-runner.js +15 -11
  36. package/dist/src/commands/code/auth-sync.js +283 -0
  37. package/dist/src/commands/code/errors.js +4 -4
  38. package/dist/src/commands/code/ports/auth-services.js +2 -0
  39. package/dist/src/commands/code/setup.js +234 -93
  40. package/dist/src/commands/code.js +139 -251
  41. package/dist/src/commands/models.js +13 -15
  42. package/dist/src/commands/users.js +6 -8
  43. package/dist/src/constants/command-structure.js +116 -116
  44. package/dist/src/services/api-key-service.js +43 -48
  45. package/dist/src/services/auth-service.js +60 -299
  46. package/dist/src/services/browser-auth.js +278 -0
  47. package/dist/src/services/chat-service.js +78 -91
  48. package/dist/src/services/cluster-service.js +6 -6
  49. package/dist/src/services/collaborator-service.js +5 -8
  50. package/dist/src/services/flux-service.js +5 -8
  51. package/dist/src/services/helm-service.js +5 -8
  52. package/dist/src/services/kubectl-service.js +7 -10
  53. package/dist/src/utils/config-checker.js +5 -5
  54. package/dist/src/utils/config-loader.js +25 -25
  55. package/dist/src/utils/default-api-key.js +23 -23
  56. package/dist/src/utils/env-manager.js +7 -7
  57. package/dist/src/utils/error-handler.js +60 -61
  58. package/dist/src/utils/logger.js +7 -7
  59. package/dist/src/utils/markdown-renderer.js +2 -2
  60. package/dist/src/utils/opencode-validator.js +17 -20
  61. package/dist/src/utils/token-manager.js +38 -11
  62. package/dist/tests/commands/chat.test.js +24 -24
  63. package/dist/tests/commands/code.test.js +147 -147
  64. package/dist/tests/utils/config-loader.test.js +114 -114
  65. package/dist/tests/utils/env-manager.test.js +57 -57
  66. package/dist/tests/utils/opencode-validator.test.js +33 -33
  67. package/dist/vitest.config.js +1 -1
  68. package/eslint.config.mjs +47 -0
  69. package/index.ts +42 -48
  70. package/package.json +28 -2
  71. package/src/agents/app.ts +27 -0
  72. package/src/agents/backend.ts +24 -0
  73. package/src/agents/devops.ts +33 -0
  74. package/src/agents/frontend.ts +24 -0
  75. package/src/agents/fullstack.ts +24 -0
  76. package/src/agents/index.ts +71 -0
  77. package/src/agents/quality.ts +69 -0
  78. package/src/agents/security.ts +26 -0
  79. package/src/agents/types.ts +17 -0
  80. package/src/client.ts +125 -167
  81. package/src/commands/api-keys.ts +261 -358
  82. package/src/commands/auth.ts +24 -30
  83. package/src/commands/autocomplete.ts +12 -12
  84. package/src/commands/billing.ts +22 -27
  85. package/src/commands/chat.ts +230 -323
  86. package/src/commands/clusters.ts +33 -33
  87. package/src/commands/code/__tests__/auth-sync.test.ts +481 -0
  88. package/src/commands/code/__tests__/fake-api-key-service.ts +13 -0
  89. package/src/commands/code/__tests__/fake-auth-service.ts +50 -0
  90. package/src/commands/code/__tests__/fake-command-runner.ts +39 -42
  91. package/src/commands/code/__tests__/fake-file-store.ts +32 -23
  92. package/src/commands/code/__tests__/fake-prompter.ts +107 -69
  93. package/src/commands/code/__tests__/setup-flow.test.ts +624 -270
  94. package/src/commands/code/adapters/clack-prompter.ts +50 -38
  95. package/src/commands/code/adapters/fs-file-store.ts +31 -27
  96. package/src/commands/code/adapters/spawn-command-runner.ts +33 -29
  97. package/src/commands/code/auth-sync.ts +329 -0
  98. package/src/commands/code/errors.ts +15 -15
  99. package/src/commands/code/ports/auth-services.ts +14 -0
  100. package/src/commands/code/ports/command-runner.ts +8 -4
  101. package/src/commands/code/ports/file-store.ts +5 -4
  102. package/src/commands/code/ports/prompter.ts +24 -18
  103. package/src/commands/code/setup.ts +545 -317
  104. package/src/commands/code.ts +271 -473
  105. package/src/commands/index.ts +19 -19
  106. package/src/commands/models.ts +32 -37
  107. package/src/commands/users.ts +15 -22
  108. package/src/constants/command-structure.ts +119 -142
  109. package/src/services/api-key-service.ts +96 -113
  110. package/src/services/auth-service.ts +92 -339
  111. package/src/services/browser-auth.ts +296 -0
  112. package/src/services/chat-service.ts +246 -279
  113. package/src/services/cluster-service.ts +29 -32
  114. package/src/services/collaborator-service.ts +13 -18
  115. package/src/services/flux-service.ts +16 -18
  116. package/src/services/helm-service.ts +16 -18
  117. package/src/services/kubectl-service.ts +12 -14
  118. package/src/types/api.d.ts +924 -926
  119. package/src/types/json.d.ts +3 -3
  120. package/src/utils/config-checker.ts +10 -10
  121. package/src/utils/config-loader.ts +110 -127
  122. package/src/utils/default-api-key.ts +81 -93
  123. package/src/utils/env-manager.ts +36 -40
  124. package/src/utils/error-handler.ts +83 -78
  125. package/src/utils/logger.ts +41 -41
  126. package/src/utils/markdown-renderer.ts +11 -11
  127. package/src/utils/opencode-validator.ts +51 -56
  128. package/src/utils/token-manager.ts +84 -64
  129. package/templates/agents/app.md +1 -0
  130. package/templates/agents/backend.md +1 -0
  131. package/templates/agents/devops.md +2 -0
  132. package/templates/agents/frontend.md +1 -0
  133. package/templates/agents/fullstack.md +1 -0
  134. package/templates/agents/quality.md +45 -40
  135. package/templates/agents/security.md +1 -0
  136. package/tests/commands/chat.test.ts +60 -70
  137. package/tests/commands/code.test.ts +330 -376
  138. package/tests/utils/config-loader.test.ts +260 -260
  139. package/tests/utils/env-manager.test.ts +127 -134
  140. package/tests/utils/opencode-validator.test.ts +58 -63
  141. package/tsconfig.json +2 -2
  142. package/vitest.config.ts +3 -3
  143. package/AGENTS.md +0 -374
  144. package/TODO.md +0 -19
@@ -17,52 +17,50 @@ const error_handler_1 = require("../utils/error-handler");
17
17
  * Register models commands
18
18
  */
19
19
  function registerModelCommands(program) {
20
- const models = program
21
- .command(command_structure_1.COMMAND_GROUPS.MODELS)
22
- .description('Manage AI models');
20
+ const models = program.command(command_structure_1.COMMAND_GROUPS.MODELS).description("Manage AI models");
23
21
  models
24
22
  .command(command_structure_1.SUBCOMMANDS.MODELS.LIST)
25
- .description('List available AI models')
26
- .option('--id <modelId>', 'Get details for a specific model')
23
+ .description("List available AI models")
24
+ .option("--id <modelId>", "Get details for a specific model")
27
25
  .action((options) => __awaiter(this, void 0, void 0, function* () {
28
26
  try {
29
27
  const client = (0, client_1.createAuthenticatedClient)();
30
28
  let response;
31
29
  if (options.id) {
32
- const { data, error } = yield client.GET('/v1/models/{modelId}', {
30
+ const { data, error } = yield client.GET("/v1/models/{modelId}", {
33
31
  params: { path: { modelId: options.id } },
34
32
  });
35
33
  if (error)
36
34
  throw new Error(JSON.stringify(error));
37
35
  response = data;
38
- console.log('Model Details:');
36
+ console.log("Model Details:");
39
37
  console.log(JSON.stringify(response, null, 2));
40
38
  }
41
39
  else {
42
- const { data, error } = yield client.GET('/v1/models');
40
+ const { data, error } = yield client.GET("/v1/models");
43
41
  if (error)
44
42
  throw new Error(JSON.stringify(error));
45
43
  response = data;
46
- console.log('Available Models:');
47
- console.log('ID OWNED BY CAPABILITIES');
44
+ console.log("Available Models:");
45
+ console.log("ID OWNED BY CAPABILITIES");
48
46
  // Ensure response has the expected structure
49
47
  const modelData = response;
50
48
  if (modelData.data) {
51
49
  modelData.data.forEach((model) => {
52
50
  const capabilities = [];
53
51
  if (model.capabilities.vision)
54
- capabilities.push('vision');
52
+ capabilities.push("vision");
55
53
  if (model.capabilities.function_calling)
56
- capabilities.push('function_calling');
54
+ capabilities.push("function_calling");
57
55
  if (model.capabilities.json_mode)
58
- capabilities.push('json_mode');
59
- console.log(`${model.root.padEnd(50)} ${model.owned_by.padEnd(24)} ${capabilities.join(', ')}`);
56
+ capabilities.push("json_mode");
57
+ console.log(`${model.root.padEnd(50)} ${model.owned_by.padEnd(24)} ${capabilities.join(", ")}`);
60
58
  });
61
59
  }
62
60
  }
63
61
  }
64
62
  catch (error) {
65
- (0, error_handler_1.handleError)('Failed to get models', error);
63
+ (0, error_handler_1.handleError)("Failed to get models", error);
66
64
  }
67
65
  }));
68
66
  }
@@ -17,26 +17,24 @@ const error_handler_1 = require("../utils/error-handler");
17
17
  * Register user commands
18
18
  */
19
19
  function registerUserCommands(program) {
20
- const users = program
21
- .command(command_structure_1.COMMAND_GROUPS.USERS)
22
- .description('Manage users');
20
+ const users = program.command(command_structure_1.COMMAND_GROUPS.USERS).description("Manage users");
23
21
  users
24
22
  .command(command_structure_1.SUBCOMMANDS.USERS.LIST)
25
- .description('List team members')
23
+ .description("List team members")
26
24
  .action(() => __awaiter(this, void 0, void 0, function* () {
27
25
  try {
28
26
  const client = (0, client_1.createAuthenticatedClient)();
29
- const { data, error } = yield client.GET('/v1/users');
27
+ const { data, error } = yield client.GET("/v1/users");
30
28
  if (error)
31
29
  throw new Error(JSON.stringify(error));
32
- console.log('Team Members:');
33
- console.log('NAME EMAIL ROLE');
30
+ console.log("Team Members:");
31
+ console.log("NAME EMAIL ROLE");
34
32
  data.forEach((user) => {
35
33
  console.log(`${user.name.padEnd(24)} ${user.email.padEnd(30)} ${user.role}`);
36
34
  });
37
35
  }
38
36
  catch (error) {
39
- (0, error_handler_1.handleError)('Failed to list team members', error);
37
+ (0, error_handler_1.handleError)("Failed to list team members", error);
40
38
  }
41
39
  }));
42
40
  }
@@ -7,174 +7,174 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.COMMAND_DESCRIPTIONS = exports.SUBCOMMANDS = exports.COMMAND_GROUPS = void 0;
8
8
  // Main command groups
9
9
  exports.COMMAND_GROUPS = {
10
- AUTH: 'auth',
11
- API_KEYS: 'api-keys',
12
- CLUSTERS: 'clusters',
13
- APPS: 'apps',
14
- MODELS: 'models',
15
- HELM: 'helm',
16
- KUBECTL: 'kubectl',
17
- FLUX: 'flux',
18
- USERS: 'users',
19
- BILLING: 'billing',
20
- CHAT: 'chat',
21
- CODE: 'code',
10
+ AUTH: "auth",
11
+ API_KEYS: "api-keys",
12
+ CLUSTERS: "clusters",
13
+ APPS: "apps",
14
+ MODELS: "models",
15
+ HELM: "helm",
16
+ KUBECTL: "kubectl",
17
+ FLUX: "flux",
18
+ USERS: "users",
19
+ BILLING: "billing",
20
+ CHAT: "chat",
21
+ CODE: "code",
22
22
  };
23
23
  // Subcommands for each group
24
24
  exports.SUBCOMMANDS = {
25
25
  // Auth commands
26
26
  AUTH: {
27
- LOGIN: 'login',
28
- LOGOUT: 'logout',
29
- WHOAMI: 'whoami',
27
+ LOGIN: "login",
28
+ LOGOUT: "logout",
29
+ WHOAMI: "whoami",
30
30
  },
31
31
  // Chat commands
32
32
  CHAT: {
33
- RUN: 'run',
34
- LIST: 'list',
33
+ RUN: "run",
34
+ LIST: "list",
35
35
  },
36
36
  // Code commands
37
37
  CODE: {
38
- INIT: 'init',
39
- RUN: 'run',
40
- UPDATE: 'update',
41
- SERVE: 'serve',
42
- SETUP: 'setup',
38
+ INIT: "init",
39
+ RUN: "run",
40
+ UPDATE: "update",
41
+ SERVE: "serve",
42
+ SETUP: "setup",
43
43
  },
44
44
  // API Keys commands
45
45
  API_KEYS: {
46
- LIST: 'list',
47
- CREATE: 'create',
48
- DELETE: 'delete',
49
- ROTATE: 'rotate',
50
- DESCRIBE: 'describe',
51
- SET_DEFAULT: 'set-default',
52
- GET_DEFAULT: 'get-default',
46
+ LIST: "list",
47
+ CREATE: "create",
48
+ DELETE: "delete",
49
+ ROTATE: "rotate",
50
+ DESCRIBE: "describe",
51
+ SET_DEFAULT: "set-default",
52
+ GET_DEFAULT: "get-default",
53
53
  },
54
54
  // Clusters commands
55
55
  CLUSTERS: {
56
- LIST: 'list',
57
- DESCRIBE: 'describe',
58
- GET_USAGE: 'get-usage',
56
+ LIST: "list",
57
+ DESCRIBE: "describe",
58
+ GET_USAGE: "get-usage",
59
59
  },
60
60
  // Apps commands
61
61
  APPS: {
62
- LIST_TEMPLATES: 'list-templates',
63
- DESCRIBE_TEMPLATE: 'describe-template',
64
- LIST_INSTALLATIONS: 'list-installations',
65
- INSTALL: 'install',
66
- UNINSTALL: 'uninstall',
67
- DESCRIBE_INSTALLATION: 'describe-installation',
62
+ LIST_TEMPLATES: "list-templates",
63
+ DESCRIBE_TEMPLATE: "describe-template",
64
+ LIST_INSTALLATIONS: "list-installations",
65
+ INSTALL: "install",
66
+ UNINSTALL: "uninstall",
67
+ DESCRIBE_INSTALLATION: "describe-installation",
68
68
  },
69
69
  // Models commands
70
70
  MODELS: {
71
- LIST: 'list',
72
- DESCRIBE: 'describe',
71
+ LIST: "list",
72
+ DESCRIBE: "describe",
73
73
  },
74
74
  // Helm commands
75
75
  HELM: {
76
- ADD_REPO: 'add-repo',
77
- INSTALL: 'install',
76
+ ADD_REPO: "add-repo",
77
+ INSTALL: "install",
78
78
  },
79
79
  // Kubectl commands
80
80
  KUBECTL: {
81
- CREATE_NAMESPACE: 'create-namespace',
82
- APPLY: 'apply',
83
- GET: 'get',
81
+ CREATE_NAMESPACE: "create-namespace",
82
+ APPLY: "apply",
83
+ GET: "get",
84
84
  },
85
85
  // Flux commands
86
86
  FLUX: {
87
- INSTALL: 'install',
88
- BOOTSTRAP: 'bootstrap',
87
+ INSTALL: "install",
88
+ BOOTSTRAP: "bootstrap",
89
89
  },
90
90
  // Users commands
91
91
  USERS: {
92
- LIST: 'list',
93
- DESCRIBE: 'describe',
94
- UPDATE: 'update',
95
- INVITE: 'invite',
92
+ LIST: "list",
93
+ DESCRIBE: "describe",
94
+ UPDATE: "update",
95
+ INVITE: "invite",
96
96
  },
97
97
  // Billing commands
98
98
  BILLING: {
99
- GET_USAGE: 'get-usage',
100
- LIST_INVOICES: 'list-invoices',
101
- DESCRIBE_INVOICE: 'describe-invoice',
102
- LIST_PAYMENT_METHODS: 'list-payment-methods',
103
- ADD_PAYMENT_METHOD: 'add-payment-method',
104
- REMOVE_PAYMENT_METHOD: 'remove-payment-method',
105
- UPDATE_SUBSCRIPTION: 'update-subscription',
99
+ GET_USAGE: "get-usage",
100
+ LIST_INVOICES: "list-invoices",
101
+ DESCRIBE_INVOICE: "describe-invoice",
102
+ LIST_PAYMENT_METHODS: "list-payment-methods",
103
+ ADD_PAYMENT_METHOD: "add-payment-method",
104
+ REMOVE_PAYMENT_METHOD: "remove-payment-method",
105
+ UPDATE_SUBSCRIPTION: "update-subscription",
106
106
  },
107
107
  };
108
108
  // Command descriptions
109
109
  exports.COMMAND_DESCRIPTIONS = {
110
110
  // Auth group
111
- [exports.COMMAND_GROUPS.AUTH]: 'Manage authentication and authorization',
112
- [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGIN}`]: 'Log in to Berget AI',
113
- [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGOUT}`]: 'Log out from Berget AI',
114
- [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.WHOAMI}`]: 'Display current user information',
111
+ [exports.COMMAND_GROUPS.AUTH]: "Manage authentication and authorization",
112
+ [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGIN}`]: "Log in to Berget AI",
113
+ [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGOUT}`]: "Log out from Berget AI",
114
+ [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.WHOAMI}`]: "Display current user information",
115
115
  // API Keys group
116
- [exports.COMMAND_GROUPS.API_KEYS]: 'Manage API keys',
117
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.LIST}`]: 'List all API keys',
118
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.CREATE}`]: 'Create a new API key',
119
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DELETE}`]: 'Delete an API key',
120
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.ROTATE}`]: 'Rotate an API key',
121
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DESCRIBE}`]: 'Get usage statistics for an API key',
122
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.SET_DEFAULT}`]: 'Set an API key as the default for chat commands',
123
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.GET_DEFAULT}`]: 'Show the current default API key',
116
+ [exports.COMMAND_GROUPS.API_KEYS]: "Manage API keys",
117
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.LIST}`]: "List all API keys",
118
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.CREATE}`]: "Create a new API key",
119
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DELETE}`]: "Delete an API key",
120
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.ROTATE}`]: "Rotate an API key",
121
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DESCRIBE}`]: "Get usage statistics for an API key",
122
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.SET_DEFAULT}`]: "Set an API key as the default for chat commands",
123
+ [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.GET_DEFAULT}`]: "Show the current default API key",
124
124
  // Clusters group
125
- [exports.COMMAND_GROUPS.CLUSTERS]: 'Manage Kubernetes clusters',
126
- [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.LIST}`]: 'List all clusters',
127
- [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.DESCRIBE}`]: 'Get detailed information about a cluster',
128
- [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.GET_USAGE}`]: 'Get resource usage for a cluster',
125
+ [exports.COMMAND_GROUPS.CLUSTERS]: "Manage Kubernetes clusters",
126
+ [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.LIST}`]: "List all clusters",
127
+ [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.DESCRIBE}`]: "Get detailed information about a cluster",
128
+ [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.GET_USAGE}`]: "Get resource usage for a cluster",
129
129
  // Apps group
130
- [exports.COMMAND_GROUPS.APPS]: 'Manage applications',
131
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_TEMPLATES}`]: 'List available application templates',
132
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.DESCRIBE_TEMPLATE}`]: 'Get detailed information about an application template',
133
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_INSTALLATIONS}`]: 'List installed applications',
134
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.INSTALL}`]: 'Install an application',
135
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.UNINSTALL}`]: 'Uninstall an application',
136
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.DESCRIBE_INSTALLATION}`]: 'Get detailed information about an installed application',
130
+ [exports.COMMAND_GROUPS.APPS]: "Manage applications",
131
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_TEMPLATES}`]: "List available application templates",
132
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.DESCRIBE_TEMPLATE}`]: "Get detailed information about an application template",
133
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_INSTALLATIONS}`]: "List installed applications",
134
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.INSTALL}`]: "Install an application",
135
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.UNINSTALL}`]: "Uninstall an application",
136
+ [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.DESCRIBE_INSTALLATION}`]: "Get detailed information about an installed application",
137
137
  // Models group
138
- [exports.COMMAND_GROUPS.MODELS]: 'Manage AI models',
139
- [`${exports.COMMAND_GROUPS.MODELS} ${exports.SUBCOMMANDS.MODELS.LIST}`]: 'List available AI models',
140
- [`${exports.COMMAND_GROUPS.MODELS} ${exports.SUBCOMMANDS.MODELS.DESCRIBE}`]: 'Get detailed information about an AI model',
138
+ [exports.COMMAND_GROUPS.MODELS]: "Manage AI models",
139
+ [`${exports.COMMAND_GROUPS.MODELS} ${exports.SUBCOMMANDS.MODELS.LIST}`]: "List available AI models",
140
+ [`${exports.COMMAND_GROUPS.MODELS} ${exports.SUBCOMMANDS.MODELS.DESCRIBE}`]: "Get detailed information about an AI model",
141
141
  // Helm group
142
- [exports.COMMAND_GROUPS.HELM]: 'Manage Helm charts',
143
- [`${exports.COMMAND_GROUPS.HELM} ${exports.SUBCOMMANDS.HELM.ADD_REPO}`]: 'Add a Helm repository',
144
- [`${exports.COMMAND_GROUPS.HELM} ${exports.SUBCOMMANDS.HELM.INSTALL}`]: 'Install a Helm chart',
142
+ [exports.COMMAND_GROUPS.HELM]: "Manage Helm charts",
143
+ [`${exports.COMMAND_GROUPS.HELM} ${exports.SUBCOMMANDS.HELM.ADD_REPO}`]: "Add a Helm repository",
144
+ [`${exports.COMMAND_GROUPS.HELM} ${exports.SUBCOMMANDS.HELM.INSTALL}`]: "Install a Helm chart",
145
145
  // Kubectl group
146
- [exports.COMMAND_GROUPS.KUBECTL]: 'Manage Kubernetes resources',
147
- [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.CREATE_NAMESPACE}`]: 'Create a Kubernetes namespace',
148
- [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.APPLY}`]: 'Apply a Kubernetes configuration',
149
- [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.GET}`]: 'Get Kubernetes resources',
146
+ [exports.COMMAND_GROUPS.KUBECTL]: "Manage Kubernetes resources",
147
+ [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.CREATE_NAMESPACE}`]: "Create a Kubernetes namespace",
148
+ [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.APPLY}`]: "Apply a Kubernetes configuration",
149
+ [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.GET}`]: "Get Kubernetes resources",
150
150
  // Flux group
151
- [exports.COMMAND_GROUPS.FLUX]: 'Manage Flux CD',
152
- [`${exports.COMMAND_GROUPS.FLUX} ${exports.SUBCOMMANDS.FLUX.INSTALL}`]: 'Install Flux CD',
153
- [`${exports.COMMAND_GROUPS.FLUX} ${exports.SUBCOMMANDS.FLUX.BOOTSTRAP}`]: 'Bootstrap Flux CD',
151
+ [exports.COMMAND_GROUPS.FLUX]: "Manage Flux CD",
152
+ [`${exports.COMMAND_GROUPS.FLUX} ${exports.SUBCOMMANDS.FLUX.INSTALL}`]: "Install Flux CD",
153
+ [`${exports.COMMAND_GROUPS.FLUX} ${exports.SUBCOMMANDS.FLUX.BOOTSTRAP}`]: "Bootstrap Flux CD",
154
154
  // Users group
155
- [exports.COMMAND_GROUPS.USERS]: 'Manage users',
156
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.LIST}`]: 'List all users in your organization',
157
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.DESCRIBE}`]: 'Get detailed information about a user',
158
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.UPDATE}`]: 'Update user information',
159
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.INVITE}`]: 'Invite a new user to your organization',
155
+ [exports.COMMAND_GROUPS.USERS]: "Manage users",
156
+ [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.LIST}`]: "List all users in your organization",
157
+ [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.DESCRIBE}`]: "Get detailed information about a user",
158
+ [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.UPDATE}`]: "Update user information",
159
+ [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.INVITE}`]: "Invite a new user to your organization",
160
160
  // Billing group
161
- [exports.COMMAND_GROUPS.BILLING]: 'Manage billing and usage',
162
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.GET_USAGE}`]: 'Get current usage metrics',
163
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_INVOICES}`]: 'List all invoices',
164
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.DESCRIBE_INVOICE}`]: 'Get detailed information about an invoice',
165
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_PAYMENT_METHODS}`]: 'List all payment methods',
166
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.ADD_PAYMENT_METHOD}`]: 'Add a new payment method',
167
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.REMOVE_PAYMENT_METHOD}`]: 'Remove a payment method',
168
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.UPDATE_SUBSCRIPTION}`]: 'Update subscription plan',
161
+ [exports.COMMAND_GROUPS.BILLING]: "Manage billing and usage",
162
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.GET_USAGE}`]: "Get current usage metrics",
163
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_INVOICES}`]: "List all invoices",
164
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.DESCRIBE_INVOICE}`]: "Get detailed information about an invoice",
165
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_PAYMENT_METHODS}`]: "List all payment methods",
166
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.ADD_PAYMENT_METHOD}`]: "Add a new payment method",
167
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.REMOVE_PAYMENT_METHOD}`]: "Remove a payment method",
168
+ [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.UPDATE_SUBSCRIPTION}`]: "Update subscription plan",
169
169
  // Chat group
170
- [exports.COMMAND_GROUPS.CHAT]: 'Interact with AI chat models',
171
- [`${exports.COMMAND_GROUPS.CHAT} ${exports.SUBCOMMANDS.CHAT.RUN}`]: 'Run a chat session with a specified model',
172
- [`${exports.COMMAND_GROUPS.CHAT} ${exports.SUBCOMMANDS.CHAT.LIST}`]: 'List available chat models',
170
+ [exports.COMMAND_GROUPS.CHAT]: "Interact with AI chat models",
171
+ [`${exports.COMMAND_GROUPS.CHAT} ${exports.SUBCOMMANDS.CHAT.RUN}`]: "Run a chat session with a specified model",
172
+ [`${exports.COMMAND_GROUPS.CHAT} ${exports.SUBCOMMANDS.CHAT.LIST}`]: "List available chat models",
173
173
  // Code group
174
- [exports.COMMAND_GROUPS.CODE]: 'AI-powered coding assistant with OpenCode',
175
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.SETUP}`]: 'Interactive setup for Berget AI coding tools',
176
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.INIT}`]: 'Initialize project for AI coding assistant',
177
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.RUN}`]: 'Run AI coding assistant',
178
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.SERVE}`]: 'Start OpenCode web server',
179
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.UPDATE}`]: 'Update OpenCode and agents to latest versions',
174
+ [exports.COMMAND_GROUPS.CODE]: "AI-powered coding assistant with OpenCode",
175
+ [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.SETUP}`]: "Interactive setup for Berget AI coding tools",
176
+ [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.INIT}`]: "Initialize project for AI coding assistant",
177
+ [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.RUN}`]: "Run AI coding assistant",
178
+ [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.SERVE}`]: "Start OpenCode web server",
179
+ [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.UPDATE}`]: "Update OpenCode and agents to latest versions",
180
180
  };
@@ -34,13 +34,13 @@ class ApiKeyService {
34
34
  list() {
35
35
  return __awaiter(this, void 0, void 0, function* () {
36
36
  try {
37
- const { data, error } = yield this.client.GET('/v1/api-keys');
37
+ const { data, error } = yield this.client.GET("/v1/api-keys");
38
38
  if (error)
39
39
  throw error;
40
40
  return data || [];
41
41
  }
42
42
  catch (error) {
43
- (0, error_handler_1.handleError)('Failed to list API keys', error);
43
+ (0, error_handler_1.handleError)("Failed to list API keys", error);
44
44
  throw error;
45
45
  }
46
46
  });
@@ -55,76 +55,71 @@ class ApiKeyService {
55
55
  try {
56
56
  // Validate input before sending request
57
57
  if (!options.name || options.name.trim().length === 0) {
58
- throw new Error('API key name is required and cannot be empty');
58
+ throw new Error("API key name is required and cannot be empty");
59
59
  }
60
60
  if (options.name.length > 100) {
61
- throw new Error('API key name must be 100 characters or less');
61
+ throw new Error("API key name must be 100 characters or less");
62
62
  }
63
63
  if (options.description && options.description.length > 500) {
64
- throw new Error('API key description must be 500 characters or less');
64
+ throw new Error("API key description must be 500 characters or less");
65
65
  }
66
- const { data, error } = yield this.client.POST('/v1/api-keys', {
66
+ const { data, error } = yield this.client.POST("/v1/api-keys", {
67
67
  body: options,
68
68
  });
69
69
  if (error) {
70
70
  // Enhanced error handling with specific troubleshooting
71
71
  // Handle specific error cases
72
- if (typeof error === 'object' && error !== null) {
72
+ if (typeof error === "object" && error !== null) {
73
73
  const errorObj = error;
74
- if (((_a = errorObj.error) === null || _a === void 0 ? void 0 : _a.code) === 'API_KEY_CREATION_FAILED') {
75
- let detailedMessage = 'Failed to create API key. This could be due to:\n';
76
- detailedMessage += '• Account limits or quota restrictions\n';
77
- detailedMessage +=
78
- '• Insufficient permissions for API key creation\n';
79
- detailedMessage += 'Temporary server issues\n';
80
- detailedMessage += '• Billing or subscription issues\n\n';
81
- detailedMessage += 'Troubleshooting steps:\n';
82
- detailedMessage +=
83
- '1. Check if you have reached your API key limit\n';
84
- detailedMessage +=
85
- '2. Verify your account has API key creation permissions\n';
86
- detailedMessage += '3. Check your billing status and subscription\n';
87
- detailedMessage +=
88
- '4. Try again in a few minutes if this is a temporary issue\n';
89
- detailedMessage += '5. Contact support if the problem persists';
74
+ if (((_a = errorObj.error) === null || _a === void 0 ? void 0 : _a.code) === "API_KEY_CREATION_FAILED") {
75
+ let detailedMessage = "Failed to create API key. This could be due to:\n";
76
+ detailedMessage += "• Account limits or quota restrictions\n";
77
+ detailedMessage += "• Insufficient permissions for API key creation\n";
78
+ detailedMessage += "• Temporary server issues\n";
79
+ detailedMessage += "Billing or subscription issues\n\n";
80
+ detailedMessage += "Troubleshooting steps:\n";
81
+ detailedMessage += "1. Check if you have reached your API key limit\n";
82
+ detailedMessage += "2. Verify your account has API key creation permissions\n";
83
+ detailedMessage += "3. Check your billing status and subscription\n";
84
+ detailedMessage += "4. Try again in a few minutes if this is a temporary issue\n";
85
+ detailedMessage += "5. Contact support if the problem persists";
90
86
  throw new Error(detailedMessage);
91
87
  }
92
- if (((_b = errorObj.error) === null || _b === void 0 ? void 0 : _b.code) === 'USER_NOT_FOUND') {
93
- throw new Error('Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai');
88
+ if (((_b = errorObj.error) === null || _b === void 0 ? void 0 : _b.code) === "USER_NOT_FOUND") {
89
+ throw new Error("Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai");
94
90
  }
95
- if (((_c = errorObj.error) === null || _c === void 0 ? void 0 : _c.code) === 'QUOTA_EXCEEDED') {
96
- throw new Error('You have reached your API key limit. Please delete existing keys or contact support to increase your quota.');
91
+ if (((_c = errorObj.error) === null || _c === void 0 ? void 0 : _c.code) === "QUOTA_EXCEEDED") {
92
+ throw new Error("You have reached your API key limit. Please delete existing keys or contact support to increase your quota.");
97
93
  }
98
- if (((_d = errorObj.error) === null || _d === void 0 ? void 0 : _d.code) === 'INSUFFICIENT_PERMISSIONS') {
99
- throw new Error('Your account does not have permission to create API keys. Please contact your administrator.');
94
+ if (((_d = errorObj.error) === null || _d === void 0 ? void 0 : _d.code) === "INSUFFICIENT_PERMISSIONS") {
95
+ throw new Error("Your account does not have permission to create API keys. Please contact your administrator.");
100
96
  }
101
- if (((_e = errorObj.error) === null || _e === void 0 ? void 0 : _e.code) === 'BILLING_REQUIRED') {
102
- throw new Error('A valid billing method is required to create API keys. Please add a payment method.');
97
+ if (((_e = errorObj.error) === null || _e === void 0 ? void 0 : _e.code) === "BILLING_REQUIRED") {
98
+ throw new Error("A valid billing method is required to create API keys. Please add a payment method.");
103
99
  }
104
100
  }
105
101
  throw new Error(JSON.stringify(error));
106
102
  }
107
103
  if (!data) {
108
- throw new Error('No data received from server');
104
+ throw new Error("No data received from server");
109
105
  }
110
106
  return data;
111
107
  }
112
108
  catch (error) {
113
- console.error('Failed to create API key:', error);
109
+ console.error("Failed to create API key:", error);
114
110
  // Add additional context for common issues
115
111
  if (error instanceof Error) {
116
- if (error.message.includes('ECONNREFUSED')) {
117
- throw new Error('Cannot connect to Berget API. Please check your internet connection.');
112
+ if (error.message.includes("ECONNREFUSED")) {
113
+ throw new Error("Cannot connect to Berget API. Please check your internet connection.");
118
114
  }
119
- if (error.message.includes('ENOTFOUND')) {
120
- throw new Error('Cannot resolve Berget API hostname. Please check your DNS settings.');
115
+ if (error.message.includes("ENOTFOUND")) {
116
+ throw new Error("Cannot resolve Berget API hostname. Please check your DNS settings.");
121
117
  }
122
- if (error.message.includes('401') ||
123
- error.message.includes('Unauthorized')) {
124
- throw new Error('Authentication failed. Please run `berget auth login` to log in again.');
118
+ if (error.message.includes("401") || error.message.includes("Unauthorized")) {
119
+ throw new Error("Authentication failed. Please run `berget auth login` to log in again.");
125
120
  }
126
- if (error.message.includes('403')) {
127
- throw new Error('Access forbidden. Your account may not have permission to create API keys.');
121
+ if (error.message.includes("403")) {
122
+ throw new Error("Access forbidden. Your account may not have permission to create API keys.");
128
123
  }
129
124
  }
130
125
  throw error;
@@ -138,7 +133,7 @@ class ApiKeyService {
138
133
  delete(id) {
139
134
  return __awaiter(this, void 0, void 0, function* () {
140
135
  try {
141
- const { error } = yield this.client.DELETE('/v1/api-keys/{id}', {
136
+ const { error } = yield this.client.DELETE("/v1/api-keys/{id}", {
142
137
  params: { path: { id } },
143
138
  });
144
139
  if (error)
@@ -146,7 +141,7 @@ class ApiKeyService {
146
141
  return true;
147
142
  }
148
143
  catch (error) {
149
- console.error('Failed to delete API key:', error);
144
+ console.error("Failed to delete API key:", error);
150
145
  throw error;
151
146
  }
152
147
  });
@@ -158,7 +153,7 @@ class ApiKeyService {
158
153
  rotate(id) {
159
154
  return __awaiter(this, void 0, void 0, function* () {
160
155
  try {
161
- const { data, error } = yield this.client.PUT('/v1/api-keys/{id}/rotate', {
156
+ const { data, error } = yield this.client.PUT("/v1/api-keys/{id}/rotate", {
162
157
  params: { path: { id } },
163
158
  });
164
159
  if (error)
@@ -166,7 +161,7 @@ class ApiKeyService {
166
161
  return data;
167
162
  }
168
163
  catch (error) {
169
- console.error('Failed to rotate API key:', error);
164
+ console.error("Failed to rotate API key:", error);
170
165
  throw error;
171
166
  }
172
167
  });
@@ -178,7 +173,7 @@ class ApiKeyService {
178
173
  describe(id) {
179
174
  return __awaiter(this, void 0, void 0, function* () {
180
175
  try {
181
- const { data, error } = yield this.client.GET('/v1/api-keys/{id}/usage', {
176
+ const { data, error } = yield this.client.GET("/v1/api-keys/{id}/usage", {
182
177
  params: { path: { id } },
183
178
  });
184
179
  if (error)
@@ -186,7 +181,7 @@ class ApiKeyService {
186
181
  return data;
187
182
  }
188
183
  catch (error) {
189
- console.error('Failed to get API key usage:', error);
184
+ console.error("Failed to get API key usage:", error);
190
185
  throw error;
191
186
  }
192
187
  });