@wrongstack/webui 0.280.1 → 0.281.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 (68) hide show
  1. package/dist/assets/AnalyticsDashboard-uYxJjohK.js +1 -0
  2. package/dist/assets/AutoPhaseView-DG8bm0_l.js +1 -0
  3. package/dist/assets/CodeEditor-DLzmCqWF.js +1 -0
  4. package/dist/assets/DebugDashboard-D6-znhBO.js +1 -0
  5. package/dist/assets/DesignGalleryView-CtA0fPrm.js +1 -0
  6. package/dist/assets/MailboxDetailView-2_R4qJn-.js +1 -0
  7. package/dist/assets/OfficeMapPanel-BNZNbZik.js +4 -0
  8. package/dist/assets/ProcessMonitor-DgEXCx7y.js +1 -0
  9. package/dist/assets/QueuePanel-DL8SvR30.js +1 -0
  10. package/dist/assets/RefreshDebugView-pmMPOier.js +1 -0
  11. package/dist/assets/SddBoardView-CFhQv9Pv.js +2 -0
  12. package/dist/assets/SddFlowGraph-WW0qCx0t.js +1 -0
  13. package/dist/assets/SddWizard-Cnksg4-y.js +1 -0
  14. package/dist/assets/SessionsDashboard-VwXvmSxS.js +1 -0
  15. package/dist/assets/SkillDetailView-C1qcnlPI.js +2 -0
  16. package/dist/assets/SpecsView-BY7LKawq.js +1 -0
  17. package/dist/assets/TerminalPanel-Dq0Xdhdv.js +1 -0
  18. package/dist/assets/activity-DT93tsyC.js +5 -0
  19. package/dist/assets/chat-DCAGDU3F.js +1 -0
  20. package/dist/assets/chat-store-YPRVJGbn.js +5 -0
  21. package/dist/assets/commandPalette-DUootORZ.js +1 -0
  22. package/dist/assets/common-D7usadq4.js +1 -0
  23. package/dist/assets/i18n-BJCOtLro.js +2 -0
  24. package/dist/assets/index-CMiinLaB.css +1 -0
  25. package/dist/assets/index-DJpDzI2b.js +145 -0
  26. package/dist/assets/markdown-D0X23O-i.js +44 -0
  27. package/dist/assets/monaco-Br_kD0ds.css +1 -0
  28. package/dist/assets/monaco-DqY9Mr3N.js +1211 -0
  29. package/dist/assets/session-store-Do0MGnXu.js +1 -0
  30. package/dist/assets/settings-CGhOOFpI.js +1 -0
  31. package/dist/assets/setup-B8S3Rhsj.js +1 -0
  32. package/dist/assets/setup-BPkWK-DE.js +1 -0
  33. package/dist/assets/setup-BqoJ89VQ.js +1 -0
  34. package/dist/assets/setup-C4wNoopG.js +1 -0
  35. package/dist/assets/setup-CGWbN6bj.js +1 -0
  36. package/dist/assets/setup-Dr2UDb8s.js +1 -0
  37. package/dist/assets/setup-Iyk4ncan.js +1 -0
  38. package/dist/assets/toasts-BL_8kH4B.js +1 -0
  39. package/dist/assets/ui-store-D3gGpJWY.js +1 -0
  40. package/dist/assets/utils-sFCTikqz.js +1 -0
  41. package/dist/assets/vendor-Bhf0nZ3B.js +70 -0
  42. package/dist/assets/vendor-CcOzUMQS.css +1 -0
  43. package/dist/assets/ws-client-D9IQ9580.js +1 -0
  44. package/dist/assets/xterm-B9RXJkIu.js +36 -0
  45. package/dist/assets/xterm-BrP-ENHg.css +1 -0
  46. package/dist/assets/xyflow-Bp8EMwkC.js +7 -0
  47. package/dist/assets/xyflow-DtxX27Jz.css +1 -0
  48. package/dist/index.css +247 -0
  49. package/dist/index.css.map +1 -1
  50. package/dist/index.html +20 -4
  51. package/dist/index.js +31866 -30427
  52. package/dist/index.js.map +1 -1
  53. package/dist/server/entry.js +119 -44
  54. package/dist/server/entry.js.map +1 -1
  55. package/dist/server/index.js +119 -44
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/types.d.ts +7 -1
  58. package/package.json +6 -13
  59. package/dist/assets/index-BMDGZBnY.css +0 -2
  60. package/dist/assets/index-Ci_SxQGe.js +0 -157
  61. package/dist/assets/setup-B5TfeR6q.js +0 -1
  62. package/dist/assets/setup-BBwNpiE3.js +0 -1
  63. package/dist/assets/setup-BT2iTMm4.js +0 -1
  64. package/dist/assets/setup-CVMjqrZh.js +0 -1
  65. package/dist/assets/setup-DOXm3hFc.js +0 -1
  66. package/dist/assets/setup-Dhb_xOpk.js +0 -1
  67. package/dist/assets/vendor-B_dTeUDT.js +0 -1364
  68. package/dist/assets/vendor-C3aCZA5Q.css +0 -1
