steroids-cli 0.15.4 → 0.15.6

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 (140) hide show
  1. package/dist/commands/ai-proxy.d.ts +6 -0
  2. package/dist/commands/ai-proxy.d.ts.map +1 -0
  3. package/dist/commands/ai-proxy.js +79 -0
  4. package/dist/commands/ai-proxy.js.map +1 -0
  5. package/dist/commands/ai-run.d.ts.map +1 -1
  6. package/dist/commands/ai-run.js +10 -7
  7. package/dist/commands/ai-run.js.map +1 -1
  8. package/dist/commands/ai.d.ts.map +1 -1
  9. package/dist/commands/ai.js +5 -0
  10. package/dist/commands/ai.js.map +1 -1
  11. package/dist/commands/completion.js +2 -1
  12. package/dist/commands/completion.js.map +1 -1
  13. package/dist/commands/features.d.ts +5 -0
  14. package/dist/commands/features.d.ts.map +1 -0
  15. package/dist/commands/features.js +255 -0
  16. package/dist/commands/features.js.map +1 -0
  17. package/dist/commands/llm-content.d.ts +1 -1
  18. package/dist/commands/llm-content.d.ts.map +1 -1
  19. package/dist/commands/llm-content.js +2 -2
  20. package/dist/commands/llm.d.ts.map +1 -1
  21. package/dist/commands/llm.js +1 -0
  22. package/dist/commands/llm.js.map +1 -1
  23. package/dist/commands/web.d.ts.map +1 -1
  24. package/dist/commands/web.js +22 -3
  25. package/dist/commands/web.js.map +1 -1
  26. package/dist/index.js +7 -3
  27. package/dist/index.js.map +1 -1
  28. package/dist/providers/api-models.d.ts +5 -1
  29. package/dist/providers/api-models.d.ts.map +1 -1
  30. package/dist/providers/api-models.js +10 -107
  31. package/dist/providers/api-models.js.map +1 -1
  32. package/dist/providers/claude.d.ts.map +1 -1
  33. package/dist/providers/claude.js +16 -1
  34. package/dist/providers/claude.js.map +1 -1
  35. package/dist/providers/codex.d.ts.map +1 -1
  36. package/dist/providers/codex.js +16 -1
  37. package/dist/providers/codex.js.map +1 -1
  38. package/dist/providers/interface.d.ts.map +1 -1
  39. package/dist/providers/interface.js +11 -1
  40. package/dist/providers/interface.js.map +1 -1
  41. package/dist/providers/mistral-models.d.ts +18 -0
  42. package/dist/providers/mistral-models.d.ts.map +1 -0
  43. package/dist/providers/mistral-models.js +145 -0
  44. package/dist/providers/mistral-models.js.map +1 -0
  45. package/dist/providers/mistral.d.ts +6 -0
  46. package/dist/providers/mistral.d.ts.map +1 -1
  47. package/dist/providers/mistral.js +31 -54
  48. package/dist/providers/mistral.js.map +1 -1
  49. package/dist/providers/opencode.d.ts.map +1 -1
  50. package/dist/providers/opencode.js +5 -1
  51. package/dist/providers/opencode.js.map +1 -1
  52. package/dist/proxy/daemon-entry.d.ts +9 -0
  53. package/dist/proxy/daemon-entry.d.ts.map +1 -0
  54. package/dist/proxy/daemon-entry.js +29 -0
  55. package/dist/proxy/daemon-entry.js.map +1 -0
  56. package/dist/proxy/hf-proxy.d.ts +16 -0
  57. package/dist/proxy/hf-proxy.d.ts.map +1 -0
  58. package/dist/proxy/hf-proxy.js +200 -0
  59. package/dist/proxy/hf-proxy.js.map +1 -0
  60. package/dist/proxy/hf-token.d.ts +18 -0
  61. package/dist/proxy/hf-token.d.ts.map +1 -0
  62. package/dist/proxy/hf-token.js +57 -0
  63. package/dist/proxy/hf-token.js.map +1 -0
  64. package/dist/proxy/lifecycle.d.ts +26 -0
  65. package/dist/proxy/lifecycle.d.ts.map +1 -0
  66. package/dist/proxy/lifecycle.js +129 -0
  67. package/dist/proxy/lifecycle.js.map +1 -0
  68. package/package.json +1 -1
  69. package/dist/commands/merge.d.ts +0 -3
  70. package/dist/commands/merge.d.ts.map +0 -1
  71. package/dist/commands/merge.js +0 -246
  72. package/dist/commands/merge.js.map +0 -1
  73. package/dist/parallel/merge-commit-checks.d.ts +0 -6
  74. package/dist/parallel/merge-commit-checks.d.ts.map +0 -1
  75. package/dist/parallel/merge-commit-checks.js +0 -28
  76. package/dist/parallel/merge-commit-checks.js.map +0 -1
  77. package/dist/parallel/merge-conflict-attempts.d.ts +0 -8
  78. package/dist/parallel/merge-conflict-attempts.d.ts.map +0 -1
  79. package/dist/parallel/merge-conflict-attempts.js +0 -60
  80. package/dist/parallel/merge-conflict-attempts.js.map +0 -1
  81. package/dist/parallel/merge-conflict-invoke.d.ts +0 -2
  82. package/dist/parallel/merge-conflict-invoke.d.ts.map +0 -1
  83. package/dist/parallel/merge-conflict-invoke.js +0 -41
  84. package/dist/parallel/merge-conflict-invoke.js.map +0 -1
  85. package/dist/parallel/merge-conflict-prompts.d.ts +0 -23
  86. package/dist/parallel/merge-conflict-prompts.d.ts.map +0 -1
  87. package/dist/parallel/merge-conflict-prompts.js +0 -40
  88. package/dist/parallel/merge-conflict-prompts.js.map +0 -1
  89. package/dist/parallel/merge-conflict-task.d.ts +0 -3
  90. package/dist/parallel/merge-conflict-task.d.ts.map +0 -1
  91. package/dist/parallel/merge-conflict-task.js +0 -59
  92. package/dist/parallel/merge-conflict-task.js.map +0 -1
  93. package/dist/parallel/merge-conflict.d.ts +0 -22
  94. package/dist/parallel/merge-conflict.d.ts.map +0 -1
  95. package/dist/parallel/merge-conflict.js +0 -176
  96. package/dist/parallel/merge-conflict.js.map +0 -1
  97. package/dist/parallel/merge-errors.d.ts +0 -12
  98. package/dist/parallel/merge-errors.d.ts.map +0 -1
  99. package/dist/parallel/merge-errors.js +0 -18
  100. package/dist/parallel/merge-errors.js.map +0 -1
  101. package/dist/parallel/merge-git.d.ts +0 -25
  102. package/dist/parallel/merge-git.d.ts.map +0 -1
  103. package/dist/parallel/merge-git.js +0 -141
  104. package/dist/parallel/merge-git.js.map +0 -1
  105. package/dist/parallel/merge-lock.d.ts +0 -28
  106. package/dist/parallel/merge-lock.d.ts.map +0 -1
  107. package/dist/parallel/merge-lock.js +0 -91
  108. package/dist/parallel/merge-lock.js.map +0 -1
  109. package/dist/parallel/merge-process.d.ts +0 -21
  110. package/dist/parallel/merge-process.d.ts.map +0 -1
  111. package/dist/parallel/merge-process.js +0 -104
  112. package/dist/parallel/merge-process.js.map +0 -1
  113. package/dist/parallel/merge-progress.d.ts +0 -22
  114. package/dist/parallel/merge-progress.d.ts.map +0 -1
  115. package/dist/parallel/merge-progress.js +0 -41
  116. package/dist/parallel/merge-progress.js.map +0 -1
  117. package/dist/parallel/merge-sealing.d.ts +0 -8
  118. package/dist/parallel/merge-sealing.d.ts.map +0 -1
  119. package/dist/parallel/merge-sealing.js +0 -60
  120. package/dist/parallel/merge-sealing.js.map +0 -1
  121. package/dist/parallel/merge-validation.d.ts +0 -6
  122. package/dist/parallel/merge-validation.d.ts.map +0 -1
  123. package/dist/parallel/merge-validation.js +0 -57
  124. package/dist/parallel/merge-validation.js.map +0 -1
  125. package/dist/parallel/merge-workspace.d.ts +0 -8
  126. package/dist/parallel/merge-workspace.d.ts.map +0 -1
  127. package/dist/parallel/merge-workspace.js +0 -37
  128. package/dist/parallel/merge-workspace.js.map +0 -1
  129. package/dist/parallel/merge.d.ts +0 -48
  130. package/dist/parallel/merge.d.ts.map +0 -1
  131. package/dist/parallel/merge.js +0 -228
  132. package/dist/parallel/merge.js.map +0 -1
  133. package/dist/workspace/git-lifecycle-merge.d.ts +0 -23
  134. package/dist/workspace/git-lifecycle-merge.d.ts.map +0 -1
  135. package/dist/workspace/git-lifecycle-merge.js +0 -159
  136. package/dist/workspace/git-lifecycle-merge.js.map +0 -1
  137. package/dist/workspace/merge-pipeline.d.ts +0 -21
  138. package/dist/workspace/merge-pipeline.d.ts.map +0 -1
  139. package/dist/workspace/merge-pipeline.js +0 -74
  140. package/dist/workspace/merge-pipeline.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * HF Proxy Lifecycle
