@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,144 @@
1
+ /**
2
+ * Partial Summarizer
3
+ *
4
+ * Summarizes a portion of the conversation from a given index,
5
+ * using keyword extraction rather than LLM calls for fast,
6
+ * deterministic summarization.
7
+ */
8
+ import { logger } from '../utils/logger.js';
9
+ // ============================================================================
10
+ // PartialSummarizer
11
+ // ============================================================================
12
+ let instance = null;
13
+ export class PartialSummarizer {
14
+ lastMessageCount = 0;
15
+ lastTokensSaved = 0;
16
+ static getInstance() {
17
+ if (!instance) {
18
+ instance = new PartialSummarizer();
19
+ }
20
+ return instance;
21
+ }
22
+ static resetInstance() {
23
+ instance = null;
24
+ }
25
+ /**
26
+ * Estimate token count for a string (rough: ~4 chars per token)
27
+ */
28
+ estimateTokens(text) {
29
+ return Math.ceil(text.length / 4);
30
+ }
31
+ /**
32
+ * Extract text content from a message object
33
+ */
34
+ extractContent(msg) {
35
+ if (typeof msg === 'string')
36
+ return msg;
37
+ if (typeof msg === 'object' && msg !== null && 'content' in msg) {
38
+ return String(msg.content);
39
+ }
40
+ return '';
41
+ }
42
+ /**
43
+ * Extract role from a message object
44
+ */
45
+ extractRole(msg) {
46
+ if (typeof msg === 'object' && msg !== null && 'role' in msg) {
47
+ return String(msg.role);
48
+ }
49
+ return 'unknown';
50
+ }
51
+ summarizeFrom(messages, fromIndex) {
52
+ if (fromIndex < 0 || fromIndex >= messages.length) {
53
+ return '';
54
+ }
55
+ const subset = messages.slice(fromIndex);
56
+ return this.generateSummary(subset);
57
+ }
58
+ summarizeRange(messages, startIndex, endIndex) {
59
+ const start = Math.max(0, startIndex);
60
+ const end = Math.min(messages.length, endIndex);
61
+ if (start >= end) {
62
+ return '';
63
+ }
64
+ const subset = messages.slice(start, end);
65
+ return this.generateSummary(subset);
66
+ }
67
+ generateSummary(messagesToSummarize) {
68
+ if (!messagesToSummarize || messagesToSummarize.length === 0) {
69
+ this.lastMessageCount = 0;
70
+ this.lastTokensSaved = 0;
71
+ return '';
72
+ }
73
+ this.lastMessageCount = messagesToSummarize.length;
74
+ // Collect all content
75
+ const allContent = [];
76
+ const roleGroups = new Map();
77
+ for (const msg of messagesToSummarize) {
78
+ const content = this.extractContent(msg);
79
+ const role = this.extractRole(msg);
80
+ if (content) {
81
+ allContent.push(content);
82
+ if (!roleGroups.has(role)) {
83
+ roleGroups.set(role, []);
84
+ }
85
+ roleGroups.get(role).push(content);
86
+ }
87
+ }
88
+ const fullText = allContent.join(' ');
89
+ const originalTokens = this.estimateTokens(fullText);
90
+ // Extract key topics via word frequency
91
+ const stopWords = new Set([
92
+ 'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'had',
93
+ 'her', 'was', 'one', 'our', 'out', 'has', 'his', 'how', 'its', 'may',
94
+ 'who', 'did', 'get', 'got', 'let', 'say', 'she', 'too', 'use', 'way',
95
+ 'this', 'that', 'with', 'from', 'have', 'been', 'will', 'would', 'could',
96
+ 'should', 'what', 'when', 'where', 'which', 'there', 'their', 'about',
97
+ ]);
98
+ const words = fullText
99
+ .toLowerCase()
100
+ .replace(/[^a-z0-9\s]/g, ' ')
101
+ .split(/\s+/)
102
+ .filter(w => w.length >= 3 && !stopWords.has(w));
103
+ const freq = new Map();
104
+ for (const w of words) {
105
+ freq.set(w, (freq.get(w) || 0) + 1);
106
+ }
107
+ const topKeywords = [...freq.entries()]
108
+ .sort((a, b) => b[1] - a[1])
109
+ .slice(0, 10)
110
+ .map(([w]) => w);
111
+ // Build summary
112
+ const lines = [];
113
+ lines.push(`[Summary of ${messagesToSummarize.length} messages]`);
114
+ if (topKeywords.length > 0) {
115
+ lines.push(`Key topics: ${topKeywords.join(', ')}`);
116
+ }
117
+ for (const [role, contents] of roleGroups) {
118
+ lines.push(`${role}: ${contents.length} message(s)`);
119
+ }
120
+ const summary = lines.join('\n');
121
+ const summaryTokens = this.estimateTokens(summary);
122
+ this.lastTokensSaved = Math.max(0, originalTokens - summaryTokens);
123
+ logger.debug('Generated partial summary', {
124
+ messageCount: messagesToSummarize.length,
125
+ originalTokens,
126
+ summaryTokens,
127
+ tokensSaved: this.lastTokensSaved,
128
+ });
129
+ return summary;
130
+ }
131
+ getMessageCount() {
132
+ return this.lastMessageCount;
133
+ }
134
+ getTokensSaved() {
135
+ return this.lastTokensSaved;
136
+ }
137
+ }
138
+ export function getPartialSummarizer() {
139
+ return PartialSummarizer.getInstance();
140
+ }
141
+ export function resetPartialSummarizer() {
142
+ PartialSummarizer.resetInstance();
143
+ }
144
+ //# sourceMappingURL=partial-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-summarizer.js","sourceRoot":"","sources":["../../src/context/partial-summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Desktop App Scaffold
3
+ *
4
+ * Manages desktop application windows and integration with
5
+ * the Code Buddy terminal experience. Supports Electron and Tauri
6
+ * frameworks with multi-window management.
7
+ */
8
+ export interface DesktopAppConfig {
9
+ platform: 'darwin' | 'win32' | 'linux';
10
+ framework: 'electron' | 'tauri';
11
+ autoUpdate: boolean;
12
+ multiWindow: boolean;
13
+ cloudIntegration: boolean;
14
+ }
15
+ export interface DesktopWindow {
16
+ id: string;
17
+ title: string;
18
+ sessionId?: string;
19
+ type: 'main' | 'diff' | 'settings' | 'session-picker';
20
+ bounds: {
21
+ x: number;
22
+ y: number;
23
+ width: number;
24
+ height: number;
25
+ };
26
+ focused: boolean;
27
+ }
28
+ export declare class DesktopAppManager {
29
+ private config;
30
+ private windows;
31
+ private windowCounter;
32
+ constructor(config?: Partial<DesktopAppConfig>);
33
+ createWindow(type: DesktopWindow['type'], options?: Partial<DesktopWindow>): DesktopWindow;
34
+ getWindow(id: string): DesktopWindow | null;
35
+ listWindows(): DesktopWindow[];
36
+ closeWindow(id: string): boolean;
37
+ focusWindow(id: string): boolean;
38
+ openDiffView(sessionId: string, files: string[]): DesktopWindow;
39
+ openSessionPicker(): DesktopWindow;
40
+ getInstallerConfig(): Record<string, unknown>;
41
+ getPlatform(): string;
42
+ isDesktopAvailable(): boolean;
43
+ getWindowCount(): number;
44
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Desktop App Scaffold
3
+ *
4
+ * Manages desktop application windows and integration with
5
+ * the Code Buddy terminal experience. Supports Electron and Tauri
6
+ * frameworks with multi-window management.
7
+ */
8
+ import { logger } from '../utils/logger.js';
9
+ const DEFAULT_BOUNDS = { x: 100, y: 100, width: 1200, height: 800 };
10
+ const DEFAULT_TITLES = {
11
+ main: 'Code Buddy',
12
+ diff: 'Diff Viewer',
13
+ settings: 'Settings',
14
+ 'session-picker': 'Session Picker',
15
+ };
16
+ export class DesktopAppManager {
17
+ config;
18
+ windows;
19
+ windowCounter;
20
+ constructor(config) {
21
+ this.config = {
22
+ platform: process.platform || 'linux',
23
+ framework: 'electron',
24
+ autoUpdate: true,
25
+ multiWindow: true,
26
+ cloudIntegration: false,
27
+ ...config,
28
+ };
29
+ this.windows = new Map();
30
+ this.windowCounter = 0;
31
+ logger.debug('DesktopAppManager initialized', { platform: this.config.platform, framework: this.config.framework });
32
+ }
33
+ createWindow(type, options) {
34
+ if (!this.config.multiWindow && this.windows.size > 0 && type !== 'main') {
35
+ throw new Error('Multi-window is disabled. Only one window allowed.');
36
+ }
37
+ this.windowCounter++;
38
+ const id = options?.id || `window-${this.windowCounter}`;
39
+ // Unfocus all existing windows
40
+ for (const w of this.windows.values()) {
41
+ w.focused = false;
42
+ }
43
+ const window = {
44
+ id,
45
+ title: options?.title || DEFAULT_TITLES[type] || 'Code Buddy',
46
+ sessionId: options?.sessionId,
47
+ type,
48
+ bounds: options?.bounds || { ...DEFAULT_BOUNDS },
49
+ focused: true,
50
+ };
51
+ this.windows.set(id, window);
52
+ logger.info('Window created', { id, type });
53
+ return { ...window };
54
+ }
55
+ getWindow(id) {
56
+ const w = this.windows.get(id);
57
+ return w ? { ...w } : null;
58
+ }
59
+ listWindows() {
60
+ return Array.from(this.windows.values()).map(w => ({ ...w }));
61
+ }
62
+ closeWindow(id) {
63
+ if (!this.windows.has(id)) {
64
+ return false;
65
+ }
66
+ this.windows.delete(id);
67
+ logger.info('Window closed', { id });
68
+ return true;
69
+ }
70
+ focusWindow(id) {
71
+ const window = this.windows.get(id);
72
+ if (!window) {
73
+ return false;
74
+ }
75
+ for (const w of this.windows.values()) {
76
+ w.focused = false;
77
+ }
78
+ window.focused = true;
79
+ logger.debug('Window focused', { id });
80
+ return true;
81
+ }
82
+ openDiffView(sessionId, files) {
83
+ return this.createWindow('diff', {
84
+ title: `Diff: ${files.length} file(s)`,
85
+ sessionId,
86
+ });
87
+ }
88
+ openSessionPicker() {
89
+ return this.createWindow('session-picker');
90
+ }
91
+ getInstallerConfig() {
92
+ const base = {
93
+ appId: 'com.codebuddy.desktop',
94
+ productName: 'Code Buddy',
95
+ framework: this.config.framework,
96
+ autoUpdate: this.config.autoUpdate,
97
+ };
98
+ if (this.config.framework === 'electron') {
99
+ return {
100
+ ...base,
101
+ electronVersion: '28.0.0',
102
+ build: {
103
+ appId: base.appId,
104
+ productName: base.productName,
105
+ directories: { output: 'dist-desktop' },
106
+ mac: { category: 'public.app-category.developer-tools' },
107
+ win: { target: ['nsis', 'portable'] },
108
+ linux: { target: ['AppImage', 'deb'] },
109
+ },
110
+ };
111
+ }
112
+ return {
113
+ ...base,
114
+ tauriVersion: '2.0.0',
115
+ build: {
116
+ distDir: '../dist',
117
+ devPath: 'http://localhost:3000',
118
+ bundle: {
119
+ identifier: base.appId,
120
+ targets: 'all',
121
+ },
122
+ },
123
+ };
124
+ }
125
+ getPlatform() {
126
+ return this.config.platform;
127
+ }
128
+ isDesktopAvailable() {
129
+ // In a real implementation, check if desktop framework is installed
130
+ return this.config.framework === 'electron' || this.config.framework === 'tauri';
131
+ }
132
+ getWindowCount() {
133
+ return this.windows.size;
134
+ }
135
+ }
136
+ //# sourceMappingURL=desktop-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-app.js","sourceRoot":"","sources":["../../src/desktop/desktop-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Worktree Multi-Session Manager
3
+ *
4
+ * Links git worktrees to Code Buddy sessions for parallel branch work.
5
+ * Singleton pattern for global coordination.
6
+ */
7
+ export interface WorktreeSession {
8
+ branch: string;
9
+ worktreePath: string;
10
+ sessionId: string;
11
+ createdAt: number;
12
+ }
13
+ export declare class WorktreeSessionManager {
14
+ private static instance;
15
+ private sessions;
16
+ constructor();
17
+ static getInstance(): WorktreeSessionManager;
18
+ static resetInstance(): void;
19
+ createWorktreeSession(branch: string, basePath: string): WorktreeSession;
20
+ listWorktreeSessions(): WorktreeSession[];
21
+ getSessionForWorktree(worktreePath: string): WorktreeSession | undefined;
22
+ cleanupWorktree(branch: string): boolean;
23
+ isWorktreeActive(branch: string): boolean;
24
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Worktree Multi-Session Manager
3
+ *
4
+ * Links git worktrees to Code Buddy sessions for parallel branch work.
5
+ * Singleton pattern for global coordination.
6
+ */
7
+ import { execSync } from 'child_process';
8
+ import * as path from 'path';
9
+ import * as fs from 'fs';
10
+ import { logger } from '../utils/logger.js';
11
+ // ============================================================================
12
+ // WorktreeSessionManager
13
+ // ============================================================================
14
+ export class WorktreeSessionManager {
15
+ static instance = null;
16
+ sessions = new Map();
17
+ constructor() {
18
+ logger.debug('WorktreeSessionManager initialized');
19
+ }
20
+ static getInstance() {
21
+ if (!WorktreeSessionManager.instance) {
22
+ WorktreeSessionManager.instance = new WorktreeSessionManager();
23
+ }
24
+ return WorktreeSessionManager.instance;
25
+ }
26
+ static resetInstance() {
27
+ WorktreeSessionManager.instance = null;
28
+ }
29
+ createWorktreeSession(branch, basePath) {
30
+ const worktreePath = path.join(basePath, '.worktrees', branch);
31
+ // Create the worktree directory
32
+ fs.mkdirSync(path.dirname(worktreePath), { recursive: true });
33
+ try {
34
+ execSync(`git worktree add "${worktreePath}" "${branch}"`, {
35
+ cwd: basePath,
36
+ stdio: 'pipe',
37
+ });
38
+ }
39
+ catch (err) {
40
+ // If worktree already exists or branch doesn't exist, create with -b
41
+ try {
42
+ execSync(`git worktree add -b "${branch}" "${worktreePath}"`, {
43
+ cwd: basePath,
44
+ stdio: 'pipe',
45
+ });
46
+ }
47
+ catch (innerErr) {
48
+ logger.warn(`Failed to create worktree for ${branch}`);
49
+ throw innerErr;
50
+ }
51
+ }
52
+ const session = {
53
+ branch,
54
+ worktreePath,
55
+ sessionId: `wt-${branch}-${Date.now()}`,
56
+ createdAt: Date.now(),
57
+ };
58
+ this.sessions.set(branch, session);
59
+ logger.info(`Worktree session created: ${branch} at ${worktreePath}`);
60
+ return session;
61
+ }
62
+ listWorktreeSessions() {
63
+ return Array.from(this.sessions.values());
64
+ }
65
+ getSessionForWorktree(worktreePath) {
66
+ for (const session of this.sessions.values()) {
67
+ if (session.worktreePath === worktreePath) {
68
+ return session;
69
+ }
70
+ }
71
+ return undefined;
72
+ }
73
+ cleanupWorktree(branch) {
74
+ const session = this.sessions.get(branch);
75
+ if (!session)
76
+ return false;
77
+ try {
78
+ execSync(`git worktree remove "${session.worktreePath}" --force`, {
79
+ stdio: 'pipe',
80
+ });
81
+ }
82
+ catch {
83
+ logger.warn(`Failed to remove worktree for ${branch}`);
84
+ }
85
+ this.sessions.delete(branch);
86
+ logger.info(`Worktree session cleaned up: ${branch}`);
87
+ return true;
88
+ }
89
+ isWorktreeActive(branch) {
90
+ return this.sessions.has(branch);
91
+ }
92
+ }
93
+ //# sourceMappingURL=worktree-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-sessions.js","sourceRoot":"","sources":["../../src/git/worktree-sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,GAAkC,IAAI,CAAC;IACtD,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE3D;QACE,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,sBAAsB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzC,CAAC;IAED,qBAAqB,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAE/D,gCAAgC;QAChC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,QAAQ,CAAC,qBAAqB,YAAY,MAAM,MAAM,GAAG,EAAE;gBACzD,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qEAAqE;YACrE,IAAI,CAAC;gBACH,QAAQ,CAAC,wBAAwB,MAAM,MAAM,YAAY,GAAG,EAAE;oBAC5D,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;gBACvD,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAoB;YAC/B,MAAM;YACN,YAAY;YACZ,SAAS,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YACvC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,OAAO,YAAY,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oBAAoB;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,qBAAqB,CAAC,YAAoB;QACxC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,CAAC;YACH,QAAQ,CAAC,wBAAwB,OAAO,CAAC,YAAY,WAAW,EAAE;gBAChE,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Advanced Hook System
3
+ *
4
+ * Extends the basic hook system with Claude Code-like capabilities:
5
+ * - Command hooks: run shell commands, parse JSON stdout for decisions
6
+ * - Prompt hooks: LLM-evaluated hooks (stub - returns allow with stored prompt)
7
+ * - Agent hooks: spawns subagent evaluation (stub - returns allow)
8
+ *
9
+ * Supports event matching with regex matchers, async fire-and-forget,
10
+ * one-shot hooks, and a registry for CRUD operations.
11
+ */
12
+ export type AdvancedHookType = 'command' | 'prompt' | 'agent';
13
+ export declare enum HookEvent {
14
+ PreToolUse = "PreToolUse",
15
+ PostToolUse = "PostToolUse",
16
+ PreBash = "PreBash",
17
+ PostBash = "PostBash",
18
+ PreEdit = "PreEdit",
19
+ PostEdit = "PostEdit",
20
+ SessionStart = "SessionStart",
21
+ SessionEnd = "SessionEnd",
22
+ PreCompact = "PreCompact",
23
+ Notification = "Notification",
24
+ SubagentStart = "SubagentStart",
25
+ SubagentStop = "SubagentStop",
26
+ PermissionRequest = "PermissionRequest",
27
+ TaskCompleted = "TaskCompleted"
28
+ }
29
+ export interface AdvancedHook {
30
+ name: string;
31
+ event: HookEvent;
32
+ type: AdvancedHookType;
33
+ matcher?: RegExp;
34
+ command?: string;
35
+ prompt?: string;
36
+ async?: boolean;
37
+ once?: boolean;
38
+ }
39
+ export interface HookDecision {
40
+ action: 'allow' | 'deny' | 'ask';
41
+ updatedInput?: Record<string, unknown>;
42
+ additionalContext?: string;
43
+ continue?: boolean;
44
+ }
45
+ export interface HookContext {
46
+ event: HookEvent;
47
+ toolName?: string;
48
+ input?: Record<string, unknown>;
49
+ output?: unknown;
50
+ [key: string]: unknown;
51
+ }
52
+ export declare class AdvancedHookRunner {
53
+ private workingDirectory;
54
+ private timeout;
55
+ constructor(workingDirectory?: string, timeout?: number);
56
+ /**
57
+ * Run a hook and return a decision
58
+ */
59
+ runHook(hook: AdvancedHook, context: HookContext): Promise<HookDecision>;
60
+ /**
61
+ * Fire-and-forget async hook execution
62
+ */
63
+ runHookAsync(hook: AdvancedHook, context: HookContext): Promise<void>;
64
+ /**
65
+ * Check if a hook matches a given event and optional tool name
66
+ */
67
+ matchesEvent(hook: AdvancedHook, event: HookEvent, toolName?: string): boolean;
68
+ private runCommandHook;
69
+ private runPromptHook;
70
+ private runAgentHook;
71
+ }
72
+ export declare class HookRegistry {
73
+ private hooks;
74
+ private firedOnceHooks;
75
+ /**
76
+ * Add a hook to the registry
77
+ */
78
+ addHook(hook: AdvancedHook): void;
79
+ /**
80
+ * Remove a hook by name
81
+ */
82
+ removeHook(name: string): boolean;
83
+ /**
84
+ * Get all hooks that match a given event, filtering out already-fired once hooks
85
+ */
86
+ getHooksForEvent(event: HookEvent, toolName?: string): AdvancedHook[];
87
+ /**
88
+ * Mark a once hook as fired
89
+ */
90
+ markFired(hookName: string): void;
91
+ /**
92
+ * List all registered hooks
93
+ */
94
+ listHooks(): AdvancedHook[];
95
+ /**
96
+ * Get a hook by name
97
+ */
98
+ getHook(name: string): AdvancedHook | undefined;
99
+ /**
100
+ * Clear all hooks
101
+ */
102
+ clear(): void;
103
+ /**
104
+ * Get the number of registered hooks
105
+ */
106
+ get size(): number;
107
+ }
108
+ export declare function getHookRegistry(): HookRegistry;
109
+ export declare function getAdvancedHookRunner(workingDirectory?: string): AdvancedHookRunner;
110
+ export declare function resetAdvancedHooks(): void;