steroids-api 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/API/src/index.d.ts +10 -0
- package/dist/API/src/index.d.ts.map +1 -0
- package/dist/API/src/index.js +130 -0
- package/dist/API/src/index.js.map +1 -0
- package/dist/API/src/routes/activity.d.ts +7 -0
- package/dist/API/src/routes/activity.d.ts.map +1 -0
- package/dist/API/src/routes/activity.js +252 -0
- package/dist/API/src/routes/activity.js.map +1 -0
- package/dist/API/src/routes/config.d.ts +7 -0
- package/dist/API/src/routes/config.d.ts.map +1 -0
- package/dist/API/src/routes/config.js +521 -0
- package/dist/API/src/routes/config.js.map +1 -0
- package/dist/API/src/routes/health.d.ts +7 -0
- package/dist/API/src/routes/health.d.ts.map +1 -0
- package/dist/API/src/routes/health.js +172 -0
- package/dist/API/src/routes/health.js.map +1 -0
- package/dist/API/src/routes/incidents.d.ts +7 -0
- package/dist/API/src/routes/incidents.d.ts.map +1 -0
- package/dist/API/src/routes/incidents.js +117 -0
- package/dist/API/src/routes/incidents.js.map +1 -0
- package/dist/API/src/routes/projects.d.ts +7 -0
- package/dist/API/src/routes/projects.d.ts.map +1 -0
- package/dist/API/src/routes/projects.js +398 -0
- package/dist/API/src/routes/projects.js.map +1 -0
- package/dist/API/src/routes/runners.d.ts +7 -0
- package/dist/API/src/routes/runners.d.ts.map +1 -0
- package/dist/API/src/routes/runners.js +242 -0
- package/dist/API/src/routes/runners.js.map +1 -0
- package/dist/API/src/routes/tasks.d.ts +7 -0
- package/dist/API/src/routes/tasks.d.ts.map +1 -0
- package/dist/API/src/routes/tasks.js +1007 -0
- package/dist/API/src/routes/tasks.js.map +1 -0
- package/dist/API/src/utils/validation.d.ts +22 -0
- package/dist/API/src/utils/validation.d.ts.map +1 -0
- package/dist/API/src/utils/validation.js +50 -0
- package/dist/API/src/utils/validation.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/activity.d.ts +7 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +252 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/config.d.ts +7 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +647 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/credit-alerts.d.ts +2 -0
- package/dist/routes/credit-alerts.d.ts.map +1 -0
- package/dist/routes/credit-alerts.js +97 -0
- package/dist/routes/credit-alerts.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +200 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/incidents.d.ts +7 -0
- package/dist/routes/incidents.d.ts.map +1 -0
- package/dist/routes/incidents.js +117 -0
- package/dist/routes/incidents.js.map +1 -0
- package/dist/routes/projects.d.ts +7 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +643 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/runners.d.ts +7 -0
- package/dist/routes/runners.d.ts.map +1 -0
- package/dist/routes/runners.js +299 -0
- package/dist/routes/runners.js.map +1 -0
- package/dist/routes/skills.d.ts +3 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +109 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/storage.d.ts +7 -0
- package/dist/routes/storage.d.ts.map +1 -0
- package/dist/routes/storage.js +93 -0
- package/dist/routes/storage.js.map +1 -0
- package/dist/routes/tasks.d.ts +7 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +1145 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/src/cleanup/invocation-logs.d.ts +30 -0
- package/dist/src/cleanup/invocation-logs.d.ts.map +1 -0
- package/dist/src/cleanup/invocation-logs.js +66 -0
- package/dist/src/cleanup/invocation-logs.js.map +1 -0
- package/dist/src/commands/loop-phases.d.ts +11 -0
- package/dist/src/commands/loop-phases.d.ts.map +1 -0
- package/dist/src/commands/loop-phases.js +304 -0
- package/dist/src/commands/loop-phases.js.map +1 -0
- package/dist/src/config/loader.d.ts +160 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +276 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/database/connection.d.ts +35 -0
- package/dist/src/database/connection.d.ts.map +1 -0
- package/dist/src/database/connection.js +197 -0
- package/dist/src/database/connection.js.map +1 -0
- package/dist/src/database/queries.d.ts +220 -0
- package/dist/src/database/queries.d.ts.map +1 -0
- package/dist/src/database/queries.js +589 -0
- package/dist/src/database/queries.js.map +1 -0
- package/dist/src/database/schema.d.ts +8 -0
- package/dist/src/database/schema.d.ts.map +1 -0
- package/dist/src/database/schema.js +184 -0
- package/dist/src/database/schema.js.map +1 -0
- package/dist/src/git/push.d.ts +26 -0
- package/dist/src/git/push.d.ts.map +1 -0
- package/dist/src/git/push.js +91 -0
- package/dist/src/git/push.js.map +1 -0
- package/dist/src/git/status.d.ts +83 -0
- package/dist/src/git/status.d.ts.map +1 -0
- package/dist/src/git/status.js +315 -0
- package/dist/src/git/status.js.map +1 -0
- package/dist/src/health/stuck-task-detector.d.ts +131 -0
- package/dist/src/health/stuck-task-detector.d.ts.map +1 -0
- package/dist/src/health/stuck-task-detector.js +233 -0
- package/dist/src/health/stuck-task-detector.js.map +1 -0
- package/dist/src/health/stuck-task-recovery.d.ts +45 -0
- package/dist/src/health/stuck-task-recovery.d.ts.map +1 -0
- package/dist/src/health/stuck-task-recovery.js +309 -0
- package/dist/src/health/stuck-task-recovery.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +130 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/locking/queries.d.ts +116 -0
- package/dist/src/locking/queries.d.ts.map +1 -0
- package/dist/src/locking/queries.js +232 -0
- package/dist/src/locking/queries.js.map +1 -0
- package/dist/src/locking/section-lock.d.ts +74 -0
- package/dist/src/locking/section-lock.d.ts.map +1 -0
- package/dist/src/locking/section-lock.js +196 -0
- package/dist/src/locking/section-lock.js.map +1 -0
- package/dist/src/locking/task-lock.d.ts +92 -0
- package/dist/src/locking/task-lock.d.ts.map +1 -0
- package/dist/src/locking/task-lock.js +233 -0
- package/dist/src/locking/task-lock.js.map +1 -0
- package/dist/src/migrations/index.d.ts +7 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +9 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/migrations/manifest.d.ts +92 -0
- package/dist/src/migrations/manifest.d.ts.map +1 -0
- package/dist/src/migrations/manifest.js +255 -0
- package/dist/src/migrations/manifest.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +84 -0
- package/dist/src/migrations/runner.d.ts.map +1 -0
- package/dist/src/migrations/runner.js +338 -0
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/orchestrator/coder.d.ts +32 -0
- package/dist/src/orchestrator/coder.d.ts.map +1 -0
- package/dist/src/orchestrator/coder.js +170 -0
- package/dist/src/orchestrator/coder.js.map +1 -0
- package/dist/src/orchestrator/coordinator.d.ts +28 -0
- package/dist/src/orchestrator/coordinator.d.ts.map +1 -0
- package/dist/src/orchestrator/coordinator.js +252 -0
- package/dist/src/orchestrator/coordinator.js.map +1 -0
- package/dist/src/orchestrator/fallback-handler.d.ts +24 -0
- package/dist/src/orchestrator/fallback-handler.d.ts.map +1 -0
- package/dist/src/orchestrator/fallback-handler.js +280 -0
- package/dist/src/orchestrator/fallback-handler.js.map +1 -0
- package/dist/src/orchestrator/invoke.d.ts +14 -0
- package/dist/src/orchestrator/invoke.d.ts.map +1 -0
- package/dist/src/orchestrator/invoke.js +76 -0
- package/dist/src/orchestrator/invoke.js.map +1 -0
- package/dist/src/orchestrator/post-coder.d.ts +10 -0
- package/dist/src/orchestrator/post-coder.d.ts.map +1 -0
- package/dist/src/orchestrator/post-coder.js +198 -0
- package/dist/src/orchestrator/post-coder.js.map +1 -0
- package/dist/src/orchestrator/post-reviewer.d.ts +10 -0
- package/dist/src/orchestrator/post-reviewer.d.ts.map +1 -0
- package/dist/src/orchestrator/post-reviewer.js +199 -0
- package/dist/src/orchestrator/post-reviewer.js.map +1 -0
- package/dist/src/orchestrator/reviewer.d.ts +35 -0
- package/dist/src/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/src/orchestrator/reviewer.js +237 -0
- package/dist/src/orchestrator/reviewer.js.map +1 -0
- package/dist/src/orchestrator/schemas.d.ts +10 -0
- package/dist/src/orchestrator/schemas.d.ts.map +1 -0
- package/dist/src/orchestrator/schemas.js +81 -0
- package/dist/src/orchestrator/schemas.js.map +1 -0
- package/dist/src/orchestrator/task-selector.d.ts +102 -0
- package/dist/src/orchestrator/task-selector.d.ts.map +1 -0
- package/dist/src/orchestrator/task-selector.js +326 -0
- package/dist/src/orchestrator/task-selector.js.map +1 -0
- package/dist/src/orchestrator/types.d.ts +74 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -0
- package/dist/src/orchestrator/types.js +5 -0
- package/dist/src/orchestrator/types.js.map +1 -0
- package/dist/src/prompts/coder.d.ts +36 -0
- package/dist/src/prompts/coder.d.ts.map +1 -0
- package/dist/src/prompts/coder.js +303 -0
- package/dist/src/prompts/coder.js.map +1 -0
- package/dist/src/prompts/prompt-helpers.d.ts +51 -0
- package/dist/src/prompts/prompt-helpers.d.ts.map +1 -0
- package/dist/src/prompts/prompt-helpers.js +299 -0
- package/dist/src/prompts/prompt-helpers.js.map +1 -0
- package/dist/src/prompts/reviewer.d.ts +40 -0
- package/dist/src/prompts/reviewer.d.ts.map +1 -0
- package/dist/src/prompts/reviewer.js +416 -0
- package/dist/src/prompts/reviewer.js.map +1 -0
- package/dist/src/providers/claude.d.ts +53 -0
- package/dist/src/providers/claude.d.ts.map +1 -0
- package/dist/src/providers/claude.js +227 -0
- package/dist/src/providers/claude.js.map +1 -0
- package/dist/src/providers/codex.d.ts +53 -0
- package/dist/src/providers/codex.d.ts.map +1 -0
- package/dist/src/providers/codex.js +253 -0
- package/dist/src/providers/codex.js.map +1 -0
- package/dist/src/providers/gemini.d.ts +58 -0
- package/dist/src/providers/gemini.d.ts.map +1 -0
- package/dist/src/providers/gemini.js +240 -0
- package/dist/src/providers/gemini.js.map +1 -0
- package/dist/src/providers/interface.d.ts +185 -0
- package/dist/src/providers/interface.d.ts.map +1 -0
- package/dist/src/providers/interface.js +92 -0
- package/dist/src/providers/interface.js.map +1 -0
- package/dist/src/providers/invocation-logger.d.ts +97 -0
- package/dist/src/providers/invocation-logger.d.ts.map +1 -0
- package/dist/src/providers/invocation-logger.js +378 -0
- package/dist/src/providers/invocation-logger.js.map +1 -0
- package/dist/src/providers/openai.d.ts +53 -0
- package/dist/src/providers/openai.d.ts.map +1 -0
- package/dist/src/providers/openai.js +230 -0
- package/dist/src/providers/openai.js.map +1 -0
- package/dist/src/providers/registry.d.ts +100 -0
- package/dist/src/providers/registry.d.ts.map +1 -0
- package/dist/src/providers/registry.js +170 -0
- package/dist/src/providers/registry.js.map +1 -0
- package/dist/src/routes/activity.d.ts +7 -0
- package/dist/src/routes/activity.d.ts.map +1 -0
- package/dist/src/routes/activity.js +252 -0
- package/dist/src/routes/activity.js.map +1 -0
- package/dist/src/routes/config.d.ts +7 -0
- package/dist/src/routes/config.d.ts.map +1 -0
- package/dist/src/routes/config.js +521 -0
- package/dist/src/routes/config.js.map +1 -0
- package/dist/src/routes/health.d.ts +7 -0
- package/dist/src/routes/health.d.ts.map +1 -0
- package/dist/src/routes/health.js +172 -0
- package/dist/src/routes/health.js.map +1 -0
- package/dist/src/routes/incidents.d.ts +7 -0
- package/dist/src/routes/incidents.d.ts.map +1 -0
- package/dist/src/routes/incidents.js +117 -0
- package/dist/src/routes/incidents.js.map +1 -0
- package/dist/src/routes/projects.d.ts +7 -0
- package/dist/src/routes/projects.d.ts.map +1 -0
- package/dist/src/routes/projects.js +398 -0
- package/dist/src/routes/projects.js.map +1 -0
- package/dist/src/routes/runners.d.ts +7 -0
- package/dist/src/routes/runners.d.ts.map +1 -0
- package/dist/src/routes/runners.js +242 -0
- package/dist/src/routes/runners.js.map +1 -0
- package/dist/src/routes/tasks.d.ts +7 -0
- package/dist/src/routes/tasks.d.ts.map +1 -0
- package/dist/src/routes/tasks.js +1007 -0
- package/dist/src/routes/tasks.js.map +1 -0
- package/dist/src/runners/activity-log.d.ts +65 -0
- package/dist/src/runners/activity-log.d.ts.map +1 -0
- package/dist/src/runners/activity-log.js +140 -0
- package/dist/src/runners/activity-log.js.map +1 -0
- package/dist/src/runners/cron.d.ts +30 -0
- package/dist/src/runners/cron.d.ts.map +1 -0
- package/dist/src/runners/cron.js +333 -0
- package/dist/src/runners/cron.js.map +1 -0
- package/dist/src/runners/daemon.d.ts +71 -0
- package/dist/src/runners/daemon.d.ts.map +1 -0
- package/dist/src/runners/daemon.js +233 -0
- package/dist/src/runners/daemon.js.map +1 -0
- package/dist/src/runners/global-db.d.ts +31 -0
- package/dist/src/runners/global-db.d.ts.map +1 -0
- package/dist/src/runners/global-db.js +220 -0
- package/dist/src/runners/global-db.js.map +1 -0
- package/dist/src/runners/hang-detector.d.ts +38 -0
- package/dist/src/runners/hang-detector.d.ts.map +1 -0
- package/dist/src/runners/hang-detector.js +130 -0
- package/dist/src/runners/hang-detector.js.map +1 -0
- package/dist/src/runners/heartbeat.d.ts +39 -0
- package/dist/src/runners/heartbeat.d.ts.map +1 -0
- package/dist/src/runners/heartbeat.js +71 -0
- package/dist/src/runners/heartbeat.js.map +1 -0
- package/dist/src/runners/lock.d.ts +47 -0
- package/dist/src/runners/lock.d.ts.map +1 -0
- package/dist/src/runners/lock.js +140 -0
- package/dist/src/runners/lock.js.map +1 -0
- package/dist/src/runners/orchestrator-loop.d.ts +20 -0
- package/dist/src/runners/orchestrator-loop.d.ts.map +1 -0
- package/dist/src/runners/orchestrator-loop.js +208 -0
- package/dist/src/runners/orchestrator-loop.js.map +1 -0
- package/dist/src/runners/projects.d.ts +96 -0
- package/dist/src/runners/projects.d.ts.map +1 -0
- package/dist/src/runners/projects.js +243 -0
- package/dist/src/runners/projects.js.map +1 -0
- package/dist/src/runners/wakeup.d.ts +37 -0
- package/dist/src/runners/wakeup.d.ts.map +1 -0
- package/dist/src/runners/wakeup.js +355 -0
- package/dist/src/runners/wakeup.js.map +1 -0
- package/dist/src/utils/validation.d.ts +22 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +50 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/utils/sqlite.d.ts +17 -0
- package/dist/utils/sqlite.d.ts.map +1 -0
- package/dist/utils/sqlite.js +27 -0
- package/dist/utils/sqlite.js.map +1 -0
- package/dist/utils/storage-cache.d.ts +33 -0
- package/dist/utils/storage-cache.d.ts.map +1 -0
- package/dist/utils/storage-cache.js +81 -0
- package/dist/utils/storage-cache.js.map +1 -0
- package/dist/utils/validation.d.ts +22 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +51 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +39 -0
- package/src/index.ts +199 -0
- package/src/routes/activity.ts +302 -0
- package/src/routes/config.ts +723 -0
- package/src/routes/credit-alerts.ts +73 -0
- package/src/routes/health.ts +219 -0
- package/src/routes/incidents.ts +131 -0
- package/src/routes/projects.ts +854 -0
- package/src/routes/runners.ts +357 -0
- package/src/routes/skills.ts +127 -0
- package/src/routes/storage.ts +108 -0
- package/src/routes/tasks.ts +1372 -0
- package/src/utils/sqlite.ts +36 -0
- package/src/utils/storage-cache.ts +107 -0
- package/src/utils/validation.ts +61 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader
|
|
3
|
+
* Loads and merges global and project config files
|
|
4
|
+
*/
|
|
5
|
+
export interface SteroidsConfig {
|
|
6
|
+
ai?: {
|
|
7
|
+
orchestrator?: {
|
|
8
|
+
provider?: 'claude' | 'gemini' | 'openai';
|
|
9
|
+
model?: string;
|
|
10
|
+
cli?: string;
|
|
11
|
+
};
|
|
12
|
+
coder?: {
|
|
13
|
+
provider?: 'claude' | 'gemini' | 'openai';
|
|
14
|
+
model?: string;
|
|
15
|
+
cli?: string;
|
|
16
|
+
};
|
|
17
|
+
reviewer?: {
|
|
18
|
+
provider?: 'claude' | 'gemini' | 'openai';
|
|
19
|
+
model?: string;
|
|
20
|
+
cli?: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
output?: {
|
|
24
|
+
format?: 'table' | 'json';
|
|
25
|
+
colors?: boolean;
|
|
26
|
+
verbose?: boolean;
|
|
27
|
+
};
|
|
28
|
+
git?: {
|
|
29
|
+
autoPush?: boolean;
|
|
30
|
+
remote?: string;
|
|
31
|
+
branch?: string;
|
|
32
|
+
commitPrefix?: string;
|
|
33
|
+
retryOnFailure?: boolean;
|
|
34
|
+
};
|
|
35
|
+
runners?: {
|
|
36
|
+
heartbeatInterval?: string;
|
|
37
|
+
staleTimeout?: string;
|
|
38
|
+
subprocessHangTimeout?: string;
|
|
39
|
+
maxConcurrent?: number;
|
|
40
|
+
logRetention?: string;
|
|
41
|
+
daemonLogs?: boolean;
|
|
42
|
+
};
|
|
43
|
+
health?: {
|
|
44
|
+
threshold?: number;
|
|
45
|
+
checks?: {
|
|
46
|
+
git?: boolean;
|
|
47
|
+
deps?: boolean;
|
|
48
|
+
tests?: boolean;
|
|
49
|
+
lint?: boolean;
|
|
50
|
+
};
|
|
51
|
+
orphanedTaskTimeout?: number;
|
|
52
|
+
maxCoderDuration?: number;
|
|
53
|
+
maxReviewerDuration?: number;
|
|
54
|
+
runnerHeartbeatTimeout?: number;
|
|
55
|
+
invocationStaleness?: number;
|
|
56
|
+
autoRecover?: boolean;
|
|
57
|
+
maxRecoveryAttempts?: number;
|
|
58
|
+
maxIncidentsPerHour?: number;
|
|
59
|
+
};
|
|
60
|
+
locking?: {
|
|
61
|
+
taskTimeout?: string;
|
|
62
|
+
sectionTimeout?: string;
|
|
63
|
+
waitTimeout?: string;
|
|
64
|
+
pollInterval?: string;
|
|
65
|
+
};
|
|
66
|
+
database?: {
|
|
67
|
+
autoMigrate?: boolean;
|
|
68
|
+
backupBeforeMigrate?: boolean;
|
|
69
|
+
};
|
|
70
|
+
logs?: {
|
|
71
|
+
retention?: string;
|
|
72
|
+
keepLogs?: boolean;
|
|
73
|
+
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
74
|
+
};
|
|
75
|
+
disputes?: {
|
|
76
|
+
timeoutDays?: number;
|
|
77
|
+
autoCreateOnMaxRejections?: boolean;
|
|
78
|
+
majorBlocksLoop?: boolean;
|
|
79
|
+
coordinatorCanDispute?: boolean;
|
|
80
|
+
};
|
|
81
|
+
projects?: {
|
|
82
|
+
scanPaths?: string[];
|
|
83
|
+
excludePatterns?: string[];
|
|
84
|
+
};
|
|
85
|
+
backup?: {
|
|
86
|
+
enabled?: boolean;
|
|
87
|
+
retention?: string;
|
|
88
|
+
includeConfig?: boolean;
|
|
89
|
+
includeLogs?: boolean;
|
|
90
|
+
};
|
|
91
|
+
build?: {
|
|
92
|
+
timeout?: string;
|
|
93
|
+
};
|
|
94
|
+
test?: {
|
|
95
|
+
timeout?: string;
|
|
96
|
+
};
|
|
97
|
+
webui?: {
|
|
98
|
+
port?: number;
|
|
99
|
+
host?: string;
|
|
100
|
+
auth?: boolean;
|
|
101
|
+
};
|
|
102
|
+
quality?: {
|
|
103
|
+
tests?: {
|
|
104
|
+
required?: boolean;
|
|
105
|
+
minCoverage?: number;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
sections?: {
|
|
109
|
+
batchMode?: boolean;
|
|
110
|
+
maxBatchSize?: number;
|
|
111
|
+
};
|
|
112
|
+
hooks?: unknown[];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Default configuration values
|
|
116
|
+
*/
|
|
117
|
+
export declare const DEFAULT_CONFIG: SteroidsConfig;
|
|
118
|
+
/**
|
|
119
|
+
* Get global config path (~/.steroids/config.yaml)
|
|
120
|
+
*/
|
|
121
|
+
export declare function getGlobalConfigPath(): string;
|
|
122
|
+
/**
|
|
123
|
+
* Get project config path (.steroids/config.yaml)
|
|
124
|
+
*/
|
|
125
|
+
export declare function getProjectConfigPath(projectPath?: string): string;
|
|
126
|
+
/**
|
|
127
|
+
* Load config from a file
|
|
128
|
+
* Returns empty object if file doesn't exist
|
|
129
|
+
*/
|
|
130
|
+
export declare function loadConfigFile(filePath: string): Partial<SteroidsConfig>;
|
|
131
|
+
/**
|
|
132
|
+
* Deep merge two config objects
|
|
133
|
+
* Second object values override first
|
|
134
|
+
*/
|
|
135
|
+
export declare function mergeConfigs(base: Partial<SteroidsConfig>, override: Partial<SteroidsConfig>): Partial<SteroidsConfig>;
|
|
136
|
+
/**
|
|
137
|
+
* Apply environment variable overrides
|
|
138
|
+
* STEROIDS_AI_CODER_MODEL -> ai.coder.model
|
|
139
|
+
*/
|
|
140
|
+
export declare function applyEnvOverrides(config: Partial<SteroidsConfig>): Partial<SteroidsConfig>;
|
|
141
|
+
/**
|
|
142
|
+
* Load merged configuration
|
|
143
|
+
* Priority: defaults < global < project < environment
|
|
144
|
+
*/
|
|
145
|
+
export declare function loadConfig(projectPath?: string): SteroidsConfig;
|
|
146
|
+
/**
|
|
147
|
+
* Save config to file
|
|
148
|
+
*/
|
|
149
|
+
export declare function saveConfig(config: Partial<SteroidsConfig>, filePath: string): void;
|
|
150
|
+
/**
|
|
151
|
+
* Get a config value by dot-notation path
|
|
152
|
+
* e.g., getConfigValue(config, 'ai.coder.model')
|
|
153
|
+
*/
|
|
154
|
+
export declare function getConfigValue(config: SteroidsConfig, path: string): unknown;
|
|
155
|
+
/**
|
|
156
|
+
* Set a config value by dot-notation path
|
|
157
|
+
* Returns a new config object with the value set
|
|
158
|
+
*/
|
|
159
|
+
export declare function setConfigValue(config: SteroidsConfig, path: string, value: unknown): SteroidsConfig;
|
|
160
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader
|
|
3
|
+
* Loads and merges global and project config files
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { join, dirname } from 'node:path';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { parse, stringify } from 'yaml';
|
|
9
|
+
const STEROIDS_DIR = '.steroids';
|
|
10
|
+
const CONFIG_FILE = 'config.yaml';
|
|
11
|
+
/**
|
|
12
|
+
* Default configuration values
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_CONFIG = {
|
|
15
|
+
ai: {
|
|
16
|
+
orchestrator: {
|
|
17
|
+
provider: 'claude',
|
|
18
|
+
model: 'claude-sonnet-4',
|
|
19
|
+
},
|
|
20
|
+
coder: {
|
|
21
|
+
provider: 'claude',
|
|
22
|
+
model: 'claude-sonnet-4',
|
|
23
|
+
},
|
|
24
|
+
reviewer: {
|
|
25
|
+
provider: 'claude',
|
|
26
|
+
model: 'claude-sonnet-4',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
output: {
|
|
30
|
+
format: 'table',
|
|
31
|
+
colors: true,
|
|
32
|
+
verbose: false,
|
|
33
|
+
},
|
|
34
|
+
git: {
|
|
35
|
+
autoPush: true,
|
|
36
|
+
remote: 'origin',
|
|
37
|
+
branch: 'main',
|
|
38
|
+
commitPrefix: '',
|
|
39
|
+
retryOnFailure: true,
|
|
40
|
+
},
|
|
41
|
+
runners: {
|
|
42
|
+
heartbeatInterval: '30s',
|
|
43
|
+
staleTimeout: '5m',
|
|
44
|
+
subprocessHangTimeout: '15m',
|
|
45
|
+
maxConcurrent: 1,
|
|
46
|
+
logRetention: '7d',
|
|
47
|
+
},
|
|
48
|
+
health: {
|
|
49
|
+
threshold: 80,
|
|
50
|
+
checks: {
|
|
51
|
+
git: true,
|
|
52
|
+
deps: true,
|
|
53
|
+
tests: true,
|
|
54
|
+
lint: true,
|
|
55
|
+
},
|
|
56
|
+
orphanedTaskTimeout: 600,
|
|
57
|
+
maxCoderDuration: 1800,
|
|
58
|
+
maxReviewerDuration: 900,
|
|
59
|
+
runnerHeartbeatTimeout: 300,
|
|
60
|
+
invocationStaleness: 600,
|
|
61
|
+
autoRecover: true,
|
|
62
|
+
maxRecoveryAttempts: 3,
|
|
63
|
+
maxIncidentsPerHour: 10,
|
|
64
|
+
},
|
|
65
|
+
locking: {
|
|
66
|
+
taskTimeout: '60m',
|
|
67
|
+
sectionTimeout: '120m',
|
|
68
|
+
waitTimeout: '30m',
|
|
69
|
+
pollInterval: '5s',
|
|
70
|
+
},
|
|
71
|
+
database: {
|
|
72
|
+
autoMigrate: true,
|
|
73
|
+
backupBeforeMigrate: true,
|
|
74
|
+
},
|
|
75
|
+
logs: {
|
|
76
|
+
retention: '30d',
|
|
77
|
+
keepLogs: true,
|
|
78
|
+
level: 'info',
|
|
79
|
+
},
|
|
80
|
+
disputes: {
|
|
81
|
+
timeoutDays: 7,
|
|
82
|
+
autoCreateOnMaxRejections: true,
|
|
83
|
+
majorBlocksLoop: false,
|
|
84
|
+
},
|
|
85
|
+
projects: {
|
|
86
|
+
scanPaths: ['~/Projects'],
|
|
87
|
+
excludePatterns: ['node_modules', '.git'],
|
|
88
|
+
},
|
|
89
|
+
backup: {
|
|
90
|
+
enabled: true,
|
|
91
|
+
retention: '7d',
|
|
92
|
+
includeConfig: true,
|
|
93
|
+
includeLogs: false,
|
|
94
|
+
},
|
|
95
|
+
build: {
|
|
96
|
+
timeout: '5m',
|
|
97
|
+
},
|
|
98
|
+
test: {
|
|
99
|
+
timeout: '10m',
|
|
100
|
+
},
|
|
101
|
+
webui: {
|
|
102
|
+
port: 3000,
|
|
103
|
+
host: 'localhost',
|
|
104
|
+
auth: false,
|
|
105
|
+
},
|
|
106
|
+
quality: {
|
|
107
|
+
tests: {
|
|
108
|
+
required: false,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
sections: {
|
|
112
|
+
batchMode: false,
|
|
113
|
+
maxBatchSize: 10,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Get global config path (~/.steroids/config.yaml)
|
|
118
|
+
*/
|
|
119
|
+
export function getGlobalConfigPath() {
|
|
120
|
+
return join(homedir(), STEROIDS_DIR, CONFIG_FILE);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get project config path (.steroids/config.yaml)
|
|
124
|
+
*/
|
|
125
|
+
export function getProjectConfigPath(projectPath) {
|
|
126
|
+
const basePath = projectPath ?? process.cwd();
|
|
127
|
+
return join(basePath, STEROIDS_DIR, CONFIG_FILE);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Load config from a file
|
|
131
|
+
* Returns empty object if file doesn't exist
|
|
132
|
+
*/
|
|
133
|
+
export function loadConfigFile(filePath) {
|
|
134
|
+
if (!existsSync(filePath)) {
|
|
135
|
+
return {};
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
139
|
+
return parse(content) ?? {};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.warn(`Warning: Failed to parse config at ${filePath}`);
|
|
143
|
+
return {};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Deep merge two config objects
|
|
148
|
+
* Second object values override first
|
|
149
|
+
*/
|
|
150
|
+
export function mergeConfigs(base, override) {
|
|
151
|
+
const result = { ...base };
|
|
152
|
+
for (const key of Object.keys(override)) {
|
|
153
|
+
const baseValue = base[key];
|
|
154
|
+
const overrideValue = override[key];
|
|
155
|
+
// Skip "unset" values - empty strings, null, or undefined should not override base values
|
|
156
|
+
// This preserves base config when override has empty/unset values
|
|
157
|
+
// Note: We intentionally DO NOT skip false or 0, as these are legitimate override values
|
|
158
|
+
if (overrideValue === undefined || overrideValue === null || overrideValue === '') {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (baseValue !== null &&
|
|
162
|
+
typeof baseValue === 'object' &&
|
|
163
|
+
!Array.isArray(baseValue) &&
|
|
164
|
+
overrideValue !== null &&
|
|
165
|
+
typeof overrideValue === 'object' &&
|
|
166
|
+
!Array.isArray(overrideValue)) {
|
|
167
|
+
// Deep merge nested objects
|
|
168
|
+
result[key] = mergeConfigs(baseValue, overrideValue);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Override value
|
|
172
|
+
result[key] = overrideValue;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Apply environment variable overrides
|
|
179
|
+
* STEROIDS_AI_CODER_MODEL -> ai.coder.model
|
|
180
|
+
*/
|
|
181
|
+
export function applyEnvOverrides(config) {
|
|
182
|
+
const result = { ...config };
|
|
183
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
184
|
+
if (!key.startsWith('STEROIDS_'))
|
|
185
|
+
continue;
|
|
186
|
+
// Convert STEROIDS_AI_CODER_MODEL to ['ai', 'coder', 'model']
|
|
187
|
+
const path = key
|
|
188
|
+
.substring('STEROIDS_'.length)
|
|
189
|
+
.toLowerCase()
|
|
190
|
+
.split('_');
|
|
191
|
+
// Set nested value
|
|
192
|
+
let current = result;
|
|
193
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
194
|
+
if (!(path[i] in current) || typeof current[path[i]] !== 'object') {
|
|
195
|
+
current[path[i]] = {};
|
|
196
|
+
}
|
|
197
|
+
current = current[path[i]];
|
|
198
|
+
}
|
|
199
|
+
// Convert value type
|
|
200
|
+
const finalKey = path[path.length - 1];
|
|
201
|
+
if (value === 'true') {
|
|
202
|
+
current[finalKey] = true;
|
|
203
|
+
}
|
|
204
|
+
else if (value === 'false') {
|
|
205
|
+
current[finalKey] = false;
|
|
206
|
+
}
|
|
207
|
+
else if (!isNaN(Number(value))) {
|
|
208
|
+
current[finalKey] = Number(value);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
current[finalKey] = value;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Load merged configuration
|
|
218
|
+
* Priority: defaults < global < project < environment
|
|
219
|
+
*/
|
|
220
|
+
export function loadConfig(projectPath) {
|
|
221
|
+
// Start with defaults
|
|
222
|
+
let config = { ...DEFAULT_CONFIG };
|
|
223
|
+
// Load and merge global config
|
|
224
|
+
const globalConfig = loadConfigFile(getGlobalConfigPath());
|
|
225
|
+
config = mergeConfigs(config, globalConfig);
|
|
226
|
+
// Load and merge project config
|
|
227
|
+
const projectConfig = loadConfigFile(getProjectConfigPath(projectPath));
|
|
228
|
+
config = mergeConfigs(config, projectConfig);
|
|
229
|
+
// Apply environment overrides
|
|
230
|
+
config = applyEnvOverrides(config);
|
|
231
|
+
return config;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Save config to file
|
|
235
|
+
*/
|
|
236
|
+
export function saveConfig(config, filePath) {
|
|
237
|
+
const dir = dirname(filePath);
|
|
238
|
+
if (!existsSync(dir)) {
|
|
239
|
+
mkdirSync(dir, { recursive: true });
|
|
240
|
+
}
|
|
241
|
+
const content = stringify(config, { indent: 2 });
|
|
242
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get a config value by dot-notation path
|
|
246
|
+
* e.g., getConfigValue(config, 'ai.coder.model')
|
|
247
|
+
*/
|
|
248
|
+
export function getConfigValue(config, path) {
|
|
249
|
+
const parts = path.split('.');
|
|
250
|
+
let current = config;
|
|
251
|
+
for (const part of parts) {
|
|
252
|
+
if (current === null || typeof current !== 'object') {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
current = current[part];
|
|
256
|
+
}
|
|
257
|
+
return current;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Set a config value by dot-notation path
|
|
261
|
+
* Returns a new config object with the value set
|
|
262
|
+
*/
|
|
263
|
+
export function setConfigValue(config, path, value) {
|
|
264
|
+
const result = JSON.parse(JSON.stringify(config));
|
|
265
|
+
const parts = path.split('.');
|
|
266
|
+
let current = result;
|
|
267
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
268
|
+
if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') {
|
|
269
|
+
current[parts[i]] = {};
|
|
270
|
+
}
|
|
271
|
+
current = current[parts[i]];
|
|
272
|
+
}
|
|
273
|
+
current[parts[parts.length - 1]] = value;
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database connection management
|
|
3
|
+
* Uses better-sqlite3 for synchronous operations with WAL mode
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
export interface DatabaseConnection {
|
|
7
|
+
db: Database.Database;
|
|
8
|
+
close: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the steroids database
|
|
12
|
+
*/
|
|
13
|
+
export declare function getDbPath(projectPath?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Check if steroids is initialized in the given directory
|
|
16
|
+
*/
|
|
17
|
+
export declare function isInitialized(projectPath?: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the database with schema
|
|
20
|
+
*/
|
|
21
|
+
export declare function initDatabase(projectPath?: string): DatabaseConnection;
|
|
22
|
+
/**
|
|
23
|
+
* Open an existing database connection
|
|
24
|
+
* Automatically applies pending migrations if any are found
|
|
25
|
+
*/
|
|
26
|
+
export declare function openDatabase(projectPath?: string): DatabaseConnection;
|
|
27
|
+
/**
|
|
28
|
+
* Get schema version from database
|
|
29
|
+
*/
|
|
30
|
+
export declare function getSchemaVersion(db: Database.Database): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Check if database schema is current
|
|
33
|
+
*/
|
|
34
|
+
export declare function isSchemaUpToDate(db: Database.Database): boolean;
|
|
35
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/database/connection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAwBrE;AAyCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAoCrE;AAsED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI,CASrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAG/D"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database connection management
|
|
3
|
+
* Uses better-sqlite3 for synchronous operations with WAL mode
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { dirname, join } from 'node:path';
|
|
8
|
+
import { SCHEMA_SQL, INITIAL_SCHEMA_DATA, SCHEMA_VERSION } from './schema.js';
|
|
9
|
+
import { autoMigrate } from '../migrations/runner.js';
|
|
10
|
+
const STEROIDS_DIR = '.steroids';
|
|
11
|
+
const DB_NAME = 'steroids.db';
|
|
12
|
+
/**
|
|
13
|
+
* Get the path to the steroids database
|
|
14
|
+
*/
|
|
15
|
+
export function getDbPath(projectPath) {
|
|
16
|
+
const basePath = projectPath || process.cwd();
|
|
17
|
+
return join(basePath, STEROIDS_DIR, DB_NAME);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if steroids is initialized in the given directory
|
|
21
|
+
*/
|
|
22
|
+
export function isInitialized(projectPath) {
|
|
23
|
+
return existsSync(getDbPath(projectPath));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the database with schema
|
|
27
|
+
*/
|
|
28
|
+
export function initDatabase(projectPath) {
|
|
29
|
+
const dbPath = getDbPath(projectPath);
|
|
30
|
+
const steroidsDir = dirname(dbPath);
|
|
31
|
+
// Create .steroids directory if it doesn't exist
|
|
32
|
+
if (!existsSync(steroidsDir)) {
|
|
33
|
+
mkdirSync(steroidsDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
const db = new Database(dbPath);
|
|
36
|
+
// Configure SQLite for optimal performance and safety
|
|
37
|
+
db.pragma('journal_mode = WAL');
|
|
38
|
+
db.pragma('busy_timeout = 5000');
|
|
39
|
+
db.pragma('foreign_keys = ON');
|
|
40
|
+
// Create schema
|
|
41
|
+
db.exec(SCHEMA_SQL);
|
|
42
|
+
db.exec(INITIAL_SCHEMA_DATA);
|
|
43
|
+
return {
|
|
44
|
+
db,
|
|
45
|
+
close: () => db.close(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if an error is a schema mismatch (missing column/table)
|
|
50
|
+
*/
|
|
51
|
+
function isSchemaMismatchError(err) {
|
|
52
|
+
if (!(err instanceof Error))
|
|
53
|
+
return false;
|
|
54
|
+
const msg = err.message.toLowerCase();
|
|
55
|
+
return (msg.includes('has no column named') ||
|
|
56
|
+
msg.includes('no such column') ||
|
|
57
|
+
msg.includes('no such table'));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Format a helpful error message for schema mismatches
|
|
61
|
+
*/
|
|
62
|
+
function formatMigrationHint(originalError, migrationResult) {
|
|
63
|
+
const lines = [
|
|
64
|
+
`Database schema is out of date: ${originalError.message}`,
|
|
65
|
+
'',
|
|
66
|
+
'Your database is missing columns or tables added in a newer version of Steroids.',
|
|
67
|
+
];
|
|
68
|
+
if (migrationResult) {
|
|
69
|
+
lines.push(`Auto-migration failed: ${migrationResult}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push('', 'To fix this, run:', '', ' STEROIDS_AUTO_MIGRATE=1 steroids health', '', 'Or set STEROIDS_AUTO_MIGRATE=1 in your environment to migrate automatically.');
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Open an existing database connection
|
|
76
|
+
* Automatically applies pending migrations if any are found
|
|
77
|
+
*/
|
|
78
|
+
export function openDatabase(projectPath) {
|
|
79
|
+
const dbPath = getDbPath(projectPath);
|
|
80
|
+
if (!existsSync(dbPath)) {
|
|
81
|
+
throw new Error(`Steroids not initialized. Run 'steroids init' first.\nExpected database at: ${dbPath}`);
|
|
82
|
+
}
|
|
83
|
+
const db = new Database(dbPath);
|
|
84
|
+
// Configure SQLite
|
|
85
|
+
db.pragma('journal_mode = WAL');
|
|
86
|
+
db.pragma('busy_timeout = 5000');
|
|
87
|
+
db.pragma('foreign_keys = ON');
|
|
88
|
+
// Always attempt auto-migration for pending migrations
|
|
89
|
+
try {
|
|
90
|
+
const result = autoMigrate(db, dbPath);
|
|
91
|
+
if (result.applied && result.migrations.length > 0) {
|
|
92
|
+
console.log(`Auto-migrated database: ${result.migrations.join(', ')}`);
|
|
93
|
+
}
|
|
94
|
+
if (result.error) {
|
|
95
|
+
console.error(`Warning: Migration issue: ${result.error}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
// Log but don't fail - the DB may still work if no new columns are needed
|
|
100
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
101
|
+
console.warn(`Warning: Could not check migrations: ${msg}`);
|
|
102
|
+
}
|
|
103
|
+
// Wrap the database with schema error interception
|
|
104
|
+
return {
|
|
105
|
+
db: wrapWithSchemaErrorHandling(db),
|
|
106
|
+
close: () => db.close(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Wrap a database instance to intercept schema mismatch errors
|
|
111
|
+
* and provide helpful migration instructions instead of raw SQLite errors
|
|
112
|
+
*/
|
|
113
|
+
function wrapWithSchemaErrorHandling(db) {
|
|
114
|
+
const originalPrepare = db.prepare.bind(db);
|
|
115
|
+
db.prepare = function wrappedPrepare(sql) {
|
|
116
|
+
try {
|
|
117
|
+
const stmt = originalPrepare(sql);
|
|
118
|
+
return wrapStatement(stmt);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
if (isSchemaMismatchError(err)) {
|
|
122
|
+
const hint = formatMigrationHint(err);
|
|
123
|
+
const wrapped = new Error(hint);
|
|
124
|
+
wrapped.name = 'MigrationRequired';
|
|
125
|
+
throw wrapped;
|
|
126
|
+
}
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
// Also wrap db.exec for raw SQL execution
|
|
131
|
+
const originalExec = db.exec.bind(db);
|
|
132
|
+
db.exec = function wrappedExec(sql) {
|
|
133
|
+
try {
|
|
134
|
+
return originalExec(sql);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (isSchemaMismatchError(err)) {
|
|
138
|
+
const hint = formatMigrationHint(err);
|
|
139
|
+
const wrapped = new Error(hint);
|
|
140
|
+
wrapped.name = 'MigrationRequired';
|
|
141
|
+
throw wrapped;
|
|
142
|
+
}
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
return db;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Wrap a prepared statement to intercept schema errors at execution time
|
|
150
|
+
*/
|
|
151
|
+
function wrapStatement(stmt) {
|
|
152
|
+
const wrapMethod = (fn) => {
|
|
153
|
+
return ((...args) => {
|
|
154
|
+
try {
|
|
155
|
+
return fn.apply(stmt, args);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (isSchemaMismatchError(err)) {
|
|
159
|
+
const hint = formatMigrationHint(err);
|
|
160
|
+
const wrapped = new Error(hint);
|
|
161
|
+
wrapped.name = 'MigrationRequired';
|
|
162
|
+
throw wrapped;
|
|
163
|
+
}
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
if (stmt.run)
|
|
169
|
+
stmt.run = wrapMethod(stmt.run.bind(stmt));
|
|
170
|
+
if (stmt.get)
|
|
171
|
+
stmt.get = wrapMethod(stmt.get.bind(stmt));
|
|
172
|
+
if (stmt.all)
|
|
173
|
+
stmt.all = wrapMethod(stmt.all.bind(stmt));
|
|
174
|
+
return stmt;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get schema version from database
|
|
178
|
+
*/
|
|
179
|
+
export function getSchemaVersion(db) {
|
|
180
|
+
try {
|
|
181
|
+
const row = db
|
|
182
|
+
.prepare('SELECT value FROM _schema WHERE key = ?')
|
|
183
|
+
.get('version');
|
|
184
|
+
return row?.value ?? null;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Check if database schema is current
|
|
192
|
+
*/
|
|
193
|
+
export function isSchemaUpToDate(db) {
|
|
194
|
+
const version = getSchemaVersion(db);
|
|
195
|
+
return version === SCHEMA_VERSION;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=connection.js.map
|