@wrongstack/cli 1.0.28 → 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 (135) hide show
  1. package/data/providers.json +8 -177
  2. package/dist/{acp-M4565YUW.js → acp-EDGUWU7N.js} +4 -7
  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-EPR42SWM.js → chunk-2EZ2DHOW.js} +60 -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-RGFWGUAB.js → chunk-4UWCMBPG.js} +159 -3
  25. package/dist/{chunk-RDGGWMTI.js → chunk-65VNCAF6.js} +2 -22
  26. package/dist/{chunk-WQZW3RDP.js → chunk-7BNBD4PE.js} +2 -2
  27. package/dist/chunk-CFHWIFXL.js +123 -0
  28. package/dist/{chunk-RZ4ZDRYA.js → chunk-DIOODAYM.js} +2 -2
  29. package/dist/{chunk-L2RVEQWO.js → chunk-HHRYIDOW.js} +2 -2
  30. package/dist/chunk-LIZXJHZQ.js +61 -0
  31. package/dist/{chunk-YHYINL47.js → chunk-LKFKO4JW.js} +2 -2
  32. package/dist/{chunk-Q4INH2DG.js → chunk-MPQCHBDJ.js} +2 -1
  33. package/dist/{chunk-2ERX3RPN.js → chunk-P3GRLV47.js} +30 -17
  34. package/dist/{chunk-ZMX5HRLI.js → chunk-P3Q3KMFH.js} +6 -4
  35. package/dist/{chunk-KOEO4CJG.js → chunk-PGNERAZL.js} +4 -4
  36. package/dist/{chunk-ENRYW73H.js → chunk-RQ4UBKYH.js} +81 -10
  37. package/dist/{chunk-X756ZS72.js → chunk-SUDNPYWD.js} +2 -2
  38. package/dist/{chunk-LDCGZJTC.js → chunk-TWSQTQKR.js} +12 -4
  39. package/dist/chunk-TXAFIERF.js +37 -0
  40. package/dist/{chunk-UZ2TMHNH.js → chunk-UKP7H2U4.js} +10 -2
  41. package/dist/{chunk-5JYDKG5B.js → chunk-WHEYHDIE.js} +7 -2
  42. package/dist/{chunk-LBPLTTZ6.js → chunk-WTJDSTYD.js} +4 -4
  43. package/dist/{chunk-L5TD7UIG.js → chunk-WXJH4F6K.js} +7 -7
  44. package/dist/{chunk-IS2PPBQV.js → chunk-X4LW5CZM.js} +8 -4
  45. package/dist/{chunk-BBHWW6LR.js → chunk-YL4KCHZG.js} +18 -6
  46. package/dist/{chunk-LUMETJFO.js → chunk-ZYACRPLN.js} +2 -2
  47. package/dist/{cli-context-O2SHBDFH.js → cli-context-ITHGP2CE.js} +91 -84
  48. package/dist/cli-context.d.ts +3 -1
  49. package/dist/cli-infrastructure.d.ts +33 -0
  50. package/dist/{cli-main-BKG4ZVLN.js → cli-main-TQGLKB6D.js} +3783 -2753
  51. package/dist/config-doctor.d.ts +1 -1
  52. package/dist/{config-transfer-RUWLDCNK.js → config-transfer-UE37X4B5.js} +2 -2
  53. package/dist/{execution-THXWTHYT.js → execution-C2IECWF7.js} +5271 -5118
  54. package/dist/execution-chimera-handlers.d.ts +6 -0
  55. package/dist/execution-session-callbacks.d.ts +36 -0
  56. package/dist/execution-webui.d.ts +3 -0
  57. package/dist/execution.d.ts +1 -1
  58. package/dist/fleet/host-acp-runner.d.ts +15 -0
  59. package/dist/fleet/host-budget.d.ts +13 -0
  60. package/dist/fleet/host-context.d.ts +5 -0
  61. package/dist/fleet/host-explore-companion.d.ts +7 -16
  62. package/dist/fleet/host.d.ts +2 -0
  63. package/dist/fleet/status-broadcast.d.ts +1 -1
  64. package/dist/{hq-44F4OQH2.js → hq-KBFDKTDD.js} +13 -7
  65. package/dist/hq-publisher.d.ts +4 -1
  66. package/dist/hq-server/sage-sync-send.d.ts +5 -0
  67. package/dist/hq-server/server-lifecycle.d.ts +1 -1
  68. package/dist/hq-server/snapshot.d.ts +1 -1
  69. package/dist/{hq-server-UIB24LU6.js → hq-server-AVNKZ2PV.js} +2 -2
  70. package/dist/{hq-service-BMMJAHRT.js → hq-service-FGB7BY2D.js} +3 -3
  71. package/dist/hq-ttl-N4DAIAVX.js +7 -0
  72. package/dist/index.js +126 -10
  73. package/dist/{mailbox-serve-GNGXEQ2R.js → mailbox-serve-S536N66F.js} +4 -3
  74. package/dist/{modeldiag-W7XAE625.js → modeldiag-PQILD7TN.js} +26 -8
  75. package/dist/{per-subcommand-help-QDAQASPZ.js → per-subcommand-help-VKPV3OEY.js} +2 -2
  76. package/dist/{plugin-usage-CIGOOTX3.js → plugin-usage-3TZGROK7.js} +3 -3
  77. package/dist/{plugins-HQTXUD6A.js → plugins-ITH4SLO6.js} +4 -4
  78. package/dist/pre-launch/project-check.d.ts +2 -8
  79. package/dist/pre-launch.d.ts +1 -1
  80. package/dist/{project-manifest-7NSFVBM3.js → project-manifest-FTFDCCTZ.js} +2 -2
  81. package/dist/{project-picker-SVBXMPKX.js → project-picker-NZYJKQQC.js} +3 -3
  82. package/dist/provider-cloud-config.d.ts +4 -0
  83. package/dist/provider-config-utils.d.ts +1 -1
  84. package/dist/{providers-models-5Z2PJTEW.js → providers-models-W57I3QOA.js} +3 -3
  85. package/dist/{remote-GB5VXCCT.js → remote-C74BCNND.js} +5 -5
  86. package/dist/{rewind-JA3ZLCNM.js → rewind-7AULJS7F.js} +7 -5
  87. package/dist/sage-FFKUOCQL.js +475 -0
  88. package/dist/sage-connect.d.ts +62 -0
  89. package/dist/sage-hq-sync.d.ts +8 -0
  90. package/dist/sage-sync-ZMTHB477.js +69 -0
  91. package/dist/sandbox-TYGD6FI2.js +131 -0
  92. package/dist/services/sdd/project-context.d.ts +1 -1
  93. package/dist/{sessions-config-XHLXJ5C3.js → sessions-config-VE26SB56.js} +19 -8
  94. package/dist/short-circuit-flags-6LB3EGF7.js +10 -0
  95. package/dist/slash-commands/openai-quota.d.ts +12 -6
  96. package/dist/slash-commands/sandbox.d.ts +5 -0
  97. package/dist/slash-commands/scout-stats.d.ts +46 -0
  98. package/dist/slash-commands/sdd-inspect-commands.d.ts +9 -0
  99. package/dist/slash-commands/sdd-session-commands.d.ts +19 -0
  100. package/dist/slash-commands/sdd.d.ts +1 -1
  101. package/dist/slash-commands/zai-plan.d.ts +26 -0
  102. package/dist/{standalone-auto-update-TOTRGCSA.js → standalone-auto-update-VQC4GYCM.js} +3 -3
  103. package/dist/{standalone-update-LZO3MNLH.js → standalone-update-HZHDZZOR.js} +2 -2
  104. package/dist/subcommands/handlers/automation-credentials.d.ts +8 -0
  105. package/dist/subcommands/handlers/automation.d.ts +3 -0
  106. package/dist/subcommands/handlers/bench-experiments.d.ts +5 -0
  107. package/dist/subcommands/handlers/helpers.d.ts +1 -1
  108. package/dist/subcommands/handlers/sage-sync.d.ts +4 -0
  109. package/dist/subcommands/handlers/sage.d.ts +5 -0
  110. package/dist/subcommands/handlers/sandbox.d.ts +5 -0
  111. package/dist/{subcommands-SRRB3RAS.js → subcommands-QO7VYTSS.js} +2 -2
  112. package/dist/{tools-skills-GH24UCBY.js → tools-skills-33AI6K6S.js} +2 -2
  113. package/dist/tui-provider-quota-menu.d.ts +5 -0
  114. package/dist/{typesafe-WA5O3KVS.js → typesafe-NHC322W5.js} +27 -8
  115. package/dist/{typesafe-topic-replay-ZILIU3WS.js → typesafe-topic-replay-DB2AYL7V.js} +2 -2
  116. package/dist/{typesafe-triage-replay-FGAW7QM7.js → typesafe-triage-replay-27NDAZ3V.js} +2 -2
  117. package/dist/{update-TDZX4IL2.js → update-J5WHAFPE.js} +3 -3
  118. package/dist/{update-check-J5ZVKS73.js → update-check-VLVT4IV2.js} +2 -2
  119. package/dist/{version-help-XJJQ7YSH.js → version-help-ATOKGMTK.js} +2 -2
  120. package/dist/webui-server/prefs-seeding.d.ts +1 -0
  121. package/dist/webui-server/route-contexts.d.ts +1 -0
  122. package/dist/{webui-server-GCXIO3JY.js → webui-server-GQOVLQS3.js} +79 -40
  123. package/dist/webui-session-retirement.d.ts +10 -0
  124. package/dist/wiring/command-host-state.d.ts +2 -0
  125. package/dist/wiring/director-announcement.d.ts +3 -1
  126. package/dist/wiring/session-establishment.d.ts +10 -8
  127. package/dist/wiring/session-runtime.d.ts +1 -1
  128. package/dist/wiring/session.d.ts +3 -0
  129. package/package.json +30 -29
  130. package/dist/auto-discover-providers-DXR25GTG.js +0 -7
  131. package/dist/chunk-3ZTLPNEQ.js +0 -58
  132. package/dist/chunk-D5GB5MHA.js +0 -87
  133. package/dist/chunk-SIGUWXAA.js +0 -43
  134. package/dist/hq-ttl-VJR65OBJ.js +0 -7
  135. package/dist/short-circuit-flags-BSIPTAPD.js +0 -10
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-CZTXF6HY.js";
4
4
  import {
5
5
  createProviderForId
6
- } from "./chunk-BBHWW6LR.js";
6
+ } from "./chunk-YL4KCHZG.js";
7
7
 
