berget 2.2.5 → 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 (148) hide show
  1. package/.github/workflows/publish.yml +8 -8
  2. package/.github/workflows/test.yml +12 -6
  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 +30 -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 +50 -0
  30. package/dist/src/commands/code/__tests__/fake-file-store.js +55 -0
  31. package/dist/src/commands/code/__tests__/fake-prompter.js +133 -0
  32. package/dist/src/commands/code/__tests__/setup-flow.test.js +505 -0
  33. package/dist/src/commands/code/adapters/clack-prompter.js +81 -0
  34. package/dist/src/commands/code/adapters/fs-file-store.js +80 -0
  35. package/dist/src/commands/code/adapters/spawn-command-runner.js +53 -0
  36. package/dist/src/commands/code/auth-sync.js +283 -0
  37. package/dist/src/commands/code/errors.js +27 -0
  38. package/dist/src/commands/code/ports/auth-services.js +2 -0
  39. package/dist/src/commands/code/ports/command-runner.js +2 -0
  40. package/dist/src/commands/code/ports/file-store.js +2 -0
  41. package/dist/src/commands/code/ports/prompter.js +2 -0
  42. package/dist/src/commands/code/setup.js +533 -0
  43. package/dist/src/commands/code.js +223 -779
  44. package/dist/src/commands/models.js +13 -15
  45. package/dist/src/commands/users.js +6 -8
  46. package/dist/src/constants/command-structure.js +116 -114
  47. package/dist/src/services/api-key-service.js +43 -48
  48. package/dist/src/services/auth-service.js +60 -299
  49. package/dist/src/services/browser-auth.js +278 -0
  50. package/dist/src/services/chat-service.js +78 -91
  51. package/dist/src/services/cluster-service.js +6 -6
  52. package/dist/src/services/collaborator-service.js +5 -8
  53. package/dist/src/services/flux-service.js +5 -8
  54. package/dist/src/services/helm-service.js +5 -8
  55. package/dist/src/services/kubectl-service.js +7 -10
  56. package/dist/src/utils/config-checker.js +5 -5
  57. package/dist/src/utils/config-loader.js +25 -25
  58. package/dist/src/utils/default-api-key.js +23 -23
  59. package/dist/src/utils/env-manager.js +7 -7
  60. package/dist/src/utils/error-handler.js +60 -61
  61. package/dist/src/utils/logger.js +7 -7
  62. package/dist/src/utils/markdown-renderer.js +2 -2
  63. package/dist/src/utils/opencode-validator.js +17 -20
  64. package/dist/src/utils/token-manager.js +38 -11
  65. package/dist/tests/commands/chat.test.js +24 -24
  66. package/dist/tests/commands/code.test.js +169 -138
  67. package/dist/tests/utils/config-loader.test.js +114 -114
  68. package/dist/tests/utils/env-manager.test.js +57 -57
  69. package/dist/tests/utils/opencode-validator.test.js +44 -43
  70. package/dist/vitest.config.js +1 -1
  71. package/eslint.config.mjs +47 -0
  72. package/index.ts +42 -48
  73. package/package.json +30 -2
  74. package/src/agents/app.ts +27 -0
  75. package/src/agents/backend.ts +24 -0
  76. package/src/agents/devops.ts +33 -0
  77. package/src/agents/frontend.ts +24 -0
  78. package/src/agents/fullstack.ts +24 -0
  79. package/src/agents/index.ts +71 -0
  80. package/src/agents/quality.ts +69 -0
  81. package/src/agents/security.ts +26 -0
  82. package/src/agents/types.ts +17 -0
  83. package/src/client.ts +125 -167
  84. package/src/commands/api-keys.ts +261 -358
  85. package/src/commands/auth.ts +24 -30
  86. package/src/commands/autocomplete.ts +12 -12
  87. package/src/commands/billing.ts +22 -27
  88. package/src/commands/chat.ts +230 -323
  89. package/src/commands/clusters.ts +33 -33
  90. package/src/commands/code/__tests__/auth-sync.test.ts +481 -0
  91. package/src/commands/code/__tests__/fake-api-key-service.ts +13 -0
  92. package/src/commands/code/__tests__/fake-auth-service.ts +50 -0
  93. package/src/commands/code/__tests__/fake-command-runner.ts +44 -0
  94. package/src/commands/code/__tests__/fake-file-store.ts +44 -0
  95. package/src/commands/code/__tests__/fake-prompter.ts +121 -0
  96. package/src/commands/code/__tests__/setup-flow.test.ts +628 -0
  97. package/src/commands/code/adapters/clack-prompter.ts +55 -0
  98. package/src/commands/code/adapters/fs-file-store.ts +37 -0
  99. package/src/commands/code/adapters/spawn-command-runner.ts +40 -0
  100. package/src/commands/code/auth-sync.ts +329 -0
  101. package/src/commands/code/errors.ts +23 -0
  102. package/src/commands/code/ports/auth-services.ts +14 -0
  103. package/src/commands/code/ports/command-runner.ts +10 -0
  104. package/src/commands/code/ports/file-store.ts +7 -0
  105. package/src/commands/code/ports/prompter.ts +29 -0
  106. package/src/commands/code/setup.ts +630 -0
  107. package/src/commands/code.ts +335 -1074
  108. package/src/commands/index.ts +19 -19
  109. package/src/commands/models.ts +32 -37
  110. package/src/commands/users.ts +15 -22
  111. package/src/constants/command-structure.ts +120 -140
  112. package/src/services/api-key-service.ts +96 -113
  113. package/src/services/auth-service.ts +92 -339
  114. package/src/services/browser-auth.ts +296 -0
  115. package/src/services/chat-service.ts +246 -279
  116. package/src/services/cluster-service.ts +29 -32
  117. package/src/services/collaborator-service.ts +13 -18
  118. package/src/services/flux-service.ts +16 -18
  119. package/src/services/helm-service.ts +16 -18
  120. package/src/services/kubectl-service.ts +12 -14
  121. package/src/types/api.d.ts +924 -926
  122. package/src/types/json.d.ts +3 -3
  123. package/src/utils/config-checker.ts +10 -10
  124. package/src/utils/config-loader.ts +110 -127
  125. package/src/utils/default-api-key.ts +81 -93
  126. package/src/utils/env-manager.ts +36 -40
  127. package/src/utils/error-handler.ts +83 -78
  128. package/src/utils/logger.ts +41 -41
  129. package/src/utils/markdown-renderer.ts +11 -11
  130. package/src/utils/opencode-validator.ts +51 -56
  131. package/src/utils/token-manager.ts +84 -64
  132. package/templates/agents/app.md +23 -0
  133. package/templates/agents/backend.md +23 -0
  134. package/templates/agents/devops.md +30 -0
  135. package/templates/agents/frontend.md +25 -0
  136. package/templates/agents/fullstack.md +23 -0
  137. package/templates/agents/quality.md +69 -0
  138. package/templates/agents/security.md +21 -0
  139. package/tests/commands/chat.test.ts +60 -70
  140. package/tests/commands/code.test.ts +346 -345
  141. package/tests/utils/config-loader.test.ts +260 -260
  142. package/tests/utils/env-manager.test.ts +127 -134
  143. package/tests/utils/opencode-validator.test.ts +65 -69
  144. package/tsconfig.json +2 -2
  145. package/vitest.config.ts +3 -3
  146. package/AGENTS.md +0 -374
  147. package/TODO.md +0 -19
  148. package/opencode.json +0 -146
