@excitedjs/dreamux 0.2.0 → 0.3.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 +155 -160
- package/bin/tm +30 -0
- package/dist/admin/client.js +98 -0
- package/dist/admin/client.js.map +1 -0
- package/dist/admin/methods.js +83 -38
- package/dist/admin/methods.js.map +1 -1
- package/dist/admin/socket.js +2 -2
- package/dist/admin/socket.js.map +1 -1
- package/dist/channel/feishu-gate.js +187 -18
- package/dist/channel/feishu-gate.js.map +1 -1
- package/dist/channel/feishu-message.js +92 -0
- package/dist/channel/feishu-message.js.map +1 -0
- package/dist/cli/doctor.js +53 -58
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/dreamux.js +33 -51
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server-ctl.js +6 -8
- package/dist/cli/server-ctl.js.map +1 -1
- package/dist/cli/server.js +22 -32
- package/dist/cli/server.js.map +1 -1
- package/dist/codex/events.js +3 -2
- package/dist/codex/events.js.map +1 -1
- package/dist/codex/mcp-config.js +24 -0
- package/dist/codex/mcp-config.js.map +1 -0
- package/dist/codex/supervisor.js +16 -0
- package/dist/codex/supervisor.js.map +1 -1
- package/dist/dispatcher/approval.js +2 -3
- package/dist/dispatcher/approval.js.map +1 -1
- package/dist/dispatcher/runtime.js +193 -141
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/dispatcher/turn-manager.js +78 -97
- package/dist/dispatcher/turn-manager.js.map +1 -1
- package/dist/feishu/bot.js +71 -9
- package/dist/feishu/bot.js.map +1 -1
- package/dist/mcp/feishu-mcp.js +269 -0
- package/dist/mcp/feishu-mcp.js.map +1 -0
- package/dist/onboard/config-files.js +52 -22
- package/dist/onboard/config-files.js.map +1 -1
- package/dist/onboard/dispatcher-skill.js +18 -0
- package/dist/onboard/dispatcher-skill.js.map +1 -0
- package/dist/onboard/run.js +17 -50
- package/dist/onboard/run.js.map +1 -1
- package/dist/onboard/service.js +4 -8
- package/dist/onboard/service.js.map +1 -1
- package/dist/onboard/uninstall.js +47 -13
- package/dist/onboard/uninstall.js.map +1 -1
- package/dist/onboard/wizard.js +3 -27
- package/dist/onboard/wizard.js.map +1 -1
- package/dist/runtime/config.js +158 -64
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/dispatcher-codex-home.js +14 -51
- package/dist/runtime/dispatcher-codex-home.js.map +1 -1
- package/dist/runtime/dispatcher-id.js +9 -0
- package/dist/runtime/dispatcher-id.js.map +1 -0
- package/dist/runtime/dispatcher-store.js +202 -0
- package/dist/runtime/dispatcher-store.js.map +1 -0
- package/dist/runtime/package-bin.js +41 -0
- package/dist/runtime/package-bin.js.map +1 -0
- package/dist/runtime/paths.js +82 -48
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/secrets.js +4 -3
- package/dist/runtime/secrets.js.map +1 -1
- package/dist/server.js +110 -36
- package/dist/server.js.map +1 -1
- package/package.json +6 -6
- package/skills/dispatcher/SKILL.md +107 -0
- package/db/migrations/0001_init.sql +0 -49
- package/dist/channel/outbound.js +0 -12
- package/dist/channel/outbound.js.map +0 -1
- package/dist/db/repository.js +0 -223
- package/dist/db/repository.js.map +0 -1
- package/dist/db/schema.js +0 -29
- package/dist/db/schema.js.map +0 -1
- package/dist/db/types.js +0 -2
- package/dist/db/types.js.map +0 -1
- package/dist/onboard/plugins.js +0 -202
- package/dist/onboard/plugins.js.map +0 -1
package/dist/server.js
CHANGED
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
* The dreamux Server — the long-running Node process that hosts N dispatchers.
|
|
3
3
|
*
|
|
4
4
|
* Lifecycle:
|
|
5
|
-
* 1.
|
|
5
|
+
* 1. load dispatcher declarations from config
|
|
6
6
|
* 2. open admin Unix socket (so server-ctl can talk to us even if a
|
|
7
7
|
* dispatcher fails to come up)
|
|
8
8
|
* 3. for each enabled dispatcher: spawn codex, open feishu, start turn worker
|
|
9
9
|
* 4. install SIGTERM/SIGINT handlers for graceful drain
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Feishu inbound is opened, so the user gets a visible prompt instead of a
|
|
14
|
-
* silent duplicate turn.
|
|
11
|
+
* Current MVP: accepted inbound work is process-local. Restarting the server
|
|
12
|
+
* drops queued and in-flight inbound messages instead of replaying them.
|
|
15
13
|
*/
|
|
16
|
-
import { openDatabase } from './db/schema.js';
|
|
17
|
-
import { DispatcherRepo, InboundRepo } from './db/repository.js';
|
|
18
14
|
import { DispatcherRuntime } from './dispatcher/runtime.js';
|
|
19
15
|
import { channelOutboundToFeishuTarget, createFeishuBot, } from './feishu/bot.js';
|
|
20
|
-
import {
|
|
16
|
+
import { dreamuxFeishuGate, loadDispatcherAccess, saveDispatcherAccess, } from './channel/feishu-gate.js';
|
|
17
|
+
import { formatFeishuMessageForCodex } from './channel/feishu-message.js';
|
|
21
18
|
import { parseCodexArgs, codexArgsToCli } from './runtime/codex-args.js';
|
|
19
|
+
import { feishuMcpCodexArgs } from './codex/mcp-config.js';
|
|
22
20
|
import { resolveBotSecret } from './runtime/secrets.js';
|
|
23
21
|
import { BUILT_IN_DEFAULTS } from './runtime/config.js';
|
|
24
|
-
import {
|
|
22
|
+
import { DispatcherStore, } from './runtime/dispatcher-store.js';
|
|
23
|
+
import { adminSocketPath, dispatcherCodexCwd, setRuntimeConfig, } from './runtime/paths.js';
|
|
25
24
|
import { createAdminSocketServer } from './admin/socket.js';
|
|
25
|
+
export const RECEIVED_REACTION_EMOJI = 'GLANCE';
|
|
26
|
+
const MAX_PENDING_RECEIVED_REACTION_CLEARS = 1024;
|
|
26
27
|
export class Server {
|
|
27
28
|
repos;
|
|
28
|
-
db;
|
|
29
29
|
slots = new Map();
|
|
30
30
|
/**
|
|
31
31
|
* PR #3 review #4: in-flight startDispatcher promises, keyed by id.
|
|
@@ -42,10 +42,8 @@ export class Server {
|
|
|
42
42
|
// happens. paths.runtimeRoot / adminSocketPath / etc. consult this
|
|
43
43
|
// snapshot for non-env defaults (env vars still win).
|
|
44
44
|
setRuntimeConfig(opts.config ?? BUILT_IN_DEFAULTS);
|
|
45
|
-
this.db = openDatabase({ path: opts.databasePath ?? databasePath() });
|
|
46
45
|
this.repos = {
|
|
47
|
-
dispatchers: new
|
|
48
|
-
inbound: new InboundRepo(this.db),
|
|
46
|
+
dispatchers: new DispatcherStore(opts.config ?? BUILT_IN_DEFAULTS),
|
|
49
47
|
};
|
|
50
48
|
}
|
|
51
49
|
/** Effective config (caller-supplied or built-in defaults). */
|
|
@@ -111,52 +109,70 @@ export class Server {
|
|
|
111
109
|
if (this.slots.has(id))
|
|
112
110
|
return;
|
|
113
111
|
const cfg = this.effectiveConfig();
|
|
112
|
+
const dispatcherConfig = cfg.dispatchers.find((dispatcher) => dispatcher.id === id);
|
|
114
113
|
const codexArgs = parseCodexArgs(row.codex_args_json, {
|
|
115
114
|
approvalPolicy: cfg.codex.approval_policy,
|
|
116
115
|
sandboxMode: cfg.codex.sandbox_mode,
|
|
117
116
|
extraArgs: cfg.codex.extra_args,
|
|
118
117
|
});
|
|
118
|
+
const codexCliArgs = [
|
|
119
|
+
...codexArgsToCli(codexArgs),
|
|
120
|
+
...feishuMcpCodexArgs({
|
|
121
|
+
dispatcherId: id,
|
|
122
|
+
adminSocketPath: this.opts.adminSocketPath ?? adminSocketPath(),
|
|
123
|
+
}),
|
|
124
|
+
];
|
|
119
125
|
const botSecret = this.opts.skipBotSecret
|
|
120
126
|
? ''
|
|
121
127
|
: resolveBotSecret(row.bot_secret_ref, cfg);
|
|
122
128
|
const bot = this.opts.botFactory
|
|
123
129
|
? this.opts.botFactory(row, botSecret)
|
|
124
130
|
: createFeishuBot({ appId: row.bot_app_id, appSecret: botSecret });
|
|
131
|
+
const channelState = {
|
|
132
|
+
receivedReactions: new Map(),
|
|
133
|
+
pendingReceivedReactionClears: new Set(),
|
|
134
|
+
};
|
|
125
135
|
const runtime = new DispatcherRuntime(row, {
|
|
126
136
|
dispatchers: this.repos.dispatchers,
|
|
127
|
-
inbound: this.repos.inbound,
|
|
128
|
-
outbound: {
|
|
129
|
-
send: async (target, text) => (await bot.send(channelOutboundToFeishuTarget(target), text)).messageIds,
|
|
130
|
-
},
|
|
131
137
|
codexBinPath: this.resolveCodexBinPath(),
|
|
132
138
|
codexProcessFactory: this.opts.codexProcessFactory,
|
|
133
139
|
codexClientFactory: this.opts.codexClientFactory,
|
|
134
140
|
codexHomeDoctor: this.opts.codexHomeDoctor,
|
|
135
|
-
resolveExtraArgs: () =>
|
|
141
|
+
resolveExtraArgs: () => codexCliArgs,
|
|
136
142
|
handshakeTimeoutMs: cfg.codex.initialize_timeout_ms,
|
|
137
|
-
|
|
138
|
-
|
|
143
|
+
extraEnv: dispatcherConfig?.codex.extra_env ?? {},
|
|
144
|
+
restartBackoffBaseMs: this.opts.codexRestartBackoffBaseMs,
|
|
145
|
+
restartBackoffMaxMs: this.opts.codexRestartBackoffMaxMs,
|
|
139
146
|
});
|
|
140
147
|
try {
|
|
141
148
|
await runtime.start();
|
|
142
149
|
await bot.start(async (event) => {
|
|
143
|
-
const
|
|
150
|
+
const access = loadDispatcherAccess(id);
|
|
151
|
+
const gate = dreamuxFeishuGate({
|
|
144
152
|
senderId: event.senderId,
|
|
145
153
|
senderType: event.senderType,
|
|
154
|
+
chatId: event.chatId,
|
|
146
155
|
chatType: event.chatType,
|
|
156
|
+
mentions: event.mentions,
|
|
147
157
|
botOpenId: bot.botOpenId,
|
|
148
|
-
});
|
|
158
|
+
}, access);
|
|
159
|
+
saveDispatcherAccess(id, gate.access);
|
|
160
|
+
if (gate.warning !== null) {
|
|
161
|
+
console.error(`[server] trust-domain warning for dispatcher '${id}': ${gate.warning}`);
|
|
162
|
+
}
|
|
149
163
|
if (gate.action === 'drop') {
|
|
150
164
|
console.error(`[server] dropped feishu inbound for dispatcher '${id}': ${gate.reason}`);
|
|
151
165
|
return;
|
|
152
166
|
}
|
|
153
|
-
runtime.enqueueInbound({
|
|
167
|
+
const queued = runtime.enqueueInbound({
|
|
154
168
|
source_chat_id: event.chatId,
|
|
155
169
|
source_message_id: event.messageId,
|
|
156
170
|
sender_id: event.senderId,
|
|
157
|
-
|
|
158
|
-
parsed_text: event.parsedText,
|
|
171
|
+
parsed_text: formatFeishuMessageForCodex(event),
|
|
159
172
|
});
|
|
173
|
+
if (queued) {
|
|
174
|
+
await addReceivedReaction(id, bot, channelState, event);
|
|
175
|
+
}
|
|
160
176
|
});
|
|
161
177
|
}
|
|
162
178
|
catch (err) {
|
|
@@ -176,7 +192,7 @@ export class Server {
|
|
|
176
192
|
}
|
|
177
193
|
throw err;
|
|
178
194
|
}
|
|
179
|
-
this.slots.set(id, { row, runtime, bot });
|
|
195
|
+
this.slots.set(id, { row, runtime, bot, channelState });
|
|
180
196
|
console.error(`[server] dispatcher '${id}' is ready (bot=${row.bot_app_id} cwd=${row.codex_cwd ?? dispatcherCodexCwd(id)})`);
|
|
181
197
|
}
|
|
182
198
|
/** Gracefully stop one dispatcher. Idempotent. */
|
|
@@ -201,7 +217,33 @@ export class Server {
|
|
|
201
217
|
getRuntime(id) {
|
|
202
218
|
return this.slots.get(id)?.runtime ?? null;
|
|
203
219
|
}
|
|
204
|
-
|
|
220
|
+
async replyFromMcp(input) {
|
|
221
|
+
const slot = this.mustRunningSlot(input.dispatcherId);
|
|
222
|
+
const result = await slot.bot.send(channelOutboundToFeishuTarget({
|
|
223
|
+
conversationId: input.chatId,
|
|
224
|
+
...(input.messageId !== undefined ? { replyTo: input.messageId } : {}),
|
|
225
|
+
...(input.mentionUserIds !== undefined
|
|
226
|
+
? { mentionUsers: input.mentionUserIds }
|
|
227
|
+
: {}),
|
|
228
|
+
}), input.text);
|
|
229
|
+
if (input.messageId !== undefined) {
|
|
230
|
+
await clearReceivedReaction(input.dispatcherId, slot.bot, slot.channelState, input.messageId);
|
|
231
|
+
}
|
|
232
|
+
return { message_ids: result.messageIds };
|
|
233
|
+
}
|
|
234
|
+
async reactFromMcp(input) {
|
|
235
|
+
const slot = this.mustRunningSlot(input.dispatcherId);
|
|
236
|
+
const reactionId = await slot.bot.addReaction(input.messageId, input.emoji);
|
|
237
|
+
return { reaction_id: reactionId };
|
|
238
|
+
}
|
|
239
|
+
mustRunningSlot(id) {
|
|
240
|
+
const slot = this.slots.get(id);
|
|
241
|
+
if (slot === undefined) {
|
|
242
|
+
throw new Error(`dispatcher '${id}' is not running`);
|
|
243
|
+
}
|
|
244
|
+
return slot;
|
|
245
|
+
}
|
|
246
|
+
/** Summary of every declared dispatcher (config-backed, includes stopped). */
|
|
205
247
|
summarize() {
|
|
206
248
|
return this.repos.dispatchers.list().map((row) => {
|
|
207
249
|
const runtime = this.slots.get(row.dispatcher_id)?.runtime;
|
|
@@ -214,7 +256,7 @@ export class Server {
|
|
|
214
256
|
};
|
|
215
257
|
});
|
|
216
258
|
}
|
|
217
|
-
/** Graceful shutdown — drain dispatchers
|
|
259
|
+
/** Graceful shutdown — drain dispatchers and close the admin socket. */
|
|
218
260
|
async shutdown() {
|
|
219
261
|
if (this.shuttingDown)
|
|
220
262
|
return;
|
|
@@ -227,20 +269,52 @@ export class Server {
|
|
|
227
269
|
await this.admin.close();
|
|
228
270
|
this.admin = null;
|
|
229
271
|
}
|
|
230
|
-
|
|
231
|
-
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function addReceivedReaction(dispatcherId, bot, channelState, event) {
|
|
275
|
+
try {
|
|
276
|
+
const reactionId = await bot.addReaction(event.messageId, RECEIVED_REACTION_EMOJI);
|
|
277
|
+
if (reactionId === '') {
|
|
278
|
+
console.error(`[server] Feishu returned no reaction_id for the received reaction in dispatcher '${dispatcherId}'`);
|
|
279
|
+
channelState.pendingReceivedReactionClears.delete(event.messageId);
|
|
280
|
+
return;
|
|
232
281
|
}
|
|
233
|
-
|
|
234
|
-
|
|
282
|
+
channelState.receivedReactions.set(event.messageId, {
|
|
283
|
+
chatId: event.chatId,
|
|
284
|
+
reactionId,
|
|
285
|
+
});
|
|
286
|
+
if (channelState.pendingReceivedReactionClears.has(event.messageId)) {
|
|
287
|
+
await clearReceivedReaction(dispatcherId, bot, channelState, event.messageId);
|
|
235
288
|
}
|
|
236
289
|
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
channelState.pendingReceivedReactionClears.delete(event.messageId);
|
|
292
|
+
console.error(`[server] failed to add the received reaction for dispatcher '${dispatcherId}':`, err);
|
|
293
|
+
}
|
|
237
294
|
}
|
|
238
|
-
function
|
|
295
|
+
async function clearReceivedReaction(dispatcherId, bot, channelState, messageId) {
|
|
296
|
+
const reaction = channelState.receivedReactions.get(messageId);
|
|
297
|
+
if (reaction === undefined) {
|
|
298
|
+
rememberPendingReceivedReactionClear(channelState, messageId);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
239
301
|
try {
|
|
240
|
-
|
|
302
|
+
await bot.removeReaction(messageId, reaction.reactionId);
|
|
303
|
+
channelState.receivedReactions.delete(messageId);
|
|
304
|
+
channelState.pendingReceivedReactionClears.delete(messageId);
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
console.error(`[server] failed to clear the received reaction for dispatcher '${dispatcherId}' message '${messageId}':`, err);
|
|
241
308
|
}
|
|
242
|
-
|
|
243
|
-
|
|
309
|
+
}
|
|
310
|
+
function rememberPendingReceivedReactionClear(channelState, messageId) {
|
|
311
|
+
channelState.pendingReceivedReactionClears.add(messageId);
|
|
312
|
+
while (channelState.pendingReceivedReactionClears.size >
|
|
313
|
+
MAX_PENDING_RECEIVED_REACTION_CLEARS) {
|
|
314
|
+
const oldest = channelState.pendingReceivedReactionClears.values().next().value;
|
|
315
|
+
if (typeof oldest !== 'string')
|
|
316
|
+
return;
|
|
317
|
+
channelState.pendingReceivedReactionClears.delete(oldest);
|
|
244
318
|
}
|
|
245
319
|
}
|
|
246
320
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@excitedjs/dreamux",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Codex-host server — single-session MVP. One node process hosts N dispatchers, each binding 1 Feishu bot + 1 Codex thread.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -14,27 +14,27 @@
|
|
|
14
14
|
"node": ">=22.7"
|
|
15
15
|
},
|
|
16
16
|
"bin": {
|
|
17
|
-
"dreamux": "./bin/dreamux"
|
|
17
|
+
"dreamux": "./bin/dreamux",
|
|
18
|
+
"tm": "./bin/tm"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"bin",
|
|
21
22
|
"dist",
|
|
22
|
-
"
|
|
23
|
+
"skills",
|
|
23
24
|
"README.md",
|
|
24
25
|
"LICENSE"
|
|
25
26
|
],
|
|
26
27
|
"dependencies": {
|
|
27
|
-
"
|
|
28
|
+
"@excitedjs/tm": "2.2.1",
|
|
28
29
|
"smol-toml": "^1.6.1",
|
|
29
30
|
"ws": "^8.18.0",
|
|
30
31
|
"yargs": "^17.7.2",
|
|
31
32
|
"@clack/prompts": "^1.5.0",
|
|
32
33
|
"execa": "^9.6.1",
|
|
33
34
|
"plist": "^5.0.0",
|
|
34
|
-
"@excitedjs/feishu-transport": "0.0
|
|
35
|
+
"@excitedjs/feishu-transport": "0.1.0"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
|
-
"@types/better-sqlite3": "^7.6.12",
|
|
38
38
|
"@types/node": "^22.10.0",
|
|
39
39
|
"@types/ws": "^8.5.13",
|
|
40
40
|
"@types/yargs": "^17.0.35",
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dispatcher
|
|
3
|
+
description: Use from a dreamux dispatcher thread when work should be delegated to a tm-managed Codex teammate in a specific repository. Applies to bounded engineering tasks, test runs, codebase inspections, or follow-up work where the dispatcher should spawn/send/wait through the tm CLI exposed by the dreamux package and report the result back to the source chat.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dispatcher
|
|
7
|
+
|
|
8
|
+
Use this skill only from the dispatcher agent. The dreamux server hosts the
|
|
9
|
+
dispatcher lifecycle; it does not own tm teammate daemons, teammate DB rows, or
|
|
10
|
+
`teammate.*` admin methods.
|
|
11
|
+
|
|
12
|
+
## Boundaries
|
|
13
|
+
|
|
14
|
+
- Use `tm` from the dispatcher environment PATH. dreamux injects its package
|
|
15
|
+
`bin/` directory into the dispatcher Codex app-server PATH.
|
|
16
|
+
- Pass `--engine codex` on every `tm spawn`; `tm spawn` defaults to Claude.
|
|
17
|
+
- Do not use `npx`, `npm exec --package @excitedjs/tm`, or
|
|
18
|
+
`@excitedjs/tm@latest`; the dreamux package owns the tm dependency version.
|
|
19
|
+
- Do not call dreamux admin APIs to create teammate state.
|
|
20
|
+
- Do not infer the tm repo path from the dispatcher cwd unless the user or
|
|
21
|
+
operator explicitly made that cwd the requested repo.
|
|
22
|
+
- Do not ask a tm-managed teammate to spawn another tm teammate.
|
|
23
|
+
|
|
24
|
+
## Before Delegating
|
|
25
|
+
|
|
26
|
+
Delegate when the request is bounded and can be completed by one teammate:
|
|
27
|
+
running tests, inspecting a code path, drafting a narrow patch, or collecting a
|
|
28
|
+
specific result. Handle the work directly when the request is tiny, ambiguous,
|
|
29
|
+
security-sensitive, or missing a repository path.
|
|
30
|
+
|
|
31
|
+
Resolve the repo path in this order:
|
|
32
|
+
|
|
33
|
+
1. An absolute path in the user request.
|
|
34
|
+
2. `TM_DISPATCHER_DIR`, if set by the operator.
|
|
35
|
+
3. Ask the user for the repo path. Do not guess.
|
|
36
|
+
|
|
37
|
+
Use an absolute repo path for `tm spawn`. If the user gives a relative path,
|
|
38
|
+
make it absolute only when its base is explicit.
|
|
39
|
+
|
|
40
|
+
## Command Shape
|
|
41
|
+
|
|
42
|
+
Preflight once per dispatcher session:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
tm --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## First-Turn Delegation
|
|
49
|
+
|
|
50
|
+
1. Pick a flat teammate name: lowercase letters, digits, and hyphens; keep it
|
|
51
|
+
short and tied to the task, such as `tests-api` or `scan-auth`.
|
|
52
|
+
2. Spawn with the repo path, intent, and the full task prompt:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
tm spawn /absolute/repo \
|
|
56
|
+
--name tests-api \
|
|
57
|
+
--engine codex \
|
|
58
|
+
--timeout 180 \
|
|
59
|
+
--intent "Run focused API tests and summarize failures" \
|
|
60
|
+
--prompt "Run the focused API tests. Report commands, failures, and the smallest next fix."
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. If `tm spawn` exits `0`, use its printed reply as the teammate result. If it
|
|
64
|
+
exits `124`, the Codex turn did not finish within the sync window; wait
|
|
65
|
+
without `--fresh`:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
tm wait tests-api --timeout 180
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
4. Reply to the source chat with the teammate result, including the command
|
|
72
|
+
summary and any explicit failure.
|
|
73
|
+
|
|
74
|
+
## Follow-Up Delegation
|
|
75
|
+
|
|
76
|
+
If a teammate name already exists for the same task, send a follow-up instead
|
|
77
|
+
of spawning a duplicate:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
tm send tests-api \
|
|
81
|
+
--prompt "Use the previous context. Re-run the focused test after the latest fix and summarize only changed results."
|
|
82
|
+
tm wait tests-api --timeout 180
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Failure Reporting
|
|
86
|
+
|
|
87
|
+
When a tm command fails, stop the delegation sequence and report:
|
|
88
|
+
|
|
89
|
+
- which `tm` verb failed
|
|
90
|
+
- the teammate name and repo path
|
|
91
|
+
- the exit status if available
|
|
92
|
+
- the first useful stderr/stdout lines
|
|
93
|
+
- whether retrying the same teammate is safe
|
|
94
|
+
|
|
95
|
+
Known early startup failure to report verbatim:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
codex daemon (pid N) exited before binding /tmp/teammate-codex/<name>/socket
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
That means the Codex app-server daemon did not become reachable. Do not retry
|
|
102
|
+
silently; report the environment failure and ask the operator to verify
|
|
103
|
+
`codex app-server --listen unix:///tmp/dispatcher-check.sock` in the dispatcher
|
|
104
|
+
environment.
|
|
105
|
+
|
|
106
|
+
Do not say the dreamux server lost or recovered teammate state. The server does
|
|
107
|
+
not own that state.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
-- dreamux MVP schema (issue excitedjs/dreamux#2)
|
|
2
|
-
-- Version tracked via PRAGMA user_version, not a schema_version table.
|
|
3
|
-
|
|
4
|
-
CREATE TABLE dispatchers (
|
|
5
|
-
dispatcher_id TEXT PRIMARY KEY,
|
|
6
|
-
bot_app_id TEXT NOT NULL UNIQUE,
|
|
7
|
-
bot_secret_ref TEXT NOT NULL,
|
|
8
|
-
codex_args_json TEXT NOT NULL DEFAULT '{}',
|
|
9
|
-
codex_cwd TEXT,
|
|
10
|
-
thread_id TEXT,
|
|
11
|
-
status TEXT NOT NULL DEFAULT 'declared'
|
|
12
|
-
CHECK (status IN ('declared','starting','ready','degraded','stopping','stopped')),
|
|
13
|
-
enabled INTEGER NOT NULL DEFAULT 1,
|
|
14
|
-
created_at INTEGER NOT NULL,
|
|
15
|
-
updated_at INTEGER NOT NULL,
|
|
16
|
-
last_started_at INTEGER,
|
|
17
|
-
last_ready_at INTEGER,
|
|
18
|
-
last_error TEXT,
|
|
19
|
-
last_lost_thread_id TEXT
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
CREATE TABLE inbound_buffer (
|
|
23
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
24
|
-
dispatcher_id TEXT NOT NULL REFERENCES dispatchers(dispatcher_id),
|
|
25
|
-
source_chat_id TEXT NOT NULL,
|
|
26
|
-
source_message_id TEXT,
|
|
27
|
-
sender_id TEXT,
|
|
28
|
-
feishu_event_json TEXT NOT NULL,
|
|
29
|
-
parsed_text TEXT NOT NULL,
|
|
30
|
-
state TEXT NOT NULL DEFAULT 'queued'
|
|
31
|
-
CHECK (state IN ('queued','running','awaiting_outbound',
|
|
32
|
-
'completed','outbound_failed','failed','unknown')),
|
|
33
|
-
codex_turn_id TEXT,
|
|
34
|
-
assistant_text TEXT,
|
|
35
|
-
feishu_message_ids_json TEXT,
|
|
36
|
-
outbound_error TEXT,
|
|
37
|
-
received_at INTEGER NOT NULL,
|
|
38
|
-
started_at INTEGER,
|
|
39
|
-
completed_at INTEGER,
|
|
40
|
-
failed_at INTEGER,
|
|
41
|
-
error TEXT
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
CREATE INDEX idx_inbound_dispatcher_state
|
|
45
|
-
ON inbound_buffer(dispatcher_id, state, id);
|
|
46
|
-
|
|
47
|
-
CREATE UNIQUE INDEX idx_inbound_message_dedupe
|
|
48
|
-
ON inbound_buffer(dispatcher_id, source_message_id)
|
|
49
|
-
WHERE source_message_id IS NOT NULL;
|
package/dist/channel/outbound.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export function outboundTargetForInbound(row) {
|
|
2
|
-
return {
|
|
3
|
-
conversationId: row.source_chat_id,
|
|
4
|
-
...(row.source_message_id !== null
|
|
5
|
-
? { replyTo: row.source_message_id }
|
|
6
|
-
: {}),
|
|
7
|
-
...(row.sender_id !== null && row.sender_id !== ''
|
|
8
|
-
? { mentionUsers: [row.sender_id] }
|
|
9
|
-
: {}),
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=outbound.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,wBAAwB,CAAC,GAAe;IACtD,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,GAAG,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI;YAChC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,iBAAiB,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,EAAE;YAChD,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
|