botmux 2.85.0 → 2.86.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.
Files changed (153) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +22 -13
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/command-handler.d.ts.map +1 -1
  5. package/dist/core/command-handler.js +209 -1
  6. package/dist/core/command-handler.js.map +1 -1
  7. package/dist/core/cost-calculator.d.ts.map +1 -1
  8. package/dist/core/cost-calculator.js +7 -106
  9. package/dist/core/cost-calculator.js.map +1 -1
  10. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  11. package/dist/core/dashboard-ipc-server.js +240 -2
  12. package/dist/core/dashboard-ipc-server.js.map +1 -1
  13. package/dist/core/passthrough-commands.d.ts.map +1 -1
  14. package/dist/core/passthrough-commands.js +1 -1
  15. package/dist/core/passthrough-commands.js.map +1 -1
  16. package/dist/core/role-resolver.d.ts +1 -0
  17. package/dist/core/role-resolver.d.ts.map +1 -1
  18. package/dist/core/role-resolver.js +14 -0
  19. package/dist/core/role-resolver.js.map +1 -1
  20. package/dist/daemon.d.ts.map +1 -1
  21. package/dist/daemon.js +4 -1
  22. package/dist/daemon.js.map +1 -1
  23. package/dist/dashboard/bot-onboarding.d.ts +24 -8
  24. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  25. package/dist/dashboard/bot-onboarding.js +170 -49
  26. package/dist/dashboard/bot-onboarding.js.map +1 -1
  27. package/dist/dashboard/bot-payload.d.ts +43 -0
  28. package/dist/dashboard/bot-payload.d.ts.map +1 -0
  29. package/dist/dashboard/bot-payload.js +44 -0
  30. package/dist/dashboard/bot-payload.js.map +1 -0
  31. package/dist/dashboard/registry.d.ts +2 -0
  32. package/dist/dashboard/registry.d.ts.map +1 -1
  33. package/dist/dashboard/registry.js.map +1 -1
  34. package/dist/dashboard/web/app.d.ts.map +1 -1
  35. package/dist/dashboard/web/app.js +15 -4
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/bot-defaults.d.ts +1 -0
  38. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  39. package/dist/dashboard/web/bot-defaults.js +122 -3
  40. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  41. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  42. package/dist/dashboard/web/bot-onboarding.js +60 -4
  43. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  44. package/dist/dashboard/web/groups.d.ts +2 -0
  45. package/dist/dashboard/web/groups.d.ts.map +1 -1
  46. package/dist/dashboard/web/groups.js +419 -3
  47. package/dist/dashboard/web/groups.js.map +1 -1
  48. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  49. package/dist/dashboard/web/i18n.js +631 -3
  50. package/dist/dashboard/web/i18n.js.map +1 -1
  51. package/dist/dashboard/web/insights.d.ts +2 -0
  52. package/dist/dashboard/web/insights.d.ts.map +1 -0
  53. package/dist/dashboard/web/insights.js +1523 -0
  54. package/dist/dashboard/web/insights.js.map +1 -0
  55. package/dist/dashboard/web/overview.d.ts +22 -0
  56. package/dist/dashboard/web/overview.d.ts.map +1 -1
  57. package/dist/dashboard/web/overview.js +6 -1
  58. package/dist/dashboard/web/overview.js.map +1 -1
  59. package/dist/dashboard/web/role-profile-match.d.ts +31 -0
  60. package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
  61. package/dist/dashboard/web/role-profile-match.js +58 -0
  62. package/dist/dashboard/web/role-profile-match.js.map +1 -0
  63. package/dist/dashboard/web/roles.d.ts +1 -0
  64. package/dist/dashboard/web/roles.d.ts.map +1 -1
  65. package/dist/dashboard/web/roles.js +520 -27
  66. package/dist/dashboard/web/roles.js.map +1 -1
  67. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  68. package/dist/dashboard/web/sessions.js +84 -0
  69. package/dist/dashboard/web/sessions.js.map +1 -1
  70. package/dist/dashboard-web/app.js +1246 -823
  71. package/dist/dashboard-web/index.html +2 -1
  72. package/dist/dashboard-web/style.css +1085 -3
  73. package/dist/dashboard.js +273 -39
  74. package/dist/dashboard.js.map +1 -1
  75. package/dist/i18n/en.d.ts.map +1 -1
  76. package/dist/i18n/en.js +34 -1
  77. package/dist/i18n/en.js.map +1 -1
  78. package/dist/i18n/zh.d.ts.map +1 -1
  79. package/dist/i18n/zh.js +34 -1
  80. package/dist/i18n/zh.js.map +1 -1
  81. package/dist/im/lark/client.d.ts.map +1 -1
  82. package/dist/im/lark/client.js +23 -1
  83. package/dist/im/lark/client.js.map +1 -1
  84. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  85. package/dist/im/lark/event-dispatcher.js +16 -9
  86. package/dist/im/lark/event-dispatcher.js.map +1 -1
  87. package/dist/services/group-creator.d.ts +6 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +54 -5
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
  92. package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
  93. package/dist/services/insight/antigravity-span-reader.js +249 -0
  94. package/dist/services/insight/antigravity-span-reader.js.map +1 -0
  95. package/dist/services/insight/classify.d.ts +7 -0
  96. package/dist/services/insight/classify.d.ts.map +1 -0
  97. package/dist/services/insight/classify.js +46 -0
  98. package/dist/services/insight/classify.js.map +1 -0
  99. package/dist/services/insight/claude-span-reader.d.ts +3 -0
  100. package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
  101. package/dist/services/insight/claude-span-reader.js +257 -0
  102. package/dist/services/insight/claude-span-reader.js.map +1 -0
  103. package/dist/services/insight/codex-span-reader.d.ts +3 -0
  104. package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
  105. package/dist/services/insight/codex-span-reader.js +290 -0
  106. package/dist/services/insight/codex-span-reader.js.map +1 -0
  107. package/dist/services/insight/intent.d.ts +5 -0
  108. package/dist/services/insight/intent.d.ts.map +1 -0
  109. package/dist/services/insight/intent.js +145 -0
  110. package/dist/services/insight/intent.js.map +1 -0
  111. package/dist/services/insight/jsonl.d.ts +10 -0
  112. package/dist/services/insight/jsonl.d.ts.map +1 -0
  113. package/dist/services/insight/jsonl.js +36 -0
  114. package/dist/services/insight/jsonl.js.map +1 -0
  115. package/dist/services/insight/prompt.d.ts +3 -0
  116. package/dist/services/insight/prompt.d.ts.map +1 -0
  117. package/dist/services/insight/prompt.js +99 -0
  118. package/dist/services/insight/prompt.js.map +1 -0
  119. package/dist/services/insight/redact.d.ts +4 -0
  120. package/dist/services/insight/redact.d.ts.map +1 -0
  121. package/dist/services/insight/redact.js +67 -0
  122. package/dist/services/insight/redact.js.map +1 -0
  123. package/dist/services/insight/report.d.ts +29 -0
  124. package/dist/services/insight/report.d.ts.map +1 -0
  125. package/dist/services/insight/report.js +1126 -0
  126. package/dist/services/insight/report.js.map +1 -0
  127. package/dist/services/insight/safe-detail.d.ts +5 -0
  128. package/dist/services/insight/safe-detail.d.ts.map +1 -0
  129. package/dist/services/insight/safe-detail.js +59 -0
  130. package/dist/services/insight/safe-detail.js.map +1 -0
  131. package/dist/services/insight/scrub.d.ts +22 -0
  132. package/dist/services/insight/scrub.d.ts.map +1 -0
  133. package/dist/services/insight/scrub.js +70 -0
  134. package/dist/services/insight/scrub.js.map +1 -0
  135. package/dist/services/insight/types.d.ts +394 -0
  136. package/dist/services/insight/types.d.ts.map +1 -0
  137. package/dist/services/insight/types.js +2 -0
  138. package/dist/services/insight/types.js.map +1 -0
  139. package/dist/services/role-profile-store.d.ts +25 -0
  140. package/dist/services/role-profile-store.d.ts.map +1 -0
  141. package/dist/services/role-profile-store.js +171 -0
  142. package/dist/services/role-profile-store.js.map +1 -0
  143. package/dist/services/transcript-resolver.d.ts +26 -0
  144. package/dist/services/transcript-resolver.d.ts.map +1 -0
  145. package/dist/services/transcript-resolver.js +111 -0
  146. package/dist/services/transcript-resolver.js.map +1 -0
  147. package/dist/setup/cli-selection.d.ts +20 -1
  148. package/dist/setup/cli-selection.d.ts.map +1 -1
  149. package/dist/setup/cli-selection.js +45 -5
  150. package/dist/setup/cli-selection.js.map +1 -1
  151. package/dist/worker.js +10 -1
  152. package/dist/worker.js.map +1 -1
  153. package/package.json +1 -1
