@phuetz/code-buddy 0.1.25 → 0.1.26
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/README.md +1049 -741
- package/dist/agent/codebuddy-agent.d.ts +5 -0
- package/dist/agent/codebuddy-agent.js +46 -1
- package/dist/agent/codebuddy-agent.js.map +1 -1
- package/dist/agent/execution/agent-executor.d.ts +12 -0
- package/dist/agent/execution/agent-executor.js +147 -6
- package/dist/agent/execution/agent-executor.js.map +1 -1
- package/dist/agent/lessons-tracker.d.ts +50 -0
- package/dist/agent/lessons-tracker.js +234 -0
- package/dist/agent/lessons-tracker.js.map +1 -0
- package/dist/agent/message-queue.d.ts +39 -2
- package/dist/agent/message-queue.js +67 -2
- package/dist/agent/message-queue.js.map +1 -1
- package/dist/agent/middleware/index.d.ts +1 -0
- package/dist/agent/middleware/index.js +1 -0
- package/dist/agent/middleware/index.js.map +1 -1
- package/dist/agent/middleware/workflow-guard.d.ts +21 -0
- package/dist/agent/middleware/workflow-guard.js +94 -0
- package/dist/agent/middleware/workflow-guard.js.map +1 -0
- package/dist/agent/repo-profiler.d.ts +61 -0
- package/dist/agent/repo-profiler.js +295 -0
- package/dist/agent/repo-profiler.js.map +1 -0
- package/dist/agent/response-constraint.d.ts +61 -0
- package/dist/agent/response-constraint.js +91 -0
- package/dist/agent/response-constraint.js.map +1 -0
- package/dist/agent/todo-tracker.d.ts +67 -0
- package/dist/agent/todo-tracker.js +245 -0
- package/dist/agent/todo-tracker.js.map +1 -0
- package/dist/agent/tool-handler.d.ts +11 -0
- package/dist/agent/tool-handler.js +79 -1
- package/dist/agent/tool-handler.js.map +1 -1
- package/dist/agent/types.d.ts +20 -2
- package/dist/agent/wide-research.d.ts +93 -0
- package/dist/agent/wide-research.js +232 -0
- package/dist/agent/wide-research.js.map +1 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.js +2 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/channels/pro/callback-router.d.ts +54 -0
- package/dist/channels/pro/callback-router.js +178 -0
- package/dist/channels/pro/callback-router.js.map +1 -0
- package/dist/channels/pro/ci-watcher.d.ts +86 -0
- package/dist/channels/pro/ci-watcher.js +343 -0
- package/dist/channels/pro/ci-watcher.js.map +1 -0
- package/dist/channels/pro/diff-first.d.ts +63 -0
- package/dist/channels/pro/diff-first.js +187 -0
- package/dist/channels/pro/diff-first.js.map +1 -0
- package/dist/channels/pro/enhanced-commands.d.ts +83 -0
- package/dist/channels/pro/enhanced-commands.js +218 -0
- package/dist/channels/pro/enhanced-commands.js.map +1 -0
- package/dist/channels/pro/index.d.ts +19 -0
- package/dist/channels/pro/index.js +21 -0
- package/dist/channels/pro/index.js.map +1 -0
- package/dist/channels/pro/pro-features.d.ts +79 -0
- package/dist/channels/pro/pro-features.js +203 -0
- package/dist/channels/pro/pro-features.js.map +1 -0
- package/dist/channels/pro/run-commands.d.ts +59 -0
- package/dist/channels/pro/run-commands.js +122 -0
- package/dist/channels/pro/run-commands.js.map +1 -0
- package/dist/channels/pro/run-tracker.d.ts +74 -0
- package/dist/channels/pro/run-tracker.js +252 -0
- package/dist/channels/pro/run-tracker.js.map +1 -0
- package/dist/channels/pro/scoped-auth.d.ts +97 -0
- package/dist/channels/pro/scoped-auth.js +340 -0
- package/dist/channels/pro/scoped-auth.js.map +1 -0
- package/dist/channels/pro/text-formatter.d.ts +27 -0
- package/dist/channels/pro/text-formatter.js +269 -0
- package/dist/channels/pro/text-formatter.js.map +1 -0
- package/dist/channels/pro/types.d.ts +242 -0
- package/dist/channels/pro/types.js +14 -0
- package/dist/channels/pro/types.js.map +1 -0
- package/dist/channels/streaming-policy.d.ts +66 -0
- package/dist/channels/streaming-policy.js +266 -0
- package/dist/channels/streaming-policy.js.map +1 -0
- package/dist/channels/telegram/ci-watcher.d.ts +5 -0
- package/dist/channels/telegram/ci-watcher.js +5 -0
- package/dist/channels/telegram/ci-watcher.js.map +1 -0
- package/dist/channels/telegram/client.d.ts +28 -0
- package/dist/channels/telegram/client.js +147 -1
- package/dist/channels/telegram/client.js.map +1 -1
- package/dist/channels/telegram/diff-first.d.ts +5 -0
- package/dist/channels/telegram/diff-first.js +5 -0
- package/dist/channels/telegram/diff-first.js.map +1 -0
- package/dist/channels/telegram/enhanced-commands.d.ts +6 -0
- package/dist/channels/telegram/enhanced-commands.js +6 -0
- package/dist/channels/telegram/enhanced-commands.js.map +1 -0
- package/dist/channels/telegram/index.d.ts +6 -0
- package/dist/channels/telegram/index.js +6 -0
- package/dist/channels/telegram/index.js.map +1 -1
- package/dist/channels/telegram/pro-formatter.d.ts +30 -0
- package/dist/channels/telegram/pro-formatter.js +276 -0
- package/dist/channels/telegram/pro-formatter.js.map +1 -0
- package/dist/channels/telegram/run-commands.d.ts +5 -0
- package/dist/channels/telegram/run-commands.js +6 -0
- package/dist/channels/telegram/run-commands.js.map +1 -0
- package/dist/channels/telegram/run-tracker.d.ts +5 -0
- package/dist/channels/telegram/run-tracker.js +5 -0
- package/dist/channels/telegram/run-tracker.js.map +1 -0
- package/dist/channels/telegram/scoped-auth.d.ts +6 -0
- package/dist/channels/telegram/scoped-auth.js +5 -0
- package/dist/channels/telegram/scoped-auth.js.map +1 -0
- package/dist/channels/telegram/types.d.ts +34 -0
- package/dist/codebuddy/client.js +14 -1
- package/dist/codebuddy/client.js.map +1 -1
- package/dist/commands/dev/index.d.ts +12 -0
- package/dist/commands/dev/index.js +231 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/dev/workflows.d.ts +31 -0
- package/dist/commands/dev/workflows.js +214 -0
- package/dist/commands/dev/workflows.js.map +1 -0
- package/dist/commands/execpolicy.d.ts +17 -0
- package/dist/commands/execpolicy.js +155 -0
- package/dist/commands/execpolicy.js.map +1 -0
- package/dist/commands/knowledge.d.ts +13 -0
- package/dist/commands/knowledge.js +142 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/lessons.d.ts +11 -0
- package/dist/commands/lessons.js +129 -0
- package/dist/commands/lessons.js.map +1 -0
- package/dist/commands/pairing.d.ts +14 -0
- package/dist/commands/pairing.js +132 -0
- package/dist/commands/pairing.js.map +1 -0
- package/dist/commands/research/index.d.ts +13 -0
- package/dist/commands/research/index.js +91 -0
- package/dist/commands/research/index.js.map +1 -0
- package/dist/commands/run-cli/index.d.ts +11 -0
- package/dist/commands/run-cli/index.js +49 -0
- package/dist/commands/run-cli/index.js.map +1 -0
- package/dist/commands/todos.d.ts +9 -0
- package/dist/commands/todos.js +119 -0
- package/dist/commands/todos.js.map +1 -0
- package/dist/config/toml-config.d.ts +21 -0
- package/dist/config/toml-config.js +15 -0
- package/dist/config/toml-config.js.map +1 -1
- package/dist/context/enhanced-compression.js +12 -1
- package/dist/context/enhanced-compression.js.map +1 -1
- package/dist/context/observation-variator.d.ts +44 -0
- package/dist/context/observation-variator.js +83 -0
- package/dist/context/observation-variator.js.map +1 -0
- package/dist/context/precompaction-flush.d.ts +40 -0
- package/dist/context/precompaction-flush.js +134 -0
- package/dist/context/precompaction-flush.js.map +1 -0
- package/dist/context/restorable-compression.d.ts +80 -0
- package/dist/context/restorable-compression.js +228 -0
- package/dist/context/restorable-compression.js.map +1 -0
- package/dist/daemon/daily-reset.d.ts +77 -0
- package/dist/daemon/daily-reset.js +175 -0
- package/dist/daemon/daily-reset.js.map +1 -0
- package/dist/daemon/index.d.ts +1 -0
- package/dist/daemon/index.js +1 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/knowledge-manager.d.ts +77 -0
- package/dist/knowledge/knowledge-manager.js +244 -0
- package/dist/knowledge/knowledge-manager.js.map +1 -0
- package/dist/observability/run-store.d.ts +133 -0
- package/dist/observability/run-store.js +419 -0
- package/dist/observability/run-store.js.map +1 -0
- package/dist/observability/run-viewer.d.ts +33 -0
- package/dist/observability/run-viewer.js +254 -0
- package/dist/observability/run-viewer.js.map +1 -0
- package/dist/optimization/cache-breakpoints.d.ts +52 -0
- package/dist/optimization/cache-breakpoints.js +97 -0
- package/dist/optimization/cache-breakpoints.js.map +1 -0
- package/dist/persistence/session-store.d.ts +3 -1
- package/dist/persistence/session-store.js +1 -1
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/prompts/system-base.js +51 -7
- package/dist/prompts/system-base.js.map +1 -1
- package/dist/prompts/variation-injector.d.ts +55 -0
- package/dist/prompts/variation-injector.js +171 -0
- package/dist/prompts/variation-injector.js.map +1 -0
- package/dist/prompts/workflow-rules.d.ts +10 -0
- package/dist/prompts/workflow-rules.js +79 -0
- package/dist/prompts/workflow-rules.js.map +1 -0
- package/dist/sandbox/execpolicy.d.ts +45 -0
- package/dist/sandbox/execpolicy.js +80 -0
- package/dist/sandbox/execpolicy.js.map +1 -1
- package/dist/sandbox/os-sandbox.d.ts +25 -0
- package/dist/sandbox/os-sandbox.js +73 -0
- package/dist/sandbox/os-sandbox.js.map +1 -1
- package/dist/security/security-audit.d.ts +10 -0
- package/dist/security/security-audit.js +116 -0
- package/dist/security/security-audit.js.map +1 -1
- package/dist/security/shell-env-policy.d.ts +45 -0
- package/dist/security/shell-env-policy.js +141 -0
- package/dist/security/shell-env-policy.js.map +1 -0
- package/dist/security/ssrf-guard.d.ts +61 -0
- package/dist/security/ssrf-guard.js +382 -0
- package/dist/security/ssrf-guard.js.map +1 -0
- package/dist/security/write-policy.d.ts +57 -0
- package/dist/security/write-policy.js +117 -0
- package/dist/security/write-policy.js.map +1 -0
- package/dist/services/prompt-builder.js +37 -0
- package/dist/services/prompt-builder.js.map +1 -1
- package/dist/themes/theme-schema.d.ts +10 -10
- package/dist/tools/ask-human-tool.d.ts +62 -0
- package/dist/tools/ask-human-tool.js +112 -0
- package/dist/tools/ask-human-tool.js.map +1 -0
- package/dist/tools/bash/bash-tool.d.ts +15 -0
- package/dist/tools/bash/bash-tool.js +62 -0
- package/dist/tools/bash/bash-tool.js.map +1 -1
- package/dist/tools/bash/command-validator.d.ts +1 -0
- package/dist/tools/bash/command-validator.js +5 -0
- package/dist/tools/bash/command-validator.js.map +1 -1
- package/dist/tools/create-skill-tool.d.ts +87 -0
- package/dist/tools/create-skill-tool.js +142 -0
- package/dist/tools/create-skill-tool.js.map +1 -0
- package/dist/tools/fetch-tool.js +5 -3
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-tool.d.ts +22 -0
- package/dist/tools/plan-tool.js +128 -0
- package/dist/tools/plan-tool.js.map +1 -0
- package/dist/tools/registry/attention-tools.d.ts +32 -0
- package/dist/tools/registry/attention-tools.js +225 -0
- package/dist/tools/registry/attention-tools.js.map +1 -0
- package/dist/tools/registry/index.d.ts +9 -1
- package/dist/tools/registry/index.js +30 -2
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/registry/knowledge-tools.d.ts +46 -0
- package/dist/tools/registry/knowledge-tools.js +293 -0
- package/dist/tools/registry/knowledge-tools.js.map +1 -0
- package/dist/tools/registry/lessons-tools.d.ts +48 -0
- package/dist/tools/registry/lessons-tools.js +359 -0
- package/dist/tools/registry/lessons-tools.js.map +1 -0
- package/dist/tools/registry/plan-tools.d.ts +2 -0
- package/dist/tools/registry/plan-tools.js +7 -0
- package/dist/tools/registry/plan-tools.js.map +1 -0
- package/dist/tools/registry/script-tools.d.ts +2 -0
- package/dist/tools/registry/script-tools.js +7 -0
- package/dist/tools/registry/script-tools.js.map +1 -0
- package/dist/tools/registry/tool-aliases.d.ts +44 -0
- package/dist/tools/registry/tool-aliases.js +130 -0
- package/dist/tools/registry/tool-aliases.js.map +1 -0
- package/dist/tools/run-script-tool.d.ts +13 -0
- package/dist/tools/run-script-tool.js +146 -0
- package/dist/tools/run-script-tool.js.map +1 -0
- package/dist/tools/web-search.d.ts +25 -0
- package/dist/tools/web-search.js +68 -6
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/config-validation/schema.d.ts +2 -2
- package/dist/utils/debug-logger.d.ts +1 -1
- package/dist/utils/stable-json.d.ts +27 -0
- package/dist/utils/stable-json.js +50 -0
- package/dist/utils/stable-json.js.map +1 -0
- package/dist/webhooks/webhook-manager.d.ts +7 -0
- package/dist/webhooks/webhook-manager.js +29 -0
- package/dist/webhooks/webhook-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Commands
|
|
3
|
+
*
|
|
4
|
+
* Handles /runs and /run <id> commands, providing timeline views,
|
|
5
|
+
* re-run, test re-run, and rollback functionality.
|
|
6
|
+
* Channel-agnostic - returns structured data for formatters.
|
|
7
|
+
*/
|
|
8
|
+
import type { RunTracker } from './run-tracker.js';
|
|
9
|
+
import type { ScopedAuthManager } from './scoped-auth.js';
|
|
10
|
+
import type { RunRecord, RunStep } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Handles run-related commands and callbacks.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RunCommands {
|
|
15
|
+
private runTracker;
|
|
16
|
+
private authManager?;
|
|
17
|
+
constructor(runTracker: RunTracker, authManager?: ScopedAuthManager | undefined);
|
|
18
|
+
/**
|
|
19
|
+
* Handle /runs command - list recent runs (returns structured data)
|
|
20
|
+
*/
|
|
21
|
+
handleRunsList(_chatId: string, _userId: string, limit?: number): {
|
|
22
|
+
runs: RunRecord[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Handle /run <id> command - show run detail (returns structured data)
|
|
26
|
+
*/
|
|
27
|
+
handleRunDetail(_chatId: string, runId: string): {
|
|
28
|
+
run: RunRecord;
|
|
29
|
+
testSteps: RunStep[];
|
|
30
|
+
commitRefs: string[];
|
|
31
|
+
} | null;
|
|
32
|
+
/**
|
|
33
|
+
* Handle re-run request
|
|
34
|
+
*/
|
|
35
|
+
handleRerun(runId: string, userId: string, _chatId: string): Promise<{
|
|
36
|
+
text: string;
|
|
37
|
+
objective?: string;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Handle re-run tests from a run
|
|
41
|
+
*/
|
|
42
|
+
handleRerunTests(runId: string, userId: string, _chatId: string): Promise<{
|
|
43
|
+
text: string;
|
|
44
|
+
commands?: string[];
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Handle rollback request
|
|
48
|
+
*/
|
|
49
|
+
handleRollback(runId: string, userId: string, _chatId: string): Promise<{
|
|
50
|
+
text: string;
|
|
51
|
+
needsConfirm?: boolean;
|
|
52
|
+
confirmId?: string;
|
|
53
|
+
commitRef?: string;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Find a run by full or partial ID
|
|
57
|
+
*/
|
|
58
|
+
private findRun;
|
|
59
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Commands
|
|
3
|
+
*
|
|
4
|
+
* Handles /runs and /run <id> commands, providing timeline views,
|
|
5
|
+
* re-run, test re-run, and rollback functionality.
|
|
6
|
+
* Channel-agnostic - returns structured data for formatters.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Handles run-related commands and callbacks.
|
|
10
|
+
*/
|
|
11
|
+
export class RunCommands {
|
|
12
|
+
runTracker;
|
|
13
|
+
authManager;
|
|
14
|
+
constructor(runTracker, authManager) {
|
|
15
|
+
this.runTracker = runTracker;
|
|
16
|
+
this.authManager = authManager;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Handle /runs command - list recent runs (returns structured data)
|
|
20
|
+
*/
|
|
21
|
+
handleRunsList(_chatId, _userId, limit = 10) {
|
|
22
|
+
const runs = this.runTracker.listRuns(limit);
|
|
23
|
+
return { runs };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handle /run <id> command - show run detail (returns structured data)
|
|
27
|
+
*/
|
|
28
|
+
handleRunDetail(_chatId, runId) {
|
|
29
|
+
const run = this.findRun(runId);
|
|
30
|
+
if (!run)
|
|
31
|
+
return null;
|
|
32
|
+
const testSteps = this.runTracker.getTestSteps(run.id);
|
|
33
|
+
const commitRefs = this.runTracker.getCommitRefs(run.id);
|
|
34
|
+
return { run, testSteps, commitRefs };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Handle re-run request
|
|
38
|
+
*/
|
|
39
|
+
async handleRerun(runId, userId, _chatId) {
|
|
40
|
+
const run = this.findRun(runId);
|
|
41
|
+
if (!run) {
|
|
42
|
+
return { text: 'Run not found.' };
|
|
43
|
+
}
|
|
44
|
+
if (this.authManager) {
|
|
45
|
+
const decision = this.authManager.checkScope(userId, 'run-tests');
|
|
46
|
+
if (!decision.allowed) {
|
|
47
|
+
return { text: `Permission denied: ${decision.reason}` };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
text: `Re-running: ${run.objective}`,
|
|
52
|
+
objective: run.objective,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handle re-run tests from a run
|
|
57
|
+
*/
|
|
58
|
+
async handleRerunTests(runId, userId, _chatId) {
|
|
59
|
+
const run = this.findRun(runId);
|
|
60
|
+
if (!run) {
|
|
61
|
+
return { text: 'Run not found.' };
|
|
62
|
+
}
|
|
63
|
+
if (this.authManager) {
|
|
64
|
+
const decision = this.authManager.checkScope(userId, 'run-tests');
|
|
65
|
+
if (!decision.allowed) {
|
|
66
|
+
return { text: `Permission denied: ${decision.reason}` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const testSteps = this.runTracker.getTestSteps(run.id);
|
|
70
|
+
if (testSteps.length === 0) {
|
|
71
|
+
return { text: 'No test commands found in this run.' };
|
|
72
|
+
}
|
|
73
|
+
const commands = testSteps
|
|
74
|
+
.map((s) => s.args.command)
|
|
75
|
+
.filter(Boolean);
|
|
76
|
+
return {
|
|
77
|
+
text: `Re-running ${commands.length} test command(s)...`,
|
|
78
|
+
commands,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Handle rollback request
|
|
83
|
+
*/
|
|
84
|
+
async handleRollback(runId, userId, _chatId) {
|
|
85
|
+
const run = this.findRun(runId);
|
|
86
|
+
if (!run) {
|
|
87
|
+
return { text: 'Run not found.' };
|
|
88
|
+
}
|
|
89
|
+
if (this.authManager) {
|
|
90
|
+
const decision = this.authManager.checkScope(userId, 'deploy');
|
|
91
|
+
if (!decision.allowed) {
|
|
92
|
+
return { text: `Permission denied: requires 'deploy' scope. ${decision.reason || ''}` };
|
|
93
|
+
}
|
|
94
|
+
const confirm = this.authManager.requireDoubleConfirm(userId, 'rollback', `Rollback run ${runId} to previous state`);
|
|
95
|
+
return {
|
|
96
|
+
text: `Rollback requires confirmation. Press confirm within 2 minutes.`,
|
|
97
|
+
needsConfirm: true,
|
|
98
|
+
confirmId: confirm.id,
|
|
99
|
+
commitRef: this.runTracker.getCommitRefs(run.id)[0],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const commits = this.runTracker.getCommitRefs(run.id);
|
|
103
|
+
if (commits.length === 0) {
|
|
104
|
+
return { text: 'No commit refs found for rollback.' };
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
text: `Ready to rollback to before ${commits[0]}`,
|
|
108
|
+
commitRef: commits[0],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Find a run by full or partial ID
|
|
113
|
+
*/
|
|
114
|
+
findRun(idOrPartial) {
|
|
115
|
+
let run = this.runTracker.getRun(idOrPartial);
|
|
116
|
+
if (run)
|
|
117
|
+
return run;
|
|
118
|
+
const runs = this.runTracker.listRuns(100);
|
|
119
|
+
return runs.find((r) => r.id.startsWith(idOrPartial) || r.id.includes(idOrPartial));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=run-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-commands.js","sourceRoot":"","sources":["../../../src/channels/pro/run-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Tracker
|
|
3
|
+
*
|
|
4
|
+
* Records agent execution runs with step-by-step timelines,
|
|
5
|
+
* artifacts, and cost tracking. Supports replay and rollback.
|
|
6
|
+
* Channel-agnostic - formatting is handled by the ChannelProFormatter.
|
|
7
|
+
*/
|
|
8
|
+
import type { RunStatus, RunStep, RunArtifact, RunRecord } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Tracks agent execution runs with detailed timelines.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RunTracker {
|
|
13
|
+
private runs;
|
|
14
|
+
private activeRunId;
|
|
15
|
+
private runsDir;
|
|
16
|
+
constructor(runsDir?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Start a new run
|
|
19
|
+
*/
|
|
20
|
+
startRun(sessionId: string, objective: string, options?: {
|
|
21
|
+
chatId?: string;
|
|
22
|
+
userId?: string;
|
|
23
|
+
}): RunRecord;
|
|
24
|
+
/**
|
|
25
|
+
* Add a step to the active run
|
|
26
|
+
*/
|
|
27
|
+
addStep(runId: string, toolName: string, args: Record<string, unknown>, options?: {
|
|
28
|
+
turnId?: number;
|
|
29
|
+
}): RunStep;
|
|
30
|
+
/**
|
|
31
|
+
* Complete a step with its result
|
|
32
|
+
*/
|
|
33
|
+
completeStep(runId: string, stepId: string, result: string, success: boolean, filesChanged?: string[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Add an artifact to a run
|
|
36
|
+
*/
|
|
37
|
+
addArtifact(runId: string, artifact: RunArtifact): void;
|
|
38
|
+
/**
|
|
39
|
+
* Update token count and cost
|
|
40
|
+
*/
|
|
41
|
+
updateUsage(runId: string, tokenCount: number, cost: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* End a run
|
|
44
|
+
*/
|
|
45
|
+
endRun(runId: string, status: RunStatus): RunRecord | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get the active run
|
|
48
|
+
*/
|
|
49
|
+
getActiveRun(): RunRecord | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Get a run by ID
|
|
52
|
+
*/
|
|
53
|
+
getRun(id: string): RunRecord | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* List runs, most recent first
|
|
56
|
+
*/
|
|
57
|
+
listRuns(limit?: number): RunRecord[];
|
|
58
|
+
/**
|
|
59
|
+
* Get test steps from a run (for re-running tests)
|
|
60
|
+
*/
|
|
61
|
+
getTestSteps(runId: string): RunStep[];
|
|
62
|
+
/**
|
|
63
|
+
* Get the git commit refs from a run (for rollback)
|
|
64
|
+
*/
|
|
65
|
+
getCommitRefs(runId: string): string[];
|
|
66
|
+
static getStatusIcon(status: RunStatus): string;
|
|
67
|
+
static formatDuration(start: number, end?: number): string;
|
|
68
|
+
static formatArgs(args: Record<string, unknown>): string;
|
|
69
|
+
static truncate(str: string, maxLen: number): string;
|
|
70
|
+
private ensureDir;
|
|
71
|
+
private saveRun;
|
|
72
|
+
private loadAll;
|
|
73
|
+
private pruneOldRuns;
|
|
74
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Tracker
|
|
3
|
+
*
|
|
4
|
+
* Records agent execution runs with step-by-step timelines,
|
|
5
|
+
* artifacts, and cost tracking. Supports replay and rollback.
|
|
6
|
+
* Channel-agnostic - formatting is handled by the ChannelProFormatter.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, unlinkSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import os from 'os';
|
|
11
|
+
import { randomBytes } from 'crypto';
|
|
12
|
+
/** Max runs to retain */
|
|
13
|
+
const MAX_RUNS = 100;
|
|
14
|
+
/**
|
|
15
|
+
* Tracks agent execution runs with detailed timelines.
|
|
16
|
+
*/
|
|
17
|
+
export class RunTracker {
|
|
18
|
+
runs = new Map();
|
|
19
|
+
activeRunId = null;
|
|
20
|
+
runsDir;
|
|
21
|
+
constructor(runsDir) {
|
|
22
|
+
this.runsDir = runsDir || join(os.homedir(), '.codebuddy', 'channel-runs');
|
|
23
|
+
this.ensureDir();
|
|
24
|
+
this.loadAll();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Start a new run
|
|
28
|
+
*/
|
|
29
|
+
startRun(sessionId, objective, options) {
|
|
30
|
+
const id = `run_${Date.now().toString(36)}_${randomBytes(3).toString('hex')}`;
|
|
31
|
+
const run = {
|
|
32
|
+
id,
|
|
33
|
+
sessionId,
|
|
34
|
+
objective,
|
|
35
|
+
status: 'running',
|
|
36
|
+
steps: [],
|
|
37
|
+
artifacts: [],
|
|
38
|
+
tokenCount: 0,
|
|
39
|
+
totalCost: 0,
|
|
40
|
+
startedAt: Date.now(),
|
|
41
|
+
chatId: options?.chatId,
|
|
42
|
+
userId: options?.userId,
|
|
43
|
+
};
|
|
44
|
+
this.runs.set(id, run);
|
|
45
|
+
this.activeRunId = id;
|
|
46
|
+
this.saveRun(run);
|
|
47
|
+
this.pruneOldRuns();
|
|
48
|
+
return run;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Add a step to the active run
|
|
52
|
+
*/
|
|
53
|
+
addStep(runId, toolName, args, options) {
|
|
54
|
+
const run = this.runs.get(runId);
|
|
55
|
+
if (!run)
|
|
56
|
+
throw new Error(`Run ${runId} not found`);
|
|
57
|
+
const step = {
|
|
58
|
+
stepId: `step_${run.steps.length + 1}`,
|
|
59
|
+
toolName,
|
|
60
|
+
args,
|
|
61
|
+
startedAt: Date.now(),
|
|
62
|
+
turnId: options?.turnId,
|
|
63
|
+
};
|
|
64
|
+
run.steps.push(step);
|
|
65
|
+
return step;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Complete a step with its result
|
|
69
|
+
*/
|
|
70
|
+
completeStep(runId, stepId, result, success, filesChanged) {
|
|
71
|
+
const run = this.runs.get(runId);
|
|
72
|
+
if (!run)
|
|
73
|
+
return;
|
|
74
|
+
const step = run.steps.find((s) => s.stepId === stepId);
|
|
75
|
+
if (!step)
|
|
76
|
+
return;
|
|
77
|
+
step.result = result;
|
|
78
|
+
step.success = success;
|
|
79
|
+
step.endedAt = Date.now();
|
|
80
|
+
step.filesChanged = filesChanged;
|
|
81
|
+
this.saveRun(run);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Add an artifact to a run
|
|
85
|
+
*/
|
|
86
|
+
addArtifact(runId, artifact) {
|
|
87
|
+
const run = this.runs.get(runId);
|
|
88
|
+
if (!run)
|
|
89
|
+
return;
|
|
90
|
+
run.artifacts.push(artifact);
|
|
91
|
+
this.saveRun(run);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Update token count and cost
|
|
95
|
+
*/
|
|
96
|
+
updateUsage(runId, tokenCount, cost) {
|
|
97
|
+
const run = this.runs.get(runId);
|
|
98
|
+
if (!run)
|
|
99
|
+
return;
|
|
100
|
+
run.tokenCount = tokenCount;
|
|
101
|
+
run.totalCost = cost;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* End a run
|
|
105
|
+
*/
|
|
106
|
+
endRun(runId, status) {
|
|
107
|
+
const run = this.runs.get(runId);
|
|
108
|
+
if (!run)
|
|
109
|
+
return undefined;
|
|
110
|
+
run.status = status;
|
|
111
|
+
run.endedAt = Date.now();
|
|
112
|
+
if (this.activeRunId === runId) {
|
|
113
|
+
this.activeRunId = null;
|
|
114
|
+
}
|
|
115
|
+
this.saveRun(run);
|
|
116
|
+
return run;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the active run
|
|
120
|
+
*/
|
|
121
|
+
getActiveRun() {
|
|
122
|
+
if (!this.activeRunId)
|
|
123
|
+
return undefined;
|
|
124
|
+
return this.runs.get(this.activeRunId);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get a run by ID
|
|
128
|
+
*/
|
|
129
|
+
getRun(id) {
|
|
130
|
+
return this.runs.get(id);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* List runs, most recent first
|
|
134
|
+
*/
|
|
135
|
+
listRuns(limit = 20) {
|
|
136
|
+
return Array.from(this.runs.values())
|
|
137
|
+
.sort((a, b) => b.startedAt - a.startedAt)
|
|
138
|
+
.slice(0, limit);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get test steps from a run (for re-running tests)
|
|
142
|
+
*/
|
|
143
|
+
getTestSteps(runId) {
|
|
144
|
+
const run = this.runs.get(runId);
|
|
145
|
+
if (!run)
|
|
146
|
+
return [];
|
|
147
|
+
return run.steps.filter((s) => s.toolName === 'bash' &&
|
|
148
|
+
(typeof s.args.command === 'string') &&
|
|
149
|
+
/\b(test|jest|pytest|mocha|vitest|npm\s+test)\b/i.test(s.args.command));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the git commit refs from a run (for rollback)
|
|
153
|
+
*/
|
|
154
|
+
getCommitRefs(runId) {
|
|
155
|
+
const run = this.runs.get(runId);
|
|
156
|
+
if (!run)
|
|
157
|
+
return [];
|
|
158
|
+
return run.artifacts
|
|
159
|
+
.filter((a) => a.type === 'commit' && a.ref)
|
|
160
|
+
.map((a) => a.ref);
|
|
161
|
+
}
|
|
162
|
+
// Static utility methods (used by formatters)
|
|
163
|
+
static getStatusIcon(status) {
|
|
164
|
+
switch (status) {
|
|
165
|
+
case 'running': return '[RUN]';
|
|
166
|
+
case 'completed': return '[DONE]';
|
|
167
|
+
case 'failed': return '[FAIL]';
|
|
168
|
+
case 'cancelled': return '[STOP]';
|
|
169
|
+
case 'rolled_back': return '[UNDO]';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
static formatDuration(start, end) {
|
|
173
|
+
const ms = (end || Date.now()) - start;
|
|
174
|
+
if (ms < 1000)
|
|
175
|
+
return `${ms}ms`;
|
|
176
|
+
if (ms < 60000)
|
|
177
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
178
|
+
const mins = Math.floor(ms / 60000);
|
|
179
|
+
const secs = Math.floor((ms % 60000) / 1000);
|
|
180
|
+
return `${mins}m${secs}s`;
|
|
181
|
+
}
|
|
182
|
+
static formatArgs(args) {
|
|
183
|
+
if (typeof args.command === 'string') {
|
|
184
|
+
return RunTracker.truncate(args.command, 80);
|
|
185
|
+
}
|
|
186
|
+
if (typeof args.path === 'string') {
|
|
187
|
+
return args.path;
|
|
188
|
+
}
|
|
189
|
+
const keys = Object.keys(args);
|
|
190
|
+
if (keys.length === 0)
|
|
191
|
+
return '';
|
|
192
|
+
return RunTracker.truncate(JSON.stringify(args), 80);
|
|
193
|
+
}
|
|
194
|
+
static truncate(str, maxLen) {
|
|
195
|
+
if (str.length <= maxLen)
|
|
196
|
+
return str;
|
|
197
|
+
return str.slice(0, maxLen - 3) + '...';
|
|
198
|
+
}
|
|
199
|
+
ensureDir() {
|
|
200
|
+
if (!existsSync(this.runsDir)) {
|
|
201
|
+
mkdirSync(this.runsDir, { recursive: true });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
saveRun(run) {
|
|
205
|
+
try {
|
|
206
|
+
const filePath = join(this.runsDir, `${run.id}.json`);
|
|
207
|
+
writeFileSync(filePath, JSON.stringify(run, null, 2));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Silently fail
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
loadAll() {
|
|
214
|
+
try {
|
|
215
|
+
if (!existsSync(this.runsDir))
|
|
216
|
+
return;
|
|
217
|
+
const files = readdirSync(this.runsDir).filter((f) => f.endsWith('.json'));
|
|
218
|
+
for (const file of files) {
|
|
219
|
+
try {
|
|
220
|
+
const data = JSON.parse(readFileSync(join(this.runsDir, file), 'utf-8'));
|
|
221
|
+
this.runs.set(data.id, data);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Skip malformed files
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Ignore
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
pruneOldRuns() {
|
|
233
|
+
if (this.runs.size <= MAX_RUNS)
|
|
234
|
+
return;
|
|
235
|
+
const sorted = Array.from(this.runs.entries())
|
|
236
|
+
.sort((a, b) => b[1].startedAt - a[1].startedAt);
|
|
237
|
+
const toRemove = sorted.slice(MAX_RUNS);
|
|
238
|
+
for (const [id] of toRemove) {
|
|
239
|
+
this.runs.delete(id);
|
|
240
|
+
try {
|
|
241
|
+
const filePath = join(this.runsDir, `${id}.json`);
|
|
242
|
+
if (existsSync(filePath)) {
|
|
243
|
+
unlinkSync(filePath);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Ignore
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=run-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tracker.js","sourceRoot":"","sources":["../../../src/channels/pro/run-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,yBAAyB;AACzB,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,IAAI,GAA2B,IAAI,GAAG,EAAE,CAAC;IACzC,WAAW,GAAkB,IAAI,CAAC;IAClC,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,SAAiB,EACjB,SAAiB,EACjB,OAA8C;QAE9C,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAE9E,MAAM,GAAG,GAAc;YACrB,EAAE;YACF,SAAS;YACT,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,OAAO,CACL,KAAa,EACb,QAAgB,EAChB,IAA6B,EAC7B,OAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAY;YACpB,MAAM,EAAE,QAAQ,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,QAAQ;YACR,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC;QAEF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,YAAY,CACV,KAAa,EACb,MAAc,EACd,MAAc,EACd,OAAgB,EAChB,YAAuB;QAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa,EAAE,QAAqB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa,EAAE,UAAkB,EAAE,IAAY;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa,EAAE,MAAiB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAgB,EAAE;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;aACzC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM;YAC1B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;YACpC,iDAAiD,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAiB,CAAC,CACnF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAa;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,SAAS;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC;IACxB,CAAC;IAED,8CAA8C;IAE9C,MAAM,CAAC,aAAa,CAAC,MAAiB;QACpC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC;YAC/B,KAAK,WAAW,CAAC,CAAC,OAAO,QAAQ,CAAC;YAClC,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC/B,KAAK,WAAW,CAAC,CAAC,OAAO,QAAQ,CAAC;YAClC,KAAK,aAAa,CAAC,CAAC,OAAO,QAAQ,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,GAAY;QAC/C,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QACvC,IAAI,EAAE,GAAG,IAAI;YAAE,OAAO,GAAG,EAAE,IAAI,CAAC;QAChC,IAAI,EAAE,GAAG,KAAK;YAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAA6B;QAC7C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW,EAAE,MAAc;QACzC,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;YAAE,OAAO,GAAG,CAAC;QACrC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAC1C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,GAAc;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACtD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO;YACtC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBACzE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ;YAAE,OAAO;QAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoped Authorization Manager
|
|
3
|
+
*
|
|
4
|
+
* Enterprise-grade permission model for channel interactions.
|
|
5
|
+
* Supports tiered scopes, secret handles, temporary access, and double confirmation.
|
|
6
|
+
* Channel-agnostic - works with any channel adapter.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuthScope, AuthDecision, ScopedPermission, SecretHandle, PendingConfirm, TemporaryAccess, ScopeCheckContext } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Manages scoped authorization for channel users.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ScopedAuthManager {
|
|
13
|
+
private permissions;
|
|
14
|
+
private secrets;
|
|
15
|
+
private temporaryAccess;
|
|
16
|
+
private pendingConfirms;
|
|
17
|
+
private configPath;
|
|
18
|
+
private adminUsers;
|
|
19
|
+
/** Confirmation timeout in ms (default 2 minutes) */
|
|
20
|
+
private confirmTimeoutMs;
|
|
21
|
+
constructor(adminUsers?: string[], configDir?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Check if a user has the required scope
|
|
24
|
+
*/
|
|
25
|
+
checkScope(userId: string, scope: AuthScope, context?: ScopeCheckContext): AuthDecision;
|
|
26
|
+
/**
|
|
27
|
+
* Grant scopes to a user
|
|
28
|
+
*/
|
|
29
|
+
grantScope(userId: string, scopes: AuthScope[], options?: {
|
|
30
|
+
repos?: string[];
|
|
31
|
+
folders?: string[];
|
|
32
|
+
denyCommands?: string[];
|
|
33
|
+
ttlMs?: number;
|
|
34
|
+
grantedBy?: string;
|
|
35
|
+
}): ScopedPermission;
|
|
36
|
+
/**
|
|
37
|
+
* Revoke all scopes from a user
|
|
38
|
+
*/
|
|
39
|
+
revokeScope(userId: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get permissions for a user
|
|
42
|
+
*/
|
|
43
|
+
getPermission(userId: string): ScopedPermission | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* List all permissions
|
|
46
|
+
*/
|
|
47
|
+
listPermissions(): ScopedPermission[];
|
|
48
|
+
/**
|
|
49
|
+
* Register a secret handle (maps friendly name to env var)
|
|
50
|
+
*/
|
|
51
|
+
registerSecret(handle: string, envVar: string, description?: string): SecretHandle;
|
|
52
|
+
/**
|
|
53
|
+
* Resolve a secret handle to its value (from env)
|
|
54
|
+
*/
|
|
55
|
+
resolveSecret(handle: string): string | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* List secret handles (never exposes values)
|
|
58
|
+
*/
|
|
59
|
+
listHandles(): Array<{
|
|
60
|
+
handle: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
hasValue: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Remove a secret handle
|
|
66
|
+
*/
|
|
67
|
+
removeSecret(handle: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Grant temporary full access to a user
|
|
70
|
+
*/
|
|
71
|
+
grantTemporaryFullAccess(userId: string, durationMs: number, grantedBy?: string): TemporaryAccess;
|
|
72
|
+
/**
|
|
73
|
+
* Revoke temporary access
|
|
74
|
+
*/
|
|
75
|
+
revokeTemporaryAccess(userId: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Require double confirmation for a risky operation
|
|
78
|
+
*/
|
|
79
|
+
requireDoubleConfirm(userId: string, operation: string, details?: string): PendingConfirm;
|
|
80
|
+
/**
|
|
81
|
+
* Verify a double confirmation
|
|
82
|
+
*/
|
|
83
|
+
verifyDoubleConfirm(confirmId: string, userId: string): {
|
|
84
|
+
valid: boolean;
|
|
85
|
+
reason?: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Check if user is an admin
|
|
89
|
+
*/
|
|
90
|
+
isAdmin(userId: string): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Clean up expired entries
|
|
93
|
+
*/
|
|
94
|
+
cleanup(): void;
|
|
95
|
+
private load;
|
|
96
|
+
private save;
|
|
97
|
+
}
|