8
8
  // src/subcommands/handlers/typesafe-topic-replay.ts
9
9
  import { readdir, readFile } from "node:fs/promises";
@@ -231,4 +231,4 @@ async function replayTopicShift(deps, write) {
231
231
  export {
232
232
  replayTopicShift
233
233
  };
234
- //# sourceMappingURL=typesafe-topic-replay-ZILIU3WS.js.map
234
+ //# sourceMappingURL=typesafe-topic-replay-DB2AYL7V.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createProviderForId
3
- } from "./chunk-BBHWW6LR.js";
3
+ } from "./chunk-YL4KCHZG.js";
4
4
 
5
5
  // src/subcommands/handlers/typesafe-triage-replay.ts
6
6
  import * as path from "node:path";
@@ -212,4 +212,4 @@ async function replayMemoryTriage(deps, write) {
212
212
  export {
213
213
  replayMemoryTriage
214
214
  };
215
- //# sourceMappingURL=typesafe-triage-replay-FGAW7QM7.js.map
215
+ //# sourceMappingURL=typesafe-triage-replay-27NDAZ3V.js.map
@@ -3,9 +3,9 @@ import {
3
3
  detectUpdatePackageName,
4
4
  runUpdateCommand,
5
5
  updateCmd
6
- } from "./chunk-KOEO4CJG.js";
6
+ } from "./chunk-PGNERAZL.js";
7
7
  import "./chunk-U3SS4NRH.js";