@@ -6565,6 +6565,7 @@ function registerShutdown(deps2) {
6565
6565
  import * as path15 from "path";
6566
6566
  import { createRequire } from "module";
6567
6567
  import { WebSocket as WebSocket2 } from "ws";
6568
+ import { DefaultTokenCounter } from "@wrongstack/core/infrastructure";
6568
6569
  import {
6569
6570
  AgentStatusTracker,
6570
6571
  AnnotationsStore,
@@ -6577,7 +6578,6 @@ import {
6577
6578
  DefaultSessionStore,
6578
6579
  DefaultSkillLoader,
6579
6580
  DefaultSystemPromptBuilder,
6580
- DefaultTokenCounter,
6581
6581
  EventBus,
6582
6582
  FleetNotifier,
6583
6583
  GlobalMailbox,
@@ -6593,6 +6593,7 @@ import {
6593
6593
  getSessionRegistry,
6594
6594
  makeMailboxTool,
6595
6595
  makeMailInboxTool,
6596
+ makeFleetStatusTool,
6596
6597
  makeMailSendTool
6597
6598
  } from "@wrongstack/core";
6598
6599
  import { MCPRegistry } from "@wrongstack/mcp";
@@ -6866,6 +6867,7 @@ async function createPreContextServices(input) {
6866
6867
  toolRegistry.register(makeMailboxTool({ projectDir: wpaths.projectDir, events }));
6867
6868
  toolRegistry.register(makeMailSendTool({ projectDir: wpaths.projectDir, events }));
6868
6869
  toolRegistry.register(makeMailInboxTool({ projectDir: wpaths.projectDir, events }));
6870
+ toolRegistry.register(makeFleetStatusTool({ projectDir: wpaths.projectDir, events }));
6869
6871
  applyToolDescriptionModes(toolRegistry, config.tools?.descriptionMode);
6870
6872
  applyToolResultRenderModes(toolRegistry, config.tools?.resultRenderMode);
6871
6873
  configureExecPolicy(config.tools?.exec ?? {});
@@ -6880,7 +6882,25 @@ async function createPreContextServices(input) {
6880
6882
  });
6881
6883
  }
6882
6884
  }
6883
- const sessionStore = opts.services?.session ?? new DefaultSessionStore({ dir: wpaths.projectSessions });
6885
+ const sessionStore = opts.services?.session ?? new DefaultSessionStore({
6886
+ dir: wpaths.projectSessions,
6887
+ // Cross-process guard for delete(): refuses to remove a session that a
6888
+ // live terminal/TUI/WebUI in this project is using. The store also
6889
+ // checks active.json directly; this widens it to every concurrent
6890
+ // surface via the SessionRegistry.
6891
+ isSessionInUse: async (sessionId) => {
6892
+ try {
6893
+ const registry = getSessionRegistry(wpaths.globalRoot);
6894
+ const live = await registry.listByProject(wpaths.projectSlug);
6895
+ const hit = live.find((e) => e.sessionId === sessionId);
6896
+ if (hit) {
6897
+ return `active in ${hit.projectName} (PID ${hit.pid})`;
6898
+ }
6899
+ } catch {
6900
+ }
6901
+ return null;
6902
+ }
6903
+ });
6884
6904
  if (!opts.services?.session) {
6885
6905
  sessionStore.prune(DEFAULT_SESSION_PRUNE_DAYS).then((count) => {
6886
6906
  if (count > 0) logger.info(`Pruned ${count} old session${count === 1 ? "" : "s"}.`);
@@ -9411,6 +9431,9 @@ async function handleSessionRoute(ws, msg, handlers) {
9411
9431
  case "sessions.list":
9412
9432
  await handlers.listSessions(ws, msg);
9413
9433
  return true;
9434
+ case "session.rename":
9435
+ await handlers.renameSession(ws, msg);
9436
+ return true;
9414
9437
  case "session.delete":
9415
9438
  await handlers.deleteSession(ws, msg);
9416
9439
  return true;
@@ -10987,6 +11010,38 @@ function createSessionHandlers(ctx) {
10987
11010
  sendResult(ws, false, errMessage(err));
10988
11011
  }
10989
11012
  },
11013
+ renameSession: async (ws, msg) => {
11014
+ const payload = msg.payload ?? {};
11015
+ const id = typeof payload.id === "string" ? payload.id : "";
11016
+ const name2 = typeof payload.name === "string" ? payload.name : "";
11017
+ if (!id) {
11018
+ sendResult(ws, false, "Session id is required");
11019
+ return;
11020
+ }
11021
+ try {
11022
+ await ctx.getSessionStore().rename(id, name2);
11023
+ sendResult(ws, true, name2 ? `Renamed session to "${name2}"` : `Cleared session name`);
11024
+ const list = await ctx.getSessionStore().list(50);
11025
+ const currentId = ctx.getSession().id;
11026
+ broadcast(ctx.clients, {
11027
+ type: "sessions.list",
11028
+ payload: {
11029
+ sessions: list.map((s) => ({
11030
+ id: s.id,
11031
+ name: s.name,
11032
+ title: s.title,
11033
+ startedAt: s.startedAt,
11034
+ model: s.model,
11035
+ provider: s.provider,
11036
+ tokenTotal: s.tokenTotal,
11037
+ isCurrent: s.id === currentId
11038
+ }))
11039
+ }
11040
+ });
11041
+ } catch (err) {
11042
+ sendResult(ws, false, errMessage(err));
11043
+ }
11044
+ },
10990
11045
  resumeSession: async (ws, msg) => {
10991
11046
  const { id } = msg.payload;
10992
11047
  try {
@@ -11112,15 +11167,17 @@ function buildRoutes(state, deps2, cb) {
11112
11167
  send(ws, {
11113
11168
  type: "provider.catalog",
11114
11169
  payload: {
11115
- providers: providers.map((p) => ({
11116
- id: p.id,
11117
- name: p.name,
11118
- family: p.family,
11119
- apiBase: p.apiBase,
11120
- envVars: p.envVars,
11121
- modelCount: p.models.length,
11122
- hasApiKey: savedIds.has(p.id) || p.envVars.some((v) => !!process.env[v])
11123
- }))
11170
+ providers: providers.map(
11171
+ (p) => ({
11172
+ id: p.id,
11173
+ name: p.name,
11174
+ family: p.family,
11175
+ apiBase: p.apiBase,
11176
+ envVars: p.envVars,
11177
+ modelCount: p.models.length,
11178
+ hasApiKey: savedIds.has(p.id) || p.envVars.some((v) => !!process.env[v])
11179
+ })
11180
+ )
11124
11181
  }
11125
11182
  });
11126
11183
  },
@@ -11135,16 +11192,12 @@ function buildRoutes(state, deps2, cb) {
11135
11192
  const providerId = msg.payload.providerId;
11136
11193
  const saved = await providerHandlers.loadConfigProviders();
11137
11194
  const cfg = saved[providerId];
11138
- const provider = await resolveProviderCatalogForModels(
11139
- deps2.modelsRegistry,
11140
- providerId,
11141
- cfg
11142
- );
11195
+ const provider = await resolveProviderCatalogForModels(deps2.modelsRegistry, providerId, cfg);
11143
11196
  const models = await enrichProviderModelDescriptors(
11144
11197
  deps2.modelsRegistry,
11145
11198
  providerId,
11146
11199
  cfg,
11147
- resolveProviderModelList(cfg?.models, provider)
11200
+ resolveProviderModelList(cfg?.models, provider, cfg?.type ?? providerId)
11148
11201
  );
11149
11202
  send(ws, {
11150
11203
  type: "provider.models",
@@ -11167,7 +11220,9 @@ function buildRoutes(state, deps2, cb) {
11167
11220
  deps2.configStore.update({ provider: newProvider, model: newModel });
11168
11221
  deps2.context.model = newModel;
11169
11222
  const newCfg = state.getConfig();
11170
- const providerCfg = newCfg.providers?.[newProvider] ?? { type: newProvider };
11223
+ const providerCfg = newCfg.providers?.[newProvider] ?? {
11224
+ type: newProvider
11225
+ };
11171
11226
  const newProv = deps2.providerRegistry.has(newProvider) ? deps2.providerRegistry.create({ ...providerCfg, type: newProvider }) : makeProviderFromConfig2(newProvider, providerCfg);
11172
11227
  deps2.context.provider = newProv;
11173
11228
  await cb.updateAutoCompactionMaxContext(newProv, newProvider, providerCfg);
@@ -11221,12 +11276,14 @@ function buildRoutes(state, deps2, cb) {
11221
11276
  timeoutMs: 9e4,
11222
11277
  ...reasoning ? { reasoning } : {},
11223
11278
  onError: (reason) => {
11224
- console.warn(JSON.stringify({
11225
- level: "warn",
11226
- event: "model.refine_failed",
11227
- reason,
11228
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
11229
- }));
11279
+ console.warn(
11280
+ JSON.stringify({
11281
+ level: "warn",
11282
+ event: "model.refine_failed",
11283
+ reason,
11284
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
11285
+ })
11286
+ );
11230
11287
  }
11231
11288
  });
11232
11289
  if (result) {
@@ -11241,12 +11298,14 @@ function buildRoutes(state, deps2, cb) {
11241
11298
  });
11242
11299
  }
11243
11300
  } catch (err) {
11244
- console.error(JSON.stringify({
11245
- level: "error",
11246
- event: "model.refine.error",
11247
- error: errMessage(err),
11248
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
11249
- }));
11301
+ console.error(
11302
+ JSON.stringify({
11303
+ level: "error",
11304
+ event: "model.refine.error",
11305
+ error: errMessage(err),
11306
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
11307
+ })
11308
+ );
11250
11309
  send(ws, {
11251
11310
  type: "model.refine_result",
11252
11311
  payload: { refined: text, english: text, error: errMessage(err) }
@@ -11328,17 +11387,24 @@ function buildRoutes(state, deps2, cb) {
11328
11387
  const cfg = state.getConfig();
11329
11388
  const features = cfg.features ?? {};
11330
11389
  if (typeof payload["featureMcp"] === "boolean") features["mcp"] = payload["featureMcp"];
11331
- if (typeof payload["featurePlugins"] === "boolean") features["plugins"] = payload["featurePlugins"];
11332
- if (typeof payload["featureMemory"] === "boolean") features["memory"] = payload["featureMemory"];
11333
- if (typeof payload["featureSkills"] === "boolean") features["skills"] = payload["featureSkills"];
11334
- if (typeof payload["featureModelsRegistry"] === "boolean") features["modelsRegistry"] = payload["featureModelsRegistry"];
11390
+ if (typeof payload["featurePlugins"] === "boolean")
11391
+ features["plugins"] = payload["featurePlugins"];
11392
+ if (typeof payload["featureMemory"] === "boolean")
11393
+ features["memory"] = payload["featureMemory"];
11394
+ if (typeof payload["featureSkills"] === "boolean")
11395
+ features["skills"] = payload["featureSkills"];
11396
+ if (typeof payload["featureModelsRegistry"] === "boolean")
11397
+ features["modelsRegistry"] = payload["featureModelsRegistry"];
11335
11398
  cfg.features = features;
11336
- if (Array.isArray(payload["fallbackModels"])) cfg.fallbackModels = payload["fallbackModels"];
11399
+ if (Array.isArray(payload["fallbackModels"]))
11400
+ cfg.fallbackModels = payload["fallbackModels"];
11337
11401
  if (payload["fallbackProfiles"] && typeof payload["fallbackProfiles"] === "object" && !Array.isArray(payload["fallbackProfiles"])) {
11338
11402
  cfg.fallbackProfiles = payload["fallbackProfiles"];
11339
11403
  }
11340
- if (Array.isArray(payload["favoriteModels"])) cfg.favoriteModels = payload["favoriteModels"];
11341
- if (typeof payload["favoriteModelsOnly"] === "boolean") cfg.favoriteModelsOnly = payload["favoriteModelsOnly"];
11404
+ if (Array.isArray(payload["favoriteModels"]))
11405
+ cfg.favoriteModels = payload["favoriteModels"];
11406
+ if (typeof payload["favoriteModelsOnly"] === "boolean")
11407
+ cfg.favoriteModelsOnly = payload["favoriteModelsOnly"];
11342
11408
  if (payload["modelMatrix"] && typeof payload["modelMatrix"] === "object" && !Array.isArray(payload["modelMatrix"])) {
11343
11409
  cfg.modelMatrix = payload["modelMatrix"];
11344
11410
  }
@@ -11346,7 +11412,10 @@ function buildRoutes(state, deps2, cb) {
11346
11412
  if (typeof payload["contextAutoCompact"] === "boolean") {
11347
11413
  if (payload["contextAutoCompact"] && deps2.autoCompactor) {
11348
11414
  deps2.pipelines.contextWindow.remove("AutoCompaction", { optional: true });
11349
- deps2.pipelines.contextWindow.use({ name: "AutoCompaction", handler: deps2.autoCompactor.handler() });
11415
+ deps2.pipelines.contextWindow.use({
11416
+ name: "AutoCompaction",
11417
+ handler: deps2.autoCompactor.handler()
11418
+ });
11350
11419
  } else {
11351
11420
  deps2.pipelines.contextWindow.remove("AutoCompaction", { optional: true });
11352
11421
  }
@@ -11381,7 +11450,10 @@ function buildRoutes(state, deps2, cb) {
11381
11450
  sendResult(ws, false, parsed.message);
11382
11451
  return;
11383
11452
  }
11384
- const result = await handleShellOpen(parsed.value, deps2.logger);
11453
+ const result = await handleShellOpen(
11454
+ parsed.value,
11455
+ deps2.logger
11456
+ );
11385
11457
  sendResult(ws, result.success, result.message);
11386
11458
  }
11387
11459
  };
@@ -11410,10 +11482,10 @@ function buildRoutes(state, deps2, cb) {
11410
11482
  parsed.value
11411
11483
  );
11412
11484
  },
11413
- clear: (ws) => handleMailboxClear(
11414
- ws,
11415
- { projectRoot: state.getProjectRoot(), globalRoot: path21.dirname(deps2.globalConfigPath) }
11416
- ),
11485
+ clear: (ws) => handleMailboxClear(ws, {
11486
+ projectRoot: state.getProjectRoot(),
11487
+ globalRoot: path21.dirname(deps2.globalConfigPath)
11488
+ }),
11417
11489
  purge: (ws, msg) => {
11418
11490
  const parsed = validateMailboxPurgePayload(msg.payload);
11419
11491
  if (!parsed.ok) {
@@ -11475,7 +11547,10 @@ function buildRoutes(state, deps2, cb) {
11475
11547
  risk: "medium",
11476
11548
  fallback: "ask_human"
11477
11549
  });
11478
- send(ws, { type: "brain.answer", payload: { sessionId: deps2.context.session?.id, question, decision } });
11550
+ send(ws, {
11551
+ type: "brain.answer",
11552
+ payload: { sessionId: deps2.context.session?.id, question, decision }
11553
+ });
11479
11554
  } catch (err) {
11480
11555
  sendResult(ws, false, `Brain consultation failed: ${errMessage(err)}`);
11481
11556
  }