@@ -2,27 +2,12 @@
2
2
  * Session cost calculator — computes token usage from JSONL logs.
3
3
  */
4
4
  import { closeSync, existsSync, openSync, readFileSync, readSync, statSync } from 'node:fs';
5
- import { join, resolve } from 'node:path';
6
- import { homedir } from 'node:os';
7
5
  import { logger } from '../utils/logger.js';
8
- import { expandHome } from './working-dir.js';
9
- import { createCliAdapterSync } from '../adapters/cli/registry.js';
10
6
  import { findAidenLatestCheckpointByBotmuxSessionId, findAidenLatestCheckpointBySessionId } from '../services/aiden-checkpoints.js';
11
- import { findCodexRolloutBySessionId, findCodexSessionIdByBotmuxSessionId } from '../services/codex-transcript.js';
12
- import { cocoEventsPathForSession } from '../services/coco-transcript.js';
13
- import { findCursorTranscriptByChatId } from '../services/cursor-transcript.js';
14
- import { findTraexRolloutBySessionId } from '../services/traex-transcript.js';
7
+ import { __resetTranscriptResolverCacheForTest, cachedTranscriptPathLookup, resolveSessionTranscriptPath, } from '../services/transcript-resolver.js';
15
8
  // ─── Helpers ─────────────────────────────────────────────────────────────────
