teamshare-bridge 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -13
- package/dist/bridge/daemon.js +56 -17
- package/dist/bridge/daemon.js.map +1 -1
- package/dist/bridge/spawn.d.ts +12 -0
- package/dist/bridge/spawn.js +11 -5
- package/dist/bridge/spawn.js.map +1 -1
- package/dist/cli/args.d.ts +8 -0
- package/dist/cli/args.js +38 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands/build.d.ts +1 -0
- package/dist/cli/commands/build.js +385 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +1 -0
- package/dist/cli/commands/chat.js +113 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +1 -0
- package/dist/cli/commands/connect.js +23 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/doc.d.ts +1 -0
- package/dist/cli/commands/doc.js +109 -0
- package/dist/cli/commands/doc.js.map +1 -0
- package/dist/cli/commands/harness.d.ts +10 -0
- package/dist/cli/commands/harness.js +93 -0
- package/dist/cli/commands/harness.js.map +1 -0
- package/dist/cli/commands/key.d.ts +2 -0
- package/dist/cli/commands/key.js +126 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/link.d.ts +2 -0
- package/dist/cli/commands/link.js +93 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/run.d.ts +1 -0
- package/dist/cli/commands/run.js +219 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +6 -0
- package/dist/cli/commands/shared.js +51 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +1 -0
- package/dist/cli/commands/skills.js +29 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/usage.d.ts +1 -0
- package/dist/cli/commands/usage.js +78 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/index.js +49 -1500
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils.d.ts +38 -0
- package/dist/cli/utils.js +139 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/lib/api.d.ts +15 -2
- package/dist/lib/api.js +8 -4
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/brief.js +19 -3
- package/dist/lib/brief.js.map +1 -1
- package/dist/lib/config.d.ts +3 -1
- package/dist/lib/config.js +4 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/harness.d.ts +1 -1
- package/dist/lib/harness.js +3 -2
- package/dist/lib/harness.js.map +1 -1
- package/dist/lib/llm.js +8 -7
- package/dist/lib/llm.js.map +1 -1
- package/dist/lib/models.d.ts +6 -0
- package/dist/lib/models.js +25 -0
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/orchestrator/client.d.ts +38 -4
- package/dist/lib/orchestrator/client.js +390 -22
- package/dist/lib/orchestrator/client.js.map +1 -1
- package/dist/lib/orchestrator/index.d.ts +1 -1
- package/dist/lib/orchestrator/index.js +5 -1
- package/dist/lib/orchestrator/index.js.map +1 -1
- package/dist/lib/orchestrator/worktree.d.ts +52 -0
- package/dist/lib/orchestrator/worktree.js +250 -6
- package/dist/lib/orchestrator/worktree.js.map +1 -1
- package/dist/lib/skills.d.ts +2 -2
- package/dist/lib/skills.js +2 -1
- package/dist/lib/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/teamshare-auth-rbac/SKILL.md +1 -1
- package/skills/teamshare-orchestrator-ask/SKILL.md +63 -0
|
@@ -3,17 +3,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OrchestratorClient = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* OrchestratorClient: WS connection to the backend /orchestrator namespace.
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
|
+
* The backend sends commands (verify, worktree, git, planner) that this
|
|
8
|
+
* bridge EXECUTES locally and reports back. The client is both:
|
|
9
|
+
* - a command RECEIVER (backend -> bridge): runs git/worktree/verify/planner
|
|
10
|
+
* and emits the matching `orchestrator:*` result event with the same cmdId;
|
|
11
|
+
* - a command SENDER (bridge -> backend) kept for callers that push
|
|
12
|
+
* results of their own (none currently - the daemon only receives).
|
|
7
13
|
*
|
|
8
14
|
* Mirrors the daemon.ts reconnect pattern for resilience.
|
|
9
15
|
*/
|
|
10
16
|
const socket_io_client_1 = require("socket.io-client");
|
|
17
|
+
const node_path_1 = require("node:path");
|
|
11
18
|
const config_1 = require("../config");
|
|
19
|
+
const api_1 = require("../api");
|
|
20
|
+
const llm_1 = require("../llm");
|
|
21
|
+
const models_1 = require("../models");
|
|
22
|
+
const worktree_1 = require("./worktree");
|
|
23
|
+
const runner_1 = require("./runner");
|
|
12
24
|
const log = {
|
|
13
|
-
info: (
|
|
14
|
-
warn: (
|
|
15
|
-
error: (
|
|
25
|
+
info: (m) => console.log(`[orchestrator-client] ${m}`),
|
|
26
|
+
warn: (m) => console.warn(`[orchestrator-client] ${m}`),
|
|
27
|
+
error: (m) => console.error(`[orchestrator-client] ${m}`),
|
|
16
28
|
};
|
|
29
|
+
const RESULT_EVENTS = [
|
|
30
|
+
'orchestrator:verify-result',
|
|
31
|
+
'orchestrator:worktree-created',
|
|
32
|
+
'orchestrator:worktree-removed',
|
|
33
|
+
'orchestrator:git-status-result',
|
|
34
|
+
'orchestrator:git-commit-result',
|
|
35
|
+
'orchestrator:git-merge-result',
|
|
36
|
+
'orchestrator:git-push-result',
|
|
37
|
+
'orchestrator:git-revert-head-result',
|
|
38
|
+
'orchestrator:git-reset-head-result',
|
|
39
|
+
'orchestrator:repo-context-result',
|
|
40
|
+
'orchestrator:review-result',
|
|
41
|
+
];
|
|
42
|
+
/** Backend -> bridge command events this client must service. */
|
|
43
|
+
const COMMAND_EVENTS = [
|
|
44
|
+
'orchestrator:verify',
|
|
45
|
+
'orchestrator:create-worktree',
|
|
46
|
+
'orchestrator:remove-worktree',
|
|
47
|
+
'orchestrator:git-status',
|
|
48
|
+
'orchestrator:git-commit',
|
|
49
|
+
'orchestrator:git-merge',
|
|
50
|
+
'orchestrator:git-push',
|
|
51
|
+
'orchestrator:git-revert-head',
|
|
52
|
+
'orchestrator:git-reset-head',
|
|
53
|
+
'orchestrator:planner-request',
|
|
54
|
+
'orchestrator:review-request',
|
|
55
|
+
'orchestrator:question',
|
|
56
|
+
];
|
|
17
57
|
class OrchestratorClient {
|
|
18
58
|
socket = null;
|
|
19
59
|
pending = new Map();
|
|
@@ -24,11 +64,11 @@ class OrchestratorClient {
|
|
|
24
64
|
this.apiUrl = apiUrl;
|
|
25
65
|
}
|
|
26
66
|
/**
|
|
27
|
-
* Connect to the /orchestrator WS namespace.
|
|
67
|
+
* Connect to the /orchestrator WS namespace and start serving commands.
|
|
28
68
|
*/
|
|
29
69
|
connect() {
|
|
30
70
|
const config = (0, config_1.loadConfig)();
|
|
31
|
-
const wsUrl = process.env.TEAMSHARE_WS_URL ??
|
|
71
|
+
const wsUrl = process.env.TEAMSHARE_WS_URL ?? api_1.DEFAULT_WS_URL;
|
|
32
72
|
this.socket = (0, socket_io_client_1.io)(`${wsUrl}/orchestrator`, {
|
|
33
73
|
auth: { apiKey: this.apiKey },
|
|
34
74
|
transports: ['websocket'],
|
|
@@ -45,26 +85,16 @@ class OrchestratorClient {
|
|
|
45
85
|
this.socket.on('connect_error', (err) => {
|
|
46
86
|
log.error(`Connection error: ${err.message}`);
|
|
47
87
|
});
|
|
48
|
-
// Register handlers for all result events
|
|
49
|
-
const
|
|
50
|
-
'orchestrator:verify-result',
|
|
51
|
-
'orchestrator:worktree-created',
|
|
52
|
-
'orchestrator:worktree-removed',
|
|
53
|
-
'orchestrator:git-status-result',
|
|
54
|
-
'orchestrator:git-commit-result',
|
|
55
|
-
'orchestrator:git-merge-result',
|
|
56
|
-
'orchestrator:repo-context-result',
|
|
57
|
-
];
|
|
58
|
-
for (const event of resultEvents) {
|
|
88
|
+
// Register handlers for all result events (sender side).
|
|
89
|
+
for (const event of RESULT_EVENTS) {
|
|
59
90
|
this.socket.on(event, (data) => {
|
|
60
91
|
this.resolvePending(data.cmdId, data);
|
|
61
92
|
});
|
|
62
93
|
}
|
|
63
|
-
// Progress events (not correlated to commands)
|
|
94
|
+
// Progress / capacity events (not correlated to commands).
|
|
64
95
|
this.socket.on('orchestrator:progress', (data) => {
|
|
65
96
|
log.info(`Progress: ${data.taskId} - ${data.message}`);
|
|
66
97
|
});
|
|
67
|
-
// Agent capacity events
|
|
68
98
|
this.socket.on('orchestrator:agent-ready', (data) => {
|
|
69
99
|
log.info(`Agent ready: ${data.agentId}`);
|
|
70
100
|
});
|
|
@@ -74,6 +104,107 @@ class OrchestratorClient {
|
|
|
74
104
|
this.socket.on('orchestrator:agent-idle', (data) => {
|
|
75
105
|
log.info(`Agent idle: ${data.agentId}`);
|
|
76
106
|
});
|
|
107
|
+
// Command receiver: execute locally and report back.
|
|
108
|
+
this.socket.on('orchestrator:verify', (data) => {
|
|
109
|
+
void this.handleVerify(data).catch((err) => {
|
|
110
|
+
this.emitResult('orchestrator:verify-result', data.cmdId, {
|
|
111
|
+
exitCode: 1,
|
|
112
|
+
stdout: '',
|
|
113
|
+
stderr: (0, config_1.msg)(err),
|
|
114
|
+
durationMs: 0,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
this.socket.on('orchestrator:create-worktree', (data) => {
|
|
119
|
+
void this.handleCreateWorktree(data).catch((err) => {
|
|
120
|
+
this.emitResult('orchestrator:worktree-created', data.cmdId, {
|
|
121
|
+
error: (0, config_1.msg)(err),
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
this.socket.on('orchestrator:remove-worktree', (data) => {
|
|
126
|
+
void this.handleRemoveWorktree(data).catch((err) => {
|
|
127
|
+
this.emitResult('orchestrator:worktree-removed', data.cmdId, {
|
|
128
|
+
error: (0, config_1.msg)(err),
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
this.socket.on('orchestrator:git-status', (data) => {
|
|
133
|
+
void this.handleGitStatus(data).catch((err) => {
|
|
134
|
+
this.emitResult('orchestrator:git-status-result', data.cmdId, {
|
|
135
|
+
error: (0, config_1.msg)(err),
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
this.socket.on('orchestrator:git-commit', (data) => {
|
|
140
|
+
void this.handleGitCommit(data).catch((err) => {
|
|
141
|
+
this.emitResult('orchestrator:git-commit-result', data.cmdId, {
|
|
142
|
+
error: (0, config_1.msg)(err),
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
this.socket.on('orchestrator:git-merge', (data) => {
|
|
147
|
+
void this.handleGitMerge(data).catch((err) => {
|
|
148
|
+
this.emitResult('orchestrator:git-merge-result', data.cmdId, {
|
|
149
|
+
success: false,
|
|
150
|
+
error: (0, config_1.msg)(err),
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
this.socket.on('orchestrator:git-push', (data) => {
|
|
155
|
+
void this.handleGitPush(data).catch((err) => {
|
|
156
|
+
this.emitResult('orchestrator:git-push-result', data.cmdId, {
|
|
157
|
+
success: false,
|
|
158
|
+
error: (0, config_1.msg)(err),
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
this.socket.on('orchestrator:git-revert-head', (data) => {
|
|
163
|
+
void this.handleGitRevertHead(data).catch((err) => {
|
|
164
|
+
this.emitResult('orchestrator:git-revert-head-result', data.cmdId, {
|
|
165
|
+
commitHash: '',
|
|
166
|
+
error: (0, config_1.msg)(err),
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
this.socket.on('orchestrator:git-reset-head', (data) => {
|
|
171
|
+
void this.handleGitResetHead(data).catch((err) => {
|
|
172
|
+
this.emitResult('orchestrator:git-reset-head-result', data.cmdId, {
|
|
173
|
+
success: false,
|
|
174
|
+
error: (0, config_1.msg)(err),
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
this.socket.on('orchestrator:planner-request', (data) => {
|
|
179
|
+
void this.handlePlannerRequest(data).catch((err) => {
|
|
180
|
+
log.warn(`planner-request failed: ${(0, config_1.msg)(err)}`);
|
|
181
|
+
this.emitResult('orchestrator:planner-result', data.cmdId, {
|
|
182
|
+
tasks: [
|
|
183
|
+
{
|
|
184
|
+
title: String(data.description ?? '').slice(0, 200),
|
|
185
|
+
description: String(data.description ?? ''),
|
|
186
|
+
dependencies: [],
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
this.socket.on('orchestrator:review-request', (data) => {
|
|
193
|
+
void this.handleReview(data).catch((err) => {
|
|
194
|
+
this.emitResult('orchestrator:review-result', data.cmdId, {
|
|
195
|
+
approved: false,
|
|
196
|
+
error: (0, config_1.msg)(err),
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
this.socket.on('orchestrator:question', (data) => {
|
|
201
|
+
void this.handleQuestion(data).catch((err) => {
|
|
202
|
+
this.emitResult('orchestrator:question-answered', data.cmdId, {
|
|
203
|
+
acknowledged: false,
|
|
204
|
+
error: (0, config_1.msg)(err),
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
77
208
|
}
|
|
78
209
|
/**
|
|
79
210
|
* Disconnect from the WS.
|
|
@@ -90,6 +221,237 @@ class OrchestratorClient {
|
|
|
90
221
|
}
|
|
91
222
|
this.pending.clear();
|
|
92
223
|
}
|
|
224
|
+
// ------------------------------------------------------------------
|
|
225
|
+
// Command handlers (backend -> bridge)
|
|
226
|
+
// ------------------------------------------------------------------
|
|
227
|
+
async handleVerify(data) {
|
|
228
|
+
const result = await (0, runner_1.runVerificationCommand)(String(data.step ?? 'build'), String(data.cwd ?? ''), typeof data.timeout === 'number' ? data.timeout : undefined);
|
|
229
|
+
this.emitResult('orchestrator:verify-result', data.cmdId, {
|
|
230
|
+
exitCode: result.exitCode,
|
|
231
|
+
stdout: result.stdout,
|
|
232
|
+
stderr: result.stderr,
|
|
233
|
+
durationMs: result.durationMs,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async handleCreateWorktree(data) {
|
|
237
|
+
const repoPath = (data.repoPath ? String(data.repoPath) : null) ??
|
|
238
|
+
(data.projectId ? (0, config_1.projectCwd)(String(data.projectId)) : null);
|
|
239
|
+
if (!repoPath) {
|
|
240
|
+
throw new Error('No repository path - link the project folder with: teamshare-agent link --project <id> --path <folder>');
|
|
241
|
+
}
|
|
242
|
+
// Auto-init repo if the linked folder isn't a git repo yet.
|
|
243
|
+
(0, worktree_1.ensureRepoExists)(repoPath);
|
|
244
|
+
// Auto-create a local bare repo as origin when no remote is configured,
|
|
245
|
+
// so git push succeeds without requiring a GitHub / Gitea account.
|
|
246
|
+
if (data.projectId) {
|
|
247
|
+
(0, worktree_1.ensureLocalBareRepo)(repoPath, String(data.projectId));
|
|
248
|
+
}
|
|
249
|
+
const info = (0, worktree_1.createWorktree)(repoPath, String(data.branchName ?? `ai/task-${data.agentId ?? 'x'}`), String(data.baseBranch ?? 'main'), String(data.repoId ?? data.branchName ?? 'x'));
|
|
250
|
+
this.emitResult('orchestrator:worktree-created', data.cmdId, {
|
|
251
|
+
path: info.path,
|
|
252
|
+
commitHash: info.commitHash,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async handleRemoveWorktree(data) {
|
|
256
|
+
const worktreePath = String(data.worktreePath ?? '');
|
|
257
|
+
const repoPath = (data.repoPath ? String(data.repoPath) : null) ??
|
|
258
|
+
(0, node_path_1.join)(worktreePath, '..', '..');
|
|
259
|
+
(0, worktree_1.removeWorktree)(repoPath, worktreePath);
|
|
260
|
+
this.emitResult('orchestrator:worktree-removed', data.cmdId, { ok: true });
|
|
261
|
+
}
|
|
262
|
+
async handleGitStatus(data) {
|
|
263
|
+
const status = (0, worktree_1.gitStatus)(String(data.worktreePath ?? ''));
|
|
264
|
+
this.emitResult('orchestrator:git-status-result', data.cmdId, {
|
|
265
|
+
stdout: JSON.stringify(status),
|
|
266
|
+
stderr: '',
|
|
267
|
+
exitCode: 0,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async handleGitCommit(data) {
|
|
271
|
+
const hash = (0, worktree_1.gitCommit)(String(data.worktreePath ?? ''), String(data.message ?? 'ai commit'));
|
|
272
|
+
this.emitResult('orchestrator:git-commit-result', data.cmdId, {
|
|
273
|
+
commitHash: hash,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async handleGitMerge(data) {
|
|
277
|
+
const repoPath = (data.repoPath ? String(data.repoPath) : null) ??
|
|
278
|
+
(data.projectId ? (0, config_1.projectCwd)(String(data.projectId)) : null);
|
|
279
|
+
if (!repoPath) {
|
|
280
|
+
throw new Error('No repository path - link the project folder with: teamshare-agent link --project <id> --path <folder>');
|
|
281
|
+
}
|
|
282
|
+
const result = (0, worktree_1.gitMerge)(repoPath, String(data.sourceBranch ?? ''), String(data.targetBranch ?? 'main'));
|
|
283
|
+
this.emitResult('orchestrator:git-merge-result', data.cmdId, result);
|
|
284
|
+
}
|
|
285
|
+
async handleGitPush(data) {
|
|
286
|
+
const repoPath = (data.repoPath ? String(data.repoPath) : null) ??
|
|
287
|
+
(data.projectId ? (0, config_1.projectCwd)(String(data.projectId)) : null);
|
|
288
|
+
if (!repoPath) {
|
|
289
|
+
throw new Error('No repository path - link the project folder with: teamshare-agent link --project <id> --path <folder>');
|
|
290
|
+
}
|
|
291
|
+
const result = (0, worktree_1.gitPush)(repoPath, String(data.branch ?? ''), String(data.remote ?? 'origin'), data.setUpstream !== false);
|
|
292
|
+
this.emitResult('orchestrator:git-push-result', data.cmdId, result);
|
|
293
|
+
}
|
|
294
|
+
async handleGitRevertHead(data) {
|
|
295
|
+
const worktreePath = String(data.worktreePath ?? '');
|
|
296
|
+
const result = (0, worktree_1.gitRevertHead)(worktreePath);
|
|
297
|
+
this.emitResult('orchestrator:git-revert-head-result', data.cmdId, result);
|
|
298
|
+
}
|
|
299
|
+
async handleGitResetHead(data) {
|
|
300
|
+
const worktreePath = String(data.worktreePath ?? '');
|
|
301
|
+
const commitHash = String(data.commitHash ?? '');
|
|
302
|
+
const result = (0, worktree_1.gitResetHead)(worktreePath, commitHash);
|
|
303
|
+
this.emitResult('orchestrator:git-reset-head-result', data.cmdId, result);
|
|
304
|
+
}
|
|
305
|
+
async handlePlannerRequest(data) {
|
|
306
|
+
const description = String(data.description ?? '');
|
|
307
|
+
const tasks = await this.plan(description);
|
|
308
|
+
this.emitResult('orchestrator:planner-result', data.cmdId, { tasks });
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Verification-agent review (backend -> bridge): LLM-reviews the worktree
|
|
312
|
+
* diff and returns an approve/reject verdict. The model + per-provider API
|
|
313
|
+
* key are resolved from the payload (or the bridge's env). A rejected
|
|
314
|
+
* review makes the backend treat verification as failed (retry/escalation).
|
|
315
|
+
*/
|
|
316
|
+
async handleReview(data) {
|
|
317
|
+
const worktreePath = String(data.worktreePath ?? '');
|
|
318
|
+
const modelSpec = String(data.model ?? process.env.LLM_MODEL ?? 'deepseek-chat');
|
|
319
|
+
const apiKey = (0, models_1.resolveApiKeyForProvider)(modelSpec);
|
|
320
|
+
const started = Date.now();
|
|
321
|
+
if (!apiKey) {
|
|
322
|
+
throw new Error('No API key for review - set the provider key (e.g. OPENROUTER_API_KEY) or LLM_API_KEY');
|
|
323
|
+
}
|
|
324
|
+
const diff = (0, worktree_1.gitDiff)(worktreePath);
|
|
325
|
+
if (!diff.trim()) {
|
|
326
|
+
// No changes to review - treat as approved (nothing to reject).
|
|
327
|
+
this.emitResult('orchestrator:review-result', data.cmdId, {
|
|
328
|
+
approved: true,
|
|
329
|
+
feedback: 'No changes in worktree',
|
|
330
|
+
durationMs: Date.now() - started,
|
|
331
|
+
});
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const resolved = (0, models_1.resolveModel)(modelSpec, process.env.LLM_BASE_URL);
|
|
335
|
+
const prompt = 'You are a senior code reviewer for a software build orchestrator. ' +
|
|
336
|
+
'Review the git diff below. Approve ONLY if the change is correct, ' +
|
|
337
|
+
'complete, follows the project conventions, and introduces no obvious ' +
|
|
338
|
+
'bugs, security issues, or broken tests/builds. Return ONLY a JSON ' +
|
|
339
|
+
'object, no prose: {"approved": true|false, "feedback": "1-3 sentence ' +
|
|
340
|
+
'reason, or requested changes"}\n\nDIFF:\n' + diff.slice(0, 60_000);
|
|
341
|
+
try {
|
|
342
|
+
const raw = await (0, llm_1.complete)(prompt, {
|
|
343
|
+
baseUrl: resolved.baseUrl,
|
|
344
|
+
apiKey,
|
|
345
|
+
model: resolved.model,
|
|
346
|
+
temperature: 0.1,
|
|
347
|
+
maxTokens: 800,
|
|
348
|
+
});
|
|
349
|
+
const cleaned = raw.replace(/```json/gi, '').replace(/```/g, '').trim();
|
|
350
|
+
const start = cleaned.indexOf('{');
|
|
351
|
+
const end = cleaned.lastIndexOf('}');
|
|
352
|
+
const parsed = start >= 0 && end > start
|
|
353
|
+
? JSON.parse(cleaned.slice(start, end + 1))
|
|
354
|
+
: null;
|
|
355
|
+
const approved = parsed && parsed.approved === true;
|
|
356
|
+
this.emitResult('orchestrator:review-result', data.cmdId, {
|
|
357
|
+
approved: Boolean(approved),
|
|
358
|
+
feedback: parsed?.feedback ? String(parsed.feedback) : undefined,
|
|
359
|
+
durationMs: Date.now() - started,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
throw new Error(`Review LLM failed: ${(0, config_1.msg)(err)}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Backend notifies bridge that an orchestrator task has a pending human
|
|
368
|
+
* question. Acknowledge immediately — the bridge relays this to any active
|
|
369
|
+
* agent session so it can pause and wait for the answer.
|
|
370
|
+
*/
|
|
371
|
+
async handleQuestion(data) {
|
|
372
|
+
const taskId = String(data.taskId ?? '');
|
|
373
|
+
const body = String(data.body ?? '');
|
|
374
|
+
log.info(`Question pending for task ${taskId}: ${body.slice(0, 120)}`);
|
|
375
|
+
this.emitResult('orchestrator:question-answered', data.cmdId, {
|
|
376
|
+
acknowledged: true,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Signal to the backend that a human answered a question on a
|
|
381
|
+
* question_pending orchestrator task. Called by the daemon when it
|
|
382
|
+
* receives a `question.answered` wake for an orchestrator task.
|
|
383
|
+
*/
|
|
384
|
+
signalQuestionAnswered(orchestratorTaskId, answerCommentId) {
|
|
385
|
+
if (!this.socket?.connected) {
|
|
386
|
+
log.warn(`Cannot signal question-answered: not connected`);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
this.socket.emit('orchestrator:question-answered', {
|
|
390
|
+
cmdId: `auto_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
391
|
+
orchestratorTaskId,
|
|
392
|
+
answerCommentId,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* LLM task decomposition for the planner. Falls back to a single node when
|
|
397
|
+
* no LLM key is configured or the model doesn't return parseable JSON.
|
|
398
|
+
*/
|
|
399
|
+
async plan(description) {
|
|
400
|
+
const single = () => [
|
|
401
|
+
{
|
|
402
|
+
title: description.slice(0, 200),
|
|
403
|
+
description,
|
|
404
|
+
dependencies: [],
|
|
405
|
+
},
|
|
406
|
+
];
|
|
407
|
+
if (!description.trim())
|
|
408
|
+
return single();
|
|
409
|
+
const apiKey = process.env.LLM_API_KEY ?? process.env.CHAT_LLM_API_KEY;
|
|
410
|
+
if (!apiKey)
|
|
411
|
+
return single();
|
|
412
|
+
const baseUrl = process.env.LLM_BASE_URL ?? 'https://api.deepseek.com/v1';
|
|
413
|
+
const model = process.env.LLM_MODEL ?? 'deepseek-chat';
|
|
414
|
+
const prompt = 'You are a software build planner. Break the task below into 2-5 concrete, ' +
|
|
415
|
+
'independently verifiable subtasks, in dependency order. ' +
|
|
416
|
+
'Return ONLY a JSON array, no prose: ' +
|
|
417
|
+
'[{"title":"...","description":"...","dependencies":[indices into the array]}] ' +
|
|
418
|
+
'(dependencies are 0-based indices of steps that must finish first; empty array = none).\n\n' +
|
|
419
|
+
`TASK: ${description}`;
|
|
420
|
+
try {
|
|
421
|
+
const raw = await (0, llm_1.complete)(prompt, {
|
|
422
|
+
baseUrl,
|
|
423
|
+
apiKey,
|
|
424
|
+
model,
|
|
425
|
+
temperature: 0.2,
|
|
426
|
+
maxTokens: 2000,
|
|
427
|
+
});
|
|
428
|
+
const cleaned = raw
|
|
429
|
+
.replace(/```json/gi, '')
|
|
430
|
+
.replace(/```/g, '')
|
|
431
|
+
.trim();
|
|
432
|
+
const start = cleaned.indexOf('[');
|
|
433
|
+
const end = cleaned.lastIndexOf(']');
|
|
434
|
+
if (start < 0 || end <= start)
|
|
435
|
+
return single();
|
|
436
|
+
const parsed = JSON.parse(cleaned.slice(start, end + 1));
|
|
437
|
+
if (!Array.isArray(parsed) || parsed.length === 0)
|
|
438
|
+
return single();
|
|
439
|
+
return parsed.map((node, i) => ({
|
|
440
|
+
title: String(node.title ?? `Step ${i + 1}`).slice(0, 200),
|
|
441
|
+
description: String(node.description ?? ''),
|
|
442
|
+
dependencies: Array.isArray(node.dependencies)
|
|
443
|
+
? node.dependencies.map(Number).filter((d) => Number.isInteger(d) && d >= 0 && d < parsed.length && d !== i)
|
|
444
|
+
: [],
|
|
445
|
+
}));
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
log.warn(`planner LLM failed, using single node: ${(0, config_1.msg)(err)}`);
|
|
449
|
+
return single();
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// ------------------------------------------------------------------
|
|
453
|
+
// Sender side
|
|
454
|
+
// ------------------------------------------------------------------
|
|
93
455
|
/**
|
|
94
456
|
* Send a command and wait for the result.
|
|
95
457
|
*/
|
|
@@ -111,9 +473,7 @@ class OrchestratorClient {
|
|
|
111
473
|
this.socket.emit(event, { cmdId, ...payload });
|
|
112
474
|
});
|
|
113
475
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Resolve a pending command by its id.
|
|
116
|
-
*/
|
|
476
|
+
/** Resolve a pending command by its id. */
|
|
117
477
|
resolvePending(cmdId, data) {
|
|
118
478
|
const pending = this.pending.get(cmdId);
|
|
119
479
|
if (!pending) {
|
|
@@ -124,6 +484,14 @@ class OrchestratorClient {
|
|
|
124
484
|
this.pending.delete(cmdId);
|
|
125
485
|
pending.resolve(data);
|
|
126
486
|
}
|
|
487
|
+
/** Emit a command result back to the backend. */
|
|
488
|
+
emitResult(event, cmdId, payload) {
|
|
489
|
+
if (!this.socket?.connected) {
|
|
490
|
+
log.warn(`Cannot emit ${event}: not connected`);
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
this.socket.emit(event, { cmdId, ...payload });
|
|
494
|
+
}
|
|
127
495
|
/**
|
|
128
496
|
* Check if connected.
|
|
129
497
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/orchestrator/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/orchestrator/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { OrchestratorClient } from './client';
|
|
2
|
-
export { createWorktree, removeWorktree, gitStatus, gitCommit, gitMerge, gitDiff, getWorktreeRoot, } from './worktree';
|
|
2
|
+
export { createWorktree, removeWorktree, gitStatus, gitCommit, gitMerge, gitDiff, gitPush, gitRemoteUrl, isGitRepo, gitInit, getWorktreeRoot, } from './worktree';
|
|
3
3
|
export type { WorktreeInfo, GitStatus } from './worktree';
|
|
4
4
|
export { runCommand, runVerificationCommand } from './runner';
|
|
5
5
|
export type { CommandResult } from './runner';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runVerificationCommand = exports.runCommand = exports.getWorktreeRoot = exports.gitDiff = exports.gitMerge = exports.gitCommit = exports.gitStatus = exports.removeWorktree = exports.createWorktree = exports.OrchestratorClient = void 0;
|
|
3
|
+
exports.runVerificationCommand = exports.runCommand = exports.getWorktreeRoot = exports.gitInit = exports.isGitRepo = exports.gitRemoteUrl = exports.gitPush = exports.gitDiff = exports.gitMerge = exports.gitCommit = exports.gitStatus = exports.removeWorktree = exports.createWorktree = exports.OrchestratorClient = void 0;
|
|
4
4
|
var client_1 = require("./client");
|
|
5
5
|
Object.defineProperty(exports, "OrchestratorClient", { enumerable: true, get: function () { return client_1.OrchestratorClient; } });
|
|
6
6
|
var worktree_1 = require("./worktree");
|
|
@@ -10,6 +10,10 @@ Object.defineProperty(exports, "gitStatus", { enumerable: true, get: function ()
|
|
|
10
10
|
Object.defineProperty(exports, "gitCommit", { enumerable: true, get: function () { return worktree_1.gitCommit; } });
|
|
11
11
|
Object.defineProperty(exports, "gitMerge", { enumerable: true, get: function () { return worktree_1.gitMerge; } });
|
|
12
12
|
Object.defineProperty(exports, "gitDiff", { enumerable: true, get: function () { return worktree_1.gitDiff; } });
|
|
13
|
+
Object.defineProperty(exports, "gitPush", { enumerable: true, get: function () { return worktree_1.gitPush; } });
|
|
14
|
+
Object.defineProperty(exports, "gitRemoteUrl", { enumerable: true, get: function () { return worktree_1.gitRemoteUrl; } });
|
|
15
|
+
Object.defineProperty(exports, "isGitRepo", { enumerable: true, get: function () { return worktree_1.isGitRepo; } });
|
|
16
|
+
Object.defineProperty(exports, "gitInit", { enumerable: true, get: function () { return worktree_1.gitInit; } });
|
|
13
17
|
Object.defineProperty(exports, "getWorktreeRoot", { enumerable: true, get: function () { return worktree_1.getWorktreeRoot; } });
|
|
14
18
|
var runner_1 = require("./runner");
|
|
15
19
|
Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return runner_1.runCommand; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/orchestrator/index.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/orchestrator/index.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,uCAYoB;AAXlB,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,qGAAA,SAAS,OAAA;AACT,qGAAA,SAAS,OAAA;AACT,oGAAA,QAAQ,OAAA;AACR,mGAAA,OAAO,OAAA;AACP,mGAAA,OAAO,OAAA;AACP,wGAAA,YAAY,OAAA;AACZ,qGAAA,SAAS,OAAA;AACT,mGAAA,OAAO,OAAA;AACP,2GAAA,eAAe,OAAA;AAGjB,mCAA8D;AAArD,oGAAA,UAAU,OAAA;AAAE,gHAAA,sBAAsB,OAAA"}
|
|
@@ -41,3 +41,55 @@ export declare function gitMerge(repoPath: string, sourceBranch: string, targetB
|
|
|
41
41
|
* Get the diff for a worktree.
|
|
42
42
|
*/
|
|
43
43
|
export declare function gitDiff(worktreePath: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Push a branch to a remote.
|
|
46
|
+
* Uses the given remote name (defaults to 'origin'). Returns success or the error.
|
|
47
|
+
*/
|
|
48
|
+
export declare function gitPush(repoPath: string, branch: string, remote?: string, setUpstream?: boolean): {
|
|
49
|
+
success: boolean;
|
|
50
|
+
remoteRef?: string;
|
|
51
|
+
error?: string;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Revert the last commit in a worktree (git revert HEAD --no-edit).
|
|
55
|
+
* Returns the new commit hash after the revert.
|
|
56
|
+
*/
|
|
57
|
+
export declare function gitRevertHead(worktreePath: string): {
|
|
58
|
+
commitHash: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Hard reset a worktree to a specific commit (git reset --hard <hash>).
|
|
62
|
+
* Discards ALL uncommitted changes and moves HEAD to the target commit.
|
|
63
|
+
*/
|
|
64
|
+
export declare function gitResetHead(worktreePath: string, commitHash: string): {
|
|
65
|
+
success: boolean;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Get the remote URL for a git repo. Returns null if not a git repo or no remote.
|
|
69
|
+
*/
|
|
70
|
+
export declare function gitRemoteUrl(repoPath: string, remote?: string): string | null;
|
|
71
|
+
/**
|
|
72
|
+
* Check whether a directory is a git repository.
|
|
73
|
+
*/
|
|
74
|
+
export declare function isGitRepo(dir: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Initialize a git repository in a directory (git init + optional remote).
|
|
77
|
+
* Returns the origin URL if a remote was added, else null.
|
|
78
|
+
*/
|
|
79
|
+
export declare function gitInit(dir: string, remoteName?: string, originUrl?: string): {
|
|
80
|
+
success: boolean;
|
|
81
|
+
originUrl?: string;
|
|
82
|
+
error?: string;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Ensure a directory is a git repository. If not, initialise it.
|
|
86
|
+
* This allows the orchestrator to work on projects that have no git repo yet.
|
|
87
|
+
*/
|
|
88
|
+
export declare function ensureRepoExists(repoPath: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* Ensure a local bare repo exists and is configured as the origin remote for
|
|
91
|
+
* `repoPath`. When no remote is configured (the user hasn't linked a GitHub /
|
|
92
|
+
* Gitea repo), this allows `git push` to succeed against a local bare repo
|
|
93
|
+
* at `~/.teamshare/bare-repos/<projectId>.git/`.
|
|
94
|
+
*/
|
|
95
|
+
export declare function ensureLocalBareRepo(repoPath: string, projectId: string): string;
|