@wrongstack/cli 1.0.29 → 1.0.32

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 (119) hide show
  1. package/data/providers.json +8 -199
  2. package/dist/{acp-QWCBMQSO.js → acp-EDGUWU7N.js} +3 -6
  3. package/dist/{audit-46YK5DSC.js → audit-KCBTHUQI.js} +1 -1
  4. package/dist/{auth-TE55JF4Z.js → auth-SUHKFFO4.js} +136 -59
  5. package/dist/auth-menu/github-copilot-oauth.d.ts +1 -35
  6. package/dist/auth-menu/index-input.d.ts +3 -0
  7. package/dist/auth-menu/panel-flow-bridge.d.ts +29 -0
  8. package/dist/auth-menu/panel-service.d.ts +3 -34
  9. package/dist/auth-menu/provider-auth-login.d.ts +1 -1
  10. package/dist/auto-discover-providers-QIL34K3U.js +7 -0
  11. package/dist/automation-MCDFCIMV.js +369 -0
  12. package/dist/{bench-GTLPM22B.js → bench-MMZHFHDL.js} +152 -43
  13. package/dist/boot/brain-decision-log.d.ts +1 -1
  14. package/dist/boot/system-prompt-builder.d.ts +1 -1
  15. package/dist/boot/system-prompt-menu.d.ts +11 -2
  16. package/dist/boot/tui-coordinator-setup.d.ts +2 -0
  17. package/dist/boot/tui-startup-output.d.ts +11 -0
  18. package/dist/{boot-auto-thin-6Q56FY3F.js → boot-auto-thin-K2DHHYIW.js} +3 -3
  19. package/dist/{chronicle-UTFETHP6.js → chronicle-PBJS7BN6.js} +5 -3
  20. package/dist/{chunk-WRYZLEXP.js → chunk-2EZ2DHOW.js} +41 -7
  21. package/dist/{chunk-7IQWQCBH.js → chunk-3LEFXLAW.js} +39 -39
  22. package/dist/{chunk-WSTVGC2C.js → chunk-4BX2YDTQ.js} +13 -6
  23. package/dist/{chunk-SFBFYIOW.js → chunk-4MDRHMX4.js} +3 -2
  24. package/dist/{chunk-RDGGWMTI.js → chunk-65VNCAF6.js} +2 -22
  25. package/dist/{chunk-WQZW3RDP.js → chunk-7BNBD4PE.js} +2 -2
  26. package/dist/chunk-CFHWIFXL.js +123 -0
  27. package/dist/{chunk-RZ4ZDRYA.js → chunk-DIOODAYM.js} +2 -2
  28. package/dist/{chunk-L2RVEQWO.js → chunk-HHRYIDOW.js} +2 -2
  29. package/dist/{chunk-KT34LWIS.js → chunk-LIZXJHZQ.js} +28 -26
  30. package/dist/{chunk-YHYINL47.js → chunk-LKFKO4JW.js} +2 -2
  31. package/dist/{chunk-Q4INH2DG.js → chunk-MPQCHBDJ.js} +2 -1
  32. package/dist/{chunk-2ERX3RPN.js → chunk-P3GRLV47.js} +30 -17
  33. package/dist/{chunk-ZMX5HRLI.js → chunk-P3Q3KMFH.js} +6 -4
  34. package/dist/{chunk-KOEO4CJG.js → chunk-PGNERAZL.js} +4 -4
  35. package/dist/{chunk-6A7URMWN.js → chunk-RQ4UBKYH.js} +3 -3
  36. package/dist/{chunk-X756ZS72.js → chunk-SUDNPYWD.js} +2 -2
  37. package/dist/{chunk-LDCGZJTC.js → chunk-TWSQTQKR.js} +12 -4
  38. package/dist/chunk-TXAFIERF.js +37 -0
  39. package/dist/{chunk-BZHT5GPF.js → chunk-WHEYHDIE.js} +2 -2
  40. package/dist/{chunk-LBPLTTZ6.js → chunk-WTJDSTYD.js} +4 -4
  41. package/dist/{chunk-IFQ6NQPL.js → chunk-WXJH4F6K.js} +7 -7
  42. package/dist/{chunk-IS2PPBQV.js → chunk-X4LW5CZM.js} +8 -4
  43. package/dist/{chunk-BBHWW6LR.js → chunk-YL4KCHZG.js} +18 -6
  44. package/dist/{chunk-LUMETJFO.js → chunk-ZYACRPLN.js} +2 -2
  45. package/dist/{cli-context-6RONY47P.js → cli-context-ITHGP2CE.js} +83 -76
  46. package/dist/cli-context.d.ts +3 -1
  47. package/dist/cli-infrastructure.d.ts +33 -0
  48. package/dist/{cli-main-YS3HIOSD.js → cli-main-TQGLKB6D.js} +3768 -2748
  49. package/dist/config-doctor.d.ts +1 -1
  50. package/dist/{config-transfer-RUWLDCNK.js → config-transfer-UE37X4B5.js} +2 -2
  51. package/dist/{execution-JEYF2L7O.js → execution-C2IECWF7.js} +4981 -4836
  52. package/dist/execution-chimera-handlers.d.ts +6 -0
  53. package/dist/execution-session-callbacks.d.ts +36 -0
  54. package/dist/execution-webui.d.ts +3 -0
  55. package/dist/execution.d.ts +1 -1
  56. package/dist/fleet/host-acp-runner.d.ts +15 -0
  57. package/dist/fleet/host-budget.d.ts +13 -0
  58. package/dist/fleet/host-context.d.ts +5 -0
  59. package/dist/fleet/host-explore-companion.d.ts +6 -15
  60. package/dist/fleet/host.d.ts +2 -0
  61. package/dist/fleet/status-broadcast.d.ts +1 -1
  62. package/dist/{hq-BNK67HOE.js → hq-KBFDKTDD.js} +13 -7
  63. package/dist/{hq-server-PCQACV7Y.js → hq-server-AVNKZ2PV.js} +2 -2
  64. package/dist/{hq-service-BMMJAHRT.js → hq-service-FGB7BY2D.js} +3 -3
  65. package/dist/index.js +126 -10
  66. package/dist/{mailbox-serve-FW3JCCPK.js → mailbox-serve-S536N66F.js} +3 -2
  67. package/dist/{modeldiag-W7XAE625.js → modeldiag-PQILD7TN.js} +26 -8
  68. package/dist/{per-subcommand-help-MWQWFIAV.js → per-subcommand-help-VKPV3OEY.js} +2 -2
  69. package/dist/{plugin-usage-CIGOOTX3.js → plugin-usage-3TZGROK7.js} +3 -3
  70. package/dist/{plugins-HQTXUD6A.js → plugins-ITH4SLO6.js} +4 -4
  71. package/dist/pre-launch/project-check.d.ts +2 -8
  72. package/dist/pre-launch.d.ts +1 -1
  73. package/dist/{project-manifest-7NSFVBM3.js → project-manifest-FTFDCCTZ.js} +2 -2
  74. package/dist/{project-picker-SVBXMPKX.js → project-picker-NZYJKQQC.js} +3 -3
  75. package/dist/provider-cloud-config.d.ts +4 -0
  76. package/dist/provider-config-utils.d.ts +1 -1
  77. package/dist/{providers-models-5Z2PJTEW.js → providers-models-W57I3QOA.js} +3 -3
  78. package/dist/{remote-GB5VXCCT.js → remote-C74BCNND.js} +5 -5
  79. package/dist/{rewind-JA3ZLCNM.js → rewind-7AULJS7F.js} +7 -5
  80. package/dist/sandbox-TYGD6FI2.js +131 -0
  81. package/dist/services/sdd/project-context.d.ts +1 -1
  82. package/dist/{sessions-config-JGIZRNT6.js → sessions-config-VE26SB56.js} +5 -5
  83. package/dist/short-circuit-flags-6LB3EGF7.js +10 -0
  84. package/dist/slash-commands/openai-quota.d.ts +12 -6
  85. package/dist/slash-commands/sandbox.d.ts +5 -0
  86. package/dist/slash-commands/scout-stats.d.ts +46 -0
  87. package/dist/slash-commands/sdd-inspect-commands.d.ts +9 -0
  88. package/dist/slash-commands/sdd-session-commands.d.ts +19 -0
  89. package/dist/slash-commands/sdd.d.ts +1 -1
  90. package/dist/slash-commands/zai-plan.d.ts +26 -0
  91. package/dist/{standalone-auto-update-TOTRGCSA.js → standalone-auto-update-VQC4GYCM.js} +3 -3
  92. package/dist/{standalone-update-LZO3MNLH.js → standalone-update-HZHDZZOR.js} +2 -2
  93. package/dist/subcommands/handlers/automation-credentials.d.ts +8 -0
  94. package/dist/subcommands/handlers/automation.d.ts +3 -0
  95. package/dist/subcommands/handlers/bench-experiments.d.ts +5 -0
  96. package/dist/subcommands/handlers/sandbox.d.ts +5 -0
  97. package/dist/{subcommands-WX4GDMWB.js → subcommands-QO7VYTSS.js} +2 -2
  98. package/dist/{tools-skills-GH24UCBY.js → tools-skills-33AI6K6S.js} +2 -2
  99. package/dist/tui-provider-quota-menu.d.ts +5 -0
  100. package/dist/{typesafe-WA5O3KVS.js → typesafe-NHC322W5.js} +27 -8
  101. package/dist/{typesafe-topic-replay-ZILIU3WS.js → typesafe-topic-replay-DB2AYL7V.js} +2 -2
  102. package/dist/{typesafe-triage-replay-FGAW7QM7.js → typesafe-triage-replay-27NDAZ3V.js} +2 -2
  103. package/dist/{update-TDZX4IL2.js → update-J5WHAFPE.js} +3 -3
  104. package/dist/{update-check-J5ZVKS73.js → update-check-VLVT4IV2.js} +2 -2
  105. package/dist/{version-help-HN32QYQN.js → version-help-ATOKGMTK.js} +2 -2
  106. package/dist/webui-server/prefs-seeding.d.ts +1 -0
  107. package/dist/webui-server/route-contexts.d.ts +1 -0
  108. package/dist/{webui-server-EXJWLB3X.js → webui-server-GQOVLQS3.js} +71 -34
  109. package/dist/webui-session-retirement.d.ts +10 -0
  110. package/dist/wiring/command-host-state.d.ts +2 -0
  111. package/dist/wiring/director-announcement.d.ts +3 -1
  112. package/dist/wiring/session-establishment.d.ts +10 -8
  113. package/dist/wiring/session-runtime.d.ts +1 -1
  114. package/dist/wiring/session.d.ts +3 -0
  115. package/package.json +30 -30
  116. package/dist/auto-discover-providers-DXR25GTG.js +0 -7
  117. package/dist/chunk-D5GB5MHA.js +0 -87
  118. package/dist/chunk-SIGUWXAA.js +0 -43
  119. package/dist/short-circuit-flags-5N2LPK4R.js +0 -10
