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.
Files changed (169) hide show
  1. package/README.en.md +1 -0
  2. package/README.md +1 -0
  3. package/dist/adapters/cli/codex.d.ts.map +1 -1
  4. package/dist/adapters/cli/codex.js +13 -1
  5. package/dist/adapters/cli/codex.js.map +1 -1
  6. package/dist/adapters/cli/traex.d.ts.map +1 -1
  7. package/dist/adapters/cli/traex.js +11 -1
  8. package/dist/adapters/cli/traex.js.map +1 -1
  9. package/dist/adapters/cli/types.d.ts +6 -0
  10. package/dist/adapters/cli/types.d.ts.map +1 -1
  11. package/dist/bot-registry.d.ts +7 -0
  12. package/dist/bot-registry.d.ts.map +1 -1
  13. package/dist/bot-registry.js +1 -0
  14. package/dist/bot-registry.js.map +1 -1
  15. package/dist/cli/daemon-lifecycle-env.d.ts +11 -0
  16. package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -0
  17. package/dist/cli/daemon-lifecycle-env.js +25 -0
  18. package/dist/cli/daemon-lifecycle-env.js.map +1 -0
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +11 -4
  21. package/dist/cli.js.map +1 -1
  22. package/dist/codex-rpc-engine.d.ts +110 -0
  23. package/dist/codex-rpc-engine.d.ts.map +1 -0
  24. package/dist/codex-rpc-engine.js +496 -0
  25. package/dist/codex-rpc-engine.js.map +1 -0
  26. package/dist/codex-rpc-lifecycle.d.ts +157 -0
  27. package/dist/codex-rpc-lifecycle.d.ts.map +1 -0
  28. package/dist/codex-rpc-lifecycle.js +210 -0
  29. package/dist/codex-rpc-lifecycle.js.map +1 -0
  30. package/dist/config.d.ts +1 -0
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +14 -2
  33. package/dist/config.js.map +1 -1
  34. package/dist/core/attachment-path.d.ts +3 -0
  35. package/dist/core/attachment-path.d.ts.map +1 -0
  36. package/dist/core/attachment-path.js +8 -0
  37. package/dist/core/attachment-path.js.map +1 -0
  38. package/dist/core/command-handler.d.ts.map +1 -1
  39. package/dist/core/command-handler.js +6 -1
  40. package/dist/core/command-handler.js.map +1 -1
  41. package/dist/core/dashboard-images.d.ts +29 -0
  42. package/dist/core/dashboard-images.d.ts.map +1 -0
  43. package/dist/core/dashboard-images.js +113 -0
  44. package/dist/core/dashboard-images.js.map +1 -0
  45. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  46. package/dist/core/dashboard-ipc-server.js +13 -1
  47. package/dist/core/dashboard-ipc-server.js.map +1 -1
  48. package/dist/core/github-auth.d.ts +5 -0
  49. package/dist/core/github-auth.d.ts.map +1 -1
  50. package/dist/core/github-auth.js +38 -0
  51. package/dist/core/github-auth.js.map +1 -1
  52. package/dist/core/maintenance.d.ts +1 -0
  53. package/dist/core/maintenance.d.ts.map +1 -1
  54. package/dist/core/maintenance.js +9 -1
  55. package/dist/core/maintenance.js.map +1 -1
  56. package/dist/core/session-create.d.ts +10 -0
  57. package/dist/core/session-create.d.ts.map +1 -1
  58. package/dist/core/session-create.js +21 -0
  59. package/dist/core/session-create.js.map +1 -1
  60. package/dist/core/session-manager.d.ts +4 -1
  61. package/dist/core/session-manager.d.ts.map +1 -1
  62. package/dist/core/session-manager.js +25 -13
  63. package/dist/core/session-manager.js.map +1 -1
  64. package/dist/core/trigger-session.d.ts +3 -0
  65. package/dist/core/trigger-session.d.ts.map +1 -1
  66. package/dist/core/trigger-session.js +17 -3
  67. package/dist/core/trigger-session.js.map +1 -1
  68. package/dist/core/worker-pool.d.ts.map +1 -1
  69. package/dist/core/worker-pool.js +2 -0
  70. package/dist/core/worker-pool.js.map +1 -1
  71. package/dist/daemon.d.ts.map +1 -1
  72. package/dist/daemon.js +19 -3
  73. package/dist/daemon.js.map +1 -1
  74. package/dist/dashboard/connector-api.d.ts.map +1 -1
  75. package/dist/dashboard/connector-api.js +19 -0
  76. package/dist/dashboard/connector-api.js.map +1 -1
  77. package/dist/dashboard/settings-write-applier.d.ts +2 -1
  78. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  79. package/dist/dashboard/settings-write-applier.js +6 -0
  80. package/dist/dashboard/settings-write-applier.js.map +1 -1
  81. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  82. package/dist/dashboard/web/connectors-page.js +23 -2
  83. package/dist/dashboard/web/connectors-page.js.map +1 -1
  84. package/dist/dashboard/web/create-session-composer.d.ts +35 -0
  85. package/dist/dashboard/web/create-session-composer.d.ts.map +1 -0
  86. package/dist/dashboard/web/create-session-composer.js +70 -0
  87. package/dist/dashboard/web/create-session-composer.js.map +1 -0
  88. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  89. package/dist/dashboard/web/i18n.js +65 -5
  90. package/dist/dashboard/web/i18n.js.map +1 -1
  91. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  92. package/dist/dashboard/web/sessions-page.js +147 -1
  93. package/dist/dashboard/web/sessions-page.js.map +1 -1
  94. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  95. package/dist/dashboard/web/settings-page.js +2 -1
  96. package/dist/dashboard/web/settings-page.js.map +1 -1
  97. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  98. package/dist/dashboard/web/skills-page.js +5 -2
  99. package/dist/dashboard/web/skills-page.js.map +1 -1
  100. package/dist/dashboard/webhook-routes.d.ts +4 -0
  101. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  102. package/dist/dashboard/webhook-routes.js +19 -0
  103. package/dist/dashboard/webhook-routes.js.map +1 -1
  104. package/dist/dashboard-web/app.js +1 -1
  105. package/dist/dashboard-web/chunks/{bot-defaults-page-4PM4T6QQ.js → bot-defaults-page-O37SAQD5.js} +1 -1
  106. package/dist/dashboard-web/chunks/{chunk-RXVA6XW3.js → chunk-6QHMLMIM.js} +6 -6
  107. package/dist/dashboard-web/chunks/{chunk-IKCZ677K.js → chunk-B42PCL5P.js} +1 -1
  108. package/dist/dashboard-web/chunks/{chunk-3PMN55Z6.js → chunk-FYALHCPG.js} +1 -1
  109. package/dist/dashboard-web/chunks/{chunk-AIDN2WZB.js → chunk-O2DPQL7C.js} +1 -1
  110. package/dist/dashboard-web/chunks/connectors-page-DZBQ42MH.js +1 -0
  111. package/dist/dashboard-web/chunks/{groups-page-TAU2UIVS.js → groups-page-3IEGRZKQ.js} +1 -1
  112. package/dist/dashboard-web/chunks/{insights-page-PJ2XVM6T.js → insights-page-X3ADRON3.js} +1 -1
  113. package/dist/dashboard-web/chunks/{monitor-room-D6445HJO.js → monitor-room-IV36RGQY.js} +1 -1
  114. package/dist/dashboard-web/chunks/{monitoring-page-GUHMCKSO.js → monitoring-page-ADFKVON4.js} +1 -1
  115. package/dist/dashboard-web/chunks/{office-page-6K6U2MS5.js → office-page-CALAOWNS.js} +1 -1
  116. package/dist/dashboard-web/chunks/{overview-page-USDYU7U5.js → overview-page-SLMGLK3M.js} +1 -1
  117. package/dist/dashboard-web/chunks/{roles-page-O4OUA7ZH.js → roles-page-L7JJ4FFV.js} +1 -1
  118. package/dist/dashboard-web/chunks/{schedules-page-LNIBXJSZ.js → schedules-page-Z3672POL.js} +1 -1
  119. package/dist/dashboard-web/chunks/sessions-page-OKJ5YWUZ.js +3 -0
  120. package/dist/dashboard-web/chunks/settings-page-P6MI2ZUE.js +2 -0
  121. package/dist/dashboard-web/chunks/{skills-page-M5KYNXBA.js → skills-page-FT7BVZ6X.js} +4 -4
  122. package/dist/dashboard-web/chunks/{team-federation-page-GT7UFQMN.js → team-federation-page-DEYCPUFB.js} +1 -1
  123. package/dist/dashboard-web/chunks/{v3-page-UYZIRJ2C.js → v3-page-4IOWREZG.js} +1 -1
  124. package/dist/dashboard-web/chunks/{whiteboards-page-WAR77DQE.js → whiteboards-page-2VMBETZH.js} +1 -1
  125. package/dist/dashboard-web/style.css +191 -0
  126. package/dist/dashboard.js +33 -6
  127. package/dist/dashboard.js.map +1 -1
  128. package/dist/global-config.d.ts +7 -0
  129. package/dist/global-config.d.ts.map +1 -1
  130. package/dist/global-config.js +2 -0
  131. package/dist/global-config.js.map +1 -1
  132. package/dist/im/lark/ask-card.d.ts.map +1 -1
  133. package/dist/im/lark/ask-card.js +52 -4
  134. package/dist/im/lark/ask-card.js.map +1 -1
  135. package/dist/im/lark/card-handler.d.ts +2 -0
  136. package/dist/im/lark/card-handler.d.ts.map +1 -1
  137. package/dist/im/lark/card-handler.js +19 -2
  138. package/dist/im/lark/card-handler.js.map +1 -1
  139. package/dist/im/lark/event-dispatcher.d.ts +3 -0
  140. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  141. package/dist/im/lark/event-dispatcher.js +706 -693
  142. package/dist/im/lark/event-dispatcher.js.map +1 -1
  143. package/dist/im/lark/grant-pending.d.ts +8 -4
  144. package/dist/im/lark/grant-pending.d.ts.map +1 -1
  145. package/dist/im/lark/grant-pending.js +13 -6
  146. package/dist/im/lark/grant-pending.js.map +1 -1
  147. package/dist/services/connector-store.d.ts +8 -0
  148. package/dist/services/connector-store.d.ts.map +1 -1
  149. package/dist/services/connector-store.js.map +1 -1
  150. package/dist/services/session-store.d.ts +2 -1
  151. package/dist/services/session-store.d.ts.map +1 -1
  152. package/dist/services/session-store.js +60 -2
  153. package/dist/services/session-store.js.map +1 -1
  154. package/dist/services/skill-registry-store.d.ts +16 -0
  155. package/dist/services/skill-registry-store.d.ts.map +1 -1
  156. package/dist/services/skill-registry-store.js +343 -47
  157. package/dist/services/skill-registry-store.js.map +1 -1
  158. package/dist/services/trigger-types.d.ts +5 -0
  159. package/dist/services/trigger-types.d.ts.map +1 -1
  160. package/dist/services/trigger-types.js +12 -0
  161. package/dist/services/trigger-types.js.map +1 -1
  162. package/dist/types.d.ts +13 -2
  163. package/dist/types.d.ts.map +1 -1
  164. package/dist/worker.js +440 -34
  165. package/dist/worker.js.map +1 -1
  166. package/package.json +1 -1
  167. package/dist/dashboard-web/chunks/connectors-page-2MKF4YTN.js +0 -1
  168. package/dist/dashboard-web/chunks/sessions-page-B6U6TCFF.js +0 -3
  169. package/dist/dashboard-web/chunks/settings-page-PXLRFF7I.js +0 -2