16
9
  export function getSessionJsonlPath(sessionId, cwd) {
17
- return getClaudeSessionJsonlPath(sessionId, cwd, join(homedir(), '.claude'));
18
- }
19
- function getClaudeSessionJsonlPath(sessionId, cwd, dataDir) {
20
- const resolvedCwd = resolve(expandHome(cwd));
21
- // Claude stores sessions at ~/.claude/projects/<project-key>/<sessionId>.jsonl
22
- // where project-key = absolute path with non [A-Za-z0-9-] chars replaced by -
23
- const projectKey = resolvedCwd.replace(/[^A-Za-z0-9-]/g, '-');
24
- const jsonlPath = join(dataDir, 'projects', projectKey, `${sessionId}.jsonl`);
25
- return existsSync(jsonlPath) ? jsonlPath : null;
10
+ return resolveSessionTranscriptPath({ cliId: 'claude-code', sessionId, cwd })?.path ?? null;
26
11
  }
27
12
  export function getSessionCost(sessionId, cwd) {
28
13
  const jsonlPath = getSessionJsonlPath(sessionId, cwd);
@@ -244,45 +229,12 @@ const USAGE_FILE_CACHE_MAX_ENTRIES = 512;
244
229
  /** While a transcript keeps changing, serve the cached value and reparse at
245
230
  * most once per interval — keeps row composition off the disk. */
246
231
  const USAGE_REPARSE_MIN_INTERVAL_MS = 15_000;
247
- const sessionPathCache = new Map();
248
- const SESSION_PATH_CACHE_MAX_ENTRIES = 1024;
249
- /** A missed lookup (transcript not on disk yet) is retried only after this
250
- * window — fresh sessions otherwise trigger a directory scan per row render. */
251
- const PATH_MISS_RETRY_MS = 30_000;
252
232
  /** Aiden checkpoint paths move as the session progresses (latest.json points
253
233
  * at a new checkpoint id per turn), so positive hits expire quickly too. */
254
234
  const AIDEN_PATH_HIT_TTL_MS = 15_000;
255
235
  export function __resetSessionUsageCachesForTest() {
256
236
  usageFileCache.clear();
257
- sessionPathCache.clear();
258
- }
259
- /** Memoize a transcript-path lookup. `hitTtlMs === null` means a found path
260
- * is trusted forever (rollout/transcript files never move); misses are
261
- * retried after PATH_MISS_RETRY_MS — or immediately when `retryMiss` is set
262
- * (ledger reads must see lazily created transcripts at turn boundaries).
263
- * `refreshHit` additionally re-resolves a cached positive hit — for sources
264
- * whose path MOVES between turns (aiden checkpoints), a fresh ledger read
265
- * must not settle for a stale path inside the hit TTL. */
266
- function cachedPathLookup(key, hitTtlMs, lookup, opts) {
267
- const now = Date.now();
268
- const cached = sessionPathCache.get(key);
269
- if (cached) {
270
- if (cached.path !== null) {
271
- if (!opts?.refreshHit && (hitTtlMs === null || now - cached.atMs < hitTtlMs))
272
- return cached.path;
273
- }
274
- else if (!opts?.retryMiss && now - cached.atMs < PATH_MISS_RETRY_MS) {
275
- return null;
276
- }
277
- }
278
- if (sessionPathCache.size >= SESSION_PATH_CACHE_MAX_ENTRIES && !sessionPathCache.has(key)) {
279
- const oldest = sessionPathCache.keys().next().value;
280
- if (oldest !== undefined)
281
- sessionPathCache.delete(oldest);
282
- }
283
- const path = lookup();
284
- sessionPathCache.set(key, { path, atMs: now });
285
- return path;
237
+ __resetTranscriptResolverCacheForTest();
286
238
  }
287
239
  function cloneAggregate(agg) {
288
240
  return { ...agg };
@@ -472,71 +424,20 @@ function readTokenUsageFromAidenCheckpoint(path) {
472
424
  turns,
473
425
  };
474
426
  }
475
- /** Resolve a Claude-family fork's (seed / relay) data root EXACTLY as the worker
476
- * does, so usage reads hit the same transcript the CLI wrote. The adapter
477
- * derives the root per-fork (seed → `<pkg>/.claude-runtime`; relay → `~/.relay`,
478
- * see deriveSeedDataDir / deriveRelayDataDir) and the worker spawns the CLI
479
- * with `spawnEnv = { CLAUDE_CONFIG_DIR: <that root> }`, which *overrides* any
480
- * inherited env (worker.ts: process.env first, then adapter.spawnEnv). So a
481
- * botmux-spawned seed/relay ALWAYS writes to the adapter-derived root —
482
- * regardless of whether the daemon itself has CLAUDE_CONFIG_DIR set. We must
483
- * read from the same place; consulting the daemon's own env (the old
484
- * `process.env.CLAUDE_CONFIG_DIR || ~/.claude-runtime`) would diverge from
485
- * where the CLI actually wrote. `claudeDataDir` is the single source of truth.
486
- * Cached so the dashboard read path doesn't shell out (`which`) per refresh.
487
- *
488
- * Uses the DEFAULT binary (no per-bot cliPathOverride); a custom path would
489
- * resolve a different root, but that narrow case was already unsupported here. */
490
- const claudeForkDataDirCache = new Map();
491
- function claudeForkDataDir(cliId) {
492
- const cached = claudeForkDataDirCache.get(cliId);
493
- if (cached)
494
- return cached;
495
- const dir = createCliAdapterSync(cliId).claudeDataDir ?? join(homedir(), '.claude-runtime');
496
- claudeForkDataDirCache.set(cliId, dir);
497
- return dir;
498
- }
499
- function tokenUsagePathForSession(q) {
500
- const sid = q.cliSessionId || q.sessionId;
501
- switch (q.cliId) {
502
- case 'claude-code':
503
- return q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, join(homedir(), '.claude')) : null;
504
- case 'seed':
505
- case 'relay':
506
- return q.cwd ? getClaudeSessionJsonlPath(sid, q.cwd, claudeForkDataDir(q.cliId)) : null;
507
- case 'codex':
508
- return cachedPathLookup(`codex:${q.sessionId}:${q.cliSessionId ?? ''}`, null, () => {
509
- const codexSid = q.cliSessionId || findCodexSessionIdByBotmuxSessionId(q.sessionId) || q.sessionId;
510
- return findCodexRolloutBySessionId(codexSid) ?? null;
511
- }, { retryMiss: q.fresh });
512
- case 'coco':
513
- return cocoEventsPathForSession(sid);
514
- case 'cursor':
515
- return cachedPathLookup(`cursor:${sid}`, null, () => findCursorTranscriptByChatId(sid) ?? null, { retryMiss: q.fresh });
516
- case 'traex':
517
- return cachedPathLookup(`traex:${sid}`, null, () => findTraexRolloutBySessionId(sid) ?? null, { retryMiss: q.fresh });
518
- case 'antigravity':
519
- return q.cliSessionId
520
- ? join(homedir(), '.gemini', 'antigravity-cli', 'brain', q.cliSessionId, '.system_generated', 'logs', 'transcript.jsonl')
521
- : null;
522
- default:
523
- return null;
524
- }
525
- }
526
427
  export function getSessionTokenUsage(q) {
527
428
  if (q.cliId === 'aiden') {
528
429
  const sid = q.cliSessionId || q.sessionId;
529
- const checkpointPath = cachedPathLookup(`aiden:${q.sessionId}:${sid}:${q.cwd ?? ''}`, AIDEN_PATH_HIT_TTL_MS, () => findAidenLatestCheckpointBySessionId(sid, undefined, q.cwd) ??
430
+ const checkpointPath = cachedTranscriptPathLookup(`aiden:${q.sessionId}:${sid}:${q.cwd ?? ''}`, AIDEN_PATH_HIT_TTL_MS, () => findAidenLatestCheckpointBySessionId(sid, undefined, q.cwd) ??
530
431
  findAidenLatestCheckpointByBotmuxSessionId(q.sessionId, undefined, q.cwd) ??
531
432
  null, { retryMiss: q.fresh, refreshHit: q.fresh });
532
433
  if (!checkpointPath || !existsSync(checkpointPath))
533
434
  return null;
534
435
  return readSessionTokenUsageFile(checkpointPath, 'aiden', { fresh: q.fresh });
535
436
  }
536
- const path = tokenUsagePathForSession(q);
537
- if (!path || !existsSync(path))
437
+ const resolved = resolveSessionTranscriptPath(q);
438
+ if (!resolved || !existsSync(resolved.path))
538
439
  return null;
539
- return readSessionTokenUsageFile(path, usageKindForCli(q.cliId), { fresh: q.fresh });
440
+ return readSessionTokenUsageFile(resolved.path, usageKindForCli(q.cliId), { fresh: q.fresh });
540
441
  }
541
442
  export function formatNumber(n) {
542
443
  return n.toLocaleString('en-US');
@@ -1 +1 @@
1
- {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../../src/core/cost-calculator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../../src/core/cost-calculator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAe,MAAM,WAAW,CAAC;AAyCjG,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM/E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAE3F;AACD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EAIpB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAiB,cAAc,EAAW,MAAM,aAAa,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAW1B,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAM7E;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGhF;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAKhF;AAiBD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAgC;AAyB7F,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;AAMtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AAKxE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAA0B;AAsbxE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB;AAqoBD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAiC7F"}
1
+ {"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAe,MAAM,WAAW,CAAC;AAqDjG,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM/E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAE3F;AACD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EAIpB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAiB,cAAc,EAAW,MAAM,aAAa,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAW1B,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAM7E;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGhF;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAKhF;AAiBD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAgC;AAyB7F,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;AAMtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AAKxE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAA0B;AAwhBxE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB;AAuvBD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAiC7F"}
@@ -20,6 +20,7 @@ import * as grantPrefsStore from '../services/grant-prefs-store.js';
20
20
  import { findConfigField, applyConfigField, coerceConfigValue } from '../services/bot-config-store.js';
21
21
  import { config } from '../config.js';
22
22
  import { computeSandboxDiff, applySandboxDiff } from '../services/sandbox-land.js';
23
+ import { buildSafeInsightConversation, buildSafeInsightOverview, buildSafeInsightReport, buildSafeInsightTurnDetail } from '../services/insight/report.js';
23
24
  import { readRawConfig, findEntryIndex, requireConfigPath } from '../services/config-store.js';
24
25
  import { setDefaultLocale, localeForBot, t } from '../i18n/index.js';
25
26
  import { isLocale } from '../i18n/types.js';
@@ -37,7 +38,8 @@ import { locateLimiter } from './dashboard-locate.js';
37
38
  import { buildTerminalUrl } from './terminal-url.js';
38
39
  import { dashboardEventBus } from './dashboard-events.js';
39
40
  import { validateWorkingDir } from './working-dir.js';
40
- import { resolveRoleFile, writeRoleFile, deleteRoleFile } from './role-resolver.js';
41
+ import { isValidRoleChatId, resolveRole, resolveRoleFile, writeRoleFile, deleteRoleFile } from './role-resolver.js';
42
+ import { deleteRoleProfileEntry, deleteRoleProfileIfEmpty, isValidRoleProfileId, listRoleProfileEntries, listRoleProfiles, MAX_ROLE_PROFILE_ENTRY_BYTES, readRoleProfileEntry, writeRoleProfileEntry, } from '../services/role-profile-store.js';
41
43
  import { triggerSessionTurn } from './trigger-session.js';
42
44
  import { triggerWorkflowFromEnvelope } from '../workflows/trigger-from-envelope.js';
43
45
  import { validateTriggerRequest } from '../services/trigger-types.js';
@@ -231,6 +233,105 @@ ipcRoute('GET', '/api/sessions/:sessionId/history', async (req, res, params) =>
231
233
  jsonRes(res, 502, { ok: false, error: String(err?.message ?? err) });
232
234
  }
233
235
  });
236
+ // 会话 insight:只读解析本会话的 transcript,产出动作 span / 失败聚合 / 规则建议
237
+ // (SafeInsightReport)。底层 services/insight 已做 fail-closed 脱敏投影——raw 命令
238
+ // 与输出永不进结构。detail=summary 只返聚合+建议(/insight 卡片、抽屉概览用);
239
+ // detail=spans 才带脱敏 span(详情 tab 用)。owner-only 由 dashboard 外层 authed-only
240
+ // 路由 + /insight 命令层把关,IPC 自身 loopback-trusted。
241
+ ipcRoute('GET', '/api/sessions/:sessionId/insight', (req, res, params) => {
242
+ const session = findSessionRecord(params.sessionId);
243
+ if (!session)
244
+ return jsonRes(res, 404, { ok: false, error: 'session_not_found' });
245
+ const url = new URL(req.url ?? '/', 'http://localhost');
246
+ if (url.searchParams.get('detail') === 'conversation') {
247
+ const offset = parseInt(url.searchParams.get('offset') ?? '0', 10) || 0;
248
+ const limit = parseInt(url.searchParams.get('limit') ?? '50', 10) || 50;
249
+ const role = url.searchParams.get('role');
250
+ const severity = url.searchParams.get('severity');
251
+ const tag = url.searchParams.get('tag');
252
+ const turnIndexes = url.searchParams.getAll('turnIndexes')
253
+ .flatMap(v => v.split(','))
254
+ .map(v => parseInt(v, 10))
255
+ .filter(Number.isFinite);
256
+ const conversation = buildSafeInsightConversation({
257
+ cliId: session.cliId ?? 'unknown',
258
+ sessionId: session.sessionId,
259
+ cliSessionId: session.cliSessionId,
260
+ cwd: session.workingDir,
261
+ }, {
262
+ offset,
263
+ limit,
264
+ q: url.searchParams.get('q') ?? undefined,
265
+ role: role && ['user', 'a2a_agent', 'system', 'agent'].includes(role) ? role : undefined,
266
+ severity: severity && ['bad', 'warn', 'info'].includes(severity) ? severity : undefined,
267
+ tag: tag && ['failure', 'slow', 'retry', 'read_write_imbalance', 'diagnostic', 'normal'].includes(tag) ? tag : undefined,
268
+ turnIndexes: turnIndexes.length ? turnIndexes : undefined,
269
+ });
270
+ return jsonRes(res, 200, { ok: true, conversation });
271
+ }
272
+ const detail = url.searchParams.get('detail') === 'spans' ? 'spans' : 'summary';
273
+ try {
274
+ const report = buildSafeInsightReport({
275
+ cliId: session.cliId ?? 'unknown',
276
+ sessionId: session.sessionId,
277
+ cliSessionId: session.cliSessionId,
278
+ cwd: session.workingDir,
279
+ }, { detail });
280
+ jsonRes(res, 200, { ok: true, report });
281
+ }
282
+ catch (err) {
283
+ jsonRes(res, 500, { ok: false, error: String(err?.message ?? err) });
284
+ }
285
+ });
286
+ ipcRoute('GET', '/api/sessions/:sessionId/insight/turn/:turnIndex', (req, res, params) => {
287
+ const session = findSessionRecord(params.sessionId);
288
+ if (!session)
289
+ return jsonRes(res, 404, { ok: false, error: 'session_not_found' });
290
+ const url = new URL(req.url ?? '/', 'http://localhost');
291
+ const offset = parseInt(url.searchParams.get('offset') ?? '0', 10) || 0;
292
+ const limit = parseInt(url.searchParams.get('limit') ?? '4000', 10) || 4000;
293
+ try {
294
+ const turn = buildSafeInsightTurnDetail({
295
+ cliId: session.cliId ?? 'unknown',
296
+ sessionId: session.sessionId,
297
+ cliSessionId: session.cliSessionId,
298
+ cwd: session.workingDir,
299
+ }, parseInt(params.turnIndex, 10) || 0, { offset, limit });
300
+ jsonRes(res, 200, { ok: true, turn });
301
+ }
302
+ catch (err) {
303
+ jsonRes(res, 500, { ok: false, error: String(err?.message ?? err) });
304
+ }
305
+ });
306
+ // 跨会话 insight 总览:仍然只读、按需、owner-only(外层 dashboard route
307
+ // 不在 public-read 白名单)。只聚合本 daemon registry 里的 botmux 会话;
308
+ // 不扫整机 transcript,不返回 raw span/input/output。
309
+ ipcRoute('GET', '/api/insights/summary', async (req, res) => {
310
+ const url = new URL(req.url ?? '/', 'http://localhost');
311
+ const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') ?? '200', 10) || 200, 1), 500);
312
+ const active = listActiveSessions().map(composeRowFromActive);
313
+ const activeIds = new Set(active.map(r => r.sessionId));
314
+ const closed = sessionStore.listSessions()
315
+ .filter(s => s.status === 'closed' && !activeIds.has(s.sessionId))
316
+ .map(composeRowFromClosed);
317
+ const rows = [...active, ...closed];
318
+ const overview = await buildSafeInsightOverview(rows.map(row => {
319
+ const session = findSessionRecord(row.sessionId);
320
+ return {
321
+ cliId: row.cliId,
322
+ sessionId: row.sessionId,
323
+ cliSessionId: session?.cliSessionId,
324
+ cwd: row.workingDir,
325
+ workingDir: row.workingDir,
326
+ title: row.title,
327
+ botName: row.botName,
328
+ larkAppId: row.larkAppId,
329
+ status: row.status,
330
+ lastMessageAt: row.lastMessageAt,
331
+ };
332
+ }), { limit });
333
+ jsonRes(res, 200, { ok: true, overview });
334
+ });
234
335
  // 部署 owner 的资料(名字 + 头像)——dashboard 左上角和历史弹窗展示「我」。
235
336
  // owner 身份来自 deployment identity(ownerUnionId),头像经 contact API 查询
236
337
  // (带缓存);未绑定 owner 或查不到时回退名字/null。
@@ -753,23 +854,32 @@ ipcRoute('DELETE', '/api/oncall/:chatId', async (_req, res, p) => {
753
854
  jsonRes(res, 200, { ok: true, wasBound: r.wasBound });
754
855
  });
755
856
  // ─── Role management (dashboard) ───────────────────────────────────────────
756
- // GET /api/roles/:chatId → { chatId, content, byteLength }
857
+ // GET /api/roles/:chatId → { chatId, content, byteLength, effectiveContent, effectiveSource }
757
858
  // PUT /api/roles/:chatId body: {content} → write role file
758
859
  // DELETE /api/roles/:chatId → remove role file
759
860
  ipcRoute('GET', '/api/roles/:chatId', async (_req, res, p) => {
760
861
  if (!cachedLarkAppId)
761
862
  return jsonRes(res, 503, { error: 'larkAppId_not_set' });
863
+ if (!isValidRoleChatId(p.chatId))
864
+ return jsonRes(res, 400, { ok: false, error: 'invalid_chat_id' });
762
865
  const content = resolveRoleFile(cachedLarkAppId, p.chatId);
866
+ const effective = resolveRole(cachedLarkAppId, p.chatId);
763
867
  jsonRes(res, 200, {
764
868
  chatId: p.chatId,
765
869
  content,
766
870
  byteLength: content ? Buffer.byteLength(content, 'utf-8') : 0,
767
871
  hasRole: content !== null,
872
+ effectiveContent: effective.content,
873
+ effectiveSource: effective.source,
874
+ effectiveByteLength: effective.content ? Buffer.byteLength(effective.content, 'utf-8') : 0,
875
+ hasEffectiveRole: effective.content !== null,
768
876
  });
769
877
  });
770
878
  ipcRoute('PUT', '/api/roles/:chatId', async (req, res, p) => {
771
879
  if (!cachedLarkAppId)
772
880
  return jsonRes(res, 503, { error: 'larkAppId_not_set' });
881
+ if (!isValidRoleChatId(p.chatId))
882
+ return jsonRes(res, 400, { ok: false, error: 'invalid_chat_id' });
773
883
  let body;
774
884
  try {
775
885
  body = await readJsonBody(req);
@@ -791,9 +901,130 @@ ipcRoute('PUT', '/api/roles/:chatId', async (req, res, p) => {
791
901
  ipcRoute('DELETE', '/api/roles/:chatId', async (_req, res, p) => {
792
902
  if (!cachedLarkAppId)
793
903
  return jsonRes(res, 503, { error: 'larkAppId_not_set' });
904
+ if (!isValidRoleChatId(p.chatId))
905
+ return jsonRes(res, 400, { ok: false, error: 'invalid_chat_id' });
794
906
  const existed = deleteRoleFile(cachedLarkAppId, p.chatId);
795
907
  jsonRes(res, 200, { ok: true, existed });
796
908
  });
909
+ // ─── Role profile management (dashboard) ──────────────────────────────────
910
+ // Profiles are authoring/storage helpers only; applying one writes this bot's
911
+ // entry into the selected chat role and does not alter runtime role layering.
912
+ ipcRoute('GET', '/api/role-profiles', async (_req, res) => {
913
+ if (!cachedLarkAppId)
914
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
915
+ const profiles = listRoleProfiles(config.session.dataDir).map(p => ({
916
+ ...p,
917
+ hasCurrentBotEntry: readRoleProfileEntry(config.session.dataDir, p.profileId, cachedLarkAppId) !== null,
918
+ }));
919
+ jsonRes(res, 200, { profiles, larkAppId: cachedLarkAppId });
920
+ });
921
+ ipcRoute('GET', '/api/role-profiles/:profileId', async (_req, res, p) => {
922
+ if (!cachedLarkAppId)
923
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
924
+ if (!isValidRoleProfileId(p.profileId))
925
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
926
+ const entries = listRoleProfileEntries(config.session.dataDir, p.profileId);
927
+ jsonRes(res, 200, { profileId: p.profileId, entries });
928
+ });
929
+ ipcRoute('GET', '/api/role-profiles/:profileId/:larkAppId', async (_req, res, p) => {
930
+ if (!cachedLarkAppId)
931
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
932
+ if (p.larkAppId !== cachedLarkAppId)
933
+ return jsonRes(res, 403, { ok: false, error: 'wrong_daemon' });
934
+ if (!isValidRoleProfileId(p.profileId))
935
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
936
+ const content = readRoleProfileEntry(config.session.dataDir, p.profileId, cachedLarkAppId);
937
+ jsonRes(res, 200, {
938
+ profileId: p.profileId,
939
+ larkAppId: cachedLarkAppId,
940
+ content,
941
+ byteLength: content ? Buffer.byteLength(content, 'utf-8') : 0,
942
+ hasEntry: content !== null,
943
+ });
944
+ });
945
+ ipcRoute('PUT', '/api/role-profiles/:profileId/:larkAppId', async (req, res, p) => {
946
+ if (!cachedLarkAppId)
947
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
948
+ if (p.larkAppId !== cachedLarkAppId)
949
+ return jsonRes(res, 403, { ok: false, error: 'wrong_daemon' });
950
+ if (!isValidRoleProfileId(p.profileId))
951
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
952
+ let body;
953
+ try {
954
+ body = await readJsonBody(req);
955
+ }
956
+ catch {
957
+ return jsonRes(res, 400, { ok: false, error: 'bad_json' });
958
+ }
959
+ const content = typeof body.content === 'string' ? body.content.trim() : '';
960
+ const allowEmpty = body.allowEmpty === true;
961
+ if (!content && !allowEmpty)
962
+ return jsonRes(res, 400, { ok: false, error: 'content_required' });
963
+ try {
964
+ writeRoleProfileEntry(config.session.dataDir, p.profileId, cachedLarkAppId, content, { allowEmpty });
965
+ jsonRes(res, 200, { ok: true, byteLength: Math.min(Buffer.byteLength(content, 'utf-8'), MAX_ROLE_PROFILE_ENTRY_BYTES) });
966
+ }
967
+ catch (e) {
968
+ jsonRes(res, 500, { ok: false, error: String(e) });
969
+ }
970
+ });
971
+ ipcRoute('DELETE', '/api/role-profiles/:profileId/:larkAppId', async (_req, res, p) => {
972
+ if (!cachedLarkAppId)
973
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
974
+ if (p.larkAppId !== cachedLarkAppId)
975
+ return jsonRes(res, 403, { ok: false, error: 'wrong_daemon' });
976
+ if (!isValidRoleProfileId(p.profileId))
977
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
978
+ const existed = deleteRoleProfileEntry(config.session.dataDir, p.profileId, cachedLarkAppId);
979
+ deleteRoleProfileIfEmpty(config.session.dataDir, p.profileId);
980
+ jsonRes(res, 200, { ok: true, existed });
981
+ });
982
+ ipcRoute('POST', '/api/role-profiles/:profileId/apply', async (req, res, p) => {
983
+ if (!cachedLarkAppId)
984
+ return jsonRes(res, 503, { error: 'larkAppId_not_set' });
985
+ if (!isValidRoleProfileId(p.profileId))
986
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
987
+ let body;
988
+ try {
989
+ body = await readJsonBody(req);
990
+ }
991
+ catch {
992
+ return jsonRes(res, 400, { ok: false, error: 'bad_json' });
993
+ }
994
+ const chatId = typeof body.chatId === 'string' && body.chatId.trim() ? body.chatId.trim() : '';
995
+ const larkAppId = typeof body.larkAppId === 'string' && body.larkAppId.trim() ? body.larkAppId.trim() : '';
996
+ if (!chatId || !larkAppId)
997
+ return jsonRes(res, 400, { ok: false, error: 'chatId_and_larkAppId_required' });
998
+ if (!isValidRoleChatId(chatId))
999
+ return jsonRes(res, 400, { ok: false, error: 'invalid_chat_id' });
1000
+ if (larkAppId !== cachedLarkAppId)
1001
+ return jsonRes(res, 403, { ok: false, error: 'wrong_daemon' });
1002
+ const content = readRoleProfileEntry(config.session.dataDir, p.profileId, cachedLarkAppId);
1003
+ if (content === null)
1004
+ return jsonRes(res, 200, { ok: false, error: 'missing_entry', changed: false });
1005
+ const existing = resolveRoleFile(cachedLarkAppId, chatId);
1006
+ const preview = body.preview === true;
1007
+ const force = body.force === true;
1008
+ if (preview) {
1009
+ return jsonRes(res, 200, {
1010
+ ok: true,
1011
+ preview: true,
1012
+ changed: false,
1013
+ wouldOverwrite: existing !== null,
1014
+ wouldRefuse: existing !== null && !force,
1015
+ content,
1016
+ byteLength: Buffer.byteLength(content, 'utf-8'),
1017
+ });
1018
+ }
1019
+ if (existing && !force)
1020
+ return jsonRes(res, 409, { ok: false, error: 'chat_role_exists', changed: false });
1021
+ if (!content) {
1022
+ const existed = deleteRoleFile(cachedLarkAppId, chatId);
1023
+ return jsonRes(res, 200, { ok: true, changed: existed, byteLength: 0, deleted: existed });
1024
+ }
1025
+ writeRoleFile(cachedLarkAppId, chatId, content);
1026
+ jsonRes(res, 200, { ok: true, changed: true, byteLength: Buffer.byteLength(content, 'utf-8') });
1027
+ });
797
1028
  // ─── Per-bot defaultOncall (dashboard) ─────────────────────────────────────
798
1029
  // GET /api/bot-default-oncall → returns this daemon's current config
799
1030
  // PUT /api/bot-default-oncall body: { enabled, workingDir }
@@ -1219,6 +1450,12 @@ ipcRoute('POST', '/api/groups/create', async (req, res) => {
1219
1450
  const notifyTo = typeof body.notifyOwnerOpenId === 'string' && body.notifyOwnerOpenId.trim()
1220
1451
  ? body.notifyOwnerOpenId.trim()
1221
1452
  : null;
1453
+ const roleProfileId = typeof body.roleProfileId === 'string' && body.roleProfileId.trim()
1454
+ ? body.roleProfileId.trim()
1455
+ : null;
1456
+ if (roleProfileId && !isValidRoleProfileId(roleProfileId)) {
1457
+ return jsonRes(res, 400, { ok: false, error: 'invalid_role_profile_id' });
1458
+ }
1222
1459
  const bindWorkingDir = typeof body.bindWorkingDir === 'string' ? body.bindWorkingDir.trim() : '';
1223
1460
  let bindResolvedPath;
1224
1461
  if (bindWorkingDir) {
@@ -1237,6 +1474,7 @@ ipcRoute('POST', '/api/groups/create', async (req, res) => {
1237
1474
  transferOwnerTo: transferTo ?? undefined,
1238
1475
  notifyOwnerOpenId: notifyTo ?? undefined,
1239
1476
  bindWorkingDir: bindWorkingDir || undefined,
1477
+ roleProfileId: roleProfileId ?? undefined,
1240
1478
  });
1241
1479
  jsonRes(res, 200, bindResolvedPath ? { ...r, bindResolvedPath } : r);
1242
1480
  }