4
+ *
5
+ * Start/stop/ensure the local HuggingFace proxy server.
6
+ * PID file at ~/.steroids/proxy.pid tracks the running instance.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.startProxy = startProxy;
10
+ exports.stopProxy = stopProxy;
11
+ exports.isProxyRunning = isProxyRunning;
12
+ exports.getProxyPort = getProxyPort;
13
+ exports.ensureProxy = ensureProxy;
14
+ exports.spawnProxyDaemon = spawnProxyDaemon;
15
+ const node_fs_1 = require("node:fs");
16
+ const node_path_1 = require("node:path");
17
+ const node_os_1 = require("node:os");
18
+ const node_child_process_1 = require("node:child_process");
19
+ const hf_proxy_js_1 = require("./hf-proxy.js");
20
+ const PID_FILE = (0, node_path_1.join)((0, node_os_1.homedir)(), '.steroids', 'proxy.pid');
21
+ const DEFAULT_PORT = 3580;
22
+ let serverInstance = null;
23
+ async function startProxy(options) {
24
+ if (serverInstance) {
25
+ throw new Error('Proxy already running in this process');
26
+ }
27
+ const port = options.port ?? DEFAULT_PORT;
28
+ const hfBaseUrl = options.hfBaseUrl ?? 'https://router.huggingface.co/v1';
29
+ const server = (0, hf_proxy_js_1.createHFProxy)({ hfBaseUrl, hfToken: options.hfToken });
30
+ await new Promise((resolve, reject) => {
31
+ server.on('error', reject);
32
+ server.listen(port, '127.0.0.1', () => resolve());
33
+ });
34
+ const actualPort = server.address().port;
35
+ serverInstance = server;
36
+ // Write PID file
37
+ const pidDir = (0, node_path_1.dirname)(PID_FILE);
38
+ if (!(0, node_fs_1.existsSync)(pidDir))
39
+ (0, node_fs_1.mkdirSync)(pidDir, { recursive: true });
40
+ (0, node_fs_1.writeFileSync)(PID_FILE, JSON.stringify({ pid: process.pid, port: actualPort }), 'utf-8');
41
+ return { port: actualPort, pid: process.pid };
42
+ }
43
+ function stopProxy() {
44
+ if (serverInstance) {
45
+ serverInstance.close();
46
+ serverInstance = null;
47
+ }
48
+ try {
49
+ if ((0, node_fs_1.existsSync)(PID_FILE))
50
+ (0, node_fs_1.unlinkSync)(PID_FILE);
51
+ }
52
+ catch { /* ignore */ }
53
+ }
54
+ function isProxyRunning() {
55
+ if (serverInstance)
56
+ return true;
57
+ if (!(0, node_fs_1.existsSync)(PID_FILE))
58
+ return false;
59
+ try {
60
+ const { pid } = JSON.parse((0, node_fs_1.readFileSync)(PID_FILE, 'utf-8'));
61
+ process.kill(pid, 0); // Signal 0 = check if process exists
62
+ return true;
63
+ }
64
+ catch {
65
+ // Stale PID file
66
+ try {
67
+ (0, node_fs_1.unlinkSync)(PID_FILE);
68
+ }
69
+ catch { /* ignore */ }
70
+ return false;
71
+ }
72
+ }
73
+ function getProxyPort() {
74
+ if (!(0, node_fs_1.existsSync)(PID_FILE))
75
+ return null;
76
+ try {
77
+ const { port } = JSON.parse((0, node_fs_1.readFileSync)(PID_FILE, 'utf-8'));
78
+ return port;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ async function ensureProxy(options) {
85
+ if (isProxyRunning()) {
86
+ return getProxyPort() ?? DEFAULT_PORT;
87
+ }
88
+ const { port } = await startProxy(options);
89
+ return port;
90
+ }
91
+ /**
92
+ * Spawn the proxy as a detached background process that survives the parent exiting.
93
+ * Used by `steroids web` so the proxy stays alive alongside the dashboard.
94
+ * Returns the port the proxy is listening on, or null if it couldn't start.
95
+ */
96
+ async function spawnProxyDaemon(options) {
97
+ if (isProxyRunning()) {
98
+ return getProxyPort();
99
+ }
100
+ const port = options.port ?? DEFAULT_PORT;
101
+ const hfBaseUrl = options.hfBaseUrl ?? 'https://router.huggingface.co/v1';
102
+ // Resolve the daemon entry script path (sibling to this file in dist/)
103
+ const entryScript = (0, node_path_1.join)(__dirname, 'daemon-entry.js');
104
+ if (!(0, node_fs_1.existsSync)(entryScript))
105
+ return null;
106
+ const logsDir = (0, node_path_1.join)((0, node_os_1.homedir)(), '.steroids', 'logs');
107
+ if (!(0, node_fs_1.existsSync)(logsDir))
108
+ (0, node_fs_1.mkdirSync)(logsDir, { recursive: true });
109
+ const logFd = (0, node_fs_1.openSync)((0, node_path_1.join)(logsDir, 'proxy.log'), node_fs_1.constants.O_WRONLY | node_fs_1.constants.O_CREAT | node_fs_1.constants.O_TRUNC);
110
+ const child = (0, node_child_process_1.spawn)('node', [entryScript], {
111
+ detached: true,
112
+ stdio: ['ignore', logFd, logFd],
113
+ env: {
114
+ ...process.env,
115
+ HF_TOKEN: options.hfToken,
116
+ HF_BASE_URL: hfBaseUrl,
117
+ PROXY_PORT: String(port),
118
+ },
119
+ });
120
+ child.unref();
121
+ // Wait briefly for the PID file to appear (daemon writes it on listen)
122
+ for (let i = 0; i < 20; i++) {
123
+ await new Promise((r) => setTimeout(r, 100));
124
+ if (isProxyRunning())
125
+ return getProxyPort();
126
+ }
127
+ return null;
128
+ }
129
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/proxy/lifecycle.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steroids-cli",
3
- "version": "0.15.4",
3
+ "version": "0.15.6",
4
4
  "description": "Automated task execution system with coder/reviewer loop",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,3 +0,0 @@
1
- import type { GlobalFlags } from '../cli/flags.js';
2
- export declare function mergeCommand(args: string[], flags: GlobalFlags): Promise<void>;
3
- //# sourceMappingURL=merge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAmOnD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGpF"}
@@ -1,246 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mergeCommand = mergeCommand;
4
- /**
5
- * steroids merge - Merge completed parallel workstreams
6
- */
7
- const node_util_1 = require("node:util");
8
- const node_crypto_1 = require("node:crypto");
9
- const node_fs_1 = require("node:fs");
10
- const node_path_1 = require("node:path");
11
- const output_js_1 = require("../cli/output.js");
12
- const help_js_1 = require("../cli/help.js");
13
- const errors_js_1 = require("../cli/errors.js");
14
- const connection_js_1 = require("../database/connection.js");
15
- const global_db_js_1 = require("../runners/global-db.js");
16
- const loader_js_1 = require("../config/loader.js");
17
- const merge_js_1 = require("../parallel/merge.js");
18
- const HELP = (0, help_js_1.generateHelp)({
19
- command: 'merge',
20
- description: 'Merge completed parallel workstreams into main',
21
- details: `When running parallel sessions, each workstream is merged via cherry-pick.
22
- This command runs the final merge step for a completed parallel session and recovers
23
- from stale merge locks or interrupted conflict resolution when needed.`,
24
- usage: [
25
- 'steroids merge [options]',
26
- ],
27
- options: [
28
- { long: 'project', description: 'Project directory to merge (defaults to cwd)', values: '<path>' },
29
- { long: 'session', description: 'Parallel session ID (defaults to latest session for project)', values: '<id>' },
30
- { long: 'session-id', description: 'Alias for --session', values: '<id>' },
31
- { long: 'remote', description: 'Git remote to fetch from', values: '<name>', default: 'origin' },
32
- { long: 'main-branch', description: 'Target branch for cherry-picks', values: '<name>', default: 'main' },
33
- { long: 'integration-branch', description: 'Temporary integration branch name', values: '<name>' },
34
- { long: 'validation-command', description: 'Shell command to validate merged state before push', values: '<cmd>' },
35
- ],
36
- examples: [
37
- { command: 'steroids merge', description: 'Merge latest parallel session in current project' },
38
- { command: 'steroids merge --project ~/projects/my-app', description: 'Merge using an explicit project path' },
39
- { command: 'steroids merge --session abc123', description: 'Merge a specific parallel session' },
40
- ],
41
- related: [
42
- { command: 'steroids runners start --parallel', description: 'Start parallel runners' },
43
- ],
44
- });
45
- function parseSectionIds(sectionIdsJson) {
46
- try {
47
- const parsed = JSON.parse(sectionIdsJson);
48
- if (!Array.isArray(parsed)) {
49
- return [];
50
- }
51
- return parsed.filter((entry) => typeof entry === 'string');
52
- }
53
- catch {
54
- return [];
55
- }
56
- }
57
- function parseTimestamp(value) {
58
- if (!value) {
59
- return Number.MAX_SAFE_INTEGER;
60
- }
61
- const parsed = Date.parse(value);
62
- return Number.isNaN(parsed) ? Number.MAX_SAFE_INTEGER : parsed;
63
- }
64
- function orderByCompletion(planRows) {
65
- return [...planRows].sort((left, right) => {
66
- const completedLeft = parseTimestamp(left.completed_at);
67
- const completedRight = parseTimestamp(right.completed_at);
68
- if (completedLeft !== completedRight) {
69
- return completedLeft - completedRight;
70
- }
71
- return parseTimestamp(left.created_at) - parseTimestamp(right.created_at);
72
- });
73
- }
74
- function buildPlanForSession(db, session, includeRunning) {
75
- const statusFilter = includeRunning ? '' : ' AND status = \'completed\'';
76
- const rows = db
77
- .prepare(`SELECT id, branch_name, section_ids, status, completed_at, created_at
78
- FROM workstreams
79
- WHERE session_id = ?${statusFilter}`)
80
- .all(session.id);
81
- if (rows.length === 0) {
82
- return {
83
- sessionId: session.id,
84
- sessionStatus: session.status,
85
- createdAt: session.created_at,
86
- workstreams: [],
87
- sectionPlans: rows,
88
- };
89
- }
90
- const orderedRows = orderByCompletion(rows);
91
- const workstreams = orderedRows
92
- .map((row) => ({
93
- id: row.id,
94
- branchName: row.branch_name,
95
- }));
96
- return {
97
- sessionId: session.id,
98
- sessionStatus: session.status,
99
- createdAt: session.created_at,
100
- workstreams,
101
- sectionPlans: orderedRows,
102
- };
103
- }
104
- function findLatestSessionForProject(db, projectPath) {
105
- return db
106
- .prepare(`SELECT id, status, created_at
107
- FROM parallel_sessions
108
- WHERE project_path = ?
109
- ORDER BY created_at DESC`)
110
- .get(projectPath) ?? null;
111
- }
112
- function getSessionById(db, projectPath, sessionId) {
113
- return db
114
- .prepare(`SELECT id, status, created_at
115
- FROM parallel_sessions
116
- WHERE id = ? AND project_path = ?`)
117
- .get(sessionId, projectPath) ?? null;
118
- }
119
- function resolveProjectPath(projectArg) {
120
- const projectPath = (0, node_path_1.resolve)(projectArg ?? process.cwd());
121
- const steroidsDbPath = (0, node_path_1.join)(projectPath, '.steroids', 'steroids.db');
122
- if (!(0, node_fs_1.existsSync)(projectPath)) {
123
- throw new Error(`Project directory does not exist: ${projectPath}`);
124
- }
125
- if (!(0, node_fs_1.existsSync)(steroidsDbPath)) {
126
- throw new Error(`Not a steroids project: ${projectPath}`);
127
- }
128
- return projectPath;
129
- }
130
- function resolveMergePlan(db, projectPath, explicitSessionId) {
131
- const targetSession = explicitSessionId
132
- ? getSessionById(db, projectPath, explicitSessionId)
133
- : findLatestSessionForProject(db, projectPath);
134
- if (!targetSession) {
135
- if (explicitSessionId) {
136
- throw new Error(`Parallel session not found: ${explicitSessionId}`);
137
- }
138
- throw new Error(`No parallel sessions found for project: ${projectPath}`);
139
- }
140
- const includeRunning = targetSession.status === 'running' || targetSession.status === 'merging';
141
- const plan = buildPlanForSession(db, targetSession, includeRunning);
142
- if (plan.sectionPlans.length === 0) {
143
- throw new Error(`No completed workstreams found for session: ${targetSession.id}`);
144
- }
145
- return plan;
146
- }
147
- function summarizeError(errors) {
148
- if (errors.length === 1) {
149
- return errors[0];
150
- }
151
- return errors.join('; ');
152
- }
153
- async function mergeCommand(args, flags) {
154
- const out = (0, output_js_1.createOutput)({ command: 'merge', flags });
155
- if (flags.help) {
156
- console.log(HELP);
157
- return;
158
- }
159
- const { values } = (0, node_util_1.parseArgs)({
160
- args,
161
- options: {
162
- project: { type: 'string', short: 'p' },
163
- session: { type: 'string' },
164
- 'session-id': { type: 'string' },
165
- remote: { type: 'string', default: 'origin' },
166
- 'main-branch': { type: 'string', default: 'main' },
167
- 'integration-branch': { type: 'string' },
168
- 'validation-command': { type: 'string' },
169
- },
170
- allowPositionals: false,
171
- });
172
- const explicitSession = values['session-id']
173
- ?? values.session;
174
- const projectPath = resolveProjectPath(values.project);
175
- // Merge command performs only project-scoped work and never touches other repos.
176
- const { db: globalDb, close: closeGlobalDb } = (0, global_db_js_1.openGlobalDatabase)();
177
- let plan;
178
- try {
179
- plan = resolveMergePlan(globalDb, projectPath, explicitSession);
180
- }
181
- finally {
182
- closeGlobalDb();
183
- }
184
- if (flags.dryRun) {
185
- out.success({
186
- project_path: projectPath,
187
- session_id: plan.sessionId,
188
- session_status: plan.sessionStatus,
189
- session_created_at: plan.createdAt,
190
- workstreams: plan.sectionPlans.map((row) => ({
191
- id: row.id,
192
- branch_name: row.branch_name,
193
- section_ids: parseSectionIds(row.section_ids),
194
- status: row.status,
195
- completed_at: row.completed_at,
196
- })),
197
- });
198
- return;
199
- }
200
- let result;
201
- const remote = values.remote;
202
- const mainBranch = values['main-branch'];
203
- const integrationBranch = values['integration-branch'];
204
- const configuredValidationCommand = (0, loader_js_1.loadConfig)(projectPath).runners?.parallel?.validationCommand;
205
- const validationCommand = values['validation-command']
206
- ?? (typeof configuredValidationCommand === 'string' ? configuredValidationCommand : undefined);
207
- try {
208
- const { close } = (0, connection_js_1.openDatabase)(projectPath);
209
- close();
210
- }
211
- catch (error) {
212
- out.error(errors_js_1.ErrorCode.NOT_INITIALIZED, `Not a steroids project: ${projectPath}`);
213
- process.exit((0, errors_js_1.getExitCode)(errors_js_1.ErrorCode.NOT_INITIALIZED));
214
- }
215
- result = await (0, merge_js_1.runParallelMerge)({
216
- projectPath,
217
- sessionId: plan.sessionId,
218
- runnerId: (0, node_crypto_1.randomUUID)(),
219
- workstreams: plan.workstreams,
220
- remote,
221
- mainBranch,
222
- integrationBranchName: integrationBranch,
223
- validationCommand,
224
- });
225
- if (!result.success) {
226
- const isLockContention = result.errors.some((entry) => entry.includes('Could not acquire merge lock'));
227
- const code = isLockContention ? errors_js_1.ErrorCode.RESOURCE_LOCKED : errors_js_1.ErrorCode.GENERAL_ERROR;
228
- const message = summarizeError(result.errors);
229
- out.error(code, message || 'Merge failed', {
230
- session_id: plan.sessionId,
231
- project_path: projectPath,
232
- merge_result: result,
233
- });
234
- process.exit((0, errors_js_1.getExitCode)(code));
235
- }
236
- out.success({
237
- session_id: plan.sessionId,
238
- project_path: projectPath,
239
- session_status: plan.sessionStatus,
240
- workstreams: plan.sectionPlans.length,
241
- completed_commits: result.completedCommits,
242
- conflicts: result.conflicts,
243
- skipped: result.skipped,
244
- });
245
- }
246
- //# sourceMappingURL=merge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Commit integration checks and SHA resolution
3
- */
4
- export declare function isAppliedCommitIntegrated(projectPath: string, commitSha: string | null): boolean;
5
- export declare function resolveGitSha(output: string): string | null;
6
- //# sourceMappingURL=merge-commit-checks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-commit-checks.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-commit-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAiBhG;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK3D"}
@@ -1,28 +0,0 @@
1
- "use strict";
2
- /**
3
- * Commit integration checks and SHA resolution
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isAppliedCommitIntegrated = isAppliedCommitIntegrated;
7
- exports.resolveGitSha = resolveGitSha;
8
- const merge_git_js_1 = require("./merge-git.js");
9
- function isAppliedCommitIntegrated(projectPath, commitSha) {
10
- if (!commitSha) {
11
- return false;
12
- }
13
- const output = (0, merge_git_js_1.runGitCommand)(projectPath, ['branch', '--contains', commitSha, '--list', 'HEAD'], { allowFailure: true });
14
- const lower = output.toLowerCase();
15
- if (lower.includes('fatal:') || lower.includes('error:')) {
16
- return false;
17
- }
18
- return output.trim().length > 0;
19
- }
20
- function resolveGitSha(output) {
21
- const trimmed = output.trim();
22
- if (!trimmed)
23
- return null;
24
- if (/fatal:|error:/i.test(trimmed))
25
- return null;
26
- return trimmed.split('\n').at(-1)?.trim() ?? null;
27
- }
28
- //# sourceMappingURL=merge-commit-checks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-commit-checks.js","sourceRoot":"","sources":["../../src/parallel/merge-commit-checks.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAIH,8DAiBC;AAED,sCAKC;AA1BD,iDAA+C;AAE/C,SAAgB,yBAAyB,CAAC,WAAmB,EAAE,SAAwB;IACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,4BAAa,EAC1B,WAAW,EACX,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EACrD,EAAE,YAAY,EAAE,IAAI,EAAE,CACvB,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEnC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AACpD,CAAC"}
@@ -1,8 +0,0 @@
1
- export declare const MAX_CONFLICT_ATTEMPTS = 5;
2
- export declare function recordConflictAttempt(sessionId: string, workstreamId: string): {
3
- attempts: number;
4
- blocked: boolean;
5
- backoffMinutes: number | null;
6
- };
7
- export declare function clearConflictAttemptState(sessionId: string, workstreamId: string): void;
8
- //# sourceMappingURL=merge-conflict-attempts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-conflict-attempts.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-conflict-attempts.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAGvC,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAuDvE;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAYvF"}
@@ -1,60 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAX_CONFLICT_ATTEMPTS = void 0;
4
- exports.recordConflictAttempt = recordConflictAttempt;
5
- exports.clearConflictAttemptState = clearConflictAttemptState;
6
- const global_db_js_1 = require("../runners/global-db.js");
7
- const merge_errors_js_1 = require("./merge-errors.js");
8
- exports.MAX_CONFLICT_ATTEMPTS = 5;
9
- const MAX_CONFLICT_BACKOFF_MINUTES = 30;
10
- function recordConflictAttempt(sessionId, workstreamId) {
11
- return (0, global_db_js_1.withGlobalDatabase)((db) => {
12
- const row = db
13
- .prepare(`SELECT conflict_attempts
14
- FROM workstreams
15
- WHERE session_id = ?
16
- AND id = ?
17
- LIMIT 1`)
18
- .get(sessionId, workstreamId);
19
- if (!row) {
20
- throw new merge_errors_js_1.ParallelMergeError('Parallel workstream row not found while recording conflict attempt', 'LEASE_ROW_MISSING');
21
- }
22
- const attempts = (row.conflict_attempts ?? 0) + 1;
23
- if (attempts >= exports.MAX_CONFLICT_ATTEMPTS) {
24
- db.prepare(`UPDATE workstreams
25
- SET conflict_attempts = ?,
26
- status = 'failed',
27
- next_retry_at = NULL,
28
- last_reconcile_action = 'blocked_conflict',
29
- last_reconciled_at = datetime('now')
30
- WHERE session_id = ?
31
- AND id = ?`).run(attempts, sessionId, workstreamId);
32
- db.prepare(`UPDATE parallel_sessions
33
- SET status = 'blocked_conflict',
34
- completed_at = NULL
35
- WHERE id = ?`).run(sessionId);
36
- return { attempts, blocked: true, backoffMinutes: null };
37
- }
38
- const backoffMinutes = Math.min(2 ** Math.max(0, attempts - 1), MAX_CONFLICT_BACKOFF_MINUTES);
39
- db.prepare(`UPDATE workstreams
40
- SET conflict_attempts = ?,
41
- next_retry_at = datetime('now', ?),
42
- last_reconcile_action = 'conflict_retry',
43
- last_reconciled_at = datetime('now')
44
- WHERE session_id = ?
45
- AND id = ?`).run(attempts, `+${backoffMinutes} minutes`, sessionId, workstreamId);
46
- return { attempts, blocked: false, backoffMinutes };
47
- });
48
- }
49
- function clearConflictAttemptState(sessionId, workstreamId) {
50
- (0, global_db_js_1.withGlobalDatabase)((db) => {
51
- db.prepare(`UPDATE workstreams
52
- SET conflict_attempts = 0,
53
- next_retry_at = NULL,
54
- last_reconcile_action = 'conflict_resolved',
55
- last_reconciled_at = datetime('now')
56
- WHERE session_id = ?
57
- AND id = ?`).run(sessionId, workstreamId);
58
- });
59
- }
60
- //# sourceMappingURL=merge-conflict-attempts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-conflict-attempts.js","sourceRoot":"","sources":["../../src/parallel/merge-conflict-attempts.ts"],"names":[],"mappings":";;;AAMA,sDA0DC;AAED,8DAYC;AA9ED,0DAAiF;AACjF,uDAAuD;AAE1C,QAAA,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAExC,SAAgB,qBAAqB,CACnC,SAAiB,EACjB,YAAoB;IAEpB,OAAO,IAAA,iCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CACN;;;;iBAIS,CACV;aACA,GAAG,CAAC,SAAS,EAAE,YAAY,CAA8C,CAAC;QAE7E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,oCAAkB,CAC1B,oEAAoE,EACpE,mBAAmB,CACpB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,QAAQ,IAAI,6BAAqB,EAAE,CAAC;YACtC,EAAE,CAAC,OAAO,CACR;;;;;;;sBAOc,CACf,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAEzC,EAAE,CAAC,OAAO,CACR;;;sBAGc,CACf,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAC3D,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAC9F,EAAE,CAAC,OAAO,CACR;;;;;;oBAMc,CACf,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,cAAc,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,yBAAyB,CAAC,SAAiB,EAAE,YAAoB;IAC/E,IAAA,iCAAkB,EAAC,CAAC,EAAE,EAAE,EAAE;QACxB,EAAE,CAAC,OAAO,CACR;;;;;;oBAMc,CACf,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function invokeMergeConflictModel(role: 'coder' | 'reviewer', projectPath: string, taskId: string | undefined, prompt: string): Promise<string>;
2
- //# sourceMappingURL=merge-conflict-invoke.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-conflict-invoke.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-conflict-invoke.ts"],"names":[],"mappings":"AAKA,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.invokeMergeConflictModel = invokeMergeConflictModel;
4
- const loader_js_1 = require("../config/loader.js");
5
- const invocation_logger_js_1 = require("../providers/invocation-logger.js");
6
- const registry_js_1 = require("../providers/registry.js");
7
- const merge_errors_js_1 = require("./merge-errors.js");
8
- async function invokeMergeConflictModel(role, projectPath, taskId, prompt) {
9
- const config = (0, loader_js_1.loadConfig)(projectPath);
10
- const modelConfig = role === 'coder' ? config.ai?.coder : config.ai?.reviewer;
11
- if (!modelConfig?.provider || !modelConfig?.model) {
12
- throw new merge_errors_js_1.ParallelMergeError(`Missing AI ${role} configuration. Configure via config.ai.${role}.`, 'AI_CONFIG_MISSING');
13
- }
14
- const providerName = modelConfig.provider;
15
- const model = modelConfig.model;
16
- const registry = await (0, registry_js_1.getProviderRegistry)();
17
- const provider = registry.get(providerName);
18
- const result = await (0, invocation_logger_js_1.logInvocation)(prompt, (ctx) => provider.invoke(prompt, {
19
- model,
20
- timeout: 60 * 60 * 1000,
21
- cwd: projectPath,
22
- role,
23
- streamOutput: false,
24
- onActivity: ctx?.onActivity,
25
- }), {
26
- role,
27
- provider: providerName,
28
- model,
29
- taskId,
30
- projectPath,
31
- });
32
- if (!result.success) {
33
- const details = result.stderr || result.stdout || 'model returned non-zero exit code';
34
- throw new merge_errors_js_1.ParallelMergeError(`${role.toUpperCase()} invocation failed during merge conflict handling: ${details}`, 'AI_INVOCATION_FAILED');
35
- }
36
- if (result.timedOut) {
37
- throw new merge_errors_js_1.ParallelMergeError(`${role} invocation timed out`, 'AI_INVOKE_TIMEOUT');
38
- }
39
- return result.stdout;
40
- }
41
- //# sourceMappingURL=merge-conflict-invoke.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-conflict-invoke.js","sourceRoot":"","sources":["../../src/parallel/merge-conflict-invoke.ts"],"names":[],"mappings":";;AAKA,4DAsDC;AA3DD,mDAAiD;AACjD,4EAAkE;AAClE,0DAA+D;AAC/D,uDAAuD;AAEhD,KAAK,UAAU,wBAAwB,CAC5C,IAA0B,EAC1B,WAAmB,EACnB,MAA0B,EAC1B,MAAc;IAEd,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,WAAW,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC;IAE9E,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,oCAAkB,CAC1B,cAAc,IAAI,2CAA2C,IAAI,GAAG,EACpE,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC;IAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IAEhC,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAmB,GAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAa,EAChC,MAAM,EACN,CAAC,GAAG,EAAE,EAAE,CACN,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QACtB,KAAK;QACL,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACvB,GAAG,EAAE,WAAW;QAChB,IAAI;QACJ,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,GAAG,EAAE,UAAU;KAC5B,CAAC,EACJ;QACE,IAAI;QACJ,QAAQ,EAAE,YAAY;QACtB,KAAK;QACL,MAAM;QACN,WAAW;KACZ,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,mCAAmC,CAAC;QACtF,MAAM,IAAI,oCAAkB,CAC1B,GAAG,IAAI,CAAC,WAAW,EAAE,sDAAsD,OAAO,EAAE,EACpF,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,oCAAkB,CAAC,GAAG,IAAI,uBAAuB,EAAE,mBAAmB,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
@@ -1,23 +0,0 @@
1
- export interface ParseReviewDecisionResult {
2
- decision: 'approve' | 'reject';
3
- notes: string;
4
- }
5
- export declare function parseReviewDecision(raw: string): ParseReviewDecisionResult;
6
- export declare function createPromptForConflictCoder(options: {
7
- workstreamId: string;
8
- shortSha: string;
9
- branchName: string;
10
- commitMessage: string;
11
- conflictedFiles: string[];
12
- conflictPatch: string;
13
- rejectionNotes?: string;
14
- }): string;
15
- export declare function createPromptForConflictReviewer(options: {
16
- workstreamId: string;
17
- shortSha: string;
18
- branchName: string;
19
- commitMessage: string;
20
- stagedDiff: string;
21
- stagedFiles: string[];
22
- }): string;
23
- //# sourceMappingURL=merge-conflict-prompts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-conflict-prompts.d.ts","sourceRoot":"","sources":["../../src/parallel/merge-conflict-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAwB1E;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAMT;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,GAAG,MAAM,CAMT"}