@phuetz/code-buddy 0.1.24 → 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.
Files changed (258) hide show
  1. package/README.md +1049 -741
  2. package/dist/agent/codebuddy-agent.d.ts +5 -0
  3. package/dist/agent/codebuddy-agent.js +46 -1
  4. package/dist/agent/codebuddy-agent.js.map +1 -1
  5. package/dist/agent/execution/agent-executor.d.ts +12 -0
  6. package/dist/agent/execution/agent-executor.js +147 -6
  7. package/dist/agent/execution/agent-executor.js.map +1 -1
  8. package/dist/agent/lessons-tracker.d.ts +50 -0
  9. package/dist/agent/lessons-tracker.js +234 -0
  10. package/dist/agent/lessons-tracker.js.map +1 -0
  11. package/dist/agent/message-queue.d.ts +39 -2
  12. package/dist/agent/message-queue.js +67 -2
  13. package/dist/agent/message-queue.js.map +1 -1
  14. package/dist/agent/middleware/index.d.ts +1 -0
  15. package/dist/agent/middleware/index.js +1 -0
  16. package/dist/agent/middleware/index.js.map +1 -1
  17. package/dist/agent/middleware/workflow-guard.d.ts +21 -0
  18. package/dist/agent/middleware/workflow-guard.js +94 -0
  19. package/dist/agent/middleware/workflow-guard.js.map +1 -0
  20. package/dist/agent/repo-profiler.d.ts +61 -0
  21. package/dist/agent/repo-profiler.js +295 -0
  22. package/dist/agent/repo-profiler.js.map +1 -0
  23. package/dist/agent/response-constraint.d.ts +61 -0
  24. package/dist/agent/response-constraint.js +91 -0
  25. package/dist/agent/response-constraint.js.map +1 -0
  26. package/dist/agent/todo-tracker.d.ts +67 -0
  27. package/dist/agent/todo-tracker.js +245 -0
  28. package/dist/agent/todo-tracker.js.map +1 -0
  29. package/dist/agent/tool-handler.d.ts +11 -0
  30. package/dist/agent/tool-handler.js +79 -1
  31. package/dist/agent/tool-handler.js.map +1 -1
  32. package/dist/agent/types.d.ts +20 -2
  33. package/dist/agent/wide-research.d.ts +93 -0
  34. package/dist/agent/wide-research.js +232 -0
  35. package/dist/agent/wide-research.js.map +1 -0
  36. package/dist/channels/index.d.ts +2 -0
  37. package/dist/channels/index.js +2 -0
  38. package/dist/channels/index.js.map +1 -1
  39. package/dist/channels/pro/callback-router.d.ts +54 -0
  40. package/dist/channels/pro/callback-router.js +178 -0
  41. package/dist/channels/pro/callback-router.js.map +1 -0
  42. package/dist/channels/pro/ci-watcher.d.ts +86 -0
  43. package/dist/channels/pro/ci-watcher.js +343 -0
  44. package/dist/channels/pro/ci-watcher.js.map +1 -0
  45. package/dist/channels/pro/diff-first.d.ts +63 -0
  46. package/dist/channels/pro/diff-first.js +187 -0
  47. package/dist/channels/pro/diff-first.js.map +1 -0
  48. package/dist/channels/pro/enhanced-commands.d.ts +83 -0
  49. package/dist/channels/pro/enhanced-commands.js +218 -0
  50. package/dist/channels/pro/enhanced-commands.js.map +1 -0
  51. package/dist/channels/pro/index.d.ts +19 -0
  52. package/dist/channels/pro/index.js +21 -0
  53. package/dist/channels/pro/index.js.map +1 -0
  54. package/dist/channels/pro/pro-features.d.ts +79 -0
  55. package/dist/channels/pro/pro-features.js +203 -0
  56. package/dist/channels/pro/pro-features.js.map +1 -0
  57. package/dist/channels/pro/run-commands.d.ts +59 -0
  58. package/dist/channels/pro/run-commands.js +122 -0
  59. package/dist/channels/pro/run-commands.js.map +1 -0
  60. package/dist/channels/pro/run-tracker.d.ts +74 -0
  61. package/dist/channels/pro/run-tracker.js +252 -0
  62. package/dist/channels/pro/run-tracker.js.map +1 -0
  63. package/dist/channels/pro/scoped-auth.d.ts +97 -0
  64. package/dist/channels/pro/scoped-auth.js +340 -0
  65. package/dist/channels/pro/scoped-auth.js.map +1 -0
  66. package/dist/channels/pro/text-formatter.d.ts +27 -0
  67. package/dist/channels/pro/text-formatter.js +269 -0
  68. package/dist/channels/pro/text-formatter.js.map +1 -0
  69. package/dist/channels/pro/types.d.ts +242 -0
  70. package/dist/channels/pro/types.js +14 -0
  71. package/dist/channels/pro/types.js.map +1 -0
  72. package/dist/channels/streaming-policy.d.ts +66 -0
  73. package/dist/channels/streaming-policy.js +266 -0
  74. package/dist/channels/streaming-policy.js.map +1 -0
  75. package/dist/channels/telegram/ci-watcher.d.ts +5 -0
  76. package/dist/channels/telegram/ci-watcher.js +5 -0
  77. package/dist/channels/telegram/ci-watcher.js.map +1 -0
  78. package/dist/channels/telegram/client.d.ts +28 -0
  79. package/dist/channels/telegram/client.js +147 -1
  80. package/dist/channels/telegram/client.js.map +1 -1
  81. package/dist/channels/telegram/diff-first.d.ts +5 -0
  82. package/dist/channels/telegram/diff-first.js +5 -0
  83. package/dist/channels/telegram/diff-first.js.map +1 -0
  84. package/dist/channels/telegram/enhanced-commands.d.ts +6 -0
  85. package/dist/channels/telegram/enhanced-commands.js +6 -0
  86. package/dist/channels/telegram/enhanced-commands.js.map +1 -0
  87. package/dist/channels/telegram/index.d.ts +6 -0
  88. package/dist/channels/telegram/index.js +6 -0
  89. package/dist/channels/telegram/index.js.map +1 -1
  90. package/dist/channels/telegram/pro-formatter.d.ts +30 -0
  91. package/dist/channels/telegram/pro-formatter.js +276 -0
  92. package/dist/channels/telegram/pro-formatter.js.map +1 -0
  93. package/dist/channels/telegram/run-commands.d.ts +5 -0
  94. package/dist/channels/telegram/run-commands.js +6 -0
  95. package/dist/channels/telegram/run-commands.js.map +1 -0
  96. package/dist/channels/telegram/run-tracker.d.ts +5 -0
  97. package/dist/channels/telegram/run-tracker.js +5 -0
  98. package/dist/channels/telegram/run-tracker.js.map +1 -0
  99. package/dist/channels/telegram/scoped-auth.d.ts +6 -0
  100. package/dist/channels/telegram/scoped-auth.js +5 -0
  101. package/dist/channels/telegram/scoped-auth.js.map +1 -0
  102. package/dist/channels/telegram/types.d.ts +34 -0
  103. package/dist/codebuddy/client.js +14 -1
  104. package/dist/codebuddy/client.js.map +1 -1
  105. package/dist/commands/dev/index.d.ts +12 -0
  106. package/dist/commands/dev/index.js +231 -0
  107. package/dist/commands/dev/index.js.map +1 -0
  108. package/dist/commands/dev/workflows.d.ts +31 -0
  109. package/dist/commands/dev/workflows.js +214 -0
  110. package/dist/commands/dev/workflows.js.map +1 -0
  111. package/dist/commands/execpolicy.d.ts +17 -0
  112. package/dist/commands/execpolicy.js +155 -0
  113. package/dist/commands/execpolicy.js.map +1 -0
  114. package/dist/commands/knowledge.d.ts +13 -0
  115. package/dist/commands/knowledge.js +142 -0
  116. package/dist/commands/knowledge.js.map +1 -0
  117. package/dist/commands/lessons.d.ts +11 -0
  118. package/dist/commands/lessons.js +129 -0
  119. package/dist/commands/lessons.js.map +1 -0
  120. package/dist/commands/pairing.d.ts +14 -0
  121. package/dist/commands/pairing.js +132 -0
  122. package/dist/commands/pairing.js.map +1 -0
  123. package/dist/commands/research/index.d.ts +13 -0
  124. package/dist/commands/research/index.js +91 -0
  125. package/dist/commands/research/index.js.map +1 -0
  126. package/dist/commands/run-cli/index.d.ts +11 -0
  127. package/dist/commands/run-cli/index.js +49 -0
  128. package/dist/commands/run-cli/index.js.map +1 -0
  129. package/dist/commands/todos.d.ts +9 -0
  130. package/dist/commands/todos.js +119 -0
  131. package/dist/commands/todos.js.map +1 -0
  132. package/dist/config/toml-config.d.ts +21 -0
  133. package/dist/config/toml-config.js +15 -0
  134. package/dist/config/toml-config.js.map +1 -1
  135. package/dist/context/enhanced-compression.js +12 -1
  136. package/dist/context/enhanced-compression.js.map +1 -1
  137. package/dist/context/observation-variator.d.ts +44 -0
  138. package/dist/context/observation-variator.js +83 -0
  139. package/dist/context/observation-variator.js.map +1 -0
  140. package/dist/context/precompaction-flush.d.ts +40 -0
  141. package/dist/context/precompaction-flush.js +134 -0
  142. package/dist/context/precompaction-flush.js.map +1 -0
  143. package/dist/context/restorable-compression.d.ts +80 -0
  144. package/dist/context/restorable-compression.js +228 -0
  145. package/dist/context/restorable-compression.js.map +1 -0
  146. package/dist/daemon/daily-reset.d.ts +77 -0
  147. package/dist/daemon/daily-reset.js +175 -0
  148. package/dist/daemon/daily-reset.js.map +1 -0
  149. package/dist/daemon/index.d.ts +1 -0
  150. package/dist/daemon/index.js +1 -0
  151. package/dist/daemon/index.js.map +1 -1
  152. package/dist/index.js +53 -0
  153. package/dist/index.js.map +1 -1
  154. package/dist/knowledge/knowledge-manager.d.ts +77 -0
  155. package/dist/knowledge/knowledge-manager.js +244 -0
  156. package/dist/knowledge/knowledge-manager.js.map +1 -0
  157. package/dist/observability/run-store.d.ts +133 -0
  158. package/dist/observability/run-store.js +419 -0
  159. package/dist/observability/run-store.js.map +1 -0
  160. package/dist/observability/run-viewer.d.ts +33 -0
  161. package/dist/observability/run-viewer.js +254 -0
  162. package/dist/observability/run-viewer.js.map +1 -0
  163. package/dist/optimization/cache-breakpoints.d.ts +52 -0
  164. package/dist/optimization/cache-breakpoints.js +97 -0
  165. package/dist/optimization/cache-breakpoints.js.map +1 -0
  166. package/dist/persistence/session-store.d.ts +3 -1
  167. package/dist/persistence/session-store.js +1 -1
  168. package/dist/persistence/session-store.js.map +1 -1
  169. package/dist/prompts/system-base.js +51 -7
  170. package/dist/prompts/system-base.js.map +1 -1
  171. package/dist/prompts/variation-injector.d.ts +55 -0
  172. package/dist/prompts/variation-injector.js +171 -0
  173. package/dist/prompts/variation-injector.js.map +1 -0
  174. package/dist/prompts/workflow-rules.d.ts +10 -0
  175. package/dist/prompts/workflow-rules.js +79 -0
  176. package/dist/prompts/workflow-rules.js.map +1 -0
  177. package/dist/sandbox/execpolicy.d.ts +45 -0
  178. package/dist/sandbox/execpolicy.js +80 -0
  179. package/dist/sandbox/execpolicy.js.map +1 -1
  180. package/dist/sandbox/os-sandbox.d.ts +25 -0
  181. package/dist/sandbox/os-sandbox.js +73 -0
  182. package/dist/sandbox/os-sandbox.js.map +1 -1
  183. package/dist/security/security-audit.d.ts +10 -0
  184. package/dist/security/security-audit.js +116 -0
  185. package/dist/security/security-audit.js.map +1 -1
  186. package/dist/security/shell-env-policy.d.ts +45 -0
  187. package/dist/security/shell-env-policy.js +141 -0
  188. package/dist/security/shell-env-policy.js.map +1 -0
  189. package/dist/security/ssrf-guard.d.ts +61 -0
  190. package/dist/security/ssrf-guard.js +382 -0
  191. package/dist/security/ssrf-guard.js.map +1 -0
  192. package/dist/security/write-policy.d.ts +57 -0
  193. package/dist/security/write-policy.js +117 -0
  194. package/dist/security/write-policy.js.map +1 -0
  195. package/dist/services/prompt-builder.js +37 -0
  196. package/dist/services/prompt-builder.js.map +1 -1
  197. package/dist/themes/theme-schema.d.ts +10 -10
  198. package/dist/tools/ask-human-tool.d.ts +62 -0
  199. package/dist/tools/ask-human-tool.js +112 -0
  200. package/dist/tools/ask-human-tool.js.map +1 -0
  201. package/dist/tools/bash/bash-tool.d.ts +15 -0
  202. package/dist/tools/bash/bash-tool.js +62 -0
  203. package/dist/tools/bash/bash-tool.js.map +1 -1
  204. package/dist/tools/bash/command-validator.d.ts +1 -0
  205. package/dist/tools/bash/command-validator.js +5 -0
  206. package/dist/tools/bash/command-validator.js.map +1 -1
  207. package/dist/tools/create-skill-tool.d.ts +87 -0
  208. package/dist/tools/create-skill-tool.js +142 -0
  209. package/dist/tools/create-skill-tool.js.map +1 -0
  210. package/dist/tools/fetch-tool.js +5 -3
  211. package/dist/tools/fetch-tool.js.map +1 -1
  212. package/dist/tools/hooks/default-hooks.js +24 -23
  213. package/dist/tools/hooks/default-hooks.js.map +1 -1
  214. package/dist/tools/index.d.ts +1 -0
  215. package/dist/tools/index.js +1 -0
  216. package/dist/tools/index.js.map +1 -1
  217. package/dist/tools/plan-tool.d.ts +22 -0
  218. package/dist/tools/plan-tool.js +128 -0
  219. package/dist/tools/plan-tool.js.map +1 -0
  220. package/dist/tools/registry/attention-tools.d.ts +32 -0
  221. package/dist/tools/registry/attention-tools.js +225 -0
  222. package/dist/tools/registry/attention-tools.js.map +1 -0
  223. package/dist/tools/registry/index.d.ts +9 -1
  224. package/dist/tools/registry/index.js +30 -2
  225. package/dist/tools/registry/index.js.map +1 -1
  226. package/dist/tools/registry/knowledge-tools.d.ts +46 -0
  227. package/dist/tools/registry/knowledge-tools.js +293 -0
  228. package/dist/tools/registry/knowledge-tools.js.map +1 -0
  229. package/dist/tools/registry/lessons-tools.d.ts +48 -0
  230. package/dist/tools/registry/lessons-tools.js +359 -0
  231. package/dist/tools/registry/lessons-tools.js.map +1 -0
  232. package/dist/tools/registry/plan-tools.d.ts +2 -0
  233. package/dist/tools/registry/plan-tools.js +7 -0
  234. package/dist/tools/registry/plan-tools.js.map +1 -0
  235. package/dist/tools/registry/script-tools.d.ts +2 -0
  236. package/dist/tools/registry/script-tools.js +7 -0
  237. package/dist/tools/registry/script-tools.js.map +1 -0
  238. package/dist/tools/registry/tool-aliases.d.ts +44 -0
  239. package/dist/tools/registry/tool-aliases.js +130 -0
  240. package/dist/tools/registry/tool-aliases.js.map +1 -0
  241. package/dist/tools/run-script-tool.d.ts +13 -0
  242. package/dist/tools/run-script-tool.js +146 -0
  243. package/dist/tools/run-script-tool.js.map +1 -0
  244. package/dist/tools/web-search.d.ts +25 -0
  245. package/dist/tools/web-search.js +68 -6
  246. package/dist/tools/web-search.js.map +1 -1
  247. package/dist/utils/config-validation/schema.d.ts +2 -2
  248. package/dist/utils/debug-logger.d.ts +1 -1
  249. package/dist/utils/rtk-compressor.d.ts +13 -10
  250. package/dist/utils/rtk-compressor.js +83 -34
  251. package/dist/utils/rtk-compressor.js.map +1 -1
  252. package/dist/utils/stable-json.d.ts +27 -0
  253. package/dist/utils/stable-json.js +50 -0
  254. package/dist/utils/stable-json.js.map +1 -0
  255. package/dist/webhooks/webhook-manager.d.ts +7 -0
  256. package/dist/webhooks/webhook-manager.js +29 -0
  257. package/dist/webhooks/webhook-manager.js.map +1 -1
  258. 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":"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"}
@@ -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
+ }