botmux 3.4.0 → 3.4.1
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/cli/create-group-resolver.d.ts +19 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -1
- package/dist/cli/create-group-resolver.js +30 -0
- package/dist/cli/create-group-resolver.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -1
- package/dist/cli.js.map +1 -1
- package/dist/services/group-creator.d.ts +8 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +42 -0
- package/dist/services/group-creator.js.map +1 -1
- package/dist/utils/input-gate.d.ts +41 -0
- package/dist/utils/input-gate.d.ts.map +1 -1
- package/dist/utils/input-gate.js +41 -0
- package/dist/utils/input-gate.js.map +1 -1
- package/dist/worker.js +39 -3
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,6 +22,12 @@ export interface CreateGroupOpts {
|
|
|
22
22
|
* local entry directly; peer bots are prompted by a multi-mention
|
|
23
23
|
* `/role profile apply` command in the newly created chat. */
|
|
24
24
|
roleProfileId?: string;
|
|
25
|
+
/** Optional kickoff: after the chat is created, the creator @-mentions this
|
|
26
|
+
* bot and posts `kickoffPrompt` as a top-level message. Used to
|
|
27
|
+
* auto-trigger a bot (e.g. a reviewer) in the new group without a human
|
|
28
|
+
* having to @ it. The kickoff bot must be present in `larkAppIds`. */
|
|
29
|
+
kickoffBotLarkAppId?: string;
|
|
30
|
+
kickoffPrompt?: string;
|
|
25
31
|
}
|
|
26
32
|
export interface CreateGroupResult {
|
|
27
33
|
ok: true;
|
|
@@ -47,6 +53,8 @@ export interface CreateGroupResult {
|
|
|
47
53
|
}[];
|
|
48
54
|
roleProfileBootstrapMessageId: string | null;
|
|
49
55
|
roleProfileBootstrapError: string | null;
|
|
56
|
+
kickoffMessageId: string | null;
|
|
57
|
+
kickoffError: string | null;
|
|
50
58
|
}
|
|
51
59
|
export interface TransferGroupOwnerOpts {
|
|
52
60
|
creatorLarkAppId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;yEAEqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;yEACqE;IACrE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;mEAE+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8EAC0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxF,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"group-creator.d.ts","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;yEAEqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;yEACqE;IACrE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;2DAEuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;mEAE+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;2EAGuE;IACvE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8EAC0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxF,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgBxG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqO3F"}
|
|
@@ -216,6 +216,46 @@ export async function createGroupWithBots(opts) {
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
|
+
// Kickoff: creator @-mentions a target bot with a prompt so it auto-starts
|
|
220
|
+
// working (e.g. a PR review). Resolve the @ handle from the creator's view of
|
|
221
|
+
// the new chat: Lark open_id values are app-scoped, so the target bot's
|
|
222
|
+
// self-reported open_id cannot be used directly by the creator app.
|
|
223
|
+
let kickoffMessageId = null;
|
|
224
|
+
let kickoffError = null;
|
|
225
|
+
const kickoffBot = opts.kickoffBotLarkAppId?.trim();
|
|
226
|
+
const kickoffPrompt = opts.kickoffPrompt?.trim();
|
|
227
|
+
if (!!kickoffBot !== !!kickoffPrompt) {
|
|
228
|
+
kickoffError = 'kickoff_args_must_be_paired';
|
|
229
|
+
}
|
|
230
|
+
else if (kickoffBot && kickoffPrompt) {
|
|
231
|
+
if (kickoffBot === opts.creatorLarkAppId) {
|
|
232
|
+
kickoffError = 'creator_cannot_kickoff_self';
|
|
233
|
+
}
|
|
234
|
+
else if (!opts.larkAppIds.includes(kickoffBot)) {
|
|
235
|
+
kickoffError = 'kickoff_bot_not_selected';
|
|
236
|
+
}
|
|
237
|
+
else if (r.invalidBotIds.includes(kickoffBot)) {
|
|
238
|
+
kickoffError = 'invitee_rejected';
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
if (!kickoffError) {
|
|
242
|
+
const members = await listChatBotMembers(opts.creatorLarkAppId, r.chatId);
|
|
243
|
+
const target = members.find(member => member.larkAppId === kickoffBot);
|
|
244
|
+
if (!target) {
|
|
245
|
+
kickoffError = 'kickoff_bot_not_found_in_chat';
|
|
246
|
+
}
|
|
247
|
+
else if (!target.mentionable) {
|
|
248
|
+
kickoffError = 'kickoff_bot_not_mentionable';
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
kickoffMessageId = await sendMessage(opts.creatorLarkAppId, r.chatId, `<at user_id="${target.openId}"></at> ${kickoffPrompt}`, 'text');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
kickoffError = e?.message ?? String(e);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
219
259
|
return {
|
|
220
260
|
ok: true,
|
|
221
261
|
chatId: r.chatId,
|
|
@@ -232,6 +272,8 @@ export async function createGroupWithBots(opts) {
|
|
|
232
272
|
oncallBindings,
|
|
233
273
|
roleProfileBootstrapMessageId,
|
|
234
274
|
roleProfileBootstrapError,
|
|
275
|
+
kickoffMessageId,
|
|
276
|
+
kickoffError,
|
|
235
277
|
};
|
|
236
278
|
}
|
|
237
279
|
//# sourceMappingURL=group-creator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzI,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"group-creator.js","sourceRoot":"","sources":["../../src/services/group-creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,4 +38,45 @@ export declare function shouldReleaseFirstPromptTimeout(state: {
|
|
|
38
38
|
/** Absolute hard cap for keeping the first prompt queued. */
|
|
39
39
|
hardTimeoutMs: number;
|
|
40
40
|
}): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* After the ready-gate releases (real SessionStart signal OR the timeout
|
|
43
|
+
* fallback), the worker settles for PTY quiescence and then decides whether to
|
|
44
|
+
* mark the prompt ready (which flushes for ALL adapters) vs. just calling
|
|
45
|
+
* flushPending() (which only flushes for type-ahead adapters). Marking ready is
|
|
46
|
+
* correct when ANY of these hold:
|
|
47
|
+
* - promptReadyAfterSettle — the real SessionStart/BOTMUX_READY_COMMAND
|
|
48
|
+
* signal fired (authoritative: input box exists).
|
|
49
|
+
* - promptReadyDetectedDuringSettle — the idle detector fired during the
|
|
50
|
+
* settle (a readyPattern/idle proved readiness).
|
|
51
|
+
* - readyPatternSeenDuringHold — a readyPattern fired WHILE the gate was
|
|
52
|
+
* holding (markPromptReady was blocked by
|
|
53
|
+
* readyGate.shouldHold()). The input box
|
|
54
|
+
* exists; the gate only deferred delivery.
|
|
55
|
+
*
|
|
56
|
+
* Pins the Hermes regression: a non-type-ahead adapter that renders its prompt
|
|
57
|
+
* (❯) during the hold but never fires the SessionStart signal must be marked
|
|
58
|
+
* ready at settle — otherwise settle calls flushPending(), which bails on
|
|
59
|
+
* !isPromptReady && !typeAheadAllowed and leaves the first message queued until
|
|
60
|
+
* the hard timeout (and, before the hard-timeout fix, forever).
|
|
61
|
+
*/
|
|
62
|
+
export declare function decideSettleMarkReady(state: {
|
|
63
|
+
promptReadyAfterSettle: boolean;
|
|
64
|
+
promptReadyDetectedDuringSettle: boolean;
|
|
65
|
+
readyPatternSeenDuringHold: boolean;
|
|
66
|
+
}): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* At the first-prompt hard timeout the worker has waited the full cap. For
|
|
69
|
+
* type-ahead adapters flushPending() drains the queue even while !isPromptReady
|
|
70
|
+
* (the TUI parks input in its own queue). For non-type-ahead adapters
|
|
71
|
+
* flushPending() bails on !isPromptReady && !typeAheadAllowed, so the worker
|
|
72
|
+
* must mark the prompt ready first (markPromptReady() then flushes).
|
|
73
|
+
* Returns the action the worker must take:
|
|
74
|
+
* - 'flush' — call flushPending() (type-ahead adapters).
|
|
75
|
+
* - 'mark-ready' — call markPromptReady() (non-type-ahead adapters).
|
|
76
|
+
*
|
|
77
|
+
* Pins the regression where non-type-ahead adapters only logged "forcing
|
|
78
|
+
* queued message flush" at the hard timeout without actually delivering the
|
|
79
|
+
* held first message.
|
|
80
|
+
*/
|
|
81
|
+
export declare function decideHardTimeoutAction(supportsTypeAhead: boolean): 'flush' | 'mark-ready';
|
|
41
82
|
//# sourceMappingURL=input-gate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAIV;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,sEAAsE;IACtE,iCAAiC,EAAE,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAIV"}
|
|
1
|
+
{"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAIV;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,sEAAsE;IACtE,iCAAiC,EAAE,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAIV;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,sBAAsB,EAAE,OAAO,CAAC;IAChC,+BAA+B,EAAE,OAAO,CAAC;IACzC,0BAA0B,EAAE,OAAO,CAAC;CACrC,GAAG,OAAO,CAEV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,CAE1F"}
|
package/dist/utils/input-gate.js
CHANGED
|
@@ -31,4 +31,45 @@ export function shouldReleaseFirstPromptTimeout(state) {
|
|
|
31
31
|
return true;
|
|
32
32
|
return state.elapsedMs >= state.hardTimeoutMs;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* After the ready-gate releases (real SessionStart signal OR the timeout
|
|
36
|
+
* fallback), the worker settles for PTY quiescence and then decides whether to
|
|
37
|
+
* mark the prompt ready (which flushes for ALL adapters) vs. just calling
|
|
38
|
+
* flushPending() (which only flushes for type-ahead adapters). Marking ready is
|
|
39
|
+
* correct when ANY of these hold:
|
|
40
|
+
* - promptReadyAfterSettle — the real SessionStart/BOTMUX_READY_COMMAND
|
|
41
|
+
* signal fired (authoritative: input box exists).
|
|
42
|
+
* - promptReadyDetectedDuringSettle — the idle detector fired during the
|
|
43
|
+
* settle (a readyPattern/idle proved readiness).
|
|
44
|
+
* - readyPatternSeenDuringHold — a readyPattern fired WHILE the gate was
|
|
45
|
+
* holding (markPromptReady was blocked by
|
|
46
|
+
* readyGate.shouldHold()). The input box
|
|
47
|
+
* exists; the gate only deferred delivery.
|
|
48
|
+
*
|
|
49
|
+
* Pins the Hermes regression: a non-type-ahead adapter that renders its prompt
|
|
50
|
+
* (❯) during the hold but never fires the SessionStart signal must be marked
|
|
51
|
+
* ready at settle — otherwise settle calls flushPending(), which bails on
|
|
52
|
+
* !isPromptReady && !typeAheadAllowed and leaves the first message queued until
|
|
53
|
+
* the hard timeout (and, before the hard-timeout fix, forever).
|
|
54
|
+
*/
|
|
55
|
+
export function decideSettleMarkReady(state) {
|
|
56
|
+
return state.promptReadyAfterSettle || state.promptReadyDetectedDuringSettle || state.readyPatternSeenDuringHold;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* At the first-prompt hard timeout the worker has waited the full cap. For
|
|
60
|
+
* type-ahead adapters flushPending() drains the queue even while !isPromptReady
|
|
61
|
+
* (the TUI parks input in its own queue). For non-type-ahead adapters
|
|
62
|
+
* flushPending() bails on !isPromptReady && !typeAheadAllowed, so the worker
|
|
63
|
+
* must mark the prompt ready first (markPromptReady() then flushes).
|
|
64
|
+
* Returns the action the worker must take:
|
|
65
|
+
* - 'flush' — call flushPending() (type-ahead adapters).
|
|
66
|
+
* - 'mark-ready' — call markPromptReady() (non-type-ahead adapters).
|
|
67
|
+
*
|
|
68
|
+
* Pins the regression where non-type-ahead adapters only logged "forcing
|
|
69
|
+
* queued message flush" at the hard timeout without actually delivering the
|
|
70
|
+
* held first message.
|
|
71
|
+
*/
|
|
72
|
+
export function decideHardTimeoutAction(supportsTypeAhead) {
|
|
73
|
+
return supportsTypeAhead ? 'flush' : 'mark-ready';
|
|
74
|
+
}
|
|
34
75
|
//# sourceMappingURL=input-gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,KAS9B;IACC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACzD,kEAAkE;IAClE,OAAO,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAS/C;IACC,IAAI,CAAC,KAAK,CAAC,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAChD,CAAC"}
|
|
1
|
+
{"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../src/utils/input-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,KAS9B;IACC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACzD,kEAAkE;IAClE,OAAO,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAS/C;IACC,IAAI,CAAC,KAAK,CAAC,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,OAAO,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,CAAC,0BAA0B,CAAC;AACnH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,iBAA0B;IAChE,OAAO,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;AACpD,CAAC"}
|
package/dist/worker.js
CHANGED
|
@@ -24,7 +24,7 @@ import { readProcessStartIdentity } from './core/session-marker.js';
|
|
|
24
24
|
import { drainTranscript, joinAssistantText, trailingAssistantText, findJsonlContainingFingerprint, findJsonlsContainingExactContent, findLatestJsonl, extractLastAssistantTurn, extractTurnStartText, splitTranscriptEventsByCutoff } from './services/claude-transcript.js';
|
|
25
25
|
import { BridgeTurnQueue, makeFingerprint, normaliseForFingerprint } from './services/bridge-turn-queue.js';
|
|
26
26
|
import { shouldSuppressBridgeEmit } from './services/bridge-fallback-gate.js';
|
|
27
|
-
import { shouldReleaseFirstPromptTimeout, shouldWriteNow } from './utils/input-gate.js';
|
|
27
|
+
import { decideHardTimeoutAction, decideSettleMarkReady, shouldReleaseFirstPromptTimeout, shouldWriteNow } from './utils/input-gate.js';
|
|
28
28
|
import { canStartInjectionFlush, shouldDeferUserFlush, shouldFlushInjectionsFirst } from './core/inject-queue-policy.js';
|
|
29
29
|
import { stripAnsiForLog, tailChars } from './utils/crash-log.js';
|
|
30
30
|
import { CodexUpdateDialogGuard } from './utils/codex-update-dialog.js';
|
|
@@ -837,6 +837,15 @@ let isSettlingFirstFlush = false;
|
|
|
837
837
|
* ready yet, or flushPending will be blocked by isSettlingFirstFlush and a
|
|
838
838
|
* later markPromptReady call would return early with the first prompt stranded. */
|
|
839
839
|
let promptReadyDetectedDuringSettle = false;
|
|
840
|
+
/** While the ready-gate is holding, the IdleDetector may still fire on a real
|
|
841
|
+
* readyPattern (e.g. Hermes's ❯) — proving the input box exists — but
|
|
842
|
+
* markPromptReady() returns early because the gate is armed. Record that the
|
|
843
|
+
* pattern was seen so the gate's timeout-fallback settle can mark the prompt
|
|
844
|
+
* ready immediately instead of delivering into a !isPromptReady state that
|
|
845
|
+
* flushPending() rejects for non-type-ahead adapters. Without this, a Hermes
|
|
846
|
+
* spawn that renders ❯ but never fires BOTMUX_READY_COMMAND waits the full
|
|
847
|
+
* hard timeout (and previously never delivered at all). */
|
|
848
|
+
let readyPatternSeenDuringHold = false;
|
|
840
849
|
/** Wait until the PTY has been quiet for READY_FLUSH_SETTLE_MS (Ink render
|
|
841
850
|
* drained), capped at READY_FLUSH_SETTLE_CAP_MS, then flush the held prompt.
|
|
842
851
|
* A real SessionStart/BOTMUX_READY_COMMAND signal is itself authoritative
|
|
@@ -848,8 +857,13 @@ function settleThenFlush(startedAtMs, promptReadyAfterSettle) {
|
|
|
848
857
|
const quietForMs = now - lastPtyOutputAtMs;
|
|
849
858
|
if (quietForMs >= READY_FLUSH_SETTLE_MS || now - startedAtMs >= READY_FLUSH_SETTLE_CAP_MS) {
|
|
850
859
|
isSettlingFirstFlush = false;
|
|
851
|
-
const shouldMarkPromptReady =
|
|
860
|
+
const shouldMarkPromptReady = decideSettleMarkReady({
|
|
861
|
+
promptReadyAfterSettle,
|
|
862
|
+
promptReadyDetectedDuringSettle,
|
|
863
|
+
readyPatternSeenDuringHold,
|
|
864
|
+
});
|
|
852
865
|
promptReadyDetectedDuringSettle = false;
|
|
866
|
+
readyPatternSeenDuringHold = false;
|
|
853
867
|
log(`Ready-gate settle done (quiet ${quietForMs}ms); ${shouldMarkPromptReady ? 'marking prompt ready' : 'delivering held first prompt'}`);
|
|
854
868
|
if (shouldMarkPromptReady) {
|
|
855
869
|
markPromptReady();
|
|
@@ -4524,6 +4538,11 @@ function markPromptReady() {
|
|
|
4524
4538
|
// releaseReadyGate() drives flushPending() once the real signal lands, and a
|
|
4525
4539
|
// later genuine idle then runs this fully. No-op for non-armed gates.
|
|
4526
4540
|
if (readyGate.shouldHold()) {
|
|
4541
|
+
// A real readyPattern fired while the gate was holding — the input box
|
|
4542
|
+
// exists. Remember it so the gate's timeout-fallback settle can mark the
|
|
4543
|
+
// prompt ready (see settleThenFlush) instead of letting flushPending()
|
|
4544
|
+
// reject the held message for non-type-ahead adapters.
|
|
4545
|
+
readyPatternSeenDuringHold = true;
|
|
4527
4546
|
log('Idle detected but holding for SessionStart ready signal (startup selector guard)');
|
|
4528
4547
|
return;
|
|
4529
4548
|
}
|
|
@@ -7349,6 +7368,7 @@ async function spawnCli(cfg, opts = {}) {
|
|
|
7349
7368
|
}
|
|
7350
7369
|
isSettlingFirstFlush = false;
|
|
7351
7370
|
promptReadyDetectedDuringSettle = false;
|
|
7371
|
+
readyPatternSeenDuringHold = false;
|
|
7352
7372
|
// Reset quiescence baseline so the settle measures silence from THIS spawn.
|
|
7353
7373
|
lastPtyOutputAtMs = Date.now();
|
|
7354
7374
|
const readyHookAvailable = effectiveReadyHookInstall
|
|
@@ -7574,8 +7594,23 @@ async function spawnCli(cfg, opts = {}) {
|
|
|
7574
7594
|
// invoking markPromptReady() would claim the CLI is idle while it's still
|
|
7575
7595
|
// mid-boot, so flushPending() alone is safer — it respects typeAheadAllowed
|
|
7576
7596
|
// and drains pendingMessages now.
|
|
7577
|
-
|
|
7597
|
+
//
|
|
7598
|
+
// Non-type-ahead adapters (Hermes etc.) flushPending() rejects the held
|
|
7599
|
+
// message while isPromptReady is false — it bails on
|
|
7600
|
+
// `!isPromptReady && !typeAheadAllowed`. The hard cap means we've waited
|
|
7601
|
+
// long enough. By now the ready gate's 45s fallback has already released
|
|
7602
|
+
// the gate (READY_SIGNAL_TIMEOUT_MS < this 90s hard cap) and the post-
|
|
7603
|
+
// release settle has drained, so markPromptReady() proceeds: it sets
|
|
7604
|
+
// isPromptReady and drains the held first prompt. Without this, a spawn
|
|
7605
|
+
// that never fires the ready signal (and whose readyPattern the idle
|
|
7606
|
+
// detector never matched) would hold the first queued message forever —
|
|
7607
|
+
// the previous code only logged "forcing flush" without actually flushing
|
|
7608
|
+
// for non-type-ahead adapters.
|
|
7609
|
+
if (decideHardTimeoutAction(cliAdapter?.supportsTypeAhead === true) === 'flush') {
|
|
7578
7610
|
flushPending();
|
|
7611
|
+
return;
|
|
7612
|
+
}
|
|
7613
|
+
markPromptReady();
|
|
7579
7614
|
};
|
|
7580
7615
|
setTimeout(() => releaseFirstPromptTimeout(FIRST_PROMPT_TIMEOUT_MS, false), FIRST_PROMPT_TIMEOUT_MS);
|
|
7581
7616
|
// Riff (and other remote HTTP backends) have no local boot process — the
|
|
@@ -7607,6 +7642,7 @@ function killCli(opts = {}) {
|
|
|
7607
7642
|
}
|
|
7608
7643
|
isSettlingFirstFlush = false;
|
|
7609
7644
|
promptReadyDetectedDuringSettle = false;
|
|
7645
|
+
readyPatternSeenDuringHold = false;
|
|
7610
7646
|
stopScreenAnalyzer();
|
|
7611
7647
|
stopScreenUpdates();
|
|
7612
7648
|
backend?.kill();
|