@@ -5,7 +5,7 @@ import {
5
5
  fetchLatestFromNpm,
6
6
  getUpdateNotification,
7
7
  isNewer
8
- } from "./chunk-RZ4ZDRYA.js";
8
+ } from "./chunk-DIOODAYM.js";
9
9
  import "./chunk-F5DCFAKI.js";
10
10
  export {
11
11
  cachePath,
@@ -15,4 +15,4 @@ export {
15
15
  getUpdateNotification,
16
16
  isNewer
17
17
  };
18
- //# sourceMappingURL=update-check-J5ZVKS73.js.map
18
+ //# sourceMappingURL=update-check-VLVT4IV2.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  helpCmd,
3
3
  versionCmd
4
- } from "./chunk-BZHT5GPF.js";
4
+ } from "./chunk-WHEYHDIE.js";
5
5
  import "./chunk-F5DCFAKI.js";
6
6
  export {
7
7
  helpCmd,
8
8
  versionCmd
9
9
  };
10
- //# sourceMappingURL=version-help-HN32QYQN.js.map
10
+ //# sourceMappingURL=version-help-ATOKGMTK.js.map
@@ -21,6 +21,7 @@ interface CliWebUIOptions {
21
21
  fallbackProfiles?: Record<string, string[]> | undefined;
22
22
  favoriteModels?: string[] | undefined;
23
23
  disabledModels?: string[] | undefined;
24
+ disabledProviders?: string[] | undefined;
24
25
  favoriteModelsOnly?: boolean | undefined;
25
26
  modelAvailabilitySchedule?: ModelBlackoutRule[] | undefined;
26
27
  fallbackAuto?: boolean | undefined;
@@ -81,6 +81,7 @@ export declare function createWebuiRouteContexts({ opts, profileConfigPath, prof
81
81
  projectsCtx: EmbeddedProjectContext;
82
82
  mailboxRoutes: import("@wrongstack/webui-server").MailboxRouteHandlers;
83
83
  chimeraRoutes: import("@wrongstack/webui-server").ChimeraRouteHandlers;
84
+ codeAssistRoutes: import("@wrongstack/webui-server").CodeAssistRouteHandlers | undefined;
84
85
  sessionsCtx: EmbeddedSessionContext;
85
86
  connectionCtx: EmbeddedConversationContext;
86
87
  };
@@ -1,3 +1,6 @@
1
+ import {
2
+ WEBUI_SESSION_CHILD_CAPABILITIES
3
+ } from "./chunk-P3Q3KMFH.js";
1
4
  import {
2
5
  createKanbanRunMirror
3
6
  } from "./chunk-VCYZ3WZV.js";
@@ -5,8 +8,9 @@ import {
5
8
  createKanbanSupervisor
6
9
  } from "./chunk-R4QGL6GB.js";
7
10
  import {
8
- WEBUI_SESSION_CHILD_CAPABILITIES
9
- } from "./chunk-ZMX5HRLI.js";
11
+ loadConfigProviders,
12
+ mutateConfigProviders
13
+ } from "./chunk-ZYACRPLN.js";
10
14
  import {
11
15
  createHqCommandDispatcher,
12
16
  createProjectKanbanAssignHandler,
@@ -18,10 +22,6 @@ import {
18
22
  import {
19
23
  CLI_VERSION
20
24
  } from "./chunk-F5DCFAKI.js";
21
- import {
22
- loadConfigProviders,
23
- mutateConfigProviders
24
- } from "./chunk-LUMETJFO.js";
25
25
 
26
26
  // src/webui-server-lifecycle.ts
27
27
  import { toErrorMessage } from "@wrongstack/core/utils/error";
@@ -374,6 +374,36 @@ function runWebuiServerLifecycle({
374
374
  return { stopped };
375
375
  }
376
376
 
377
+ // src/webui-session-retirement.ts
378
+ import { resolvePendingConfirmsForSession } from "@wrongstack/webui-server";
379
+ function createWebuiSessionRetirement(inputs) {
380
+ const { opts, getForegroundSession, pendingConfirms, abortControllers, sessionAgents } = inputs;
381
+ const retireUndisplayedSessions = (sessionIds) => {
382
+ for (const sessionId of sessionIds) {
383
+ if (!sessionId || sessionId === opts.session.id) continue;
384
+ if (sessionId === getForegroundSession().id) continue;
385
+ const orphaned = resolvePendingConfirmsForSession(pendingConfirms, sessionId);
386
+ if (orphaned > 0) {
387
+ console.log(
388
+ JSON.stringify({
389
+ level: "warn",
390
+ event: "webui.confirm_orphaned_by_tab_close",
391
+ sessionId,
392
+ count: orphaned,
393
+ message: `Denied ${orphaned} unanswerable permission prompt(s) for closed session ${sessionId}.`
394
+ })
395
+ );
396
+ }
397
+ if (abortControllers.has(sessionId)) continue;
398
+ opts.onSessionRetired?.(sessionId);
399
+ const agent = sessionAgents.peek(sessionId);
400
+ if (!agent || agent === opts.agent) continue;
401
+ void sessionAgents.endAndClose(sessionId);
402
+ }
403
+ };
404
+ return { retireUndisplayedSessions };
405
+ }
406
+
377
407
  // src/webui-server.ts
378
408
  import * as path7 from "node:path";
379
409
  import { createCompatibilityTrustBoundary, DefaultSecretScrubber } from "@wrongstack/core/security";
@@ -387,6 +417,7 @@ import {
387
417
  clientWantsSession,
388
418
  collectDisplayedSessionIds,
389
419
  createCustomModeStore,
420
+ createDefaultFileWatcherMetrics,
390
421
  createEmbeddedMessageRouter,
391
422
  createEmbeddedProviderOperations,
392
423
  createSessionAgentRegistry,
@@ -396,7 +427,6 @@ import {
396
427
  findInstalledPackageJson,
397
428
  isStrictPort,
398
429
  resolveAuthToken,
399
- resolvePendingConfirmsForSession,
400
430
  scheduleOwnerlessEmptySessionCleanup,
401
431
  sendSerialized,
402
432
  stampDispatchSession,
@@ -525,6 +555,7 @@ function createEmbeddedClientRegistration(opts, clients, abortControllers, getSe
525
555
  }
526
556
  function startEmbeddedLiveStatusLogger(opts, clients, abortControllers, getSessionAgents, terminalLogView) {
527
557
  return startWebUILiveStatusLogger({
558
+ title: opts.surface === "simpleui" ? "SimpleUI" : "WebUI",
528
559
  events: opts.events,
529
560
  dashboard: terminalLogView,
530
561
  getSessionList: () => {
@@ -664,7 +695,7 @@ function startWebuiCredentialWatcher({
664
695
  }
665
696
  } catch {
666
697
  }
667
- const routingChanged = snapshot.fallbackModels !== void 0 || snapshot.fallbackBridge !== void 0 || hadFallbackBridge || snapshot.fallbackProfiles !== void 0 || snapshot.favoriteModels !== void 0 || snapshot.disabledModels !== void 0 || snapshot.favoriteModelsOnly !== void 0 || snapshot.modelMatrix !== void 0 || snapshot.fallbackAuto !== void 0;
698
+ const routingChanged = snapshot.fallbackModels !== void 0 || snapshot.fallbackBridge !== void 0 || hadFallbackBridge || snapshot.fallbackProfiles !== void 0 || snapshot.favoriteModels !== void 0 || snapshot.disabledModels !== void 0 || snapshot.disabledProviders !== void 0 || snapshot.favoriteModelsOnly !== void 0 || snapshot.modelMatrix !== void 0 || snapshot.fallbackAuto !== void 0;
668
699
  if (routingChanged) {
669
700
  const configStore = opts.agent.container?.safeResolve?.(TOKENS.ConfigStore);
670
701
  configStore?.update({
@@ -673,6 +704,7 @@ function startWebuiCredentialWatcher({
673
704
  ...snapshot.fallbackProfiles !== void 0 ? { fallbackProfiles: snapshot.fallbackProfiles } : {},
674
705
  ...snapshot.favoriteModels !== void 0 ? { favoriteModels: snapshot.favoriteModels } : {},
675
706
  ...snapshot.disabledModels !== void 0 ? { disabledModels: snapshot.disabledModels } : {},
707
+ ...snapshot.disabledProviders !== void 0 ? { disabledProviders: snapshot.disabledProviders } : {},
676
708
  ...snapshot.favoriteModelsOnly !== void 0 ? { favoriteModelsOnly: snapshot.favoriteModelsOnly } : {},
677
709
  ...snapshot.modelMatrix !== void 0 ? { modelMatrix: snapshot.modelMatrix } : {},
678
710
  ...snapshot.fallbackAuto !== void 0 ? { fallbackAuto: snapshot.fallbackAuto } : {}
@@ -1137,6 +1169,9 @@ function createPrefsSeeding(opts) {
1137
1169
  if (Array.isArray(payload["disabledModels"])) {
1138
1170
  patchLiveAppConfig({ disabledModels: payload["disabledModels"] });
1139
1171
  }
1172
+ if (Array.isArray(payload["disabledProviders"])) {
1173
+ patchLiveAppConfig({ disabledProviders: payload["disabledProviders"] });
1174
+ }
1140
1175
  if (typeof payload["favoriteModelsOnly"] === "boolean") {
1141
1176
  patchLiveAppConfig({ favoriteModelsOnly: payload["favoriteModelsOnly"] });
1142
1177
  }
@@ -1206,9 +1241,10 @@ import { TOKENS as TOKENS2 } from "@wrongstack/core/kernel";
1206
1241
  import { SkillInstaller } from "@wrongstack/core/skills";
1207
1242
  import { PromptUsageStore } from "@wrongstack/core/storage";
1208
1243
  import { resolveTokenSavingTier } from "@wrongstack/core/types";
1209
- import { resolveWstackPaths as resolveWstackPaths3 } from "@wrongstack/core/utils";
1244
+ import { isOutsideProject, resolveWstackPaths as resolveWstackPaths3 } from "@wrongstack/core/utils";
1210
1245
  import {
1211
1246
  createChimeraRouteHandlers,
1247
+ createCodeAssistRouteHandlers,
1212
1248
  createMailboxRouteHandlers,
1213
1249
  rebuildSystemPrompt
1214
1250
  } from "@wrongstack/webui-server";
@@ -1359,6 +1395,7 @@ function createWebuiRouteContexts({
1359
1395
  },
1360
1396
  profileConfigPath,
1361
1397
  current: () => opts.appConfig?.systemPrompt?.variant ?? "default",
1398
+ outsideProject: () => isOutsideProject(promptProjectRoot()),
1362
1399
  // Patch the live config before rebuilding — `persistPrefs` writes the
1363
1400
  // file, and the builder reads the variant off the in-memory object.
1364
1401
  applyVariant: async (variant, sessionId) => {
@@ -1435,6 +1472,12 @@ function createWebuiRouteContexts({
1435
1472
  send,
1436
1473
  log: (m) => console.warn(m)
1437
1474
  });
1475
+ const codeAssistRoutes = opts.sddSubagentFactory ? createCodeAssistRouteHandlers({
1476
+ subagentFactory: opts.sddSubagentFactory,
1477
+ projectRoot: () => opts.projectRoot ?? opts.agent.ctx.projectRoot ?? process.cwd(),
1478
+ send,
1479
+ log: (m) => console.warn(m)
1480
+ }) : void 0;
1438
1481
  const sessionsCtx = {
1439
1482
  opts,
1440
1483
  buildSessionStart: (overrides) => buildSessionStartPayload(overrides),
@@ -1491,6 +1534,7 @@ function createWebuiRouteContexts({
1491
1534
  projectsCtx,
1492
1535
  mailboxRoutes,
1493
1536
  chimeraRoutes,
1537
+ codeAssistRoutes,
1494
1538
  sessionsCtx,
1495
1539
  connectionCtx
1496
1540
  };
@@ -1709,7 +1753,9 @@ async function runWebUI(opts) {
1709
1753
  let wsPort = httpPort;
1710
1754
  const globalRoot = opts.globalConfigPath ? path7.dirname(opts.globalConfigPath) : wstackGlobalRoot();
1711
1755
  const profileConfigPath = opts.profileConfigPath ?? opts.globalConfigPath ?? path7.join(globalRoot, "config.json");
1712
- const rateLimitMax = Number.parseInt(process.env["WEBUI_RATE_LIMIT"] ?? "600", 10);
1756
+ const rawRateLimit = process.env["WEBUI_RATE_LIMIT"]?.trim() ?? "";
1757
+ const parsedRateLimit = /^\d+$/.test(rawRateLimit) ? Number(rawRateLimit) : Number.NaN;
1758
+ const rateLimitMax = Number.isSafeInteger(parsedRateLimit) && parsedRateLimit >= 0 ? parsedRateLimit : 600;
1713
1759
  const clients = /* @__PURE__ */ new Map();
1714
1760
  const pendingConfirms = /* @__PURE__ */ new Map();
1715
1761
  const secretScrubber = new DefaultSecretScrubber();
@@ -1816,6 +1862,11 @@ async function runWebUI(opts) {
1816
1862
  onFleetPing: () => {
1817
1863
  void fleetBroadcastCli?.();
1818
1864
  },
1865
+ // Without this, /debug/watcher-metrics 503s and the Debug Dashboard has to
1866
+ // report the watcher as "Unavailable". The CLI host runs no status watcher
1867
+ // of its own, so this object stays all-zero and watcherActive reads false —
1868
+ // which is the truthful state for an embedded host.
1869
+ watcherMetrics: createDefaultFileWatcherMetrics(),
1819
1870
  onTechStackEvent: (event) => broadcast(event),
1820
1871
  getLlm: () => opts.agent.ctx.provider && opts.agent.ctx.model ? { provider: opts.agent.ctx.provider, model: opts.agent.ctx.model } : void 0,
1821
1872
  projectRoot: opts.projectRoot,
@@ -1980,6 +2031,7 @@ async function runWebUI(opts) {
1980
2031
  modelsRegistry: opts.modelsRegistry,
1981
2032
  providerAuthRegistry: opts.providerAuthRegistry,
1982
2033
  getDisabledModels: () => opts.appConfig?.disabledModels ?? [],
2034
+ getDisabledProviders: () => opts.appConfig?.disabledProviders ?? [],
1983
2035
  send,
1984
2036
  broadcast,
1985
2037
  log: (m) => console.log(m)
@@ -2036,29 +2088,13 @@ async function runWebUI(opts) {
2036
2088
  } catch {
2037
2089
  }
2038
2090
  });
2039
- const retireUndisplayedSessions = (sessionIds) => {
2040
- for (const sessionId of sessionIds) {
2041
- if (!sessionId || sessionId === opts.session.id) continue;
2042
- if (sessionId === foregroundSession.id) continue;
2043
- const orphaned = resolvePendingConfirmsForSession(pendingConfirms, sessionId);
2044
- if (orphaned > 0) {
2045
- console.log(
2046
- JSON.stringify({
2047
- level: "warn",
2048
- event: "webui.confirm_orphaned_by_tab_close",
2049
- sessionId,
2050
- count: orphaned,
2051
- message: `Denied ${orphaned} unanswerable permission prompt(s) for closed session ${sessionId}.`
2052
- })
2053
- );
2054
- }
2055
- if (abortControllers.has(sessionId)) continue;
2056
- opts.onSessionRetired?.(sessionId);
2057
- const agent = sessionAgents.peek(sessionId);
2058
- if (!agent || agent === opts.agent) continue;
2059
- void sessionAgents.endAndClose(sessionId);
2060
- }
2061
- };
2091
+ const { retireUndisplayedSessions } = createWebuiSessionRetirement({
2092
+ opts,
2093
+ getForegroundSession: () => foregroundSession,
2094
+ pendingConfirms,
2095
+ abortControllers,
2096
+ sessionAgents
2097
+ });
2062
2098
  const refreshSessionHistory = async () => {
2063
2099
  const list = await opts.sessionStore?.list(200);
2064
2100
  if (!list) return;
@@ -2153,6 +2189,7 @@ async function runWebUI(opts) {
2153
2189
  projectCtx: routeContexts.projectsCtx,
2154
2190
  mailboxRoutes: routeContexts.mailboxRoutes,
2155
2191
  chimeraRoutes: routeContexts.chimeraRoutes,
2192
+ codeAssistRoutes: routeContexts.codeAssistRoutes,
2156
2193
  sessionCtx: routeContexts.sessionsCtx,
2157
2194
  conversationCtx: routeContexts.connectionCtx,
2158
2195
  goalHandler,
@@ -2246,4 +2283,4 @@ async function runWebUI(opts) {
2246
2283
  export {
2247
2284
  runWebUI
2248
2285
  };
2249
- //# sourceMappingURL=webui-server-EXJWLB3X.js.map
2286
+ //# sourceMappingURL=webui-server-GQOVLQS3.js.map
@@ -0,0 +1,10 @@
1
+ export declare function createWebuiSessionRetirement(inputs: {
2
+ opts: import('./webui-server-options.js').CliWebUIOptions;
3
+ getForegroundSession: () => import('@wrongstack/core/types').SessionWriter;
4
+ pendingConfirms: Map<string, import('@wrongstack/webui-server').PendingConfirm>;
5
+ abortControllers: Map<string, AbortController>;
6
+ sessionAgents: import('@wrongstack/webui-server').SessionAgentRegistry;
7
+ }): {
8
+ retireUndisplayedSessions: (sessionIds: string[]) => void;
9
+ };
10
+ //# sourceMappingURL=webui-session-retirement.d.ts.map
@@ -83,6 +83,7 @@ export declare function setupCommandHostState(input: CommandHostStateInput): Pro
83
83
  prompt_variant?: import("@wrongstack/core/statusline").StatuslineLine;
84
84
  queue?: import("@wrongstack/core/statusline").StatuslineLine;
85
85
  quota?: import("@wrongstack/core/statusline").StatuslineLine;
86
+ sandbox?: import("@wrongstack/core/statusline").StatuslineLine;
86
87
  sessions?: import("@wrongstack/core/statusline").StatuslineLine;
87
88
  side_effects?: import("@wrongstack/core/statusline").StatuslineLine;
88
89
  state?: import("@wrongstack/core/statusline").StatuslineLine;
@@ -129,6 +130,7 @@ export declare function setupCommandHostState(input: CommandHostStateInput): Pro
129
130
  prompt_variant?: import("@wrongstack/core/statusline").StatuslineDensity;
130
131
  queue?: import("@wrongstack/core/statusline").StatuslineDensity;
131
132
  quota?: import("@wrongstack/core/statusline").StatuslineDensity;
133
+ sandbox?: import("@wrongstack/core/statusline").StatuslineDensity;
132
134
  sessions?: import("@wrongstack/core/statusline").StatuslineDensity;
133
135
  side_effects?: import("@wrongstack/core/statusline").StatuslineDensity;
134
136
  state?: import("@wrongstack/core/statusline").StatuslineDensity;
@@ -1,5 +1,6 @@
1
1
  import type { Director } from '@wrongstack/core/coordination';
2
2
  import type { ToolRegistry } from '@wrongstack/core/registry';
3
+ import type { Logger } from '@wrongstack/core/types';
3
4
  import type { MultiAgentHost } from '../fleet/host.js';
4
5
  /**
5
6
  * Phase: director activation + announcement (card #7C slice 4).
@@ -7,7 +8,7 @@ import type { MultiAgentHost } from '../fleet/host.js';
7
8
  * Verbatim extraction of the cli-main.ts director block: resolves the Director
8
9
  * from the multi-agent host, restores any fleet checkpoint state, registers
9
10
  * the roster tools, and prints the mode announcement (short line for browser
10
- * surfaces, full paths for the terminal; budget summary only when resuming
11
+ * surfaces, full paths for REPL and the TUI log file; budget summary only when resuming
11
12
  * from a checkpoint so fresh starts stay quiet).
12
13
  *
13
14
  * Returns the resolved Director (or null when Director mode is disabled) so
@@ -20,6 +21,7 @@ export declare function ensureDirectorAndAnnounce(args: {
20
21
  renderer: {
21
22
  writeInfo(msg: string): void;
22
23
  };
24
+ logger?: Pick<Logger, 'info'> | undefined;
23
25
  toolRegistry: ToolRegistry;
24
26
  flags: Record<string, unknown>;
25
27
  /** Fleet paths are optional in DirectorAutonomyResult; the announcement prints them verbatim. */
@@ -4,10 +4,12 @@ import { setupSession } from './session.js';
4
4
  interface SessionEstablishmentArgs {
5
5
  /** Container used to resolve SessionStore + TokenCounter. */
6
6
  container: Pick<CliContext['container'], 'resolve'>;
7
- config: {
8
- provider: string;
9
- model: string;
10
- };
7
+ /**
8
+ * Passed to `setupSession` whole. Rebuilding it here field by field dropped
9
+ * `features` / `tools`, so the leader context always opened with filesystem
10
+ * access outside the project root, whatever the config said.
11
+ */
12
+ config: Parameters<typeof setupSession>[0]['config'];
11
13
  wpaths: Parameters<typeof setupSession>[0]['wpaths'];
12
14
  projectRoot: string;
13
15
  cwd: string;
@@ -29,11 +31,11 @@ interface SessionEstablishmentArgs {
29
31
  tuiOwnsScreen: boolean;
30
32
  }
31
33
  export declare function setupSessionEstablishment(args: SessionEstablishmentArgs): Promise<{
32
- sessionStore: import("@wrongstack/core").SessionStore;
33
- tokenCounter: import("@wrongstack/core").TokenCounter;
34
- context: import("@wrongstack/core").Context;
34
+ sessionStore: import("@wrongstack/core/types").SessionStore;
35
+ tokenCounter: import("@wrongstack/core/types").TokenCounter;
36
+ context: import("@wrongstack/core/agent").Context;
35
37
  planPath: string;
36
- session: import("@wrongstack/core").SessionWriter;
38
+ session: import("@wrongstack/core/types").SessionWriter;
37
39
  attachments: import("@wrongstack/core/storage").DefaultAttachmentStore;
38
40
  queueStore: import("@wrongstack/core/storage").QueueStore;
39
41
  detachTodosCheckpoint: () => void | Promise<void>;
@@ -48,7 +48,7 @@ interface SessionRuntimeArgs {
48
48
  }
49
49
  export declare function setupSessionRuntime(args: SessionRuntimeArgs): {
50
50
  errorRing: import("../session-event-wiring.js").ErrorEntry[];
51
- sessionBridge: import("@wrongstack/core").SessionEventBridge;
51
+ sessionBridge: import("@wrongstack/core/storage").SessionEventBridge;
52
52
  stats: SessionStats;
53
53
  pipelines: import("@wrongstack/core/agent").AgentPipelines;
54
54
  refreshActiveReasoningConfig: (providerId: string, modelId: string) => Promise<void>;
@@ -62,6 +62,9 @@ export declare function setupSession(params: {
62
62
  tools?: {
63
63
  restrictToProjectRoot?: boolean | undefined;
64
64
  } | undefined;
65
+ systemPrompt?: {
66
+ variant?: string | undefined;
67
+ } | undefined;
65
68
  };
66
69
  wpaths: WstackPaths;
67
70
  projectRoot: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/cli",
3
- "version": "1.0.29",
3
+ "version": "1.0.32",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack CLI — terminal AI coding agent with provider catalog from models.dev. Provides `wrongstack` and `wstack` binaries.",
6
6
  "keywords": [
@@ -41,42 +41,42 @@
41
41
  "data"
42
42
  ],
43
43
  "dependencies": {
44
- "@wrongstack/acp": "1.0.29",
45
- "@wrongstack/bench": "1.0.29",
46
- "@wrongstack/core": "1.0.29",
47
- "@wrongstack/kanban": "1.0.29",
48
- "@wrongstack/mcp": "1.0.29",
49
- "@wrongstack/persistence": "1.0.29",
50
- "@wrongstack/plug-lsp": "1.0.29",
51
- "@wrongstack/plugins": "1.0.29",
52
- "@wrongstack/primitives": "1.0.29",
53
- "@wrongstack/providers": "1.0.29",
54
- "@wrongstack/requirement-intake": "1.0.29",
55
- "@wrongstack/runtime": "1.0.29",
56
- "@wrongstack/sage": "1.0.29",
57
- "@wrongstack/sage-mcp": "1.0.29",
58
- "@wrongstack/sdd": "1.0.29",
59
- "@wrongstack/security-scanner": "1.0.29",
60
- "@wrongstack/simpleui": "1.0.29",
61
- "@wrongstack/techstack": "1.0.29",
62
- "@wrongstack/telegram": "1.0.29",
63
- "@wrongstack/tools": "1.0.29",
64
- "@wrongstack/tui": "1.0.29",
65
- "@wrongstack/vector-memory": "1.0.29",
66
- "@wrongstack/webui": "1.0.29",
67
- "@wrongstack/webui-hq": "1.0.29",
68
- "@wrongstack/webui-protocol": "1.0.29",
69
- "@wrongstack/webui-server": "1.0.29",
70
- "@wrongstack/wrongtrace": "1.0.29",
44
+ "@wrongstack/acp": "1.0.32",
45
+ "@wrongstack/bench": "1.0.32",
46
+ "@wrongstack/core": "1.0.32",
47
+ "@wrongstack/kanban": "1.0.32",
48
+ "@wrongstack/mcp": "1.0.32",
49
+ "@wrongstack/persistence": "1.0.32",
50
+ "@wrongstack/plug-lsp": "1.0.32",
51
+ "@wrongstack/plugins": "1.0.32",
52
+ "@wrongstack/primitives": "1.0.32",
53
+ "@wrongstack/providers": "1.0.32",
54
+ "@wrongstack/requirement-intake": "1.0.32",
55
+ "@wrongstack/runtime": "1.0.32",
56
+ "@wrongstack/sage": "1.0.32",
57
+ "@wrongstack/sage-mcp": "1.0.32",
58
+ "@wrongstack/sdd": "1.0.32",
59
+ "@wrongstack/security-scanner": "1.0.32",
60
+ "@wrongstack/simpleui": "1.0.32",
61
+ "@wrongstack/techstack": "1.0.32",
62
+ "@wrongstack/telegram": "1.0.32",
63
+ "@wrongstack/tools": "1.0.32",
64
+ "@wrongstack/tui": "1.0.32",
65
+ "@wrongstack/vector-memory": "1.0.32",
66
+ "@wrongstack/webui": "1.0.32",
67
+ "@wrongstack/webui-hq": "1.0.32",
68
+ "@wrongstack/webui-protocol": "1.0.32",
69
+ "@wrongstack/webui-server": "1.0.32",
70
+ "@wrongstack/wrongtrace": "1.0.32",
71
71
  "ws": "^8.21.3"
72
72
  },
73
73
  "optionalDependencies": {
74
- "@wrongstack/desktop": "1.0.29"
74
+ "@wrongstack/desktop": "1.0.32"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@types/node": "^26.5.1",
78
78
  "@types/ws": "^8.18.1",
79
- "@wrongstack/governance": "1.0.29",
79
+ "@wrongstack/governance": "1.0.32",
80
80
  "jsdom": "^30.0.1",
81
81
  "typescript": "^7.0.2"
82
82
  },
@@ -1,7 +0,0 @@
1
- import {
2
- discoverAndMergeProviders
3
- } from "./chunk-D5GB5MHA.js";
4
- export {
5
- discoverAndMergeProviders
6
- };
7
- //# sourceMappingURL=auto-discover-providers-DXR25GTG.js.map
@@ -1,87 +0,0 @@
1
-
2
- // src/boot/auto-discover-providers.ts
3
- import * as fs from "node:fs/promises";
4
- import * as path from "node:path";
5
- import { discoverOpenAICompatibleModels, resolveDiscoveryTargets } from "@wrongstack/providers";
6
- async function readCache(file) {
7
- try {
8
- return JSON.parse(await fs.readFile(file, "utf8"));
9
- } catch {
10
- return {};
11
- }
12
- }
13
- async function discoverAndMergeProviders(opts) {
14
- const targets = resolveDiscoveryTargets(opts.config);
15
- if (targets.length === 0) return;
16
- const cacheFile = path.join(opts.cacheDir, "discovered-models-cache.json");
17
- const cache = await readCache(cacheFile);
18
- let cacheDirty = false;
19
- await Promise.all(
20
- targets.map(
21
- async ({
22
- id,
23
- cfg,
24
- baseUrl,
25
- apiKey,
26
- cacheKey,
27
- modelDiscoveryPath,
28
- modelDiscoveryAuthoritative
29
- }) => {
30
- const provider = await discoverOpenAICompatibleModels(id, {
31
- baseUrl,
32
- apiKey,
33
- headers: cfg.headers,
34
- providerName: id,
35
- modelDiscoveryPath,
36
- fetchImpl: opts.fetchImpl
37
- });
38
- if (provider) {
39
- const fetchedAt = (/* @__PURE__ */ new Date()).toISOString();
40
- cache[cacheKey] = { fetchedAt, provider };
41
- cacheDirty = true;
42
- if (modelDiscoveryAuthoritative) {
43
- opts.registry.mergeOverlay(
44
- { [id]: provider },
45
- { observedAt: fetchedAt, authoritativeProviderIds: [id] }
46
- );
47
- } else {
48
- opts.registry.mergeOverlay({ [id]: provider });
49
- }
50
- opts.logger?.info(
51
- `auto-discovered ${Object.keys(provider.models).length} models for "${id}" from ${baseUrl}`
52
- );
53
- return;
54
- }
55
- const cached = cache[cacheKey];
56
- if (cached) {
57
- if (modelDiscoveryAuthoritative) {
58
- opts.registry.mergeOverlay(
59
- { [id]: cached.provider },
60
- { observedAt: cached.fetchedAt, authoritativeProviderIds: [id] }
61
- );
62
- } else {
63
- opts.registry.mergeOverlay({ [id]: cached.provider });
64
- }
65
- opts.logger?.warn(
66
- `auto-discovery for "${id}" failed; using ${Object.keys(cached.provider.models).length} cached models from ${cached.fetchedAt}`
67
- );
68
- } else {
69
- opts.logger?.warn(
70
- `auto-discovery for "${id}" failed and no cache available (server at ${baseUrl} unreachable?)`
71
- );
72
- }
73
- }
74
- )
75
- );
76
- if (cacheDirty) {
77
- try {
78
- await fs.writeFile(cacheFile, JSON.stringify(cache), "utf8");
79
- } catch {
80
- }
81
- }
82
- }
83
-
84
- export {
85
- discoverAndMergeProviders
86
- };
87
- //# sourceMappingURL=chunk-D5GB5MHA.js.map
@@ -1,43 +0,0 @@
1
-
2
- // src/auth-menu/openai-codex-oauth.ts
3
- import { color } from "@wrongstack/core/utils";
4
- import {
5
- buildCodexAuthorizeUrl,
6
- CODEX_BASE_URL,
7
- CODEX_FALLBACK_REDIRECT_PORT,
8
- CODEX_PROVIDER_ID,
9
- CODEX_REDIRECT_HOST,
10
- CODEX_REDIRECT_PATH,
11
- CODEX_REDIRECT_PORT,
12
- CODEX_SCOPE,
13
- codexRedirectUri,
14
- createState,
15
- exchangeCodexAuthorizationCode,
16
- extractAccountId,
17
- generatePkce,
18
- parseAuthorizationInput,
19
- refreshCodexTokens,
20
- resolveCodexModels
21
- } from "@wrongstack/providers/oauth";
22
- import {
23
- CODEX_BASE_URL as CODEX_BASE_URL2,
24
- CODEX_CATALOG_FAMILIES,
25
- CODEX_PROVIDER_ID as CODEX_PROVIDER_ID2,
26
- extractAccountId as extractAccountId2,
27
- FALLBACK_CODEX_MODELS,
28
- fallbackCodexModelIds,
29
- fallbackCodexProviderModels,
30
- fetchCodexModels,
31
- filterCurrentCodexModelIds,
32
- generatePkce as generatePkce2,
33
- isCodexCatalogModel,
34
- parseAuthorizationInput as parseAuthorizationInput2,
35
- resolveCodexModels as resolveCodexModels2
36
- } from "@wrongstack/providers/oauth";
37
-
38
- export {
39
- fallbackCodexProviderModels,
40
- filterCurrentCodexModelIds,
41
- isCodexCatalogModel
42
- };
43
- //# sourceMappingURL=chunk-SIGUWXAA.js.map
@@ -1,10 +0,0 @@
1
- import {
2
- handleHelpVersionShortCircuit
3
- } from "./chunk-IFQ6NQPL.js";
4
- import "./chunk-BZHT5GPF.js";
5
- import "./chunk-F5DCFAKI.js";
6
- import "./chunk-Q4INH2DG.js";
7
- export {
8
- handleHelpVersionShortCircuit
9
- };
10
- //# sourceMappingURL=short-circuit-flags-5N2LPK4R.js.map