@wrongstack/webui-server 0.284.1 → 0.285.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 (174) hide show
  1. package/dist/index.d.ts +11 -2300
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +1019 -277
  4. package/dist/index.js.map +7 -1
  5. package/dist/server/autophase-routes.d.ts +10 -0
  6. package/dist/server/autophase-routes.d.ts.map +1 -0
  7. package/dist/server/autophase-ws-handler.d.ts +87 -0
  8. package/dist/server/autophase-ws-handler.d.ts.map +1 -0
  9. package/dist/server/backend-services.d.ts +114 -0
  10. package/dist/server/backend-services.d.ts.map +1 -0
  11. package/dist/server/boot.d.ts +19 -0
  12. package/dist/server/boot.d.ts.map +1 -0
  13. package/dist/server/brain-routes.d.ts +9 -0
  14. package/dist/server/brain-routes.d.ts.map +1 -0
  15. package/dist/server/codebase-indexing.d.ts +15 -0
  16. package/dist/server/codebase-indexing.d.ts.map +1 -0
  17. package/dist/server/collaboration-ws-handler.d.ts +159 -0
  18. package/dist/server/collaboration-ws-handler.d.ts.map +1 -0
  19. package/dist/server/completion-handlers.d.ts +39 -0
  20. package/dist/server/completion-handlers.d.ts.map +1 -0
  21. package/dist/server/connection-handler.d.ts +72 -0
  22. package/dist/server/connection-handler.d.ts.map +1 -0
  23. package/dist/server/context-meta.d.ts +28 -0
  24. package/dist/server/context-meta.d.ts.map +1 -0
  25. package/dist/server/custom-context-modes.d.ts +43 -0
  26. package/dist/server/custom-context-modes.d.ts.map +1 -0
  27. package/dist/server/design-handlers.d.ts +40 -0
  28. package/dist/server/design-handlers.d.ts.map +1 -0
  29. package/dist/server/discover-mailbox-bridge.d.ts +26 -0
  30. package/dist/server/discover-mailbox-bridge.d.ts.map +1 -0
  31. package/dist/server/entry.d.ts +2 -2
  32. package/dist/server/entry.d.ts.map +1 -0
  33. package/dist/server/entry.js +811 -300
  34. package/dist/server/entry.js.map +7 -1
  35. package/dist/server/eternal-iteration-broadcast.d.ts +11 -0
  36. package/dist/server/eternal-iteration-broadcast.d.ts.map +1 -0
  37. package/dist/server/file-handlers.d.ts +45 -0
  38. package/dist/server/file-handlers.d.ts.map +1 -0
  39. package/dist/server/file-picker.d.ts +26 -0
  40. package/dist/server/file-picker.d.ts.map +1 -0
  41. package/dist/server/git-handlers.d.ts +55 -0
  42. package/dist/server/git-handlers.d.ts.map +1 -0
  43. package/dist/server/goal-handlers.d.ts +19 -0
  44. package/dist/server/goal-handlers.d.ts.map +1 -0
  45. package/dist/server/handlers/index.d.ts +12 -0
  46. package/dist/server/handlers/index.d.ts.map +1 -0
  47. package/dist/server/handlers/worklist-handlers.d.ts +49 -0
  48. package/dist/server/handlers/worklist-handlers.d.ts.map +1 -0
  49. package/dist/server/handlers.d.ts +1 -51
  50. package/dist/server/handlers.js +17 -8
  51. package/dist/server/handlers.js.map +7 -1
  52. package/dist/server/http-server/analytics-handler.d.ts +35 -0
  53. package/dist/server/http-server/analytics-handler.d.ts.map +1 -0
  54. package/dist/server/http-server/api-handlers.d.ts +44 -0
  55. package/dist/server/http-server/api-handlers.d.ts.map +1 -0
  56. package/dist/server/http-server.d.ts +108 -0
  57. package/dist/server/http-server.d.ts.map +1 -0
  58. package/dist/server/index.d.ts +93 -0
  59. package/dist/server/index.d.ts.map +1 -0
  60. package/dist/server/instance-registry.d.ts +63 -0
  61. package/dist/server/instance-registry.d.ts.map +1 -0
  62. package/dist/server/kanban-routes.d.ts +7 -0
  63. package/dist/server/kanban-routes.d.ts.map +1 -0
  64. package/dist/server/lifecycle.d.ts +51 -0
  65. package/dist/server/lifecycle.d.ts.map +1 -0
  66. package/dist/server/mailbox-handlers.d.ts +51 -0
  67. package/dist/server/mailbox-handlers.d.ts.map +1 -0
  68. package/dist/server/mailbox-routes.d.ts +10 -0
  69. package/dist/server/mailbox-routes.d.ts.map +1 -0
  70. package/dist/server/mcp-handlers.d.ts +46 -0
  71. package/dist/server/mcp-handlers.d.ts.map +1 -0
  72. package/dist/server/mcp-routes.d.ts +37 -0
  73. package/dist/server/mcp-routes.d.ts.map +1 -0
  74. package/dist/server/memory-handlers.d.ts +28 -0
  75. package/dist/server/memory-handlers.d.ts.map +1 -0
  76. package/dist/server/message-dispatcher.d.ts +41 -0
  77. package/dist/server/message-dispatcher.d.ts.map +1 -0
  78. package/dist/server/mode-handlers.d.ts +50 -0
  79. package/dist/server/mode-handlers.d.ts.map +1 -0
  80. package/dist/server/mode-routes.d.ts +8 -0
  81. package/dist/server/mode-routes.d.ts.map +1 -0
  82. package/dist/server/model-auto-discovery.d.ts +9 -0
  83. package/dist/server/model-auto-discovery.d.ts.map +1 -0
  84. package/dist/server/model-catalog.d.ts +16 -0
  85. package/dist/server/model-catalog.d.ts.map +1 -0
  86. package/dist/server/open-browser.d.ts +16 -0
  87. package/dist/server/open-browser.d.ts.map +1 -0
  88. package/dist/server/path-containment.d.ts +3 -0
  89. package/dist/server/path-containment.d.ts.map +1 -0
  90. package/dist/server/pending-confirms.d.ts +14 -0
  91. package/dist/server/pending-confirms.d.ts.map +1 -0
  92. package/dist/server/port-utils.d.ts +28 -0
  93. package/dist/server/port-utils.d.ts.map +1 -0
  94. package/dist/server/pre-context-services.d.ts +58 -0
  95. package/dist/server/pre-context-services.d.ts.map +1 -0
  96. package/dist/server/pref-helpers.d.ts +43 -0
  97. package/dist/server/pref-helpers.d.ts.map +1 -0
  98. package/dist/server/prefs-routes.d.ts +27 -0
  99. package/dist/server/prefs-routes.d.ts.map +1 -0
  100. package/dist/server/process-handlers.d.ts +20 -0
  101. package/dist/server/process-handlers.d.ts.map +1 -0
  102. package/dist/server/project-handlers.d.ts +53 -0
  103. package/dist/server/project-handlers.d.ts.map +1 -0
  104. package/dist/server/project-routes.d.ts +10 -0
  105. package/dist/server/project-routes.d.ts.map +1 -0
  106. package/dist/server/projects-manifest.d.ts +18 -0
  107. package/dist/server/projects-manifest.d.ts.map +1 -0
  108. package/dist/server/prompts-handlers.d.ts +38 -0
  109. package/dist/server/prompts-handlers.d.ts.map +1 -0
  110. package/dist/server/provider-config-io.d.ts +15 -0
  111. package/dist/server/provider-config-io.d.ts.map +1 -0
  112. package/dist/server/provider-config-standalone.d.ts +13 -0
  113. package/dist/server/provider-config-standalone.d.ts.map +1 -0
  114. package/dist/server/provider-handlers.d.ts +74 -0
  115. package/dist/server/provider-handlers.d.ts.map +1 -0
  116. package/dist/server/provider-keys.d.ts +53 -0
  117. package/dist/server/provider-keys.d.ts.map +1 -0
  118. package/dist/server/provider-routes.d.ts +13 -0
  119. package/dist/server/provider-routes.d.ts.map +1 -0
  120. package/dist/server/provider-store.d.ts +26 -0
  121. package/dist/server/provider-store.d.ts.map +1 -0
  122. package/dist/server/routes.d.ts +182 -0
  123. package/dist/server/routes.d.ts.map +1 -0
  124. package/dist/server/sdd-board-routes.d.ts +11 -0
  125. package/dist/server/sdd-board-routes.d.ts.map +1 -0
  126. package/dist/server/sdd-board-ws-handler.d.ts +57 -0
  127. package/dist/server/sdd-board-ws-handler.d.ts.map +1 -0
  128. package/dist/server/sdd-wizard-routes.d.ts +16 -0
  129. package/dist/server/sdd-wizard-routes.d.ts.map +1 -0
  130. package/dist/server/sdd-wizard-wiring.d.ts +26 -0
  131. package/dist/server/sdd-wizard-wiring.d.ts.map +1 -0
  132. package/dist/server/sdd-wizard-ws-handler.d.ts +66 -0
  133. package/dist/server/sdd-wizard-ws-handler.d.ts.map +1 -0
  134. package/dist/server/server-runtime.d.ts +118 -0
  135. package/dist/server/server-runtime.d.ts.map +1 -0
  136. package/dist/server/session-handlers.d.ts +44 -0
  137. package/dist/server/session-handlers.d.ts.map +1 -0
  138. package/dist/server/session-routes.d.ts +23 -0
  139. package/dist/server/session-routes.d.ts.map +1 -0
  140. package/dist/server/setup-events.d.ts +67 -0
  141. package/dist/server/setup-events.d.ts.map +1 -0
  142. package/dist/server/setup-screen.d.ts +44 -0
  143. package/dist/server/setup-screen.d.ts.map +1 -0
  144. package/dist/server/shell-git-routes.d.ts +10 -0
  145. package/dist/server/shell-git-routes.d.ts.map +1 -0
  146. package/dist/server/shell-open.d.ts +12 -0
  147. package/dist/server/shell-open.d.ts.map +1 -0
  148. package/dist/server/skills-handlers.d.ts +77 -0
  149. package/dist/server/skills-handlers.d.ts.map +1 -0
  150. package/dist/server/specs-routes.d.ts +11 -0
  151. package/dist/server/specs-routes.d.ts.map +1 -0
  152. package/dist/server/specs-ws-handler.d.ts +34 -0
  153. package/dist/server/specs-ws-handler.d.ts.map +1 -0
  154. package/dist/server/start-webui.d.ts +29 -0
  155. package/dist/server/start-webui.d.ts.map +1 -0
  156. package/dist/server/terminal-ws-handler.d.ts +70 -0
  157. package/dist/server/terminal-ws-handler.d.ts.map +1 -0
  158. package/dist/server/token-estimator.d.ts +66 -0
  159. package/dist/server/token-estimator.d.ts.map +1 -0
  160. package/dist/server/types.d.ts +143 -0
  161. package/dist/server/types.d.ts.map +1 -0
  162. package/dist/server/usage-cost.d.ts +39 -0
  163. package/dist/server/usage-cost.d.ts.map +1 -0
  164. package/dist/server/worktree-ws-handler.d.ts +67 -0
  165. package/dist/server/worktree-ws-handler.d.ts.map +1 -0
  166. package/dist/server/ws-auth.d.ts +83 -0
  167. package/dist/server/ws-auth.d.ts.map +1 -0
  168. package/dist/server/ws-payload-validation.d.ts +122 -0
  169. package/dist/server/ws-payload-validation.d.ts.map +1 -0
  170. package/dist/server/ws-utils.d.ts +38 -0
  171. package/dist/server/ws-utils.d.ts.map +1 -0
  172. package/dist/server/zip.d.ts +9 -0
  173. package/dist/server/zip.d.ts.map +1 -0
  174. package/package.json +11 -12