@@ -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,172 +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',
38
+ INIT: "init",
39
+ RUN: "run",
40
+ UPDATE: "update",
41
+ SERVE: "serve",
42
+ SETUP: "setup",
42
43
  },
43
44
  // API Keys commands
44
45
  API_KEYS: {
45
- LIST: 'list',
46
- CREATE: 'create',
47
- DELETE: 'delete',
48
- ROTATE: 'rotate',
49
- DESCRIBE: 'describe',
50
- SET_DEFAULT: 'set-default',
51
- 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",
52
53
  },
53
54
  // Clusters commands
54
55
  CLUSTERS: {
55
- LIST: 'list',
56
- DESCRIBE: 'describe',
57
- GET_USAGE: 'get-usage',
56
+ LIST: "list",
57
+ DESCRIBE: "describe",
58
+ GET_USAGE: "get-usage",
58
59
  },
59
60
  // Apps commands
60
61
  APPS: {
61
- LIST_TEMPLATES: 'list-templates',
62
- DESCRIBE_TEMPLATE: 'describe-template',
63
- LIST_INSTALLATIONS: 'list-installations',
64
- INSTALL: 'install',
65
- UNINSTALL: 'uninstall',
66
- 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",
67
68
  },
68
69
  // Models commands
69
70
  MODELS: {
70
- LIST: 'list',
71
- DESCRIBE: 'describe',
71
+ LIST: "list",
72
+ DESCRIBE: "describe",
72
73
  },