8
- import "./chunk-RZ4ZDRYA.js";
8
+ import "./chunk-DIOODAYM.js";
9
9
  import "./chunk-F5DCFAKI.js";
10
10
  export {
11
11
  detectUpdatePackageManager,
@@ -13,4 +13,4 @@ export {
13
13
  runUpdateCommand,
14
14
  updateCmd
15
15
  };
16
- //# sourceMappingURL=update-TDZX4IL2.js.map
16
+ //# sourceMappingURL=update-J5WHAFPE.js.map
@@ -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-5JYDKG5B.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-XJJQ7YSH.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,12 +1,16 @@
1
- import {
2
- createKanbanSupervisor
3
- } from "./chunk-R4QGL6GB.js";
4
1
  import {
5
2
  WEBUI_SESSION_CHILD_CAPABILITIES
6
- } from "./chunk-ZMX5HRLI.js";
3
+ } from "./chunk-P3Q3KMFH.js";
7
4
  import {
8
5
  createKanbanRunMirror
9
6
  } from "./chunk-VCYZ3WZV.js";
7
+ import {
8
+ createKanbanSupervisor
9
+ } from "./chunk-R4QGL6GB.js";
10
+ import {
11
+ loadConfigProviders,
12
+ mutateConfigProviders
13
+ } from "./chunk-ZYACRPLN.js";
10
14
  import {
11
15
  createHqCommandDispatcher,
12
16
  createProjectKanbanAssignHandler,
@@ -14,14 +18,10 @@ import {
14
18
  } from "./chunk-NRXWOMK7.js";
15
19
  import {
16
20
  startCliHqConnection
17
- } from "./chunk-RGFWGUAB.js";
21
+ } from "./chunk-4UWCMBPG.js";
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
  }
