@phuetz/code-buddy 0.1.18 → 0.1.19

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 (273) hide show
  1. package/dist/agent/background-tasks.d.ts +49 -0
  2. package/dist/agent/background-tasks.js +153 -0
  3. package/dist/agent/background-tasks.js.map +1 -0
  4. package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
  5. package/dist/agent/definitions/agent-definition-loader.js +161 -0
  6. package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
  7. package/dist/agent/definitions/index.d.ts +1 -0
  8. package/dist/agent/definitions/index.js +2 -0
  9. package/dist/agent/definitions/index.js.map +1 -0
  10. package/dist/agent/extended-thinking.d.ts +64 -0
  11. package/dist/agent/extended-thinking.js +103 -0
  12. package/dist/agent/extended-thinking.js.map +1 -0
  13. package/dist/agent/prompt-suggestions.d.ts +55 -0
  14. package/dist/agent/prompt-suggestions.js +125 -0
  15. package/dist/agent/prompt-suggestions.js.map +1 -0
  16. package/dist/agent/rewind-manager.d.ts +59 -0
  17. package/dist/agent/rewind-manager.js +124 -0
  18. package/dist/agent/rewind-manager.js.map +1 -0
  19. package/dist/agent/teams/agent-team.d.ts +54 -0
  20. package/dist/agent/teams/agent-team.js +114 -0
  21. package/dist/agent/teams/agent-team.js.map +1 -0
  22. package/dist/agent/teams/index.d.ts +1 -0
  23. package/dist/agent/teams/index.js +2 -0
  24. package/dist/agent/teams/index.js.map +1 -0
  25. package/dist/agent/teams/team-v2.d.ts +166 -0
  26. package/dist/agent/teams/team-v2.js +376 -0
  27. package/dist/agent/teams/team-v2.js.map +1 -0
  28. package/dist/channels/imessage/index.d.ts +40 -0
  29. package/dist/channels/imessage/index.js +69 -0
  30. package/dist/channels/imessage/index.js.map +1 -0
  31. package/dist/channels/line/index.d.ts +36 -0
  32. package/dist/channels/line/index.js +71 -0
  33. package/dist/channels/line/index.js.map +1 -0
  34. package/dist/channels/mattermost/index.d.ts +34 -0
  35. package/dist/channels/mattermost/index.js +56 -0
  36. package/dist/channels/mattermost/index.js.map +1 -0
  37. package/dist/channels/nextcloud-talk/index.d.ts +37 -0
  38. package/dist/channels/nextcloud-talk/index.js +67 -0
  39. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  40. package/dist/channels/niche-channels.d.ts +61 -0
  41. package/dist/channels/niche-channels.js +131 -0
  42. package/dist/channels/niche-channels.js.map +1 -0
  43. package/dist/channels/nostr/index.d.ts +30 -0
  44. package/dist/channels/nostr/index.js +68 -0
  45. package/dist/channels/nostr/index.js.map +1 -0
  46. package/dist/channels/twilio-voice/index.d.ts +37 -0
  47. package/dist/channels/twilio-voice/index.js +76 -0
  48. package/dist/channels/twilio-voice/index.js.map +1 -0
  49. package/dist/channels/whatsapp/index.js +0 -1
  50. package/dist/channels/whatsapp/index.js.map +1 -1
  51. package/dist/channels/zalo/index.d.ts +28 -0
  52. package/dist/channels/zalo/index.js +53 -0
  53. package/dist/channels/zalo/index.js.map +1 -0
  54. package/dist/cloud/cloud-sessions.d.ts +56 -0
  55. package/dist/cloud/cloud-sessions.js +187 -0
  56. package/dist/cloud/cloud-sessions.js.map +1 -0
  57. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  58. package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
  59. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  60. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  61. package/dist/codebuddy/tool-definitions/index.js +1 -1
  62. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  63. package/dist/commands/handlers/auth-handler.d.ts +32 -0
  64. package/dist/commands/handlers/auth-handler.js +137 -0
  65. package/dist/commands/handlers/auth-handler.js.map +1 -0
  66. package/dist/commands/handlers/context-handler.d.ts +46 -0
  67. package/dist/commands/handlers/context-handler.js +102 -0
  68. package/dist/commands/handlers/context-handler.js.map +1 -0
  69. package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
  70. package/dist/commands/handlers/keybindings-handler.js +124 -0
  71. package/dist/commands/handlers/keybindings-handler.js.map +1 -0
  72. package/dist/commands/handlers/session-commands.d.ts +17 -0
  73. package/dist/commands/handlers/session-commands.js +119 -0
  74. package/dist/commands/handlers/session-commands.js.map +1 -0
  75. package/dist/commands/slash/builtin-commands.js +1 -1
  76. package/dist/commands/slash/builtin-commands.js.map +1 -1
  77. package/dist/config/admin-config.d.ts +54 -0
  78. package/dist/config/admin-config.js +144 -0
  79. package/dist/config/admin-config.js.map +1 -0
  80. package/dist/config/advanced-config.d.ts +118 -0
  81. package/dist/config/advanced-config.js +364 -0
  82. package/dist/config/advanced-config.js.map +1 -0
  83. package/dist/config/managed-policies.d.ts +50 -0
  84. package/dist/config/managed-policies.js +120 -0
  85. package/dist/config/managed-policies.js.map +1 -0
  86. package/dist/config/settings-hierarchy.d.ts +59 -0
  87. package/dist/config/settings-hierarchy.js +188 -0
  88. package/dist/config/settings-hierarchy.js.map +1 -0
  89. package/dist/config/tool-profiles.d.ts +37 -0
  90. package/dist/config/tool-profiles.js +150 -0
  91. package/dist/config/tool-profiles.js.map +1 -0
  92. package/dist/config/user-settings.d.ts +31 -0
  93. package/dist/config/user-settings.js +66 -0
  94. package/dist/config/user-settings.js.map +1 -0
  95. package/dist/context/context-files.d.ts +1 -1
  96. package/dist/context/context-files.js +2 -2
  97. package/dist/context/context-files.js.map +1 -1
  98. package/dist/context/partial-summarizer.d.ts +32 -0
  99. package/dist/context/partial-summarizer.js +144 -0
  100. package/dist/context/partial-summarizer.js.map +1 -0
  101. package/dist/desktop/desktop-app.d.ts +44 -0
  102. package/dist/desktop/desktop-app.js +136 -0
  103. package/dist/desktop/desktop-app.js.map +1 -0
  104. package/dist/git/worktree-sessions.d.ts +24 -0
  105. package/dist/git/worktree-sessions.js +93 -0
  106. package/dist/git/worktree-sessions.js.map +1 -0
  107. package/dist/hooks/advanced-hooks.d.ts +110 -0
  108. package/dist/hooks/advanced-hooks.js +256 -0
  109. package/dist/hooks/advanced-hooks.js.map +1 -0
  110. package/dist/hooks/async-hooks.d.ts +73 -0
  111. package/dist/hooks/async-hooks.js +213 -0
  112. package/dist/hooks/async-hooks.js.map +1 -0
  113. package/dist/hooks/env-persistence.d.ts +58 -0
  114. package/dist/hooks/env-persistence.js +195 -0
  115. package/dist/hooks/env-persistence.js.map +1 -0
  116. package/dist/hooks/hook-events.d.ts +36 -0
  117. package/dist/hooks/hook-events.js +55 -0
  118. package/dist/hooks/hook-events.js.map +1 -0
  119. package/dist/hooks/smart-hooks.d.ts +85 -0
  120. package/dist/hooks/smart-hooks.js +199 -0
  121. package/dist/hooks/smart-hooks.js.map +1 -0
  122. package/dist/ide/jetbrains-plugin.d.ts +55 -0
  123. package/dist/ide/jetbrains-plugin.js +156 -0
  124. package/dist/ide/jetbrains-plugin.js.map +1 -0
  125. package/dist/ide/vscode-extension.d.ts +94 -0
  126. package/dist/ide/vscode-extension.js +229 -0
  127. package/dist/ide/vscode-extension.js.map +1 -0
  128. package/dist/index.js +77 -3
  129. package/dist/index.js.map +1 -1
  130. package/dist/input/file-autocomplete.d.ts +42 -0
  131. package/dist/input/file-autocomplete.js +154 -0
  132. package/dist/input/file-autocomplete.js.map +1 -0
  133. package/dist/integrations/chrome-bridge.d.ts +90 -0
  134. package/dist/integrations/chrome-bridge.js +151 -0
  135. package/dist/integrations/chrome-bridge.js.map +1 -0
  136. package/dist/integrations/github-action-runner.d.ts +40 -0
  137. package/dist/integrations/github-action-runner.js +163 -0
  138. package/dist/integrations/github-action-runner.js.map +1 -0
  139. package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
  140. package/dist/integrations/gitlab-ci-runner.js +104 -0
  141. package/dist/integrations/gitlab-ci-runner.js.map +1 -0
  142. package/dist/integrations/pr-session-linker.d.ts +44 -0
  143. package/dist/integrations/pr-session-linker.js +103 -0
  144. package/dist/integrations/pr-session-linker.js.map +1 -0
  145. package/dist/integrations/tailscale.d.ts +36 -0
  146. package/dist/integrations/tailscale.js +101 -0
  147. package/dist/integrations/tailscale.js.map +1 -0
  148. package/dist/lsp/lsp-client.d.ts +68 -0
  149. package/dist/lsp/lsp-client.js +182 -0
  150. package/dist/lsp/lsp-client.js.map +1 -0
  151. package/dist/mcp/connectors.d.ts +28 -0
  152. package/dist/mcp/connectors.js +148 -0
  153. package/dist/mcp/connectors.js.map +1 -0
  154. package/dist/mcp/index.d.ts +7 -4
  155. package/dist/mcp/index.js +7 -4
  156. package/dist/mcp/index.js.map +1 -1
  157. package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
  158. package/dist/mcp/mcp-auto-discovery.js +104 -0
  159. package/dist/mcp/mcp-auto-discovery.js.map +1 -0
  160. package/dist/mcp/mcp-server.d.ts +70 -0
  161. package/dist/mcp/mcp-server.js +374 -0
  162. package/dist/mcp/mcp-server.js.map +1 -0
  163. package/dist/memory/auto-memory.d.ts +53 -0
  164. package/dist/memory/auto-memory.js +250 -0
  165. package/dist/memory/auto-memory.js.map +1 -0
  166. package/dist/memory/hybrid-search.d.ts +51 -0
  167. package/dist/memory/hybrid-search.js +199 -0
  168. package/dist/memory/hybrid-search.js.map +1 -0
  169. package/dist/memory/memory-flush.d.ts +51 -0
  170. package/dist/memory/memory-flush.js +102 -0
  171. package/dist/memory/memory-flush.js.map +1 -0
  172. package/dist/memory/subagent-memory.d.ts +73 -0
  173. package/dist/memory/subagent-memory.js +172 -0
  174. package/dist/memory/subagent-memory.js.map +1 -0
  175. package/dist/nodes/device-node.d.ts +40 -0
  176. package/dist/nodes/device-node.js +117 -0
  177. package/dist/nodes/device-node.js.map +1 -0
  178. package/dist/output/json-schema-output.d.ts +67 -0
  179. package/dist/output/json-schema-output.js +273 -0
  180. package/dist/output/json-schema-output.js.map +1 -0
  181. package/dist/persistence/session-picker.d.ts +22 -0
  182. package/dist/persistence/session-picker.js +47 -0
  183. package/dist/persistence/session-picker.js.map +1 -0
  184. package/dist/persistence/session-store.d.ts +11 -0
  185. package/dist/persistence/session-store.js +17 -0
  186. package/dist/persistence/session-store.js.map +1 -1
  187. package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
  188. package/dist/plugins/git-pinned-marketplace.js +152 -0
  189. package/dist/plugins/git-pinned-marketplace.js.map +1 -0
  190. package/dist/plugins/plugin-manifest.d.ts +116 -0
  191. package/dist/plugins/plugin-manifest.js +283 -0
  192. package/dist/plugins/plugin-manifest.js.map +1 -0
  193. package/dist/sandbox/os-sandbox.d.ts +49 -1
  194. package/dist/sandbox/os-sandbox.js +347 -6
  195. package/dist/sandbox/os-sandbox.js.map +1 -1
  196. package/dist/sdk/agent-sdk.d.ts +61 -0
  197. package/dist/sdk/agent-sdk.js +90 -0
  198. package/dist/sdk/agent-sdk.js.map +1 -0
  199. package/dist/security/permission-modes.d.ts +76 -0
  200. package/dist/security/permission-modes.js +195 -0
  201. package/dist/security/permission-modes.js.map +1 -0
  202. package/dist/security/permission-patterns.d.ts +61 -0
  203. package/dist/security/permission-patterns.js +171 -0
  204. package/dist/security/permission-patterns.js.map +1 -0
  205. package/dist/security/safe-binaries.d.ts +23 -0
  206. package/dist/security/safe-binaries.js +96 -0
  207. package/dist/security/safe-binaries.js.map +1 -0
  208. package/dist/security/sender-policies.d.ts +46 -0
  209. package/dist/security/sender-policies.js +90 -0
  210. package/dist/security/sender-policies.js.map +1 -0
  211. package/dist/server/dashboard.d.ts +53 -0
  212. package/dist/server/dashboard.js +93 -0
  213. package/dist/server/dashboard.js.map +1 -0
  214. package/dist/services/system-prompt-override.d.ts +34 -0
  215. package/dist/services/system-prompt-override.js +64 -0
  216. package/dist/services/system-prompt-override.js.map +1 -0
  217. package/dist/skills/skill-enhancements.d.ts +37 -0
  218. package/dist/skills/skill-enhancements.js +69 -0
  219. package/dist/skills/skill-enhancements.js.map +1 -0
  220. package/dist/telemetry/otel-tracer.d.ts +98 -0
  221. package/dist/telemetry/otel-tracer.js +245 -0
  222. package/dist/telemetry/otel-tracer.js.map +1 -0
  223. package/dist/tools/browser-stub.d.ts +61 -0
  224. package/dist/tools/browser-stub.js +184 -0
  225. package/dist/tools/browser-stub.js.map +1 -0
  226. package/dist/tools/gateway-tool.d.ts +43 -0
  227. package/dist/tools/gateway-tool.js +92 -0
  228. package/dist/tools/gateway-tool.js.map +1 -0
  229. package/dist/tools/image-stub.d.ts +32 -0
  230. package/dist/tools/image-stub.js +97 -0
  231. package/dist/tools/image-stub.js.map +1 -0
  232. package/dist/tools/js-repl.d.ts +78 -0
  233. package/dist/tools/js-repl.js +280 -0
  234. package/dist/tools/js-repl.js.map +1 -0
  235. package/dist/tools/message-tool.d.ts +42 -0
  236. package/dist/tools/message-tool.js +113 -0
  237. package/dist/tools/message-tool.js.map +1 -0
  238. package/dist/ui/cli-enhancements.d.ts +178 -0
  239. package/dist/ui/cli-enhancements.js +430 -0
  240. package/dist/ui/cli-enhancements.js.map +1 -0
  241. package/dist/ui/status-line.d.ts +90 -0
  242. package/dist/ui/status-line.js +160 -0
  243. package/dist/ui/status-line.js.map +1 -0
  244. package/dist/ui/terminal-enhancements.d.ts +34 -0
  245. package/dist/ui/terminal-enhancements.js +97 -0
  246. package/dist/ui/terminal-enhancements.js.map +1 -0
  247. package/dist/ui/ui-enhancements.d.ts +38 -0
  248. package/dist/ui/ui-enhancements.js +116 -0
  249. package/dist/ui/ui-enhancements.js.map +1 -0
  250. package/dist/utils/custom-instructions.js +4 -1
  251. package/dist/utils/custom-instructions.js.map +1 -1
  252. package/dist/utils/init-project.d.ts +1 -1
  253. package/dist/utils/init-project.js +20 -20
  254. package/dist/utils/init-project.js.map +1 -1
  255. package/dist/utils/output-schema-validator.d.ts +40 -0
  256. package/dist/utils/output-schema-validator.js +137 -0
  257. package/dist/utils/output-schema-validator.js.map +1 -0
  258. package/dist/utils/safety-misc.d.ts +24 -0
  259. package/dist/utils/safety-misc.js +91 -0
  260. package/dist/utils/safety-misc.js.map +1 -0
  261. package/dist/utils/session-enhancements.d.ts +40 -0
  262. package/dist/utils/session-enhancements.js +118 -0
  263. package/dist/utils/session-enhancements.js.map +1 -0
  264. package/dist/utils/shell-snapshot.d.ts +38 -0
  265. package/dist/utils/shell-snapshot.js +323 -0
  266. package/dist/utils/shell-snapshot.js.map +1 -0
  267. package/dist/utils/stream-json-formatter.d.ts +77 -0
  268. package/dist/utils/stream-json-formatter.js +61 -0
  269. package/dist/utils/stream-json-formatter.js.map +1 -0
  270. package/dist/workflows/lobster-engine.d.ts +43 -0
  271. package/dist/workflows/lobster-engine.js +167 -0
  272. package/dist/workflows/lobster-engine.js.map +1 -0
  273. package/package.json +3 -6
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Advanced Configuration
3
+ *
4
+ * Features:
5
+ * 1. Custom File Suggestion Provider - script-based file suggestions
6
+ * 2. Effort Level Control - low/medium/high model parameters
7
+ * 3. Auto-Compact Threshold - context window compaction trigger
8
+ * 4. Fallback Model Config - automatic model fallback on errors
9
+ * 5. Config Backup Rotation - backup/restore with rotation
10
+ * 6. Devcontainer Support - detect and manage devcontainer configs
11
+ * 7. Setting Sources Control - enable/disable config sources
12
+ */
13
+ import fs from 'fs';
14
+ import path from 'path';
15
+ import { logger } from '../utils/logger.js';
16
+ export class FileSuggestionProvider {
17
+ config;
18
+ constructor(config) {
19
+ this.config = {
20
+ maxResults: config?.maxResults ?? 15,
21
+ script: config?.script,
22
+ };
23
+ }
24
+ async getSuggestions(query) {
25
+ if (!this.config.script) {
26
+ logger.debug('No custom suggestion script configured');
27
+ return [];
28
+ }
29
+ try {
30
+ const { execSync } = await import('child_process');
31
+ const output = execSync(`${this.config.script} ${JSON.stringify(query)}`, {
32
+ encoding: 'utf-8',
33
+ timeout: 5000,
34
+ });
35
+ const results = output.trim().split('\n').filter(Boolean);
36
+ return results.slice(0, this.config.maxResults);
37
+ }
38
+ catch (error) {
39
+ logger.error('File suggestion script failed', error);
40
+ return [];
41
+ }
42
+ }
43
+ hasCustomProvider() {
44
+ return !!this.config.script;
45
+ }
46
+ setScript(scriptPath) {
47
+ this.config.script = scriptPath;
48
+ logger.info(`File suggestion script set to: ${scriptPath}`);
49
+ }
50
+ getConfig() {
51
+ return { ...this.config };
52
+ }
53
+ }
54
+ const EFFORT_PARAMS = {
55
+ low: { temperature: 0.3, maxTokens: 1024, topP: 0.8 },
56
+ medium: { temperature: 0.7, maxTokens: 4096, topP: 0.9 },
57
+ high: { temperature: 1.0, maxTokens: 16384, topP: 1.0 },
58
+ };
59
+ export class EffortLevelManager {
60
+ level;
61
+ constructor(level) {
62
+ this.level = level ?? 'medium';
63
+ }
64
+ setLevel(level) {
65
+ this.level = level;
66
+ logger.info(`Effort level set to: ${level}`);
67
+ }
68
+ getLevel() {
69
+ return this.level;
70
+ }
71
+ static fromEnv() {
72
+ const envLevel = process.env.EFFORT_LEVEL?.toLowerCase();
73
+ if (envLevel === 'low' || envLevel === 'medium' || envLevel === 'high') {
74
+ return envLevel;
75
+ }
76
+ return 'medium';
77
+ }
78
+ getModelParams() {
79
+ return { ...EFFORT_PARAMS[this.level] };
80
+ }
81
+ }
82
+ // ============================================================================
83
+ // 3. Auto-Compact Threshold
84
+ // ============================================================================
85
+ export class AutoCompactConfig {
86
+ thresholdPercent;
87
+ constructor(threshold) {
88
+ this.thresholdPercent = threshold ?? 80;
89
+ }
90
+ setThreshold(percent) {
91
+ if (percent < 0 || percent > 100) {
92
+ throw new Error('Threshold must be between 0 and 100');
93
+ }
94
+ this.thresholdPercent = percent;
95
+ logger.info(`Auto-compact threshold set to: ${percent}%`);
96
+ }
97
+ getThreshold() {
98
+ return this.thresholdPercent;
99
+ }
100
+ static fromEnv() {
101
+ const envVal = process.env.AUTO_COMPACT_THRESHOLD;
102
+ if (envVal) {
103
+ const parsed = parseInt(envVal, 10);
104
+ if (!isNaN(parsed) && parsed >= 0 && parsed <= 100) {
105
+ return parsed;
106
+ }
107
+ }
108
+ return 80;
109
+ }
110
+ shouldCompact(currentUsage, maxCapacity) {
111
+ if (maxCapacity <= 0)
112
+ return false;
113
+ const usagePercent = (currentUsage / maxCapacity) * 100;
114
+ return usagePercent >= this.thresholdPercent;
115
+ }
116
+ getUsagePercent(current, max) {
117
+ if (max <= 0)
118
+ return 0;
119
+ return Math.round((current / max) * 100 * 100) / 100;
120
+ }
121
+ }
122
+ const DEFAULT_FALLBACK_CONFIG = {
123
+ primaryModel: 'grok-3',
124
+ fallbackModel: 'grok-3-mini',
125
+ triggerOnOverload: true,
126
+ triggerOnError: true,
127
+ triggerOnTimeout: true,
128
+ timeoutMs: 30000,
129
+ };
130
+ export class FallbackModelManager {
131
+ config;
132
+ fallbackActive = false;
133
+ fallbackCount = 0;
134
+ constructor(config) {
135
+ this.config = { ...DEFAULT_FALLBACK_CONFIG, ...config };
136
+ }
137
+ shouldFallback(error) {
138
+ if (this.fallbackActive)
139
+ return false;
140
+ if (this.config.triggerOnOverload && (error.status === 429 || error.code === 'rate_limit_exceeded')) {
141
+ return true;
142
+ }
143
+ if (this.config.triggerOnError && error.status && error.status >= 500) {
144
+ return true;
145
+ }
146
+ if (this.config.triggerOnTimeout && (error.code === 'ETIMEDOUT' || error.code === 'ESOCKETTIMEDOUT' || error.message?.includes('timeout'))) {
147
+ return true;
148
+ }
149
+ return false;
150
+ }
151
+ getCurrentModel() {
152
+ return this.fallbackActive ? this.config.fallbackModel : this.config.primaryModel;
153
+ }
154
+ activateFallback() {
155
+ this.fallbackActive = true;
156
+ this.fallbackCount++;
157
+ logger.warn(`Fallback activated: using ${this.config.fallbackModel} (count: ${this.fallbackCount})`);
158
+ }
159
+ deactivateFallback() {
160
+ this.fallbackActive = false;
161
+ logger.info(`Fallback deactivated: returning to ${this.config.primaryModel}`);
162
+ }
163
+ isFallbackActive() {
164
+ return this.fallbackActive;
165
+ }
166
+ getFallbackCount() {
167
+ return this.fallbackCount;
168
+ }
169
+ getConfig() {
170
+ return { ...this.config };
171
+ }
172
+ }
173
+ // ============================================================================
174
+ // 5. Config Backup Rotation
175
+ // ============================================================================
176
+ export class ConfigBackupRotation {
177
+ maxBackups;
178
+ backupDir;
179
+ constructor(backupDir, maxBackups) {
180
+ this.backupDir = backupDir;
181
+ this.maxBackups = maxBackups ?? 5;
182
+ }
183
+ createBackup(configPath) {
184
+ if (!fs.existsSync(this.backupDir)) {
185
+ fs.mkdirSync(this.backupDir, { recursive: true });
186
+ }
187
+ const configName = path.basename(configPath);
188
+ const timestamp = Date.now();
189
+ const backupPath = path.join(this.backupDir, `${configName}.${timestamp}.bak`);
190
+ fs.copyFileSync(configPath, backupPath);
191
+ logger.info(`Backup created: ${backupPath}`);
192
+ this.rotateBackups(configName);
193
+ return backupPath;
194
+ }
195
+ listBackups(configName) {
196
+ if (!fs.existsSync(this.backupDir))
197
+ return [];
198
+ const files = fs.readdirSync(this.backupDir);
199
+ const pattern = new RegExp(`^${configName.replace(/\./g, '\\.')}\\.(\\d+)\\.bak$`);
200
+ return files
201
+ .filter(f => pattern.test(f))
202
+ .map(f => {
203
+ const match = f.match(pattern);
204
+ return {
205
+ path: path.join(this.backupDir, f),
206
+ timestamp: parseInt(match[1], 10),
207
+ };
208
+ })
209
+ .sort((a, b) => b.timestamp - a.timestamp);
210
+ }
211
+ rotateBackups(configName) {
212
+ const backups = this.listBackups(configName);
213
+ let deletedCount = 0;
214
+ if (backups.length > this.maxBackups) {
215
+ const toDelete = backups.slice(this.maxBackups);
216
+ for (const backup of toDelete) {
217
+ try {
218
+ fs.unlinkSync(backup.path);
219
+ deletedCount++;
220
+ }
221
+ catch (error) {
222
+ logger.error(`Failed to delete backup: ${backup.path}`, error);
223
+ }
224
+ }
225
+ }
226
+ return deletedCount;
227
+ }
228
+ restoreBackup(backupPath, targetPath) {
229
+ try {
230
+ if (!fs.existsSync(backupPath)) {
231
+ logger.error(`Backup not found: ${backupPath}`);
232
+ return false;
233
+ }
234
+ const targetDir = path.dirname(targetPath);
235
+ if (!fs.existsSync(targetDir)) {
236
+ fs.mkdirSync(targetDir, { recursive: true });
237
+ }
238
+ fs.copyFileSync(backupPath, targetPath);
239
+ logger.info(`Restored backup from ${backupPath} to ${targetPath}`);
240
+ return true;
241
+ }
242
+ catch (error) {
243
+ logger.error('Failed to restore backup', error);
244
+ return false;
245
+ }
246
+ }
247
+ getLatestBackup(configName) {
248
+ const backups = this.listBackups(configName);
249
+ return backups.length > 0 ? backups[0].path : null;
250
+ }
251
+ getMaxBackups() {
252
+ return this.maxBackups;
253
+ }
254
+ }
255
+ export class DevcontainerManager {
256
+ config = null;
257
+ constructor() { }
258
+ detect() {
259
+ const paths = [
260
+ '.devcontainer/devcontainer.json',
261
+ '.devcontainer.json',
262
+ ];
263
+ return paths.some(p => fs.existsSync(p));
264
+ }
265
+ loadConfig(configPath) {
266
+ const searchPaths = configPath
267
+ ? [configPath]
268
+ : ['.devcontainer/devcontainer.json', '.devcontainer.json'];
269
+ for (const p of searchPaths) {
270
+ try {
271
+ if (fs.existsSync(p)) {
272
+ const raw = fs.readFileSync(p, 'utf-8');
273
+ const parsed = JSON.parse(raw);
274
+ this.config = {
275
+ name: parsed.name ?? 'devcontainer',
276
+ image: parsed.image,
277
+ dockerFile: parsed.dockerFile ?? parsed.build?.dockerfile,
278
+ features: parsed.features ?? {},
279
+ forwardPorts: parsed.forwardPorts ?? [],
280
+ postCreateCommand: parsed.postCreateCommand,
281
+ remoteUser: parsed.remoteUser,
282
+ };
283
+ logger.info(`Devcontainer config loaded from: ${p}`);
284
+ return this.config;
285
+ }
286
+ }
287
+ catch (error) {
288
+ logger.error(`Failed to load devcontainer config from: ${p}`, error);
289
+ }
290
+ }
291
+ return null;
292
+ }
293
+ generateConfig(options) {
294
+ const config = {
295
+ name: options.name ?? 'code-buddy-dev',
296
+ image: options.image,
297
+ dockerFile: options.dockerFile,
298
+ features: options.features ?? {},
299
+ forwardPorts: options.forwardPorts ?? [],
300
+ postCreateCommand: options.postCreateCommand,
301
+ remoteUser: options.remoteUser ?? 'node',
302
+ };
303
+ this.config = config;
304
+ return config;
305
+ }
306
+ isInsideDevcontainer() {
307
+ return !!process.env.REMOTE_CONTAINERS || !!process.env.CODESPACES || !!process.env.REMOTE_CONTAINERS_IPC;
308
+ }
309
+ getContainerName() {
310
+ return this.config?.name ?? null;
311
+ }
312
+ getForwardedPorts() {
313
+ return this.config?.forwardPorts ?? [];
314
+ }
315
+ serializeConfig(config) {
316
+ const output = { name: config.name };
317
+ if (config.image)
318
+ output.image = config.image;
319
+ if (config.dockerFile)
320
+ output.dockerFile = config.dockerFile;
321
+ if (Object.keys(config.features).length > 0)
322
+ output.features = config.features;
323
+ if (config.forwardPorts.length > 0)
324
+ output.forwardPorts = config.forwardPorts;
325
+ if (config.postCreateCommand)
326
+ output.postCreateCommand = config.postCreateCommand;
327
+ if (config.remoteUser)
328
+ output.remoteUser = config.remoteUser;
329
+ return JSON.stringify(output, null, 2);
330
+ }
331
+ }
332
+ const ALL_SOURCES = ['user', 'project', 'local', 'enterprise', 'env'];
333
+ export class SettingSourceManager {
334
+ enabledSources;
335
+ allSources;
336
+ constructor(sources) {
337
+ this.allSources = [...ALL_SOURCES];
338
+ this.enabledSources = new Set(sources ?? ALL_SOURCES);
339
+ }
340
+ static fromFlag(flag) {
341
+ const parts = flag.split(',').map(s => s.trim()).filter(Boolean);
342
+ const valid = parts.filter(s => ALL_SOURCES.includes(s));
343
+ return new SettingSourceManager(valid.length > 0 ? valid : undefined);
344
+ }
345
+ isSourceEnabled(source) {
346
+ return this.enabledSources.has(source);
347
+ }
348
+ enableSource(source) {
349
+ this.enabledSources.add(source);
350
+ }
351
+ disableSource(source) {
352
+ this.enabledSources.delete(source);
353
+ }
354
+ getEnabledSources() {
355
+ return this.allSources.filter(s => this.enabledSources.has(s));
356
+ }
357
+ getAllSources() {
358
+ return [...this.allSources];
359
+ }
360
+ toFlag() {
361
+ return this.getEnabledSources().join(',');
362
+ }
363
+ }
364
+ //# sourceMappingURL=advanced-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced-config.js","sourceRoot":"","sources":["../../src/config/advanced-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Enterprise Managed Policies
3
+ *
4
+ * Reads organization-level policies from system paths to enforce
5
+ * tool restrictions, command restrictions, cost limits, and model allowlists.
6
+ *
7
+ * Policy files:
8
+ * - /etc/codebuddy/managed-settings.json (Linux system-wide)
9
+ * - ~/.codebuddy/managed-settings.json (fallback for testing)
10
+ */
11
+ export interface ManagedPoliciesConfig {
12
+ allowManagedPermissionRulesOnly: boolean;
13
+ allowManagedHooksOnly: boolean;
14
+ disallowedTools: string[];
15
+ disallowedCommands: string[];
16
+ maxSessionCost?: number;
17
+ allowedModels?: string[];
18
+ }
19
+ export declare class ManagedPoliciesManager {
20
+ private policies;
21
+ private managed;
22
+ private systemPath;
23
+ private userPath;
24
+ constructor(systemPath?: string, userPath?: string);
25
+ /**
26
+ * Load policies from managed settings files.
27
+ * System path takes priority over user path.
28
+ */
29
+ loadPolicies(): void;
30
+ private tryLoadFrom;
31
+ /**
32
+ * Check if a tool is allowed by managed policies
33
+ */
34
+ isToolAllowed(toolName: string): boolean;
35
+ /**
36
+ * Check if a command is allowed by managed policies.
37
+ * Checks if any disallowed command pattern appears in the command string.
38
+ */
39
+ isCommandAllowed(command: string): boolean;
40
+ /**
41
+ * Get the current policies
42
+ */
43
+ getPolicies(): ManagedPoliciesConfig;
44
+ /**
45
+ * Check if managed policies are active (file exists and was loaded)
46
+ */
47
+ isManaged(): boolean;
48
+ }
49
+ export declare function getManagedPoliciesManager(systemPath?: string, userPath?: string): ManagedPoliciesManager;
50
+ export declare function resetManagedPolicies(): void;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Enterprise Managed Policies
3
+ *
4
+ * Reads organization-level policies from system paths to enforce
5
+ * tool restrictions, command restrictions, cost limits, and model allowlists.
6
+ *
7
+ * Policy files:
8
+ * - /etc/codebuddy/managed-settings.json (Linux system-wide)
9
+ * - ~/.codebuddy/managed-settings.json (fallback for testing)
10
+ */
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import os from 'os';
14
+ import { logger } from '../utils/logger.js';
15
+ // ============================================================================
16
+ // Constants
17
+ // ============================================================================
18
+ const SYSTEM_MANAGED_PATH = '/etc/codebuddy/managed-settings.json';
19
+ const USER_MANAGED_PATH = path.join(os.homedir(), '.codebuddy', 'managed-settings.json');
20
+ const DEFAULT_POLICIES = {
21
+ allowManagedPermissionRulesOnly: false,
22
+ allowManagedHooksOnly: false,
23
+ disallowedTools: [],
24
+ disallowedCommands: [],
25
+ };
26
+ // ============================================================================
27
+ // ManagedPoliciesManager
28
+ // ============================================================================
29
+ export class ManagedPoliciesManager {
30
+ policies = { ...DEFAULT_POLICIES };
31
+ managed = false;
32
+ systemPath;
33
+ userPath;
34
+ constructor(systemPath, userPath) {
35
+ this.systemPath = systemPath ?? SYSTEM_MANAGED_PATH;
36
+ this.userPath = userPath ?? USER_MANAGED_PATH;
37
+ this.loadPolicies();
38
+ }
39
+ /**
40
+ * Load policies from managed settings files.
41
+ * System path takes priority over user path.
42
+ */
43
+ loadPolicies() {
44
+ // Try system path first
45
+ const loaded = this.tryLoadFrom(this.systemPath) || this.tryLoadFrom(this.userPath);
46
+ if (!loaded) {
47
+ this.policies = { ...DEFAULT_POLICIES };
48
+ this.managed = false;
49
+ logger.debug('No managed policies found', { source: 'ManagedPoliciesManager' });
50
+ }
51
+ }
52
+ tryLoadFrom(filePath) {
53
+ try {
54
+ if (!fs.existsSync(filePath)) {
55
+ return false;
56
+ }
57
+ const content = fs.readFileSync(filePath, 'utf-8');
58
+ const parsed = JSON.parse(content);
59
+ this.policies = {
60
+ allowManagedPermissionRulesOnly: parsed.allowManagedPermissionRulesOnly ?? false,
61
+ allowManagedHooksOnly: parsed.allowManagedHooksOnly ?? false,
62
+ disallowedTools: Array.isArray(parsed.disallowedTools) ? parsed.disallowedTools : [],
63
+ disallowedCommands: Array.isArray(parsed.disallowedCommands) ? parsed.disallowedCommands : [],
64
+ maxSessionCost: typeof parsed.maxSessionCost === 'number' ? parsed.maxSessionCost : undefined,
65
+ allowedModels: Array.isArray(parsed.allowedModels) ? parsed.allowedModels : undefined,
66
+ };
67
+ this.managed = true;
68
+ logger.info(`Loaded managed policies from ${filePath}`, { source: 'ManagedPoliciesManager' });
69
+ return true;
70
+ }
71
+ catch (error) {
72
+ logger.warn(`Failed to load managed policies from ${filePath}: ${error}`, { source: 'ManagedPoliciesManager' });
73
+ return false;
74
+ }
75
+ }
76
+ /**
77
+ * Check if a tool is allowed by managed policies
78
+ */
79
+ isToolAllowed(toolName) {
80
+ return !this.policies.disallowedTools.includes(toolName);
81
+ }
82
+ /**
83
+ * Check if a command is allowed by managed policies.
84
+ * Checks if any disallowed command pattern appears in the command string.
85
+ */
86
+ isCommandAllowed(command) {
87
+ for (const disallowed of this.policies.disallowedCommands) {
88
+ if (command.includes(disallowed)) {
89
+ return false;
90
+ }
91
+ }
92
+ return true;
93
+ }
94
+ /**
95
+ * Get the current policies
96
+ */
97
+ getPolicies() {
98
+ return { ...this.policies };
99
+ }
100
+ /**
101
+ * Check if managed policies are active (file exists and was loaded)
102
+ */
103
+ isManaged() {
104
+ return this.managed;
105
+ }
106
+ }
107
+ // ============================================================================
108
+ // Singleton
109
+ // ============================================================================
110
+ let instance = null;
111
+ export function getManagedPoliciesManager(systemPath, userPath) {
112
+ if (!instance || systemPath || userPath) {
113
+ instance = new ManagedPoliciesManager(systemPath, userPath);
114
+ }
115
+ return instance;
116
+ }
117
+ export function resetManagedPolicies() {
118
+ instance = null;
119
+ }
120
+ //# sourceMappingURL=managed-policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-policies.js","sourceRoot":"","sources":["../../src/config/managed-policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Settings Hierarchy
3
+ *
4
+ * Implements a multi-level settings system with clear priority ordering:
5
+ * 1. ManagedPolicy (highest) - /etc/codebuddy/managed-settings.json
6
+ * 2. CliFlags - command-line arguments
7
+ * 3. ProjectLocal - .codebuddy/settings.local.json
8
+ * 4. Project - .codebuddy/settings.json
9
+ * 5. User - ~/.codebuddy/settings.json
10
+ * 6. Default (lowest) - built-in defaults
11
+ */
12
+ export declare enum SettingsLevel {
13
+ ManagedPolicy = 0,
14
+ CliFlags = 1,
15
+ ProjectLocal = 2,
16
+ Project = 3,
17
+ User = 4,
18
+ Default = 5
19
+ }
20
+ export interface SettingsWithSource {
21
+ value: unknown;
22
+ source: SettingsLevel;
23
+ }
24
+ export declare class SettingsHierarchy {
25
+ private levels;
26
+ private projectDir;
27
+ constructor(projectDir?: string);
28
+ /**
29
+ * Load settings from all levels
30
+ */
31
+ loadAllLevels(cliFlags?: Record<string, unknown>, projectDir?: string): void;
32
+ /**
33
+ * Get the effective value for a key (highest-priority level wins)
34
+ */
35
+ get(key: string): unknown;
36
+ /**
37
+ * Get the value and its source level
38
+ */
39
+ getWithSource(key: string): SettingsWithSource | undefined;
40
+ /**
41
+ * Check if a key at a given level is overridden by a higher-priority level
42
+ */
43
+ isOverridden(key: string, level: SettingsLevel): boolean;
44
+ /**
45
+ * Get all settings merged (highest priority wins)
46
+ */
47
+ getAllSettings(): Record<string, unknown>;
48
+ /**
49
+ * Get the level name for display
50
+ */
51
+ getLevelName(level: SettingsLevel): string;
52
+ private getManagedPath;
53
+ private getUserPath;
54
+ private getProjectPath;
55
+ private getProjectLocalPath;
56
+ private loadJsonFile;
57
+ }
58
+ export declare function getSettingsHierarchy(projectDir?: string): SettingsHierarchy;
59
+ export declare function resetSettingsHierarchy(): void;