73
74
  // Helm commands
74
75
  HELM: {
75
- ADD_REPO: 'add-repo',
76
- INSTALL: 'install',
76
+ ADD_REPO: "add-repo",
77
+ INSTALL: "install",
77
78
  },
78
79
  // Kubectl commands
79
80
  KUBECTL: {
80
- CREATE_NAMESPACE: 'create-namespace',
81
- APPLY: 'apply',
82
- GET: 'get',
81
+ CREATE_NAMESPACE: "create-namespace",
82
+ APPLY: "apply",
83
+ GET: "get",
83
84
  },
84
85
  // Flux commands
85
86
  FLUX: {
86
- INSTALL: 'install',
87
- BOOTSTRAP: 'bootstrap',
87
+ INSTALL: "install",
88
+ BOOTSTRAP: "bootstrap",
88
89
  },
89
90
  // Users commands
90
91
  USERS: {
91
- LIST: 'list',
92
- DESCRIBE: 'describe',
93
- UPDATE: 'update',
94
- INVITE: 'invite',
92
+ LIST: "list",
93
+ DESCRIBE: "describe",
94
+ UPDATE: "update",
95
+ INVITE: "invite",
95
96
  },
96
97
  // Billing commands
97
98
  BILLING: {
98
- GET_USAGE: 'get-usage',
99
- LIST_INVOICES: 'list-invoices',
100
- DESCRIBE_INVOICE: 'describe-invoice',
101
- LIST_PAYMENT_METHODS: 'list-payment-methods',
102
- ADD_PAYMENT_METHOD: 'add-payment-method',
103
- REMOVE_PAYMENT_METHOD: 'remove-payment-method',
104
- 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",
105
106
  },
106
107
  };
107
108
  // Command descriptions