@@ -1199,15 +1234,17 @@ import {
1199
1234
  normalizeSubagentModelPlan,
1200
1235
  seedSessionSubagentPolicy,
1201
1236
  setSessionSubagentModelPlan,
1202
- setSessionSubagentsAllowed
1237
+ setSessionSubagentPolicy,
1238
+ subagentPolicyModeFrom
1203
1239
  } from "@wrongstack/core/coordination";
1204
1240
  import { TOKENS as TOKENS2 } from "@wrongstack/core/kernel";
1205
1241
  import { SkillInstaller } from "@wrongstack/core/skills";
1206
1242
  import { PromptUsageStore } from "@wrongstack/core/storage";
1207
1243
  import { resolveTokenSavingTier } from "@wrongstack/core/types";
1208
- import { resolveWstackPaths as resolveWstackPaths3 } from "@wrongstack/core/utils";
1244
+ import { isOutsideProject, resolveWstackPaths as resolveWstackPaths3 } from "@wrongstack/core/utils";
1209
1245
  import {
1210
1246
  createChimeraRouteHandlers,
1247
+ createCodeAssistRouteHandlers,
1211
1248
  createMailboxRouteHandlers,
1212
1249
  rebuildSystemPrompt
1213
1250
  } from "@wrongstack/webui-server";
