botmux 2.53.0 → 2.55.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/dist/adapters/backend/zellij-observe-backend.d.ts +15 -0
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +37 -0
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +3 -3
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +44 -28
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts +1 -1
- package/dist/adapters/cli/seed.js +2 -2
- package/dist/adapters/cli/seed.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +5 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +8 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +31 -5
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +282 -113
- package/dist/cli.js.map +1 -1
- package/dist/core/dispatch.d.ts +23 -0
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +17 -0
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/pending-response.d.ts +25 -0
- package/dist/core/pending-response.d.ts.map +1 -0
- package/dist/core/pending-response.js +82 -0
- package/dist/core/pending-response.js.map +1 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +5 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +16 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +27 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +134 -6
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/core/zellij-adopt-discovery.d.ts.map +1 -1
- package/dist/core/zellij-adopt-discovery.js +53 -32
- package/dist/core/zellij-adopt-discovery.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +63 -1
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +46 -3
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +86 -7
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/federated-group-core.js +8 -4
- package/dist/dashboard/federated-group-core.js.map +1 -1
- package/dist/dashboard/federation-api.d.ts.map +1 -1
- package/dist/dashboard/federation-api.js +22 -2
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +139 -20
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +36 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard-web/app.js +171 -143
- package/dist/dashboard-web/style.css +58 -0
- package/dist/dashboard.js +37 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +5 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +17 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +8 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +8 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +4 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +34 -1
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +72 -11
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +3 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +7 -2
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +8 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +36 -6
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/codex-paths.d.ts +7 -0
- package/dist/services/codex-paths.d.ts.map +1 -0
- package/dist/services/codex-paths.js +19 -0
- package/dist/services/codex-paths.js.map +1 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +5 -4
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/pending-response-transaction-store.d.ts +12 -0
- package/dist/services/pending-response-transaction-store.d.ts.map +1 -0
- package/dist/services/pending-response-transaction-store.js +52 -0
- package/dist/services/pending-response-transaction-store.js.map +1 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +15 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/voice/audio.d.ts +32 -0
- package/dist/services/voice/audio.d.ts.map +1 -0
- package/dist/services/voice/audio.js +114 -0
- package/dist/services/voice/audio.js.map +1 -0
- package/dist/services/voice/index.d.ts +32 -0
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/index.js +98 -0
- package/dist/services/voice/index.js.map +1 -0
- package/dist/services/voice/openai.d.ts +24 -0
- package/dist/services/voice/openai.d.ts.map +1 -0
- package/dist/services/voice/openai.js +47 -0
- package/dist/services/voice/openai.js.map +1 -0
- package/dist/services/voice/sami.d.ts +22 -0
- package/dist/services/voice/sami.d.ts.map +1 -0
- package/dist/services/voice/sami.js +128 -0
- package/dist/services/voice/sami.js.map +1 -0
- package/dist/services/voice/types.d.ts +32 -0
- package/dist/services/voice/types.d.ts.map +1 -0
- package/dist/services/voice/types.js +2 -0
- package/dist/services/voice/types.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +9 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +26 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/verify-permissions.js +3 -3
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +0 -1
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +147 -7
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +20 -20
- package/dist/workflows/events/schema.d.ts +188 -188
- package/package.json +1 -1
|
@@ -19,7 +19,7 @@ import { cliIdForComm, readComm, readCwd, getChildPids, readClaudeSessionMeta, }
|
|
|
19
19
|
import { findCodexRolloutByPid } from '../services/codex-transcript.js';
|
|
20
20
|
import { findCocoSessionByPid } from '../services/coco-transcript.js';
|
|
21
21
|
import { findServerPid } from '../adapters/backend/zellij-backend.js';
|
|
22
|
-
import { listLiveSessions,
|
|
22
|
+
import { listLiveSessions, parseListPanesJson, } from './zellij-session-discovery.js';
|
|
23
23
|
import { zellijEnv } from '../setup/ensure-zellij.js';
|
|
24
24
|
import { logger } from '../utils/logger.js';
|
|
25
25
|
import { execFileSync } from 'node:child_process';
|
|
@@ -122,6 +122,31 @@ function findAllClisUnder(rootPid, maxDepth, filterCliId) {
|
|
|
122
122
|
};
|
|
123
123
|
return found.filter(m => !found.some(n => n.pid !== m.pid && n.cliId === m.cliId && isAncestor(m.pid, n.pid)));
|
|
124
124
|
}
|
|
125
|
+
/** comm values that are never a pane process — transient scan/client tooling
|
|
126
|
+
* that `ps`-based discovery and `zellij action` calls spawn under the server. */
|
|
127
|
+
const TRANSIENT_COMMS = new Set(['zellij', 'ps', 'pgrep', 'sh-from-ps', '']);
|
|
128
|
+
/**
|
|
129
|
+
* Persistent pane-shell children of a zellij server, robust against the
|
|
130
|
+
* transient processes that briefly parent to the server during discovery.
|
|
131
|
+
*
|
|
132
|
+
* Two failure modes are filtered: (1) `getChildPids` snapshots the whole `ps`
|
|
133
|
+
* table, so any `ps`/`zellij`-client process alive at that instant with
|
|
134
|
+
* ppid==server leaks in (comm denylist removes these); (2) anything else
|
|
135
|
+
* transient — caught by taking TWO snapshots and intersecting, since a
|
|
136
|
+
* short-lived process is gone by the second read while real pane shells persist.
|
|
137
|
+
* Without this the children count flaps vs the terminal count → the count guard
|
|
138
|
+
* intermittently refuses → discovery returns nothing on the unlucky call → the
|
|
139
|
+
* card shows panes but the click's re-discovery finds none → "目标 CLI 会话已退出".
|
|
140
|
+
*/
|
|
141
|
+
function paneShellChildren(serverPid) {
|
|
142
|
+
const snap = () => new Set(getChildPids(serverPid).filter(pid => {
|
|
143
|
+
const c = readComm(pid) ?? '';
|
|
144
|
+
return c.length > 0 && !TRANSIENT_COMMS.has(c);
|
|
145
|
+
}));
|
|
146
|
+
const first = snap();
|
|
147
|
+
const second = snap();
|
|
148
|
+
return [...first].filter(pid => second.has(pid)).sort((a, b) => a - b);
|
|
149
|
+
}
|
|
125
150
|
/** Run a read-only `zellij --session S action …`, returning stdout or null. */
|
|
126
151
|
function zellijRead(session, args) {
|
|
127
152
|
try {
|
|
@@ -184,55 +209,51 @@ export function discoverAdoptableZellijSessions(filterCliId) {
|
|
|
184
209
|
for (const session of listLiveSessions()) {
|
|
185
210
|
if (session.startsWith('bmx-'))
|
|
186
211
|
continue;
|
|
187
|
-
const layoutOut = zellijRead(session, ['dump-layout']);
|
|
188
212
|
const panesOut = zellijRead(session, ['list-panes', '--json']);
|
|
189
|
-
if (!
|
|
213
|
+
if (!panesOut)
|
|
190
214
|
continue;
|
|
191
|
-
// Positional join: ALL leaf terminal panes (command + bare shell) in
|
|
192
|
-
// dump-layout document order vs non-plugin/non-floating terminals in
|
|
193
|
-
// list-panes sorted by id. Counts MUST match or the alignment is
|
|
194
|
-
// untrustworthy — refuse the whole session rather than bind the wrong pane.
|
|
195
|
-
const leaves = parseDumpLayoutLeafPanes(layoutOut);
|
|
196
215
|
const terminals = parseListPanesJson(panesOut)
|
|
197
216
|
.filter(p => !p.isPlugin && !p.isFloating)
|
|
198
217
|
.sort((a, b) => paneNum(a.paneId) - paneNum(b.paneId));
|
|
199
|
-
if (
|
|
200
|
-
if (leaves.length !== terminals.length) {
|
|
201
|
-
logger.debug(`[zellij-adopt] ${session}: leaf(${leaves.length})/terminal(${terminals.length}) count mismatch — refusing adopt`);
|
|
202
|
-
}
|
|
218
|
+
if (terminals.length === 0)
|
|
203
219
|
continue;
|
|
204
|
-
}
|
|
205
220
|
const serverPid = findServerPid(session);
|
|
206
221
|
if (!serverPid)
|
|
207
222
|
continue;
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
+
// Bind each pane to its OWN process subtree. The zellij server forks one
|
|
224
|
+
// shell per terminal pane, so its direct children sorted by pid (= process
|
|
225
|
+
// creation order) align positionally with the terminals sorted by id (=
|
|
226
|
+
// pane creation order) — both strictly monotonic. This gives each pane its
|
|
227
|
+
// specific CLI pid WITHOUT a cwd match, which is essential when several
|
|
228
|
+
// panes/tabs run the SAME cli from the SAME dir (e.g. multiple `codex` in
|
|
229
|
+
// ~): a cwd match is then ambiguous and silently drops them all (the bug
|
|
230
|
+
// 申晗 hit). Counts must match or the alignment is unreliable → refuse.
|
|
231
|
+
// paneShellChildren filters the transient ps/zellij-client processes that
|
|
232
|
+
// briefly parent to the server during discovery (see its doc) — only
|
|
233
|
+
// persistent pane shells/commands remain, so the count guard is stable.
|
|
234
|
+
const children = paneShellChildren(serverPid);
|
|
235
|
+
if (children.length !== terminals.length) {
|
|
236
|
+
logger.debug(`[zellij-adopt] ${session}: pane processes(${children.length}) != terminals(${terminals.length}) — can't align, refusing`);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
for (let i = 0; i < terminals.length; i++) {
|
|
240
|
+
// findAllClisUnder collapses the node-wrapper chain to the native CLI;
|
|
241
|
+
// a bare shell pane yields none and is skipped.
|
|
242
|
+
const clis = findAllClisUnder(children[i], 4, filterCliId);
|
|
243
|
+
if (clis.length === 0)
|
|
223
244
|
continue;
|
|
224
|
-
const cli =
|
|
225
|
-
const dims = paneDimensions(session,
|
|
245
|
+
const cli = clis[0];
|
|
246
|
+
const dims = paneDimensions(session, terminals[i].paneId);
|
|
226
247
|
if (!dims)
|
|
227
248
|
continue;
|
|
228
249
|
const { sessionId, startedAt } = resolveSessionId(cli.cliId, cli.pid);
|
|
229
250
|
results.push({
|
|
230
251
|
zellijSession: session,
|
|
231
|
-
zellijPaneId:
|
|
252
|
+
zellijPaneId: terminals[i].paneId,
|
|
232
253
|
cliPid: cli.pid,
|
|
233
254
|
cliId: cli.cliId,
|
|
234
255
|
sessionId,
|
|
235
|
-
cwd: cli.cwd ??
|
|
256
|
+
cwd: cli.cwd ?? '',
|
|
236
257
|
startedAt,
|
|
237
258
|
paneCols: dims.cols,
|
|
238
259
|
paneRows: dims.rows,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zellij-adopt-discovery.js","sourceRoot":"","sources":["../../src/core/zellij-adopt-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EACL,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,qBAAqB,GACrE,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EACL,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"zellij-adopt-discovery.js","sourceRoot":"","sources":["../../src/core/zellij-adopt-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA0BA,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA0BA,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwErD,OAAO,EAAE,oBAAoB,EAA6B,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,sBAAsB,EAAiB,MAAM,wBAAwB,CAAC;AAiTpF,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CA4ClB;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAGpB;AAyJD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,CA0C5G;AA4pED,wBAAsB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6TlE"}
|
package/dist/daemon.js
CHANGED
|
@@ -27,7 +27,9 @@ import { buildTerminalUrl, setTerminalProxyPort } from './core/terminal-url.js';
|
|
|
27
27
|
import { startTerminalProxy } from './core/terminal-proxy.js';
|
|
28
28
|
import * as scheduler from './core/scheduler.js';
|
|
29
29
|
import { scanMultipleProjects } from './services/project-scanner.js';
|
|
30
|
-
import { buildQuotaExhaustedCard, buildRepoSelectCard, buildStreamingCard, getCliDisplayName } from './im/lark/card-builder.js';
|
|
30
|
+
import { buildPendingResponseCard, buildQuotaExhaustedCard, buildRepoSelectCard, buildStreamingCard, getCliDisplayName } from './im/lark/card-builder.js';
|
|
31
|
+
import { createPendingResponseQueue, markPendingResponseCardPatched, shouldTreatPendingCardAsPatchedByMarker, startPendingResponseTurn, syncPendingResponseState } from './core/pending-response.js';
|
|
32
|
+
import { readPendingResponsePatchMarker } from './services/pending-response-transaction-store.js';
|
|
31
33
|
import { t as tr, botLocale, localeForBot } from './i18n/index.js';
|
|
32
34
|
import { createCliAdapterSync } from './adapters/cli/registry.js';
|
|
33
35
|
import { initWorkerPool, setActiveSessionsRegistry, forkWorker, killWorker, scheduleCardPatch, setCurrentCliVersion, CARD_POSTING_SENTINEL, parkStreamCard, closeSession as closeSessionHelper, ensureCliEnv, writableTerminalLinkFor, } from './core/worker-pool.js';
|
|
@@ -180,6 +182,56 @@ function startMemoryDiagnostics() {
|
|
|
180
182
|
* Lark message ids start with `om_` and chat ids with `oc_`, so the two
|
|
181
183
|
* address spaces never collide; the lookup just tries both.
|
|
182
184
|
*/
|
|
185
|
+
const pendingResponseQueue = createPendingResponseQueue();
|
|
186
|
+
function streamingCardDisabledFor(ds) {
|
|
187
|
+
if (ds.streamingCardForced)
|
|
188
|
+
return false;
|
|
189
|
+
try {
|
|
190
|
+
return getBot(ds.larkAppId).config.disableStreamingCard === true;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function readSessionFreshFromDisk(sessionId, larkAppId) {
|
|
197
|
+
const paths = [
|
|
198
|
+
join(config.session.dataDir, `sessions-${larkAppId}.json`),
|
|
199
|
+
join(config.session.dataDir, 'sessions.json'),
|
|
200
|
+
];
|
|
201
|
+
for (const fp of paths) {
|
|
202
|
+
if (!existsSync(fp))
|
|
203
|
+
continue;
|
|
204
|
+
try {
|
|
205
|
+
const data = JSON.parse(readFileSync(fp, 'utf-8'));
|
|
206
|
+
if (data[sessionId])
|
|
207
|
+
return data[sessionId];
|
|
208
|
+
}
|
|
209
|
+
catch { /* ignore corrupt/racing session file */ }
|
|
210
|
+
}
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
async function postPendingResponseCard(ds, replyToMessageId, prompt, sender) {
|
|
214
|
+
if (!streamingCardDisabledFor(ds))
|
|
215
|
+
return;
|
|
216
|
+
await pendingResponseQueue.run(ds.session.sessionId, async () => {
|
|
217
|
+
syncPendingResponseState(ds, readSessionFreshFromDisk(ds.session.sessionId, ds.larkAppId));
|
|
218
|
+
const marker = readPendingResponsePatchMarker(ds.session.sessionId);
|
|
219
|
+
if (shouldTreatPendingCardAsPatchedByMarker(ds.pendingResponseCardId, marker)) {
|
|
220
|
+
markPendingResponseCardPatched(ds);
|
|
221
|
+
}
|
|
222
|
+
syncPendingResponseState(ds.session, ds);
|
|
223
|
+
const card = buildPendingResponseCard(localeForBot(ds.larkAppId));
|
|
224
|
+
try {
|
|
225
|
+
const messageId = await replyMessage(ds.larkAppId, replyToMessageId, card, 'interactive', false);
|
|
226
|
+
startPendingResponseTurn(ds, messageId);
|
|
227
|
+
startPendingResponseTurn(ds.session, messageId);
|
|
228
|
+
sessionStore.updateSession(ds.session);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
logger.warn(`[${tag(ds)}] failed to post pending response card: ${err instanceof Error ? err.message : String(err)}`);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
183
235
|
async function sessionReply(anchor, content, msgType = 'text', larkAppId) {
|
|
184
236
|
let ds;
|
|
185
237
|
if (larkAppId) {
|
|
@@ -1673,6 +1725,7 @@ async function handleNewTopic(data, ctx) {
|
|
|
1673
1725
|
const selfBot = getBot(larkAppId);
|
|
1674
1726
|
const prompt = buildNewTopicPrompt(promptContent, session.sessionId, botCfg.cliId, botCfg.cliPathOverride, attachments, parsed.mentions, await getAvailableBots(larkAppId, chatId), undefined, { name: selfBot.botName, openId: selfBot.botOpenId }, localeForBot(larkAppId), newTopicSender, { larkAppId, chatId });
|
|
1675
1727
|
rememberLastCliInput(ds, promptContent, prompt);
|
|
1728
|
+
await postPendingResponseCard(ds, messageId, content, newTopicSender);
|
|
1676
1729
|
forkWorker(ds, prompt);
|
|
1677
1730
|
const reason = oncallEntry
|
|
1678
1731
|
? `oncall-bound chat ${chatId}`
|
|
@@ -1703,6 +1756,7 @@ async function handleNewTopic(data, ctx) {
|
|
|
1703
1756
|
const selfBot = getBot(larkAppId);
|
|
1704
1757
|
const prompt = buildNewTopicPrompt(promptContent, session.sessionId, botCfg.cliId, botCfg.cliPathOverride, attachments, parsed.mentions, await getAvailableBots(larkAppId, chatId), undefined, { name: selfBot.botName, openId: selfBot.botOpenId }, localeForBot(larkAppId), newTopicSender, { larkAppId, chatId });
|
|
1705
1758
|
rememberLastCliInput(ds, promptContent, prompt);
|
|
1759
|
+
await postPendingResponseCard(ds, messageId, content, newTopicSender);
|
|
1706
1760
|
forkWorker(ds, prompt);
|
|
1707
1761
|
logger.info(`Session ${session.sessionId} ready (no projects to select), total active: ${getActiveCount()}`);
|
|
1708
1762
|
}
|
|
@@ -1863,6 +1917,7 @@ async function handleBotAdded(chatId, operatorOpenId, larkAppId) {
|
|
|
1863
1917
|
return;
|
|
1864
1918
|
const prompt = await buildPrompt();
|
|
1865
1919
|
rememberLastCliInput(ds, promptBody, prompt);
|
|
1920
|
+
await postPendingResponseCard(ds, anchor, promptBody);
|
|
1866
1921
|
forkWorker(ds, prompt);
|
|
1867
1922
|
logger.info(`[auto-start:入群] ${chatId.substring(0, 12)} 自动开工(${mode}/${scope}),workingDir=${pinnedWorkingDir}`);
|
|
1868
1923
|
return;
|
|
@@ -1882,6 +1937,7 @@ async function handleBotAdded(chatId, operatorOpenId, larkAppId) {
|
|
|
1882
1937
|
ds.pendingRepo = false;
|
|
1883
1938
|
const prompt = await buildPrompt();
|
|
1884
1939
|
rememberLastCliInput(ds, promptBody, prompt);
|
|
1940
|
+
await postPendingResponseCard(ds, anchor, promptBody);
|
|
1885
1941
|
forkWorker(ds, prompt);
|
|
1886
1942
|
logger.info(`[auto-start:入群] ${chatId.substring(0, 12)} 无默认目录且无可选项目,直接开工`);
|
|
1887
1943
|
}
|
|
@@ -2133,6 +2189,8 @@ async function handleThreadReply(data, ctx) {
|
|
|
2133
2189
|
// reply cards to whoever triggered this turn — matters in oncall groups
|
|
2134
2190
|
// where the caller is often not the session owner).
|
|
2135
2191
|
if (ds) {
|
|
2192
|
+
syncPendingResponseState(ds, readSessionFreshFromDisk(ds.session.sessionId, ds.larkAppId));
|
|
2193
|
+
syncPendingResponseState(ds.session, ds);
|
|
2136
2194
|
markSessionActivity(ds);
|
|
2137
2195
|
const callerOpenId = parsed.senderId || data?.sender?.sender_id?.open_id;
|
|
2138
2196
|
// quoteTargetId changes every inbound message (always a new message_id), so
|
|
@@ -2285,6 +2343,7 @@ async function handleThreadReply(data, ctx) {
|
|
|
2285
2343
|
const selfBot = getBot(larkAppId);
|
|
2286
2344
|
const prompt = buildNewTopicPrompt(promptContent, session.sessionId, botCfg.cliId, botCfg.cliPathOverride, attachments, parsed.mentions, await getAvailableBots(larkAppId, autoCreateChatId), undefined, { name: selfBot.botName, openId: selfBot.botOpenId }, localeForBot(larkAppId), autoCreateSender, { larkAppId, chatId: autoCreateChatId });
|
|
2287
2345
|
rememberLastCliInput(newDs, promptContent, prompt);
|
|
2346
|
+
await postPendingResponseCard(newDs, parsed.messageId, parsed.content, autoCreateSender);
|
|
2288
2347
|
forkWorker(newDs, prompt);
|
|
2289
2348
|
const reason = oncallEntry
|
|
2290
2349
|
? `oncall-bound chat ${autoCreateChatId}`
|
|
@@ -2315,6 +2374,7 @@ async function handleThreadReply(data, ctx) {
|
|
|
2315
2374
|
const selfBot = getBot(larkAppId);
|
|
2316
2375
|
const prompt = buildNewTopicPrompt(promptContent, session.sessionId, botCfg.cliId, botCfg.cliPathOverride, attachments, parsed.mentions, await getAvailableBots(larkAppId, autoCreateChatId), undefined, { name: selfBot.botName, openId: selfBot.botOpenId }, localeForBot(larkAppId), autoCreateSender, { larkAppId, chatId: autoCreateChatId });
|
|
2317
2376
|
rememberLastCliInput(newDs, promptContent, prompt);
|
|
2377
|
+
await postPendingResponseCard(newDs, parsed.messageId, parsed.content, autoCreateSender);
|
|
2318
2378
|
forkWorker(newDs, prompt);
|
|
2319
2379
|
}
|
|
2320
2380
|
return;
|
|
@@ -2350,6 +2410,7 @@ async function handleThreadReply(data, ctx) {
|
|
|
2350
2410
|
});
|
|
2351
2411
|
beginNewTurn(ds, parsed.content);
|
|
2352
2412
|
rememberLastCliInput(ds, promptContent, msgContent);
|
|
2413
|
+
await postPendingResponseCard(ds, parsed.messageId, parsed.content, await getThreadSender());
|
|
2353
2414
|
ds.worker.send({ type: 'message', content: msgContent });
|
|
2354
2415
|
}
|
|
2355
2416
|
else {
|
|
@@ -2398,6 +2459,7 @@ async function handleThreadReply(data, ctx) {
|
|
|
2398
2459
|
sender: await getThreadSender(),
|
|
2399
2460
|
});
|
|
2400
2461
|
rememberLastCliInput(ds, promptContent, wrappedPrompt);
|
|
2462
|
+
await postPendingResponseCard(ds, parsed.messageId, parsed.content, await getThreadSender());
|
|
2401
2463
|
forkWorker(ds, wrappedPrompt, ds.hasHistory);
|
|
2402
2464
|
}
|
|
2403
2465
|
}
|