@@ -16820,6 +16820,68 @@ form.dashboard-toolbar > input[type="text"]:focus {
16820
16820
  border: 4px solid var(--accent);
16821
16821
  }
16822
16822
 
16823
+ .connector-topic-message-config {
16824
+ padding: 12px;
16825
+ border: 1px solid var(--border-soft);
16826
+ border-radius: var(--radius-lg);
16827
+ background: color-mix(in srgb, var(--surface-muted) 54%, transparent);
16828
+ }
16829
+
16830
+ .connector-topic-message-options {
16831
+ display: grid;
16832
+ grid-template-columns: repeat(3, minmax(0, 1fr));
16833
+ gap: 8px;
16834
+ }
16835
+
16836
+ .connector-topic-message-option {
16837
+ display: grid;
16838
+ grid-template-columns: auto minmax(0, 1fr);
16839
+ gap: 10px;
16840
+ align-items: start;
16841
+ padding: 11px 12px;
16842
+ border: 1px solid var(--border-soft);
16843
+ border-radius: var(--radius-lg);
16844
+ background: var(--surface);
16845
+ color: var(--fg);
16846
+ text-align: left;
16847
+ box-shadow: none;
16848
+ }
16849
+
16850
+ .connector-topic-message-option:hover,
16851
+ .connector-topic-message-option.selected {
16852
+ border-color: var(--accent);
16853
+ background: color-mix(in srgb, var(--accent) 7%, var(--surface));
16854
+ transform: none;
16855
+ }
16856
+
16857
+ .connector-topic-message-option > span:last-child { display: grid; gap: 4px; min-width: 0; }
16858
+ .connector-topic-message-option b { color: var(--fg); font-size: 12px; }
16859
+ .connector-topic-message-option small { color: var(--muted); font-size: 11px; font-weight: 600; line-height: 1.4; }
16860
+ .connector-topic-message-option.selected .connector-strategy-radio { border: 4px solid var(--accent); }
16861
+
16862
+ .connector-topic-message-input { display: grid; gap: 6px; }
16863
+ .connector-topic-message-input > small {
16864
+ display: flex;
16865
+ justify-content: space-between;
16866
+ gap: 12px;
16867
+ color: var(--muted);
16868
+ font-size: 11px;
16869
+ font-weight: 600;
16870
+ }
16871
+ .connector-topic-message-input > small span { color: var(--faint); font-variant-numeric: tabular-nums; }
16872
+
16873
+ .connector-topic-message-preview {
16874
+ margin: 0;
16875
+ padding: 9px 11px;
16876
+ border: 1px dashed color-mix(in srgb, var(--accent) 35%, var(--border-soft));
16877
+ border-radius: var(--radius-md);
16878
+ background: color-mix(in srgb, var(--accent) 5%, transparent);
16879
+ color: var(--fg);
16880
+ font-size: 11.5px;
16881
+ font-weight: 600;
16882
+ line-height: 1.45;
16883
+ }
16884
+
16823
16885
  .connector-dedup-field { display: grid; gap: 7px; }
