@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.
- package/dist/assets/AnalyticsDashboard-uYxJjohK.js +1 -0
- package/dist/assets/AutoPhaseView-DG8bm0_l.js +1 -0
- package/dist/assets/CodeEditor-DLzmCqWF.js +1 -0
- package/dist/assets/DebugDashboard-D6-znhBO.js +1 -0
- package/dist/assets/DesignGalleryView-CtA0fPrm.js +1 -0
- package/dist/assets/MailboxDetailView-2_R4qJn-.js +1 -0
- package/dist/assets/OfficeMapPanel-BNZNbZik.js +4 -0
- package/dist/assets/ProcessMonitor-DgEXCx7y.js +1 -0
- package/dist/assets/QueuePanel-DL8SvR30.js +1 -0
- package/dist/assets/RefreshDebugView-pmMPOier.js +1 -0
- package/dist/assets/SddBoardView-CFhQv9Pv.js +2 -0
- package/dist/assets/SddFlowGraph-WW0qCx0t.js +1 -0
- package/dist/assets/SddWizard-Cnksg4-y.js +1 -0
- package/dist/assets/SessionsDashboard-VwXvmSxS.js +1 -0
- package/dist/assets/SkillDetailView-C1qcnlPI.js +2 -0
- package/dist/assets/SpecsView-BY7LKawq.js +1 -0
- package/dist/assets/TerminalPanel-Dq0Xdhdv.js +1 -0
- package/dist/assets/activity-DT93tsyC.js +5 -0
- package/dist/assets/chat-DCAGDU3F.js +1 -0
- package/dist/assets/chat-store-YPRVJGbn.js +5 -0
- package/dist/assets/commandPalette-DUootORZ.js +1 -0
- package/dist/assets/common-D7usadq4.js +1 -0
- package/dist/assets/i18n-BJCOtLro.js +2 -0
- package/dist/assets/index-CMiinLaB.css +1 -0
- package/dist/assets/index-DJpDzI2b.js +145 -0
- package/dist/assets/markdown-D0X23O-i.js +44 -0
- package/dist/assets/monaco-Br_kD0ds.css +1 -0
- package/dist/assets/monaco-DqY9Mr3N.js +1211 -0
- package/dist/assets/session-store-Do0MGnXu.js +1 -0
- package/dist/assets/settings-CGhOOFpI.js +1 -0
- package/dist/assets/setup-B8S3Rhsj.js +1 -0
- package/dist/assets/setup-BPkWK-DE.js +1 -0
- package/dist/assets/setup-BqoJ89VQ.js +1 -0
- package/dist/assets/setup-C4wNoopG.js +1 -0
- package/dist/assets/setup-CGWbN6bj.js +1 -0
- package/dist/assets/setup-Dr2UDb8s.js +1 -0
- package/dist/assets/setup-Iyk4ncan.js +1 -0
- package/dist/assets/toasts-BL_8kH4B.js +1 -0
- package/dist/assets/ui-store-D3gGpJWY.js +1 -0
- package/dist/assets/utils-sFCTikqz.js +1 -0
- package/dist/assets/vendor-Bhf0nZ3B.js +70 -0
- package/dist/assets/vendor-CcOzUMQS.css +1 -0
- package/dist/assets/ws-client-D9IQ9580.js +1 -0
- package/dist/assets/xterm-B9RXJkIu.js +36 -0
- package/dist/assets/xterm-BrP-ENHg.css +1 -0
- package/dist/assets/xyflow-Bp8EMwkC.js +7 -0
- package/dist/assets/xyflow-DtxX27Jz.css +1 -0
- package/dist/index.css +247 -0
- package/dist/index.css.map +1 -1
- package/dist/index.html +20 -4
- package/dist/index.js +31866 -30427
- package/dist/index.js.map +1 -1
- package/dist/server/entry.js +119 -44
- package/dist/server/entry.js.map +1 -1
- package/dist/server/index.js +119 -44
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/package.json +6 -13
- package/dist/assets/index-BMDGZBnY.css +0 -2
- package/dist/assets/index-Ci_SxQGe.js +0 -157
- package/dist/assets/setup-B5TfeR6q.js +0 -1
- package/dist/assets/setup-BBwNpiE3.js +0 -1
- package/dist/assets/setup-BT2iTMm4.js +0 -1
- package/dist/assets/setup-CVMjqrZh.js +0 -1
- package/dist/assets/setup-DOXm3hFc.js +0 -1
- package/dist/assets/setup-Dhb_xOpk.js +0 -1
- package/dist/assets/vendor-B_dTeUDT.js +0 -1364
- package/dist/assets/vendor-C3aCZA5Q.css +0 -1
package/dist/server/index.js
CHANGED
|
@@ -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({
|
|
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(
|
|
11116
|
-
|
|
11117
|
-
|
|
11118
|
-
|
|
11119
|
-
|
|
11120
|
-
|
|
11121
|
-
|
|
11122
|
-
|
|
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] ?? {
|
|
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(
|
|
11225
|
-
|
|
11226
|
-
|
|
11227
|
-
|
|
11228
|
-
|
|
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(
|
|
11245
|
-
|
|
11246
|
-
|
|
11247
|
-
|
|
11248
|
-
|
|
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")
|
|
11332
|
-
|
|
11333
|
-
if (typeof payload["
|
|
11334
|
-
|
|
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"]))
|
|
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"]))
|
|
11341
|
-
|
|
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({
|
|
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(
|
|
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
|
-
|
|
11415
|
-
|
|
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, {
|
|
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
|
}
|