@@ -1324,9 +1361,9 @@ function createWebuiRouteContexts({
1324
1361
  seedSessionSubagentPolicy(target);
1325
1362
  return prefSnapshot(target.meta);
1326
1363
  },
1327
- setSubagentsAllowed: (allowed, sessionId) => setSessionSubagentsAllowed(
1364
+ setSubagentsAllowed: (allowed, sessionId, companions) => setSessionSubagentPolicy(
1328
1365
  sessionId ? getSessionAgent(sessionId).ctx : opts.agent.ctx,
1329
- allowed
1366
+ subagentPolicyModeFrom(allowed, companions)
1330
1367
  ),
1331
1368
  setSubagentModelPlan: (plan, sessionId) => setSessionSubagentModelPlan(
1332
1369
  sessionId ? getSessionAgent(sessionId).ctx : opts.agent.ctx,
@@ -1358,6 +1395,7 @@ function createWebuiRouteContexts({
1358
1395
  },
1359
1396
  profileConfigPath,
1360
1397
  current: () => opts.appConfig?.systemPrompt?.variant ?? "default",
1398
+ outsideProject: () => isOutsideProject(promptProjectRoot()),
1361
1399
  // Patch the live config before rebuilding — `persistPrefs` writes the
1362
1400
  // file, and the builder reads the variant off the in-memory object.
1363
1401
  applyVariant: async (variant, sessionId) => {
@@ -1434,6 +1472,12 @@ function createWebuiRouteContexts({
1434
1472
  send,
1435
1473
  log: (m) => console.warn(m)
1436
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;
1437
1481
  const sessionsCtx = {
1438
1482
  opts,
1439
1483
  buildSessionStart: (overrides) => buildSessionStartPayload(overrides),
@@ -1490,6 +1534,7 @@ function createWebuiRouteContexts({
1490
1534
  projectsCtx,
1491
1535
  mailboxRoutes,
1492
1536
  chimeraRoutes,
1537
+ codeAssistRoutes,
1493
1538
  sessionsCtx,
1494
1539
  connectionCtx
1495
1540
  };
@@ -1708,7 +1753,9 @@ async function runWebUI(opts) {
1708
1753
  let wsPort = httpPort;
1709
1754
  const globalRoot = opts.globalConfigPath ? path7.dirname(opts.globalConfigPath) : wstackGlobalRoot();
1710
1755
  const profileConfigPath = opts.profileConfigPath ?? opts.globalConfigPath ?? path7.join(globalRoot, "config.json");
1711
- 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;
1712
1759
  const clients = /* @__PURE__ */ new Map();
1713
1760
  const pendingConfirms = /* @__PURE__ */ new Map();
1714
1761
  const secretScrubber = new DefaultSecretScrubber();
@@ -1800,6 +1847,7 @@ async function runWebUI(opts) {
1800
1847
  });
1801
1848
  let fleetBroadcastCli = null;
1802
1849
  const httpServer = await startStaticServe({
1850
+ getSessionProjectRoot: (sessionId) => sessionAgentsRef?.peek(sessionId)?.ctx.projectRoot ?? (opts.agent.ctx.session?.id === sessionId ? opts.agent.ctx.projectRoot : void 0),
1803
1851
  host,
1804
1852
  httpPort,
1805
1853
  globalRoot,
@@ -1814,6 +1862,11 @@ async function runWebUI(opts) {
1814
1862
  onFleetPing: () => {
1815
1863
  void fleetBroadcastCli?.();
1816
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(),
1817
1870
  onTechStackEvent: (event) => broadcast(event),
1818
1871
  getLlm: () => opts.agent.ctx.provider && opts.agent.ctx.model ? { provider: opts.agent.ctx.provider, model: opts.agent.ctx.model } : void 0,
1819
1872
  projectRoot: opts.projectRoot,
@@ -1978,6 +2031,7 @@ async function runWebUI(opts) {
1978
2031
  modelsRegistry: opts.modelsRegistry,
1979
2032
  providerAuthRegistry: opts.providerAuthRegistry,
1980
2033
  getDisabledModels: () => opts.appConfig?.disabledModels ?? [],
2034
+ getDisabledProviders: () => opts.appConfig?.disabledProviders ?? [],
1981
2035
  send,
1982
2036
  broadcast,
1983
2037
  log: (m) => console.log(m)
@@ -2034,29 +2088,13 @@ async function runWebUI(opts) {
2034
2088
  } catch {
2035
2089
  }
2036
2090
  });
2037
- const retireUndisplayedSessions = (sessionIds) => {
2038
- for (const sessionId of sessionIds) {
2039
- if (!sessionId || sessionId === opts.session.id) continue;
2040
- if (sessionId === foregroundSession.id) continue;
2041
- const orphaned = resolvePendingConfirmsForSession(pendingConfirms, sessionId);
2042
- if (orphaned > 0) {
2043
- console.log(
2044
- JSON.stringify({
2045
- level: "warn",
2046
- event: "webui.confirm_orphaned_by_tab_close",
2047
- sessionId,
2048
- count: orphaned,
2049
- message: `Denied ${orphaned} unanswerable permission prompt(s) for closed session ${sessionId}.`
2050
- })
2051
- );
2052
- }
2053
- if (abortControllers.has(sessionId)) continue;
2054
- opts.onSessionRetired?.(sessionId);
2055
- const agent = sessionAgents.peek(sessionId);
2056
- if (!agent || agent === opts.agent) continue;
2057
- void sessionAgents.endAndClose(sessionId);
2058
- }
2059
- };
2091
+ const { retireUndisplayedSessions } = createWebuiSessionRetirement({
2092
+ opts,
2093
+ getForegroundSession: () => foregroundSession,
2094
+ pendingConfirms,
2095
+ abortControllers,
2096
+ sessionAgents
2097
+ });
2060
2098
  const refreshSessionHistory = async () => {
2061
2099
  const list = await opts.sessionStore?.list(200);
2062
2100
  if (!list) return;
@@ -2151,6 +2189,7 @@ async function runWebUI(opts) {
2151
2189
  projectCtx: routeContexts.projectsCtx,
2152
2190
  mailboxRoutes: routeContexts.mailboxRoutes,
2153
2191
  chimeraRoutes: routeContexts.chimeraRoutes,
2192
+ codeAssistRoutes: routeContexts.codeAssistRoutes,
2154
2193
  sessionCtx: routeContexts.sessionsCtx,
2155
2194
  conversationCtx: routeContexts.connectionCtx,
2156
2195
  goalHandler,
@@ -2244,4 +2283,4 @@ async function runWebUI(opts) {
2244
2283
  export {
2245
2284
  runWebUI
2246
2285
  };
2247
- //# sourceMappingURL=webui-server-GCXIO3JY.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.28",
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,41 +41,42 @@
41
41
  "data"
42
42
  ],
43
43
  "dependencies": {
44
- "@wrongstack/acp": "1.0.28",
45
- "@wrongstack/bench": "1.0.28",
46
- "@wrongstack/core": "1.0.28",
47
- "@wrongstack/kanban": "1.0.28",
48
- "@wrongstack/mcp": "1.0.28",
49
- "@wrongstack/persistence": "1.0.28",
50
- "@wrongstack/plug-lsp": "1.0.28",
51
- "@wrongstack/plugins": "1.0.28",
52
- "@wrongstack/primitives": "1.0.28",
53
- "@wrongstack/providers": "1.0.28",
54
- "@wrongstack/requirement-intake": "1.0.28",
55
- "@wrongstack/runtime": "1.0.28",
56
- "@wrongstack/sage": "1.0.28",
57
- "@wrongstack/sdd": "1.0.28",
58
- "@wrongstack/security-scanner": "1.0.28",
59
- "@wrongstack/simpleui": "1.0.28",
60
- "@wrongstack/techstack": "1.0.28",
61
- "@wrongstack/telegram": "1.0.28",
62
- "@wrongstack/tools": "1.0.28",
63
- "@wrongstack/tui": "1.0.28",
64
- "@wrongstack/vector-memory": "1.0.28",
65
- "@wrongstack/webui": "1.0.28",
66
- "@wrongstack/webui-hq": "1.0.28",
67
- "@wrongstack/webui-protocol": "1.0.28",
68
- "@wrongstack/webui-server": "1.0.28",
69
- "@wrongstack/wrongtrace": "1.0.28",
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",
70
71
  "ws": "^8.21.3"
71
72
  },
72
73
  "optionalDependencies": {
73
- "@wrongstack/desktop": "1.0.28"
74
+ "@wrongstack/desktop": "1.0.32"
74
75
  },
75
76
  "devDependencies": {
76
77
  "@types/node": "^26.5.1",
77
78
  "@types/ws": "^8.18.1",
78
- "@wrongstack/governance": "1.0.28",
79
+ "@wrongstack/governance": "1.0.32",
79
80
  "jsdom": "^30.0.1",
80
81
  "typescript": "^7.0.2"
81
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,58 +0,0 @@
1
-
2
- // src/subcommands/index.ts
3
- var loaders = {
4
- acp: async () => (await import("./acp-M4565YUW.js")).acpCmd,
5
- init: async () => (await import("./init-DRMMFG2G.js")).initCmd,
6
- auth: async () => (await import("./auth-TE55JF4Z.js")).authCmd,
7
- update: async () => (await import("./update-TDZX4IL2.js")).updateCmd,
8
- remote: async () => (await import("./remote-GB5VXCCT.js")).remoteCmd,
9
- sessions: async () => (await import("./sessions-config-XHLXJ5C3.js")).sessionsCmd,
10
- config: async () => (await import("./sessions-config-XHLXJ5C3.js")).configCmd,
11
- "config-export": async () => (await import("./config-transfer-RUWLDCNK.js")).configExportCmd,
12
- "config-import": async () => (await import("./config-transfer-RUWLDCNK.js")).configImportCmd,
13
- rewind: async () => (await import("./rewind-JA3ZLCNM.js")).rewindCmd,
14
- replay: async () => (await import("./replay-JJ2NOWD6.js")).replayCmd,
15
- audit: async () => (await import("./audit-46YK5DSC.js")).auditCmd,
16
- tools: async () => (await import("./tools-skills-GH24UCBY.js")).toolsCmd,
17
- skills: async () => (await import("./tools-skills-GH24UCBY.js")).skillsCmd,
18
- "skill-suggest": async () => (await import("./skill-suggest-L2EVWB6R.js")).skillSuggestCmd,
19
- typesafe: async () => (await import("./typesafe-WA5O3KVS.js")).typesafeCmd,
20
- providers: async () => (await import("./providers-models-5Z2PJTEW.js")).providersCmd,
21
- models: async () => (await import("./providers-models-5Z2PJTEW.js")).modelsCmd,
22
- mcp: async () => (await import("./mcp-LBS45HWZ.js")).mcpCmd,
23
- plugin: async () => (await import("./plugin-usage-CIGOOTX3.js")).pluginCmd,
24
- plugins: async () => (await import("./plugin-usage-CIGOOTX3.js")).pluginCmd,
25
- diag: async () => (await import("./diag-doctor-BIZAFIAT.js")).diagCmd,
26
- doctor: async () => (await import("./diag-doctor-BIZAFIAT.js")).doctorCmd,
27
- "proxy-status": async () => (await import("./diag-doctor-BIZAFIAT.js")).proxyCmd,
28
- export: async () => (await import("./export-VVRIOWFV.js")).exportCmd,
29
- usage: async () => (await import("./plugin-usage-CIGOOTX3.js")).usageCmd,
30
- version: async () => (await import("./version-help-XJJQ7YSH.js")).versionCmd,
31
- help: async () => (await import("./version-help-XJJQ7YSH.js")).helpCmd,
32
- projects: async () => (await import("./projects-T4CZCA25.js")).projectsCmd,
33
- modeldiag: async () => (await import("./modeldiag-W7XAE625.js")).modeldiagCmd,
34
- quick: async () => (await import("./quick-CNB4Z3HS.js")).quickCmd,
35
- bench: async () => (await import("./bench-GTLPM22B.js")).benchCmd,
36
- chronicle: async () => (await import("./chronicle-UTFETHP6.js")).chronicleCmd,
37
- hq: async () => (await import("./hq-44F4OQH2.js")).hqCmd,
38
- mailbox: async () => (await import("./mailbox-serve-GNGXEQ2R.js")).mailboxServeCmd,
39
- permissions: async () => (await import("./permissions-PL27UHYD.js")).permissionsCmd,
40
- project: async () => (await import("./project-AOQI5XTK.js")).projectCmd,
41
- governance: async () => (await import("./governance-RYSHV675.js")).governanceCmd,
42
- "import-claude-code": async () => (await import("./import-claude-code-AYG24RG2.js")).importClaudeCodeCmd
43
- };
44
- var subcommands = Object.fromEntries(
45
- Object.entries(loaders).map(
46
- ([name, load]) => [
47
- name,
48
- async (args, deps) => (await load())(args, deps)
49
- ]
50
- )
51
- );
52
- var subcommandNames = Object.keys(loaders);
53
-
54
- export {
55
- subcommands,
56
- subcommandNames
57
- };
58
- //# sourceMappingURL=chunk-3ZTLPNEQ.js.map