16824
16886
 
16825
16887
  .connector-new-group-note {
@@ -17205,6 +17267,10 @@ form.dashboard-toolbar > input[type="text"]:focus {
17205
17267
  grid-template-columns: 1fr;
17206
17268
  }
17207
17269
 
17270
+ .connector-topic-message-options {
17271
+ grid-template-columns: 1fr;
17272
+ }
17273
+
17208
17274
  .connector-group-picker-popover {
17209
17275
  min-width: 100%;
17210
17276
  }
@@ -22168,6 +22234,131 @@ dialog.onboarding-dialog .onboarding-technical > code {
22168
22234
  resize: vertical;
22169
22235
  min-height: 124px;
22170
22236
  }
22237
+ .create-session-modal .cs-composer {
22238
+ position: relative;
22239
+ }
22240
+ .create-session-modal .cs-mention-menu {
22241
+ position: absolute;
22242
+ z-index: 3;
22243
+ top: calc(100% + 4px);
22244
+ left: 0;
22245
+ right: 0;
22246
+ display: grid;
22247
+ max-height: 220px;
22248
+ padding: 6px;
22249
+ border: 1px solid var(--border-soft);
22250
+ border-radius: var(--radius-md);
22251
+ background: var(--surface);
22252
+ box-shadow: var(--shadow);
22253
+ overflow: auto;
22254
+ }
22255
+ .create-session-modal .cs-mention-menu > button {
22256
+ display: flex;
22257
+ align-items: center;
22258
+ justify-content: space-between;
22259
+ gap: var(--cs-inner-gap);
22260
+ width: 100%;
22261
+ min-height: 38px;
22262
+ margin: 0;
22263
+ padding: 6px 10px;
22264
+ border: 0;
22265
+ border-radius: var(--radius-sm);
22266
+ background: transparent;
22267
+ color: var(--fg);
22268
+ text-align: left;
22269
+ box-shadow: none;
22270
+ }
22271
+ .create-session-modal .cs-mention-menu > button:hover,
22272
+ .create-session-modal .cs-mention-menu > button.active {
22273
+ background: var(--accent-soft);
22274
+ color: var(--accent-strong);
22275
+ }
22276
+ .create-session-modal .cs-mention-menu > button small {
22277
+ min-width: 0;
22278
+ color: var(--muted);
22279
+ overflow: hidden;
22280
+ text-overflow: ellipsis;
22281
+ white-space: nowrap;
22282
+ }
22283
+ .create-session-modal .cs-mention-menu > p {
22284
+ margin: 0;
22285
+ padding: 8px 10px;
22286
+ color: var(--muted);
22287
+ font-size: 12px;
22288
+ }
22289
+ .create-session-modal .cs-image-list {
22290
+ display: grid;
22291
+ grid-template-columns: repeat(auto-fill, minmax(112px, 1fr));
22292
+ gap: var(--cs-inner-gap);
22293
+ }
22294
+ .create-session-modal .cs-image-item {
22295
+ position: relative;
22296
+ min-width: 0;
22297
+ margin: 0;
22298
+ padding: 6px;
22299
+ border: 1px solid var(--border-soft);
22300
+ border-radius: var(--radius-md);
22301
+ background: var(--surface);
22302
+ }
22303
+ .create-session-modal .cs-image-item img {
22304
+ display: block;
22305
+ width: 100%;
22306
+ height: 78px;
22307
+ border-radius: var(--radius-sm);
22308
+ object-fit: contain;
22309
+ background: var(--surface-muted);
22310
+ }
22311
+ .create-session-modal .cs-image-item figcaption {
22312
+ display: grid;
22313
+ gap: 2px;
22314
+ margin-top: 5px;
22315
+ color: var(--muted);
22316
+ font-size: 11px;
22317
+ overflow: hidden;
22318
+ text-overflow: ellipsis;
22319
+ white-space: nowrap;
22320
+ }
22321
+ .create-session-modal .cs-image-item figcaption strong {
22322
+ color: var(--fg);
22323
+ font-size: 11px;
22324
+ line-height: 1.25;
22325
+ }
22326
+ .create-session-modal .cs-image-item figcaption span {
22327
+ overflow: hidden;
22328
+ text-overflow: ellipsis;
22329
+ white-space: nowrap;
22330
+ }
22331
+ .create-session-modal .cs-image-item > .cs-image-remove {
22332
+ position: absolute;
22333
+ top: 10px;
22334
+ right: 10px;
22335
+ z-index: 2;
22336
+ box-sizing: border-box;
22337
+ display: inline-grid;
22338
+ place-items: center;
22339
+ width: 34px;
22340
+ min-width: 34px;
22341
+ height: 34px;
22342
+ min-height: 34px;
22343
+ margin: 0;
22344
+ padding: 0 !important;
22345
+ border: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
22346
+ border-radius: 999px;
22347
+ background: color-mix(in srgb, var(--surface) 88%, transparent);
22348
+ color: var(--fg);
22349
+ line-height: 1;
22350
+ box-shadow: 0 2px 8px color-mix(in srgb, #000 28%, transparent);
22351
+ touch-action: manipulation;
22352
+ }
22353
+ .create-session-modal .cs-image-item > .cs-image-remove svg {
22354
+ display: block;
22355
+ width: 16px;
22356
+ height: 16px;
22357
+ fill: none;
22358
+ stroke: currentColor;
22359
+ stroke-width: 2;
22360
+ stroke-linecap: round;
22361
+ }
22171
22362
  .create-session-modal fieldset {
22172
22363
  margin: 0;
22173
22364
  padding: var(--cs-gap);
package/dist/dashboard.js CHANGED
@@ -52,7 +52,7 @@ import { createDaemonInternalApi } from './dashboard/daemon-internal-api.js';
52
52
  import { listTeamReports, readTeamBoard, setTeamBoardEntry } from './services/team-board-store.js';
53
53
  import { createCliAdapterSync } from './adapters/cli/registry.js';
54
54
  import { hd2dAssetPath, hd2dStatus, startHd2dDownload } from './dashboard/hd2d-assets.js';
55
- import { installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
55
+ import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
56
56
  import { redactGitUrlCredentials } from './core/skills/sources.js';
57
57
  import { effectiveDefaultWorkingDir, getBot, loadBotConfigs, parseBotConfigsFromText } from './bot-registry.js';
58
58
  import { findEntryIndex, readRawConfig, requireConfigPath, writeRawConfigAtomic } from './services/config-store.js';
@@ -78,6 +78,8 @@ import { aggregateRoleBatch, parseRoleBatchTargets } from './dashboard/roles-bat
78
78
  import { automateOpenPlatformSetup, vcListenerEventGateError } from './setup/open-platform-automation.js';
79
79
  import { VC_MEETING_FEATURE_SCOPES, VC_MEETING_REALTIME_VOICE_SCOPES } from './setup/verify-permissions.js';
80
80
  import { maybeInstallTraexPluginOnSettingsChange, TRAEX_RECOMMENDED_SOURCE, TRAEX_RECOMMENDED_REF } from './setup/ensure-herdr-integrations.js';
81
+ import { deriveCreateGroupName, selectCreateSessionTargets } from './core/session-create.js';
82
+ import { parseDashboardImageUploads } from './core/dashboard-images.js';
81
83
  import { checkLarkCliVersion, MIN_LARK_CLI_VERSION_FOR_VC_BOT } from './vc-agent/polling-source.js';
82
84
  import { larkHosts } from './im/lark/lark-hosts.js';
83
85
  import { buildResourceMonitorDaemonSeeds, createResourceMonitorService, handleResourceMonitorApi, toResourceMonitorSessionSeed } from './dashboard/resource-monitor-service.js';
@@ -676,6 +678,7 @@ function resolveDashboardSettings() {
676
678
  recommendedSource: TRAEX_RECOMMENDED_SOURCE,
677
679
  recommendedRef: TRAEX_RECOMMENDED_REF,
678
680
  },
681
+ codexRpcInput: dashboard.codexRpcInput === true, // default OFF until live-verified
679
682
  vcMeetingAgent: {
680
683
  enabled: global.vcMeetingAgent?.enabled !== false,
681
684
  listenerBotAppId: global.vcMeetingAgent?.listenerBotAppId ?? null,
@@ -1845,10 +1848,32 @@ function startSkillJob(type, run) {
1845
1848
  job.skills = [result];
1846
1849
  }
1847
1850
  job.status = 'succeeded';
1851
+ const audits = (job.skills ?? []).map(skill => {
1852
+ try {
1853
+ return buildSkillInstallAuditSummary(skill);
1854
+ }
1855
+ catch {
1856
+ return {
1857
+ name: skill.name,
1858
+ sourceType: skill.source.type,
1859
+ auditError: 'static_scan_failed',
1860
+ };
1861
+ }
1862
+ });
1863
+ logger.info('[skills:audit] job succeeded', {
1864
+ jobId: job.id,
1865
+ operation: type,
1866
+ skills: audits,
1867
+ });
1848
1868
  }
1849
1869
  catch (err) {
1850
1870
  job.error = redactGitUrlCredentials(err?.message ?? String(err));
1851
1871
  job.status = 'failed';
1872
+ logger.warn('[skills:audit] job failed', {
1873
+ jobId: job.id,
1874
+ operation: type,
1875
+ error: job.error,
1876
+ });
1852
1877
  }
1853
1878
  finally {
1854
1879
  job.updatedAt = new Date().toISOString();
@@ -4161,7 +4186,10 @@ const server = createServer(async (req, res) => {
4161
4186
  return jsonRes(res, 400, { ok: false, error: 'bad_column' });
4162
4187
  const bindWorkingDir = typeof parsed.bindWorkingDir === 'string' && parsed.bindWorkingDir.trim()
4163
4188
  ? parsed.bindWorkingDir.trim() : undefined;
4164
- const name = typeof parsed.name === 'string' && parsed.name.trim() ? parsed.name.trim().slice(0, 60) : undefined;
4189
+ const name = deriveCreateGroupName(parsed.name, content);
4190
+ const parsedImages = parseDashboardImageUploads(parsed.images);
4191
+ if (!parsedImages.ok)
4192
+ return jsonRes(res, 400, { ok: false, error: parsedImages.error });
4165
4193
  // 解析 creator:lead 模式 = lead bot;一起开工 = pickCreatorForGroup 在选中里挑一个在线的。
4166
4194
  let creatorLarkAppId;
4167
4195
  if (mode === 'lead') {
@@ -4218,9 +4246,7 @@ const server = createServer(async (req, res) => {
4218
4246
  const invalidBotIds = Array.isArray(groupResp.invalidBotIds) ? groupResp.invalidBotIds : [];
4219
4247
  // spawn 目标:lead 模式只有 lead;一起开工是所有成功入群的选中 bot。
4220
4248
  const joinedIds = selectedIds.filter(id => !invalidBotIds.includes(id) && !!registry.getByAppId(id));
4221
- const targets = mode === 'lead'
4222
- ? (joinedIds.includes(creatorLarkAppId) ? [creatorLarkAppId] : [])
4223
- : joinedIds;
4249
+ const targets = selectCreateSessionTargets(mode, joinedIds, creatorLarkAppId);
4224
4250
  if (targets.length === 0) {
4225
4251
  return jsonRes(res, 200, { ok: true, chatId, shareLink: groupResp.shareLink, spawned: [], failed: [], warning: 'no_spawn_target' });
4226
4252
  }
@@ -4231,7 +4257,7 @@ const server = createServer(async (req, res) => {
4231
4257
  await Promise.all(targets.map(async (appId) => {
4232
4258
  const role = mode === 'lead' ? 'lead' : (targets.length > 1 ? 'collab' : 'solo');
4233
4259
  // lead 的 coworker = 所有 sub(除自己);collab 的 coworker = 其它并列 bot(除自己)。
4234
- const coworkerIds = (mode === 'lead' ? selectedIds : targets).filter(id => id !== appId);
4260
+ const coworkerIds = (mode === 'lead' ? joinedIds : targets).filter(id => id !== appId);
4235
4261
  const coworkers = coworkerIds.map(id => ({ name: nameOf(id) }));
4236
4262
  try {
4237
4263
  const up = await proxyToDaemon(appId, '/api/sessions/spawn', {
@@ -4239,6 +4265,7 @@ const server = createServer(async (req, res) => {
4239
4265
  headers: { 'content-type': 'application/json' },
4240
4266
  body: JSON.stringify({
4241
4267
  chatId, content, column, role, coworkers,
4268
+ images: parsedImages.images,
4242
4269
  postBanner: appId === creatorLarkAppId,
4243
4270
  }),
4244
4271
  });