@wrongstack/webui-server 0.284.0 → 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,11 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { WSServerMessage } from './types.js';
3
+ import type { JournalEntry } from '@wrongstack/core';
4
+ export type EternalSubscribe = (fn: (entry: JournalEntry) => void) => () => void;
5
+ export type EternalBroadcast<C> = (clients: Map<WebSocket, C>, msg: WSServerMessage) => void;
6
+ export interface EternalSubscription {
7
+ /** Tear down the underlying engine subscription. Idempotent. */
8
+ dispose: () => void;
9
+ }
10
+ export declare function createEternalSubscription<C>(subscribe: EternalSubscribe, broadcast: EternalBroadcast<C>, clientsRef: () => Map<WebSocket, C>): EternalSubscription;
11
+ //# sourceMappingURL=eternal-iteration-broadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternal-iteration-broadcast.d.ts","sourceRoot":"","sources":["../../src/server/eternal-iteration-broadcast.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,CAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,KAC9B,MAAM,IAAI,CAAC;AAShB,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;AAE7F,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC9B,UAAU,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,GAClC,mBAAmB,CAgBrB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared file-operation WebSocket handlers for both the standalone WebUI
3
+ * server and the CLI's `--webui` embedded server. Extracted from the
4
+ * duplicated switch cases in `index.ts` and `cli/src/webui-server.ts`.
5
+ *
6
+ * Each function handles the full request→response cycle for one message
7
+ * type. Callers drop them into their switch statement:
8
+ *
9
+ * case 'files.tree': return handleFilesTree(ws, msg, projectRoot);
10
+ */
11
+ import type { WebSocket } from 'ws';
12
+ export interface FilesWriteOptions {
13
+ onWritten?: ((filePath: string) => void | Promise<void>) | undefined;
14
+ }
15
+ /**
16
+ * Build and send a nested directory tree for the File Explorer.
17
+ *
18
+ * Walks `projectRoot` to depth 10 max, skipping heavyweight dirs
19
+ * (node_modules, .git, dist, …) and dot-entries. Responds with
20
+ * `{ type: 'files.tree', payload: { root, tree } }`.
21
+ */
22
+ export declare function handleFilesTree(ws: WebSocket, msg: unknown, projectRoot: string): Promise<void>;
23
+ /**
24
+ * Read a file's content for the Monaco editor.
25
+ *
26
+ * Guards against path traversal (`../` escapes). Responds with
27
+ * `{ type: 'files.read', payload: { filePath, content } }`.
28
+ */
29
+ export declare function handleFilesRead(ws: WebSocket, msg: unknown, projectRoot: string): Promise<void>;
30
+ /**
31
+ * Write file content back to disk (atomic write via tmp + rename).
32
+ *
33
+ * Guards against path traversal. Responds with
34
+ * `{ type: 'files.written', payload: { filePath, success } }`.
35
+ */
36
+ export declare function handleFilesWrite(ws: WebSocket, msg: unknown, projectRoot: string, opts?: FilesWriteOptions): Promise<void>;
37
+ /**
38
+ * Lightweight project file picker for the chat `@` mention popup.
39
+ *
40
+ * Walks `projectRoot` (max depth 8), skipping hidden and heavyweight
41
+ * dirs, then fuzzy-ranks results against `query`. Responds with
42
+ * `{ type: 'files.list', payload: { files } }`.
43
+ */
44
+ export declare function handleFilesList(ws: WebSocket, msg: unknown, projectRoot: string): Promise<void>;
45
+ //# sourceMappingURL=file-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-handlers.d.ts","sourceRoot":"","sources":["../../src/server/file-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAqHpC,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACtE;AAID;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAkGf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Df"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pure filtering + ranking for the `files.list` project file picker (the chat
3
+ * `@`-mention popup). The directory *walk* stays in index.ts (it's I/O), but
4
+ * the two decisions that shape the result — which entries to hide and how to
5
+ * rank matches — are pure and live here so the scoring weights, depth penalty,
6
+ * and tie-break order can be unit tested. A silently-flipped weight would make
7
+ * the picker feel subtly wrong with nothing to catch it.
8
+ */
9
+ /** Heavyweight build/vcs/dependency dirs the picker never descends into. */
10
+ export declare const SKIP_DIRS: ReadonlySet<string>;
11
+ /**
12
+ * Whether a directory entry should be hidden from the picker by its name.
13
+ * Dotfiles are hidden by default, except a few commonly-wanted ones.
14
+ */
15
+ export declare function isHiddenEntry(name: string): boolean;
16
+ /**
17
+ * Rank `paths` against `query` and return up to `limit` paths, best first.
18
+ *
19
+ * Scoring (cheap heuristic, good enough for a picker): exact basename match
20
+ * (100) > basename prefix (60) > path substring (20); non-matches are dropped.
21
+ * Each match is penalized by its path depth so root files sort first. Ties
22
+ * break by lexicographic path. An empty query keeps every path (score 0), so
23
+ * the result is the paths sorted lexicographically, capped to `limit`.
24
+ */
25
+ export declare function rankFiles(paths: readonly string[], query: string, limit: number): string[];
26
+ //# sourceMappingURL=file-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../../src/server/file-picker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,4EAA4E;AAC5E,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CAcxC,CAAC;AAWH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB1F"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared `git.info` WebSocket handler for both the standalone WebUI server and
3
+ * the CLI's `--webui` embedded server. Extracted from the duplicated switch
4
+ * cases in `index.ts` and `cli/src/webui-server.ts`, which had drifted (the
5
+ * standalone copy transposed ahead/behind and never matched deletions). One
6
+ * implementation here keeps both surfaces in lockstep.
7
+ *
8
+ * case 'git.info': return handleGitInfo(ws, projectRoot);
9
+ */
10
+ import type { WebSocket } from 'ws';
11
+ /**
12
+ * Read git branch, change stats, and upstream sync status from `projectRoot`
13
+ * and broadcast a `git.info` message. Never throws — a non-repo / missing-git
14
+ * directory yields an empty-but-valid payload.
15
+ */
16
+ export declare function handleGitInfo(ws: WebSocket, projectRoot: string): Promise<void>;
17
+ /** One changed file in the working tree (vs HEAD). */
18
+ export interface GitChangedFile {
19
+ /** Repo-relative path (POSIX separators, as git reports). */
20
+ path: string;
21
+ /**
22
+ * Single-letter change kind for the badge:
23
+ * `M` modified, `A` added/staged-new, `D` deleted, `R` renamed,
24
+ * `?` untracked, `C` copied, `U` unmerged/conflict.
25
+ */
26
+ status: string;
27
+ /** Lines added (best-effort; 0 for untracked-binary / unknown). */
28
+ added: number;
29
+ /** Lines removed (best-effort). */
30
+ deleted: number;
31
+ /** True when the change is at least partly staged. */
32
+ staged: boolean;
33
+ }
34
+ /**
35
+ * Read the working-tree change set (everything that differs from HEAD:
36
+ * staged, unstaged, and untracked) and broadcast a `git.changes` message.
37
+ *
38
+ * The file list comes from `git status --porcelain -z` (NUL-delimited so
39
+ * paths with spaces/unicode survive intact, and renames are unambiguous).
40
+ * Per-file line counts come from `--numstat` of both the unstaged and the
41
+ * staged diff, summed. Untracked files intentionally report 0/0 here so the
42
+ * list view does not read every untracked file; `git.diff` loads a selected
43
+ * file lazily on demand.
44
+ * Never throws — a non-repo yields an empty list.
45
+ */
46
+ export declare function handleGitChanges(ws: WebSocket, projectRoot: string): Promise<void>;
47
+ /**
48
+ * Resolve the before/after text for a single file and broadcast a `git.diff`
49
+ * message. `oldText` is the file at HEAD (`git show HEAD:<path>`), `newText`
50
+ * is the current working-tree content. New/untracked files have empty
51
+ * `oldText`; deleted files have empty `newText`. Binary or oversized files
52
+ * are reported with a flag instead of content so the client can show a notice.
53
+ */
54
+ export declare function handleGitDiff(ws: WebSocket, projectRoot: string, path: string): Promise<void>;
55
+ //# sourceMappingURL=git-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-handlers.d.ts","sourceRoot":"","sources":["../../src/server/git-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAIpC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CrF;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;CACjB;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFxF;AAID;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Goal-state WebSocket handler for the WebUI server, extracted from the
3
+ * `handleMessage` switch in `index.ts` as part of splitting that file (#31).
4
+ *
5
+ * case 'goal.get': return handleGoalGet(projectRoot, (m) => broadcast(clients, m));
6
+ *
7
+ * Reads the canonical goal.json and broadcasts it to every connected client so
8
+ * all browser tabs share one goal snapshot. Never throws — a missing or
9
+ * unparseable file broadcasts `null` so clients clear stale goal state.
10
+ */
11
+ /**
12
+ * Read `goal.json` for `projectRoot` and broadcast a `goal.updated` message.
13
+ * The path must match /goal, the autonomy engines, and TUI F9, which all
14
+ * resolve via `resolveWstackPaths().projectGoal`
15
+ * (`~/.wrongstack/projects/<slug>/goal.json`) — NOT the repo-local
16
+ * `.wrongstack/goal.json`.
17
+ */
18
+ export declare function handleGoalGet(projectRoot: string, broadcast: (msg: object) => void): Promise<void>;
19
+ //# sourceMappingURL=goal-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-handlers.d.ts","sourceRoot":"","sources":["../../src/server/goal-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared WebSocket message handlers.
3
+ *
4
+ * Re-exports all handler groups so callers (the standalone `startWebUI`
5
+ * and eventually the CLI's embedded server) can import from a single path.
6
+ *
7
+ * Each handler group lives in its own file and is parameterized by a
8
+ * context interface — the host server provides its own runtime access to
9
+ * agent state, broadcasting, and socket sending.
10
+ */
11
+ export { handleTodosGet, handleTodosClear, handleTodosRemove, handleTodoUpdate, handleTasksGet, handleTaskUpdate, handlePlanGet, handlePlanTemplateUse, handlePlanItemUpdate, handleWorklistMessage, type WorklistContext, type WorklistMessage, } from './worklist-handlers.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { WebSocket } from 'ws';
2
+ import type { TodoItem } from '@wrongstack/core';
3
+ export interface WorklistContext {
4
+ context: {
5
+ todos: TodoItem[];
6
+ meta: Record<string, unknown>;
7
+ session: {
8
+ id: string;
9
+ } | null;
10
+ state?: unknown;
11
+ };
12
+ send: (ws: WebSocket, msg: object) => void;
13
+ broadcast: (msg: object) => void;
14
+ /**
15
+ * Optional mutator for in-memory todo state. Servers that manage live
16
+ * agent state (e.g. the CLI embedded server) provide this so handlers
17
+ * can update the agent's todo list directly. Standalone server may omit.
18
+ */
19
+ replaceTodos?: (todos: TodoItem[]) => void;
20
+ }
21
+ export declare function handleTodosGet(ctx: WorklistContext, ws: WebSocket): void;
22
+ export declare function handleTodosClear(ctx: WorklistContext, ws: WebSocket): void;
23
+ export declare function handleTodosRemove(ctx: WorklistContext, ws: WebSocket, payload: {
24
+ id?: string;
25
+ index?: number;
26
+ } | undefined): void;
27
+ export declare function handleTodoUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
28
+ id: string;
29
+ status?: TodoItem['status'];
30
+ activeForm?: string;
31
+ }): void;
32
+ export declare function handleTasksGet(ctx: WorklistContext, ws: WebSocket): Promise<void>;
33
+ export declare function handleTaskUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
34
+ id: string;
35
+ status: 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';
36
+ }): Promise<void>;
37
+ export declare function handlePlanGet(ctx: WorklistContext, ws: WebSocket): Promise<void>;
38
+ export declare function handlePlanTemplateUse(ctx: WorklistContext, ws: WebSocket, template: string): Promise<void>;
39
+ export declare function handlePlanItemUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
40
+ target: string;
41
+ status: 'open' | 'in_progress' | 'done';
42
+ }): Promise<void>;
43
+ /** Loosely-typed worklist WS message — payload shapes are narrowed per case. */
44
+ export interface WorklistMessage {
45
+ type: string;
46
+ payload?: unknown;
47
+ }
48
+ export declare function handleWorklistMessage(ctx: WorklistContext, ws: WebSocket, msg: WorklistMessage): Promise<void>;
49
+ //# sourceMappingURL=worklist-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worklist-handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/worklist-handlers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA2BjD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,IAAI,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;CAC5C;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAI1E;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACnD,IAAI,CAYN;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,IAAI,CAcN;AAID,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvF;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE;IACP,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;CACnF,GACA,OAAO,CAAC,IAAI,CAAC,CAiCf;AAID,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCtF;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhH;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC,IAAI,CAAC,CAyBf;AAQD,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,eAAe,EACpB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,CAmDf"}
@@ -1,51 +1 @@
1
- import { WebSocket } from 'ws';
2
- import { TodoItem } from '@wrongstack/core';
3
-
4
- interface WorklistContext {
5
- context: {
6
- todos: TodoItem[];
7
- meta: Record<string, unknown>;
8
- session: {
9
- id: string;
10
- } | null;
11
- state?: unknown;
12
- };
13
- send: (ws: WebSocket, msg: object) => void;
14
- broadcast: (msg: object) => void;
15
- /**
16
- * Optional mutator for in-memory todo state. Servers that manage live
17
- * agent state (e.g. the CLI embedded server) provide this so handlers
18
- * can update the agent's todo list directly. Standalone server may omit.
19
- */
20
- replaceTodos?: (todos: TodoItem[]) => void;
21
- }
22
- declare function handleTodosGet(ctx: WorklistContext, ws: WebSocket): void;
23
- declare function handleTodosClear(ctx: WorklistContext, ws: WebSocket): void;
24
- declare function handleTodosRemove(ctx: WorklistContext, ws: WebSocket, payload: {
25
- id?: string;
26
- index?: number;
27
- } | undefined): void;
28
- declare function handleTodoUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
29
- id: string;
30
- status?: TodoItem['status'];
31
- activeForm?: string;
32
- }): void;
33
- declare function handleTasksGet(ctx: WorklistContext, ws: WebSocket): Promise<void>;
34
- declare function handleTaskUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
35
- id: string;
36
- status: 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';
37
- }): Promise<void>;
38
- declare function handlePlanGet(ctx: WorklistContext, ws: WebSocket): Promise<void>;
39
- declare function handlePlanTemplateUse(ctx: WorklistContext, ws: WebSocket, template: string): Promise<void>;
40
- declare function handlePlanItemUpdate(ctx: WorklistContext, ws: WebSocket, payload: {
41
- target: string;
42
- status: 'open' | 'in_progress' | 'done';
43
- }): Promise<void>;
44
- /** Loosely-typed worklist WS message — payload shapes are narrowed per case. */
45
- interface WorklistMessage {
46
- type: string;
47
- payload?: unknown;
48
- }
49
- declare function handleWorklistMessage(ctx: WorklistContext, ws: WebSocket, msg: WorklistMessage): Promise<void>;
50
-
51
- export { type WorklistContext, type WorklistMessage, handlePlanGet, handlePlanItemUpdate, handlePlanTemplateUse, handleTaskUpdate, handleTasksGet, handleTodoUpdate, handleTodosClear, handleTodosGet, handleTodosRemove, handleWorklistMessage };
1
+ export * from './handlers/index.js';
@@ -61,7 +61,7 @@ async function handleTasksGet(ctx, ws) {
61
61
  const taskPath = ctx.context.meta["task.path"];
62
62
  if (typeof taskPath === "string" && taskPath) {
63
63
  try {
64
- const { loadTasks } = await import('@wrongstack/core');
64
+ const { loadTasks } = await import("@wrongstack/core");
65
65
  const file = await loadTasks(taskPath);
66
66
  ctx.send(ws, { type: "tasks.updated", payload: sessionPayload(ctx, { tasks: file?.tasks ?? [] }) });
67
67
  } catch {
@@ -81,7 +81,7 @@ async function handleTaskUpdate(ctx, ws, payload) {
81
81
  return;
82
82
  }
83
83
  try {
84
- const { loadTasks, saveTasks } = await import('@wrongstack/core');
84
+ const { loadTasks, saveTasks } = await import("@wrongstack/core");
85
85
  const file = await loadTasks(taskPath);
86
86
  if (!file) {
87
87
  sendResult(ws, ctx, false, "No task file found.");
@@ -110,7 +110,7 @@ async function handlePlanGet(ctx, ws) {
110
110
  const sessionId = ctx.context.session?.id ?? "";
111
111
  if (typeof planPath === "string" && planPath) {
112
112
  try {
113
- const { loadPlan } = await import('@wrongstack/core');
113
+ const { loadPlan } = await import("@wrongstack/core");
114
114
  const plan = await loadPlan(planPath);
115
115
  ctx.send(ws, {
116
116
  type: "plan.updated",
@@ -151,7 +151,7 @@ async function handlePlanTemplateUse(ctx, ws, template) {
151
151
  return;
152
152
  }
153
153
  try {
154
- const { getPlanTemplate, loadPlan, savePlan, emptyPlan, addPlanItem } = await import('@wrongstack/core');
154
+ const { getPlanTemplate, loadPlan, savePlan, emptyPlan, addPlanItem } = await import("@wrongstack/core");
155
155
  const tpl = getPlanTemplate(template);
156
156
  if (!tpl) {
157
157
  sendResult(ws, ctx, false, `Unknown template "${template}".`);
@@ -176,7 +176,7 @@ async function handlePlanItemUpdate(ctx, ws, payload) {
176
176
  return;
177
177
  }
178
178
  try {
179
- const { mutatePlan, setPlanItemStatus } = await import('@wrongstack/core');
179
+ const { mutatePlan, setPlanItemStatus } = await import("@wrongstack/core");
180
180
  let changed = false;
181
181
  const plan = await mutatePlan(planPath, sessionId, async (p) => {
182
182
  const before = p.updatedAt;
@@ -243,7 +243,16 @@ async function handleWorklistMessage(ctx, ws, msg) {
243
243
  return;
244
244
  }
245
245
  }
246
-
247
- export { handlePlanGet, handlePlanItemUpdate, handlePlanTemplateUse, handleTaskUpdate, handleTasksGet, handleTodoUpdate, handleTodosClear, handleTodosGet, handleTodosRemove, handleWorklistMessage };
246
+ export {
247
+ handlePlanGet,
248
+ handlePlanItemUpdate,
249
+ handlePlanTemplateUse,
250
+ handleTaskUpdate,
251
+ handleTasksGet,
252
+ handleTodoUpdate,
253
+ handleTodosClear,
254
+ handleTodosGet,
255
+ handleTodosRemove,
256
+ handleWorklistMessage
257
+ };
248
258
  //# sourceMappingURL=handlers.js.map
249
- //# sourceMappingURL=handlers.js.map