botmux 3.6.0 → 3.7.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/.runtime-build-id +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +7 -6
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +8 -7
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +5 -2
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +15 -6
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +62 -6
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +70 -7
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/bot-registry.d.ts +13 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +15 -7
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
- package/dist/cli/daemon-lifecycle-env.js +12 -0
- package/dist/cli/daemon-lifecycle-env.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -7
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts +7 -5
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +37 -21
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +3 -0
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +12 -9
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +1 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/initial-user-turn.d.ts +14 -0
- package/dist/core/initial-user-turn.d.ts.map +1 -0
- package/dist/core/initial-user-turn.js +65 -0
- package/dist/core/initial-user-turn.js.map +1 -0
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +6 -0
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/per-bot-env.d.ts.map +1 -1
- package/dist/core/per-bot-env.js +10 -0
- package/dist/core/per-bot-env.js.map +1 -1
- package/dist/core/plugins/pm2.d.ts.map +1 -1
- package/dist/core/plugins/pm2.js +4 -0
- package/dist/core/plugins/pm2.js.map +1 -1
- package/dist/core/session-discovery.d.ts +23 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +162 -82
- 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 +23 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts +2 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +27 -4
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +18 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +205 -39
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +29 -5
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/bot-payload.js +3 -3
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +5 -5
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +1 -1
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.js +18 -18
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-VQMPUJ4Y.js → bot-defaults-page-UKA7K4JV.js} +2 -2
- package/dist/dashboard-web/chunks/{chunk-NP4JUBGS.js → chunk-3QAUJXAS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-JMRGZQDB.js → chunk-FLGXZJTD.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-FNPGOZMX.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-SNKATZWK.js → chunk-KQB42ML5.js} +4 -4
- package/dist/dashboard-web/chunks/{connectors-page-DOY4J3ZL.js → connectors-page-A77YAB5Y.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-74TS2DIH.js → groups-page-RUZNVXQB.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-AYCO65JC.js → insights-page-RF7U7RTA.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-YKYLTSAN.js → monitor-room-7IVIS75W.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-QBIUNRBR.js → monitoring-page-5SSJRQZF.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-4PH2A26P.js → office-page-EOND3L5D.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-H73D5UT4.js → overview-page-NISBVBBJ.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-U4BTOQ7F.js → roles-page-BUMKD7Y4.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-RHRHX7R7.js → schedules-page-AVOOKLUH.js} +1 -1
- package/dist/dashboard-web/chunks/{sessions-page-VSC6AM5G.js → sessions-page-6HLSEAB7.js} +2 -2
- package/dist/dashboard-web/chunks/{settings-page-LF3RKM5P.js → settings-page-MJDZHQ4X.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-SYOIGGXH.js → skills-page-5MW54PCC.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-RMBLASTW.js → team-federation-page-2SNIMVXI.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-XJXKKJRN.js → v3-page-W6SBXXQC.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-K3YVSTHJ.js → whiteboards-page-STC54KTP.js} +1 -1
- package/dist/dashboard-web/style.css +5 -0
- package/dist/dashboard.js +2 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/main/dashboard-compat.js +1 -1
- package/dist/i18n/en.js +6 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.js +6 -6
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +5 -4
- 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 +40 -7
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +82 -1
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +46 -12
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/relay-target-routing.d.ts.map +1 -1
- package/dist/im/lark/relay-target-routing.js +12 -11
- package/dist/im/lark/relay-target-routing.js.map +1 -1
- package/dist/im/lark/reply-mode-command.d.ts.map +1 -1
- package/dist/im/lark/reply-mode-command.js +4 -3
- package/dist/im/lark/reply-mode-command.js.map +1 -1
- package/dist/index-daemon.js +6 -1
- package/dist/index-daemon.js.map +1 -1
- package/dist/mir-runner.js +1 -1
- package/dist/mir-runner.js.map +1 -1
- package/dist/services/bot-config-store.d.ts +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +1 -1
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/card-prefs-store.js +8 -8
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/chat-reply-mode-store.d.ts.map +1 -1
- package/dist/services/chat-reply-mode-store.js +16 -11
- package/dist/services/chat-reply-mode-store.js.map +1 -1
- package/dist/services/insight/types.d.ts +3 -1
- package/dist/services/insight/types.d.ts.map +1 -1
- package/dist/services/insight/types.js.map +1 -1
- package/dist/services/project-scanner.d.ts +4 -4
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +13 -5
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts +4 -0
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +53 -5
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/services/usage-ledger.d.ts.map +1 -1
- package/dist/services/usage-ledger.js +1 -0
- package/dist/services/usage-ledger.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +37 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +61 -3
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/setup-args.js +1 -1
- package/dist/setup/setup-args.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/allowed-users-apply.d.ts.map +1 -1
- package/dist/utils/allowed-users-apply.js +3 -2
- package/dist/utils/allowed-users-apply.js.map +1 -1
- package/dist/utils/child-env.d.ts +31 -2
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +61 -3
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/file-lock.d.ts +10 -0
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +295 -53
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/worker.js +52 -3
- package/dist/worker.js.map +1 -1
- package/dist/workflows/v3/run-envelope.d.ts +24 -24
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-P327LXOT.js +0 -1
|
@@ -58,11 +58,13 @@ export { validateWorkingDir };
|
|
|
58
58
|
* 1. Build candidate absolute paths — absolute / `~` taken as-is; relative or
|
|
59
59
|
* bare names resolved against each scan dir, then the daemon cwd (mirrors
|
|
60
60
|
* how the card's project list is rooted).
|
|
61
|
-
* 2.
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
61
|
+
* 2. Return the first directly existing candidate, describing its git ref
|
|
62
|
+
* without scanning unrelated roots. This is lenient like `/cd`, whose trust
|
|
63
|
+
* model is "owner explicitly chose a dir"; the CLI already runs with full
|
|
64
|
+
* FS access.
|
|
65
|
+
* 3. Only for a bare name that did not directly resolve, scan projects and
|
|
66
|
+
* match by basename (covers projects nested deeper than the scan-dir top
|
|
67
|
+
* level).
|
|
66
68
|
* Returns null when nothing resolves to an existing directory.
|
|
67
69
|
*/
|
|
68
70
|
export declare function resolveRepoSelection(repoArg: string, scanDirs: string[]): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../src/core/command-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ import { logger } from '../utils/logger.js';
|
|
|
25
25
|
import { scheduleTimeZone } from '../utils/timezone.js';
|
|
26
26
|
import { killWorker, suspendWorker, forkWorker, forkAdoptWorker, adoptSandboxBlocked, getCurrentCliVersion, postFreshStreamingCard, postPrivateSnapshotCard, resolvePrivateCardAudience, deliverEphemeralOrReply, deliverWritableTerminalCardTo, requestSessionRestart } from './worker-pool.js';
|
|
27
27
|
import { expandHome, getSessionWorkingDir, getProjectScanDirs, rememberLastCliInput, buildNewTopicCliInput, ensureSessionWhiteboard, getAvailableBots, } from './session-manager.js';
|
|
28
|
+
import { markInitialUserTurnPending } from './initial-user-turn.js';
|
|
28
29
|
import { discoverSlashCommandsForAdapter, listMcpServerNames, supportsFilesystemCommandDiscovery } from './command-discovery.js';
|
|
29
30
|
import { validateWorkingDir } from './working-dir.js';
|
|
30
31
|
import { repinSessionWorkingDir } from './session-cwd.js';
|
|
@@ -158,16 +159,16 @@ export { validateWorkingDir };
|
|
|
158
159
|
* 1. Build candidate absolute paths — absolute / `~` taken as-is; relative or
|
|
159
160
|
* bare names resolved against each scan dir, then the daemon cwd (mirrors
|
|
160
161
|
* how the card's project list is rooted).
|
|
161
|
-
* 2.
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
162
|
+
* 2. Return the first directly existing candidate, describing its git ref
|
|
163
|
+
* without scanning unrelated roots. This is lenient like `/cd`, whose trust
|
|
164
|
+
* model is "owner explicitly chose a dir"; the CLI already runs with full
|
|
165
|
+
* FS access.
|
|
166
|
+
* 3. Only for a bare name that did not directly resolve, scan projects and
|
|
167
|
+
* match by basename (covers projects nested deeper than the scan-dir top
|
|
168
|
+
* level).
|
|
166
169
|
* Returns null when nothing resolves to an existing directory.
|
|
167
170
|
*/
|
|
168
171
|
export function resolveRepoSelection(repoArg, scanDirs) {
|
|
169
|
-
const existingScanDirs = scanDirs.filter((d) => existsSync(d));
|
|
170
|
-
const projects = existingScanDirs.length > 0 ? scanMultipleProjects(existingScanDirs) : [];
|
|
171
172
|
const isExplicitPath = repoArg.startsWith('/') ||
|
|
172
173
|
repoArg.startsWith('~') ||
|
|
173
174
|
repoArg.startsWith('.') ||
|
|
@@ -181,20 +182,9 @@ export function resolveRepoSelection(repoArg, scanDirs) {
|
|
|
181
182
|
candidates.push(resolve(d, repoArg));
|
|
182
183
|
candidates.push(resolve(expandHome(repoArg))); // daemon-cwd fallback (matches /cd)
|
|
183
184
|
}
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (proj)
|
|
188
|
-
return { path: proj.path, displayName: `${proj.name} (${proj.branch})` };
|
|
189
|
-
}
|
|
190
|
-
// 2) Bare name → match a scanned project by basename.
|
|
191
|
-
if (!isExplicitPath) {
|
|
192
|
-
const byName = projects.find((p) => p.name === repoArg);
|
|
193
|
-
if (byName)
|
|
194
|
-
return { path: byName.path, displayName: `${byName.name} (${byName.branch})` };
|
|
195
|
-
}
|
|
196
|
-
// 3) Lenient fallback: any existing directory. Label it with a git ref when
|
|
197
|
-
// it's a repo (covers explicit paths outside the scan roots), else basename.
|
|
185
|
+
// Direct candidates must win before any recursive scan. Besides avoiding
|
|
186
|
+
// unnecessary traversal (especially a legacy HOME fallback), describing just
|
|
187
|
+
// the selected directory preserves the same "name (branch)" label for repos.
|
|
198
188
|
for (const cand of candidates) {
|
|
199
189
|
try {
|
|
200
190
|
if (!statSync(cand).isDirectory())
|
|
@@ -208,6 +198,16 @@ export function resolveRepoSelection(repoArg, scanDirs) {
|
|
|
208
198
|
? { path: cand, displayName: `${desc.name} (${desc.branch})` }
|
|
209
199
|
: { path: cand, displayName: basename(cand) };
|
|
210
200
|
}
|
|
201
|
+
// Explicit and relative paths have no basename-search semantics: when their
|
|
202
|
+
// concrete candidates do not exist, a recursive project scan cannot resolve
|
|
203
|
+
// them. Bare names alone may refer to a repo nested below a scan root.
|
|
204
|
+
if (isExplicitPath)
|
|
205
|
+
return null;
|
|
206
|
+
const existingScanDirs = scanDirs.filter((d) => existsSync(d));
|
|
207
|
+
const projects = existingScanDirs.length > 0 ? scanMultipleProjects(existingScanDirs) : [];
|
|
208
|
+
const byName = projects.find((p) => p.name === repoArg);
|
|
209
|
+
if (byName)
|
|
210
|
+
return { path: byName.path, displayName: `${byName.name} (${byName.branch})` };
|
|
211
211
|
return null;
|
|
212
212
|
}
|
|
213
213
|
/**
|
|
@@ -1242,6 +1242,7 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
|
|
|
1242
1242
|
sessionId: ds.session.sessionId,
|
|
1243
1243
|
cliSessionId: ds.session.cliSessionId,
|
|
1244
1244
|
cwd: ds.session.workingDir,
|
|
1245
|
+
larkAppId: ds.larkAppId ?? ds.session.larkAppId,
|
|
1245
1246
|
}, { detail: 'summary' });
|
|
1246
1247
|
await sessionReply(rootId, formatInsightCard(report, loc));
|
|
1247
1248
|
break;
|
|
@@ -1394,6 +1395,11 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
|
|
|
1394
1395
|
const hasBufferedInput = pendingPrompt.trim().length > 0 ||
|
|
1395
1396
|
(ds.pendingAttachments?.length ?? 0) > 0 ||
|
|
1396
1397
|
(ds.pendingFollowUps?.length ?? 0) > 0;
|
|
1398
|
+
// Nothing to submit at all (bare `/repo`: the message IS the command).
|
|
1399
|
+
// The CLI boots idle, so the user's NEXT real message is its first
|
|
1400
|
+
// turn and must carry the full new-topic opening — see
|
|
1401
|
+
// markInitialUserTurnPending below.
|
|
1402
|
+
const emptyStart = !pendingRawInput && !hasBufferedInput;
|
|
1397
1403
|
if (hasBufferedInput)
|
|
1398
1404
|
ensureSessionWhiteboard(ds);
|
|
1399
1405
|
const wrappedInput = hasBufferedInput
|
|
@@ -1445,6 +1451,12 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
|
|
|
1445
1451
|
if (pendingRawInput || hasBufferedInput) {
|
|
1446
1452
|
rememberLastCliInput(ds, pendingRawInput ?? pendingPrompt, pendingRawInput ?? wrappedInput);
|
|
1447
1453
|
}
|
|
1454
|
+
// Durable, one-shot: the CLI is up but has never received a real user
|
|
1455
|
+
// turn, so the next business message must be built as a NEW TOPIC
|
|
1456
|
+
// (routing + built-in skill discovery + identity), not a follow-up.
|
|
1457
|
+
// Set after the fork so a throwing fork leaves the session untouched.
|
|
1458
|
+
if (emptyStart)
|
|
1459
|
+
markInitialUserTurnPending(ds);
|
|
1448
1460
|
ds.pendingPrompt = undefined;
|
|
1449
1461
|
ds.pendingCodexAppText = undefined;
|
|
1450
1462
|
ds.pendingCodexAppApplicationContext = undefined;
|
|
@@ -1557,6 +1569,10 @@ export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
|
|
|
1557
1569
|
sessionStore.updateSession(ds.session);
|
|
1558
1570
|
ds.hasHistory = false;
|
|
1559
1571
|
forkWorker(ds, '', false);
|
|
1572
|
+
// Brand-new CLI in a brand-new session record: it has never seen the
|
|
1573
|
+
// botmux opening context either, so the next real business message
|
|
1574
|
+
// is its new-topic first turn (same invariant as the pending path).
|
|
1575
|
+
markInitialUserTurnPending(ds);
|
|
1560
1576
|
try {
|
|
1561
1577
|
await sessionReply(rootId, t('cmd.repo.switched_to', { name: displayName }, loc));
|
|
1562
1578
|
}
|