teamshare-bridge 0.1.0
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 +343 -0
- package/dist/bridge/daemon.d.ts +1 -0
- package/dist/bridge/daemon.js +230 -0
- package/dist/bridge/daemon.js.map +1 -0
- package/dist/bridge/index.d.ts +2 -0
- package/dist/bridge/index.js +273 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/local-server.d.ts +29 -0
- package/dist/bridge/local-server.js +87 -0
- package/dist/bridge/local-server.js.map +1 -0
- package/dist/bridge/protocol.d.ts +4 -0
- package/dist/bridge/protocol.js +151 -0
- package/dist/bridge/protocol.js.map +1 -0
- package/dist/bridge/service.d.ts +32 -0
- package/dist/bridge/service.js +248 -0
- package/dist/bridge/service.js.map +1 -0
- package/dist/bridge/spawn.d.ts +15 -0
- package/dist/bridge/spawn.js +271 -0
- package/dist/bridge/spawn.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +543 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/lib/api.d.ts +191 -0
- package/dist/lib/api.js +209 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/brief.d.ts +16 -0
- package/dist/lib/brief.js +115 -0
- package/dist/lib/brief.js.map +1 -0
- package/dist/lib/chat-reply.d.ts +29 -0
- package/dist/lib/chat-reply.js +126 -0
- package/dist/lib/chat-reply.js.map +1 -0
- package/dist/lib/config.d.ts +25 -0
- package/dist/lib/config.js +81 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/doc-reply.d.ts +22 -0
- package/dist/lib/doc-reply.js +108 -0
- package/dist/lib/doc-reply.js.map +1 -0
- package/dist/lib/llm.d.ts +50 -0
- package/dist/lib/llm.js +444 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +41 -0
- package/dist/lib/lock.js +148 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/models.d.ts +30 -0
- package/dist/lib/models.js +51 -0
- package/dist/lib/models.js.map +1 -0
- package/dist/lib/partial-stream.d.ts +25 -0
- package/dist/lib/partial-stream.js +99 -0
- package/dist/lib/partial-stream.js.map +1 -0
- package/dist/lib/session-stream.d.ts +38 -0
- package/dist/lib/session-stream.js +191 -0
- package/dist/lib/session-stream.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
/**
|
|
5
|
+
* teamshare-agent - the TeamShare agent CLI.
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* connect --agent <id> --key <ts_...> test + save credentials
|
|
9
|
+
* run --task <taskId> --agent <id> --key <ts_...> [--harness ...] [--self] [--no-report] [--session <id>]
|
|
10
|
+
* chat --project <projectId> --agent <id> --key <ts_...> [--mention <token>] [--session <id>]
|
|
11
|
+
* Reply to every chat message that @mentions the agent.
|
|
12
|
+
* --help
|
|
13
|
+
*
|
|
14
|
+
* Every session streams its output to the live console (Phase A): the CLI
|
|
15
|
+
* opens its own /agents WebSocket and emits session:start / session:output
|
|
16
|
+
* (batched) / session:end. Streaming is best-effort - it degrades silently.
|
|
17
|
+
*/
|
|
18
|
+
const node_child_process_1 = require("node:child_process");
|
|
19
|
+
const node_fs_1 = require("node:fs");
|
|
20
|
+
const node_path_1 = require("node:path");
|
|
21
|
+
const node_os_1 = require("node:os");
|
|
22
|
+
const node_fs_2 = require("node:fs");
|
|
23
|
+
const api_1 = require("../lib/api");
|
|
24
|
+
const brief_1 = require("../lib/brief");
|
|
25
|
+
const llm_1 = require("../lib/llm");
|
|
26
|
+
const chat_reply_1 = require("../lib/chat-reply");
|
|
27
|
+
const doc_reply_1 = require("../lib/doc-reply");
|
|
28
|
+
const config_1 = require("../lib/config");
|
|
29
|
+
const lock_1 = require("../lib/lock");
|
|
30
|
+
const session_stream_1 = require("../lib/session-stream");
|
|
31
|
+
const models_1 = require("../lib/models");
|
|
32
|
+
const VERSION = '0.1.0';
|
|
33
|
+
const WS_DEFAULT = 'ws://localhost:4000';
|
|
34
|
+
/** Phase D settings resolution: CLI flag > agent settings (passed as flags) > env > default. */
|
|
35
|
+
function modelOf(flags) {
|
|
36
|
+
return flags.get('model') ?? process.env.LLM_MODEL ?? llm_1.DEFAULT_LLM_MODEL;
|
|
37
|
+
}
|
|
38
|
+
/** Model spec -> { baseUrl, model } via the catalog (env LLM_BASE_URL wins). */
|
|
39
|
+
function llmEndpoint(flags) {
|
|
40
|
+
const spec = modelOf(flags);
|
|
41
|
+
const resolved = (0, models_1.resolveModel)(spec, process.env.LLM_BASE_URL);
|
|
42
|
+
if (!resolved.catalogued) {
|
|
43
|
+
console.log(`[model] "${spec}" is not a catalogued provider:model spec - using LLM_BASE_URL (${resolved.baseUrl})`);
|
|
44
|
+
}
|
|
45
|
+
return { baseUrl: resolved.baseUrl, model: resolved.model };
|
|
46
|
+
}
|
|
47
|
+
function temperatureOf(flags) {
|
|
48
|
+
const raw = flags.get('temperature') ?? process.env.LLM_TEMPERATURE;
|
|
49
|
+
if (raw === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
const n = Number(raw);
|
|
52
|
+
return Number.isFinite(n) ? Math.min(2, Math.max(0, n)) : undefined;
|
|
53
|
+
}
|
|
54
|
+
function maxTokensOf(flags) {
|
|
55
|
+
const raw = flags.get('max-tokens') ?? process.env.LLM_MAX_TOKENS;
|
|
56
|
+
if (raw === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const n = Number(raw);
|
|
59
|
+
return Number.isInteger(n) && n > 0 ? n : undefined;
|
|
60
|
+
}
|
|
61
|
+
function systemPromptOf(flags) {
|
|
62
|
+
const inline = flags.get('system-prompt');
|
|
63
|
+
if (inline !== undefined)
|
|
64
|
+
return inline;
|
|
65
|
+
const file = flags.get('system-prompt-file');
|
|
66
|
+
if (file && (0, node_fs_1.existsSync)(file))
|
|
67
|
+
return (0, node_fs_1.readFileSync)(file, 'utf8');
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/** Console + live-stream logger for a session. */
|
|
71
|
+
function makeLog(stream) {
|
|
72
|
+
return (text, level = 'stdout') => {
|
|
73
|
+
console[level === 'stderr' ? 'error' : 'log'](text);
|
|
74
|
+
stream?.line(text, level);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function usage() {
|
|
78
|
+
return [
|
|
79
|
+
'teamshare-agent - TeamShare agent CLI',
|
|
80
|
+
'',
|
|
81
|
+
'USAGE',
|
|
82
|
+
' teamshare-agent connect --agent <agentId> --key <ts_...>',
|
|
83
|
+
' Test the connection and save the agent key in ~/.teamshare/config.json.',
|
|
84
|
+
'',
|
|
85
|
+
' teamshare-agent run --task <taskId> --agent <agentId> --key <ts_...> [options]',
|
|
86
|
+
' Fetch the task brief and work it with a harness or headless LLM.',
|
|
87
|
+
' Without --task, picks up the agent\'s next assigned task from its inbox',
|
|
88
|
+
' (urgent > high > medium > low, then oldest; skips in_review/resolved/closed).',
|
|
89
|
+
'',
|
|
90
|
+
' teamshare-agent continue --task <taskId> --agent <agentId> --key <ts_...> [--self]',
|
|
91
|
+
' Resume the previous --self session for a task (Phase E continuation).',
|
|
92
|
+
'',
|
|
93
|
+
' teamshare-agent chat --project <projectId> --agent <agentId> --key <ts_...> [--mention <token>]',
|
|
94
|
+
' Reply to every project-chat message that @mentions the agent (one reply',
|
|
95
|
+
' per message). Spawned by the daemon on chat.mention wakes.',
|
|
96
|
+
'',
|
|
97
|
+
' teamshare-agent doc --document <documentId> --agent <agentId> --key <ts_...> [--mention <token>]',
|
|
98
|
+
' Document assistant (Phase F): read the document (Word/PPT/Excel/PDF)',
|
|
99
|
+
' and reply to every comment that @mentions the agent in its thread.',
|
|
100
|
+
' Spawned by the daemon on document.mention wakes.',
|
|
101
|
+
'',
|
|
102
|
+
'OPTIONS',
|
|
103
|
+
' --harness auto|opencode|claude|none session driver (default: config or auto)',
|
|
104
|
+
' --self headless LLM loop (needs LLM_API_KEY env)',
|
|
105
|
+
' --no-report skip the closing summary comment',
|
|
106
|
+
' --continue resume the previous --self session for this task (Phase E)',
|
|
107
|
+
' --session <id> live-console session id (default: auto)',
|
|
108
|
+
' --model <id> model override (Phase D; env LLM_MODEL)',
|
|
109
|
+
' --temperature <0-2> sampling temperature (Phase D; env LLM_TEMPERATURE)',
|
|
110
|
+
' --max-tokens <n> token budget (Phase D; env LLM_MAX_TOKENS)',
|
|
111
|
+
' --system-prompt <text> system prompt override (Phase D)',
|
|
112
|
+
' --system-prompt-file <path> system prompt from a file (Phase D)',
|
|
113
|
+
' --ask-timeout <sec> ask_human wait limit (Phase B; env TEAMSHARE_ASK_TIMEOUT)',
|
|
114
|
+
' --api-url <url> TeamShare API base (default: ' + api_1.DEFAULT_API_URL + ')',
|
|
115
|
+
' -h, --help this help',
|
|
116
|
+
'',
|
|
117
|
+
'ENV',
|
|
118
|
+
' TEAMSHARE_API_URL API base override',
|
|
119
|
+
' TEAMSHARE_WS_URL /agents WebSocket base (default: ' + WS_DEFAULT + ')',
|
|
120
|
+
' LLM_BASE_URL OpenAI-compatible base (default: ' + llm_1.DEFAULT_LLM_BASE_URL + ')',
|
|
121
|
+
' LLM_API_KEY required for --self',
|
|
122
|
+
' LLM_MODEL model id (default: ' + llm_1.DEFAULT_LLM_MODEL + ')',
|
|
123
|
+
'',
|
|
124
|
+
'EXAMPLES',
|
|
125
|
+
' teamshare-agent connect --agent 3f9a... --key ts_AbC123...',
|
|
126
|
+
' teamshare-agent run --task 8b2c... --agent 3f9a... --key ts_AbC123... --self',
|
|
127
|
+
].join('\n');
|
|
128
|
+
}
|
|
129
|
+
function parseArgs(argv) {
|
|
130
|
+
const flags = new Map();
|
|
131
|
+
const positionals = [];
|
|
132
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
133
|
+
const arg = argv[i];
|
|
134
|
+
if (arg === '-h' || arg === '--help') {
|
|
135
|
+
flags.set('help', 'true');
|
|
136
|
+
}
|
|
137
|
+
else if (arg.startsWith('--')) {
|
|
138
|
+
const eq = arg.indexOf('=');
|
|
139
|
+
if (eq > 0) {
|
|
140
|
+
flags.set(arg.slice(2, eq), arg.slice(eq + 1));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
const name = arg.slice(2);
|
|
144
|
+
const value = argv[i + 1];
|
|
145
|
+
if (value !== undefined && !value.startsWith('--')) {
|
|
146
|
+
flags.set(name, value);
|
|
147
|
+
i += 1;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
flags.set(name, 'true');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
positionals.push(arg);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return { flags, positionals };
|
|
159
|
+
}
|
|
160
|
+
function need(flags, name) {
|
|
161
|
+
const value = flags.get(name);
|
|
162
|
+
if (!value) {
|
|
163
|
+
console.error(`Missing required flag: --${name}`);
|
|
164
|
+
process.exitCode = 2;
|
|
165
|
+
throw new Error(`missing --${name}`);
|
|
166
|
+
}
|
|
167
|
+
return value;
|
|
168
|
+
}
|
|
169
|
+
function harnessOf(flags) {
|
|
170
|
+
return (flags.get('harness') ?? (0, config_1.loadConfig)().harness ?? 'auto');
|
|
171
|
+
}
|
|
172
|
+
async function cmdConnect(flags) {
|
|
173
|
+
const agentId = need(flags, 'agent');
|
|
174
|
+
const apiKey = need(flags, 'key');
|
|
175
|
+
const api = new api_1.TeamshareApi(process.env.TEAMSHARE_API_URL, apiKey);
|
|
176
|
+
await api.heartbeat(agentId, 'online');
|
|
177
|
+
(0, config_1.upsertAgent)(agentId, apiKey);
|
|
178
|
+
console.log(`Connected: agent ${agentId} (key saved to ~/.teamshare/config.json)`);
|
|
179
|
+
console.log('Ready: teamshare-agent run --task <taskId> --agent ' + agentId + '');
|
|
180
|
+
}
|
|
181
|
+
async function cmdRun(flags) {
|
|
182
|
+
const agentId = need(flags, 'agent');
|
|
183
|
+
const apiKey = need(flags, 'key');
|
|
184
|
+
const selfMode = flags.get('self') === 'true';
|
|
185
|
+
const noReport = flags.get('no-report') === 'true';
|
|
186
|
+
const harness = harnessOf(flags);
|
|
187
|
+
const api = new api_1.TeamshareApi(process.env.TEAMSHARE_API_URL, apiKey);
|
|
188
|
+
// One session per agent at a time - wait for any in-flight session to finish.
|
|
189
|
+
const lock = await (0, lock_1.acquireLock)(agentId, 'task', {
|
|
190
|
+
taskId: flags.get('task') ?? undefined,
|
|
191
|
+
}, {
|
|
192
|
+
onWaiting: (busy) => console.log(`[lock] agent ${agentId} is busy (pid ${busy.pid}, since ${busy.startedAt}, ${busy.kind}) - waiting for it to finish...`),
|
|
193
|
+
});
|
|
194
|
+
if (!lock) {
|
|
195
|
+
console.error(`[lock] gave up waiting for agent ${agentId} - try again later`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
let exitCode = 0;
|
|
199
|
+
let heartbeatTimer;
|
|
200
|
+
const sessionId = flags.get('session') ?? (0, session_stream_1.newSessionId)();
|
|
201
|
+
const stream = new session_stream_1.SessionStream({ sessionId, agentId, mode: 'run' });
|
|
202
|
+
stream.connect((process.env.TEAMSHARE_WS_URL ?? WS_DEFAULT).replace(/\/$/, '') + '/agents', apiKey);
|
|
203
|
+
const log = makeLog(stream);
|
|
204
|
+
try {
|
|
205
|
+
// Explicit --task wins; otherwise pick up the agent's next assigned task
|
|
206
|
+
// from its inbox (urgent > high > medium > low, then oldest; anything
|
|
207
|
+
// in_review/resolved/closed is skipped).
|
|
208
|
+
let taskId = flags.get('task');
|
|
209
|
+
if (!taskId) {
|
|
210
|
+
const picked = await pickNextTask(api, agentId, log);
|
|
211
|
+
if (!picked) {
|
|
212
|
+
log('[pickup] no assigned tasks to work - nothing to do');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
taskId = picked;
|
|
216
|
+
}
|
|
217
|
+
const task = await api.getTask(taskId).catch(() => null);
|
|
218
|
+
stream.meta.projectId = task?.projectId ?? undefined;
|
|
219
|
+
log(`[teamshare-agent] task ${taskId} as agent ${agentId} (${selfMode ? 'headless' : harness})`);
|
|
220
|
+
await (0, brief_1.reportStatus)(api, agentId, 'working', taskId, sessionId);
|
|
221
|
+
// Keep lastSeenAt fresh during long sessions so the backend liveness
|
|
222
|
+
// sweep never mistakes a working agent for a dead one.
|
|
223
|
+
heartbeatTimer = setInterval(() => {
|
|
224
|
+
void (0, brief_1.reportStatus)(api, agentId, 'working', taskId, sessionId);
|
|
225
|
+
}, 60_000);
|
|
226
|
+
const brief = await (0, brief_1.fetchTaskBrief)(api, taskId);
|
|
227
|
+
const briefPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `teamshare-task-${taskId}.md`);
|
|
228
|
+
(0, node_fs_2.writeFileSync)(briefPath, brief, 'utf8');
|
|
229
|
+
log(`[brief] written to ${briefPath} (${brief.length} chars)`);
|
|
230
|
+
log('[brief] --- preview ---');
|
|
231
|
+
for (const line of brief.split('\n').slice(0, 24))
|
|
232
|
+
log(line);
|
|
233
|
+
log('[brief] --- end preview ---');
|
|
234
|
+
let summary = '';
|
|
235
|
+
if (selfMode) {
|
|
236
|
+
const llmApiKey = process.env.LLM_API_KEY;
|
|
237
|
+
if (!llmApiKey) {
|
|
238
|
+
log('--self requires LLM_API_KEY env (and optionally LLM_BASE_URL / LLM_MODEL)', 'stderr');
|
|
239
|
+
exitCode = 1;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
log('[session] starting headless LLM loop...');
|
|
243
|
+
if (flags.get('ask-timeout')) {
|
|
244
|
+
process.env.TEAMSHARE_ASK_TIMEOUT = flags.get('ask-timeout') ?? '';
|
|
245
|
+
}
|
|
246
|
+
const endpoint = llmEndpoint(flags);
|
|
247
|
+
log(`[model] ${endpoint.model} @ ${endpoint.baseUrl}`);
|
|
248
|
+
const result = await (0, llm_1.runLlmSession)(api, taskId, brief, {
|
|
249
|
+
baseUrl: endpoint.baseUrl,
|
|
250
|
+
apiKey: llmApiKey,
|
|
251
|
+
model: endpoint.model,
|
|
252
|
+
agentName: agentId,
|
|
253
|
+
systemPrompt: systemPromptOf(flags),
|
|
254
|
+
temperature: temperatureOf(flags),
|
|
255
|
+
maxTokens: maxTokensOf(flags),
|
|
256
|
+
continue: flags.get('continue') === 'true',
|
|
257
|
+
});
|
|
258
|
+
summary =
|
|
259
|
+
result.summary ||
|
|
260
|
+
`Agent run finished after ${result.iterations} iterations (${result.tokensUsed} tokens).`;
|
|
261
|
+
log(`[session] done: ${result.finishedBy} | ${result.iterations} iterations | ${result.tokensUsed} tokens`);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const systemPrompt = systemPromptOf(flags);
|
|
265
|
+
const prompt = `Work on the TeamShare task described in ${briefPath} using the teamshare MCP tools. ` +
|
|
266
|
+
`Break the task down first: create 3-8 subtasks with create_subtask, then check each off ` +
|
|
267
|
+
`(update_subtask with done: true) as you complete it. ` +
|
|
268
|
+
(systemPrompt ? `Follow these instructions: ${systemPrompt}\n\n` : '') +
|
|
269
|
+
`Keep the human informed with progress comments on the task. When done, post a detailed ` +
|
|
270
|
+
`summary comment (mention the subtask progress) and move the task to in_review (or resolved if you are confident).`;
|
|
271
|
+
exitCode = await spawnHarness(harness, prompt, log, {
|
|
272
|
+
model: flags.get('model') ?? undefined,
|
|
273
|
+
temperature: temperatureOf(flags),
|
|
274
|
+
});
|
|
275
|
+
summary = `Harness (${harness}) finished the session - see the task comments.`;
|
|
276
|
+
}
|
|
277
|
+
if (!noReport)
|
|
278
|
+
await (0, brief_1.postClosingComment)(api, taskId, summary);
|
|
279
|
+
const taskFinal = await (0, brief_1.waitForTaskCompletion)(api, taskId, 15_000, 20 * 60_000, (s) => log(`[status] ${s}`));
|
|
280
|
+
log(`[done] task ${taskId} final status: ${taskFinal.status}`);
|
|
281
|
+
await (0, brief_1.reportStatus)(api, agentId, 'online', taskId, sessionId);
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
log(`[error] ${(0, config_1.msg)(err)}`, 'stderr');
|
|
285
|
+
exitCode = 1;
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
if (heartbeatTimer)
|
|
289
|
+
clearInterval(heartbeatTimer);
|
|
290
|
+
(0, lock_1.releaseLock)(agentId);
|
|
291
|
+
await stream.end(exitCode);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const DONE_STATUSES = new Set(['in_review', 'resolved', 'closed']);
|
|
295
|
+
const PRIORITY_RANK = { urgent: 0, high: 1, medium: 2, low: 3 };
|
|
296
|
+
/** Document assistant loop: reply to every comment mentioning the agent. */
|
|
297
|
+
async function cmdDoc(flags) {
|
|
298
|
+
const documentId = need(flags, 'document');
|
|
299
|
+
const agentId = need(flags, 'agent');
|
|
300
|
+
const apiKey = need(flags, 'key');
|
|
301
|
+
const mention = flags.get('mention') ?? '';
|
|
302
|
+
const selfMode = flags.get('self') === 'true';
|
|
303
|
+
const harness = harnessOf(flags);
|
|
304
|
+
let exitCode = 0;
|
|
305
|
+
const sessionId = flags.get('session') ?? (0, session_stream_1.newSessionId)();
|
|
306
|
+
const stream = new session_stream_1.SessionStream({ sessionId, agentId, mode: 'chat' });
|
|
307
|
+
stream.connect((process.env.TEAMSHARE_WS_URL ?? WS_DEFAULT).replace(/\/$/, '') + '/agents', apiKey);
|
|
308
|
+
const log = makeLog(stream);
|
|
309
|
+
const api = new api_1.TeamshareApi(process.env.TEAMSHARE_API_URL, apiKey);
|
|
310
|
+
const lock = await (0, lock_1.acquireLock)(agentId, 'doc', { documentId }, {
|
|
311
|
+
onWaiting: (busy) => console.log(`[lock] agent ${agentId} is busy (pid ${busy.pid}, since ${busy.startedAt}, ${busy.kind}) - waiting for it to finish...`),
|
|
312
|
+
});
|
|
313
|
+
if (!lock) {
|
|
314
|
+
console.error(`[lock] gave up waiting for agent ${agentId} - try again later`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
await (0, brief_1.reportStatus)(api, agentId, 'working', undefined, sessionId);
|
|
319
|
+
log(`[teamshare-agent] document assistant (document ${documentId}${mention ? `, mention @${mention}` : 'all mentions'})`);
|
|
320
|
+
const heartbeatTimer = setInterval(() => {
|
|
321
|
+
void (0, brief_1.reportStatus)(api, agentId, 'working', undefined, sessionId);
|
|
322
|
+
}, 60_000);
|
|
323
|
+
try {
|
|
324
|
+
const result = await (0, doc_reply_1.runDocReply)(api, agentId, documentId, mention, {
|
|
325
|
+
harness,
|
|
326
|
+
selfMode,
|
|
327
|
+
echo: process.env.TS_CHAT_ECHO === '1',
|
|
328
|
+
llm: {
|
|
329
|
+
baseUrl: llmEndpoint(flags).baseUrl,
|
|
330
|
+
apiKey: process.env.LLM_API_KEY ?? '',
|
|
331
|
+
model: llmEndpoint(flags).model,
|
|
332
|
+
temperature: temperatureOf(flags),
|
|
333
|
+
maxTokens: maxTokensOf(flags),
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
log(`[done] replied to ${result.replied} mention${result.replied === 1 ? '' : 's'}` +
|
|
337
|
+
(result.skipped ? ` (${result.skipped} skipped)` : ''));
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
clearInterval(heartbeatTimer);
|
|
341
|
+
await (0, brief_1.reportStatus)(api, agentId, 'online', undefined, sessionId);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
log(`[error] ${(0, config_1.msg)(err)}`, 'stderr');
|
|
346
|
+
exitCode = 1;
|
|
347
|
+
}
|
|
348
|
+
finally {
|
|
349
|
+
(0, lock_1.releaseLock)(agentId);
|
|
350
|
+
await stream.end(exitCode);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/** Chat reply loop: reply to every message mentioning the agent. */
|
|
354
|
+
async function cmdChat(flags) {
|
|
355
|
+
const projectId = need(flags, 'project');
|
|
356
|
+
const agentId = need(flags, 'agent');
|
|
357
|
+
const apiKey = need(flags, 'key');
|
|
358
|
+
const mention = flags.get('mention') ?? '';
|
|
359
|
+
const selfMode = flags.get('self') === 'true';
|
|
360
|
+
const harness = harnessOf(flags);
|
|
361
|
+
let exitCode = 0;
|
|
362
|
+
const sessionId = flags.get('session') ?? (0, session_stream_1.newSessionId)();
|
|
363
|
+
const stream = new session_stream_1.SessionStream({ sessionId, agentId, projectId, mode: 'chat' });
|
|
364
|
+
stream.connect((process.env.TEAMSHARE_WS_URL ?? WS_DEFAULT).replace(/\/$/, '') + '/agents', apiKey);
|
|
365
|
+
const log = makeLog(stream);
|
|
366
|
+
const api = new api_1.TeamshareApi(process.env.TEAMSHARE_API_URL, apiKey);
|
|
367
|
+
const lock = await (0, lock_1.acquireLock)(agentId, 'chat', { projectId }, {
|
|
368
|
+
onWaiting: (busy) => console.log(`[lock] agent ${agentId} is busy (pid ${busy.pid}, since ${busy.startedAt}, ${busy.kind}) - waiting for it to finish...`),
|
|
369
|
+
});
|
|
370
|
+
if (!lock) {
|
|
371
|
+
console.error(`[lock] gave up waiting for agent ${agentId} - try again later`);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
await (0, brief_1.reportStatus)(api, agentId, 'working', undefined, sessionId);
|
|
376
|
+
log(`[teamshare-agent] chat reply loop (project ${projectId}${mention ? `, mention @${mention}` : 'all mentions'})`);
|
|
377
|
+
const heartbeatTimer = setInterval(() => {
|
|
378
|
+
void (0, brief_1.reportStatus)(api, agentId, 'working', undefined, sessionId);
|
|
379
|
+
}, 60_000);
|
|
380
|
+
try {
|
|
381
|
+
const endpoint = llmEndpoint(flags);
|
|
382
|
+
const result = await (0, chat_reply_1.runChatReply)(api, agentId, projectId, mention, {
|
|
383
|
+
harness,
|
|
384
|
+
selfMode,
|
|
385
|
+
echo: process.env.TS_CHAT_ECHO === '1',
|
|
386
|
+
llm: {
|
|
387
|
+
baseUrl: endpoint.baseUrl,
|
|
388
|
+
apiKey: process.env.LLM_API_KEY ?? '',
|
|
389
|
+
model: endpoint.model,
|
|
390
|
+
temperature: temperatureOf(flags),
|
|
391
|
+
maxTokens: maxTokensOf(flags),
|
|
392
|
+
},
|
|
393
|
+
// Phase C: stream generated replies into the channel as drafts.
|
|
394
|
+
stream: {
|
|
395
|
+
wsBase: (process.env.TEAMSHARE_WS_URL ?? WS_DEFAULT).replace(/\/$/, ''),
|
|
396
|
+
apiKey,
|
|
397
|
+
projectId,
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
log(`[done] replied to ${result.replied} mention${result.replied === 1 ? '' : 's'}` +
|
|
401
|
+
(result.skipped ? ` (${result.skipped} skipped)` : ''));
|
|
402
|
+
}
|
|
403
|
+
finally {
|
|
404
|
+
clearInterval(heartbeatTimer);
|
|
405
|
+
await (0, brief_1.reportStatus)(api, agentId, 'online', undefined, sessionId);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
log(`[error] ${(0, config_1.msg)(err)}`, 'stderr');
|
|
410
|
+
exitCode = 1;
|
|
411
|
+
}
|
|
412
|
+
finally {
|
|
413
|
+
(0, lock_1.releaseLock)(agentId);
|
|
414
|
+
await stream.end(exitCode);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/** Picks the agent's next task from the inbox; returns its id or null. */
|
|
418
|
+
async function pickNextTask(api, agentId, log) {
|
|
419
|
+
const inbox = await api.inbox(agentId);
|
|
420
|
+
const pick = inbox.tasks
|
|
421
|
+
.filter((task) => !DONE_STATUSES.has(String(task.status)))
|
|
422
|
+
.sort((a, b) => {
|
|
423
|
+
const pa = PRIORITY_RANK[String(a.priority)] ?? 9;
|
|
424
|
+
const pb = PRIORITY_RANK[String(b.priority)] ?? 9;
|
|
425
|
+
if (pa !== pb)
|
|
426
|
+
return pa - pb;
|
|
427
|
+
return String(a.createdAt).localeCompare(String(b.createdAt));
|
|
428
|
+
})[0];
|
|
429
|
+
if (!pick)
|
|
430
|
+
return null;
|
|
431
|
+
log(`[pickup] picked task ${String(pick.id)}: "${String(pick.title)}" (${String(pick.priority)}, ${String(pick.status)})`);
|
|
432
|
+
return String(pick.id);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Runs the harness (opencode / claude) with piped stdio so every line is
|
|
436
|
+
* teed to the live console. `model`/`temperature` map to opencode flags
|
|
437
|
+
* (claude gets ANTHROPIC_MODEL env only). Returns the child exit code.
|
|
438
|
+
*/
|
|
439
|
+
function spawnHarness(harness, prompt, log, settings = {}) {
|
|
440
|
+
if (harness === 'none') {
|
|
441
|
+
log('[harness] none - brief printed above; work it manually.');
|
|
442
|
+
return Promise.resolve(0);
|
|
443
|
+
}
|
|
444
|
+
let chosen = harness;
|
|
445
|
+
if (chosen === 'auto') {
|
|
446
|
+
if (hasBin('opencode'))
|
|
447
|
+
chosen = 'opencode';
|
|
448
|
+
else if (hasBin('claude'))
|
|
449
|
+
chosen = 'claude';
|
|
450
|
+
else {
|
|
451
|
+
log('[harness] neither opencode nor claude found - brief printed above.');
|
|
452
|
+
return Promise.resolve(0);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
log(`[harness] launching ${chosen}...`);
|
|
456
|
+
const cmd = chosen === 'opencode' ? 'opencode' : 'claude';
|
|
457
|
+
const args = chosen === 'opencode'
|
|
458
|
+
? [
|
|
459
|
+
'run',
|
|
460
|
+
...(settings.model ? ['--model', settings.model] : []),
|
|
461
|
+
...(settings.temperature !== undefined
|
|
462
|
+
? ['--temperature', String(settings.temperature)]
|
|
463
|
+
: []),
|
|
464
|
+
prompt,
|
|
465
|
+
]
|
|
466
|
+
: ['-p', prompt];
|
|
467
|
+
const env = chosen === 'claude' && settings.model
|
|
468
|
+
? { ...process.env, ANTHROPIC_MODEL: settings.model }
|
|
469
|
+
: undefined;
|
|
470
|
+
return new Promise((resolve) => {
|
|
471
|
+
const child = (0, node_child_process_1.spawn)(cmd, args, {
|
|
472
|
+
shell: process.platform === 'win32',
|
|
473
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
474
|
+
env,
|
|
475
|
+
});
|
|
476
|
+
const tee = (chunk, level) => {
|
|
477
|
+
for (const line of chunk.toString('utf8').split(/\r?\n/)) {
|
|
478
|
+
if (line.trim())
|
|
479
|
+
log(line, level);
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
child.stdout?.on('data', (c) => tee(c, 'stdout'));
|
|
483
|
+
child.stderr?.on('data', (c) => tee(c, 'stderr'));
|
|
484
|
+
child.on('error', (err) => {
|
|
485
|
+
log(`[harness] ${cmd} failed to start: ${(0, config_1.msg)(err)}`, 'stderr');
|
|
486
|
+
resolve(1);
|
|
487
|
+
});
|
|
488
|
+
child.on('close', (code) => {
|
|
489
|
+
if (code !== 0)
|
|
490
|
+
log(`[harness] ${cmd} exited with code ${code ?? 'error'}`, 'stderr');
|
|
491
|
+
resolve(code ?? 1);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
function hasBin(bin) {
|
|
496
|
+
const { spawnSync } = require('node:child_process');
|
|
497
|
+
const res = spawnSync(bin, ['--version'], { stdio: 'ignore', shell: process.platform === 'win32' });
|
|
498
|
+
return res.status === 0;
|
|
499
|
+
}
|
|
500
|
+
async function main() {
|
|
501
|
+
const { flags, positionals } = parseArgs(process.argv.slice(2));
|
|
502
|
+
if (flags.has('help') || positionals.length === 0) {
|
|
503
|
+
console.log(usage());
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const command = positionals[0];
|
|
507
|
+
try {
|
|
508
|
+
if (command === 'connect')
|
|
509
|
+
await cmdConnect(flags);
|
|
510
|
+
else if (command === 'run')
|
|
511
|
+
await cmdRun(flags);
|
|
512
|
+
else if (command === 'continue') {
|
|
513
|
+
// `continue --task <id>` resumes the previous --self session for it.
|
|
514
|
+
if (!flags.get('task')) {
|
|
515
|
+
console.error('continue requires --task <taskId>');
|
|
516
|
+
process.exitCode = 2;
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
flags.set('continue', 'true');
|
|
520
|
+
await cmdRun(flags);
|
|
521
|
+
}
|
|
522
|
+
else if (command === 'chat')
|
|
523
|
+
await cmdChat(flags);
|
|
524
|
+
else if (command === 'doc')
|
|
525
|
+
await cmdDoc(flags);
|
|
526
|
+
else {
|
|
527
|
+
console.error(`Unknown command: ${command}`);
|
|
528
|
+
console.log(usage());
|
|
529
|
+
process.exitCode = 2;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch (err) {
|
|
533
|
+
if (err instanceof Error && err.message.startsWith('missing --')) {
|
|
534
|
+
console.error(err.message);
|
|
535
|
+
process.exitCode = 2;
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
console.error(`[error] ${(0, config_1.msg)(err)}`);
|
|
539
|
+
process.exitCode = 1;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
void main();
|
|
543
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|