botmux 3.2.0 → 3.2.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/README.en.md +1 -0
- package/README.md +1 -0
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +13 -1
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +11 -1
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +6 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +7 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +1 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts +11 -0
- package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -0
- package/dist/cli/daemon-lifecycle-env.js +25 -0
- package/dist/cli/daemon-lifecycle-env.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -4
- package/dist/cli.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts +110 -0
- package/dist/codex-rpc-engine.d.ts.map +1 -0
- package/dist/codex-rpc-engine.js +496 -0
- package/dist/codex-rpc-engine.js.map +1 -0
- package/dist/codex-rpc-lifecycle.d.ts +157 -0
- package/dist/codex-rpc-lifecycle.d.ts.map +1 -0
- package/dist/codex-rpc-lifecycle.js +210 -0
- package/dist/codex-rpc-lifecycle.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -2
- package/dist/config.js.map +1 -1
- package/dist/core/attachment-path.d.ts +3 -0
- package/dist/core/attachment-path.d.ts.map +1 -0
- package/dist/core/attachment-path.js +8 -0
- package/dist/core/attachment-path.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +6 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-images.d.ts +29 -0
- package/dist/core/dashboard-images.d.ts.map +1 -0
- package/dist/core/dashboard-images.js +113 -0
- package/dist/core/dashboard-images.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +13 -1
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/github-auth.d.ts +5 -0
- package/dist/core/github-auth.d.ts.map +1 -1
- package/dist/core/github-auth.js +38 -0
- package/dist/core/github-auth.js.map +1 -1
- package/dist/core/maintenance.d.ts +1 -0
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +9 -1
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/session-create.d.ts +10 -0
- package/dist/core/session-create.d.ts.map +1 -1
- package/dist/core/session-create.js +21 -0
- package/dist/core/session-create.js.map +1 -1
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +25 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts +3 -0
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +17 -3
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +19 -3
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +19 -0
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +6 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +23 -2
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/create-session-composer.d.ts +35 -0
- package/dist/dashboard/web/create-session-composer.d.ts.map +1 -0
- package/dist/dashboard/web/create-session-composer.js +70 -0
- package/dist/dashboard/web/create-session-composer.js.map +1 -0
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +65 -5
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +147 -1
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +2 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +5 -2
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts +4 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +19 -0
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-4PM4T6QQ.js → bot-defaults-page-O37SAQD5.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-RXVA6XW3.js → chunk-6QHMLMIM.js} +6 -6
- package/dist/dashboard-web/chunks/{chunk-IKCZ677K.js → chunk-B42PCL5P.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-3PMN55Z6.js → chunk-FYALHCPG.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-AIDN2WZB.js → chunk-O2DPQL7C.js} +1 -1
- package/dist/dashboard-web/chunks/connectors-page-DZBQ42MH.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-TAU2UIVS.js → groups-page-3IEGRZKQ.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-PJ2XVM6T.js → insights-page-X3ADRON3.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-D6445HJO.js → monitor-room-IV36RGQY.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-GUHMCKSO.js → monitoring-page-ADFKVON4.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-6K6U2MS5.js → office-page-CALAOWNS.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-USDYU7U5.js → overview-page-SLMGLK3M.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-O4OUA7ZH.js → roles-page-L7JJ4FFV.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-LNIBXJSZ.js → schedules-page-Z3672POL.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-OKJ5YWUZ.js +3 -0
- package/dist/dashboard-web/chunks/settings-page-P6MI2ZUE.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-M5KYNXBA.js → skills-page-FT7BVZ6X.js} +4 -4
- package/dist/dashboard-web/chunks/{team-federation-page-GT7UFQMN.js → team-federation-page-DEYCPUFB.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-UYZIRJ2C.js → v3-page-4IOWREZG.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-WAR77DQE.js → whiteboards-page-2VMBETZH.js} +1 -1
- package/dist/dashboard-web/style.css +191 -0
- package/dist/dashboard.js +33 -6
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +7 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +2 -0
- package/dist/global-config.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts.map +1 -1
- package/dist/im/lark/ask-card.js +52 -4
- package/dist/im/lark/ask-card.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +2 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +19 -2
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +3 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +706 -693
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-pending.d.ts +8 -4
- package/dist/im/lark/grant-pending.d.ts.map +1 -1
- package/dist/im/lark/grant-pending.js +13 -6
- package/dist/im/lark/grant-pending.js.map +1 -1
- package/dist/services/connector-store.d.ts +8 -0
- package/dist/services/connector-store.d.ts.map +1 -1
- package/dist/services/connector-store.js.map +1 -1
- package/dist/services/session-store.d.ts +2 -1
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +60 -2
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/skill-registry-store.d.ts +16 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +343 -47
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/trigger-types.d.ts +5 -0
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +12 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/types.d.ts +13 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +440 -34
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/connectors-page-2MKF4YTN.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-B6U6TCFF.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-PXLRFF7I.js +0 -2
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { DaemonToWorker } from './types.js';
|
|
2
|
+
type InitCfg = Extract<DaemonToWorker, {
|
|
3
|
+
type: 'init';
|
|
4
|
+
}>;
|
|
5
|
+
/** CLIs that expose the codex-family `app-server --listen` + `--remote resume`
|
|
6
|
+
* protocol the RPC engine drives. codex + traex are verified identical; coco
|
|
7
|
+
* diverges (--resume flag) and needs its own verification before inclusion. */
|
|
8
|
+
export declare const RPC_CAPABLE_CLIS: Set<string>;
|
|
9
|
+
/** All fail-closed gates for codex-family RPC input in ONE place so the worker's
|
|
10
|
+
* pane-branching and engageCodexRpc agree. Every excluded case degrades to the
|
|
11
|
+
* normal paste path — never a silent capability/security change:
|
|
12
|
+
* - disableCliBypass: RPC hardcodes approvalPolicy=never + dangerFullAccess, so
|
|
13
|
+
* engaging it for an approval-gated bot would silently upgrade it to full
|
|
14
|
+
* access (P1-1).
|
|
15
|
+
* - startupCommands: /effort etc. must run in the TUI before the first turn,
|
|
16
|
+
* but the fresh first turn is sent pre-spawn to persist the rollout — RPC
|
|
17
|
+
* can't honor that ordering, so fail-closed (P1-4).
|
|
18
|
+
* - wrapperCli / cliPathOverride: the app-server is launched as `<bin>
|
|
19
|
+
* app-server`, which a wrapper/alternate launcher won't satisfy the same way
|
|
20
|
+
* the TUI's buildArgs does — two launchers would diverge, so fail-closed
|
|
21
|
+
* (P1-2).
|
|
22
|
+
* - backendType !== 'tmux': the pane-ownership detection + controlled respawn
|
|
23
|
+
* are only wired for tmux. On herdr/zellij a surviving dead `--remote` pane
|
|
24
|
+
* would be misjudged as native and reattached, and pty has no persistent
|
|
25
|
+
* pane at all — so restrict RPC to tmux until each backend's replace path is
|
|
26
|
+
* built + verified. */
|
|
27
|
+
export interface CodexRpcRuntimeGates {
|
|
28
|
+
/** Process-wide BOTMUX_SANDBOX=1 force. It is not represented in InitCfg but
|
|
29
|
+
* must gate RPC too: the app-server owns model execution and otherwise runs
|
|
30
|
+
* outside the sandbox wrapped around the viewer pane. */
|
|
31
|
+
sandboxForced?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare function codexRpcEligible(cfg: InitCfg, runtime?: CodexRpcRuntimeGates): boolean;
|
|
34
|
+
/** Positive rollout evidence that THIS turn's user message was persisted (P1-1).
|
|
35
|
+
* Given a thread's drained rollout events, is there a user turn matching the
|
|
36
|
+
* prompt? session_meta (written at thread/start) is not a `kind:'user'` event,
|
|
37
|
+
* so an empty thread yields false — filename existence alone would not. Match is
|
|
38
|
+
* normalized-equal OR contains (codex may prepend AGENTS.md context to the first
|
|
39
|
+
* turn); the fresh-thread scope makes a contains-match unambiguous. */
|
|
40
|
+
export declare function rolloutUserTurnMatches(events: ReadonlyArray<{
|
|
41
|
+
kind: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}>, promptText: string): boolean;
|
|
44
|
+
/** Decide what to do about a codex startup dialog on an RPC `--remote` pane
|
|
45
|
+
* (P1-3 / P2). An RPC pane has no terminal input path, so a blocking dialog
|
|
46
|
+
* freezes the viewer. The update menu is disabled at the source (-c
|
|
47
|
+
* check_for_update_on_startup=false); this is only a fail-safe:
|
|
48
|
+
* - 'warn-update' — an update menu is present (default may be "Update now") →
|
|
49
|
+
* NEVER auto-press; warn the user, they dismiss manually.
|
|
50
|
+
* - 'dismiss-safe' — a plain "press enter to continue" with no menu → safe Enter.
|
|
51
|
+
* - 'ready' — composer reached, no blocking dialog → stop watching.
|
|
52
|
+
* - 'wait' — nothing actionable yet.
|
|
53
|
+
* UPDATE_DIALOG takes precedence, so a screen with both an update menu AND a
|
|
54
|
+
* "press enter" line is warned, never pressed. */
|
|
55
|
+
export declare function decideStartupDialogAction(screen: string, readyPattern?: RegExp): 'warn-update' | 'dismiss-safe' | 'ready' | 'wait';
|
|
56
|
+
export interface PaneProbes {
|
|
57
|
+
panePidOf?: (sessionName: string) => number | undefined;
|
|
58
|
+
argvOf?: (pid: number) => string[];
|
|
59
|
+
commOf?: (pid: number) => string | undefined;
|
|
60
|
+
childrenOf?: (pid: number) => number[];
|
|
61
|
+
}
|
|
62
|
+
/** Outcome of an engage attempt (exactly-once-priority three-state for fresh +
|
|
63
|
+
* the resume/setup states):
|
|
64
|
+
* - 'accepted' — fresh first turn confirmed (ack or rollout evidence), or a
|
|
65
|
+
* resume that needs its waking prompt queued is 'resumed'.
|
|
66
|
+
* - 'ambiguous' — fresh first turn dispatched but unconfirmed → engaged, but
|
|
67
|
+
* the prompt must NOT be resent (P1-1); caller notifies.
|
|
68
|
+
* - 'resumed' — resume path engaged (no turn sent) → the waking prompt must
|
|
69
|
+
* be queued for post-ready flush.
|
|
70
|
+
* - 'not-engaged' — setup failed OR fresh frame never dispatched → paste. */
|
|
71
|
+
export type EngageOutcome = 'accepted' | 'ambiguous' | 'resumed' | 'not-engaged';
|
|
72
|
+
/** Whether the FRESH first turn should PRE-mark the codex bridge (so the reply is
|
|
73
|
+
* attributed even if the model skips `botmux send`). ONLY 'accepted' — a
|
|
74
|
+
* confirmed turn whose prompt is not re-queued, so exactly one mark exists and
|
|
75
|
+
* the reply consumes it. NOT 'ambiguous' (no positive evidence the turn ran → an
|
|
76
|
+
* unstarted queue head would wedge every later turn's drain — Codex P1) and NOT
|
|
77
|
+
* 'not-sent'/'resumed' (those never reach the pre-mark; not-sent's paste flush
|
|
78
|
+
* marks once, resume flushes its queued prompt). */
|
|
79
|
+
export declare function shouldPreMarkFirstTurn(outcome: EngageOutcome): boolean;
|
|
80
|
+
/** Injected effects for the init-time RPC state machine (real ones wired by the
|
|
81
|
+
* worker; fakes by tests). */
|
|
82
|
+
export interface RpcInitEffects {
|
|
83
|
+
paneInfo: (sessionId: string) => {
|
|
84
|
+
name: string;
|
|
85
|
+
live: boolean;
|
|
86
|
+
} | null;
|
|
87
|
+
paneIsRemote: (sessionName: string) => boolean;
|
|
88
|
+
/** Refresh the session-scoped Skill/MCP generation and start its trusted MCP
|
|
89
|
+
* host before the app-server starts. For fresh RPC, this also mutates the
|
|
90
|
+
* first prompt to include the current Skill catalog. */
|
|
91
|
+
prepare: () => Promise<void>;
|
|
92
|
+
engage: () => Promise<EngageOutcome>;
|
|
93
|
+
killVerify: (sessionName: string) => Promise<boolean>;
|
|
94
|
+
teardownEngine: () => void;
|
|
95
|
+
log: (m: string) => void;
|
|
96
|
+
notify: (m: string) => void;
|
|
97
|
+
}
|
|
98
|
+
/** Whether the initial prompt should be pushed to pendingMessages (the exact
|
|
99
|
+
* worker wiring, extracted so the P1-1 exactly-once guarantee is unit-testable):
|
|
100
|
+
* - paste (no RPC engine) → queue as usual.
|
|
101
|
+
* - RPC RESUME (engine + queuePrompt) → queue the waking prompt for post-ready flush.
|
|
102
|
+
* - RPC FRESH accepted/ambiguous → engine set + queuePrompt=false → NEVER
|
|
103
|
+
* queue (the turn was pre-sent or is ambiguous; re-queuing would double-execute).
|
|
104
|
+
* args-baked first prompts skip the queue unless deferred for startup commands. */
|
|
105
|
+
export declare function shouldQueueInitialPrompt(o: {
|
|
106
|
+
hasPrompt: boolean;
|
|
107
|
+
rpcEngineActive: boolean;
|
|
108
|
+
queuePrompt: boolean;
|
|
109
|
+
passesInitialPromptViaArgs: boolean;
|
|
110
|
+
deferInitialPrompt: boolean;
|
|
111
|
+
}): boolean;
|
|
112
|
+
export interface RpcInitDecision {
|
|
113
|
+
/** RPC is active → spawnCli will launch the `--remote resume` TUI. */
|
|
114
|
+
engaged: boolean;
|
|
115
|
+
/** The init prompt must be QUEUED (resume path: delivered by flushPending →
|
|
116
|
+
* sendTurn once the TUI is ready) rather than pre-sent (fresh) or pasted. */
|
|
117
|
+
queuePrompt: boolean;
|
|
118
|
+
/** A stale `--remote` pane could not be replaced — the caller MUST NOT run
|
|
119
|
+
* spawnCli (it would reattach the dead pane against the fresh-port engine). */
|
|
120
|
+
abortSpawn: boolean;
|
|
121
|
+
}
|
|
122
|
+
/** Pure init-time state machine for codex-family RPC, extracted so the
|
|
123
|
+
* fresh/resume/kill-failure ORDERING is unit-testable (the worker only wires
|
|
124
|
+
* real effects + acts on the decision). Mirrors the four cases:
|
|
125
|
+
* - not eligible → nothing (paste).
|
|
126
|
+
* - no live pane (fresh or resume- → prepare Skill/MCP state, then engage;
|
|
127
|
+
* without a surviving pane) fresh pre-sends the first turn inside
|
|
128
|
+
* engage, resume must queue it.
|
|
129
|
+
* - live RPC-owned pane → prepare, engage, then kill+VERIFY the stale pane;
|
|
130
|
+
* on success respawn (queue the prompt),
|
|
131
|
+
* on failure tear the engine down + abort
|
|
132
|
+
* spawn (never attach a stale remote pane
|
|
133
|
+
* to a fresh-port engine — Codex P0-2).
|
|
134
|
+
* - live native paste pane → leave it (fail-closed paste, boundary #3). */
|
|
135
|
+
export declare function orchestrateCodexRpcInit(cfg: InitCfg, fx: RpcInitEffects, runtime?: CodexRpcRuntimeGates): Promise<RpcInitDecision>;
|
|
136
|
+
export interface PersistentPaneKillEffects {
|
|
137
|
+
kill: (sessionName: string) => void;
|
|
138
|
+
isLive: (sessionName: string) => boolean;
|
|
139
|
+
wait: (ms: number) => Promise<void>;
|
|
140
|
+
}
|
|
141
|
+
/** Kill a resolved persistent-session name and verify that exact name is gone.
|
|
142
|
+
* Keeping the resolved name opaque avoids accidentally applying sessionName()
|
|
143
|
+
* twice (`bmx-1234` -> `bmx-bmx-`), which would turn every failed kill into a
|
|
144
|
+
* false success and reattach the stale RPC pane. */
|
|
145
|
+
export declare function killAndVerifyPersistentPane(sessionName: string, fx: PersistentPaneKillEffects, attempts?: number, retryMs?: number): Promise<boolean>;
|
|
146
|
+
/** Does the surviving persistent pane run a botmux RPC `--remote` TUI (vs a
|
|
147
|
+
* native paste codex/traex)? Walks the pane's process tree and inspects the LEAF
|
|
148
|
+
* argv (Linux /proc + macOS ps, via readCmdline) — NOT tmux
|
|
149
|
+
* pane_current_command, which only returns `codex`/`node` without argv. Only a
|
|
150
|
+
* codex-family process carrying `--remote` in argv counts as RPC-owned; a native
|
|
151
|
+
* `codex resume`, a bare shell, or an unreadable tree fails-closed to false so a
|
|
152
|
+
* daemon-restart resume never force-respawns a possibly-mid-turn native pane.
|
|
153
|
+
* This is a live-argv check, not a persisted marker, so there is no stale-marker
|
|
154
|
+
* hazard. Probes are injectable for tests (defaults hit the real OS/tmux). */
|
|
155
|
+
export declare function paneRunsRemoteTui(persistentSessionName: string, probes?: PaneProbes): boolean;
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=codex-rpc-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-rpc-lifecycle.d.ts","sourceRoot":"","sources":["../src/codex-rpc-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Pure, testable helpers for the hybrid codex-family RPC input lifecycle. Kept
|
|
2
|
+
// out of worker.ts (which auto-registers process handlers on import) so the gate
|
|
3
|
+
// and the pane-ownership detection can be unit-tested with injected probes.
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
import { readCmdline, readComm, getChildPids } from './core/session-discovery.js';
|
|
6
|
+
/** CLIs that expose the codex-family `app-server --listen` + `--remote resume`
|
|
7
|
+
* protocol the RPC engine drives. codex + traex are verified identical; coco
|
|
8
|
+
* diverges (--resume flag) and needs its own verification before inclusion. */
|
|
9
|
+
export const RPC_CAPABLE_CLIS = new Set(['codex', 'traex']);
|
|
10
|
+
export function codexRpcEligible(cfg, runtime = {}) {
|
|
11
|
+
const wantResume = cfg.resume === true && !!cfg.cliSessionId;
|
|
12
|
+
return (cfg.codexRpcInput === true && RPC_CAPABLE_CLIS.has(cfg.cliId) &&
|
|
13
|
+
cfg.backendType === 'tmux' &&
|
|
14
|
+
cfg.adoptMode !== true && cfg.readIsolation !== true && cfg.sandbox !== true && runtime.sandboxForced !== true &&
|
|
15
|
+
cfg.disableCliBypass !== true &&
|
|
16
|
+
!cfg.startupCommands?.length &&
|
|
17
|
+
!cfg.wrapperCli && !cfg.cliPathOverride &&
|
|
18
|
+
(!!cfg.prompt || wantResume));
|
|
19
|
+
}
|
|
20
|
+
/** Positive rollout evidence that THIS turn's user message was persisted (P1-1).
|
|
21
|
+
* Given a thread's drained rollout events, is there a user turn matching the
|
|
22
|
+
* prompt? session_meta (written at thread/start) is not a `kind:'user'` event,
|
|
23
|
+
* so an empty thread yields false — filename existence alone would not. Match is
|
|
24
|
+
* normalized-equal OR contains (codex may prepend AGENTS.md context to the first
|
|
25
|
+
* turn); the fresh-thread scope makes a contains-match unambiguous. */
|
|
26
|
+
export function rolloutUserTurnMatches(events, promptText) {
|
|
27
|
+
const norm = (s) => s.replace(/\r\n/g, '\n').replace(/\r/g, '\n').trim();
|
|
28
|
+
const needle = norm(promptText);
|
|
29
|
+
if (!needle)
|
|
30
|
+
return false;
|
|
31
|
+
return events.some(e => e.kind === 'user' && (norm(e.text) === needle || norm(e.text).includes(needle)));
|
|
32
|
+
}
|
|
33
|
+
/** Decide what to do about a codex startup dialog on an RPC `--remote` pane
|
|
34
|
+
* (P1-3 / P2). An RPC pane has no terminal input path, so a blocking dialog
|
|
35
|
+
* freezes the viewer. The update menu is disabled at the source (-c
|
|
36
|
+
* check_for_update_on_startup=false); this is only a fail-safe:
|
|
37
|
+
* - 'warn-update' — an update menu is present (default may be "Update now") →
|
|
38
|
+
* NEVER auto-press; warn the user, they dismiss manually.
|
|
39
|
+
* - 'dismiss-safe' — a plain "press enter to continue" with no menu → safe Enter.
|
|
40
|
+
* - 'ready' — composer reached, no blocking dialog → stop watching.
|
|
41
|
+
* - 'wait' — nothing actionable yet.
|
|
42
|
+
* UPDATE_DIALOG takes precedence, so a screen with both an update menu AND a
|
|
43
|
+
* "press enter" line is warned, never pressed. */
|
|
44
|
+
export function decideStartupDialogAction(screen, readyPattern) {
|
|
45
|
+
if (/Update available|Update now \(runs|Skip until next version/i.test(screen))
|
|
46
|
+
return 'warn-update';
|
|
47
|
+
if (/Press enter to continue/i.test(screen))
|
|
48
|
+
return 'dismiss-safe';
|
|
49
|
+
if (readyPattern?.test(screen) === true)
|
|
50
|
+
return 'ready';
|
|
51
|
+
return 'wait';
|
|
52
|
+
}
|
|
53
|
+
/** Whether the FRESH first turn should PRE-mark the codex bridge (so the reply is
|
|
54
|
+
* attributed even if the model skips `botmux send`). ONLY 'accepted' — a
|
|
55
|
+
* confirmed turn whose prompt is not re-queued, so exactly one mark exists and
|
|
56
|
+
* the reply consumes it. NOT 'ambiguous' (no positive evidence the turn ran → an
|
|
57
|
+
* unstarted queue head would wedge every later turn's drain — Codex P1) and NOT
|
|
58
|
+
* 'not-sent'/'resumed' (those never reach the pre-mark; not-sent's paste flush
|
|
59
|
+
* marks once, resume flushes its queued prompt). */
|
|
60
|
+
export function shouldPreMarkFirstTurn(outcome) {
|
|
61
|
+
return outcome === 'accepted';
|
|
62
|
+
}
|
|
63
|
+
/** Whether the initial prompt should be pushed to pendingMessages (the exact
|
|
64
|
+
* worker wiring, extracted so the P1-1 exactly-once guarantee is unit-testable):
|
|
65
|
+
* - paste (no RPC engine) → queue as usual.
|
|
66
|
+
* - RPC RESUME (engine + queuePrompt) → queue the waking prompt for post-ready flush.
|
|
67
|
+
* - RPC FRESH accepted/ambiguous → engine set + queuePrompt=false → NEVER
|
|
68
|
+
* queue (the turn was pre-sent or is ambiguous; re-queuing would double-execute).
|
|
69
|
+
* args-baked first prompts skip the queue unless deferred for startup commands. */
|
|
70
|
+
export function shouldQueueInitialPrompt(o) {
|
|
71
|
+
if (!o.hasPrompt)
|
|
72
|
+
return false;
|
|
73
|
+
const wantsQueue = !o.rpcEngineActive || o.queuePrompt;
|
|
74
|
+
if (!wantsQueue)
|
|
75
|
+
return false;
|
|
76
|
+
return !o.passesInitialPromptViaArgs || o.deferInitialPrompt;
|
|
77
|
+
}
|
|
78
|
+
/** Pure init-time state machine for codex-family RPC, extracted so the
|
|
79
|
+
* fresh/resume/kill-failure ORDERING is unit-testable (the worker only wires
|
|
80
|
+
* real effects + acts on the decision). Mirrors the four cases:
|
|
81
|
+
* - not eligible → nothing (paste).
|
|
82
|
+
* - no live pane (fresh or resume- → prepare Skill/MCP state, then engage;
|
|
83
|
+
* without a surviving pane) fresh pre-sends the first turn inside
|
|
84
|
+
* engage, resume must queue it.
|
|
85
|
+
* - live RPC-owned pane → prepare, engage, then kill+VERIFY the stale pane;
|
|
86
|
+
* on success respawn (queue the prompt),
|
|
87
|
+
* on failure tear the engine down + abort
|
|
88
|
+
* spawn (never attach a stale remote pane
|
|
89
|
+
* to a fresh-port engine — Codex P0-2).
|
|
90
|
+
* - live native paste pane → leave it (fail-closed paste, boundary #3). */
|
|
91
|
+
export async function orchestrateCodexRpcInit(cfg, fx, runtime = {}) {
|
|
92
|
+
const NONE = { engaged: false, queuePrompt: false, abortSpawn: false };
|
|
93
|
+
if (!codexRpcEligible(cfg, runtime))
|
|
94
|
+
return NONE;
|
|
95
|
+
const pane = fx.paneInfo(cfg.sessionId);
|
|
96
|
+
if (!pane || !pane.live) {
|
|
97
|
+
// Fresh session, or a resume whose pane didn't survive.
|
|
98
|
+
await fx.prepare();
|
|
99
|
+
const outcome = await fx.engage();
|
|
100
|
+
switch (outcome) {
|
|
101
|
+
case 'accepted':
|
|
102
|
+
// Fresh first turn confirmed delivered → engaged, do NOT re-queue.
|
|
103
|
+
return { engaged: true, queuePrompt: false, abortSpawn: false };
|
|
104
|
+
case 'ambiguous':
|
|
105
|
+
// Fresh first turn dispatched but unconfirmed → engaged, but NEVER resend
|
|
106
|
+
// (exactly-once). The notify is the authoritative result; the viewer
|
|
107
|
+
// resume recovers the turn if it actually landed. The prompt is NOT
|
|
108
|
+
// queued (queuePrompt:false) and must never reach pending/inflight.
|
|
109
|
+
fx.notify('⚠️ 首条消息已发出但未收到确认。为避免重复执行未自动重发;请查看终端结果,如未执行请手动重发。');
|
|
110
|
+
return { engaged: true, queuePrompt: false, abortSpawn: false };
|
|
111
|
+
case 'resumed':
|
|
112
|
+
// Resume engaged (no pre-send) → queue the waking prompt for post-ready flush.
|
|
113
|
+
return { engaged: true, queuePrompt: true, abortSpawn: false };
|
|
114
|
+
case 'not-engaged':
|
|
115
|
+
return NONE; // setup failed or frame never dispatched → safe paste fallback
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (fx.paneIsRemote(pane.name)) {
|
|
119
|
+
// Surviving RPC `--remote` pane on the now-dead prior app-server (always a
|
|
120
|
+
// resume). Re-engage, then replace the stale pane.
|
|
121
|
+
await fx.prepare();
|
|
122
|
+
const outcome = await fx.engage();
|
|
123
|
+
if (outcome === 'not-engaged') {
|
|
124
|
+
// The pane is still a viewer for the prior incarnation's dead app-server;
|
|
125
|
+
// merely returning to the paste path would reattach that pane and silently
|
|
126
|
+
// drop input. Remove it first so spawnCli can create a native paste pane.
|
|
127
|
+
const gone = await fx.killVerify(pane.name);
|
|
128
|
+
if (gone)
|
|
129
|
+
return NONE;
|
|
130
|
+
fx.notify('Codex RPC 会话恢复失败:新引擎未启动,且无法替换旧 --remote 面板。请重试,或 /close 后重开会话。');
|
|
131
|
+
fx.log(`Codex RPC resume: engine unavailable and FAILED to kill stale --remote pane ${pane.name}; aborting init`);
|
|
132
|
+
return { engaged: false, queuePrompt: false, abortSpawn: true };
|
|
133
|
+
}
|
|
134
|
+
const gone = await fx.killVerify(pane.name);
|
|
135
|
+
if (gone)
|
|
136
|
+
return { engaged: true, queuePrompt: true, abortSpawn: false };
|
|
137
|
+
fx.teardownEngine();
|
|
138
|
+
fx.notify('Codex RPC 会话恢复失败:无法替换旧 --remote 面板。请重试,或 /close 后重开会话。');
|
|
139
|
+
fx.log(`Codex RPC resume: FAILED to kill stale --remote pane ${pane.name}; aborting init (never attach a stale remote pane to a fresh-port engine)`);
|
|
140
|
+
return { engaged: false, queuePrompt: false, abortSpawn: true };
|
|
141
|
+
}
|
|
142
|
+
fx.log('Codex RPC: surviving pane is native paste (not RPC-owned) — keeping paste for this restore');
|
|
143
|
+
return NONE;
|
|
144
|
+
}
|
|
145
|
+
/** Kill a resolved persistent-session name and verify that exact name is gone.
|
|
146
|
+
* Keeping the resolved name opaque avoids accidentally applying sessionName()
|
|
147
|
+
* twice (`bmx-1234` -> `bmx-bmx-`), which would turn every failed kill into a
|
|
148
|
+
* false success and reattach the stale RPC pane. */
|
|
149
|
+
export async function killAndVerifyPersistentPane(sessionName, fx, attempts = 4, retryMs = 250) {
|
|
150
|
+
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
151
|
+
try {
|
|
152
|
+
fx.kill(sessionName);
|
|
153
|
+
}
|
|
154
|
+
catch { /* verify below */ }
|
|
155
|
+
if (!fx.isLive(sessionName))
|
|
156
|
+
return true;
|
|
157
|
+
if (attempt + 1 < attempts)
|
|
158
|
+
await fx.wait(retryMs);
|
|
159
|
+
}
|
|
160
|
+
return !fx.isLive(sessionName);
|
|
161
|
+
}
|
|
162
|
+
function tmuxPanePid(sessionName) {
|
|
163
|
+
try {
|
|
164
|
+
const out = execFileSync('tmux', ['display', '-t', sessionName, '-p', '#{pane_pid}'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 3000 }).trim();
|
|
165
|
+
const n = Number(out);
|
|
166
|
+
return Number.isInteger(n) && n > 0 ? n : undefined;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Does the surviving persistent pane run a botmux RPC `--remote` TUI (vs a
|
|
173
|
+
* native paste codex/traex)? Walks the pane's process tree and inspects the LEAF
|
|
174
|
+
* argv (Linux /proc + macOS ps, via readCmdline) — NOT tmux
|
|
175
|
+
* pane_current_command, which only returns `codex`/`node` without argv. Only a
|
|
176
|
+
* codex-family process carrying `--remote` in argv counts as RPC-owned; a native
|
|
177
|
+
* `codex resume`, a bare shell, or an unreadable tree fails-closed to false so a
|
|
178
|
+
* daemon-restart resume never force-respawns a possibly-mid-turn native pane.
|
|
179
|
+
* This is a live-argv check, not a persisted marker, so there is no stale-marker
|
|
180
|
+
* hazard. Probes are injectable for tests (defaults hit the real OS/tmux). */
|
|
181
|
+
export function paneRunsRemoteTui(persistentSessionName, probes = {}) {
|
|
182
|
+
const panePidOf = probes.panePidOf ?? tmuxPanePid;
|
|
183
|
+
const argvOf = probes.argvOf ?? readCmdline;
|
|
184
|
+
const commOf = probes.commOf ?? readComm;
|
|
185
|
+
const childrenOf = probes.childrenOf ?? getChildPids;
|
|
186
|
+
const panePid = panePidOf(persistentSessionName);
|
|
187
|
+
if (panePid === undefined || !Number.isInteger(panePid) || panePid <= 0)
|
|
188
|
+
return false;
|
|
189
|
+
let frontier = [panePid];
|
|
190
|
+
const seen = new Set();
|
|
191
|
+
for (let depth = 0; depth <= 4 && frontier.length; depth++) {
|
|
192
|
+
const next = [];
|
|
193
|
+
for (const pid of frontier) {
|
|
194
|
+
if (seen.has(pid))
|
|
195
|
+
continue;
|
|
196
|
+
seen.add(pid);
|
|
197
|
+
const argv = argvOf(pid);
|
|
198
|
+
if (argv.length) {
|
|
199
|
+
const comm = commOf(pid) ?? '';
|
|
200
|
+
const isCodexFamily = /^(codex|traex)/i.test(comm) || argv.some(a => /(?:^|\/)(codex|traex)$/i.test(a));
|
|
201
|
+
if (isCodexFamily && argv.includes('--remote'))
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
next.push(...childrenOf(pid));
|
|
205
|
+
}
|
|
206
|
+
frontier = next;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=codex-rpc-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-rpc-lifecycle.js","sourceRoot":"","sources":["../src/codex-rpc-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -135,6 +135,7 @@ export declare const config: {
|
|
|
135
135
|
};
|
|
136
136
|
readonly chatBotDiscovery: ChatBotDiscoveryConfig;
|
|
137
137
|
readonly herdrTraexPlugin: HerdrTraexPluginRuntimeConfig;
|
|
138
|
+
readonly codexRpcInputDefault: boolean;
|
|
138
139
|
};
|
|
139
140
|
export type Config = typeof config;
|
|
140
141
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AA0B/D,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AA2BD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,sBAAsB,CAU1G;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,6BAA6B,CAgBjH;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED,wBAAgB,oCAAoC,IAAI,MAAM,GAAG,SAAS,CAEzE;AAKD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAQzF;AAED,eAAO,MAAM,MAAM;;;;;;iBAUI,MAAM;;;QAGzB;;;4CAGoC;;;;eAIY,OAAO,yBAAyB,EAAE,KAAK;;qBAElB,WAAW;QAChF;;;;;6CAKqC;;;;;;;;;;;;;;;;;;;;QAwCrC;;;;;;;;;;sEAU8D;;;;;;;;QAQ9D,sCAAsC;;QAEtC,iEAAiE;;QAEjE,2CAA2C;;QAE3C,mFAAmF;sBAI3E,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9B,mGAAmG;mBAI3F,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;QAG/B;;;;;WAKG;;;;;;QAMH,uDAAuD;sBAI/C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9B,2DAA2D;mBAInD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;mCAeL,OAAO;CACpC,CAAC;AAGF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -11,8 +11,11 @@ function getLocalIp() {
|
|
|
11
11
|
}
|
|
12
12
|
return 'localhost';
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
function nonBlankHost(value) {
|
|
15
|
+
return value?.trim() || undefined;
|
|
16
|
+
}
|
|
17
|
+
const configuredWebExternalHost = nonBlankHost(process.env.WEB_EXTERNAL_HOST);
|
|
18
|
+
const configuredDashboardExternalHost = nonBlankHost(process.env.BOTMUX_DASHBOARD_EXTERNAL_HOST) ?? configuredWebExternalHost;
|
|
16
19
|
export function getWebExternalHost() {
|
|
17
20
|
return configuredWebExternalHost ?? getLocalIp();
|
|
18
21
|
}
|
|
@@ -263,5 +266,14 @@ export const config = {
|
|
|
263
266
|
// restart. The daemon's listChatBotMembers reads this per call.
|
|
264
267
|
get chatBotDiscovery() { return resolveChatBotDiscoveryConfig(); },
|
|
265
268
|
get herdrTraexPlugin() { return resolveHerdrTraexPluginConfig(); },
|
|
269
|
+
// Live getter (like chatBotDiscovery): re-reads the experimental global toggle
|
|
270
|
+
// so a Settings change enables/disables RPC input mode for new codex-family
|
|
271
|
+
// sessions without a daemon restart. The daemon ORs this with each bot's own
|
|
272
|
+
// `codexRpcInput` flag when building the worker init message.
|
|
273
|
+
// Default OFF (absent ⇒ disabled): the hybrid RPC pane lifecycle (resume
|
|
274
|
+
// respawn + ready-gate) must be live-verified before the fleet default flips
|
|
275
|
+
// ON. A per-bot codexRpcInput:true still force-enables; the dashboard toggle
|
|
276
|
+
// sets this global explicitly.
|
|
277
|
+
get codexRpcInputDefault() { return readGlobalConfig().dashboard?.codexRpcInput === true; },
|
|
266
278
|
};
|
|
267
279
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,sEAAsE;AACtE,SAAS,UAAU;IACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,yBAAyB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-path.d.ts","sourceRoot":"","sources":["../../src/core/attachment-path.ts"],"names":[],"mappings":"AAIA,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { join, resolve } from 'node:path';
|
|
2
|
+
import { assertSafeAppId } from '../adapters/cli/read-isolation.js';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
/** Per-bot attachment bucket shared by Lark downloads and Dashboard uploads. */
|
|
5
|
+
export function getAttachmentsDir(larkAppId, messageId) {
|
|
6
|
+
return join(resolve(config.session.dataDir), 'attachments', assertSafeAppId(larkAppId), messageId);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=attachment-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-path.js","sourceRoot":"","sources":["../../src/core/attachment-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,SAAiB;IACpE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1565,7 +1565,12 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
|
|
|
1565
1565
|
sessionStore.closeSession(ds.session.sessionId);
|
|
1566
1566
|
await deliverEphemeralOrReply(ds, message.senderId, closedCard, 'interactive', () => sessionReply(rootId, closedCard, 'interactive'));
|
|
1567
1567
|
const oldSession = ds.session;
|
|
1568
|
-
|
|
1568
|
+
// `rootId` is the routing anchor. For chat-scope sessions it is the
|
|
1569
|
+
// `oc_...` chat id, not the traceable `om_...` message root stored on
|
|
1570
|
+
// Session. Preserve the old identity and explicitly persist scope so
|
|
1571
|
+
// repo switches cannot turn a chat session into a legacy scope-less
|
|
1572
|
+
// record that the CLI later mistakes for a thread.
|
|
1573
|
+
const session = sessionStore.createSession(ds.chatId, ds.scope === 'chat' ? oldSession.rootMessageId : rootId, displayName, ds.chatType, ds.scope);
|
|
1569
1574
|
ds.session = session;
|
|
1570
1575
|
ds.lastUserPrompt = undefined;
|
|
1571
1576
|
ds.lastCliInput = undefined;
|