108
109
  exports.COMMAND_DESCRIPTIONS = {
109
110
  // Auth group
110
- [exports.COMMAND_GROUPS.AUTH]: 'Manage authentication and authorization',
111
- [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGIN}`]: 'Log in to Berget AI',
112
- [`${exports.COMMAND_GROUPS.AUTH} ${exports.SUBCOMMANDS.AUTH.LOGOUT}`]: 'Log out from Berget AI',
113
- [`${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",
114
115
  // API Keys group
115
- [exports.COMMAND_GROUPS.API_KEYS]: 'Manage API keys',
116
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.LIST}`]: 'List all API keys',
117
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.CREATE}`]: 'Create a new API key',
118
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DELETE}`]: 'Delete an API key',
119
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.ROTATE}`]: 'Rotate an API key',
120
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.DESCRIBE}`]: 'Get usage statistics for an API key',
121
- [`${exports.COMMAND_GROUPS.API_KEYS} ${exports.SUBCOMMANDS.API_KEYS.SET_DEFAULT}`]: 'Set an API key as the default for chat commands',
122
- [`${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",
123
124
  // Clusters group
124
- [exports.COMMAND_GROUPS.CLUSTERS]: 'Manage Kubernetes clusters',
125
- [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.LIST}`]: 'List all clusters',
126
- [`${exports.COMMAND_GROUPS.CLUSTERS} ${exports.SUBCOMMANDS.CLUSTERS.DESCRIBE}`]: 'Get detailed information about a cluster',
127
- [`${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",
128
129
  // Apps group
129
- [exports.COMMAND_GROUPS.APPS]: 'Manage applications',
130
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_TEMPLATES}`]: 'List available application templates',
131
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.DESCRIBE_TEMPLATE}`]: 'Get detailed information about an application template',
132
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.LIST_INSTALLATIONS}`]: 'List installed applications',
133
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.INSTALL}`]: 'Install an application',
134
- [`${exports.COMMAND_GROUPS.APPS} ${exports.SUBCOMMANDS.APPS.UNINSTALL}`]: 'Uninstall an application',
135
- [`${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",
136
137
  // Models group
137
- [exports.COMMAND_GROUPS.MODELS]: 'Manage AI models',
138
- [`${exports.COMMAND_GROUPS.MODELS} ${exports.SUBCOMMANDS.MODELS.LIST}`]: 'List available AI models',
139
- [`${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",
140
141
  // Helm group
141
- [exports.COMMAND_GROUPS.HELM]: 'Manage Helm charts',
142
- [`${exports.COMMAND_GROUPS.HELM} ${exports.SUBCOMMANDS.HELM.ADD_REPO}`]: 'Add a Helm repository',
143
- [`${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",
144
145
  // Kubectl group
145
- [exports.COMMAND_GROUPS.KUBECTL]: 'Manage Kubernetes resources',
146
- [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.CREATE_NAMESPACE}`]: 'Create a Kubernetes namespace',
147
- [`${exports.COMMAND_GROUPS.KUBECTL} ${exports.SUBCOMMANDS.KUBECTL.APPLY}`]: 'Apply a Kubernetes configuration',
148
- [`${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",
149
150
  // Flux group
150
- [exports.COMMAND_GROUPS.FLUX]: 'Manage Flux CD',
151
- [`${exports.COMMAND_GROUPS.FLUX} ${exports.SUBCOMMANDS.FLUX.INSTALL}`]: 'Install Flux CD',
152
- [`${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",
153
154
  // Users group
154
- [exports.COMMAND_GROUPS.USERS]: 'Manage users',
155
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.LIST}`]: 'List all users in your organization',
156
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.DESCRIBE}`]: 'Get detailed information about a user',
157
- [`${exports.COMMAND_GROUPS.USERS} ${exports.SUBCOMMANDS.USERS.UPDATE}`]: 'Update user information',
158
- [`${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",
159
160
  // Billing group
160
- [exports.COMMAND_GROUPS.BILLING]: 'Manage billing and usage',
161
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.GET_USAGE}`]: 'Get current usage metrics',
162
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_INVOICES}`]: 'List all invoices',
163
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.DESCRIBE_INVOICE}`]: 'Get detailed information about an invoice',
164
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.LIST_PAYMENT_METHODS}`]: 'List all payment methods',
165
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.ADD_PAYMENT_METHOD}`]: 'Add a new payment method',
166
- [`${exports.COMMAND_GROUPS.BILLING} ${exports.SUBCOMMANDS.BILLING.REMOVE_PAYMENT_METHOD}`]: 'Remove a payment method',
167
- [`${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",
168
169
  // Chat group
169
- [exports.COMMAND_GROUPS.CHAT]: 'Interact with AI chat models',
170
- [`${exports.COMMAND_GROUPS.CHAT} ${exports.SUBCOMMANDS.CHAT.RUN}`]: 'Run a chat session with a specified model',
171
- [`${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",
172
173
  // Code group
173
- [exports.COMMAND_GROUPS.CODE]: 'AI-powered coding assistant with OpenCode',
174
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.INIT}`]: 'Initialize project for AI coding assistant',
175
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.RUN}`]: 'Run AI coding assistant',
176
- [`${exports.COMMAND_GROUPS.CODE} ${exports.SUBCOMMANDS.CODE.SERVE}`]: 'Start OpenCode web server',
177
- [`${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",
178
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
  });