@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.
- package/dist/agent/background-tasks.d.ts +49 -0
- package/dist/agent/background-tasks.js +153 -0
- package/dist/agent/background-tasks.js.map +1 -0
- package/dist/agent/definitions/agent-definition-loader.d.ts +21 -0
- package/dist/agent/definitions/agent-definition-loader.js +161 -0
- package/dist/agent/definitions/agent-definition-loader.js.map +1 -0
- package/dist/agent/definitions/index.d.ts +1 -0
- package/dist/agent/definitions/index.js +2 -0
- package/dist/agent/definitions/index.js.map +1 -0
- package/dist/agent/extended-thinking.d.ts +64 -0
- package/dist/agent/extended-thinking.js +103 -0
- package/dist/agent/extended-thinking.js.map +1 -0
- package/dist/agent/prompt-suggestions.d.ts +55 -0
- package/dist/agent/prompt-suggestions.js +125 -0
- package/dist/agent/prompt-suggestions.js.map +1 -0
- package/dist/agent/rewind-manager.d.ts +59 -0
- package/dist/agent/rewind-manager.js +124 -0
- package/dist/agent/rewind-manager.js.map +1 -0
- package/dist/agent/teams/agent-team.d.ts +54 -0
- package/dist/agent/teams/agent-team.js +114 -0
- package/dist/agent/teams/agent-team.js.map +1 -0
- package/dist/agent/teams/index.d.ts +1 -0
- package/dist/agent/teams/index.js +2 -0
- package/dist/agent/teams/index.js.map +1 -0
- package/dist/agent/teams/team-v2.d.ts +166 -0
- package/dist/agent/teams/team-v2.js +376 -0
- package/dist/agent/teams/team-v2.js.map +1 -0
- package/dist/channels/imessage/index.d.ts +40 -0
- package/dist/channels/imessage/index.js +69 -0
- package/dist/channels/imessage/index.js.map +1 -0
- package/dist/channels/line/index.d.ts +36 -0
- package/dist/channels/line/index.js +71 -0
- package/dist/channels/line/index.js.map +1 -0
- package/dist/channels/mattermost/index.d.ts +34 -0
- package/dist/channels/mattermost/index.js +56 -0
- package/dist/channels/mattermost/index.js.map +1 -0
- package/dist/channels/nextcloud-talk/index.d.ts +37 -0
- package/dist/channels/nextcloud-talk/index.js +67 -0
- package/dist/channels/nextcloud-talk/index.js.map +1 -0
- package/dist/channels/niche-channels.d.ts +61 -0
- package/dist/channels/niche-channels.js +131 -0
- package/dist/channels/niche-channels.js.map +1 -0
- package/dist/channels/nostr/index.d.ts +30 -0
- package/dist/channels/nostr/index.js +68 -0
- package/dist/channels/nostr/index.js.map +1 -0
- package/dist/channels/twilio-voice/index.d.ts +37 -0
- package/dist/channels/twilio-voice/index.js +76 -0
- package/dist/channels/twilio-voice/index.js.map +1 -0
- package/dist/channels/whatsapp/index.js +0 -1
- package/dist/channels/whatsapp/index.js.map +1 -1
- package/dist/channels/zalo/index.d.ts +28 -0
- package/dist/channels/zalo/index.js +53 -0
- package/dist/channels/zalo/index.js.map +1 -0
- package/dist/cloud/cloud-sessions.d.ts +56 -0
- package/dist/cloud/cloud-sessions.js +187 -0
- package/dist/cloud/cloud-sessions.js.map +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +24 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/commands/handlers/auth-handler.d.ts +32 -0
- package/dist/commands/handlers/auth-handler.js +137 -0
- package/dist/commands/handlers/auth-handler.js.map +1 -0
- package/dist/commands/handlers/context-handler.d.ts +46 -0
- package/dist/commands/handlers/context-handler.js +102 -0
- package/dist/commands/handlers/context-handler.js.map +1 -0
- package/dist/commands/handlers/keybindings-handler.d.ts +30 -0
- package/dist/commands/handlers/keybindings-handler.js +124 -0
- package/dist/commands/handlers/keybindings-handler.js.map +1 -0
- package/dist/commands/handlers/session-commands.d.ts +17 -0
- package/dist/commands/handlers/session-commands.js +119 -0
- package/dist/commands/handlers/session-commands.js.map +1 -0
- package/dist/commands/slash/builtin-commands.js +1 -1
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/admin-config.d.ts +54 -0
- package/dist/config/admin-config.js +144 -0
- package/dist/config/admin-config.js.map +1 -0
- package/dist/config/advanced-config.d.ts +118 -0
- package/dist/config/advanced-config.js +364 -0
- package/dist/config/advanced-config.js.map +1 -0
- package/dist/config/managed-policies.d.ts +50 -0
- package/dist/config/managed-policies.js +120 -0
- package/dist/config/managed-policies.js.map +1 -0
- package/dist/config/settings-hierarchy.d.ts +59 -0
- package/dist/config/settings-hierarchy.js +188 -0
- package/dist/config/settings-hierarchy.js.map +1 -0
- package/dist/config/tool-profiles.d.ts +37 -0
- package/dist/config/tool-profiles.js +150 -0
- package/dist/config/tool-profiles.js.map +1 -0
- package/dist/config/user-settings.d.ts +31 -0
- package/dist/config/user-settings.js +66 -0
- package/dist/config/user-settings.js.map +1 -0
- package/dist/context/context-files.d.ts +1 -1
- package/dist/context/context-files.js +2 -2
- package/dist/context/context-files.js.map +1 -1
- package/dist/context/partial-summarizer.d.ts +32 -0
- package/dist/context/partial-summarizer.js +144 -0
- package/dist/context/partial-summarizer.js.map +1 -0
- package/dist/desktop/desktop-app.d.ts +44 -0
- package/dist/desktop/desktop-app.js +136 -0
- package/dist/desktop/desktop-app.js.map +1 -0
- package/dist/git/worktree-sessions.d.ts +24 -0
- package/dist/git/worktree-sessions.js +93 -0
- package/dist/git/worktree-sessions.js.map +1 -0
- package/dist/hooks/advanced-hooks.d.ts +110 -0
- package/dist/hooks/advanced-hooks.js +256 -0
- package/dist/hooks/advanced-hooks.js.map +1 -0
- package/dist/hooks/async-hooks.d.ts +73 -0
- package/dist/hooks/async-hooks.js +213 -0
- package/dist/hooks/async-hooks.js.map +1 -0
- package/dist/hooks/env-persistence.d.ts +58 -0
- package/dist/hooks/env-persistence.js +195 -0
- package/dist/hooks/env-persistence.js.map +1 -0
- package/dist/hooks/hook-events.d.ts +36 -0
- package/dist/hooks/hook-events.js +55 -0
- package/dist/hooks/hook-events.js.map +1 -0
- package/dist/hooks/smart-hooks.d.ts +85 -0
- package/dist/hooks/smart-hooks.js +199 -0
- package/dist/hooks/smart-hooks.js.map +1 -0
- package/dist/ide/jetbrains-plugin.d.ts +55 -0
- package/dist/ide/jetbrains-plugin.js +156 -0
- package/dist/ide/jetbrains-plugin.js.map +1 -0
- package/dist/ide/vscode-extension.d.ts +94 -0
- package/dist/ide/vscode-extension.js +229 -0
- package/dist/ide/vscode-extension.js.map +1 -0
- package/dist/index.js +77 -3
- package/dist/index.js.map +1 -1
- package/dist/input/file-autocomplete.d.ts +42 -0
- package/dist/input/file-autocomplete.js +154 -0
- package/dist/input/file-autocomplete.js.map +1 -0
- package/dist/integrations/chrome-bridge.d.ts +90 -0
- package/dist/integrations/chrome-bridge.js +151 -0
- package/dist/integrations/chrome-bridge.js.map +1 -0
- package/dist/integrations/github-action-runner.d.ts +40 -0
- package/dist/integrations/github-action-runner.js +163 -0
- package/dist/integrations/github-action-runner.js.map +1 -0
- package/dist/integrations/gitlab-ci-runner.d.ts +34 -0
- package/dist/integrations/gitlab-ci-runner.js +104 -0
- package/dist/integrations/gitlab-ci-runner.js.map +1 -0
- package/dist/integrations/pr-session-linker.d.ts +44 -0
- package/dist/integrations/pr-session-linker.js +103 -0
- package/dist/integrations/pr-session-linker.js.map +1 -0
- package/dist/integrations/tailscale.d.ts +36 -0
- package/dist/integrations/tailscale.js +101 -0
- package/dist/integrations/tailscale.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +68 -0
- package/dist/lsp/lsp-client.js +182 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/mcp/connectors.d.ts +28 -0
- package/dist/mcp/connectors.js +148 -0
- package/dist/mcp/connectors.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -4
- package/dist/mcp/index.js +7 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-auto-discovery.d.ts +49 -0
- package/dist/mcp/mcp-auto-discovery.js +104 -0
- package/dist/mcp/mcp-auto-discovery.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +70 -0
- package/dist/mcp/mcp-server.js +374 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/memory/auto-memory.d.ts +53 -0
- package/dist/memory/auto-memory.js +250 -0
- package/dist/memory/auto-memory.js.map +1 -0
- package/dist/memory/hybrid-search.d.ts +51 -0
- package/dist/memory/hybrid-search.js +199 -0
- package/dist/memory/hybrid-search.js.map +1 -0
- package/dist/memory/memory-flush.d.ts +51 -0
- package/dist/memory/memory-flush.js +102 -0
- package/dist/memory/memory-flush.js.map +1 -0
- package/dist/memory/subagent-memory.d.ts +73 -0
- package/dist/memory/subagent-memory.js +172 -0
- package/dist/memory/subagent-memory.js.map +1 -0
- package/dist/nodes/device-node.d.ts +40 -0
- package/dist/nodes/device-node.js +117 -0
- package/dist/nodes/device-node.js.map +1 -0
- package/dist/output/json-schema-output.d.ts +67 -0
- package/dist/output/json-schema-output.js +273 -0
- package/dist/output/json-schema-output.js.map +1 -0
- package/dist/persistence/session-picker.d.ts +22 -0
- package/dist/persistence/session-picker.js +47 -0
- package/dist/persistence/session-picker.js.map +1 -0
- package/dist/persistence/session-store.d.ts +11 -0
- package/dist/persistence/session-store.js +17 -0
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/plugins/git-pinned-marketplace.d.ts +39 -0
- package/dist/plugins/git-pinned-marketplace.js +152 -0
- package/dist/plugins/git-pinned-marketplace.js.map +1 -0
- package/dist/plugins/plugin-manifest.d.ts +116 -0
- package/dist/plugins/plugin-manifest.js +283 -0
- package/dist/plugins/plugin-manifest.js.map +1 -0
- package/dist/sandbox/os-sandbox.d.ts +49 -1
- package/dist/sandbox/os-sandbox.js +347 -6
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/sdk/agent-sdk.d.ts +61 -0
- package/dist/sdk/agent-sdk.js +90 -0
- package/dist/sdk/agent-sdk.js.map +1 -0
- package/dist/security/permission-modes.d.ts +76 -0
- package/dist/security/permission-modes.js +195 -0
- package/dist/security/permission-modes.js.map +1 -0
- package/dist/security/permission-patterns.d.ts +61 -0
- package/dist/security/permission-patterns.js +171 -0
- package/dist/security/permission-patterns.js.map +1 -0
- package/dist/security/safe-binaries.d.ts +23 -0
- package/dist/security/safe-binaries.js +96 -0
- package/dist/security/safe-binaries.js.map +1 -0
- package/dist/security/sender-policies.d.ts +46 -0
- package/dist/security/sender-policies.js +90 -0
- package/dist/security/sender-policies.js.map +1 -0
- package/dist/server/dashboard.d.ts +53 -0
- package/dist/server/dashboard.js +93 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/services/system-prompt-override.d.ts +34 -0
- package/dist/services/system-prompt-override.js +64 -0
- package/dist/services/system-prompt-override.js.map +1 -0
- package/dist/skills/skill-enhancements.d.ts +37 -0
- package/dist/skills/skill-enhancements.js +69 -0
- package/dist/skills/skill-enhancements.js.map +1 -0
- package/dist/telemetry/otel-tracer.d.ts +98 -0
- package/dist/telemetry/otel-tracer.js +245 -0
- package/dist/telemetry/otel-tracer.js.map +1 -0
- package/dist/tools/browser-stub.d.ts +61 -0
- package/dist/tools/browser-stub.js +184 -0
- package/dist/tools/browser-stub.js.map +1 -0
- package/dist/tools/gateway-tool.d.ts +43 -0
- package/dist/tools/gateway-tool.js +92 -0
- package/dist/tools/gateway-tool.js.map +1 -0
- package/dist/tools/image-stub.d.ts +32 -0
- package/dist/tools/image-stub.js +97 -0
- package/dist/tools/image-stub.js.map +1 -0
- package/dist/tools/js-repl.d.ts +78 -0
- package/dist/tools/js-repl.js +280 -0
- package/dist/tools/js-repl.js.map +1 -0
- package/dist/tools/message-tool.d.ts +42 -0
- package/dist/tools/message-tool.js +113 -0
- package/dist/tools/message-tool.js.map +1 -0
- package/dist/ui/cli-enhancements.d.ts +178 -0
- package/dist/ui/cli-enhancements.js +430 -0
- package/dist/ui/cli-enhancements.js.map +1 -0
- package/dist/ui/status-line.d.ts +90 -0
- package/dist/ui/status-line.js +160 -0
- package/dist/ui/status-line.js.map +1 -0
- package/dist/ui/terminal-enhancements.d.ts +34 -0
- package/dist/ui/terminal-enhancements.js +97 -0
- package/dist/ui/terminal-enhancements.js.map +1 -0
- package/dist/ui/ui-enhancements.d.ts +38 -0
- package/dist/ui/ui-enhancements.js +116 -0
- package/dist/ui/ui-enhancements.js.map +1 -0
- package/dist/utils/custom-instructions.js +4 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/init-project.d.ts +1 -1
- package/dist/utils/init-project.js +20 -20
- package/dist/utils/init-project.js.map +1 -1
- package/dist/utils/output-schema-validator.d.ts +40 -0
- package/dist/utils/output-schema-validator.js +137 -0
- package/dist/utils/output-schema-validator.js.map +1 -0
- package/dist/utils/safety-misc.d.ts +24 -0
- package/dist/utils/safety-misc.js +91 -0
- package/dist/utils/safety-misc.js.map +1 -0
- package/dist/utils/session-enhancements.d.ts +40 -0
- package/dist/utils/session-enhancements.js +118 -0
- package/dist/utils/session-enhancements.js.map +1 -0
- package/dist/utils/shell-snapshot.d.ts +38 -0
- package/dist/utils/shell-snapshot.js +323 -0
- package/dist/utils/shell-snapshot.js.map +1 -0
- package/dist/utils/stream-json-formatter.d.ts +77 -0
- package/dist/utils/stream-json-formatter.js +61 -0
- package/dist/utils/stream-json-formatter.js.map +1 -0
- package/dist/workflows/lobster-engine.d.ts +43 -0
- package/dist/workflows/lobster-engine.js +167 -0
- package/dist/workflows/lobster-engine.js.map +1 -0
- 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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAgB5C,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAC,QAAQ,GAA+B,IAAI,CAAC;IACnD,QAAQ,GAAmB,EAAE,CAAC;IAEtC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YAClC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,mBAAmB,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,MAAoB;QAC5B,2CAA2C;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,YAAY,CAAC,QAAwB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACvC,CAAC;IAED,SAAS,CAAC,QAAwB;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,aAAa,CAAC,QAAwB,EAAE,IAAY;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,kCAAkC;QAE5D,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,MAAsB,EAAE,MAAoB;QACxD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC3E,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACvE,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,EAAE,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;;AASH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAC;IAC7C,MAAM,GAA2B,IAAI,GAAG,EAAE,CAAC;IAEnD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,WAAmB;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC"}
|
|
@@ -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;
|