codekin 0.2.2 → 0.3.1

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 (64) hide show
  1. package/dist/assets/index-CYGuwwHU.js +183 -0
  2. package/dist/assets/index-DW70VouA.css +1 -0
  3. package/dist/index.html +3 -3
  4. package/package.json +8 -5
  5. package/server/dist/approval-manager.d.ts +71 -0
  6. package/server/dist/approval-manager.js +249 -0
  7. package/server/dist/approval-manager.js.map +1 -0
  8. package/server/dist/auth-routes.d.ts +11 -0
  9. package/server/dist/auth-routes.js +11 -0
  10. package/server/dist/auth-routes.js.map +1 -1
  11. package/server/dist/claude-process.js +25 -4
  12. package/server/dist/claude-process.js.map +1 -1
  13. package/server/dist/config.d.ts +1 -2
  14. package/server/dist/config.js +16 -4
  15. package/server/dist/config.js.map +1 -1
  16. package/server/dist/crypto-utils.d.ts +16 -1
  17. package/server/dist/crypto-utils.js +44 -1
  18. package/server/dist/crypto-utils.js.map +1 -1
  19. package/server/dist/docs-routes.d.ts +16 -0
  20. package/server/dist/docs-routes.js +141 -0
  21. package/server/dist/docs-routes.js.map +1 -0
  22. package/server/dist/session-manager.d.ts +37 -84
  23. package/server/dist/session-manager.js +95 -472
  24. package/server/dist/session-manager.js.map +1 -1
  25. package/server/dist/session-naming.d.ts +35 -0
  26. package/server/dist/session-naming.js +168 -0
  27. package/server/dist/session-naming.js.map +1 -0
  28. package/server/dist/session-persistence.d.ts +30 -0
  29. package/server/dist/session-persistence.js +93 -0
  30. package/server/dist/session-persistence.js.map +1 -0
  31. package/server/dist/session-routes.d.ts +2 -1
  32. package/server/dist/session-routes.js +11 -8
  33. package/server/dist/session-routes.js.map +1 -1
  34. package/server/dist/stepflow-handler.d.ts +3 -9
  35. package/server/dist/stepflow-handler.js +19 -54
  36. package/server/dist/stepflow-handler.js.map +1 -1
  37. package/server/dist/types.d.ts +7 -0
  38. package/server/dist/upload-routes.js +6 -3
  39. package/server/dist/upload-routes.js.map +1 -1
  40. package/server/dist/webhook-github.d.ts +23 -5
  41. package/server/dist/webhook-github.js +23 -5
  42. package/server/dist/webhook-github.js.map +1 -1
  43. package/server/dist/webhook-handler-base.d.ts +45 -0
  44. package/server/dist/webhook-handler-base.js +86 -0
  45. package/server/dist/webhook-handler-base.js.map +1 -0
  46. package/server/dist/webhook-handler.d.ts +3 -10
  47. package/server/dist/webhook-handler.js +6 -46
  48. package/server/dist/webhook-handler.js.map +1 -1
  49. package/server/dist/webhook-workspace.d.ts +8 -1
  50. package/server/dist/webhook-workspace.js +71 -47
  51. package/server/dist/webhook-workspace.js.map +1 -1
  52. package/server/dist/workflow-config.d.ts +2 -0
  53. package/server/dist/workflow-config.js +1 -1
  54. package/server/dist/workflow-config.js.map +1 -1
  55. package/server/dist/workflow-loader.d.ts +2 -0
  56. package/server/dist/workflow-loader.js +13 -9
  57. package/server/dist/workflow-loader.js.map +1 -1
  58. package/server/dist/workflow-routes.js +3 -2
  59. package/server/dist/workflow-routes.js.map +1 -1
  60. package/server/dist/ws-server.js +77 -16
  61. package/server/dist/ws-server.js.map +1 -1
  62. package/server/workflows/repo-health.weekly.md +111 -0
  63. package/dist/assets/index-CQdQ4FhF.css +0 -1
  64. package/dist/assets/index-D6pRORYQ.js +0 -115
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Abstract base class for webhook handlers (GitHub, Stepflow, etc.).
3
+ *
4
+ * Encapsulates the infrastructure that is identical across all webhook-style
5
+ * handlers:
6
+ * - In-memory event ring buffer (recordEvent / getEvents / getEvent)
7
+ * - Processing watchdog that marks stuck events as 'error'
8
+ * - Status update helper
9
+ * - Graceful shutdown of the watchdog interval
10
+ *
11
+ * Subclasses provide:
12
+ * - The concrete event type (WebhookEvent, StepflowEvent, …)
13
+ * - The concrete status type (WebhookEventStatus, StepflowEventStatus, …)
14
+ * - All domain-specific logic (signature verification, async processing, etc.)
15
+ */
16
+ const DEFAULT_MAX_EVENTS = 100;
17
+ export class WebhookHandlerBase {
18
+ logPrefix;
19
+ events = [];
20
+ _processingWatchdog = null;
21
+ maxEventHistory;
22
+ /**
23
+ * @param logPrefix Label used in watchdog console output, e.g. `'webhook'` or `'stepflow'`.
24
+ * @param timeoutMs How long an event may remain in `'processing'` before
25
+ * the watchdog marks it as `'error'`.
26
+ * @param maxEventHistory Maximum number of events stored in the ring buffer.
27
+ */
28
+ constructor(logPrefix, timeoutMs, maxEventHistory = DEFAULT_MAX_EVENTS) {
29
+ this.logPrefix = logPrefix;
30
+ this.maxEventHistory = maxEventHistory;
31
+ this._processingWatchdog = setInterval(() => {
32
+ const cutoff = Date.now() - timeoutMs;
33
+ for (const event of this.events) {
34
+ if (event.status === 'processing' && new Date(event.receivedAt).getTime() < cutoff) {
35
+ console.warn(`[${this.logPrefix}] Watchdog: event ${event.id} stuck in 'processing' for >${Math.round(timeoutMs / 60_000)}min, marking error`);
36
+ this.updateEventStatus(event.id, 'error', 'Processing timed out (watchdog)');
37
+ }
38
+ }
39
+ }, 60_000);
40
+ if (this._processingWatchdog.unref)
41
+ this._processingWatchdog.unref();
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Event ring buffer
45
+ // ---------------------------------------------------------------------------
46
+ /** Append an event to the in-memory ring buffer, trimming the oldest entry when full. */
47
+ recordEvent(event) {
48
+ this.events.push(event);
49
+ if (this.events.length > this.maxEventHistory) {
50
+ this.events = this.events.slice(-this.maxEventHistory);
51
+ }
52
+ }
53
+ /** Mutate an event's status in-place. */
54
+ updateEventStatus(eventId, status, error) {
55
+ const event = this.events.find(e => e.id === eventId);
56
+ if (event) {
57
+ event.status = status;
58
+ if (error)
59
+ event.error = error;
60
+ }
61
+ }
62
+ getEvents() {
63
+ return [...this.events];
64
+ }
65
+ getEvent(id) {
66
+ return this.events.find(e => e.id === id);
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Protected helpers for subclasses
70
+ // ---------------------------------------------------------------------------
71
+ /** Return events currently in a given status (useful for concurrency cap checks). */
72
+ countByStatus(status) {
73
+ return this.events.filter(e => e.status === status).length;
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Lifecycle
77
+ // ---------------------------------------------------------------------------
78
+ /** Stop the processing watchdog interval. Subclasses should call `super.shutdown()`. */
79
+ shutdown() {
80
+ if (this._processingWatchdog) {
81
+ clearInterval(this._processingWatchdog);
82
+ this._processingWatchdog = null;
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=webhook-handler-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-handler-base.js","sourceRoot":"","sources":["../webhook-handler-base.ts"],"names":[],"mappings":"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"}
@@ -17,15 +17,14 @@
17
17
  * concurrency cap from leaking on partial failures.
18
18
  */
19
19
  import type { SessionManager } from './session-manager.js';
20
- import type { WebhookConfig, WebhookEvent } from './webhook-types.js';
20
+ import type { WebhookConfig, WebhookEvent, WebhookEventStatus } from './webhook-types.js';
21
21
  import type { FullWebhookConfig } from './webhook-config.js';
22
- export declare class WebhookHandler {
22
+ import { WebhookHandlerBase } from './webhook-handler-base.js';
23
+ export declare class WebhookHandler extends WebhookHandlerBase<WebhookEvent, WebhookEventStatus> {
23
24
  private config;
24
25
  private sessions;
25
26
  private dedup;
26
- private events;
27
27
  private ghHealthy;
28
- private _processingWatchdog;
29
28
  constructor(config: FullWebhookConfig, sessions: SessionManager);
30
29
  /**
31
30
  * Run gh CLI health check. Must be called on startup.
@@ -58,12 +57,6 @@ export declare class WebhookHandler {
58
57
  * display the incoming webhook badge regardless of which session is active.
59
58
  */
60
59
  private broadcastWebhookEvent;
61
- /** Append an event to the in-memory ring buffer, trimming the oldest entry when full. */
62
- private recordEvent;
63
- /** Mutate an event's status in-place. Called from both the async path and the session-exit callback. */
64
- private updateEventStatus;
65
- getEvents(): WebhookEvent[];
66
- getEvent(id: string): WebhookEvent | undefined;
67
60
  getConfig(): WebhookConfig;
68
61
  shutdown(): void;
69
62
  }
@@ -22,17 +22,16 @@ import { WebhookDedup, computeIdempotencyKey } from './webhook-dedup.js';
22
22
  import { checkGhHealth, fetchFailedLogs, fetchJobs, fetchAnnotations, fetchCommitMessage, fetchPRTitle } from './webhook-github.js';
23
23
  import { buildPrompt } from './webhook-prompt.js';
24
24
  import { createWorkspace, cleanupWorkspace } from './webhook-workspace.js';
25
- const MAX_EVENT_HISTORY = 100;
25
+ import { WebhookHandlerBase } from './webhook-handler-base.js';
26
26
  /** How long an event can stay in 'processing' before the watchdog marks it as error. */
27
27
  const PROCESSING_TIMEOUT_MS = 5 * 60 * 1000;
28
- export class WebhookHandler {
28
+ export class WebhookHandler extends WebhookHandlerBase {
29
29
  config;
30
30
  sessions;
31
31
  dedup;
32
- events = [];
33
32
  ghHealthy = false;
34
- _processingWatchdog = null;
35
33
  constructor(config, sessions) {
34
+ super('webhook', PROCESSING_TIMEOUT_MS);
36
35
  this.config = config;
37
36
  this.sessions = sessions;
38
37
  this.dedup = new WebhookDedup();
@@ -44,7 +43,7 @@ export class WebhookHandler {
44
43
  return; // Don't update status — Claude will retry
45
44
  // Match any non-terminal status — covers both 'processing' (if Claude
46
45
  // exits before status reaches 'session_created') and 'session_created'.
47
- const event = this.events.find(e => e.sessionId === sessionId && (e.status === 'session_created' || e.status === 'processing'));
46
+ const event = this.getEvents().find(e => e.sessionId === sessionId && (e.status === 'session_created' || e.status === 'processing'));
48
47
  if (event) {
49
48
  const status = (code === 0) ? 'completed' : 'error';
50
49
  this.updateEventStatus(event.id, status, code !== 0 ? `Claude exited with code ${code}` : undefined);
@@ -53,19 +52,6 @@ export class WebhookHandler {
53
52
  cleanupWorkspace(sessionId);
54
53
  }
55
54
  });
56
- // Watchdog: mark 'processing' events as 'error' if stuck for >5 minutes.
57
- // Prevents permanently inflated concurrency counts from failed async processing.
58
- this._processingWatchdog = setInterval(() => {
59
- const cutoff = Date.now() - PROCESSING_TIMEOUT_MS;
60
- for (const event of this.events) {
61
- if (event.status === 'processing' && new Date(event.receivedAt).getTime() < cutoff) {
62
- console.warn(`[webhook] Watchdog: event ${event.id} stuck in 'processing' for >5min, marking error`);
63
- this.updateEventStatus(event.id, 'error', 'Processing timed out (watchdog)');
64
- }
65
- }
66
- }, 60_000);
67
- if (this._processingWatchdog.unref)
68
- this._processingWatchdog.unref();
69
55
  }
70
56
  /**
71
57
  * Run gh CLI health check. Must be called on startup.
@@ -176,7 +162,7 @@ export class WebhookHandler {
176
162
  // (session not yet created) to prevent concurrent webhooks from bypassing the
177
163
  // cap during the async setup window (gh API calls, workspace cloning, etc.).
178
164
  const activeWebhookSessions = this.sessions.list().filter(s => s.source === 'webhook' && s.active).length;
179
- const processingEvents = this.events.filter(e => e.status === 'processing').length;
165
+ const processingEvents = this.countByStatus('processing');
180
166
  const effectiveConcurrency = activeWebhookSessions + processingEvents;
181
167
  if (effectiveConcurrency >= this.config.maxConcurrentSessions) {
182
168
  this.recordEvent({
@@ -327,29 +313,6 @@ export class WebhookHandler {
327
313
  }
328
314
  }
329
315
  }
330
- // --- Event history management ---
331
- /** Append an event to the in-memory ring buffer, trimming the oldest entry when full. */
332
- recordEvent(event) {
333
- this.events.push(event);
334
- if (this.events.length > MAX_EVENT_HISTORY) {
335
- this.events = this.events.slice(-MAX_EVENT_HISTORY);
336
- }
337
- }
338
- /** Mutate an event's status in-place. Called from both the async path and the session-exit callback. */
339
- updateEventStatus(eventId, status, error) {
340
- const event = this.events.find(e => e.id === eventId);
341
- if (event) {
342
- event.status = status;
343
- if (error)
344
- event.error = error;
345
- }
346
- }
347
- getEvents() {
348
- return [...this.events];
349
- }
350
- getEvent(id) {
351
- return this.events.find(e => e.id === id);
352
- }
353
316
  getConfig() {
354
317
  return {
355
318
  enabled: this.config.enabled,
@@ -358,10 +321,7 @@ export class WebhookHandler {
358
321
  };
359
322
  }
360
323
  shutdown() {
361
- if (this._processingWatchdog) {
362
- clearInterval(this._processingWatchdog);
363
- this._processingWatchdog = null;
364
- }
324
+ super.shutdown();
365
325
  this.dedup.shutdown();
366
326
  }
367
327
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../webhook-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../webhook-handler.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,17 @@
2
2
  * Create an isolated workspace for a webhook session.
3
3
  * Clones from the bare mirror and checks out the target branch.
4
4
  *
5
- * Returns the workspace directory path.
5
+ * @param sessionId - Unique session ID, used as the workspace directory name.
6
+ * @param repo - GitHub repo in `owner/name` format.
7
+ * @param cloneUrl - HTTPS clone URL for git remote (must be a github.com URL).
8
+ * @param branch - Branch name to check out.
9
+ * @param headSha - Exact commit SHA to pin the workspace to.
10
+ * @returns The absolute path to the created workspace directory.
6
11
  */
7
12
  export declare function createWorkspace(sessionId: string, repo: string, cloneUrl: string, branch: string, headSha: string): Promise<string>;
8
13
  /**
9
14
  * Remove a workspace directory when a session closes.
15
+ *
16
+ * @param sessionId - Session ID whose workspace should be cleaned up.
10
17
  */
11
18
  export declare function cleanupWorkspace(sessionId: string): void;
@@ -59,63 +59,87 @@ async function ensureBareMirrorImpl(repo) {
59
59
  * Create an isolated workspace for a webhook session.
60
60
  * Clones from the bare mirror and checks out the target branch.
61
61
  *
62
- * Returns the workspace directory path.
62
+ * @param sessionId - Unique session ID, used as the workspace directory name.
63
+ * @param repo - GitHub repo in `owner/name` format.
64
+ * @param cloneUrl - HTTPS clone URL for git remote (must be a github.com URL).
65
+ * @param branch - Branch name to check out.
66
+ * @param headSha - Exact commit SHA to pin the workspace to.
67
+ * @returns The absolute path to the created workspace directory.
63
68
  */
64
69
  export async function createWorkspace(sessionId, repo, cloneUrl, branch, headSha) {
65
70
  const mirrorPath = await ensureBareMirror(repo);
66
71
  const workspacePath = join(WORKSPACES_DIR, sessionId);
67
72
  mkdirSync(workspacePath, { recursive: true });
68
- // Clone from local mirror
69
- console.log(`[webhook-workspace] Cloning workspace for session ${sessionId}...`);
70
- await execFileAsync('git', ['clone', mirrorPath, workspacePath], {
71
- timeout: GIT_TIMEOUT_MS,
72
- });
73
- // Validate cloneUrl — only allow HTTPS GitHub URLs
74
- if (!/^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(?:\.git)?$/.test(cloneUrl)) {
75
- throw new Error(`Invalid clone URL: ${cloneUrl}`);
73
+ let setupComplete = false;
74
+ try {
75
+ // Clone from local mirror
76
+ console.log(`[webhook-workspace] Cloning workspace for session ${sessionId}...`);
77
+ await execFileAsync('git', ['clone', mirrorPath, workspacePath], {
78
+ timeout: GIT_TIMEOUT_MS,
79
+ });
80
+ // Validate cloneUrl only allow HTTPS GitHub URLs
81
+ if (!/^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(?:\.git)?$/.test(cloneUrl)) {
82
+ throw new Error(`Invalid clone URL: ${cloneUrl}`);
83
+ }
84
+ // Validate branch name — only safe characters
85
+ if (!/^[a-zA-Z0-9/_.-]+$/.test(branch)) {
86
+ throw new Error(`Invalid branch name: ${branch}`);
87
+ }
88
+ // Set up remote to point to the real repo for pushes
89
+ await execFileAsync('git', ['remote', 'set-url', 'origin', cloneUrl], {
90
+ cwd: workspacePath,
91
+ timeout: GIT_TIMEOUT_MS,
92
+ });
93
+ // Fetch the specific branch
94
+ await execFileAsync('git', ['fetch', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`], { cwd: workspacePath, timeout: GIT_TIMEOUT_MS });
95
+ // Check out the branch (not detached HEAD) so Claude can commit and push fixes
96
+ console.log(`[webhook-workspace] Checking out branch ${branch}`);
97
+ await execFileAsync('git', ['checkout', '-B', branch, `origin/${branch}`], {
98
+ cwd: workspacePath,
99
+ timeout: GIT_TIMEOUT_MS,
100
+ });
101
+ // Pin to the exact commit that triggered the failure, so Claude works on the
102
+ // right code even if the branch has advanced since the webhook was sent.
103
+ console.log(`[webhook-workspace] Pinning to commit ${headSha.slice(0, 7)}`);
104
+ await execFileAsync('git', ['reset', '--hard', headSha], {
105
+ cwd: workspacePath,
106
+ timeout: GIT_TIMEOUT_MS,
107
+ });
108
+ // Set git author for webhook commits
109
+ await execFileAsync('git', ['config', 'user.name', 'Claude (Webhook)'], {
110
+ cwd: workspacePath,
111
+ timeout: GIT_TIMEOUT_MS,
112
+ });
113
+ await execFileAsync('git', ['config', 'user.email', 'claude-webhook@codekin.local'], {
114
+ cwd: workspacePath,
115
+ timeout: GIT_TIMEOUT_MS,
116
+ });
117
+ // Ensure gh credential helper is available for push
118
+ await execFileAsync('git', ['config', 'credential.helper', '!/usr/bin/gh auth git-credential'], {
119
+ cwd: workspacePath,
120
+ timeout: GIT_TIMEOUT_MS,
121
+ });
122
+ setupComplete = true;
123
+ return workspacePath;
76
124
  }
77
- // Validate branch name — only safe characters
78
- if (!/^[a-zA-Z0-9/_.-]+$/.test(branch)) {
79
- throw new Error(`Invalid branch name: ${branch}`);
125
+ finally {
126
+ // Clean up partial workspace on setup failure to prevent disk exhaustion
127
+ // and exposure of cloned source code from private repositories.
128
+ if (!setupComplete && existsSync(workspacePath)) {
129
+ try {
130
+ rmSync(workspacePath, { recursive: true, force: true });
131
+ console.warn(`[webhook-workspace] Cleaned up partial workspace for session ${sessionId} after setup failure`);
132
+ }
133
+ catch (cleanupErr) {
134
+ console.warn(`[webhook-workspace] Failed to clean up partial workspace ${workspacePath}:`, cleanupErr);
135
+ }
136
+ }
80
137
  }
81
- // Set up remote to point to the real repo for pushes
82
- await execFileAsync('git', ['remote', 'set-url', 'origin', cloneUrl], {
83
- cwd: workspacePath,
84
- timeout: GIT_TIMEOUT_MS,
85
- });
86
- // Fetch the specific branch
87
- await execFileAsync('git', ['fetch', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`], { cwd: workspacePath, timeout: GIT_TIMEOUT_MS });
88
- // Check out the branch (not detached HEAD) so Claude can commit and push fixes
89
- console.log(`[webhook-workspace] Checking out branch ${branch}`);
90
- await execFileAsync('git', ['checkout', '-B', branch, `origin/${branch}`], {
91
- cwd: workspacePath,
92
- timeout: GIT_TIMEOUT_MS,
93
- });
94
- // Pin to the exact commit that triggered the failure, so Claude works on the
95
- // right code even if the branch has advanced since the webhook was sent.
96
- console.log(`[webhook-workspace] Pinning to commit ${headSha.slice(0, 7)}`);
97
- await execFileAsync('git', ['reset', '--hard', headSha], {
98
- cwd: workspacePath,
99
- timeout: GIT_TIMEOUT_MS,
100
- });
101
- // Set git author for webhook commits
102
- await execFileAsync('git', ['config', 'user.name', 'Claude (Webhook)'], {
103
- cwd: workspacePath,
104
- timeout: GIT_TIMEOUT_MS,
105
- });
106
- await execFileAsync('git', ['config', 'user.email', 'claude-webhook@codekin.local'], {
107
- cwd: workspacePath,
108
- timeout: GIT_TIMEOUT_MS,
109
- });
110
- // Ensure gh credential helper is available for push
111
- await execFileAsync('git', ['config', 'credential.helper', '!/usr/bin/gh auth git-credential'], {
112
- cwd: workspacePath,
113
- timeout: GIT_TIMEOUT_MS,
114
- });
115
- return workspacePath;
116
138
  }
117
139
  /**
118
140
  * Remove a workspace directory when a session closes.
141
+ *
142
+ * @param sessionId - Session ID whose workspace should be cleaned up.
119
143
  */
120
144
  export function cleanupWorkspace(sessionId) {
121
145
  const workspacePath = join(WORKSPACES_DIR, sessionId);
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-workspace.js","sourceRoot":"","sources":["../webhook-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AACzC,MAAM,cAAc,GAAG,OAAO,CAAA;AAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AACzC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AAEnD,iFAAiF;AACjF,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAA;AAEtD;;;;;;GAMG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAAY;IAC1C,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACtD,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA;IAEjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;gBACxD,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,cAAc;aACxB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mDAAmD,IAAI,GAAG,EAAE,GAAG,CAAC,CAAA;YAC7E,0DAA0D;QAC5D,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEzC,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,KAAK,CAAC,CAAA;IACtE,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE;QAC7E,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,IAAY,EACZ,QAAgB,EAChB,MAAc,EACd,OAAe;IAEf,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;IACrD,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE7C,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,qDAAqD,SAAS,KAAK,CAAC,CAAA;IAChF,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE;QAC/D,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,mDAAmD;IACnD,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,qDAAqD;IACrD,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACpE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,4BAA4B;IAC5B,MAAM,aAAa,CACjB,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,MAAM,wBAAwB,MAAM,EAAE,CAAC,EAC1E,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,CAChD,CAAA;IAED,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAA;IAChE,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC,EAAE;QACzE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,6EAA6E;IAC7E,yEAAyE;IACzE,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC3E,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;QACvD,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,qCAAqC;IACrC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,CAAC,EAAE;QACtE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IACF,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,8BAA8B,CAAC,EAAE;QACnF,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,oDAAoD;IACpD,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,kCAAkC,CAAC,EAAE;QAC9F,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;IAEF,OAAO,aAAa,CAAA;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;IACrD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,wDAAwD,SAAS,EAAE,CAAC,CAAA;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oDAAoD,SAAS,GAAG,EAAE,GAAG,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"webhook-workspace.js","sourceRoot":"","sources":["../webhook-workspace.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export interface ReviewRepoConfig {
13
13
  /** Workflow kind to run. Defaults to 'code-review.daily'. */
14
14
  kind?: string;
15
15
  customPrompt?: string;
16
+ /** Claude model to use for this workflow (e.g. 'claude-sonnet-4-6'). Omit for system default. */
17
+ model?: string;
16
18
  }
17
19
  export interface WorkflowConfig {
18
20
  reviewRepos: ReviewRepoConfig[];
@@ -31,7 +31,7 @@ export function saveWorkflowConfig(config) {
31
31
  if (!existsSync(CONFIG_DIR)) {
32
32
  mkdirSync(CONFIG_DIR, { recursive: true });
33
33
  }
34
- writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
34
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 });
35
35
  }
36
36
  // ---------------------------------------------------------------------------
37
37
  // CRUD helpers
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../workflow-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../workflow-config.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@
20
20
  * outputDir: .codekin/reports/code-review
21
21
  * filenameSuffix: _code-review-daily.md
22
22
  * commitMessage: chore: code review
23
+ * model: claude-sonnet-4-6 # optional — defaults to system default
23
24
  * ---
24
25
  * You are performing a daily automated code review...
25
26
  *
@@ -41,6 +42,7 @@ export interface WorkflowDef {
41
42
  outputDir: string;
42
43
  filenameSuffix: string;
43
44
  commitMessage: string;
45
+ model?: string;
44
46
  prompt: string;
45
47
  }
46
48
  /**
@@ -20,6 +20,7 @@
20
20
  * outputDir: .codekin/reports/code-review
21
21
  * filenameSuffix: _code-review-daily.md
22
22
  * commitMessage: chore: code review
23
+ * model: claude-sonnet-4-6 # optional — defaults to system default
23
24
  * ---
24
25
  * You are performing a daily automated code review...
25
26
  *
@@ -27,9 +28,9 @@
27
28
  * Files whose `kind` matches a built-in override that built-in's prompt.
28
29
  * Files with a new `kind` register as standalone workflows for that repo.
29
30
  */
30
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs';
31
- import { execSync, execFileSync } from 'child_process';
32
- import { dirname, join, resolve } from 'path';
31
+ import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'fs';
32
+ import { execFileSync } from 'child_process';
33
+ import { dirname, join, sep } from 'path';
33
34
  import { REPOS_ROOT } from './config.js';
34
35
  import { fileURLToPath } from 'url';
35
36
  // ---------------------------------------------------------------------------
@@ -61,6 +62,7 @@ function parseMdWorkflow(content, sourcePath) {
61
62
  outputDir: meta.outputDir,
62
63
  filenameSuffix: meta.filenameSuffix,
63
64
  commitMessage: meta.commitMessage,
65
+ model: meta.model,
64
66
  prompt,
65
67
  };
66
68
  }
@@ -158,15 +160,15 @@ function registerWorkflow(engine, sessions, def) {
158
160
  const repoPath = input.repoPath;
159
161
  if (!repoPath)
160
162
  throw new Error('Missing repoPath in workflow input');
161
- const resolvedPath = resolve(repoPath);
162
- if (!resolvedPath.startsWith(REPOS_ROOT)) {
163
+ if (!existsSync(repoPath))
164
+ throw new Error(`Repository path does not exist: ${repoPath}`);
165
+ const resolvedPath = realpathSync(repoPath);
166
+ if (!resolvedPath.startsWith(REPOS_ROOT + sep)) {
163
167
  throw new Error(`Repository path ${resolvedPath} is outside REPOS_ROOT`);
164
168
  }
165
- if (!existsSync(resolvedPath))
166
- throw new Error(`Repository path does not exist: ${resolvedPath}`);
167
169
  try {
168
- const branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: repoPath, timeout: 5000 }).toString().trim();
169
- const lastCommit = execSync('git log -1 --oneline', { cwd: repoPath, timeout: 5000 }).toString().trim();
170
+ const branch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: repoPath, timeout: 5000 }).toString().trim();
171
+ const lastCommit = execFileSync('git', ['log', '-1', '--oneline'], { cwd: repoPath, timeout: 5000 }).toString().trim();
170
172
  const sinceTimestamp = input.sinceTimestamp;
171
173
  if (sinceTimestamp) {
172
174
  const newCommits = execFileSync('git', ['log', `--since=${sinceTimestamp}`, '--oneline'], { cwd: repoPath, timeout: 5000 }).toString().trim();
@@ -191,9 +193,11 @@ function registerWorkflow(engine, sessions, def) {
191
193
  handler: async (input, ctx) => {
192
194
  const repoPath = input.repoPath;
193
195
  const repoName = input.repoName || repoPath.split('/').pop() || 'unknown';
196
+ const model = input.model || def.model;
194
197
  const session = sessions.create(`${def.sessionPrefix}:${repoName}`, repoPath, {
195
198
  source: 'workflow',
196
199
  groupDir: repoPath,
200
+ model,
197
201
  });
198
202
  console.log(`[workflow:${def.kind}] Created session ${session.id} for ${repoName} (run ${ctx.runId})`);
199
203
  return { sessionId: session.id, repoPath, repoName, branch: input.branch, lastCommit: input.lastCommit };