@@ -0,0 +1,58 @@
1
+ import type { Config, Logger, MemoryStore } from '@wrongstack/core';
2
+ import { DefaultTokenCounter } from '@wrongstack/core/infrastructure';
3
+ import { AgentStatusTracker, AnnotationsStore, DefaultModeStore, DefaultPromptLoader, DefaultSessionReader, DefaultSessionStore, DefaultSkillLoader, EventBus, PromptUsageStore, ProviderRegistry, SkillInstaller, ToolRegistry, Context, type Container, type ConfigStore, type ModelsRegistry, type Provider, type SecretVault, type SessionStore } from '@wrongstack/core';
4
+ import type { WstackPaths } from '@wrongstack/core/utils';
5
+ import type { WebUIOptions } from './types.js';
6
+ import type { CustomModeStore } from './custom-context-modes.js';
7
+ export interface PreContextServicesInput {
8
+ config: Config;
9
+ wpaths: WstackPaths;
10
+ logger: Logger;
11
+ opts: WebUIOptions;
12
+ vault: SecretVault;
13
+ globalConfigPath: string;
14
+ projectRoot: string;
15
+ workingDir: string;
16
+ needsProvider: boolean;
17
+ /** Callback to register/refresh the project in the manifest. */
18
+ touchProject: (root: string, workDir?: string) => Promise<void>;
19
+ }
20
+ export interface PreContextServices {
21
+ modelsRegistry: ModelsRegistry;
22
+ container: Container;
23
+ configStore: ConfigStore;
24
+ providerRegistry: ProviderRegistry;
25
+ toolRegistry: ToolRegistry;
26
+ memoryStore: MemoryStore;
27
+ events: EventBus;
28
+ mcpRegistry: import('@wrongstack/mcp').MCPRegistry;
29
+ sessionStore: SessionStore;
30
+ sessionReader: DefaultSessionReader;
31
+ annotationsStore: AnnotationsStore;
32
+ session: Awaited<ReturnType<DefaultSessionStore['create']>>;
33
+ sessionStartedAt: number;
34
+ statusTracker: AgentStatusTracker | undefined;
35
+ tokenCounter: DefaultTokenCounter;
36
+ modeStore: DefaultModeStore;
37
+ modeId: string;
38
+ customModeStore: CustomModeStore;
39
+ skillLoader: DefaultSkillLoader | undefined;
40
+ skillInstaller: SkillInstaller | undefined;
41
+ promptsCtx: {
42
+ promptLoader: DefaultPromptLoader | undefined;
43
+ promptUsage: PromptUsageStore;
44
+ };
45
+ modelCapabilitiesRef: {
46
+ current: unknown;
47
+ };
48
+ provider: Provider;
49
+ context: Context;
50
+ needsSetup: boolean;
51
+ }
52
+ /**
53
+ * Build all pre-context services: registries, stores, session, system
54
+ * prompt, provider, and context. Returns everything `startWebUI` needs
55
+ * for `createAgentServices` (Phase 1c) + route/dispatcher wiring.
56
+ */
57
+ export declare function createPreContextServices(input: PreContextServicesInput): Promise<PreContextServices>;
58
+ //# sourceMappingURL=pre-context-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-context-services.d.ts","sourceRoot":"","sources":["../../src/server/pre-context-services.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAGhB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAElB,QAAQ,EAGR,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EAEd,YAAY,EACZ,OAAO,EAUP,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAiB1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAUjE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,QAAQ,CAAC;IACjB,WAAW,EAAE,OAAO,iBAAiB,EAAE,WAAW,CAAC;IACnD,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,oBAAoB,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC9C,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC5C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE;QAAE,YAAY,EAAE,mBAAmB,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAC7F,oBAAoB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAwV7B"}
@@ -0,0 +1,43 @@
1
+ import type { SecretVault } from '@wrongstack/core';
2
+ /** Pref keys exposed to the settings panel via prefs.get / prefs.updated. */
3
+ export declare const PREF_KEYS: readonly ['autonomy', 'autonomyDelayMs', 'autoProceedMaxIterations', 'yolo', 'maxIterations', 'chime', 'confirmExit', 'streamFleet', 'nextPrediction', 'enhanceEnabled', 'enhanceDelayMs', 'enhanceLanguage', 'featureMcp', 'featurePlugins', 'featureMemory', 'featureSkills', 'featureModelsRegistry', 'indexOnStart', 'contextAutoCompact', 'contextStrategy', 'contextMode', 'tokenSavingTier', 'maxConcurrent', 'titleAnimation', 'uiLocale', 'logLevel', 'auditLevel', 'hqEnabled', 'hqUrl', 'hqToken', 'hqRawContent', 'tgConfigured', 'tgSessionEnd', 'tgDelegate', 'tgLongToolMs', 'reasoningMode', 'reasoningEffort', 'reasoningPreserve', 'cacheTtl', 'fallbackModels', 'fallbackProfiles', 'favoriteModels', 'favoriteModelsOnly', 'modelMatrix', 'fallbackAuto'];
4
+ export interface PrefHelperDeps {
5
+ globalConfigPath: string;
6
+ vault: SecretVault;
7
+ logger: {
8
+ warn(msg: string): void;
9
+ };
10
+ }
11
+ /**
12
+ * Snapshot the pref keys currently present on `contextMeta`. Structural
13
+ * typing on the meta keeps this decoupled from the `Context` class.
14
+ */
15
+ export declare function prefSnapshot(contextMeta: Record<string, unknown>): Record<string, unknown>;
16
+ /** Mutable holder for the serialized-config-write lock. The helpers update
17
+ * `lock` in place so callers keep a stable reference across writes (the
18
+ * lock is non-poisoning: a failed write resolves the chain but logs).
19
+ *
20
+ * We use a holder object rather than returning the new lock because
21
+ * TypeScript flattens `Promise<Promise<void>>` into `Promise<void>`,
22
+ * which would make `await helper(...)` yield `void` instead of the new
23
+ * lock value. */
24
+ export interface ConfigWriteLockHolder {
25
+ lock: Promise<void>;
26
+ }
27
+ /**
28
+ * Unified global config mutation: read → decrypt → mutate → encrypt → write.
29
+ * All config writes MUST go through this helper so encryption is always
30
+ * preserved and writes are serialized behind the holder's `lock`.
31
+ *
32
+ * Mutates `holder.lock` in place to the new (non-poisoning) chain value.
33
+ */
34
+ export declare function updateGlobalConfig(deps: PrefHelperDeps, holder: ConfigWriteLockHolder, mutate: (config: Record<string, unknown>) => void, errorLabel: string): Promise<void>;
35
+ /**
36
+ * Persist pref changes into the global config.json — the SAME keys the TUI
37
+ * settings picker writes — so a toggle made in the browser survives restarts
38
+ * and is visible to the CLI/TUI (and vice versa on next boot). Best-effort
39
+ * and serialized behind the holder's `lock`; failures log but never break
40
+ * the WS reply.
41
+ */
42
+ export declare function persistPrefsToConfig(deps: PrefHelperDeps, holder: ConfigWriteLockHolder, payload: Record<string, unknown>): Promise<void>;
43
+ //# sourceMappingURL=pref-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pref-helpers.d.ts","sourceRoot":"","sources":["../../src/server/pref-helpers.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,6EAA6E;AAC7E,eAAO,MAAM,SAAS,YACpB,UAAU,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,MAAM,EACN,eAAe,EACf,OAAO,EACP,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,cAAc,CACN,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1F;AAED;;;;;;;kBAOkB;AAClB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EACjD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,CA2Lf"}
@@ -0,0 +1,27 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { WSClientMessage } from './types.js';
3
+ export interface PrefsRouteHandlers {
4
+ /** Respond to the WS client with the current pref snapshot. */
5
+ getPrefs: (ws: WebSocket) => Promise<void>;
6
+ /**
7
+ * Merge the supplied pref payload into context.meta, persist the durable
8
+ * keys to config.json, apply any runtime effects (YOLO toggle, feature-flag
9
+ * mutation, fallback chain update, AutoCompaction pipeline add/remove,
10
+ * logger.level), then broadcast the full current snapshot to all clients.
11
+ */
12
+ updatePrefs: (ws: WebSocket, payload: Record<string, unknown>) => Promise<void>;
13
+ }
14
+ /**
15
+ * Chain-of-responsibility dispatcher for the `prefs.*` WS message family.
16
+ * Returns `true` if the message was handled by this layer (so the caller's
17
+ * chain short-circuits), `false` if it should fall through to the next layer
18
+ * or the residual switch.
19
+ *
20
+ * Owned prefixes:
21
+ * - `prefs.get`
22
+ * - `prefs.update`
23
+ *
24
+ * Regression-tested by packages/webui/tests/server/dispatcher-routing.test.ts.
25
+ */
26
+ export declare function handlePrefsRoute(ws: WebSocket, msg: WSClientMessage, handlers: PrefsRouteHandlers): Promise<boolean>;
27
+ //# sourceMappingURL=prefs-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefs-routes.d.ts","sourceRoot":"","sources":["../../src/server/prefs-routes.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C;;;;;OAKG;IACH,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Process-registry WebSocket handlers for the WebUI server, extracted from the
3
+ * `handleMessage` switch in `index.ts` as part of splitting that file (#31).
4
+ *
5
+ * case 'process.list': return handleProcessList(ws);
6
+ * case 'process.kill': return handleProcessKill(ws, msg.payload);
7
+ * case 'process.killAll': return handleProcessKillAll(ws);
8
+ *
9
+ * All three reach the registry via a dynamic `@wrongstack/tools` import so the
10
+ * server starts even when that package is unavailable, and never throw — a
11
+ * failure is reported back over the socket instead.
12
+ */
13
+ import type { WebSocket } from 'ws';
14
+ /** Broadcast the tracked-process list; an empty list on any registry failure. */
15
+ export declare function handleProcessList(ws: WebSocket): Promise<void>;
16
+ /** Kill one tracked PID. Rejects invalid payloads and protected processes. */
17
+ export declare function handleProcessKill(ws: WebSocket, payload: unknown): Promise<void>;
18
+ /** Kill every tracked process. */
19
+ export declare function handleProcessKillAll(ws: WebSocket): Promise<void>;
20
+ //# sourceMappingURL=process-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-handlers.d.ts","sourceRoot":"","sources":["../../src/server/process-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAIpC,iFAAiF;AACjF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpE;AAED,8EAA8E;AAC9E,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtF;AAED,kCAAkC;AAClC,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE"}
@@ -0,0 +1,53 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { Context, DefaultSessionStore, MemoryStore, DefaultModeStore, SkillLoader, ToolRegistry } from '@wrongstack/core';
3
+ import type { DefaultTokenCounter } from '@wrongstack/core/infrastructure';
4
+ import type { ConnectedClient } from './types.js';
5
+ import type { ProjectRouteHandlers } from './project-routes.js';
6
+ type Session = Awaited<ReturnType<DefaultSessionStore['create']>>;
7
+ type SessionStartPayload = {
8
+ sessionId: string;
9
+ model: string;
10
+ provider: string;
11
+ maxContext: number;
12
+ inputCost: number;
13
+ outputCost: number;
14
+ cacheReadCost: number;
15
+ projectName: string;
16
+ projectRoot: string;
17
+ cwd: string;
18
+ mode: string;
19
+ contextMode: string;
20
+ };
21
+ type ModelCapabilities = unknown;
22
+ export interface ProjectHandlersContext {
23
+ globalConfigPath: string;
24
+ wpaths: {
25
+ globalRoot: string;
26
+ };
27
+ clients: Map<WebSocket, ConnectedClient>;
28
+ context: Context;
29
+ modeStore: DefaultModeStore;
30
+ memoryStore: MemoryStore;
31
+ skillLoader: SkillLoader | undefined;
32
+ modelCapabilities: ModelCapabilities;
33
+ toolRegistry: ToolRegistry;
34
+ tokenCounter: DefaultTokenCounter;
35
+ config: {
36
+ provider: string;
37
+ model: string;
38
+ };
39
+ getModeId: () => string;
40
+ getProjectRoot: () => string;
41
+ getSession: () => Session;
42
+ setProjectRoot: (p: string) => void;
43
+ setWorkingDir: (p: string) => void;
44
+ setSession: (s: Session) => void;
45
+ setSessionStore: (s: DefaultSessionStore) => void;
46
+ setSessionStartedAt: (t: number) => void;
47
+ /** Abort + clear any in-flight runLock before switching projects. */
48
+ abortRunLock: () => void;
49
+ sessionStartPayload: () => Promise<SessionStartPayload>;
50
+ }
51
+ export declare function createProjectHandlers(ctx: ProjectHandlersContext): ProjectRouteHandlers;
52
+ export {};
53
+ //# sourceMappingURL=project-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-handlers.d.ts","sourceRoot":"","sources":["../../src/server/project-handlers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAMhE,KAAK,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE,KAAK,mBAAmB,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AACF,KAAK,iBAAiB,GAAG,OAAO,CAAC;AAEjC,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,mBAAmB,CAAC;IAClC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAE5C,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC;IAE1B,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,eAAe,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,mBAAmB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,qEAAqE;IACrE,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,mBAAmB,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACzD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,oBAAoB,CAiEvF"}
@@ -0,0 +1,10 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { WSClientMessage } from './types.js';
3
+ export interface ProjectRouteHandlers {
4
+ listProjects: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
5
+ addProject: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
6
+ selectProject: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
7
+ setWorkingDir: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
8
+ }
9
+ export declare function handleProjectRoute(ws: WebSocket, msg: WSClientMessage, handlers: ProjectRouteHandlers): Promise<boolean>;
10
+ //# sourceMappingURL=project-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-routes.d.ts","sourceRoot":"","sources":["../../src/server/project-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,aAAa,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,aAAa,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
@@ -0,0 +1,18 @@
1
+ export interface ProjectEntry {
2
+ name: string;
3
+ root: string;
4
+ slug: string;
5
+ lastSeen?: string | undefined;
6
+ createdAt?: string | undefined;
7
+ /** Working directory of the most recent session (may differ from root). */
8
+ lastWorkingDir?: string | undefined;
9
+ }
10
+ export interface ProjectsManifest {
11
+ projects: ProjectEntry[];
12
+ }
13
+ export declare function projectsJsonPath(globalConfigPath: string): string;
14
+ export declare function loadManifest(globalConfigPath: string): Promise<ProjectsManifest>;
15
+ export declare function saveManifest(manifest: ProjectsManifest, globalConfigPath: string): Promise<void>;
16
+ export declare function generateProjectSlug(rootPath: string): string;
17
+ export declare function ensureProjectDataDir(slug: string, globalConfigPath: string): Promise<string>;
18
+ //# sourceMappingURL=projects-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-manifest.d.ts","sourceRoot":"","sources":["../../src/server/projects-manifest.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAsB,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQtF;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared prompt-library WebSocket handlers for BOTH the standalone WebUI server
3
+ * (`packages/webui/src/server/index.ts`) and the CLI's `--webui` embedded server
4
+ * (`packages/cli/src/webui-server.ts`). One source of truth so the two servers
5
+ * never drift (the lesson from skills-handlers).
6
+ *
7
+ * Each function handles one request→response cycle; callers drop them into their
8
+ * switch:
9
+ *
10
+ * case 'prompts.search': return handlePromptsSearch(ws, promptsCtx, msg);
11
+ *
12
+ * The prompt library is read across three layers (builtin + user + project) by
13
+ * the injected `PromptLoader`; writes (create/favorite) go to the user layer
14
+ * with copy-on-write for builtins. Treat synced/builtin content as DATA — these
15
+ * handlers never execute it; the client inserts a chosen prompt into the chat
16
+ * input as an ordinary user turn.
17
+ */
18
+ import type { PromptLoader, PromptUsageStore } from '@wrongstack/core';
19
+ import { send } from './ws-utils.js';
20
+ export interface PromptsContext {
21
+ /** Backs all prompt ops. Absent ⇒ feature unavailable. */
22
+ promptLoader: PromptLoader | undefined;
23
+ /** Records per-slug insert counts (shared with CLI `/prompt recent`). */
24
+ promptUsage?: PromptUsageStore | undefined;
25
+ }
26
+ export declare function handlePromptsList(ws: WSLike, ctx: PromptsContext): Promise<void>;
27
+ export declare function handlePromptsSearch(ws: WSLike, ctx: PromptsContext, msg: unknown): Promise<void>;
28
+ export declare function handlePromptsContent(ws: WSLike, ctx: PromptsContext, msg: unknown): Promise<void>;
29
+ export declare function handlePromptsFavorite(ws: WSLike, ctx: PromptsContext, msg: unknown): Promise<void>;
30
+ export declare function handlePromptsCreate(ws: WSLike, ctx: PromptsContext, msg: unknown): Promise<void>;
31
+ /** Record that a prompt was inserted (best-effort; feeds CLI `/prompt recent`). */
32
+ export declare function handlePromptsUsed(ws: WSLike, ctx: PromptsContext, msg: unknown): Promise<void>;
33
+ /** Return recently-inserted prompt slugs (most-recent first) for the modal's Recent view. */
34
+ export declare function handlePromptsRecent(ws: WSLike, ctx: PromptsContext): Promise<void>;
35
+ /** Minimal structural type for the ws.send sink (matches `ws` WebSocket). */
36
+ type WSLike = Parameters<typeof send>[0];
37
+ export {};
38
+ //# sourceMappingURL=prompts-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts-handlers.d.ts","sourceRoot":"","sources":["../../src/server/prompts-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAe,YAAY,EAAE,gBAAgB,EAAkB,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAc,IAAI,EAAE,MAAM,eAAe,CAAC;AA+BjD,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,yEAAyE;IACzE,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAiBD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBtF;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED,mFAAmF;AACnF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpG;AAED,6FAA6F;AAC7F,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED,6EAA6E;AAC7E,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ProviderConfig, type SecretVault } from '@wrongstack/core';
2
+ /**
3
+ * Read the `providers` section from the global config, decrypting
4
+ * secret-bearing fields. Returns an empty record when the config file
5
+ * doesn't exist or has no `providers` key.
6
+ */
7
+ export declare function loadSavedProviders(configPath: string, vault: SecretVault): Promise<Record<string, ProviderConfig>>;
8
+ /**
9
+ * Write `providers` back into the global config, encrypting secrets first.
10
+ * Refuses to overwrite a corrupt-but-existing config file (the operator
11
+ * should fix it manually). When the config file is missing (ENOENT), starts
12
+ * from an empty object.
13
+ */
14
+ export declare function saveProviders(configPath: string, vault: SecretVault, providers: Record<string, ProviderConfig>): Promise<void>;
15
+ //# sourceMappingURL=provider-config-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-config-io.d.ts","sourceRoot":"","sources":["../../src/server/provider-config-io.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAGnG;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAezC;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,13 @@
1
+ import { type ProviderConfig } from '@wrongstack/core';
2
+ /**
3
+ * Small helper for the standalone WebUI entry point: create a
4
+ * `{ load, save }` pair from a config path alone (uses the
5
+ * config-directory-relative `.key` file for the vault). The `--webui`
6
+ * CLI mode and the standalone server both need to read/write the
7
+ * `providers` map identically.
8
+ */
9
+ export declare function createProviderConfigIO(configPath: string): {
10
+ load: () => Promise<Record<string, ProviderConfig>>;
11
+ save: (providers: Record<string, ProviderConfig>) => Promise<void>;
12
+ };
13
+ //# sourceMappingURL=provider-config-standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-config-standalone.d.ts","sourceRoot":"","sources":["../../src/server/provider-config-standalone.ts"],"names":[],"mappings":"AAMA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG3E;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM;IAKrD,IAAI;IACJ,IAAI,cAAc,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;EAGnD"}
@@ -0,0 +1,74 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { ModelsRegistry, ProviderConfig } from '@wrongstack/core';
3
+ import { type OAuthKind } from '@wrongstack/providers/oauth';
4
+ import type { ConnectedClient, WSServerMessage } from './types.js';
5
+ /**
6
+ * Wire shape of one saved provider as broadcast over `providers.saved`.
7
+ * The WebUI's `<ProviderModelsPanel>` consumes this — when
8
+ * `pickedModelId` / `models` is missing, the panel renders the empty
9
+ * state.
10
+ */
11
+ export interface SavedProviderView {
12
+ id: string;
13
+ family?: string | undefined;
14
+ baseUrl?: string | undefined;
15
+ /** Saved model allowlist, verbatim (undefined / [] both possible). */
16
+ models?: string[] | undefined;
17
+ /** First entry of `models`, or undefined when the list is empty/unset. */
18
+ pickedModelId?: string | undefined;
19
+ apiKeys: Array<{
20
+ label: string;
21
+ maskedKey: string;
22
+ isActive: boolean;
23
+ createdAt: string;
24
+ }>;
25
+ }
26
+ /**
27
+ * Canonical projection from in-memory `ProviderConfig` to the
28
+ * `providers.saved` wire shape. Pure (no I/O) so it's unit-tested in
29
+ * isolation — see `tests/server/provider-handlers-projection.test.ts`.
30
+ *
31
+ * Secrets never leave: every key is run through `maskedKey` before it
32
+ * reaches the wire.
33
+ */
34
+ export declare function projectSavedProviders(providers: Record<string, ProviderConfig>): SavedProviderView[];
35
+ export interface ProviderHandlerDeps {
36
+ globalConfigPath: string;
37
+ vault: import('@wrongstack/core').SecretVault;
38
+ /** Shared config write lock — serialized via chained promises */
39
+ setConfigWriteLock: (lock: Promise<void>) => void;
40
+ getConfigWriteLock: () => Promise<void>;
41
+ /** Broadcast a message to all connected WebUI clients */
42
+ broadcast: (clients: Map<WebSocket, ConnectedClient>, msg: WSServerMessage) => void;
43
+ /** Connected WebUI clients map */
44
+ clients: Map<WebSocket, ConnectedClient>;
45
+ /** Used by the ChatGPT OAuth flow's tier-2 model lookup (best-effort). */
46
+ modelsRegistry?: ModelsRegistry | undefined;
47
+ }
48
+ export declare function createProviderHandlers(deps: ProviderHandlerDeps): {
49
+ handleKeyUpsert: (ws: WebSocket, providerId: string, label: string, apiKey: string) => Promise<void>;
50
+ handleKeyDelete: (ws: WebSocket, providerId: string, label: string) => Promise<void>;
51
+ handleKeySetActive: (ws: WebSocket, providerId: string, label: string) => Promise<void>;
52
+ handleProviderAdd: (ws: WebSocket, payload: {
53
+ id: string;
54
+ family: string;
55
+ baseUrl?: string | undefined;
56
+ apiKey?: string | undefined;
57
+ }) => Promise<void>;
58
+ handleProviderRemove: (ws: WebSocket, providerId: string) => Promise<void>;
59
+ handleProviderClearModels: (ws: WebSocket, providerId: string) => Promise<void>;
60
+ handleProviderUndoClear: (ws: WebSocket, providerId: string, previousModels: string[]) => Promise<void>;
61
+ handleProviderUpdate: (ws: WebSocket, payload: {
62
+ id: string;
63
+ family?: string | undefined;
64
+ baseUrl?: string | undefined;
65
+ envVars?: string[] | undefined;
66
+ models?: string[] | undefined;
67
+ }) => Promise<void>;
68
+ handleProviderProbe: (ws: WebSocket, providerId: string, timeoutMs?: number) => Promise<void>;
69
+ handleOAuthStart: (ws: WebSocket, kind: OAuthKind) => Promise<void>;
70
+ handleOAuthCode: (ws: WebSocket, kind: OAuthKind, input: string) => Promise<void>;
71
+ handleOAuthCancel: (ws: WebSocket, kind: OAuthKind) => void;
72
+ loadConfigProviders: () => Promise<Record<string, ProviderConfig>>;
73
+ };
74
+ //# sourceMappingURL=provider-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-handlers.d.ts","sourceRoot":"","sources":["../../src/server/provider-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure provider/API-key record transforms for the WebUI server's `key.*` and
3
+ * `provider.*` WebSocket handlers.
4
+ *
5
+ * These operate on an in-memory `providers` record (the decrypted
6
+ * `config.providers` map) and return a `{ ok, message }` result mirroring the
7
+ * status string the handler sends back to the client. All persistence
8
+ * (load/decrypt, encrypt/atomic-write) and WS messaging stays in `index.ts` —
9
+ * keeping this layer pure means the security-sensitive key bookkeeping (which
10
+ * key is active, when a provider is dropped, how legacy single-key configs are
11
+ * normalized) is unit-testable without a vault or a socket.
12
+ *
13
+ * Extracted from `index.ts`; transforms mutate the passed record in place, the
14
+ * same way the original handlers did before calling `saveProviders`.
15
+ */
16
+ import type { ProviderApiKey, ProviderConfig } from '@wrongstack/core';
17
+ export type ProvidersRecord = Record<string, ProviderConfig>;
18
+ export interface KeyOpResult {
19
+ ok: boolean;
20
+ message: string;
21
+ }
22
+ /**
23
+ * Normalize a provider's keys to the array form, upgrading a legacy single
24
+ * `apiKey` string to a one-element `[{ label: 'default', ... }]` list. Returns
25
+ * fresh copies so callers can mutate without aliasing the stored config.
26
+ */
27
+ export declare function normalizeKeys(cfg: ProviderConfig): ProviderApiKey[];
28
+ /**
29
+ * Write a normalized key list back onto a provider config: drop all key fields
30
+ * when empty, otherwise sync `apiKeys` and re-point `activeKey` if it no longer
31
+ * names a present key. Does NOT mirror the plaintext key to the legacy `apiKey`
32
+ * field — that would leak the secret on accidental serialization. Consumers
33
+ * that need the real key should read from `apiKeys[]` directly.
34
+ */
35
+ export declare function writeKeysBack(cfg: ProviderConfig, keys: ProviderApiKey[]): void;
36
+ /** Mask a secret for display: `••••` for short keys, `abcd…wxyz` otherwise. */
37
+ export declare function maskedKey(key: string | undefined): string;
38
+ /** Add or replace a labeled key for a provider, creating the provider if new. */
39
+ export declare function upsertKey(providers: ProvidersRecord, providerId: string, label: string, apiKey: string, nowIso: string): KeyOpResult;
40
+ /** Remove a labeled key; drops the provider entirely when its last key goes. */
41
+ export declare function deleteKey(providers: ProvidersRecord, providerId: string, label: string): KeyOpResult;
42
+ /** Point a provider's active key at the given label. */
43
+ export declare function setActiveKey(providers: ProvidersRecord, providerId: string, label: string): KeyOpResult;
44
+ /** Register a brand-new provider (optionally with an initial `default` key). */
45
+ export declare function addProvider(providers: ProvidersRecord, payload: {
46
+ id: string;
47
+ family: string;
48
+ baseUrl?: string | undefined;
49
+ apiKey?: string | undefined;
50
+ }, nowIso: string): KeyOpResult;
51
+ /** Remove an entire provider and all its keys. */
52
+ export declare function removeProvider(providers: ProvidersRecord, providerId: string): KeyOpResult;
53
+ //# sourceMappingURL=provider-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-keys.d.ts","sourceRoot":"","sources":["../../src/server/provider-keys.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,EAAE,CAQnE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,CAc/E;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIzD;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CACvB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,WAAW,CAab;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CACvB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,WAAW,CAcb;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAC1B,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,WAAW,CASb;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CACzB,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAClG,MAAM,EAAE,MAAM,GACb,WAAW,CAkBb;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAM1F"}
@@ -0,0 +1,13 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { createProviderHandlers } from './provider-handlers.js';
3
+ import type { WSClientMessage } from './types.js';
4
+ export interface ProviderRouteHandlers {
5
+ listProviders: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
6
+ listSavedProviders: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
7
+ listProviderModels: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
8
+ switchModel: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
9
+ refineModel: (ws: WebSocket, msg: WSClientMessage) => Promise<void>;
10
+ providerHandlers: ReturnType<typeof createProviderHandlers>;
11
+ }
12
+ export declare function handleProviderRoute(ws: WebSocket, msg: WSClientMessage, routes: ProviderRouteHandlers): Promise<boolean>;
13
+ //# sourceMappingURL=provider-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-routes.d.ts","sourceRoot":"","sources":["../../src/server/provider-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,gBAAgB,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CAC7D;AAuCD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgJlB"}
@@ -0,0 +1,26 @@
1
+ import type { DefaultSecretVault } from '@wrongstack/core';
2
+ import type { ProviderApiKey, ProviderConfig } from '@wrongstack/core';
3
+ export interface ProviderStoreDeps {
4
+ globalConfigPath: string;
5
+ vault: DefaultSecretVault;
6
+ }
7
+ /**
8
+ * Serializes concurrent config writes to prevent races between model.switch
9
+ * and key.add/key.update handlers that both read-modify-write globalConfigPath.
10
+ */
11
+ export declare function createConfigWriteLock(): {
12
+ readonly current: Promise<void>;
13
+ acquire(): {
14
+ prev: Promise<void>;
15
+ release: () => void;
16
+ };
17
+ };
18
+ export interface ProviderStore {
19
+ load(): Promise<Record<string, ProviderConfig>>;
20
+ save(providers: Record<string, ProviderConfig>): Promise<void>;
21
+ normalizeKeys(cfg: ProviderConfig): ProviderApiKey[];
22
+ writeKeysBack(cfg: ProviderConfig, keys: ProviderApiKey[]): void;
23
+ maskedKey(key: string | undefined): string;
24
+ }
25
+ export declare function createProviderStore(deps: ProviderStoreDeps): ProviderStore;
26
+ //# sourceMappingURL=provider-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-store.d.ts","sourceRoot":"","sources":["../../src/server/provider-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvE,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB;;;;uBAMZ,IAAI;;EAK5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IACrD,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;CAC5C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAyE1E"}