@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,46 @@
1
+ /**
2
+ * Per-Sender Policies & Agents List
3
+ * Tool access control per sender identity and agent registry.
4
+ */
5
+ export interface SenderIdentity {
6
+ username?: string;
7
+ userId?: string;
8
+ phone?: string;
9
+ displayName?: string;
10
+ }
11
+ export interface SenderPolicy {
12
+ identity: SenderIdentity;
13
+ allowedTools: string[];
14
+ deniedTools: string[];
15
+ maxTurns?: number;
16
+ }
17
+ export declare class SenderPolicyManager {
18
+ private static instance;
19
+ private policies;
20
+ static getInstance(): SenderPolicyManager;
21
+ static resetInstance(): void;
22
+ addPolicy(policy: SenderPolicy): void;
23
+ removePolicy(identity: SenderIdentity): boolean;
24
+ getPolicy(identity: SenderIdentity): SenderPolicy | undefined;
25
+ isToolAllowed(identity: SenderIdentity, tool: string): boolean;
26
+ matchIdentity(sender: SenderIdentity, policy: SenderPolicy): boolean;
27
+ listPolicies(): SenderPolicy[];
28
+ clearPolicies(): void;
29
+ }
30
+ interface AgentInfo {
31
+ name: string;
32
+ description: string;
33
+ status: 'active' | 'inactive';
34
+ }
35
+ export declare class AgentListTool {
36
+ private static instance;
37
+ private agents;
38
+ static getInstance(): AgentListTool;
39
+ static resetInstance(): void;
40
+ listAgents(): AgentInfo[];
41
+ addAgent(name: string, description: string): void;
42
+ removeAgent(name: string): boolean;
43
+ getAgent(name: string): AgentInfo | undefined;
44
+ getAgentCount(): number;
45
+ }
46
+ export {};
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Per-Sender Policies & Agents List
3
+ * Tool access control per sender identity and agent registry.
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ export class SenderPolicyManager {
7
+ static instance = null;
8
+ policies = [];
9
+ static getInstance() {
10
+ if (!SenderPolicyManager.instance) {
11
+ SenderPolicyManager.instance = new SenderPolicyManager();
12
+ }
13
+ return SenderPolicyManager.instance;
14
+ }
15
+ static resetInstance() {
16
+ SenderPolicyManager.instance = null;
17
+ }
18
+ addPolicy(policy) {
19
+ // Remove existing policy for same identity
20
+ this.policies = this.policies.filter(p => !this.matchIdentity(policy.identity, p));
21
+ this.policies.push(policy);
22
+ logger.debug(`Added policy for sender: ${JSON.stringify(policy.identity)}`);
23
+ }
24
+ removePolicy(identity) {
25
+ const before = this.policies.length;
26
+ this.policies = this.policies.filter(p => !this.matchIdentity(identity, p));
27
+ return this.policies.length < before;
28
+ }
29
+ getPolicy(identity) {
30
+ return this.policies.find(p => this.matchIdentity(identity, p));
31
+ }
32
+ isToolAllowed(identity, tool) {
33
+ const policy = this.getPolicy(identity);
34
+ if (!policy)
35
+ return true; // No policy means no restrictions
36
+ if (policy.deniedTools.includes(tool))
37
+ return false;
38
+ if (policy.allowedTools.length > 0 && !policy.allowedTools.includes(tool))
39
+ return false;
40
+ return true;
41
+ }
42
+ matchIdentity(sender, policy) {
43
+ const pi = policy.identity;
44
+ if (sender.username && pi.username && sender.username === pi.username)
45
+ return true;
46
+ if (sender.userId && pi.userId && sender.userId === pi.userId)
47
+ return true;
48
+ if (sender.phone && pi.phone && sender.phone === pi.phone)
49
+ return true;
50
+ if (sender.displayName && pi.displayName && sender.displayName === pi.displayName)
51
+ return true;
52
+ return false;
53
+ }
54
+ listPolicies() {
55
+ return [...this.policies];
56
+ }
57
+ clearPolicies() {
58
+ this.policies = [];
59
+ }
60
+ }
61
+ export class AgentListTool {
62
+ static instance = null;
63
+ agents = new Map();
64
+ static getInstance() {
65
+ if (!AgentListTool.instance) {
66
+ AgentListTool.instance = new AgentListTool();
67
+ }
68
+ return AgentListTool.instance;
69
+ }
70
+ static resetInstance() {
71
+ AgentListTool.instance = null;
72
+ }
73
+ listAgents() {
74
+ return Array.from(this.agents.values());
75
+ }
76
+ addAgent(name, description) {
77
+ this.agents.set(name, { name, description, status: 'active' });
78
+ logger.debug(`Registered agent: ${name}`);
79
+ }
80
+ removeAgent(name) {
81
+ return this.agents.delete(name);
82
+ }
83
+ getAgent(name) {
84
+ return this.agents.get(name);
85
+ }
86
+ getAgentCount() {
87
+ return this.agents.size;
88
+ }
89
+ }
90
+ //# sourceMappingURL=sender-policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-policies.js","sourceRoot":"","sources":["../../src/security/sender-policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Web Control UI Dashboard
3
+ *
4
+ * Provides an HTTP-based admin dashboard for monitoring
5
+ * agent status, sessions, channels, tools, and system health.
6
+ */
7
+ export interface DashboardConfig {
8
+ port?: number;
9
+ authToken?: string;
10
+ }
11
+ export interface DashboardStatus {
12
+ running: boolean;
13
+ port: number;
14
+ uptime: number;
15
+ connectedClients: number;
16
+ }
17
+ export interface DashboardMetrics {
18
+ agent: {
19
+ status: string;
20
+ model: string;
21
+ mode: string;
22
+ };
23
+ sessions: number;
24
+ channels: string[];
25
+ tools: number;
26
+ memory: {
27
+ used: number;
28
+ total: number;
29
+ };
30
+ system: {
31
+ cpuPercent: number;
32
+ memoryPercent: number;
33
+ };
34
+ }
35
+ export declare class Dashboard {
36
+ private static instance;
37
+ private config;
38
+ private running;
39
+ private startTime;
40
+ private connectedClients;
41
+ constructor(config?: DashboardConfig);
42
+ static getInstance(config?: DashboardConfig): Dashboard;
43
+ static resetInstance(): void;
44
+ start(port?: number): void;
45
+ stop(): void;
46
+ isRunning(): boolean;
47
+ getPort(): number;
48
+ getUrl(): string;
49
+ getStatus(): DashboardStatus;
50
+ generateDashboardHtml(): string;
51
+ getMetrics(): DashboardMetrics;
52
+ setConnectedClients(count: number): void;
53
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Web Control UI Dashboard
3
+ *
4
+ * Provides an HTTP-based admin dashboard for monitoring
5
+ * agent status, sessions, channels, tools, and system health.
6
+ */
7
+ import { logger } from '../utils/logger.js';
8
+ // ============================================================================
9
+ // Dashboard
10
+ // ============================================================================
11
+ export class Dashboard {
12
+ static instance = null;
13
+ config;
14
+ running = false;
15
+ startTime = 0;
16
+ connectedClients = 0;
17
+ constructor(config) {
18
+ this.config = config || { port: 8080 };
19
+ }
20
+ static getInstance(config) {
21
+ if (!Dashboard.instance) {
22
+ Dashboard.instance = new Dashboard(config);
23
+ }
24
+ return Dashboard.instance;
25
+ }
26
+ static resetInstance() {
27
+ Dashboard.instance = null;
28
+ }
29
+ start(port) {
30
+ if (port !== undefined) {
31
+ this.config.port = port;
32
+ }
33
+ logger.info(`Starting dashboard on port ${this.config.port || 8080}`);
34
+ this.running = true;
35
+ this.startTime = Date.now();
36
+ this.connectedClients = 0;
37
+ }
38
+ stop() {
39
+ logger.info('Stopping dashboard');
40
+ this.running = false;
41
+ this.startTime = 0;
42
+ this.connectedClients = 0;
43
+ }
44
+ isRunning() {
45
+ return this.running;
46
+ }
47
+ getPort() {
48
+ return this.config.port || 8080;
49
+ }
50
+ getUrl() {
51
+ return `http://localhost:${this.getPort()}`;
52
+ }
53
+ getStatus() {
54
+ return {
55
+ running: this.running,
56
+ port: this.getPort(),
57
+ uptime: this.running ? Math.floor((Date.now() - this.startTime) / 1000) : 0,
58
+ connectedClients: this.connectedClients,
59
+ };
60
+ }
61
+ generateDashboardHtml() {
62
+ return `<!DOCTYPE html>
63
+ <html lang="en">
64
+ <head>
65
+ <meta charset="UTF-8">
66
+ <title>Code Buddy Dashboard</title>
67
+ </head>
68
+ <body>
69
+ <h1>Code Buddy Admin Dashboard</h1>
70
+ <section id="agent-status"><h2>Agent Status</h2></section>
71
+ <section id="active-sessions"><h2>Active Sessions</h2></section>
72
+ <section id="channel-status"><h2>Channel Status</h2></section>
73
+ <section id="tool-usage"><h2>Tool Usage</h2></section>
74
+ <section id="memory-stats"><h2>Memory Stats</h2></section>
75
+ <section id="system-health"><h2>System Health</h2></section>
76
+ </body>
77
+ </html>`;
78
+ }
79
+ getMetrics() {
80
+ return {
81
+ agent: { status: 'idle', model: 'grok-3', mode: 'code' },
82
+ sessions: 0,
83
+ channels: ['telegram', 'discord', 'slack'],
84
+ tools: 25,
85
+ memory: { used: 0, total: 1024 },
86
+ system: { cpuPercent: 0, memoryPercent: 0 },
87
+ };
88
+ }
89
+ setConnectedClients(count) {
90
+ this.connectedClients = count;
91
+ }
92
+ }
93
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/server/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * System Prompt Override
3
+ *
4
+ * Handles CLI flags for replacing or appending to the system prompt:
5
+ * - --system-prompt <text> → replace entire prompt
6
+ * - --system-prompt-file <path> → replace from file
7
+ * - --append-system-prompt <text> → append text to default prompt
8
+ * - --append-system-prompt-file <path> → append file contents
9
+ */
10
+ export interface OverrideOptions {
11
+ /** Replace the entire system prompt with this text */
12
+ systemPrompt?: string;
13
+ /** Replace the entire system prompt with contents of this file */
14
+ systemPromptFile?: string;
15
+ /** Append this text to the default system prompt */
16
+ appendSystemPrompt?: string;
17
+ /** Append contents of this file to the default system prompt */
18
+ appendSystemPromptFile?: string;
19
+ }
20
+ export declare class SystemPromptOverride {
21
+ /**
22
+ * Apply override options to a base system prompt.
23
+ *
24
+ * - If systemPrompt or systemPromptFile is set, the base prompt is REPLACED.
25
+ * - If appendSystemPrompt or appendSystemPromptFile is set, content is APPENDED.
26
+ * - Cannot use both replace and append simultaneously.
27
+ * - If no overrides, returns the base prompt unchanged.
28
+ */
29
+ apply(basePrompt: string, options: OverrideOptions): string;
30
+ /**
31
+ * Read a file from disk. Throws if the file does not exist.
32
+ */
33
+ private readFile;
34
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * System Prompt Override
3
+ *
4
+ * Handles CLI flags for replacing or appending to the system prompt:
5
+ * - --system-prompt <text> → replace entire prompt
6
+ * - --system-prompt-file <path> → replace from file
7
+ * - --append-system-prompt <text> → append text to default prompt
8
+ * - --append-system-prompt-file <path> → append file contents
9
+ */
10
+ import * as fs from 'fs';
11
+ import { logger } from '../utils/logger.js';
12
+ // ============================================================================
13
+ // Implementation
14
+ // ============================================================================
15
+ export class SystemPromptOverride {
16
+ /**
17
+ * Apply override options to a base system prompt.
18
+ *
19
+ * - If systemPrompt or systemPromptFile is set, the base prompt is REPLACED.
20
+ * - If appendSystemPrompt or appendSystemPromptFile is set, content is APPENDED.
21
+ * - Cannot use both replace and append simultaneously.
22
+ * - If no overrides, returns the base prompt unchanged.
23
+ */
24
+ apply(basePrompt, options) {
25
+ const hasReplace = options.systemPrompt !== undefined || options.systemPromptFile !== undefined;
26
+ const hasAppend = options.appendSystemPrompt !== undefined || options.appendSystemPromptFile !== undefined;
27
+ // Validate: can't use both replace and append simultaneously
28
+ if (hasReplace && hasAppend) {
29
+ throw new Error('Cannot use both replace (--system-prompt / --system-prompt-file) and append (--append-system-prompt / --append-system-prompt-file) simultaneously');
30
+ }
31
+ // No overrides — return base prompt unchanged
32
+ if (!hasReplace && !hasAppend) {
33
+ return basePrompt;
34
+ }
35
+ // Replace mode
36
+ if (hasReplace) {
37
+ if (options.systemPromptFile) {
38
+ return this.readFile(options.systemPromptFile);
39
+ }
40
+ return options.systemPrompt;
41
+ }
42
+ // Append mode
43
+ let result = basePrompt;
44
+ if (options.appendSystemPrompt) {
45
+ result += '\n\n' + options.appendSystemPrompt;
46
+ }
47
+ if (options.appendSystemPromptFile) {
48
+ const fileContent = this.readFile(options.appendSystemPromptFile);
49
+ result += '\n\n' + fileContent;
50
+ }
51
+ return result;
52
+ }
53
+ /**
54
+ * Read a file from disk. Throws if the file does not exist.
55
+ */
56
+ readFile(filePath) {
57
+ if (!fs.existsSync(filePath)) {
58
+ throw new Error(`System prompt file not found: ${filePath}`);
59
+ }
60
+ logger.debug('Reading system prompt file', { path: filePath });
61
+ return fs.readFileSync(filePath, 'utf-8');
62
+ }
63
+ }
64
+ //# sourceMappingURL=system-prompt-override.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt-override.js","sourceRoot":"","sources":["../../src/services/system-prompt-override.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiB5C,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,oBAAoB;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,UAAkB,EAAE,OAAwB;QAChD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC;QAChG,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,KAAK,SAAS,IAAI,OAAO,CAAC,sBAAsB,KAAK,SAAS,CAAC;QAE3G,6DAA6D;QAC7D,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,mJAAmJ,CACpJ,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,eAAe;QACf,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,OAAO,CAAC,YAAa,CAAC;QAC/B,CAAC;QAED,cAAc;QACd,IAAI,MAAM,GAAG,UAAU,CAAC;QAExB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAChD,CAAC;QAED,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAClE,MAAM,IAAI,MAAM,GAAG,WAAW,CAAC;QACjC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,QAAgB;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Skill Enhancements
3
+ *
4
+ * SkillVariableResolver: replaces template variables ($ARGUMENTS, $WORKING_DIR, etc.)
5
+ * SkillBudgetCalculator: computes char budgets for skill content injection
6
+ */
7
+ export interface SkillContext {
8
+ arguments?: string[];
9
+ sessionId?: string;
10
+ workingDir?: string;
11
+ gitBranch?: string;
12
+ }
13
+ export declare class SkillVariableResolver {
14
+ /**
15
+ * Parse indexed argument reference like $ARGUMENTS[0]
16
+ * Returns the index or -1 if not an indexed reference
17
+ */
18
+ parseIndexedArgument(varRef: string): number;
19
+ /**
20
+ * Resolve template variables in a skill template string
21
+ */
22
+ resolve(template: string, context: SkillContext): string;
23
+ }
24
+ export declare class SkillBudgetCalculator {
25
+ /**
26
+ * Calculate budget as 2% of context window size (in characters)
27
+ */
28
+ calculateBudget(contextWindowSize: number): number;
29
+ /**
30
+ * Truncate content to fit within the character budget
31
+ */
32
+ truncateToLimit(content: string, budget: number): string;
33
+ /**
34
+ * Get default budget for 200k context window
35
+ */
36
+ getDefaultBudget(): number;
37
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Skill Enhancements
3
+ *
4
+ * SkillVariableResolver: replaces template variables ($ARGUMENTS, $WORKING_DIR, etc.)
5
+ * SkillBudgetCalculator: computes char budgets for skill content injection
6
+ */
7
+ import { logger } from '../utils/logger.js';
8
+ // ============================================================================
9
+ // SkillVariableResolver
10
+ // ============================================================================
11
+ export class SkillVariableResolver {
12
+ /**
13
+ * Parse indexed argument reference like $ARGUMENTS[0]
14
+ * Returns the index or -1 if not an indexed reference
15
+ */
16
+ parseIndexedArgument(varRef) {
17
+ const match = varRef.match(/^\$ARGUMENTS\[(\d+)\]$/);
18
+ if (match) {
19
+ return parseInt(match[1], 10);
20
+ }
21
+ return -1;
22
+ }
23
+ /**
24
+ * Resolve template variables in a skill template string
25
+ */
26
+ resolve(template, context) {
27
+ let result = template;
28
+ // Replace indexed arguments first: $ARGUMENTS[0], $ARGUMENTS[1], etc.
29
+ result = result.replace(/\$ARGUMENTS\[(\d+)\]/g, (_match, indexStr) => {
30
+ const index = parseInt(indexStr, 10);
31
+ const args = context.arguments || [];
32
+ return index < args.length ? args[index] : '';
33
+ });
34
+ // Replace $ARGUMENTS with all arguments joined
35
+ result = result.replace(/\$ARGUMENTS/g, (context.arguments || []).join(' '));
36
+ // Replace other variables
37
+ result = result.replace(/\$CLAUDE_SESSION_ID/g, context.sessionId || '');
38
+ result = result.replace(/\$WORKING_DIR/g, context.workingDir || process.cwd());
39
+ result = result.replace(/\$GIT_BRANCH/g, context.gitBranch || 'main');
40
+ logger.debug('Skill variables resolved');
41
+ return result;
42
+ }
43
+ }
44
+ // ============================================================================
45
+ // SkillBudgetCalculator
46
+ // ============================================================================
47
+ export class SkillBudgetCalculator {
48
+ /**
49
+ * Calculate budget as 2% of context window size (in characters)
50
+ */
51
+ calculateBudget(contextWindowSize) {
52
+ return Math.floor(contextWindowSize * 0.02);
53
+ }
54
+ /**
55
+ * Truncate content to fit within the character budget
56
+ */
57
+ truncateToLimit(content, budget) {
58
+ if (content.length <= budget)
59
+ return content;
60
+ return content.slice(0, budget - 3) + '...';
61
+ }
62
+ /**
63
+ * Get default budget for 200k context window
64
+ */
65
+ getDefaultBudget() {
66
+ return this.calculateBudget(200000);
67
+ }
68
+ }
69
+ //# sourceMappingURL=skill-enhancements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-enhancements.js","sourceRoot":"","sources":["../../src/skills/skill-enhancements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,OAAO,qBAAqB;IAChC;;;OAGG;IACH,oBAAoB,CAAC,MAAc;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAgB,EAAE,OAAqB;QAC7C,IAAI,MAAM,GAAG,QAAQ,CAAC;QAEtB,sEAAsE;QACtE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;YACrC,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7E,0BAA0B;QAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QAEtE,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,OAAO,qBAAqB;IAChC;;OAEG;IACH,eAAe,CAAC,iBAAyB;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe,EAAE,MAAc;QAC7C,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC;QAC7C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * OpenTelemetry Tracer (Lightweight)
3
+ *
4
+ * Manual OTLP HTTP JSON exporter without @opentelemetry/* dependencies.
5
+ * Buffers spans in memory and flushes them to an OTLP-compatible endpoint.
6
+ *
7
+ * Enable via:
8
+ * - OTEL_ENDPOINT env var
9
+ * - --otel-endpoint CLI flag
10
+ * - Constructor config
11
+ */
12
+ export interface OtelAttribute {
13
+ key: string;
14
+ value: {
15
+ stringValue?: string;
16
+ intValue?: number;
17
+ boolValue?: boolean;
18
+ };
19
+ }
20
+ export interface OtelSpanStatus {
21
+ code: number;
22
+ message?: string;
23
+ }
24
+ export interface OtelSpan {
25
+ traceId: string;
26
+ spanId: string;
27
+ parentSpanId?: string;
28
+ name: string;
29
+ kind: number;
30
+ startTimeUnixNano: string;
31
+ endTimeUnixNano: string;
32
+ attributes: OtelAttribute[];
33
+ status: OtelSpanStatus;
34
+ }
35
+ export interface OtelTracerConfig {
36
+ /** OTLP HTTP endpoint (e.g., http://localhost:4318/v1/traces) */
37
+ endpoint?: string;
38
+ /** Service name reported in telemetry */
39
+ serviceName?: string;
40
+ /** Enable/disable the tracer */
41
+ enabled?: boolean;
42
+ /** Flush interval in milliseconds (default: 30000) */
43
+ flushIntervalMs?: number;
44
+ /** Maximum buffer size before auto-flush (default: 100) */
45
+ maxBufferSize?: number;
46
+ }
47
+ export declare class OtelTracer {
48
+ private readonly endpoint;
49
+ private readonly serviceName;
50
+ private readonly enabled;
51
+ private readonly maxBufferSize;
52
+ private buffer;
53
+ private flushTimer;
54
+ private currentTraceId;
55
+ constructor(config?: OtelTracerConfig);
56
+ /**
57
+ * Start a new span. Call endSpan() when the operation completes.
58
+ */
59
+ startSpan(name: string, attributes?: Record<string, string | number | boolean>): OtelSpan;
60
+ /**
61
+ * End a span and add it to the buffer for flushing.
62
+ */
63
+ endSpan(span: OtelSpan, status?: OtelSpanStatus): void;
64
+ /**
65
+ * Flush buffered spans to the OTLP endpoint.
66
+ */
67
+ flush(): Promise<void>;
68
+ /**
69
+ * Trace an LLM API call.
70
+ */
71
+ traceApiCall(model: string, tokens: number, duration: number): void;
72
+ /**
73
+ * Trace a tool execution.
74
+ */
75
+ traceToolExecution(toolName: string, duration: number, success: boolean): void;
76
+ /**
77
+ * Trace a conversation turn.
78
+ */
79
+ traceConversation(sessionId: string, messageCount: number): void;
80
+ /**
81
+ * Start a new trace (generates a new traceId).
82
+ */
83
+ newTrace(): string;
84
+ /**
85
+ * Get the number of buffered spans.
86
+ */
87
+ get pendingSpans(): number;
88
+ /**
89
+ * Check if the tracer is enabled.
90
+ */
91
+ get isEnabled(): boolean;
92
+ /**
93
+ * Dispose the tracer, flushing remaining spans.
94
+ */
95
+ dispose(): Promise<void>;
96
+ }
97
+ export declare function getOtelTracer(config?: OtelTracerConfig): OtelTracer;
98
+ export declare function resetOtelTracer(): void;